From 6014d667fb3228184e5258421d5c99ea601f3fd3 Mon Sep 17 00:00:00 2001 From: Evan Lucas Date: Fri, 9 Dec 2016 17:13:14 -0600 Subject: [PATCH 01/31] crypto: add randomFill and randomFillSync crypto.randomFill and crypto.randomFillSync are similar to crypto.randomBytes, but allow passing in a buffer as the first argument. This allows us to reuse buffers to prevent having to create a new one on every call. PR-URL: https://github.com/nodejs/node/pull/10209 Reviewed-By: Sam Roberts Reviewed-By: James M Snell Reviewed-By: Ben Noordhuis Reviewed-By: Anna Henningsen --- doc/api/crypto.md | 62 +++++++++ lib/crypto.js | 90 +++++++++++++ src/node_crypto.cc | 111 +++++++++++++-- test/parallel/test-crypto-random.js | 202 ++++++++++++++++++++++++++++ test/parallel/test-domain-crypto.js | 2 + 5 files changed, 453 insertions(+), 14 deletions(-) diff --git a/doc/api/crypto.md b/doc/api/crypto.md index 4a7488ba6f2f70..b5a3dbf69cf3e8 100644 --- a/doc/api/crypto.md +++ b/doc/api/crypto.md @@ -1588,6 +1588,66 @@ This should normally never take longer than a few milliseconds. The only time when generating the random bytes may conceivably block for a longer period of time is right after boot, when the whole system is still low on entropy. +### crypto.randomFillSync(buf[, offset][, size]) + + +* `buf` {Buffer|Uint8Array} Must be supplied. +* `offset` {number} Defaults to `0`. +* `size` {number} Defaults to `buf.length - offset`. + +Synchronous version of [`crypto.randomFill()`][]. + +Returns `buf` + +```js +const buf = Buffer.alloc(10); +console.log(crypto.randomFillSync(buf).toString('hex')); + +crypto.randomFillSync(buf, 5); +console.log(buf.toString('hex')); + +// The above is equivalent to the following: +crypto.randomFillSync(buf, 5, 5); +console.log(buf.toString('hex')); +``` + +### crypto.randomFill(buf[, offset][, size], callback) + + +* `buf` {Buffer|Uint8Array} Must be supplied. +* `offset` {number} Defaults to `0`. +* `size` {number} Defaults to `buf.length - offset`. +* `callback` {Function} `function(err, buf) {}`. + +This function is similar to [`crypto.randomBytes()`][] but requires the first +argument to be a [`Buffer`][] that will be filled. It also +requires that a callback is passed in. + +If the `callback` function is not provided, an error will be thrown. + +```js +const buf = Buffer.alloc(10); +crypto.randomFill(buf, (err, buf) => { + if (err) throw err; + console.log(buf.toString('hex')); +}); + +crypto.randomFill(buf, 5, (err, buf) => { + if (err) throw err; + console.log(buf.toString('hex')); +}); + +// The above is equivalent to the following: +crypto.randomFill(buf, 5, 5, (err, buf) => { + if (err) throw err; + console.log(buf.toString('hex')); +}); +``` + ### crypto.setEngine(engine[, flags]) -* `buf` {Buffer|Uint8Array} Must be supplied. +* `buffer` {Buffer|Uint8Array} Must be supplied. * `offset` {number} Defaults to `0`. -* `size` {number} Defaults to `buf.length - offset`. +* `size` {number} Defaults to `buffer.length - offset`. Synchronous version of [`crypto.randomFill()`][]. -Returns `buf` +Returns `buffer` ```js const buf = Buffer.alloc(10); @@ -1613,14 +1613,14 @@ crypto.randomFillSync(buf, 5, 5); console.log(buf.toString('hex')); ``` -### crypto.randomFill(buf[, offset][, size], callback) +### crypto.randomFill(buffer[, offset][, size], callback) -* `buf` {Buffer|Uint8Array} Must be supplied. +* `buffer` {Buffer|Uint8Array} Must be supplied. * `offset` {number} Defaults to `0`. -* `size` {number} Defaults to `buf.length - offset`. +* `size` {number} Defaults to `buffer.length - offset`. * `callback` {Function} `function(err, buf) {}`. This function is similar to [`crypto.randomBytes()`][] but requires the first @@ -2067,7 +2067,7 @@ the `crypto`, `tls`, and `https` modules and are generally specific to OpenSSL. [`crypto.getHashes()`]: #crypto_crypto_gethashes [`crypto.pbkdf2()`]: #crypto_crypto_pbkdf2_password_salt_iterations_keylen_digest_callback [`crypto.randomBytes()`]: #crypto_crypto_randombytes_size_callback -[`crypto.randomFill()`]: #crypto_crypto_randombytesbuffer_buf_size_offset_cb +[`crypto.randomFill()`]: #crypto_crypto_randomfill_buffer_offset_size_callback [`decipher.final()`]: #crypto_decipher_final_output_encoding [`decipher.update()`]: #crypto_decipher_update_data_input_encoding_output_encoding [`diffieHellman.setPublicKey()`]: #crypto_diffiehellman_setpublickey_public_key_encoding From 4afecfcc4440d78432c4f8fbe71428f063f78b08 Mon Sep 17 00:00:00 2001 From: Sam Roberts Date: Mon, 5 Jun 2017 12:35:43 -0700 Subject: [PATCH 03/31] lib: return this from net.Socket.end() PR-URL: https://github.com/nodejs/node/pull/13481 Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Refael Ackermann Reviewed-By: Evan Lucas Reviewed-By: Brian White --- doc/api/net.md | 2 ++ lib/net.js | 2 ++ test/parallel/test-socket-write-after-fin.js | 5 +++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/doc/api/net.md b/doc/api/net.md index 5c9c3dea6051b4..35e7abcee85cad 100644 --- a/doc/api/net.md +++ b/doc/api/net.md @@ -575,6 +575,8 @@ server will still send some data. If `data` is specified, it is equivalent to calling `socket.write(data, encoding)` followed by `socket.end()`. +Returns `socket`. + ### socket.localAddress +* Returns {net.Server} + Asynchronously get the number of concurrent connections on the server. Works when sockets were sent to forks. diff --git a/lib/net.js b/lib/net.js index 9cd648953eb25b..c819ac1516ebef 100644 --- a/lib/net.js +++ b/lib/net.js @@ -1487,7 +1487,8 @@ Server.prototype.getConnections = function(cb) { } if (!this._usingSlaves) { - return end(null, this._connections); + end(null, this._connections); + return this; } // Poll slaves @@ -1507,6 +1508,8 @@ Server.prototype.getConnections = function(cb) { this._slaves.forEach(function(slave) { slave.getConnections(oncount); }); + + return this; }; diff --git a/test/parallel/test-net-pingpong.js b/test/parallel/test-net-pingpong.js index b2f756c1ba7147..1bcf5992124342 100644 --- a/test/parallel/test-net-pingpong.js +++ b/test/parallel/test-net-pingpong.js @@ -16,10 +16,13 @@ function pingPongTest(port, host) { function onSocket(socket) { assert.strictEqual(socket.server, server); - server.getConnections(common.mustCall(function(err, connections) { - assert.ifError(err); - assert.strictEqual(connections, 1); - })); + assert.strictEqual( + server, + server.getConnections(common.mustCall(function(err, connections) { + assert.ifError(err); + assert.strictEqual(connections, 1); + })) + ); socket.setNoDelay(); socket.timeout = 0; From 5c1865165a94b4fabcca4399c791febdc016dcf8 Mon Sep 17 00:00:00 2001 From: Alexey Orlenko Date: Fri, 21 Jul 2017 11:30:07 +0300 Subject: [PATCH 05/31] repl: improve require() autocompletion Currently REPL supports autocompletion for core modules and those found in node_modules. This commit adds tab completion for modules relative to the current directory. PR-URL: https://github.com/nodejs/node/pull/14409 Reviewed-By: Refael Ackermann Reviewed-By: Timothy Gu Reviewed-By: Khaidi Chu Reviewed-By: James M Snell --- lib/repl.js | 13 ++++++- test/parallel/test-repl-tab-complete.js | 50 +++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/lib/repl.js b/lib/repl.js index f841b3e3eff34b..2287af180899ce 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -870,7 +870,18 @@ function complete(line, callback) { filter = match[1]; var dir, files, f, name, base, ext, abs, subfiles, s; group = []; - var paths = module.paths.concat(Module.globalPaths); + let paths = []; + + if (completeOn === '.') { + group = ['./', '../']; + } else if (completeOn === '..') { + group = ['../']; + } else if (/^\.\.?\//.test(completeOn)) { + paths = [process.cwd()]; + } else { + paths = module.paths.concat(Module.globalPaths); + } + for (i = 0; i < paths.length; i++) { dir = path.resolve(paths[i], subdir); try { diff --git a/test/parallel/test-repl-tab-complete.js b/test/parallel/test-repl-tab-complete.js index 1179259c79d026..0d05196869cda9 100644 --- a/test/parallel/test-repl-tab-complete.js +++ b/test/parallel/test-repl-tab-complete.js @@ -212,6 +212,56 @@ testMe.complete('require(\'n', common.mustCall(function(error, data) { })); } +// Test tab completion for require() relative to the current directory +{ + putIn.run(['.clear']); + + const cwd = process.cwd(); + process.chdir(__dirname); + + ['require(\'.', 'require(".'].forEach((input) => { + testMe.complete(input, common.mustCall((err, data) => { + assert.strictEqual(err, null); + assert.strictEqual(data.length, 2); + assert.strictEqual(data[1], '.'); + assert.strictEqual(data[0].length, 2); + assert.ok(data[0].includes('./')); + assert.ok(data[0].includes('../')); + })); + }); + + ['require(\'..', 'require("..'].forEach((input) => { + testMe.complete(input, common.mustCall((err, data) => { + assert.strictEqual(err, null); + assert.deepStrictEqual(data, [['../'], '..']); + })); + }); + + ['./', './test-'].forEach((path) => { + [`require('${path}`, `require("${path}`].forEach((input) => { + testMe.complete(input, common.mustCall((err, data) => { + assert.strictEqual(err, null); + assert.strictEqual(data.length, 2); + assert.strictEqual(data[1], path); + assert.ok(data[0].includes('./test-repl-tab-complete')); + })); + }); + }); + + ['../parallel/', '../parallel/test-'].forEach((path) => { + [`require('${path}`, `require("${path}`].forEach((input) => { + testMe.complete(input, common.mustCall((err, data) => { + assert.strictEqual(err, null); + assert.strictEqual(data.length, 2); + assert.strictEqual(data[1], path); + assert.ok(data[0].includes('../parallel/test-repl-tab-complete')); + })); + }); + }); + + process.chdir(cwd); +} + // Make sure tab completion works on context properties putIn.run(['.clear']); From 79a3e37fb12a6dcfbbe053ec3b9ea34f5e858868 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Wed, 26 Apr 2017 12:42:18 -0700 Subject: [PATCH 06/31] console: add console.count() and console.clear() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both are simple utility functions defined by the WHATWG console spec (https://console.spec.whatwg.org/). PR-URL: https://github.com/nodejs/node/pull/12678 Ref: https://github.com/nodejs/node/issues/12675 Reviewed-By: Anna Henningsen Reviewed-By: Benjamin Gruenbaum Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Daijiro Wachi Reviewed-By: Timothy Gu Reviewed-By: Tobias Nießen --- doc/api/console.md | 70 +++++++++++++++++++++++++++++ lib/console.js | 39 ++++++++++++++++ test/parallel/test-console-clear.js | 22 +++++++++ test/parallel/test-console-count.js | 63 ++++++++++++++++++++++++++ 4 files changed, 194 insertions(+) create mode 100644 test/parallel/test-console-clear.js create mode 100644 test/parallel/test-console-count.js diff --git a/doc/api/console.md b/doc/api/console.md index cc7e8b0022c25b..6d8050ab1152a0 100644 --- a/doc/api/console.md +++ b/doc/api/console.md @@ -155,6 +155,76 @@ console.assert(false, 'this message will print, but no error thrown'); console.log('this will also print'); ``` +### console.clear() + + +When `stdout` is a TTY, calling `console.clear()` will attempt to clear the +TTY. When `stdout` is not a TTY, this method does nothing. + +*Note*: The specific operation of `console.clear()` can vary across operating +systems and terminal types. For most Linux operating systems, `console.clear()` +operates similarly to the `clear` shell command. On Windows, `console.clear()` +will clear only the output in the current terminal viewport for the Node.js +binary. + +### console.count([label]) + + +* `label` {string} The display label for the counter. Defaults to `'default'`. + +Maintains an internal counter specific to `label` and outputs to `stdout` the +number of times `console.count()` has been called with the given `label`. + + +```js +> console.count() +default: 1 +undefined +> console.count('default') +default: 2 +undefined +> console.count('abc') +abc: 1 +undefined +> console.count('xyz') +xyz: 1 +undefined +> console.count('abc') +abc: 2 +undefined +> console.count() +default: 3 +undefined +> +``` + +### console.countReset([label = 'default']) + + +* `label` {string} The display label for the counter. Defaults to `'default'`. + +Resets the internal counter specific to `label`. + + +```js +> console.count('abc'); +abc: 1 +undefined +> console.countReset('abc'); +undefined +> console.count('abc'); +abc: 1 +undefined +> +``` + + ### console.dir(obj[, options]) + +* `multicastInterface` {String} + +*Note: All references to scope in this section are refering to +[IPv6 Zone Indices][], which are defined by [RFC 4007][]. In string form, an IP +with a scope index is written as `'IP%scope'` where scope is an interface name or +interface number.* + +Sets the default outgoing multicast interface of the socket to a chosen +interface or back to system interface selection. The `multicastInterface` must +be a valid string representation of an IP from the socket's family. + +For IPv4 sockets, this should be the IP configured for the desired physical +interface. All packets sent to multicast on the socket will be sent on the +interface determined by the most recent successful use of this call. + +For IPv6 sockets, `multicastInterface` should include a scope to indicate the +interface as in the examples that follow. In IPv6, individual `send` calls can +also use explicit scope in addresses, so only packets sent to a multicast +address without specifying an explicit scope are affected by the most recent +successful use of this call. + +#### Examples: IPv6 Outgoing Multicast Interface + +On most systems, where scope format uses the interface name: + +```js +const socket = dgram.createSocket('udp6'); + +socket.bind(1234, () => { + socket.setMulticastInterface('::%eth1'); +}); +``` + +On Windows, where scope format uses an interface number: + +```js +const socket = dgram.createSocket('udp6'); + +socket.bind(1234, () => { + socket.setMulticastInterface('::%2'); +}); +``` + +#### Example: IPv4 Outgoing Multicast Interface +All systems use an IP of the host on the desired physical interface: +```js +const socket = dgram.createSocket('udp4'); + +socket.bind(1234, () => { + socket.setMulticastInterface('10.0.0.2'); +}); +``` + +#### Call Results + +A call on a socket that is not ready to send or no longer open may throw a *Not +running* [`Error`][]. + +If `multicastInterface` can not be parsed into an IP then an *EINVAL* +[`System Error`][] is thrown. + +On IPv4, if `multicastInterface` is a valid address but does not match any +interface, or if the address does not match the family then +a [`System Error`][] such as `EADDRNOTAVAIL` or `EPROTONOSUP` is thrown. + +On IPv6, most errors with specifying or omiting scope will result in the socket +continuing to use (or returning to) the system's default interface selection. + +A socket's address family's ANY address (IPv4 `'0.0.0.0'` or IPv6 `'::'`) can be +used to return control of the sockets default outgoing interface to the system +for future multicast packets. + + ### socket.setMulticastLoopback(flag) + +* {integer} + +The `process.ppid` property returns the PID of the current parent process. + +```js +console.log(`The parent process is pid ${process.ppid}`); +``` + ## process.release -For example: `'http:'` +### Class: URL -### urlObject.slashes +Browser-compatible `URL` class, implemented by following the WHATWG URL +Standard. [Examples of parsed URLs][] may be found in the Standard itself. -The `slashes` property is a `boolean` with a value of `true` if two ASCII -forward-slash characters (`/`) are required following the colon in the -`protocol`. +*Note*: In accordance with browser conventions, all properties of `URL` objects +are implemented as getters and setters on the class prototype, rather than as +data properties on the object itself. Thus, unlike [legacy urlObject][]s, using +the `delete` keyword on any properties of `URL` objects (e.g. `delete +myURL.protocol`, `delete myURL.pathname`, etc) has no effect but will still +return `true`. -### urlObject.host +#### Constructor: new URL(input[, base]) -The `host` property is the full lower-cased host portion of the URL, including -the `port` if specified. +* `input` {string} The input URL to parse +* `base` {string|URL} The base URL to resolve against if the `input` is not + absolute. + +Creates a new `URL` object by parsing the `input` relative to the `base`. If +`base` is passed as a string, it will be parsed equivalent to `new URL(base)`. + +```js +const { URL } = require('url'); +const myURL = new URL('/foo', 'https://example.org/'); +// https://example.org/foo +``` + +A `TypeError` will be thrown if the `input` or `base` are not valid URLs. Note +that an effort will be made to coerce the given values into strings. For +instance: + +```js +const { URL } = require('url'); +const myURL = new URL({ toString: () => 'https://example.org/' }); +// https://example.org/ +``` + +Unicode characters appearing within the hostname of `input` will be +automatically converted to ASCII using the [Punycode][] algorithm. + +```js +const { URL } = require('url'); +const myURL = new URL('https://你好你好'); +// https://xn--6qqa088eba/ +``` + +*Note*: This feature is only available if the `node` executable was compiled +with [ICU][] enabled. If not, the domain names are passed through unchanged. + +#### url.hash + +* {string} + +Gets and sets the fragment portion of the URL. + +```js +const { URL } = require('url'); +const myURL = new URL('https://example.org/foo#bar'); +console.log(myURL.hash); +// Prints #bar + +myURL.hash = 'baz'; +console.log(myURL.href); +// Prints https://example.org/foo#baz +``` + +Invalid URL characters included in the value assigned to the `hash` property +are [percent-encoded][]. Note that the selection of which characters to +percent-encode may vary somewhat from what the [`url.parse()`][] and +[`url.format()`][] methods would produce. + +#### url.host + +* {string} + +Gets and sets the host portion of the URL. + +```js +const { URL } = require('url'); +const myURL = new URL('https://example.org:81/foo'); +console.log(myURL.host); +// Prints example.org:81 + +myURL.host = 'example.com:82'; +console.log(myURL.href); +// Prints https://example.com:82/foo +``` + +Invalid host values assigned to the `host` property are ignored. + +#### url.hostname + +* {string} + +Gets and sets the hostname portion of the URL. The key difference between +`url.host` and `url.hostname` is that `url.hostname` does *not* include the +port. + +```js +const { URL } = require('url'); +const myURL = new URL('https://example.org:81/foo'); +console.log(myURL.hostname); +// Prints example.org + +myURL.hostname = 'example.com:82'; +console.log(myURL.href); +// Prints https://example.com:81/foo +``` + +Invalid hostname values assigned to the `hostname` property are ignored. + +#### url.href + +* {string} + +Gets and sets the serialized URL. + +```js +const { URL } = require('url'); +const myURL = new URL('https://example.org/foo'); +console.log(myURL.href); +// Prints https://example.org/foo + +myURL.href = 'https://example.com/bar'; +console.log(myURL.href); +// Prints https://example.com/bar +``` + +Getting the value of the `href` property is equivalent to calling +[`url.toString()`][]. + +Setting the value of this property to a new value is equivalent to creating a +new `URL` object using [`new URL(value)`][`new URL()`]. Each of the `URL` +object's properties will be modified. + +If the value assigned to the `href` property is not a valid URL, a `TypeError` +will be thrown. + +#### url.origin + +* {string} + +Gets the read-only serialization of the URL's origin. + +```js +const { URL } = require('url'); +const myURL = new URL('https://example.org/foo/bar?baz'); +console.log(myURL.origin); +// Prints https://example.org +``` + +```js +const { URL } = require('url'); +const idnURL = new URL('https://你好你好'); +console.log(idnURL.origin); +// Prints https://xn--6qqa088eba + +console.log(idnURL.hostname); +// Prints xn--6qqa088eba +``` + +#### url.password + +* {string} + +Gets and sets the password portion of the URL. + +```js +const { URL } = require('url'); +const myURL = new URL('https://abc:xyz@example.com'); +console.log(myURL.password); +// Prints xyz + +myURL.password = '123'; +console.log(myURL.href); +// Prints https://abc:123@example.com +``` + +Invalid URL characters included in the value assigned to the `password` property +are [percent-encoded][]. Note that the selection of which characters to +percent-encode may vary somewhat from what the [`url.parse()`][] and +[`url.format()`][] methods would produce. + +#### url.pathname + +* {string} + +Gets and sets the path portion of the URL. + +```js +const { URL } = require('url'); +const myURL = new URL('https://example.org/abc/xyz?123'); +console.log(myURL.pathname); +// Prints /abc/xyz + +myURL.pathname = '/abcdef'; +console.log(myURL.href); +// Prints https://example.org/abcdef?123 +``` + +Invalid URL characters included in the value assigned to the `pathname` +property are [percent-encoded][]. Note that the selection of which characters +to percent-encode may vary somewhat from what the [`url.parse()`][] and +[`url.format()`][] methods would produce. + +#### url.port + +* {string} + +Gets and sets the port portion of the URL. + +```js +const { URL } = require('url'); +const myURL = new URL('https://example.org:8888'); +console.log(myURL.port); +// Prints 8888 + +// Default ports are automatically transformed to the empty string +// (HTTPS protocol's default port is 443) +myURL.port = '443'; +console.log(myURL.port); +// Prints the empty string +console.log(myURL.href); +// Prints https://example.org/ + +myURL.port = 1234; +console.log(myURL.port); +// Prints 1234 +console.log(myURL.href); +// Prints https://example.org:1234/ + +// Completely invalid port strings are ignored +myURL.port = 'abcd'; +console.log(myURL.port); +// Prints 1234 + +// Leading numbers are treated as a port number +myURL.port = '5678abcd'; +console.log(myURL.port); +// Prints 5678 + +// Non-integers are truncated +myURL.port = 1234.5678; +console.log(myURL.port); +// Prints 1234 + +// Out-of-range numbers are ignored +myURL.port = 1e10; +console.log(myURL.port); +// Prints 1234 +``` + +The port value may be set as either a number or as a String containing a number +in the range `0` to `65535` (inclusive). Setting the value to the default port +of the `URL` objects given `protocol` will result in the `port` value becoming +the empty string (`''`). + +If an invalid string is assigned to the `port` property, but it begins with a +number, the leading number is assigned to `port`. Otherwise, or if the number +lies outside the range denoted above, it is ignored. + +#### url.protocol + +* {string} + +Gets and sets the protocol portion of the URL. + +```js +const { URL } = require('url'); +const myURL = new URL('https://example.org'); +console.log(myURL.protocol); +// Prints https: + +myURL.protocol = 'ftp'; +console.log(myURL.href); +// Prints ftp://example.org/ +``` + +Invalid URL protocol values assigned to the `protocol` property are ignored. + +#### url.search + +* {string} + +Gets and sets the serialized query portion of the URL. + +```js +const { URL } = require('url'); +const myURL = new URL('https://example.org/abc?123'); +console.log(myURL.search); +// Prints ?123 + +myURL.search = 'abc=xyz'; +console.log(myURL.href); +// Prints https://example.org/abc?abc=xyz +``` + +Any invalid URL characters appearing in the value assigned the `search` +property will be [percent-encoded][]. Note that the selection of which +characters to percent-encode may vary somewhat from what the [`url.parse()`][] +and [`url.format()`][] methods would produce. + +#### url.searchParams + +* {URLSearchParams} + +Gets the [`URLSearchParams`][] object representing the query parameters of the +URL. This property is read-only; to replace the entirety of query parameters of +the URL, use the [`url.search`][] setter. See [`URLSearchParams`][] +documentation for details. + +#### url.username + +* {string} + +Gets and sets the username portion of the URL. + +```js +const { URL } = require('url'); +const myURL = new URL('https://abc:xyz@example.com'); +console.log(myURL.username); +// Prints abc + +myURL.username = '123'; +console.log(myURL.href); +// Prints https://123:xyz@example.com/ +``` + +Any invalid URL characters appearing in the value assigned the `username` +property will be [percent-encoded][]. Note that the selection of which +characters to percent-encode may vary somewhat from what the [`url.parse()`][] +and [`url.format()`][] methods would produce. + +#### url.toString() + +* Returns: {string} + +The `toString()` method on the `URL` object returns the serialized URL. The +value returned is equivalent to that of [`url.href`][] and [`url.toJSON()`][]. + +Because of the need for standard compliance, this method does not allow users +to customize the serialization process of the URL. + +#### url.toJSON() + +* Returns: {string} + +The `toJSON()` method on the `URL` object returns the serialized URL. The +value returned is equivalent to that of [`url.href`][] and +[`url.toString()`][]. + +This method is automatically called when an `URL` object is serialized +with [`JSON.stringify()`][]. + +```js +const { URL } = require('url'); +const myURLs = [ + new URL('https://www.example.com'), + new URL('https://test.example.org') +]; +console.log(JSON.stringify(myURLs)); +// Prints ["https://www.example.com/","https://test.example.org/"] +``` + +### Class: URLSearchParams + + +The `URLSearchParams` API provides read and write access to the query of a +`URL`. The `URLSearchParams` class can also be used standalone with one of the +four following constructors. + +The WHATWG `URLSearchParams` interface and the [`querystring`][] module have +similar purpose, but the purpose of the [`querystring`][] module is more +general, as it allows the customization of delimiter characters (`&` and `=`). +On the other hand, this API is designed purely for URL query strings. + +```js +const { URL, URLSearchParams } = require('url'); + +const myURL = new URL('https://example.org/?abc=123'); +console.log(myURL.searchParams.get('abc')); +// Prints 123 + +myURL.searchParams.append('abc', 'xyz'); +console.log(myURL.href); +// Prints https://example.org/?abc=123&abc=xyz + +myURL.searchParams.delete('abc'); +myURL.searchParams.set('a', 'b'); +console.log(myURL.href); +// Prints https://example.org/?a=b + +const newSearchParams = new URLSearchParams(myURL.searchParams); +// The above is equivalent to +// const newSearchParams = new URLSearchParams(myURL.search); + +newSearchParams.append('a', 'c'); +console.log(myURL.href); +// Prints https://example.org/?a=b +console.log(newSearchParams.toString()); +// Prints a=b&a=c + +// newSearchParams.toString() is implicitly called +myURL.search = newSearchParams; +console.log(myURL.href); +// Prints https://example.org/?a=b&a=c +newSearchParams.delete('a'); +console.log(myURL.href); +// Prints https://example.org/?a=b&a=c +``` + +#### Constructor: new URLSearchParams() + +Instantiate a new empty `URLSearchParams` object. + +#### Constructor: new URLSearchParams(string) + +* `string` {string} A query string + +Parse the `string` as a query string, and use it to instantiate a new +`URLSearchParams` object. A leading `'?'`, if present, is ignored. + +```js +const { URLSearchParams } = require('url'); +let params; + +params = new URLSearchParams('user=abc&query=xyz'); +console.log(params.get('user')); +// Prints 'abc' +console.log(params.toString()); +// Prints 'user=abc&query=xyz' + +params = new URLSearchParams('?user=abc&query=xyz'); +console.log(params.toString()); +// Prints 'user=abc&query=xyz' +``` + +#### Constructor: new URLSearchParams(obj) + + +* `obj` {Object} An object representing a collection of key-value pairs + +Instantiate a new `URLSearchParams` object with a query hash map. The key and +value of each property of `obj` are always coerced to strings. + +*Note*: Unlike [`querystring`][] module, duplicate keys in the form of array +values are not allowed. Arrays are stringified using [`array.toString()`][], +which simply joins all array elements with commas. + +```js +const { URLSearchParams } = require('url'); +const params = new URLSearchParams({ + user: 'abc', + query: ['first', 'second'] +}); +console.log(params.getAll('query')); +// Prints [ 'first,second' ] +console.log(params.toString()); +// Prints 'user=abc&query=first%2Csecond' +``` + +#### Constructor: new URLSearchParams(iterable) + + +* `iterable` {Iterable} An iterable object whose elements are key-value pairs + +Instantiate a new `URLSearchParams` object with an iterable map in a way that +is similar to [`Map`][]'s constructor. `iterable` can be an Array or any +iterable object. That means `iterable` can be another `URLSearchParams`, in +which case the constructor will simply create a clone of the provided +`URLSearchParams`. Elements of `iterable` are key-value pairs, and can +themselves be any iterable object. + +Duplicate keys are allowed. + +```js +const { URLSearchParams } = require('url'); +let params; + +// Using an array +params = new URLSearchParams([ + ['user', 'abc'], + ['query', 'first'], + ['query', 'second'] +]); +console.log(params.toString()); +// Prints 'user=abc&query=first&query=second' + +// Using a Map object +const map = new Map(); +map.set('user', 'abc'); +map.set('query', 'xyz'); +params = new URLSearchParams(map); +console.log(params.toString()); +// Prints 'user=abc&query=xyz' + +// Using a generator function +function* getQueryPairs() { + yield ['user', 'abc']; + yield ['query', 'first']; + yield ['query', 'second']; +} +params = new URLSearchParams(getQueryPairs()); +console.log(params.toString()); +// Prints 'user=abc&query=first&query=second' + +// Each key-value pair must have exactly two elements +new URLSearchParams([ + ['user', 'abc', 'error'] +]); +// Throws TypeError [ERR_INVALID_TUPLE]: +// Each query pair must be an iterable [name, value] tuple +``` + +#### urlSearchParams.append(name, value) + +* `name` {string} +* `value` {string} + +Append a new name-value pair to the query string. + +#### urlSearchParams.delete(name) + +* `name` {string} + +Remove all name-value pairs whose name is `name`. + +#### urlSearchParams.entries() + +* Returns: {Iterator} + +Returns an ES6 Iterator over each of the name-value pairs in the query. +Each item of the iterator is a JavaScript Array. The first item of the Array +is the `name`, the second item of the Array is the `value`. + +Alias for [`urlSearchParams[@@iterator]()`][`urlSearchParams@@iterator()`]. + +#### urlSearchParams.forEach(fn[, thisArg]) + +* `fn` {Function} Function invoked for each name-value pair in the query. +* `thisArg` {Object} Object to be used as `this` value for when `fn` is called + +Iterates over each name-value pair in the query and invokes the given function. + +```js +const { URL } = require('url'); +const myURL = new URL('https://example.org/?a=b&c=d'); +myURL.searchParams.forEach((value, name, searchParams) => { + console.log(name, value, myURL.searchParams === searchParams); +}); +// Prints: +// a b true +// c d true +``` + +#### urlSearchParams.get(name) + +* `name` {string} +* Returns: {string} or `null` if there is no name-value pair with the given + `name`. + +Returns the value of the first name-value pair whose name is `name`. If there +are no such pairs, `null` is returned. + +#### urlSearchParams.getAll(name) + +* `name` {string} +* Returns: {Array} + +Returns the values of all name-value pairs whose name is `name`. If there are +no such pairs, an empty array is returned. + +#### urlSearchParams.has(name) + +* `name` {string} +* Returns: {boolean} + +Returns `true` if there is at least one name-value pair whose name is `name`. + +#### urlSearchParams.keys() + +* Returns: {Iterator} + +Returns an ES6 Iterator over the names of each name-value pair. + +```js +const { URLSearchParams } = require('url'); +const params = new URLSearchParams('foo=bar&foo=baz'); +for (const name of params.keys()) { + console.log(name); +} +// Prints: +// foo +// foo +``` + +#### urlSearchParams.set(name, value) + +* `name` {string} +* `value` {string} + +Sets the value in the `URLSearchParams` object associated with `name` to +`value`. If there are any pre-existing name-value pairs whose names are `name`, +set the first such pair's value to `value` and remove all others. If not, +append the name-value pair to the query string. + +```js +const { URLSearchParams } = require('url'); + +const params = new URLSearchParams(); +params.append('foo', 'bar'); +params.append('foo', 'baz'); +params.append('abc', 'def'); +console.log(params.toString()); +// Prints foo=bar&foo=baz&abc=def + +params.set('foo', 'def'); +params.set('xyz', 'opq'); +console.log(params.toString()); +// Prints foo=def&abc=def&xyz=opq +``` + +#### urlSearchParams.sort() + + +Sort all existing name-value pairs in-place by their names. Sorting is done +with a [stable sorting algorithm][], so relative order between name-value pairs +with the same name is preserved. + +This method can be used, in particular, to increase cache hits. + +```js +const { URLSearchParams } = require('url'); +const params = new URLSearchParams('query[]=abc&type=search&query[]=123'); +params.sort(); +console.log(params.toString()); +// Prints query%5B%5D=abc&query%5B%5D=123&type=search +``` + +#### urlSearchParams.toString() + +* Returns: {string} + +Returns the search parameters serialized as a string, with characters +percent-encoded where necessary. + +#### urlSearchParams.values() + +* Returns: {Iterator} + +Returns an ES6 Iterator over the values of each name-value pair. + +#### urlSearchParams\[@@iterator\]() + +* Returns: {Iterator} -For example: `'host.com:8080'` +Returns an ES6 Iterator over each of the name-value pairs in the query string. +Each item of the iterator is a JavaScript Array. The first item of the Array +is the `name`, the second item of the Array is the `value`. -### urlObject.auth +Alias for [`urlSearchParams.entries()`][]. + +```js +const { URLSearchParams } = require('url'); +const params = new URLSearchParams('foo=bar&xyz=baz'); +for (const [name, value] of params) { + console.log(name, value); +} +// Prints: +// foo bar +// xyz baz +``` + +### url.domainToASCII(domain) + + +* `domain` {string} +* Returns: {string} + +Returns the [Punycode][] ASCII serialization of the `domain`. If `domain` is an +invalid domain, the empty string is returned. + +It performs the inverse operation to [`url.domainToUnicode()`][]. + +```js +const url = require('url'); +console.log(url.domainToASCII('español.com')); +// Prints xn--espaol-zwa.com +console.log(url.domainToASCII('中文.com')); +// Prints xn--fiq228c.com +console.log(url.domainToASCII('xn--iñvalid.com')); +// Prints an empty string +``` + +### url.domainToUnicode(domain) + + +* `domain` {string} +* Returns: {string} + +Returns the Unicode serialization of the `domain`. If `domain` is an invalid +domain, the empty string is returned. + +It performs the inverse operation to [`url.domainToASCII()`][]. + +```js +const url = require('url'); +console.log(url.domainToUnicode('xn--espaol-zwa.com')); +// Prints español.com +console.log(url.domainToUnicode('xn--fiq228c.com')); +// Prints 中文.com +console.log(url.domainToUnicode('xn--iñvalid.com')); +// Prints an empty string +``` + +## Legacy URL API + +### Legacy urlObject + +The legacy urlObject (`require('url').Url`) is created and returned by the +`url.parse()` function. + +#### urlObject.auth The `auth` property is the username and password portion of the URL, also referred to as "userinfo". This string subset follows the `protocol` and @@ -72,12 +823,33 @@ with the `[:{password}]` portion being optional. For example: `'user:pass'` -### urlObject.hostname +#### urlObject.hash + +The `hash` property consists of the "fragment" portion of the URL including +the leading ASCII hash (`#`) character. + +For example: `'#hash'` + +#### urlObject.host + +The `host` property is the full lower-cased host portion of the URL, including +the `port` if specified. + +For example: `'sub.host.com:8080'` + +#### urlObject.hostname The `hostname` property is the lower-cased host name portion of the `host` component *without* the `port` included. -For example: `'host.com'` +For example: `'sub.host.com'` + +#### urlObject.href + +The `href` property is the full URL string that was parsed with both the +`protocol` and `host` components converted to lower-case. + +For example: `'http://user:pass@sub.host.com:8080/p/a/t/h?query=string#hash'` ### urlObject.port @@ -126,14 +898,22 @@ For example: `'query=string'` or `{'query': 'string'}` If returned as a string, no decoding of the query string is performed. If returned as an object, both keys and values are decoded. -### urlObject.hash +#### urlObject.search -The `hash` property consists of the "fragment" portion of the URL including -the leading ASCII hash (`#`) character. +The `search` property consists of the entire "query string" portion of the +URL, including the leading ASCII question mark (`?`) character. -For example: `'#hash'` +For example: `'?query=string'` -## url.format(urlObject) +No decoding of the query string is performed. + +#### urlObject.slashes + +The `slashes` property is a `boolean` with a value of `true` if two ASCII +forward-slash characters (`/`) are required following the colon in the +`protocol`. + +### url.format(urlObject) @@ -201,7 +981,7 @@ The formatting process operates as follows: * `result` is returned. -## url.parse(urlString[, parseQueryString[, slashesDenoteHost]]) +### url.parse(urlString[, parseQueryString[, slashesDenoteHost]]) @@ -220,7 +1000,7 @@ added: v0.1.25 The `url.parse()` method takes a URL string, parses it, and returns a URL object. -## url.resolve(from, to) +### url.resolve(from, to) @@ -239,11 +1019,18 @@ url.resolve('http://example.com/', '/one'); // 'http://example.com/one' url.resolve('http://example.com/one', '/two'); // 'http://example.com/two' ``` -## Escaped Characters + +## Percent-Encoding in URLs + +URLs are permitted to only contain a certain range of characters. Any character +falling outside of that range must be encoded. How such characters are encoded, +and which characters to encode depends entirely on where the character is +located within the structure of the URL. -URLs are only permitted to contain a certain range of characters. Spaces (`' '`) -and the following characters will be automatically escaped in the -properties of URL objects: +### Legacy API + +Within the Legacy API, spaces (`' '`) and the following characters will be +automatically escaped in the properties of URL objects: ```txt < > " ` \r \n \t { } | \ ^ ' @@ -252,6 +1039,68 @@ properties of URL objects: For example, the ASCII space character (`' '`) is encoded as `%20`. The ASCII forward slash (`/`) character is encoded as `%3C`. +### WHATWG API + +The [WHATWG URL Standard][] uses a more selective and fine grained approach to +selecting encoded characters than that used by the Legacy API. + +The WHATWG algorithm defines three "percent-encode sets" that describe ranges +of characters that must be percent-encoded: + +* The *C0 control percent-encode set* includes code points in range U+0000 to + U+001F (inclusive) and all code points greater than U+007E. + +* The *path percent-encode set* includes the *C0 control percent-encode set* + and code points U+0020, U+0022, U+0023, U+003C, U+003E, U+003F, U+0060, + U+007B, and U+007D. + +* The *userinfo encode set* includes the *path percent-encode set* and code + points U+002F, U+003A, U+003B, U+003D, U+0040, U+005B, U+005C, U+005D, + U+005E, and U+007C. + +The *userinfo percent-encode set* is used exclusively for username and +passwords encoded within the URL. The *path percent-encode set* is used for the +path of most URLs. The *C0 control percent-encode set* is used for all +other cases, including URL fragments in particular, but also host and path +under certain specific conditions. + +When non-ASCII characters appear within a hostname, the hostname is encoded +using the [Punycode][] algorithm. Note, however, that a hostname *may* contain +*both* Punycode encoded and percent-encoded characters. For example: + +```js +const { URL } = require('url'); +const myURL = new URL('https://%CF%80.com/foo'); +console.log(myURL.href); +// Prints https://xn--1xa.com/foo +console.log(myURL.origin); +// Prints https://π.com +``` + [`Error`]: errors.html#errors_class_error -[`querystring`]: querystring.html +[`JSON.stringify()`]: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify +[`Map`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map [`TypeError`]: errors.html#errors_class_typeerror +[`URLSearchParams`]: #url_class_urlsearchparams +[`array.toString()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toString +[`new URL()`]: #url_constructor_new_url_input_base +[`querystring`]: querystring.html +[`require('url').format()`]: #url_url_format_url_options +[`url.domainToASCII()`]: #url_url_domaintoascii_domain +[`url.domainToUnicode()`]: #url_url_domaintounicode_domain +[`url.format()`]: #url_url_format_urlobject +[`url.href`]: #url_url_href +[`url.parse()`]: #url_url_parse_urlstring_parsequerystring_slashesdenotehost +[`url.search`]: #url_url_search +[`url.toJSON()`]: #url_url_tojson +[`url.toString()`]: #url_url_tostring +[`urlSearchParams.entries()`]: #url_urlsearchparams_entries +[`urlSearchParams@@iterator()`]: #url_urlsearchparams_iterator +[ICU]: intl.html#intl_options_for_building_node_js +[Punycode]: https://tools.ietf.org/html/rfc5891#section-4.4 +[WHATWG URL Standard]: https://url.spec.whatwg.org/ +[WHATWG URL]: #url_the_whatwg_url_api +[examples of parsed URLs]: https://url.spec.whatwg.org/#example-url-parsing +[legacy urlObject]: #url_legacy_urlobject +[percent-encoded]: #whatwg-percent-encoding +[stable sorting algorithm]: https://en.wikipedia.org/wiki/Sorting_algorithm#Stability diff --git a/lib/internal/bootstrap_node.js b/lib/internal/bootstrap_node.js index 310dc9dd029375..4b5a500adc598e 100644 --- a/lib/internal/bootstrap_node.js +++ b/lib/internal/bootstrap_node.js @@ -62,6 +62,10 @@ _process.setupRawDebug(); + // Ensure setURLConstructor() is called before the native + // URL::ToObject() method is used. + NativeModule.require('internal/url'); + Object.defineProperty(process, 'argv0', { enumerable: true, configurable: false, diff --git a/lib/internal/querystring.js b/lib/internal/querystring.js new file mode 100644 index 00000000000000..d1684418097100 --- /dev/null +++ b/lib/internal/querystring.js @@ -0,0 +1,29 @@ +'use strict'; + +const hexTable = new Array(256); +for (var i = 0; i < 256; ++i) + hexTable[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase(); + +const isHexTable = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32 - 47 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63 + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 64 - 79 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80 - 95 + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 96 - 111 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 112 - 127 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128 ... + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // ... 256 +]; + +module.exports = { + hexTable, + isHexTable +}; diff --git a/lib/internal/url.js b/lib/internal/url.js new file mode 100644 index 00000000000000..91a03ec99a87fd --- /dev/null +++ b/lib/internal/url.js @@ -0,0 +1,1428 @@ +'use strict'; + +const util = require('util'); +const { + hexTable, + isHexTable +} = require('internal/querystring'); + +const { getConstructorOf } = require('internal/util'); +const querystring = require('querystring'); + +const { platform } = process; +const isWindows = platform === 'win32'; + +const { + domainToASCII: _domainToASCII, + domainToUnicode: _domainToUnicode, + encodeAuth, + toUSVString: _toUSVString, + parse: _parse, + setURLConstructor, + URL_FLAGS_CANNOT_BE_BASE, + URL_FLAGS_HAS_FRAGMENT, + URL_FLAGS_HAS_HOST, + URL_FLAGS_HAS_PASSWORD, + URL_FLAGS_HAS_PATH, + URL_FLAGS_HAS_QUERY, + URL_FLAGS_HAS_USERNAME, + URL_FLAGS_SPECIAL, + kFragment, + kHost, + kHostname, + kPathStart, + kPort, + kQuery, + kSchemeStart +} = process.binding('url'); + +const context = Symbol('context'); +const cannotBeBase = Symbol('cannot-be-base'); +const cannotHaveUsernamePasswordPort = + Symbol('cannot-have-username-password-port'); +const special = Symbol('special'); +const searchParams = Symbol('query'); +const kFormat = Symbol('format'); + +// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object +const IteratorPrototype = Object.getPrototypeOf( + Object.getPrototypeOf([][Symbol.iterator]()) +); + +const unpairedSurrogateRe = + /(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])/; +function toUSVString(val) { + const str = `${val}`; + // As of V8 5.5, `str.search()` (and `unpairedSurrogateRe[@@search]()`) are + // slower than `unpairedSurrogateRe.exec()`. + const match = unpairedSurrogateRe.exec(str); + if (!match) + return str; + return _toUSVString(str, match.index); +} + +// Refs: https://html.spec.whatwg.org/multipage/browsers.html#concept-origin-opaque +const kOpaqueOrigin = 'null'; + +// Refs: https://html.spec.whatwg.org/multipage/browsers.html#ascii-serialisation-of-an-origin +function serializeTupleOrigin(scheme, host, port) { + return `${scheme}//${host}${port === null ? '' : `:${port}`}`; +} + +// This class provides the internal state of a URL object. An instance of this +// class is stored in every URL object and is accessed internally by setters +// and getters. It roughly corresponds to the concept of a URL record in the +// URL Standard, with a few differences. It is also the object transported to +// the C++ binding. +// Refs: https://url.spec.whatwg.org/#concept-url +class URLContext { + constructor() { + this.flags = 0; + this.scheme = ':'; + this.username = ''; + this.password = ''; + this.host = null; + this.port = null; + this.path = []; + this.query = null; + this.fragment = null; + } +} + +class URLSearchParams { + // URL Standard says the default value is '', but as undefined and '' have + // the same result, undefined is used to prevent unnecessary parsing. + // Default parameter is necessary to keep URLSearchParams.length === 0 in + // accordance with Web IDL spec. + constructor(init = undefined) { + if (init === null || init === undefined) { + this[searchParams] = []; + } else if ((typeof init === 'object' && init !== null) || + typeof init === 'function') { + const method = init[Symbol.iterator]; + if (method === this[Symbol.iterator]) { + // While the spec does not have this branch, we can use it as a + // shortcut to avoid having to go through the costly generic iterator. + const childParams = init[searchParams]; + this[searchParams] = childParams.slice(); + } else if (method !== null && method !== undefined) { + if (typeof method !== 'function') { + throw new TypeError('Query pairs must be iterable'); + } + + // sequence> + // Note: per spec we have to first exhaust the lists then process them + const pairs = []; + for (const pair of init) { + if ((typeof pair !== 'object' && typeof pair !== 'function') || + pair === null || + typeof pair[Symbol.iterator] !== 'function') { + throw new TypeError( + 'Each query pair must be an iterable [name, value] tuple'); + } + const convertedPair = []; + for (const element of pair) + convertedPair.push(toUSVString(element)); + pairs.push(convertedPair); + } + + this[searchParams] = []; + for (const pair of pairs) { + if (pair.length !== 2) { + throw new TypeError( + 'Each query pair must be an iterable [name, value] tuple'); + } + this[searchParams].push(pair[0], pair[1]); + } + } else { + // record + // Need to use reflection APIs for full spec compliance. + this[searchParams] = []; + const keys = Reflect.ownKeys(init); + for (var i = 0; i < keys.length; i++) { + const key = keys[i]; + const desc = Reflect.getOwnPropertyDescriptor(init, key); + if (desc !== undefined && desc.enumerable) { + const typedKey = toUSVString(key); + const typedValue = toUSVString(init[key]); + this[searchParams].push(typedKey, typedValue); + } + } + } + } else { + // USVString + init = toUSVString(init); + if (init[0] === '?') init = init.slice(1); + initSearchParams(this, init); + } + + // "associated url object" + this[context] = null; + } + + [util.inspect.custom](recurseTimes, ctx) { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + + if (typeof recurseTimes === 'number' && recurseTimes < 0) + return ctx.stylize('[Object]', 'special'); + + var separator = ', '; + var innerOpts = util._extend({}, ctx); + if (recurseTimes !== null) { + innerOpts.depth = recurseTimes - 1; + } + var innerInspect = (v) => util.inspect(v, innerOpts); + + var list = this[searchParams]; + var output = []; + for (var i = 0; i < list.length; i += 2) + output.push(`${innerInspect(list[i])} => ${innerInspect(list[i + 1])}`); + + var colorRe = /\u001b\[\d\d?m/g; + var length = output.reduce( + (prev, cur) => prev + cur.replace(colorRe, '').length + separator.length, + -separator.length + ); + if (length > ctx.breakLength) { + return `${this.constructor.name} {\n ${output.join(',\n ')} }`; + } else if (output.length) { + return `${this.constructor.name} { ${output.join(separator)} }`; + } else { + return `${this.constructor.name} {}`; + } + } +} + +function onParseComplete(flags, protocol, username, password, + host, port, path, query, fragment) { + var ctx = this[context]; + ctx.flags = flags; + ctx.scheme = protocol; + ctx.username = (flags & URL_FLAGS_HAS_USERNAME) !== 0 ? username : ''; + ctx.password = (flags & URL_FLAGS_HAS_PASSWORD) !== 0 ? password : ''; + ctx.port = port; + ctx.path = (flags & URL_FLAGS_HAS_PATH) !== 0 ? path : []; + ctx.query = query; + ctx.fragment = fragment; + ctx.host = host; + if (!this[searchParams]) { // invoked from URL constructor + this[searchParams] = new URLSearchParams(); + this[searchParams][context] = this; + } + initSearchParams(this[searchParams], query); +} + +function onParseError(flags, input) { + const error = new TypeError(`Invalid URL: ${input}`); + error.input = input; + throw error; +} + +// Reused by URL constructor and URL#href setter. +function parse(url, input, base) { + const base_context = base ? base[context] : undefined; + url[context] = new URLContext(); + _parse(input.trim(), -1, base_context, undefined, + onParseComplete.bind(url), onParseError); +} + +function onParseProtocolComplete(flags, protocol, username, password, + host, port, path, query, fragment) { + const ctx = this[context]; + if ((flags & URL_FLAGS_SPECIAL) !== 0) { + ctx.flags |= URL_FLAGS_SPECIAL; + } else { + ctx.flags &= ~URL_FLAGS_SPECIAL; + } + ctx.scheme = protocol; + ctx.port = port; +} + +function onParseHostComplete(flags, protocol, username, password, + host, port, path, query, fragment) { + const ctx = this[context]; + if ((flags & URL_FLAGS_HAS_HOST) !== 0) { + ctx.host = host; + ctx.flags |= URL_FLAGS_HAS_HOST; + } else { + ctx.host = null; + ctx.flags &= ~URL_FLAGS_HAS_HOST; + } + if (port !== null) + ctx.port = port; +} + +function onParseHostnameComplete(flags, protocol, username, password, + host, port, path, query, fragment) { + const ctx = this[context]; + if ((flags & URL_FLAGS_HAS_HOST) !== 0) { + ctx.host = host; + ctx.flags |= URL_FLAGS_HAS_HOST; + } else { + ctx.host = null; + ctx.flags &= ~URL_FLAGS_HAS_HOST; + } +} + +function onParsePortComplete(flags, protocol, username, password, + host, port, path, query, fragment) { + this[context].port = port; +} + +function onParsePathComplete(flags, protocol, username, password, + host, port, path, query, fragment) { + const ctx = this[context]; + if ((flags & URL_FLAGS_HAS_PATH) !== 0) { + ctx.path = path; + ctx.flags |= URL_FLAGS_HAS_PATH; + } else { + ctx.path = []; + ctx.flags &= ~URL_FLAGS_HAS_PATH; + } + + // The C++ binding may set host to empty string. + if ((flags & URL_FLAGS_HAS_HOST) !== 0) { + ctx.host = host; + ctx.flags |= URL_FLAGS_HAS_HOST; + } +} + +function onParseSearchComplete(flags, protocol, username, password, + host, port, path, query, fragment) { + this[context].query = query; +} + +function onParseHashComplete(flags, protocol, username, password, + host, port, path, query, fragment) { + this[context].fragment = fragment; +} + +class URL { + constructor(input, base) { + // toUSVString is not needed. + input = `${input}`; + if (base !== undefined && + (!base[searchParams] || !base[searchParams][searchParams])) { + base = new URL(base); + } + parse(this, input, base); + } + + get [special]() { + return (this[context].flags & URL_FLAGS_SPECIAL) !== 0; + } + + get [cannotBeBase]() { + return (this[context].flags & URL_FLAGS_CANNOT_BE_BASE) !== 0; + } + + // https://url.spec.whatwg.org/#cannot-have-a-username-password-port + get [cannotHaveUsernamePasswordPort]() { + const { host, scheme } = this[context]; + return ((host == null || host === '') || + this[cannotBeBase] || + scheme === 'file:'); + } + + [util.inspect.custom](depth, opts) { + if (this == null || + Object.getPrototypeOf(this[context]) !== URLContext.prototype) { + throw new TypeError('Value of "this" must be of type URL'); + } + + if (typeof depth === 'number' && depth < 0) + return opts.stylize('[Object]', 'special'); + + var ctor = getConstructorOf(this); + + var obj = Object.create({ + constructor: ctor === null ? URL : ctor + }); + + obj.href = this.href; + obj.origin = this.origin; + obj.protocol = this.protocol; + obj.username = this.username; + obj.password = this.password; + obj.host = this.host; + obj.hostname = this.hostname; + obj.port = this.port; + obj.pathname = this.pathname; + obj.search = this.search; + obj.searchParams = this.searchParams; + obj.hash = this.hash; + + if (opts.showHidden) { + obj.cannotBeBase = this[cannotBeBase]; + obj.special = this[special]; + obj[context] = this[context]; + } + + return util.inspect(obj, opts); + } +} + +Object.defineProperties(URL.prototype, { + [kFormat]: { + enumerable: false, + configurable: false, + // eslint-disable-next-line func-name-matching + value: function format(options) { + if (options && typeof options !== 'object') + throw new TypeError('The "options" argument must be of type Object'); + options = util._extend({ + fragment: true, + unicode: false, + search: true, + auth: true + }, options); + const ctx = this[context]; + var ret = ctx.scheme; + if (ctx.host !== null) { + ret += '//'; + const has_username = ctx.username !== ''; + const has_password = ctx.password !== ''; + if (options.auth && (has_username || has_password)) { + if (has_username) + ret += ctx.username; + if (has_password) + ret += `:${ctx.password}`; + ret += '@'; + } + ret += options.unicode ? + domainToUnicode(this.host) : this.host; + } else if (ctx.scheme === 'file:') { + ret += '//'; + } + if (this.pathname) + ret += this.pathname; + if (options.search && ctx.query !== null) + ret += `?${ctx.query}`; + if (options.fragment && ctx.fragment !== null) + ret += `#${ctx.fragment}`; + return ret; + } + }, + [Symbol.toStringTag]: { + configurable: true, + value: 'URL' + }, + toString: { + // https://heycam.github.io/webidl/#es-stringifier + writable: true, + enumerable: true, + configurable: true, + // eslint-disable-next-line func-name-matching + value: function toString() { + return this[kFormat]({}); + } + }, + href: { + enumerable: true, + configurable: true, + get() { + return this[kFormat]({}); + }, + set(input) { + // toUSVString is not needed. + input = `${input}`; + parse(this, input); + } + }, + origin: { // readonly + enumerable: true, + configurable: true, + get() { + // Refs: https://url.spec.whatwg.org/#concept-url-origin + const ctx = this[context]; + switch (ctx.scheme) { + case 'blob:': + if (ctx.path.length > 0) { + try { + return (new URL(ctx.path[0])).origin; + } catch (err) { + // fall through... do nothing + } + } + return kOpaqueOrigin; + case 'ftp:': + case 'gopher:': + case 'http:': + case 'https:': + case 'ws:': + case 'wss:': + return serializeTupleOrigin(ctx.scheme, ctx.host, ctx.port); + } + return kOpaqueOrigin; + } + }, + protocol: { + enumerable: true, + configurable: true, + get() { + return this[context].scheme; + }, + set(scheme) { + // toUSVString is not needed. + scheme = `${scheme}`; + if (scheme.length === 0) + return; + const ctx = this[context]; + if (ctx.scheme === 'file:' && + (ctx.host === '' || ctx.host === null)) { + return; + } + _parse(scheme, kSchemeStart, null, ctx, + onParseProtocolComplete.bind(this)); + } + }, + username: { + enumerable: true, + configurable: true, + get() { + return this[context].username; + }, + set(username) { + // toUSVString is not needed. + username = `${username}`; + if (this[cannotHaveUsernamePasswordPort]) + return; + const ctx = this[context]; + if (username === '') { + ctx.username = ''; + ctx.flags &= ~URL_FLAGS_HAS_USERNAME; + return; + } + ctx.username = encodeAuth(username); + ctx.flags |= URL_FLAGS_HAS_USERNAME; + } + }, + password: { + enumerable: true, + configurable: true, + get() { + return this[context].password; + }, + set(password) { + // toUSVString is not needed. + password = `${password}`; + if (this[cannotHaveUsernamePasswordPort]) + return; + const ctx = this[context]; + if (password === '') { + ctx.password = ''; + ctx.flags &= ~URL_FLAGS_HAS_PASSWORD; + return; + } + ctx.password = encodeAuth(password); + ctx.flags |= URL_FLAGS_HAS_PASSWORD; + } + }, + host: { + enumerable: true, + configurable: true, + get() { + const ctx = this[context]; + var ret = ctx.host || ''; + if (ctx.port !== null) + ret += `:${ctx.port}`; + return ret; + }, + set(host) { + const ctx = this[context]; + // toUSVString is not needed. + host = `${host}`; + if (this[cannotBeBase]) { + // Cannot set the host if cannot-be-base is set + return; + } + _parse(host, kHost, null, ctx, onParseHostComplete.bind(this)); + } + }, + hostname: { + enumerable: true, + configurable: true, + get() { + return this[context].host || ''; + }, + set(host) { + const ctx = this[context]; + // toUSVString is not needed. + host = `${host}`; + if (this[cannotBeBase]) { + // Cannot set the host if cannot-be-base is set + return; + } + _parse(host, kHostname, null, ctx, onParseHostnameComplete.bind(this)); + } + }, + port: { + enumerable: true, + configurable: true, + get() { + const port = this[context].port; + return port === null ? '' : String(port); + }, + set(port) { + // toUSVString is not needed. + port = `${port}`; + if (this[cannotHaveUsernamePasswordPort]) + return; + const ctx = this[context]; + if (port === '') { + ctx.port = null; + return; + } + _parse(port, kPort, null, ctx, onParsePortComplete.bind(this)); + } + }, + pathname: { + enumerable: true, + configurable: true, + get() { + const ctx = this[context]; + if (this[cannotBeBase]) + return ctx.path[0]; + if (ctx.path.length === 0) + return ''; + return `/${ctx.path.join('/')}`; + }, + set(path) { + // toUSVString is not needed. + path = `${path}`; + if (this[cannotBeBase]) + return; + _parse(path, kPathStart, null, this[context], + onParsePathComplete.bind(this)); + } + }, + search: { + enumerable: true, + configurable: true, + get() { + const { query } = this[context]; + if (query === null || query === '') + return ''; + return `?${query}`; + }, + set(search) { + const ctx = this[context]; + search = toUSVString(search); + if (search === '') { + ctx.query = null; + ctx.flags &= ~URL_FLAGS_HAS_QUERY; + } else { + if (search[0] === '?') search = search.slice(1); + ctx.query = ''; + ctx.flags |= URL_FLAGS_HAS_QUERY; + if (search) { + _parse(search, kQuery, null, ctx, onParseSearchComplete.bind(this)); + } + } + initSearchParams(this[searchParams], search); + } + }, + searchParams: { // readonly + enumerable: true, + configurable: true, + get() { + return this[searchParams]; + } + }, + hash: { + enumerable: true, + configurable: true, + get() { + const { fragment } = this[context]; + if (fragment === null || fragment === '') + return ''; + return `#${fragment}`; + }, + set(hash) { + const ctx = this[context]; + // toUSVString is not needed. + hash = `${hash}`; + if (!hash) { + ctx.fragment = null; + ctx.flags &= ~URL_FLAGS_HAS_FRAGMENT; + return; + } + if (hash[0] === '#') hash = hash.slice(1); + ctx.fragment = ''; + ctx.flags |= URL_FLAGS_HAS_FRAGMENT; + _parse(hash, kFragment, null, ctx, onParseHashComplete.bind(this)); + } + }, + toJSON: { + writable: true, + enumerable: true, + configurable: true, + // eslint-disable-next-line func-name-matching + value: function toJSON() { + return this[kFormat]({}); + } + } +}); + +function update(url, params) { + if (!url) + return; + + const ctx = url[context]; + const serializedParams = params.toString(); + if (serializedParams) { + ctx.query = serializedParams; + ctx.flags |= URL_FLAGS_HAS_QUERY; + } else { + ctx.query = null; + ctx.flags &= ~URL_FLAGS_HAS_QUERY; + } +} + +function initSearchParams(url, init) { + if (!init) { + url[searchParams] = []; + return; + } + url[searchParams] = parseParams(init); +} + +// application/x-www-form-urlencoded parser +// Ref: https://url.spec.whatwg.org/#concept-urlencoded-parser +function parseParams(qs) { + const out = []; + var pairStart = 0; + var lastPos = 0; + var seenSep = false; + var buf = ''; + var encoded = false; + var encodeCheck = 0; + var i; + for (i = 0; i < qs.length; ++i) { + const code = qs.charCodeAt(i); + + // Try matching key/value pair separator + if (code === 38/*&*/) { + if (pairStart === i) { + // We saw an empty substring between pair separators + lastPos = pairStart = i + 1; + continue; + } + + if (lastPos < i) + buf += qs.slice(lastPos, i); + if (encoded) + buf = querystring.unescape(buf); + out.push(buf); + + // If `buf` is the key, add an empty value. + if (!seenSep) + out.push(''); + + seenSep = false; + buf = ''; + encoded = false; + encodeCheck = 0; + lastPos = pairStart = i + 1; + continue; + } + + // Try matching key/value separator (e.g. '=') if we haven't already + if (!seenSep && code === 61/*=*/) { + // Key/value separator match! + if (lastPos < i) + buf += qs.slice(lastPos, i); + if (encoded) + buf = querystring.unescape(buf); + out.push(buf); + + seenSep = true; + buf = ''; + encoded = false; + encodeCheck = 0; + lastPos = i + 1; + continue; + } + + // Handle + and percent decoding. + if (code === 43/*+*/) { + if (lastPos < i) + buf += qs.slice(lastPos, i); + buf += ' '; + lastPos = i + 1; + } else if (!encoded) { + // Try to match an (valid) encoded byte (once) to minimize unnecessary + // calls to string decoding functions + if (code === 37/*%*/) { + encodeCheck = 1; + } else if (encodeCheck > 0) { + // eslint-disable-next-line no-extra-boolean-cast + if (!!isHexTable[code]) { + if (++encodeCheck === 3) + encoded = true; + } else { + encodeCheck = 0; + } + } + } + } + + // Deal with any leftover key or value data + + // There is a trailing &. No more processing is needed. + if (pairStart === i) + return out; + + if (lastPos < i) + buf += qs.slice(lastPos, i); + if (encoded) + buf = querystring.unescape(buf); + out.push(buf); + + // If `buf` is the key, add an empty value. + if (!seenSep) + out.push(''); + + return out; +} + +// Adapted from querystring's implementation. +// Ref: https://url.spec.whatwg.org/#concept-urlencoded-byte-serializer +const noEscape = [ +//0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x00 - 0x0F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x10 - 0x1F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, // 0x20 - 0x2F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 0x30 - 0x3F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 - 0x4F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, // 0x50 - 0x5F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 - 0x6F + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 // 0x70 - 0x7F +]; + +// Special version of hexTable that uses `+` for U+0020 SPACE. +const paramHexTable = hexTable.slice(); +paramHexTable[0x20] = '+'; + +function escapeParam(str) { + const len = str.length; + if (len === 0) + return ''; + + var out = ''; + var lastPos = 0; + + for (var i = 0; i < len; i++) { + var c = str.charCodeAt(i); + + // ASCII + if (c < 0x80) { + if (noEscape[c] === 1) + continue; + if (lastPos < i) + out += str.slice(lastPos, i); + lastPos = i + 1; + out += paramHexTable[c]; + continue; + } + + if (lastPos < i) + out += str.slice(lastPos, i); + + // Multi-byte characters ... + if (c < 0x800) { + lastPos = i + 1; + out += paramHexTable[0xC0 | (c >> 6)] + + paramHexTable[0x80 | (c & 0x3F)]; + continue; + } + if (c < 0xD800 || c >= 0xE000) { + lastPos = i + 1; + out += paramHexTable[0xE0 | (c >> 12)] + + paramHexTable[0x80 | ((c >> 6) & 0x3F)] + + paramHexTable[0x80 | (c & 0x3F)]; + continue; + } + // Surrogate pair + ++i; + var c2; + if (i < len) + c2 = str.charCodeAt(i) & 0x3FF; + else { + // This branch should never happen because all URLSearchParams entries + // should already be converted to USVString. But, included for + // completion's sake anyway. + c2 = 0; + } + lastPos = i + 1; + c = 0x10000 + (((c & 0x3FF) << 10) | c2); + out += paramHexTable[0xF0 | (c >> 18)] + + paramHexTable[0x80 | ((c >> 12) & 0x3F)] + + paramHexTable[0x80 | ((c >> 6) & 0x3F)] + + paramHexTable[0x80 | (c & 0x3F)]; + } + if (lastPos === 0) + return str; + if (lastPos < len) + return out + str.slice(lastPos); + return out; +} + +// application/x-www-form-urlencoded serializer +// Ref: https://url.spec.whatwg.org/#concept-urlencoded-serializer +function serializeParams(array) { + const len = array.length; + if (len === 0) + return ''; + + var output = `${escapeParam(array[0])}=${escapeParam(array[1])}`; + for (var i = 2; i < len; i += 2) + output += `&${escapeParam(array[i])}=${escapeParam(array[i + 1])}`; + return output; +} + +// Mainly to mitigate func-name-matching ESLint rule +function defineIDLClass(proto, classStr, obj) { + // https://heycam.github.io/webidl/#dfn-class-string + Object.defineProperty(proto, Symbol.toStringTag, { + writable: false, + enumerable: false, + configurable: true, + value: classStr + }); + + // https://heycam.github.io/webidl/#es-operations + for (const key of Object.keys(obj)) { + Object.defineProperty(proto, key, { + writable: true, + enumerable: true, + configurable: true, + value: obj[key] + }); + } + for (const key of Object.getOwnPropertySymbols(obj)) { + Object.defineProperty(proto, key, { + writable: true, + enumerable: false, + configurable: true, + value: obj[key] + }); + } +} + +// for merge sort +function merge(out, start, mid, end, lBuffer, rBuffer) { + const sizeLeft = mid - start; + const sizeRight = end - mid; + var l, r, o; + + for (l = 0; l < sizeLeft; l++) + lBuffer[l] = out[start + l]; + for (r = 0; r < sizeRight; r++) + rBuffer[r] = out[mid + r]; + + l = 0; + r = 0; + o = start; + while (l < sizeLeft && r < sizeRight) { + if (lBuffer[l] <= rBuffer[r]) { + out[o++] = lBuffer[l++]; + out[o++] = lBuffer[l++]; + } else { + out[o++] = rBuffer[r++]; + out[o++] = rBuffer[r++]; + } + } + while (l < sizeLeft) + out[o++] = lBuffer[l++]; + while (r < sizeRight) + out[o++] = rBuffer[r++]; +} + +defineIDLClass(URLSearchParams.prototype, 'URLSearchParams', { + append(name, value) { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + if (arguments.length < 2) { + throw new TypeError('The "name" and "value" arguments must be specified'); + } + + name = toUSVString(name); + value = toUSVString(value); + this[searchParams].push(name, value); + update(this[context], this); + }, + + delete(name) { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + if (arguments.length < 1) { + throw new TypeError('The "name" argument must be specified'); + } + + const list = this[searchParams]; + name = toUSVString(name); + for (var i = 0; i < list.length;) { + const cur = list[i]; + if (cur === name) { + list.splice(i, 2); + } else { + i += 2; + } + } + update(this[context], this); + }, + + get(name) { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + if (arguments.length < 1) { + throw new TypeError('The "name" argument must be specified'); + } + + const list = this[searchParams]; + name = toUSVString(name); + for (var i = 0; i < list.length; i += 2) { + if (list[i] === name) { + return list[i + 1]; + } + } + return null; + }, + + getAll(name) { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + if (arguments.length < 1) { + throw new TypeError('The "name" argument must be specified'); + } + + const list = this[searchParams]; + const values = []; + name = toUSVString(name); + for (var i = 0; i < list.length; i += 2) { + if (list[i] === name) { + values.push(list[i + 1]); + } + } + return values; + }, + + has(name) { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + if (arguments.length < 1) { + throw new TypeError('The "name" argument must be specified'); + } + + const list = this[searchParams]; + name = toUSVString(name); + for (var i = 0; i < list.length; i += 2) { + if (list[i] === name) { + return true; + } + } + return false; + }, + + set(name, value) { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + if (arguments.length < 2) { + throw new TypeError('The "name" and "value" arguments must be specified'); + } + + const list = this[searchParams]; + name = toUSVString(name); + value = toUSVString(value); + + // If there are any name-value pairs whose name is `name`, in `list`, set + // the value of the first such name-value pair to `value` and remove the + // others. + var found = false; + for (var i = 0; i < list.length;) { + const cur = list[i]; + if (cur === name) { + if (!found) { + list[i + 1] = value; + found = true; + i += 2; + } else { + list.splice(i, 2); + } + } else { + i += 2; + } + } + + // Otherwise, append a new name-value pair whose name is `name` and value + // is `value`, to `list`. + if (!found) { + list.push(name, value); + } + + update(this[context], this); + }, + + sort() { + const a = this[searchParams]; + const len = a.length; + + if (len <= 2) { + // Nothing needs to be done. + } else if (len < 100) { + // 100 is found through testing. + // Simple stable in-place insertion sort + // Derived from v8/src/js/array.js + for (var i = 2; i < len; i += 2) { + var curKey = a[i]; + var curVal = a[i + 1]; + var j; + for (j = i - 2; j >= 0; j -= 2) { + if (a[j] > curKey) { + a[j + 2] = a[j]; + a[j + 3] = a[j + 1]; + } else { + break; + } + } + a[j + 2] = curKey; + a[j + 3] = curVal; + } + } else { + // Bottom-up iterative stable merge sort + const lBuffer = new Array(len); + const rBuffer = new Array(len); + for (var step = 2; step < len; step *= 2) { + for (var start = 0; start < len - 2; start += 2 * step) { + var mid = start + step; + var end = mid + step; + end = end < len ? end : len; + if (mid > end) + continue; + merge(a, start, mid, end, lBuffer, rBuffer); + } + } + } + + update(this[context], this); + }, + + // https://heycam.github.io/webidl/#es-iterators + // Define entries here rather than [Symbol.iterator] as the function name + // must be set to `entries`. + entries() { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + + return createSearchParamsIterator(this, 'key+value'); + }, + + forEach(callback, thisArg = undefined) { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + if (typeof callback !== 'function') { + throw new TypeError('Callback must be a function'); + } + + let list = this[searchParams]; + + var i = 0; + while (i < list.length) { + const key = list[i]; + const value = list[i + 1]; + callback.call(thisArg, value, key, this); + // in case the URL object's `search` is updated + list = this[searchParams]; + i += 2; + } + }, + + // https://heycam.github.io/webidl/#es-iterable + keys() { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + + return createSearchParamsIterator(this, 'key'); + }, + + values() { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + + return createSearchParamsIterator(this, 'value'); + }, + + // https://heycam.github.io/webidl/#es-stringifier + // https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior + toString() { + if (!this || !this[searchParams] || this[searchParams][searchParams]) { + throw new TypeError('Value of "this" must be of type URLSearchParams'); + } + + return serializeParams(this[searchParams]); + } +}); + +// https://heycam.github.io/webidl/#es-iterable-entries +Object.defineProperty(URLSearchParams.prototype, Symbol.iterator, { + writable: true, + configurable: true, + value: URLSearchParams.prototype.entries +}); + +// https://heycam.github.io/webidl/#dfn-default-iterator-object +function createSearchParamsIterator(target, kind) { + const iterator = Object.create(URLSearchParamsIteratorPrototype); + iterator[context] = { + target, + kind, + index: 0 + }; + return iterator; +} + +// https://heycam.github.io/webidl/#dfn-iterator-prototype-object +const URLSearchParamsIteratorPrototype = Object.create(IteratorPrototype); + +defineIDLClass(URLSearchParamsIteratorPrototype, 'URLSearchParamsIterator', { + next() { + if (!this || + Object.getPrototypeOf(this) !== URLSearchParamsIteratorPrototype) { + throw new TypeError( + 'Value of "this" must be of type URLSearchParamsIterator'); + } + + const { + target, + kind, + index + } = this[context]; + const values = target[searchParams]; + const len = values.length; + if (index >= len) { + return { + value: undefined, + done: true + }; + } + + const name = values[index]; + const value = values[index + 1]; + this[context].index = index + 2; + + let result; + if (kind === 'key') { + result = name; + } else if (kind === 'value') { + result = value; + } else { + result = [name, value]; + } + + return { + value: result, + done: false + }; + }, + [util.inspect.custom](recurseTimes, ctx) { + if (this == null || this[context] == null || this[context].target == null) + throw new TypeError( + 'Value of "this" must be of type URLSearchParamsIterator'); + + if (typeof recurseTimes === 'number' && recurseTimes < 0) + return ctx.stylize('[Object]', 'special'); + + const innerOpts = util._extend({}, ctx); + if (recurseTimes !== null) { + innerOpts.depth = recurseTimes - 1; + } + const { + target, + kind, + index + } = this[context]; + const output = target[searchParams].slice(index).reduce((prev, cur, i) => { + const key = i % 2 === 0; + if (kind === 'key' && key) { + prev.push(cur); + } else if (kind === 'value' && !key) { + prev.push(cur); + } else if (kind === 'key+value' && !key) { + prev.push([target[searchParams][index + i - 1], cur]); + } + return prev; + }, []); + const breakLn = util.inspect(output, innerOpts).includes('\n'); + const outputStrs = output.map((p) => util.inspect(p, innerOpts)); + let outputStr; + if (breakLn) { + outputStr = `\n ${outputStrs.join(',\n ')}`; + } else { + outputStr = ` ${outputStrs.join(', ')}`; + } + return `${this[Symbol.toStringTag]} {${outputStr} }`; + } +}); + +function domainToASCII(domain) { + if (arguments.length < 1) + throw new TypeError('The "domain" argument must be specified'); + + // toUSVString is not needed. + return _domainToASCII(`${domain}`); +} + +function domainToUnicode(domain) { + if (arguments.length < 1) + throw new TypeError('The "domain" argument must be specified'); + + // toUSVString is not needed. + return _domainToUnicode(`${domain}`); +} + +// Utility function that converts a URL object into an ordinary +// options object as expected by the http.request and https.request +// APIs. +function urlToOptions(url) { + var options = { + protocol: url.protocol, + hostname: url.hostname, + hash: url.hash, + search: url.search, + pathname: url.pathname, + path: `${url.pathname}${url.search}`, + href: url.href + }; + if (url.port !== '') { + options.port = Number(url.port); + } + if (url.username || url.password) { + options.auth = `${url.username}:${url.password}`; + } + return options; +} + +function getPathFromURLWin32(url) { + var hostname = url.hostname; + var pathname = url.pathname; + for (var n = 0; n < pathname.length; n++) { + if (pathname[n] === '%') { + var third = pathname.codePointAt(n + 2) | 0x20; + if ((pathname[n + 1] === '2' && third === 102) || // 2f 2F / + (pathname[n + 1] === '5' && third === 99)) { // 5c 5C \ + return new TypeError( + 'File URL path must not include encoded \\ or / characters'); + } + } + } + pathname = decodeURIComponent(pathname); + if (hostname !== '') { + // If hostname is set, then we have a UNC path + // Pass the hostname through domainToUnicode just in case + // it is an IDN using punycode encoding. We do not need to worry + // about percent encoding because the URL parser will have + // already taken care of that for us. Note that this only + // causes IDNs with an appropriate `xn--` prefix to be decoded. + return `//${domainToUnicode(hostname)}${pathname}`; + } else { + // Otherwise, it's a local path that requires a drive letter + var letter = pathname.codePointAt(1) | 0x20; + var sep = pathname[2]; + if (letter < 97 || letter > 122 || // a..z A..Z + (sep !== ':')) { + return new TypeError('File URL path must be absolute'); + } + return pathname.slice(1); + } +} + +function getPathFromURLPosix(url) { + if (url.hostname !== '') { + return new TypeError( + `File URL host must be "localhost" or empty on ${platform}`); + } + var pathname = url.pathname; + for (var n = 0; n < pathname.length; n++) { + if (pathname[n] === '%') { + var third = pathname.codePointAt(n + 2) | 0x20; + if (pathname[n + 1] === '2' && third === 102) { + return new TypeError( + 'File URL path must not include encoded / characters'); + } + } + } + return decodeURIComponent(pathname); +} + +function getPathFromURL(path) { + if (path == null || !path[searchParams] || + !path[searchParams][searchParams]) { + return path; + } + if (path.protocol !== 'file:') + return new TypeError('The URL must be of scheme file'); + return isWindows ? getPathFromURLWin32(path) : getPathFromURLPosix(path); +} + +// We percent-encode % character when converting from file path to URL, +// as this is the only character that won't be percent encoded by +// default URL percent encoding when pathname is set. +const percentRegEx = /%/g; +function getURLFromFilePath(filepath) { + const tmp = new URL('file://'); + if (filepath.includes('%')) + filepath = filepath.replace(percentRegEx, '%25'); + tmp.pathname = filepath; + return tmp; +} + +function NativeURL(ctx) { + this[context] = ctx; +} +NativeURL.prototype = URL.prototype; + +function constructUrl(flags, protocol, username, password, + host, port, path, query, fragment) { + var ctx = new URLContext(); + ctx.flags = flags; + ctx.scheme = protocol; + ctx.username = (flags & URL_FLAGS_HAS_USERNAME) !== 0 ? username : ''; + ctx.password = (flags & URL_FLAGS_HAS_PASSWORD) !== 0 ? password : ''; + ctx.port = port; + ctx.path = (flags & URL_FLAGS_HAS_PATH) !== 0 ? path : []; + ctx.query = query; + ctx.fragment = fragment; + ctx.host = host; + const url = new NativeURL(ctx); + url[searchParams] = new URLSearchParams(); + url[searchParams][context] = url; + initSearchParams(url[searchParams], query); + return url; +} +setURLConstructor(constructUrl); + +module.exports = { + toUSVString, + getPathFromURL, + getURLFromFilePath, + URL, + URLSearchParams, + domainToASCII, + domainToUnicode, + urlToOptions, + formatSymbol: kFormat, + searchParamsSymbol: searchParams +}; diff --git a/lib/internal/util.js b/lib/internal/util.js index 58aa011c08c6b9..f66698295f33e7 100644 --- a/lib/internal/util.js +++ b/lib/internal/util.js @@ -6,6 +6,21 @@ const prefix = `(${process.release.name}:${process.pid}) `; exports.getHiddenValue = binding.getHiddenValue; exports.setHiddenValue = binding.setHiddenValue; +exports.getConstructorOf = function getConstructorOf(obj) { + while (obj) { + var descriptor = Object.getOwnPropertyDescriptor(obj, 'constructor'); + if (descriptor !== undefined && + typeof descriptor.value === 'function' && + descriptor.value.name !== '') { + return descriptor.value; + } + + obj = Object.getPrototypeOf(obj); + } + + return null; +}; + // The `buffer` module uses this. Defining it here instead of in the public // `util` module makes it accessible without having to `require('util')` there. exports.customInspectSymbol = Symbol('util.inspect.custom'); diff --git a/lib/querystring.js b/lib/querystring.js index 5ccb5fa77b320f..668628cdc386f6 100644 --- a/lib/querystring.js +++ b/lib/querystring.js @@ -1,5 +1,6 @@ 'use strict'; +const { hexTable } = require('internal/querystring'); const QueryString = module.exports = { unescapeBuffer, // `unescape()` is a JS global, so we need to use a different local name @@ -116,10 +117,6 @@ function qsUnescape(s, decodeSpaces) { } -const hexTable = []; -for (var i = 0; i < 256; ++i) - hexTable[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase(); - // These characters do not need escaping when generating query strings: // ! - . _ ~ // ' ( ) * diff --git a/lib/url.js b/lib/url.js index f084fd372afaf9..980a2b2a1f00f2 100644 --- a/lib/url.js +++ b/lib/url.js @@ -3,12 +3,17 @@ const { toASCII } = process.binding('config').hasIntl ? process.binding('icu') : require('punycode'); -exports.parse = urlParse; -exports.resolve = urlResolve; -exports.resolveObject = urlResolveObject; -exports.format = urlFormat; +const { hexTable } = require('internal/querystring'); -exports.Url = Url; +// WHATWG URL implementation provided by internal/url +const { + URL, + URLSearchParams, + domainToASCII, + domainToUnicode +} = require('internal/url'); + +// Original url.parse() API function Url() { this.protocol = null; @@ -942,10 +947,6 @@ function spliceOne(list, index) { list.pop(); } -var hexTable = new Array(256); -for (var i = 0; i < 256; ++i) - hexTable[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase(); - // These characters do not need escaping: // ! - . _ ~ // ' ( ) * : @@ -1017,3 +1018,18 @@ function encodeAuth(str) { return out + str.slice(lastPos); return out; } + +module.exports = { + // Original API + Url, + parse: urlParse, + resolve: urlResolve, + resolveObject: urlResolveObject, + format: urlFormat, + + // WHATWG API + URL, + URLSearchParams, + domainToASCII, + domainToUnicode +}; diff --git a/lib/util.js b/lib/util.js index 2a3a5cb797f176..8c476d59e2034b 100644 --- a/lib/util.js +++ b/lib/util.js @@ -279,22 +279,6 @@ function arrayToHash(array) { } -function getConstructorOf(obj) { - while (obj) { - var descriptor = Object.getOwnPropertyDescriptor(obj, 'constructor'); - if (descriptor !== undefined && - typeof descriptor.value === 'function' && - descriptor.value.name !== '') { - return descriptor.value; - } - - obj = Object.getPrototypeOf(obj); - } - - return null; -} - - function ensureDebugIsInitialized() { if (Debug === undefined) { const runInDebugContext = require('vm').runInDebugContext; @@ -454,12 +438,12 @@ function formatValue(ctx, value, recurseTimes) { // Can't do the same for DataView because it has a non-primitive // .buffer property that we need to recurse for. if (binding.isArrayBuffer(value) || binding.isSharedArrayBuffer(value)) { - return `${getConstructorOf(value).name}` + + return `${internalUtil.getConstructorOf(value).name}` + ` { byteLength: ${formatNumber(ctx, value.byteLength)} }`; } } - var constructor = getConstructorOf(value); + var constructor = internalUtil.getConstructorOf(value); var base = '', empty = false, braces; var formatter = formatObject; diff --git a/node.gyp b/node.gyp index 1b17d991ae3244..ae05382bc7396a 100644 --- a/node.gyp +++ b/node.gyp @@ -86,9 +86,11 @@ 'lib/internal/process/stdio.js', 'lib/internal/process/warning.js', 'lib/internal/process.js', + 'lib/internal/querystring.js', 'lib/internal/readline.js', 'lib/internal/repl.js', 'lib/internal/socket_list.js', + 'lib/internal/url.js', 'lib/internal/util.js', 'lib/internal/v8_prof_polyfill.js', 'lib/internal/v8_prof_processor.js', @@ -162,6 +164,7 @@ 'src/node_main.cc', 'src/node_os.cc', 'src/node_revert.cc', + 'src/node_url.cc', 'src/node_util.cc', 'src/node_v8.cc', 'src/node_stat_watcher.cc', @@ -588,6 +591,7 @@ '<(OBJ_PATH)/node.<(OBJ_SUFFIX)', '<(OBJ_PATH)/node_buffer.<(OBJ_SUFFIX)', '<(OBJ_PATH)/node_i18n.<(OBJ_SUFFIX)', + '<(OBJ_PATH)/node_url.<(OBJ_SUFFIX)', '<(OBJ_PATH)/debug-agent.<(OBJ_SUFFIX)', '<(OBJ_PATH)/util.<(OBJ_SUFFIX)', '<(OBJ_PATH)/string_bytes.<(OBJ_SUFFIX)', @@ -611,6 +615,7 @@ 'sources': [ 'test/cctest/test_base64.cc', 'test/cctest/test_util.cc', + 'test/cctest/test_url.cc' ], 'sources!': [ diff --git a/src/env.h b/src/env.h index 940c97fe4ddbf1..c4489857161b75 100644 --- a/src/env.h +++ b/src/env.h @@ -252,6 +252,7 @@ namespace node { V(tls_wrap_constructor_template, v8::FunctionTemplate) \ V(tty_constructor_template, v8::FunctionTemplate) \ V(udp_constructor_function, v8::Function) \ + V(url_constructor_function, v8::Function) \ V(write_wrap_constructor_function, v8::Function) \ class Environment; diff --git a/src/node_url.cc b/src/node_url.cc new file mode 100644 index 00000000000000..49c005a23bc2c7 --- /dev/null +++ b/src/node_url.cc @@ -0,0 +1,2223 @@ +#include "node_url.h" +#include "node_internals.h" +#include "base-object-inl.h" +#include "node_i18n.h" + +#include +#include +#include +#include + +namespace node { + +using v8::Array; +using v8::Context; +using v8::Function; +using v8::FunctionCallbackInfo; +using v8::HandleScope; +using v8::Integer; +using v8::Isolate; +using v8::Local; +using v8::MaybeLocal; +using v8::Null; +using v8::Object; +using v8::String; +using v8::TryCatch; +using v8::Undefined; +using v8::Value; + +#define GET(env, obj, name) \ + obj->Get(env->context(), \ + OneByteString(env->isolate(), name)).ToLocalChecked() + +#define GET_AND_SET(env, obj, name, data, flag) \ + { \ + Local val = GET(env, obj, #name); \ + if (val->IsString()) { \ + Utf8Value value(env->isolate(), val.As()); \ + data->name = *value; \ + data->flags |= flag; \ + } \ + } + +#define UTF8STRING(isolate, str) \ + String::NewFromUtf8(isolate, str.c_str(), v8::NewStringType::kNormal) \ + .ToLocalChecked() + +namespace url { + +// https://url.spec.whatwg.org/#eof-code-point +static const char kEOL = -1; + +// Used in ToUSVString(). +static const char16_t kUnicodeReplacementCharacter = 0xFFFD; + +// https://url.spec.whatwg.org/#concept-host +union url_host_value { + std::string domain; + uint32_t ipv4; + uint16_t ipv6[8]; + std::string opaque; + ~url_host_value() {} +}; + +enum url_host_type { + HOST_TYPE_FAILED = -1, + HOST_TYPE_DOMAIN = 0, + HOST_TYPE_IPV4 = 1, + HOST_TYPE_IPV6 = 2, + HOST_TYPE_OPAQUE = 3, +}; + +struct url_host { + url_host_value value; + enum url_host_type type; +}; + +#define ARGS(XX) \ + XX(ARG_FLAGS) \ + XX(ARG_PROTOCOL) \ + XX(ARG_USERNAME) \ + XX(ARG_PASSWORD) \ + XX(ARG_HOST) \ + XX(ARG_PORT) \ + XX(ARG_PATH) \ + XX(ARG_QUERY) \ + XX(ARG_FRAGMENT) + +#define ERR_ARGS(XX) \ + XX(ERR_ARG_FLAGS) \ + XX(ERR_ARG_INPUT) \ + +enum url_cb_args { +#define XX(name) name, + ARGS(XX) +#undef XX +}; + +enum url_error_cb_args { +#define XX(name) name, + ERR_ARGS(XX) +#undef XX +}; + +#define CHAR_TEST(bits, name, expr) \ + template \ + static inline bool name(const T ch) { \ + static_assert(sizeof(ch) >= (bits) / 8, \ + "Character must be wider than " #bits " bits"); \ + return (expr); \ + } + +#define TWO_CHAR_STRING_TEST(bits, name, expr) \ + template \ + static inline bool name(const T ch1, const T ch2) { \ + static_assert(sizeof(ch1) >= (bits) / 8, \ + "Character must be wider than " #bits " bits"); \ + return (expr); \ + } \ + template \ + static inline bool name(const std::basic_string& str) { \ + static_assert(sizeof(str[0]) >= (bits) / 8, \ + "Character must be wider than " #bits " bits"); \ + return str.length() >= 2 && name(str[0], str[1]); \ + } + +// https://infra.spec.whatwg.org/#ascii-tab-or-newline +CHAR_TEST(8, IsASCIITabOrNewline, (ch == '\t' || ch == '\n' || ch == '\r')) + +// https://infra.spec.whatwg.org/#c0-control-or-space +CHAR_TEST(8, IsC0ControlOrSpace, (ch >= '\0' && ch <= ' ')) + +// https://infra.spec.whatwg.org/#ascii-digit +CHAR_TEST(8, IsASCIIDigit, (ch >= '0' && ch <= '9')) + +// https://infra.spec.whatwg.org/#ascii-hex-digit +CHAR_TEST(8, IsASCIIHexDigit, (IsASCIIDigit(ch) || + (ch >= 'A' && ch <= 'F') || + (ch >= 'a' && ch <= 'f'))) + +// https://infra.spec.whatwg.org/#ascii-alpha +CHAR_TEST(8, IsASCIIAlpha, ((ch >= 'A' && ch <= 'Z') || + (ch >= 'a' && ch <= 'z'))) + +// https://infra.spec.whatwg.org/#ascii-alphanumeric +CHAR_TEST(8, IsASCIIAlphanumeric, (IsASCIIDigit(ch) || IsASCIIAlpha(ch))) + +// https://infra.spec.whatwg.org/#ascii-lowercase +template +static inline T ASCIILowercase(T ch) { + return IsASCIIAlpha(ch) ? (ch | 0x20) : ch; +} + +// https://url.spec.whatwg.org/#forbidden-host-code-point +CHAR_TEST(8, IsForbiddenHostCodePoint, + ch == '\0' || ch == '\t' || ch == '\n' || ch == '\r' || + ch == ' ' || ch == '#' || ch == '%' || ch == '/' || + ch == ':' || ch == '?' || ch == '@' || ch == '[' || + ch == '\\' || ch == ']') + +// https://url.spec.whatwg.org/#windows-drive-letter +TWO_CHAR_STRING_TEST(8, IsWindowsDriveLetter, + (IsASCIIAlpha(ch1) && (ch2 == ':' || ch2 == '|'))) + +// https://url.spec.whatwg.org/#normalized-windows-drive-letter +TWO_CHAR_STRING_TEST(8, IsNormalizedWindowsDriveLetter, + (IsASCIIAlpha(ch1) && ch2 == ':')) + +// If a UTF-16 character is a low/trailing surrogate. +CHAR_TEST(16, IsUnicodeTrail, (ch & 0xFC00) == 0xDC00) + +// If a UTF-16 character is a surrogate. +CHAR_TEST(16, IsUnicodeSurrogate, (ch & 0xF800) == 0xD800) + +// If a UTF-16 surrogate is a low/trailing one. +CHAR_TEST(16, IsUnicodeSurrogateTrail, (ch & 0x400) != 0) + +#undef CHAR_TEST +#undef TWO_CHAR_STRING_TEST + +static const char* hex[256] = { + "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07", + "%08", "%09", "%0A", "%0B", "%0C", "%0D", "%0E", "%0F", + "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17", + "%18", "%19", "%1A", "%1B", "%1C", "%1D", "%1E", "%1F", + "%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27", + "%28", "%29", "%2A", "%2B", "%2C", "%2D", "%2E", "%2F", + "%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37", + "%38", "%39", "%3A", "%3B", "%3C", "%3D", "%3E", "%3F", + "%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47", + "%48", "%49", "%4A", "%4B", "%4C", "%4D", "%4E", "%4F", + "%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57", + "%58", "%59", "%5A", "%5B", "%5C", "%5D", "%5E", "%5F", + "%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67", + "%68", "%69", "%6A", "%6B", "%6C", "%6D", "%6E", "%6F", + "%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77", + "%78", "%79", "%7A", "%7B", "%7C", "%7D", "%7E", "%7F", + "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87", + "%88", "%89", "%8A", "%8B", "%8C", "%8D", "%8E", "%8F", + "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97", + "%98", "%99", "%9A", "%9B", "%9C", "%9D", "%9E", "%9F", + "%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7", + "%A8", "%A9", "%AA", "%AB", "%AC", "%AD", "%AE", "%AF", + "%B0", "%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7", + "%B8", "%B9", "%BA", "%BB", "%BC", "%BD", "%BE", "%BF", + "%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7", + "%C8", "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF", + "%D0", "%D1", "%D2", "%D3", "%D4", "%D5", "%D6", "%D7", + "%D8", "%D9", "%DA", "%DB", "%DC", "%DD", "%DE", "%DF", + "%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6", "%E7", + "%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF", + "%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7", + "%F8", "%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF" +}; + +static const uint8_t C0_CONTROL_ENCODE_SET[32] = { + // 00 01 02 03 04 05 06 07 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 08 09 0A 0B 0C 0D 0E 0F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 10 11 12 13 14 15 16 17 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 18 19 1A 1B 1C 1D 1E 1F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 20 21 22 23 24 25 26 27 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 28 29 2A 2B 2C 2D 2E 2F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 30 31 32 33 34 35 36 37 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 38 39 3A 3B 3C 3D 3E 3F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 40 41 42 43 44 45 46 47 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 48 49 4A 4B 4C 4D 4E 4F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 50 51 52 53 54 55 56 57 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 58 59 5A 5B 5C 5D 5E 5F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 60 61 62 63 64 65 66 67 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 68 69 6A 6B 6C 6D 6E 6F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 70 71 72 73 74 75 76 77 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 78 79 7A 7B 7C 7D 7E 7F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80, + // 80 81 82 83 84 85 86 87 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 88 89 8A 8B 8C 8D 8E 8F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 90 91 92 93 94 95 96 97 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 98 99 9A 9B 9C 9D 9E 9F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // A0 A1 A2 A3 A4 A5 A6 A7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // A8 A9 AA AB AC AD AE AF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // B0 B1 B2 B3 B4 B5 B6 B7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // B8 B9 BA BB BC BD BE BF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // C0 C1 C2 C3 C4 C5 C6 C7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // C8 C9 CA CB CC CD CE CF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // D0 D1 D2 D3 D4 D5 D6 D7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // D8 D9 DA DB DC DD DE DF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // E0 E1 E2 E3 E4 E5 E6 E7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // E8 E9 EA EB EC ED EE EF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // F0 F1 F2 F3 F4 F5 F6 F7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // F8 F9 FA FB FC FD FE FF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80 +}; + +static const uint8_t PATH_ENCODE_SET[32] = { + // 00 01 02 03 04 05 06 07 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 08 09 0A 0B 0C 0D 0E 0F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 10 11 12 13 14 15 16 17 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 18 19 1A 1B 1C 1D 1E 1F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 20 21 22 23 24 25 26 27 + 0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00, + // 28 29 2A 2B 2C 2D 2E 2F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 30 31 32 33 34 35 36 37 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 38 39 3A 3B 3C 3D 3E 3F + 0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x80, + // 40 41 42 43 44 45 46 47 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 48 49 4A 4B 4C 4D 4E 4F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 50 51 52 53 54 55 56 57 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 58 59 5A 5B 5C 5D 5E 5F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 60 61 62 63 64 65 66 67 + 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 68 69 6A 6B 6C 6D 6E 6F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 70 71 72 73 74 75 76 77 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 78 79 7A 7B 7C 7D 7E 7F + 0x00 | 0x00 | 0x00 | 0x08 | 0x00 | 0x20 | 0x00 | 0x80, + // 80 81 82 83 84 85 86 87 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 88 89 8A 8B 8C 8D 8E 8F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 90 91 92 93 94 95 96 97 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 98 99 9A 9B 9C 9D 9E 9F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // A0 A1 A2 A3 A4 A5 A6 A7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // A8 A9 AA AB AC AD AE AF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // B0 B1 B2 B3 B4 B5 B6 B7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // B8 B9 BA BB BC BD BE BF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // C0 C1 C2 C3 C4 C5 C6 C7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // C8 C9 CA CB CC CD CE CF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // D0 D1 D2 D3 D4 D5 D6 D7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // D8 D9 DA DB DC DD DE DF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // E0 E1 E2 E3 E4 E5 E6 E7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // E8 E9 EA EB EC ED EE EF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // F0 F1 F2 F3 F4 F5 F6 F7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // F8 F9 FA FB FC FD FE FF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80 +}; + +static const uint8_t USERINFO_ENCODE_SET[32] = { + // 00 01 02 03 04 05 06 07 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 08 09 0A 0B 0C 0D 0E 0F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 10 11 12 13 14 15 16 17 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 18 19 1A 1B 1C 1D 1E 1F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 20 21 22 23 24 25 26 27 + 0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00, + // 28 29 2A 2B 2C 2D 2E 2F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80, + // 30 31 32 33 34 35 36 37 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 38 39 3A 3B 3C 3D 3E 3F + 0x00 | 0x00 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 40 41 42 43 44 45 46 47 + 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 48 49 4A 4B 4C 4D 4E 4F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 50 51 52 53 54 55 56 57 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 58 59 5A 5B 5C 5D 5E 5F + 0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x40 | 0x00, + // 60 61 62 63 64 65 66 67 + 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 68 69 6A 6B 6C 6D 6E 6F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 70 71 72 73 74 75 76 77 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 78 79 7A 7B 7C 7D 7E 7F + 0x00 | 0x00 | 0x00 | 0x08 | 0x10 | 0x20 | 0x00 | 0x80, + // 80 81 82 83 84 85 86 87 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 88 89 8A 8B 8C 8D 8E 8F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 90 91 92 93 94 95 96 97 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 98 99 9A 9B 9C 9D 9E 9F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // A0 A1 A2 A3 A4 A5 A6 A7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // A8 A9 AA AB AC AD AE AF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // B0 B1 B2 B3 B4 B5 B6 B7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // B8 B9 BA BB BC BD BE BF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // C0 C1 C2 C3 C4 C5 C6 C7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // C8 C9 CA CB CC CD CE CF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // D0 D1 D2 D3 D4 D5 D6 D7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // D8 D9 DA DB DC DD DE DF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // E0 E1 E2 E3 E4 E5 E6 E7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // E8 E9 EA EB EC ED EE EF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // F0 F1 F2 F3 F4 F5 F6 F7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // F8 F9 FA FB FC FD FE FF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80 +}; + +static const uint8_t QUERY_ENCODE_SET[32] = { + // 00 01 02 03 04 05 06 07 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 08 09 0A 0B 0C 0D 0E 0F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 10 11 12 13 14 15 16 17 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 18 19 1A 1B 1C 1D 1E 1F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 20 21 22 23 24 25 26 27 + 0x01 | 0x00 | 0x04 | 0x08 | 0x00 | 0x00 | 0x00 | 0x00, + // 28 29 2A 2B 2C 2D 2E 2F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 30 31 32 33 34 35 36 37 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 38 39 3A 3B 3C 3D 3E 3F + 0x00 | 0x00 | 0x00 | 0x00 | 0x10 | 0x00 | 0x40 | 0x00, + // 40 41 42 43 44 45 46 47 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 48 49 4A 4B 4C 4D 4E 4F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 50 51 52 53 54 55 56 57 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 58 59 5A 5B 5C 5D 5E 5F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 60 61 62 63 64 65 66 67 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 68 69 6A 6B 6C 6D 6E 6F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 70 71 72 73 74 75 76 77 + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00, + // 78 79 7A 7B 7C 7D 7E 7F + 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80, + // 80 81 82 83 84 85 86 87 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 88 89 8A 8B 8C 8D 8E 8F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 90 91 92 93 94 95 96 97 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // 98 99 9A 9B 9C 9D 9E 9F + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // A0 A1 A2 A3 A4 A5 A6 A7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // A8 A9 AA AB AC AD AE AF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // B0 B1 B2 B3 B4 B5 B6 B7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // B8 B9 BA BB BC BD BE BF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // C0 C1 C2 C3 C4 C5 C6 C7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // C8 C9 CA CB CC CD CE CF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // D0 D1 D2 D3 D4 D5 D6 D7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // D8 D9 DA DB DC DD DE DF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // E0 E1 E2 E3 E4 E5 E6 E7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // E8 E9 EA EB EC ED EE EF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // F0 F1 F2 F3 F4 F5 F6 F7 + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80, + // F8 F9 FA FB FC FD FE FF + 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 | 0x40 | 0x80 +}; + +static inline bool BitAt(const uint8_t a[], const uint8_t i) { + return !!(a[i >> 3] & (1 << (i & 7))); +} + +// Appends ch to str. If ch position in encode_set is set, the ch will +// be percent-encoded then appended. +static inline void AppendOrEscape(std::string* str, + const unsigned char ch, + const uint8_t encode_set[]) { + if (BitAt(encode_set, ch)) + *str += hex[ch]; + else + *str += ch; +} + +template +static inline unsigned hex2bin(const T ch) { + if (ch >= '0' && ch <= '9') + return ch - '0'; + if (ch >= 'A' && ch <= 'F') + return 10 + (ch - 'A'); + if (ch >= 'a' && ch <= 'f') + return 10 + (ch - 'a'); + return static_cast(-1); +} + +static inline void PercentDecode(const char* input, + size_t len, + std::string* dest) { + if (len == 0) + return; + dest->reserve(len); + const char* pointer = input; + const char* end = input + len; + + while (pointer < end) { + const char ch = pointer[0]; + const size_t remaining = end - pointer - 1; + if (ch != '%' || remaining < 2 || + (ch == '%' && + (!IsASCIIHexDigit(pointer[1]) || + !IsASCIIHexDigit(pointer[2])))) { + *dest += ch; + pointer++; + continue; + } else { + unsigned a = hex2bin(pointer[1]); + unsigned b = hex2bin(pointer[2]); + char c = static_cast(a * 16 + b); + *dest += c; + pointer += 3; + } + } +} + +#define SPECIALS(XX) \ + XX("ftp:", 21) \ + XX("file:", -1) \ + XX("gopher:", 70) \ + XX("http:", 80) \ + XX("https:", 443) \ + XX("ws:", 80) \ + XX("wss:", 443) + +static inline bool IsSpecial(std::string scheme) { +#define XX(name, _) if (scheme == name) return true; + SPECIALS(XX); +#undef XX + return false; +} + +// https://url.spec.whatwg.org/#start-with-a-windows-drive-letter +static inline bool StartsWithWindowsDriveLetter(const char* p, + const char* end) { + const size_t length = end - p; + return length >= 2 && + IsWindowsDriveLetter(p[0], p[1]) && + (length == 2 || + p[2] == '/' || + p[2] == '\\' || + p[2] == '?' || + p[2] == '#'); +} + +static inline int NormalizePort(std::string scheme, int p) { +#define XX(name, port) if (scheme == name && p == port) return -1; + SPECIALS(XX); +#undef XX + return p; +} + +#if defined(NODE_HAVE_I18N_SUPPORT) +static inline bool ToUnicode(const std::string& input, std::string* output) { + MaybeStackBuffer buf; + if (i18n::ToUnicode(&buf, input.c_str(), input.length()) < 0) + return false; + output->assign(*buf, buf.length()); + return true; +} + +static inline bool ToASCII(const std::string& input, std::string* output) { + MaybeStackBuffer buf; + if (i18n::ToASCII(&buf, input.c_str(), input.length()) < 0) + return false; + output->assign(*buf, buf.length()); + return true; +} +#else +// Intentional non-ops if ICU is not present. +static inline bool ToUnicode(const std::string& input, std::string* output) { + *output = input; + return true; +} + +static inline bool ToASCII(const std::string& input, std::string* output) { + *output = input; + return true; +} +#endif + +static url_host_type ParseIPv6Host(url_host* host, + const char* input, + size_t length) { + url_host_type type = HOST_TYPE_FAILED; + for (unsigned n = 0; n < 8; n++) + host->value.ipv6[n] = 0; + uint16_t* piece_pointer = &host->value.ipv6[0]; + uint16_t* last_piece = piece_pointer + 8; + uint16_t* compress_pointer = nullptr; + const char* pointer = input; + const char* end = pointer + length; + unsigned value, len, swaps, numbers_seen; + char ch = pointer < end ? pointer[0] : kEOL; + if (ch == ':') { + if (length < 2 || pointer[1] != ':') + goto end; + pointer += 2; + ch = pointer < end ? pointer[0] : kEOL; + piece_pointer++; + compress_pointer = piece_pointer; + } + while (ch != kEOL) { + if (piece_pointer > last_piece) + goto end; + if (ch == ':') { + if (compress_pointer != nullptr) + goto end; + pointer++; + ch = pointer < end ? pointer[0] : kEOL; + piece_pointer++; + compress_pointer = piece_pointer; + continue; + } + value = 0; + len = 0; + while (len < 4 && IsASCIIHexDigit(ch)) { + value = value * 0x10 + hex2bin(ch); + pointer++; + ch = pointer < end ? pointer[0] : kEOL; + len++; + } + switch (ch) { + case '.': + if (len == 0) + goto end; + pointer -= len; + ch = pointer < end ? pointer[0] : kEOL; + if (piece_pointer > last_piece - 2) + goto end; + numbers_seen = 0; + while (ch != kEOL) { + value = 0xffffffff; + if (numbers_seen > 0) { + if (ch == '.' && numbers_seen < 4) { + pointer++; + ch = pointer < end ? pointer[0] : kEOL; + } else { + goto end; + } + } + if (!IsASCIIDigit(ch)) + goto end; + while (IsASCIIDigit(ch)) { + unsigned number = ch - '0'; + if (value == 0xffffffff) { + value = number; + } else if (value == 0) { + goto end; + } else { + value = value * 10 + number; + } + if (value > 255) + goto end; + pointer++; + ch = pointer < end ? pointer[0] : kEOL; + } + *piece_pointer = *piece_pointer * 0x100 + value; + numbers_seen++; + if (numbers_seen == 2 || numbers_seen == 4) + piece_pointer++; + } + if (numbers_seen != 4) + goto end; + continue; + case ':': + pointer++; + ch = pointer < end ? pointer[0] : kEOL; + if (ch == kEOL) + goto end; + break; + case kEOL: + break; + default: + goto end; + } + *piece_pointer = value; + piece_pointer++; + } + + if (compress_pointer != nullptr) { + swaps = piece_pointer - compress_pointer; + piece_pointer = last_piece - 1; + while (piece_pointer != &host->value.ipv6[0] && swaps > 0) { + uint16_t temp = *piece_pointer; + uint16_t* swap_piece = compress_pointer + swaps - 1; + *piece_pointer = *swap_piece; + *swap_piece = temp; + piece_pointer--; + swaps--; + } + } else if (compress_pointer == nullptr && + piece_pointer != last_piece) { + goto end; + } + type = HOST_TYPE_IPV6; + end: + host->type = type; + return type; +} + +static inline int64_t ParseNumber(const char* start, const char* end) { + unsigned R = 10; + if (end - start >= 2 && start[0] == '0' && (start[1] | 0x20) == 'x') { + start += 2; + R = 16; + } + if (end - start == 0) { + return 0; + } else if (R == 10 && end - start > 1 && start[0] == '0') { + start++; + R = 8; + } + const char* p = start; + + while (p < end) { + const char ch = p[0]; + switch (R) { + case 8: + if (ch < '0' || ch > '7') + return -1; + break; + case 10: + if (!IsASCIIDigit(ch)) + return -1; + break; + case 16: + if (!IsASCIIHexDigit(ch)) + return -1; + break; + } + p++; + } + return strtoll(start, NULL, R); +} + +static url_host_type ParseIPv4Host(url_host* host, + const char* input, + size_t length) { + url_host_type type = HOST_TYPE_DOMAIN; + const char* pointer = input; + const char* mark = input; + const char* end = pointer + length; + int parts = 0; + uint32_t val = 0; + uint64_t numbers[4]; + int tooBigNumbers = 0; + if (length == 0) + goto end; + + while (pointer <= end) { + const char ch = pointer < end ? pointer[0] : kEOL; + const int remaining = end - pointer - 1; + if (ch == '.' || ch == kEOL) { + if (++parts > 4) + goto end; + if (pointer == mark) + goto end; + int64_t n = ParseNumber(mark, pointer); + if (n < 0) + goto end; + + if (n > 255) { + tooBigNumbers++; + } + numbers[parts - 1] = n; + mark = pointer + 1; + if (ch == '.' && remaining == 0) + break; + } + pointer++; + } + CHECK_GT(parts, 0); + + // If any but the last item in numbers is greater than 255, return failure. + // If the last item in numbers is greater than or equal to + // 256^(5 - the number of items in numbers), return failure. + if (tooBigNumbers > 1 || + (tooBigNumbers == 1 && numbers[parts - 1] <= 255) || + numbers[parts - 1] >= pow(256, static_cast(5 - parts))) { + type = HOST_TYPE_FAILED; + goto end; + } + + type = HOST_TYPE_IPV4; + val = numbers[parts - 1]; + for (int n = 0; n < parts - 1; n++) { + double b = 3 - n; + val += numbers[n] * pow(256, b); + } + + host->value.ipv4 = val; + end: + host->type = type; + return type; +} + +static url_host_type ParseOpaqueHost(url_host* host, + const char* input, + size_t length) { + url_host_type type = HOST_TYPE_OPAQUE; + std::string output; + output.reserve(length * 3); + for (size_t i = 0; i < length; i++) { + const char ch = input[i]; + if (ch != '%' && IsForbiddenHostCodePoint(ch)) { + type = HOST_TYPE_FAILED; + goto end; + } else { + AppendOrEscape(&output, ch, C0_CONTROL_ENCODE_SET); + } + } + + host->value.opaque = output; + end: + host->type = type; + return type; +} + +static url_host_type ParseHost(url_host* host, + const char* input, + size_t length, + bool is_special, + bool unicode = false) { + url_host_type type = HOST_TYPE_FAILED; + const char* pointer = input; + std::string decoded; + + if (length == 0) + goto end; + + if (pointer[0] == '[') { + if (pointer[length - 1] != ']') + goto end; + return ParseIPv6Host(host, ++pointer, length - 2); + } + + if (!is_special) + return ParseOpaqueHost(host, input, length); + + // First, we have to percent decode + PercentDecode(input, length, &decoded); + + // Then we have to punycode toASCII + if (!ToASCII(decoded, &decoded)) + goto end; + + // If any of the following characters are still present, we have to fail + for (size_t n = 0; n < decoded.size(); n++) { + const char ch = decoded[n]; + if (IsForbiddenHostCodePoint(ch)) { + goto end; + } + } + + // Check to see if it's an IPv4 IP address + type = ParseIPv4Host(host, decoded.c_str(), decoded.length()); + if (type == HOST_TYPE_IPV4 || type == HOST_TYPE_FAILED) + goto end; + + // If the unicode flag is set, run the result through punycode ToUnicode + if (unicode && !ToUnicode(decoded, &decoded)) + goto end; + + // It's not an IPv4 or IPv6 address, it must be a domain + type = HOST_TYPE_DOMAIN; + host->value.domain = decoded; + + end: + host->type = type; + return type; +} + +// Locates the longest sequence of 0 segments in an IPv6 address +// in order to use the :: compression when serializing +static inline uint16_t* FindLongestZeroSequence(uint16_t* values, + size_t len) { + uint16_t* start = values; + uint16_t* end = start + len; + uint16_t* result = nullptr; + + uint16_t* current = nullptr; + unsigned counter = 0, longest = 1; + + while (start < end) { + if (*start == 0) { + if (current == nullptr) + current = start; + counter++; + } else { + if (counter > longest) { + longest = counter; + result = current; + } + counter = 0; + current = nullptr; + } + start++; + } + if (counter > longest) + result = current; + return result; +} + +static url_host_type WriteHost(url_host* host, std::string* dest) { + dest->clear(); + switch (host->type) { + case HOST_TYPE_DOMAIN: + *dest = host->value.domain; + break; + case HOST_TYPE_IPV4: { + dest->reserve(15); + uint32_t value = host->value.ipv4; + for (int n = 0; n < 4; n++) { + char buf[4]; + char* buffer = buf; + snprintf(buffer, sizeof(buf), "%d", value % 256); + dest->insert(0, buf); + if (n < 3) + dest->insert(0, 1, '.'); + value /= 256; + } + break; + } + case HOST_TYPE_IPV6: { + dest->reserve(41); + *dest+= '['; + uint16_t* start = &host->value.ipv6[0]; + uint16_t* compress_pointer = + FindLongestZeroSequence(start, 8); + bool ignore0 = false; + for (int n = 0; n <= 7; n++) { + uint16_t* piece = &host->value.ipv6[n]; + if (ignore0 && *piece == 0) + continue; + else if (ignore0) + ignore0 = false; + if (compress_pointer == piece) { + *dest += n == 0 ? "::" : ":"; + ignore0 = true; + continue; + } + char buf[5]; + char* buffer = buf; + snprintf(buffer, sizeof(buf), "%x", *piece); + *dest += buf; + if (n < 7) + *dest += ':'; + } + *dest += ']'; + break; + } + case HOST_TYPE_OPAQUE: + *dest = host->value.opaque; + break; + case HOST_TYPE_FAILED: + break; + } + return host->type; +} + +static bool ParseHost(std::string* input, + std::string* output, + bool is_special, + bool unicode = false) { + if (input->length() == 0) { + output->clear(); + return true; + } + url_host host{{""}, HOST_TYPE_DOMAIN}; + ParseHost(&host, input->c_str(), input->length(), is_special, unicode); + if (host.type == HOST_TYPE_FAILED) + return false; + WriteHost(&host, output); + return true; +} + +static inline void Copy(Environment* env, + Local ary, + std::vector* vec) { + const int32_t len = ary->Length(); + if (len == 0) + return; // nothing to copy + vec->reserve(len); + for (int32_t n = 0; n < len; n++) { + Local val = ary->Get(env->context(), n).ToLocalChecked(); + if (val->IsString()) { + Utf8Value value(env->isolate(), val.As()); + vec->push_back(std::string(*value, value.length())); + } + } +} + +static inline Local Copy(Environment* env, + const std::vector& vec) { + Isolate* isolate = env->isolate(); + Local ary = Array::New(isolate, vec.size()); + for (size_t n = 0; n < vec.size(); n++) + ary->Set(env->context(), n, UTF8STRING(isolate, vec[n])).FromJust(); + return ary; +} + +static inline void HarvestBase(Environment* env, + struct url_data* base, + Local base_obj) { + Local context = env->context(); + Local flags = GET(env, base_obj, "flags"); + if (flags->IsInt32()) + base->flags = flags->Int32Value(context).FromJust(); + + Local scheme = GET(env, base_obj, "scheme"); + base->scheme = Utf8Value(env->isolate(), scheme).out(); + + GET_AND_SET(env, base_obj, username, base, URL_FLAGS_HAS_USERNAME); + GET_AND_SET(env, base_obj, password, base, URL_FLAGS_HAS_PASSWORD); + GET_AND_SET(env, base_obj, host, base, URL_FLAGS_HAS_HOST); + GET_AND_SET(env, base_obj, query, base, URL_FLAGS_HAS_QUERY); + GET_AND_SET(env, base_obj, fragment, base, URL_FLAGS_HAS_FRAGMENT); + Local port = GET(env, base_obj, "port"); + if (port->IsInt32()) + base->port = port->Int32Value(context).FromJust(); + Local path = GET(env, base_obj, "path"); + if (path->IsArray()) { + base->flags |= URL_FLAGS_HAS_PATH; + Copy(env, path.As(), &(base->path)); + } +} + +static inline void HarvestContext(Environment* env, + struct url_data* context, + Local context_obj) { + Local flags = GET(env, context_obj, "flags"); + if (flags->IsInt32()) { + int32_t _flags = flags->Int32Value(env->context()).FromJust(); + if (_flags & URL_FLAGS_SPECIAL) + context->flags |= URL_FLAGS_SPECIAL; + if (_flags & URL_FLAGS_CANNOT_BE_BASE) + context->flags |= URL_FLAGS_CANNOT_BE_BASE; + if (_flags & URL_FLAGS_HAS_USERNAME) + context->flags |= URL_FLAGS_HAS_USERNAME; + if (_flags & URL_FLAGS_HAS_PASSWORD) + context->flags |= URL_FLAGS_HAS_PASSWORD; + if (_flags & URL_FLAGS_HAS_HOST) + context->flags |= URL_FLAGS_HAS_HOST; + } + Local scheme = GET(env, context_obj, "scheme"); + if (scheme->IsString()) { + Utf8Value value(env->isolate(), scheme); + context->scheme.assign(*value, value.length()); + } + Local port = GET(env, context_obj, "port"); + if (port->IsInt32()) + context->port = port->Int32Value(env->context()).FromJust(); + if (context->flags & URL_FLAGS_HAS_USERNAME) { + Local username = GET(env, context_obj, "username"); + CHECK(username->IsString()); + Utf8Value value(env->isolate(), username); + context->username.assign(*value, value.length()); + } + if (context->flags & URL_FLAGS_HAS_PASSWORD) { + Local password = GET(env, context_obj, "password"); + CHECK(password->IsString()); + Utf8Value value(env->isolate(), password); + context->password.assign(*value, value.length()); + } + Local host = GET(env, context_obj, "host"); + if (host->IsString()) { + Utf8Value value(env->isolate(), host); + context->host.assign(*value, value.length()); + } +} + +// Single dot segment can be ".", "%2e", or "%2E" +static inline bool IsSingleDotSegment(std::string str) { + switch (str.size()) { + case 1: + return str == "."; + case 3: + return str[0] == '%' && + str[1] == '2' && + ASCIILowercase(str[2]) == 'e'; + default: + return false; + } +} + +// Double dot segment can be: +// "..", ".%2e", ".%2E", "%2e.", "%2E.", +// "%2e%2e", "%2E%2E", "%2e%2E", or "%2E%2e" +static inline bool IsDoubleDotSegment(std::string str) { + switch (str.size()) { + case 2: + return str == ".."; + case 4: + if (str[0] != '.' && str[0] != '%') + return false; + return ((str[0] == '.' && + str[1] == '%' && + str[2] == '2' && + ASCIILowercase(str[3]) == 'e') || + (str[0] == '%' && + str[1] == '2' && + ASCIILowercase(str[2]) == 'e' && + str[3] == '.')); + case 6: + return (str[0] == '%' && + str[1] == '2' && + ASCIILowercase(str[2]) == 'e' && + str[3] == '%' && + str[4] == '2' && + ASCIILowercase(str[5]) == 'e'); + default: + return false; + } +} + +static inline void ShortenUrlPath(struct url_data* url) { + if (url->path.empty()) return; + if (url->path.size() == 1 && url->scheme == "file:" && + IsNormalizedWindowsDriveLetter(url->path[0])) return; + url->path.pop_back(); +} + +void URL::Parse(const char* input, + size_t len, + enum url_parse_state state_override, + struct url_data* url, + bool has_url, + const struct url_data* base, + bool has_base) { + const char* p = input; + const char* end = input + len; + + if (!has_url) { + for (const char* ptr = p; ptr < end; ptr++) { + if (IsC0ControlOrSpace(*ptr)) + p++; + else + break; + } + for (const char* ptr = end - 1; ptr >= p; ptr--) { + if (IsC0ControlOrSpace(*ptr)) + end--; + else + break; + } + len = end - p; + } + + std::string whitespace_stripped; + whitespace_stripped.reserve(len); + for (const char* ptr = p; ptr < end; ptr++) + if (!IsASCIITabOrNewline(*ptr)) + whitespace_stripped += *ptr; + + input = whitespace_stripped.c_str(); + len = whitespace_stripped.size(); + p = input; + end = input + len; + + bool atflag = false; + bool sbflag = false; + bool uflag = false; + + std::string buffer; + url->scheme.reserve(len); + url->username.reserve(len); + url->password.reserve(len); + url->host.reserve(len); + url->path.reserve(len); + url->query.reserve(len); + url->fragment.reserve(len); + buffer.reserve(len); + + // Set the initial parse state. + const bool has_state_override = state_override != kUnknownState; + enum url_parse_state state = has_state_override ? state_override : + kSchemeStart; + + if (state < kSchemeStart || state > kFragment) { + url->flags |= URL_FLAGS_INVALID_PARSE_STATE; + return; + } + + while (p <= end) { + const char ch = p < end ? p[0] : kEOL; + bool special = (url->flags & URL_FLAGS_SPECIAL); + bool cannot_be_base; + const bool special_back_slash = (special && ch == '\\'); + + switch (state) { + case kSchemeStart: + if (IsASCIIAlpha(ch)) { + buffer += ASCIILowercase(ch); + state = kScheme; + } else if (!has_state_override) { + state = kNoScheme; + continue; + } else { + url->flags |= URL_FLAGS_FAILED; + return; + } + break; + case kScheme: + if (IsASCIIAlphanumeric(ch) || ch == '+' || ch == '-' || ch == '.') { + buffer += ASCIILowercase(ch); + } else if (ch == ':' || (has_state_override && ch == kEOL)) { + if (has_state_override && buffer.size() == 0) { + url->flags |= URL_FLAGS_TERMINATED; + return; + } + buffer += ':'; + + bool new_is_special = IsSpecial(buffer); + + if (has_state_override) { + if ((special != new_is_special) || + ((buffer == "file:") && + ((url->flags & URL_FLAGS_HAS_USERNAME) || + (url->flags & URL_FLAGS_HAS_PASSWORD) || + (url->port != -1)))) { + url->flags |= URL_FLAGS_TERMINATED; + return; + } + + // File scheme && (host == empty or null) check left to JS-land + // as it can be done before even entering C++ binding. + } + + url->scheme = buffer; + url->port = NormalizePort(url->scheme, url->port); + if (new_is_special) { + url->flags |= URL_FLAGS_SPECIAL; + special = true; + } else { + url->flags &= ~URL_FLAGS_SPECIAL; + special = false; + } + buffer.clear(); + if (has_state_override) + return; + if (url->scheme == "file:") { + state = kFile; + } else if (special && + has_base && + url->scheme == base->scheme) { + state = kSpecialRelativeOrAuthority; + } else if (special) { + state = kSpecialAuthoritySlashes; + } else if (p[1] == '/') { + state = kPathOrAuthority; + p++; + } else { + url->flags |= URL_FLAGS_CANNOT_BE_BASE; + url->flags |= URL_FLAGS_HAS_PATH; + url->path.push_back(""); + state = kCannotBeBase; + } + } else if (!has_state_override) { + buffer.clear(); + state = kNoScheme; + p = input; + continue; + } else { + url->flags |= URL_FLAGS_FAILED; + return; + } + break; + case kNoScheme: + cannot_be_base = has_base && (base->flags & URL_FLAGS_CANNOT_BE_BASE); + if (!has_base || (cannot_be_base && ch != '#')) { + url->flags |= URL_FLAGS_FAILED; + return; + } else if (cannot_be_base && ch == '#') { + url->scheme = base->scheme; + if (IsSpecial(url->scheme)) { + url->flags |= URL_FLAGS_SPECIAL; + special = true; + } else { + url->flags &= ~URL_FLAGS_SPECIAL; + special = false; + } + if (base->flags & URL_FLAGS_HAS_PATH) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path = base->path; + } + if (base->flags & URL_FLAGS_HAS_QUERY) { + url->flags |= URL_FLAGS_HAS_QUERY; + url->query = base->query; + } + if (base->flags & URL_FLAGS_HAS_FRAGMENT) { + url->flags |= URL_FLAGS_HAS_FRAGMENT; + url->fragment = base->fragment; + } + url->flags |= URL_FLAGS_CANNOT_BE_BASE; + state = kFragment; + } else if (has_base && + base->scheme != "file:") { + state = kRelative; + continue; + } else { + url->scheme = "file:"; + url->flags |= URL_FLAGS_SPECIAL; + special = true; + state = kFile; + continue; + } + break; + case kSpecialRelativeOrAuthority: + if (ch == '/' && p[1] == '/') { + state = kSpecialAuthorityIgnoreSlashes; + p++; + } else { + state = kRelative; + continue; + } + break; + case kPathOrAuthority: + if (ch == '/') { + state = kAuthority; + } else { + state = kPath; + continue; + } + break; + case kRelative: + url->scheme = base->scheme; + if (IsSpecial(url->scheme)) { + url->flags |= URL_FLAGS_SPECIAL; + special = true; + } else { + url->flags &= ~URL_FLAGS_SPECIAL; + special = false; + } + switch (ch) { + case kEOL: + if (base->flags & URL_FLAGS_HAS_USERNAME) { + url->flags |= URL_FLAGS_HAS_USERNAME; + url->username = base->username; + } + if (base->flags & URL_FLAGS_HAS_PASSWORD) { + url->flags |= URL_FLAGS_HAS_PASSWORD; + url->password = base->password; + } + if (base->flags & URL_FLAGS_HAS_HOST) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host = base->host; + } + if (base->flags & URL_FLAGS_HAS_QUERY) { + url->flags |= URL_FLAGS_HAS_QUERY; + url->query = base->query; + } + if (base->flags & URL_FLAGS_HAS_PATH) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path = base->path; + } + url->port = base->port; + break; + case '/': + state = kRelativeSlash; + break; + case '?': + if (base->flags & URL_FLAGS_HAS_USERNAME) { + url->flags |= URL_FLAGS_HAS_USERNAME; + url->username = base->username; + } + if (base->flags & URL_FLAGS_HAS_PASSWORD) { + url->flags |= URL_FLAGS_HAS_PASSWORD; + url->password = base->password; + } + if (base->flags & URL_FLAGS_HAS_HOST) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host = base->host; + } + if (base->flags & URL_FLAGS_HAS_PATH) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path = base->path; + } + url->port = base->port; + state = kQuery; + break; + case '#': + if (base->flags & URL_FLAGS_HAS_USERNAME) { + url->flags |= URL_FLAGS_HAS_USERNAME; + url->username = base->username; + } + if (base->flags & URL_FLAGS_HAS_PASSWORD) { + url->flags |= URL_FLAGS_HAS_PASSWORD; + url->password = base->password; + } + if (base->flags & URL_FLAGS_HAS_HOST) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host = base->host; + } + if (base->flags & URL_FLAGS_HAS_QUERY) { + url->flags |= URL_FLAGS_HAS_QUERY; + url->query = base->query; + } + if (base->flags & URL_FLAGS_HAS_PATH) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path = base->path; + } + url->port = base->port; + state = kFragment; + break; + default: + if (special_back_slash) { + state = kRelativeSlash; + } else { + if (base->flags & URL_FLAGS_HAS_USERNAME) { + url->flags |= URL_FLAGS_HAS_USERNAME; + url->username = base->username; + } + if (base->flags & URL_FLAGS_HAS_PASSWORD) { + url->flags |= URL_FLAGS_HAS_PASSWORD; + url->password = base->password; + } + if (base->flags & URL_FLAGS_HAS_HOST) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host = base->host; + } + if (base->flags & URL_FLAGS_HAS_PATH) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path = base->path; + ShortenUrlPath(url); + } + url->port = base->port; + state = kPath; + continue; + } + } + break; + case kRelativeSlash: + if (IsSpecial(url->scheme) && (ch == '/' || ch == '\\')) { + state = kSpecialAuthorityIgnoreSlashes; + } else if (ch == '/') { + state = kAuthority; + } else { + if (base->flags & URL_FLAGS_HAS_USERNAME) { + url->flags |= URL_FLAGS_HAS_USERNAME; + url->username = base->username; + } + if (base->flags & URL_FLAGS_HAS_PASSWORD) { + url->flags |= URL_FLAGS_HAS_PASSWORD; + url->password = base->password; + } + if (base->flags & URL_FLAGS_HAS_HOST) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host = base->host; + } + url->port = base->port; + state = kPath; + continue; + } + break; + case kSpecialAuthoritySlashes: + state = kSpecialAuthorityIgnoreSlashes; + if (ch == '/' && p[1] == '/') { + p++; + } else { + continue; + } + break; + case kSpecialAuthorityIgnoreSlashes: + if (ch != '/' && ch != '\\') { + state = kAuthority; + continue; + } + break; + case kAuthority: + if (ch == '@') { + if (atflag) { + buffer.reserve(buffer.size() + 3); + buffer.insert(0, "%40"); + } + atflag = true; + const size_t blen = buffer.size(); + if (blen > 0 && buffer[0] != ':') { + url->flags |= URL_FLAGS_HAS_USERNAME; + } + for (size_t n = 0; n < blen; n++) { + const char bch = buffer[n]; + if (bch == ':') { + url->flags |= URL_FLAGS_HAS_PASSWORD; + if (!uflag) { + uflag = true; + continue; + } + } + if (uflag) { + AppendOrEscape(&url->password, bch, USERINFO_ENCODE_SET); + } else { + AppendOrEscape(&url->username, bch, USERINFO_ENCODE_SET); + } + } + buffer.clear(); + } else if (ch == kEOL || + ch == '/' || + ch == '?' || + ch == '#' || + special_back_slash) { + if (atflag && buffer.size() == 0) { + url->flags |= URL_FLAGS_FAILED; + return; + } + p -= buffer.size() + 1; + buffer.clear(); + state = kHost; + } else { + buffer += ch; + } + break; + case kHost: + case kHostname: + if (has_state_override && url->scheme == "file:") { + state = kFileHost; + continue; + } else if (ch == ':' && !sbflag) { + if (buffer.size() == 0) { + url->flags |= URL_FLAGS_FAILED; + return; + } + url->flags |= URL_FLAGS_HAS_HOST; + if (!ParseHost(&buffer, &url->host, special)) { + url->flags |= URL_FLAGS_FAILED; + return; + } + buffer.clear(); + state = kPort; + if (state_override == kHostname) { + return; + } + } else if (ch == kEOL || + ch == '/' || + ch == '?' || + ch == '#' || + special_back_slash) { + p--; + if (special && buffer.size() == 0) { + url->flags |= URL_FLAGS_FAILED; + return; + } + if (has_state_override && + buffer.size() == 0 && + ((url->username.size() > 0 || url->password.size() > 0) || + url->port != -1)) { + url->flags |= URL_FLAGS_TERMINATED; + return; + } + url->flags |= URL_FLAGS_HAS_HOST; + if (!ParseHost(&buffer, &url->host, special)) { + url->flags |= URL_FLAGS_FAILED; + return; + } + buffer.clear(); + state = kPathStart; + if (has_state_override) { + return; + } + } else { + if (ch == '[') + sbflag = true; + if (ch == ']') + sbflag = false; + buffer += ch; + } + break; + case kPort: + if (IsASCIIDigit(ch)) { + buffer += ch; + } else if (has_state_override || + ch == kEOL || + ch == '/' || + ch == '?' || + ch == '#' || + special_back_slash) { + if (buffer.size() > 0) { + unsigned port = 0; + // the condition port <= 0xffff prevents integer overflow + for (size_t i = 0; port <= 0xffff && i < buffer.size(); i++) + port = port * 10 + buffer[i] - '0'; + if (port > 0xffff) { + // TODO(TimothyGu): This hack is currently needed for the host + // setter since it needs access to hostname if it is valid, and + // if the FAILED flag is set the entire response to JS layer + // will be empty. + if (state_override == kHost) + url->port = -1; + else + url->flags |= URL_FLAGS_FAILED; + return; + } + // the port is valid + url->port = NormalizePort(url->scheme, static_cast(port)); + buffer.clear(); + } else if (has_state_override) { + // TODO(TimothyGu): Similar case as above. + if (state_override == kHost) + url->port = -1; + else + url->flags |= URL_FLAGS_TERMINATED; + return; + } + state = kPathStart; + continue; + } else { + url->flags |= URL_FLAGS_FAILED; + return; + } + break; + case kFile: + url->scheme = "file:"; + if (ch == '/' || ch == '\\') { + state = kFileSlash; + } else if (has_base && base->scheme == "file:") { + switch (ch) { + case kEOL: + if (base->flags & URL_FLAGS_HAS_HOST) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host = base->host; + } + if (base->flags & URL_FLAGS_HAS_PATH) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path = base->path; + } + if (base->flags & URL_FLAGS_HAS_QUERY) { + url->flags |= URL_FLAGS_HAS_QUERY; + url->query = base->query; + } + break; + case '?': + if (base->flags & URL_FLAGS_HAS_HOST) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host = base->host; + } + if (base->flags & URL_FLAGS_HAS_PATH) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path = base->path; + } + url->flags |= URL_FLAGS_HAS_QUERY; + url->query.clear(); + state = kQuery; + break; + case '#': + if (base->flags & URL_FLAGS_HAS_HOST) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host = base->host; + } + if (base->flags & URL_FLAGS_HAS_PATH) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path = base->path; + } + if (base->flags & URL_FLAGS_HAS_QUERY) { + url->flags |= URL_FLAGS_HAS_QUERY; + url->query = base->query; + } + url->flags |= URL_FLAGS_HAS_FRAGMENT; + url->fragment.clear(); + state = kFragment; + break; + default: + if (!StartsWithWindowsDriveLetter(p, end)) { + if (base->flags & URL_FLAGS_HAS_HOST) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host = base->host; + } + if (base->flags & URL_FLAGS_HAS_PATH) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path = base->path; + } + ShortenUrlPath(url); + } + state = kPath; + continue; + } + } else { + state = kPath; + continue; + } + break; + case kFileSlash: + if (ch == '/' || ch == '\\') { + state = kFileHost; + } else { + if (has_base && + base->scheme == "file:" && + !StartsWithWindowsDriveLetter(p, end)) { + if (IsNormalizedWindowsDriveLetter(base->path[0])) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path.push_back(base->path[0]); + } else { + if (base->flags & URL_FLAGS_HAS_HOST) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host = base->host; + } else { + url->flags &= ~URL_FLAGS_HAS_HOST; + url->host.clear(); + } + } + } + state = kPath; + continue; + } + break; + case kFileHost: + if (ch == kEOL || + ch == '/' || + ch == '\\' || + ch == '?' || + ch == '#') { + if (!has_state_override && + buffer.size() == 2 && + IsWindowsDriveLetter(buffer)) { + state = kPath; + } else if (buffer.size() == 0) { + url->flags |= URL_FLAGS_HAS_HOST; + url->host.clear(); + if (has_state_override) + return; + state = kPathStart; + } else { + std::string host; + if (!ParseHost(&buffer, &host, special)) { + url->flags |= URL_FLAGS_FAILED; + return; + } + if (host == "localhost") + host.clear(); + url->flags |= URL_FLAGS_HAS_HOST; + url->host = host; + if (has_state_override) + return; + buffer.clear(); + state = kPathStart; + } + continue; + } else { + buffer += ch; + } + break; + case kPathStart: + if (IsSpecial(url->scheme)) { + state = kPath; + if (ch != '/' && ch != '\\') { + continue; + } + } else if (!has_state_override && ch == '?') { + url->flags |= URL_FLAGS_HAS_QUERY; + url->query.clear(); + state = kQuery; + } else if (!has_state_override && ch == '#') { + url->flags |= URL_FLAGS_HAS_FRAGMENT; + url->fragment.clear(); + state = kFragment; + } else if (ch != kEOL) { + state = kPath; + if (ch != '/') { + continue; + } + } + break; + case kPath: + if (ch == kEOL || + ch == '/' || + special_back_slash || + (!has_state_override && (ch == '?' || ch == '#'))) { + if (IsDoubleDotSegment(buffer)) { + ShortenUrlPath(url); + if (ch != '/' && !special_back_slash) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path.push_back(""); + } + } else if (IsSingleDotSegment(buffer) && + ch != '/' && !special_back_slash) { + url->flags |= URL_FLAGS_HAS_PATH; + url->path.push_back(""); + } else if (!IsSingleDotSegment(buffer)) { + if (url->scheme == "file:" && + url->path.empty() && + buffer.size() == 2 && + IsWindowsDriveLetter(buffer)) { + if ((url->flags & URL_FLAGS_HAS_HOST) && + !url->host.empty()) { + url->host.clear(); + url->flags |= URL_FLAGS_HAS_HOST; + } + buffer[1] = ':'; + } + url->flags |= URL_FLAGS_HAS_PATH; + std::string segment(buffer.c_str(), buffer.size()); + url->path.push_back(segment); + } + buffer.clear(); + if (url->scheme == "file:" && + (ch == kEOL || + ch == '?' || + ch == '#')) { + while (url->path.size() > 1 && url->path[0].length() == 0) { + url->path.erase(url->path.begin()); + } + } + if (ch == '?') { + url->flags |= URL_FLAGS_HAS_QUERY; + state = kQuery; + } else if (ch == '#') { + state = kFragment; + } + } else { + AppendOrEscape(&buffer, ch, PATH_ENCODE_SET); + } + break; + case kCannotBeBase: + switch (ch) { + case '?': + state = kQuery; + break; + case '#': + state = kFragment; + break; + default: + if (url->path.size() == 0) + url->path.push_back(""); + if (url->path.size() > 0 && ch != kEOL) + AppendOrEscape(&url->path[0], ch, C0_CONTROL_ENCODE_SET); + } + break; + case kQuery: + if (ch == kEOL || (!has_state_override && ch == '#')) { + url->flags |= URL_FLAGS_HAS_QUERY; + url->query = buffer; + buffer.clear(); + if (ch == '#') + state = kFragment; + } else { + AppendOrEscape(&buffer, ch, QUERY_ENCODE_SET); + } + break; + case kFragment: + switch (ch) { + case kEOL: + url->flags |= URL_FLAGS_HAS_FRAGMENT; + url->fragment = buffer; + break; + case 0: + break; + default: + AppendOrEscape(&buffer, ch, C0_CONTROL_ENCODE_SET); + } + break; + default: + url->flags |= URL_FLAGS_INVALID_PARSE_STATE; + return; + } + + p++; + } +} // NOLINT(readability/fn_size) + +static inline void SetArgs(Environment* env, + Local argv[], + const struct url_data* url) { + Isolate* isolate = env->isolate(); + argv[ARG_FLAGS] = Integer::NewFromUnsigned(isolate, url->flags); + argv[ARG_PROTOCOL] = OneByteString(isolate, url->scheme.c_str()); + if (url->flags & URL_FLAGS_HAS_USERNAME) + argv[ARG_USERNAME] = UTF8STRING(isolate, url->username); + if (url->flags & URL_FLAGS_HAS_PASSWORD) + argv[ARG_PASSWORD] = UTF8STRING(isolate, url->password); + if (url->flags & URL_FLAGS_HAS_HOST) + argv[ARG_HOST] = UTF8STRING(isolate, url->host); + if (url->flags & URL_FLAGS_HAS_QUERY) + argv[ARG_QUERY] = UTF8STRING(isolate, url->query); + if (url->flags & URL_FLAGS_HAS_FRAGMENT) + argv[ARG_FRAGMENT] = UTF8STRING(isolate, url->fragment); + if (url->port > -1) + argv[ARG_PORT] = Integer::New(isolate, url->port); + if (url->flags & URL_FLAGS_HAS_PATH) + argv[ARG_PATH] = Copy(env, url->path); +} + +static void Parse(Environment* env, + Local recv, + const char* input, + const size_t len, + enum url_parse_state state_override, + Local base_obj, + Local context_obj, + Local cb, + Local error_cb) { + Isolate* isolate = env->isolate(); + Local context = env->context(); + HandleScope handle_scope(isolate); + Context::Scope context_scope(context); + + const bool has_context = context_obj->IsObject(); + const bool has_base = base_obj->IsObject(); + + struct url_data base; + struct url_data url; + if (has_context) + HarvestContext(env, &url, context_obj.As()); + if (has_base) + HarvestBase(env, &base, base_obj.As()); + + URL::Parse(input, len, state_override, &url, has_context, &base, has_base); + if ((url.flags & URL_FLAGS_INVALID_PARSE_STATE) || + ((state_override != kUnknownState) && + (url.flags & URL_FLAGS_TERMINATED))) + return; + + // Define the return value placeholders + const Local undef = Undefined(isolate); + const Local null = Null(isolate); + if (!(url.flags & URL_FLAGS_FAILED)) { + Local argv[9] = { + undef, + undef, + undef, + undef, + null, // host defaults to null + null, // port defaults to null + undef, + null, // query defaults to null + null, // fragment defaults to null + }; + SetArgs(env, argv, &url); + cb->Call(context, recv, arraysize(argv), argv).FromMaybe(Local()); + } else if (error_cb->IsFunction()) { + Local argv[2] = { undef, undef }; + argv[ERR_ARG_FLAGS] = Integer::NewFromUnsigned(isolate, url.flags); + argv[ERR_ARG_INPUT] = + String::NewFromUtf8(env->isolate(), + input, + v8::NewStringType::kNormal).ToLocalChecked(); + error_cb.As()->Call(context, recv, arraysize(argv), argv) + .FromMaybe(Local()); + } +} + +static void Parse(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + CHECK_GE(args.Length(), 5); + CHECK(args[0]->IsString()); // input + CHECK(args[2]->IsUndefined() || // base context + args[2]->IsNull() || + args[2]->IsObject()); + CHECK(args[3]->IsUndefined() || // context + args[3]->IsNull() || + args[3]->IsObject()); + CHECK(args[4]->IsFunction()); // complete callback + CHECK(args[5]->IsUndefined() || args[5]->IsFunction()); // error callback + + Utf8Value input(env->isolate(), args[0]); + enum url_parse_state state_override = kUnknownState; + if (args[1]->IsNumber()) { + state_override = static_cast( + args[1]->Uint32Value(env->context()).FromJust()); + } + + Parse(env, args.This(), + *input, input.length(), + state_override, + args[2], + args[3], + args[4].As(), + args[5]); +} + +static void EncodeAuthSet(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + CHECK_GE(args.Length(), 1); + CHECK(args[0]->IsString()); + Utf8Value value(env->isolate(), args[0]); + std::string output; + const size_t len = value.length(); + output.reserve(len); + for (size_t n = 0; n < len; n++) { + const char ch = (*value)[n]; + AppendOrEscape(&output, ch, USERINFO_ENCODE_SET); + } + args.GetReturnValue().Set( + String::NewFromUtf8(env->isolate(), + output.c_str(), + v8::NewStringType::kNormal).ToLocalChecked()); +} + +static void ToUSVString(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + CHECK_GE(args.Length(), 2); + CHECK(args[0]->IsString()); + CHECK(args[1]->IsNumber()); + + TwoByteValue value(env->isolate(), args[0]); + const size_t n = value.length(); + + const int64_t start = args[1]->IntegerValue(env->context()).FromJust(); + CHECK_GE(start, 0); + + for (size_t i = start; i < n; i++) { + char16_t c = value[i]; + if (!IsUnicodeSurrogate(c)) { + continue; + } else if (IsUnicodeSurrogateTrail(c) || i == n - 1) { + value[i] = kUnicodeReplacementCharacter; + } else { + char16_t d = value[i + 1]; + if (IsUnicodeTrail(d)) { + i++; + } else { + value[i] = kUnicodeReplacementCharacter; + } + } + } + + args.GetReturnValue().Set( + String::NewFromTwoByte(env->isolate(), + *value, + v8::NewStringType::kNormal, + n).ToLocalChecked()); +} + +static void DomainToASCII(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + CHECK_GE(args.Length(), 1); + CHECK(args[0]->IsString()); + Utf8Value value(env->isolate(), args[0]); + + url_host host{{""}, HOST_TYPE_DOMAIN}; + // Assuming the host is used for a special scheme. + ParseHost(&host, *value, value.length(), true); + if (host.type == HOST_TYPE_FAILED) { + args.GetReturnValue().Set(FIXED_ONE_BYTE_STRING(env->isolate(), "")); + return; + } + std::string out; + WriteHost(&host, &out); + args.GetReturnValue().Set( + String::NewFromUtf8(env->isolate(), + out.c_str(), + v8::NewStringType::kNormal).ToLocalChecked()); +} + +static void DomainToUnicode(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + CHECK_GE(args.Length(), 1); + CHECK(args[0]->IsString()); + Utf8Value value(env->isolate(), args[0]); + + url_host host{{""}, HOST_TYPE_DOMAIN}; + // Assuming the host is used for a special scheme. + ParseHost(&host, *value, value.length(), true, true); + if (host.type == HOST_TYPE_FAILED) { + args.GetReturnValue().Set(FIXED_ONE_BYTE_STRING(env->isolate(), "")); + return; + } + std::string out; + WriteHost(&host, &out); + args.GetReturnValue().Set( + String::NewFromUtf8(env->isolate(), + out.c_str(), + v8::NewStringType::kNormal).ToLocalChecked()); +} + +std::string URL::ToFilePath() const { + if (context_.scheme != "file:") { + return ""; + } + +#ifdef _WIN32 + const char* slash = "\\"; + auto is_slash = [] (char ch) { + return ch == '/' || ch == '\\'; + }; +#else + const char* slash = "/"; + auto is_slash = [] (char ch) { + return ch == '/'; + }; + if ((context_.flags & URL_FLAGS_HAS_HOST) && + context_.host.length() > 0) { + return ""; + } +#endif + std::string decoded_path; + for (const std::string& part : context_.path) { + std::string decoded; + PercentDecode(part.c_str(), part.length(), &decoded); + for (char& ch : decoded) { + if (is_slash(ch)) { + return ""; + } + } + decoded_path += slash + decoded; + } + +#ifdef _WIN32 + // TODO(TimothyGu): Use "\\?\" long paths on Windows. + + // If hostname is set, then we have a UNC path. Pass the hostname through + // ToUnicode just in case it is an IDN using punycode encoding. We do not + // need to worry about percent encoding because the URL parser will have + // already taken care of that for us. Note that this only causes IDNs with an + // appropriate `xn--` prefix to be decoded. + if ((context_.flags & URL_FLAGS_HAS_HOST) && + context_.host.length() > 0) { + std::string unicode_host; + if (!ToUnicode(context_.host, &unicode_host)) { + return ""; + } + return "\\\\" + unicode_host + decoded_path; + } + // Otherwise, it's a local path that requires a drive letter. + if (decoded_path.length() < 3) { + return ""; + } + if (decoded_path[2] != ':' || + !IsASCIIAlpha(decoded_path[1])) { + return ""; + } + // Strip out the leading '\'. + return decoded_path.substr(1); +#else + return decoded_path; +#endif +} + +// This function works by calling out to a JS function that creates and +// returns the JS URL object. Be mindful of the JS<->Native boundary +// crossing that is required. +const Local URL::ToObject(Environment* env) const { + Isolate* isolate = env->isolate(); + Local context = env->context(); + Context::Scope context_scope(context); + + const Local undef = Undefined(isolate); + const Local null = Null(isolate); + + if (context_.flags & URL_FLAGS_FAILED) + return Local(); + + Local argv[9] = { + undef, + undef, + undef, + undef, + null, // host defaults to null + null, // port defaults to null + undef, + null, // query defaults to null + null, // fragment defaults to null + }; + SetArgs(env, argv, &context_); + + TryCatch try_catch(isolate); + + // The SetURLConstructor method must have been called already to + // set the constructor function used below. SetURLConstructor is + // called automatically when the internal/url.js module is loaded + // during the internal/bootstrap_node.js processing. + MaybeLocal ret = + env->url_constructor_function() + ->Call(env->context(), undef, 9, argv); + + if (ret.IsEmpty()) { + ClearFatalExceptionHandlers(env); + FatalException(isolate, try_catch); + } + + return ret.ToLocalChecked(); +} + +static void SetURLConstructor(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + CHECK_EQ(args.Length(), 1); + CHECK(args[0]->IsFunction()); + env->set_url_constructor_function(args[0].As()); +} + +static void Init(Local target, + Local unused, + Local context, + void* priv) { + Environment* env = Environment::GetCurrent(context); + env->SetMethod(target, "parse", Parse); + env->SetMethod(target, "encodeAuth", EncodeAuthSet); + env->SetMethod(target, "toUSVString", ToUSVString); + env->SetMethod(target, "domainToASCII", DomainToASCII); + env->SetMethod(target, "domainToUnicode", DomainToUnicode); + env->SetMethod(target, "setURLConstructor", SetURLConstructor); + +#define XX(name, _) NODE_DEFINE_CONSTANT(target, name); + FLAGS(XX) +#undef XX + +#define XX(name) NODE_DEFINE_CONSTANT(target, name); + PARSESTATES(XX) +#undef XX +} +} // namespace url +} // namespace node + +NODE_MODULE_CONTEXT_AWARE_BUILTIN(url, node::url::Init) diff --git a/src/node_url.h b/src/node_url.h new file mode 100644 index 00000000000000..6b526d15b07703 --- /dev/null +++ b/src/node_url.h @@ -0,0 +1,191 @@ +#ifndef SRC_NODE_URL_H_ +#define SRC_NODE_URL_H_ + +#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#include "node.h" +#include "env-inl.h" + +#include + +namespace node { +namespace url { + +using v8::Local; +using v8::Value; + + +#define PARSESTATES(XX) \ + XX(kSchemeStart) \ + XX(kScheme) \ + XX(kNoScheme) \ + XX(kSpecialRelativeOrAuthority) \ + XX(kPathOrAuthority) \ + XX(kRelative) \ + XX(kRelativeSlash) \ + XX(kSpecialAuthoritySlashes) \ + XX(kSpecialAuthorityIgnoreSlashes) \ + XX(kAuthority) \ + XX(kHost) \ + XX(kHostname) \ + XX(kPort) \ + XX(kFile) \ + XX(kFileSlash) \ + XX(kFileHost) \ + XX(kPathStart) \ + XX(kPath) \ + XX(kCannotBeBase) \ + XX(kQuery) \ + XX(kFragment) + +#define FLAGS(XX) \ + XX(URL_FLAGS_NONE, 0) \ + XX(URL_FLAGS_FAILED, 0x01) \ + XX(URL_FLAGS_CANNOT_BE_BASE, 0x02) \ + XX(URL_FLAGS_INVALID_PARSE_STATE, 0x04) \ + XX(URL_FLAGS_TERMINATED, 0x08) \ + XX(URL_FLAGS_SPECIAL, 0x10) \ + XX(URL_FLAGS_HAS_USERNAME, 0x20) \ + XX(URL_FLAGS_HAS_PASSWORD, 0x40) \ + XX(URL_FLAGS_HAS_HOST, 0x80) \ + XX(URL_FLAGS_HAS_PATH, 0x100) \ + XX(URL_FLAGS_HAS_QUERY, 0x200) \ + XX(URL_FLAGS_HAS_FRAGMENT, 0x400) + +enum url_parse_state { + kUnknownState = -1, +#define XX(name) name, + PARSESTATES(XX) +#undef XX +}; + +enum url_flags { +#define XX(name, val) name = val, + FLAGS(XX) +#undef XX +}; + +struct url_data { + int32_t flags = URL_FLAGS_NONE; + int port = -1; + std::string scheme; + std::string username; + std::string password; + std::string host; + std::string query; + std::string fragment; + std::vector path; +}; + +class URL { + public: + static void Parse(const char* input, + size_t len, + enum url_parse_state state_override, + struct url_data* url, + bool has_url, + const struct url_data* base, + bool has_base); + + URL(const char* input, const size_t len) { + Parse(input, len, kUnknownState, &context_, false, nullptr, false); + } + + URL(const char* input, const size_t len, const URL* base) { + if (base != nullptr) + Parse(input, len, kUnknownState, + &context_, false, + &(base->context_), true); + else + Parse(input, len, kUnknownState, &context_, false, nullptr, false); + } + + URL(const char* input, const size_t len, + const char* base, const size_t baselen) { + if (base != nullptr && baselen > 0) { + URL _base(base, baselen); + Parse(input, len, kUnknownState, + &context_, false, + &(_base.context_), true); + } else { + Parse(input, len, kUnknownState, &context_, false, nullptr, false); + } + } + + explicit URL(std::string input) : + URL(input.c_str(), input.length()) {} + + URL(std::string input, const URL* base) : + URL(input.c_str(), input.length(), base) {} + + URL(std::string input, const URL& base) : + URL(input.c_str(), input.length(), &base) {} + + URL(std::string input, std::string base) : + URL(input.c_str(), input.length(), base.c_str(), base.length()) {} + + int32_t flags() { + return context_.flags; + } + + int port() { + return context_.port; + } + + const std::string& protocol() const { + return context_.scheme; + } + + const std::string& username() const { + return context_.username; + } + + const std::string& password() const { + return context_.password; + } + + const std::string& host() const { + return context_.host; + } + + const std::string& query() const { + return context_.query; + } + + const std::string& fragment() const { + return context_.fragment; + } + + std::string path() const { + std::string ret; + for (auto i = context_.path.begin(); i != context_.path.end(); i++) { + ret += '/'; + ret += *i; + } + return ret; + } + + // Get the path of the file: URL in a format consumable by native file system + // APIs. Returns an empty string if something went wrong. + std::string ToFilePath() const; + + const Local ToObject(Environment* env) const; + + URL(const URL&) = default; + URL& operator=(const URL&) = default; + URL(URL&&) = default; + URL& operator=(URL&&) = default; + + URL() : URL("") {} + + private: + struct url_data context_; +}; + +} // namespace url + +} // namespace node + +#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#endif // SRC_NODE_URL_H_ diff --git a/test/cctest/test_url.cc b/test/cctest/test_url.cc new file mode 100644 index 00000000000000..0b80d44caad807 --- /dev/null +++ b/test/cctest/test_url.cc @@ -0,0 +1,106 @@ +#include "node_url.h" +#include "node_i18n.h" + +#include "gtest/gtest.h" + +using node::url::URL; +using node::url::URL_FLAGS_FAILED; + +class URLTest : public ::testing::Test { + protected: + void SetUp() override { +#if defined(NODE_HAVE_I18N_SUPPORT) + std::string icu_data_dir; + node::i18n::InitializeICUDirectory(icu_data_dir); +#endif + } + + void TearDown() override {} +}; + +TEST_F(URLTest, Simple) { + URL simple("https://example.org:81/a/b/c?query#fragment"); + + EXPECT_FALSE(simple.flags() & URL_FLAGS_FAILED); + EXPECT_EQ(simple.protocol(), "https:"); + EXPECT_EQ(simple.host(), "example.org"); + EXPECT_EQ(simple.port(), 81); + EXPECT_EQ(simple.path(), "/a/b/c"); + EXPECT_EQ(simple.query(), "query"); + EXPECT_EQ(simple.fragment(), "fragment"); +} + +TEST_F(URLTest, Simple2) { + const char* input = "https://example.org:81/a/b/c?query#fragment"; + URL simple(input, strlen(input)); + + EXPECT_FALSE(simple.flags() & URL_FLAGS_FAILED); + EXPECT_EQ(simple.protocol(), "https:"); + EXPECT_EQ(simple.host(), "example.org"); + EXPECT_EQ(simple.port(), 81); + EXPECT_EQ(simple.path(), "/a/b/c"); + EXPECT_EQ(simple.query(), "query"); + EXPECT_EQ(simple.fragment(), "fragment"); +} + +TEST_F(URLTest, NoBase1) { + URL error("123noscheme"); + EXPECT_TRUE(error.flags() & URL_FLAGS_FAILED); +} + +TEST_F(URLTest, Base1) { + URL base("http://example.org/foo/bar"); + ASSERT_FALSE(base.flags() & URL_FLAGS_FAILED); + + URL simple("../baz", &base); + EXPECT_FALSE(simple.flags() & URL_FLAGS_FAILED); + EXPECT_EQ(simple.protocol(), "http:"); + EXPECT_EQ(simple.host(), "example.org"); + EXPECT_EQ(simple.path(), "/baz"); +} + +TEST_F(URLTest, Base2) { + URL simple("../baz", "http://example.org/foo/bar"); + + EXPECT_FALSE(simple.flags() & URL_FLAGS_FAILED); + EXPECT_EQ(simple.protocol(), "http:"); + EXPECT_EQ(simple.host(), "example.org"); + EXPECT_EQ(simple.path(), "/baz"); +} + +TEST_F(URLTest, Base3) { + const char* input = "../baz"; + const char* base = "http://example.org/foo/bar"; + + URL simple(input, strlen(input), base, strlen(base)); + + EXPECT_FALSE(simple.flags() & URL_FLAGS_FAILED); + EXPECT_EQ(simple.protocol(), "http:"); + EXPECT_EQ(simple.host(), "example.org"); + EXPECT_EQ(simple.path(), "/baz"); +} + +TEST_F(URLTest, ToFilePath) { +#define T(url, path) EXPECT_EQ(path, URL(url).ToFilePath()) + T("http://example.org/foo/bar", ""); + +#ifdef _WIN32 + T("file:///C:/Program%20Files/", "C:\\Program Files\\"); + T("file:///C:/a/b/c?query#fragment", "C:\\a\\b\\c"); + T("file://host/path/a/b/c?query#fragment", "\\\\host\\path\\a\\b\\c"); + T("file://xn--weird-prdj8vva.com/host/a", "\\\\wͪ͊eiͬ͋rd.com\\host\\a"); + T("file:///C:/a%2Fb", ""); + T("file:///", ""); + T("file:///home", ""); +#else + T("file:///", "/"); + T("file:///home/user?query#fragment", "/home/user"); + T("file:///home/user/?query#fragment", "/home/user/"); + T("file:///home/user/%20space", "/home/user/ space"); + T("file:///home/us%5Cer", "/home/us\\er"); + T("file:///home/us%2Fer", ""); + T("file://host/path", ""); +#endif + +#undef T +} diff --git a/test/fixtures/url-searchparams.js b/test/fixtures/url-searchparams.js new file mode 100644 index 00000000000000..918af678bc563e --- /dev/null +++ b/test/fixtures/url-searchparams.js @@ -0,0 +1,77 @@ +module.exports = [ + ['', '', []], + [ + 'foo=918854443121279438895193', + 'foo=918854443121279438895193', + [['foo', '918854443121279438895193']] + ], + ['foo=bar', 'foo=bar', [['foo', 'bar']]], + ['foo=bar&foo=quux', 'foo=bar&foo=quux', [['foo', 'bar'], ['foo', 'quux']]], + ['foo=1&bar=2', 'foo=1&bar=2', [['foo', '1'], ['bar', '2']]], + [ + "my%20weird%20field=q1!2%22'w%245%267%2Fz8)%3F", + 'my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F', + [['my weird field', 'q1!2"\'w$5&7/z8)?']] + ], + ['foo%3Dbaz=bar', 'foo%3Dbaz=bar', [['foo=baz', 'bar']]], + ['foo=baz=bar', 'foo=baz%3Dbar', [['foo', 'baz=bar']]], + [ + 'str=foo&arr=1&somenull&arr=2&undef=&arr=3', + 'str=foo&arr=1&somenull=&arr=2&undef=&arr=3', + [ + ['str', 'foo'], + ['arr', '1'], + ['somenull', ''], + ['arr', '2'], + ['undef', ''], + ['arr', '3'] + ] + ], + [' foo = bar ', '+foo+=+bar+', [[' foo ', ' bar ']]], + ['foo=%zx', 'foo=%25zx', [['foo', '%zx']]], + ['foo=%EF%BF%BD', 'foo=%EF%BF%BD', [['foo', '\ufffd']]], + // See: https://github.com/joyent/node/issues/3058 + ['foo&bar=baz', 'foo=&bar=baz', [['foo', ''], ['bar', 'baz']]], + ['a=b&c&d=e', 'a=b&c=&d=e', [['a', 'b'], ['c', ''], ['d', 'e']]], + ['a=b&c=&d=e', 'a=b&c=&d=e', [['a', 'b'], ['c', ''], ['d', 'e']]], + ['a=b&=c&d=e', 'a=b&=c&d=e', [['a', 'b'], ['', 'c'], ['d', 'e']]], + ['a=b&=&d=e', 'a=b&=&d=e', [['a', 'b'], ['', ''], ['d', 'e']]], + ['&&foo=bar&&', 'foo=bar', [['foo', 'bar']]], + ['&', '', []], + ['&&&&', '', []], + ['&=&', '=', [['', '']]], + ['&=&=', '=&=', [['', ''], ['', '']]], + ['=', '=', [['', '']]], + ['+', '+=', [[' ', '']]], + ['+=', '+=', [[' ', '']]], + ['+&', '+=', [[' ', '']]], + ['=+', '=+', [['', ' ']]], + ['+=&', '+=', [[' ', '']]], + ['a&&b', 'a=&b=', [['a', ''], ['b', '']]], + ['a=a&&b=b', 'a=a&b=b', [['a', 'a'], ['b', 'b']]], + ['&a', 'a=', [['a', '']]], + ['&=', '=', [['', '']]], + ['a&a&', 'a=&a=', [['a', ''], ['a', '']]], + ['a&a&a&', 'a=&a=&a=', [['a', ''], ['a', ''], ['a', '']]], + ['a&a&a&a&', 'a=&a=&a=&a=', [['a', ''], ['a', ''], ['a', ''], ['a', '']]], + ['a=&a=value&a=', 'a=&a=value&a=', [['a', ''], ['a', 'value'], ['a', '']]], + ['foo%20bar=baz%20quux', 'foo+bar=baz+quux', [['foo bar', 'baz quux']]], + ['+foo=+bar', '+foo=+bar', [[' foo', ' bar']]], + ['a+', 'a+=', [['a ', '']]], + ['=a+', '=a+', [['', 'a ']]], + ['a+&', 'a+=', [['a ', '']]], + ['=a+&', '=a+', [['', 'a ']]], + ['%20+', '++=', [[' ', '']]], + ['=%20+', '=++', [['', ' ']]], + ['%20+&', '++=', [[' ', '']]], + ['=%20+&', '=++', [['', ' ']]], + [ + // fake percent encoding + 'foo=%©ar&baz=%A©uux&xyzzy=%©ud', + 'foo=%25%C2%A9ar&baz=%25A%C2%A9uux&xyzzy=%25%C2%A9ud', + [['foo', '%©ar'], ['baz', '%A©uux'], ['xyzzy', '%©ud']] + ], + // always preserve order of key-value pairs + ['a=1&b=2&a=3', 'a=1&b=2&a=3', [['a', '1'], ['b', '2'], ['a', '3']]], + ['?a', '%3Fa=', [['?a', '']]] +]; diff --git a/test/fixtures/url-setter-tests-additional.js b/test/fixtures/url-setter-tests-additional.js new file mode 100644 index 00000000000000..b27ae336a28776 --- /dev/null +++ b/test/fixtures/url-setter-tests-additional.js @@ -0,0 +1,237 @@ +module.exports = { + 'username': [ + { + 'comment': 'Surrogate pair', + 'href': 'https://github.com/', + 'new_value': '\uD83D\uDE00', + 'expected': { + 'href': 'https://%F0%9F%98%80@github.com/', + 'username': '%F0%9F%98%80' + } + }, + { + 'comment': 'Unpaired low surrogate 1', + 'href': 'https://github.com/', + 'new_value': '\uD83D', + 'expected': { + 'href': 'https://%EF%BF%BD@github.com/', + 'username': '%EF%BF%BD' + } + }, + { + 'comment': 'Unpaired low surrogate 2', + 'href': 'https://github.com/', + 'new_value': '\uD83Dnode', + 'expected': { + 'href': 'https://%EF%BF%BDnode@github.com/', + 'username': '%EF%BF%BDnode' + } + }, + { + 'comment': 'Unpaired high surrogate 1', + 'href': 'https://github.com/', + 'new_value': '\uDE00', + 'expected': { + 'href': 'https://%EF%BF%BD@github.com/', + 'username': '%EF%BF%BD' + } + }, + { + 'comment': 'Unpaired high surrogate 2', + 'href': 'https://github.com/', + 'new_value': '\uDE00node', + 'expected': { + 'href': 'https://%EF%BF%BDnode@github.com/', + 'username': '%EF%BF%BDnode' + } + } + ], + 'password': [ + { + 'comment': 'Surrogate pair', + 'href': 'https://github.com/', + 'new_value': '\uD83D\uDE00', + 'expected': { + 'href': 'https://:%F0%9F%98%80@github.com/', + 'password': '%F0%9F%98%80' + } + }, + { + 'comment': 'Unpaired low surrogate 1', + 'href': 'https://github.com/', + 'new_value': '\uD83D', + 'expected': { + 'href': 'https://:%EF%BF%BD@github.com/', + 'password': '%EF%BF%BD' + } + }, + { + 'comment': 'Unpaired low surrogate 2', + 'href': 'https://github.com/', + 'new_value': '\uD83Dnode', + 'expected': { + 'href': 'https://:%EF%BF%BDnode@github.com/', + 'password': '%EF%BF%BDnode' + } + }, + { + 'comment': 'Unpaired high surrogate 1', + 'href': 'https://github.com/', + 'new_value': '\uDE00', + 'expected': { + 'href': 'https://:%EF%BF%BD@github.com/', + 'password': '%EF%BF%BD' + } + }, + { + 'comment': 'Unpaired high surrogate 2', + 'href': 'https://github.com/', + 'new_value': '\uDE00node', + 'expected': { + 'href': 'https://:%EF%BF%BDnode@github.com/', + 'password': '%EF%BF%BDnode' + } + } + ], + 'pathname': [ + { + 'comment': 'Surrogate pair', + 'href': 'https://github.com/', + 'new_value': '/\uD83D\uDE00', + 'expected': { + 'href': 'https://github.com/%F0%9F%98%80', + 'pathname': '/%F0%9F%98%80' + } + }, + { + 'comment': 'Unpaired low surrogate 1', + 'href': 'https://github.com/', + 'new_value': '/\uD83D', + 'expected': { + 'href': 'https://github.com/%EF%BF%BD', + 'pathname': '/%EF%BF%BD' + } + }, + { + 'comment': 'Unpaired low surrogate 2', + 'href': 'https://github.com/', + 'new_value': '/\uD83Dnode', + 'expected': { + 'href': 'https://github.com/%EF%BF%BDnode', + 'pathname': '/%EF%BF%BDnode' + } + }, + { + 'comment': 'Unpaired high surrogate 1', + 'href': 'https://github.com/', + 'new_value': '/\uDE00', + 'expected': { + 'href': 'https://github.com/%EF%BF%BD', + 'pathname': '/%EF%BF%BD' + } + }, + { + 'comment': 'Unpaired high surrogate 2', + 'href': 'https://github.com/', + 'new_value': '/\uDE00node', + 'expected': { + 'href': 'https://github.com/%EF%BF%BDnode', + 'pathname': '/%EF%BF%BDnode' + } + } + ], + 'search': [ + { + 'comment': 'Surrogate pair', + 'href': 'https://github.com/', + 'new_value': '\uD83D\uDE00', + 'expected': { + 'href': 'https://github.com/?%F0%9F%98%80', + 'search': '?%F0%9F%98%80' + } + }, + { + 'comment': 'Unpaired low surrogate 1', + 'href': 'https://github.com/', + 'new_value': '\uD83D', + 'expected': { + 'href': 'https://github.com/?%EF%BF%BD', + 'search': '?%EF%BF%BD' + } + }, + { + 'comment': 'Unpaired low surrogate 2', + 'href': 'https://github.com/', + 'new_value': '\uD83Dnode', + 'expected': { + 'href': 'https://github.com/?%EF%BF%BDnode', + 'search': '?%EF%BF%BDnode' + } + }, + { + 'comment': 'Unpaired high surrogate 1', + 'href': 'https://github.com/', + 'new_value': '\uDE00', + 'expected': { + 'href': 'https://github.com/?%EF%BF%BD', + 'search': '?%EF%BF%BD' + } + }, + { + 'comment': 'Unpaired high surrogate 2', + 'href': 'https://github.com/', + 'new_value': '\uDE00node', + 'expected': { + 'href': 'https://github.com/?%EF%BF%BDnode', + 'search': '?%EF%BF%BDnode' + } + } + ], + 'hash': [ + { + 'comment': 'Surrogate pair', + 'href': 'https://github.com/', + 'new_value': '\uD83D\uDE00', + 'expected': { + 'href': 'https://github.com/#%F0%9F%98%80', + 'hash': '#%F0%9F%98%80' + } + }, + { + 'comment': 'Unpaired low surrogate 1', + 'href': 'https://github.com/', + 'new_value': '\uD83D', + 'expected': { + 'href': 'https://github.com/#%EF%BF%BD', + 'hash': '#%EF%BF%BD' + } + }, + { + 'comment': 'Unpaired low surrogate 2', + 'href': 'https://github.com/', + 'new_value': '\uD83Dnode', + 'expected': { + 'href': 'https://github.com/#%EF%BF%BDnode', + 'hash': '#%EF%BF%BDnode' + } + }, + { + 'comment': 'Unpaired high surrogate 1', + 'href': 'https://github.com/', + 'new_value': '\uDE00', + 'expected': { + 'href': 'https://github.com/#%EF%BF%BD', + 'hash': '#%EF%BF%BD' + } + }, + { + 'comment': 'Unpaired high surrogate 2', + 'href': 'https://github.com/', + 'new_value': '\uDE00node', + 'expected': { + 'href': 'https://github.com/#%EF%BF%BDnode', + 'hash': '#%EF%BF%BDnode' + } + } + ] +}; diff --git a/test/fixtures/url-setter-tests.js b/test/fixtures/url-setter-tests.js new file mode 100644 index 00000000000000..6f769eaec7543d --- /dev/null +++ b/test/fixtures/url-setter-tests.js @@ -0,0 +1,1823 @@ +'use strict'; + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/b30abaecf4/url/setters_tests.json + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +module.exports = +{ + "comment": [ + "## Tests for setters of https://url.spec.whatwg.org/#urlutils-members", + "", + "This file contains a JSON object.", + "Other than 'comment', each key is an attribute of the `URL` interface", + "defined in WHATWG’s URL Standard.", + "The values are arrays of test case objects for that attribute.", + "", + "To run a test case for the attribute `attr`:", + "", + "* Create a new `URL` object with the value for the 'href' key", + " the constructor single parameter. (Without a base URL.)", + " This must not throw.", + "* Set the attribute `attr` to (invoke its setter with)", + " with the value of for 'new_value' key.", + "* The value for the 'expected' key is another object.", + " For each `key` / `value` pair of that object,", + " get the attribute `key` (invoke its getter).", + " The returned string must be equal to `value`.", + "", + "Note: the 'href' setter is already covered by urltestdata.json." + ], + "protocol": [ + { + "comment": "The empty string is not a valid scheme. Setter leaves the URL unchanged.", + "href": "a://example.net", + "new_value": "", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "href": "a://example.net", + "new_value": "b", + "expected": { + "href": "b://example.net", + "protocol": "b:" + } + }, + { + "href": "javascript:alert(1)", + "new_value": "defuse", + "expected": { + "href": "defuse:alert(1)", + "protocol": "defuse:" + } + }, + { + "comment": "Upper-case ASCII is lower-cased", + "href": "a://example.net", + "new_value": "B", + "expected": { + "href": "b://example.net", + "protocol": "b:" + } + }, + { + "comment": "Non-ASCII is rejected", + "href": "a://example.net", + "new_value": "é", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "comment": "No leading digit", + "href": "a://example.net", + "new_value": "0b", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "comment": "No leading punctuation", + "href": "a://example.net", + "new_value": "+b", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "href": "a://example.net", + "new_value": "bC0+-.", + "expected": { + "href": "bc0+-.://example.net", + "protocol": "bc0+-.:" + } + }, + { + "comment": "Only some punctuation is acceptable", + "href": "a://example.net", + "new_value": "b,c", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "comment": "Non-ASCII is rejected", + "href": "a://example.net", + "new_value": "bé", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "comment": "Can’t switch from URL containing username/password/port to file", + "href": "http://test@example.net", + "new_value": "file", + "expected": { + "href": "http://test@example.net/", + "protocol": "http:" + } + }, + { + "href": "gopher://example.net:1234", + "new_value": "file", + "expected": { + "href": "gopher://example.net:1234/", + "protocol": "gopher:" + } + }, + { + "href": "wss://x:x@example.net:1234", + "new_value": "file", + "expected": { + "href": "wss://x:x@example.net:1234/", + "protocol": "wss:" + } + }, + { + "comment": "Can’t switch from file URL with no host", + "href": "file://localhost/", + "new_value": "http", + "expected": { + "href": "file:///", + "protocol": "file:" + } + }, + { + "href": "file:///test", + "new_value": "gopher", + "expected": { + "href": "file:///test", + "protocol": "file:" + } + }, + { + "href": "file:", + "new_value": "wss", + "expected": { + "href": "file:///", + "protocol": "file:" + } + }, + { + "comment": "Can’t switch from special scheme to non-special", + "href": "http://example.net", + "new_value": "b", + "expected": { + "href": "http://example.net/", + "protocol": "http:" + } + }, + { + "href": "file://hi/path", + "new_value": "s", + "expected": { + "href": "file://hi/path", + "protocol": "file:" + } + }, + { + "href": "https://example.net", + "new_value": "s", + "expected": { + "href": "https://example.net/", + "protocol": "https:" + } + }, + { + "href": "ftp://example.net", + "new_value": "test", + "expected": { + "href": "ftp://example.net/", + "protocol": "ftp:" + } + }, + { + "comment": "Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must.", + "href": "mailto:me@example.net", + "new_value": "http", + "expected": { + "href": "mailto:me@example.net", + "protocol": "mailto:" + } + }, + { + "comment": "Can’t switch from non-special scheme to special", + "href": "ssh://me@example.net", + "new_value": "http", + "expected": { + "href": "ssh://me@example.net", + "protocol": "ssh:" + } + }, + { + "href": "ssh://me@example.net", + "new_value": "gopher", + "expected": { + "href": "ssh://me@example.net", + "protocol": "ssh:" + } + }, + { + "href": "ssh://me@example.net", + "new_value": "file", + "expected": { + "href": "ssh://me@example.net", + "protocol": "ssh:" + } + }, + { + "href": "ssh://example.net", + "new_value": "file", + "expected": { + "href": "ssh://example.net", + "protocol": "ssh:" + } + }, + { + "href": "nonsense:///test", + "new_value": "https", + "expected": { + "href": "nonsense:///test", + "protocol": "nonsense:" + } + }, + { + "comment": "Stuff after the first ':' is ignored", + "href": "http://example.net", + "new_value": "https:foo : bar", + "expected": { + "href": "https://example.net/", + "protocol": "https:" + } + }, + { + "comment": "Stuff after the first ':' is ignored", + "href": "data:text/html,

Test", + "new_value": "view-source+data:foo : bar", + "expected": { + "href": "view-source+data:text/html,

Test", + "protocol": "view-source+data:" + } + }, + { + "comment": "Port is set to null if it is the default for new scheme.", + "href": "http://foo.com:443/", + "new_value": "https", + "expected": { + "href": "https://foo.com/", + "protocol": "https:", + "port": "" + } + } + ], + "username": [ + { + "comment": "No host means no username", + "href": "file:///home/you/index.html", + "new_value": "me", + "expected": { + "href": "file:///home/you/index.html", + "username": "" + } + }, + { + "comment": "No host means no username", + "href": "unix:/run/foo.socket", + "new_value": "me", + "expected": { + "href": "unix:/run/foo.socket", + "username": "" + } + }, + { + "comment": "Cannot-be-a-base means no username", + "href": "mailto:you@example.net", + "new_value": "me", + "expected": { + "href": "mailto:you@example.net", + "username": "" + } + }, + { + "href": "javascript:alert(1)", + "new_value": "wario", + "expected": { + "href": "javascript:alert(1)", + "username": "" + } + }, + { + "href": "http://example.net", + "new_value": "me", + "expected": { + "href": "http://me@example.net/", + "username": "me" + } + }, + { + "href": "http://:secret@example.net", + "new_value": "me", + "expected": { + "href": "http://me:secret@example.net/", + "username": "me" + } + }, + { + "href": "http://me@example.net", + "new_value": "", + "expected": { + "href": "http://example.net/", + "username": "" + } + }, + { + "href": "http://me:secret@example.net", + "new_value": "", + "expected": { + "href": "http://:secret@example.net/", + "username": "" + } + }, + { + "comment": "UTF-8 percent encoding with the userinfo encode set.", + "href": "http://example.net", + "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/", + "username": "%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Bytes already percent-encoded are left as-is.", + "href": "http://example.net", + "new_value": "%c3%89té", + "expected": { + "href": "http://%c3%89t%C3%A9@example.net/", + "username": "%c3%89t%C3%A9" + } + }, + { + "href": "sc:///", + "new_value": "x", + "expected": { + "href": "sc:///", + "username": "" + } + }, + { + "href": "javascript://x/", + "new_value": "wario", + "expected": { + "href": "javascript://wario@x/", + "username": "wario" + } + }, + { + "href": "file://test/", + "new_value": "test", + "expected": { + "href": "file://test/", + "username": "" + } + } + ], + "password": [ + { + "comment": "No host means no password", + "href": "file:///home/me/index.html", + "new_value": "secret", + "expected": { + "href": "file:///home/me/index.html", + "password": "" + } + }, + { + "comment": "No host means no password", + "href": "unix:/run/foo.socket", + "new_value": "secret", + "expected": { + "href": "unix:/run/foo.socket", + "password": "" + } + }, + { + "comment": "Cannot-be-a-base means no password", + "href": "mailto:me@example.net", + "new_value": "secret", + "expected": { + "href": "mailto:me@example.net", + "password": "" + } + }, + { + "href": "http://example.net", + "new_value": "secret", + "expected": { + "href": "http://:secret@example.net/", + "password": "secret" + } + }, + { + "href": "http://me@example.net", + "new_value": "secret", + "expected": { + "href": "http://me:secret@example.net/", + "password": "secret" + } + }, + { + "href": "http://:secret@example.net", + "new_value": "", + "expected": { + "href": "http://example.net/", + "password": "" + } + }, + { + "href": "http://me:secret@example.net", + "new_value": "", + "expected": { + "href": "http://me@example.net/", + "password": "" + } + }, + { + "comment": "UTF-8 percent encoding with the userinfo encode set.", + "href": "http://example.net", + "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/", + "password": "%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Bytes already percent-encoded are left as-is.", + "href": "http://example.net", + "new_value": "%c3%89té", + "expected": { + "href": "http://:%c3%89t%C3%A9@example.net/", + "password": "%c3%89t%C3%A9" + } + }, + { + "href": "sc:///", + "new_value": "x", + "expected": { + "href": "sc:///", + "password": "" + } + }, + { + "href": "javascript://x/", + "new_value": "bowser", + "expected": { + "href": "javascript://:bowser@x/", + "password": "bowser" + } + }, + { + "href": "file://test/", + "new_value": "test", + "expected": { + "href": "file://test/", + "password": "" + } + } + ], + "host": [ + { + "comment": "Non-special scheme", + "href": "sc://x/", + "new_value": "\u0000", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "href": "sc://x/", + "new_value": "\u0009", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "\u000A", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "\u000D", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": " ", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "href": "sc://x/", + "new_value": "#", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "/", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "?", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "@", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "href": "sc://x/", + "new_value": "ß", + "expected": { + "href": "sc://%C3%9F/", + "host": "%C3%9F", + "hostname": "%C3%9F" + } + }, + { + "comment": "IDNA Nontransitional_Processing", + "href": "https://x/", + "new_value": "ß", + "expected": { + "href": "https://xn--zca/", + "host": "xn--zca", + "hostname": "xn--zca" + } + }, + { + "comment": "Cannot-be-a-base means no host", + "href": "mailto:me@example.net", + "new_value": "example.com", + "expected": { + "href": "mailto:me@example.net", + "host": "" + } + }, + { + "comment": "Cannot-be-a-base means no password", + "href": "data:text/plain,Stuff", + "new_value": "example.net", + "expected": { + "href": "data:text/plain,Stuff", + "host": "" + } + }, + { + "href": "http://example.net", + "new_value": "example.com:8080", + "expected": { + "href": "http://example.com:8080/", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Port number is unchanged if not specified in the new value", + "href": "http://example.net:8080", + "new_value": "example.com", + "expected": { + "href": "http://example.com:8080/", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Port number is unchanged if not specified", + "href": "http://example.net:8080", + "new_value": "example.com:", + "expected": { + "href": "http://example.com:8080/", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "The empty host is not valid for special schemes", + "href": "http://example.net", + "new_value": "", + "expected": { + "href": "http://example.net/", + "host": "example.net" + } + }, + { + "comment": "The empty host is OK for non-special schemes", + "href": "view-source+http://example.net/foo", + "new_value": "", + "expected": { + "href": "view-source+http:///foo", + "host": "" + } + }, + { + "comment": "Path-only URLs can gain a host", + "href": "a:/foo", + "new_value": "example.net", + "expected": { + "href": "a://example.net/foo", + "host": "example.net" + } + }, + { + "comment": "IPv4 address syntax is normalized", + "href": "http://example.net", + "new_value": "0x7F000001:8080", + "expected": { + "href": "http://127.0.0.1:8080/", + "host": "127.0.0.1:8080", + "hostname": "127.0.0.1", + "port": "8080" + } + }, + { + "comment": "IPv6 address syntax is normalized", + "href": "http://example.net", + "new_value": "[::0:01]:2", + "expected": { + "href": "http://[::1]:2/", + "host": "[::1]:2", + "hostname": "[::1]", + "port": "2" + } + }, + { + "comment": "Default port number is removed", + "href": "http://example.net", + "new_value": "example.com:80", + "expected": { + "href": "http://example.com/", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Default port number is removed", + "href": "https://example.net", + "new_value": "example.com:443", + "expected": { + "href": "https://example.com/", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Default port number is only removed for the relevant scheme", + "href": "https://example.net", + "new_value": "example.com:80", + "expected": { + "href": "https://example.com:80/", + "host": "example.com:80", + "hostname": "example.com", + "port": "80" + } + }, + { + "comment": "Stuff after a / delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com/stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a / delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com:8080/stuff", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Stuff after a ? delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com?stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a ? delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com:8080?stuff", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Stuff after a # delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com#stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a # delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com:8080#stuff", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Stuff after a \\ delimiter is ignored for special schemes", + "href": "http://example.net/path", + "new_value": "example.com\\stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a \\ delimiter is ignored for special schemes", + "href": "http://example.net/path", + "new_value": "example.com:8080\\stuff", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "\\ is not a delimiter for non-special schemes, but still forbidden in hosts", + "href": "view-source+http://example.net/path", + "new_value": "example.com\\stuff", + "expected": { + "href": "view-source+http://example.net/path", + "host": "example.net", + "hostname": "example.net", + "port": "" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "view-source+http://example.net/path", + "new_value": "example.com:8080stuff2", + "expected": { + "href": "view-source+http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "http://example.net/path", + "new_value": "example.com:8080stuff2", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "http://example.net/path", + "new_value": "example.com:8080+2", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Port numbers are 16 bit integers", + "href": "http://example.net/path", + "new_value": "example.com:65535", + "expected": { + "href": "http://example.com:65535/path", + "host": "example.com:65535", + "hostname": "example.com", + "port": "65535" + } + }, + { + "comment": "Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.", + "href": "http://example.net/path", + "new_value": "example.com:65536", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Broken IPv6", + "href": "http://example.net/", + "new_value": "[google.com]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.3.4x]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.3.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "file://y/", + "new_value": "x:123", + "expected": { + "href": "file://y/", + "host": "y", + "hostname": "y", + "port": "" + } + }, + { + "href": "file://y/", + "new_value": "loc%41lhost", + "expected": { + "href": "file:///", + "host": "", + "hostname": "", + "port": "" + } + }, + { + "href": "file://hi/x", + "new_value": "", + "expected": { + "href": "file:///x", + "host": "", + "hostname": "", + "port": "" + } + }, + { + "href": "sc://test@test/", + "new_value": "", + "expected": { + "href": "sc://test@test/", + "host": "test", + "hostname": "test", + "username": "test" + } + }, + { + "href": "sc://test:12/", + "new_value": "", + "expected": { + "href": "sc://test:12/", + "host": "test:12", + "hostname": "test", + "port": "12" + } + } + ], + "hostname": [ + { + "comment": "Non-special scheme", + "href": "sc://x/", + "new_value": "\u0000", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "href": "sc://x/", + "new_value": "\u0009", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "\u000A", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "\u000D", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": " ", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "href": "sc://x/", + "new_value": "#", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "/", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "?", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "@", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "comment": "Cannot-be-a-base means no host", + "href": "mailto:me@example.net", + "new_value": "example.com", + "expected": { + "href": "mailto:me@example.net", + "host": "" + } + }, + { + "comment": "Cannot-be-a-base means no password", + "href": "data:text/plain,Stuff", + "new_value": "example.net", + "expected": { + "href": "data:text/plain,Stuff", + "host": "" + } + }, + { + "href": "http://example.net:8080", + "new_value": "example.com", + "expected": { + "href": "http://example.com:8080/", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "The empty host is not valid for special schemes", + "href": "http://example.net", + "new_value": "", + "expected": { + "href": "http://example.net/", + "host": "example.net" + } + }, + { + "comment": "The empty host is OK for non-special schemes", + "href": "view-source+http://example.net/foo", + "new_value": "", + "expected": { + "href": "view-source+http:///foo", + "host": "" + } + }, + { + "comment": "Path-only URLs can gain a host", + "href": "a:/foo", + "new_value": "example.net", + "expected": { + "href": "a://example.net/foo", + "host": "example.net" + } + }, + { + "comment": "IPv4 address syntax is normalized", + "href": "http://example.net:8080", + "new_value": "0x7F000001", + "expected": { + "href": "http://127.0.0.1:8080/", + "host": "127.0.0.1:8080", + "hostname": "127.0.0.1", + "port": "8080" + } + }, + { + "comment": "IPv6 address syntax is normalized", + "href": "http://example.net", + "new_value": "[::0:01]", + "expected": { + "href": "http://[::1]/", + "host": "[::1]", + "hostname": "[::1]", + "port": "" + } + }, + { + "comment": "Stuff after a : delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com:8080", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a : delimiter is ignored", + "href": "http://example.net:8080/path", + "new_value": "example.com:", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Stuff after a / delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com/stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a ? delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com?stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a # delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com#stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a \\ delimiter is ignored for special schemes", + "href": "http://example.net/path", + "new_value": "example.com\\stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "\\ is not a delimiter for non-special schemes, but still forbidden in hosts", + "href": "view-source+http://example.net/path", + "new_value": "example.com\\stuff", + "expected": { + "href": "view-source+http://example.net/path", + "host": "example.net", + "hostname": "example.net", + "port": "" + } + }, + { + "comment": "Broken IPv6", + "href": "http://example.net/", + "new_value": "[google.com]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.3.4x]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.3.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "file://y/", + "new_value": "x:123", + "expected": { + "href": "file://y/", + "host": "y", + "hostname": "y", + "port": "" + } + }, + { + "href": "file://y/", + "new_value": "loc%41lhost", + "expected": { + "href": "file:///", + "host": "", + "hostname": "", + "port": "" + } + }, + { + "href": "file://hi/x", + "new_value": "", + "expected": { + "href": "file:///x", + "host": "", + "hostname": "", + "port": "" + } + }, + { + "href": "sc://test@test/", + "new_value": "", + "expected": { + "href": "sc://test@test/", + "host": "test", + "hostname": "test", + "username": "test" + } + }, + { + "href": "sc://test:12/", + "new_value": "", + "expected": { + "href": "sc://test:12/", + "host": "test:12", + "hostname": "test", + "port": "12" + } + } + ], + "port": [ + { + "href": "http://example.net", + "new_value": "8080", + "expected": { + "href": "http://example.net:8080/", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Port number is removed if empty is the new value", + "href": "http://example.net:8080", + "new_value": "", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net", + "port": "" + } + }, + { + "comment": "Default port number is removed", + "href": "http://example.net:8080", + "new_value": "80", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net", + "port": "" + } + }, + { + "comment": "Default port number is removed", + "href": "https://example.net:4433", + "new_value": "443", + "expected": { + "href": "https://example.net/", + "host": "example.net", + "hostname": "example.net", + "port": "" + } + }, + { + "comment": "Default port number is only removed for the relevant scheme", + "href": "https://example.net", + "new_value": "80", + "expected": { + "href": "https://example.net:80/", + "host": "example.net:80", + "hostname": "example.net", + "port": "80" + } + }, + { + "comment": "Stuff after a / delimiter is ignored", + "href": "http://example.net/path", + "new_value": "8080/stuff", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Stuff after a ? delimiter is ignored", + "href": "http://example.net/path", + "new_value": "8080?stuff", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Stuff after a # delimiter is ignored", + "href": "http://example.net/path", + "new_value": "8080#stuff", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Stuff after a \\ delimiter is ignored for special schemes", + "href": "http://example.net/path", + "new_value": "8080\\stuff", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "view-source+http://example.net/path", + "new_value": "8080stuff2", + "expected": { + "href": "view-source+http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "http://example.net/path", + "new_value": "8080stuff2", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "http://example.net/path", + "new_value": "8080+2", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Port numbers are 16 bit integers", + "href": "http://example.net/path", + "new_value": "65535", + "expected": { + "href": "http://example.net:65535/path", + "host": "example.net:65535", + "hostname": "example.net", + "port": "65535" + } + }, + { + "comment": "Port numbers are 16 bit integers, overflowing is an error", + "href": "http://example.net:8080/path", + "new_value": "65536", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Port numbers are 16 bit integers, overflowing is an error", + "href": "non-special://example.net:8080/path", + "new_value": "65536", + "expected": { + "href": "non-special://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "href": "file://test/", + "new_value": "12", + "expected": { + "href": "file://test/", + "port": "" + } + }, + { + "href": "file://localhost/", + "new_value": "12", + "expected": { + "href": "file:///", + "port": "" + } + }, + { + "href": "non-base:value", + "new_value": "12", + "expected": { + "href": "non-base:value", + "port": "" + } + }, + { + "href": "sc:///", + "new_value": "12", + "expected": { + "href": "sc:///", + "port": "" + } + }, + { + "href": "sc://x/", + "new_value": "12", + "expected": { + "href": "sc://x:12/", + "port": "12" + } + }, + { + "href": "javascript://x/", + "new_value": "12", + "expected": { + "href": "javascript://x:12/", + "port": "12" + } + } + ], + "pathname": [ + { + "comment": "Cannot-be-a-base don’t have a path", + "href": "mailto:me@example.net", + "new_value": "/foo", + "expected": { + "href": "mailto:me@example.net", + "pathname": "me@example.net" + } + }, + { + "href": "unix:/run/foo.socket?timeout=10", + "new_value": "/var/log/../run/bar.socket", + "expected": { + "href": "unix:/var/run/bar.socket?timeout=10", + "pathname": "/var/run/bar.socket" + } + }, + { + "href": "https://example.net#nav", + "new_value": "home", + "expected": { + "href": "https://example.net/home#nav", + "pathname": "/home" + } + }, + { + "href": "https://example.net#nav", + "new_value": "../home", + "expected": { + "href": "https://example.net/home#nav", + "pathname": "/home" + } + }, + { + "comment": "\\ is a segment delimiter for 'special' URLs", + "href": "http://example.net/home?lang=fr#nav", + "new_value": "\\a\\%2E\\b\\%2e.\\c", + "expected": { + "href": "http://example.net/a/c?lang=fr#nav", + "pathname": "/a/c" + } + }, + { + "comment": "\\ is *not* a segment delimiter for non-'special' URLs", + "href": "view-source+http://example.net/home?lang=fr#nav", + "new_value": "\\a\\%2E\\b\\%2e.\\c", + "expected": { + "href": "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav", + "pathname": "/\\a\\%2E\\b\\%2e.\\c" + } + }, + { + "comment": "UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.", + "href": "a:/", + "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9", + "pathname": "/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Bytes already percent-encoded are left as-is, including %2E outside dotted segments.", + "href": "http://example.net", + "new_value": "%2e%2E%c3%89té", + "expected": { + "href": "http://example.net/%2e%2E%c3%89t%C3%A9", + "pathname": "/%2e%2E%c3%89t%C3%A9" + } + }, + { + "comment": "? needs to be encoded", + "href": "http://example.net", + "new_value": "?", + "expected": { + "href": "http://example.net/%3F", + "pathname": "/%3F" + } + }, + { + "comment": "# needs to be encoded", + "href": "http://example.net", + "new_value": "#", + "expected": { + "href": "http://example.net/%23", + "pathname": "/%23" + } + }, + { + "comment": "? needs to be encoded, non-special scheme", + "href": "sc://example.net", + "new_value": "?", + "expected": { + "href": "sc://example.net/%3F", + "pathname": "/%3F" + } + }, + { + "comment": "# needs to be encoded, non-special scheme", + "href": "sc://example.net", + "new_value": "#", + "expected": { + "href": "sc://example.net/%23", + "pathname": "/%23" + } + }, + { + "comment": "File URLs and (back)slashes", + "href": "file://monkey/", + "new_value": "\\\\", + "expected": { + "href": "file://monkey/", + "pathname": "/" + } + }, + { + "comment": "File URLs and (back)slashes", + "href": "file:///unicorn", + "new_value": "//\\/", + "expected": { + "href": "file:///", + "pathname": "/" + } + }, + { + "comment": "File URLs and (back)slashes", + "href": "file:///unicorn", + "new_value": "//monkey/..//", + "expected": { + "href": "file:///", + "pathname": "/" + } + } + ], + "search": [ + { + "href": "https://example.net#nav", + "new_value": "lang=fr", + "expected": { + "href": "https://example.net/?lang=fr#nav", + "search": "?lang=fr" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "lang=fr", + "expected": { + "href": "https://example.net/?lang=fr#nav", + "search": "?lang=fr" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "?lang=fr", + "expected": { + "href": "https://example.net/?lang=fr#nav", + "search": "?lang=fr" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "??lang=fr", + "expected": { + "href": "https://example.net/??lang=fr#nav", + "search": "??lang=fr" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "?", + "expected": { + "href": "https://example.net/?#nav", + "search": "" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "", + "expected": { + "href": "https://example.net/#nav", + "search": "" + } + }, + { + "href": "https://example.net?lang=en-US", + "new_value": "", + "expected": { + "href": "https://example.net/", + "search": "" + } + }, + { + "href": "https://example.net", + "new_value": "", + "expected": { + "href": "https://example.net/", + "search": "" + } + }, + { + "comment": "UTF-8 percent encoding with the query encode set. Tabs and newlines are removed.", + "href": "a:/", + "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9", + "search": "?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Bytes already percent-encoded are left as-is", + "href": "http://example.net", + "new_value": "%c3%89té", + "expected": { + "href": "http://example.net/?%c3%89t%C3%A9", + "search": "?%c3%89t%C3%A9" + } + } + ], + "hash": [ + { + "href": "https://example.net", + "new_value": "main", + "expected": { + "href": "https://example.net/#main", + "hash": "#main" + } + }, + { + "href": "https://example.net#nav", + "new_value": "main", + "expected": { + "href": "https://example.net/#main", + "hash": "#main" + } + }, + { + "href": "https://example.net?lang=en-US", + "new_value": "##nav", + "expected": { + "href": "https://example.net/?lang=en-US##nav", + "hash": "##nav" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "#main", + "expected": { + "href": "https://example.net/?lang=en-US#main", + "hash": "#main" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "#", + "expected": { + "href": "https://example.net/?lang=en-US#", + "hash": "" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "", + "expected": { + "href": "https://example.net/?lang=en-US", + "hash": "" + } + }, + { + "comment": "Simple percent-encoding; nuls, tabs, and newlines are removed", + "href": "a:/", + "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "a:/#%01%1F !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9", + "hash": "#%01%1F !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Bytes already percent-encoded are left as-is", + "href": "http://example.net", + "new_value": "%c3%89té", + "expected": { + "href": "http://example.net/#%c3%89t%C3%A9", + "hash": "#%c3%89t%C3%A9" + } + }, + { + "href": "javascript:alert(1)", + "new_value": "castle", + "expected": { + "href": "javascript:alert(1)#castle", + "hash": "#castle" + } + } + ] +} diff --git a/test/fixtures/url-tests-additional.js b/test/fixtures/url-tests-additional.js new file mode 100644 index 00000000000000..c1c640f4bb4b7d --- /dev/null +++ b/test/fixtures/url-tests-additional.js @@ -0,0 +1,36 @@ +'use strict'; + +// This file contains test cases not part of the WPT + +module.exports = [ + { + // surrogate pair + 'url': 'https://github.com/nodejs/\uD83D\uDE00node', + 'protocol': 'https:', + 'pathname': '/nodejs/%F0%9F%98%80node' + }, + { + // unpaired low surrogate + 'url': 'https://github.com/nodejs/\uD83D', + 'protocol': 'https:', + 'pathname': '/nodejs/%EF%BF%BD' + }, + { + // unpaired low surrogate + 'url': 'https://github.com/nodejs/\uD83Dnode', + 'protocol': 'https:', + 'pathname': '/nodejs/%EF%BF%BDnode' + }, + { + // unmatched high surrogate + 'url': 'https://github.com/nodejs/\uDE00', + 'protocol': 'https:', + 'pathname': '/nodejs/%EF%BF%BD' + }, + { + // unmatched high surrogate + 'url': 'https://github.com/nodejs/\uDE00node', + 'protocol': 'https:', + 'pathname': '/nodejs/%EF%BF%BDnode' + } +]; diff --git a/test/fixtures/url-tests.js b/test/fixtures/url-tests.js new file mode 100644 index 00000000000000..48f77fe0774d64 --- /dev/null +++ b/test/fixtures/url-tests.js @@ -0,0 +1,6565 @@ +'use strict'; + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/11757f1/url/urltestdata.json + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +module.exports = +[ + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/segments.js", + { + "input": "http://example\t.\norg", + "base": "http://example.org/foo/bar", + "href": "http://example.org/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://user:pass@foo:21/bar;par?b#c", + "base": "http://example.org/foo/bar", + "href": "http://user:pass@foo:21/bar;par?b#c", + "origin": "http://foo:21", + "protocol": "http:", + "username": "user", + "password": "pass", + "host": "foo:21", + "hostname": "foo", + "port": "21", + "pathname": "/bar;par", + "search": "?b", + "hash": "#c" + }, + { + "input": "https://test:@test", + "base": "about:blank", + "href": "https://test@test/", + "origin": "https://test", + "protocol": "https:", + "username": "test", + "password": "", + "host": "test", + "hostname": "test", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://:@test", + "base": "about:blank", + "href": "https://test/", + "origin": "https://test", + "protocol": "https:", + "username": "", + "password": "", + "host": "test", + "hostname": "test", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "non-special://test:@test/x", + "base": "about:blank", + "href": "non-special://test@test/x", + "origin": "null", + "protocol": "non-special:", + "username": "test", + "password": "", + "host": "test", + "hostname": "test", + "port": "", + "pathname": "/x", + "search": "", + "hash": "" + }, + { + "input": "non-special://:@test/x", + "base": "about:blank", + "href": "non-special://test/x", + "origin": "null", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "test", + "hostname": "test", + "port": "", + "pathname": "/x", + "search": "", + "hash": "" + }, + { + "input": "http:foo.com", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/foo.com", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/foo.com", + "search": "", + "hash": "" + }, + { + "input": "\t :foo.com \n", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:foo.com", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:foo.com", + "search": "", + "hash": "" + }, + { + "input": " foo.com ", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/foo.com", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/foo.com", + "search": "", + "hash": "" + }, + { + "input": "a:\t foo.com", + "base": "http://example.org/foo/bar", + "href": "a: foo.com", + "origin": "null", + "protocol": "a:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": " foo.com", + "search": "", + "hash": "" + }, + { + "input": "http://f:21/ b ? d # e ", + "base": "http://example.org/foo/bar", + "href": "http://f:21/%20b%20?%20d%20# e", + "origin": "http://f:21", + "protocol": "http:", + "username": "", + "password": "", + "host": "f:21", + "hostname": "f", + "port": "21", + "pathname": "/%20b%20", + "search": "?%20d%20", + "hash": "# e" + }, + { + "input": "lolscheme:x x#x x", + "base": "about:blank", + "href": "lolscheme:x x#x x", + "protocol": "lolscheme:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "x x", + "search": "", + "hash": "#x x" + }, + { + "input": "http://f:/c", + "base": "http://example.org/foo/bar", + "href": "http://f/c", + "origin": "http://f", + "protocol": "http:", + "username": "", + "password": "", + "host": "f", + "hostname": "f", + "port": "", + "pathname": "/c", + "search": "", + "hash": "" + }, + { + "input": "http://f:0/c", + "base": "http://example.org/foo/bar", + "href": "http://f:0/c", + "origin": "http://f:0", + "protocol": "http:", + "username": "", + "password": "", + "host": "f:0", + "hostname": "f", + "port": "0", + "pathname": "/c", + "search": "", + "hash": "" + }, + { + "input": "http://f:00000000000000/c", + "base": "http://example.org/foo/bar", + "href": "http://f:0/c", + "origin": "http://f:0", + "protocol": "http:", + "username": "", + "password": "", + "host": "f:0", + "hostname": "f", + "port": "0", + "pathname": "/c", + "search": "", + "hash": "" + }, + { + "input": "http://f:00000000000000000000080/c", + "base": "http://example.org/foo/bar", + "href": "http://f/c", + "origin": "http://f", + "protocol": "http:", + "username": "", + "password": "", + "host": "f", + "hostname": "f", + "port": "", + "pathname": "/c", + "search": "", + "hash": "" + }, + { + "input": "http://f:b/c", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://f: /c", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://f:\n/c", + "base": "http://example.org/foo/bar", + "href": "http://f/c", + "origin": "http://f", + "protocol": "http:", + "username": "", + "password": "", + "host": "f", + "hostname": "f", + "port": "", + "pathname": "/c", + "search": "", + "hash": "" + }, + { + "input": "http://f:fifty-two/c", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://f:999999/c", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "non-special://f:999999/c", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://f: 21 / b ? d # e ", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "" + }, + { + "input": " \t", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "" + }, + { + "input": ":foo.com/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:foo.com/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:foo.com/", + "search": "", + "hash": "" + }, + { + "input": ":foo.com\\", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:foo.com/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:foo.com/", + "search": "", + "hash": "" + }, + { + "input": ":", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:", + "search": "", + "hash": "" + }, + { + "input": ":a", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:a", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:a", + "search": "", + "hash": "" + }, + { + "input": ":/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:/", + "search": "", + "hash": "" + }, + { + "input": ":\\", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:/", + "search": "", + "hash": "" + }, + { + "input": ":#", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:#", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:", + "search": "", + "hash": "" + }, + { + "input": "#", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar#", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "#/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar#/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "#/" + }, + { + "input": "#\\", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar#\\", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "#\\" + }, + { + "input": "#;?", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar#;?", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "#;?" + }, + { + "input": "?", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar?", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": ":23", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:23", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:23", + "search": "", + "hash": "" + }, + { + "input": "/:23", + "base": "http://example.org/foo/bar", + "href": "http://example.org/:23", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/:23", + "search": "", + "hash": "" + }, + { + "input": "::", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/::", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/::", + "search": "", + "hash": "" + }, + { + "input": "::23", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/::23", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/::23", + "search": "", + "hash": "" + }, + { + "input": "foo://", + "base": "http://example.org/foo/bar", + "href": "foo://", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "", + "search": "", + "hash": "" + }, + { + "input": "http://a:b@c:29/d", + "base": "http://example.org/foo/bar", + "href": "http://a:b@c:29/d", + "origin": "http://c:29", + "protocol": "http:", + "username": "a", + "password": "b", + "host": "c:29", + "hostname": "c", + "port": "29", + "pathname": "/d", + "search": "", + "hash": "" + }, + { + "input": "http::@c:29", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:@c:29", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:@c:29", + "search": "", + "hash": "" + }, + { + "input": "http://&a:foo(b]c@d:2/", + "base": "http://example.org/foo/bar", + "href": "http://&a:foo(b%5Dc@d:2/", + "origin": "http://d:2", + "protocol": "http:", + "username": "&a", + "password": "foo(b%5Dc", + "host": "d:2", + "hostname": "d", + "port": "2", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://::@c@d:2", + "base": "http://example.org/foo/bar", + "href": "http://:%3A%40c@d:2/", + "origin": "http://d:2", + "protocol": "http:", + "username": "", + "password": "%3A%40c", + "host": "d:2", + "hostname": "d", + "port": "2", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://foo.com:b@d/", + "base": "http://example.org/foo/bar", + "href": "http://foo.com:b@d/", + "origin": "http://d", + "protocol": "http:", + "username": "foo.com", + "password": "b", + "host": "d", + "hostname": "d", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://foo.com/\\@", + "base": "http://example.org/foo/bar", + "href": "http://foo.com//@", + "origin": "http://foo.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo.com", + "hostname": "foo.com", + "port": "", + "pathname": "//@", + "search": "", + "hash": "" + }, + { + "input": "http:\\\\foo.com\\", + "base": "http://example.org/foo/bar", + "href": "http://foo.com/", + "origin": "http://foo.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo.com", + "hostname": "foo.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:\\\\a\\b:c\\d@foo.com\\", + "base": "http://example.org/foo/bar", + "href": "http://a/b:c/d@foo.com/", + "origin": "http://a", + "protocol": "http:", + "username": "", + "password": "", + "host": "a", + "hostname": "a", + "port": "", + "pathname": "/b:c/d@foo.com/", + "search": "", + "hash": "" + }, + { + "input": "foo:/", + "base": "http://example.org/foo/bar", + "href": "foo:/", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "foo:/bar.com/", + "base": "http://example.org/foo/bar", + "href": "foo:/bar.com/", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/bar.com/", + "search": "", + "hash": "" + }, + { + "input": "foo://///////", + "base": "http://example.org/foo/bar", + "href": "foo://///////", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "///////", + "search": "", + "hash": "" + }, + { + "input": "foo://///////bar.com/", + "base": "http://example.org/foo/bar", + "href": "foo://///////bar.com/", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "///////bar.com/", + "search": "", + "hash": "" + }, + { + "input": "foo:////://///", + "base": "http://example.org/foo/bar", + "href": "foo:////://///", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "//://///", + "search": "", + "hash": "" + }, + { + "input": "c:/foo", + "base": "http://example.org/foo/bar", + "href": "c:/foo", + "origin": "null", + "protocol": "c:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/foo", + "search": "", + "hash": "" + }, + { + "input": "//foo/bar", + "base": "http://example.org/foo/bar", + "href": "http://foo/bar", + "origin": "http://foo", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/bar", + "search": "", + "hash": "" + }, + { + "input": "http://foo/path;a??e#f#g", + "base": "http://example.org/foo/bar", + "href": "http://foo/path;a??e#f#g", + "origin": "http://foo", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/path;a", + "search": "??e", + "hash": "#f#g" + }, + { + "input": "http://foo/abcd?efgh?ijkl", + "base": "http://example.org/foo/bar", + "href": "http://foo/abcd?efgh?ijkl", + "origin": "http://foo", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/abcd", + "search": "?efgh?ijkl", + "hash": "" + }, + { + "input": "http://foo/abcd#foo?bar", + "base": "http://example.org/foo/bar", + "href": "http://foo/abcd#foo?bar", + "origin": "http://foo", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/abcd", + "search": "", + "hash": "#foo?bar" + }, + { + "input": "[61:24:74]:98", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/[61:24:74]:98", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/[61:24:74]:98", + "search": "", + "hash": "" + }, + { + "input": "http:[61:27]/:foo", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/[61:27]/:foo", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/[61:27]/:foo", + "search": "", + "hash": "" + }, + { + "input": "http://[1::2]:3:4", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://2001::1", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://2001::1]", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://2001::1]:80", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://[2001::1]", + "base": "http://example.org/foo/bar", + "href": "http://[2001::1]/", + "origin": "http://[2001::1]", + "protocol": "http:", + "username": "", + "password": "", + "host": "[2001::1]", + "hostname": "[2001::1]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://[::127.0.0.1]", + "base": "http://example.org/foo/bar", + "href": "http://[::7f00:1]/", + "origin": "http://[::7f00:1]", + "protocol": "http:", + "username": "", + "password": "", + "host": "[::7f00:1]", + "hostname": "[::7f00:1]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://[0:0:0:0:0:0:13.1.68.3]", + "base": "http://example.org/foo/bar", + "href": "http://[::d01:4403]/", + "origin": "http://[::d01:4403]", + "protocol": "http:", + "username": "", + "password": "", + "host": "[::d01:4403]", + "hostname": "[::d01:4403]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://[2001::1]:80", + "base": "http://example.org/foo/bar", + "href": "http://[2001::1]/", + "origin": "http://[2001::1]", + "protocol": "http:", + "username": "", + "password": "", + "host": "[2001::1]", + "hostname": "[2001::1]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/example.com/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/example.com/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "ftp:/example.com/", + "base": "http://example.org/foo/bar", + "href": "ftp://example.com/", + "origin": "ftp://example.com", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https:/example.com/", + "base": "http://example.org/foo/bar", + "href": "https://example.com/", + "origin": "https://example.com", + "protocol": "https:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "madeupscheme:/example.com/", + "base": "http://example.org/foo/bar", + "href": "madeupscheme:/example.com/", + "origin": "null", + "protocol": "madeupscheme:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "file:/example.com/", + "base": "http://example.org/foo/bar", + "href": "file:///example.com/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "file://example:1/", + "base": "about:blank", + "failure": true + }, + { + "input": "file://example:test/", + "base": "about:blank", + "failure": true + }, + { + "input": "file://example%/", + "base": "about:blank", + "failure": true + }, + { + "input": "file://[example]/", + "base": "about:blank", + "failure": true + }, + { + "input": "ftps:/example.com/", + "base": "http://example.org/foo/bar", + "href": "ftps:/example.com/", + "origin": "null", + "protocol": "ftps:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "gopher:/example.com/", + "base": "http://example.org/foo/bar", + "href": "gopher://example.com/", + "origin": "gopher://example.com", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws:/example.com/", + "base": "http://example.org/foo/bar", + "href": "ws://example.com/", + "origin": "ws://example.com", + "protocol": "ws:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss:/example.com/", + "base": "http://example.org/foo/bar", + "href": "wss://example.com/", + "origin": "wss://example.com", + "protocol": "wss:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "data:/example.com/", + "base": "http://example.org/foo/bar", + "href": "data:/example.com/", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "javascript:/example.com/", + "base": "http://example.org/foo/bar", + "href": "javascript:/example.com/", + "origin": "null", + "protocol": "javascript:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "mailto:/example.com/", + "base": "http://example.org/foo/bar", + "href": "mailto:/example.com/", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "http:example.com/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/example.com/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/example.com/", + "search": "", + "hash": "" + }, + { + "input": "ftp:example.com/", + "base": "http://example.org/foo/bar", + "href": "ftp://example.com/", + "origin": "ftp://example.com", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https:example.com/", + "base": "http://example.org/foo/bar", + "href": "https://example.com/", + "origin": "https://example.com", + "protocol": "https:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "madeupscheme:example.com/", + "base": "http://example.org/foo/bar", + "href": "madeupscheme:example.com/", + "origin": "null", + "protocol": "madeupscheme:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "ftps:example.com/", + "base": "http://example.org/foo/bar", + "href": "ftps:example.com/", + "origin": "null", + "protocol": "ftps:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "gopher:example.com/", + "base": "http://example.org/foo/bar", + "href": "gopher://example.com/", + "origin": "gopher://example.com", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws:example.com/", + "base": "http://example.org/foo/bar", + "href": "ws://example.com/", + "origin": "ws://example.com", + "protocol": "ws:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss:example.com/", + "base": "http://example.org/foo/bar", + "href": "wss://example.com/", + "origin": "wss://example.com", + "protocol": "wss:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "data:example.com/", + "base": "http://example.org/foo/bar", + "href": "data:example.com/", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "javascript:example.com/", + "base": "http://example.org/foo/bar", + "href": "javascript:example.com/", + "origin": "null", + "protocol": "javascript:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "mailto:example.com/", + "base": "http://example.org/foo/bar", + "href": "mailto:example.com/", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "/a/b/c", + "base": "http://example.org/foo/bar", + "href": "http://example.org/a/b/c", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/a/b/c", + "search": "", + "hash": "" + }, + { + "input": "/a/ /c", + "base": "http://example.org/foo/bar", + "href": "http://example.org/a/%20/c", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/a/%20/c", + "search": "", + "hash": "" + }, + { + "input": "/a%2fc", + "base": "http://example.org/foo/bar", + "href": "http://example.org/a%2fc", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/a%2fc", + "search": "", + "hash": "" + }, + { + "input": "/a/%2f/c", + "base": "http://example.org/foo/bar", + "href": "http://example.org/a/%2f/c", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/a/%2f/c", + "search": "", + "hash": "" + }, + { + "input": "#β", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar#%CE%B2", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "#%CE%B2" + }, + { + "input": "data:text/html,test#test", + "base": "http://example.org/foo/bar", + "href": "data:text/html,test#test", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "text/html,test", + "search": "", + "hash": "#test" + }, + { + "input": "tel:1234567890", + "base": "http://example.org/foo/bar", + "href": "tel:1234567890", + "origin": "null", + "protocol": "tel:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "1234567890", + "search": "", + "hash": "" + }, + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/file.html", + { + "input": "file:c:\\foo\\bar.html", + "base": "file:///tmp/mock/path", + "href": "file:///c:/foo/bar.html", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:/foo/bar.html", + "search": "", + "hash": "" + }, + { + "input": " File:c|////foo\\bar.html", + "base": "file:///tmp/mock/path", + "href": "file:///c:////foo/bar.html", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:////foo/bar.html", + "search": "", + "hash": "" + }, + { + "input": "C|/foo/bar", + "base": "file:///tmp/mock/path", + "href": "file:///C:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "/C|\\foo\\bar", + "base": "file:///tmp/mock/path", + "href": "file:///C:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "//C|/foo/bar", + "base": "file:///tmp/mock/path", + "href": "file:///C:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "//server/file", + "base": "file:///tmp/mock/path", + "href": "file://server/file", + "protocol": "file:", + "username": "", + "password": "", + "host": "server", + "hostname": "server", + "port": "", + "pathname": "/file", + "search": "", + "hash": "" + }, + { + "input": "\\\\server\\file", + "base": "file:///tmp/mock/path", + "href": "file://server/file", + "protocol": "file:", + "username": "", + "password": "", + "host": "server", + "hostname": "server", + "port": "", + "pathname": "/file", + "search": "", + "hash": "" + }, + { + "input": "/\\server/file", + "base": "file:///tmp/mock/path", + "href": "file://server/file", + "protocol": "file:", + "username": "", + "password": "", + "host": "server", + "hostname": "server", + "port": "", + "pathname": "/file", + "search": "", + "hash": "" + }, + { + "input": "file:///foo/bar.txt", + "base": "file:///tmp/mock/path", + "href": "file:///foo/bar.txt", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/foo/bar.txt", + "search": "", + "hash": "" + }, + { + "input": "file:///home/me", + "base": "file:///tmp/mock/path", + "href": "file:///home/me", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/home/me", + "search": "", + "hash": "" + }, + { + "input": "//", + "base": "file:///tmp/mock/path", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "///", + "base": "file:///tmp/mock/path", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "///test", + "base": "file:///tmp/mock/path", + "href": "file:///test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "", + "hash": "" + }, + { + "input": "file://test", + "base": "file:///tmp/mock/path", + "href": "file://test/", + "protocol": "file:", + "username": "", + "password": "", + "host": "test", + "hostname": "test", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file://localhost", + "base": "file:///tmp/mock/path", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file://localhost/", + "base": "file:///tmp/mock/path", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file://localhost/test", + "base": "file:///tmp/mock/path", + "href": "file:///test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "", + "hash": "" + }, + { + "input": "test", + "base": "file:///tmp/mock/path", + "href": "file:///tmp/mock/test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/tmp/mock/test", + "search": "", + "hash": "" + }, + { + "input": "file:test", + "base": "file:///tmp/mock/path", + "href": "file:///tmp/mock/test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/tmp/mock/test", + "search": "", + "hash": "" + }, + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/path.js", + { + "input": "http://example.com/././foo", + "base": "about:blank", + "href": "http://example.com/foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/./.foo", + "base": "about:blank", + "href": "http://example.com/.foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/.foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/.", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/./", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar/..", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar/../", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/..bar", + "base": "about:blank", + "href": "http://example.com/foo/..bar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/..bar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar/../ton", + "base": "about:blank", + "href": "http://example.com/foo/ton", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/ton", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar/../ton/../../a", + "base": "about:blank", + "href": "http://example.com/a", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/a", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/../../..", + "base": "about:blank", + "href": "http://example.com/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/../../../ton", + "base": "about:blank", + "href": "http://example.com/ton", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/ton", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/%2e", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/%2e%2", + "base": "about:blank", + "href": "http://example.com/foo/%2e%2", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/%2e%2", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar", + "base": "about:blank", + "href": "http://example.com/%2e.bar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%2e.bar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com////../..", + "base": "about:blank", + "href": "http://example.com//", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "//", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar//../..", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar//..", + "base": "about:blank", + "href": "http://example.com/foo/bar/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/bar/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo", + "base": "about:blank", + "href": "http://example.com/foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/%20foo", + "base": "about:blank", + "href": "http://example.com/%20foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%20foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%", + "base": "about:blank", + "href": "http://example.com/foo%", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%2", + "base": "about:blank", + "href": "http://example.com/foo%2", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%2", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%2zbar", + "base": "about:blank", + "href": "http://example.com/foo%2zbar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%2zbar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%2©zbar", + "base": "about:blank", + "href": "http://example.com/foo%2%C3%82%C2%A9zbar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%2%C3%82%C2%A9zbar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%41%7a", + "base": "about:blank", + "href": "http://example.com/foo%41%7a", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%41%7a", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo\t\u0091%91", + "base": "about:blank", + "href": "http://example.com/foo%C2%91%91", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%C2%91%91", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%00%51", + "base": "about:blank", + "href": "http://example.com/foo%00%51", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%00%51", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/(%28:%3A%29)", + "base": "about:blank", + "href": "http://example.com/(%28:%3A%29)", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/(%28:%3A%29)", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/%3A%3a%3C%3c", + "base": "about:blank", + "href": "http://example.com/%3A%3a%3C%3c", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%3A%3a%3C%3c", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo\tbar", + "base": "about:blank", + "href": "http://example.com/foobar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foobar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com\\\\foo\\\\bar", + "base": "about:blank", + "href": "http://example.com//foo//bar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "//foo//bar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd", + "base": "about:blank", + "href": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%7Ffp3%3Eju%3Dduvgw%3Dd", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/@asdf%40", + "base": "about:blank", + "href": "http://example.com/@asdf%40", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/@asdf%40", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/你好你好", + "base": "about:blank", + "href": "http://example.com/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/‥/foo", + "base": "about:blank", + "href": "http://example.com/%E2%80%A5/foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%E2%80%A5/foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com//foo", + "base": "about:blank", + "href": "http://example.com/%EF%BB%BF/foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%EF%BB%BF/foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/‮/foo/‭/bar", + "base": "about:blank", + "href": "http://example.com/%E2%80%AE/foo/%E2%80%AD/bar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%E2%80%AE/foo/%E2%80%AD/bar", + "search": "", + "hash": "" + }, + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/relative.js", + { + "input": "http://www.google.com/foo?bar=baz#", + "base": "about:blank", + "href": "http://www.google.com/foo?bar=baz#", + "origin": "http://www.google.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.google.com", + "hostname": "www.google.com", + "port": "", + "pathname": "/foo", + "search": "?bar=baz", + "hash": "" + }, + { + "input": "http://www.google.com/foo?bar=baz# »", + "base": "about:blank", + "href": "http://www.google.com/foo?bar=baz# %C2%BB", + "origin": "http://www.google.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.google.com", + "hostname": "www.google.com", + "port": "", + "pathname": "/foo", + "search": "?bar=baz", + "hash": "# %C2%BB" + }, + { + "input": "data:test# »", + "base": "about:blank", + "href": "data:test# %C2%BB", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "test", + "search": "", + "hash": "# %C2%BB" + }, + { + "input": "http://www.google.com", + "base": "about:blank", + "href": "http://www.google.com/", + "origin": "http://www.google.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.google.com", + "hostname": "www.google.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://192.0x00A80001", + "base": "about:blank", + "href": "http://192.168.0.1/", + "origin": "http://192.168.0.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.0.1", + "hostname": "192.168.0.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://www/foo%2Ehtml", + "base": "about:blank", + "href": "http://www/foo%2Ehtml", + "origin": "http://www", + "protocol": "http:", + "username": "", + "password": "", + "host": "www", + "hostname": "www", + "port": "", + "pathname": "/foo%2Ehtml", + "search": "", + "hash": "" + }, + { + "input": "http://www/foo/%2E/html", + "base": "about:blank", + "href": "http://www/foo/html", + "origin": "http://www", + "protocol": "http:", + "username": "", + "password": "", + "host": "www", + "hostname": "www", + "port": "", + "pathname": "/foo/html", + "search": "", + "hash": "" + }, + { + "input": "http://user:pass@/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://%25DOMAIN:foobar@foodomain.com/", + "base": "about:blank", + "href": "http://%25DOMAIN:foobar@foodomain.com/", + "origin": "http://foodomain.com", + "protocol": "http:", + "username": "%25DOMAIN", + "password": "foobar", + "host": "foodomain.com", + "hostname": "foodomain.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:\\\\www.google.com\\foo", + "base": "about:blank", + "href": "http://www.google.com/foo", + "origin": "http://www.google.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.google.com", + "hostname": "www.google.com", + "port": "", + "pathname": "/foo", + "search": "", + "hash": "" + }, + { + "input": "http://foo:80/", + "base": "about:blank", + "href": "http://foo/", + "origin": "http://foo", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://foo:81/", + "base": "about:blank", + "href": "http://foo:81/", + "origin": "http://foo:81", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo:81", + "hostname": "foo", + "port": "81", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "httpa://foo:80/", + "base": "about:blank", + "href": "httpa://foo:80/", + "origin": "null", + "protocol": "httpa:", + "username": "", + "password": "", + "host": "foo:80", + "hostname": "foo", + "port": "80", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://foo:-80/", + "base": "about:blank", + "failure": true + }, + { + "input": "https://foo:443/", + "base": "about:blank", + "href": "https://foo/", + "origin": "https://foo", + "protocol": "https:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://foo:80/", + "base": "about:blank", + "href": "https://foo:80/", + "origin": "https://foo:80", + "protocol": "https:", + "username": "", + "password": "", + "host": "foo:80", + "hostname": "foo", + "port": "80", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ftp://foo:21/", + "base": "about:blank", + "href": "ftp://foo/", + "origin": "ftp://foo", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ftp://foo:80/", + "base": "about:blank", + "href": "ftp://foo:80/", + "origin": "ftp://foo:80", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "foo:80", + "hostname": "foo", + "port": "80", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "gopher://foo:70/", + "base": "about:blank", + "href": "gopher://foo/", + "origin": "gopher://foo", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "gopher://foo:443/", + "base": "about:blank", + "href": "gopher://foo:443/", + "origin": "gopher://foo:443", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "foo:443", + "hostname": "foo", + "port": "443", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws://foo:80/", + "base": "about:blank", + "href": "ws://foo/", + "origin": "ws://foo", + "protocol": "ws:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws://foo:81/", + "base": "about:blank", + "href": "ws://foo:81/", + "origin": "ws://foo:81", + "protocol": "ws:", + "username": "", + "password": "", + "host": "foo:81", + "hostname": "foo", + "port": "81", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws://foo:443/", + "base": "about:blank", + "href": "ws://foo:443/", + "origin": "ws://foo:443", + "protocol": "ws:", + "username": "", + "password": "", + "host": "foo:443", + "hostname": "foo", + "port": "443", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws://foo:815/", + "base": "about:blank", + "href": "ws://foo:815/", + "origin": "ws://foo:815", + "protocol": "ws:", + "username": "", + "password": "", + "host": "foo:815", + "hostname": "foo", + "port": "815", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss://foo:80/", + "base": "about:blank", + "href": "wss://foo:80/", + "origin": "wss://foo:80", + "protocol": "wss:", + "username": "", + "password": "", + "host": "foo:80", + "hostname": "foo", + "port": "80", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss://foo:81/", + "base": "about:blank", + "href": "wss://foo:81/", + "origin": "wss://foo:81", + "protocol": "wss:", + "username": "", + "password": "", + "host": "foo:81", + "hostname": "foo", + "port": "81", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss://foo:443/", + "base": "about:blank", + "href": "wss://foo/", + "origin": "wss://foo", + "protocol": "wss:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss://foo:815/", + "base": "about:blank", + "href": "wss://foo:815/", + "origin": "wss://foo:815", + "protocol": "wss:", + "username": "", + "password": "", + "host": "foo:815", + "hostname": "foo", + "port": "815", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/example.com/", + "base": "about:blank", + "href": "http://example.com/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ftp:/example.com/", + "base": "about:blank", + "href": "ftp://example.com/", + "origin": "ftp://example.com", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https:/example.com/", + "base": "about:blank", + "href": "https://example.com/", + "origin": "https://example.com", + "protocol": "https:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "madeupscheme:/example.com/", + "base": "about:blank", + "href": "madeupscheme:/example.com/", + "origin": "null", + "protocol": "madeupscheme:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "file:/example.com/", + "base": "about:blank", + "href": "file:///example.com/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "ftps:/example.com/", + "base": "about:blank", + "href": "ftps:/example.com/", + "origin": "null", + "protocol": "ftps:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "gopher:/example.com/", + "base": "about:blank", + "href": "gopher://example.com/", + "origin": "gopher://example.com", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws:/example.com/", + "base": "about:blank", + "href": "ws://example.com/", + "origin": "ws://example.com", + "protocol": "ws:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss:/example.com/", + "base": "about:blank", + "href": "wss://example.com/", + "origin": "wss://example.com", + "protocol": "wss:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "data:/example.com/", + "base": "about:blank", + "href": "data:/example.com/", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "javascript:/example.com/", + "base": "about:blank", + "href": "javascript:/example.com/", + "origin": "null", + "protocol": "javascript:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "mailto:/example.com/", + "base": "about:blank", + "href": "mailto:/example.com/", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "http:example.com/", + "base": "about:blank", + "href": "http://example.com/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ftp:example.com/", + "base": "about:blank", + "href": "ftp://example.com/", + "origin": "ftp://example.com", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https:example.com/", + "base": "about:blank", + "href": "https://example.com/", + "origin": "https://example.com", + "protocol": "https:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "madeupscheme:example.com/", + "base": "about:blank", + "href": "madeupscheme:example.com/", + "origin": "null", + "protocol": "madeupscheme:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "ftps:example.com/", + "base": "about:blank", + "href": "ftps:example.com/", + "origin": "null", + "protocol": "ftps:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "gopher:example.com/", + "base": "about:blank", + "href": "gopher://example.com/", + "origin": "gopher://example.com", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws:example.com/", + "base": "about:blank", + "href": "ws://example.com/", + "origin": "ws://example.com", + "protocol": "ws:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss:example.com/", + "base": "about:blank", + "href": "wss://example.com/", + "origin": "wss://example.com", + "protocol": "wss:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "data:example.com/", + "base": "about:blank", + "href": "data:example.com/", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "javascript:example.com/", + "base": "about:blank", + "href": "javascript:example.com/", + "origin": "null", + "protocol": "javascript:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "mailto:example.com/", + "base": "about:blank", + "href": "mailto:example.com/", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/segments-userinfo-vs-host.html", + { + "input": "http:@www.example.com", + "base": "about:blank", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/@www.example.com", + "base": "about:blank", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://@www.example.com", + "base": "about:blank", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:a:b@www.example.com", + "base": "about:blank", + "href": "http://a:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/a:b@www.example.com", + "base": "about:blank", + "href": "http://a:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://a:b@www.example.com", + "base": "about:blank", + "href": "http://a:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://@pple.com", + "base": "about:blank", + "href": "http://pple.com/", + "origin": "http://pple.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "pple.com", + "hostname": "pple.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http::b@www.example.com", + "base": "about:blank", + "href": "http://:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/:b@www.example.com", + "base": "about:blank", + "href": "http://:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://:b@www.example.com", + "base": "about:blank", + "href": "http://:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/:@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http://user@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:/@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http://@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "https:@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:a:b@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:/a:b@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http://a:b@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http::@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:a:@www.example.com", + "base": "about:blank", + "href": "http://a@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/a:@www.example.com", + "base": "about:blank", + "href": "http://a@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://a:@www.example.com", + "base": "about:blank", + "href": "http://a@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://www.@pple.com", + "base": "about:blank", + "href": "http://www.@pple.com/", + "origin": "http://pple.com", + "protocol": "http:", + "username": "www.", + "password": "", + "host": "pple.com", + "hostname": "pple.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:@:www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:/@:www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http://@:www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http://:@www.example.com", + "base": "about:blank", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# Others", + { + "input": "/", + "base": "http://www.example.com/test", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "/test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/test.txt", + "search": "", + "hash": "" + }, + { + "input": ".", + "base": "http://www.example.com/test", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "http://www.example.com/test", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/test.txt", + "search": "", + "hash": "" + }, + { + "input": "./test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/test.txt", + "search": "", + "hash": "" + }, + { + "input": "../test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/test.txt", + "search": "", + "hash": "" + }, + { + "input": "../aaa/test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/aaa/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/aaa/test.txt", + "search": "", + "hash": "" + }, + { + "input": "../../test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/test.txt", + "search": "", + "hash": "" + }, + { + "input": "中/test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/%E4%B8%AD/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/%E4%B8%AD/test.txt", + "search": "", + "hash": "" + }, + { + "input": "http://www.example2.com", + "base": "http://www.example.com/test", + "href": "http://www.example2.com/", + "origin": "http://www.example2.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example2.com", + "hostname": "www.example2.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "//www.example2.com", + "base": "http://www.example.com/test", + "href": "http://www.example2.com/", + "origin": "http://www.example2.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example2.com", + "hostname": "www.example2.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:...", + "base": "http://www.example.com/test", + "href": "file:///...", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/...", + "search": "", + "hash": "" + }, + { + "input": "file:..", + "base": "http://www.example.com/test", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:a", + "base": "http://www.example.com/test", + "href": "file:///a", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/a", + "search": "", + "hash": "" + }, + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/host.html", + "Basic canonicalization, uppercase should be converted to lowercase", + { + "input": "http://ExAmPlE.CoM", + "base": "http://other.com/", + "href": "http://example.com/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://example example.com", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://Goo%20 goo%7C|.com", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[]", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[:]", + "base": "http://other.com/", + "failure": true + }, + "U+3000 is mapped to U+0020 (space) which is disallowed", + { + "input": "http://GOO\u00a0\u3000goo.com", + "base": "http://other.com/", + "failure": true + }, + "Other types of space (no-break, zero-width, zero-width-no-break) are name-prepped away to nothing. U+200B, U+2060, and U+FEFF, are ignored", + { + "input": "http://GOO\u200b\u2060\ufeffgoo.com", + "base": "http://other.com/", + "href": "http://googoo.com/", + "origin": "http://googoo.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "googoo.com", + "hostname": "googoo.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Leading and trailing C0 control or space", + { + "input": "\u0000\u001b\u0004\u0012 http://example.com/\u001f \u000d ", + "base": "about:blank", + "href": "http://example.com/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Ideographic full stop (full-width period for Chinese, etc.) should be treated as a dot. U+3002 is mapped to U+002E (dot)", + { + "input": "http://www.foo。bar.com", + "base": "http://other.com/", + "href": "http://www.foo.bar.com/", + "origin": "http://www.foo.bar.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.foo.bar.com", + "hostname": "www.foo.bar.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Invalid unicode characters should fail... U+FDD0 is disallowed; %ef%b7%90 is U+FDD0", + { + "input": "http://\ufdd0zyx.com", + "base": "http://other.com/", + "failure": true + }, + "This is the same as previous but escaped", + { + "input": "http://%ef%b7%90zyx.com", + "base": "http://other.com/", + "failure": true + }, + "U+FFFD", + { + "input": "https://\ufffd", + "base": "about:blank", + "failure": true + }, + { + "input": "https://%EF%BF%BD", + "base": "about:blank", + "failure": true + }, + { + "input": "https://x/\ufffd?\ufffd#\ufffd", + "base": "about:blank", + "href": "https://x/%EF%BF%BD?%EF%BF%BD#%EF%BF%BD", + "origin": "https://x", + "protocol": "https:", + "username": "", + "password": "", + "host": "x", + "hostname": "x", + "port": "", + "pathname": "/%EF%BF%BD", + "search": "?%EF%BF%BD", + "hash": "#%EF%BF%BD" + }, + "Test name prepping, fullwidth input should be converted to ASCII and NOT IDN-ized. This is 'Go' in fullwidth UTF-8/UTF-16.", + { + "input": "http://Go.com", + "base": "http://other.com/", + "href": "http://go.com/", + "origin": "http://go.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "go.com", + "hostname": "go.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "URL spec forbids the following. https://www.w3.org/Bugs/Public/show_bug.cgi?id=24257", + { + "input": "http://%41.com", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://%ef%bc%85%ef%bc%94%ef%bc%91.com", + "base": "http://other.com/", + "failure": true + }, + "...%00 in fullwidth should fail (also as escaped UTF-8 input)", + { + "input": "http://%00.com", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://%ef%bc%85%ef%bc%90%ef%bc%90.com", + "base": "http://other.com/", + "failure": true + }, + "Basic IDN support, UTF-8 and UTF-16 input should be converted to IDN", + { + "input": "http://你好你好", + "base": "http://other.com/", + "href": "http://xn--6qqa088eba/", + "origin": "http://xn--6qqa088eba", + "protocol": "http:", + "username": "", + "password": "", + "host": "xn--6qqa088eba", + "hostname": "xn--6qqa088eba", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://faß.ExAmPlE/", + "base": "about:blank", + "href": "https://xn--fa-hia.example/", + "origin": "https://xn--fa-hia.example", + "protocol": "https:", + "username": "", + "password": "", + "host": "xn--fa-hia.example", + "hostname": "xn--fa-hia.example", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "sc://faß.ExAmPlE/", + "base": "about:blank", + "href": "sc://fa%C3%9F.ExAmPlE/", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "fa%C3%9F.ExAmPlE", + "hostname": "fa%C3%9F.ExAmPlE", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Invalid escaped characters should fail and the percents should be escaped. https://www.w3.org/Bugs/Public/show_bug.cgi?id=24191", + { + "input": "http://%zz%66%a.com", + "base": "http://other.com/", + "failure": true + }, + "If we get an invalid character that has been escaped.", + { + "input": "http://%25", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://hello%00", + "base": "http://other.com/", + "failure": true + }, + "Escaped numbers should be treated like IP addresses if they are.", + { + "input": "http://%30%78%63%30%2e%30%32%35%30.01", + "base": "http://other.com/", + "href": "http://192.168.0.1/", + "origin": "http://192.168.0.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.0.1", + "hostname": "192.168.0.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://%30%78%63%30%2e%30%32%35%30.01%2e", + "base": "http://other.com/", + "href": "http://192.168.0.1/", + "origin": "http://192.168.0.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.0.1", + "hostname": "192.168.0.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://192.168.0.257", + "base": "http://other.com/", + "failure": true + }, + "Invalid escaping in hosts causes failure", + { + "input": "http://%3g%78%63%30%2e%30%32%35%30%2E.01", + "base": "http://other.com/", + "failure": true + }, + "A space in a host causes failure", + { + "input": "http://192.168.0.1 hello", + "base": "http://other.com/", + "failure": true + }, + { + "input": "https://x x:12", + "base": "about:blank", + "failure": true + }, + "Fullwidth and escaped UTF-8 fullwidth should still be treated as IP", + { + "input": "http://0Xc0.0250.01", + "base": "http://other.com/", + "href": "http://192.168.0.1/", + "origin": "http://192.168.0.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.0.1", + "hostname": "192.168.0.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Domains with empty labels", + { + "input": "http://./", + "base": "about:blank", + "href": "http://./", + "origin": "http://.", + "protocol": "http:", + "username": "", + "password": "", + "host": ".", + "hostname": ".", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://../", + "base": "about:blank", + "href": "http://../", + "origin": "http://..", + "protocol": "http:", + "username": "", + "password": "", + "host": "..", + "hostname": "..", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://0..0x300/", + "base": "about:blank", + "href": "http://0..0x300/", + "origin": "http://0..0x300", + "protocol": "http:", + "username": "", + "password": "", + "host": "0..0x300", + "hostname": "0..0x300", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Broken IPv6", + { + "input": "http://[www.google.com]/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://[google.com]", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[::1.2.3.4x]", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[::1.2.3.]", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[::1.2.]", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[::1.]", + "base": "http://other.com/", + "failure": true + }, + "Misc Unicode", + { + "input": "http://foo:💩@example.com/bar", + "base": "http://other.com/", + "href": "http://foo:%F0%9F%92%A9@example.com/bar", + "origin": "http://example.com", + "protocol": "http:", + "username": "foo", + "password": "%F0%9F%92%A9", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/bar", + "search": "", + "hash": "" + }, + "# resolving a fragment against any scheme succeeds", + { + "input": "#", + "base": "test:test", + "href": "test:test#", + "origin": "null", + "protocol": "test:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "test", + "search": "", + "hash": "" + }, + { + "input": "#x", + "base": "mailto:x@x.com", + "href": "mailto:x@x.com#x", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "x@x.com", + "search": "", + "hash": "#x" + }, + { + "input": "#x", + "base": "data:,", + "href": "data:,#x", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": ",", + "search": "", + "hash": "#x" + }, + { + "input": "#x", + "base": "about:blank", + "href": "about:blank#x", + "origin": "null", + "protocol": "about:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "blank", + "search": "", + "hash": "#x" + }, + { + "input": "#", + "base": "test:test?test", + "href": "test:test?test#", + "origin": "null", + "protocol": "test:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "test", + "search": "?test", + "hash": "" + }, + "# multiple @ in authority state", + { + "input": "https://@test@test@example:800/", + "base": "http://doesnotmatter/", + "href": "https://%40test%40test@example:800/", + "origin": "https://example:800", + "protocol": "https:", + "username": "%40test%40test", + "password": "", + "host": "example:800", + "hostname": "example", + "port": "800", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://@@@example", + "base": "http://doesnotmatter/", + "href": "https://%40%40@example/", + "origin": "https://example", + "protocol": "https:", + "username": "%40%40", + "password": "", + "host": "example", + "hostname": "example", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "non-az-09 characters", + { + "input": "http://`{}:`{}@h/`{}?`{}", + "base": "http://doesnotmatter/", + "href": "http://%60%7B%7D:%60%7B%7D@h/%60%7B%7D?`{}", + "origin": "http://h", + "protocol": "http:", + "username": "%60%7B%7D", + "password": "%60%7B%7D", + "host": "h", + "hostname": "h", + "port": "", + "pathname": "/%60%7B%7D", + "search": "?`{}", + "hash": "" + }, + "# Credentials in base", + { + "input": "/some/path", + "base": "http://user@example.org/smth", + "href": "http://user@example.org/some/path", + "origin": "http://example.org", + "protocol": "http:", + "username": "user", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/some/path", + "search": "", + "hash": "" + }, + { + "input": "", + "base": "http://user:pass@example.org:21/smth", + "href": "http://user:pass@example.org:21/smth", + "origin": "http://example.org:21", + "protocol": "http:", + "username": "user", + "password": "pass", + "host": "example.org:21", + "hostname": "example.org", + "port": "21", + "pathname": "/smth", + "search": "", + "hash": "" + }, + { + "input": "/some/path", + "base": "http://user:pass@example.org:21/smth", + "href": "http://user:pass@example.org:21/some/path", + "origin": "http://example.org:21", + "protocol": "http:", + "username": "user", + "password": "pass", + "host": "example.org:21", + "hostname": "example.org", + "port": "21", + "pathname": "/some/path", + "search": "", + "hash": "" + }, + "# a set of tests designed by zcorpan for relative URLs with unknown schemes", + { + "input": "i", + "base": "sc:sd", + "failure": true + }, + { + "input": "i", + "base": "sc:sd/sd", + "failure": true + }, + { + "input": "i", + "base": "sc:/pa/pa", + "href": "sc:/pa/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/i", + "search": "", + "hash": "" + }, + { + "input": "i", + "base": "sc://ho/pa", + "href": "sc://ho/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "ho", + "hostname": "ho", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "i", + "base": "sc:///pa/pa", + "href": "sc:///pa/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/i", + "search": "", + "hash": "" + }, + { + "input": "../i", + "base": "sc:sd", + "failure": true + }, + { + "input": "../i", + "base": "sc:sd/sd", + "failure": true + }, + { + "input": "../i", + "base": "sc:/pa/pa", + "href": "sc:/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "../i", + "base": "sc://ho/pa", + "href": "sc://ho/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "ho", + "hostname": "ho", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "../i", + "base": "sc:///pa/pa", + "href": "sc:///i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "/i", + "base": "sc:sd", + "failure": true + }, + { + "input": "/i", + "base": "sc:sd/sd", + "failure": true + }, + { + "input": "/i", + "base": "sc:/pa/pa", + "href": "sc:/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "/i", + "base": "sc://ho/pa", + "href": "sc://ho/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "ho", + "hostname": "ho", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "/i", + "base": "sc:///pa/pa", + "href": "sc:///i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "?i", + "base": "sc:sd", + "failure": true + }, + { + "input": "?i", + "base": "sc:sd/sd", + "failure": true + }, + { + "input": "?i", + "base": "sc:/pa/pa", + "href": "sc:/pa/pa?i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/pa", + "search": "?i", + "hash": "" + }, + { + "input": "?i", + "base": "sc://ho/pa", + "href": "sc://ho/pa?i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "ho", + "hostname": "ho", + "port": "", + "pathname": "/pa", + "search": "?i", + "hash": "" + }, + { + "input": "?i", + "base": "sc:///pa/pa", + "href": "sc:///pa/pa?i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/pa", + "search": "?i", + "hash": "" + }, + { + "input": "#i", + "base": "sc:sd", + "href": "sc:sd#i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "sd", + "search": "", + "hash": "#i" + }, + { + "input": "#i", + "base": "sc:sd/sd", + "href": "sc:sd/sd#i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "sd/sd", + "search": "", + "hash": "#i" + }, + { + "input": "#i", + "base": "sc:/pa/pa", + "href": "sc:/pa/pa#i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/pa", + "search": "", + "hash": "#i" + }, + { + "input": "#i", + "base": "sc://ho/pa", + "href": "sc://ho/pa#i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "ho", + "hostname": "ho", + "port": "", + "pathname": "/pa", + "search": "", + "hash": "#i" + }, + { + "input": "#i", + "base": "sc:///pa/pa", + "href": "sc:///pa/pa#i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/pa", + "search": "", + "hash": "#i" + }, + "# make sure that relative URL logic works on known typically non-relative schemes too", + { + "input": "about:/../", + "base": "about:blank", + "href": "about:/", + "origin": "null", + "protocol": "about:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "data:/../", + "base": "about:blank", + "href": "data:/", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "javascript:/../", + "base": "about:blank", + "href": "javascript:/", + "origin": "null", + "protocol": "javascript:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "mailto:/../", + "base": "about:blank", + "href": "mailto:/", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# unknown schemes and their hosts", + { + "input": "sc://ñ.test/", + "base": "about:blank", + "href": "sc://%C3%B1.test/", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1.test", + "hostname": "%C3%B1.test", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "sc://\u001F!\"$&'()*+,-.;<=>^_`{|}~/", + "base": "about:blank", + "href": "sc://%1F!\"$&'()*+,-.;<=>^_`{|}~/", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%1F!\"$&'()*+,-.;<=>^_`{|}~", + "hostname": "%1F!\"$&'()*+,-.;<=>^_`{|}~", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "sc://\u0000/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc:// /", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://%/", + "base": "about:blank", + "href": "sc://%/", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%", + "hostname": "%", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "sc://@/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://te@s:t@/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://:/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://:12/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://[/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://\\/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://]/", + "base": "about:blank", + "failure": true + }, + { + "input": "x", + "base": "sc://ñ", + "href": "sc://%C3%B1/x", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "/x", + "search": "", + "hash": "" + }, + "# unknown schemes and backslashes", + { + "input": "sc:\\../", + "base": "about:blank", + "href": "sc:\\../", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "\\../", + "search": "", + "hash": "" + }, + "# unknown scheme with path looking like a password", + { + "input": "sc::a@example.net", + "base": "about:blank", + "href": "sc::a@example.net", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": ":a@example.net", + "search": "", + "hash": "" + }, + "# unknown scheme with bogus percent-encoding", + { + "input": "wow:%NBD", + "base": "about:blank", + "href": "wow:%NBD", + "origin": "null", + "protocol": "wow:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "%NBD", + "search": "", + "hash": "" + }, + { + "input": "wow:%1G", + "base": "about:blank", + "href": "wow:%1G", + "origin": "null", + "protocol": "wow:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "%1G", + "search": "", + "hash": "" + }, + "# Hosts and percent-encoding", + { + "input": "ftp://example.com%80/", + "base": "about:blank", + "failure": true + }, + { + "input": "ftp://example.com%A0/", + "base": "about:blank", + "failure": true + }, + { + "input": "https://example.com%80/", + "base": "about:blank", + "failure": true + }, + { + "input": "https://example.com%A0/", + "base": "about:blank", + "failure": true + }, + { + "input": "ftp://%e2%98%83", + "base": "about:blank", + "href": "ftp://xn--n3h/", + "origin": "ftp://xn--n3h", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "xn--n3h", + "hostname": "xn--n3h", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://%e2%98%83", + "base": "about:blank", + "href": "https://xn--n3h/", + "origin": "https://xn--n3h", + "protocol": "https:", + "username": "", + "password": "", + "host": "xn--n3h", + "hostname": "xn--n3h", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# tests from jsdom/whatwg-url designed for code coverage", + { + "input": "http://127.0.0.1:10100/relative_import.html", + "base": "about:blank", + "href": "http://127.0.0.1:10100/relative_import.html", + "origin": "http://127.0.0.1:10100", + "protocol": "http:", + "username": "", + "password": "", + "host": "127.0.0.1:10100", + "hostname": "127.0.0.1", + "port": "10100", + "pathname": "/relative_import.html", + "search": "", + "hash": "" + }, + { + "input": "http://facebook.com/?foo=%7B%22abc%22", + "base": "about:blank", + "href": "http://facebook.com/?foo=%7B%22abc%22", + "origin": "http://facebook.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "facebook.com", + "hostname": "facebook.com", + "port": "", + "pathname": "/", + "search": "?foo=%7B%22abc%22", + "hash": "" + }, + { + "input": "https://localhost:3000/jqueryui@1.2.3", + "base": "about:blank", + "href": "https://localhost:3000/jqueryui@1.2.3", + "origin": "https://localhost:3000", + "protocol": "https:", + "username": "", + "password": "", + "host": "localhost:3000", + "hostname": "localhost", + "port": "3000", + "pathname": "/jqueryui@1.2.3", + "search": "", + "hash": "" + }, + "# tab/LF/CR", + { + "input": "h\tt\nt\rp://h\to\ns\rt:9\t0\n0\r0/p\ta\nt\rh?q\tu\ne\rry#f\tr\na\rg", + "base": "about:blank", + "href": "http://host:9000/path?query#frag", + "origin": "http://host:9000", + "protocol": "http:", + "username": "", + "password": "", + "host": "host:9000", + "hostname": "host", + "port": "9000", + "pathname": "/path", + "search": "?query", + "hash": "#frag" + }, + "# Stringification of URL.searchParams", + { + "input": "?a=b&c=d", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar?a=b&c=d", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "?a=b&c=d", + "searchParams": "a=b&c=d", + "hash": "" + }, + { + "input": "??a=b&c=d", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar??a=b&c=d", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "??a=b&c=d", + "searchParams": "%3Fa=b&c=d", + "hash": "" + }, + "# Scheme only", + { + "input": "http:", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "searchParams": "", + "hash": "" + }, + { + "input": "http:", + "base": "https://example.org/foo/bar", + "failure": true + }, + { + "input": "sc:", + "base": "https://example.org/foo/bar", + "href": "sc:", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "", + "search": "", + "searchParams": "", + "hash": "" + }, + "# Percent encoding of fragments", + { + "input": "http://foo.bar/baz?qux#foo\bbar", + "base": "about:blank", + "href": "http://foo.bar/baz?qux#foo%08bar", + "origin": "http://foo.bar", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo.bar", + "hostname": "foo.bar", + "port": "", + "pathname": "/baz", + "search": "?qux", + "searchParams": "qux=", + "hash": "#foo%08bar" + }, + "# IPv4 parsing (via https://github.com/nodejs/node/pull/10317)", + { + "input": "http://192.168.257", + "base": "http://other.com/", + "href": "http://192.168.1.1/", + "origin": "http://192.168.1.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.1.1", + "hostname": "192.168.1.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://192.168.257.com", + "base": "http://other.com/", + "href": "http://192.168.257.com/", + "origin": "http://192.168.257.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.257.com", + "hostname": "192.168.257.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://256", + "base": "http://other.com/", + "href": "http://0.0.1.0/", + "origin": "http://0.0.1.0", + "protocol": "http:", + "username": "", + "password": "", + "host": "0.0.1.0", + "hostname": "0.0.1.0", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://256.com", + "base": "http://other.com/", + "href": "http://256.com/", + "origin": "http://256.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "256.com", + "hostname": "256.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://999999999", + "base": "http://other.com/", + "href": "http://59.154.201.255/", + "origin": "http://59.154.201.255", + "protocol": "http:", + "username": "", + "password": "", + "host": "59.154.201.255", + "hostname": "59.154.201.255", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://999999999.com", + "base": "http://other.com/", + "href": "http://999999999.com/", + "origin": "http://999999999.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "999999999.com", + "hostname": "999999999.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://10000000000", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://10000000000.com", + "base": "http://other.com/", + "href": "http://10000000000.com/", + "origin": "http://10000000000.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "10000000000.com", + "hostname": "10000000000.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://4294967295", + "base": "http://other.com/", + "href": "http://255.255.255.255/", + "origin": "http://255.255.255.255", + "protocol": "http:", + "username": "", + "password": "", + "host": "255.255.255.255", + "hostname": "255.255.255.255", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://4294967296", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://0xffffffff", + "base": "http://other.com/", + "href": "http://255.255.255.255/", + "origin": "http://255.255.255.255", + "protocol": "http:", + "username": "", + "password": "", + "host": "255.255.255.255", + "hostname": "255.255.255.255", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://0xffffffff1", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://256.256.256.256", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://256.256.256.256.256", + "base": "http://other.com/", + "href": "http://256.256.256.256.256/", + "origin": "http://256.256.256.256.256", + "protocol": "http:", + "username": "", + "password": "", + "host": "256.256.256.256.256", + "hostname": "256.256.256.256.256", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://0x.0x.0", + "base": "about:blank", + "href": "https://0.0.0.0/", + "origin": "https://0.0.0.0", + "protocol": "https:", + "username": "", + "password": "", + "host": "0.0.0.0", + "hostname": "0.0.0.0", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "More IPv4 parsing (via https://github.com/jsdom/whatwg-url/issues/92)", + { + "input": "https://0x100000000/test", + "base": "about:blank", + "failure": true + }, + { + "input": "https://256.0.0.1/test", + "base": "about:blank", + "failure": true + }, + "# file URLs containing percent-encoded Windows drive letters (shouldn't work)", + { + "input": "file:///C%3A/", + "base": "about:blank", + "href": "file:///C%3A/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C%3A/", + "search": "", + "hash": "" + }, + { + "input": "file:///C%7C/", + "base": "about:blank", + "href": "file:///C%7C/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C%7C/", + "search": "", + "hash": "" + }, + "# file URLs relative to other file URLs (via https://github.com/jsdom/whatwg-url/pull/60)", + { + "input": "pix/submit.gif", + "base": "file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html", + "href": "file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/pix/submit.gif", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/pix/submit.gif", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "file:///C:/", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "file:///", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# More file URL tests by zcorpan and annevk", + { + "input": "/", + "base": "file:///C:/a/b", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "//d:", + "base": "file:///C:/a/b", + "href": "file:///d:", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/d:", + "search": "", + "hash": "" + }, + { + "input": "//d:/..", + "base": "file:///C:/a/b", + "href": "file:///d:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/d:/", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "file:///ab:/", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "file:///1:/", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "", + "base": "file:///test?test#test", + "href": "file:///test?test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?test", + "hash": "" + }, + { + "input": "file:", + "base": "file:///test?test#test", + "href": "file:///test?test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?test", + "hash": "" + }, + { + "input": "?x", + "base": "file:///test?test#test", + "href": "file:///test?x", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?x", + "hash": "" + }, + { + "input": "file:?x", + "base": "file:///test?test#test", + "href": "file:///test?x", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?x", + "hash": "" + }, + { + "input": "#x", + "base": "file:///test?test#test", + "href": "file:///test?test#x", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?test", + "hash": "#x" + }, + { + "input": "file:#x", + "base": "file:///test?test#test", + "href": "file:///test?test#x", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?test", + "hash": "#x" + }, + "# File URLs and many (back)slashes", + { + "input": "file:\\\\//", + "base": "about:blank", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:\\\\\\\\", + "base": "about:blank", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:\\\\\\\\?fox", + "base": "about:blank", + "href": "file:///?fox", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "?fox", + "hash": "" + }, + { + "input": "file:\\\\\\\\#guppy", + "base": "about:blank", + "href": "file:///#guppy", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "#guppy" + }, + { + "input": "file://spider///", + "base": "about:blank", + "href": "file://spider/", + "protocol": "file:", + "username": "", + "password": "", + "host": "spider", + "hostname": "spider", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:\\\\localhost//", + "base": "about:blank", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:///localhost//cat", + "base": "about:blank", + "href": "file:///localhost//cat", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/localhost//cat", + "search": "", + "hash": "" + }, + { + "input": "file://\\/localhost//cat", + "base": "about:blank", + "href": "file:///localhost//cat", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/localhost//cat", + "search": "", + "hash": "" + }, + { + "input": "file://localhost//a//../..//", + "base": "about:blank", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "/////mouse", + "base": "file:///elephant", + "href": "file:///mouse", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/mouse", + "search": "", + "hash": "" + }, + { + "input": "\\//pig", + "base": "file://lion/", + "href": "file:///pig", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pig", + "search": "", + "hash": "" + }, + { + "input": "\\/localhost//pig", + "base": "file://lion/", + "href": "file:///pig", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pig", + "search": "", + "hash": "" + }, + { + "input": "//localhost//pig", + "base": "file://lion/", + "href": "file:///pig", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pig", + "search": "", + "hash": "" + }, + { + "input": "/..//localhost//pig", + "base": "file://lion/", + "href": "file://lion/localhost//pig", + "protocol": "file:", + "username": "", + "password": "", + "host": "lion", + "hostname": "lion", + "port": "", + "pathname": "/localhost//pig", + "search": "", + "hash": "" + }, + { + "input": "file://", + "base": "file://ape/", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# File URLs with non-empty hosts", + { + "input": "/rooibos", + "base": "file://tea/", + "href": "file://tea/rooibos", + "protocol": "file:", + "username": "", + "password": "", + "host": "tea", + "hostname": "tea", + "port": "", + "pathname": "/rooibos", + "search": "", + "hash": "" + }, + { + "input": "/?chai", + "base": "file://tea/", + "href": "file://tea/?chai", + "protocol": "file:", + "username": "", + "password": "", + "host": "tea", + "hostname": "tea", + "port": "", + "pathname": "/", + "search": "?chai", + "hash": "" + }, + "# Windows drive letter handling with the 'file:' base URL", + { + "input": "C|", + "base": "file://host/dir/file", + "href": "file:///C:", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:", + "search": "", + "hash": "" + }, + { + "input": "C|#", + "base": "file://host/dir/file", + "href": "file:///C:#", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:", + "search": "", + "hash": "" + }, + { + "input": "C|?", + "base": "file://host/dir/file", + "href": "file:///C:?", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:", + "search": "", + "hash": "" + }, + { + "input": "C|/", + "base": "file://host/dir/file", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "C|\n/", + "base": "file://host/dir/file", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "C|\\", + "base": "file://host/dir/file", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "C", + "base": "file://host/dir/file", + "href": "file://host/dir/C", + "protocol": "file:", + "username": "", + "password": "", + "host": "host", + "hostname": "host", + "port": "", + "pathname": "/dir/C", + "search": "", + "hash": "" + }, + { + "input": "C|a", + "base": "file://host/dir/file", + "href": "file://host/dir/C|a", + "protocol": "file:", + "username": "", + "password": "", + "host": "host", + "hostname": "host", + "port": "", + "pathname": "/dir/C|a", + "search": "", + "hash": "" + }, + "# Windows drive letter quirk in the file slash state", + { + "input": "/c:/foo/bar", + "base": "file:///c:/baz/qux", + "href": "file:///c:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "/c|/foo/bar", + "base": "file:///c:/baz/qux", + "href": "file:///c:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "file:\\c:\\foo\\bar", + "base": "file:///c:/baz/qux", + "href": "file:///c:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "/c:/foo/bar", + "base": "file://host/path", + "href": "file:///c:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:/foo/bar", + "search": "", + "hash": "" + }, + "# Windows drive letter quirk with not empty host", + { + "input": "file://example.net/C:/", + "base": "about:blank", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "file://1.2.3.4/C:/", + "base": "about:blank", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "file://[1::8]/C:/", + "base": "about:blank", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + "# Windows drive letter quirk (no host)", + { + "input": "file:/C|/", + "base": "about:blank", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "file://C|/", + "base": "about:blank", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + "# file URLs without base URL by Rimas Misevičius", + { + "input": "file:", + "base": "about:blank", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:?q=v", + "base": "about:blank", + "href": "file:///?q=v", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "?q=v", + "hash": "" + }, + { + "input": "file:#frag", + "base": "about:blank", + "href": "file:///#frag", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "#frag" + }, + "# IPv6 tests", + { + "input": "http://[1:0::]", + "base": "http://example.net/", + "href": "http://[1::]/", + "origin": "http://[1::]", + "protocol": "http:", + "username": "", + "password": "", + "host": "[1::]", + "hostname": "[1::]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://[0:1:2:3:4:5:6:7:8]", + "base": "http://example.net/", + "failure": true + }, + { + "input": "https://[0::0::0]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:.0]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:0:]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:1:2:3:4:5:6:7.0.0.0.1]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:1.00.0.0.0]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:1.290.0.0.0]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:1.23.23]", + "base": "about:blank", + "failure": true + }, + "# Empty host", + { + "input": "http://?", + "base": "about:blank", + "failure": true + }, + { + "input": "http://#", + "base": "about:blank", + "failure": true + }, + "Port overflow (2^32 + 81)", + { + "input": "http://f:4294967377/c", + "base": "http://example.org/", + "failure": true + }, + "Port overflow (2^64 + 81)", + { + "input": "http://f:18446744073709551697/c", + "base": "http://example.org/", + "failure": true + }, + "Port overflow (2^128 + 81)", + { + "input": "http://f:340282366920938463463374607431768211537/c", + "base": "http://example.org/", + "failure": true + }, + "# Non-special-URL path tests", + { + "input": "sc://ñ", + "base": "about:blank", + "href": "sc://%C3%B1", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "", + "search": "", + "hash": "" + }, + { + "input": "sc://ñ?x", + "base": "about:blank", + "href": "sc://%C3%B1?x", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "", + "search": "?x", + "hash": "" + }, + { + "input": "sc://ñ#x", + "base": "about:blank", + "href": "sc://%C3%B1#x", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "", + "search": "", + "hash": "#x" + }, + { + "input": "#x", + "base": "sc://ñ", + "href": "sc://%C3%B1#x", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "", + "search": "", + "hash": "#x" + }, + { + "input": "?x", + "base": "sc://ñ", + "href": "sc://%C3%B1?x", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "", + "search": "?x", + "hash": "" + }, + { + "input": "sc://?", + "base": "about:blank", + "href": "sc://?", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "", + "search": "", + "hash": "" + }, + { + "input": "sc://#", + "base": "about:blank", + "href": "sc://#", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "", + "search": "", + "hash": "" + }, + { + "input": "///", + "base": "sc://x/", + "href": "sc:///", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "////", + "base": "sc://x/", + "href": "sc:////", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "//", + "search": "", + "hash": "" + }, + { + "input": "////x/", + "base": "sc://x/", + "href": "sc:////x/", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "//x/", + "search": "", + "hash": "" + }, + { + "input": "tftp://foobar.com/someconfig;mode=netascii", + "base": "about:blank", + "href": "tftp://foobar.com/someconfig;mode=netascii", + "origin": "null", + "protocol": "tftp:", + "username": "", + "password": "", + "host": "foobar.com", + "hostname": "foobar.com", + "port": "", + "pathname": "/someconfig;mode=netascii", + "search": "", + "hash": "" + }, + { + "input": "telnet://user:pass@foobar.com:23/", + "base": "about:blank", + "href": "telnet://user:pass@foobar.com:23/", + "origin": "null", + "protocol": "telnet:", + "username": "user", + "password": "pass", + "host": "foobar.com:23", + "hostname": "foobar.com", + "port": "23", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ut2004://10.10.10.10:7777/Index.ut2", + "base": "about:blank", + "href": "ut2004://10.10.10.10:7777/Index.ut2", + "origin": "null", + "protocol": "ut2004:", + "username": "", + "password": "", + "host": "10.10.10.10:7777", + "hostname": "10.10.10.10", + "port": "7777", + "pathname": "/Index.ut2", + "search": "", + "hash": "" + }, + { + "input": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz", + "base": "about:blank", + "href": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz", + "origin": "null", + "protocol": "redis:", + "username": "foo", + "password": "bar", + "host": "somehost:6379", + "hostname": "somehost", + "port": "6379", + "pathname": "/0", + "search": "?baz=bam&qux=baz", + "hash": "" + }, + { + "input": "rsync://foo@host:911/sup", + "base": "about:blank", + "href": "rsync://foo@host:911/sup", + "origin": "null", + "protocol": "rsync:", + "username": "foo", + "password": "", + "host": "host:911", + "hostname": "host", + "port": "911", + "pathname": "/sup", + "search": "", + "hash": "" + }, + { + "input": "git://github.com/foo/bar.git", + "base": "about:blank", + "href": "git://github.com/foo/bar.git", + "origin": "null", + "protocol": "git:", + "username": "", + "password": "", + "host": "github.com", + "hostname": "github.com", + "port": "", + "pathname": "/foo/bar.git", + "search": "", + "hash": "" + }, + { + "input": "irc://myserver.com:6999/channel?passwd", + "base": "about:blank", + "href": "irc://myserver.com:6999/channel?passwd", + "origin": "null", + "protocol": "irc:", + "username": "", + "password": "", + "host": "myserver.com:6999", + "hostname": "myserver.com", + "port": "6999", + "pathname": "/channel", + "search": "?passwd", + "hash": "" + }, + { + "input": "dns://fw.example.org:9999/foo.bar.org?type=TXT", + "base": "about:blank", + "href": "dns://fw.example.org:9999/foo.bar.org?type=TXT", + "origin": "null", + "protocol": "dns:", + "username": "", + "password": "", + "host": "fw.example.org:9999", + "hostname": "fw.example.org", + "port": "9999", + "pathname": "/foo.bar.org", + "search": "?type=TXT", + "hash": "" + }, + { + "input": "ldap://localhost:389/ou=People,o=JNDITutorial", + "base": "about:blank", + "href": "ldap://localhost:389/ou=People,o=JNDITutorial", + "origin": "null", + "protocol": "ldap:", + "username": "", + "password": "", + "host": "localhost:389", + "hostname": "localhost", + "port": "389", + "pathname": "/ou=People,o=JNDITutorial", + "search": "", + "hash": "" + }, + { + "input": "git+https://github.com/foo/bar", + "base": "about:blank", + "href": "git+https://github.com/foo/bar", + "origin": "null", + "protocol": "git+https:", + "username": "", + "password": "", + "host": "github.com", + "hostname": "github.com", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "urn:ietf:rfc:2648", + "base": "about:blank", + "href": "urn:ietf:rfc:2648", + "origin": "null", + "protocol": "urn:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "ietf:rfc:2648", + "search": "", + "hash": "" + }, + { + "input": "tag:joe@example.org,2001:foo/bar", + "base": "about:blank", + "href": "tag:joe@example.org,2001:foo/bar", + "origin": "null", + "protocol": "tag:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "joe@example.org,2001:foo/bar", + "search": "", + "hash": "" + }, + "# percent encoded hosts in non-special-URLs", + { + "input": "non-special://%E2%80%A0/", + "base": "about:blank", + "href": "non-special://%E2%80%A0/", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "%E2%80%A0", + "hostname": "%E2%80%A0", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "non-special://H%4fSt/path", + "base": "about:blank", + "href": "non-special://H%4fSt/path", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "H%4fSt", + "hostname": "H%4fSt", + "port": "", + "pathname": "/path", + "search": "", + "hash": "" + }, + "# IPv6 in non-special-URLs", + { + "input": "non-special://[1:2:0:0:5:0:0:0]/", + "base": "about:blank", + "href": "non-special://[1:2:0:0:5::]/", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "[1:2:0:0:5::]", + "hostname": "[1:2:0:0:5::]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "non-special://[1:2:0:0:0:0:0:3]/", + "base": "about:blank", + "href": "non-special://[1:2::3]/", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "[1:2::3]", + "hostname": "[1:2::3]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "non-special://[1:2::3]:80/", + "base": "about:blank", + "href": "non-special://[1:2::3]:80/", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "[1:2::3]:80", + "hostname": "[1:2::3]", + "port": "80", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "non-special://[:80/", + "base": "about:blank", + "failure": true + }, + { + "input": "blob:https://example.com:443/", + "base": "about:blank", + "href": "blob:https://example.com:443/", + "protocol": "blob:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "https://example.com:443/", + "search": "", + "hash": "" + }, + { + "input": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf", + "base": "about:blank", + "href": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf", + "protocol": "blob:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "d3958f5c-0777-0845-9dcf-2cb28783acaf", + "search": "", + "hash": "" + }, + "Invalid IPv4 radix digits", + { + "input": "http://0177.0.0.0189", + "base": "about:blank", + "href": "http://0177.0.0.0189/", + "protocol": "http:", + "username": "", + "password": "", + "host": "0177.0.0.0189", + "hostname": "0177.0.0.0189", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://0x7f.0.0.0x7g", + "base": "about:blank", + "href": "http://0x7f.0.0.0x7g/", + "protocol": "http:", + "username": "", + "password": "", + "host": "0x7f.0.0.0x7g", + "hostname": "0x7f.0.0.0x7g", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://0X7F.0.0.0X7G", + "base": "about:blank", + "href": "http://0x7f.0.0.0x7g/", + "protocol": "http:", + "username": "", + "password": "", + "host": "0x7f.0.0.0x7g", + "hostname": "0x7f.0.0.0x7g", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Invalid IPv4 portion of IPv6 address", + { + "input": "http://[::127.0.0.0.1]", + "base": "about:blank", + "failure": true + }, + "Uncompressed IPv6 addresses with 0", + { + "input": "http://[0:1:0:1:0:1:0:1]", + "base": "about:blank", + "href": "http://[0:1:0:1:0:1:0:1]/", + "protocol": "http:", + "username": "", + "password": "", + "host": "[0:1:0:1:0:1:0:1]", + "hostname": "[0:1:0:1:0:1:0:1]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://[1:0:1:0:1:0:1:0]", + "base": "about:blank", + "href": "http://[1:0:1:0:1:0:1:0]/", + "protocol": "http:", + "username": "", + "password": "", + "host": "[1:0:1:0:1:0:1:0]", + "hostname": "[1:0:1:0:1:0:1:0]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Percent-encoded query and fragment", + { + "input": "http://example.org/test?\u0022", + "base": "about:blank", + "href": "http://example.org/test?%22", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%22", + "hash": "" + }, + { + "input": "http://example.org/test?\u0023", + "base": "about:blank", + "href": "http://example.org/test?#", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "", + "hash": "" + }, + { + "input": "http://example.org/test?\u003C", + "base": "about:blank", + "href": "http://example.org/test?%3C", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%3C", + "hash": "" + }, + { + "input": "http://example.org/test?\u003E", + "base": "about:blank", + "href": "http://example.org/test?%3E", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%3E", + "hash": "" + }, + { + "input": "http://example.org/test?\u2323", + "base": "about:blank", + "href": "http://example.org/test?%E2%8C%A3", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%E2%8C%A3", + "hash": "" + }, + { + "input": "http://example.org/test?%23%23", + "base": "about:blank", + "href": "http://example.org/test?%23%23", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%23%23", + "hash": "" + }, + { + "input": "http://example.org/test?%GH", + "base": "about:blank", + "href": "http://example.org/test?%GH", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%GH", + "hash": "" + }, + { + "input": "http://example.org/test?a#%EF", + "base": "about:blank", + "href": "http://example.org/test?a#%EF", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?a", + "hash": "#%EF" + }, + { + "input": "http://example.org/test?a#%GH", + "base": "about:blank", + "href": "http://example.org/test?a#%GH", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?a", + "hash": "#%GH" + }, + "Bad bases", + { + "input": "test-a.html", + "base": "a", + "failure": true + }, + { + "input": "test-a-slash.html", + "base": "a/", + "failure": true + }, + { + "input": "test-a-slash-slash.html", + "base": "a//", + "failure": true + }, + { + "input": "test-a-colon.html", + "base": "a:", + "failure": true + }, + { + "input": "test-a-colon-slash.html", + "base": "a:/", + "href": "a:/test-a-colon-slash.html", + "protocol": "a:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test-a-colon-slash.html", + "search": "", + "hash": "" + }, + { + "input": "test-a-colon-slash-slash.html", + "base": "a://", + "href": "a:///test-a-colon-slash-slash.html", + "protocol": "a:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test-a-colon-slash-slash.html", + "search": "", + "hash": "" + }, + { + "input": "test-a-colon-b.html", + "base": "a:b", + "failure": true + }, + { + "input": "test-a-colon-slash-b.html", + "base": "a:/b", + "href": "a:/test-a-colon-slash-b.html", + "protocol": "a:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test-a-colon-slash-b.html", + "search": "", + "hash": "" + }, + { + "input": "test-a-colon-slash-slash-b.html", + "base": "a://b", + "href": "a://b/test-a-colon-slash-slash-b.html", + "protocol": "a:", + "username": "", + "password": "", + "host": "b", + "hostname": "b", + "port": "", + "pathname": "/test-a-colon-slash-slash-b.html", + "search": "", + "hash": "" + }, + "Null code point in fragment", + { + "input": "http://example.org/test?a#b\u0000c", + "base": "about:blank", + "href": "http://example.org/test?a#bc", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?a", + "hash": "#bc" + } +] diff --git a/test/parallel/test-url-domain-ascii-unicode.js b/test/parallel/test-url-domain-ascii-unicode.js new file mode 100644 index 00000000000000..49259a7ab0f4c4 --- /dev/null +++ b/test/parallel/test-url-domain-ascii-unicode.js @@ -0,0 +1,31 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasIntl) + common.skip('missing Intl'); + +const strictEqual = require('assert').strictEqual; +const url = require('url'); + +const domainToASCII = url.domainToASCII; +const domainToUnicode = url.domainToUnicode; + +const domainWithASCII = [ + ['ıíd', 'xn--d-iga7r'], + ['يٴ', 'xn--mhb8f'], + ['www.ϧƽəʐ.com', 'www.xn--cja62apfr6c.com'], + ['новини.com', 'xn--b1amarcd.com'], + ['名がドメイン.com', 'xn--v8jxj3d1dzdz08w.com'], + ['افغانستا.icom.museum', 'xn--mgbaal8b0b9b2b.icom.museum'], + ['الجزائر.icom.fake', 'xn--lgbbat1ad8j.icom.fake'], + ['भारत.org', 'xn--h2brj9c.org'] +]; + +domainWithASCII.forEach((pair) => { + const domain = pair[0]; + const ascii = pair[1]; + const domainConvertedToASCII = domainToASCII(domain); + strictEqual(domainConvertedToASCII, ascii); + const asciiConvertedToUnicode = domainToUnicode(ascii); + strictEqual(asciiConvertedToUnicode, domain); +}); diff --git a/test/parallel/test-whatwg-url-constructor.js b/test/parallel/test-whatwg-url-constructor.js new file mode 100644 index 00000000000000..16bcac74cc6bcd --- /dev/null +++ b/test/parallel/test-whatwg-url-constructor.js @@ -0,0 +1,143 @@ +'use strict'; +const common = require('../common'); +if (!common.hasIntl) { + // A handful of the tests fail when ICU is not included. + common.skip('missing Intl'); +} + +const fixtures = require('../common/fixtures'); +const { URL, URLSearchParams } = require('url'); +const { test, assert_equals, assert_true, assert_throws } = + require('../common/wpt'); + +const request = { + response: require(fixtures.path('url-tests')) +}; + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/8791bed/url/url-constructor.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +function runURLConstructorTests() { + // var setup = async_test("Loading data…") + // setup.step(function() { + // var request = new XMLHttpRequest() + // request.open("GET", "urltestdata.json") + // request.send() + // request.responseType = "json" + // request.onload = setup.step_func(function() { + runURLTests(request.response) + // setup.done() + // }) + // }) +} + +function bURL(url, base) { + return new URL(url, base || "about:blank") +} + + +function runURLTests(urltests) { + for(var i = 0, l = urltests.length; i < l; i++) { + var expected = urltests[i] + if (typeof expected === "string") continue // skip comments + + test(function() { + if (expected.failure) { + assert_throws(new TypeError(), function() { + bURL(expected.input, expected.base) + }) + return + } + + var url = bURL(expected.input, expected.base) + assert_equals(url.href, expected.href, "href") + assert_equals(url.protocol, expected.protocol, "protocol") + assert_equals(url.username, expected.username, "username") + assert_equals(url.password, expected.password, "password") + assert_equals(url.host, expected.host, "host") + assert_equals(url.hostname, expected.hostname, "hostname") + assert_equals(url.port, expected.port, "port") + assert_equals(url.pathname, expected.pathname, "pathname") + assert_equals(url.search, expected.search, "search") + if ("searchParams" in expected) { + assert_true("searchParams" in url) + assert_equals(url.searchParams.toString(), expected.searchParams, "searchParams") + } + assert_equals(url.hash, expected.hash, "hash") + }, "Parsing: <" + expected.input + "> against <" + expected.base + ">") + } +} + +function runURLSearchParamTests() { + test(function() { + var url = bURL('http://example.org/?a=b') + assert_true("searchParams" in url) + var searchParams = url.searchParams + assert_true(url.searchParams === searchParams, 'Object identity should hold.') + }, 'URL.searchParams getter') + + test(function() { + var url = bURL('http://example.org/?a=b') + assert_true("searchParams" in url) + var searchParams = url.searchParams + assert_equals(searchParams.toString(), 'a=b') + + searchParams.set('a', 'b') + assert_equals(url.searchParams.toString(), 'a=b') + assert_equals(url.search, '?a=b') + url.search = '' + assert_equals(url.searchParams.toString(), '') + assert_equals(url.search, '') + assert_equals(searchParams.toString(), '') + }, 'URL.searchParams updating, clearing') + + test(function() { + 'use strict' + var urlString = 'http://example.org' + var url = bURL(urlString) + assert_throws(TypeError(), function() { url.searchParams = new URLSearchParams(urlString) }) + }, 'URL.searchParams setter, invalid values') + + test(function() { + var url = bURL('http://example.org/file?a=b&c=d') + assert_true("searchParams" in url) + var searchParams = url.searchParams + assert_equals(url.search, '?a=b&c=d') + assert_equals(searchParams.toString(), 'a=b&c=d') + + // Test that setting 'search' propagates to the URL object's query object. + url.search = 'e=f&g=h' + assert_equals(url.search, '?e=f&g=h') + assert_equals(searchParams.toString(), 'e=f&g=h') + + // ..and same but with a leading '?'. + url.search = '?e=f&g=h' + assert_equals(url.search, '?e=f&g=h') + assert_equals(searchParams.toString(), 'e=f&g=h') + + // And in the other direction, altering searchParams propagates + // back to 'search'. + searchParams.append('i', ' j ') + assert_equals(url.search, '?e=f&g=h&i=+j+') + assert_equals(url.searchParams.toString(), 'e=f&g=h&i=+j+') + assert_equals(searchParams.get('i'), ' j ') + + searchParams.set('e', 'updated') + assert_equals(url.search, '?e=updated&g=h&i=+j+') + assert_equals(searchParams.get('e'), 'updated') + + var url2 = bURL('http://example.org/file??a=b&c=d') + assert_equals(url2.search, '??a=b&c=d') + assert_equals(url2.searchParams.toString(), '%3Fa=b&c=d') + + url2.href = 'http://example.org/file??a=b' + assert_equals(url2.search, '??a=b') + assert_equals(url2.searchParams.toString(), '%3Fa=b') + }, 'URL.searchParams and URL.search setters, update propagation') +} +runURLSearchParamTests() +runURLConstructorTests() +/* eslint-enable */ diff --git a/test/parallel/test-whatwg-url-domainto.js b/test/parallel/test-whatwg-url-domainto.js new file mode 100644 index 00000000000000..f8029d8b5d66a4 --- /dev/null +++ b/test/parallel/test-whatwg-url-domainto.js @@ -0,0 +1,51 @@ +'use strict'; +const common = require('../common'); + +if (!common.hasIntl) + common.skip('missing Intl'); + +const assert = require('assert'); +const { domainToASCII, domainToUnicode } = require('url'); + +// Tests below are not from WPT. +const tests = require('../fixtures/url-idna.js'); +const wptToASCIITests = require('../fixtures/url-toascii.js'); + +{ + assert.throws(() => domainToASCII(), /^TypeError: The "domain" argument must be specified$/); + assert.throws(() => domainToUnicode(), /^TypeError: The "domain" argument must be specified$/); + assert.strictEqual(domainToASCII(undefined), 'undefined'); + assert.strictEqual(domainToUnicode(undefined), 'undefined'); +} + +{ + for (const [i, { ascii, unicode }] of tests.entries()) { + assert.strictEqual(ascii, domainToASCII(unicode), + `domainToASCII(${i + 1})`); + assert.strictEqual(unicode, domainToUnicode(ascii), + `domainToUnicode(${i + 1})`); + assert.strictEqual(ascii, domainToASCII(domainToUnicode(ascii)), + `domainToASCII(domainToUnicode(${i + 1}))`); + assert.strictEqual(unicode, domainToUnicode(domainToASCII(unicode)), + `domainToUnicode(domainToASCII(${i + 1}))`); + } +} + +{ + for (const [i, test] of wptToASCIITests.entries()) { + if (typeof test === 'string') + continue; // skip comments + const { comment, input, output } = test; + let caseComment = `Case ${i + 1}`; + if (comment) + caseComment += ` (${comment})`; + if (output === null) { + assert.strictEqual(domainToASCII(input), '', caseComment); + assert.strictEqual(domainToUnicode(input), '', caseComment); + } else { + assert.strictEqual(domainToASCII(input), output, caseComment); + const roundtripped = domainToASCII(domainToUnicode(input)); + assert.strictEqual(roundtripped, output, caseComment); + } + } +} diff --git a/test/parallel/test-whatwg-url-historical.js b/test/parallel/test-whatwg-url-historical.js new file mode 100644 index 00000000000000..466949cd322d37 --- /dev/null +++ b/test/parallel/test-whatwg-url-historical.js @@ -0,0 +1,46 @@ +'use strict'; +const common = require('../common'); +if (!common.hasIntl) { + // A handful of the tests fail when ICU is not included. + common.skip('missing Intl'); +} + +const URL = require('url').URL; +const { test, assert_equals, assert_throws } = require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/8791bed/url/historical.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +// var objects = [ +// [function() { return window.location }, "location object"], +// [function() { return document.createElement("a") }, "a element"], +// [function() { return document.createElement("area") }, "area element"], +// ]; + +// objects.forEach(function(o) { +// test(function() { +// var object = o[0](); +// assert_false("searchParams" in object, +// o[1] + " should not have a searchParams attribute"); +// }, "searchParams on " + o[1]); +// }); + +test(function() { + var url = new URL("./foo", "http://www.example.org"); + assert_equals(url.href, "http://www.example.org/foo"); + assert_throws(new TypeError(), function() { + url.href = "./bar"; + }); +}, "Setting URL's href attribute and base URLs"); + +test(function() { + assert_equals(URL.domainToASCII, undefined); +}, "URL.domainToASCII should be undefined"); + +test(function() { + assert_equals(URL.domainToUnicode, undefined); +}, "URL.domainToUnicode should be undefined"); +/* eslint-enable */ diff --git a/test/parallel/test-whatwg-url-inspect.js b/test/parallel/test-whatwg-url-inspect.js new file mode 100644 index 00000000000000..5758b39b8af83d --- /dev/null +++ b/test/parallel/test-whatwg-url-inspect.js @@ -0,0 +1,66 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasIntl) { + // A handful of the tests fail when ICU is not included. + common.skip('missing Intl'); +} + +const util = require('util'); +const URL = require('url').URL; +const assert = require('assert'); + +// Tests below are not from WPT. +const url = new URL('https://username:password@host.name:8080/path/name/?que=ry#hash'); + +assert.strictEqual( + util.inspect(url), + `URL { + href: 'https://username:password@host.name:8080/path/name/?que=ry#hash', + origin: 'https://host.name:8080', + protocol: 'https:', + username: 'username', + password: 'password', + host: 'host.name:8080', + hostname: 'host.name', + port: '8080', + pathname: '/path/name/', + search: '?que=ry', + searchParams: URLSearchParams { 'que' => 'ry' }, + hash: '#hash' }`); + +assert.strictEqual( + util.inspect(url, { showHidden: true }), + `URL { + href: 'https://username:password@host.name:8080/path/name/?que=ry#hash', + origin: 'https://host.name:8080', + protocol: 'https:', + username: 'username', + password: 'password', + host: 'host.name:8080', + hostname: 'host.name', + port: '8080', + pathname: '/path/name/', + search: '?que=ry', + searchParams: URLSearchParams { 'que' => 'ry' }, + hash: '#hash', + cannotBeBase: false, + special: true, + [Symbol(context)]:\x20 + URLContext { + flags: 2032, + scheme: 'https:', + username: 'username', + password: 'password', + host: 'host.name', + port: 8080, + path: [ 'path', 'name', '', [length]: 3 ], + query: 'que=ry', + fragment: 'hash' } }`); + +assert.strictEqual( + util.inspect({ a: url }, { depth: 0 }), + '{ a: [Object] }'); + +class MyURL extends URL {} +assert(util.inspect(new MyURL(url.href)).startsWith('MyURL {')); diff --git a/test/parallel/test-whatwg-url-origin.js b/test/parallel/test-whatwg-url-origin.js new file mode 100644 index 00000000000000..8a5ad6d3154f8f --- /dev/null +++ b/test/parallel/test-whatwg-url-origin.js @@ -0,0 +1,52 @@ +'use strict'; +const common = require('../common'); +if (!common.hasIntl) { + // A handful of the tests fail when ICU is not included. + common.skip('missing Intl'); +} + +const fixtures = require('../common/fixtures'); +const URL = require('url').URL; +const { test, assert_equals } = require('../common/wpt'); + +const request = { + response: require(fixtures.path('url-tests')) +}; + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/8791bed/url/url-origin.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +function runURLOriginTests() { + // var setup = async_test("Loading data…") + // setup.step(function() { + // var request = new XMLHttpRequest() + // request.open("GET", "urltestdata.json") + // request.send() + // request.responseType = "json" + // request.onload = setup.step_func(function() { + runURLTests(request.response) + // setup.done() + // }) + // }) +} + +function bURL(url, base) { + return new URL(url, base || "about:blank") +} + +function runURLTests(urltests) { + for(var i = 0, l = urltests.length; i < l; i++) { + var expected = urltests[i] + if (typeof expected === "string" || !("origin" in expected)) continue + test(function() { + var url = bURL(expected.input, expected.base) + assert_equals(url.origin, expected.origin, "origin") + }, "Origin parsing: <" + expected.input + "> against <" + expected.base + ">") + } +} + +runURLOriginTests() +/* eslint-enable */ diff --git a/test/parallel/test-whatwg-url-parsing.js b/test/parallel/test-whatwg-url-parsing.js new file mode 100644 index 00000000000000..104f25ff4380bb --- /dev/null +++ b/test/parallel/test-whatwg-url-parsing.js @@ -0,0 +1,62 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasIntl) { + // A handful of the tests fail when ICU is not included. + common.skip('missing Intl'); +} + +const URL = require('url').URL; +const assert = require('assert'); +const fixtures = require('../common/fixtures'); + +// Tests below are not from WPT. +const tests = require(fixtures.path('url-tests')); +const failureTests = tests.filter((test) => test.failure).concat([ + { input: '' }, + { input: 'test' }, + { input: undefined }, + { input: 0 }, + { input: true }, + { input: false }, + { input: null }, + { input: new Date() }, + { input: new RegExp() }, + { input: () => {} } +]); + +const expectedError = (err) => /^TypeError: Invalid URL: /.test(err.toString()); + +for (const test of failureTests) { + assert.throws( + () => new URL(test.input, test.base), + (error) => { + if (!expectedError(error)) + return false; + + // The input could be processed, so we don't do strict matching here + const match = (`${error}`).match(/Invalid URL: (.*)$/); + if (!match) { + return false; + } + return error.input === match[1]; + }); +} + +const additional_tests = + require(fixtures.path('url-tests-additional.js')); + +for (const test of additional_tests) { + const url = new URL(test.url); + if (test.href) assert.strictEqual(url.href, test.href); + if (test.origin) assert.strictEqual(url.origin, test.origin); + if (test.protocol) assert.strictEqual(url.protocol, test.protocol); + if (test.username) assert.strictEqual(url.username, test.username); + if (test.password) assert.strictEqual(url.password, test.password); + if (test.hostname) assert.strictEqual(url.hostname, test.hostname); + if (test.host) assert.strictEqual(url.host, test.host); + if (test.port !== undefined) assert.strictEqual(url.port, test.port); + if (test.pathname) assert.strictEqual(url.pathname, test.pathname); + if (test.search) assert.strictEqual(url.search, test.search); + if (test.hash) assert.strictEqual(url.hash, test.hash); +} diff --git a/test/parallel/test-whatwg-url-properties.js b/test/parallel/test-whatwg-url-properties.js new file mode 100644 index 00000000000000..d6caae511aed47 --- /dev/null +++ b/test/parallel/test-whatwg-url-properties.js @@ -0,0 +1,162 @@ +// Flags: --expose-internals +'use strict'; + +require('../common'); +const URL = require('url').URL; +const assert = require('assert'); +const urlToOptions = require('internal/url').urlToOptions; + +// Tests below are not from WPT. +const url = new URL('http://user:pass@foo.bar.com:21/aaa/zzz?l=24#test'); +const oldParams = url.searchParams; // for test of [SameObject] + +// To retrieve enumerable but not necessarily own properties, +// we need to use the for-in loop. +const props = []; +for (const prop in url) { + props.push(prop); +} + +// See: https://url.spec.whatwg.org/#api +// https://heycam.github.io/webidl/#es-attributes +// https://heycam.github.io/webidl/#es-stringifier +const expected = ['toString', + 'href', 'origin', 'protocol', + 'username', 'password', 'host', 'hostname', 'port', + 'pathname', 'search', 'searchParams', 'hash', 'toJSON']; + +assert.deepStrictEqual(props, expected); + +// href is writable (not readonly) and is stringifier +assert.strictEqual(url.toString(), url.href); +url.href = 'http://user:pass@foo.bar.com:21/aaa/zzz?l=25#test'; +assert.strictEqual(url.href, + 'http://user:pass@foo.bar.com:21/aaa/zzz?l=25#test'); +assert.strictEqual(url.toString(), url.href); +// Return true because it's configurable, but because the properties +// are defined on the prototype per the spec, the deletion has no effect +assert.strictEqual((delete url.href), true); +assert.strictEqual(url.href, + 'http://user:pass@foo.bar.com:21/aaa/zzz?l=25#test'); +assert.strictEqual(url.searchParams, oldParams); // [SameObject] + +// searchParams is readonly. Under strict mode setting a +// non-writable property should throw. +// Note: this error message is subject to change in V8 updates +assert.throws( + () => url.origin = 'http://foo.bar.com:22', + /^TypeError: Cannot set property origin of \[object URL\] which has only a getter$/ +); +assert.strictEqual(url.origin, 'http://foo.bar.com:21'); +assert.strictEqual(url.toString(), + 'http://user:pass@foo.bar.com:21/aaa/zzz?l=25#test'); +assert.strictEqual((delete url.origin), true); +assert.strictEqual(url.origin, 'http://foo.bar.com:21'); + +// The following properties should be writable (not readonly) +url.protocol = 'https:'; +assert.strictEqual(url.protocol, 'https:'); +assert.strictEqual(url.toString(), + 'https://user:pass@foo.bar.com:21/aaa/zzz?l=25#test'); +assert.strictEqual((delete url.protocol), true); +assert.strictEqual(url.protocol, 'https:'); + +url.username = 'user2'; +assert.strictEqual(url.username, 'user2'); +assert.strictEqual(url.toString(), + 'https://user2:pass@foo.bar.com:21/aaa/zzz?l=25#test'); +assert.strictEqual((delete url.username), true); +assert.strictEqual(url.username, 'user2'); + +url.password = 'pass2'; +assert.strictEqual(url.password, 'pass2'); +assert.strictEqual(url.toString(), + 'https://user2:pass2@foo.bar.com:21/aaa/zzz?l=25#test'); +assert.strictEqual((delete url.password), true); +assert.strictEqual(url.password, 'pass2'); + +url.host = 'foo.bar.net:22'; +assert.strictEqual(url.host, 'foo.bar.net:22'); +assert.strictEqual(url.toString(), + 'https://user2:pass2@foo.bar.net:22/aaa/zzz?l=25#test'); +assert.strictEqual((delete url.host), true); +assert.strictEqual(url.host, 'foo.bar.net:22'); + +url.hostname = 'foo.bar.org'; +assert.strictEqual(url.hostname, 'foo.bar.org'); +assert.strictEqual(url.toString(), + 'https://user2:pass2@foo.bar.org:22/aaa/zzz?l=25#test'); +assert.strictEqual((delete url.hostname), true); +assert.strictEqual(url.hostname, 'foo.bar.org'); + +url.port = '23'; +assert.strictEqual(url.port, '23'); +assert.strictEqual(url.toString(), + 'https://user2:pass2@foo.bar.org:23/aaa/zzz?l=25#test'); +assert.strictEqual((delete url.port), true); +assert.strictEqual(url.port, '23'); + +url.pathname = '/aaa/bbb'; +assert.strictEqual(url.pathname, '/aaa/bbb'); +assert.strictEqual(url.toString(), + 'https://user2:pass2@foo.bar.org:23/aaa/bbb?l=25#test'); +assert.strictEqual((delete url.pathname), true); +assert.strictEqual(url.pathname, '/aaa/bbb'); + +url.search = '?k=99'; +assert.strictEqual(url.search, '?k=99'); +assert.strictEqual(url.toString(), + 'https://user2:pass2@foo.bar.org:23/aaa/bbb?k=99#test'); +assert.strictEqual((delete url.search), true); +assert.strictEqual(url.search, '?k=99'); + +url.hash = '#abcd'; +assert.strictEqual(url.hash, '#abcd'); +assert.strictEqual(url.toString(), + 'https://user2:pass2@foo.bar.org:23/aaa/bbb?k=99#abcd'); +assert.strictEqual((delete url.hash), true); +assert.strictEqual(url.hash, '#abcd'); + +// searchParams is readonly. Under strict mode setting a +// non-writable property should throw. +// Note: this error message is subject to change in V8 updates +assert.throws( + () => url.searchParams = '?k=88', + /^TypeError: Cannot set property searchParams of \[object URL\] which has only a getter$/ +); +assert.strictEqual(url.searchParams, oldParams); +assert.strictEqual(url.toString(), + 'https://user2:pass2@foo.bar.org:23/aaa/bbb?k=99#abcd'); +assert.strictEqual((delete url.searchParams), true); +assert.strictEqual(url.searchParams, oldParams); + +// Test urlToOptions +{ + const opts = + urlToOptions(new URL('http://user:pass@foo.bar.com:21/aaa/zzz?l=24#test')); + assert.strictEqual(opts instanceof URL, false); + assert.strictEqual(opts.protocol, 'http:'); + assert.strictEqual(opts.auth, 'user:pass'); + assert.strictEqual(opts.hostname, 'foo.bar.com'); + assert.strictEqual(opts.port, 21); + assert.strictEqual(opts.path, '/aaa/zzz?l=24'); + assert.strictEqual(opts.pathname, '/aaa/zzz'); + assert.strictEqual(opts.search, '?l=24'); + assert.strictEqual(opts.hash, '#test'); +} + +// Test special origins +[ + { expected: 'https://whatwg.org', + url: 'blob:https://whatwg.org/d0360e2f-caee-469f-9a2f-87d5b0456f6f' }, + { expected: 'ftp://example.org', url: 'ftp://example.org/foo' }, + { expected: 'gopher://gopher.quux.org', url: 'gopher://gopher.quux.org/1/' }, + { expected: 'http://example.org', url: 'http://example.org/foo' }, + { expected: 'https://example.org', url: 'https://example.org/foo' }, + { expected: 'ws://example.org', url: 'ws://example.org/foo' }, + { expected: 'wss://example.org', url: 'wss://example.org/foo' }, + { expected: 'null', url: 'file:///tmp/mock/path' }, + { expected: 'null', url: 'npm://nodejs/rules' } +].forEach((test) => { + assert.strictEqual(new URL(test.url).origin, test.expected); +}); diff --git a/test/parallel/test-whatwg-url-searchparams-append.js b/test/parallel/test-whatwg-url-searchparams-append.js new file mode 100644 index 00000000000000..6571f570588339 --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-append.js @@ -0,0 +1,73 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URLSearchParams = require('url').URLSearchParams; +const { test, assert_equals, assert_true } = require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/8791bed/url/urlsearchparams-append.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +test(function() { + var params = new URLSearchParams(); + params.append('a', 'b'); + assert_equals(params + '', 'a=b'); + params.append('a', 'b'); + assert_equals(params + '', 'a=b&a=b'); + params.append('a', 'c'); + assert_equals(params + '', 'a=b&a=b&a=c'); +}, 'Append same name'); +test(function() { + var params = new URLSearchParams(); + params.append('', ''); + assert_equals(params + '', '='); + params.append('', ''); + assert_equals(params + '', '=&='); +}, 'Append empty strings'); +test(function() { + var params = new URLSearchParams(); + params.append(null, null); + assert_equals(params + '', 'null=null'); + params.append(null, null); + assert_equals(params + '', 'null=null&null=null'); +}, 'Append null'); +test(function() { + var params = new URLSearchParams(); + params.append('first', 1); + params.append('second', 2); + params.append('third', ''); + params.append('first', 10); + assert_true(params.has('first'), 'Search params object has name "first"'); + assert_equals(params.get('first'), '1', 'Search params object has name "first" with value "1"'); + assert_equals(params.get('second'), '2', 'Search params object has name "second" with value "2"'); + assert_equals(params.get('third'), '', 'Search params object has name "third" with value ""'); + params.append('first', 10); + assert_equals(params.get('first'), '1', 'Search params object has name "first" with value "1"'); +}, 'Append multiple'); +/* eslint-enable */ + +// Tests below are not from WPT. +{ + const params = new URLSearchParams(); + assert.throws(() => { + params.append.call(undefined); + }, /^TypeError: Value of "this" must be of type URLSearchParams$/); + assert.throws(() => { + params.append('a'); + }, /^TypeError: The "name" and "value" arguments must be specified$/); + + const obj = { + toString() { throw new Error('toString'); }, + valueOf() { throw new Error('valueOf'); } + }; + const sym = Symbol(); + assert.throws(() => params.set(obj, 'b'), /^Error: toString$/); + assert.throws(() => params.set('a', obj), /^Error: toString$/); + assert.throws(() => params.set(sym, 'b'), + /^TypeError: Cannot convert a Symbol value to a string$/); + assert.throws(() => params.set('a', sym), + /^TypeError: Cannot convert a Symbol value to a string$/); +} diff --git a/test/parallel/test-whatwg-url-searchparams-constructor.js b/test/parallel/test-whatwg-url-searchparams-constructor.js new file mode 100644 index 00000000000000..a3e15875276087 --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-constructor.js @@ -0,0 +1,248 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URLSearchParams = require('url').URLSearchParams; +const { + test, assert_equals, assert_true, + assert_false, assert_throws, assert_array_equals +} = require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/54c3502d7b/url/urlsearchparams-constructor.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +var params; // Strict mode fix for WPT. +test(function() { + var params = new URLSearchParams(); + assert_equals(params + '', ''); + params = new URLSearchParams(''); + assert_equals(params + '', ''); + params = new URLSearchParams('a=b'); + assert_equals(params + '', 'a=b'); + params = new URLSearchParams(params); + assert_equals(params + '', 'a=b'); +}, 'Basic URLSearchParams construction'); + +test(function() { + var params = new URLSearchParams() + assert_equals(params.toString(), "") +}, "URLSearchParams constructor, no arguments") + +// test(() => { +// params = new URLSearchParams(DOMException.prototype); +// assert_equals(params.toString(), "INDEX_SIZE_ERR=1&DOMSTRING_SIZE_ERR=2&HIERARCHY_REQUEST_ERR=3&WRONG_DOCUMENT_ERR=4&INVALID_CHARACTER_ERR=5&NO_DATA_ALLOWED_ERR=6&NO_MODIFICATION_ALLOWED_ERR=7&NOT_FOUND_ERR=8&NOT_SUPPORTED_ERR=9&INUSE_ATTRIBUTE_ERR=10&INVALID_STATE_ERR=11&SYNTAX_ERR=12&INVALID_MODIFICATION_ERR=13&NAMESPACE_ERR=14&INVALID_ACCESS_ERR=15&VALIDATION_ERR=16&TYPE_MISMATCH_ERR=17&SECURITY_ERR=18&NETWORK_ERR=19&ABORT_ERR=20&URL_MISMATCH_ERR=21"A_EXCEEDED_ERR=22&TIMEOUT_ERR=23&INVALID_NODE_TYPE_ERR=24&DATA_CLONE_ERR=25") +// }, "URLSearchParams constructor, DOMException.prototype as argument") + +test(() => { + params = new URLSearchParams(''); + assert_true(params != null, 'constructor returned non-null value.'); + assert_equals(params.__proto__, URLSearchParams.prototype, 'expected URLSearchParams.prototype as prototype.'); +}, "URLSearchParams constructor, empty string as argument") + +test(() => { + params = new URLSearchParams({}); + assert_equals(params + '', ""); +}, 'URLSearchParams constructor, {} as argument'); + +test(function() { + var params = new URLSearchParams('a=b'); + assert_true(params != null, 'constructor returned non-null value.'); + assert_true(params.has('a'), 'Search params object has name "a"'); + assert_false(params.has('b'), 'Search params object has not got name "b"'); + var params = new URLSearchParams('a=b&c'); + assert_true(params != null, 'constructor returned non-null value.'); + assert_true(params.has('a'), 'Search params object has name "a"'); + assert_true(params.has('c'), 'Search params object has name "c"'); + var params = new URLSearchParams('&a&&& &&&&&a+b=& c&m%c3%b8%c3%b8'); + assert_true(params != null, 'constructor returned non-null value.'); + assert_true(params.has('a'), 'Search params object has name "a"'); + assert_true(params.has('a b'), 'Search params object has name "a b"'); + assert_true(params.has(' '), 'Search params object has name " "'); + assert_false(params.has('c'), 'Search params object did not have the name "c"'); + assert_true(params.has(' c'), 'Search params object has name " c"'); + assert_true(params.has('møø'), 'Search params object has name "møø"'); +}, 'URLSearchParams constructor, string.'); + +test(function() { + var seed = new URLSearchParams('a=b&c=d'); + var params = new URLSearchParams(seed); + assert_true(params != null, 'constructor returned non-null value.'); + assert_equals(params.get('a'), 'b'); + assert_equals(params.get('c'), 'd'); + assert_false(params.has('d')); + // The name-value pairs are copied when created; later updates + // should not be observable. + seed.append('e', 'f'); + assert_false(params.has('e')); + params.append('g', 'h'); + assert_false(seed.has('g')); +}, 'URLSearchParams constructor, object.'); + +test(function() { + var params = new URLSearchParams('a=b+c'); + assert_equals(params.get('a'), 'b c'); + params = new URLSearchParams('a+b=c'); + assert_equals(params.get('a b'), 'c'); +}, 'Parse +'); + +test(function() { + const testValue = '+15555555555'; + const params = new URLSearchParams(); + params.set('query', testValue); + var newParams = new URLSearchParams(params.toString()); + + assert_equals(params.toString(), 'query=%2B15555555555'); + assert_equals(params.get('query'), testValue); + assert_equals(newParams.get('query'), testValue); +}, 'Parse encoded +'); + +test(function() { + var params = new URLSearchParams('a=b c'); + assert_equals(params.get('a'), 'b c'); + params = new URLSearchParams('a b=c'); + assert_equals(params.get('a b'), 'c'); +}, 'Parse space'); + +test(function() { + var params = new URLSearchParams('a=b%20c'); + assert_equals(params.get('a'), 'b c'); + params = new URLSearchParams('a%20b=c'); + assert_equals(params.get('a b'), 'c'); +}, 'Parse %20'); + +test(function() { + var params = new URLSearchParams('a=b\0c'); + assert_equals(params.get('a'), 'b\0c'); + params = new URLSearchParams('a\0b=c'); + assert_equals(params.get('a\0b'), 'c'); +}, 'Parse \\0'); + +test(function() { + var params = new URLSearchParams('a=b%00c'); + assert_equals(params.get('a'), 'b\0c'); + params = new URLSearchParams('a%00b=c'); + assert_equals(params.get('a\0b'), 'c'); +}, 'Parse %00'); + +test(function() { + var params = new URLSearchParams('a=b\u2384'); + assert_equals(params.get('a'), 'b\u2384'); + params = new URLSearchParams('a\u2384b=c'); + assert_equals(params.get('a\u2384b'), 'c'); +}, 'Parse \u2384'); // Unicode Character 'COMPOSITION SYMBOL' (U+2384) + +test(function() { + var params = new URLSearchParams('a=b%e2%8e%84'); + assert_equals(params.get('a'), 'b\u2384'); + params = new URLSearchParams('a%e2%8e%84b=c'); + assert_equals(params.get('a\u2384b'), 'c'); +}, 'Parse %e2%8e%84'); // Unicode Character 'COMPOSITION SYMBOL' (U+2384) + +test(function() { + var params = new URLSearchParams('a=b\uD83D\uDCA9c'); + assert_equals(params.get('a'), 'b\uD83D\uDCA9c'); + params = new URLSearchParams('a\uD83D\uDCA9b=c'); + assert_equals(params.get('a\uD83D\uDCA9b'), 'c'); +}, 'Parse \uD83D\uDCA9'); // Unicode Character 'PILE OF POO' (U+1F4A9) + +test(function() { + var params = new URLSearchParams('a=b%f0%9f%92%a9c'); + assert_equals(params.get('a'), 'b\uD83D\uDCA9c'); + params = new URLSearchParams('a%f0%9f%92%a9b=c'); + assert_equals(params.get('a\uD83D\uDCA9b'), 'c'); +}, 'Parse %f0%9f%92%a9'); // Unicode Character 'PILE OF POO' (U+1F4A9) + +test(function() { + var params = new URLSearchParams([]); + assert_true(params != null, 'constructor returned non-null value.'); + params = new URLSearchParams([['a', 'b'], ['c', 'd']]); + assert_equals(params.get("a"), "b"); + assert_equals(params.get("c"), "d"); + assert_throws(new TypeError(), function() { new URLSearchParams([[1]]); }); + assert_throws(new TypeError(), function() { new URLSearchParams([[1,2,3]]); }); +}, "Constructor with sequence of sequences of strings"); + +[ + { "input": {"+": "%C2"}, "output": [["+", "%C2"]], "name": "object with +" }, + { "input": {c: "x", a: "?"}, "output": [["c", "x"], ["a", "?"]], "name": "object with two keys" }, + { "input": [["c", "x"], ["a", "?"]], "output": [["c", "x"], ["a", "?"]], "name": "array with two keys" }, + { "input": {"a\0b": "42", "c\uD83D": "23", "d\u1234": "foo"}, "output": [["a\0b", "42"], ["c\uFFFD", "23"], ["d\u1234", "foo"]], "name": "object with NULL, non-ASCII, and surrogate keys" } +].forEach((val) => { + test(() => { + let params = new URLSearchParams(val.input), + i = 0 + for (let param of params) { + assert_array_equals(param, val.output[i]) + i++ + } + }, "Construct with " + val.name) +}) + +test(() => { + params = new URLSearchParams() + params[Symbol.iterator] = function *() { + yield ["a", "b"] + } + let params2 = new URLSearchParams(params) + assert_equals(params2.get("a"), "b") +}, "Custom [Symbol.iterator]") +/* eslint-enable */ + +// Tests below are not from WPT. +function makeIterableFunc(array) { + return Object.assign(() => {}, { + [Symbol.iterator]() { + return array[Symbol.iterator](); + } + }); +} + +{ + const iterableError = /^TypeError: Query pairs must be iterable$/; + const tupleError = + /^TypeError: Each query pair must be an iterable \[name, value] tuple$/; + + let params; + params = new URLSearchParams(undefined); + assert.strictEqual(params.toString(), ''); + params = new URLSearchParams(null); + assert.strictEqual(params.toString(), ''); + params = new URLSearchParams( + makeIterableFunc([['key', 'val'], ['key2', 'val2']]) + ); + assert.strictEqual(params.toString(), 'key=val&key2=val2'); + params = new URLSearchParams( + makeIterableFunc([['key', 'val'], ['key2', 'val2']].map(makeIterableFunc)) + ); + assert.strictEqual(params.toString(), 'key=val&key2=val2'); + assert.throws(() => new URLSearchParams([[1]]), tupleError); + assert.throws(() => new URLSearchParams([[1, 2, 3]]), tupleError); + assert.throws(() => new URLSearchParams({ [Symbol.iterator]: 42 }), + iterableError); + assert.throws(() => new URLSearchParams([{}]), tupleError); + assert.throws(() => new URLSearchParams(['a']), tupleError); + assert.throws(() => new URLSearchParams([null]), tupleError); + assert.throws(() => new URLSearchParams([{ [Symbol.iterator]: 42 }]), + tupleError); +} + +{ + const obj = { + toString() { throw new Error('toString'); }, + valueOf() { throw new Error('valueOf'); } + }; + const sym = Symbol(); + const toStringError = /^Error: toString$/; + const symbolError = /^TypeError: Cannot convert a Symbol value to a string$/; + + assert.throws(() => new URLSearchParams({ a: obj }), toStringError); + assert.throws(() => new URLSearchParams([['a', obj]]), toStringError); + assert.throws(() => new URLSearchParams(sym), symbolError); + assert.throws(() => new URLSearchParams({ [sym]: 'a' }), symbolError); + assert.throws(() => new URLSearchParams({ a: sym }), symbolError); + assert.throws(() => new URLSearchParams([[sym, 'a']]), symbolError); + assert.throws(() => new URLSearchParams([['a', sym]]), symbolError); +} diff --git a/test/parallel/test-whatwg-url-searchparams-delete.js b/test/parallel/test-whatwg-url-searchparams-delete.js new file mode 100644 index 00000000000000..bd52a13e9174b3 --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-delete.js @@ -0,0 +1,92 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const { URL, URLSearchParams } = require('url'); +const { test, assert_equals, assert_true, assert_false } = + require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/70a0898763/url/urlsearchparams-delete.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +test(function() { + var params = new URLSearchParams('a=b&c=d'); + params.delete('a'); + assert_equals(params + '', 'c=d'); + params = new URLSearchParams('a=a&b=b&a=a&c=c'); + params.delete('a'); + assert_equals(params + '', 'b=b&c=c'); + params = new URLSearchParams('a=a&=&b=b&c=c'); + params.delete(''); + assert_equals(params + '', 'a=a&b=b&c=c'); + params = new URLSearchParams('a=a&null=null&b=b'); + params.delete(null); + assert_equals(params + '', 'a=a&b=b'); + params = new URLSearchParams('a=a&undefined=undefined&b=b'); + params.delete(undefined); + assert_equals(params + '', 'a=a&b=b'); +}, 'Delete basics'); + +test(function() { + var params = new URLSearchParams(); + params.append('first', 1); + assert_true(params.has('first'), 'Search params object has name "first"'); + assert_equals(params.get('first'), '1', 'Search params object has name "first" with value "1"'); + params.delete('first'); + assert_false(params.has('first'), 'Search params object has no "first" name'); + params.append('first', 1); + params.append('first', 10); + params.delete('first'); + assert_false(params.has('first'), 'Search params object has no "first" name'); +}, 'Deleting appended multiple'); + +test(function() { + var url = new URL('http://example.com/?param1¶m2'); + url.searchParams.delete('param1'); + url.searchParams.delete('param2'); + assert_equals(url.href, 'http://example.com/', 'url.href does not have ?'); + assert_equals(url.search, '', 'url.search does not have ?'); +}, 'Deleting all params removes ? from URL'); + +test(function() { + var url = new URL('http://example.com/?'); + url.searchParams.delete('param1'); + assert_equals(url.href, 'http://example.com/', 'url.href does not have ?'); + assert_equals(url.search, '', 'url.search does not have ?'); +}, 'Removing non-existent param removes ? from URL'); +/* eslint-enable */ + +// Tests below are not from WPT. +{ + const params = new URLSearchParams(); + assert.throws(() => { + params.delete.call(undefined); + }, /^TypeError: Value of "this" must be of type URLSearchParams$/); + assert.throws(() => { + params.delete(); + }, /^TypeError: The "name" argument must be specified$/); + + const obj = { + toString() { throw new Error('toString'); }, + valueOf() { throw new Error('valueOf'); } + }; + const sym = Symbol(); + assert.throws(() => params.delete(obj), /^Error: toString$/); + assert.throws(() => params.delete(sym), + /^TypeError: Cannot convert a Symbol value to a string$/); +} + +// https://github.com/nodejs/node/issues/10480 +// Emptying searchParams should correctly update url's query +{ + const url = new URL('http://domain?var=1&var=2&var=3'); + for (const param of url.searchParams.keys()) { + url.searchParams.delete(param); + } + assert.strictEqual(url.searchParams.toString(), ''); + assert.strictEqual(url.search, ''); + assert.strictEqual(url.href, 'http://domain/'); +} diff --git a/test/parallel/test-whatwg-url-searchparams-entries.js b/test/parallel/test-whatwg-url-searchparams-entries.js new file mode 100644 index 00000000000000..4e73b92b517fd9 --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-entries.js @@ -0,0 +1,34 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URLSearchParams = require('url').URLSearchParams; + +// Tests below are not from WPT. +const params = new URLSearchParams('a=b&c=d'); +const entries = params.entries(); +assert.strictEqual(typeof entries[Symbol.iterator], 'function'); +assert.strictEqual(entries[Symbol.iterator](), entries); +assert.deepStrictEqual(entries.next(), { + value: ['a', 'b'], + done: false +}); +assert.deepStrictEqual(entries.next(), { + value: ['c', 'd'], + done: false +}); +assert.deepStrictEqual(entries.next(), { + value: undefined, + done: true +}); +assert.deepStrictEqual(entries.next(), { + value: undefined, + done: true +}); + +assert.throws(() => { + entries.next.call(undefined); +}, /^TypeError: Value of "this" must be of type URLSearchParamsIterator$/); +assert.throws(() => { + params.entries.call(undefined); +}, /^TypeError: Value of "this" must be of type URLSearchParams$/); diff --git a/test/parallel/test-whatwg-url-searchparams-foreach.js b/test/parallel/test-whatwg-url-searchparams-foreach.js new file mode 100644 index 00000000000000..06f21723a6cd2f --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-foreach.js @@ -0,0 +1,56 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const { URL, URLSearchParams } = require('url'); +const { test, assert_array_equals, assert_unreached } = + require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/a8b2b1e/url/urlsearchparams-foreach.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +var i; // Strict mode fix for WPT. +test(function() { + var params = new URLSearchParams('a=1&b=2&c=3'); + var keys = []; + var values = []; + params.forEach(function(value, key) { + keys.push(key); + values.push(value); + }); + assert_array_equals(keys, ['a', 'b', 'c']); + assert_array_equals(values, ['1', '2', '3']); +}, "ForEach Check"); + +test(function() { + let a = new URL("http://a.b/c?a=1&b=2&c=3&d=4"); + let b = a.searchParams; + var c = []; + for (i of b) { + a.search = "x=1&y=2&z=3"; + c.push(i); + } + assert_array_equals(c[0], ["a","1"]); + assert_array_equals(c[1], ["y","2"]); + assert_array_equals(c[2], ["z","3"]); +}, "For-of Check"); + +test(function() { + let a = new URL("http://a.b/c"); + let b = a.searchParams; + for (i of b) { + assert_unreached(i); + } +}, "empty"); +/* eslint-enable */ + +// Tests below are not from WPT. +{ + const params = new URLSearchParams(); + assert.throws(() => { + params.forEach.call(undefined); + }, /^TypeError: Value of "this" must be of type URLSearchParams$/); +} diff --git a/test/parallel/test-whatwg-url-searchparams-get.js b/test/parallel/test-whatwg-url-searchparams-get.js new file mode 100644 index 00000000000000..b096a69a6071a0 --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-get.js @@ -0,0 +1,55 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URLSearchParams = require('url').URLSearchParams; +const { test, assert_equals, assert_true } = require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/8791bed/url/urlsearchparams-get.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +test(function() { + var params = new URLSearchParams('a=b&c=d'); + assert_equals(params.get('a'), 'b'); + assert_equals(params.get('c'), 'd'); + assert_equals(params.get('e'), null); + params = new URLSearchParams('a=b&c=d&a=e'); + assert_equals(params.get('a'), 'b'); + params = new URLSearchParams('=b&c=d'); + assert_equals(params.get(''), 'b'); + params = new URLSearchParams('a=&c=d&a=e'); + assert_equals(params.get('a'), ''); +}, 'Get basics'); + +test(function() { + var params = new URLSearchParams('first=second&third&&'); + assert_true(params != null, 'constructor returned non-null value.'); + assert_true(params.has('first'), 'Search params object has name "first"'); + assert_equals(params.get('first'), 'second', 'Search params object has name "first" with value "second"'); + assert_equals(params.get('third'), '', 'Search params object has name "third" with the empty value.'); + assert_equals(params.get('fourth'), null, 'Search params object has no "fourth" name and value.'); +}, 'More get() basics'); +/* eslint-enable */ + +// Tests below are not from WPT. +{ + const params = new URLSearchParams(); + assert.throws(() => { + params.get.call(undefined); + }, /^TypeError: Value of "this" must be of type URLSearchParams$/); + assert.throws(() => { + params.get(); + }, /^TypeError: The "name" argument must be specified$/); + + const obj = { + toString() { throw new Error('toString'); }, + valueOf() { throw new Error('valueOf'); } + }; + const sym = Symbol(); + assert.throws(() => params.get(obj), /^Error: toString$/); + assert.throws(() => params.get(sym), + /^TypeError: Cannot convert a Symbol value to a string$/); +} diff --git a/test/parallel/test-whatwg-url-searchparams-getall.js b/test/parallel/test-whatwg-url-searchparams-getall.js new file mode 100644 index 00000000000000..acf5108459cf61 --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-getall.js @@ -0,0 +1,60 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URLSearchParams = require('url').URLSearchParams; +const { test, assert_equals, assert_true, assert_array_equals } = + require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/8791bed/url/urlsearchparams-getall.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +test(function() { + var params = new URLSearchParams('a=b&c=d'); + assert_array_equals(params.getAll('a'), ['b']); + assert_array_equals(params.getAll('c'), ['d']); + assert_array_equals(params.getAll('e'), []); + params = new URLSearchParams('a=b&c=d&a=e'); + assert_array_equals(params.getAll('a'), ['b', 'e']); + params = new URLSearchParams('=b&c=d'); + assert_array_equals(params.getAll(''), ['b']); + params = new URLSearchParams('a=&c=d&a=e'); + assert_array_equals(params.getAll('a'), ['', 'e']); +}, 'getAll() basics'); + +test(function() { + var params = new URLSearchParams('a=1&a=2&a=3&a'); + assert_true(params.has('a'), 'Search params object has name "a"'); + var matches = params.getAll('a'); + assert_true(matches && matches.length == 4, 'Search params object has values for name "a"'); + assert_array_equals(matches, ['1', '2', '3', ''], 'Search params object has expected name "a" values'); + params.set('a', 'one'); + assert_equals(params.get('a'), 'one', 'Search params object has name "a" with value "one"'); + var matches = params.getAll('a'); + assert_true(matches && matches.length == 1, 'Search params object has values for name "a"'); + assert_array_equals(matches, ['one'], 'Search params object has expected name "a" values'); +}, 'getAll() multiples'); +/* eslint-enable */ + +// Tests below are not from WPT. +{ + const params = new URLSearchParams(); + assert.throws(() => { + params.getAll.call(undefined); + }, /^TypeError: Value of "this" must be of type URLSearchParams$/); + assert.throws(() => { + params.getAll(); + }, /^TypeError: The "name" argument must be specified$/); + + const obj = { + toString() { throw new Error('toString'); }, + valueOf() { throw new Error('valueOf'); } + }; + const sym = Symbol(); + assert.throws(() => params.getAll(obj), /^Error: toString$/); + assert.throws(() => params.getAll(sym), + /^TypeError: Cannot convert a Symbol value to a string$/); +} diff --git a/test/parallel/test-whatwg-url-searchparams-has.js b/test/parallel/test-whatwg-url-searchparams-has.js new file mode 100644 index 00000000000000..0fdd88af64c5af --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-has.js @@ -0,0 +1,58 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URLSearchParams = require('url').URLSearchParams; +const { test, assert_false, assert_true } = require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/8791bed/url/urlsearchparams-has.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +test(function() { + var params = new URLSearchParams('a=b&c=d'); + assert_true(params.has('a')); + assert_true(params.has('c')); + assert_false(params.has('e')); + params = new URLSearchParams('a=b&c=d&a=e'); + assert_true(params.has('a')); + params = new URLSearchParams('=b&c=d'); + assert_true(params.has('')); + params = new URLSearchParams('null=a'); + assert_true(params.has(null)); +}, 'Has basics'); + +test(function() { + var params = new URLSearchParams('a=b&c=d&&'); + params.append('first', 1); + params.append('first', 2); + assert_true(params.has('a'), 'Search params object has name "a"'); + assert_true(params.has('c'), 'Search params object has name "c"'); + assert_true(params.has('first'), 'Search params object has name "first"'); + assert_false(params.has('d'), 'Search params object has no name "d"'); + params.delete('first'); + assert_false(params.has('first'), 'Search params object has no name "first"'); +}, 'has() following delete()'); +/* eslint-enable */ + +// Tests below are not from WPT. +{ + const params = new URLSearchParams(); + assert.throws(() => { + params.has.call(undefined); + }, /^TypeError: Value of "this" must be of type URLSearchParams$/); + assert.throws(() => { + params.has(); + }, /^TypeError: The "name" argument must be specified$/); + + const obj = { + toString() { throw new Error('toString'); }, + valueOf() { throw new Error('valueOf'); } + }; + const sym = Symbol(); + assert.throws(() => params.has(obj), /^Error: toString$/); + assert.throws(() => params.has(sym), + /^TypeError: Cannot convert a Symbol value to a string$/); +} diff --git a/test/parallel/test-whatwg-url-searchparams-inspect.js b/test/parallel/test-whatwg-url-searchparams-inspect.js new file mode 100644 index 00000000000000..163fa185ede58d --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-inspect.js @@ -0,0 +1,29 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const util = require('util'); +const URLSearchParams = require('url').URLSearchParams; + +// Tests below are not from WPT. +const sp = new URLSearchParams('?a=a&b=b&b=c'); +assert.strictEqual(util.inspect(sp), + "URLSearchParams { 'a' => 'a', 'b' => 'b', 'b' => 'c' }"); +assert.strictEqual(util.inspect(sp.keys()), + "URLSearchParamsIterator { 'a', 'b', 'b' }"); +assert.strictEqual(util.inspect(sp.values()), + "URLSearchParamsIterator { 'a', 'b', 'c' }"); +assert.strictEqual(util.inspect(sp.keys(), { breakLength: 1 }), + "URLSearchParamsIterator {\n 'a',\n 'b',\n 'b' }"); + +const iterator = sp.entries(); +assert.strictEqual(util.inspect(iterator), + "URLSearchParamsIterator { [ 'a', 'a' ], [ 'b', 'b' ], " + + "[ 'b', 'c' ] }"); +iterator.next(); +assert.strictEqual(util.inspect(iterator), + "URLSearchParamsIterator { [ 'b', 'b' ], [ 'b', 'c' ] }"); +iterator.next(); +iterator.next(); +assert.strictEqual(util.inspect(iterator), + 'URLSearchParamsIterator { }'); diff --git a/test/parallel/test-whatwg-url-searchparams-keys.js b/test/parallel/test-whatwg-url-searchparams-keys.js new file mode 100644 index 00000000000000..af044a260874ac --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-keys.js @@ -0,0 +1,35 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URLSearchParams = require('url').URLSearchParams; + +// Tests below are not from WPT. +const params = new URLSearchParams('a=b&c=d'); +const keys = params.keys(); + +assert.strictEqual(typeof keys[Symbol.iterator], 'function'); +assert.strictEqual(keys[Symbol.iterator](), keys); +assert.deepStrictEqual(keys.next(), { + value: 'a', + done: false +}); +assert.deepStrictEqual(keys.next(), { + value: 'c', + done: false +}); +assert.deepStrictEqual(keys.next(), { + value: undefined, + done: true +}); +assert.deepStrictEqual(keys.next(), { + value: undefined, + done: true +}); + +assert.throws(() => { + keys.next.call(undefined); +}, /^TypeError: Value of "this" must be of type URLSearchParamsIterator$/); +assert.throws(() => { + params.keys.call(undefined); +}, /^TypeError: Value of "this" must be of type URLSearchParams$/); diff --git a/test/parallel/test-whatwg-url-searchparams-set.js b/test/parallel/test-whatwg-url-searchparams-set.js new file mode 100644 index 00000000000000..8a6c31bbe66487 --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-set.js @@ -0,0 +1,59 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URLSearchParams = require('url').URLSearchParams; +const { test, assert_equals, assert_true } = require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/8791bed/url/urlsearchparams-set.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +test(function() { + var params = new URLSearchParams('a=b&c=d'); + params.set('a', 'B'); + assert_equals(params + '', 'a=B&c=d'); + params = new URLSearchParams('a=b&c=d&a=e'); + params.set('a', 'B'); + assert_equals(params + '', 'a=B&c=d') + params.set('e', 'f'); + assert_equals(params + '', 'a=B&c=d&e=f') +}, 'Set basics'); + +test(function() { + var params = new URLSearchParams('a=1&a=2&a=3'); + assert_true(params.has('a'), 'Search params object has name "a"'); + assert_equals(params.get('a'), '1', 'Search params object has name "a" with value "1"'); + params.set('first', 4); + assert_true(params.has('a'), 'Search params object has name "a"'); + assert_equals(params.get('a'), '1', 'Search params object has name "a" with value "1"'); + params.set('a', 4); + assert_true(params.has('a'), 'Search params object has name "a"'); + assert_equals(params.get('a'), '4', 'Search params object has name "a" with value "4"'); +}, 'URLSearchParams.set'); +/* eslint-enable */ + +// Tests below are not from WPT. +{ + const params = new URLSearchParams(); + assert.throws(() => { + params.set.call(undefined); + }, /^TypeError: Value of "this" must be of type URLSearchParams$/); + assert.throws(() => { + params.set('a'); + }, /^TypeError: The "name" and "value" arguments must be specified$/); + + const obj = { + toString() { throw new Error('toString'); }, + valueOf() { throw new Error('valueOf'); } + }; + const sym = Symbol(); + assert.throws(() => params.append(obj, 'b'), /^Error: toString$/); + assert.throws(() => params.append('a', obj), /^Error: toString$/); + assert.throws(() => params.append(sym, 'b'), + /^TypeError: Cannot convert a Symbol value to a string$/); + assert.throws(() => params.append('a', sym), + /^TypeError: Cannot convert a Symbol value to a string$/); +} diff --git a/test/parallel/test-whatwg-url-searchparams-sort.js b/test/parallel/test-whatwg-url-searchparams-sort.js new file mode 100644 index 00000000000000..1122f08dcc0434 --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-sort.js @@ -0,0 +1,105 @@ +'use strict'; + +require('../common'); +const { URL, URLSearchParams } = require('url'); +const { test, assert_equals, assert_array_equals } = require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/70a0898763/url/urlsearchparams-sort.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +[ + { + "input": "z=b&a=b&z=a&a=a", + "output": [["a", "b"], ["a", "a"], ["z", "b"], ["z", "a"]] + }, + { + "input": "\uFFFD=x&\uFFFC&\uFFFD=a", + "output": [["\uFFFC", ""], ["\uFFFD", "x"], ["\uFFFD", "a"]] + }, + { + "input": "ffi&🌈", // 🌈 > code point, but < code unit because two code units + "output": [["🌈", ""], ["ffi", ""]] + }, + { + "input": "é&e\uFFFD&e\u0301", + "output": [["e\u0301", ""], ["e\uFFFD", ""], ["é", ""]] + }, + { + "input": "z=z&a=a&z=y&a=b&z=x&a=c&z=w&a=d&z=v&a=e&z=u&a=f&z=t&a=g", + "output": [["a", "a"], ["a", "b"], ["a", "c"], ["a", "d"], ["a", "e"], ["a", "f"], ["a", "g"], ["z", "z"], ["z", "y"], ["z", "x"], ["z", "w"], ["z", "v"], ["z", "u"], ["z", "t"]] + } +].forEach((val) => { + test(() => { + let params = new URLSearchParams(val.input), + i = 0 + params.sort() + for(let param of params) { + assert_array_equals(param, val.output[i]) + i++ + } + }, `Parse and sort: ${val.input}`) + + test(() => { + let url = new URL(`?${val.input}`, "https://example/") + url.searchParams.sort() + let params = new URLSearchParams(url.search), + i = 0 + for(let param of params) { + assert_array_equals(param, val.output[i]) + i++ + } + }, `URL parse and sort: ${val.input}`) +}) + +test(function() { + const url = new URL("http://example.com/?") + url.searchParams.sort() + assert_equals(url.href, "http://example.com/") + assert_equals(url.search, "") +}, "Sorting non-existent params removes ? from URL") +/* eslint-enable */ + +// Tests below are not from WPT. + +// Test bottom-up iterative stable merge sort +const tests = [{ input: '', output: [] }]; +const pairs = []; +for (let i = 10; i < 100; i++) { + pairs.push([`a${i}`, 'b']); + tests[0].output.push([`a${i}`, 'b']); +} +tests[0].input = pairs.sort(() => Math.random() > 0.5) + .map((pair) => pair.join('=')).join('&'); + +tests.push( + { + 'input': 'z=a&=b&c=d', + 'output': [['', 'b'], ['c', 'd'], ['z', 'a']] + } +); + +tests.forEach((val) => { + test(() => { + const params = new URLSearchParams(val.input); + let i = 0; + params.sort(); + for (const param of params) { + assert_array_equals(param, val.output[i]); + i++; + } + }, `Parse and sort: ${val.input}`); + + test(() => { + const url = new URL(`?${val.input}`, 'https://example/'); + url.searchParams.sort(); + const params = new URLSearchParams(url.search); + let i = 0; + for (const param of params) { + assert_array_equals(param, val.output[i]); + i++; + } + }, `URL parse and sort: ${val.input}`); +}); diff --git a/test/parallel/test-whatwg-url-searchparams-stringifier.js b/test/parallel/test-whatwg-url-searchparams-stringifier.js new file mode 100644 index 00000000000000..c355a2c9a9c29c --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-stringifier.js @@ -0,0 +1,132 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URLSearchParams = require('url').URLSearchParams; +const { test, assert_equals } = require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/8791bed/url/urlsearchparams-stringifier.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +test(function() { + var params = new URLSearchParams(); + params.append('a', 'b c'); + assert_equals(params + '', 'a=b+c'); + params.delete('a'); + params.append('a b', 'c'); + assert_equals(params + '', 'a+b=c'); +}, 'Serialize space'); + +test(function() { + var params = new URLSearchParams(); + params.append('a', ''); + assert_equals(params + '', 'a='); + params.append('a', ''); + assert_equals(params + '', 'a=&a='); + params.append('', 'b'); + assert_equals(params + '', 'a=&a=&=b'); + params.append('', ''); + assert_equals(params + '', 'a=&a=&=b&='); + params.append('', ''); + assert_equals(params + '', 'a=&a=&=b&=&='); +}, 'Serialize empty value'); + +test(function() { + var params = new URLSearchParams(); + params.append('', 'b'); + assert_equals(params + '', '=b'); + params.append('', 'b'); + assert_equals(params + '', '=b&=b'); +}, 'Serialize empty name'); + +test(function() { + var params = new URLSearchParams(); + params.append('', ''); + assert_equals(params + '', '='); + params.append('', ''); + assert_equals(params + '', '=&='); +}, 'Serialize empty name and value'); + +test(function() { + var params = new URLSearchParams(); + params.append('a', 'b+c'); + assert_equals(params + '', 'a=b%2Bc'); + params.delete('a'); + params.append('a+b', 'c'); + assert_equals(params + '', 'a%2Bb=c'); +}, 'Serialize +'); + +test(function() { + var params = new URLSearchParams(); + params.append('=', 'a'); + assert_equals(params + '', '%3D=a'); + params.append('b', '='); + assert_equals(params + '', '%3D=a&b=%3D'); +}, 'Serialize ='); + +test(function() { + var params = new URLSearchParams(); + params.append('&', 'a'); + assert_equals(params + '', '%26=a'); + params.append('b', '&'); + assert_equals(params + '', '%26=a&b=%26'); +}, 'Serialize &'); + +test(function() { + var params = new URLSearchParams(); + params.append('a', '*-._'); + assert_equals(params + '', 'a=*-._'); + params.delete('a'); + params.append('*-._', 'c'); + assert_equals(params + '', '*-._=c'); +}, 'Serialize *-._'); + +test(function() { + var params = new URLSearchParams(); + params.append('a', 'b%c'); + assert_equals(params + '', 'a=b%25c'); + params.delete('a'); + params.append('a%b', 'c'); + assert_equals(params + '', 'a%25b=c'); +}, 'Serialize %'); + +test(function() { + var params = new URLSearchParams(); + params.append('a', 'b\0c'); + assert_equals(params + '', 'a=b%00c'); + params.delete('a'); + params.append('a\0b', 'c'); + assert_equals(params + '', 'a%00b=c'); +}, 'Serialize \\0'); + +test(function() { + var params = new URLSearchParams(); + params.append('a', 'b\uD83D\uDCA9c'); + assert_equals(params + '', 'a=b%F0%9F%92%A9c'); + params.delete('a'); + params.append('a\uD83D\uDCA9b', 'c'); + assert_equals(params + '', 'a%F0%9F%92%A9b=c'); +}, 'Serialize \uD83D\uDCA9'); // Unicode Character 'PILE OF POO' (U+1F4A9) + +test(function() { + var params; + params = new URLSearchParams('a=b&c=d&&e&&'); + assert_equals(params.toString(), 'a=b&c=d&e='); + params = new URLSearchParams('a = b &a=b&c=d%20'); + assert_equals(params.toString(), 'a+=+b+&a=b&c=d+'); + // The lone '=' _does_ survive the roundtrip. + params = new URLSearchParams('a=&a=b'); + assert_equals(params.toString(), 'a=&a=b'); +}, 'URLSearchParams.toString'); +/* eslint-enable */ + +// Tests below are not from WPT. +{ + const params = new URLSearchParams(); + assert.throws(() => { + params.toString.call(undefined); + }, /^TypeError: Value of "this" must be of type URLSearchParams$/); +} diff --git a/test/parallel/test-whatwg-url-searchparams-values.js b/test/parallel/test-whatwg-url-searchparams-values.js new file mode 100644 index 00000000000000..2775231b8bda5d --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams-values.js @@ -0,0 +1,35 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URLSearchParams = require('url').URLSearchParams; + +// Tests below are not from WPT. +const params = new URLSearchParams('a=b&c=d'); +const values = params.values(); + +assert.strictEqual(typeof values[Symbol.iterator], 'function'); +assert.strictEqual(values[Symbol.iterator](), values); +assert.deepStrictEqual(values.next(), { + value: 'b', + done: false +}); +assert.deepStrictEqual(values.next(), { + value: 'd', + done: false +}); +assert.deepStrictEqual(values.next(), { + value: undefined, + done: true +}); +assert.deepStrictEqual(values.next(), { + value: undefined, + done: true +}); + +assert.throws(() => { + values.next.call(undefined); +}, /^TypeError: Value of "this" must be of type URLSearchParamsIterator$/); +assert.throws(() => { + params.values.call(undefined); +}, /^TypeError: Value of "this" must be of type URLSearchParams$/); diff --git a/test/parallel/test-whatwg-url-searchparams.js b/test/parallel/test-whatwg-url-searchparams.js new file mode 100644 index 00000000000000..b6861273e71a0e --- /dev/null +++ b/test/parallel/test-whatwg-url-searchparams.js @@ -0,0 +1,106 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const { URL, URLSearchParams } = require('url'); +const fixtures = require('../common/fixtures'); + +// Tests below are not from WPT. +const serialized = 'a=a&a=1&a=true&a=undefined&a=null&a=%EF%BF%BD' + + '&a=%EF%BF%BD&a=%F0%9F%98%80&a=%EF%BF%BD%EF%BF%BD' + + '&a=%5Bobject+Object%5D'; +const values = ['a', 1, true, undefined, null, '\uD83D', '\uDE00', + '\uD83D\uDE00', '\uDE00\uD83D', {}]; +const normalizedValues = ['a', '1', 'true', 'undefined', 'null', '\uFFFD', + '\uFFFD', '\uD83D\uDE00', '\uFFFD\uFFFD', + '[object Object]']; + +const m = new URL('http://example.org'); +const sp = m.searchParams; + +assert(sp); +assert.strictEqual(sp.toString(), ''); +assert.strictEqual(m.search, ''); + +assert(!sp.has('a')); +values.forEach((i) => sp.set('a', i)); +assert(sp.has('a')); +assert.strictEqual(sp.get('a'), '[object Object]'); +sp.delete('a'); +assert(!sp.has('a')); + +m.search = ''; +assert.strictEqual(sp.toString(), ''); + +values.forEach((i) => sp.append('a', i)); +assert(sp.has('a')); +assert.strictEqual(sp.getAll('a').length, values.length); +assert.strictEqual(sp.get('a'), 'a'); + +assert.strictEqual(sp.toString(), serialized); + +assert.strictEqual(m.search, `?${serialized}`); + +assert.strictEqual(sp[Symbol.iterator], sp.entries); + +let key, val; +let n = 0; +for ([key, val] of sp) { + assert.strictEqual(key, 'a', n); + assert.strictEqual(val, normalizedValues[n], n); + n++; +} +n = 0; +for (key of sp.keys()) { + assert.strictEqual(key, 'a', n); + n++; +} +n = 0; +for (val of sp.values()) { + assert.strictEqual(val, normalizedValues[n], n); + n++; +} +n = 0; +sp.forEach(function(val, key, obj) { + assert.strictEqual(this, undefined, n); + assert.strictEqual(key, 'a', n); + assert.strictEqual(val, normalizedValues[n], n); + assert.strictEqual(obj, sp, n); + n++; +}); +sp.forEach(function() { + assert.strictEqual(this, m); +}, m); + +{ + const callbackErr = /^TypeError: Callback must be a function$/; + assert.throws(() => sp.forEach(), callbackErr); + assert.throws(() => sp.forEach(1), callbackErr); +} + +m.search = '?a=a&b=b'; +assert.strictEqual(sp.toString(), 'a=a&b=b'); + +const tests = require(fixtures.path('url-searchparams.js')); + +for (const [input, expected, parsed] of tests) { + if (input[0] !== '?') { + const sp = new URLSearchParams(input); + assert.strictEqual(String(sp), expected); + assert.deepStrictEqual(Array.from(sp), parsed); + + m.search = input; + assert.strictEqual(String(m.searchParams), expected); + assert.deepStrictEqual(Array.from(m.searchParams), parsed); + } + + { + const sp = new URLSearchParams(`?${input}`); + assert.strictEqual(String(sp), expected); + assert.deepStrictEqual(Array.from(sp), parsed); + + m.search = `?${input}`; + assert.strictEqual(String(m.searchParams), expected); + assert.deepStrictEqual(Array.from(m.searchParams), parsed); + } +} diff --git a/test/parallel/test-whatwg-url-setters.js b/test/parallel/test-whatwg-url-setters.js new file mode 100644 index 00000000000000..9a25de59e7e55f --- /dev/null +++ b/test/parallel/test-whatwg-url-setters.js @@ -0,0 +1,126 @@ +'use strict'; + +const common = require('../common'); +if (!common.hasIntl) { + // A handful of the tests fail when ICU is not included. + common.skip('missing Intl'); +} + +const assert = require('assert'); +const URL = require('url').URL; +const { test, assert_equals } = require('../common/wpt'); +const fixtures = require('../common/fixtures'); + +const additionalTestCases = + require(fixtures.path('url-setter-tests-additional.js')); + +const request = { + response: require(fixtures.path('url-setter-tests')) +}; + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/8791bed/url/url-setters.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +function startURLSettersTests() { +// var setup = async_test("Loading data…") +// setup.step(function() { +// var request = new XMLHttpRequest() +// request.open("GET", "setters_tests.json") +// request.send() +// request.responseType = "json" +// request.onload = setup.step_func(function() { + runURLSettersTests(request.response) +// setup.done() +// }) +// }) +} + +function runURLSettersTests(all_test_cases) { + for (var attribute_to_be_set in all_test_cases) { + if (attribute_to_be_set == "comment") { + continue; + } + var test_cases = all_test_cases[attribute_to_be_set]; + for(var i = 0, l = test_cases.length; i < l; i++) { + var test_case = test_cases[i]; + var name = `Setting <${test_case.href}>.${attribute_to_be_set}` + + ` = '${test_case.new_value}'`; + if ("comment" in test_case) { + name += ` ${test_case.comment}`; + } + test(function() { + var url = new URL(test_case.href); + url[attribute_to_be_set] = test_case.new_value; + for (var attribute in test_case.expected) { + assert_equals(url[attribute], test_case.expected[attribute]) + } + }, `URL: ${name}`); + // test(function() { + // var url = document.createElement("a"); + // url.href = test_case.href; + // url[attribute_to_be_set] = test_case.new_value; + // for (var attribute in test_case.expected) { + // assert_equals(url[attribute], test_case.expected[attribute]) + // } + // }, ": " + name) + // test(function() { + // var url = document.createElement("area"); + // url.href = test_case.href; + // url[attribute_to_be_set] = test_case.new_value; + // for (var attribute in test_case.expected) { + // assert_equals(url[attribute], test_case.expected[attribute]) + // } + // }, ": " + name) + } + } +} + +startURLSettersTests() +/* eslint-enable */ + +// Tests below are not from WPT. + +{ + for (const attributeToBeSet in additionalTestCases) { + if (attributeToBeSet === 'comment') { + continue; + } + const testCases = additionalTestCases[attributeToBeSet]; + for (const testCase of testCases) { + let name = `Setting <${testCase.href}>.${attributeToBeSet}` + + ` = "${testCase.new_value}"`; + if ('comment' in testCase) { + name += ` ${testCase.comment}`; + } + test(function() { + const url = new URL(testCase.href); + url[attributeToBeSet] = testCase.new_value; + for (const attribute in testCase.expected) { + assert_equals(url[attribute], testCase.expected[attribute]); + } + }, `URL: ${name}`); + } + } +} + +{ + const url = new URL('http://example.com/'); + const obj = { + toString() { throw new Error('toString'); }, + valueOf() { throw new Error('valueOf'); } + }; + const sym = Symbol(); + for (const name of Reflect.ownKeys(Object.getPrototypeOf(url))) { + if (Object.getOwnPropertyDescriptor(Object.getPrototypeOf(url), name).set) { + assert.throws(() => url[name] = obj, + /^Error: toString$/, + `url.${name} = { toString() { throw ... } }`); + assert.throws(() => url[name] = sym, + /^TypeError: Cannot convert a Symbol value to a string$/, + `url.${name} = ${String(sym)}`); + } + } +} diff --git a/test/parallel/test-whatwg-url-toascii.js b/test/parallel/test-whatwg-url-toascii.js new file mode 100644 index 00000000000000..c85b092c1d250c --- /dev/null +++ b/test/parallel/test-whatwg-url-toascii.js @@ -0,0 +1,85 @@ +'use strict'; +const common = require('../common'); +if (!common.hasIntl) { + // A handful of the tests fail when ICU is not included. + common.skip('missing Intl'); +} + +const fixtures = require('../common/fixtures'); +const { URL } = require('url'); +const { test, assert_equals, assert_throws } = require('../common/wpt'); + +const request = { + response: require(fixtures.path('url-toascii')) +}; + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/4839a0a804/url/toascii.window.js + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +// async_test(t => { +// const request = new XMLHttpRequest() +// request.open("GET", "toascii.json") +// request.send() +// request.responseType = "json" +// request.onload = t.step_func_done(() => { + runTests(request.response) +// }) +// }, "Loading data…") + +function makeURL(type, input) { + input = "https://" + input + "/x" + if(type === "url") { + return new URL(input) + } else { + const url = document.createElement(type) + url.href = input + return url + } +} + +function runTests(tests) { + for(var i = 0, l = tests.length; i < l; i++) { + let hostTest = tests[i] + if (typeof hostTest === "string") { + continue // skip comments + } + const typeName = { "url": "URL", "a": "", "area": "" } + // ;["url", "a", "area"].forEach((type) => { + ;["url"].forEach((type) => { + test(() => { + if(hostTest.output !== null) { + const url = makeURL("url", hostTest.input) + assert_equals(url.host, hostTest.output) + assert_equals(url.hostname, hostTest.output) + assert_equals(url.pathname, "/x") + assert_equals(url.href, "https://" + hostTest.output + "/x") + } else { + if(type === "url") { + assert_throws(new TypeError, () => makeURL("url", hostTest.input)) + } else { + const url = makeURL(type, hostTest.input) + assert_equals(url.host, "") + assert_equals(url.hostname, "") + assert_equals(url.pathname, "") + assert_equals(url.href, "https://" + hostTest.input + "/x") + } + } + }, hostTest.input + " (using " + typeName[type] + ")") + ;["host", "hostname"].forEach((val) => { + test(() => { + const url = makeURL(type, "x") + url[val] = hostTest.input + if(hostTest.output !== null) { + assert_equals(url[val], hostTest.output) + } else { + assert_equals(url[val], "x") + } + }, hostTest.input + " (using " + typeName[type] + "." + val + ")") + }) + }) + } +} +/* eslint-enable */ diff --git a/test/parallel/test-whatwg-url-tojson.js b/test/parallel/test-whatwg-url-tojson.js new file mode 100644 index 00000000000000..8e9a30c7e017e4 --- /dev/null +++ b/test/parallel/test-whatwg-url-tojson.js @@ -0,0 +1,17 @@ +'use strict'; + +require('../common'); +const URL = require('url').URL; +const { test, assert_equals } = require('../common/wpt'); + +/* The following tests are copied from WPT. Modifications to them should be + upstreamed first. Refs: + https://github.com/w3c/web-platform-tests/blob/02585db/url/url-tojson.html + License: http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html +*/ +/* eslint-disable */ +test(() => { + const a = new URL("https://example.com/") + assert_equals(JSON.stringify(a), "\"https://example.com/\"") +}) +/* eslint-enable */ diff --git a/test/parallel/test-whatwg-url-tostringtag.js b/test/parallel/test-whatwg-url-tostringtag.js new file mode 100644 index 00000000000000..689056fd238dda --- /dev/null +++ b/test/parallel/test-whatwg-url-tostringtag.js @@ -0,0 +1,32 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const URL = require('url').URL; + +// Tests below are not from WPT. +const toString = Object.prototype.toString; + +const url = new URL('http://example.org'); +const sp = url.searchParams; +const spIterator = sp.entries(); + +const test = [ + [url, 'URL'], + [sp, 'URLSearchParams'], + [spIterator, 'URLSearchParamsIterator'], + // Web IDL spec says we have to return 'URLPrototype', but it is too + // expensive to implement; therefore, use Chrome's behavior for now, until + // spec is changed. + [Object.getPrototypeOf(url), 'URL'], + [Object.getPrototypeOf(sp), 'URLSearchParams'], + [Object.getPrototypeOf(spIterator), 'URLSearchParamsIterator'], +]; + +test.forEach(([obj, expected]) => { + assert.strictEqual(obj[Symbol.toStringTag], expected, + `${obj[Symbol.toStringTag]} !== ${expected}`); + const str = toString.call(obj); + assert.strictEqual(str, `[object ${expected}]`, + `${str} !== [object ${expected}]`); +}); diff --git a/tools/doc/type-parser.js b/tools/doc/type-parser.js index c2bca80641152e..ee50d48f61d45e 100644 --- a/tools/doc/type-parser.js +++ b/tools/doc/type-parser.js @@ -38,6 +38,8 @@ const typeMap = { 'http.IncomingMessage': 'http.html#http_class_http_incomingmessage', 'http.Server': 'http.html#http_class_http_server', 'http.ServerResponse': 'http.html#http_class_http_serverresponse', + 'URL': 'url.html#url_the_whatwg_url_api', + 'URLSearchParams': 'url.html#url_class_urlsearchparams' }; const arrayPart = /(?:\[])+$/; From 3e7f0fc0e1a91767f175152f780e4a12b1e79ee9 Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Mon, 19 Jun 2017 16:19:55 +0800 Subject: [PATCH 23/31] promises: more robust stringification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backport-PR-URL: https://github.com/nodejs/node/pull/17833 PR-URL: https://github.com/nodejs/node/pull/13784 Fixes: https://github.com/nodejs/node/issues/13771 Reviewed-By: Anna Henningsen Reviewed-By: Rod Vagg Reviewed-By: Michaël Zasso Reviewed-By: Matteo Collina Reviewed-By: Ruben Bridgewater Reviewed-By: Colin Ihrig Reviewed-By: Benjamin Gruenbaum Reviewed-By: James M Snell --- lib/internal/process/promises.js | 15 ++++++--- src/node_util.cc | 7 +++++ ...est-promises-unhandled-proxy-rejections.js | 31 +++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 test/parallel/test-promises-unhandled-proxy-rejections.js diff --git a/lib/internal/process/promises.js b/lib/internal/process/promises.js index d976b9d38a9050..54a3ff41ec40c1 100644 --- a/lib/internal/process/promises.js +++ b/lib/internal/process/promises.js @@ -1,5 +1,7 @@ 'use strict'; +const { safeToString } = process.binding('util'); + const promiseRejectEvent = process._promiseRejectEvent; const hasBeenNotifiedProperty = new WeakMap(); const promiseToGuidProperty = new WeakMap(); @@ -64,12 +66,17 @@ function setupPromises(scheduleMicrotasks) { hasBeenNotifiedProperty.set(promise, true); const uid = promiseToGuidProperty.get(promise); if (!process.emit('unhandledRejection', reason, promise)) { - const warning = new Error('Unhandled promise rejection ' + - `(rejection id: ${uid}): ${reason}`); + const warning = new Error( + `Unhandled promise rejection (rejection id: ${uid}): ` + + safeToString(reason)); warning.name = 'UnhandledPromiseRejectionWarning'; warning.id = uid; - if (reason instanceof Error) { - warning.stack = reason.stack; + try { + if (reason instanceof Error) { + warning.stack = reason.stack; + } + } catch (err) { + // ignored } process.emitWarning(warning); } else { diff --git a/src/node_util.cc b/src/node_util.cc index f96e91483857c7..8b093ab842869d 100644 --- a/src/node_util.cc +++ b/src/node_util.cc @@ -54,6 +54,12 @@ static void GetProxyDetails(const FunctionCallbackInfo& args) { args.GetReturnValue().Set(ret); } +// Side effect-free stringification that will never throw exceptions. +static void SafeToString(const FunctionCallbackInfo& args) { + auto context = args.GetIsolate()->GetCurrentContext(); + args.GetReturnValue().Set(args[0]->ToDetailString(context).ToLocalChecked()); +} + static void GetHiddenValue(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); @@ -122,6 +128,7 @@ void Initialize(Local target, env->SetMethod(target, "getHiddenValue", GetHiddenValue); env->SetMethod(target, "setHiddenValue", SetHiddenValue); env->SetMethod(target, "getProxyDetails", GetProxyDetails); + env->SetMethod(target, "safeToString", SafeToString); env->SetMethod(target, "startSigintWatchdog", StartSigintWatchdog); env->SetMethod(target, "stopSigintWatchdog", StopSigintWatchdog); diff --git a/test/parallel/test-promises-unhandled-proxy-rejections.js b/test/parallel/test-promises-unhandled-proxy-rejections.js new file mode 100644 index 00000000000000..9c3f364de2e53b --- /dev/null +++ b/test/parallel/test-promises-unhandled-proxy-rejections.js @@ -0,0 +1,31 @@ +'use strict'; +const common = require('../common'); + +const expectedPromiseWarning = 'Unhandled promise rejection (rejection id: ' + + '1): [object Object]'; + +function throwErr() { + throw new Error('Error from proxy'); +} + +const thorny = new Proxy({}, { + getPrototypeOf: throwErr, + setPrototypeOf: throwErr, + isExtensible: throwErr, + preventExtensions: throwErr, + getOwnPropertyDescriptor: throwErr, + defineProperty: throwErr, + has: throwErr, + get: throwErr, + set: throwErr, + deleteProperty: throwErr, + ownKeys: throwErr, + apply: throwErr, + construct: throwErr +}); + +common.expectWarning('UnhandledPromiseRejectionWarning', + expectedPromiseWarning); + +// ensure this doesn't crash +Promise.reject(thorny); From f374d609d19eea8b823ef3bbc6fa1175bef52fb0 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Wed, 29 Mar 2017 07:36:55 +0200 Subject: [PATCH 24/31] test: fix truncation of argv Currently argv_[1] and argv_[2] are getting truncated by one character because of an incorrect addition of one to account for the null character. I only noticed this when working on #12087, but that fix will probably not get included in favor of a JavaScript test so I'm adding this separate commit for it. Refs: https://github.com/nodejs/node/pull/12087 Backport-PR-URL: https://github.com/nodejs/node/pull/18113 PR-URL: https://github.com/nodejs/node/pull/12110 Reviewed-By: Richard Lau Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Gibson Fahnestock --- test/cctest/node_test_fixture.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cctest/node_test_fixture.h b/test/cctest/node_test_fixture.h index e32e7e6dc6b3ba..5460a26e3764ad 100644 --- a/test/cctest/node_test_fixture.h +++ b/test/cctest/node_test_fixture.h @@ -34,8 +34,8 @@ struct Argv { snprintf(argv_[0], prog_len, "%s", prog); snprintf(argv_[0] + prog_len, arg1_len, "%s", arg1); snprintf(argv_[0] + prog_len + arg1_len, arg2_len, "%s", arg2); - argv_[1] = argv_[0] + prog_len + 1; - argv_[2] = argv_[0] + prog_len + arg1_len + 1; + argv_[1] = argv_[0] + prog_len; + argv_[2] = argv_[0] + prog_len + arg1_len; } ~Argv() { From b8e561e7c9ab5a292112ed0d0026e0a3fb8fe733 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Mon, 15 Jan 2018 23:44:53 +0000 Subject: [PATCH 25/31] http: overridable keep-alive behavior of `Agent` Introduce two overridable `Agent` methods: * `keepSocketAlive(socket)` * `reuseSocket(socket, req)` These methods can be overridden by particular `Agent` class child to make keep-alive behavior customizable. Motivation: destroy persisted sockets after some configurable timeout. It is very non-trivial to do it with available primitives. Such program will most likely need to poke with undocumented events and methods of `Agent`. With introduced API such behavior is easy to implement. Backport-PR-URL: https://github.com/nodejs/node/pull/18168 PR-URL: https://github.com/nodejs/node/pull/13005 Reviewed-By: Matteo Collina Reviewed-By: Refael Ackermann Reviewed-By: Colin Ihrig Reviewed-By: Brian White Reviewed-By: Michael Dawson --- doc/api/http.md | 36 ++++++++++ lib/_http_agent.js | 24 +++++-- test/parallel/test-http-keepalive-override.js | 67 +++++++++++++++++++ 3 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 test/parallel/test-http-keepalive-override.js diff --git a/doc/api/http.md b/doc/api/http.md index fac7798071eee1..d956c9e23d4be9 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -159,6 +159,42 @@ socket/stream from this function, or by passing the socket/stream to `callback`. `callback` has a signature of `(err, stream)`. +### agent.keepSocketAlive(socket) + + +* `socket` {net.Socket} + +Called when `socket` is detached from a request and could be persisted by the +Agent. Default behavior is to: + +```js +socket.unref(); +socket.setKeepAlive(agent.keepAliveMsecs); +``` + +This method can be overridden by a particular `Agent` subclass. If this +method returns a falsy value, the socket will be destroyed instead of persisting +it for use with the next request. + +### agent.reuseSocket(socket, request) + + +* `socket` {net.Socket} +* `request` {http.ClientRequest} + +Called when `socket` is attached to `request` after being persisted because of +the keep-alive options. Default behavior is to: + +```js +socket.ref(); +``` + +This method can be overridden by a particular `Agent` subclass. + ### agent.destroy() + +* {Object} + +Provides general utility methods when interacting with instances of +`Module` -- the `module` variable often seen in file modules. Accessed +via `require('module')`. + +### module.builtinModules + + +* {string[]} + +A list of the names of all modules provided by Node.js. Can be used to verify +if a module is maintained by a third-party module or not. + +[`__dirname`]: #modules_dirname +[`__filename`]: #modules_filename [`Error`]: errors.html#errors_class_error [module resolution]: #modules_all_together diff --git a/lib/module.js b/lib/module.js index 537a2dcafb31d0..3b258f051bd4ca 100644 --- a/lib/module.js +++ b/lib/module.js @@ -48,9 +48,16 @@ function Module(id, parent) { } module.exports = Module; +const builtinModules = Object.keys(NativeModule._source) + .filter(NativeModule.nonInternalExists); + +Object.freeze(builtinModules); +Module.builtinModules = builtinModules; + Module._cache = {}; Module._pathCache = {}; Module._extensions = {}; + var modulePaths = []; Module.globalPaths = []; diff --git a/test/parallel/test-module-builtin.js b/test/parallel/test-module-builtin.js new file mode 100644 index 00000000000000..3897d71ecf4405 --- /dev/null +++ b/test/parallel/test-module-builtin.js @@ -0,0 +1,14 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const { builtinModules } = require('module'); + +// Includes modules in lib/ (even deprecated ones) +assert(builtinModules.includes('http')); +assert(builtinModules.includes('sys')); + +// Does not include internal modules +assert.deepStrictEqual( + builtinModules.filter((mod) => mod.startsWith('internal/')), + [] +); From 9f571ef77b59501cd420a67061816bc207249740 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 13 Apr 2017 16:25:08 -0700 Subject: [PATCH 28/31] deps: ICU 59.1 bump * No feature changes. * Bug fixes. * Details: http://site.icu-project.org/download/59 Fixes: https://github.com/nodejs/node/issues/12077 PR-URL: https://github.com/nodejs/node/pull/12486 Refs: https://github.com/nodejs/node/issues/7844 Reviewed-By: James M Snell Reviewed-By: Michael Dawson Reviewed-By: Refael Ackermann --- LICENSE | 2 +- configure | 4 +- deps/icu-small/LICENSE | 2 +- deps/icu-small/README-SMALL-ICU.txt | 4 +- deps/icu-small/source/common/appendable.cpp | 4 +- deps/icu-small/source/common/bmpset.cpp | 4 +- deps/icu-small/source/common/bmpset.h | 4 +- deps/icu-small/source/common/brkeng.cpp | 2 +- deps/icu-small/source/common/brkeng.h | 2 +- deps/icu-small/source/common/brkiter.cpp | 2 +- deps/icu-small/source/common/bytestream.cpp | 2 +- deps/icu-small/source/common/bytestrie.cpp | 4 +- .../source/common/bytestriebuilder.cpp | 4 +- .../source/common/bytestrieiterator.cpp | 4 +- deps/icu-small/source/common/caniter.cpp | 6 +- deps/icu-small/source/common/chariter.cpp | 2 +- deps/icu-small/source/common/charstr.cpp | 5 +- deps/icu-small/source/common/charstr.h | 2 +- .../source/common/{cmemory.c => cmemory.cpp} | 2 +- deps/icu-small/source/common/cmemory.h | 2 +- deps/icu-small/source/common/cpputils.h | 4 +- deps/icu-small/source/common/cstr.cpp | 2 +- deps/icu-small/source/common/cstr.h | 2 +- .../source/common/{cstring.c => cstring.cpp} | 2 +- deps/icu-small/source/common/cstring.h | 2 +- .../source/common/{cwchar.c => cwchar.cpp} | 4 +- deps/icu-small/source/common/cwchar.h | 4 +- deps/icu-small/source/common/dictbe.cpp | 21 +- deps/icu-small/source/common/dictbe.h | 2 +- .../source/common/dictionarydata.cpp | 2 +- deps/icu-small/source/common/dictionarydata.h | 2 +- deps/icu-small/source/common/dtintrv.cpp | 2 +- deps/icu-small/source/common/edits.cpp | 346 ++ deps/icu-small/source/common/errorcode.cpp | 4 +- deps/icu-small/source/common/filteredbrk.cpp | 4 +- .../source/common/filterednormalizer2.cpp | 4 +- deps/icu-small/source/common/hash.h | 2 +- .../common/{icudataver.c => icudataver.cpp} | 2 +- deps/icu-small/source/common/icuplug.cpp | 2 +- deps/icu-small/source/common/icuplugimp.h | 2 +- .../icu-small/source/common/listformatter.cpp | 128 +- .../source/common/loadednormalizer2impl.cpp | 3 +- deps/icu-small/source/common/localsvc.h | 2 +- deps/icu-small/source/common/locavailable.cpp | 4 +- deps/icu-small/source/common/locbased.cpp | 2 +- deps/icu-small/source/common/locbased.h | 2 +- deps/icu-small/source/common/locdispnames.cpp | 4 +- deps/icu-small/source/common/locdspnm.cpp | 3 +- deps/icu-small/source/common/locid.cpp | 3 +- deps/icu-small/source/common/loclikely.cpp | 5 +- .../source/common/{locmap.c => locmap.cpp} | 200 +- deps/icu-small/source/common/locmap.h | 5 +- deps/icu-small/source/common/locresdata.cpp | 4 +- deps/icu-small/source/common/locutil.cpp | 2 +- deps/icu-small/source/common/locutil.h | 2 +- deps/icu-small/source/common/messageimpl.h | 4 +- .../source/common/messagepattern.cpp | 4 +- deps/icu-small/source/common/msvcres.h | 2 +- deps/icu-small/source/common/mutex.h | 2 +- deps/icu-small/source/common/norm2_nfc_data.h | 2 +- deps/icu-small/source/common/norm2allmodes.h | 2 +- deps/icu-small/source/common/normalizer2.cpp | 4 +- .../source/common/normalizer2impl.cpp | 4 +- .../icu-small/source/common/normalizer2impl.h | 6 +- deps/icu-small/source/common/normlzr.cpp | 12 +- deps/icu-small/source/common/parsepos.cpp | 2 +- deps/icu-small/source/common/patternprops.cpp | 4 +- deps/icu-small/source/common/patternprops.h | 4 +- deps/icu-small/source/common/pluralmap.cpp | 2 +- deps/icu-small/source/common/pluralmap.h | 2 +- deps/icu-small/source/common/propname.cpp | 2 +- deps/icu-small/source/common/propname.h | 2 +- deps/icu-small/source/common/propname_data.h | 2 +- .../common/{propsvec.c => propsvec.cpp} | 6 +- deps/icu-small/source/common/propsvec.h | 4 +- deps/icu-small/source/common/punycode.cpp | 4 +- deps/icu-small/source/common/punycode.h | 4 +- deps/icu-small/source/common/putil.cpp | 286 +- deps/icu-small/source/common/putilimp.h | 10 +- deps/icu-small/source/common/rbbi.cpp | 2 +- deps/icu-small/source/common/rbbidata.cpp | 2 +- deps/icu-small/source/common/rbbidata.h | 4 +- deps/icu-small/source/common/rbbinode.cpp | 2 +- deps/icu-small/source/common/rbbinode.h | 2 +- deps/icu-small/source/common/rbbirb.cpp | 2 +- deps/icu-small/source/common/rbbirb.h | 2 +- deps/icu-small/source/common/rbbirpt.h | 2 +- deps/icu-small/source/common/rbbiscan.cpp | 9 +- deps/icu-small/source/common/rbbiscan.h | 2 +- deps/icu-small/source/common/rbbisetb.cpp | 2 +- deps/icu-small/source/common/rbbisetb.h | 2 +- deps/icu-small/source/common/rbbistbl.cpp | 2 +- deps/icu-small/source/common/rbbitblb.cpp | 2 +- deps/icu-small/source/common/rbbitblb.h | 2 +- deps/icu-small/source/common/resbund.cpp | 2 +- deps/icu-small/source/common/resbund_cnv.cpp | 4 +- deps/icu-small/source/common/resource.cpp | 2 +- deps/icu-small/source/common/resource.h | 2 +- deps/icu-small/source/common/ruleiter.cpp | 2 +- deps/icu-small/source/common/ruleiter.h | 2 +- deps/icu-small/source/common/schriter.cpp | 2 +- deps/icu-small/source/common/serv.cpp | 2 +- deps/icu-small/source/common/serv.h | 2 +- deps/icu-small/source/common/servlk.cpp | 2 +- deps/icu-small/source/common/servlkf.cpp | 2 +- deps/icu-small/source/common/servloc.h | 2 +- deps/icu-small/source/common/servls.cpp | 2 +- deps/icu-small/source/common/servnotf.cpp | 2 +- deps/icu-small/source/common/servnotf.h | 2 +- deps/icu-small/source/common/servrbf.cpp | 2 +- deps/icu-small/source/common/servslkf.cpp | 2 +- deps/icu-small/source/common/sharedobject.cpp | 2 +- deps/icu-small/source/common/sharedobject.h | 2 +- .../source/common/simpleformatter.cpp | 2 +- deps/icu-small/source/common/sprpimpl.h | 4 +- deps/icu-small/source/common/stringpiece.cpp | 2 +- .../source/common/stringtriebuilder.cpp | 4 +- .../common/{uarrsort.c => uarrsort.cpp} | 7 +- deps/icu-small/source/common/uarrsort.h | 4 +- deps/icu-small/source/common/uassert.h | 2 +- .../source/common/{ubidi.c => ubidi.cpp} | 109 +- .../common/{ubidi_props.c => ubidi_props.cpp} | 6 +- deps/icu-small/source/common/ubidi_props.h | 4 +- .../source/common/ubidi_props_data.h | 863 ++-- deps/icu-small/source/common/ubidiimp.h | 4 +- .../source/common/{ubidiln.c => ubidiln.cpp} | 4 +- .../{ubiditransform.c => ubiditransform.cpp} | 6 +- .../common/{ubidiwrt.c => ubidiwrt.cpp} | 4 +- deps/icu-small/source/common/ubrk.cpp | 62 +- deps/icu-small/source/common/ubrkimpl.h | 2 +- deps/icu-small/source/common/ucase.cpp | 370 +- deps/icu-small/source/common/ucase.h | 61 +- .../source/common/ucase_props_data.h | 2 +- deps/icu-small/source/common/ucasemap.cpp | 705 +-- deps/icu-small/source/common/ucasemap_imp.h | 239 + .../common/ucasemap_titlecase_brkiter.cpp | 76 +- .../source/common/{ucat.c => ucat.cpp} | 2 +- .../source/common/{uchar.c => uchar.cpp} | 5 +- .../source/common/uchar_props_data.h | 4352 +++++++++-------- deps/icu-small/source/common/ucharstrie.cpp | 7 +- .../source/common/ucharstriebuilder.cpp | 4 +- .../source/common/ucharstrieiterator.cpp | 6 +- deps/icu-small/source/common/uchriter.cpp | 10 +- deps/icu-small/source/common/ucln.h | 4 +- deps/icu-small/source/common/ucln_cmn.cpp | 4 +- deps/icu-small/source/common/ucln_cmn.h | 4 +- deps/icu-small/source/common/ucln_imp.h | 6 +- .../common/{ucmndata.c => ucmndata.cpp} | 17 +- deps/icu-small/source/common/ucmndata.h | 2 +- .../source/common/{ucnv.c => ucnv.cpp} | 2 +- deps/icu-small/source/common/ucnv2022.cpp | 4 +- deps/icu-small/source/common/ucnv_bld.cpp | 2 +- deps/icu-small/source/common/ucnv_bld.h | 2 +- .../source/common/{ucnv_cb.c => ucnv_cb.cpp} | 2 +- .../common/{ucnv_cnv.c => ucnv_cnv.cpp} | 8 +- deps/icu-small/source/common/ucnv_cnv.h | 2 +- .../source/common/{ucnv_ct.c => ucnv_ct.cpp} | 38 +- .../common/{ucnv_err.c => ucnv_err.cpp} | 17 +- deps/icu-small/source/common/ucnv_ext.cpp | 5 +- deps/icu-small/source/common/ucnv_ext.h | 4 +- deps/icu-small/source/common/ucnv_imp.h | 2 +- deps/icu-small/source/common/ucnv_io.cpp | 2 +- deps/icu-small/source/common/ucnv_io.h | 2 +- .../common/{ucnv_lmb.c => ucnv_lmb.cpp} | 34 +- .../common/{ucnv_set.c => ucnv_set.cpp} | 4 +- .../common/{ucnv_u16.c => ucnv_u16.cpp} | 64 +- .../common/{ucnv_u32.c => ucnv_u32.cpp} | 46 +- .../source/common/{ucnv_u7.c => ucnv_u7.cpp} | 27 +- .../source/common/{ucnv_u8.c => ucnv_u8.cpp} | 24 +- deps/icu-small/source/common/ucnvbocu.cpp | 4 +- .../common/{ucnvdisp.c => ucnvdisp.cpp} | 2 +- .../source/common/{ucnvhz.c => ucnvhz.cpp} | 28 +- .../common/{ucnvisci.c => ucnvisci.cpp} | 40 +- .../common/{ucnvlat1.c => ucnvlat1.cpp} | 33 +- deps/icu-small/source/common/ucnvmbcs.cpp | 4 +- deps/icu-small/source/common/ucnvmbcs.h | 4 +- .../common/{ucnvscsu.c => ucnvscsu.cpp} | 34 +- deps/icu-small/source/common/ucnvsel.cpp | 2 +- deps/icu-small/source/common/ucol_data.h | 4 +- deps/icu-small/source/common/ucol_swp.cpp | 4 +- deps/icu-small/source/common/ucol_swp.h | 4 +- deps/icu-small/source/common/ucurr.cpp | 5 +- deps/icu-small/source/common/ucurrimp.h | 2 +- deps/icu-small/source/common/udata.cpp | 21 +- .../common/{udatamem.c => udatamem.cpp} | 4 +- deps/icu-small/source/common/udatamem.h | 2 +- .../common/{udataswp.c => udataswp.cpp} | 8 +- deps/icu-small/source/common/udataswp.h | 4 +- deps/icu-small/source/common/uelement.h | 4 +- .../source/common/{uenum.c => uenum.cpp} | 4 +- deps/icu-small/source/common/uenumimp.h | 4 +- .../source/common/{uhash.c => uhash.cpp} | 2 +- deps/icu-small/source/common/uhash.h | 2 +- deps/icu-small/source/common/uhash_us.cpp | 2 +- deps/icu-small/source/common/uidna.cpp | 4 +- deps/icu-small/source/common/uinit.cpp | 4 +- .../common/{uinvchar.c => uinvchar.cpp} | 6 +- deps/icu-small/source/common/uinvchar.h | 6 +- deps/icu-small/source/common/uiter.cpp | 4 +- .../source/common/{ulist.c => ulist.cpp} | 16 +- deps/icu-small/source/common/ulist.h | 2 +- .../source/common/ulistformatter.cpp | 2 +- deps/icu-small/source/common/uloc.cpp | 440 +- deps/icu-small/source/common/uloc_keytype.cpp | 2 +- .../common/{uloc_tag.c => uloc_tag.cpp} | 11 +- deps/icu-small/source/common/ulocimp.h | 2 +- .../common/{umapfile.c => umapfile.cpp} | 34 +- deps/icu-small/source/common/umapfile.h | 2 +- .../source/common/{umath.c => umath.cpp} | 2 +- deps/icu-small/source/common/umutex.cpp | 2 +- deps/icu-small/source/common/umutex.h | 6 +- deps/icu-small/source/common/unames.cpp | 4 +- .../source/common/unicode/appendable.h | 50 +- .../icu-small/source/common/unicode/brkiter.h | 2 +- .../source/common/unicode/bytestream.h | 6 +- .../source/common/unicode/bytestrie.h | 4 +- .../source/common/unicode/bytestriebuilder.h | 8 +- .../icu-small/source/common/unicode/caniter.h | 6 +- .../icu-small/source/common/unicode/casemap.h | 359 ++ .../source/common/unicode/char16ptr.h | 306 ++ .../source/common/unicode/chariter.h | 38 +- deps/icu-small/source/common/unicode/dbbi.h | 2 +- .../icu-small/source/common/unicode/docmain.h | 7 +- .../icu-small/source/common/unicode/dtintrv.h | 2 +- deps/icu-small/source/common/unicode/edits.h | 245 + .../icu-small/source/common/unicode/enumset.h | 2 +- .../source/common/unicode/errorcode.h | 4 +- .../source/common/unicode/filteredbrk.h | 2 +- .../source/common/unicode/icudataver.h | 2 +- .../icu-small/source/common/unicode/icuplug.h | 2 +- deps/icu-small/source/common/unicode/idna.h | 4 +- .../source/common/unicode/listformatter.h | 6 +- .../source/common/unicode/localpointer.h | 12 +- .../source/common/unicode/locdspnm.h | 3 +- deps/icu-small/source/common/unicode/locid.h | 7 +- .../source/common/unicode/messagepattern.h | 4 +- .../source/common/unicode/normalizer2.h | 6 +- .../icu-small/source/common/unicode/normlzr.h | 10 +- .../source/common/unicode/parseerr.h | 2 +- .../source/common/unicode/parsepos.h | 2 +- .../source/common/unicode/platform.h | 52 +- deps/icu-small/source/common/unicode/ptypes.h | 2 +- deps/icu-small/source/common/unicode/putil.h | 2 +- deps/icu-small/source/common/unicode/rbbi.h | 2 +- deps/icu-small/source/common/unicode/rep.h | 8 +- .../icu-small/source/common/unicode/resbund.h | 4 +- .../source/common/unicode/schriter.h | 4 +- .../source/common/unicode/simpleformatter.h | 46 +- .../source/common/unicode/std_string.h | 14 +- .../icu-small/source/common/unicode/strenum.h | 10 +- .../source/common/unicode/stringpiece.h | 4 +- .../source/common/unicode/stringtriebuilder.h | 20 +- .../source/common/unicode/symtable.h | 2 +- deps/icu-small/source/common/unicode/ubidi.h | 15 +- .../source/common/unicode/ubiditransform.h | 4 +- deps/icu-small/source/common/unicode/ubrk.h | 64 +- .../source/common/unicode/ucasemap.h | 19 +- deps/icu-small/source/common/unicode/ucat.h | 2 +- deps/icu-small/source/common/unicode/uchar.h | 12 +- .../source/common/unicode/ucharstrie.h | 96 +- .../source/common/unicode/ucharstriebuilder.h | 24 +- .../source/common/unicode/uchriter.h | 62 +- deps/icu-small/source/common/unicode/uclean.h | 12 +- deps/icu-small/source/common/unicode/ucnv.h | 2 +- .../icu-small/source/common/unicode/ucnv_cb.h | 2 +- .../source/common/unicode/ucnv_err.h | 2 +- .../icu-small/source/common/unicode/ucnvsel.h | 2 +- .../icu-small/source/common/unicode/uconfig.h | 4 +- deps/icu-small/source/common/unicode/ucurr.h | 2 +- deps/icu-small/source/common/unicode/udata.h | 4 +- .../source/common/unicode/udisplaycontext.h | 2 +- deps/icu-small/source/common/unicode/uenum.h | 8 +- deps/icu-small/source/common/unicode/uidna.h | 4 +- deps/icu-small/source/common/unicode/uiter.h | 4 +- .../source/common/unicode/uldnames.h | 2 +- .../source/common/unicode/ulistformatter.h | 8 +- deps/icu-small/source/common/unicode/uloc.h | 47 +- .../source/common/unicode/umachine.h | 115 +- deps/icu-small/source/common/unicode/umisc.h | 4 +- .../icu-small/source/common/unicode/unifilt.h | 4 +- .../source/common/unicode/unifunct.h | 2 +- .../source/common/unicode/unimatch.h | 2 +- deps/icu-small/source/common/unicode/uniset.h | 8 +- deps/icu-small/source/common/unicode/unistr.h | 543 +- deps/icu-small/source/common/unicode/unorm.h | 2 +- deps/icu-small/source/common/unicode/unorm2.h | 4 +- .../icu-small/source/common/unicode/uobject.h | 4 +- .../icu-small/source/common/unicode/urename.h | 29 +- deps/icu-small/source/common/unicode/urep.h | 2 +- deps/icu-small/source/common/unicode/ures.h | 2 +- .../icu-small/source/common/unicode/uscript.h | 2 +- deps/icu-small/source/common/unicode/uset.h | 4 +- .../source/common/unicode/usetiter.h | 2 +- deps/icu-small/source/common/unicode/ushape.h | 4 +- deps/icu-small/source/common/unicode/usprep.h | 4 +- .../icu-small/source/common/unicode/ustring.h | 2 +- .../source/common/unicode/ustringtrie.h | 4 +- deps/icu-small/source/common/unicode/utext.h | 4 +- deps/icu-small/source/common/unicode/utf.h | 4 +- deps/icu-small/source/common/unicode/utf16.h | 4 +- deps/icu-small/source/common/unicode/utf32.h | 4 +- deps/icu-small/source/common/unicode/utf8.h | 24 +- .../icu-small/source/common/unicode/utf_old.h | 23 +- deps/icu-small/source/common/unicode/utrace.h | 4 +- deps/icu-small/source/common/unicode/utypes.h | 6 +- .../icu-small/source/common/unicode/uvernum.h | 21 +- .../source/common/unicode/uversion.h | 4 +- deps/icu-small/source/common/unifiedcache.cpp | 2 +- deps/icu-small/source/common/unifiedcache.h | 2 +- deps/icu-small/source/common/unifilt.cpp | 2 +- deps/icu-small/source/common/unifunct.cpp | 2 +- deps/icu-small/source/common/uniset.cpp | 2 +- .../source/common/uniset_closure.cpp | 18 +- deps/icu-small/source/common/uniset_props.cpp | 8 +- deps/icu-small/source/common/unisetspan.cpp | 4 +- deps/icu-small/source/common/unisetspan.h | 4 +- deps/icu-small/source/common/unistr.cpp | 23 +- deps/icu-small/source/common/unistr_case.cpp | 128 +- .../source/common/unistr_case_locale.cpp | 40 +- deps/icu-small/source/common/unistr_cnv.cpp | 4 +- deps/icu-small/source/common/unistr_props.cpp | 4 +- .../common/unistr_titlecase_brkiter.cpp | 47 +- deps/icu-small/source/common/unistrappender.h | 2 +- deps/icu-small/source/common/unorm.cpp | 2 +- deps/icu-small/source/common/unormcmp.cpp | 14 +- deps/icu-small/source/common/unormimp.h | 4 +- deps/icu-small/source/common/uobject.cpp | 4 +- deps/icu-small/source/common/uposixdefs.h | 24 +- deps/icu-small/source/common/uprops.cpp | 10 +- deps/icu-small/source/common/uprops.h | 4 +- .../common/{ures_cnv.c => ures_cnv.cpp} | 8 +- deps/icu-small/source/common/uresbund.cpp | 2 +- deps/icu-small/source/common/uresdata.cpp | 18 +- deps/icu-small/source/common/uresdata.h | 4 +- deps/icu-small/source/common/uresimp.h | 2 +- deps/icu-small/source/common/ureslocs.h | 2 +- .../common/{usc_impl.c => usc_impl.cpp} | 4 +- deps/icu-small/source/common/usc_impl.h | 2 +- .../source/common/{uscript.c => uscript.cpp} | 2 +- .../icu-small/source/common/uscript_props.cpp | 4 +- deps/icu-small/source/common/uset.cpp | 4 +- deps/icu-small/source/common/uset_imp.h | 4 +- deps/icu-small/source/common/uset_props.cpp | 4 +- deps/icu-small/source/common/usetiter.cpp | 2 +- deps/icu-small/source/common/ushape.cpp | 4 +- deps/icu-small/source/common/usprep.cpp | 4 +- deps/icu-small/source/common/ustack.cpp | 2 +- deps/icu-small/source/common/ustr_cnv.cpp | 4 +- deps/icu-small/source/common/ustr_cnv.h | 4 +- deps/icu-small/source/common/ustr_imp.h | 226 +- .../source/common/ustr_titlecase_brkiter.cpp | 93 +- deps/icu-small/source/common/ustr_wcs.cpp | 8 +- deps/icu-small/source/common/ustrcase.cpp | 517 +- .../source/common/ustrcase_locale.cpp | 110 +- deps/icu-small/source/common/ustrenum.cpp | 2 +- deps/icu-small/source/common/ustrenum.h | 2 +- .../source/common/{ustrfmt.c => ustrfmt.cpp} | 2 +- deps/icu-small/source/common/ustrfmt.h | 2 +- deps/icu-small/source/common/ustring.cpp | 3 +- deps/icu-small/source/common/ustrtrns.cpp | 2 +- deps/icu-small/source/common/utext.cpp | 35 +- .../common/{utf_impl.c => utf_impl.cpp} | 17 +- deps/icu-small/source/common/util.cpp | 2 +- deps/icu-small/source/common/util.h | 2 +- deps/icu-small/source/common/util_props.cpp | 2 +- .../source/common/{utrace.c => utrace.cpp} | 19 +- deps/icu-small/source/common/utracimp.h | 18 +- deps/icu-small/source/common/utrie.cpp | 4 +- deps/icu-small/source/common/utrie.h | 4 +- deps/icu-small/source/common/utrie2.cpp | 4 +- deps/icu-small/source/common/utrie2.h | 4 +- .../source/common/utrie2_builder.cpp | 4 +- deps/icu-small/source/common/utrie2_impl.h | 4 +- deps/icu-small/source/common/uts46.cpp | 4 +- deps/icu-small/source/common/utypeinfo.h | 4 +- .../source/common/{utypes.c => utypes.cpp} | 2 +- deps/icu-small/source/common/uvector.cpp | 2 +- deps/icu-small/source/common/uvector.h | 2 +- deps/icu-small/source/common/uvectr32.cpp | 2 +- deps/icu-small/source/common/uvectr32.h | 2 +- deps/icu-small/source/common/uvectr64.cpp | 2 +- deps/icu-small/source/common/uvectr64.h | 2 +- .../source/common/{wintz.c => wintz.cpp} | 239 +- deps/icu-small/source/common/wintz.h | 8 +- .../data/in/{icudt58l.dat => icudt59l.dat} | Bin 2682224 -> 2717856 bytes .../source/i18n/affixpatternparser.cpp | 4 +- .../source/i18n/affixpatternparser.h | 2 +- deps/icu-small/source/i18n/alphaindex.cpp | 2 +- deps/icu-small/source/i18n/anytrans.cpp | 2 +- deps/icu-small/source/i18n/anytrans.h | 2 +- deps/icu-small/source/i18n/astro.cpp | 2 +- deps/icu-small/source/i18n/astro.h | 2 +- deps/icu-small/source/i18n/basictz.cpp | 2 +- deps/icu-small/source/i18n/bocsu.cpp | 4 +- deps/icu-small/source/i18n/bocsu.h | 4 +- deps/icu-small/source/i18n/brktrans.cpp | 2 +- deps/icu-small/source/i18n/brktrans.h | 2 +- deps/icu-small/source/i18n/buddhcal.cpp | 2 +- deps/icu-small/source/i18n/buddhcal.h | 2 +- deps/icu-small/source/i18n/calendar.cpp | 2 +- deps/icu-small/source/i18n/casetrn.cpp | 12 +- deps/icu-small/source/i18n/casetrn.h | 5 +- deps/icu-small/source/i18n/cecal.cpp | 2 +- deps/icu-small/source/i18n/cecal.h | 2 +- deps/icu-small/source/i18n/chnsecal.cpp | 2 +- deps/icu-small/source/i18n/chnsecal.h | 2 +- deps/icu-small/source/i18n/choicfmt.cpp | 2 +- deps/icu-small/source/i18n/coleitr.cpp | 3 +- deps/icu-small/source/i18n/coll.cpp | 2 +- deps/icu-small/source/i18n/collation.cpp | 2 +- deps/icu-small/source/i18n/collation.h | 2 +- .../source/i18n/collationbuilder.cpp | 2 +- deps/icu-small/source/i18n/collationbuilder.h | 2 +- .../source/i18n/collationcompare.cpp | 2 +- deps/icu-small/source/i18n/collationcompare.h | 2 +- deps/icu-small/source/i18n/collationdata.cpp | 2 +- deps/icu-small/source/i18n/collationdata.h | 2 +- .../source/i18n/collationdatabuilder.cpp | 2 +- .../source/i18n/collationdatabuilder.h | 2 +- .../source/i18n/collationdatareader.cpp | 2 +- .../source/i18n/collationdatareader.h | 2 +- .../source/i18n/collationdatawriter.cpp | 2 +- .../source/i18n/collationdatawriter.h | 2 +- .../source/i18n/collationfastlatin.cpp | 2 +- .../source/i18n/collationfastlatin.h | 2 +- .../source/i18n/collationfastlatinbuilder.cpp | 2 +- .../source/i18n/collationfastlatinbuilder.h | 2 +- deps/icu-small/source/i18n/collationfcd.cpp | 2 +- deps/icu-small/source/i18n/collationfcd.h | 2 +- .../source/i18n/collationiterator.cpp | 2 +- .../icu-small/source/i18n/collationiterator.h | 2 +- deps/icu-small/source/i18n/collationkeys.cpp | 2 +- deps/icu-small/source/i18n/collationkeys.h | 2 +- deps/icu-small/source/i18n/collationroot.cpp | 2 +- deps/icu-small/source/i18n/collationroot.h | 2 +- .../source/i18n/collationrootelements.cpp | 2 +- .../source/i18n/collationrootelements.h | 2 +- .../source/i18n/collationruleparser.cpp | 2 +- .../source/i18n/collationruleparser.h | 2 +- deps/icu-small/source/i18n/collationsets.cpp | 2 +- deps/icu-small/source/i18n/collationsets.h | 2 +- .../source/i18n/collationsettings.cpp | 2 +- .../icu-small/source/i18n/collationsettings.h | 2 +- .../source/i18n/collationtailoring.cpp | 2 +- .../source/i18n/collationtailoring.h | 2 +- .../source/i18n/collationweights.cpp | 4 +- deps/icu-small/source/i18n/collationweights.h | 4 +- deps/icu-small/source/i18n/collunsafe.h | 2 +- .../source/i18n/compactdecimalformat.cpp | 21 +- deps/icu-small/source/i18n/coptccal.cpp | 2 +- deps/icu-small/source/i18n/coptccal.h | 2 +- deps/icu-small/source/i18n/cpdtrans.cpp | 2 +- deps/icu-small/source/i18n/cpdtrans.h | 2 +- deps/icu-small/source/i18n/csdetect.cpp | 2 +- deps/icu-small/source/i18n/csdetect.h | 2 +- deps/icu-small/source/i18n/csmatch.cpp | 2 +- deps/icu-small/source/i18n/csmatch.h | 2 +- deps/icu-small/source/i18n/csr2022.cpp | 2 +- deps/icu-small/source/i18n/csr2022.h | 2 +- deps/icu-small/source/i18n/csrecog.cpp | 2 +- deps/icu-small/source/i18n/csrecog.h | 2 +- deps/icu-small/source/i18n/csrmbcs.cpp | 2 +- deps/icu-small/source/i18n/csrmbcs.h | 2 +- deps/icu-small/source/i18n/csrsbcs.cpp | 2 +- deps/icu-small/source/i18n/csrsbcs.h | 2 +- deps/icu-small/source/i18n/csrucode.cpp | 2 +- deps/icu-small/source/i18n/csrucode.h | 2 +- deps/icu-small/source/i18n/csrutf8.cpp | 2 +- deps/icu-small/source/i18n/csrutf8.h | 2 +- deps/icu-small/source/i18n/curramt.cpp | 6 +- deps/icu-small/source/i18n/currfmt.cpp | 2 +- deps/icu-small/source/i18n/currfmt.h | 2 +- deps/icu-small/source/i18n/currpinf.cpp | 3 +- deps/icu-small/source/i18n/currunit.cpp | 6 +- deps/icu-small/source/i18n/dangical.cpp | 2 +- deps/icu-small/source/i18n/dangical.h | 2 +- deps/icu-small/source/i18n/datefmt.cpp | 6 +- deps/icu-small/source/i18n/dayperiodrules.cpp | 4 +- deps/icu-small/source/i18n/dayperiodrules.h | 2 +- deps/icu-small/source/i18n/dcfmtimp.h | 2 +- deps/icu-small/source/i18n/dcfmtsym.cpp | 2 +- .../i18n/{decContext.c => decContext.cpp} | 2 +- deps/icu-small/source/i18n/decContext.h | 2 +- .../i18n/{decNumber.c => decNumber.cpp} | 4 +- deps/icu-small/source/i18n/decNumber.h | 2 +- deps/icu-small/source/i18n/decNumberLocal.h | 2 +- deps/icu-small/source/i18n/decfmtst.cpp | 2 +- deps/icu-small/source/i18n/decfmtst.h | 2 +- .../source/i18n/decimalformatpattern.cpp | 2 +- .../source/i18n/decimalformatpattern.h | 2 +- .../source/i18n/decimalformatpatternimpl.h | 2 +- deps/icu-small/source/i18n/decimfmt.cpp | 3 +- deps/icu-small/source/i18n/decimfmtimpl.cpp | 2 +- deps/icu-small/source/i18n/decimfmtimpl.h | 2 +- deps/icu-small/source/i18n/digitaffix.cpp | 2 +- deps/icu-small/source/i18n/digitaffix.h | 2 +- .../source/i18n/digitaffixesandpadding.cpp | 2 +- .../source/i18n/digitaffixesandpadding.h | 2 +- deps/icu-small/source/i18n/digitformatter.cpp | 2 +- deps/icu-small/source/i18n/digitformatter.h | 2 +- deps/icu-small/source/i18n/digitgrouping.cpp | 2 +- deps/icu-small/source/i18n/digitgrouping.h | 2 +- deps/icu-small/source/i18n/digitinterval.cpp | 2 +- deps/icu-small/source/i18n/digitinterval.h | 2 +- deps/icu-small/source/i18n/digitlst.cpp | 2 +- deps/icu-small/source/i18n/digitlst.h | 2 +- deps/icu-small/source/i18n/dt_impl.h | 2 +- deps/icu-small/source/i18n/dtfmtsym.cpp | 4 +- deps/icu-small/source/i18n/dtitv_impl.h | 2 +- deps/icu-small/source/i18n/dtitvfmt.cpp | 2 +- deps/icu-small/source/i18n/dtitvinf.cpp | 2 +- deps/icu-small/source/i18n/dtptngen.cpp | 4 +- deps/icu-small/source/i18n/dtptngen_impl.h | 5 +- deps/icu-small/source/i18n/dtrule.cpp | 2 +- deps/icu-small/source/i18n/esctrn.cpp | 2 +- deps/icu-small/source/i18n/esctrn.h | 2 +- deps/icu-small/source/i18n/ethpccal.cpp | 2 +- deps/icu-small/source/i18n/ethpccal.h | 2 +- deps/icu-small/source/i18n/fmtable.cpp | 2 +- deps/icu-small/source/i18n/fmtable_cnv.cpp | 2 +- deps/icu-small/source/i18n/fmtableimp.h | 5 +- deps/icu-small/source/i18n/format.cpp | 2 +- deps/icu-small/source/i18n/fphdlimp.cpp | 2 +- deps/icu-small/source/i18n/fphdlimp.h | 2 +- deps/icu-small/source/i18n/fpositer.cpp | 2 +- deps/icu-small/source/i18n/funcrepl.cpp | 2 +- deps/icu-small/source/i18n/funcrepl.h | 2 +- deps/icu-small/source/i18n/gender.cpp | 2 +- deps/icu-small/source/i18n/gregocal.cpp | 2 +- deps/icu-small/source/i18n/gregoimp.cpp | 2 +- deps/icu-small/source/i18n/gregoimp.h | 2 +- deps/icu-small/source/i18n/hebrwcal.cpp | 2 +- deps/icu-small/source/i18n/hebrwcal.h | 2 +- deps/icu-small/source/i18n/indiancal.cpp | 2 +- deps/icu-small/source/i18n/indiancal.h | 2 +- deps/icu-small/source/i18n/inputext.cpp | 2 +- deps/icu-small/source/i18n/inputext.h | 2 +- deps/icu-small/source/i18n/islamcal.cpp | 2 +- deps/icu-small/source/i18n/islamcal.h | 2 +- deps/icu-small/source/i18n/japancal.cpp | 2 +- deps/icu-small/source/i18n/japancal.h | 2 +- deps/icu-small/source/i18n/measfmt.cpp | 13 +- deps/icu-small/source/i18n/measunit.cpp | 319 +- deps/icu-small/source/i18n/measure.cpp | 2 +- deps/icu-small/source/i18n/msgfmt.cpp | 2 +- deps/icu-small/source/i18n/msgfmt_impl.h | 2 +- deps/icu-small/source/i18n/name2uni.cpp | 2 +- deps/icu-small/source/i18n/name2uni.h | 2 +- deps/icu-small/source/i18n/nfrlist.h | 4 +- deps/icu-small/source/i18n/nfrs.cpp | 27 +- deps/icu-small/source/i18n/nfrs.h | 6 +- deps/icu-small/source/i18n/nfrule.cpp | 21 +- deps/icu-small/source/i18n/nfrule.h | 7 +- deps/icu-small/source/i18n/nfsubs.cpp | 87 +- deps/icu-small/source/i18n/nfsubs.h | 6 +- deps/icu-small/source/i18n/nortrans.cpp | 2 +- deps/icu-small/source/i18n/nortrans.h | 2 +- deps/icu-small/source/i18n/nultrans.cpp | 2 +- deps/icu-small/source/i18n/nultrans.h | 2 +- deps/icu-small/source/i18n/numfmt.cpp | 8 +- deps/icu-small/source/i18n/numsys.cpp | 4 +- deps/icu-small/source/i18n/numsys_impl.h | 2 +- deps/icu-small/source/i18n/olsontz.cpp | 2 +- deps/icu-small/source/i18n/olsontz.h | 2 +- deps/icu-small/source/i18n/persncal.cpp | 2 +- deps/icu-small/source/i18n/persncal.h | 2 +- deps/icu-small/source/i18n/pluralaffix.cpp | 2 +- deps/icu-small/source/i18n/pluralaffix.h | 2 +- deps/icu-small/source/i18n/plurfmt.cpp | 2 +- deps/icu-small/source/i18n/plurrule.cpp | 25 +- deps/icu-small/source/i18n/plurrule_impl.h | 3 +- deps/icu-small/source/i18n/precision.cpp | 2 +- deps/icu-small/source/i18n/precision.h | 2 +- deps/icu-small/source/i18n/quant.cpp | 2 +- deps/icu-small/source/i18n/quant.h | 2 +- .../source/i18n/quantityformatter.cpp | 2 +- .../icu-small/source/i18n/quantityformatter.h | 2 +- deps/icu-small/source/i18n/rbnf.cpp | 174 +- deps/icu-small/source/i18n/rbt.cpp | 2 +- deps/icu-small/source/i18n/rbt.h | 2 +- deps/icu-small/source/i18n/rbt_data.cpp | 2 +- deps/icu-small/source/i18n/rbt_data.h | 2 +- deps/icu-small/source/i18n/rbt_pars.cpp | 2 +- deps/icu-small/source/i18n/rbt_pars.h | 2 +- deps/icu-small/source/i18n/rbt_rule.cpp | 2 +- deps/icu-small/source/i18n/rbt_rule.h | 2 +- deps/icu-small/source/i18n/rbt_set.cpp | 2 +- deps/icu-small/source/i18n/rbt_set.h | 2 +- deps/icu-small/source/i18n/rbtz.cpp | 2 +- deps/icu-small/source/i18n/regexcmp.cpp | 52 +- deps/icu-small/source/i18n/regexcmp.h | 2 +- deps/icu-small/source/i18n/regexcst.h | 2 +- deps/icu-small/source/i18n/regeximp.cpp | 12 +- deps/icu-small/source/i18n/regeximp.h | 4 +- deps/icu-small/source/i18n/regexst.cpp | 2 +- deps/icu-small/source/i18n/regexst.h | 2 +- deps/icu-small/source/i18n/regextxt.cpp | 2 +- deps/icu-small/source/i18n/regextxt.h | 2 +- deps/icu-small/source/i18n/region.cpp | 2 +- deps/icu-small/source/i18n/region_impl.h | 2 +- deps/icu-small/source/i18n/reldatefmt.cpp | 3 +- deps/icu-small/source/i18n/reldtfmt.cpp | 4 +- deps/icu-small/source/i18n/reldtfmt.h | 2 +- deps/icu-small/source/i18n/rematch.cpp | 24 +- deps/icu-small/source/i18n/remtrans.cpp | 2 +- deps/icu-small/source/i18n/remtrans.h | 2 +- deps/icu-small/source/i18n/repattrn.cpp | 2 +- .../source/i18n/rulebasedcollator.cpp | 2 +- .../source/i18n/scientificnumberformatter.cpp | 2 +- deps/icu-small/source/i18n/scriptset.cpp | 2 +- deps/icu-small/source/i18n/scriptset.h | 2 +- deps/icu-small/source/i18n/search.cpp | 2 +- deps/icu-small/source/i18n/selfmt.cpp | 2 +- deps/icu-small/source/i18n/selfmtimpl.h | 2 +- .../source/i18n/sharedbreakiterator.cpp | 2 +- .../source/i18n/sharedbreakiterator.h | 2 +- deps/icu-small/source/i18n/sharedcalendar.h | 2 +- .../source/i18n/shareddateformatsymbols.h | 2 +- .../source/i18n/sharednumberformat.h | 2 +- .../icu-small/source/i18n/sharedpluralrules.h | 2 +- .../source/i18n/significantdigitinterval.h | 2 +- deps/icu-small/source/i18n/simpletz.cpp | 15 +- .../source/i18n/smallintformatter.cpp | 2 +- .../icu-small/source/i18n/smallintformatter.h | 2 +- deps/icu-small/source/i18n/smpdtfmt.cpp | 4 +- deps/icu-small/source/i18n/smpdtfst.cpp | 2 +- deps/icu-small/source/i18n/smpdtfst.h | 3 +- deps/icu-small/source/i18n/sortkey.cpp | 2 +- deps/icu-small/source/i18n/standardplural.cpp | 2 +- deps/icu-small/source/i18n/standardplural.h | 2 +- deps/icu-small/source/i18n/strmatch.cpp | 2 +- deps/icu-small/source/i18n/strmatch.h | 2 +- deps/icu-small/source/i18n/strrepl.cpp | 2 +- deps/icu-small/source/i18n/strrepl.h | 2 +- deps/icu-small/source/i18n/stsearch.cpp | 2 +- deps/icu-small/source/i18n/taiwncal.cpp | 2 +- deps/icu-small/source/i18n/taiwncal.h | 2 +- deps/icu-small/source/i18n/timezone.cpp | 2 +- deps/icu-small/source/i18n/titletrn.cpp | 12 +- deps/icu-small/source/i18n/titletrn.h | 2 +- deps/icu-small/source/i18n/tmunit.cpp | 2 +- deps/icu-small/source/i18n/tmutamt.cpp | 2 +- deps/icu-small/source/i18n/tmutfmt.cpp | 2 +- deps/icu-small/source/i18n/tolowtrn.cpp | 2 +- deps/icu-small/source/i18n/tolowtrn.h | 2 +- deps/icu-small/source/i18n/toupptrn.cpp | 2 +- deps/icu-small/source/i18n/toupptrn.h | 2 +- deps/icu-small/source/i18n/translit.cpp | 2 +- deps/icu-small/source/i18n/transreg.cpp | 2 +- deps/icu-small/source/i18n/transreg.h | 2 +- deps/icu-small/source/i18n/tridpars.cpp | 2 +- deps/icu-small/source/i18n/tridpars.h | 2 +- deps/icu-small/source/i18n/tzfmt.cpp | 4 +- deps/icu-small/source/i18n/tzgnames.cpp | 3 +- deps/icu-small/source/i18n/tzgnames.h | 2 +- deps/icu-small/source/i18n/tznames.cpp | 2 +- deps/icu-small/source/i18n/tznames_impl.cpp | 3 +- deps/icu-small/source/i18n/tznames_impl.h | 2 +- deps/icu-small/source/i18n/tzrule.cpp | 2 +- deps/icu-small/source/i18n/tztrans.cpp | 2 +- deps/icu-small/source/i18n/ucal.cpp | 2 +- deps/icu-small/source/i18n/ucln_in.cpp | 4 +- deps/icu-small/source/i18n/ucln_in.h | 4 +- deps/icu-small/source/i18n/ucol.cpp | 4 +- deps/icu-small/source/i18n/ucol_imp.h | 4 +- deps/icu-small/source/i18n/ucol_res.cpp | 5 +- deps/icu-small/source/i18n/ucol_sit.cpp | 4 +- deps/icu-small/source/i18n/ucoleitr.cpp | 2 +- deps/icu-small/source/i18n/ucsdet.cpp | 2 +- deps/icu-small/source/i18n/udat.cpp | 2 +- .../source/i18n/udateintervalformat.cpp | 2 +- deps/icu-small/source/i18n/udatpg.cpp | 4 +- deps/icu-small/source/i18n/ufieldpositer.cpp | 2 +- .../source/i18n/uitercollationiterator.cpp | 2 +- .../source/i18n/uitercollationiterator.h | 2 +- .../source/i18n/{ulocdata.c => ulocdata.cpp} | 4 +- deps/icu-small/source/i18n/umsg.cpp | 4 +- deps/icu-small/source/i18n/umsg_imp.h | 4 +- deps/icu-small/source/i18n/unesctrn.cpp | 2 +- deps/icu-small/source/i18n/unesctrn.h | 2 +- deps/icu-small/source/i18n/uni2name.cpp | 2 +- deps/icu-small/source/i18n/uni2name.h | 2 +- .../source/i18n/unicode/alphaindex.h | 3 +- deps/icu-small/source/i18n/unicode/basictz.h | 2 +- deps/icu-small/source/i18n/unicode/calendar.h | 2 +- deps/icu-small/source/i18n/unicode/choicfmt.h | 2 +- deps/icu-small/source/i18n/unicode/coleitr.h | 3 +- deps/icu-small/source/i18n/unicode/coll.h | 30 +- .../i18n/unicode/compactdecimalformat.h | 2 +- deps/icu-small/source/i18n/unicode/curramt.h | 10 +- deps/icu-small/source/i18n/unicode/currpinf.h | 2 +- deps/icu-small/source/i18n/unicode/currunit.h | 12 +- deps/icu-small/source/i18n/unicode/datefmt.h | 2 +- deps/icu-small/source/i18n/unicode/dcfmtsym.h | 9 +- deps/icu-small/source/i18n/unicode/decimfmt.h | 28 +- deps/icu-small/source/i18n/unicode/dtfmtsym.h | 13 +- deps/icu-small/source/i18n/unicode/dtitvfmt.h | 4 +- deps/icu-small/source/i18n/unicode/dtitvinf.h | 2 +- deps/icu-small/source/i18n/unicode/dtptngen.h | 5 +- deps/icu-small/source/i18n/unicode/dtrule.h | 2 +- deps/icu-small/source/i18n/unicode/fieldpos.h | 2 +- deps/icu-small/source/i18n/unicode/fmtable.h | 2 +- deps/icu-small/source/i18n/unicode/format.h | 2 +- deps/icu-small/source/i18n/unicode/fpositer.h | 2 +- deps/icu-small/source/i18n/unicode/gender.h | 2 +- deps/icu-small/source/i18n/unicode/gregocal.h | 2 +- deps/icu-small/source/i18n/unicode/measfmt.h | 2 +- deps/icu-small/source/i18n/unicode/measunit.h | 76 +- deps/icu-small/source/i18n/unicode/measure.h | 2 +- deps/icu-small/source/i18n/unicode/msgfmt.h | 4 +- deps/icu-small/source/i18n/unicode/numfmt.h | 10 +- deps/icu-small/source/i18n/unicode/numsys.h | 4 +- deps/icu-small/source/i18n/unicode/plurfmt.h | 2 +- deps/icu-small/source/i18n/unicode/plurrule.h | 21 +- deps/icu-small/source/i18n/unicode/rbnf.h | 51 +- deps/icu-small/source/i18n/unicode/rbtz.h | 2 +- deps/icu-small/source/i18n/unicode/regex.h | 34 +- deps/icu-small/source/i18n/unicode/region.h | 2 +- .../source/i18n/unicode/reldatefmt.h | 9 +- .../i18n/unicode/scientificnumberformatter.h | 2 +- deps/icu-small/source/i18n/unicode/search.h | 2 +- deps/icu-small/source/i18n/unicode/selfmt.h | 2 +- deps/icu-small/source/i18n/unicode/simpletz.h | 2 +- deps/icu-small/source/i18n/unicode/smpdtfmt.h | 14 +- deps/icu-small/source/i18n/unicode/sortkey.h | 2 +- deps/icu-small/source/i18n/unicode/stsearch.h | 2 +- deps/icu-small/source/i18n/unicode/tblcoll.h | 26 +- deps/icu-small/source/i18n/unicode/timezone.h | 10 +- deps/icu-small/source/i18n/unicode/tmunit.h | 2 +- deps/icu-small/source/i18n/unicode/tmutamt.h | 2 +- deps/icu-small/source/i18n/unicode/tmutfmt.h | 2 +- deps/icu-small/source/i18n/unicode/translit.h | 4 +- deps/icu-small/source/i18n/unicode/tzfmt.h | 8 +- deps/icu-small/source/i18n/unicode/tznames.h | 2 +- deps/icu-small/source/i18n/unicode/tzrule.h | 2 +- deps/icu-small/source/i18n/unicode/tztrans.h | 2 +- deps/icu-small/source/i18n/unicode/ucal.h | 6 +- deps/icu-small/source/i18n/unicode/ucol.h | 12 +- deps/icu-small/source/i18n/unicode/ucoleitr.h | 2 +- deps/icu-small/source/i18n/unicode/ucsdet.h | 10 +- deps/icu-small/source/i18n/unicode/udat.h | 80 +- .../source/i18n/unicode/udateintervalformat.h | 2 +- deps/icu-small/source/i18n/unicode/udatpg.h | 8 +- .../source/i18n/unicode/ufieldpositer.h | 2 +- .../source/i18n/unicode/uformattable.h | 4 +- deps/icu-small/source/i18n/unicode/ugender.h | 2 +- deps/icu-small/source/i18n/unicode/ulocdata.h | 10 +- deps/icu-small/source/i18n/unicode/umsg.h | 4 +- deps/icu-small/source/i18n/unicode/unirepl.h | 2 +- deps/icu-small/source/i18n/unicode/unum.h | 66 +- deps/icu-small/source/i18n/unicode/unumsys.h | 2 +- .../source/i18n/unicode/upluralrules.h | 59 +- deps/icu-small/source/i18n/unicode/uregex.h | 4 +- deps/icu-small/source/i18n/unicode/uregion.h | 4 +- .../source/i18n/unicode/ureldatefmt.h | 72 +- deps/icu-small/source/i18n/unicode/usearch.h | 6 +- deps/icu-small/source/i18n/unicode/uspoof.h | 4 +- deps/icu-small/source/i18n/unicode/utmscale.h | 9 +- deps/icu-small/source/i18n/unicode/utrans.h | 2 +- deps/icu-small/source/i18n/unicode/vtzone.h | 2 +- deps/icu-small/source/i18n/unum.cpp | 29 +- deps/icu-small/source/i18n/unumsys.cpp | 2 +- deps/icu-small/source/i18n/upluralrules.cpp | 47 +- deps/icu-small/source/i18n/uregex.cpp | 2 +- deps/icu-small/source/i18n/uregexc.cpp | 2 +- deps/icu-small/source/i18n/uregion.cpp | 2 +- deps/icu-small/source/i18n/usearch.cpp | 2 +- deps/icu-small/source/i18n/uspoof.cpp | 4 +- deps/icu-small/source/i18n/uspoof_build.cpp | 4 +- deps/icu-small/source/i18n/uspoof_conf.cpp | 4 +- deps/icu-small/source/i18n/uspoof_conf.h | 4 +- deps/icu-small/source/i18n/uspoof_impl.cpp | 2 +- deps/icu-small/source/i18n/uspoof_impl.h | 2 +- deps/icu-small/source/i18n/usrchimp.h | 2 +- .../source/i18n/utf16collationiterator.cpp | 2 +- .../source/i18n/utf16collationiterator.h | 2 +- .../source/i18n/utf8collationiterator.cpp | 2 +- .../source/i18n/utf8collationiterator.h | 2 +- .../source/i18n/{utmscale.c => utmscale.cpp} | 2 +- deps/icu-small/source/i18n/utrans.cpp | 2 +- deps/icu-small/source/i18n/valueformatter.cpp | 2 +- deps/icu-small/source/i18n/valueformatter.h | 2 +- deps/icu-small/source/i18n/visibledigits.cpp | 2 +- deps/icu-small/source/i18n/visibledigits.h | 2 +- deps/icu-small/source/i18n/vtzone.cpp | 4 +- deps/icu-small/source/i18n/vzone.cpp | 2 +- deps/icu-small/source/i18n/vzone.h | 2 +- deps/icu-small/source/i18n/windtfmt.cpp | 115 +- deps/icu-small/source/i18n/windtfmt.h | 11 +- deps/icu-small/source/i18n/winnmfmt.cpp | 171 +- deps/icu-small/source/i18n/winnmfmt.h | 5 +- deps/icu-small/source/i18n/wintzimpl.cpp | 6 +- deps/icu-small/source/i18n/wintzimpl.h | 6 +- deps/icu-small/source/i18n/zonemeta.cpp | 11 +- deps/icu-small/source/i18n/zonemeta.h | 8 +- deps/icu-small/source/i18n/zrule.cpp | 2 +- deps/icu-small/source/i18n/zrule.h | 2 +- deps/icu-small/source/i18n/ztrans.cpp | 2 +- deps/icu-small/source/i18n/ztrans.h | 2 +- deps/icu-small/source/io/locbund.cpp | 2 +- deps/icu-small/source/io/locbund.h | 2 +- .../source/io/{sprintf.c => sprintf.cpp} | 2 +- .../source/io/{sscanf.c => sscanf.cpp} | 2 +- deps/icu-small/source/io/ucln_io.cpp | 4 +- deps/icu-small/source/io/ucln_io.h | 4 +- .../source/io/{ufile.c => ufile.cpp} | 51 +- deps/icu-small/source/io/ufile.h | 4 +- .../source/io/{ufmt_cmn.c => ufmt_cmn.cpp} | 2 +- deps/icu-small/source/io/ufmt_cmn.h | 4 +- deps/icu-small/source/io/unicode/ustdio.h | 2 +- deps/icu-small/source/io/unicode/ustream.h | 4 +- deps/icu-small/source/io/uprintf.cpp | 2 +- deps/icu-small/source/io/uprintf.h | 2 +- .../source/io/{uprntf_p.c => uprntf_p.cpp} | 15 +- .../source/io/{uscanf.c => uscanf.cpp} | 2 +- deps/icu-small/source/io/uscanf.h | 2 +- .../source/io/{uscanf_p.c => uscanf_p.cpp} | 44 +- .../source/io/{ustdio.c => ustdio.cpp} | 2 +- deps/icu-small/source/io/ustream.cpp | 2 +- .../stubdata/{stubdata.c => stubdata.cpp} | 4 +- deps/icu-small/source/tools/escapesrc/cptbl.h | 520 ++ .../source/tools/escapesrc/escapesrc.cpp | 409 ++ .../source/tools/escapesrc/expect-simple.cpp | 17 + .../source/tools/escapesrc/tblgen.cpp | 80 + .../source/tools/escapesrc/test-nochange.cpp | 5 + .../source/tools/escapesrc/test-simple.cpp | 17 + .../source/tools/genccode/genccode.c | 4 +- deps/icu-small/source/tools/gencmn/gencmn.c | 4 +- deps/icu-small/source/tools/genrb/derb.cpp | 4 +- deps/icu-small/source/tools/genrb/errmsg.c | 2 +- deps/icu-small/source/tools/genrb/errmsg.h | 2 +- deps/icu-small/source/tools/genrb/genrb.cpp | 2 +- deps/icu-small/source/tools/genrb/genrb.h | 2 +- deps/icu-small/source/tools/genrb/parse.cpp | 2 +- deps/icu-small/source/tools/genrb/parse.h | 2 +- .../icu-small/source/tools/genrb/prscmnts.cpp | 2 +- deps/icu-small/source/tools/genrb/prscmnts.h | 2 +- deps/icu-small/source/tools/genrb/rbutil.c | 2 +- deps/icu-small/source/tools/genrb/rbutil.h | 2 +- deps/icu-small/source/tools/genrb/read.c | 2 +- deps/icu-small/source/tools/genrb/read.h | 2 +- deps/icu-small/source/tools/genrb/reslist.cpp | 8 +- deps/icu-small/source/tools/genrb/reslist.h | 4 +- deps/icu-small/source/tools/genrb/rle.c | 2 +- deps/icu-small/source/tools/genrb/rle.h | 2 +- deps/icu-small/source/tools/genrb/ustr.c | 2 +- deps/icu-small/source/tools/genrb/ustr.h | 2 +- deps/icu-small/source/tools/genrb/wrtjava.cpp | 2 +- deps/icu-small/source/tools/genrb/wrtxml.cpp | 6 +- deps/icu-small/source/tools/icupkg/icupkg.cpp | 4 +- .../source/tools/pkgdata/pkgdata.cpp | 62 +- .../icu-small/source/tools/pkgdata/pkgtypes.c | 2 +- .../icu-small/source/tools/pkgdata/pkgtypes.h | 2 +- .../source/tools/toolutil/collationinfo.cpp | 2 +- .../source/tools/toolutil/collationinfo.h | 2 +- .../source/tools/toolutil/dbgutil.cpp | 6 +- .../icu-small/source/tools/toolutil/dbgutil.h | 2 +- .../source/tools/toolutil/denseranges.cpp | 4 +- .../source/tools/toolutil/denseranges.h | 4 +- .../toolutil/{filestrm.c => filestrm.cpp} | 2 +- .../source/tools/toolutil/filestrm.h | 2 +- .../source/tools/toolutil/filetools.cpp | 2 +- .../source/tools/toolutil/filetools.h | 4 +- .../toolutil/{flagparser.c => flagparser.cpp} | 8 +- .../source/tools/toolutil/flagparser.h | 4 +- .../source/tools/toolutil/package.cpp | 6 +- .../icu-small/source/tools/toolutil/package.h | 4 +- .../toolutil/{pkg_genc.c => pkg_genc.cpp} | 36 +- .../source/tools/toolutil/pkg_genc.h | 2 +- .../toolutil/{pkg_gencmn.c => pkg_gencmn.cpp} | 11 +- .../source/tools/toolutil/pkg_gencmn.h | 2 +- .../source/tools/toolutil/pkg_icu.cpp | 2 +- .../icu-small/source/tools/toolutil/pkg_icu.h | 2 +- .../icu-small/source/tools/toolutil/pkg_imp.h | 4 +- .../source/tools/toolutil/pkgitems.cpp | 4 +- .../icu-small/source/tools/toolutil/ppucd.cpp | 8 +- deps/icu-small/source/tools/toolutil/ppucd.h | 4 +- .../source/tools/toolutil/swapimpl.cpp | 4 +- .../source/tools/toolutil/swapimpl.h | 4 +- .../source/tools/toolutil/toolutil.cpp | 4 +- .../source/tools/toolutil/toolutil.h | 4 +- .../icu-small/source/tools/toolutil/ucbuf.cpp | 2 +- deps/icu-small/source/tools/toolutil/ucbuf.h | 2 +- .../source/tools/toolutil/ucln_tu.cpp | 2 +- .../source/tools/toolutil/{ucm.c => ucm.cpp} | 14 +- deps/icu-small/source/tools/toolutil/ucm.h | 4 +- .../toolutil/{ucmstate.c => ucmstate.cpp} | 9 +- .../source/tools/toolutil/udbgutil.cpp | 42 +- .../source/tools/toolutil/udbgutil.h | 2 +- .../toolutil/{unewdata.c => unewdata.cpp} | 4 +- .../source/tools/toolutil/unewdata.h | 4 +- .../toolutil/{uoptions.c => uoptions.cpp} | 4 +- .../source/tools/toolutil/uoptions.h | 4 +- .../tools/toolutil/{uparse.c => uparse.cpp} | 4 +- deps/icu-small/source/tools/toolutil/uparse.h | 4 +- .../toolutil/{writesrc.c => writesrc.cpp} | 6 +- .../source/tools/toolutil/writesrc.h | 4 +- .../source/tools/toolutil/xmlparser.cpp | 8 +- .../source/tools/toolutil/xmlparser.h | 4 +- 899 files changed, 11192 insertions(+), 6834 deletions(-) rename deps/icu-small/source/common/{cmemory.c => cmemory.cpp} (98%) rename deps/icu-small/source/common/{cstring.c => cstring.cpp} (99%) rename deps/icu-small/source/common/{cwchar.c => cwchar.cpp} (92%) create mode 100644 deps/icu-small/source/common/edits.cpp rename deps/icu-small/source/common/{icudataver.c => icudataver.cpp} (94%) rename deps/icu-small/source/common/{locmap.c => locmap.cpp} (83%) rename deps/icu-small/source/common/{propsvec.c => propsvec.cpp} (99%) rename deps/icu-small/source/common/{uarrsort.c => uarrsort.cpp} (98%) rename deps/icu-small/source/common/{ubidi.c => ubidi.cpp} (97%) rename deps/icu-small/source/common/{ubidi_props.c => ubidi_props.cpp} (98%) rename deps/icu-small/source/common/{ubidiln.c => ubidiln.cpp} (99%) rename deps/icu-small/source/common/{ubiditransform.c => ubiditransform.cpp} (99%) rename deps/icu-small/source/common/{ubidiwrt.c => ubidiwrt.cpp} (99%) create mode 100644 deps/icu-small/source/common/ucasemap_imp.h rename deps/icu-small/source/common/{ucat.c => ucat.cpp} (97%) rename deps/icu-small/source/common/{uchar.c => uchar.cpp} (99%) rename deps/icu-small/source/common/{ucmndata.c => ucmndata.cpp} (97%) rename deps/icu-small/source/common/{ucnv.c => ucnv.cpp} (99%) rename deps/icu-small/source/common/{ucnv_cb.c => ucnv_cb.cpp} (99%) rename deps/icu-small/source/common/{ucnv_cnv.c => ucnv_cnv.cpp} (96%) rename deps/icu-small/source/common/{ucnv_ct.c => ucnv_ct.cpp} (97%) rename deps/icu-small/source/common/{ucnv_err.c => ucnv_err.cpp} (97%) rename deps/icu-small/source/common/{ucnv_lmb.c => ucnv_lmb.cpp} (98%) rename deps/icu-small/source/common/{ucnv_set.c => ucnv_set.cpp} (95%) rename deps/icu-small/source/common/{ucnv_u16.c => ucnv_u16.cpp} (98%) rename deps/icu-small/source/common/{ucnv_u32.c => ucnv_u32.cpp} (98%) rename deps/icu-small/source/common/{ucnv_u7.c => ucnv_u7.cpp} (99%) rename deps/icu-small/source/common/{ucnv_u8.c => ucnv_u8.cpp} (98%) rename deps/icu-small/source/common/{ucnvdisp.c => ucnvdisp.cpp} (97%) rename deps/icu-small/source/common/{ucnvhz.c => ucnvhz.cpp} (98%) rename deps/icu-small/source/common/{ucnvisci.c => ucnvisci.cpp} (98%) rename deps/icu-small/source/common/{ucnvlat1.c => ucnvlat1.cpp} (97%) rename deps/icu-small/source/common/{ucnvscsu.c => ucnvscsu.cpp} (99%) rename deps/icu-small/source/common/{udatamem.c => udatamem.cpp} (97%) rename deps/icu-small/source/common/{udataswp.c => udataswp.cpp} (98%) rename deps/icu-small/source/common/{uenum.c => uenum.cpp} (98%) rename deps/icu-small/source/common/{uhash.c => uhash.cpp} (99%) rename deps/icu-small/source/common/{uinvchar.c => uinvchar.cpp} (99%) rename deps/icu-small/source/common/{ulist.c => ulist.cpp} (94%) rename deps/icu-small/source/common/{uloc_tag.c => uloc_tag.cpp} (99%) rename deps/icu-small/source/common/{umapfile.c => umapfile.cpp} (93%) rename deps/icu-small/source/common/{umath.c => umath.cpp} (90%) create mode 100644 deps/icu-small/source/common/unicode/casemap.h create mode 100644 deps/icu-small/source/common/unicode/char16ptr.h create mode 100644 deps/icu-small/source/common/unicode/edits.h rename deps/icu-small/source/common/{ures_cnv.c => ures_cnv.cpp} (92%) rename deps/icu-small/source/common/{usc_impl.c => usc_impl.cpp} (98%) rename deps/icu-small/source/common/{uscript.c => uscript.cpp} (98%) rename deps/icu-small/source/common/{ustrfmt.c => ustrfmt.cpp} (96%) rename deps/icu-small/source/common/{utf_impl.c => utf_impl.cpp} (94%) rename deps/icu-small/source/common/{utrace.c => utrace.cpp} (97%) rename deps/icu-small/source/common/{utypes.c => utypes.cpp} (99%) rename deps/icu-small/source/common/{wintz.c => wintz.cpp} (63%) rename deps/icu-small/source/data/in/{icudt58l.dat => icudt59l.dat} (68%) rename deps/icu-small/source/i18n/{decContext.c => decContext.cpp} (99%) rename deps/icu-small/source/i18n/{decNumber.c => decNumber.cpp} (99%) rename deps/icu-small/source/i18n/{ulocdata.c => ulocdata.cpp} (99%) rename deps/icu-small/source/i18n/{utmscale.c => utmscale.cpp} (99%) rename deps/icu-small/source/io/{sprintf.c => sprintf.cpp} (99%) rename deps/icu-small/source/io/{sscanf.c => sscanf.cpp} (98%) rename deps/icu-small/source/io/{ufile.c => ufile.cpp} (87%) rename deps/icu-small/source/io/{ufmt_cmn.c => ufmt_cmn.cpp} (99%) rename deps/icu-small/source/io/{uprntf_p.c => uprntf_p.cpp} (99%) rename deps/icu-small/source/io/{uscanf.c => uscanf.cpp} (97%) rename deps/icu-small/source/io/{uscanf_p.c => uscanf_p.cpp} (98%) rename deps/icu-small/source/io/{ustdio.c => ustdio.cpp} (99%) rename deps/icu-small/source/stubdata/{stubdata.c => stubdata.cpp} (95%) create mode 100644 deps/icu-small/source/tools/escapesrc/cptbl.h create mode 100644 deps/icu-small/source/tools/escapesrc/escapesrc.cpp create mode 100644 deps/icu-small/source/tools/escapesrc/expect-simple.cpp create mode 100644 deps/icu-small/source/tools/escapesrc/tblgen.cpp create mode 100644 deps/icu-small/source/tools/escapesrc/test-nochange.cpp create mode 100644 deps/icu-small/source/tools/escapesrc/test-simple.cpp rename deps/icu-small/source/tools/toolutil/{filestrm.c => filestrm.cpp} (98%) rename deps/icu-small/source/tools/toolutil/{flagparser.c => flagparser.cpp} (95%) rename deps/icu-small/source/tools/toolutil/{pkg_genc.c => pkg_genc.cpp} (96%) rename deps/icu-small/source/tools/toolutil/{pkg_gencmn.c => pkg_gencmn.cpp} (98%) rename deps/icu-small/source/tools/toolutil/{ucm.c => ucm.cpp} (99%) rename deps/icu-small/source/tools/toolutil/{ucmstate.c => ucmstate.cpp} (99%) rename deps/icu-small/source/tools/toolutil/{unewdata.c => unewdata.cpp} (98%) rename deps/icu-small/source/tools/toolutil/{uoptions.c => uoptions.cpp} (98%) rename deps/icu-small/source/tools/toolutil/{uparse.c => uparse.cpp} (99%) rename deps/icu-small/source/tools/toolutil/{writesrc.c => writesrc.cpp} (98%) diff --git a/LICENSE b/LICENSE index fd8a2577935dc1..19a8c36a4fb8dd 100644 --- a/LICENSE +++ b/LICENSE @@ -100,7 +100,7 @@ The externally maintained libraries used by Node.js are: """ COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) - Copyright © 1991-2016 Unicode, Inc. All rights reserved. + Copyright © 1991-2017 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html Permission is hereby granted, free of charge, to any person obtaining diff --git a/configure b/configure index e67a15c4753dd3..bd8e6e29f49c3b 100755 --- a/configure +++ b/configure @@ -1075,8 +1075,8 @@ def glob_to_var(dir_base, dir_sub, patch_dir): def configure_intl(o): icus = [ { - 'url': 'https://ssl.icu-project.org/files/icu4c/58.2/icu4c-58_2-src.zip', - 'md5': 'f4fca37508fc5d14390501cf17aef084', + 'url': 'https://ssl.icu-project.org/files/icu4c/59.1/icu4c-59_1-src.zip', + 'md5': '29a41f9bb576b06c7eef0487a84a7674', }, ] def icu_download(path): diff --git a/deps/icu-small/LICENSE b/deps/icu-small/LICENSE index 90be7cdf052615..c5295daeefff12 100644 --- a/deps/icu-small/LICENSE +++ b/deps/icu-small/LICENSE @@ -1,6 +1,6 @@ COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) -Copyright © 1991-2016 Unicode, Inc. All rights reserved. +Copyright © 1991-2017 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html Permission is hereby granted, free of charge, to any person obtaining diff --git a/deps/icu-small/README-SMALL-ICU.txt b/deps/icu-small/README-SMALL-ICU.txt index 7b45134f658c39..e1079443d13c26 100644 --- a/deps/icu-small/README-SMALL-ICU.txt +++ b/deps/icu-small/README-SMALL-ICU.txt @@ -1,8 +1,8 @@ Small ICU sources - auto generated by shrink-icu-src.py This directory contains the ICU subset used by --with-intl=small-icu (the default) -It is a strict subset of ICU 58 source files with the following exception(s): -* deps/icu-small/source/data/in/icudt58l.dat : Reduced-size data file +It is a strict subset of ICU 59 source files with the following exception(s): +* deps/icu-small/source/data/in/icudt59l.dat : Reduced-size data file To rebuild this directory, see ../../tools/icu/README.md diff --git a/deps/icu-small/source/common/appendable.cpp b/deps/icu-small/source/common/appendable.cpp index 1a597b5de52e58..fca3c1e4133b80 100644 --- a/deps/icu-small/source/common/appendable.cpp +++ b/deps/icu-small/source/common/appendable.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: appendable.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/bmpset.cpp b/deps/icu-small/source/common/bmpset.cpp index ebcd0d23bf9f59..08f9bed0664bb5 100644 --- a/deps/icu-small/source/common/bmpset.cpp +++ b/deps/icu-small/source/common/bmpset.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: bmpset.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/bmpset.h b/deps/icu-small/source/common/bmpset.h index 8975cd61d5cc21..87375d2cace070 100644 --- a/deps/icu-small/source/common/bmpset.h +++ b/deps/icu-small/source/common/bmpset.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: bmpset.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/brkeng.cpp b/deps/icu-small/source/common/brkeng.cpp index 96a7dc9348d810..354998dac4dd07 100644 --- a/deps/icu-small/source/common/brkeng.cpp +++ b/deps/icu-small/source/common/brkeng.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************************ diff --git a/deps/icu-small/source/common/brkeng.h b/deps/icu-small/source/common/brkeng.h index 73fdb81dffaaaa..ccb95320d25e55 100644 --- a/deps/icu-small/source/common/brkeng.h +++ b/deps/icu-small/source/common/brkeng.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ************************************************************************************ diff --git a/deps/icu-small/source/common/brkiter.cpp b/deps/icu-small/source/common/brkiter.cpp index b768c20f0bac10..e2904b0544cb07 100644 --- a/deps/icu-small/source/common/brkiter.cpp +++ b/deps/icu-small/source/common/brkiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/bytestream.cpp b/deps/icu-small/source/common/bytestream.cpp index 5a5c2e4410e936..bfd7bded714d91 100644 --- a/deps/icu-small/source/common/bytestream.cpp +++ b/deps/icu-small/source/common/bytestream.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2011, International Business Machines // Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/common/bytestrie.cpp b/deps/icu-small/source/common/bytestrie.cpp index 093cd8ddb12106..c4d498c4bfad32 100644 --- a/deps/icu-small/source/common/bytestrie.cpp +++ b/deps/icu-small/source/common/bytestrie.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: bytestrie.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/bytestriebuilder.cpp b/deps/icu-small/source/common/bytestriebuilder.cpp index 913d85a21217be..581505e0092b15 100644 --- a/deps/icu-small/source/common/bytestriebuilder.cpp +++ b/deps/icu-small/source/common/bytestriebuilder.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: bytestriebuilder.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/bytestrieiterator.cpp b/deps/icu-small/source/common/bytestrieiterator.cpp index 4d04247c4933d0..e64961a1f1365a 100644 --- a/deps/icu-small/source/common/bytestrieiterator.cpp +++ b/deps/icu-small/source/common/bytestrieiterator.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: bytestrieiterator.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/caniter.cpp b/deps/icu-small/source/common/caniter.cpp index c3af281b82f420..eea0398d12f1f4 100644 --- a/deps/icu-small/source/common/caniter.cpp +++ b/deps/icu-small/source/common/caniter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** @@ -311,12 +311,12 @@ void U_EXPORT2 CanonicalIterator::permute(UnicodeString &source, UBool skipZeros // see what the permutations of the characters before and after this one are //Hashtable *subpermute = permute(source.substring(0,i) + source.substring(i + UTF16.getCharCount(cp))); - permute(subPermuteString.replace(i, U16_LENGTH(cp), NULL, 0), skipZeros, &subpermute, status); + permute(subPermuteString.remove(i, U16_LENGTH(cp)), skipZeros, &subpermute, status); /* Test for buffer overflows */ if(U_FAILURE(status)) { return; } - // The upper replace is destructive. The question is do we have to make a copy, or we don't care about the contents + // The upper remove is destructive. The question is do we have to make a copy, or we don't care about the contents // of source at this point. // prefix this character to all of them diff --git a/deps/icu-small/source/common/chariter.cpp b/deps/icu-small/source/common/chariter.cpp index 625ac49eaccdb9..887119a0ebaa15 100644 --- a/deps/icu-small/source/common/chariter.cpp +++ b/deps/icu-small/source/common/chariter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/charstr.cpp b/deps/icu-small/source/common/charstr.cpp index c792181378ec0b..8bacd20ddc7a68 100644 --- a/deps/icu-small/source/common/charstr.cpp +++ b/deps/icu-small/source/common/charstr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: charstr.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -15,6 +15,7 @@ */ #include "unicode/utypes.h" +#include "unicode/putil.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" diff --git a/deps/icu-small/source/common/charstr.h b/deps/icu-small/source/common/charstr.h index 9758c5c542b3f0..3cfdf6a897a497 100644 --- a/deps/icu-small/source/common/charstr.h +++ b/deps/icu-small/source/common/charstr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/cmemory.c b/deps/icu-small/source/common/cmemory.cpp similarity index 98% rename from deps/icu-small/source/common/cmemory.c rename to deps/icu-small/source/common/cmemory.cpp index 0054e3de8b2466..300279c2430d10 100644 --- a/deps/icu-small/source/common/cmemory.c +++ b/deps/icu-small/source/common/cmemory.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/cmemory.h b/deps/icu-small/source/common/cmemory.h index d2e48e5f305fd9..c77b8268675dd3 100644 --- a/deps/icu-small/source/common/cmemory.h +++ b/deps/icu-small/source/common/cmemory.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/cpputils.h b/deps/icu-small/source/common/cpputils.h index 57af69a7129483..307e570486439f 100644 --- a/deps/icu-small/source/common/cpputils.h +++ b/deps/icu-small/source/common/cpputils.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: cpputils.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 */ diff --git a/deps/icu-small/source/common/cstr.cpp b/deps/icu-small/source/common/cstr.cpp index 356367e0bcaea3..0114434329ad7e 100644 --- a/deps/icu-small/source/common/cstr.cpp +++ b/deps/icu-small/source/common/cstr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/cstr.h b/deps/icu-small/source/common/cstr.h index 25a8a5fc254baa..e310f131ac6eba 100644 --- a/deps/icu-small/source/common/cstr.h +++ b/deps/icu-small/source/common/cstr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/cstring.c b/deps/icu-small/source/common/cstring.cpp similarity index 99% rename from deps/icu-small/source/common/cstring.c rename to deps/icu-small/source/common/cstring.cpp index fbc0320d4ad1ec..a06bd3c79edb58 100644 --- a/deps/icu-small/source/common/cstring.c +++ b/deps/icu-small/source/common/cstring.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/cstring.h b/deps/icu-small/source/common/cstring.h index 238cb3138f2568..2232efcda5c0ef 100644 --- a/deps/icu-small/source/common/cstring.h +++ b/deps/icu-small/source/common/cstring.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/cwchar.c b/deps/icu-small/source/common/cwchar.cpp similarity index 92% rename from deps/icu-small/source/common/cwchar.c rename to deps/icu-small/source/common/cwchar.cpp index 0a9cd7b136f01d..4fd531114e8df8 100644 --- a/deps/icu-small/source/common/cwchar.c +++ b/deps/icu-small/source/common/cwchar.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: cwchar.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/cwchar.h b/deps/icu-small/source/common/cwchar.h index 1365abe4bcdd96..939eb599d69f8f 100644 --- a/deps/icu-small/source/common/cwchar.h +++ b/deps/icu-small/source/common/cwchar.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: cwchar.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/dictbe.cpp b/deps/icu-small/source/common/dictbe.cpp index 26635fa3d31cfd..6c0413a31b9a5c 100644 --- a/deps/icu-small/source/common/dictbe.cpp +++ b/deps/icu-small/source/common/dictbe.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* @@ -1385,12 +1385,25 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, // Now that we're done, convert positions in t_boundary[] (indices in // the normalized input string) back to indices in the original input UText // while reversing t_boundary and pushing values to foundBreaks. + int32_t prevCPPos = -1; + int32_t prevUTextPos = -1; for (int32_t i = numBreaks-1; i >= 0; i--) { int32_t cpPos = t_boundary.elementAti(i); + U_ASSERT(cpPos > prevCPPos); int32_t utextPos = inputMap.isValid() ? inputMap->elementAti(cpPos) : cpPos + rangeStart; - // Boundaries are added to foundBreaks output in ascending order. - U_ASSERT(foundBreaks.size() == 0 ||foundBreaks.peeki() < utextPos); - foundBreaks.push(utextPos, status); + U_ASSERT(utextPos >= prevUTextPos); + if (utextPos > prevUTextPos) { + // Boundaries are added to foundBreaks output in ascending order. + U_ASSERT(foundBreaks.size() == 0 || foundBreaks.peeki() < utextPos); + foundBreaks.push(utextPos, status); + } else { + // Normalization expanded the input text, the dictionary found a boundary + // within the expansion, giving two boundaries with the same index in the + // original text. Ignore the second. See ticket #12918. + --numBreaks; + } + prevCPPos = cpPos; + prevUTextPos = utextPos; } // inString goes out of scope diff --git a/deps/icu-small/source/common/dictbe.h b/deps/icu-small/source/common/dictbe.h index 6e9f3d5020f188..088bcb788d7a8e 100644 --- a/deps/icu-small/source/common/dictbe.h +++ b/deps/icu-small/source/common/dictbe.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/dictionarydata.cpp b/deps/icu-small/source/common/dictionarydata.cpp index 4a62f0bfc60b63..0efa5874931a07 100644 --- a/deps/icu-small/source/common/dictionarydata.cpp +++ b/deps/icu-small/source/common/dictionarydata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/dictionarydata.h b/deps/icu-small/source/common/dictionarydata.h index ef4277a440a192..5aec8fe0283630 100644 --- a/deps/icu-small/source/common/dictionarydata.h +++ b/deps/icu-small/source/common/dictionarydata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/dtintrv.cpp b/deps/icu-small/source/common/dtintrv.cpp index b7c3b48af34c07..dee637e62c07d4 100644 --- a/deps/icu-small/source/common/dtintrv.cpp +++ b/deps/icu-small/source/common/dtintrv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************************* * Copyright (C) 2008, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/edits.cpp b/deps/icu-small/source/common/edits.cpp new file mode 100644 index 00000000000000..58a70d5c92796e --- /dev/null +++ b/deps/icu-small/source/common/edits.cpp @@ -0,0 +1,346 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// edits.cpp +// created: 2017feb08 Markus W. Scherer + +#include "unicode/utypes.h" +#include "unicode/edits.h" +#include "cmemory.h" +#include "uassert.h" + +U_NAMESPACE_BEGIN + +namespace { + +// 0000uuuuuuuuuuuu records u+1 unchanged text units. +const int32_t MAX_UNCHANGED_LENGTH = 0x1000; +const int32_t MAX_UNCHANGED = MAX_UNCHANGED_LENGTH - 1; + +// 0wwwcccccccccccc with w=1..6 records ccc+1 replacements of w:w text units. +// No length change. +const int32_t MAX_SHORT_WIDTH = 6; +const int32_t MAX_SHORT_CHANGE_LENGTH = 0xfff; +const int32_t MAX_SHORT_CHANGE = 0x6fff; + +// 0111mmmmmmnnnnnn records a replacement of m text units with n. +// m or n = 61: actual length follows in the next edits array unit. +// m or n = 62..63: actual length follows in the next two edits array units. +// Bit 30 of the actual length is in the head unit. +// Trailing units have bit 15 set. +const int32_t LENGTH_IN_1TRAIL = 61; +const int32_t LENGTH_IN_2TRAIL = 62; + +} // namespace + +Edits::~Edits() { + if(array != stackArray) { + uprv_free(array); + } +} + +void Edits::reset() { + length = delta = 0; +} + +void Edits::addUnchanged(int32_t unchangedLength) { + if(U_FAILURE(errorCode) || unchangedLength == 0) { return; } + if(unchangedLength < 0) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + // Merge into previous unchanged-text record, if any. + int32_t last = lastUnit(); + if(last < MAX_UNCHANGED) { + int32_t remaining = MAX_UNCHANGED - last; + if (remaining >= unchangedLength) { + setLastUnit(last + unchangedLength); + return; + } + setLastUnit(MAX_UNCHANGED); + unchangedLength -= remaining; + } + // Split large lengths into multiple units. + while(unchangedLength >= MAX_UNCHANGED_LENGTH) { + append(MAX_UNCHANGED); + unchangedLength -= MAX_UNCHANGED_LENGTH; + } + // Write a small (remaining) length. + if(unchangedLength > 0) { + append(unchangedLength - 1); + } +} + +void Edits::addReplace(int32_t oldLength, int32_t newLength) { + if(U_FAILURE(errorCode)) { return; } + if(oldLength == newLength && 0 < oldLength && oldLength <= MAX_SHORT_WIDTH) { + // Replacement of short oldLength text units by same-length new text. + // Merge into previous short-replacement record, if any. + int32_t last = lastUnit(); + if(MAX_UNCHANGED < last && last < MAX_SHORT_CHANGE && + (last >> 12) == oldLength && (last & 0xfff) < MAX_SHORT_CHANGE_LENGTH) { + setLastUnit(last + 1); + return; + } + append(oldLength << 12); + return; + } + + if(oldLength < 0 || newLength < 0) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + if (oldLength == 0 && newLength == 0) { + return; + } + int32_t newDelta = newLength - oldLength; + if (newDelta != 0) { + if ((newDelta > 0 && delta >= 0 && newDelta > (INT32_MAX - delta)) || + (newDelta < 0 && delta < 0 && newDelta < (INT32_MIN - delta))) { + // Integer overflow or underflow. + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return; + } + delta += newDelta; + } + + int32_t head = 0x7000; + if (oldLength < LENGTH_IN_1TRAIL && newLength < LENGTH_IN_1TRAIL) { + head |= oldLength << 6; + head |= newLength; + append(head); + } else if ((capacity - length) >= 5 || growArray()) { + int32_t limit = length + 1; + if(oldLength < LENGTH_IN_1TRAIL) { + head |= oldLength << 6; + } else if(oldLength <= 0x7fff) { + head |= LENGTH_IN_1TRAIL << 6; + array[limit++] = (uint16_t)(0x8000 | oldLength); + } else { + head |= (LENGTH_IN_2TRAIL + (oldLength >> 30)) << 6; + array[limit++] = (uint16_t)(0x8000 | (oldLength >> 15)); + array[limit++] = (uint16_t)(0x8000 | oldLength); + } + if(newLength < LENGTH_IN_1TRAIL) { + head |= newLength; + } else if(newLength <= 0x7fff) { + head |= LENGTH_IN_1TRAIL; + array[limit++] = (uint16_t)(0x8000 | newLength); + } else { + head |= LENGTH_IN_2TRAIL + (newLength >> 30); + array[limit++] = (uint16_t)(0x8000 | (newLength >> 15)); + array[limit++] = (uint16_t)(0x8000 | newLength); + } + array[length] = (uint16_t)head; + length = limit; + } +} + +void Edits::append(int32_t r) { + if(length < capacity || growArray()) { + array[length++] = (uint16_t)r; + } +} + +UBool Edits::growArray() { + int32_t newCapacity; + if (array == stackArray) { + newCapacity = 2000; + } else if (capacity == INT32_MAX) { + // Not U_BUFFER_OVERFLOW_ERROR because that could be confused on a string transform API + // with a result-string-buffer overflow. + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } else if (capacity >= (INT32_MAX / 2)) { + newCapacity = INT32_MAX; + } else { + newCapacity = 2 * capacity; + } + // Grow by at least 5 units so that a maximal change record will fit. + if ((newCapacity - capacity) < 5) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + uint16_t *newArray = (uint16_t *)uprv_malloc((size_t)newCapacity * 2); + if (newArray == NULL) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + return FALSE; + } + uprv_memcpy(newArray, array, (size_t)length * 2); + if (array != stackArray) { + uprv_free(array); + } + array = newArray; + capacity = newCapacity; + return TRUE; +} + +UBool Edits::copyErrorTo(UErrorCode &outErrorCode) { + if (U_FAILURE(outErrorCode)) { return TRUE; } + if (U_SUCCESS(errorCode)) { return FALSE; } + outErrorCode = errorCode; + return TRUE; +} + +UBool Edits::hasChanges() const { + if (delta != 0) { + return TRUE; + } + for (int32_t i = 0; i < length; ++i) { + if (array[i] > MAX_UNCHANGED) { + return TRUE; + } + } + return FALSE; +} + +Edits::Iterator::Iterator(const uint16_t *a, int32_t len, UBool oc, UBool crs) : + array(a), index(0), length(len), remaining(0), + onlyChanges_(oc), coarse(crs), + changed(FALSE), oldLength_(0), newLength_(0), + srcIndex(0), replIndex(0), destIndex(0) {} + +int32_t Edits::Iterator::readLength(int32_t head) { + if (head < LENGTH_IN_1TRAIL) { + return head; + } else if (head < LENGTH_IN_2TRAIL) { + U_ASSERT(index < length); + U_ASSERT(array[index] >= 0x8000); + return array[index++] & 0x7fff; + } else { + U_ASSERT((index + 2) <= length); + U_ASSERT(array[index] >= 0x8000); + U_ASSERT(array[index + 1] >= 0x8000); + int32_t len = ((head & 1) << 30) | + ((int32_t)(array[index] & 0x7fff) << 15) | + (array[index + 1] & 0x7fff); + index += 2; + return len; + } +} + +void Edits::Iterator::updateIndexes() { + srcIndex += oldLength_; + if (changed) { + replIndex += newLength_; + } + destIndex += newLength_; +} + +UBool Edits::Iterator::noNext() { + // No change beyond the string. + changed = FALSE; + oldLength_ = newLength_ = 0; + return FALSE; +} + +UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + // We have an errorCode in case we need to start guarding against integer overflows. + // It is also convenient for caller loops if we bail out when an error was set elsewhere. + updateIndexes(); + if (remaining > 0) { + // Fine-grained iterator: Continue a sequence of equal-length changes. + --remaining; + return TRUE; + } + if (index >= length) { + return noNext(); + } + int32_t u = array[index++]; + if (u <= MAX_UNCHANGED) { + // Combine adjacent unchanged ranges. + changed = FALSE; + oldLength_ = u + 1; + while (index < length && (u = array[index]) <= MAX_UNCHANGED) { + ++index; + oldLength_ += u + 1; + } + newLength_ = oldLength_; + if (onlyChanges) { + updateIndexes(); + if (index >= length) { + return noNext(); + } + // already fetched u > MAX_UNCHANGED at index + ++index; + } else { + return TRUE; + } + } + changed = TRUE; + if (u <= MAX_SHORT_CHANGE) { + if (coarse) { + int32_t w = u >> 12; + int32_t len = (u & 0xfff) + 1; + oldLength_ = newLength_ = len * w; + } else { + // Split a sequence of equal-length changes that was compressed into one unit. + oldLength_ = newLength_ = u >> 12; + remaining = u & 0xfff; + return TRUE; + } + } else { + U_ASSERT(u <= 0x7fff); + oldLength_ = readLength((u >> 6) & 0x3f); + newLength_ = readLength(u & 0x3f); + if (!coarse) { + return TRUE; + } + } + // Combine adjacent changes. + while (index < length && (u = array[index]) > MAX_UNCHANGED) { + ++index; + if (u <= MAX_SHORT_CHANGE) { + int32_t w = u >> 12; + int32_t len = (u & 0xfff) + 1; + len = len * w; + oldLength_ += len; + newLength_ += len; + } else { + U_ASSERT(u <= 0x7fff); + int32_t oldLen = readLength((u >> 6) & 0x3f); + int32_t newLen = readLength(u & 0x3f); + oldLength_ += oldLen; + newLength_ += newLen; + } + } + return TRUE; +} + +UBool Edits::Iterator::findSourceIndex(int32_t i, UErrorCode &errorCode) { + if (U_FAILURE(errorCode) || i < 0) { return FALSE; } + if (i < srcIndex) { + // Reset the iterator to the start. + index = remaining = oldLength_ = newLength_ = srcIndex = replIndex = destIndex = 0; + } else if (i < (srcIndex + oldLength_)) { + // The index is in the current span. + return TRUE; + } + while (next(FALSE, errorCode)) { + if (i < (srcIndex + oldLength_)) { + // The index is in the current span. + return TRUE; + } + if (remaining > 0) { + // Is the index in one of the remaining compressed edits? + // srcIndex is the start of the current span, before the remaining ones. + int32_t len = (remaining + 1) * oldLength_; + if (i < (srcIndex + len)) { + int32_t n = (i - srcIndex) / oldLength_; // 1 <= n <= remaining + len = n * oldLength_; + srcIndex += len; + replIndex += len; + destIndex += len; + remaining -= n; + return TRUE; + } + // Make next() skip all of these edits at once. + oldLength_ = newLength_ = len; + remaining = 0; + } + } + return FALSE; +} + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/errorcode.cpp b/deps/icu-small/source/common/errorcode.cpp index bc7807d6010037..e7ac43b52739ae 100644 --- a/deps/icu-small/source/common/errorcode.cpp +++ b/deps/icu-small/source/common/errorcode.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: errorcode.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/filteredbrk.cpp b/deps/icu-small/source/common/filteredbrk.cpp index 610ab9e66407d9..0f642b19f6c828 100644 --- a/deps/icu-small/source/common/filteredbrk.cpp +++ b/deps/icu-small/source/common/filteredbrk.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -702,4 +702,4 @@ FilteredBreakIteratorBuilder::createInstance(UErrorCode& status) { U_NAMESPACE_END -#endif //#if !UCONFIG_NO_BREAK_ITERATION && U_HAVE_STD_STRING && !UCONFIG_NO_FILTERED_BREAK_ITERATION +#endif //#if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILTERED_BREAK_ITERATION diff --git a/deps/icu-small/source/common/filterednormalizer2.cpp b/deps/icu-small/source/common/filterednormalizer2.cpp index fb6e831af7a4c5..28e5f6cbddefaf 100644 --- a/deps/icu-small/source/common/filterednormalizer2.cpp +++ b/deps/icu-small/source/common/filterednormalizer2.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: filterednormalizer2.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/hash.h b/deps/icu-small/source/common/hash.h index a03fcae9548ab1..900c8120984e84 100644 --- a/deps/icu-small/source/common/hash.h +++ b/deps/icu-small/source/common/hash.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/icudataver.c b/deps/icu-small/source/common/icudataver.cpp similarity index 94% rename from deps/icu-small/source/common/icudataver.c rename to deps/icu-small/source/common/icudataver.cpp index 367e58f59b6910..6dd3ea1baee607 100644 --- a/deps/icu-small/source/common/icudataver.c +++ b/deps/icu-small/source/common/icudataver.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/icuplug.cpp b/deps/icu-small/source/common/icuplug.cpp index a0ec46b1f99bea..c3c8231b77d572 100644 --- a/deps/icu-small/source/common/icuplug.cpp +++ b/deps/icu-small/source/common/icuplug.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/icuplugimp.h b/deps/icu-small/source/common/icuplugimp.h index 895b35357b0e4c..282c639b40e271 100644 --- a/deps/icu-small/source/common/icuplugimp.h +++ b/deps/icu-small/source/common/icuplugimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/listformatter.cpp b/deps/icu-small/source/common/listformatter.cpp index 9225c22f163eb7..d105654755fd1e 100644 --- a/deps/icu-small/source/common/listformatter.cpp +++ b/deps/icu-small/source/common/listformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: listformatter.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -25,6 +25,7 @@ #include "charstr.h" #include "ucln_cmn.h" #include "uresimp.h" +#include "resource.h" U_NAMESPACE_BEGIN @@ -78,17 +79,6 @@ uprv_deleteListFormatInternal(void *obj) { U_CDECL_END -static ListFormatInternal* loadListFormatInternal( - const Locale& locale, - const char* style, - UErrorCode& errorCode); - -static void getStringByKey( - const UResourceBundle* rb, - const char* key, - UnicodeString& result, - UErrorCode& errorCode); - ListFormatter::ListFormatter(const ListFormatter& other) : owned(other.owned), data(other.data) { if (other.owned != NULL) { @@ -171,30 +161,107 @@ const ListFormatInternal* ListFormatter::getListFormatInternal( return result; } -static ListFormatInternal* loadListFormatInternal( +static const UChar solidus = 0x2F; +static const UChar aliasPrefix[] = { 0x6C,0x69,0x73,0x74,0x50,0x61,0x74,0x74,0x65,0x72,0x6E,0x2F }; // "listPattern/" +enum { + kAliasPrefixLen = UPRV_LENGTHOF(aliasPrefix), + kStyleLenMax = 24 // longest currently is 14 +}; + +struct ListFormatter::ListPatternsSink : public ResourceSink { + UnicodeString two, start, middle, end; +#if ((U_PLATFORM == U_PF_AIX) || (U_PLATFORM == U_PF_OS390)) && (U_CPLUSPLUS_VERSION < 11) + char aliasedStyle[kStyleLenMax+1]; + ListPatternsSink() { + uprv_memset(aliasedStyle, 0, kStyleLenMax+1); + } +#else + char aliasedStyle[kStyleLenMax+1] = {0}; + + ListPatternsSink() {} +#endif + virtual ~ListPatternsSink(); + + void setAliasedStyle(UnicodeString alias) { + int32_t startIndex = alias.indexOf(aliasPrefix, kAliasPrefixLen, 0); + if (startIndex < 0) { + return; + } + startIndex += kAliasPrefixLen; + int32_t endIndex = alias.indexOf(solidus, startIndex); + if (endIndex < 0) { + endIndex = alias.length(); + } + alias.extract(startIndex, endIndex-startIndex, aliasedStyle, kStyleLenMax+1, US_INV); + aliasedStyle[kStyleLenMax] = 0; + } + + void handleValueForPattern(ResourceValue &value, UnicodeString &pattern, UErrorCode &errorCode) { + if (pattern.isEmpty()) { + if (value.getType() == URES_ALIAS) { + if (aliasedStyle[0] == 0) { + setAliasedStyle(value.getAliasUnicodeString(errorCode)); + } + } else { + pattern = value.getUnicodeString(errorCode); + } + } + } + + virtual void put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &errorCode) { + aliasedStyle[0] = 0; + if (value.getType() == URES_ALIAS) { + setAliasedStyle(value.getAliasUnicodeString(errorCode)); + return; + } + ResourceTable listPatterns = value.getTable(errorCode); + for (int i = 0; U_SUCCESS(errorCode) && listPatterns.getKeyAndValue(i, key, value); ++i) { + if (uprv_strcmp(key, "2") == 0) { + handleValueForPattern(value, two, errorCode); + } else if (uprv_strcmp(key, "end") == 0) { + handleValueForPattern(value, end, errorCode); + } else if (uprv_strcmp(key, "middle") == 0) { + handleValueForPattern(value, middle, errorCode); + } else if (uprv_strcmp(key, "start") == 0) { + handleValueForPattern(value, start, errorCode); + } + } + } +}; + +// Virtual destructors must be defined out of line. +ListFormatter::ListPatternsSink::~ListPatternsSink() {} + +ListFormatInternal* ListFormatter::loadListFormatInternal( const Locale& locale, const char * style, UErrorCode& errorCode) { UResourceBundle* rb = ures_open(NULL, locale.getName(), &errorCode); - if (U_FAILURE(errorCode)) { - ures_close(rb); - return NULL; - } rb = ures_getByKeyWithFallback(rb, "listPattern", rb, &errorCode); - rb = ures_getByKeyWithFallback(rb, style, rb, &errorCode); - if (U_FAILURE(errorCode)) { ures_close(rb); return NULL; } - UnicodeString two, start, middle, end; - getStringByKey(rb, "2", two, errorCode); - getStringByKey(rb, "start", start, errorCode); - getStringByKey(rb, "middle", middle, errorCode); - getStringByKey(rb, "end", end, errorCode); + ListFormatter::ListPatternsSink sink; + char currentStyle[kStyleLenMax+1]; + uprv_strncpy(currentStyle, style, kStyleLenMax); + currentStyle[kStyleLenMax] = 0; + + for (;;) { + ures_getAllItemsWithFallback(rb, currentStyle, sink, errorCode); + if (U_FAILURE(errorCode) || sink.aliasedStyle[0] == 0 || uprv_strcmp(currentStyle, sink.aliasedStyle) == 0) { + break; + } + uprv_strcpy(currentStyle, sink.aliasedStyle); + } ures_close(rb); if (U_FAILURE(errorCode)) { return NULL; } - ListFormatInternal* result = new ListFormatInternal(two, start, middle, end, errorCode); + if (sink.two.isEmpty() || sink.start.isEmpty() || sink.middle.isEmpty() || sink.end.isEmpty()) { + errorCode = U_MISSING_RESOURCE_ERROR; + return NULL; + } + ListFormatInternal* result = new ListFormatInternal(sink.two, sink.start, sink.middle, sink.end, errorCode); if (result == NULL) { errorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; @@ -206,15 +273,6 @@ static ListFormatInternal* loadListFormatInternal( return result; } -static void getStringByKey(const UResourceBundle* rb, const char* key, UnicodeString& result, UErrorCode& errorCode) { - int32_t len; - const UChar* ustr = ures_getStringByKeyWithFallback(rb, key, &len, &errorCode); - if (U_FAILURE(errorCode)) { - return; - } - result.setTo(ustr, len); -} - ListFormatter* ListFormatter::createInstance(UErrorCode& errorCode) { Locale locale; // The default locale. return createInstance(locale, errorCode); diff --git a/deps/icu-small/source/common/loadednormalizer2impl.cpp b/deps/icu-small/source/common/loadednormalizer2impl.cpp index b3b7b5d6212496..2b2d9a8e809b04 100644 --- a/deps/icu-small/source/common/loadednormalizer2impl.cpp +++ b/deps/icu-small/source/common/loadednormalizer2impl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -232,6 +232,7 @@ Normalizer2::getInstance(const char *packageName, } } if(allModes==NULL) { + ucln_common_registerCleanup(UCLN_COMMON_LOADED_NORMALIZER2, uprv_loaded_normalizer2_cleanup); LocalPointer localAllModes( Norm2AllModes::createInstance(packageName, name, errorCode)); if(U_SUCCESS(errorCode)) { diff --git a/deps/icu-small/source/common/localsvc.h b/deps/icu-small/source/common/localsvc.h index 4c0686d4495ed9..724216aa64169e 100644 --- a/deps/icu-small/source/common/localsvc.h +++ b/deps/icu-small/source/common/localsvc.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** diff --git a/deps/icu-small/source/common/locavailable.cpp b/deps/icu-small/source/common/locavailable.cpp index 3a92c3c3eb65a3..5079885936ae32 100644 --- a/deps/icu-small/source/common/locavailable.cpp +++ b/deps/icu-small/source/common/locavailable.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: locavailable.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/locbased.cpp b/deps/icu-small/source/common/locbased.cpp index f2f56adda170f0..ff378b4cc78f1d 100644 --- a/deps/icu-small/source/common/locbased.cpp +++ b/deps/icu-small/source/common/locbased.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/locbased.h b/deps/icu-small/source/common/locbased.h index 453d5a8a30299b..6db6a41dc416df 100644 --- a/deps/icu-small/source/common/locbased.h +++ b/deps/icu-small/source/common/locbased.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/locdispnames.cpp b/deps/icu-small/source/common/locdispnames.cpp index bb10b8946b3327..f5cd9a48f333c0 100644 --- a/deps/icu-small/source/common/locdispnames.cpp +++ b/deps/icu-small/source/common/locdispnames.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: locdispnames.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/locdspnm.cpp b/deps/icu-small/source/common/locdspnm.cpp index a17478ce6d8a61..39934dc6c33020 100644 --- a/deps/icu-small/source/common/locdspnm.cpp +++ b/deps/icu-small/source/common/locdspnm.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -13,6 +13,7 @@ #include "unicode/locdspnm.h" #include "unicode/simpleformatter.h" +#include "unicode/ucasemap.h" #include "unicode/ures.h" #include "unicode/udisplaycontext.h" #include "unicode/brkiter.h" diff --git a/deps/icu-small/source/common/locid.cpp b/deps/icu-small/source/common/locid.cpp index d2781db95bdd8c..36508acaf5ca70 100644 --- a/deps/icu-small/source/common/locid.cpp +++ b/deps/icu-small/source/common/locid.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -33,6 +33,7 @@ #include "unicode/locid.h" +#include "unicode/strenum.h" #include "unicode/uloc.h" #include "putilimp.h" #include "mutex.h" diff --git a/deps/icu-small/source/common/loclikely.cpp b/deps/icu-small/source/common/loclikely.cpp index 9dcfc90cbd151c..1fbad9b9ff6e6c 100644 --- a/deps/icu-small/source/common/loclikely.cpp +++ b/deps/icu-small/source/common/loclikely.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: loclikely.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -22,6 +22,7 @@ #include "unicode/utypes.h" #include "unicode/locid.h" #include "unicode/putil.h" +#include "unicode/uchar.h" #include "unicode/uloc.h" #include "unicode/ures.h" #include "unicode/uscript.h" diff --git a/deps/icu-small/source/common/locmap.c b/deps/icu-small/source/common/locmap.cpp similarity index 83% rename from deps/icu-small/source/common/locmap.c rename to deps/icu-small/source/common/locmap.cpp index 1dba67a092a925..8e47c84b1ee741 100644 --- a/deps/icu-small/source/common/locmap.c +++ b/deps/icu-small/source/common/locmap.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -30,6 +30,7 @@ #include "locmap.h" #include "cstring.h" #include "cmemory.h" +#include "unicode/uloc.h" #if U_PLATFORM == U_PF_WINDOWS && defined(_MSC_VER) && (_MSC_VER >= 1500) /* @@ -40,10 +41,7 @@ * We might need to #include some Windows header and test for some version macro from there. * Or call some Windows function and see what it returns. */ -#define USE_WINDOWS_LOCALE_API -#endif - -#ifdef USE_WINDOWS_LOCALE_API +#define USE_WINDOWS_LCID_MAPPING_API #include #include #endif @@ -53,8 +51,8 @@ * The mapping from Win32 locale ID numbers to POSIX locale strings should * be the faster one. * - * Many LCID values come from winnt.h - * Some also come from http://www.microsoft.com/globaldev/reference/lcid-all.mspx + * Windows LCIDs are defined at https://msdn.microsoft.com/en-us/library/cc233965.aspx + * [MS-LCID] Windows Language Code Identifier (LCID) Reference */ /* @@ -126,7 +124,9 @@ static const ILcidPosixElement locmap_ ## id [] = // Keep static locale variables inside the function so that // it can be created properly during static init. // -// Note: This table should be updated periodically. Check the National Lanaguage Support API Reference Website. +// Note: This table should be updated periodically. Check the [MS-LCID] Windows Language Code Identifier +// (LCID) Reference defined at https://msdn.microsoft.com/en-us/library/cc233965.aspx +// // Microsoft is moving away from LCID in favor of locale name as of Vista. This table needs to be // maintained for support of older Windows version. // Update: Windows 7 (091130) @@ -138,6 +138,9 @@ static const ILcidPosixElement locmap_ ## id [] = //////////////////////////////////////////// */ +// TODO: For Windows ideally this table would be a list of exceptions rather than a complete list as +// LocaleNameToLCID and LCIDToLocaleName provide 90% of these. + ILCID_POSIX_ELEMENT_ARRAY(0x0436, af, af_ZA) ILCID_POSIX_SUBTABLE(ar) { @@ -213,6 +216,7 @@ ILCID_POSIX_SUBTABLE(ca) { ILCID_POSIX_ELEMENT_ARRAY(0x0483, co, co_FR) ILCID_POSIX_ELEMENT_ARRAY(0x045c, chr,chr_US) +// ICU has chosen different names for these. ILCID_POSIX_SUBTABLE(ckb) { {0x92, "ckb"}, {0x7c92, "ckb_Arab"}, @@ -225,6 +229,7 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0405, cs, cs_CZ) ILCID_POSIX_ELEMENT_ARRAY(0x0452, cy, cy_GB) ILCID_POSIX_ELEMENT_ARRAY(0x0406, da, da_DK) +// Windows doesn't know POSIX or BCP47 Unicode phonebook sort names ILCID_POSIX_SUBTABLE(de) { {0x07, "de"}, {0x0c07, "de_AT"}, @@ -239,6 +244,7 @@ ILCID_POSIX_SUBTABLE(de) { ILCID_POSIX_ELEMENT_ARRAY(0x0465, dv, dv_MV) ILCID_POSIX_ELEMENT_ARRAY(0x0408, el, el_GR) +// Windows uses an empty string for 'invariant' ILCID_POSIX_SUBTABLE(en) { {0x09, "en"}, {0x0c09, "en_AU"}, @@ -256,22 +262,23 @@ ILCID_POSIX_SUBTABLE(en) { {0x4809, "en_SG"}, {0x2C09, "en_TT"}, {0x0409, "en_US"}, - {0x007f, "en_US_POSIX"}, /* duplicate for roundtripping */ - {0x2409, "en_VI"}, /* Virgin Islands AKA Caribbean Islands (en_CB). */ + {0x007f, "en_US_POSIX"}, /* duplicate for round-tripping */ + {0x2409, "en_VI"}, /* Virgin Islands AKA Caribbean Islands (en_CB). On Windows8+ This is 0x1000 or dynamically assigned */ {0x1c09, "en_ZA"}, {0x3009, "en_ZW"}, {0x2409, "en_029"}, - {0x0409, "en_AS"}, /* Alias for en_US. Leave last. */ - {0x0409, "en_GU"}, /* Alias for en_US. Leave last. */ - {0x0409, "en_MH"}, /* Alias for en_US. Leave last. */ - {0x0409, "en_MP"}, /* Alias for en_US. Leave last. */ - {0x0409, "en_UM"} /* Alias for en_US. Leave last. */ + {0x0409, "en_AS"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ + {0x0409, "en_GU"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ + {0x0409, "en_MH"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ + {0x0409, "en_MP"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ + {0x0409, "en_UM"} /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ }; ILCID_POSIX_SUBTABLE(en_US_POSIX) { {0x007f, "en_US_POSIX"} /* duplicate for roundtripping */ }; +// Windows doesn't know POSIX or BCP47 Unicode traditional sort names ILCID_POSIX_SUBTABLE(es) { {0x0a, "es"}, {0x2c0a, "es_AR"}, @@ -297,7 +304,7 @@ ILCID_POSIX_SUBTABLE(es) { {0x200a, "es_VE"}, {0x580a, "es_419"}, {0x040a, "es_ES@collation=traditional"}, - {0x040a, "es@collation=traditional"} + {0x040a, "es@collation=traditional"} // Windows will treat this as es-ES@collation=traditional }; ILCID_POSIX_ELEMENT_ARRAY(0x0425, et, et_EE) @@ -310,6 +317,7 @@ ILCID_POSIX_SUBTABLE(fa) { {0x048c, "fa_AF"} /* Persian/Dari (Afghanistan) */ }; + /* duplicate for roundtripping */ ILCID_POSIX_SUBTABLE(fa_AF) { {0x8c, "fa_AF"}, /* Persian/Dari (Afghanistan) */ @@ -501,8 +509,9 @@ ILCID_POSIX_SUBTABLE(nl) { }; /* The "no" locale split into nb and nn. By default in ICU, "no" is nb.*/ +// TODO: Not all of these are needed on Windows, but I don't know how ICU treats preferred ones here. ILCID_POSIX_SUBTABLE(no) { - {0x14, "no"}, /* really nb_NO */ + {0x14, "no"}, /* really nb_NO - actually Windows differentiates between neutral (no region) and specific (with region) */ {0x7c14, "nb"}, /* really nb */ {0x0414, "nb_NO"}, /* really nb_NO. Keep first in the 414 list. */ {0x0414, "no_NO"}, /* really nb_NO */ @@ -591,6 +600,9 @@ ILCID_POSIX_SUBTABLE(ro) { {0x0818, "ro_MD"} }; +// TODO: This is almost certainly 'wrong'. 0 in Windows is a synonym for LOCALE_USER_DEFAULT. +// More likely this is a similar concept to the Windows 0x7f Invariant locale "" +// (Except that it's not invariant in ICU) ILCID_POSIX_SUBTABLE(root) { {0x00, "root"} }; @@ -730,6 +742,8 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0434, xh, xh_ZA) ILCID_POSIX_ELEMENT_ARRAY(0x043d, yi, yi) ILCID_POSIX_ELEMENT_ARRAY(0x046a, yo, yo_NG) +// Windows & ICU tend to different names for some of these +// TODO: Windows probably does not need all of these entries, but I don't know how the precedence works. ILCID_POSIX_SUBTABLE(zh) { {0x0004, "zh_Hans"}, {0x7804, "zh"}, @@ -753,6 +767,7 @@ ILCID_POSIX_SUBTABLE(zh) { {0x20804,"zh_Hans@collation=stroke"}, {0x20804,"zh_Hans_CN@collation=stroke"}, {0x20804,"zh_CN@collation=stroke"} + // TODO: Alternate collations for other LCIDs are missing, eg: 0x50804 }; ILCID_POSIX_ELEMENT_ARRAY(0x0435, zu, zu_ZA) @@ -991,7 +1006,7 @@ getPosixID(const ILcidPosixMap *this_0, uint32_t hostID) // ///////////////////////////////////// */ -#ifdef USE_WINDOWS_LOCALE_API +#ifdef USE_WINDOWS_LCID_MAPPING_API /* * Various language tags needs to be changed: * quz -> qu @@ -1017,43 +1032,56 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr UBool bLookup = TRUE; const char *pPosixID = NULL; -#ifdef USE_WINDOWS_LOCALE_API +#ifdef USE_WINDOWS_LCID_MAPPING_API // Note: Windows primary lang ID 0x92 in LCID is used for Central Kurdish and // GetLocaleInfo() maps such LCID to "ku". However, CLDR uses "ku" for // Northern Kurdish and "ckb" for Central Kurdish. For this reason, we cannot // use the Windows API to resolve locale ID for this specific case. if ((hostid & 0x3FF) != 0x92) { int32_t tmpLen = 0; - char locName[157]; /* ULOC_FULLNAME_CAPACITY */ + UChar windowsLocaleName[LOCALE_NAME_MAX_LENGTH]; // ULOC_FULLNAME_CAPACITY > LOCALE_NAME_MAX_LENGTH + char locName[LOCALE_NAME_MAX_LENGTH]; // ICU name can't be longer than Windows name - tmpLen = GetLocaleInfoA(hostid, LOCALE_SNAME, (LPSTR)locName, UPRV_LENGTHOF(locName)); + // Note: LOCALE_ALLOW_NEUTRAL_NAMES was enabled in Windows7+, prior versions did not handle neutral (no-region) locale names. + tmpLen = LCIDToLocaleName(hostid, (PWSTR)windowsLocaleName, UPRV_LENGTHOF(windowsLocaleName), LOCALE_ALLOW_NEUTRAL_NAMES); if (tmpLen > 1) { - /* Windows locale name may contain sorting variant, such as "es-ES_tradnl". - In such case, we need special mapping data found in the hardcoded table - in this source file. */ - char *p = uprv_strchr(locName, '_'); - if (p) { - /* Keep the base locale, without variant */ - *p = 0; - tmpLen = uprv_strlen(locName); - } - else { - /* No hardcoded table lookup necessary */ - bLookup = FALSE; - } - /* Change the tag separator from '-' to '_' */ - p = locName; - while (*p) { - if (*p == '-') { - *p = '_'; + int32_t i = 0; + // Only need to look up in table if have _, eg for de-de_phoneb type alternate sort. + bLookup = FALSE; + for (i = 0; i < UPRV_LENGTHOF(locName); i++) + { + locName[i] = (char)(windowsLocaleName[i]); + + // Windows locale name may contain sorting variant, such as "es-ES_tradnl". + // In such cases, we need special mapping data found in the hardcoded table + // in this source file. + if (windowsLocaleName[i] == L'_') + { + // Keep the base locale, without variant + // TODO: Should these be mapped from _phoneb to @collation=phonebook, etc.? + locName[i] = '\0'; + tmpLen = i; + bLookup = TRUE; + break; + } + else if (windowsLocaleName[i] == L'-') + { + // Windows names use -, ICU uses _ + locName[i] = '_'; + } + else if (windowsLocaleName[i] == L'\0') + { + // No point in doing more work than necessary + break; } - p++; } + // TODO: Need to understand this better, why isn't it an alias? FIX_LANGUAGE_ID_TAG(locName, tmpLen); pPosixID = locName; } } -#endif +#endif // USE_WINDOWS_LCID_MAPPING_API + if (bLookup) { const char *pCandidate = NULL; langID = LANGUAGE_LCID(hostid); @@ -1101,15 +1129,101 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr // POSIX --> LCID // This should only be called from uloc_getLCID. // The locale ID must be in canonical form. -// langID is separate so that this file doesn't depend on the uloc_* API. // ///////////////////////////////////// */ +U_CAPI uint32_t +uprv_convertToLCIDPlatform(const char* localeID) +{ + // The purpose of this function is to leverage native platform name->lcid + // conversion functionality when available. +#ifdef USE_WINDOWS_LCID_MAPPING_API + DWORD nameLCIDFlags = 0; + UErrorCode myStatus = U_ZERO_ERROR; + + // First check for a Windows name->LCID match, fall through to catch + // ICU special cases, but Windows may know it already. +#if LOCALE_ALLOW_NEUTRAL_NAMES + nameLCIDFlags = LOCALE_ALLOW_NEUTRAL_NAMES; +#endif /* LOCALE_ALLOW_NEUTRAL_NAMES */ + + int32_t len; + char collVal[ULOC_KEYWORDS_CAPACITY] = {}; + char baseName[ULOC_FULLNAME_CAPACITY] = {}; + const char * mylocaleID = localeID; + + // Check any for keywords. + if (uprv_strchr(localeID, '@')) + { + len = uloc_getKeywordValue(localeID, "collation", collVal, UPRV_LENGTHOF(collVal) - 1, &myStatus); + if (U_SUCCESS(myStatus) && len > 0) + { + // If it contains the keyword collation, return 0 so that the LCID lookup table will be used. + return 0; + } + else + { + // If the locale ID contains keywords other than collation, just use the base name. + len = uloc_getBaseName(localeID, baseName, UPRV_LENGTHOF(baseName) - 1, &myStatus); + + if (U_SUCCESS(myStatus) && len > 0) + { + baseName[len] = 0; + mylocaleID = baseName; + } + } + } + + char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; + // this will change it from de_DE@collation=phonebook to de-DE-u-co-phonebk form + int32_t bcp47Len = uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &myStatus); + + if (U_SUCCESS(myStatus)) + { + // Need it to be UTF-16, not 8-bit + wchar_t bcp47Tag[LOCALE_NAME_MAX_LENGTH] = {}; + int32_t i; + for (i = 0; i < UPRV_LENGTHOF(bcp47Tag); i++) + { + if (asciiBCP47Tag[i] == '\0') + { + break; + } + else + { + // Copy the character + bcp47Tag[i] = static_cast(asciiBCP47Tag[i]); + } + } + + if (i < (UPRV_LENGTHOF(bcp47Tag) - 1)) + { + // Ensure it's null terminated + bcp47Tag[i] = L'\0'; + LCID lcid = LocaleNameToLCID(bcp47Tag, nameLCIDFlags); + if (lcid > 0) + { + // Found LCID from windows, return that one, unless its completely ambiguous + // LOCALE_USER_DEFAULT and transients are OK because they will round trip + // for this process. + if (lcid != LOCALE_CUSTOM_UNSPECIFIED) + { + return lcid; + } + } + } + } +#endif /* USE_WINDOWS_LCID_MAPPING_API */ + + // No found, or not implemented on platforms without native name->lcid conversion + return 0; +} U_CAPI uint32_t uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status) { - + // This function does the table lookup when native platform name->lcid conversion isn't available, + // or for locales that don't follow patterns the platform expects. uint32_t low = 0; uint32_t high = gLocaleCount; uint32_t mid; diff --git a/deps/icu-small/source/common/locmap.h b/deps/icu-small/source/common/locmap.h index a9b892ee426fc4..2d7a3d37a04495 100644 --- a/deps/icu-small/source/common/locmap.h +++ b/deps/icu-small/source/common/locmap.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -32,7 +32,8 @@ U_CAPI int32_t uprv_convertToPosix(uint32_t hostid, char* posixID, int32_t posixIDCapacity, UErrorCode* status); -/* Don't call this function directly. Use uloc_getLCID instead. */ +/* Don't call these functions directly. Use uloc_getLCID instead. */ +U_CAPI uint32_t uprv_convertToLCIDPlatform(const char *localeID); // Leverage platform conversion if possible U_CAPI uint32_t uprv_convertToLCID(const char *langID, const char* posixID, UErrorCode* status); #endif /* LOCMAP_H */ diff --git a/deps/icu-small/source/common/locresdata.cpp b/deps/icu-small/source/common/locresdata.cpp index 9ede0cac20bfce..f890411c9affd7 100644 --- a/deps/icu-small/source/common/locresdata.cpp +++ b/deps/icu-small/source/common/locresdata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: loclikely.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/locutil.cpp b/deps/icu-small/source/common/locutil.cpp index 2f704953a2d0ca..02d2be50ca25e2 100644 --- a/deps/icu-small/source/common/locutil.cpp +++ b/deps/icu-small/source/common/locutil.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/locutil.h b/deps/icu-small/source/common/locutil.h index 64f7dcc2c052f7..31bfffd7a5920f 100644 --- a/deps/icu-small/source/common/locutil.h +++ b/deps/icu-small/source/common/locutil.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/messageimpl.h b/deps/icu-small/source/common/messageimpl.h index 980f777e8df7b4..dc7a6edd6c0e5f 100644 --- a/deps/icu-small/source/common/messageimpl.h +++ b/deps/icu-small/source/common/messageimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: messageimpl.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/messagepattern.cpp b/deps/icu-small/source/common/messagepattern.cpp index ddd2287e4cabd9..2f79780bd2c233 100644 --- a/deps/icu-small/source/common/messagepattern.cpp +++ b/deps/icu-small/source/common/messagepattern.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: messagepattern.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/msvcres.h b/deps/icu-small/source/common/msvcres.h index 0514ee440ef554..d6581b27ebce51 100644 --- a/deps/icu-small/source/common/msvcres.h +++ b/deps/icu-small/source/common/msvcres.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html //{{NO_DEPENDENCIES}} // Copyright (c) 2003-2010 International Business Machines diff --git a/deps/icu-small/source/common/mutex.h b/deps/icu-small/source/common/mutex.h index 78de718751f9f2..04c22b4a3767b1 100644 --- a/deps/icu-small/source/common/mutex.h +++ b/deps/icu-small/source/common/mutex.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/norm2_nfc_data.h b/deps/icu-small/source/common/norm2_nfc_data.h index 4ddba0f8ba64c4..9295404a35bac6 100644 --- a/deps/icu-small/source/common/norm2_nfc_data.h +++ b/deps/icu-small/source/common/norm2_nfc_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 1999-2016, International Business Machines diff --git a/deps/icu-small/source/common/norm2allmodes.h b/deps/icu-small/source/common/norm2allmodes.h index 943e83d56704c6..9516817e4aa8f3 100644 --- a/deps/icu-small/source/common/norm2allmodes.h +++ b/deps/icu-small/source/common/norm2allmodes.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/normalizer2.cpp b/deps/icu-small/source/common/normalizer2.cpp index 34f1cf063d50bc..dfdaa3bdce5f24 100644 --- a/deps/icu-small/source/common/normalizer2.cpp +++ b/deps/icu-small/source/common/normalizer2.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: normalizer2.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/normalizer2impl.cpp b/deps/icu-small/source/common/normalizer2impl.cpp index 906c03a689bc16..41305cc5878187 100644 --- a/deps/icu-small/source/common/normalizer2impl.cpp +++ b/deps/icu-small/source/common/normalizer2impl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: normalizer2impl.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/normalizer2impl.h b/deps/icu-small/source/common/normalizer2impl.h index a6bf967979f48a..946abee98f3df1 100644 --- a/deps/icu-small/source/common/normalizer2impl.h +++ b/deps/icu-small/source/common/normalizer2impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: normalizer2impl.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -176,7 +176,7 @@ class U_COMMON_API ReorderingBuffer : public UMemory { lastCC=0; } void copyReorderableSuffixTo(UnicodeString &s) const { - s.setTo(reorderStart, (int32_t)(limit-reorderStart)); + s.setTo(ConstChar16Ptr(reorderStart), (int32_t)(limit-reorderStart)); } private: /* diff --git a/deps/icu-small/source/common/normlzr.cpp b/deps/icu-small/source/common/normlzr.cpp index 3cf7446f174a4f..3911c90b5bb537 100644 --- a/deps/icu-small/source/common/normlzr.cpp +++ b/deps/icu-small/source/common/normlzr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************* @@ -23,6 +23,12 @@ #include "normalizer2impl.h" #include "uprops.h" // for uniset_getUnicode32Instance() +#if defined(_ARM64_) && defined(move32) + // System can define move32 intrinsics, but the char iters define move32 method + // using same undef trick in headers, so undef here to re-enable the method. +#undef move32 +#endif + U_NAMESPACE_BEGIN UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Normalizer) @@ -40,7 +46,7 @@ Normalizer::Normalizer(const UnicodeString& str, UNormalizationMode mode) : init(); } -Normalizer::Normalizer(const UChar *str, int32_t length, UNormalizationMode mode) : +Normalizer::Normalizer(ConstChar16Ptr str, int32_t length, UNormalizationMode mode) : UObject(), fFilteredNorm2(NULL), fNorm2(NULL), fUMode(mode), fOptions(0), text(new UCharCharacterIterator(str, length)), currentIndex(0), nextIndex(0), @@ -435,7 +441,7 @@ Normalizer::setText(const CharacterIterator& newText, } void -Normalizer::setText(const UChar* newText, +Normalizer::setText(ConstChar16Ptr newText, int32_t length, UErrorCode &status) { diff --git a/deps/icu-small/source/common/parsepos.cpp b/deps/icu-small/source/common/parsepos.cpp index af6ac6c1f7d1b7..56c6c788136846 100644 --- a/deps/icu-small/source/common/parsepos.cpp +++ b/deps/icu-small/source/common/parsepos.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/patternprops.cpp b/deps/icu-small/source/common/patternprops.cpp index 30c3f683914816..01e33ce109f57a 100644 --- a/deps/icu-small/source/common/patternprops.cpp +++ b/deps/icu-small/source/common/patternprops.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: patternprops.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/patternprops.h b/deps/icu-small/source/common/patternprops.h index f309c2dbadb083..a42eb3c244128a 100644 --- a/deps/icu-small/source/common/patternprops.h +++ b/deps/icu-small/source/common/patternprops.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: patternprops.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/pluralmap.cpp b/deps/icu-small/source/common/pluralmap.cpp index d3e892124ea24c..a85dd1c979ffef 100644 --- a/deps/icu-small/source/common/pluralmap.cpp +++ b/deps/icu-small/source/common/pluralmap.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines Corporation and diff --git a/deps/icu-small/source/common/pluralmap.h b/deps/icu-small/source/common/pluralmap.h index 76e95c5826003a..db644093a1fc46 100644 --- a/deps/icu-small/source/common/pluralmap.h +++ b/deps/icu-small/source/common/pluralmap.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/propname.cpp b/deps/icu-small/source/common/propname.cpp index 4107869ee1e0d4..a12eb7d9134a26 100644 --- a/deps/icu-small/source/common/propname.cpp +++ b/deps/icu-small/source/common/propname.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/propname.h b/deps/icu-small/source/common/propname.h index c93d3d75032503..1a8ced5b879062 100644 --- a/deps/icu-small/source/common/propname.h +++ b/deps/icu-small/source/common/propname.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/propname_data.h b/deps/icu-small/source/common/propname_data.h index 4863b26dc7ec12..c15b2a4e04f1ba 100644 --- a/deps/icu-small/source/common/propname_data.h +++ b/deps/icu-small/source/common/propname_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 1999-2016, International Business Machines diff --git a/deps/icu-small/source/common/propsvec.c b/deps/icu-small/source/common/propsvec.cpp similarity index 99% rename from deps/icu-small/source/common/propsvec.c rename to deps/icu-small/source/common/propsvec.cpp index ed4d89954b872f..056fcda9cf6869 100644 --- a/deps/icu-small/source/common/propsvec.c +++ b/deps/icu-small/source/common/propsvec.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: propsvec.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -499,6 +499,8 @@ upvec_compactToUTrie2Handler(void *context, UChar32 start, UChar32 end, int32_t rowIndex, uint32_t *row, int32_t columns, UErrorCode *pErrorCode) { + (void)row; + (void)columns; UPVecToUTrie2Context *toUTrie2=(UPVecToUTrie2Context *)context; if(starttrie, start, end, (uint32_t)rowIndex, TRUE, pErrorCode); diff --git a/deps/icu-small/source/common/propsvec.h b/deps/icu-small/source/common/propsvec.h index b34e4ee8ff444e..39080615ea3811 100644 --- a/deps/icu-small/source/common/propsvec.h +++ b/deps/icu-small/source/common/propsvec.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: propsvec.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/punycode.cpp b/deps/icu-small/source/common/punycode.cpp index 90fd1692466a47..4f0b9ea9cd385f 100644 --- a/deps/icu-small/source/common/punycode.cpp +++ b/deps/icu-small/source/common/punycode.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: punycode.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/punycode.h b/deps/icu-small/source/common/punycode.h index ff23eb0c377d5d..5d8a243175cca3 100644 --- a/deps/icu-small/source/common/punycode.h +++ b/deps/icu-small/source/common/punycode.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: punycode.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/putil.cpp b/deps/icu-small/source/common/putil.cpp index c2ede806edcbea..d0714fff33c8ec 100644 --- a/deps/icu-small/source/common/putil.cpp +++ b/deps/icu-small/source/common/putil.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -43,8 +43,24 @@ // Must be before any other #includes. #include "uposixdefs.h" -/* include ICU headers */ -#include "unicode/utypes.h" +// First, the platform type. Need this for U_PLATFORM. +#include "unicode/platform.h" + +#if U_PLATFORM == U_PF_MINGW && defined __STRICT_ANSI__ +/* tzset isn't defined in strict ANSI on MinGW. */ +#undef __STRICT_ANSI__ +#endif + +/* + * Cygwin with GCC requires inclusion of time.h after the above disabling strict asci mode statement. + */ +#include + +#if !U_PLATFORM_USES_ONLY_WIN32_API +#include +#endif + +/* include the rest of the ICU headers */ #include "unicode/putil.h" #include "unicode/ustring.h" #include "putilimp.h" @@ -76,14 +92,29 @@ * Should Cygwin be included as well (U_PLATFORM_HAS_WIN32_API) * to use native APIs as much as possible? */ +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE # define NOIME # define NOMCX # include +# include "unicode\uloc.h" +#if U_PLATFORM_HAS_WINUWP_API == 0 # include "wintz.h" +#else // U_PLATFORM_HAS_WINUWP_API +typedef PVOID LPMSG; // TODO: figure out how to get rid of this typedef +#include +#include +#include +#include + +using namespace ABI::Windows::Foundation; +using namespace Microsoft::WRL; +using namespace Microsoft::WRL::Wrappers; +#endif #elif U_PLATFORM == U_PF_OS400 # include # include /* error code structure */ @@ -104,20 +135,6 @@ # include #endif -#if (U_PF_MINGW <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(__STRICT_ANSI__) -/* tzset isn't defined in strict ANSI on Cygwin and MinGW. */ -#undef __STRICT_ANSI__ -#endif - -/* - * Cygwin with GCC requires inclusion of time.h after the above disabling strict asci mode statement. - */ -#include - -#if !U_PLATFORM_USES_ONLY_WIN32_API -#include -#endif - /* * Only include langinfo.h if we have a way to get the codeset. If we later * depend on more feature, we can test on U_HAVE_NL_LANGINFO. @@ -651,7 +668,7 @@ uprv_timezone() /* Note that U_TZNAME does *not* have to be tzname, but if it is, some platforms need to have it declared here. */ -#if defined(U_TZNAME) && (U_PLATFORM == U_PF_IRIX || U_PLATFORM_IS_DARWIN_BASED || (U_PLATFORM == U_PF_CYGWIN && !U_PLATFORM_USES_ONLY_WIN32_API)) +#if defined(U_TZNAME) && (U_PLATFORM == U_PF_IRIX || U_PLATFORM_IS_DARWIN_BASED) /* RS6000 and others reject char **tzname. */ extern U_IMPORT char *U_TZNAME[]; #endif @@ -1008,16 +1025,65 @@ uprv_tzname_clear_cache() #endif } +// With the Universal Windows Platform we can just ask Windows for the name +#if U_PLATFORM_HAS_WINUWP_API +U_CAPI const char* U_EXPORT2 +uprv_getWindowsTimeZone() +{ + // Get default Windows timezone. + ComPtr calendar; + HRESULT hr = RoActivateInstance( + HStringReference(RuntimeClass_Windows_Globalization_Calendar).Get(), + &calendar); + if (SUCCEEDED(hr)) + { + ComPtr timezone; + hr = calendar.As(&timezone); + if (SUCCEEDED(hr)) + { + HString timezoneString; + hr = timezone->GetTimeZone(timezoneString.GetAddressOf()); + if (SUCCEEDED(hr)) + { + int32_t length = wcslen(timezoneString.GetRawBuffer(NULL)); + char* asciiId = (char*)uprv_calloc(length + 1, sizeof(char)); + if (asciiId != nullptr) + { + u_UCharsToChars((UChar*)timezoneString.GetRawBuffer(NULL), asciiId, length); + return asciiId; + } + } + } + } + + // Failed + return nullptr; +} +#endif + U_CAPI const char* U_EXPORT2 uprv_tzname(int n) { const char *tzid = NULL; #if U_PLATFORM_USES_ONLY_WIN32_API +#if U_PLATFORM_HAS_WINUWP_API > 0 + tzid = uprv_getWindowsTimeZone(); +#else tzid = uprv_detectWindowsTimeZone(); +#endif if (tzid != NULL) { return tzid; } + +#ifndef U_TZNAME + // The return value is free'd in timezone.cpp on Windows because + // the other code path returns a pointer to a heap location. + // If we don't have a name already, then tzname wouldn't be any + // better, so just fall back. + return uprv_strdup("Etc/UTC"); +#endif // !U_TZNAME + #else /*#if U_PLATFORM_IS_DARWIN_BASED @@ -1162,7 +1228,8 @@ UInitOnce gTimeZoneFilesInitOnce = U_INITONCE_INITIALIZER; static CharString *gTimeZoneFilesDirectory = NULL; #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API - static char *gCorrectedPOSIXLocale = NULL; /* Heap allocated */ + static char *gCorrectedPOSIXLocale = NULL; /* Sometimes heap allocated */ + static bool gCorrectedPOSIXLocaleHeapAllocated = false; #endif static UBool U_CALLCONV putil_cleanup(void) @@ -1183,9 +1250,10 @@ static UBool U_CALLCONV putil_cleanup(void) #endif #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API - if (gCorrectedPOSIXLocale) { + if (gCorrectedPOSIXLocale && gCorrectedPOSIXLocaleHeapAllocated) { uprv_free(gCorrectedPOSIXLocale); gCorrectedPOSIXLocale = NULL; + gCorrectedPOSIXLocaleHeapAllocated = false; } #endif return TRUE; @@ -1297,7 +1365,9 @@ static void U_CALLCONV dataDirectoryInitFn() { */ # if !defined(ICU_NO_USER_DATA_OVERRIDE) && !UCONFIG_NO_FILE_IO /* First try to get the environment variable */ - path=getenv("ICU_DATA"); +# if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP does not support getenv + path=getenv("ICU_DATA"); +# endif # endif /* ICU_DATA_DIR may be set as a compile option. @@ -1326,9 +1396,35 @@ static void U_CALLCONV dataDirectoryInitFn() { } #endif +#if defined(ICU_DATA_DIR_WINDOWS) && U_PLATFORM_HAS_WINUWP_API != 0 + // Use data from the %windir%\globalization\icu directory + // This is only available if ICU is built as a system component + char datadir_path_buffer[MAX_PATH]; + UINT length = GetWindowsDirectoryA(datadir_path_buffer, UPRV_LENGTHOF(datadir_path_buffer)); + if (length > 0 && length < (UPRV_LENGTHOF(datadir_path_buffer) - sizeof(ICU_DATA_DIR_WINDOWS) - 1)) + { + if (datadir_path_buffer[length - 1] != '\\') + { + datadir_path_buffer[length++] = '\\'; + datadir_path_buffer[length] = '\0'; + } + + if ((length + 1 + sizeof(ICU_DATA_DIR_WINDOWS)) < UPRV_LENGTHOF(datadir_path_buffer)) + { + uprv_strcat(datadir_path_buffer, ICU_DATA_DIR_WINDOWS); + path = datadir_path_buffer; + } + } +#endif + if(path==NULL) { /* It looks really bad, set it to something. */ +#if U_PLATFORM_HAS_WIN32_API + // Windows UWP will require icudtl.dat file in same directory as icuuc.dll + path = ".\\"; +#else path = ""; +#endif } u_setDataDirectory(path); @@ -1366,7 +1462,12 @@ static void U_CALLCONV TimeZoneDataDirInitFn(UErrorCode &status) { status = U_MEMORY_ALLOCATION_ERROR; return; } +#if U_PLATFORM_HAS_WINUWP_API == 0 const char *dir = getenv("ICU_TIMEZONE_FILES_DIR"); +#else + // TODO: UWP does not support alternate timezone data directories at this time + const char *dir = ""; +#endif // U_PLATFORM_HAS_WINUWP_API #if defined(U_TIMEZONE_FILES_DIR) if (dir == NULL) { dir = TO_STRING(U_TIMEZONE_FILES_DIR); @@ -1603,6 +1704,7 @@ The leftmost codepage (.xxx) wins. if (gCorrectedPOSIXLocale == NULL) { gCorrectedPOSIXLocale = correctedPOSIXLocale; + gCorrectedPOSIXLocaleHeapAllocated = true; ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); correctedPOSIXLocale = NULL; } @@ -1618,25 +1720,115 @@ The leftmost codepage (.xxx) wins. UErrorCode status = U_ZERO_ERROR; char *correctedPOSIXLocale = 0; + // If we have already figured this out just use the cached value if (gCorrectedPOSIXLocale != NULL) { return gCorrectedPOSIXLocale; } - LCID id = GetThreadLocale(); - correctedPOSIXLocale = static_cast(uprv_malloc(POSIX_LOCALE_CAPACITY + 1)); - if (correctedPOSIXLocale) { - int32_t posixLen = uprv_convertToPosix(id, correctedPOSIXLocale, POSIX_LOCALE_CAPACITY, &status); - if (U_SUCCESS(status)) { - *(correctedPOSIXLocale + posixLen) = 0; - gCorrectedPOSIXLocale = correctedPOSIXLocale; - ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); - } else { - uprv_free(correctedPOSIXLocale); + // No cached value, need to determine the current value + static WCHAR windowsLocale[LOCALE_NAME_MAX_LENGTH]; +#if U_PLATFORM_HAS_WINUWP_API == 0 + // If not a Universal Windows App, we'll need user default language. + // Vista and above should use Locale Names instead of LCIDs + int length = GetUserDefaultLocaleName(windowsLocale, UPRV_LENGTHOF(windowsLocale)); +#else + // In a UWP app, we want the top language that the application and user agreed upon + ComPtr> languageList; + + ComPtr applicationLanguagesStatics; + HRESULT hr = GetActivationFactory( + HStringReference(RuntimeClass_Windows_Globalization_ApplicationLanguages).Get(), + &applicationLanguagesStatics); + if (SUCCEEDED(hr)) + { + hr = applicationLanguagesStatics->get_Languages(&languageList); + } + + if (FAILED(hr)) + { + // If there is no application context, then use the top language from the user language profile + ComPtr globalizationPreferencesStatics; + hr = GetActivationFactory( + HStringReference(RuntimeClass_Windows_System_UserProfile_GlobalizationPreferences).Get(), + &globalizationPreferencesStatics); + if (SUCCEEDED(hr)) + { + hr = globalizationPreferencesStatics->get_Languages(&languageList); + } + } + + // We have a list of languages, ICU knows one, so use the top one for our locale + HString topLanguage; + if (SUCCEEDED(hr)) + { + hr = languageList->GetAt(0, topLanguage.GetAddressOf()); + } + + if (FAILED(hr)) + { + // Unexpected, use en-US by default + if (gCorrectedPOSIXLocale == NULL) { + gCorrectedPOSIXLocale = "en_US"; + } + + return gCorrectedPOSIXLocale; + } + + // ResolveLocaleName will get a likely subtags form consistent with Windows behavior. + int length = ResolveLocaleName(topLanguage.GetRawBuffer(NULL), windowsLocale, UPRV_LENGTHOF(windowsLocale)); +#endif + // Now we should have a Windows locale name that needs converted to the POSIX style, + if (length > 0) + { + // First we need to go from UTF-16 to char (and also convert from _ to - while we're at it.) + char modifiedWindowsLocale[LOCALE_NAME_MAX_LENGTH]; + + int32_t i; + for (i = 0; i < UPRV_LENGTHOF(modifiedWindowsLocale); i++) + { + if (windowsLocale[i] == '_') + { + modifiedWindowsLocale[i] = '-'; + } + else + { + modifiedWindowsLocale[i] = static_cast(windowsLocale[i]); + } + + if (modifiedWindowsLocale[i] == '\0') + { + break; + } + } + + if (i >= UPRV_LENGTHOF(modifiedWindowsLocale)) + { + // Ran out of room, can't really happen, maybe we'll be lucky about a matching + // locale when tags are dropped + modifiedWindowsLocale[UPRV_LENGTHOF(modifiedWindowsLocale) - 1] = '\0'; + } + + // Now normalize the resulting name + if (correctedPOSIXLocale) + { + int32_t posixLen = uloc_canonicalize(modifiedWindowsLocale, correctedPOSIXLocale, POSIX_LOCALE_CAPACITY, &status); + if (U_SUCCESS(status)) + { + *(correctedPOSIXLocale + posixLen) = 0; + gCorrectedPOSIXLocale = correctedPOSIXLocale; + gCorrectedPOSIXLocaleHeapAllocated = true; + ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); + } + else + { + uprv_free(correctedPOSIXLocale); + } } } + // If unable to find a locale we can agree upon, use en-US by default if (gCorrectedPOSIXLocale == NULL) { - return "en_US"; + gCorrectedPOSIXLocale = "en_US"; } return gCorrectedPOSIXLocale; @@ -1923,8 +2115,34 @@ int_getDefaultCodepage() #elif U_PLATFORM_USES_ONLY_WIN32_API static char codepage[64]; - sprintf(codepage, "windows-%d", GetACP()); - return codepage; + DWORD codepageNumber = 0; + +#if U_PLATFORM_HAS_WINUWP_API > 0 + // UWP doesn't have a direct API to get the default ACP as Microsoft would rather + // have folks use Unicode than a "system" code page, however this is the same + // codepage as the system default locale codepage. (FWIW, the system locale is + // ONLY used for codepage, it should never be used for anything else) + GetLocaleInfoEx(LOCALE_NAME_SYSTEM_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER, + (LPWSTR)&codepageNumber, sizeof(codepageNumber) / sizeof(WCHAR)); +#else + // Win32 apps can call GetACP + codepageNumber = GetACP(); +#endif + // Special case for UTF-8 + if (codepageNumber == 65001) + { + return "UTF-8"; + } + // Windows codepages can look like windows-1252, so format the found number + // the numbers are eclectic, however all valid system code pages, besides UTF-8 + // are between 3 and 19999 + if (codepageNumber > 0 && codepageNumber < 20000) + { + sprintf(codepage, "windows-%ld", codepageNumber); + return codepage; + } + // If the codepage number call failed then return UTF-8 + return "UTF-8"; #elif U_POSIX_LOCALE static char codesetName[100]; diff --git a/deps/icu-small/source/common/putilimp.h b/deps/icu-small/source/common/putilimp.h index cb783508255dd6..b797a9a280f401 100644 --- a/deps/icu-small/source/common/putilimp.h +++ b/deps/icu-small/source/common/putilimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -87,7 +87,7 @@ typedef size_t uintptr_t; #ifdef U_HAVE_NL_LANGINFO_CODESET /* Use the predefined value. */ -#elif U_PLATFORM_HAS_WIN32_API || U_PLATFORM == U_PF_ANDROID || U_PLATFORM == U_PF_QNX +#elif U_PLATFORM_USES_ONLY_WIN32_API || U_PLATFORM == U_PF_ANDROID || U_PLATFORM == U_PF_QNX # define U_HAVE_NL_LANGINFO_CODESET 0 #else # define U_HAVE_NL_LANGINFO_CODESET 1 @@ -106,7 +106,10 @@ typedef size_t uintptr_t; #ifdef U_TZSET /* Use the predefined value. */ #elif U_PLATFORM_USES_ONLY_WIN32_API + // UWP doesn't support tzset or environment variables for tz +#if U_PLATFORM_HAS_WINUWP_API == 0 # define U_TZSET _tzset +#endif #elif U_PLATFORM == U_PF_OS400 /* not defined */ #else @@ -141,7 +144,10 @@ typedef size_t uintptr_t; #ifdef U_TZNAME /* Use the predefined value. */ #elif U_PLATFORM_USES_ONLY_WIN32_API + /* not usable on all windows platforms */ +#if U_PLATFORM_HAS_WINUWP_API == 0 # define U_TZNAME _tzname +#endif #elif U_PLATFORM == U_PF_OS400 /* not defined */ #else diff --git a/deps/icu-small/source/common/rbbi.cpp b/deps/icu-small/source/common/rbbi.cpp index daba40b741406d..2a501bf1671072 100644 --- a/deps/icu-small/source/common/rbbi.cpp +++ b/deps/icu-small/source/common/rbbi.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** diff --git a/deps/icu-small/source/common/rbbidata.cpp b/deps/icu-small/source/common/rbbidata.cpp index afa87eb6a83f6b..ecdc8f416560d4 100644 --- a/deps/icu-small/source/common/rbbidata.cpp +++ b/deps/icu-small/source/common/rbbidata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** diff --git a/deps/icu-small/source/common/rbbidata.h b/deps/icu-small/source/common/rbbidata.h index 0d6cde2d942284..d33ef7d45e5dc9 100644 --- a/deps/icu-small/source/common/rbbidata.h +++ b/deps/icu-small/source/common/rbbidata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: rbbidata.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/rbbinode.cpp b/deps/icu-small/source/common/rbbinode.cpp index d0949a3f7f045a..2181d81acad2f2 100644 --- a/deps/icu-small/source/common/rbbinode.cpp +++ b/deps/icu-small/source/common/rbbinode.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** diff --git a/deps/icu-small/source/common/rbbinode.h b/deps/icu-small/source/common/rbbinode.h index ac26ceefaf449f..e33662167fe3fd 100644 --- a/deps/icu-small/source/common/rbbinode.h +++ b/deps/icu-small/source/common/rbbinode.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: diff --git a/deps/icu-small/source/common/rbbirb.cpp b/deps/icu-small/source/common/rbbirb.cpp index 475fdd7f8369e7..b94ae9605f737b 100644 --- a/deps/icu-small/source/common/rbbirb.cpp +++ b/deps/icu-small/source/common/rbbirb.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // file: rbbirb.cpp diff --git a/deps/icu-small/source/common/rbbirb.h b/deps/icu-small/source/common/rbbirb.h index 1a9d3023254139..3cde8da3cc47a5 100644 --- a/deps/icu-small/source/common/rbbirb.h +++ b/deps/icu-small/source/common/rbbirb.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // rbbirb.h diff --git a/deps/icu-small/source/common/rbbirpt.h b/deps/icu-small/source/common/rbbirpt.h index 542a396df089b7..b94c4c25cbfb8c 100644 --- a/deps/icu-small/source/common/rbbirpt.h +++ b/deps/icu-small/source/common/rbbirpt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html //--------------------------------------------------------------------------------- // diff --git a/deps/icu-small/source/common/rbbiscan.cpp b/deps/icu-small/source/common/rbbiscan.cpp index 57432509454057..6688c965c3f721 100644 --- a/deps/icu-small/source/common/rbbiscan.cpp +++ b/deps/icu-small/source/common/rbbiscan.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // file: rbbiscan.cpp @@ -1179,13 +1179,12 @@ RBBINode *RBBIRuleScanner::pushNewNode(RBBINode::NodeType t) { if (U_FAILURE(*fRB->fStatus)) { return NULL; } - fNodeStackPtr++; - if (fNodeStackPtr >= kStackSize) { - error(U_BRK_INTERNAL_ERROR); + if (fNodeStackPtr >= kStackSize - 1) { + error(U_BRK_RULE_SYNTAX); RBBIDebugPuts("RBBIRuleScanner::pushNewNode - stack overflow."); - *fRB->fStatus = U_BRK_INTERNAL_ERROR; return NULL; } + fNodeStackPtr++; fNodeStack[fNodeStackPtr] = new RBBINode(t); if (fNodeStack[fNodeStackPtr] == NULL) { *fRB->fStatus = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/common/rbbiscan.h b/deps/icu-small/source/common/rbbiscan.h index 6be2f9668ff6cf..3d484db0e9be5d 100644 --- a/deps/icu-small/source/common/rbbiscan.h +++ b/deps/icu-small/source/common/rbbiscan.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // rbbiscan.h diff --git a/deps/icu-small/source/common/rbbisetb.cpp b/deps/icu-small/source/common/rbbisetb.cpp index 22ec28c1350638..d17916c9e9e1ba 100644 --- a/deps/icu-small/source/common/rbbisetb.cpp +++ b/deps/icu-small/source/common/rbbisetb.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // rbbisetb.cpp diff --git a/deps/icu-small/source/common/rbbisetb.h b/deps/icu-small/source/common/rbbisetb.h index 89bfb9865cda15..a7d1e7af3bcfb2 100644 --- a/deps/icu-small/source/common/rbbisetb.h +++ b/deps/icu-small/source/common/rbbisetb.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // rbbisetb.h diff --git a/deps/icu-small/source/common/rbbistbl.cpp b/deps/icu-small/source/common/rbbistbl.cpp index f48485868c81e0..d90992290c3e63 100644 --- a/deps/icu-small/source/common/rbbistbl.cpp +++ b/deps/icu-small/source/common/rbbistbl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // file: rbbistbl.cpp Implementation of the ICU RBBISymbolTable class diff --git a/deps/icu-small/source/common/rbbitblb.cpp b/deps/icu-small/source/common/rbbitblb.cpp index c765e610526552..b3e6ca51d159a5 100644 --- a/deps/icu-small/source/common/rbbitblb.cpp +++ b/deps/icu-small/source/common/rbbitblb.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/rbbitblb.h b/deps/icu-small/source/common/rbbitblb.h index d71a0245874b5d..10415018785209 100644 --- a/deps/icu-small/source/common/rbbitblb.h +++ b/deps/icu-small/source/common/rbbitblb.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // rbbitblb.h diff --git a/deps/icu-small/source/common/resbund.cpp b/deps/icu-small/source/common/resbund.cpp index 2976791761f88f..29c3463ed59396 100644 --- a/deps/icu-small/source/common/resbund.cpp +++ b/deps/icu-small/source/common/resbund.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/resbund_cnv.cpp b/deps/icu-small/source/common/resbund_cnv.cpp index 80a4daa3b7f627..ae854fe739cd32 100644 --- a/deps/icu-small/source/common/resbund_cnv.cpp +++ b/deps/icu-small/source/common/resbund_cnv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: resbund_cnv.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/resource.cpp b/deps/icu-small/source/common/resource.cpp index 62b3aa46a5c083..3d41a16029f24e 100644 --- a/deps/icu-small/source/common/resource.cpp +++ b/deps/icu-small/source/common/resource.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/resource.h b/deps/icu-small/source/common/resource.h index 43c3309b5e9917..3dbff785ef12a8 100644 --- a/deps/icu-small/source/common/resource.h +++ b/deps/icu-small/source/common/resource.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/ruleiter.cpp b/deps/icu-small/source/common/ruleiter.cpp index 6e27b4dd8c609e..41eea23c0dcb32 100644 --- a/deps/icu-small/source/common/ruleiter.cpp +++ b/deps/icu-small/source/common/ruleiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ruleiter.h b/deps/icu-small/source/common/ruleiter.h index b0b8e5435f49c6..b6edc657aff261 100644 --- a/deps/icu-small/source/common/ruleiter.h +++ b/deps/icu-small/source/common/ruleiter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/schriter.cpp b/deps/icu-small/source/common/schriter.cpp index cc413666f1a838..f852800aaae6bd 100644 --- a/deps/icu-small/source/common/schriter.cpp +++ b/deps/icu-small/source/common/schriter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/serv.cpp b/deps/icu-small/source/common/serv.cpp index 9f05c1943ae1b6..8913b21e69457d 100644 --- a/deps/icu-small/source/common/serv.cpp +++ b/deps/icu-small/source/common/serv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/serv.h b/deps/icu-small/source/common/serv.h index c82c6d1dd8197f..70695839a8f3ce 100644 --- a/deps/icu-small/source/common/serv.h +++ b/deps/icu-small/source/common/serv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/servlk.cpp b/deps/icu-small/source/common/servlk.cpp index cdd4e3f7f0c1ab..27b046f1e504f5 100644 --- a/deps/icu-small/source/common/servlk.cpp +++ b/deps/icu-small/source/common/servlk.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/servlkf.cpp b/deps/icu-small/source/common/servlkf.cpp index d8617cee489f21..6e46bd2079722a 100644 --- a/deps/icu-small/source/common/servlkf.cpp +++ b/deps/icu-small/source/common/servlkf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/servloc.h b/deps/icu-small/source/common/servloc.h index 5a2b669d7f9d90..501989424423ea 100644 --- a/deps/icu-small/source/common/servloc.h +++ b/deps/icu-small/source/common/servloc.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/servls.cpp b/deps/icu-small/source/common/servls.cpp index 10f3b88aa7ba4f..907fe7fecfe1fb 100644 --- a/deps/icu-small/source/common/servls.cpp +++ b/deps/icu-small/source/common/servls.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/servnotf.cpp b/deps/icu-small/source/common/servnotf.cpp index 3d94c8690dcbf0..5159452f0a32da 100644 --- a/deps/icu-small/source/common/servnotf.cpp +++ b/deps/icu-small/source/common/servnotf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/servnotf.h b/deps/icu-small/source/common/servnotf.h index 72ae93e6277000..cf92fc169e927f 100644 --- a/deps/icu-small/source/common/servnotf.h +++ b/deps/icu-small/source/common/servnotf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/servrbf.cpp b/deps/icu-small/source/common/servrbf.cpp index f67ed026ee76e2..3f143afadf62bb 100644 --- a/deps/icu-small/source/common/servrbf.cpp +++ b/deps/icu-small/source/common/servrbf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/servslkf.cpp b/deps/icu-small/source/common/servslkf.cpp index c01a2ad4c1c153..4aa10414a038d3 100644 --- a/deps/icu-small/source/common/servslkf.cpp +++ b/deps/icu-small/source/common/servslkf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /** ******************************************************************************* diff --git a/deps/icu-small/source/common/sharedobject.cpp b/deps/icu-small/source/common/sharedobject.cpp index 8e5095e129255a..37aa458e00f98f 100644 --- a/deps/icu-small/source/common/sharedobject.cpp +++ b/deps/icu-small/source/common/sharedobject.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/sharedobject.h b/deps/icu-small/source/common/sharedobject.h index 6e205b14ba9798..783b55948a8248 100644 --- a/deps/icu-small/source/common/sharedobject.h +++ b/deps/icu-small/source/common/sharedobject.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/simpleformatter.cpp b/deps/icu-small/source/common/simpleformatter.cpp index eaeb60de143367..f866e0a1a120e2 100644 --- a/deps/icu-small/source/common/simpleformatter.cpp +++ b/deps/icu-small/source/common/simpleformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/sprpimpl.h b/deps/icu-small/source/common/sprpimpl.h index 56c2f86eeff74f..aff40ad0dab671 100644 --- a/deps/icu-small/source/common/sprpimpl.h +++ b/deps/icu-small/source/common/sprpimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: sprpimpl.h - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/stringpiece.cpp b/deps/icu-small/source/common/stringpiece.cpp index b032b474f65616..d4f7f310bafc7d 100644 --- a/deps/icu-small/source/common/stringpiece.cpp +++ b/deps/icu-small/source/common/stringpiece.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2013, International Business Machines // Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/common/stringtriebuilder.cpp b/deps/icu-small/source/common/stringtriebuilder.cpp index 075d7c4324b0e5..cf5b7b73ae2c1f 100644 --- a/deps/icu-small/source/common/stringtriebuilder.cpp +++ b/deps/icu-small/source/common/stringtriebuilder.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: stringtriebuilder.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uarrsort.c b/deps/icu-small/source/common/uarrsort.cpp similarity index 98% rename from deps/icu-small/source/common/uarrsort.c rename to deps/icu-small/source/common/uarrsort.cpp index bb1b5bdd785feb..03c4d4e7fc44aa 100644 --- a/deps/icu-small/source/common/uarrsort.c +++ b/deps/icu-small/source/common/uarrsort.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uarrsort.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -38,16 +38,19 @@ enum { U_CAPI int32_t U_EXPORT2 uprv_uint16Comparator(const void *context, const void *left, const void *right) { + (void)context; return (int32_t)*(const uint16_t *)left - (int32_t)*(const uint16_t *)right; } U_CAPI int32_t U_EXPORT2 uprv_int32Comparator(const void *context, const void *left, const void *right) { + (void)context; return *(const int32_t *)left - *(const int32_t *)right; } U_CAPI int32_t U_EXPORT2 uprv_uint32Comparator(const void *context, const void *left, const void *right) { + (void)context; uint32_t l=*(const uint32_t *)left, r=*(const uint32_t *)right; /* compare directly because (l-r) would overflow the int32_t result */ diff --git a/deps/icu-small/source/common/uarrsort.h b/deps/icu-small/source/common/uarrsort.h index 8b25cc5d7f5e83..a55dca5b9eabfe 100644 --- a/deps/icu-small/source/common/uarrsort.h +++ b/deps/icu-small/source/common/uarrsort.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uarrsort.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uassert.h b/deps/icu-small/source/common/uassert.h index 10816dacf56c08..2c080eb402f07c 100644 --- a/deps/icu-small/source/common/uassert.h +++ b/deps/icu-small/source/common/uassert.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/ubidi.c b/deps/icu-small/source/common/ubidi.cpp similarity index 97% rename from deps/icu-small/source/common/ubidi.c rename to deps/icu-small/source/common/ubidi.cpp index 3c9497862639ba..8e2fc36e5f1753 100644 --- a/deps/icu-small/source/common/ubidi.c +++ b/deps/icu-small/source/common/ubidi.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ubidi.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -447,12 +447,12 @@ getDirProps(UBiDi *pBiDi) { UBool removeBiDiControls = (UBool)(pBiDi->reorderingOptions & UBIDI_OPTION_REMOVE_CONTROLS); - typedef enum { + enum State { NOT_SEEKING_STRONG, /* 0: not contextual paraLevel, not after FSI */ SEEKING_STRONG_FOR_PARA, /* 1: looking for first strong char in para */ SEEKING_STRONG_FOR_FSI, /* 2: looking for first strong after FSI */ LOOKING_FOR_PDI /* 3: found strong after FSI, looking for PDI */ - } State; + }; State state; DirProp lastStrong=ON; /* for default level & inverse BiDi */ /* The following stacks are used to manage isolate sequences. Those @@ -466,7 +466,7 @@ getDirProps(UBiDi *pBiDi) { int32_t isolateStartStack[UBIDI_MAX_EXPLICIT_LEVEL+1]; /* The following stack contains the last known state before encountering the initiator of an isolate sequence */ - int8_t previousStateStack[UBIDI_MAX_EXPLICIT_LEVEL+1]; + State previousStateStack[UBIDI_MAX_EXPLICIT_LEVEL+1]; int32_t stackLast=-1; if(pBiDi->reorderingOptions & UBIDI_OPTION_STREAMING) @@ -677,7 +677,9 @@ bracketInit(UBiDi *pBiDi, BracketData *bd) { bd->isoRuns[0].start=0; bd->isoRuns[0].limit=0; bd->isoRuns[0].level=GET_PARALEVEL(pBiDi, 0); - bd->isoRuns[0].lastStrong=bd->isoRuns[0].lastBase=bd->isoRuns[0].contextDir=GET_PARALEVEL(pBiDi, 0)&1; + UBiDiLevel t = GET_PARALEVEL(pBiDi, 0) & 1; + bd->isoRuns[0].lastStrong = bd->isoRuns[0].lastBase = t; + bd->isoRuns[0].contextDir = (UBiDiDirection)t; bd->isoRuns[0].contextPos=0; if(pBiDi->openingsMemory) { bd->openings=pBiDi->openingsMemory; @@ -696,7 +698,8 @@ bracketProcessB(BracketData *bd, UBiDiLevel level) { bd->isoRunLast=0; bd->isoRuns[0].limit=0; bd->isoRuns[0].level=level; - bd->isoRuns[0].lastStrong=bd->isoRuns[0].lastBase=bd->isoRuns[0].contextDir=level&1; + bd->isoRuns[0].lastStrong=bd->isoRuns[0].lastBase=level&1; + bd->isoRuns[0].contextDir=(UBiDiDirection)(level&1); bd->isoRuns[0].contextPos=0; } @@ -712,8 +715,9 @@ bracketProcessBoundary(BracketData *bd, int32_t lastCcPos, contextLevel=embeddingLevel; pLastIsoRun->limit=pLastIsoRun->start; pLastIsoRun->level=embeddingLevel; - pLastIsoRun->lastStrong=pLastIsoRun->lastBase=pLastIsoRun->contextDir=contextLevel&1; - pLastIsoRun->contextPos=lastCcPos; + pLastIsoRun->lastStrong=pLastIsoRun->lastBase=contextLevel&1; + pLastIsoRun->contextDir=(UBiDiDirection)(contextLevel&1); + pLastIsoRun->contextPos=(UBiDiDirection)lastCcPos; } /* LRI or RLI */ @@ -727,7 +731,8 @@ bracketProcessLRI_RLI(BracketData *bd, UBiDiLevel level) { pLastIsoRun++; pLastIsoRun->start=pLastIsoRun->limit=lastLimit; pLastIsoRun->level=level; - pLastIsoRun->lastStrong=pLastIsoRun->lastBase=pLastIsoRun->contextDir=level&1; + pLastIsoRun->lastStrong=pLastIsoRun->lastBase=level&1; + pLastIsoRun->contextDir=(UBiDiDirection)(level&1); pLastIsoRun->contextPos=0; } @@ -801,7 +806,7 @@ bracketProcessClosing(BracketData *bd, int32_t openIdx, int32_t position) { UBool stable; DirProp newProp; pOpening=&bd->openings[openIdx]; - direction=pLastIsoRun->level&1; + direction=(UBiDiDirection)(pLastIsoRun->level&1); stable=TRUE; /* assume stable until proved otherwise */ /* The stable flag is set when brackets are paired and their @@ -894,7 +899,7 @@ bracketProcessChar(BracketData *bd, int32_t position) { break; } pLastIsoRun->lastBase=ON; - pLastIsoRun->contextDir=newProp; + pLastIsoRun->contextDir=(UBiDiDirection)newProp; pLastIsoRun->contextPos=position; level=bd->pBiDi->levels[position]; if(level&UBIDI_LEVEL_OVERRIDE) { /* X4, X5 */ @@ -942,14 +947,14 @@ bracketProcessChar(BracketData *bd, int32_t position) { dirProps[position]=newProp; pLastIsoRun->lastBase=newProp; pLastIsoRun->lastStrong=newProp; - pLastIsoRun->contextDir=newProp; + pLastIsoRun->contextDir=(UBiDiDirection)newProp; pLastIsoRun->contextPos=position; } else if(dirProp<=R || dirProp==AL) { newProp=DIR_FROM_STRONG(dirProp); pLastIsoRun->lastBase=dirProp; pLastIsoRun->lastStrong=dirProp; - pLastIsoRun->contextDir=newProp; + pLastIsoRun->contextDir=(UBiDiDirection)newProp; pLastIsoRun->contextPos=position; } else if(dirProp==EN) { @@ -958,7 +963,7 @@ bracketProcessChar(BracketData *bd, int32_t position) { newProp=L; /* W7 */ if(!bd->isNumbersSpecial) dirProps[position]=ENL; - pLastIsoRun->contextDir=L; + pLastIsoRun->contextDir=(UBiDiDirection)L; pLastIsoRun->contextPos=position; } else { @@ -967,14 +972,14 @@ bracketProcessChar(BracketData *bd, int32_t position) { dirProps[position]=AN; /* W2 */ else dirProps[position]=ENR; - pLastIsoRun->contextDir=R; + pLastIsoRun->contextDir=(UBiDiDirection)R; pLastIsoRun->contextPos=position; } } else if(dirProp==AN) { newProp=R; /* N0 */ pLastIsoRun->lastBase=AN; - pLastIsoRun->contextDir=R; + pLastIsoRun->contextDir=(UBiDiDirection)R; pLastIsoRun->contextPos=position; } else if(dirProp==NSM) { @@ -1313,7 +1318,7 @@ resolveExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { previousLevel=embeddingLevel; levels[i]=embeddingLevel; if(!bracketProcessChar(&bracketData, i)) - return -1; + return (UBiDiDirection)-1; /* the dirProp may have been changed in bracketProcessChar() */ flags|=DIRPROP_FLAG(dirProps[i]); break; @@ -1343,18 +1348,20 @@ resolveExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { static UBiDiDirection checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { DirProp *dirProps=pBiDi->dirProps; - DirProp dirProp; UBiDiLevel *levels=pBiDi->levels; int32_t isolateCount=0; - int32_t i, length=pBiDi->length; + int32_t length=pBiDi->length; Flags flags=0; /* collect all directionalities in the text */ - UBiDiLevel level; pBiDi->isolateCount=0; - for(i=0; iparas[0].limit; + int32_t currentParaLevel = pBiDi->paraLevel; + + for(int32_t i=0; ipBiDi->isolateCount) @@ -1364,21 +1371,41 @@ checkExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { isolateCount--; else if(dirProp==B) isolateCount=0; - if(level&UBIDI_LEVEL_OVERRIDE) { + + // optimized version of int32_t currentParaLevel = GET_PARALEVEL(pBiDi, i); + if (pBiDi->defaultParaLevel != 0 && + i == currentParaLimit && (currentParaIndex + 1) < pBiDi->paraCount) { + currentParaLevel = pBiDi->paras[++currentParaIndex].level; + currentParaLimit = pBiDi->paras[currentParaIndex].limit; + } + + UBiDiLevel overrideFlag = level & UBIDI_LEVEL_OVERRIDE; + level &= ~UBIDI_LEVEL_OVERRIDE; + if (level < currentParaLevel || UBIDI_MAX_EXPLICIT_LEVEL < level) { + if (level == 0) { + if (dirProp == B) { + // Paragraph separators are ok with explicit level 0. + // Prevents reordering of paragraphs. + } else { + // Treat explicit level 0 as a wildcard for the paragraph level. + // Avoid making the caller guess what the paragraph level would be. + level = (UBiDiLevel)currentParaLevel; + levels[i] = level | overrideFlag; + } + } else { + // 1 <= level < currentParaLevel or UBIDI_MAX_EXPLICIT_LEVEL < level + /* level out of bounds */ + *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + return UBIDI_LTR; + } + } + if (overrideFlag != 0) { /* keep the override flag in levels[i] but adjust the flags */ - level&=~UBIDI_LEVEL_OVERRIDE; /* make the range check below simpler */ flags|=DIRPROP_FLAG_O(level); } else { /* set the flags */ flags|=DIRPROP_FLAG_E(level)|DIRPROP_FLAG(dirProp); } - if((levelparaLevel); @@ -1772,7 +1799,7 @@ addPoint(UBiDi *pBiDi, int32_t pos, int32_t flag) if (pInsertPoints->capacity == 0) { - pInsertPoints->points=uprv_malloc(sizeof(Point)*FIRSTALLOC); + pInsertPoints->points=static_cast(uprv_malloc(sizeof(Point)*FIRSTALLOC)); if (pInsertPoints->points == NULL) { pInsertPoints->errorCode=U_MEMORY_ALLOCATION_ERROR; @@ -1782,9 +1809,9 @@ addPoint(UBiDi *pBiDi, int32_t pos, int32_t flag) } if (pInsertPoints->size >= pInsertPoints->capacity) /* no room for new point */ { - void * savePoints=pInsertPoints->points; - pInsertPoints->points=uprv_realloc(pInsertPoints->points, - pInsertPoints->capacity*2*sizeof(Point)); + Point * savePoints=pInsertPoints->points; + pInsertPoints->points=static_cast(uprv_realloc(pInsertPoints->points, + pInsertPoints->capacity*2*sizeof(Point))); if (pInsertPoints->points == NULL) { pInsertPoints->points=savePoints; @@ -2342,7 +2369,7 @@ setParaSuccess(UBiDi *pBiDi) { static void setParaRunsOnly(UBiDi *pBiDi, const UChar *text, int32_t length, UBiDiLevel paraLevel, UErrorCode *pErrorCode) { - void *runsOnlyMemory = NULL; + int32_t *runsOnlyMemory = NULL; int32_t *visualMap; UChar *visualText; int32_t saveLength, saveTrailingWSStart; @@ -2363,7 +2390,7 @@ setParaRunsOnly(UBiDi *pBiDi, const UChar *text, int32_t length, goto cleanup3; } /* obtain memory for mapping table and visual text */ - runsOnlyMemory=uprv_malloc(length*(sizeof(int32_t)+sizeof(UChar)+sizeof(UBiDiLevel))); + runsOnlyMemory=static_cast(uprv_malloc(length*(sizeof(int32_t)+sizeof(UChar)+sizeof(UBiDiLevel)))); if(runsOnlyMemory==NULL) { *pErrorCode=U_MEMORY_ALLOCATION_ERROR; goto cleanup3; @@ -2558,7 +2585,7 @@ ubidi_setPara(UBiDi *pBiDi, const UChar *text, int32_t length, pBiDi->text=text; pBiDi->length=pBiDi->originalLength=pBiDi->resultLength=length; pBiDi->paraLevel=paraLevel; - pBiDi->direction=paraLevel&1; + pBiDi->direction=(UBiDiDirection)(paraLevel&1); pBiDi->paraCount=1; pBiDi->dirProps=NULL; @@ -3009,7 +3036,7 @@ ubidi_getCustomizedClass(UBiDi *pBiDi, UChar32 c) dir = ubidi_getClass(pBiDi->bdp, c); } if(dir >= U_CHAR_DIRECTION_COUNT) { - dir = ON; + dir = (UCharDirection)ON; } return dir; } diff --git a/deps/icu-small/source/common/ubidi_props.c b/deps/icu-small/source/common/ubidi_props.cpp similarity index 98% rename from deps/icu-small/source/common/ubidi_props.c rename to deps/icu-small/source/common/ubidi_props.cpp index cba13ad6ea98b4..dcfb52c897d360 100644 --- a/deps/icu-small/source/common/ubidi_props.c +++ b/deps/icu-small/source/common/ubidi_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ubidi_props.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -55,6 +55,8 @@ ubidi_getSingleton() { static UBool U_CALLCONV _enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32_t value) { + (void)end; + (void)value; /* add the start code point to the USet */ const USetAdder *sa=(const USetAdder *)context; sa->add(sa->set, start); diff --git a/deps/icu-small/source/common/ubidi_props.h b/deps/icu-small/source/common/ubidi_props.h index 4312230bc09b63..69e8853e69b1ca 100644 --- a/deps/icu-small/source/common/ubidi_props.h +++ b/deps/icu-small/source/common/ubidi_props.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ubidi_props.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ubidi_props_data.h b/deps/icu-small/source/common/ubidi_props_data.h index 685d2b1e844c61..8d6856d371c4c7 100644 --- a/deps/icu-small/source/common/ubidi_props_data.h +++ b/deps/icu-small/source/common/ubidi_props_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 1999-2016, International Business Machines @@ -13,35 +13,35 @@ static const UVersionInfo ubidi_props_dataVersion={9,0,0,0}; -static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x5df0,0x5a78,0x1a,0x620,0x8c0,0x10ac0,0x10af0,0,0,0,0,0,0,0,0x5802b6}; +static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x6060,0x5ce8,0x1a,0x620,0x8c0,0x10ac0,0x10af0,0,0,0,0,0,0,0,0x5802b6}; -static const uint16_t ubidi_props_trieIndex[11572]={ +static const uint16_t ubidi_props_trieIndex[11884]={ 0x36a,0x372,0x37a,0x382,0x39a,0x3a2,0x3aa,0x3b2,0x38a,0x392,0x38a,0x392,0x38a,0x392,0x38a,0x392, 0x38a,0x392,0x38a,0x392,0x3b8,0x3c0,0x3c8,0x3d0,0x3d8,0x3e0,0x3dc,0x3e4,0x3ec,0x3f4,0x3ef,0x3f7, 0x38a,0x392,0x38a,0x392,0x3ff,0x407,0x38a,0x392,0x38a,0x392,0x38a,0x392,0x40d,0x415,0x41d,0x425, 0x42d,0x435,0x43d,0x445,0x44b,0x453,0x45b,0x463,0x46b,0x473,0x479,0x481,0x489,0x491,0x499,0x4a1, -0x4ad,0x4a9,0x4b5,0x41f,0x41f,0x4c5,0x4cd,0x4bd,0x4d5,0x4d7,0x4df,0x4e7,0x4ef,0x4f0,0x4f8,0x500, -0x508,0x4f0,0x510,0x515,0x508,0x4f0,0x51d,0x525,0x4ef,0x52a,0x532,0x4e7,0x537,0x38a,0x53f,0x543, -0x54b,0x54c,0x554,0x55c,0x4ef,0x564,0x56c,0x4e7,0x4ef,0x38a,0x4f8,0x4e7,0x38a,0x38a,0x572,0x38a, -0x38a,0x578,0x580,0x38a,0x38a,0x584,0x58c,0x38a,0x590,0x597,0x38a,0x59f,0x5a7,0x5ae,0x536,0x38a, -0x38a,0x5b6,0x5be,0x5c6,0x5ce,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x5d6,0x38a,0x5de,0x38a,0x38a,0x38a, -0x5e6,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x5ee,0x38a,0x38a,0x38a,0x5f6,0x5f6,0x4fc,0x4fc,0x38a,0x5fc,0x604,0x5de, -0x61a,0x60c,0x60c,0x622,0x629,0x612,0x38a,0x38a,0x38a,0x631,0x639,0x38a,0x38a,0x38a,0x63b,0x643, -0x64b,0x38a,0x652,0x65a,0x38a,0x662,0x38a,0x38a,0x66a,0x66d,0x537,0x675,0x401,0x67d,0x38a,0x684, -0x38a,0x689,0x38a,0x38a,0x38a,0x38a,0x68f,0x697,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0x69f, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x6a7,0x6af,0x6b3, -0x6cb,0x6d1,0x6bb,0x6c3,0x6d9,0x6e1,0x6e5,0x5b1,0x6ed,0x6f5,0x6fd,0x38a,0x705,0x643,0x643,0x643, -0x715,0x71d,0x725,0x72d,0x732,0x73a,0x742,0x70d,0x74a,0x752,0x38a,0x758,0x75f,0x643,0x643,0x765, -0x643,0x562,0x76a,0x643,0x772,0x38a,0x38a,0x640,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643, -0x643,0x643,0x643,0x643,0x643,0x77a,0x643,0x643,0x643,0x643,0x643,0x780,0x643,0x643,0x788,0x790, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643,0x643,0x643,0x7a0,0x7a7,0x7af,0x798, -0x7bf,0x7c7,0x7cf,0x7d6,0x7de,0x7e6,0x7ed,0x7b7,0x643,0x643,0x643,0x7f5,0x7fb,0x801,0x809,0x80e, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x815,0x38a,0x38a,0x38a,0x81d,0x38a,0x38a,0x38a,0x3d8, -0x825,0x82d,0x834,0x38a,0x83c,0x643,0x643,0x646,0x643,0x643,0x643,0x643,0x643,0x643,0x843,0x849, -0x859,0x851,0x38a,0x38a,0x861,0x5e6,0x38a,0x3b1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x81c, -0x3bf,0x38a,0x838,0x869,0x38a,0x871,0x80e,0x38a,0x38a,0x38a,0x38a,0x879,0x38a,0x38a,0x63b,0x3b0, +0x4ad,0x4a9,0x4b5,0x4bd,0x41f,0x4cd,0x4d5,0x4c5,0x4dd,0x4df,0x4e7,0x4ef,0x4f7,0x4f8,0x500,0x508, +0x510,0x4f8,0x518,0x51d,0x510,0x4f8,0x525,0x52d,0x4f7,0x535,0x53d,0x4ef,0x542,0x38a,0x54a,0x54e, +0x556,0x557,0x55f,0x567,0x4f7,0x56f,0x577,0x4ef,0x57f,0x581,0x500,0x4ef,0x38a,0x38a,0x589,0x38a, +0x38a,0x58f,0x597,0x38a,0x38a,0x59b,0x5a3,0x38a,0x5a7,0x5ae,0x38a,0x5b6,0x5be,0x5c5,0x541,0x38a, +0x38a,0x5cd,0x5d5,0x5dd,0x5e5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x5ed,0x38a,0x5f5,0x38a,0x38a,0x38a, +0x5fd,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x605,0x38a,0x38a,0x38a,0x60d,0x60d,0x504,0x504,0x38a,0x613,0x61b,0x5f5, +0x631,0x623,0x623,0x639,0x640,0x629,0x38a,0x38a,0x38a,0x648,0x650,0x38a,0x38a,0x38a,0x652,0x65a, +0x662,0x38a,0x669,0x671,0x38a,0x679,0x38a,0x38a,0x681,0x684,0x542,0x68c,0x401,0x694,0x38a,0x69b, +0x38a,0x6a0,0x38a,0x38a,0x38a,0x38a,0x6a6,0x6ae,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0x6b6, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x6be,0x6c6,0x6ca, +0x6e2,0x6e8,0x6d2,0x6da,0x6f0,0x6f8,0x6fc,0x5c8,0x704,0x70c,0x714,0x38a,0x71c,0x65a,0x65a,0x65a, +0x72c,0x734,0x73c,0x744,0x749,0x751,0x759,0x724,0x761,0x769,0x38a,0x76f,0x776,0x65a,0x65a,0x65a, +0x65a,0x56d,0x77c,0x65a,0x784,0x38a,0x38a,0x657,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65a,0x65a,0x65a,0x65a,0x78c,0x65a,0x65a,0x65a,0x65a,0x65a,0x792,0x65a,0x65a,0x79a,0x7a2, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a,0x65a,0x65a,0x65a,0x7b2,0x7b9,0x7c1,0x7aa, +0x7d1,0x7d9,0x7e1,0x7e8,0x7f0,0x7f8,0x7ff,0x7c9,0x65a,0x65a,0x65a,0x807,0x80d,0x813,0x81b,0x820, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x827,0x38a,0x38a,0x38a,0x82f,0x38a,0x38a,0x38a,0x3d8, +0x837,0x83f,0x76c,0x38a,0x842,0x65a,0x65a,0x65d,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x849,0x84f, +0x85f,0x857,0x38a,0x38a,0x867,0x5fd,0x38a,0x3b1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a,0x82e, +0x3bf,0x38a,0x86f,0x877,0x38a,0x87f,0x820,0x38a,0x38a,0x38a,0x38a,0x887,0x38a,0x38a,0x652,0x3b0, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -54,7 +54,7 @@ static const uint16_t ubidi_props_trieIndex[11572]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a,0x65a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -98,10 +98,10 @@ static const uint16_t ubidi_props_trieIndex[11572]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x838,0x643,0x562,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x880,0x38a,0x38a,0x885,0x54c,0x38a,0x38a,0x592,0x643,0x63a,0x38a,0x38a,0x88d,0x38a,0x38a,0x38a, -0x895,0x89c,0x60c,0x8a4,0x38a,0x38a,0x8ab,0x8b3,0x38a,0x8ba,0x8c1,0x38a,0x4d5,0x8c6,0x38a,0x4ee, -0x38a,0x8ce,0x8d6,0x4f0,0x38a,0x8da,0x4ef,0x8e2,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8e9, +0x38a,0x38a,0x38a,0x38a,0x86f,0x65a,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x88e,0x38a,0x38a,0x893,0x557,0x38a,0x38a,0x5a9,0x65a,0x651,0x38a,0x38a,0x89b,0x38a,0x38a,0x38a, +0x8a3,0x8aa,0x623,0x8b2,0x38a,0x38a,0x8b9,0x8c1,0x38a,0x8c8,0x8cf,0x38a,0x4dd,0x8d4,0x38a,0x4f6, +0x38a,0x8dc,0x8e4,0x4f8,0x38a,0x8e8,0x4f7,0x8f0,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8f7, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -141,100 +141,100 @@ static const uint16_t ubidi_props_trieIndex[11572]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8fd,0x8f1,0x8f5,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x905,0x489,0x489,0x489,0x489,0x90d,0x911, -0x919,0x921,0x925,0x92d,0x489,0x489,0x489,0x931,0x939,0x37a,0x941,0x949,0x38a,0x38a,0x38a,0x951, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x90b,0x8ff,0x903,0x489,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x913,0x489,0x489,0x489,0x489,0x91b,0x91f, +0x927,0x92f,0x933,0x93b,0x489,0x489,0x489,0x93f,0x947,0x37a,0x94f,0x957,0x38a,0x38a,0x38a,0x95f, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0xe28,0xe28,0xe68,0xea8,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xee0,0xf20,0xf60,0xf70,0xfb0,0xfbc, 0xe28,0xe28,0xffc,0xe28,0xe28,0xe28,0x1034,0x1074,0x10b4,0x10f4,0x112c,0x116c,0x11ac,0x11e4,0x1224,0x1264, -0xa40,0xa80,0xac0,0xafa,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb23,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb60,0x1a0,0x1a0,0xb95,0xbd5,0xc15,0xc55,0xc95,0xcd5, +0xa40,0xa80,0xac0,0xafa,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb25,0x1a0,0x1a0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xb62,0x1a0,0x1a0,0xb97,0xbd7,0xc17,0xc57,0xc97,0xcd7, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, -0xd55,0xd65,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, +0xd57,0xd67,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, -0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd15, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x959,0x38a,0x643,0x643,0x961,0x5e6,0x38a,0x4e8, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x969,0x38a,0x38a,0x38a,0x970,0x38a,0x38a,0x38a,0x38a, +0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x967,0x38a,0x65a,0x65a,0x96f,0x5fd,0x38a,0x4f0, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x977,0x38a,0x38a,0x38a,0x97e,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x978,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x980,0x984,0x41f,0x41f,0x41f,0x41f,0x994,0x98c,0x41f,0x99c,0x41f,0x41f,0x9a4,0x9aa,0x41f,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x986,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x98e,0x992,0x41f,0x41f,0x41f,0x41f,0x9a2,0x99a,0x41f,0x9aa,0x41f,0x41f,0x9b2,0x9b8,0x41f,0x41f, 0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x9b2,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x4ef,0x8ad,0x9ba,0x9c1,0x401,0x9c4,0x38a,0x38a,0x4d5,0x9cc,0x38a,0x9d2,0x401,0x9d7,0x5f8,0x38a, -0x38a,0x9df,0x38a,0x38a,0x38a,0x38a,0x81d,0x9e7,0x401,0x4f0,0x54b,0x9ee,0x38a,0x38a,0x38a,0x38a, -0x38a,0x8ad,0x9f6,0x38a,0x38a,0x9fa,0xa02,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa06,0xa0e,0x38a, -0x38a,0xa16,0x54b,0x832,0x38a,0xa1e,0x38a,0x38a,0x5d6,0xa26,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x41f,0x41f,0x41f,0x9c0,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x4f7,0x8bb,0x9c8,0x9cf,0x401,0x9d2,0x38a,0x38a,0x4dd,0x9da,0x38a,0x9e0,0x401,0x9e5,0x60f,0x38a, +0x38a,0x9ed,0x38a,0x38a,0x38a,0x38a,0x82f,0x9f5,0x401,0x4f8,0x556,0x9fc,0x38a,0x38a,0x38a,0x38a, +0x38a,0x8bb,0xa04,0x38a,0x38a,0xa08,0xa10,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa14,0xa1c,0x38a, +0x38a,0xa24,0x556,0xa2c,0x38a,0xa32,0x38a,0x38a,0x5ed,0xa3a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa42,0xa46,0xa4e,0x38a,0xa55,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa5c,0x38a,0x38a,0xa64,0xa6a, +0x38a,0x38a,0x38a,0xa70,0xa78,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa7c,0x38a,0xa82,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa2a,0x38a,0x38a,0xa32,0xa38, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa3e,0x38a,0xa44,0x38a,0x38a,0x38a, +0x38a,0xa88,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa4a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x511,0xa90,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0xa97,0xa9f,0xaa5,0x38a,0x38a,0x65a,0x65a,0xaad,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a, +0x65a,0xab5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xabb,0x38a,0xac2, +0x38a,0xabe,0x38a,0xac5,0x38a,0xacd,0xad1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0xad9,0x3d8,0xae0,0xae7,0xaef,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x509,0xa52,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0xa59,0xa61,0xa67,0x38a,0x38a,0x643,0x643,0xa6f,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643,0x767, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xaf7,0xaff,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa71,0x38a,0xa78,0x38a,0xa74, -0x38a,0xa7b,0x38a,0xa83,0xa87,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0xa8f,0x3d8,0xa96,0xa9d,0xaa5,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0xaad,0xab5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0xabd,0x41f,0xac5,0xac5,0xacc, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0xb07,0x41f,0xb0f, +0xb0f,0xb16,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, 0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x41f,0x41f,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0xad4,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x41f,0x41f,0x643,0xadc,0x643,0x643,0x646,0xae1,0xae5,0x843,0xaed,0x38a,0x38a, -0xaf3,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x643,0x643,0x643, -0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643, -0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x643,0x768,0xafb,0x643,0x643,0x643, -0x646,0x643,0x643,0x830,0x38a,0xadc,0x643,0xb03,0x643,0xb0b,0x845,0x38a,0x38a,0xb1b,0xb23,0xb2b, -0x38a,0x844,0x38a,0x5e6,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0xb1e,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x65a,0xb26,0x65a,0x65a,0x65d,0xb2b,0xb2f,0x849,0xb37, +0x38a,0x38a,0xb3d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x76d,0x38a,0x38a,0x38a,0x38a,0x65a, +0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0xb45,0xb4d,0x65a, +0x65a,0x65a,0x65d,0x65a,0x65a,0xb45,0x38a,0xb26,0x65a,0xb55,0x65a,0xb5d,0x84b,0x38a,0x38a,0xb26, +0xb61,0xb69,0x65f,0x65c,0x38a,0xb71,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0xb13,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb79,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0xb13,0xb3b,0xb33,0xb33,0xb33,0xb3c,0xb3c,0xb3c,0xb3c,0x3d8,0x3d8,0x3d8, -0x3d8,0x3d8,0x3d8,0x3d8,0xb44,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, -0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, -0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, -0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0xb3c, -0xb3c,0xb3c,0xb3c,0xb3c,0xb3c,0x369,0x369,0x369,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb79,0xb89,0xb81,0xb81,0xb81,0xb8a,0xb8a,0xb8a,0xb8a,0x3d8, +0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0xb92,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, +0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, +0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, +0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, +0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0x369,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,8,7,8,9,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,7,7,7,8,9,0xa,0xa,4,4,4,0xa,0xa, 0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2,2,2,2,2, @@ -319,6 +319,8 @@ static const uint16_t ubidi_props_trieIndex[11572]={ 1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1, 0xb1,0xb1,0xb1,0xb1,0x81,0x41,0x41,0x41,0x41,0x41,0x81,0x81,0x41,0x81,0x41,0x41, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x81,0x41,1,1,1,0xb1,0xb1,0xb1, +1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0xb1,0xb1,5,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x4d,0x8d,0x8d, @@ -346,400 +348,417 @@ static const uint16_t ubidi_props_trieIndex[11572]={ 0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0, 0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,0,0,0,0,0,0,0,0,0x11,0x11, +0x11,0x11,0x11,0x11,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0xb1,0, +0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa, -0xa,0xa,0xa,0xa,0xa,4,0xa,0,0,0,0,0,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0xa0, -0,0,0,0,0,0,0xa0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa, +0xa,4,0xa,0,0,0,0,0,0xb1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0, +0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,4, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0,0,0,0xb1,0,0,0xa0,0,0,0,0, +0,0,0xa0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x11,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x11, +0x11,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,4,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0xb1,0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1, +0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0,0,0,0,0xa,0,0,0,0,0,0,0, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0, +0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0, +0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, +0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x310a, +0xf20a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,4,0,0xb1,0,0, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0xb1,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a, -0xa,0xa,0x2a,0xb1,0xb1,0xb1,0x12,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,4,0,0xb1,0,0,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xb1,0x40,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a,0xa,0xa,0x2a,0xb1, +0xb1,0xb1,0x12,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0, -0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1, -0,0,0,0,0xa,0,0,0,0xa,0xa,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0, +0xa,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0,0,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0,0,0,0xb1,0,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0, -0xb1,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0,0xa,0xa,0xa,0xa, -6,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2, -0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0, -2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0,9,9,9,9, -9,9,9,9,9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae, -0x8b0,0x8ac,0x8af,6,4,4,4,4,4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa, -0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,3,3, -0xa,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0xa,0xa,0xa,0xa,0,0xa,0xa,0,0, -0,0,0,0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0, -0,0,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0,0xa,0,0xa,0,0, -0,0,4,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, -0,0,0,0,0x100a,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa, -0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a, -0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a, -0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a, -0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a, -0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a, -0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, +0,0,0xb1,0,0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0xb1,0,0,0, +0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x11,0x11, +0x11,0x11,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0,0,0,0, +0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xa,0xa,0,0xa,0xa,0xa,0xa,6,0x310a,0xf20a,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0x814,0x815, +0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0,2,2,2,2, +2,2,3,3,0xa,0x310a,0xf20a,0,9,9,9,9,9,9,9,9, +9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae,0x8b0,0x8ac,0x8af,6, +4,4,4,4,4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, +2,2,2,2,2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xa,0xa,0,0xa,0xa,0xa,0xa,0,0xa,0xa,0,0,0,0,0,0, +0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0,0xa,0,0xa,0,0xa,0,0,0,0,4,0, +0,0,0,0,0,0,0,0,0,0,0xa,0xa,0,0,0,0, +0x100a,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0,0, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa, -0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0xa, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, +0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a,0x900a,0x900a,0x900a,0x100a, +0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a,0xb00a,0xb00a,0xa,0xa, +0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a, +0x100a,0x100a,0x100a,0xa,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,0x300a,0xf00a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa, +0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a, +0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a,0x900a,0x900a,0x100a,0x900a, +0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0xa, +0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a, +0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0x100a,0xa,0x100a,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0xa,0xa, -0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a, -0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a, -0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0x300a,0xf00a,0xa, -0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a, -0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0x100a, -0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa, -0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa, -0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa, -0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa, +0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa, +0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,0x100a,0x100a,0xa,0xa, +0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a,0x100a,0x100a, +0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a, +0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a,0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a, +0xf20a,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa, +0xa,0xa,0x100a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, +0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a,0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a, +0xa,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a, +0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a, +0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a, +0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a, +0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a, +0x100a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a, +0xf00a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0, -0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0xa, -0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa, +0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0,0,0xa,0,0,0,0,0,0xa,0xa,0,0,0,0, -0,0xa,0xa,0xa,9,0xa,0xa,0xa,0xa,0,0,0,0x310a,0xf20a,0x310a,0xf20a, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xa, -0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xa,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xa,0,0,0, +0,0,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,9,0xa,0xa,0xa, +0xa,0,0,0,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, +0,0,0,0,0,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xa,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0,0,0xb1,0,0,0,0,0xb1, +0,0,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xa, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0,0,0, +0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0,0,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0, +0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +4,4,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60,0,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x60,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1, -0xb1,0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0xb1,0xb1,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0, -0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0xb1, -0xb1,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0, -0,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,1,1,1,1,1,1,1,1,3,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0xb1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb1,0,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0, +0,0xb1,0,0,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, +1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,1,0xb1,1,0xd,0xd,0xd,0xd, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xa,0xd,0xd,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,6,0xa,6,0,0xa,6,0xa,0xa,0xa,0x310a,0xf20a,0x310a, -0xf20a,0x310a,0xf20a,4,0xa,0xa,3,3,0x300a,0xf00a,0xa,0,0xa,4,4,0xa, -0,0,0,0,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xd,0xd,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,6,0xa,6,0, +0xa,6,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,4,0xa,0xa,3,3, +0x300a,0xf00a,0xa,0,0xa,4,4,0xa,0,0,0,0,0xd,0xd,0xd,0xd, 0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xb2,0,0xa,0xa,4,4,4,0xa,0xa,0x310a,0xf20a,0xa,3, -6,3,6,6,2,2,2,2,2,2,2,2,2,2,6,0xa, -0x500a,0xa,0xd00a,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x510a, -0xa,0xd20a,0xa,0x310a,0xf20a,0xa,0x310a,0xf20a,0xa,0xa,0,0,0,0,0,0, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xb2,0,0xa,0xa,4, +4,4,0xa,0xa,0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2, +2,2,2,2,2,2,6,0xa,0x500a,0xa,0xd00a,0xa,0xa,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,0xa,0xa,0xa,4,4,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xaa,0xaa,0xaa, -0xa,0xa,0x12,0x12,0,0xa,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x510a,0xa,0xd20a,0xa,0x310a,0xf20a,0xa,0x310a,0xf20a, +0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,0xa,0xa, +0xa,4,4,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0xaa,0xaa,0xaa,0xa,0xa,0x12,0x12,0,0xa,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0,0,0,0xb1,2,2,2,2,2,2,2,2,2,2,2, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xb1,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xa, -1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1, +1,1,1,1,1,1,1,0xa,1,0xb1,0xb1,0xb1,1,0xb1,0xb1,1, +1,1,1,1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,1,1,1,1,0xb1, -0x41,0x81,1,1,0x81,0xb1,0xb1,1,1,1,1,0x41,0x41,0x41,0x41,0x81, +0xb1,0xb1,0xb1,1,1,1,1,0xb1,0x41,0x81,1,1,0x81,0xb1,0xb1,1, +1,1,1,0x41,0x41,0x41,0x41,0x81,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x81,1,0x81, +1,0x81,0x81,1,1,0x61,0x81,0x81,0x81,0x81,0x81,0x41,0x41,0x41,0x41,0x61, +0x41,0x41,0x41,0x41,0x41,0x81,0x41,0x41,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0x41,0x41,0x41,0x41,0x41,0x81,1,0x81,1,0x81,0x81,1,1,0x61,0x81,0x81, -0x81,0x81,0x81,0x41,0x41,0x41,0x41,0x61,0x41,0x41,0x41,0x41,0x41,0x81,0x41,0x41, +1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x41,0x81,0x41,0x81,0x81,0x81,0x41,0x41, +0x41,0x81,0x41,0x41,0x81,0x41,0x81,0x81,0x41,0x81,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0x81,0x81,0x81,0x81,0x41,0x41,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x41,0x81,0x41,0x81,0x81,0x81,0x41,0x41,0x41,0x81,0x41,0x41,0x81,0x41,0x81,0x81, -0x41,0x81,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,0x81,0x81,0x81,0x81,0x41,0x41,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0, +0,0xb1,0xb1,0,0,0xa0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0xa0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1, +0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0xb1,0,0,0,0, +0,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, 0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0, +0,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0, -0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0xb1, +0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0xb1,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0, +0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, 0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1, 0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11,0x11,0, +0,0x11,0x11,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11, +0x11,0,0,0x11,0x11,0x11,0x11,0,0,0,0,0,0,0,0,0x11, +0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11,0x11,0, +0,0x11,0x11,0x11,0,0,0,0,0,0,0,0,0,0,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0x11,0x11,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xb1,0xb1, -0xb1,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a, +0,0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0x11,0,0x11,0x11,0,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0,0x11,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x100a,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a, -0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0, -0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xb2,0xb2,0xb2,0xb2,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1, -1,1,1,1,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0xb2, +0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xb1,0xb1,0xb1,0xa,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x100a,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x100a,0,0,0,0,0,0,0,0, +0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, +0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,0x41,0x41,0x41,0x41, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, -0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2, +2,2,2,2,2,2,2,0xa,0xa,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,2,0xa, -0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x12,0x12,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0xa,0,0,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xb2,0xb2,0xb2,0xb2, +0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, 0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, -0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0,0,0,0 +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0,0,0,0 }; static const uint32_t ubidi_props_mirrors[26]={ @@ -809,13 +828,13 @@ static const UBiDiProps ubidi_props_singleton={ ubidi_props_trieIndex+3496, NULL, 3496, - 8076, + 8388, 0x1a0, 0xe28, 0x0, 0x0, 0x110000, - 0x2d30, + 0x2e68, NULL, 0, FALSE, FALSE, 0, NULL }, { 2,2,0,0 } diff --git a/deps/icu-small/source/common/ubidiimp.h b/deps/icu-small/source/common/ubidiimp.h index a62d8b259ece03..fd64fac34dea4b 100644 --- a/deps/icu-small/source/common/ubidiimp.h +++ b/deps/icu-small/source/common/ubidiimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ubidiimp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ubidiln.c b/deps/icu-small/source/common/ubidiln.cpp similarity index 99% rename from deps/icu-small/source/common/ubidiln.c rename to deps/icu-small/source/common/ubidiln.cpp index 688ca4c31ed3a3..71c581fe1c713b 100644 --- a/deps/icu-small/source/common/ubidiln.c +++ b/deps/icu-small/source/common/ubidiln.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ubidiln.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ubiditransform.c b/deps/icu-small/source/common/ubiditransform.cpp similarity index 99% rename from deps/icu-small/source/common/ubiditransform.c rename to deps/icu-small/source/common/ubiditransform.cpp index 15e3c7cc941d16..80261d391e753b 100644 --- a/deps/icu-small/source/common/ubiditransform.c +++ b/deps/icu-small/source/common/ubiditransform.cpp @@ -1,12 +1,12 @@ /* ****************************************************************************** * -* Copyright (C) 2016 and later: Unicode, Inc. and others. +* © 2016 and later: Unicode, Inc. and others. * License & terms of use: http://www.unicode.org/copyright.html * ****************************************************************************** * file name: ubiditransform.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -165,6 +165,7 @@ action_reorder(UBiDiTransform *pTransform, UErrorCode *pErrorCode) static UBool action_setInverse(UBiDiTransform *pTransform, UErrorCode *pErrorCode) { + (void)pErrorCode; ubidi_setInverse(pTransform->pBidi, TRUE); ubidi_setReorderingMode(pTransform->pBidi, UBIDI_REORDER_INVERSE_LIKE_DIRECT); return FALSE; @@ -183,6 +184,7 @@ action_setInverse(UBiDiTransform *pTransform, UErrorCode *pErrorCode) static UBool action_setRunsOnly(UBiDiTransform *pTransform, UErrorCode *pErrorCode) { + (void)pErrorCode; ubidi_setReorderingMode(pTransform->pBidi, UBIDI_REORDER_RUNS_ONLY); return FALSE; } diff --git a/deps/icu-small/source/common/ubidiwrt.c b/deps/icu-small/source/common/ubidiwrt.cpp similarity index 99% rename from deps/icu-small/source/common/ubidiwrt.c rename to deps/icu-small/source/common/ubidiwrt.cpp index 1d0c36a5d2815b..a89099dad0e700 100644 --- a/deps/icu-small/source/common/ubidiwrt.c +++ b/deps/icu-small/source/common/ubidiwrt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ubidiwrt.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ubrk.cpp b/deps/icu-small/source/common/ubrk.cpp index b02c966b107d7f..f8bdf5a6b65822 100644 --- a/deps/icu-small/source/common/ubrk.cpp +++ b/deps/icu-small/source/common/ubrk.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -20,6 +20,7 @@ #include "unicode/rbbi.h" #include "rbbirb.h" #include "uassert.h" +#include "cmemory.h" U_NAMESPACE_USE @@ -119,7 +120,28 @@ ubrk_openRules( const UChar *rules, } - +U_CAPI UBreakIterator* U_EXPORT2 +ubrk_openBinaryRules(const uint8_t *binaryRules, int32_t rulesLength, + const UChar * text, int32_t textLength, + UErrorCode * status) +{ + if (U_FAILURE(*status)) { + return NULL; + } + if (rulesLength < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + LocalPointer lpRBBI(new RuleBasedBreakIterator(binaryRules, rulesLength, *status), *status); + if (U_FAILURE(*status)) { + return NULL; + } + UBreakIterator *uBI = reinterpret_cast(lpRBBI.orphan()); + if (text != NULL) { + ubrk_setText(uBI, text, textLength, status); + } + return uBI; +} U_CAPI UBreakIterator * U_EXPORT2 @@ -288,7 +310,8 @@ ubrk_getLocaleByType(const UBreakIterator *bi, } -void ubrk_refreshUText(UBreakIterator *bi, +U_CAPI void U_EXPORT2 +ubrk_refreshUText(UBreakIterator *bi, UText *text, UErrorCode *status) { @@ -296,6 +319,39 @@ void ubrk_refreshUText(UBreakIterator *bi, bii->refreshInputText(text, *status); } +U_CAPI int32_t U_EXPORT2 +ubrk_getBinaryRules(UBreakIterator *bi, + uint8_t * binaryRules, int32_t rulesCapacity, + UErrorCode * status) +{ + if (U_FAILURE(*status)) { + return 0; + } + if ((binaryRules == NULL && rulesCapacity > 0) || rulesCapacity < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + RuleBasedBreakIterator* rbbi; + if ((rbbi = dynamic_cast(reinterpret_cast(bi))) == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + uint32_t rulesLength; + const uint8_t * returnedRules = rbbi->getBinaryRules(rulesLength); + if (rulesLength > INT32_MAX) { + *status = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + if (binaryRules != NULL) { // if not preflighting + // Here we know rulesLength <= INT32_MAX and rulesCapacity >= 0, can cast safely + if ((int32_t)rulesLength > rulesCapacity) { + *status = U_BUFFER_OVERFLOW_ERROR; + } else { + uprv_memcpy(binaryRules, returnedRules, rulesLength); + } + } + return (int32_t)rulesLength; +} #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ diff --git a/deps/icu-small/source/common/ubrkimpl.h b/deps/icu-small/source/common/ubrkimpl.h index 36ca6688593b6c..8197f66339e47f 100644 --- a/deps/icu-small/source/common/ubrkimpl.h +++ b/deps/icu-small/source/common/ubrkimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ucase.cpp b/deps/icu-small/source/common/ucase.cpp index 5c9354e73b7da0..566014245f0fc2 100644 --- a/deps/icu-small/source/common/ucase.cpp +++ b/deps/icu-small/source/common/ucase.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucase.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -46,13 +46,6 @@ struct UCaseProps { #define INCLUDED_FROM_UCASE_CPP #include "ucase_props_data.h" -/* UCaseProps singleton ----------------------------------------------------- */ - -U_CAPI const UCaseProps * U_EXPORT2 -ucase_getSingleton() { - return &ucase_props_singleton; -} - /* set of property starts for UnicodeSet ------------------------------------ */ static UBool U_CALLCONV @@ -64,13 +57,13 @@ _enumPropertyStartsRange(const void *context, UChar32 start, UChar32 /*end*/, ui } U_CFUNC void U_EXPORT2 -ucase_addPropertyStarts(const UCaseProps *csp, const USetAdder *sa, UErrorCode *pErrorCode) { +ucase_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { if(U_FAILURE(*pErrorCode)) { return; } /* add the start code point of each same-value range of the trie */ - utrie2_enum(&csp->trie, NULL, _enumPropertyStartsRange, sa); + utrie2_enum(&ucase_props_singleton.trie, NULL, _enumPropertyStartsRange, sa); /* add code points with hardcoded properties, plus the ones following them */ @@ -133,14 +126,14 @@ static const uint8_t flagsOffset[256]={ /* simple case mappings ----------------------------------------------------- */ U_CAPI UChar32 U_EXPORT2 -ucase_tolower(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_tolower(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)>=UCASE_UPPER) { c+=UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); uint16_t excWord=*pe++; if(HAS_SLOT(excWord, UCASE_EXC_LOWER)) { GET_SLOT_VALUE(excWord, UCASE_EXC_LOWER, pe, c); @@ -150,14 +143,14 @@ ucase_tolower(const UCaseProps *csp, UChar32 c) { } U_CAPI UChar32 U_EXPORT2 -ucase_toupper(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_toupper(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)==UCASE_LOWER) { c+=UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); uint16_t excWord=*pe++; if(HAS_SLOT(excWord, UCASE_EXC_UPPER)) { GET_SLOT_VALUE(excWord, UCASE_EXC_UPPER, pe, c); @@ -167,14 +160,14 @@ ucase_toupper(const UCaseProps *csp, UChar32 c) { } U_CAPI UChar32 U_EXPORT2 -ucase_totitle(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_totitle(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)==UCASE_LOWER) { c+=UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); uint16_t excWord=*pe++; int32_t idx; if(HAS_SLOT(excWord, UCASE_EXC_TITLE)) { @@ -198,7 +191,7 @@ static const UChar iDotTilde[3] = { 0x69, 0x307, 0x303 }; U_CFUNC void U_EXPORT2 -ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa) { +ucase_addCaseClosure(UChar32 c, const USetAdder *sa) { uint16_t props; /* @@ -229,7 +222,7 @@ ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa) { break; } - props=UTRIE2_GET16(&csp->trie, c); + props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)!=UCASE_NONE) { /* add the one simple case mapping, no matter what type it is */ @@ -243,7 +236,7 @@ ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa) { * c has exceptions, so there may be multiple simple and/or * full case mappings. Add them all. */ - const uint16_t *pe0, *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe0, *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); const UChar *closure; uint16_t excWord=*pe++; int32_t idx, closureLength, fullLength, length; @@ -338,10 +331,10 @@ strcmpMax(const UChar *s, int32_t length, const UChar *t, int32_t max) { } U_CFUNC UBool U_EXPORT2 -ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length, const USetAdder *sa) { +ucase_addStringCaseClosure(const UChar *s, int32_t length, const USetAdder *sa) { int32_t i, start, limit, result, unfoldRows, unfoldRowWidth, unfoldStringWidth; - if(csp->unfold==NULL || s==NULL) { + if(ucase_props_singleton.unfold==NULL || s==NULL) { return FALSE; /* no reverse case folding data, or no string */ } if(length<=1) { @@ -355,7 +348,7 @@ ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length return FALSE; } - const uint16_t *unfold=csp->unfold; + const uint16_t *unfold=ucase_props_singleton.unfold; unfoldRows=unfold[UCASE_UNFOLD_ROWS]; unfoldRowWidth=unfold[UCASE_UNFOLD_ROW_WIDTH]; unfoldStringWidth=unfold[UCASE_UNFOLD_STRING_WIDTH]; @@ -381,7 +374,7 @@ ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length for(i=unfoldStringWidth; iadd(sa->set, c); - ucase_addCaseClosure(csp, c, sa); + ucase_addCaseClosure(c, sa); } return TRUE; } else if(result<0) { @@ -430,38 +423,38 @@ U_NAMESPACE_END /** @return UCASE_NONE, UCASE_LOWER, UCASE_UPPER, UCASE_TITLE */ U_CAPI int32_t U_EXPORT2 -ucase_getType(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_getType(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); return UCASE_GET_TYPE(props); } /** @return same as ucase_getType() and set bit 2 if c is case-ignorable */ U_CAPI int32_t U_EXPORT2 -ucase_getTypeOrIgnorable(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_getTypeOrIgnorable(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); return UCASE_GET_TYPE_AND_IGNORABLE(props); } /** @return UCASE_NO_DOT, UCASE_SOFT_DOTTED, UCASE_ABOVE, UCASE_OTHER_ACCENT */ static inline int32_t -getDotType(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +getDotType(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { return props&UCASE_DOT_MASK; } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); return (*pe>>UCASE_EXC_DOT_SHIFT)&UCASE_DOT_MASK; } } U_CAPI UBool U_EXPORT2 -ucase_isSoftDotted(const UCaseProps *csp, UChar32 c) { - return (UBool)(getDotType(csp, c)==UCASE_SOFT_DOTTED); +ucase_isSoftDotted(UChar32 c) { + return (UBool)(getDotType(c)==UCASE_SOFT_DOTTED); } U_CAPI UBool U_EXPORT2 -ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_isCaseSensitive(UChar32 c) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); return (UBool)((props&UCASE_SENSITIVE)!=0); } @@ -545,12 +538,10 @@ ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c) { * zero or more case-ignorable characters. */ -#define is_a(c) ((c)=='a' || (c)=='A') #define is_d(c) ((c)=='d' || (c)=='D') #define is_e(c) ((c)=='e' || (c)=='E') #define is_i(c) ((c)=='i' || (c)=='I') #define is_l(c) ((c)=='l' || (c)=='L') -#define is_n(c) ((c)=='n' || (c)=='N') #define is_r(c) ((c)=='r' || (c)=='R') #define is_t(c) ((c)=='t' || (c)=='T') #define is_u(c) ((c)=='u' || (c)=='U') @@ -565,16 +556,7 @@ ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c) { * Accepts both 2- and 3-letter codes and accepts case variants. */ U_CFUNC int32_t -ucase_getCaseLocale(const char *locale, int32_t *locCache) { - int32_t result; - char c; - - if(locCache!=NULL && (result=*locCache)!=UCASE_LOC_UNKNOWN) { - return result; - } - - result=UCASE_LOC_ROOT; - +ucase_getCaseLocale(const char *locale) { /* * This function used to use uloc_getLanguage(), but the current code * removes the dependency of this low-level code on uloc implementation code @@ -584,73 +566,149 @@ ucase_getCaseLocale(const char *locale, int32_t *locCache) { * Because this code does not want to depend on uloc, the caller must * pass in a non-NULL locale, i.e., may need to call uloc_getDefault(). */ - c=*locale++; - if(is_t(c)) { - /* tr or tur? */ + char c=*locale++; + // Fastpath for English "en" which is often used for default (=root locale) case mappings, + // and for Chinese "zh": Very common but no special case mapping behavior. + // Then check lowercase vs. uppercase to reduce the number of comparisons + // for other locales without special behavior. + if(c=='e') { + /* el or ell? */ c=*locale++; - if(is_u(c)) { + if(is_l(c)) { c=*locale++; - } - if(is_r(c)) { - c=*locale; + if(is_l(c)) { + c=*locale; + } if(is_sep(c)) { - result=UCASE_LOC_TURKISH; + return UCASE_LOC_GREEK; } } - } else if(is_a(c)) { - /* az or aze? */ - c=*locale++; - if(is_z(c)) { + // en, es, ... -> root + } else if(c=='z') { + return UCASE_LOC_ROOT; +#if U_CHARSET_FAMILY==U_ASCII_FAMILY + } else if(c>='a') { // ASCII a-z = 0x61..0x7a, after A-Z +#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY + } else if(c<='z') { // EBCDIC a-z = 0x81..0xa9 with two gaps, before A-Z +#else +# error Unknown charset family! +#endif + // lowercase c + if(c=='t') { + /* tr or tur? */ c=*locale++; - if(is_e(c)) { + if(is_u(c)) { + c=*locale++; + } + if(is_r(c)) { c=*locale; + if(is_sep(c)) { + return UCASE_LOC_TURKISH; + } } - if(is_sep(c)) { - result=UCASE_LOC_TURKISH; + } else if(c=='a') { + /* az or aze? */ + c=*locale++; + if(is_z(c)) { + c=*locale++; + if(is_e(c)) { + c=*locale; + } + if(is_sep(c)) { + return UCASE_LOC_TURKISH; + } } - } - } else if(is_l(c)) { - /* lt or lit? */ - c=*locale++; - if(is_i(c)) { + } else if(c=='l') { + /* lt or lit? */ c=*locale++; - } - if(is_t(c)) { - c=*locale; - if(is_sep(c)) { - result=UCASE_LOC_LITHUANIAN; + if(is_i(c)) { + c=*locale++; } - } - } else if(is_e(c)) { - /* el or ell? */ - c=*locale++; - if(is_l(c)) { + if(is_t(c)) { + c=*locale; + if(is_sep(c)) { + return UCASE_LOC_LITHUANIAN; + } + } + } else if(c=='n') { + /* nl or nld? */ c=*locale++; if(is_l(c)) { + c=*locale++; + if(is_d(c)) { + c=*locale; + } + if(is_sep(c)) { + return UCASE_LOC_DUTCH; + } + } + } + } else { + // uppercase c + // Same code as for lowercase c but also check for 'E'. + if(c=='T') { + /* tr or tur? */ + c=*locale++; + if(is_u(c)) { + c=*locale++; + } + if(is_r(c)) { c=*locale; + if(is_sep(c)) { + return UCASE_LOC_TURKISH; + } } - if(is_sep(c)) { - result=UCASE_LOC_GREEK; + } else if(c=='A') { + /* az or aze? */ + c=*locale++; + if(is_z(c)) { + c=*locale++; + if(is_e(c)) { + c=*locale; + } + if(is_sep(c)) { + return UCASE_LOC_TURKISH; + } } - } - } else if(is_n(c)) { - /* nl or nld? */ - c=*locale++; - if(is_l(c)) { + } else if(c=='L') { + /* lt or lit? */ c=*locale++; - if(is_d(c)) { + if(is_i(c)) { + c=*locale++; + } + if(is_t(c)) { c=*locale; + if(is_sep(c)) { + return UCASE_LOC_LITHUANIAN; + } } - if(is_sep(c)) { - result=UCASE_LOC_DUTCH; + } else if(c=='E') { + /* el or ell? */ + c=*locale++; + if(is_l(c)) { + c=*locale++; + if(is_l(c)) { + c=*locale; + } + if(is_sep(c)) { + return UCASE_LOC_GREEK; + } + } + } else if(c=='N') { + /* nl or nld? */ + c=*locale++; + if(is_l(c)) { + c=*locale++; + if(is_d(c)) { + c=*locale; + } + if(is_sep(c)) { + return UCASE_LOC_DUTCH; + } } } } - - if(locCache!=NULL) { - *locCache=result; - } - return result; + return UCASE_LOC_ROOT; } /* @@ -662,7 +720,7 @@ ucase_getCaseLocale(const char *locale, int32_t *locCache) { * it is also cased or not. */ static UBool -isFollowedByCasedLetter(const UCaseProps *csp, UCaseContextIterator *iter, void *context, int8_t dir) { +isFollowedByCasedLetter(UCaseContextIterator *iter, void *context, int8_t dir) { UChar32 c; if(iter==NULL) { @@ -670,7 +728,7 @@ isFollowedByCasedLetter(const UCaseProps *csp, UCaseContextIterator *iter, void } for(/* dir!=0 sets direction */; (c=iter(context, dir))>=0; dir=0) { - int32_t type=ucase_getTypeOrIgnorable(csp, c); + int32_t type=ucase_getTypeOrIgnorable(c); if(type&4) { /* case-ignorable, continue with the loop */ } else if(type!=UCASE_NONE) { @@ -685,7 +743,7 @@ isFollowedByCasedLetter(const UCaseProps *csp, UCaseContextIterator *iter, void /* Is preceded by Soft_Dotted character with no intervening cc=230 ? */ static UBool -isPrecededBySoftDotted(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { +isPrecededBySoftDotted(UCaseContextIterator *iter, void *context) { UChar32 c; int32_t dotType; int8_t dir; @@ -695,7 +753,7 @@ isPrecededBySoftDotted(const UCaseProps *csp, UCaseContextIterator *iter, void * } for(dir=-1; (c=iter(context, dir))>=0; dir=0) { - dotType=getDotType(csp, c); + dotType=getDotType(c); if(dotType==UCASE_SOFT_DOTTED) { return TRUE; /* preceded by TYPE_i */ } else if(dotType!=UCASE_OTHER_ACCENT) { @@ -742,7 +800,7 @@ isPrecededBySoftDotted(const UCaseProps *csp, UCaseContextIterator *iter, void * /* Is preceded by base character 'I' with no intervening cc=230 ? */ static UBool -isPrecededBy_I(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { +isPrecededBy_I(UCaseContextIterator *iter, void *context) { UChar32 c; int32_t dotType; int8_t dir; @@ -755,7 +813,7 @@ isPrecededBy_I(const UCaseProps *csp, UCaseContextIterator *iter, void *context) if(c==0x49) { return TRUE; /* preceded by I */ } - dotType=getDotType(csp, c); + dotType=getDotType(c); if(dotType!=UCASE_OTHER_ACCENT) { return FALSE; /* preceded by different base character (not I), or intervening cc==230 */ } @@ -766,7 +824,7 @@ isPrecededBy_I(const UCaseProps *csp, UCaseContextIterator *iter, void *context) /* Is followed by one or more cc==230 ? */ static UBool -isFollowedByMoreAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { +isFollowedByMoreAbove(UCaseContextIterator *iter, void *context) { UChar32 c; int32_t dotType; int8_t dir; @@ -776,7 +834,7 @@ isFollowedByMoreAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *c } for(dir=1; (c=iter(context, dir))>=0; dir=0) { - dotType=getDotType(csp, c); + dotType=getDotType(c); if(dotType==UCASE_ABOVE) { return TRUE; /* at least one cc==230 following */ } else if(dotType!=UCASE_OTHER_ACCENT) { @@ -789,7 +847,7 @@ isFollowedByMoreAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *c /* Is followed by a dot above (without cc==230 in between) ? */ static UBool -isFollowedByDotAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *context) { +isFollowedByDotAbove(UCaseContextIterator *iter, void *context) { UChar32 c; int32_t dotType; int8_t dir; @@ -802,7 +860,7 @@ isFollowedByDotAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *co if(c==0x307) { return TRUE; } - dotType=getDotType(csp, c); + dotType=getDotType(c); if(dotType!=UCASE_OTHER_ACCENT) { return FALSE; /* next base character or cc==230 in between */ } @@ -812,20 +870,20 @@ isFollowedByDotAbove(const UCaseProps *csp, UCaseContextIterator *iter, void *co } U_CAPI int32_t U_EXPORT2 -ucase_toFullLower(const UCaseProps *csp, UChar32 c, +ucase_toFullLower(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache) { + int32_t loc) { // The sign of the result has meaning, input must be non-negative so that it can be returned as is. U_ASSERT(c >= 0); UChar32 result=c; - uint16_t props=UTRIE2_GET16(&csp->trie, c); + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)>=UCASE_UPPER) { result=c+UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2; + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props), *pe2; uint16_t excWord=*pe++; int32_t full; @@ -833,7 +891,6 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, if(excWord&UCASE_EXC_CONDITIONAL_SPECIAL) { /* use hardcoded conditions and mappings */ - int32_t loc=ucase_getCaseLocale(locale, locCache); /* * Test for conditional mappings first @@ -844,7 +901,7 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, if( loc==UCASE_LOC_LITHUANIAN && /* base characters, find accents above */ (((c==0x49 || c==0x4a || c==0x12e) && - isFollowedByMoreAbove(csp, iter, context)) || + isFollowedByMoreAbove(iter, context)) || /* precomposed with accent above, no need to find one */ (c==0xcc || c==0xcd || c==0x128)) ) { @@ -896,7 +953,7 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, 0130; 0069; 0130; 0130; az # LATIN CAPITAL LETTER I WITH DOT ABOVE */ return 0x69; - } else if(loc==UCASE_LOC_TURKISH && c==0x307 && isPrecededBy_I(csp, iter, context)) { + } else if(loc==UCASE_LOC_TURKISH && c==0x307 && isPrecededBy_I(iter, context)) { /* # When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. # This matches the behavior of the canonically equivalent I-dot_above @@ -905,7 +962,7 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, 0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE */ return 0; /* remove the dot (continue without output) */ - } else if(loc==UCASE_LOC_TURKISH && c==0x49 && !isFollowedByDotAbove(csp, iter, context)) { + } else if(loc==UCASE_LOC_TURKISH && c==0x49 && !isFollowedByDotAbove(iter, context)) { /* # When lowercasing, unless an I is before a dot_above, it turns into a dotless i. @@ -922,8 +979,8 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, *pString=iDot; return 2; } else if( c==0x3a3 && - !isFollowedByCasedLetter(csp, iter, context, 1) && - isFollowedByCasedLetter(csp, iter, context, -1) /* -1=preceded */ + !isFollowedByCasedLetter(iter, context, 1) && + isFollowedByCasedLetter(iter, context, -1) /* -1=preceded */ ) { /* greek capital sigma maps depending on surrounding cased letters (see SpecialCasing.txt) */ /* @@ -957,21 +1014,21 @@ ucase_toFullLower(const UCaseProps *csp, UChar32 c, /* internal */ static int32_t -toUpperOrTitle(const UCaseProps *csp, UChar32 c, +toUpperOrTitle(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache, + int32_t loc, UBool upperNotTitle) { // The sign of the result has meaning, input must be non-negative so that it can be returned as is. U_ASSERT(c >= 0); UChar32 result=c; - uint16_t props=UTRIE2_GET16(&csp->trie, c); + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)==UCASE_LOWER) { result=c+UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2; + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props), *pe2; uint16_t excWord=*pe++; int32_t full, idx; @@ -979,8 +1036,6 @@ toUpperOrTitle(const UCaseProps *csp, UChar32 c, if(excWord&UCASE_EXC_CONDITIONAL_SPECIAL) { /* use hardcoded conditions and mappings */ - int32_t loc=ucase_getCaseLocale(locale, locCache); - if(loc==UCASE_LOC_TURKISH && c==0x69) { /* # Turkish and Azeri @@ -994,7 +1049,7 @@ toUpperOrTitle(const UCaseProps *csp, UChar32 c, 0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I */ return 0x130; - } else if(loc==UCASE_LOC_LITHUANIAN && c==0x307 && isPrecededBySoftDotted(csp, iter, context)) { + } else if(loc==UCASE_LOC_LITHUANIAN && c==0x307 && isPrecededBySoftDotted(iter, context)) { /* # Lithuanian @@ -1052,19 +1107,19 @@ toUpperOrTitle(const UCaseProps *csp, UChar32 c, } U_CAPI int32_t U_EXPORT2 -ucase_toFullUpper(const UCaseProps *csp, UChar32 c, +ucase_toFullUpper(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache) { - return toUpperOrTitle(csp, c, iter, context, pString, locale, locCache, TRUE); + int32_t caseLocale) { + return toUpperOrTitle(c, iter, context, pString, caseLocale, TRUE); } U_CAPI int32_t U_EXPORT2 -ucase_toFullTitle(const UCaseProps *csp, UChar32 c, +ucase_toFullTitle(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache) { - return toUpperOrTitle(csp, c, iter, context, pString, locale, locCache, FALSE); + int32_t caseLocale) { + return toUpperOrTitle(c, iter, context, pString, caseLocale, FALSE); } /* case folding ------------------------------------------------------------- */ @@ -1110,14 +1165,14 @@ ucase_toFullTitle(const UCaseProps *csp, UChar32 c, /* return the simple case folding mapping for c */ U_CAPI UChar32 U_EXPORT2 -ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options) { - uint16_t props=UTRIE2_GET16(&csp->trie, c); +ucase_fold(UChar32 c, uint32_t options) { + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)>=UCASE_UPPER) { c+=UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props); + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props); uint16_t excWord=*pe++; int32_t idx; if(excWord&UCASE_EXC_CONDITIONAL_FOLD) { @@ -1170,19 +1225,19 @@ ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options) { */ U_CAPI int32_t U_EXPORT2 -ucase_toFullFolding(const UCaseProps *csp, UChar32 c, +ucase_toFullFolding(UChar32 c, const UChar **pString, uint32_t options) { // The sign of the result has meaning, input must be non-negative so that it can be returned as is. U_ASSERT(c >= 0); UChar32 result=c; - uint16_t props=UTRIE2_GET16(&csp->trie, c); + uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c); if(!PROPS_HAS_EXCEPTION(props)) { if(UCASE_GET_TYPE(props)>=UCASE_UPPER) { result=c+UCASE_GET_DELTA(props); } } else { - const uint16_t *pe=GET_EXCEPTIONS(csp, props), *pe2; + const uint16_t *pe=GET_EXCEPTIONS(&ucase_props_singleton, props), *pe2; uint16_t excWord=*pe++; int32_t full, idx; @@ -1244,66 +1299,59 @@ ucase_toFullFolding(const UCaseProps *csp, UChar32 c, /* case mapping properties API ---------------------------------------------- */ -#define GET_CASE_PROPS() &ucase_props_singleton - /* public API (see uchar.h) */ U_CAPI UBool U_EXPORT2 u_isULowercase(UChar32 c) { - return (UBool)(UCASE_LOWER==ucase_getType(GET_CASE_PROPS(), c)); + return (UBool)(UCASE_LOWER==ucase_getType(c)); } U_CAPI UBool U_EXPORT2 u_isUUppercase(UChar32 c) { - return (UBool)(UCASE_UPPER==ucase_getType(GET_CASE_PROPS(), c)); + return (UBool)(UCASE_UPPER==ucase_getType(c)); } /* Transforms the Unicode character to its lower case equivalent.*/ U_CAPI UChar32 U_EXPORT2 u_tolower(UChar32 c) { - return ucase_tolower(GET_CASE_PROPS(), c); + return ucase_tolower(c); } /* Transforms the Unicode character to its upper case equivalent.*/ U_CAPI UChar32 U_EXPORT2 u_toupper(UChar32 c) { - return ucase_toupper(GET_CASE_PROPS(), c); + return ucase_toupper(c); } /* Transforms the Unicode character to its title case equivalent.*/ U_CAPI UChar32 U_EXPORT2 u_totitle(UChar32 c) { - return ucase_totitle(GET_CASE_PROPS(), c); + return ucase_totitle(c); } /* return the simple case folding mapping for c */ U_CAPI UChar32 U_EXPORT2 u_foldCase(UChar32 c, uint32_t options) { - return ucase_fold(GET_CASE_PROPS(), c, options); + return ucase_fold(c, options); } U_CFUNC int32_t U_EXPORT2 ucase_hasBinaryProperty(UChar32 c, UProperty which) { /* case mapping properties */ const UChar *resultString; - int32_t locCache; - const UCaseProps *csp=GET_CASE_PROPS(); - if(csp==NULL) { - return FALSE; - } switch(which) { case UCHAR_LOWERCASE: - return (UBool)(UCASE_LOWER==ucase_getType(csp, c)); + return (UBool)(UCASE_LOWER==ucase_getType(c)); case UCHAR_UPPERCASE: - return (UBool)(UCASE_UPPER==ucase_getType(csp, c)); + return (UBool)(UCASE_UPPER==ucase_getType(c)); case UCHAR_SOFT_DOTTED: - return ucase_isSoftDotted(csp, c); + return ucase_isSoftDotted(c); case UCHAR_CASE_SENSITIVE: - return ucase_isCaseSensitive(csp, c); + return ucase_isCaseSensitive(c); case UCHAR_CASED: - return (UBool)(UCASE_NONE!=ucase_getType(csp, c)); + return (UBool)(UCASE_NONE!=ucase_getType(c)); case UCHAR_CASE_IGNORABLE: - return (UBool)(ucase_getTypeOrIgnorable(csp, c)>>2); + return (UBool)(ucase_getTypeOrIgnorable(c)>>2); /* * Note: The following Changes_When_Xyz are defined as testing whether * the NFD form of the input changes when Xyz-case-mapped. @@ -1317,21 +1365,17 @@ ucase_hasBinaryProperty(UChar32 c, UProperty which) { * start sets for normalization and case mappings. */ case UCHAR_CHANGES_WHEN_LOWERCASED: - locCache=UCASE_LOC_ROOT; - return (UBool)(ucase_toFullLower(csp, c, NULL, NULL, &resultString, "", &locCache)>=0); + return (UBool)(ucase_toFullLower(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0); case UCHAR_CHANGES_WHEN_UPPERCASED: - locCache=UCASE_LOC_ROOT; - return (UBool)(ucase_toFullUpper(csp, c, NULL, NULL, &resultString, "", &locCache)>=0); + return (UBool)(ucase_toFullUpper(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0); case UCHAR_CHANGES_WHEN_TITLECASED: - locCache=UCASE_LOC_ROOT; - return (UBool)(ucase_toFullTitle(csp, c, NULL, NULL, &resultString, "", &locCache)>=0); + return (UBool)(ucase_toFullTitle(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0); /* case UCHAR_CHANGES_WHEN_CASEFOLDED: -- in uprops.c */ case UCHAR_CHANGES_WHEN_CASEMAPPED: - locCache=UCASE_LOC_ROOT; return (UBool)( - ucase_toFullLower(csp, c, NULL, NULL, &resultString, "", &locCache)>=0 || - ucase_toFullUpper(csp, c, NULL, NULL, &resultString, "", &locCache)>=0 || - ucase_toFullTitle(csp, c, NULL, NULL, &resultString, "", &locCache)>=0); + ucase_toFullLower(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0 || + ucase_toFullUpper(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0 || + ucase_toFullTitle(c, NULL, NULL, &resultString, UCASE_LOC_ROOT)>=0); default: return FALSE; } diff --git a/deps/icu-small/source/common/ucase.h b/deps/icu-small/source/common/ucase.h index 29ea71a533d8c5..e15bae6604daef 100644 --- a/deps/icu-small/source/common/ucase.h +++ b/deps/icu-small/source/common/ucase.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucase.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -37,18 +37,8 @@ U_NAMESPACE_END /* library API -------------------------------------------------------------- */ -U_CDECL_BEGIN - -struct UCaseProps; -typedef struct UCaseProps UCaseProps; - -U_CDECL_END - -U_CAPI const UCaseProps * U_EXPORT2 -ucase_getSingleton(void); - U_CFUNC void U_EXPORT2 -ucase_addPropertyStarts(const UCaseProps *csp, const USetAdder *sa, UErrorCode *pErrorCode); +ucase_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode); /** * Requires non-NULL locale ID but otherwise does the equivalent of @@ -56,7 +46,7 @@ ucase_addPropertyStarts(const UCaseProps *csp, const USetAdder *sa, UErrorCode * * Accepts both 2- and 3-letter codes and accepts case variants. */ U_CFUNC int32_t -ucase_getCaseLocale(const char *locale, int32_t *locCache); +ucase_getCaseLocale(const char *locale); /* Casing locale types for ucase_getCaseLocale */ enum { @@ -87,16 +77,16 @@ enum { /* single-code point functions */ U_CAPI UChar32 U_EXPORT2 -ucase_tolower(const UCaseProps *csp, UChar32 c); +ucase_tolower(UChar32 c); U_CAPI UChar32 U_EXPORT2 -ucase_toupper(const UCaseProps *csp, UChar32 c); +ucase_toupper(UChar32 c); U_CAPI UChar32 U_EXPORT2 -ucase_totitle(const UCaseProps *csp, UChar32 c); +ucase_totitle(UChar32 c); U_CAPI UChar32 U_EXPORT2 -ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options); +ucase_fold(UChar32 c, uint32_t options); /** * Adds all simple case mappings and the full case folding for c to sa, @@ -108,7 +98,7 @@ ucase_fold(const UCaseProps *csp, UChar32 c, uint32_t options); * - for k include the Kelvin sign */ U_CFUNC void U_EXPORT2 -ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa); +ucase_addCaseClosure(UChar32 c, const USetAdder *sa); /** * Maps the string to single code points and adds the associated case closure @@ -123,7 +113,7 @@ ucase_addCaseClosure(const UCaseProps *csp, UChar32 c, const USetAdder *sa); * @return TRUE if the string was found */ U_CFUNC UBool U_EXPORT2 -ucase_addStringCaseClosure(const UCaseProps *csp, const UChar *s, int32_t length, const USetAdder *sa); +ucase_addStringCaseClosure(const UChar *s, int32_t length, const USetAdder *sa); #ifdef __cplusplus U_NAMESPACE_BEGIN @@ -157,17 +147,17 @@ U_NAMESPACE_END /** @return UCASE_NONE, UCASE_LOWER, UCASE_UPPER, UCASE_TITLE */ U_CAPI int32_t U_EXPORT2 -ucase_getType(const UCaseProps *csp, UChar32 c); +ucase_getType(UChar32 c); /** @return like ucase_getType() but also sets UCASE_IGNORABLE if c is case-ignorable */ U_CAPI int32_t U_EXPORT2 -ucase_getTypeOrIgnorable(const UCaseProps *csp, UChar32 c); +ucase_getTypeOrIgnorable(UChar32 c); U_CAPI UBool U_EXPORT2 -ucase_isSoftDotted(const UCaseProps *csp, UChar32 c); +ucase_isSoftDotted(UChar32 c); U_CAPI UBool U_EXPORT2 -ucase_isCaseSensitive(const UCaseProps *csp, UChar32 c); +ucase_isCaseSensitive(UChar32 c); /* string case mapping functions */ @@ -240,10 +230,7 @@ enum { * @param context Pointer to be passed into iter. * @param pString If the mapping result is a string, then the pointer is * written to *pString. - * @param locale Locale ID for locale-dependent mappings. - * @param locCache Initialize to 0; may be used to cache the result of parsing - * the locale ID for subsequent calls. - * Can be NULL. + * @param caseLocale Case locale value from ucase_getCaseLocale(). * @return Output code point or string length, see UCASE_MAX_STRING_LENGTH. * * @see UCaseContextIterator @@ -251,25 +238,25 @@ enum { * @internal */ U_CAPI int32_t U_EXPORT2 -ucase_toFullLower(const UCaseProps *csp, UChar32 c, +ucase_toFullLower(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache); + int32_t caseLocale); U_CAPI int32_t U_EXPORT2 -ucase_toFullUpper(const UCaseProps *csp, UChar32 c, +ucase_toFullUpper(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache); + int32_t caseLocale); U_CAPI int32_t U_EXPORT2 -ucase_toFullTitle(const UCaseProps *csp, UChar32 c, +ucase_toFullTitle(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache); + int32_t caseLocale); U_CAPI int32_t U_EXPORT2 -ucase_toFullFolding(const UCaseProps *csp, UChar32 c, +ucase_toFullFolding(UChar32 c, const UChar **pString, uint32_t options); @@ -283,10 +270,10 @@ U_CDECL_BEGIN * @internal */ typedef int32_t U_CALLCONV -UCaseMapFull(const UCaseProps *csp, UChar32 c, +UCaseMapFull(UChar32 c, UCaseContextIterator *iter, void *context, const UChar **pString, - const char *locale, int32_t *locCache); + int32_t caseLocale); U_CDECL_END diff --git a/deps/icu-small/source/common/ucase_props_data.h b/deps/icu-small/source/common/ucase_props_data.h index aa51bac691c9da..3663592173cc66 100644 --- a/deps/icu-small/source/common/ucase_props_data.h +++ b/deps/icu-small/source/common/ucase_props_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 1999-2016, International Business Machines diff --git a/deps/icu-small/source/common/ucasemap.cpp b/deps/icu-small/source/common/ucasemap.cpp index 0576a26ddd1c86..391140d6c5e2b9 100644 --- a/deps/icu-small/source/common/ucasemap.cpp +++ b/deps/icu-small/source/common/ucasemap.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucasemap.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -20,6 +20,8 @@ #include "unicode/utypes.h" #include "unicode/brkiter.h" +#include "unicode/casemap.h" +#include "unicode/edits.h" #include "unicode/ubrk.h" #include "unicode/uloc.h" #include "unicode/ustring.h" @@ -32,47 +34,69 @@ #include "unicode/utf16.h" #include "cmemory.h" #include "cstring.h" +#include "uassert.h" #include "ucase.h" +#include "ucasemap_imp.h" #include "ustr_imp.h" +U_NAMESPACE_BEGIN + +namespace { + +// TODO: share with UTF-16? inline in ucasemap_imp.h? +int32_t checkOverflowAndEditsError(int32_t destIndex, int32_t destCapacity, + Edits *edits, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + if (destIndex > destCapacity) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + } else if (edits != NULL) { + edits->copyErrorTo(errorCode); + } + } + return destIndex; +} + +} // namespace + +U_NAMESPACE_END + U_NAMESPACE_USE /* UCaseMap service object -------------------------------------------------- */ +UCaseMap::UCaseMap(const char *localeID, uint32_t opts, UErrorCode *pErrorCode) : +#if !UCONFIG_NO_BREAK_ITERATION + iter(NULL), +#endif + caseLocale(UCASE_LOC_UNKNOWN), options(opts) { + ucasemap_setLocale(this, localeID, pErrorCode); +} + +UCaseMap::~UCaseMap() { +#if !UCONFIG_NO_BREAK_ITERATION + delete iter; +#endif +} + U_CAPI UCaseMap * U_EXPORT2 ucasemap_open(const char *locale, uint32_t options, UErrorCode *pErrorCode) { - UCaseMap *csm; - if(U_FAILURE(*pErrorCode)) { return NULL; } - - csm=(UCaseMap *)uprv_malloc(sizeof(UCaseMap)); + UCaseMap *csm = new UCaseMap(locale, options, pErrorCode); if(csm==NULL) { + *pErrorCode = U_MEMORY_ALLOCATION_ERROR; return NULL; - } - uprv_memset(csm, 0, sizeof(UCaseMap)); - - csm->csp=ucase_getSingleton(); - ucasemap_setLocale(csm, locale, pErrorCode); - if(U_FAILURE(*pErrorCode)) { - uprv_free(csm); + } else if (U_FAILURE(*pErrorCode)) { + delete csm; return NULL; } - - csm->options=options; return csm; } U_CAPI void U_EXPORT2 ucasemap_close(UCaseMap *csm) { - if(csm!=NULL) { -#if !UCONFIG_NO_BREAK_ITERATION - // Do not call ubrk_close() so that we do not depend on all of the BreakIterator code. - delete reinterpret_cast(csm->iter); -#endif - uprv_free(csm); - } + delete csm; } U_CAPI const char * U_EXPORT2 @@ -87,13 +111,16 @@ ucasemap_getOptions(const UCaseMap *csm) { U_CAPI void U_EXPORT2 ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode) { - int32_t length; - if(U_FAILURE(*pErrorCode)) { return; } + if (locale != NULL && *locale == 0) { + csm->locale[0] = 0; + csm->caseLocale = UCASE_LOC_ROOT; + return; + } - length=uloc_getName(locale, csm->locale, (int32_t)sizeof(csm->locale), pErrorCode); + int32_t length=uloc_getName(locale, csm->locale, (int32_t)sizeof(csm->locale), pErrorCode); if(*pErrorCode==U_BUFFER_OVERFLOW_ERROR || length==sizeof(csm->locale)) { *pErrorCode=U_ZERO_ERROR; /* we only really need the language code for case mappings */ @@ -102,27 +129,32 @@ ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode) { if(length==sizeof(csm->locale)) { *pErrorCode=U_BUFFER_OVERFLOW_ERROR; } - csm->locCache=0; if(U_SUCCESS(*pErrorCode)) { - ucase_getCaseLocale(csm->locale, &csm->locCache); + csm->caseLocale=UCASE_LOC_UNKNOWN; + csm->caseLocale = ucase_getCaseLocale(csm->locale); } else { csm->locale[0]=0; + csm->caseLocale = UCASE_LOC_ROOT; } } U_CAPI void U_EXPORT2 -ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode * /*pErrorCode*/) { +ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode) { + if(U_FAILURE(*pErrorCode)) { + return; + } csm->options=options; } /* UTF-8 string case mappings ----------------------------------------------- */ -/* TODO(markus): Move to a new, separate utf8case.c file. */ +/* TODO(markus): Move to a new, separate utf8case.cpp file. */ /* append a full case mapping result, see UCASE_MAX_STRING_LENGTH */ static inline int32_t appendResult(uint8_t *dest, int32_t destIndex, int32_t destCapacity, - int32_t result, const UChar *s) { + int32_t result, const UChar *s, + int32_t cpLength, uint32_t options, icu::Edits *edits) { UChar32 c; int32_t length; UErrorCode errorCode; @@ -130,86 +162,126 @@ appendResult(uint8_t *dest, int32_t destIndex, int32_t destCapacity, /* decode the result */ if(result<0) { /* (not) original code point */ + if(edits!=NULL) { + edits->addUnchanged(cpLength); + if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { + return destIndex; + } + } c=~result; - length=U8_LENGTH(c); - } else if(result<=UCASE_MAX_STRING_LENGTH) { - c=U_SENTINEL; - length=result; + if(destIndex(INT32_MAX-destIndex)) { + return -1; // integer overflow + } + if(edits!=NULL) { + edits->addReplace(cpLength, length); + } + // We might have an overflow, but we know the actual length. + return destIndex+length; + } else if(destIndexaddReplace(cpLength, 1); + } + return destIndex; + } else { + c=result; + length=U8_LENGTH(c); + if(edits!=NULL) { + edits->addReplace(cpLength, length); + } + } } + // c>=0 single code point if(length>(INT32_MAX-destIndex)) { return -1; // integer overflow } if(destIndex=0) { - /* code point */ - UBool isError=FALSE; - U8_APPEND(dest, destIndex, destCapacity, c, isError); - if(isError) { - /* overflow, nothing written */ - destIndex+=length; - } - } else { - /* string */ - int32_t destLength; - errorCode=U_ZERO_ERROR; - u_strToUTF8( - (char *)(dest+destIndex), destCapacity-destIndex, &destLength, - s, length, - &errorCode); - if(U_FAILURE(errorCode) && errorCode != U_BUFFER_OVERFLOW_ERROR) { - return -1; - } - if(destLength>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - destIndex+=destLength; - /* we might have an overflow, but we know the actual length */ + UBool isError=FALSE; + U8_APPEND(dest, destIndex, destCapacity, c, isError); + if(isError) { + /* overflow, nothing written */ + destIndex+=length; } } else { /* preflight */ - if(c>=0) { - destIndex+=length; - } else { - int32_t destLength; - errorCode=U_ZERO_ERROR; - u_strToUTF8( - NULL, 0, &destLength, - s, length, - &errorCode); - if(U_FAILURE(errorCode) && errorCode != U_BUFFER_OVERFLOW_ERROR) { - return -1; - } - if(destLength>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - destIndex+=destLength; - } + destIndex+=length; } return destIndex; } static inline int32_t -appendUChar(uint8_t *dest, int32_t destIndex, int32_t destCapacity, UChar c) { - int32_t length=U8_LENGTH(c); - if(length>(INT32_MAX-destIndex)) { +appendASCII(uint8_t *dest, int32_t destIndex, int32_t destCapacity, uint8_t c) { + if(destIndex> 6) | 0xc0); } +static inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } + +static inline int32_t +appendTwoBytes(uint8_t *dest, int32_t destIndex, int32_t destCapacity, UChar32 c) { + U_ASSERT(0x370 <= c && c <= 0x3ff); // 2-byte UTF-8, main Greek block + if(2>(INT32_MAX-destIndex)) { return -1; // integer overflow } - int32_t limit=destIndex+length; + int32_t limit=destIndex+2; if(limit<=destCapacity) { - U8_APPEND_UNSAFE(dest, destIndex, c); + dest+=destIndex; + dest[0]=getTwoByteLead(c); + dest[1]=getTwoByteTrail(c); } return limit; } static inline int32_t -appendString(uint8_t *dest, int32_t destIndex, int32_t destCapacity, - const uint8_t *s, int32_t length) { +appendTwoBytes(uint8_t *dest, int32_t destIndex, int32_t destCapacity, const char *s) { + if(2>(INT32_MAX-destIndex)) { + return -1; // integer overflow + } + int32_t limit=destIndex+2; + if(limit<=destCapacity) { + dest+=destIndex; + dest[0]=(uint8_t)s[0]; + dest[1]=(uint8_t)s[1]; + } + return limit; +} + +static inline int32_t +appendUnchanged(uint8_t *dest, int32_t destIndex, int32_t destCapacity, + const uint8_t *s, int32_t length, uint32_t options, icu::Edits *edits) { if(length>0) { + if(edits!=NULL) { + edits->addUnchanged(length); + if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { + return destIndex; + } + } if(length>(INT32_MAX-destIndex)) { return -1; // integer overflow } @@ -258,93 +330,77 @@ utf8_caseContextIterator(void *context, int8_t dir) { * context [0..srcLength[ into account. */ static int32_t -_caseMap(const UCaseMap *csm, UCaseMapFull *map, +_caseMap(int32_t caseLocale, uint32_t options, UCaseMapFull *map, uint8_t *dest, int32_t destCapacity, const uint8_t *src, UCaseContext *csc, int32_t srcStart, int32_t srcLimit, - UErrorCode *pErrorCode) { - const UChar *s = NULL; - UChar32 c, c2 = 0; - int32_t srcIndex, destIndex; - int32_t locCache; - - locCache=csm->locCache; - + icu::Edits *edits, + UErrorCode &errorCode) { /* case mapping loop */ - srcIndex=srcStart; - destIndex=0; + int32_t srcIndex=srcStart; + int32_t destIndex=0; while(srcIndexcpStart=srcIndex; + int32_t cpStart; + csc->cpStart=cpStart=srcIndex; + UChar32 c; U8_NEXT(src, srcIndex, srcLimit, c); csc->cpLimit=srcIndex; if(c<0) { // Malformed UTF-8. - destIndex=appendString(dest, destIndex, destCapacity, src+csc->cpStart, srcIndex-csc->cpStart); + destIndex=appendUnchanged(dest, destIndex, destCapacity, + src+cpStart, srcIndex-cpStart, options, edits); if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } continue; } - c=map(csm->csp, c, utf8_caseContextIterator, csc, &s, csm->locale, &locCache); - if((destIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } return destIndex; } #if !UCONFIG_NO_BREAK_ITERATION U_CFUNC int32_t U_CALLCONV -ucasemap_internalUTF8ToTitle(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode) { - const UChar *s; - UChar32 c; - int32_t prev, titleStart, titleLimit, idx, destIndex; - UBool isFirstIndex; - - if(U_FAILURE(*pErrorCode)) { +ucasemap_internalUTF8ToTitle( + int32_t caseLocale, uint32_t options, BreakIterator *iter, + uint8_t *dest, int32_t destCapacity, + const uint8_t *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode) { + if(U_FAILURE(errorCode)) { return 0; } - // Use the C++ abstract base class to minimize dependencies. - // TODO: Change UCaseMap.iter to store a BreakIterator directly. - BreakIterator *bi=reinterpret_cast(csm->iter); - /* set up local variables */ - int32_t locCache=csm->locCache; UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - destIndex=0; - prev=0; - isFirstIndex=TRUE; + int32_t destIndex=0; + int32_t prev=0; + UBool isFirstIndex=TRUE; /* titlecasing loop */ while(prevfirst(); + index=iter->first(); } else { - idx=bi->next(); + index=iter->next(); } - if(idx==UBRK_DONE || idx>srcLength) { - idx=srcLength; + if(index==UBRK_DONE || index>srcLength) { + index=srcLength; } /* @@ -360,29 +416,32 @@ ucasemap_internalUTF8ToTitle(const UCaseMap *csm, * b) first case letter (titlecase) [titleStart..titleLimit[ * c) subsequent characters (lowercase) [titleLimit..index[ */ - if(prevoptions&U_TITLECASE_NO_BREAK_ADJUSTMENT)==0 && UCASE_NONE==ucase_getType(csm->csp, c)) { + int32_t titleStart=prev; + int32_t titleLimit=prev; + UChar32 c; + U8_NEXT(src, titleLimit, index, c); + if((options&U_TITLECASE_NO_BREAK_ADJUSTMENT)==0 && UCASE_NONE==ucase_getType(c)) { /* Adjust the titlecasing index (titleStart) to the next cased character. */ for(;;) { titleStart=titleLimit; - if(titleLimit==idx) { + if(titleLimit==index) { /* * only uncased characters in [prev..index[ * stop with titleStart==titleLimit==index */ break; } - U8_NEXT(src, titleLimit, idx, c); - if(UCASE_NONE!=ucase_getType(csm->csp, c)) { + U8_NEXT(src, titleLimit, index, c); + if(UCASE_NONE!=ucase_getType(c)) { break; /* cased letter at [titleStart..titleLimit[ */ } } - destIndex=appendString(dest, destIndex, destCapacity, src+prev, titleStart-prev); + destIndex=appendUnchanged(dest, destIndex, destCapacity, + src+prev, titleStart-prev, options, edits); if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } } @@ -392,47 +451,69 @@ ucasemap_internalUTF8ToTitle(const UCaseMap *csm, if(c>=0) { csc.cpStart=titleStart; csc.cpLimit=titleLimit; - c=ucase_toFullTitle(csm->csp, c, utf8_caseContextIterator, &csc, &s, csm->locale, &locCache); - destIndex=appendResult(dest, destIndex, destCapacity, c, s); + const UChar *s; + c=ucase_toFullTitle(c, utf8_caseContextIterator, &csc, &s, caseLocale); + destIndex=appendResult(dest, destIndex, destCapacity, c, s, + titleLimit-titleStart, options, edits); } else { // Malformed UTF-8. - destIndex=appendString(dest, destIndex, destCapacity, src+titleStart, titleLimit-titleStart); + destIndex=appendUnchanged(dest, destIndex, destCapacity, + src+titleStart, titleLimit-titleStart, options, edits); } if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } /* Special case Dutch IJ titlecasing */ - if (titleStart+1 < idx && - ucase_getCaseLocale(csm->locale, &locCache) == UCASE_LOC_DUTCH && - (src[titleStart] == 0x0049 || src[titleStart] == 0x0069) && - (src[titleStart+1] == 0x004A || src[titleStart+1] == 0x006A)) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A); - titleLimit++; + if (titleStart+1 < index && + caseLocale == UCASE_LOC_DUTCH && + (src[titleStart] == 0x0049 || src[titleStart] == 0x0069)) { + if (src[titleStart+1] == 0x006A) { + destIndex=appendASCII(dest, destIndex, destCapacity, 0x004A); + if(destIndex<0) { + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + if(edits!=NULL) { + edits->addReplace(1, 1); + } + titleLimit++; + } else if (src[titleStart+1] == 0x004A) { + // Keep the capital J from getting lowercased. + destIndex=appendUnchanged(dest, destIndex, destCapacity, + src+titleStart+1, 1, options, edits); + if(destIndex<0) { + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + titleLimit++; + } } + /* lowercase [titleLimit..index[ */ - if(titleLimitoptions&U_TITLECASE_NO_LOWERCASE)==0) { + if(titleLimitdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } #endif @@ -454,11 +532,11 @@ ucasemap_internalUTF8ToTitle(const UCaseMap *csm, U_NAMESPACE_BEGIN namespace GreekUpper { -UBool isFollowedByCasedLetter(const UCaseProps *csp, const uint8_t *s, int32_t i, int32_t length) { +UBool isFollowedByCasedLetter(const uint8_t *s, int32_t i, int32_t length) { while (i < length) { UChar32 c; U8_NEXT(s, i, length, c); - int32_t type = ucase_getTypeOrIgnorable(csp, c); + int32_t type = ucase_getTypeOrIgnorable(c); if ((type & UCASE_IGNORABLE) != 0) { // Case-ignorable, continue with the loop. } else if (type != UCASE_NONE) { @@ -471,11 +549,11 @@ UBool isFollowedByCasedLetter(const UCaseProps *csp, const uint8_t *s, int32_t i } // Keep this consistent with the UTF-16 version in ustrcase.cpp and the Java version in CaseMap.java. -int32_t toUpper(const UCaseMap *csm, +int32_t toUpper(uint32_t options, uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode) { - int32_t locCache = UCASE_LOC_GREEK; + Edits *edits, + UErrorCode &errorCode) { int32_t destIndex=0; uint32_t state = 0; for (int32_t i = 0; i < srcLength;) { @@ -483,7 +561,7 @@ int32_t toUpper(const UCaseMap *csm, UChar32 c; U8_NEXT(src, nextIndex, srcLength, c); uint32_t nextState = 0; - int32_t type = ucase_getTypeOrIgnorable(csm->csp, c); + int32_t type = ucase_getTypeOrIgnorable(c); if ((type & UCASE_IGNORABLE) != 0) { // c is case-ignorable nextState |= (state & AFTER_CASED); @@ -533,7 +611,7 @@ int32_t toUpper(const UCaseMap *csm, (data & HAS_ACCENT) != 0 && numYpogegrammeni == 0 && (state & AFTER_CASED) == 0 && - !isFollowedByCasedLetter(csm->csp, src, nextIndex, srcLength)) { + !isFollowedByCasedLetter(src, nextIndex, srcLength)) { // Keep disjunctive "or" with (only) a tonos. // We use the same "word boundary" conditions as for the Final_Sigma test. if (i == nextIndex) { @@ -551,40 +629,75 @@ int32_t toUpper(const UCaseMap *csm, data &= ~HAS_EITHER_DIALYTIKA; } } - destIndex=appendUChar(dest, destIndex, destCapacity, (UChar)upper); - if (destIndex >= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x308); // restore or add a dialytika - } - if (destIndex >= 0 && addTonos) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x301); - } - while (destIndex >= 0 && numYpogegrammeni > 0) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x399); - --numYpogegrammeni; - } - if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + + UBool change = TRUE; + if (edits != NULL) { + // Find out first whether we are changing the text. + U_ASSERT(0x370 <= upper && upper <= 0x3ff); // 2-byte UTF-8, main Greek block + change = (i + 2) > nextIndex || + src[i] != getTwoByteLead(upper) || src[i + 1] != getTwoByteTrail(upper) || + numYpogegrammeni > 0; + int32_t i2 = i + 2; + if ((data & HAS_EITHER_DIALYTIKA) != 0) { + change |= (i2 + 2) > nextIndex || + src[i2] != (uint8_t)u8"\u0308"[0] || + src[i2 + 1] != (uint8_t)u8"\u0308"[1]; + i2 += 2; + } + if (addTonos) { + change |= (i2 + 2) > nextIndex || + src[i2] != (uint8_t)u8"\u0301"[0] || + src[i2 + 1] != (uint8_t)u8"\u0301"[1]; + i2 += 2; + } + int32_t oldLength = nextIndex - i; + int32_t newLength = (i2 - i) + numYpogegrammeni * 2; // 2 bytes per U+0399 + change |= oldLength != newLength; + if (change) { + if (edits != NULL) { + edits->addReplace(oldLength, newLength); + } + } else { + if (edits != NULL) { + edits->addUnchanged(oldLength); + } + // Write unchanged text? + change = (options & UCASEMAP_OMIT_UNCHANGED_TEXT) == 0; + } } - } else if(c>=0) { - const UChar *s; - UChar32 c2 = 0; - c=ucase_toFullUpper(csm->csp, c, NULL, NULL, &s, csm->locale, &locCache); - if((destIndex= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { + destIndex=appendTwoBytes(dest, destIndex, destCapacity, u8"\u0308"); // restore or add a dialytika + } + if (destIndex >= 0 && addTonos) { + destIndex=appendTwoBytes(dest, destIndex, destCapacity, u8"\u0301"); + } + while (destIndex >= 0 && numYpogegrammeni > 0) { + destIndex=appendTwoBytes(dest, destIndex, destCapacity, u8"\u0399"); + --numYpogegrammeni; + } if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } } + } else if(c>=0) { + const UChar *s; + c=ucase_toFullUpper(c, NULL, NULL, &s, UCASE_LOC_GREEK); + destIndex = appendResult(dest, destIndex, destCapacity, c, s, + nextIndex - i, options, edits); + if (destIndex < 0) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } } else { // Malformed UTF-8. - destIndex=appendString(dest, destIndex, destCapacity, src+i, nextIndex-i); + destIndex=appendUnchanged(dest, destIndex, destCapacity, + src+i, nextIndex-i, options, edits); if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } } @@ -592,9 +705,6 @@ int32_t toUpper(const UCaseMap *csm, state = nextState; } - if(destIndex>destCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } return destIndex; } @@ -602,102 +712,92 @@ int32_t toUpper(const UCaseMap *csm, U_NAMESPACE_END static int32_t U_CALLCONV -ucasemap_internalUTF8ToLower(const UCaseMap *csm, +ucasemap_internalUTF8ToLower(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode) { + icu::Edits *edits, + UErrorCode &errorCode) { UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - return _caseMap( - csm, ucase_toFullLower, + int32_t destIndex = _caseMap( + caseLocale, options, ucase_toFullLower, dest, destCapacity, src, &csc, 0, srcLength, - pErrorCode); + edits, errorCode); + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } static int32_t U_CALLCONV -ucasemap_internalUTF8ToUpper(const UCaseMap *csm, +ucasemap_internalUTF8ToUpper(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode) { - int32_t locCache = csm->locCache; - if (ucase_getCaseLocale(csm->locale, &locCache) == UCASE_LOC_GREEK) { - return GreekUpper::toUpper(csm, dest, destCapacity, src, srcLength, pErrorCode); + icu::Edits *edits, + UErrorCode &errorCode) { + int32_t destIndex; + if (caseLocale == UCASE_LOC_GREEK) { + destIndex = GreekUpper::toUpper(options, dest, destCapacity, + src, srcLength, edits, errorCode); + } else { + UCaseContext csc=UCASECONTEXT_INITIALIZER; + csc.p=(void *)src; + csc.limit=srcLength; + destIndex = _caseMap( + caseLocale, options, ucase_toFullUpper, + dest, destCapacity, + src, &csc, 0, srcLength, + edits, errorCode); } - UCaseContext csc=UCASECONTEXT_INITIALIZER; - csc.p=(void *)src; - csc.limit=srcLength; - return _caseMap( - csm, ucase_toFullUpper, - dest, destCapacity, - src, &csc, 0, srcLength, - pErrorCode); + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } -static int32_t -utf8_foldCase(const UCaseProps *csp, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - uint32_t options, - UErrorCode *pErrorCode) { - int32_t srcIndex, destIndex; - - const UChar *s; - UChar32 c, c2; - int32_t start; - +static int32_t U_CALLCONV +ucasemap_internalUTF8Fold(int32_t /* caseLocale */, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED + uint8_t *dest, int32_t destCapacity, + const uint8_t *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode) { /* case mapping loop */ - srcIndex=destIndex=0; - while(srcIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; -} - -static int32_t U_CALLCONV -ucasemap_internalUTF8Fold(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode) { - return utf8_foldCase(csm->csp, dest, destCapacity, src, srcLength, csm->options, pErrorCode); + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } U_CFUNC int32_t -ucasemap_mapUTF8(const UCaseMap *csm, +ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, UTF8CaseMapper *stringCaseMapper, - UErrorCode *pErrorCode) { + icu::Edits *edits, + UErrorCode &errorCode) { int32_t destLength; /* check argument values */ - if(U_FAILURE(*pErrorCode)) { + if(U_FAILURE(errorCode)) { return 0; } if( destCapacity<0 || @@ -705,7 +805,7 @@ ucasemap_mapUTF8(const UCaseMap *csm, src==NULL || srcLength<-1 ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } @@ -719,12 +819,16 @@ ucasemap_mapUTF8(const UCaseMap *csm, ((src>=dest && src<(dest+destCapacity)) || (dest>=src && dest<(src+srcLength))) ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - destLength=stringCaseMapper(csm, dest, destCapacity, src, srcLength, pErrorCode); - return u_terminateChars((char *)dest, destCapacity, destLength, pErrorCode); + if(edits!=NULL) { + edits->reset(); + } + destLength=stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + dest, destCapacity, src, srcLength, edits, errorCode); + return u_terminateChars((char *)dest, destCapacity, destLength, &errorCode); } /* public API functions */ @@ -734,10 +838,11 @@ ucasemap_utf8ToLower(const UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { - return ucasemap_mapUTF8(csm, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, - ucasemap_internalUTF8ToLower, pErrorCode); + return ucasemap_mapUTF8( + csm->caseLocale, csm->options, UCASEMAP_BREAK_ITERATOR_NULL + (uint8_t *)dest, destCapacity, + (const uint8_t *)src, srcLength, + ucasemap_internalUTF8ToLower, NULL, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -745,10 +850,11 @@ ucasemap_utf8ToUpper(const UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { - return ucasemap_mapUTF8(csm, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, - ucasemap_internalUTF8ToUpper, pErrorCode); + return ucasemap_mapUTF8( + csm->caseLocale, csm->options, UCASEMAP_BREAK_ITERATOR_NULL + (uint8_t *)dest, destCapacity, + (const uint8_t *)src, srcLength, + ucasemap_internalUTF8ToUpper, NULL, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -756,8 +862,49 @@ ucasemap_utf8FoldCase(const UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { - return ucasemap_mapUTF8(csm, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, - ucasemap_internalUTF8Fold, pErrorCode); + return ucasemap_mapUTF8( + UCASE_LOC_ROOT, csm->options, UCASEMAP_BREAK_ITERATOR_NULL + (uint8_t *)dest, destCapacity, + (const uint8_t *)src, srcLength, + ucasemap_internalUTF8Fold, NULL, *pErrorCode); +} + +U_NAMESPACE_BEGIN + +int32_t CaseMap::utf8ToLower( + const char *locale, uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + return ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + (uint8_t *)dest, destCapacity, + (const uint8_t *)src, srcLength, + ucasemap_internalUTF8ToLower, edits, errorCode); } + +int32_t CaseMap::utf8ToUpper( + const char *locale, uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + return ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + (uint8_t *)dest, destCapacity, + (const uint8_t *)src, srcLength, + ucasemap_internalUTF8ToUpper, edits, errorCode); +} + +int32_t CaseMap::utf8Fold( + uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + return ucasemap_mapUTF8( + UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL + (uint8_t *)dest, destCapacity, + (const uint8_t *)src, srcLength, + ucasemap_internalUTF8Fold, edits, errorCode); +} + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/ucasemap_imp.h b/deps/icu-small/source/common/ucasemap_imp.h new file mode 100644 index 00000000000000..79204226b00900 --- /dev/null +++ b/deps/icu-small/source/common/ucasemap_imp.h @@ -0,0 +1,239 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// ucasemap_imp.h +// created: 2017feb08 Markus W. Scherer + +#ifndef __UCASEMAP_IMP_H__ +#define __UCASEMAP_IMP_H__ + +#include "unicode/utypes.h" +#include "unicode/ucasemap.h" +#include "ucase.h" + +#ifndef U_COMPARE_IGNORE_CASE +/* see also unorm.h */ +/** + * Option bit for unorm_compare: + * Perform case-insensitive comparison. + */ +#define U_COMPARE_IGNORE_CASE 0x10000 +#endif + +/** + * Internal API, used by u_strcasecmp() etc. + * Compare strings case-insensitively, + * in code point order or code unit order. + */ +U_CFUNC int32_t +u_strcmpFold(const UChar *s1, int32_t length1, + const UChar *s2, int32_t length2, + uint32_t options, + UErrorCode *pErrorCode); + +/** + * Interanl API, used for detecting length of + * shared prefix case-insensitively. + * @param s1 input string 1 + * @param length1 length of string 1, or -1 (NULL terminated) + * @param s2 input string 2 + * @param length2 length of string 2, or -1 (NULL terminated) + * @param options compare options + * @param matchLen1 (output) length of partial prefix match in s1 + * @param matchLen2 (output) length of partial prefix match in s2 + * @param pErrorCode receives error status + */ +U_CAPI void +u_caseInsensitivePrefixMatch(const UChar *s1, int32_t length1, + const UChar *s2, int32_t length2, + uint32_t options, + int32_t *matchLen1, int32_t *matchLen2, + UErrorCode *pErrorCode); + +/** + * Are the Unicode properties loaded? + * This must be used before internal functions are called that do + * not perform this check. + * Generate a debug assertion failure if data is not loaded. + */ +U_CFUNC UBool +uprv_haveProperties(UErrorCode *pErrorCode); + +#ifdef __cplusplus + +#include "unicode/unistr.h" // for UStringCaseMapper + +/* + * Internal string casing functions implementing + * ustring.h/ustrcase.cpp and UnicodeString case mapping functions. + */ + +struct UCaseMap : public icu::UMemory { + /** Implements most of ucasemap_open(). */ + UCaseMap(const char *localeID, uint32_t opts, UErrorCode *pErrorCode); + ~UCaseMap(); + +#if !UCONFIG_NO_BREAK_ITERATION + icu::BreakIterator *iter; /* We adopt the iterator, so we own it. */ +#endif + char locale[32]; + int32_t caseLocale; + uint32_t options; +}; + +#if UCONFIG_NO_BREAK_ITERATION +# define UCASEMAP_BREAK_ITERATOR_PARAM +# define UCASEMAP_BREAK_ITERATOR_UNUSED +# define UCASEMAP_BREAK_ITERATOR +# define UCASEMAP_BREAK_ITERATOR_NULL +#else +# define UCASEMAP_BREAK_ITERATOR_PARAM icu::BreakIterator *iter, +# define UCASEMAP_BREAK_ITERATOR_UNUSED icu::BreakIterator *, +# define UCASEMAP_BREAK_ITERATOR iter, +# define UCASEMAP_BREAK_ITERATOR_NULL NULL, +#endif + +U_CFUNC int32_t +ustrcase_getCaseLocale(const char *locale); + +// TODO: swap src / dest if approved for new public api +/** Implements UStringCaseMapper. */ +U_CFUNC int32_t U_CALLCONV +ustrcase_internalToLower(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); + +/** Implements UStringCaseMapper. */ +U_CFUNC int32_t U_CALLCONV +ustrcase_internalToUpper(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + +/** Implements UStringCaseMapper. */ +U_CFUNC int32_t U_CALLCONV +ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, + icu::BreakIterator *iter, + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); + +#endif + +/** Implements UStringCaseMapper. */ +U_CFUNC int32_t U_CALLCONV +ustrcase_internalFold(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); + +/** + * Common string case mapping implementation for ucasemap_toXyz() and UnicodeString::toXyz(). + * Implements argument checking. + */ +U_CFUNC int32_t +ustrcase_map(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UStringCaseMapper *stringCaseMapper, + icu::Edits *edits, + UErrorCode &errorCode); + +/** + * Common string case mapping implementation for old-fashioned u_strToXyz() functions + * that allow the source string to overlap the destination buffer. + * Implements argument checking and internally works with an intermediate buffer if necessary. + */ +U_CFUNC int32_t +ustrcase_mapWithOverlap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UStringCaseMapper *stringCaseMapper, + UErrorCode &errorCode); + +/** + * UTF-8 string case mapping function type, used by ucasemap_mapUTF8(). + * UTF-8 version of UStringCaseMapper. + * All error checking must be done. + * The UCaseMap must be fully initialized, with locale and/or iter set as needed. + * src and dest must not overlap. + */ +typedef int32_t U_CALLCONV +UTF8CaseMapper(int32_t caseLocale, uint32_t options, +#if !UCONFIG_NO_BREAK_ITERATION + icu::BreakIterator *iter, +#endif + uint8_t *dest, int32_t destCapacity, + const uint8_t *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + +/** Implements UTF8CaseMapper. */ +U_CFUNC int32_t U_CALLCONV +ucasemap_internalUTF8ToTitle(int32_t caseLocale, uint32_t options, + icu::BreakIterator *iter, + uint8_t *dest, int32_t destCapacity, + const uint8_t *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); + +#endif + +/** + * Implements argument checking and buffer handling + * for UTF-8 string case mapping as a common function. + */ +U_CFUNC int32_t +ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + uint8_t *dest, int32_t destCapacity, + const uint8_t *src, int32_t srcLength, + UTF8CaseMapper *stringCaseMapper, + icu::Edits *edits, + UErrorCode &errorCode); + +U_NAMESPACE_BEGIN +namespace GreekUpper { + +// Data bits. +static const uint32_t UPPER_MASK = 0x3ff; +static const uint32_t HAS_VOWEL = 0x1000; +static const uint32_t HAS_YPOGEGRAMMENI = 0x2000; +static const uint32_t HAS_ACCENT = 0x4000; +static const uint32_t HAS_DIALYTIKA = 0x8000; +// Further bits during data building and processing, not stored in the data map. +static const uint32_t HAS_COMBINING_DIALYTIKA = 0x10000; +static const uint32_t HAS_OTHER_GREEK_DIACRITIC = 0x20000; + +static const uint32_t HAS_VOWEL_AND_ACCENT = HAS_VOWEL | HAS_ACCENT; +static const uint32_t HAS_VOWEL_AND_ACCENT_AND_DIALYTIKA = + HAS_VOWEL_AND_ACCENT | HAS_DIALYTIKA; +static const uint32_t HAS_EITHER_DIALYTIKA = HAS_DIALYTIKA | HAS_COMBINING_DIALYTIKA; + +// State bits. +static const uint32_t AFTER_CASED = 1; +static const uint32_t AFTER_VOWEL_WITH_ACCENT = 2; + +uint32_t getLetterData(UChar32 c); + +/** + * Returns a non-zero value for each of the Greek combining diacritics + * listed in The Unicode Standard, version 8, chapter 7.2 Greek, + * plus some perispomeni look-alikes. + */ +uint32_t getDiacriticData(UChar32 c); + +} // namespace GreekUpper +U_NAMESPACE_END + +#endif // __cplusplus + +#endif // __UCASEMAP_IMP_H__ diff --git a/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp b/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp index ab61e21765b7aa..a253850fa290cf 100644 --- a/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucasemap_titlecase_brkiter.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -23,23 +23,59 @@ #include "unicode/brkiter.h" #include "unicode/ubrk.h" +#include "unicode/casemap.h" #include "unicode/ucasemap.h" #include "cmemory.h" #include "ucase.h" -#include "ustr_imp.h" +#include "ucasemap_imp.h" + +U_NAMESPACE_BEGIN + +int32_t CaseMap::utf8ToTitle( + const char *locale, uint32_t options, BreakIterator *iter, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { + return 0; + } + UText utext=UTEXT_INITIALIZER; + utext_openUTF8(&utext, src, srcLength, &errorCode); + LocalPointer ownedIter; + if(iter==NULL) { + iter=BreakIterator::createWordInstance(Locale(locale), errorCode); + ownedIter.adoptInstead(iter); + } + if(U_FAILURE(errorCode)) { + utext_close(&utext); + return 0; + } + iter->setText(&utext, errorCode); + int32_t length=ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, iter, + (uint8_t *)dest, destCapacity, + (const uint8_t *)src, srcLength, + ucasemap_internalUTF8ToTitle, edits, errorCode); + utext_close(&utext); + return length; +} + +U_NAMESPACE_END U_NAMESPACE_USE U_CAPI const UBreakIterator * U_EXPORT2 ucasemap_getBreakIterator(const UCaseMap *csm) { - return csm->iter; + return reinterpret_cast(csm->iter); } U_CAPI void U_EXPORT2 -ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode * /*pErrorCode*/) { - // Do not call ubrk_close() so that we do not depend on all of the BreakIterator code. - delete reinterpret_cast(csm->iter); - csm->iter=iterToAdopt; +ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode *pErrorCode) { + if(U_FAILURE(*pErrorCode)) { + return; + } + delete csm->iter; + csm->iter=reinterpret_cast(iterToAdopt); } U_CAPI int32_t U_EXPORT2 @@ -47,21 +83,23 @@ ucasemap_utf8ToTitle(UCaseMap *csm, char *dest, int32_t destCapacity, const char *src, int32_t srcLength, UErrorCode *pErrorCode) { - UText utext=UTEXT_INITIALIZER; - utext_openUTF8(&utext, (const char *)src, srcLength, pErrorCode); - if(U_FAILURE(*pErrorCode)) { + if (U_FAILURE(*pErrorCode)) { return 0; } + UText utext=UTEXT_INITIALIZER; + utext_openUTF8(&utext, (const char *)src, srcLength, pErrorCode); if(csm->iter==NULL) { - csm->iter=ubrk_open(UBRK_WORD, csm->locale, - NULL, 0, - pErrorCode); + csm->iter=BreakIterator::createWordInstance(Locale(csm->locale), *pErrorCode); + } + if (U_FAILURE(*pErrorCode)) { + return 0; } - ubrk_setUText(csm->iter, &utext, pErrorCode); - int32_t length=ucasemap_mapUTF8(csm, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, - ucasemap_internalUTF8ToTitle, pErrorCode); + csm->iter->setText(&utext, *pErrorCode); + int32_t length=ucasemap_mapUTF8( + csm->caseLocale, csm->options, csm->iter, + (uint8_t *)dest, destCapacity, + (const uint8_t *)src, srcLength, + ucasemap_internalUTF8ToTitle, NULL, *pErrorCode); utext_close(&utext); return length; } diff --git a/deps/icu-small/source/common/ucat.c b/deps/icu-small/source/common/ucat.cpp similarity index 97% rename from deps/icu-small/source/common/ucat.c rename to deps/icu-small/source/common/ucat.cpp index cfd8b532958c33..dac56eeb5ce482 100644 --- a/deps/icu-small/source/common/ucat.c +++ b/deps/icu-small/source/common/ucat.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/uchar.c b/deps/icu-small/source/common/uchar.cpp similarity index 99% rename from deps/icu-small/source/common/uchar.c rename to deps/icu-small/source/common/uchar.cpp index cf28f3f03cf541..03592fe036a61b 100644 --- a/deps/icu-small/source/common/uchar.c +++ b/deps/icu-small/source/common/uchar.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -68,6 +68,7 @@ struct _EnumTypeCallback { static uint32_t U_CALLCONV _enumTypeValue(const void *context, uint32_t value) { + (void)context; return GET_CATEGORY(value); } @@ -654,6 +655,8 @@ _enumPropertyStartsRange(const void *context, UChar32 start, UChar32 end, uint32 /* add the start code point to the USet */ const USetAdder *sa=(const USetAdder *)context; sa->add(sa->set, start); + (void)end; + (void)value; return TRUE; } diff --git a/deps/icu-small/source/common/uchar_props_data.h b/deps/icu-small/source/common/uchar_props_data.h index 79ba55eb75d570..fd74402e2d8cfb 100644 --- a/deps/icu-small/source/common/uchar_props_data.h +++ b/deps/icu-small/source/common/uchar_props_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 1999-2016, International Business Machines @@ -1330,2199 +1330,2241 @@ static const UTrie2 propsTrie={ NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint16_t propsVectorsTrie_index[28540]={ -0x4bb,0x4c3,0x4cb,0x4d3,0x4eb,0x4f3,0x4fb,0x503,0x50b,0x513,0x51b,0x523,0x52b,0x533,0x53b,0x543, -0x54a,0x552,0x55a,0x562,0x565,0x56d,0x575,0x57d,0x585,0x58d,0x595,0x59d,0x5a5,0x5ad,0x5b5,0x5bd, -0x5c5,0x5cd,0x5d4,0x5dc,0x5e4,0x5ec,0x5f4,0x5fc,0x604,0x60c,0x611,0x619,0x620,0x628,0x630,0x638, -0x640,0x648,0x650,0x658,0x65f,0x667,0x66f,0x677,0x67f,0x687,0x68f,0x697,0x69f,0x6a7,0x6af,0x6b7, -0x18ce,0xd31,0xe19,0x4db,0x4db,0xe89,0xe91,0x1a56,0x11bd,0x11d5,0x11c5,0x11cd,0x75c,0x762,0x76a,0x772, -0x77a,0x780,0x788,0x790,0x798,0x79e,0x7a6,0x7ae,0x7b6,0x7bc,0x7c4,0x7cc,0x7d4,0x7dc,0x7e4,0x7eb, -0x7f3,0x7f9,0x801,0x809,0x811,0x817,0x81f,0x827,0x82f,0x835,0x83d,0x845,0x84d,0x854,0x85c,0x864, -0x86c,0x870,0x878,0x87f,0x887,0x88f,0x897,0x89f,0x14dd,0x14e5,0x8a7,0x8af,0x8b7,0x8bf,0x8c7,0x8ce, -0x1543,0x1533,0x153b,0x1811,0x1819,0x11e5,0x8d6,0x11dd,0x1427,0x1427,0x1429,0x11f9,0x11fa,0x11ed,0x11ef,0x11f1, -0x154b,0x154d,0x8de,0x154d,0x8e6,0x8eb,0x8f3,0x1552,0x8f9,0x154d,0x8ff,0x907,0xc09,0x155a,0x155a,0x90f, -0x156a,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b,0x156b, -0x156b,0x156b,0x156b,0x1562,0x917,0x1573,0x1573,0x91f,0xb16,0xb1e,0xb26,0xb2e,0x1583,0x157b,0x927,0x92f, -0x937,0x158d,0x1595,0x93f,0x158b,0x947,0x18d6,0xd39,0xb36,0xb3e,0xb46,0xb4b,0x1787,0xc3c,0xc43,0x16ef, -0xbd9,0x18de,0xd41,0xd49,0xd51,0xd59,0xf41,0xf41,0x17d7,0x17dc,0xc75,0xc7d,0x184d,0x1855,0x197f,0xe21, -0x185d,0xcc5,0xccd,0x1865,0x6bf,0x4db,0xf21,0xd61,0x170f,0x16f7,0x1707,0x16ff,0x179f,0x1797,0x175f,0xbe9, -0x1202,0x1202,0x1202,0x1202,0x1205,0x1202,0x1202,0x120d,0x94f,0x1215,0x953,0x95b,0x1215,0x963,0x96b,0x973, -0x1225,0x121d,0x122d,0x97b,0x983,0x98b,0x993,0x99b,0x1235,0x123d,0x1245,0x124d,0x9a3,0x1255,0x125c,0x1264, -0x126c,0x1274,0x127c,0x1284,0x128c,0x1293,0x129b,0x12a3,0x12ab,0x12b3,0x12b6,0x12b8,0x159d,0x1682,0x1688,0x9ab, -0x12c0,0x9b3,0x9bb,0x13da,0x13df,0x13e2,0x13ea,0x12c8,0x13f2,0x13f2,0x12d8,0x12d0,0x12e0,0x12e8,0x12f0,0x12f8, -0x1300,0x1308,0x1310,0x1318,0x1690,0x16e7,0x1821,0x195f,0x1328,0x132f,0x1337,0x133f,0x1320,0x1347,0x1698,0x169f, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x16a7,0x16aa,0x16a7,0x16a7,0x16b2,0x16b9,0x16bb,0x16c2, -0x16ca,0x16ce,0x16ce,0x16d1,0x16ce,0x16ce,0x16d7,0x16ce,0x1717,0x17cf,0x1829,0xb53,0xb59,0xb5f,0xb67,0xb6c, -0x1777,0xc19,0xc1d,0x17e4,0x1767,0x1767,0x1767,0xbf1,0x176f,0xc11,0x17b7,0xc65,0xbf9,0xc01,0xc01,0x186d, -0x17a7,0x1831,0xc53,0xc55,0x9c3,0x15ad,0x15ad,0x9cb,0x15b5,0x15b5,0x15b5,0x15b5,0x15b5,0x15b5,0x9d3,0x6c3, -0x140f,0x1431,0x9db,0x1439,0x9e3,0x1441,0x1449,0x1451,0x9eb,0x9f0,0x1459,0x1460,0x9f5,0x9fd,0x17c7,0xbe1, -0xa05,0x14b7,0x14be,0x1468,0x14c6,0x14cd,0x1470,0xa0d,0x1489,0x1489,0x148b,0x1478,0x1480,0x1480,0x1481,0x14d5, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x1174,0x171f,0x171f, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493, -0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x1493,0x149a,0x117c,0x1182, -0x15c5,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb, -0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb, -0x15cb,0x15cb,0x15cb,0x15cb,0xa15,0x15d3,0xa1d,0x18e6,0x1879,0x1879,0x1879,0x1879,0x1879,0x1879,0x1879,0x1879, -0x1875,0xcd5,0x1889,0x1881,0x188b,0x18ee,0x18ee,0xd69,0x177f,0x17ec,0x1841,0x1845,0x1839,0xc85,0xc8b,0xc8e, -0x17af,0xc5d,0x17f4,0xc96,0x1893,0x1896,0xcdd,0xd71,0x18a6,0x189e,0xce5,0xd79,0x18f6,0x18fa,0xd81,0xfe7, -0x18ae,0xced,0xcf5,0x1902,0x1912,0x190a,0xd89,0xee4,0xe29,0xe31,0x1ac9,0xf9f,0x1b6e,0x1b6e,0x191a,0xd91, -0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526, -0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528, -0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a, -0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525, -0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527, -0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529, -0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b, -0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526, -0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528, -0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a, -0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525, -0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527, -0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529, -0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b, -0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526, -0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528, -0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a, -0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525, -0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527, -0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529, -0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b, -0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0x152b,0x1525,0x1526,0x1527,0x1528,0x1529,0x152a,0xa25,0xd99,0xd9c, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd, -0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa, -0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x13fa,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2,0x14a2, -0x14a7,0x14af,0x16df,0x118a,0x17bf,0x17bf,0x118e,0x1195,0xa2d,0xa35,0xa3d,0x1367,0x136e,0x1376,0xa45,0x137e, -0x13af,0x13af,0x1357,0x135f,0x1386,0x13a6,0x13a7,0x13b7,0x138e,0x134f,0xa4d,0x1396,0xa55,0x139e,0xa5d,0xa61, -0xc6d,0x13bf,0xa69,0xa71,0x13c7,0x13cd,0x13d2,0xa79,0xa89,0x1417,0x141f,0x1402,0x1407,0xa91,0xa99,0xa81, -0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed, -0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14ed,0x14f5,0x14f5,0x14f5,0x14f5, -0x136c,0x136c,0x13ac,0x13ec,0x142c,0x146c,0x14ac,0x14ec,0x1528,0x1568,0x1594,0x15d4,0x1614,0x1654,0x1694,0x16d4, -0x1714,0x1750,0x1790,0x17d0,0x1810,0x1844,0x1880,0x18c0,0x1900,0x1940,0x197c,0x19bc,0x19fc,0x1a3c,0x1a7c,0x1abc, -0xa80,0xac0,0xb00,0xe4d,0xb40,0xa40,0xb80,0xa40,0xe73,0xa40,0xa40,0xa40,0xa40,0xbc0,0x12a9,0x12a9, -0xeb3,0xef3,0xa40,0xa40,0xa40,0xa40,0xdd2,0xc00,0xa40,0xa40,0xc40,0xc80,0xcc0,0xe12,0xd92,0xd02, -0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9,0x11e9, -0x11e9,0x11e9,0x11e9,0x11e9,0xf33,0x1229,0x1069,0x10a9,0x1269,0xf73,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfe9, -0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9, -0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0xfa9,0x1029, +static const uint16_t propsVectorsTrie_index[29136]={ +0x4cf,0x4d7,0x4df,0x4e7,0x4ff,0x507,0x50f,0x517,0x51f,0x527,0x52f,0x537,0x53f,0x547,0x54f,0x557, +0x55e,0x566,0x56e,0x576,0x579,0x581,0x589,0x591,0x599,0x5a1,0x5a9,0x5b1,0x5b9,0x5c1,0x5c9,0x5d1, +0x5d9,0x5e1,0x5e8,0x5f0,0x5f8,0x600,0x608,0x610,0x618,0x620,0x625,0x62d,0x634,0x63c,0x644,0x64c, +0x654,0x65c,0x664,0x66c,0x673,0x67b,0x683,0x68b,0x693,0x69b,0x6a3,0x6ab,0x6b3,0x6bb,0x6c3,0x6cb, +0x195d,0xda7,0xe8f,0x6d3,0x4ef,0xeff,0xf07,0x1aeb,0x124c,0x1264,0x1254,0x125c,0x7cf,0x7d5,0x7dd,0x7e5, +0x7ed,0x7f3,0x7fb,0x803,0x80b,0x811,0x819,0x821,0x829,0x82f,0x837,0x83f,0x847,0x84f,0x857,0x85e, +0x866,0x86c,0x874,0x87c,0x884,0x88a,0x892,0x89a,0x8a2,0x8ba,0x8aa,0x8b2,0x8c2,0x8c9,0x8d1,0x8d9, +0x8e1,0x8e5,0x8ed,0x8f4,0x8fc,0x904,0x90c,0x914,0x156c,0x1574,0x91c,0x924,0x92c,0x934,0x93c,0x943, +0x15d2,0x15c2,0x15ca,0x18a0,0x18a8,0x1274,0x94b,0x126c,0x14b6,0x14b6,0x14b8,0x1288,0x1289,0x127c,0x127e,0x1280, +0x15da,0x15dc,0x953,0x15dc,0x95b,0x960,0x968,0x15e1,0x96e,0x15dc,0x974,0x97c,0xc7e,0x15e9,0x15e9,0x984, +0x15f9,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa, +0x15fa,0x15fa,0x15fa,0x15f1,0x98c,0x1602,0x1602,0x994,0xb8b,0xb93,0xb9b,0xba3,0x1612,0x160a,0x99c,0x9a4, +0x9ac,0x161c,0x1624,0x9b4,0x161a,0x9bc,0x1965,0xdaf,0xbab,0xbb3,0xbbb,0xbc0,0x1816,0xcb1,0xcb8,0x177e, +0xc4e,0x196d,0xdb7,0xdbf,0xdc7,0xdcf,0xfb7,0xfb7,0x1866,0x186b,0xceb,0xcf3,0x18dc,0x18e4,0x1a0e,0xe97, +0x18ec,0xd3b,0xd43,0x18f4,0x6db,0x4ef,0xf97,0xdd7,0x179e,0x1786,0x1796,0x178e,0x182e,0x1826,0x17ee,0xc5e, +0x1291,0x1291,0x1291,0x1291,0x1294,0x1291,0x1291,0x129c,0x9c4,0x12a4,0x9c8,0x9d0,0x12a4,0x9d8,0x9e0,0x9e8, +0x12b4,0x12ac,0x12bc,0x9f0,0x9f8,0xa00,0xa08,0xa10,0x12c4,0x12cc,0x12d4,0x12dc,0xa18,0x12e4,0x12eb,0x12f3, +0x12fb,0x1303,0x130b,0x1313,0x131b,0x1322,0x132a,0x1332,0x133a,0x1342,0x1345,0x1347,0x162c,0x1711,0x1717,0xa20, +0x134f,0xa28,0xa30,0x1469,0x146e,0x1471,0x1479,0x1357,0x1481,0x1481,0x1367,0x135f,0x136f,0x1377,0x137f,0x1387, +0x138f,0x1397,0x139f,0x13a7,0x171f,0x1776,0x18b0,0x19ee,0x13b7,0x13be,0x13c6,0x13ce,0x13af,0x13d6,0x1727,0x172e, +0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1736,0x1739,0x1736,0x1736,0x1741,0x1748,0x174a,0x1751, +0x1759,0x175d,0x175d,0x1760,0x175d,0x175d,0x1766,0x175d,0x17a6,0x185e,0x18b8,0xbc8,0xbce,0xbd4,0xbdc,0xbe1, +0x1806,0xc8e,0xc92,0x1873,0x17f6,0x17f6,0x17f6,0xc66,0x17fe,0xc86,0x1846,0xcdb,0xc6e,0xc76,0xc76,0x18fc, +0x1836,0x18c0,0xcc8,0xccb,0xa38,0x163c,0x163c,0xa40,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0xa48,0x6df, +0x149e,0x14c0,0xa50,0x14c8,0xa58,0x14d0,0x14d8,0x14e0,0xa60,0xa65,0x14e8,0x14ef,0xa6a,0xa72,0x1856,0xc56, +0xa7a,0x1546,0x154d,0x14f7,0x1555,0x155c,0x14ff,0xa82,0x1518,0x1518,0x151a,0x1507,0x150f,0x150f,0x1510,0x1564, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, +0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x1201,0x17ae,0x17ae, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, +0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1529,0x1211,0x1209, +0x1654,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a, +0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a, +0x165a,0x165a,0x165a,0x165a,0xa8a,0x1662,0xa92,0x1975,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908, +0x1904,0xd4b,0x1918,0x1910,0x191a,0x197d,0x197d,0xddf,0x180e,0x187b,0x18d0,0x18d4,0x18c8,0xcfb,0xd01,0xd04, +0x183e,0xcd3,0x1883,0xd0c,0x1922,0x1925,0xd53,0xde7,0x1935,0x192d,0xd5b,0xdef,0x1985,0x1989,0xdf7,0x105d, +0x193d,0xd63,0xd6b,0x1991,0x19a1,0x1999,0xdff,0xf5a,0xe9f,0xea7,0x1b5e,0x1015,0x1c03,0x1c03,0x19a9,0xe07, +0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5, +0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7, +0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9, +0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4, +0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6, +0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8, +0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba, +0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5, +0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7, +0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9, +0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4, +0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6, +0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8, +0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba, +0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5, +0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7, +0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9, +0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4, +0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6, +0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8, +0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba, +0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0xa9a,0xe0f,0xe12, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c, +0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, +0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1531,0x1531,0x1531,0x1531,0x1531,0x1531,0x1531,0x1531, +0x1536,0x153e,0x176e,0x1219,0x184e,0x184e,0x121d,0x1224,0xaa2,0xaaa,0xab2,0x13f6,0x13fd,0x1405,0xaba,0x140d, +0x143e,0x143e,0x13e6,0x13ee,0x1415,0x1435,0x1436,0x1446,0x141d,0x13de,0xac2,0x1425,0xaca,0x142d,0xad2,0xad6, +0xce3,0x144e,0xade,0xae6,0x1456,0x145c,0x1461,0xaee,0xafe,0x14a6,0x14ae,0x1491,0x1496,0xb06,0xb0e,0xaf6, +0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c, +0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x1584,0x1584,0x1584,0x1584, +0x13bc,0x13bc,0x13fc,0x143c,0x147c,0x14bc,0x14fc,0x153c,0x1578,0x15b8,0x15e4,0x1624,0x1664,0x16a4,0x16e4,0x1724, +0x1764,0x17a0,0x17e0,0x1820,0x1860,0x1894,0x18d0,0x1910,0x1950,0x1990,0x19cc,0x1a0c,0x1a4c,0x1a8c,0x1acc,0x1b0c, +0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xe65,0xa40,0xa40,0xa40,0xa40,0xbfb,0x12fb,0x12fb, +0xea5,0xee5,0xa40,0xa40,0xa40,0xa40,0xc3b,0xc5b,0xa40,0xa40,0xc9b,0xcdb,0xd1b,0xe2d,0xded,0xd5d, +0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b, +0x123b,0x123b,0x123b,0x123b,0xf25,0x127b,0x10bb,0x10fb,0x12bb,0x1045,0x107b,0x107b,0x107b,0xf65,0xf85,0xfc5, +0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85, +0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0x1005, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, -0xd42,0xd52,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xcc2, -0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169, -0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x1169,0x10e9, -0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9, -0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x11a9,0x1129, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0xb74,0xb7b,0xb83,0xb8b,0x1727,0x1727,0x1727,0xb93,0xb9b,0xb9e,0x1757,0x174f,0xbd1,0xcfd,0xd01,0xd05, -0x4db,0x4db,0x4db,0x4db,0xd0d,0x18b6,0xd15,0xf39,0x15db,0xaa1,0xaa7,0xff7,0xba6,0x178f,0xc4b,0x4db, -0x15f0,0x15e3,0x15e8,0x172f,0xbae,0xbb6,0x1142,0x1148,0x1ab1,0xf56,0x1aa1,0x6cb,0x4db,0x4db,0x4db,0x4db, -0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0x1ad1,0xfa7,0xfaf,0xfb7,0x4db,0x4db,0x4db,0x4db, -0xbbe,0xbc1,0xda4,0x1b19,0xfef,0x6d3,0x4db,0x1088,0xc9e,0xd1d,0x4db,0x4db,0x1a66,0xeec,0xef4,0x1b59, -0xc25,0xc2c,0xc34,0x1922,0x1af9,0x4db,0x1ad9,0xfc7,0x192a,0xdac,0xdb4,0xdbc,0x1017,0x6db,0x4db,0x4db, -0x1932,0x1932,0x6e3,0x4db,0x1b86,0x10a0,0x1b7e,0x10a8,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0xdc4,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x1987,0x1989,0xe39,0xe40,0x1942,0x193a,0xdcc,0xf19,0x1a5e,0xed4,0xedc,0xfbf,0x1a76,0x1a7a,0xf11,0x1037, -0xf8a,0xf8f,0x6eb,0x4db,0x1090,0x1098,0x1ac1,0xf97,0xf6c,0xf72,0xf7a,0xf82,0x4db,0x4db,0x4db,0x4db, -0x1bc6,0x1bbe,0x1132,0x113a,0x1b41,0x1b39,0x105e,0x4db,0x4db,0x4db,0x4db,0x4db,0x1b29,0x101f,0x1027,0x102f, -0x1af1,0x1ae9,0xfd7,0x112a,0x1a82,0xf29,0x6f3,0x4db,0x106e,0x1076,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc, -0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x17fc,0x1801,0xca6,0xcad,0xcad,0xcad, -0x1809,0x1809,0x1809,0xcb5,0x1b76,0x1b76,0x1b76,0x1b76,0x1b76,0x1b76,0x6fb,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a, -0x194a,0x194a,0x194c,0x194a,0x1954,0x194a,0x194a,0x194a,0x194a,0x194a,0x194a,0x1957,0x194a,0x194a,0x194a,0x194a, -0x194a,0x703,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991,0x1991, -0x1991,0xe48,0xfdf,0x70b,0x4db,0x4db,0x70f,0xf31,0x1b11,0x1b09,0xfff,0x1007,0x717,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x1a6e,0x1a6e,0xefc,0xf01,0xf09,0x4db,0x4db,0x1114, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x1aa9,0x1aa9,0x1aa9,0xf49,0xf4e,0x71f,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x15f8,0x15f8,0x15f8,0x15f8,0x15f8,0x15f8,0x15f8,0xaaf,0x1608,0xab7,0x1609,0x1600,0x1611,0x1617,0x161f,0xabf, -0x1747,0x1747,0x727,0x4db,0x4db,0x4db,0x4db,0x4db,0x1737,0x1737,0xbc9,0xcbd,0x4db,0x4db,0x4db,0x4db, -0x1650,0x1657,0xac7,0x165a,0xacf,0xad7,0xadf,0x1654,0xae7,0xaef,0xaf7,0x1659,0x1661,0x1650,0x1657,0x1653, -0x165a,0x1662,0x1651,0x1658,0x1654,0xafe,0x1627,0x162f,0x1636,0x163d,0x162a,0x1632,0x1639,0x1640,0xb06,0x1648, -0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e,0x1b9e, -0x1b8e,0x1b91,0x1b8e,0x1b98,0x10e0,0x72f,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x110c,0x737,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x73b,0x103f,0x1b31,0x1045,0x1b31,0x104d,0x1052,0x1056,0x1056,0x10b0,0x10b8,0x10c0,0x10c8,0x10d0,0x10c8, -0x10d8,0x10c8,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743, -0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743, -0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743,0x743, -0x743,0x744,0xb0e,0x166a,0x166a,0x166a,0x74c,0x74c,0x74c,0x74c,0x173f,0x173f,0x173f,0x173f,0x173f,0x173f, -0x173f,0x754,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, -0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, -0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, -0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c,0x74c, -0x74c,0x74c,0x18be,0xd25,0x18c6,0x18c6,0xd29,0xe59,0xe61,0xe69,0xdd4,0xdda,0x196f,0xde2,0x1967,0xdea, -0xdee,0xdf5,0xdfd,0xe04,0xe0c,0xe11,0xe11,0xe11,0xe11,0xe11,0x19c0,0x19c8,0x19c0,0x19ce,0x19d6,0x19a1, -0x19de,0x19e6,0x19c0,0x19ee,0x19f6,0x19fd,0x1a05,0x19a9,0x19c0,0x1a08,0x19b1,0x19b8,0x1a10,0x1a16,0x1a92,0x1a99, -0x1a8a,0x1a1e,0x1a26,0x1a2e,0x1a36,0x1b01,0x1a3e,0x1a46,0xe71,0xe79,0x1999,0x1999,0x1999,0xe81,0x1ab9,0x1ab9, -0xf5e,0xf64,0xe50,0xe51,0xe51,0xe51,0xe51,0xe51,0xe51,0xe51,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x1ae1,0x1ae1,0x1ae1,0x1ae1,0x1ae1,0x1ae1,0xfcf,0x4db,0x1bb6,0x1bae,0x10e8,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0xe99,0xea1,0xea9,0xeb1,0xeb9,0xec1,0xec8,0xecc,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x1b51,0x1b49,0x1066,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x1b21,0x100f,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x10f0,0x10f5,0x10fd, -0x1104,0x111c,0x1122,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61,0x1b61, -0x1b61,0x1b66,0x1b61,0x1b61,0x1b61,0x107e,0x1080,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1150,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6, -0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1bd6,0x1158,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db,0x4db, -0x4db,0x4db,0x4db,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x119d,0x1160,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1168,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a, -0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x11a5,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x116c,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160, -0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x1160,0x116c,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x11ad,0x1a4e,0x1a4e,0x1a4e,0x1a4e,0x1a4e,0x1a4e,0x11b5,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1505,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x150d,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515, -0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x1515,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d, -0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x151d,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672, -0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1672,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977, -0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1977,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6, -0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1ba6,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce, -0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x1bce,0x4ba,0x4ba,0x4ba,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x276,0x27f,0x279,0x279,0x27c,0x273,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x7a1,0x79b,0x780,0x777, -0x76e,0x76b,0x762,0x77d,0x768,0x774,0x777,0x792,0x789,0x77a,0x79e,0x771,0x75f,0x75f,0x75f,0x75f, -0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x786,0x783,0x78c,0x78c,0x78c,0x79b,0x762,0x7ad,0x7ad,0x7ad, -0x7ad,0x7ad,0x7ad,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7, -0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x768,0x76e,0x774,0x798,0x75c,0x795,0x7aa,0x7aa,0x7aa, -0x7aa,0x7aa,0x7aa,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, -0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x768,0x78f,0x765,0x78c,0x273,0,0,0,0, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, +0xd9d,0xdad,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, +0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, +0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x113b, +0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb, +0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x117b, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0xbe9,0xbf0,0xbf8,0xc00,0x17b6,0x17b6,0x17b6,0xc08,0xc10,0xc13,0x17e6,0x17de,0xc46,0xd73,0xd77,0xd7b, +0x4ef,0x4ef,0x4ef,0x4ef,0xd83,0x1945,0xd8b,0xfaf,0x166a,0xb16,0xb1c,0x106d,0xc1b,0x181e,0xcc0,0x4ef, +0x167f,0x1672,0x1677,0x17be,0xc23,0xc2b,0x11c6,0x11cc,0x1b46,0xfcc,0x1b36,0x6e7,0x4ef,0x4ef,0x4ef,0x4ef, +0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x101d,0x1025,0x102d,0x4ef,0x4ef,0x4ef,0x4ef, +0xc33,0xc36,0xe1a,0x1bae,0x1065,0x6ef,0x4ef,0x10fe,0xd14,0xd93,0x4ef,0x4ef,0x1afb,0xf62,0xf6a,0x1bee, +0xc9a,0xca1,0xca9,0x19b1,0x1b8e,0x4ef,0x1b6e,0x103d,0x19b9,0xe22,0xe2a,0xe32,0x108d,0x6f7,0x4ef,0x4ef, +0x19c1,0x19c1,0x6ff,0x4ef,0x1c1b,0x1116,0x1c13,0x111e,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0xe3a,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x1a16,0x1a18,0xeaf,0xeb6,0x19d1,0x19c9,0xe42,0xf8f,0x1af3,0xf4a,0xf52,0x1035,0x1b0b,0x1b0f,0xf87,0x10ad, +0x1000,0x1005,0x707,0x4ef,0x1106,0x110e,0x1b56,0x100d,0xfe2,0xfe8,0xff0,0xff8,0x4ef,0x4ef,0x4ef,0x4ef, +0x1c5b,0x1c53,0x11b6,0x11be,0x1bd6,0x1bce,0x10d4,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1bbe,0x1095,0x109d,0x10a5, +0x1b86,0x1b7e,0x104d,0x11ae,0x1b17,0xf9f,0x70f,0x4ef,0x10e4,0x10ec,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x1be6,0x1bde,0x10dc,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x79a,0x79e,0x717,0x7a6,0x71e, +0x726,0x1bb6,0x1085,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1174,0x1179,0x1181,0x1188,0x11a0, +0x11a6,0x4ef,0x4ef,0x72e,0x732,0x73a,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x188b,0x188b,0x188b,0x188b,0x188b, +0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b, +0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x1890,0xd1c,0xd23,0xd23,0xd23,0x1898,0x1898,0x1898,0xd2b,0x1c0b, +0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x742,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9, +0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19db,0x19d9,0x19e3, +0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19e6,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x74a,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20, +0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0xebe,0x1055,0x752,0x4ef, +0x4ef,0x756,0xfa7,0x1ba6,0x1b9e,0x1075,0x107d,0x75e,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x1b03,0x1b03,0xf72,0xf77,0xf7f,0x4ef,0x4ef,0x1198,0xec6,0xec7,0xec7,0xec7,0xec7, +0xec7,0xec7,0xec7,0x766,0x4ef,0x4ef,0x762,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7, +0x7b7,0x7b7,0x76e,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1b3e,0x1b3e,0x1b3e,0xfbf,0xfc4, +0x776,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1687,0x1687,0x1687,0x1687,0x1687, +0x1687,0x1687,0xb24,0x1697,0xb2c,0x1698,0x168f,0x16a0,0x16a6,0x16ae,0xb34,0x17d6,0x17d6,0x77e,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x17c6,0x17c6,0xc3e,0xd33,0x4ef,0x4ef,0x4ef,0x4ef,0x16df,0x16e6,0xb3c,0x16e9,0xb44, +0xb4c,0xb54,0x16e3,0xb5c,0xb64,0xb6c,0x16e8,0x16f0,0x16df,0x16e6,0x16e2,0x16e9,0x16f1,0x16e0,0x16e7,0x16e3, +0xb73,0x16b6,0x16be,0x16c5,0x16cc,0x16b9,0x16c1,0x16c8,0x16cf,0xb7b,0x16d7,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33, +0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c23,0x1c26,0x1c23,0x1c2d,0x1164, +0x786,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1190,0x78e,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x792,0x10b5,0x1bc6,0x10bb, +0x1bc6,0x10c3,0x10c8,0x10cc,0x10cc,0x1126,0x112e,0x1136,0x113e,0x1146,0x114c,0x1154,0x115c,0x7ae,0x7ae,0x7ae, +0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae, +0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae, +0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7af,0xb83,0x16f9,0x16f9, +0x16f9,0x7bf,0x7bf,0x7bf,0x7bf,0x17ce,0x17ce,0x17ce,0x17ce,0x17ce,0x17ce,0x17ce,0x7c7,0x7bf,0x7bf,0x7bf, +0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, +0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, +0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, +0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x194d,0xd9b,0x1955, +0x1955,0xd9f,0xecf,0xed7,0xedf,0xe4a,0xe50,0x19fe,0xe58,0x19f6,0xe60,0xe64,0xe6b,0xe73,0xe7a,0xe82, +0xe87,0xe87,0xe87,0xe87,0xe87,0x1a4f,0x1a57,0x1a5f,0x1a63,0x1a6b,0x1a30,0x1a73,0x1a7b,0x1a5f,0x1a83,0x1a8b, +0x1a92,0x1a9a,0x1a38,0x1a5f,0x1a9d,0x1a40,0x1a47,0x1aa5,0x1aab,0x1b27,0x1b2e,0x1b1f,0x1ab3,0x1abb,0x1ac3,0x1acb, +0x1b96,0x1ad3,0x1adb,0xee7,0xeef,0x1a28,0x1a28,0x1a28,0xef7,0x1b4e,0x1b4e,0xfd4,0xfda,0x1b76,0x1b76,0x1b76, +0x1b76,0x1b76,0x1b76,0x1045,0x4ef,0x1c4b,0x1c43,0x116c,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0xf0f,0xf17,0xf1f, +0xf27,0xf2f,0xf37,0xf3e,0xf42,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6, +0x1bf6,0x1bf6,0x1bf6,0x1bfb,0x1bf6,0x1bf6,0x1bf6,0x10f4,0x10f6,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, +0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, +0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, +0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, +0x1c63,0x1c63,0x1c63,0x1c63,0x11d4,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b, +0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x11dc,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, +0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, +0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, +0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, +0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x122c,0x11e4,0x1a06,0x1a06,0x1a06, +0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, +0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, +0x11f9,0x11f9,0x11f9,0x11f9,0x11ec,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709, +0x1709,0x1709,0x1709,0x1709,0x1709,0x1234,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11ed,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, +0x11e4,0x11e4,0x11e4,0x11e4,0x11ed,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x11f5,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, +0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, +0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, +0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, +0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, +0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, +0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, +0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, +0x1a06,0x1a06,0x1a06,0x1a06,0x123c,0x1ae3,0x1ae3,0x1ae3,0x1ae3,0x1ae3,0x1ae3,0x1244,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, +0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, +0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, +0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, +0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x1594,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, +0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, +0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, +0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, +0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x159c,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, +0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, +0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, +0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, +0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, +0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, +0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, +0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, +0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x1701,0x1701,0x1701,0x1701,0x1701, +0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, +0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, +0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, +0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, +0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, +0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, +0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, +0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, +0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, +0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, +0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, +0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, +0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x4ce,0x2c4,0x2c4,0x2c4,0x2c4, +0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c7,0x2d0,0x2ca,0x2ca,0x2cd,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4, +0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x7f5,0x7ef,0x7d4,0x7cb, +0x7c2,0x7bf,0x7b6,0x7d1,0x7bc,0x7c8,0x7cb,0x7e6,0x7dd,0x7ce,0x7f2,0x7c5,0x7b3,0x7b3,0x7b3,0x7b3, +0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7da,0x7d7,0x7e0,0x7e0,0x7e0,0x7ef,0x7b6,0x801,0x801,0x801, +0x801,0x801,0x801,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb, +0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7bc,0x7c2,0x7c8,0x7ec,0x7b0,0x7e9,0x7fe,0x7fe,0x7fe, +0x7fe,0x7fe,0x7fe,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, +0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7bc,0x7e3,0x7b9,0x7e0,0x2c4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x282,0x282,0x282,0x282, -0x282,0x291,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x285,0x5fa,0x7b6,0x7b9, -0x600,0x7b9,0x7b3,0x5f7,0x5ee,0x28b,0x60c,0x28e,0x7bc,0x5e5,0x603,0x7b0,0x5fd,0x609,0x5eb,0x5eb, -0x5f1,0x288,0x5f7,0x5f4,0x5ee,0x5eb,0x60c,0x28e,0x5e8,0x5e8,0x5e8,0x5fa,0x297,0x297,0x297,0x297, -0x297,0x297,0x615,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x615,0x297,0x297,0x297, -0x297,0x297,0x297,0x606,0x615,0x297,0x297,0x297,0x297,0x297,0x615,0x60f,0x612,0x612,0x294,0x294, -0x294,0x294,0x60f,0x294,0x612,0x612,0x612,0x294,0x612,0x612,0x294,0x294,0x60f,0x294,0x612,0x612, -0x294,0x294,0x294,0x606,0x60f,0x612,0x612,0x294,0x612,0x294,0x60f,0x294,0x2a3,0x61b,0x2a3,0x29a, -0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a0,0x618,0x2a3,0x61b, -0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a, -0x2a3,0x29a,0x621,0x618,0x2a3,0x29a,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x618,0x624,0x61e, -0x2a3,0x29a,0x2a3,0x29a,0x618,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x624,0x61e,0x621,0x618,0x2a3, -0x61b,0x2a3,0x29a,0x2a3,0x61b,0x627,0x621,0x618,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x621,0x618, -0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a, -0x2a3,0x29a,0x621,0x618,0x2a3,0x29a,0x2a3,0x61b,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a, -0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x2a3,0x29a,0x2a3,0x29a,0x2a3,0x29a,0x29d,0x2a6,0x2b2,0x2b2,0x2a6, -0x2b2,0x2a6,0x2b2,0x2b2,0x2a6,0x2b2,0x2b2,0x2b2,0x2a6,0x2a6,0x2b2,0x2b2,0x2b2,0x2b2,0x2a6,0x2b2, -0x2b2,0x2a6,0x2b2,0x2b2,0x2b2,0x2a6,0x2a6,0x2a6,0x2b2,0x2b2,0x2a6,0x2b2,0x2b5,0x2a9,0x2b2,0x2a6, -0x2b2,0x2a6,0x2b2,0x2b2,0x2a6,0x2b2,0x2a6,0x2a6,0x2b2,0x2a6,0x2b2,0x2b5,0x2a9,0x2b2,0x2b2,0x2b2, -0x2a6,0x2b2,0x2a6,0x2b2,0x2b2,0x2a6,0x2a6,0x2af,0x2b2,0x2a6,0x2a6,0x2a6,0x2af,0x2af,0x2af,0x2af, -0x2b8,0x2b8,0x2ac,0x2b8,0x2b8,0x2ac,0x2b8,0x2b8,0x2ac,0x2b5,0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2b5, -0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2b5,0x62a,0x2a6,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9, -0x2b2,0x2a6,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2a9,0x2b8,0x2b8,0x2ac, -0x2b5,0x2a9,0x990,0x990,0x993,0x98d,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9, -0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9,0x2b5,0x2a9, -0x993,0x98d,0x993,0x98d,0x990,0x98a,0x993,0x98d,0xb4f,0xc51,0x990,0x98a,0x990,0x98a,0x993,0x98d, -0x993,0x98d,0x993,0x98d,0x993,0x98d,0x993,0x98d,0x993,0x98d,0x993,0x98d,0xc51,0xc51,0xc51,0xd4a, -0xd4a,0xd4a,0xd4d,0xd4d,0xd4a,0xd4d,0xd4d,0xd4a,0xd4a,0xd4d,0xe8e,0xe91,0xe91,0xe91,0xe91,0xe8e, -0xe91,0xe8e,0xe91,0xe8e,0xe91,0xe8e,0xe91,0xe8e,0x2bb,0x62d,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x62d,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2be,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x996,0x996,0x996, -0x996,0x996,0xc54,0xc54,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2cd,0x2cd,0x2cd, -0x2cd,0x2cd,0x2cd,0x2cd,0x2ca,0x2ca,0x2c1,0x2c1,0x633,0x2c1,0x2cd,0x636,0x2d0,0x636,0x636,0x636, -0x2d0,0x636,0x2cd,0x2cd,0x639,0x2d3,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c7,0x630,0x630,0x630,0x630, -0x2c4,0x630,0x2c1,0xac8,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x99f,0x99f, -0x99c,0x999,0x99c,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57,0xc57, -0xc57,0xc57,0xc57,0xc57,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, -0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, -0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, -0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c,0x63c, -0x63c,0x63c,0x63c,0x63c,0x63f,0x63f,0x8f4,0x63f,0x63f,0x8f7,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb, -0xacb,0xacb,0xacb,0xc09,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xe55,0xe55,0xe55,0xe55, -0xe58,0xd1d,0xd1d,0xd1d,0x642,0x642,0xace,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e, -0xc4e,0xc4e,0xc4e,0xc4e,0xf3c,0xf39,0xf3c,0xf39,0x2e2,0x2eb,0xf3c,0xf39,9,9,0x2f1,0xe94, -0xe94,0xe94,0x2d9,0x1491,9,9,9,9,0x2ee,0x2dc,0x300,0x2df,0x300,0x300,0x300,9, -0x300,9,0x300,0x300,0x2f7,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x648, -0x648,0x648,0x648,0x648,0x648,0x648,9,0x648,0x648,0x648,0x648,0x648,0x648,0x648,0x300,0x300, -0x2f7,0x2f7,0x2f7,0x2f7,0x2f7,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x645, -0x645,0x645,0x645,0x645,0x645,0x645,0x2f4,0x645,0x645,0x645,0x645,0x645,0x645,0x645,0x2f7,0x2f7, -0x2f7,0x2f7,0x2f7,0xf3c,0x303,0x303,0x306,0x300,0x300,0x303,0x2fa,0x9a2,0xb58,0xb55,0x2fd,0x9a2, -0x2fd,0x9a2,0x2fd,0x9a2,0x2fd,0x9a2,0x2e8,0x2e5,0x2e8,0x2e5,0x2e8,0x2e5,0x2e8,0x2e5,0x2e8,0x2e5, -0x2e8,0x2e5,0x2e8,0x2e5,0x303,0x303,0x2fa,0x2f4,0xb07,0xb04,0xb52,0xc5d,0xc5a,0xc60,0xc5d,0xc5a, -0xd50,0xd53,0xd53,0xd53,0x9b1,0x654,0x312,0x315,0x312,0x312,0x312,0x315,0x312,0x312,0x312,0x312, -0x315,0x9b1,0x315,0x312,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x654,0x651,0x651, -0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651,0x651, -0x651,0x651,0x651,0x651,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64e,0x64b,0x64b, -0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, -0x9ab,0x64e,0x30c,0x30f,0x30c,0x30c,0x30c,0x30f,0x30c,0x30c,0x30c,0x30c,0x30f,0x9ab,0x30f,0x30c, -0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, -0x312,0x30c,0x312,0x30c,0x312,0x30c,0x315,0x30f,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, -0x312,0x30c,0x309,0x900,0x903,0x8e5,0x8e5,0x10e6,0x9a5,0x9a5,0xb5e,0xb5b,0x9ae,0x9a8,0x9ae,0x9a8, -0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, -0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, -0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c,0x312,0x30c, -0x312,0x315,0x30f,0x312,0x30c,0xb5e,0xb5b,0x312,0x30c,0xb5e,0xb5b,0x312,0x30c,0xb5e,0xb5b,0xe97, -0x315,0x30f,0x315,0x30f,0x312,0x30c,0x315,0x30f,0x312,0x30c,0x315,0x30f,0x315,0x30f,0x315,0x30f, -0x312,0x30c,0x315,0x30f,0x315,0x30f,0x315,0x30f,0x312,0x30c,0x315,0x30f,0x9b1,0x9ab,0x315,0x30f, -0x315,0x30f,0x315,0x30f,0x315,0x30f,0xd59,0xd56,0x315,0x30f,0xe9a,0xe97,0xe9a,0xe97,0xe9a,0xe97, -0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7,0xbca,0xbc7, -0xec7,0xec4,0xec7,0xec4,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7,0xfba,0xfb7, -0xfba,0xfb7,0xfba,0xfb7,0x111f,0x111c,0x12f9,0x12f6,0x14ca,0x14c7,0x14ca,0x14c7,0x14ca,0x14c7,0x14ca,0x14c7, -0xc,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324, -0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0x324,0xc,0xc,0x327,0x318,0x318, -0x318,0x31b,0x318,0x318,0xc,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e, -0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e, -0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x31e,0x321,0xc,0x86a,0x9b4,0xc,0xc,0x1494,0x1494,0x13ad, -0xf,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, -0x924,0x924,0xd5c,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924, -0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0x32a,0xe9d,0x32a,0x32a,0x32a,0x336,0x32a, -0x32d,0x32a,0x32a,0x339,0x927,0xd5f,0xd62,0xd5f,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c, -0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0x33c,0xf,0xf,0xf,0xf,0xf, -0x33c,0x33c,0x33c,0x333,0x330,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xc63,0xc63,0xc63,0xc63,0x13b0,0x1497,0xf45,0xf45,0xf45,0xf42,0xf42,0xd6b,0x870,0xc72,0xc6f,0xc6f, -0xc66,0xc66,0xc66,0xc66,0xc66,0xc66,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0x86d,0x148b,0x12,0xd68,0x873, -0x12c0,0x357,0x35a,0x35a,0x35a,0x35a,0x35a,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0xf48,0xf48,0xf48,0xf48,0xf48, -0x876,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, -0x8eb,0x8eb,0x8eb,0xafe,0xafe,0xafe,0xc66,0xc6c,0xc69,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0x12bd, -0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x906,0x351,0x34e,0x34b,0x348,0xb61,0xb61, -0x8e8,0x357,0x357,0x363,0x357,0x35d,0x35d,0x35d,0x35d,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357, -0x357,0x357,0x357,0x357,0x9ba,0x9ba,0x357,0x357,0x357,0x357,0x357,0x9ba,0x35a,0x357,0x35a,0x357, -0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x357,0x9ba,0x357,0x357,0x357,0x35a, -0x366,0x357,0x342,0x342,0x342,0x342,0x342,0x342,0x342,0x33f,0x348,0x345,0x345,0x342,0x342,0x342, -0x342,0x360,0x360,0x342,0x342,0x348,0x345,0x345,0x345,0x342,0xc75,0xc75,0x354,0x354,0x354,0x354, -0x354,0x354,0x354,0x354,0x354,0x354,0x9ba,0x9ba,0x9ba,0x9b7,0x9b7,0xc75,0x9d2,0x9d2,0x9d2,0x9cc, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9c9,0x9cc,0x9c9,0x15,0x9bd,0x9cf,0x9c0,0x9cf,0x9cf, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0xc78,0xc78,0xc78,0x9c6,0x9c6,0x9c6,0x9c6, -0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c6,0x9c3,0x9c3,0x9c3,0x9c3, -0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x15,0x15,0xc78,0xc78,0xc78,0xdcb,0xdcb,0xdcb,0xdcb, -0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb, -0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xdcb,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc, -0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0xfcc,0x9d8,0x9d8,0x9d8,0x9d8, -0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, -0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8,0x9d8, -0x9d8,0x9d8,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0xb64,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xedf,0xedf,0xedf,0xedf, -0xedf,0xedf,0xedf,0xedf,0xedf,0xedf,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2, -0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2, -0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6,0xed6, -0xee5,0xee5,0xed9,0xed9,0xedc,0xeeb,0xee8,0x111,0x111,0x111,0x111,0x111,0x17d3,0x17d3,0x17d3,0x17d3, -0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xada,0xada,0xadd,0xadd, -0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0x75,0x75,0x75,0x75,0x1551,0x1551,0x1551,0x1551, -0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x154e,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1fe,0x1fe,0x1fe,0x1fe, -0x1fe,0x1fe,0x1fe,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x20a,0x20a,0x20a,0x20a, -0x20a,0x20a,0x20a,0x20a,0x20a,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x120f,0x120f,0x120f,0x120f, -0x120f,0x120f,0x120f,0x120f,0x120f,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0x17d,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1e0,0x1e0,0x1e0,0x1e0, -0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1467,0x1467,0x1467,0x1467, -0x1467,0x1467,0x1467,0x1467,0x1467,0x1467,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x173d,0x173d,0x173d,0x173d, -0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0x225,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1233,0x1233,0x1233,0x1233, -0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x186,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x15f6,0x15f6,0x15f6,0x15f6, -0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x15f6,0x1f8,0x1f8,0x1f8,0x1f8,0x15fc,0x15fc,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1548,0x1548,0x1548,0x1548, -0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x16aa,0x16aa,0x16aa,0x16aa, -0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xdc2,0xdc2,0xdbf,0xdbf, -0xdbf,0xdc2,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0xde,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x234,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x17d6,0x17d6,0x240,0x17d6, -0x17d6,0x240,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x240,0x240,0x240,0x240,0x240,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x2d3,0x2d3,0x2d3,0x2d3, +0x2d3,0x2e2,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3, +0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d6,0x64b,0x80a,0x80d, +0x651,0x80d,0x807,0x648,0x63f,0x2dc,0x65d,0x2df,0x810,0x636,0x654,0x804,0x64e,0x65a,0x63c,0x63c, +0x642,0x2d9,0x648,0x645,0x63f,0x63c,0x65d,0x2df,0x639,0x639,0x639,0x64b,0x2e8,0x2e8,0x2e8,0x2e8, +0x2e8,0x2e8,0x666,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x666,0x2e8,0x2e8,0x2e8, +0x2e8,0x2e8,0x2e8,0x657,0x666,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x666,0x660,0x663,0x663,0x2e5,0x2e5, +0x2e5,0x2e5,0x660,0x2e5,0x663,0x663,0x663,0x2e5,0x663,0x663,0x2e5,0x2e5,0x660,0x2e5,0x663,0x663, +0x2e5,0x2e5,0x2e5,0x657,0x660,0x663,0x663,0x2e5,0x663,0x2e5,0x660,0x2e5,0x2f4,0x66c,0x2f4,0x2eb, +0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f1,0x669,0x2f4,0x66c, +0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb, +0x2f4,0x2eb,0x672,0x669,0x2f4,0x2eb,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x669,0x675,0x66f, +0x2f4,0x2eb,0x2f4,0x2eb,0x669,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x675,0x66f,0x672,0x669,0x2f4, +0x66c,0x2f4,0x2eb,0x2f4,0x66c,0x678,0x672,0x669,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x672,0x669, +0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb, +0x2f4,0x2eb,0x672,0x669,0x2f4,0x2eb,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb, +0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2ee,0x2f7,0x303,0x303,0x2f7, +0x303,0x2f7,0x303,0x303,0x2f7,0x303,0x303,0x303,0x2f7,0x2f7,0x303,0x303,0x303,0x303,0x2f7,0x303, +0x303,0x2f7,0x303,0x303,0x303,0x2f7,0x2f7,0x2f7,0x303,0x303,0x2f7,0x303,0x306,0x2fa,0x303,0x2f7, +0x303,0x2f7,0x303,0x303,0x2f7,0x303,0x2f7,0x2f7,0x303,0x2f7,0x303,0x306,0x2fa,0x303,0x303,0x303, +0x2f7,0x303,0x2f7,0x303,0x303,0x2f7,0x2f7,0x300,0x303,0x2f7,0x2f7,0x2f7,0x300,0x300,0x300,0x300, +0x309,0x309,0x2fd,0x309,0x309,0x2fd,0x309,0x309,0x2fd,0x306,0x67b,0x306,0x67b,0x306,0x67b,0x306, +0x67b,0x306,0x67b,0x306,0x67b,0x306,0x67b,0x306,0x67b,0x2f7,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa, +0x303,0x2f7,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x2fa,0x309,0x309,0x2fd, +0x306,0x2fa,0x9e4,0x9e4,0x9e7,0x9e1,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa, +0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa, +0x9e7,0x9e1,0x9e7,0x9e1,0x9e4,0x9de,0x9e7,0x9e1,0xba3,0xca5,0x9e4,0x9de,0x9e4,0x9de,0x9e7,0x9e1, +0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0xca5,0xca5,0xca5,0xd9e, +0xd9e,0xd9e,0xda1,0xda1,0xd9e,0xda1,0xda1,0xd9e,0xd9e,0xda1,0xee5,0xee8,0xee8,0xee8,0xee8,0xee5, +0xee8,0xee5,0xee8,0xee5,0xee8,0xee5,0xee8,0xee5,0x30c,0x67e,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, +0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x67e,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, +0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, +0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30f,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, +0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x9ea,0x9ea,0x9ea, +0x9ea,0x9ea,0xca8,0xca8,0x327,0x327,0x327,0x327,0x327,0x327,0x327,0x327,0x327,0x31e,0x31e,0x31e, +0x31e,0x31e,0x31e,0x31e,0x31b,0x31b,0x318,0x318,0x684,0x318,0x31e,0x687,0x321,0x687,0x687,0x687, +0x321,0x687,0x31e,0x31e,0x68a,0x324,0x318,0x318,0x318,0x318,0x318,0x318,0x681,0x681,0x681,0x681, +0x315,0x681,0x318,0xb1c,0x327,0x327,0x327,0x327,0x327,0x312,0x312,0x312,0x312,0x312,0x9f3,0x9f3, +0x9f0,0x9ed,0x9f0,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, +0xcab,0xcab,0xcab,0xcab,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, +0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, +0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, +0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, +0x68d,0x68d,0x68d,0x68d,0x690,0x690,0x948,0x690,0x690,0x94b,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, +0xb1f,0xb1f,0xb1f,0xc5d,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xeac,0xeac,0xeac,0xeac, +0xeaf,0xd71,0xd71,0xd71,0x693,0x693,0xb22,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2, +0xca2,0xca2,0xca2,0xca2,0xf93,0xf90,0xf93,0xf90,0x333,0x33c,0xf93,0xf90,0x27,0x27,0x342,0xeeb, +0xeeb,0xeeb,0x32a,0x14e8,0x27,0x27,0x27,0x27,0x33f,0x32d,0x351,0x330,0x351,0x351,0x351,0x27, +0x351,0x27,0x351,0x351,0x348,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699, +0x699,0x699,0x699,0x699,0x699,0x699,0x27,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x351,0x351, +0x348,0x348,0x348,0x348,0x348,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696, +0x696,0x696,0x696,0x696,0x696,0x696,0x345,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x348,0x348, +0x348,0x348,0x348,0xf93,0x354,0x354,0x357,0x351,0x351,0x354,0x34b,0x9f6,0xbac,0xba9,0x34e,0x9f6, +0x34e,0x9f6,0x34e,0x9f6,0x34e,0x9f6,0x339,0x336,0x339,0x336,0x339,0x336,0x339,0x336,0x339,0x336, +0x339,0x336,0x339,0x336,0x354,0x354,0x34b,0x345,0xb5b,0xb58,0xba6,0xcb1,0xcae,0xcb4,0xcb1,0xcae, +0xda4,0xda7,0xda7,0xda7,0xa05,0x6a5,0x363,0x366,0x363,0x363,0x363,0x366,0x363,0x363,0x363,0x363, +0x366,0xa05,0x366,0x363,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a5,0x6a2,0x6a2, +0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2, +0x6a2,0x6a2,0x6a2,0x6a2,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69f,0x69c,0x69c, +0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c, +0x9ff,0x69f,0x35d,0x360,0x35d,0x35d,0x35d,0x360,0x35d,0x35d,0x35d,0x35d,0x360,0x9ff,0x360,0x35d, +0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, +0x363,0x35d,0x363,0x35d,0x363,0x35d,0x366,0x360,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, +0x363,0x35d,0x35a,0x954,0x957,0x939,0x939,0x113d,0x9f9,0x9f9,0xbb2,0xbaf,0xa02,0x9fc,0xa02,0x9fc, +0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, +0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, +0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, +0x363,0x366,0x360,0x363,0x35d,0xbb2,0xbaf,0x363,0x35d,0xbb2,0xbaf,0x363,0x35d,0xbb2,0xbaf,0xeee, +0x366,0x360,0x366,0x360,0x363,0x35d,0x366,0x360,0x363,0x35d,0x366,0x360,0x366,0x360,0x366,0x360, +0x363,0x35d,0x366,0x360,0x366,0x360,0x366,0x360,0x363,0x35d,0x366,0x360,0xa05,0x9ff,0x366,0x360, +0x366,0x360,0x366,0x360,0x366,0x360,0xdad,0xdaa,0x366,0x360,0xef1,0xeee,0xef1,0xeee,0xef1,0xeee, +0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b, +0xf1e,0xf1b,0xf1e,0xf1b,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e, +0x1011,0x100e,0x1011,0x100e,0x1176,0x1173,0x1350,0x134d,0x1521,0x151e,0x1521,0x151e,0x1521,0x151e,0x1521,0x151e, +0x2a,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375, +0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x2a,0x2a,0x378,0x369,0x369, +0x369,0x36c,0x369,0x369,0x2a,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, +0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, +0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x372,0x2a,0x8be,0xa08,0x2a,0x2a,0x14eb,0x14eb,0x1404, +0x2d,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x978,0x978,0xdb0,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, +0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0xef4,0x37b,0x37b,0x37b,0x387,0x37b, +0x37e,0x37b,0x37b,0x38a,0x97b,0xdb3,0xdb6,0xdb3,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, +0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, +0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x2d,0x2d,0x2d,0x2d,0x2d, +0x38d,0x38d,0x38d,0x384,0x381,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, +0xcb7,0xcb7,0xcb7,0xcb7,0x1407,0x14ee,0xf9c,0xf9c,0xf9c,0xf99,0xf99,0xdbf,0x8c4,0xcc6,0xcc3,0xcc3, +0xcba,0xcba,0xcba,0xcba,0xcba,0xcba,0xf96,0xf96,0xf96,0xf96,0xf96,0x8c1,0x14e2,0x30,0xdbc,0x8c7, +0x1317,0x3a8,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, +0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f, +0x8ca,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x93f,0x93f,0x93f,0x93f,0x93f, +0x93f,0x93f,0x93f,0xb52,0xb52,0xb52,0xcba,0xcc0,0xcbd,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0x1314, +0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x3a2,0x39f,0x39c,0x399,0xbb5,0xbb5, +0x93c,0x3a8,0x3a8,0x3b4,0x3a8,0x3ae,0x3ae,0x3ae,0x3ae,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, +0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, +0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, +0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, +0x3a8,0x3a8,0x3a8,0x3a8,0xa0e,0xa0e,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0xa0e,0x3ab,0x3a8,0x3ab,0x3a8, +0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0xa0e,0x3a8,0x3a8,0x3a8,0x3ab, +0x3b7,0x3a8,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x390,0x399,0x396,0x396,0x393,0x393,0x393, +0x393,0x3b1,0x3b1,0x393,0x393,0x399,0x396,0x396,0x396,0x393,0xcc9,0xcc9,0x3a5,0x3a5,0x3a5,0x3a5, +0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0xa0e,0xa0e,0xa0e,0xa0b,0xa0b,0xcc9,0xa26,0xa26,0xa26,0xa20, +0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa1d,0xa20,0xa1d,0x33,0xa11,0xa23,0xa14,0xa23,0xa23, +0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, +0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xccc,0xccc,0xccc,0xa1a,0xa1a,0xa1a,0xa1a, +0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa17,0xa17,0xa17,0xa17, +0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0x33,0x33,0xccc,0xccc,0xccc,0xe22,0xe22,0xe22,0xe22, +0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22, +0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023, +0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0xa2c,0xa2c,0xa2c,0xa2c, +0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c, +0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c, +0xa2c,0xa2c,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xbb8,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xf36,0xf36,0xf36,0xf36, +0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39, +0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39, +0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, +0xf3c,0xf3c,0xf30,0xf30,0xf33,0xf42,0xf3f,0x14a,0x14a,0x14a,0x14a,0x14a,6,6,6,6, +6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1827,0x1827,0x1827,0x1827, +0x1827,0x1827,0x1827,0x1827,0x1827,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb2e,0xb2e,0xb31,0xb31, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0x9f,0x9f,0x9f,0x9f,0x15a5,0x15a5,0x15a5,0x15a5, +0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x15a2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x23d,0x23d,0x23d,0x23d, +0x23d,0x23d,0x23d,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x249,0x249,0x249,0x249, +0x249,0x249,0x249,0x249,0x249,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x21f,0x21f,0x21f,0x21f, +0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x14be,0x14be,0x14be,0x14be, +0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x204,0x204,0x204,0x204,0x204,0x204,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,3,0xc,0xf,0xf, +0xc,0x12,3,0x15,0,0,0,0,0,0,0,0,6,0x15,0x15,0x15, +0x15,0x15,0x15,0x18,0x18,0x15,0x15,0x15,6,6,6,6,0,0,9,9, +9,9,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x18, +0x15,0x15,0xc,0xf,0xf,0,0x12,0x12,0x12,0xc,0xc,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x921,0x921,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,0x921,0x921, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, +0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,0, +6,6,0,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,0x15,0x15,0x15,0x15,0x15,0x15,0, +0,0,0x15,0,0x15,0x15,0,0x15,0x15,0x15,0x15,0x15,0x15,0x15,9,0x15, +0,0,0,0,0,0,0,0,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, +0x21,0x21,0,0,0,0,0,0,0x1791,0x1791,0x1791,0x1791,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, +0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x1c2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a, +0x164a,0x164a,0x237,0x237,0x237,0x237,0x1650,0x1650,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c, +0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, +0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0,0,0,0,0x16fe,0x16fe,0x16fe,0x16fe,0x24c,0x24c,0x24c,0x24c, +0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe19,0xe19,0xe16,0xe16,0xe16,0xe19,0x111,0x111, +0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x27c,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, +0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x182a,0x182a,0x288,0x182a,0x182a,0x288,0x182a,0x182a, +0x182a,0x182a,0x182a,0x288,0x288,0x288,0x288,0x288,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x975,0x975,6,0x15,0x15,0x15,0x15,0x15,0x15,0x18, +0x18,0x15,0x15,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,0x15,0x15,0x15,0x15,0x15, +0x15,0x18,9,0x15,0x15,0x15,0x15,0x12,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x149d,0x37e,0x38d,0x38d,0x1b,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x1b,0x1b,0x393, -0x393,0x1b,0x1b,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x393, -0x393,0x1b,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x1b,0x393,0x1b,0x1b,0x1b,0x393,0x393, -0x393,0x393,0x1b,0x1b,0x381,0xc7e,0x37e,0x38d,0x38d,0x37e,0x37e,0x37e,0x37e,0x1b,0x1b,0x38d, -0x38d,0x1b,0x1b,0x390,0x390,0x384,0xd71,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x37e, -0x1b,0x1b,0x1b,0x1b,0x396,0x396,0x1b,0x396,0x393,0x393,0x37e,0x37e,0x1b,0x1b,0x90c,0x90c, -0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x90c,0x393,0x393,0x38a,0x38a,0x387,0x387,0x387,0x387, -0x387,0x38a,0x387,0x10f5,0x1b,0x1b,0x1b,0x1b,0x1e,0xc81,0x399,0xc84,0x1e,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x3a5,0x1e,0x1e,0x1e,0x1e,0x3a5,0x3a5,0x1e,0x1e,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x1e,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5, -0x3a5,0x1e,0x3a5,0x3a8,0x1e,0x3a5,0x3a8,0x1e,0x3a5,0x3a5,0x1e,0x1e,0x39c,0x1e,0x3a2,0x3a2, -0x3a2,0x399,0x399,0x1e,0x1e,0x1e,0x1e,0x399,0x399,0x1e,0x1e,0x399,0x399,0x39f,0x1e,0x1e, -0x1e,0xf51,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3a8,0x3a8,0x3a8,0x3a5,0x1e,0x3a8,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f,0x90f, -0x399,0x399,0x3a5,0x3a5,0x3a5,0xf51,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x21,0x3ab,0x3ab,0x3b4,0x21,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0xc8d,0x3b7,0x21,0x3b7, -0x3b7,0x3b7,0x21,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7, -0x3b7,0x21,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x3b7,0x21,0x3b7,0x3b7,0x21,0x3b7,0x3b7,0x3b7, -0x3b7,0x3b7,0x21,0x21,0x3ae,0x3b7,0x3b4,0x3b4,0x3b4,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x21,0x3ab, -0x3ab,0x3b4,0x21,0x3b4,0x3b4,0x3b1,0x21,0x21,0x3b7,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x3b7,0xc8d,0xc87,0xc87,0x21,0x21,0x912,0x912, -0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x912,0x13b3,0xc8a,0x21,0x21,0x21,0x21,0x21,0x21, -0x21,0x16b9,0x21,0x21,0x21,0x21,0x21,0x21,0x24,0x3ba,0x3c9,0x3c9,0x24,0x3cf,0x3cf,0x3cf, -0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x24,0x24,0x3cf,0x3cf,0x24,0x24,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf, -0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x24,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf,0x3cf, -0x3cf,0x24,0x3cf,0x3cf,0x24,0xc90,0x3cf,0x3cf,0x3cf,0x3cf,0x24,0x24,0x3bd,0x3cf,0x3ba,0x3ba, -0x3c9,0x3ba,0x3ba,0x3ba,0xf54,0x24,0x24,0x3c9,0x3cc,0x24,0x24,0x3cc,0x3cc,0x3c0,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x24,0x3ba,0x3ba,0x24,0x24,0x24,0x24,0x3d2,0x3d2,0x24,0x3cf, -0x3cf,0x3cf,0xf54,0xf54,0x24,0x24,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, -0x3c3,0xc90,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, -0x27,0x27,0x3d5,0x3e1,0x27,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x27,0x27,0x27,0x3e1,0x3e1, -0x3e1,0x27,0x3e1,0x3e1,0x3e4,0x3e1,0x27,0x27,0x27,0x3e1,0x3e1,0x27,0x3e1,0x27,0x3e1,0x3e1, -0x27,0x27,0x27,0x3e1,0x3e1,0x27,0x27,0x27,0x3e1,0x3e1,0x91b,0x27,0x27,0x27,0x3e1,0x3e1, -0x3e1,0x3e1,0x3e1,0x3e1,0x3e1,0x91b,0xd74,0x3e1,0x3e1,0x3e1,0x27,0x27,0x27,0x27,0x3d5,0x3db, -0x3d5,0x3db,0x3db,0x27,0x27,0x27,0x3db,0x3db,0x3db,0x27,0x3de,0x3de,0x3de,0x3d8,0x27,0x27, -0xf57,0x27,0x27,0x27,0x27,0x27,0x27,0x3d5,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27, -0x27,0x27,0xe8b,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x915,0x915,0x915,0xc93, -0xc93,0xc93,0xc93,0xc93,0xc93,0xc96,0xc93,0x27,0x27,0x27,0x27,0x27,0x14a0,0x3f3,0x3f3,0x3f3, -0x2a,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x2a,0x3f6,0x3f6,0x3f6,0x2a,0x3f6,0x3f6, -0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x2a,0x3f6,0x3f6, -0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x14a3,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x2a,0x2a, -0x2a,0xf60,0x3e7,0x3e7,0x3e7,0x3f3,0x3f3,0x3f3,0x3f3,0x2a,0x3e7,0x3e7,0x3ea,0x2a,0x3e7,0x3e7, -0x3e7,0x3ed,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x3e7,0x3e7,0x2a,0xf60,0xf60,0x16bc,0x2a, -0x2a,0x2a,0x2a,0x2a,0x3f6,0x3f6,0xf5a,0xf5a,0x2a,0x2a,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0, -0x3f0,0x3f0,0x3f0,0x3f0,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0xf5d,0xf5d,0xf5d,0xf5d, -0xf5d,0xf5d,0xf5d,0xf5d,0x1779,0x14a6,0x402,0x402,0x2d,0x408,0x408,0x408,0x408,0x408,0x408,0x408, -0x408,0x2d,0x408,0x408,0x408,0x2d,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408, -0x408,0x408,0x408,0x408,0x408,0x2d,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408, -0x2d,0x408,0x408,0x408,0x408,0x408,0x2d,0x2d,0xc99,0xc9c,0x402,0x3f9,0x405,0x402,0x3f9,0x402, -0x402,0x2d,0x3f9,0x405,0x405,0x2d,0x405,0x405,0x3f9,0x3fc,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, -0x2d,0x3f9,0x3f9,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x408,0x2d,0x408,0x408,0xea3,0xea3, -0x2d,0x2d,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x2d,0xea6,0xea6,0x2d, -0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x30,0x14a9,0x414,0x414, -0x30,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x30,0x41a,0x41a,0x41a,0x30,0x41a,0x41a, -0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x12cf,0x41a,0x41a, -0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x41a,0x12cf,0x30, -0x30,0xf6c,0x40b,0x414,0x414,0x40b,0x40b,0x40b,0xf63,0x30,0x414,0x414,0x414,0x30,0x417,0x417, -0x417,0x40e,0x12d2,0x177c,0x30,0x30,0x30,0x30,0x177f,0x177f,0x177f,0x40b,0x177c,0x177c,0x177c,0x177c, -0x177c,0x177c,0x177c,0x16bf,0x41a,0x41a,0xf63,0xf63,0x30,0x30,0x411,0x411,0x411,0x411,0x411,0x411, -0x411,0x411,0x411,0x411,0xf66,0xf66,0xf66,0xf66,0xf66,0xf66,0x177c,0x177c,0x177c,0xf69,0xf6c,0xf6c, -0xf6c,0xf6c,0xf6c,0xf6c,0x33,0x33,0x9e4,0x9e4,0x33,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, -0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x33,0x33,0x33,0x9ea,0x9ea, -0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, -0x9ea,0x9ea,0x33,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x33,0x9ea,0x33,0x33, -0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x33,0x33,0x33,0x9de,0x33,0x33,0x33,0x33,0x9db, -0x9e4,0x9e4,0x9db,0x9db,0x9db,0x33,0x9db,0x33,0x9e4,0x9e4,0x9e7,0x9e4,0x9e7,0x9e7,0x9e7,0x9db, -0x33,0x33,0x33,0x33,0x33,0x33,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac,0x14ac, -0x33,0x33,0x9e4,0x9e4,0x9e1,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, -0x36,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435, -0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435,0x435, -0x435,0x420,0x435,0x432,0x420,0x420,0x420,0x420,0x420,0x420,0x426,0x36,0x36,0x36,0x36,0x41d, -0x43b,0x43b,0x43b,0x43b,0x43b,0x435,0x438,0x423,0x423,0x423,0x423,0x423,0x423,0x420,0x423,0x429, -0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x42c,0x42c,0x36,0x36,0x36,0x36, -0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, -0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x39,0x44a,0x44a,0x39, -0x44a,0x39,0x39,0x44a,0x44a,0x39,0x44a,0x39,0x39,0x44a,0x39,0x39,0x39,0x39,0x39,0x39, -0x44a,0x44a,0x44a,0x44a,0x39,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x44a,0x39,0x44a,0x44a,0x44a, -0x39,0x44a,0x39,0x44a,0x39,0x39,0x44a,0x44a,0x39,0x44a,0x44a,0x44a,0x44a,0x43e,0x44a,0x447, -0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x39,0x43e,0x43e,0x44a,0x39,0x39,0x453,0x453,0x453,0x453, -0x453,0x39,0x450,0x39,0x441,0x441,0x441,0x441,0x441,0x43e,0x39,0x39,0x444,0x444,0x444,0x444, -0x444,0x444,0x444,0x444,0x444,0x444,0x39,0x39,0x44d,0x44d,0x13b6,0x13b6,0x39,0x39,0x39,0x39, -0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, -0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x95d,0x95d,0x95d,0x960, -0x95d,0x95d,0x95d,0x95d,0x3c,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d, -0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x960,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, -0x95d,0x95d,0x95d,0x95d,0x95d,0x960,0x9f9,0xf78,0xf78,0x3c,0x3c,0x3c,0x3c,0x92a,0x92a,0x92d, -0x92a,0x92d,0x92d,0x936,0x92d,0x936,0x92a,0x92a,0x92a,0x92a,0x92a,0x957,0x92a,0x92d,0x930,0x930, -0x933,0x93c,0x930,0x930,0x95d,0x95d,0x95d,0x95d,0x12db,0x12d5,0x12d5,0x12d5,0x92a,0x92a,0x92a,0x92d, -0x92a,0x92a,0x9ed,0x92a,0x3c,0x92a,0x92a,0x92a,0x92a,0x92d,0x92a,0x92a,0x92a,0x92a,0x92d,0x92a, -0x92a,0x92a,0x92a,0x92d,0x92a,0x92a,0x92a,0x92a,0x92d,0x92a,0x9ed,0x9ed,0x9ed,0x92a,0x92a,0x92a, -0x92a,0x92a,0x92a,0x92a,0x9ed,0x92d,0x9ed,0x9ed,0x9ed,0x3c,0x9f6,0x9f6,0x9f3,0x9f3,0x9f3,0x9f3, -0x9f3,0x9f3,0x9f0,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x9f3,0x3c,0xf6f,0x9f3,0xd77,0xd77,0xf72,0xf75, -0xf6f,0x10f8,0x10f8,0x10f8,0x10f8,0x12d8,0x12d8,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, -0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x459,0x459,0x459,0x459,0x459,0x459,0x3f,0x13bc, -0x3f,0x3f,0x3f,0x3f,0x3f,0x13bc,0x3f,0x3f,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456, -0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86, -0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0x42, -0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86, -0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86,0xa23,0x42,0xa23,0xa23, -0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0x42,0xa23,0x42,0xa23,0xa23, -0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xd86,0xa23,0x42,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0x42,0x42,0x12de,0x12de,0xd80,0xd83,0xa1d,0xa26,0xa1a, -0xa1a,0xa1a,0xa1a,0xa26,0xa26,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa17,0xa17, -0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0x42,0x42,0x42,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0x16c5,0x45,0x45,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x45,0x45,0xa3b,0xa3e,0xa3e,0xa3e, -0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, -0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa38,0xa35,0x48,0x48,0x48,0xa44,0xa44,0xa44,0xa44, -0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa41,0xa41,0xa41,0xa44,0xa44,0xa44,0x14af,0x14af,0x14af, -0x14af,0x14af,0x14af,0x14af,0x14af,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xa65,0xa65,0xa65,0xa65, -0xa65,0xa65,0xa47,0xa65,0xa65,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4a,0xa4d,0xa4a, -0xa5c,0xa5c,0xa5f,0xa68,0xa56,0xa53,0xa5c,0xa59,0xa68,0xc9f,0x4e,0x4e,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xca2,0xca2,0xca2,0xca2, -0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xa77,0xa77,0xaf5,0xaf8, -0xa7d,0xaf2,0xa7a,0xa77,0xa80,0xa8f,0xa83,0xa92,0xa92,0xa92,0xa6e,0x51,0xa86,0xa86,0xa86,0xa86, -0xa86,0xa86,0xa86,0xa86,0xa86,0xa86,0x51,0x51,0x51,0x51,0x51,0x51,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xa89,0xa71,0xf99,0x51,0x51,0x51,0x51,0x51,0x114c,0x114c,0x114c,0x114c, -0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477, -0x477,0x477,0x54,0x54,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x54,0x54,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x54,0x47a,0x54,0x47a,0x54,0x47a,0x54,0x47a,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x54,0x54,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477, -0x477,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x471,0x477,0x471,0x471,0x46e,0x477,0x477, -0x477,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x46e,0x46e,0x46e,0x477,0x477,0x477,0x477, -0x54,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x54,0x46e,0x46e,0x46e,0x477,0x477,0x477,0x477, -0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x46e,0x46e,0x46e,0x54,0x54,0x477,0x477, -0x477,0x54,0x477,0x477,0x47a,0x47a,0x47a,0x47a,0x47a,0x474,0x471,0x54,0xb6a,0xb6d,0xb6d,0xb6d, -0xfa2,0x57,0x148e,0x148e,0x148e,0x148e,0x483,0x483,0x483,0x483,0x483,0x483,0x4ce,0xb7f,0x5a,0x5a, -0x68a,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0x4d4,0x4e6,0x4d4,0x4e0,0x4da,0x68d,0x4cb,0x687,0x687,0x687, -0x687,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4d1,0x4e3,0x4d1,0x4dd,0x4d7,0x5a,0xd8f,0xd8f,0xd8f,0xd8f, -0xd8f,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x5a,0x5a,0x5a,0x4ec,0x4ec,0x4ec,0x4ec, -0x4ec,0x4ec,0x4ec,0x4e9,0x4ef,0x702,0x4ec,0x966,0x987,0xaa1,0xaa1,0xaa1,0xb82,0xb82,0xd92,0xd92, -0xd92,0xd92,0x1110,0x1113,0x1113,0x12e4,0x1488,0x14b2,0x14b5,0x14b5,0x16c8,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x4f5,0x4f5,0x4f5,0x4f5, -0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f5,0x4f2,0x4f2,0x4f2,0x4f2,0x4f5,0xaa4,0xaa4, -0xb85,0xb8b,0xb8b,0xb88,0xb88,0xb88,0xb88,0xd95,0xea9,0xea9,0xea9,0xea9,0x10e3,0x60,0x60,0x60, -0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x525,0x525,0x525,0xaad, -0xeb2,0xfa8,0xfa8,0xfa8,0xfa8,0x123f,0x16cb,0x16cb,0x63,0x63,0x63,0x63,0x6b4,0x6b4,0x6b4,0x6b4, -0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x6b7,0x531,0x531,0x52e,0x52e,0x52e,0x52e,0xeb8,0xeb8,0xeb8,0xeb5, -0xeb5,0xeb5,0xeb5,0xeb5,0x1119,0x1365,0x1365,0x1365,0x1365,0x12e7,0x12e7,0x12e7,0x1368,0x12ea,0x12ea,0x1368, -0x14b8,0x14b8,0x14b8,0x14b8,0x14bb,0x14bb,0x14bb,0x1782,0x1782,0x1782,0x1782,0x66,0x558,0x558,0x558,0x558, -0x558,0xab6,0xab6,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, -0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x55b,0x55b,0x55b,0x55b, -0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x55b,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c, -0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0x6f,0xad1,0xad1,0xad1,0xad1,0xad4,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad4, -0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x72,0x78,0x7e9,0x7e3,0x7e9, -0x7e3,0x7e9,0x7e3,0x7e9,0x7e3,0x7e9,0x7e3,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3, -0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e3,0x7e3,0x7e3,0x7e9, -0x7e3,0x7e9,0x7e3,0x7e9,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3,0x7e9,0x7e3,0x7e3,0x7e3,0x7e3,0x7e3, -0x7e6,0xc2d,0xc2d,0x78,0x78,0x8fd,0x8fd,0x8c7,0x8c7,0x7ec,0x7ef,0xc2a,0x7b,0x7b,0x7b,0x7b, -0x7b,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801, -0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x10d1,0x7b,0x7b, -0x7e,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x7e,0x8d0,0x8d0,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3,0x8d3, -0x8d3,0x8d3,0x8d3,0x8d3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, -0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0x1374,0x1374,0x1374,0x81, -0x81,0x81,0x81,0x81,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, -0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d,0x80d, -0x80d,0xd2f,0xd2f,0x84,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, -0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, -0x813,0x813,0x813,0x84,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0x87,0x87,0x87,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, -0xaef,0xaef,0xaef,0xaef,0xaef,0xc36,0xaef,0xaef,0xaef,0xc36,0xaef,0x8a,0x8a,0x8a,0x8a,0x8a, -0x8a,0x8a,0x8a,0x8a,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, -0x1173,0x1173,0x1173,0x1173,0x981,0x981,0x981,0x981,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, -0x8d,0x8d,0x8d,0x8d,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8, -0x11e8,0x11e8,0x11e8,0x11e8,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x90,0x90,0x90,0x90,0x90, -0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x5a3,0x5a3,0x5a3,0x5a3,0x5a3,0x90,0x90,0x90,0x90, -0x90,0xac2,0x5a6,0x5ac,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x5a9,0x5ac,0x5ac, -0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x90,0x5ac,0x5ac,0x5ac,0x5ac, -0x5ac,0x90,0x5ac,0x90,0x5ac,0x5ac,0x90,0x5ac,0x5ac,0x90,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac, -0x5ac,0x5ac,0x5ac,0x5af,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, -0x5c4,0x5ca,0x5c7,0x5c1,0x12f3,0x12f3,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, -0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7, -0x5c1,0x5c7,0x5c7,0x5c1,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, -0x93,0x93,0x93,0x93,0x5c4,0x5c1,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c1,0x5c4,0x5c1,0x5c1, -0x5c4,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c4,0x5c4,0x5c4,0x5c1, -0x5c4,0x5c4,0x5c4,0x5c4,0x93,0x93,0x5c4,0x5c4,0x5c4,0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c4,0x5c1,0x5c1,0x93,0x93,0x93,0x93, -0x93,0x93,0x93,0x93,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a,0xb0a, -0xb0a,0xb0a,0xb0a,0xb0a,0x5c7,0x5c7,0x91e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5be,0x5be, -0xbc1,0xd47,0x93,0x93,0x825,0x837,0x834,0x837,0x834,0xc4b,0xc4b,0xd3b,0xd38,0x828,0x828,0x828, -0x828,0x83a,0x83a,0x83a,0x852,0x855,0x864,0x96,0x858,0x85b,0x867,0x867,0x84f,0x846,0x840,0x846, -0x840,0x846,0x840,0x843,0x843,0x85e,0x85e,0x861,0x85e,0x85e,0x85e,0x96,0x85e,0x84c,0x849,0x843, -0x96,0x96,0x96,0x96,0x5d3,0x5df,0x5d3,0xbc4,0x5d3,0x99,0x5d3,0x5df,0x5d3,0x5df,0x5d3,0x5df, -0x5d3,0x5df,0x5d3,0x5df,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9, -0x5df,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc, -0x5d6,0x99,0x99,0x5d0,0x723,0x726,0x73b,0x73e,0x71d,0x726,0x726,0x9f,0x705,0x708,0x708,0x708, -0x708,0x705,0x705,0x9f,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0xac5,0xac5,0xac5, -0x984,0x6ff,0x5e2,0x5e2,0x9f,0x74d,0x72c,0x71d,0x726,0x723,0x71d,0x72f,0x720,0x71a,0x71d,0x73b, -0x732,0x729,0x74a,0x71d,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x747,0x738,0x735, -0x73b,0x73b,0x73b,0x74d,0x70e,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b, -0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b, -0x70b,0x70b,0x70b,0x9f,0x9f,0x9f,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x9f,0x9f,0x70b,0x70b, -0x70b,0x70b,0x70b,0x70b,0x9f,0x9f,0x70b,0x70b,0x70b,0x70b,0x70b,0x70b,0x9f,0x9f,0x70b,0x70b, -0x70b,0x9f,0x9f,0x9f,0xb0d,0xb0d,0xb0d,0xb0d,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2, -0xa2,0xa2,0xa2,0xa2,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xa5,0xa5,0xa5,0xa5,0xa5,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0xb1c,0xb1c,0xb1c,0xb1c, -0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, -0xb1c,0xb1c,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xab,0xab,0xfb4,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0x16d1,0x16d1,0x16d1,0x16d1, -0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab, -0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xab,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xae,0xb40,0xb40,0xae,0xae,0xb40,0xae, -0xae,0xb40,0xb40,0xae,0xae,0xb40,0xb40,0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xae,0xb3d,0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xcc0,0xb3d,0xb3d, -0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d, -0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xae,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xae,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40,0xae,0xb40,0xb40,0xb40,0xb40, -0xb40,0xae,0xb40,0xae,0xae,0xae,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xae,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xdaa,0xdaa,0xae,0xae, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb37,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xec1,0xebe,0xae,0xae,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, -0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb1,0xb46,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xbd3, -0xbd3,0xbd3,0xbd3,0xbd3,0xbd3,0xb4,0xbd3,0xbd3,0xbd3,0xbd3,0xbcd,0xbcd,0xbd0,0xb4,0xb4,0xb4, -0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc, -0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbdc,0xbd6,0xbd6,0xbd9,0xc3f,0xc3f,0xb7, -0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2, -0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbe2,0xbdf,0xbdf,0xba,0xba,0xba,0xba, -0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbe8, -0xbe8,0xbe8,0xbe8,0xbe8,0xbe8,0xbd,0xbe8,0xbe8,0xbe8,0xbd,0xbe5,0xbe5,0xbd,0xbd,0xbd,0xbd, -0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2, -0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0xcd2, -0xcd2,0xcd2,0xcd2,0xcd2,0xcd2,0x14cd,0x14cd,0xc0,0xcc3,0xcc3,0xcc3,0xccf,0xccf,0xccf,0xccf,0xcc3, -0xcc3,0xccf,0xccf,0xccf,0xc0,0xc0,0xc0,0xc0,0xccf,0xccf,0xcc3,0xccf,0xccf,0xccf,0xccf,0xccf, -0xccf,0xcc6,0xcc6,0xcc6,0xc0,0xc0,0xc0,0xc0,0xcc9,0xc0,0xc0,0xc0,0xcd5,0xcd5,0xccc,0xccc, -0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xccc,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8, -0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xcd8,0xc3,0xc3,0xcd8,0xcd8,0xcd8,0xcd8, -0xcd8,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, -0xc6,0xc6,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0xc6,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0xc6,0xc6,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0x14d0,0xc6,0xc6, -0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x16d4,0x16d4,0x16d4,0x16d4, -0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xc9,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xcff,0xcff,0xc9,0xcff,0xcff,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xc9,0xcff,0xcff,0xcff,0xcff, -0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xcff,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, -0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, -0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xcc,0xcc,0xcc,0xcc,0xcc,0xd44,0xd44,0xd44,0xcf, -0xcf,0xcf,0xcf,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e, -0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xcf,0xcf,0xcf,0xd41, -0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd41,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08, -0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08, -0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd2,0xd05,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, -0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, -0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd5,0xd5,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, -0xd0e,0xd0e,0xd5,0xd5,0xd5,0xd5,0xd5,0xd5,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd8,0xd8, -0xd14,0xd8,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, -0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd8,0xd14,0xd14,0xd8,0xd8,0xd8, -0xd14,0xd8,0xd8,0xd14,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17, -0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xdb,0xdb,0xdb,0xdb,0xdb, -0xdb,0xdb,0xdb,0xdb,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0x14d3, -0x14d3,0x1785,0x1785,0xe1,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0, -0x138,0x138,0x138,0x138,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7, -0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdce,0xdce,0xdd4,0xdd4,0xdce, -0xe4,0xe4,0xdd1,0xdd1,0x10e0,0x10e0,0x10e0,0x10e0,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7, -0xe7,0xe7,0xe7,0xe7,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6, -0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d9,0xea,0xea,0xea,0xea,0xea,0x1788, -0x12ff,0x1122,0xed0,0xed0,0xde9,0xde6,0xde9,0xde6,0xde6,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0x112b, -0x1128,0x112b,0x1128,0x1125,0x1125,0x1125,0x13c5,0x13c2,0xed,0xed,0xed,0xed,0xed,0xde3,0xde0,0xde0, -0xde0,0xddd,0xde3,0xde0,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xf0,0xf0,0xf0,0xf0,0xf0, -0xf0,0xf0,0xf0,0xf0,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xf0,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xf0,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xf0,0xdec,0xdec,0xdec,0xdec, -0xdec,0xdec,0xdec,0xf0,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2, -0xdf2,0xdf2,0xdf2,0xdf2,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xdef,0xf3,0xf3, -0xf3,0xf3,0xf3,0xf3,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xf6,0x13c8,0xf6,0xf6,0xf6,0xf6, -0xf6,0x13c8,0xf6,0xf6,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, -0xdfb,0xdfb,0xdfb,0xf9,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8,0xdf8, -0xdf8,0xdf8,0xdf8,0xf9,0xe0d,0xe01,0xe01,0xe01,0xfc,0xe01,0xe01,0xfc,0xfc,0xfc,0xfc,0xfc, -0xe01,0xe01,0xe01,0xe01,0xe0d,0xe0d,0xe0d,0xe0d,0xfc,0xe0d,0xe0d,0xe0d,0xfc,0xe0d,0xe0d,0xe0d, -0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d, -0xe0d,0xe0d,0xe0d,0xe0d,0xfc,0xfc,0xfc,0xfc,0xdfe,0xdfe,0xdfe,0xfc,0xfc,0xfc,0xfc,0xe04, -0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe10,0xe10,0xe07,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0x1131,0x1131,0xff,0xff,0xff,0xff, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1f,0xe1f,0xe1f,0xe1c,0xe1c,0xe1f,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xff,0xff,0xff,0xff,0xff,0xff,0xe19,0xe19,0xe19,0xe19, -0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0x112e,0xff,0xff,0xff,0xe16,0xe16,0xe25,0xe25,0xe25,0xe25, -0x102,0x102,0x102,0x102,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe22,0xe25,0xe25,0xe25, -0xe25,0xe25,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x14e2,0x14e8,0x14e5,0x1830, -0x178b,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105, -0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105,0x105, -0x105,0x105,0x105,0x105,0xe4c,0xe4c,0xe4c,0xe49,0xe49,0xe40,0xe40,0xe49,0xe46,0xe46,0xe46,0xe46, -0x108,0x108,0x108,0x108,0x129c,0x129c,0x129c,0x129c,0x129c,0x129c,0x129f,0x129f,0x12a2,0x129f,0x15c,0x15c, -0x15c,0x15c,0x15c,0x15c,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0x13d4,0x13d4,0x10b,0x10b,0x10b,0x10b, -0x10b,0x10b,0x10b,0xe52,0x1305,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b,0x10b, -0x10b,0x10b,0x10b,0x1302,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f,0xc0f, -0xc0f,0xc0f,0xc0f,0xc0f,0xe7f,0xe70,0xe6a,0xe7c,0xe79,0xe73,0xe73,0xe82,0xe6d,0xe76,0x10e,0x10e, -0x10e,0x10e,0x10e,0x10e,0xf03,0xf03,0xeee,0xf03,0xf06,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, -0x114,0x114,0x114,0x114,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xefd,0xf0f,0xf0f, -0xef4,0xefa,0xf0f,0xf0f,0xef7,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef1, -0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef1,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4, -0xef4,0x114,0x114,0x114,0x130b,0x1308,0x130b,0x1308,0x130b,0x1308,0x130b,0x1308,0x130b,0x1308,0x13da,0x14f4, -0x14f4,0x14f4,0x178e,0x117,0x14f4,0x14f4,0x16dd,0x16dd,0x16dd,0x16d7,0x16dd,0x16d7,0x117,0x117,0x117,0x117, -0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117, -0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x14f1, -0x13dd,0x13dd,0x1308,0x100b,0x100b,0x100b,0x100b,0x100b,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, -0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1b,0xf1b,0xf21,0xf21, -0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a, -0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf2a,0xf24,0xf24, -0xf24,0xf24,0x113a,0x113a,0x11d,0x11d,0x11d,0xf27,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x16e0,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120, -0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120,0x120, -0x120,0x120,0x120,0x120,0xf33,0xf33,0xf33,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd,0x14fd, -0x14fd,0x14fd,0x14fd,0x123,0xf30,0xf30,0xf30,0xf30,0x14fa,0x123,0x123,0x123,0x123,0x123,0x123,0x123, -0x123,0x123,0x123,0x123,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf36, -0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126, -0x126,0x126,0x126,0x126,0x1032,0x1032,0x1032,0x1032,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f,0x102f, -0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x102f,0x102f,0x1026,0x1023,0x129,0x129,0x129,0x1035, -0x1035,0x1029,0x1029,0x1029,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x102c,0x129,0x129, -0x129,0x1032,0x1032,0x1032,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x1038,0x103b,0x103b, -0x103b,0x103b,0x103b,0x103b,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x1050,0x1050, -0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, -0x12c,0x12c,0x12c,0x12c,0x1077,0x1077,0x1077,0x1077,0x1071,0x1791,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, -0x12f,0x12f,0x107d,0x107d,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x12f,0x12f, -0x12f,0x12f,0x12f,0x12f,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x108f,0x108f,0x108f,0x108f,0x108f, -0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x1095,0x1098,0x132,0x132,0x132,0x132,0x132,0x132,0x132,0x132, -0x132,0x132,0x132,0x1092,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x109e,0x109e,0x109e, -0x109e,0x109e,0x109e,0x10a7,0x10a7,0x109e,0x109e,0x10a7,0x10a7,0x109e,0x109e,0x135,0x135,0x135,0x135,0x135, -0x135,0x135,0x135,0x135,0x10aa,0x10aa,0x10aa,0x109e,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, -0x109e,0x10a7,0x135,0x135,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x135,0x135, -0x10a1,0x10ad,0x10ad,0x10ad,0x1509,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, -0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, -0x138,0x138,0x138,0x138,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3, -0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3,0x10b3, -0x10b3,0x10b6,0x13b,0x13b,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9, -0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9, -0x10b9,0x13e,0x13e,0x13e,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, -0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141,0x141, -0x141,0x141,0x141,0x141,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2, -0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x10c2,0x144,0x144, -0x144,0x144,0x144,0x10bf,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5, -0x147,0x147,0x147,0x147,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, -0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a,0x14a, -0x14a,0x14a,0x14a,0x14a,0x1140,0x1140,0x1140,0x1140,0x1149,0x1140,0x1140,0x1140,0x1149,0x1140,0x1140,0x1140, -0x1140,0x113d,0x14d,0x14d,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146,0x1146, -0x1146,0x1146,0x1146,0x14d,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, -0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x150,0x150,0x150,0x150,0x150,0x150, -0x150,0x150,0x150,0x150,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167, -0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1164,0x114f,0x1164,0x114f,0x114f,0x114f,0x114f, -0x114f,0x114f,0x114f,0x153,0x1158,0x1161,0x114f,0x1161,0x1161,0x114f,0x114f,0x114f,0x114f,0x114f,0x114f,0x114f, -0x114f,0x1164,0x1164,0x1164,0x1164,0x1164,0x1164,0x114f,0x114f,0x1155,0x1155,0x1155,0x1155,0x1155,0x1155,0x1155, -0x1155,0x153,0x153,0x1152,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x153,0x153, -0x153,0x153,0x153,0x153,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x153,0x153, -0x153,0x153,0x153,0x153,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x116a,0x116d,0x116d,0x116d,0x116d, -0x115b,0x115b,0x153,0x153,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557,0x1557, -0x1557,0x1557,0x1554,0x1d1,0x12b1,0x1290,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x12ab,0x1293,0x1293,0x1293, -0x1293,0x12ab,0x1293,0x1293,0x1293,0x1293,0x1299,0x147f,0x1485,0x1482,0x147c,0x156,0x16ad,0x16ad,0x156,0x156, -0x156,0x156,0x156,0x156,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, -0x1182,0x1182,0x1182,0x1182,0x1179,0x1179,0x117c,0x1185,0x117f,0x117f,0x117f,0x1185,0x159,0x159,0x159,0x159, -0x159,0x159,0x159,0x159,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, -0x1188,0x1188,0x1188,0x1188,0x1188,0x12b7,0x118e,0x12ba,0x118e,0x118e,0x118e,0x118e,0x118b,0x118b,0x118b,0x118e, -0x16e6,0x16e9,0x15f,0x15f,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, -0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e,0x127e, -0x127e,0x162,0x162,0x162,0x11a3,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x119a,0x11a9,0x11a9,0x1197,0x1197, -0x1197,0x1197,0x165,0x12a5,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x165,0x165, -0x165,0x165,0x1197,0x1197,0x11c7,0x11bb,0x11c7,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168, -0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x11c4, -0x11c4,0x11ca,0x11be,0x11c1,0x11df,0x11df,0x11df,0x11d9,0x11d9,0x11d0,0x11d9,0x11d9,0x11d0,0x11d9,0x11d9,0x11e2, -0x11dc,0x11d3,0x16b,0x16b,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x11d6,0x16b,0x16b, -0x16b,0x16b,0x16b,0x16b,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x11e8,0x16e,0x16e,0x16e,0x16e,0x11e5, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x11e5,0x16e,0x16e,0x16e,0x16e, -0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1, -0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x11f1,0x171,0x11ee,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x174,0x174,0x174,0x11fa,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, -0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206, -0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x177,0x177,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203,0x1203, -0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c, -0x120c,0x120c,0x120c,0x17a,0x17a,0x17a,0x17a,0x17a,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, -0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212, -0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212,0x180, -0x1230,0x1230,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183, -0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b, -0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x1515,0x1515,0x189,0x189,0x189, -0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a, -0x125a,0x125a,0x125a,0x125d,0x125d,0x125d,0x123c,0x189,0x135f,0x1266,0x135f,0x135f,0x135f,0x135f,0x135f,0x135f, -0x135f,0x135f,0x135f,0x135f,0x135f,0x1266,0x135f,0x1266,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, -0x135c,0x135c,0x13ec,0x13ec,0x189,0x189,0x189,0x189,0x1362,0x1362,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, -0x135c,0x1263,0x135c,0x1263,0x1263,0x135c,0x1362,0x1269,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f,0x180f, -0x180f,0x180f,0x180f,0x180f,0x180f,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, -0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, -0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314, -0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314,0x1314, -0x1314,0x1314,0x1314,0x1314,0x128a,0x137d,0x137a,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, -0x18c,0x18c,0x18c,0x18c,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1287,0x1284, -0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1284,0x1287, -0x1284,0x1284,0x137d,0x137d,0x137d,0x137d,0x137d,0x137a,0x137d,0x137d,0x137d,0x1812,0x18c,0x18c,0x18c,0x18c, -0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, -0x13aa,0x13aa,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, -0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c, -0x18c,0x18c,0x18c,0x18c,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d, -0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x131d,0x1317,0x1317,0x1317, -0x18f,0x18f,0x131a,0x18f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x1320,0x1329,0x1323,0x1323,0x1329,0x1329, -0x1329,0x1323,0x1329,0x1323,0x1323,0x1323,0x132c,0x132c,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192, -0x1326,0x1326,0x1326,0x1326,0x195,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x195,0x195,0x1332,0x1332,0x1332, -0x1332,0x1332,0x1332,0x195,0x195,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x195,0x195,0x195,0x195,0x195, -0x195,0x195,0x195,0x195,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x195,0x1332,0x1332,0x1332,0x1332, -0x1332,0x1332,0x1332,0x195,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, -0x15b4,0x15b4,0x15b4,0x15b4,0x1335,0x1335,0x1335,0x1335,0x1335,0x1335,0x1338,0x134a,0x134a,0x133e,0x133e,0x133e, -0x133e,0x133e,0x198,0x198,0x198,0x198,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x133b, -0x133b,0x133b,0x133b,0x133b,0x133b,0x133b,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341,0x1341, -0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x198,0x1518, -0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d, -0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b, -0x1383,0x1380,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, -0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, -0x19e,0x19e,0x19e,0x19e,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, -0x1350,0x1350,0x1350,0x1a1,0x1a1,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, -0x1350,0x1350,0x1350,0x151b,0x1a1,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, -0x1350,0x1350,0x1350,0x1386,0x1a1,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, -0x1350,0x1350,0x1350,0x1350,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b, -0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x151b,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1, -0x1a1,0x1a1,0x1a1,0x1a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1533,0x1533,0x1533,0x1533,0x1533,0x1536, -0x16a4,0x1536,0x1536,0x1536,0x176d,0x181b,0x181b,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1533,0x1533,0x1533,0x1536,0x1533,0x16a1, -0x16a1,0x1a4,0x1a4,0x1a4,0x1536,0x1533,0x1533,0x1536,0x181b,0x181b,0x181b,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, -0x1a7,0x1a7,0x1a7,0x1a7,0x13f8,0x153c,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8,0x13f8, -0x13f8,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x16f2,0x16f2,0x1aa,0x179d,0x179d,0x179d,0x179d,0x179d,0x179d, -0x179d,0x179d,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, -0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, -0x179a,0x179a,0x179a,0x179a,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x1ad,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x13fe,0x1ad,0x1ad,0x1ad,0x1ad,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe, -0x1ad,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x1ad,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe, -0x1ad,0x13fe,0x1ad,0x13fe,0x1ad,0x13fe,0x13fe,0x1ad,0x13fe,0x1ad,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe, -0x13fe,0x1ad,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x1ad,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, -0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, -0x13fb,0x13fb,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, -0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1401,0x1401,0x1401,0x1401,0x1401,0x1410,0x1401,0x1404,0x1404, -0x1401,0x1401,0x1401,0x1407,0x1407,0x1b0,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d, -0x140a,0x1416,0x1416,0x1416,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0,0x1b0, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, -0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x141f,0x1419,0x1419,0x141f,0x141f, -0x1428,0x1428,0x1422,0x1425,0x1425,0x141f,0x141c,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3, -0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b, -0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x142b,0x1b6,0x1b6,0x1b6,0x1b6,0x16f5,0x16f5,0x142b,0x142b, -0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, -0x1b6,0x1b6,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, -0x1437,0x1437,0x1437,0x1437,0x1437,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, -0x1437,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434, -0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434,0x1434, -0x1434,0x1434,0x1434,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9, -0x1b9,0x1b9,0x1b9,0x1431,0x1431,0x1431,0x1431,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a,0x143a, -0x143a,0x143a,0x143a,0x143a,0x144c,0x144f,0x1452,0x1452,0x144f,0x1455,0x1455,0x1440,0x1443,0x16fb,0x16f8,0x16f8, -0x16f8,0x1542,0x1bc,0x1bc,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x1446,0x153f,0x1701, -0x1704,0x16fe,0x1707,0x1707,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1bf,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1458,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x145e,0x1c2,0x1c2,0x1c2,0x1c2, -0x1c2,0x1c2,0x1c2,0x1c2,0x12ae,0x12ab,0x12ae,0x1296,0x12ab,0x12ab,0x12ab,0x12b1,0x12ab,0x12b1,0x12b4,0x12ab, -0x12b1,0x12b1,0x12ab,0x12ab,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1461, -0x146a,0x1461,0x146a,0x146a,0x1461,0x1461,0x1461,0x1461,0x1461,0x1461,0x146d,0x1464,0x1c5,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x1c5,0x1c5,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548, -0x1548,0x1548,0x1c8,0x1c8,0x1545,0x1545,0x1545,0x1545,0x1545,0x154b,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x16b0,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, -0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, -0x1ce,0x1ce,0x1ce,0x1ce,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, -0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1, -0x1d1,0x1d1,0x1d1,0x1d1,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1d4, -0x1d4,0x1d4,0x1d4,0x1d4,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, -0x1563,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, -0x1563,0x1563,0x1d4,0x1d4,0x1560,0x155a,0x155d,0x1566,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, -0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, -0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, -0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x1da,0x1da,0x1da, -0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x975,0x975,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xd77,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x14f4,0x3cf,0x3de,0x3de, +0x39,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x39,0x3e4,0x3e4,0x39,0x39,0x3e4, +0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x3e4,0x3e4, +0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x3e4,0x39,0x39,0x39,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x39, +0x3d2,0xcd2,0x3cf,0x3de,0x3de,0x3cf,0x3cf,0x3cf,0x3cf,0x39,0x39,0x3de,0x3de,0x39,0x39,0x3e1, +0x3e1,0x3d5,0xdc5,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3cf,0x39,0x39,0x39,0x39, +0x3e7,0x3e7,0x39,0x3e7,0x3e4,0x3e4,0x3cf,0x3cf,0x39,0x39,0x960,0x960,0x960,0x960,0x960,0x960, +0x960,0x960,0x960,0x960,0x3e4,0x3e4,0x3db,0x3db,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3db,0x3d8,0x114c, +0x3f,0x3c,0x39,0x39,0x42,0xcd5,0x3ea,0xcd8,0x42,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x42, +0x42,0x42,0x42,0x3f6,0x3f6,0x42,0x42,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6, +0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x42,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x42,0x3f6,0x3f9, +0x42,0x3f6,0x3f9,0x42,0x3f6,0x3f6,0x42,0x42,0x3ed,0x42,0x3f3,0x3f3,0x3f3,0x3ea,0x3ea,0x42, +0x42,0x42,0x42,0x3ea,0x3ea,0x42,0x42,0x3ea,0x3ea,0x3f0,0x42,0x42,0x42,0xfa8,0x42,0x42, +0x42,0x42,0x42,0x42,0x42,0x3f9,0x3f9,0x3f9,0x3f6,0x42,0x3f9,0x42,0x42,0x42,0x42,0x42, +0x42,0x42,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x3ea,0x3ea,0x3f6,0x3f6, +0x3f6,0xfa8,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x45,0x3fc,0x3fc,0x405, +0x45,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0xce1,0x408,0x45,0x408,0x408,0x408,0x45,0x408, +0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x45,0x408,0x408, +0x408,0x408,0x408,0x408,0x408,0x45,0x408,0x408,0x45,0x408,0x408,0x408,0x408,0x408,0x45,0x45, +0x3ff,0x408,0x405,0x405,0x405,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x45,0x3fc,0x3fc,0x405,0x45,0x405, +0x405,0x402,0x45,0x45,0x408,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45, +0x45,0x45,0x45,0x45,0x408,0xce1,0xcdb,0xcdb,0x45,0x45,0x966,0x966,0x966,0x966,0x966,0x966, +0x966,0x966,0x966,0x966,0x140a,0xcde,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x170d,0x48,0x48, +0x48,0x48,0x48,0x48,0x4b,0x40b,0x41a,0x41a,0x4b,0x420,0x420,0x420,0x420,0x420,0x420,0x420, +0x420,0x4b,0x4b,0x420,0x420,0x4b,0x4b,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420, +0x420,0x420,0x420,0x420,0x420,0x4b,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x4b,0x420,0x420, +0x4b,0xce4,0x420,0x420,0x420,0x420,0x4b,0x4b,0x40e,0x420,0x40b,0x40b,0x41a,0x40b,0x40b,0x40b, +0xfab,0x4b,0x4b,0x41a,0x41d,0x4b,0x4b,0x41d,0x41d,0x411,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, +0x4b,0x4b,0x40b,0x40b,0x4b,0x4b,0x4b,0x4b,0x423,0x423,0x4b,0x420,0x420,0x420,0xfab,0xfab, +0x4b,0x4b,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x414,0xce4,0x1323,0x1323, +0x1323,0x1323,0x1323,0x1323,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4e,0x4e,0x426,0x432, +0x4e,0x432,0x432,0x432,0x432,0x432,0x432,0x4e,0x4e,0x4e,0x432,0x432,0x432,0x4e,0x432,0x432, +0x435,0x432,0x4e,0x4e,0x4e,0x432,0x432,0x4e,0x432,0x4e,0x432,0x432,0x4e,0x4e,0x4e,0x432, +0x432,0x4e,0x4e,0x4e,0x432,0x432,0x96f,0x4e,0x4e,0x4e,0x432,0x432,0x432,0x432,0x432,0x432, +0x432,0x96f,0xdc8,0x432,0x432,0x432,0x4e,0x4e,0x4e,0x4e,0x426,0x42c,0x426,0x42c,0x42c,0x4e, +0x4e,0x4e,0x42c,0x42c,0x42c,0x4e,0x42f,0x42f,0x42f,0x429,0x4e,0x4e,0xfae,0x4e,0x4e,0x4e, +0x4e,0x4e,0x4e,0x426,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xee2,0x96c, +0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x969,0x969,0x969,0xce7,0xce7,0xce7,0xce7,0xce7, +0xce7,0xcea,0xce7,0x4e,0x4e,0x4e,0x4e,0x4e,0x14f7,0x444,0x444,0x444,0x51,0x447,0x447,0x447, +0x447,0x447,0x447,0x447,0x447,0x51,0x447,0x447,0x447,0x51,0x447,0x447,0x447,0x447,0x447,0x447, +0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x51,0x447,0x447,0x447,0x447,0x447,0x447, +0x447,0x447,0x447,0x447,0x14fa,0x447,0x447,0x447,0x447,0x447,0x51,0x51,0x51,0xfb7,0x438,0x438, +0x438,0x444,0x444,0x444,0x444,0x51,0x438,0x438,0x43b,0x51,0x438,0x438,0x438,0x43e,0x51,0x51, +0x51,0x51,0x51,0x51,0x51,0x438,0x438,0x51,0xfb7,0xfb7,0x1710,0x51,0x51,0x51,0x51,0x51, +0x447,0x447,0xfb1,0xfb1,0x51,0x51,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441, +0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4, +0x17cd,0x14fd,0x453,0x453,0x54,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x54,0x459,0x459, +0x459,0x54,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459, +0x459,0x54,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x54,0x459,0x459,0x459, +0x459,0x459,0x54,0x54,0xced,0xcf0,0x453,0x44a,0x456,0x453,0x44a,0x453,0x453,0x54,0x44a,0x456, +0x456,0x54,0x456,0x456,0x44a,0x44d,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x44a,0x44a,0x54, +0x54,0x54,0x54,0x54,0x54,0x54,0x459,0x54,0x459,0x459,0xefa,0xefa,0x54,0x54,0x450,0x450, +0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x54,0xefd,0xefd,0x54,0x54,0x54,0x54,0x54, +0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x5a,0x1500,0x465,0x465,0x57,0x46b,0x46b,0x46b, +0x46b,0x46b,0x46b,0x46b,0x46b,0x57,0x46b,0x46b,0x46b,0x57,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, +0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x465,0x45c,0x45c,0x45c,0xfba,0x57,0x465,0x465, +0x465,0x57,0x468,0x468,0x468,0x45f,0x1329,0x17d0,0x57,0x57,0x57,0x57,0x17d3,0x17d3,0x17d3,0x45c, +0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x1713,0x46b,0x46b,0xfba,0xfba,0x57,0x57,0x462,0x462, +0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0x17d0,0x17d0, +0x17d0,0xfc0,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, +0x46b,0x1326,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, +0x46b,0x46b,0x1326,0x5a,0x5a,0xfc3,0x45c,0x465,0x5d,0x5d,0xa38,0xa38,0x5d,0xa3e,0xa3e,0xa3e, +0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0x5d, +0x5d,0x5d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, +0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0x5d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, +0x5d,0xa3e,0x5d,0x5d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0x5d,0x5d,0x5d,0xa32,0x5d, +0x5d,0x5d,0x5d,0xa2f,0xa38,0xa38,0xa2f,0xa2f,0xa2f,0x5d,0xa2f,0x5d,0xa38,0xa38,0xa3b,0xa38, +0xa3b,0xa3b,0xa3b,0xa2f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x1503,0x1503,0x1503,0x1503,0x1503,0x1503, +0x1503,0x1503,0x1503,0x1503,0x5d,0x5d,0xa38,0xa38,0xa35,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x60,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x486,0x486,0x486,0x486,0x486,0x471,0x486,0x483,0x471,0x471,0x471,0x471,0x471,0x471,0x477,0x60, +0x60,0x60,0x60,0x46e,0x48c,0x48c,0x48c,0x48c,0x48c,0x486,0x489,0x474,0x474,0x474,0x474,0x474, +0x474,0x471,0x474,0x47a,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x47d,0x47d, +0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, +0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, +0x63,0x49b,0x49b,0x63,0x49b,0x63,0x63,0x49b,0x49b,0x63,0x49b,0x63,0x63,0x49b,0x63,0x63, +0x63,0x63,0x63,0x63,0x49b,0x49b,0x49b,0x49b,0x63,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b, +0x63,0x49b,0x49b,0x49b,0x63,0x49b,0x63,0x49b,0x63,0x63,0x49b,0x49b,0x63,0x49b,0x49b,0x49b, +0x49b,0x48f,0x49b,0x498,0x48f,0x48f,0x48f,0x48f,0x48f,0x48f,0x63,0x48f,0x48f,0x49b,0x63,0x63, +0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x63,0x4a1,0x63,0x492,0x492,0x492,0x492,0x492,0x48f,0x63,0x63, +0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x63,0x63,0x49e,0x49e,0x140d,0x140d, +0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, +0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, +0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x66,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1, +0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1, +0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0xa4d,0xfcf,0xfcf,0x66,0x66,0x66, +0x66,0x97e,0x97e,0x981,0x97e,0x981,0x981,0x98a,0x981,0x98a,0x97e,0x97e,0x97e,0x97e,0x97e,0x9ab, +0x97e,0x981,0x984,0x984,0x987,0x990,0x984,0x984,0x9b1,0x9b1,0x9b1,0x9b1,0x1332,0x132c,0x132c,0x132c, +0x97e,0x97e,0x97e,0x981,0x97e,0x97e,0xa41,0x97e,0x66,0x97e,0x97e,0x97e,0x97e,0x981,0x97e,0x97e, +0x97e,0x97e,0x981,0x97e,0x97e,0x97e,0x97e,0x981,0x97e,0x97e,0x97e,0x97e,0x981,0x97e,0xa41,0xa41, +0xa41,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0xa41,0x981,0xa41,0xa41,0xa41,0x66,0xa4a,0xa4a, +0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0xa44,0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0x66,0xfc6,0xa47, +0xdcb,0xdcb,0xfc9,0xfcc,0xfc6,0x114f,0x114f,0x114f,0x114f,0x132f,0x132f,0x66,0x66,0x66,0x66,0x66, +0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, +0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x4aa,0x4aa,0x4aa,0x4aa, +0x4aa,0x4aa,0x69,0x1413,0x69,0x69,0x69,0x69,0x69,0x1413,0x69,0x69,0x4a7,0x4a7,0x4a7,0x4a7, +0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0xa77,0xa77,0xa77,0xa77, +0xa77,0xa77,0xa77,0xdda,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77, +0xa77,0xa77,0xa77,0x6c,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77, +0xa77,0xa77,0xa77,0xdda,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77, +0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda, +0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0x6c, +0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda, +0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, +0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c, +0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, +0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0x1335,0x1335,0xdd4, +0xdd7,0xa71,0xa7a,0xa6e,0xa6e,0xa6e,0xa6e,0xa7a,0xa7a,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0x6c,0x6c,0x6c, +0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, +0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0x1719,0x6f,0x6f,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x6f,0x6f, +0xa8f,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92, +0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa8c,0xa89,0x72,0x72,0x72, +0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa95,0xa95,0xa95,0xa98,0xa98, +0xa98,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x75,0x75,0x75,0x75,0x75,0x75,0x75, +0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xa9b,0xab9,0xab9,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, +0xa9e,0xa9e,0xaa1,0xa9e,0xab0,0xab0,0xab3,0xabc,0xaaa,0xaa7,0xab0,0xaad,0xabc,0xcf3,0x78,0x78, +0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0x78,0x78,0x78,0x78,0x78,0x78, +0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0x78,0x78,0x78,0x78,0x78,0x78, +0xacb,0xacb,0xb49,0xb4c,0xad1,0xb46,0xace,0xacb,0xad4,0xae3,0xad7,0xae6,0xae6,0xae6,0xac2,0x7b, +0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b, +0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, +0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b, +0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xac5,0xff0,0x7b,0x7b,0x7b,0x7b,0x7b, +0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, +0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, +0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x7e,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x7e,0x7e, +0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x4cb,0x7e,0x4cb,0x7e,0x4cb,0x7e,0x4cb, +0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, +0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x7e, +0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, +0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4c2,0x4c8,0x4c2, +0x4c2,0x4bf,0x4c8,0x4c8,0x4c8,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4bf,0x4bf,0x4bf, +0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x7e,0x4bf,0x4bf,0x4bf, +0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4bf,0x4bf,0x4bf, +0x7e,0x7e,0x4c8,0x4c8,0x4c8,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4c5,0x4c2,0x7e, +0xbbe,0xbc1,0xbc1,0xbc1,0xff9,0x81,0x14e5,0x14e5,0x14e5,0x14e5,0x4d4,0x4d4,0x4d4,0x4d4,0x4d4,0x4d4, +0x51f,0xbd3,0x84,0x84,0x6db,0x51f,0x51f,0x51f,0x51f,0x51f,0x525,0x537,0x525,0x531,0x52b,0x6de, +0x51c,0x6d8,0x6d8,0x6d8,0x6d8,0x51c,0x51c,0x51c,0x51c,0x51c,0x522,0x534,0x522,0x52e,0x528,0x84, +0xde3,0xde3,0xde3,0xde3,0xde3,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x84,0x84,0x84, +0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x540,0x756,0x53d,0x9ba,0x9db,0xaf5,0xaf5,0xaf5, +0xbd6,0xbd6,0xde6,0xde6,0xde6,0xde6,0x1167,0x116a,0x116a,0x133b,0x14df,0x1509,0x150c,0x150c,0x171c,0x87, +0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x543,0x543,0x543, +0x543,0x546,0xaf8,0xaf8,0xbd9,0xbdf,0xbdf,0xbdc,0xbdc,0xbdc,0xbdc,0xde9,0xf00,0xf00,0xf00,0xf00, +0x113a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a, +0x576,0x576,0x576,0xb01,0xf09,0xfff,0xfff,0xfff,0xfff,0x1296,0x171f,0x171f,0x8d,0x8d,0x8d,0x8d, +0x705,0x705,0x705,0x705,0x708,0x708,0x708,0x708,0x708,0x708,0x582,0x582,0x57f,0x57f,0x57f,0x57f, +0xf0f,0xf0f,0xf0f,0xf0c,0xf0c,0xf0c,0xf0c,0xf0c,0x1170,0x13bc,0x13bc,0x13bc,0x13bc,0x133e,0x133e,0x133e, +0x13bf,0x1341,0x1341,0x13bf,0x150f,0x150f,0x150f,0x150f,0x1512,0x1512,0x1512,0x17d6,0x17d6,0x17d6,0x17d6,0x90, +0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0xb0a,0xb0a,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, +0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, +0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x96,0x96,0x96,0x96,0x96, +0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0x99,0xb25,0xb25,0xb25,0xb25,0xb28, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb28,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c, +0xa2,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x837,0x83a,0x837,0x83a,0x837, +0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837, +0x837,0x837,0x837,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x837,0x837,0x837,0x837,0x837,0x83d,0x837, +0x837,0x837,0x837,0x837,0x83a,0xc81,0xc81,0xa2,0xa2,0x951,0x951,0x91b,0x91b,0x840,0x843,0xc7e, +0xa5,0xa5,0xa5,0xa5,0xa5,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, +0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, +0x855,0x1128,0xa8,0xa5,0xab,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, +0x858,0x858,0x858,0x858,0x858,0x858,0x858,0xab,0x924,0x924,0x927,0x927,0x927,0x927,0x927,0x927, +0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37, +0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37, +0x13cb,0x13cb,0x13cb,0xae,0xae,0xae,0xae,0xae,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861, +0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861, +0x861,0x861,0x861,0x861,0x861,0xd83,0xd83,0xb1,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867, +0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867, +0x867,0x867,0x867,0x867,0x867,0x867,0x867,0xb1,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb4,0xb4,0xb4,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc8a,0xb43,0xb43,0xb43,0xc8a,0xb43,0xb7, +0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, +0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x9d5,0x9d5,0x9d5,0x9d5,0xba,0xba,0xba,0xba, +0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f, +0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0xbd, +0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4, +0xbd,0xbd,0xbd,0xbd,0xbd,0xb16,0x5f7,0x5fd,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603, +0x603,0x5fa,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0xbd, +0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0xbd,0x5fd,0xbd,0x5fd,0x5fd,0xbd,0x5fd,0x5fd,0xbd,0x5fd,0x5fd, +0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x600,0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612, +0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x134a,0x134a,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, +0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x618,0x612,0x615,0x61b,0x618, +0x612,0x618,0x612,0x618,0x612,0x618,0x618,0x612,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, +0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x615,0x612,0x615,0x615,0x615,0x615,0x615,0x615, +0x612,0x615,0x612,0x612,0x615,0x615,0x612,0x612,0x612,0x612,0x612,0x615,0x612,0x612,0x615,0x612, +0x615,0x615,0x615,0x612,0x615,0x615,0x615,0x615,0xc0,0xc0,0x615,0x615,0x615,0x615,0x612,0x612, +0x615,0x612,0x612,0x612,0x612,0x615,0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x612,0x612, +0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0x618,0x618,0x972,0x618,0x618,0x618,0x618,0x618, +0x618,0x618,0x60f,0x60f,0xc15,0xd9b,0xc0,0xc0,0x879,0x88b,0x888,0x88b,0x888,0xc9f,0xc9f,0xd8f, +0xd8c,0x87c,0x87c,0x87c,0x87c,0x88e,0x88e,0x88e,0x8a6,0x8a9,0x8b8,0xc3,0x8ac,0x8af,0x8bb,0x8bb, +0x8a3,0x89a,0x894,0x89a,0x894,0x89a,0x894,0x897,0x897,0x8b2,0x8b2,0x8b5,0x8b2,0x8b2,0x8b2,0xc3, +0x8b2,0x8a0,0x89d,0x897,0xc3,0xc3,0xc3,0xc3,0x624,0x630,0x624,0xc18,0x624,0xc6,0x624,0x630, +0x624,0x630,0x624,0x630,0x624,0x630,0x624,0x630,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a, +0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d, +0x627,0x62d,0x627,0x62d,0x627,0xc6,0xc6,0x621,0x777,0x77a,0x78f,0x792,0x771,0x77a,0x77a,0xcc, +0x759,0x75c,0x75c,0x75c,0x75c,0x759,0x759,0xcc,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, +0xc9,0xb19,0xb19,0xb19,0x9d8,0x753,0x633,0x633,0xcc,0x7a1,0x780,0x771,0x77a,0x777,0x771,0x783, +0x774,0x76e,0x771,0x78f,0x786,0x77d,0x79e,0x771,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b, +0x79b,0x79b,0x78c,0x789,0x78f,0x78f,0x78f,0x7a1,0x762,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0xcc,0xcc,0xcc,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0xcc,0xcc,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0xcc,0xcc,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0xcc,0xcc,0x75f,0x75f,0x75f,0xcc,0xcc,0xcc,0xb61,0xb61,0xb61,0xb61,0xcf,0xcf,0xcf,0xcf, +0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, +0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xd5,0xd5,0xd5,0xd5,0xd5, +0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, +0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70, +0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, +0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xdb,0xdb,0x100b,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, +0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, +0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, +0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xde,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb94,0xde,0xb94,0xb94, +0xde,0xde,0xb94,0xde,0xde,0xb94,0xb94,0xde,0xde,0xb94,0xb94,0xb94,0xb94,0xde,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xde,0xb91,0xde,0xb91,0xb91,0xb91, +0xb91,0xd14,0xb91,0xb91,0xde,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xde,0xb94,0xb94,0xb94,0xb94,0xde,0xde,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xde,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xde,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xde,0xb94,0xb94,0xb94,0xb94,0xde, +0xb94,0xb94,0xb94,0xb94,0xb94,0xde,0xb94,0xde,0xde,0xde,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xde,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xe01,0xe01,0xde,0xde,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb8b, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xf18,0xf15,0xde,0xde,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e, +0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xe1,0xb9a,0xe1,0xe1, +0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1, +0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xc27,0xc27,0xc27,0xc27, +0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xe4,0xc27,0xc27,0xc27,0xc27,0xc21,0xc21, +0xc24,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xc30,0xc30,0xc30,0xc30, +0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc2a,0xc2a, +0xc2d,0xc93,0xc93,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xc36,0xc36,0xc36,0xc36, +0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc33,0xc33, +0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xc3c,0xc3c,0xc3c,0xc3c, +0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xed,0xc3c,0xc3c,0xc3c,0xed,0xc39,0xc39, +0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xd26,0xd26,0xd26,0xd26, +0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26, +0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0x1524,0x1524,0xf0,0xd17,0xd17,0xd17,0xd23, +0xd23,0xd23,0xd23,0xd17,0xd17,0xd23,0xd23,0xd23,0xf0,0xf0,0xf0,0xf0,0xd23,0xd23,0xd17,0xd23, +0xd23,0xd23,0xd23,0xd23,0xd23,0xd1a,0xd1a,0xd1a,0xf0,0xf0,0xf0,0xf0,0xd1d,0xf0,0xf0,0xf0, +0xd29,0xd29,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd2c,0xd2c,0xd2c,0xd2c, +0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xf3,0xf3, +0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, +0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, +0x1527,0x1527,0x1527,0x1527,0xf6,0xf6,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, +0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0xf6,0xf6, +0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, +0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0xf6,0xf6,0xf6,0x1527,0x1527,0x1527, +0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0xf6,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, +0x1527,0x1527,0xf9,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, +0x1728,0x1728,0x1728,0x1728,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, +0xf6,0xf6,0xf6,0xf6,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, +0xfc,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, +0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, +0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xd53,0xd53,0xfc,0xd53, +0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xfc, +0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xfc, +0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, +0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, +0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, +0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xff,0xff,0xff,0xff,0xff, +0xd98,0xd98,0xd98,0x102,0x102,0x102,0x102,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92, +0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92, +0x102,0x102,0x102,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd5c,0xd5c,0xd5c,0xd5c, +0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c, +0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0x105,0xd59,0xd65,0xd65,0xd65,0xd65, +0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65, +0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0x108,0x108,0xd62,0xd62,0xd62,0xd62, +0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0x108,0x108,0x108,0x108,0x108,0x108,0x1860,0x1860,0x1860,0x1860, +0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0xd68,0xd68,0xd68,0xd68, +0xd68,0xd68,0x10b,0x10b,0xd68,0x10b,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68, +0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0x10b,0xd68, +0xd68,0x10b,0x10b,0x10b,0xd68,0x10b,0x10b,0xd68,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, +0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0x10e, +0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0x152a,0x152a,0x17d9,0x17d9,0x114,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, +0x1107,0x1107,0x1107,0x1107,0x171,0x171,0x171,0x171,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, +0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe25, +0xe25,0xe2b,0xe2b,0xe25,0x117,0x117,0xe28,0xe28,0x1137,0x1137,0x1137,0x1137,0x11a,0x11a,0x11a,0x11a, +0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90, +0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x152d, +0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x1530,0x120,0x120, +0x120,0x120,0x11d,0x17dc,0x1356,0x1179,0xf27,0xf27,0xe40,0xe3d,0xe40,0xe3d,0xe3d,0xe34,0xe34,0xe34, +0xe34,0xe34,0xe34,0x1182,0x117f,0x1182,0x117f,0x117c,0x117c,0x117c,0x141c,0x1419,0x123,0x123,0x123,0x123, +0x123,0xe3a,0xe37,0xe37,0xe37,0xe34,0xe3a,0xe37,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43, +0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126, +0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126, +0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126, +0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49, +0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46, +0xe46,0xe46,0x129,0x129,0x129,0x129,0x129,0x129,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0x12c,0x141f, +0x12c,0x12c,0x12c,0x12c,0x12c,0x141f,0x12c,0x12c,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6, +0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0x12f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, +0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0x12f,0xe64,0xe58,0xe58,0xe58,0x132,0xe58,0xe58,0x132, +0x132,0x132,0x132,0x132,0xe58,0xe58,0xe58,0xe58,0xe64,0xe64,0xe64,0xe64,0x132,0xe64,0xe64,0xe64, +0x132,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0x132,0x132,0x132,0x132,0xe55,0xe55,0xe55,0x132, +0x132,0x132,0x132,0xe5b,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe67,0xe67,0xe5e,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0x1188,0x1188, +0x135,0x135,0x135,0x135,0xe73,0xe73,0xe73,0xe73,0xe73,0xe76,0xe76,0xe76,0xe73,0xe73,0xe76,0xe73, +0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0x135,0x135,0x135,0x135,0x135,0x135, +0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0x1185,0x135,0x135,0x135,0xe6d,0xe6d, +0xe7c,0xe7c,0xe7c,0xe7c,0x138,0x138,0x138,0x138,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe79,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, +0x1539,0x153f,0x153c,0x1884,0x17df,0x13e,0x13e,0x13e,0x13e,0x13e,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b, +0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b, +0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0xea3,0xea3,0xea3,0xea0, +0xea0,0xe97,0xe97,0xea0,0xe9d,0xe9d,0xe9d,0xe9d,0x141,0x141,0x141,0x141,0x12f3,0x12f3,0x12f3,0x12f3, +0x12f3,0x12f3,0x12f6,0x12f6,0x12f9,0x12f6,0x198,0x198,0x198,0x198,0x198,0x198,0xea6,0xea6,0xea6,0xea6, +0xea6,0xea6,0x142b,0x142b,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0xea9,0x135c,0x144,0x144,0x144, +0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x1359,0xc63,0xc63,0xc63,0xc63, +0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xed6,0xec7,0xec1,0xed3, +0xed0,0xeca,0xeca,0xed9,0xec4,0xecd,0x147,0x147,0x147,0x147,0x147,0x147,0xf5a,0xf5a,0xf45,0xf5a, +0xf5d,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0x14d,0x14d,0x14d,0x14d,0xf54,0xf54,0xf54,0xf54, +0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf66,0xf66,0xf4b,0xf51,0xf66,0xf66,0xf4e,0xf4b,0xf4b,0xf4b, +0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, +0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0x14d,0x14d,0x14d,0x1362,0x135f,0x1362,0x135f, +0x1362,0x135f,0x1362,0x135f,0x1362,0x135f,0x1431,0x154b,0x154b,0x154b,0x17e2,0x150,0x154b,0x154b,0x1731,0x1731, +0x1731,0x172b,0x1731,0x172b,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, +0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, +0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x1548,0x1434,0x1434,0x135f,0x1062,0x1062,0x1062,0x1062,0x1062, +0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75, +0xf75,0xf75,0xf75,0xf75,0xf72,0xf72,0xf78,0xf78,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, +0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81, +0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf7b,0xf7b,0xf7b,0xf7b,0x1191,0x1191,0x156,0x156,0x156,0xf7e, +0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e, +0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x1734,0x159,0x159,0x159,0x159,0x159,0x159, +0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159, +0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0xf8a,0xf8a,0xf8a,0x1554, +0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x15c,0xf87,0xf87,0xf87,0xf87, +0x1551,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0xf8d,0xf8d,0xf8d,0xf8d, +0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0x15f,0x15f, +0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x1089,0x1089,0x1089,0x1089, +0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077, +0x1086,0x1086,0x107d,0x107a,0x162,0x162,0x162,0x108c,0x108c,0x1080,0x1080,0x1080,0x1083,0x1083,0x1083,0x1083, +0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x162,0x162,0x162,0x1089,0x1089,0x1089,0x108f,0x108f,0x108f,0x108f, +0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x10a4,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a7,0x10a7,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165, +0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x10ce,0x10ce,0x10ce,0x10ce, +0x10c8,0x17e5,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x10d4,0x10d4,0x10cb,0x10cb,0x10cb,0x10cb, +0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x168,0x168,0x168,0x168,0x168,0x168,0x10f2,0x10f2,0x10f2,0x10f2, +0x10f2,0x10f2,0x10f2,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10ec,0x10ef, +0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x10e9,0x1101,0x1101,0x1101,0x1101, +0x1101,0x1101,0x1101,0x1101,0x1101,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10fe,0x10fe,0x10f5,0x10f5,0x10fe, +0x10fe,0x10f5,0x10f5,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x1101,0x1101,0x1101,0x10f5, +0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x10f5,0x10fe,0x16e,0x16e,0x10fb,0x10fb,0x10fb,0x10fb, +0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x16e,0x16e,0x10f8,0x1104,0x1104,0x1104,0x1560,0x171,0x171,0x171, +0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171, +0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x110a,0x110a,0x110a,0x110a, +0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, +0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110d,0x174,0x174,0x1110,0x1110,0x1110,0x1110, +0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110, +0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x177,0x177,0x177,0x1113,0x1113,0x1113,0x1113, +0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x17a,0x17a,0x17a, +0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x1119,0x1119,0x1119,0x1119, +0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119, +0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x17d,0x17d,0x17d,0x17d,0x17d,0x1116,0x111c,0x111c,0x111c,0x111c, +0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x180,0x180,0x180,0x180,0x111f,0x111f,0x111f,0x111f, +0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, +0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1197,0x1197,0x1197,0x1197, +0x11a0,0x1197,0x1197,0x1197,0x11a0,0x1197,0x1197,0x1197,0x1197,0x1194,0x186,0x186,0x119d,0x119d,0x119d,0x119d, +0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x186,0x11a3,0x11a3,0x11a3,0x11a3, +0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, +0x11a3,0x11a3,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11bb,0x11a6,0x11bb,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x18c,0x11af,0x11b8,0x11a6,0x11b8, +0x11b8,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11a6, +0x11a6,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x18c,0x18c,0x11a9,0x11b5,0x11b5,0x11b5,0x11b5, +0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x11b5,0x11b5,0x11b5,0x11b5, +0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x11b2,0x11b2,0x11b2,0x11b2, +0x11b2,0x11b2,0x11b2,0x11c1,0x11c4,0x11c4,0x11c4,0x11c4,0x11b2,0x11b2,0x18c,0x18c,0x15ab,0x15ab,0x15ab,0x15ab, +0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15a8,0x210,0x1308,0x12e7,0x1302,0x1302, +0x1302,0x1302,0x1302,0x1302,0x1302,0x12ea,0x12ea,0x12ea,0x12ea,0x1302,0x12ea,0x12ea,0x12ea,0x12ea,0x12f0,0x14d6, +0x14dc,0x14d9,0x14d3,0x192,0x1701,0x1701,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x11d9,0x11d9,0x11d9,0x11d9, +0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d0,0x11d0,0x11d3,0x11dc, +0x11d6,0x11d6,0x11d6,0x11dc,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x11df,0x11df,0x11df,0x11df, +0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x130e,0x11e5,0x1311, +0x11e5,0x11e5,0x11e5,0x11e5,0x11e2,0x11e2,0x11e2,0x11e5,0x173a,0x173d,0x19b,0x19b,0x12d5,0x12d5,0x12d5,0x12d5, +0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5, +0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x19e,0x19e,0x19e,0x11fa,0x11ee,0x11ee,0x11ee, +0x11ee,0x11ee,0x11ee,0x11f1,0x1200,0x1200,0x11ee,0x11ee,0x11ee,0x11ee,0x1a1,0x12fc,0x11f4,0x11f4,0x11f4,0x11f4, +0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x1a1,0x1a1,0x1a1,0x1a1,0x11ee,0x11ee,0x121e,0x1212,0x121e,0x1a4, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x121b,0x121b,0x1221,0x1215,0x1218,0x1236,0x1236,0x1236,0x1230, +0x1230,0x1227,0x1230,0x1230,0x1227,0x1230,0x1230,0x1239,0x1233,0x122a,0x1a7,0x1a7,0x122d,0x122d,0x122d,0x122d, +0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x123f,0x123f,0x123f,0x123f, +0x123f,0x123f,0x123f,0x1aa,0x1aa,0x1aa,0x1aa,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123c,0x123c,0x1aa,0x1aa,0x1aa,0x1aa,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1ad,0x1245, +0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257, +0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1b0,0x1b0, +0x1b0,0x1251,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d, +0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1b3,0x1b3, +0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263, +0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6, +0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, +0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1bc,0x1287,0x1287,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, +0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2, +0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1, +0x12b1,0x12b1,0x12b1,0x156c,0x156c,0x1c5,0x1c5,0x1c5,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1, +0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b4,0x12b4,0x12b4,0x1293,0x1c5, +0x13b6,0x12bd,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x12bd,0x13b6,0x12bd, +0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x1443,0x1443,0x1c5,0x1c5,0x1c5,0x1c5, +0x13b9,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x12ba,0x13b3,0x12ba,0x12ba,0x13b3,0x13b9,0x12c0, +0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1c5,0x1c5,0x1c5, +0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, +0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, +0x1c5,0x1c5,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b, +0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x12e1,0x13d4,0x13d1,0x1c8, +0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x12db,0x12db,0x12db,0x12db, +0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12de,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db, +0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12de,0x12db,0x12db,0x13d4,0x13d4,0x13d4,0x13d4,0x13d4,0x13d1, +0x13d4,0x13d4,0x13d4,0x1866,0x1c8,0x1c8,0x1c8,0x1c8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8, +0x12d8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1401,0x1401,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, +0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, +0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1374,0x1374,0x1374,0x1374, +0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374, +0x1374,0x1374,0x1374,0x1374,0x1374,0x136e,0x136e,0x136e,0x1cb,0x1cb,0x1371,0x1cb,0x1386,0x1386,0x1386,0x1386, +0x1386,0x1386,0x1377,0x1380,0x137a,0x137a,0x1380,0x1380,0x1380,0x137a,0x1380,0x137a,0x137a,0x137a,0x1383,0x1383, +0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x137d,0x137d,0x137d,0x137d,0x1d1,0x1389,0x1389,0x1389, +0x1389,0x1389,0x1389,0x1d1,0x1d1,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1d1,0x1d1,0x1389,0x1389,0x1389, +0x1389,0x1389,0x1389,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1389,0x1389,0x1389,0x1389, +0x1389,0x1389,0x1389,0x1d1,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1d1,0x1608,0x1608,0x1608,0x1608, +0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x138c,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138f,0x13a1,0x13a1,0x1395,0x1395,0x1395,0x1395,0x1395,0x1d4,0x1d4,0x1d4,0x1d4,0x1392,0x1392, +0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1398,0x1398, +0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x156f,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, +0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, +0x13a4,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x13da,0x13d7,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, 0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, -0x170a,0x156f,0x1575,0x16b6,0x1dd,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1dd,0x1dd,0x157e, -0x157e,0x1dd,0x1dd,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, -0x157e,0x1dd,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1dd,0x157e,0x157e,0x1dd,0x157e,0x157e,0x157e, -0x157e,0x157e,0x1dd,0x1dd,0x16b3,0x157e,0x156f,0x1575,0x156f,0x1575,0x1575,0x1575,0x1575,0x1dd,0x1dd,0x1575, -0x1575,0x1dd,0x1dd,0x1578,0x1578,0x157b,0x1dd,0x1dd,0x170d,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x156f, -0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1581,0x157e,0x157e,0x157e,0x157e,0x1575,0x1575,0x1dd,0x1dd,0x1572,0x1572, -0x1572,0x1572,0x1572,0x1572,0x1572,0x1dd,0x1dd,0x1dd,0x1572,0x1572,0x1572,0x1572,0x1572,0x1dd,0x1dd,0x1dd, -0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596, -0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1e0,0x1596,0x1596,0x1596,0x1596,0x1596, -0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1596,0x1590,0x1590,0x1590,0x1584,0x1584,0x1584,0x1590,0x1590, -0x1584,0x1593,0x1587,0x1584,0x1599,0x1599,0x158d,0x1599,0x1599,0x158a,0x17a0,0x1e0,0x15a8,0x15a8,0x15a8,0x159c, -0x159c,0x159c,0x159c,0x159c,0x159c,0x159f,0x15a2,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1710,0x1710,0x1710,0x1710, -0x15b4,0x15b1,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x15ba,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15c6,0x15c6,0x15c6,0x15c6, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15bd, -0x15c0,0x15c3,0x15c6,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15c9,0x15c9,0x1ef,0x1ef,0x1ef,0x1ef,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15d2,0x15d2,0x15d2,0x15d2, -0x15d2,0x15d2,0x15cf,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x15de,0x15de,0x15de,0x15de, -0x15de,0x1f2,0x1f2,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15db,0x15d8,0x15d8,0x15d8,0x15d8, -0x15d8,0x15d8,0x15d8,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x15e1,0x15f3,0x15f3,0x15e7, -0x15f0,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x15ea,0x15ea,0x15ea,0x15ea, -0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x1f5,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9, -0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x1f8,0x1605,0x1605,0x1605,0x1605, -0x1605,0x15ff,0x1608,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1602,0x1602,0x1602,0x1602, -0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1605,0x1605,0x1605,0x1605,0x1605,0x1fb,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x1fe,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x1617,0x1617,0x1617,0x1617,0x1617,0x201,0x201,0x201,0x201,0x201,0x1632,0x1632,0x1635,0x1635, -0x1638,0x1629,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x162f,0x162f,0x162f,0x162f, -0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x204,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x204,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x204,0x204,0x204,0x204,0x204,0x1632,0x1632,0x1632,0x1641,0x1641,0x1641,0x1641, -0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, -0x1641,0x1641,0x1641,0x1641,0x1641,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x164a,0x164a,0x164a,0x164a, -0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x20a,0x20a, -0x20a,0x20a,0x20a,0x20a,0x20a,0x1647,0x1647,0x1647,0x1647,0x20a,0x20a,0x20a,0x1665,0x1665,0x1665,0x1665, -0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x164d,0x165f,0x165f,0x164d,0x164d, -0x164d,0x164d,0x210,0x210,0x165f,0x165f,0x1662,0x1662,0x164d,0x164d,0x165f,0x1653,0x1650,0x1656,0x1668,0x1668, -0x1659,0x1659,0x165c,0x165c,0x165c,0x1668,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719,0x1719, -0x1719,0x1719,0x1719,0x1719,0x1716,0x1716,0x1716,0x1716,0x1713,0x1713,0x210,0x210,0x210,0x210,0x210,0x210, +0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1dd,0x1dd,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1572,0x1dd,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13dd,0x1dd,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1572,0x1572,0x1572,0x1572, +0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572, +0x1572,0x1572,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x13fb,0x13f5,0x13f5,0x13f5, +0x13f5,0x13f5,0x1587,0x1587,0x1587,0x1587,0x1587,0x158a,0x16f8,0x158a,0x158a,0x158a,0x17c1,0x186f,0x186f,0x1e0, +0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x158a,0x158a,0x158a,0x158a, +0x158a,0x158a,0x1587,0x1587,0x1587,0x158a,0x1587,0x16f5,0x16f5,0x1e0,0x1e0,0x1e0,0x158a,0x1587,0x1587,0x158a, +0x186f,0x186f,0x186f,0x1e3,0x1e3,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x13aa,0x13aa,0x13aa,0x13aa, +0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa, +0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x144f,0x1590,0x144f,0x144f, +0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1746, +0x1746,0x1e9,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, +0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, +0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x1455,0x1455,0x1455,0x1455, +0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, +0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1ec, +0x1455,0x1ec,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec, +0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1455,0x1ec, +0x1ec,0x1ec,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1ec, +0x1455,0x1ec,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1ec, +0x1455,0x1ec,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec, +0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455, +0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, +0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1455,0x1455,0x1455, +0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, +0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, +0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, +0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1452,0x1452,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, +0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x1458, +0x1458,0x1458,0x1458,0x1458,0x1467,0x1458,0x145b,0x145b,0x1458,0x1458,0x1458,0x145e,0x145e,0x1ef,0x1464,0x1464, +0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1461,0x146d,0x146d,0x146d,0x1ef,0x1ef,0x1ef,0x1ef, +0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, +0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479, +0x1479,0x1479,0x1479,0x1476,0x1470,0x1470,0x1476,0x1476,0x147f,0x147f,0x1479,0x147c,0x147c,0x1476,0x1473,0x1f2, +0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482, +0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482, +0x1f5,0x1f5,0x1f5,0x1f5,0x1749,0x1749,0x1482,0x1482,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, +0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1f5,0x1f5,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, +0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x148e,0x148e,0x148e,0x148e,0x148e,0x1f8,0x1f8,0x1f8, +0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x148e,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, +0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, +0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8, +0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1488,0x1488,0x1488,0x1488,0x1491, +0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x14a3,0x14a6,0x14a9,0x14a9, +0x14a6,0x14ac,0x14ac,0x1497,0x149a,0x174f,0x174c,0x174c,0x174c,0x1596,0x1fb,0x1fb,0x149d,0x149d,0x149d,0x149d, +0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x1593,0x1755,0x1758,0x1752,0x175b,0x175b,0x14b2,0x14b2,0x14b2,0x14b2, +0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x14af,0x14af,0x14af,0x14af, +0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x14b5,0x14b5,0x14b5,0x14b5, +0x14b5,0x14b5,0x14b5,0x14b5,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1305,0x1302,0x1305,0x12ed, +0x1302,0x1302,0x1302,0x1308,0x1302,0x1308,0x130b,0x1302,0x1308,0x1308,0x1302,0x1302,0x14c7,0x14c7,0x14c7,0x14c7, +0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14b8,0x14c1,0x14b8,0x14c1,0x14c1,0x14b8,0x14b8,0x14b8,0x14b8, +0x14b8,0x14b8,0x14c4,0x14bb,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x159c,0x159c,0x159c,0x159c, +0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x207,0x207,0x1599,0x1599,0x1599,0x1599, +0x1599,0x159f,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x1704,0x16fb,0x16fb,0x16fb, +0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb, +0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x20d,0x20d,0x20d,0x20d,0x210,0x210,0x210,0x210, 0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, -0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x213,0x166b,0x166b,0x166b, -0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b,0x166b, -0x166b,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216, -0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216, -0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216, -0x216,0x216,0x216,0x216,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, -0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, -0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x1671,0x1680,0x1677,0x1674,0x1686,0x1686,0x167a,0x1686, -0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d, -0x167d,0x167d,0x219,0x219,0x219,0x219,0x219,0x219,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c,0x168c, -0x168c,0x168c,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x1689,0x21c,0x21c,0x21c,0x21c,0x21c, -0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x1692,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b, -0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b,0x172b, -0x172b,0x172b,0x21f,0x21f,0x21f,0x171c,0x171c,0x171c,0x1728,0x1728,0x171c,0x171c,0x171c,0x171c,0x1728,0x171c, -0x171c,0x171c,0x171c,0x171f,0x21f,0x21f,0x21f,0x21f,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725, -0x1725,0x1725,0x1722,0x1722,0x172e,0x172e,0x172e,0x1722,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x222, -0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222, -0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222,0x222, -0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743,0x1743, -0x1743,0x1743,0x1743,0x228,0x1743,0x1743,0x228,0x228,0x228,0x228,0x228,0x1740,0x1740,0x1740,0x1740,0x1740, -0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x22b,0x1746,0x22b,0x1746,0x1746,0x1746,0x1746,0x22b,0x1746, -0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x22b,0x1746, -0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1749,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, -0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, -0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, -0x1752,0x1752,0x1752,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e, -0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, -0x174f,0x174f,0x174f,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x174c,0x174c,0x174c,0x174c,0x174c,0x174c, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1773,0x1776,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x231, -0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1824,0x1821,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x1824,0x231,0x231,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1821,0x181e,0x1824,0x1824,0x1824,0x231, -0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x181e,0x1821,0x1821,0x1821,0x1821,0x1821,0x231,0x231,0x231,0x231, -0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x1773,0x1773,0x1773,0x1773,0x1773,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, -0x1821,0x1821,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x1773,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231,0x231, -0x1758,0x1758,0x1758,0x1758,0x1755,0x1758,0x1758,0x175b,0x175e,0x175b,0x175b,0x1758,0x234,0x234,0x234,0x234, -0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x1755,0x1755,0x1755,0x1755,0x1755, -0x17b2,0x17b2,0x17b2,0x17b2,0x17a9,0x17a9,0x17a9,0x17a3,0x17a6,0x17a6,0x17a6,0x237,0x237,0x237,0x237,0x237, -0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x237,0x237,0x237,0x237,0x17ac,0x17ac, -0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x23a,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd, -0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd, -0x17cd,0x17cd,0x17cd,0x17ca,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8,0x23a,0x17b8,0x17b8,0x17b8,0x17b8, -0x17b8,0x17b8,0x17ca,0x17bb,0x17cd,0x17d0,0x17d0,0x17c4,0x17c1,0x17c1,0x23a,0x23a,0x23a,0x23a,0x23a,0x23a, -0x23a,0x23a,0x23a,0x23a,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17be,0x17be, -0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x17be,0x23a,0x23a,0x23a, -0x17dc,0x17df,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5, -0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x240,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6, -0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6,0x240,0x240,0x17d6,0x17d6,0x17d6,0x17d6,0x17d6, -0x1827,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, -0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, -0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5,0x17e5, -0x246,0x246,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9, -0x246,0x17e2,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17d9,0x17e2,0x17d9,0x17d9,0x17e2,0x17d9,0x17d9,0x246, -0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8, -0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249, -0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x1800,0x1800,0x17f1,0x17eb,0x17eb,0x1800,0x17ee,0x1803, -0x1803,0x1803,0x1803,0x1806,0x1806,0x17fa,0x17f7,0x17f4,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd, -0x17fd,0x17fd,0x24c,0x17fa,0x24c,0x17f4,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, -0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, -0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x24f,0x24f,0x24f,0x24f, -0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809, -0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x24f,0x24f,0x24f,0x24f, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x252,0x252,0x252, -0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252, -0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, -0x182d,0x182d,0x182d,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255, -0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x1770,0x1770,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, -0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x921,0x921, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b, -0x10d4,0x10d4,0x10d4,0x10d4,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1275,0x1473,0x1761,0x1761,0x1761, -0x1761,0x1761,0x1761,0x1761,0x1761,0x1761,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e, -0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e, -0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0x25e,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39, -0xc39,0xc39,0xc39,0x1278,0x1278,0x1278,0x261,0x261,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, -0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, -0xe67,0xe67,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, +0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x15b7,0x15b7,0x15b7,0x15b7, +0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x213,0x213,0x213,0x213,0x213,0x15b7,0x15b7,0x15b7,0x15b7, +0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x213,0x213,0x213,0x213,0x213,0x213,0x213, +0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x213,0x213,0x15b4,0x15ae,0x15b1,0x15ba, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219, +0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219, +0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x175e,0x15c3,0x15c9,0x170a,0x21c,0x15d2,0x15d2,0x15d2, +0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x21c,0x21c,0x15d2,0x15d2,0x21c,0x21c,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2, +0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x21c,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2, +0x15d2,0x21c,0x15d2,0x15d2,0x21c,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x21c,0x21c,0x1707,0x15d2,0x15c3,0x15c9, +0x15c3,0x15c9,0x15c9,0x15c9,0x15c9,0x21c,0x21c,0x15c9,0x15c9,0x21c,0x21c,0x15cc,0x15cc,0x15cf,0x21c,0x21c, +0x1761,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x15c3,0x21c,0x21c,0x21c,0x21c,0x21c,0x15d5,0x15d2,0x15d2, +0x15d2,0x15d2,0x15c9,0x15c9,0x21c,0x21c,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x21c,0x21c,0x21c, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, +0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea, +0x15ea,0x15ea,0x21f,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea, +0x15e4,0x15e4,0x15e4,0x15d8,0x15d8,0x15d8,0x15e4,0x15e4,0x15d8,0x15e7,0x15db,0x15d8,0x15ed,0x15ed,0x15e1,0x15ed, +0x15ed,0x15de,0x17f4,0x21f,0x15fc,0x15fc,0x15fc,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f3,0x15f6,0x222, +0x222,0x222,0x222,0x222,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x222,0x222, +0x222,0x222,0x222,0x222,0x1764,0x1764,0x1764,0x1764,0x1608,0x1605,0x225,0x225,0x225,0x225,0x225,0x225, +0x225,0x225,0x225,0x225,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e, +0x178e,0x178e,0x178e,0x178e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, +0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x228,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, +0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x228,0x228,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x228,0x228,0x228,0x228,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, +0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x1611,0x1614,0x1617,0x161a,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x1629,0x1629,0x1629,0x1629,0x1629,0x161d,0x161d,0x22e,0x22e,0x22e,0x22e,0x1620, +0x1620,0x1620,0x1620,0x1620,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1623,0x22e,0x22e,0x22e,0x22e,0x22e, +0x22e,0x22e,0x22e,0x22e,0x1632,0x1632,0x1632,0x1632,0x1632,0x231,0x231,0x162f,0x162f,0x162f,0x162f,0x162f, +0x162f,0x162f,0x162f,0x162f,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x231,0x231,0x231,0x231,0x231, +0x231,0x231,0x231,0x231,0x1635,0x1647,0x1647,0x163b,0x1644,0x234,0x234,0x234,0x234,0x234,0x234,0x234, +0x234,0x234,0x234,0x234,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x234,0x234, +0x234,0x234,0x234,0x234,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, +0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, +0x164d,0x164d,0x164d,0x237,0x1659,0x1659,0x1659,0x1659,0x1659,0x1653,0x165c,0x1659,0x1659,0x1659,0x1659,0x1659, +0x1659,0x1659,0x1659,0x1659,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1659,0x1659, +0x1659,0x1659,0x1659,0x23a,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662, +0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662, +0x1662,0x1662,0x1662,0x23d,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, +0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166b,0x166b,0x166b,0x166b,0x166b,0x240, +0x240,0x240,0x240,0x240,0x1686,0x1686,0x1689,0x1689,0x168c,0x167d,0x243,0x243,0x243,0x243,0x243,0x243, +0x243,0x243,0x243,0x243,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x243,0x167d, +0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x243,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, +0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x243,0x243,0x243,0x243, +0x243,0x1686,0x1686,0x1686,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, +0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x246,0x246,0x246, +0x246,0x246,0x246,0x246,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, +0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x169b,0x169b,0x169b, +0x169b,0x249,0x249,0x249,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x16b9,0x16b9,0x16b9,0x16a1,0x16b3,0x16b3,0x16a1,0x16a1,0x16a1,0x16a1,0x24f,0x24f,0x16b3,0x16b3,0x16b6,0x16b6, +0x16a1,0x16a1,0x16b3,0x16a7,0x16a4,0x16aa,0x16bc,0x16bc,0x16ad,0x16ad,0x16b0,0x16b0,0x16b0,0x16bc,0x176d,0x176d, +0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176a,0x176a,0x176a,0x176a, +0x1767,0x1767,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, +0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, +0x24f,0x24f,0x24f,0x24f,0x252,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf, +0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x252,0x252,0x252,0x252,0x252,0x252,0x252, +0x252,0x252,0x252,0x252,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, +0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255,0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255, +0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255, +0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255, +0x16c5,0x16d4,0x16cb,0x16c8,0x16da,0x16da,0x16ce,0x16da,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, +0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x258,0x258,0x258,0x258,0x258,0x258, +0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd, +0x16dd,0x16dd,0x16dd,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x16e6, +0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, +0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x25e,0x25e,0x25e,0x1770,0x1770,0x1770, +0x177c,0x177c,0x1770,0x1770,0x1770,0x1770,0x177c,0x1770,0x1770,0x1770,0x1770,0x1773,0x25e,0x25e,0x25e,0x25e, +0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1776,0x1776,0x1782,0x1782,0x1782,0x1776, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, 0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0x261,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0x264,0x264,0x264,0x264,0x264, -0x264,0x264,0x264,0x264,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, -0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, -0xb4c,0xb4c,0x267,0x267,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d, -0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, -0x26a,0x26a,0x26a,0x26a,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x26d,0x26d,0x10ec,0x369,0x369,0x375,0xc7b,0x378,0x378,0x378,0x378,0x378,0x378,0x378, -0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378, -0x378,0x378,0x378,0x378,0x375,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x369,0x375,0x375,0x375, -0x375,0x36f,0x10ef,0x12c6,0x378,0x8ee,0x8f1,0x36c,0x36c,0x10ec,0x12c3,0x12c3,0x37b,0x37b,0x37b,0x37b, -0x37b,0x37b,0x37b,0x37b,0x378,0x378,0x369,0x369,0x879,0x87c,0x909,0x909,0x909,0x909,0x909,0x909, -0x909,0x909,0x909,0x909,0x372,0xf4e,0xf4b,0x12c9,0x12c9,0x12c9,0x12c9,0x12c9,0x149a,0x10f2,0x10f2,0xea0, -0xea0,0xd6e,0xea0,0xea0,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x37b,0x378,0x378, -0x378,0x378,0x378,0x378,0x378,0x37b,0x378,0x378,0x37b,0x378,0x378,0x378,0x378,0x378,0x12c3,0x12c6, -0x36c,0x378,0x375,0x375,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456, -0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0x456,0xb67,0xb67,0xd7a,0xd7a,0x87f, -0xd7d,0x13b9,0x13b9,0x13b9,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459, -0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459, -0x459,0x459,0x459,0x459,0x45f,0x45f,0x45f,0x1107,0x1107,0x1107,0x1107,0x1107,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c, -0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x45c,0x1104,0x1104, -0x1104,0x1104,0x1104,0x1104,0x462,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f, -0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f, -0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x45f,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465, -0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465, -0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x465,0x465,0x465,0x465,0x468,0x963, -0xf9c,0xf9c,0xf9f,0xf9c,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465, -0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0x46b,0x465,0xf9f,0xf9c, -0xf9f,0xf9c,0xf9f,0xf9c,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a, -0x47a,0x47a,0x47a,0x47a,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x477,0x47a,0x47a,0x47a,0x47a, -0x47a,0x47a,0x47a,0x47a,0x657,0x657,0x65a,0x495,0x666,0x663,0x663,0x660,0x4bf,0x4bf,0x47d,0x47d, -0x47d,0x47d,0x47d,0xa95,0x669,0x4a1,0x681,0x684,0x4b6,0x669,0x4a4,0x4a4,0x495,0x4b0,0x4b0,0x657, -0x4bc,0x4b9,0x65d,0x48f,0x486,0x486,0x489,0x489,0x489,0x489,0x489,0x48c,0x489,0x489,0x489,0x480, -0x4c8,0x4c5,0x4c2,0x4c2,0x675,0x4aa,0x4a7,0x672,0x66f,0x66c,0x67e,0x498,0x67b,0x67b,0x4ad,0x4b0, -0x678,0x678,0x4ad,0x4b0,0x492,0x495,0x495,0x495,0x4b3,0x49e,0x49b,0xb7c,0xa9b,0xa9e,0xa98,0xa98, -0xa98,0xa98,0xb73,0xb73,0xb73,0xb73,0xb79,0xca8,0xca5,0xd89,0xd8c,0xb76,0xd8c,0xd8c,0xd8c,0xd8c, -0xd89,0xd8c,0xd8c,0xb70,0x4fb,0x4fb,0x513,0x693,0x4f8,0x690,0x4fb,0x510,0x4f8,0x693,0x50a,0x513, -0x513,0x513,0x50a,0x50a,0x513,0x513,0x513,0x69c,0x4f8,0x513,0x696,0x4f8,0x507,0x513,0x513,0x513, -0x513,0x513,0x4f8,0x4f8,0x4fe,0x690,0x699,0x4f8,0x513,0x4f8,0x69f,0x4f8,0x513,0x501,0x519,0x6a2, -0x513,0x513,0x504,0x50a,0x513,0x513,0x516,0x513,0x50a,0x50d,0x50d,0x50d,0x50d,0xaaa,0xaa7,0xcab, -0xd9b,0xb97,0xb9a,0xb9a,0xb94,0xb91,0xb91,0xb91,0xb91,0xb9a,0xb97,0xb97,0xb97,0xb97,0xb8e,0xb91, -0xd98,0xeac,0xeaf,0xfa5,0x1116,0x1116,0x1116,0x6a8,0x6a5,0x51c,0x51f,0x51f,0x51f,0x51f,0x51f,0x6a5, -0x6a8,0x6a8,0x6a5,0x51f,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae,0x6ae, -0x528,0x528,0x528,0x528,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x6ab,0x522,0x522, -0x522,0x522,0x522,0x522,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52b,0x534,0x534,0x52e, -0x52e,0x52e,0x531,0x52b,0x52e,0x52e,0x52b,0x52b,0x52b,0x52b,0x52e,0x52e,0x6b1,0x6b1,0x52b,0x52b, -0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x531,0x531,0x531, -0x52e,0x52e,0x6b4,0x52e,0x6b4,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52e,0x52b,0x52e,0x52b,0x52b, -0x52b,0x52b,0x52b,0x52b,0x52e,0x52e,0x52b,0x6b1,0x52b,0x52b,0x52b,0xab0,0xab0,0xab0,0xab0,0xab0, -0xab0,0xab0,0xab0,0xab0,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, -0x6ba,0x537,0x6ba,0x6ba,0x53a,0x537,0x537,0x6ba,0x6ba,0x53a,0x537,0x6ba,0x53a,0x537,0x537,0x6ba, -0x537,0x6ba,0x546,0x543,0x537,0x6ba,0x537,0x537,0x537,0x537,0x6ba,0x537,0x537,0x6ba,0x6ba,0x6ba, -0x6ba,0x537,0x537,0x6ba,0x53a,0x6ba,0x53a,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6c0,0x53d,0x6ba,0x53d, -0x53d,0x537,0x537,0x537,0x6ba,0x6ba,0x6ba,0x6ba,0x537,0x537,0x537,0x537,0x6ba,0x6ba,0x537,0x537, -0x537,0x53a,0x537,0x537,0x53a,0x537,0x537,0x53a,0x6ba,0x53a,0x537,0x537,0x6ba,0x537,0x537,0x537, -0x537,0x537,0x6ba,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537, -0x6bd,0x6ba,0x53a,0x537,0x6ba,0x6ba,0x6ba,0x6ba,0x537,0x537,0x6ba,0x6ba,0x537,0x53a,0x6bd,0x6bd, -0x53a,0x53a,0x537,0x537,0x53a,0x53a,0x537,0x537,0x53a,0x53a,0x537,0x537,0x537,0x537,0x537,0x537, -0x53a,0x53a,0x6ba,0x6ba,0x53a,0x53a,0x6ba,0x6ba,0x53a,0x53a,0x537,0x537,0x537,0x537,0x537,0x537, -0x537,0x537,0x537,0x537,0x537,0x6ba,0x537,0x537,0x537,0x6ba,0x537,0x537,0x537,0x537,0x537,0x537, -0x537,0x6ba,0x537,0x537,0x537,0x537,0x537,0x537,0x53a,0x53a,0x53a,0x53a,0x537,0x537,0x537,0x537, -0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x6ba,0x537,0x537,0x537,0x537, -0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537, -0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x537,0x53a,0x53a,0x53a,0x53a, -0x537,0x537,0x537,0x537,0x537,0x537,0x53a,0x53a,0x53a,0x53a,0x537,0x540,0x537,0x537,0xba0,0xba0, -0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0x549,0xab3,0x549,0x549, -0x549,0x549,0x549,0x549,0x555,0x552,0x555,0x552,0x549,0x549,0x549,0x549,0x549,0x549,0x6c3,0x549, -0x549,0x549,0x549,0x549,0x549,0x549,0x7c5,0x7c5,0x549,0x549,0x549,0x549,0x54f,0x54f,0x549,0x549, -0x549,0x549,0x549,0x549,0x54c,0x7cb,0x7c8,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549, -0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549, -0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0x549,0xab3,0xba6,0xab3,0xab3,0xab3, -0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, -0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, -0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x55e,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c, -0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xc0c,0xd20, -0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, -0x6d5,0x6d5,0x6d5,0x6d5,0x561,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564,0x564, -0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x564,0x564,0x564,0x564, -0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, -0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8, -0x567,0x567,0x6d8,0x6d8,0x6d8,0x6d8,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9,0xba9, -0x6de,0x6de,0x56a,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x56d,0x56d,0x56a,0x56a,0x570,0x570, -0x570,0x570,0x6de,0x6de,0x570,0x570,0x6e1,0x6de,0x56a,0x56a,0x56a,0x56a,0x6de,0x6de,0x570,0x570, -0x6e1,0x6de,0x56a,0x56a,0x56a,0x56a,0x6de,0x6de,0x6db,0x56a,0x570,0x6de,0x56a,0x56a,0x6db,0x6de, -0x6de,0x6de,0x570,0x570,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a, -0x56a,0x56a,0x6de,0x6db,0x6de,0x6db,0x56a,0x570,0x570,0x570,0x570,0x570,0x570,0x56a,0x56a,0x6db, -0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xbac,0xbac,0xbac,0xbaf,0xbaf,0xc24,0xc24,0xbac, -0x57c,0x57c,0x57c,0x57c,0x579,0x6f0,0x6f0,0x573,0x573,0x6e4,0x573,0x573,0x573,0x573,0x6ea,0x6e4, -0x573,0x579,0x573,0x573,0xd29,0xd29,0xbb2,0xbb2,0xda7,0xabc,0x576,0x576,0x6e7,0x57f,0x6e7,0x576, -0x579,0x573,0x579,0x579,0x573,0x573,0x579,0x573,0x573,0x573,0x579,0x573,0x573,0x573,0x579,0x579, -0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x579,0x57c,0x57c,0x576,0x573,0x573,0x573,0x573, -0x6f3,0x573,0x6f3,0x573,0x573,0x573,0x573,0x573,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce, -0x7ce,0x7ce,0x7ce,0x7ce,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573, -0x6f3,0x6f0,0x582,0x6f3,0x6e4,0x6ea,0x579,0x6e4,0x6ed,0x6e4,0x6e4,0x573,0x6e4,0x6f0,0x582,0x6f0, -0xabc,0xabc,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb8,0xbb5,0xbb5,0xda1,0xe5e, -0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585,0x585, -0x585,0x585,0x585,0x585,0x588,0x136e,0x136e,0x136e,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x14be,0x58e,0x59a,0x58e,0x58e,0x136e,0x588,0x588,0x59a,0x59a,0x1371,0x1371,0x5a0,0x5a0,0x588,0x594, -0x588,0x588,0x594,0x588,0x594,0x588,0x594,0x588,0x588,0x588,0x588,0x588,0x588,0x594,0x588,0x588, -0x588,0x588,0x588,0x588,0x136e,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x594, -0x594,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x6f9,0x588,0x588,0x588,0x588,0x588,0x588, -0x594,0x588,0x588,0x594,0x588,0x588,0x588,0x588,0x136e,0x588,0x136e,0x588,0x588,0x588,0x588,0x136e, -0x136e,0x136e,0x588,0x1272,0x588,0x588,0x588,0x591,0x591,0x591,0x591,0x12f0,0x12f0,0x588,0x58b,0x597, -0x59d,0x588,0x588,0x588,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb,0xbbe,0xbbb, -0xbbe,0xbbb,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x6f6,0x588,0x594,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x136e,0x588,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x136e,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, -0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5c1,0x5c7,0x5b8,0x5bb,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5be,0x5be,0x5be,0x5be,0x5be,0x5be, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, -0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, -0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1, -0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1, -0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1, -0x5c4,0x5ca,0x5c7,0x5c1,0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3, -0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x12f3,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c4,0x5ca, -0x5c4,0x5ca,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1,0x5c7,0x5c1, -0x5c4,0x5c7,0x5c1,0x5c4,0x5c7,0x5c1,0x5c4,0x5ca,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4, -0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c1,0x5c4,0x5c1,0x5c4,0x5c1,0x5c1, -0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c4,0x5c1,0x5c1,0x5c4,0x5c1,0x5c4,0x5c4,0x5c1,0x5c1,0x5c1,0x5c4, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1, -0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c1,0x5c1, -0x5c4,0x5c1,0x5c4,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, -0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4, -0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5ca,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, -0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5ca,0x5ca,0x5ca,0x5ca, -0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca,0x5ca, -0x5ca,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5cd,0x5cd,0x5cd,0x5cd, -0xfb1,0xfb1,0xfb1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x16ce,0x16ce,0x82b,0x831,0x831,0x83d, -0x83d,0x82e,0x825,0x82e,0x825,0x82e,0x825,0x82e,0x825,0x82e,0x825,0x82e,0x5dc,0x5dc,0x5d6,0x5dc, -0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc, -0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5dc, -0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9, -0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9, -0x5df,0x5dc,0x5d6,0x5d9,0x5df,0x5dc,0x5d6,0x5d9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9, -0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6c6,0x6c6,0x6c6,0x6c6, -0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6, -0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6c6,0x6cf,0x6cf, -0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6d2,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf, -0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cf,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc, -0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6cc,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, -0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, -0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc, -0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc, -0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0xc12,0x891,0x88b,0x888,0x88e,0x885,0x711,0x714, -0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x714,0x897,0x711,0x711,0x711,0x711,0x711,0x711,0x711, -0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711, -0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x711,0x894,0x894,0x717,0x8a6,0x8a9,0x8af, -0x7d1,0x7dd,0x8c4,0x7da,0x89d,0x89a,0x89d,0x89a,0x8a3,0x8a0,0x8a3,0x8a0,0x89d,0x89a,0x7d7,0x8af, -0x89d,0x89a,0x89d,0x89a,0x89d,0x89a,0x89d,0x89a,0x8b2,0x8bb,0x8b8,0x8b8,0x71d,0x759,0x759,0x759, -0x759,0x759,0x759,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753, -0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x720,0x73b,0x71a,0x741,0x744,0x73e,0x756,0x756,0x756, -0x756,0x756,0x756,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750, -0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x720,0x73b,0x71a,0x73b,0xc15,0x7bf,0x7bf,0x7bf,0x7bf, -0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, -0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x126c,0x126c, -0x126c,0x126c,0x126c,0x7c2,0x7d7,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x7da,0x8fa,0x8fa, -0x8fa,0x8fa,0x7e0,0x7e0,0x8b5,0x8c1,0x8c1,0x8c1,0x8c1,0x8be,0x7d4,0x8ac,0xae0,0xae0,0xae0,0xc27, -0xc45,0xc42,0xafb,0x882,0x7e6,0x7e3,0x7e6,0x7e9,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e6,0x7e3,0x7e3, -0x7e3,0x7e3,0x7e3,0x7e3,0x7e6,0x7e6,0x7e3,0x7e6,0x7e6,0x7e3,0x7e6,0x7e6,0x7e3,0x7e6,0x7e6,0x7e3, -0x7e6,0x7e6,0x7e3,0x7e3,0xc48,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f2, -0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2, -0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f8,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f5,0x7f2,0x7f2, -0x7f2,0x7f2,0x7f2,0x7f2,0x7f5,0x7f5,0x7f2,0x7f5,0x7f5,0x7f2,0x7f5,0x7f5,0x7f2,0x7f5,0x7f5,0x7f2, -0x7f5,0x7f5,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f8,0x7f2,0x7f2,0x7f2,0x7f2, -0x7f2,0x7f2,0x7f8,0x7f2,0x7f2,0x7f2,0x7f2,0x7f2,0x7f5,0x7f8,0x7f8,0x7f5,0x7f5,0x7f5,0x7f5,0x8ca, -0x8cd,0x7fb,0x7fe,0xc30,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x807,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804,0x804, -0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810, -0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0x810,0xd32,0xd32,0xe61,0x80a, -0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0xd2c,0xd2c,0xd2c,0xd2c, +0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, +0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x267,0x1797,0x1797,0x267,0x267, +0x267,0x267,0x267,0x1794,0x1794,0x1794,0x1794,0x1794,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x26a, +0x179a,0x26a,0x179a,0x179a,0x179a,0x179a,0x26a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x26a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, +0x179a,0x179d,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff, +0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6, +0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x26d,0x26d,0x26d,0x26d,0x26d, +0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3, +0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x26d,0x26d,0x26d,0x26d,0x26d, +0x26d,0x26d,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, +0x270,0x270,0x270,0x270,0x273,0x273,0x273,0x273,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, +0x17ca,0x1878,0x1878,0x1878,0x1878,0x1875,0x1878,0x279,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1878,0x1875, +0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x1878,0x279,0x279,0x1878,0x1878,0x1878,0x1878,0x1878, +0x1878,0x1878,0x1875,0x1872,0x1875,0x1878,0x1878,0x273,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1872,0x1875, +0x1875,0x1875,0x1875,0x1875,0x276,0x273,0x273,0x273,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875, +0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276, +0x276,0x276,0x276,0x276,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, +0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x1875,0x1875,0x1875, +0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x276,0x276,0x276,0x276,0x276,0x276, +0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, +0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, +0x17c7,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, +0x276,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x276,0x276, +0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, +0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, +0x17ac,0x17ac,0x17ac,0x17ac,0x17a9,0x17ac,0x17ac,0x17af,0x17b2,0x17af,0x17af,0x17ac,0x27c,0x27c,0x27c,0x27c, +0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, +0x1806,0x1806,0x1806,0x1806,0x17fd,0x17fd,0x17fd,0x17f7,0x17fa,0x17fa,0x17fa,0x27f,0x27f,0x27f,0x27f,0x27f, +0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x27f,0x27f,0x27f,0x27f,0x1800,0x1800, +0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x282,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, +0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, +0x1821,0x1821,0x1821,0x181e,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x282,0x180c,0x180c,0x180c,0x180c, +0x180c,0x180c,0x181e,0x180f,0x1821,0x1824,0x1824,0x1818,0x1815,0x1815,0x282,0x282,0x282,0x282,0x282,0x282, +0x282,0x282,0x282,0x282,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x1812,0x1812, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x282,0x282,0x282, +0x1830,0x1833,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839, +0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x288,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, +0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x288,0x288,0x182a,0x182a,0x182a,0x182a,0x182a, +0x187b,0x28e,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, +0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, +0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839, +0x291,0x291,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, +0x291,0x1836,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x1836,0x182d,0x182d,0x1836,0x182d,0x182d,0x291, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c, +0x183c,0x183c,0x183c,0x183c,0x183c,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294, +0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x1854,0x1854,0x1845,0x183f,0x183f,0x1854,0x1842,0x1857, +0x1857,0x1857,0x1857,0x185a,0x185a,0x184e,0x184b,0x1848,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, +0x1851,0x1851,0x297,0x184e,0x297,0x1848,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297, +0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297, +0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860, +0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x29a,0x29a,0x29a,0x29a, +0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d, +0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x29a,0x29a,0x29a,0x29a, +0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x29d,0x29d,0x29d, +0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d, +0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, +0x1881,0x1881,0x1881,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, +0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, +0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, +0x2a6,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, +0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, +0x2a3,0x2a3,0x975,0x975,0x17c4,0x17c4,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1, +0x2c1,0x2c1,0x2c1,0x2c1,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, +0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, +0x2a6,0x2a6,0x2a6,0x2a6,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9, +0x2a9,0x2a9,0x2a9,0x2a9,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2ac, +0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, +0x2ac,0x2ac,0x2ac,0x2ac,0x112b,0x112b,0x112b,0x112b,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc, +0x14ca,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af, +0x2af,0x2af,0x2af,0x2af,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0x12cf, +0x12cf,0x12cf,0x2b2,0x2b2,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe, +0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0x2b2,0x2b2, +0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2, +0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2, +0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, +0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0x2b8,0x2b8, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x2be,0x2be, +0x1143,0x3ba,0x3ba,0x3c6,0xccf,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, +0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, +0x3c6,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3c6,0x3c6,0x3c6,0x3c6,0x3c0,0x1146,0x131d, +0x3c9,0x942,0x945,0x3bd,0x3bd,0x1143,0x131a,0x131a,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc, +0x3c9,0x3c9,0x3ba,0x3ba,0x8cd,0x8d0,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, +0x3c3,0xfa5,0xfa2,0x1320,0x1320,0x1320,0x1320,0x1320,0x14f1,0x1149,0x1149,0xef7,0xef7,0xdc2,0xef7,0xef7, +0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, +0x3c9,0x3cc,0x3c9,0x3c9,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x131a,0x131d,0x3bd,0x3c9,0x3c6,0x3c6, +0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7, +0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0xbbb,0xbbb,0xdce,0xdce,0x8d3,0xdd1,0x1410,0x1410,0x1410, +0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa, +0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa, +0x4b0,0x4b0,0x4b0,0x115e,0x115e,0x115e,0x115e,0x115e,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad, +0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad, +0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b, +0x4b3,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0, +0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0, +0x4b0,0x4b0,0x4b0,0x4b0,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6, +0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6, +0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4b6,0x4b6,0x4b6,0x4b6,0x4b9,0x9b7,0xff3,0xff3,0xff6,0xff3, +0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6, +0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0xff6,0xff3,0xff6,0xff3,0xff6,0xff3, +0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, +0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, +0x6a8,0x6a8,0x6ab,0x4e6,0x6b7,0x6b4,0x6b4,0x6b1,0x510,0x510,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0xae9, +0x6ba,0x4f2,0x6d2,0x6d5,0x507,0x6ba,0x4f5,0x4f5,0x4e6,0x501,0x501,0x6a8,0x50d,0x50a,0x6ae,0x4e0, +0x4d7,0x4d7,0x4da,0x4da,0x4da,0x4da,0x4da,0x4dd,0x4da,0x4da,0x4da,0x4d1,0x519,0x516,0x513,0x513, +0x6c6,0x4fb,0x4f8,0x6c3,0x6c0,0x6bd,0x6cf,0x4e9,0x6cc,0x6cc,0x4fe,0x501,0x6c9,0x6c9,0x4fe,0x501, +0x4e3,0x4e6,0x4e6,0x4e6,0x504,0x4ef,0x4ec,0xbd0,0xaef,0xaf2,0xaec,0xaec,0xaec,0xaec,0xbc7,0xbc7, +0xbc7,0xbc7,0xbcd,0xcfc,0xcf9,0xddd,0xde0,0xbca,0xde0,0xde0,0xde0,0xde0,0xddd,0xde0,0xde0,0xbc4, +0x54c,0x54c,0x564,0x6e4,0x549,0x6e1,0x54c,0x561,0x549,0x6e4,0x55b,0x564,0x564,0x564,0x55b,0x55b, +0x564,0x564,0x564,0x6ed,0x549,0x564,0x6e7,0x549,0x558,0x564,0x564,0x564,0x564,0x564,0x549,0x549, +0x54f,0x6e1,0x6ea,0x549,0x564,0x549,0x6f0,0x549,0x564,0x552,0x56a,0x6f3,0x564,0x564,0x555,0x55b, +0x564,0x564,0x567,0x564,0x55b,0x55e,0x55e,0x55e,0x55e,0xafe,0xafb,0xcff,0xdef,0xbeb,0xbee,0xbee, +0xbe8,0xbe5,0xbe5,0xbe5,0xbe5,0xbee,0xbeb,0xbeb,0xbeb,0xbeb,0xbe2,0xbe5,0xdec,0xf03,0xf06,0xffc, +0x116d,0x116d,0x116d,0x6f9,0x6f6,0x56d,0x570,0x570,0x570,0x570,0x570,0x6f6,0x6f9,0x6f9,0x6f6,0x570, +0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x579,0x579,0x579,0x579, +0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x573,0x573,0x573,0x573,0x573,0x573, +0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57c,0x585,0x585,0x57f,0x57f,0x57f,0x582,0x57c, +0x57f,0x57f,0x57c,0x57c,0x57c,0x57c,0x57f,0x57f,0x702,0x702,0x57c,0x57c,0x57f,0x57f,0x57f,0x57f, +0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x582,0x582,0x582,0x57f,0x57f,0x705,0x57f, +0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57c,0x57f,0x57c,0x57c,0x57c,0x57c,0x57c,0x57c, +0x57f,0x57f,0x57c,0x702,0x57c,0x57c,0x57c,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04, +0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0x70b,0x588,0x70b,0x70b, +0x58b,0x588,0x588,0x70b,0x70b,0x58b,0x588,0x70b,0x58b,0x588,0x588,0x70b,0x588,0x70b,0x597,0x594, +0x588,0x70b,0x588,0x588,0x588,0x588,0x70b,0x588,0x588,0x70b,0x70b,0x70b,0x70b,0x588,0x588,0x70b, +0x58b,0x70b,0x58b,0x70b,0x70b,0x70b,0x70b,0x70b,0x711,0x58e,0x70b,0x58e,0x58e,0x588,0x588,0x588, +0x70b,0x70b,0x70b,0x70b,0x588,0x588,0x588,0x588,0x70b,0x70b,0x588,0x588,0x588,0x58b,0x588,0x588, +0x58b,0x588,0x588,0x58b,0x70b,0x58b,0x588,0x588,0x70b,0x588,0x588,0x588,0x588,0x588,0x70b,0x588, +0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x70e,0x70b,0x58b,0x588, +0x70b,0x70b,0x70b,0x70b,0x588,0x588,0x70b,0x70b,0x588,0x58b,0x70e,0x70e,0x58b,0x58b,0x588,0x588, +0x58b,0x58b,0x588,0x588,0x58b,0x58b,0x588,0x588,0x588,0x588,0x588,0x588,0x58b,0x58b,0x70b,0x70b, +0x58b,0x58b,0x70b,0x70b,0x58b,0x58b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, +0x588,0x70b,0x588,0x588,0x588,0x70b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x70b,0x588,0x588, +0x588,0x588,0x588,0x588,0x58b,0x58b,0x58b,0x58b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, +0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x70b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, +0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, +0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x58b,0x58b,0x58b,0x58b,0x588,0x588,0x588,0x588, +0x588,0x588,0x58b,0x58b,0x58b,0x58b,0x588,0x591,0x588,0x588,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4, +0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0x59a,0xb07,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, +0x5a6,0x5a3,0x5a6,0x5a3,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x714,0x59a,0x59a,0x59a,0x59a,0x59a, +0x59a,0x59a,0x819,0x819,0x59a,0x59a,0x59a,0x59a,0x5a0,0x5a0,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, +0x59d,0x81f,0x81c,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, +0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, +0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0xb07,0xbfa,0xb07,0xb07,0xb07,0x5a9,0x5a9,0x5a9,0x5a9, +0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9, +0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x71d,0x71d,0x71d,0x71d, +0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x5af,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60, +0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xd74,0x726,0x726,0x726,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, +0x5b2,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x726,0x726,0x726,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x5b5,0x5b5,0x5b5,0x5b5,0x726,0x726,0x726,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x729,0x729,0x729,0x729, +0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x5b8,0x5b8,0x729,0x729, +0x729,0x729,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0x72f,0x72f,0x5bb,0x72c, +0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x5be,0x5be,0x5bb,0x5bb,0x5c1,0x5c1,0x5c1,0x5c1,0x72f,0x72f, +0x5c1,0x5c1,0x732,0x72f,0x5bb,0x5bb,0x5bb,0x5bb,0x72f,0x72f,0x5c1,0x5c1,0x732,0x72f,0x5bb,0x5bb, +0x5bb,0x5bb,0x72f,0x72f,0x72c,0x5bb,0x5c1,0x72f,0x5bb,0x5bb,0x72c,0x72f,0x72f,0x72f,0x5c1,0x5c1, +0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x72f,0x72c, +0x72f,0x72c,0x5bb,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5bb,0x5bb,0x72c,0xb0d,0xb0d,0xb0d,0xb0d, +0xb0d,0xb0d,0xb0d,0xb0d,0xc00,0xc00,0xc00,0xc03,0xc03,0xc78,0xc78,0xc00,0x5cd,0x5cd,0x5cd,0x5cd, +0x5ca,0x741,0x741,0x5c4,0x5c4,0x735,0x5c4,0x5c4,0x5c4,0x5c4,0x73b,0x735,0x5c4,0x5ca,0x5c4,0x5c4, +0xd7d,0xd7d,0xc06,0xc06,0xdfe,0xb10,0x5c7,0x5c7,0x738,0x5d0,0x738,0x5c7,0x5ca,0x5c4,0x5ca,0x5ca, +0x5c4,0x5c4,0x5ca,0x5c4,0x5c4,0x5c4,0x5ca,0x5c4,0x5c4,0x5c4,0x5ca,0x5ca,0x5c4,0x5c4,0x5c4,0x5c4, +0x5c4,0x5c4,0x5c4,0x5c4,0x5ca,0x5cd,0x5cd,0x5c7,0x5c4,0x5c4,0x5c4,0x5c4,0x747,0x5c4,0x747,0x5c4, +0x5c4,0x5c4,0x5c4,0x5c4,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x744,0x741,0x5d3,0x744, +0x735,0x73b,0x5ca,0x735,0x73e,0x735,0x735,0x5c4,0x735,0x741,0x5d3,0x741,0xb10,0xb10,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc0c,0xc09,0xc09,0xdf5,0xeb5,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d9,0x13c5,0x13c5,0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x1515,0x5df,0x5eb,0x5df, +0x5df,0x13c5,0x5d9,0x5d9,0x5ee,0x5eb,0x13c8,0x13c8,0x5f1,0x5f1,0x5d9,0x5e5,0x5d9,0x5d9,0x5e5,0x5d9, +0x5e5,0x5d9,0x5e5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5e5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, +0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5e5,0x5e5,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x74d,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5e5,0x5d9,0x5d9,0x5e5, +0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x5d9,0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x13c5,0x13c5,0x5d9,0x12c9, +0x5d9,0x5d9,0x5d9,0x5e2,0x5e2,0x5e2,0x5e2,0x1347,0x1347,0x5d9,0x5dc,0x5e8,0x5ee,0x5d9,0x5d9,0x5d9, +0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0x74a,0x74a, +0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x5d9,0x5e5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x61b,0x61b,0x61b,0x61b, +0x61b,0x61b,0x61b,0x61b,0x612,0x618,0x609,0x60c,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, +0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, +0x618,0x618,0x618,0x618,0x618,0x618,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612, +0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612, +0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612, +0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612, +0x615,0x61b,0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612, +0x615,0x61b,0x618,0x612,0x618,0x612,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a, +0x134a,0x134a,0x134a,0x134a,0x618,0x612,0x618,0x612,0x618,0x612,0x615,0x61b,0x615,0x61b,0x618,0x612, +0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x615,0x618,0x612,0x615, +0x618,0x612,0x615,0x61b,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615, +0x615,0x615,0x615,0x615,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, +0x618,0x618,0x618,0x618,0x618,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x615,0x615,0x612,0x615,0x612,0x615,0x612,0x612,0x615,0x612,0x612,0x615, +0x612,0x615,0x612,0x612,0x615,0x612,0x615,0x615,0x612,0x612,0x612,0x615,0x612,0x612,0x612,0x612, +0x612,0x615,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, +0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x612,0x612,0x615,0x612,0x615,0x612, +0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, +0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, +0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x61b,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, +0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, +0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b, +0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x618,0x618,0x618, +0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x61e,0x61e,0x61e,0x61e,0x1008,0x1008,0x1008,0x1518, +0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1722,0x1722,0x87f,0x885,0x885,0x891,0x891,0x882,0x879,0x882, +0x879,0x882,0x879,0x882,0x879,0x882,0x879,0x882,0x62d,0x62d,0x627,0x62d,0x627,0x62d,0x627,0x62d, +0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62a, +0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62d,0x627,0x62d, +0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a, +0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a, +0x630,0x62d,0x627,0x62a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a, +0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717, +0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717, +0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x720,0x720,0x723,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, +0x720,0x720,0x720,0x720,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, +0x71d,0x71d,0x71d,0x71d,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, +0x726,0x726,0x726,0x726,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750, +0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750, +0x750,0x750,0x750,0x750,0xc66,0x8e5,0x8df,0x8dc,0x8e2,0x8d9,0x765,0x768,0x768,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x8eb,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765, +0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765, +0x765,0x765,0x765,0x765,0x765,0x765,0x8e8,0x8e8,0x76b,0x8fa,0x8fd,0x903,0x825,0x831,0x918,0x82e, +0x8f1,0x8ee,0x8f1,0x8ee,0x8f7,0x8f4,0x8f7,0x8f4,0x8f1,0x8ee,0x82b,0x903,0x8f1,0x8ee,0x8f1,0x8ee, +0x8f1,0x8ee,0x8f1,0x8ee,0x906,0x90f,0x90c,0x90c,0x771,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7a7, +0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7, +0x7a7,0x7a7,0x7a7,0x774,0x78f,0x76e,0x795,0x798,0x792,0x7aa,0x7aa,0x7aa,0x7aa,0x7aa,0x7aa,0x7a4, +0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, +0x7a4,0x7a4,0x7a4,0x774,0x78f,0x76e,0x78f,0xc69,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, 0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, -0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, -0x8df,0x816,0x816,0x816,0x816,0x816,0x816,0xd35,0xd35,0xd35,0xd35,0x8e2,0x8e2,0x8e2,0x8e2,0x8e2, -0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, -0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, -0x816,0x816,0xd35,0xd35,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, -0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, -0x819,0x819,0x819,0x819,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x81c,0x81c,0x81c,0x81c, -0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, -0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0xe64,0xe64, -0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, -0xe64,0xe64,0xe64,0xe64,0x10d4,0x10d4,0x10d4,0x10d4,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, -0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, -0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x822,0x822,0x81f,0x822,0x81f,0x822, -0x822,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x822,0x81f,0x822,0x81f,0x822, -0x822,0x81f,0x81f,0x822,0x822,0x822,0x81f,0x81f,0x81f,0x81f,0x1476,0x1476,0xc39,0xc39,0xc39,0xc39, -0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0x8d6,0x8d6,0x8d6,0x8d6, -0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6, -0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x8d6,0x12a8,0x12a8,0x12a8,0x12a8, -0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0x1251,0xd2c,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9, -0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8dc, -0x8d9,0x8dc,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0x8d9, -0x8d9,0x8d9,0x8d9,0x8d9,0x8d9,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33,0xc33, -0xc33,0xc33,0xc33,0xc33,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, -0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df,0x8df, -0x8df,0x8df,0x8df,0xd35,0x95d,0x93f,0x93f,0x93f,0x93f,0x939,0x93f,0x93f,0x951,0x93f,0x93f,0x93c, -0x948,0x94e,0x94e,0x94e,0x94e,0x94e,0x951,0x939,0x945,0x939,0x939,0x939,0x930,0x930,0x939,0x939, -0x939,0x939,0x939,0x939,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x954,0x939,0x939, -0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x939,0x93c,0x930,0x939,0x930,0x939,0x930,0x94b,0x942, -0x94b,0x942,0x95a,0x95a,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969, -0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969,0x969, -0x969,0x969,0x969,0x969,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, -0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c, -0x96c,0x96c,0x96c,0x96c,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f, -0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f, -0x96f,0x96f,0x96f,0x96f,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x972,0x972,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, -0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, -0x97b,0x97b,0x975,0x975,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0x978,0x978,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, -0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, -0x97b,0x97b,0x97b,0x97b,0x97e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, -0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, -0x97e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, -0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0xa0e,0xa0e,0xf96,0xa0e, -0xa0e,0xa0e,0xa11,0xa0e,0xf96,0xa0e,0xa0e,0xf8d,0xa08,0x9fc,0x9fc,0x9fc,0x9fc,0xa0b,0x9fc,0xf7b, -0xf7b,0xf7b,0x9fc,0x9ff,0xa08,0xa02,0xf81,0xf90,0xf90,0xf7b,0xf7b,0xf96,0xb01,0xb01,0xb01,0xb01, -0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xa14,0xa14,0xa05,0xa05,0xa05,0xa05,0xa0e,0xa0e,0xa0e,0xa0e, -0xa0e,0xa0e,0xa0b,0xa0b,0x9fc,0x9fc,0xf96,0xf96,0xf96,0xf96,0xf7b,0xf7b,0xa0e,0xa0e,0xa0e,0xa0e, -0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e, -0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa0e,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xd86,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, -0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f, -0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2c,0xa32,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0x110d, -0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110d,0x110a,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f, -0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f, -0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa2f,0xa44,0xa44,0xa44,0xa44, -0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44, -0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa44,0xa68,0xa68,0xa68,0xa6b, -0xa6b,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, -0xa50,0xa50,0xa65,0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0xa65,0xa65,0xa68,0xa68,0xa68,0xa68, -0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68, -0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa68,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa74,0xa74,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa8c,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89,0xa89, -0xa89,0xa89,0xa89,0xa89,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3, -0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xab3,0xba6, -0xba6,0xba6,0xba6,0xba6,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, -0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf,0xabf, -0xabf,0xabf,0xabf,0xabf,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, -0xad1,0xad1,0xad1,0xad1,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7,0xad7, -0xad7,0xad7,0xad7,0xad7,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6,0xae6, -0xae6,0xae6,0xae6,0xae6,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xaec,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, -0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xaef,0xaef,0xc36,0xc36, -0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef, -0xc36,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xaef,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10, -0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0xb10,0x14c4,0xb19,0xb19,0xb19,0xb19, -0xb19,0xb19,0xcbd,0xcbd,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16, -0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xb16,0xcba,0xcba, -0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b, -0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19, -0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19,0xb19, -0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, -0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, -0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb22,0xb2e,0xb34,0xb34,0xb34,0xb28,0xb28,0xb28,0xb31,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb34,0xb34,0xb34,0xb34,0xb34, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb2b,0xb2b,0xb34,0xb34,0xb34,0xb28,0xb28,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34,0xb34, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb34,0xb34,0xb34,0xb34,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, -0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0x16d1,0x16d1,0xb40,0xb37,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb37,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb37,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb37,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb37,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x816, +0x82b,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x94e,0x94e,0x94e,0x94e,0x834,0x834, +0x909,0x915,0x915,0x915,0x915,0x912,0x828,0x900,0xb34,0xb34,0xb34,0xc7b,0xc99,0xc96,0xb4f,0x8d6, +0x83a,0x837,0x83a,0x83d,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x837,0x837,0x837,0x837,0x837, +0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x837, +0xc9c,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x846,0x849,0x846,0x849,0x846, +0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846, +0x849,0x846,0x849,0x84c,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x846,0x846,0x846,0x846,0x846, +0x849,0x849,0x846,0x849,0x849,0x846,0x849,0x849,0x846,0x849,0x849,0x846,0x849,0x849,0x846,0x846, +0x846,0x846,0x846,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x846,0x846,0x846,0x846,0x846,0x84c,0x846, +0x846,0x846,0x846,0x846,0x849,0x84c,0x84c,0x849,0x849,0x849,0x849,0x91e,0x921,0x84f,0x852,0xc84, +0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, +0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, +0x85b,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, +0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x864,0x864,0x864,0x864, +0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864, +0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0xd86,0xd86,0xeb8,0x85e,0x92a,0x92a,0x92a,0x92a, +0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0xd80,0xd80,0xd80,0xd80,0x867,0x867,0x867,0x867, +0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x933,0x933,0x933,0x933, +0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x86a,0x86a,0x86a, +0x86a,0x86a,0x86a,0xd89,0xd89,0xd89,0xd89,0x936,0x936,0x936,0x936,0x936,0x86a,0x86a,0x86a,0x86a, +0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a, +0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0xd89,0xd89, +0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d, +0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d, +0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870, +0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870, +0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb, +0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb, +0x112b,0x112b,0x112b,0x112b,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873, +0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873, +0x873,0x873,0x873,0x873,0x873,0x873,0x876,0x876,0x873,0x876,0x873,0x876,0x876,0x873,0x873,0x873, +0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x876,0x873,0x876,0x873,0x876,0x876,0x873,0x873,0x876, +0x876,0x876,0x873,0x873,0x873,0x873,0x14cd,0x14cd,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, +0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a, +0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a, +0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x12ff,0x12ff,0x12ff,0x12ff,0x12a8,0x12a8,0x12a8,0x12a8, +0x12a8,0x12a8,0x12a8,0x12a8,0xd80,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87, +0xc87,0xc87,0xc87,0xc87,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x930,0x92d,0x930,0x92d,0x92d, +0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, +0x92d,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87, +0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933, +0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0xd89, +0x9b1,0x993,0x993,0x993,0x993,0x98d,0x993,0x993,0x9a5,0x993,0x993,0x990,0x99c,0x9a2,0x9a2,0x9a2, +0x9a2,0x9a2,0x9a5,0x98d,0x999,0x98d,0x98d,0x98d,0x984,0x984,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x98d,0x98d,0x990,0x984,0x98d,0x984,0x98d,0x984,0x99f,0x996,0x99f,0x996,0x9ae,0x9ae, +0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd, +0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd, +0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, +0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, +0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3, +0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3, +0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, +0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9c6,0x9c6, +0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, +0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9c9,0x9c9, +0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, +0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, +0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, +0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, +0x9d2,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, +0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d2,0x9d5,0x9d5,0x9d5, +0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, +0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0xa62,0xa62,0xfed,0xa62,0xa62,0xa62,0xa65,0xa62, +0xfed,0xa62,0xa62,0xfe4,0xa5c,0xa50,0xa50,0xa50,0xa50,0xa5f,0xa50,0xfd2,0xfd2,0xfd2,0xa50,0xa53, +0xa5c,0xa56,0xfd8,0xfe7,0xfe7,0xfd2,0xfd2,0xfed,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, +0xb55,0xb55,0xa68,0xa68,0xa59,0xa59,0xa59,0xa59,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa5f,0xa5f, +0xa50,0xa50,0xfed,0xfed,0xfed,0xfed,0xfd2,0xfd2,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, +0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, +0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda, +0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, +0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, +0xa77,0xa77,0xa77,0xdda,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, +0xa77,0xa77,0xa77,0xa77,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, +0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, +0xa7d,0xa7d,0xa7d,0xa7d,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, +0xa83,0xa80,0xa86,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0x1164,0x1164,0x1164,0x1164,0x1164, +0x1164,0x1164,0x1164,0x1164,0x1161,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, +0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, +0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, +0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, +0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xabc,0xabc,0xabc,0xabf,0xabf,0xabc,0xabc,0xabc, +0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xaa4,0xaa4,0xab9,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xab9,0xab9,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, +0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, +0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xadd,0xadd,0xadd,0xadd,0xadd,0xac8,0xac8,0xadd, +0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, +0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, +0xadd,0xadd,0xadd,0xae0,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, +0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, +0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07, +0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, +0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, 0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, 0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, 0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40, -0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, 0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb40,0xb40,0xb40,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49, -0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb49,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, -0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, -0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6, -0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba6,0xba3,0xba6, -0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xba3,0xcae, -0xcb1,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xd9e,0xeb8,0xeb8,0xeb8,0xeb8, -0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, -0xcb4,0xcb4,0xda4,0xe5b,0xda4,0xda4,0xda4,0xda4,0xda1,0xda4,0xda1,0xda4,0xda4,0xfab,0x1242,0x1242, -0xdad,0xdad,0xdad,0xdad,0xdad,0xdb3,0xdb0,0xeca,0xeca,0xeca,0xeca,0x13bf,0xfbd,0x13bf,0x12fc,0x12fc, -0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb,0xbeb, -0xbeb,0xbeb,0xc1b,0xc18,0xc1b,0xc18,0xc1b,0xc18,0x10ce,0x10cb,0xfc3,0xfc0,0xbee,0xbee,0xbee,0xbee, -0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbf1,0xbf1,0xbf1,0xbf1, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf4,0xbf4,0xbf1,0xbf1, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf7,0xbf7,0xbf7,0xbfd,0xbfa,0xc21,0xc1e,0xbfd, -0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd,0xbfa,0xbfd, -0xbfa,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, -0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, -0xbf7,0xbf7,0xbf7,0xbf7,0xbfd,0xbfa,0xbfd,0xbfa,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, -0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7, -0xbf7,0xbf7,0xbf7,0xbf7,0xbfd,0xbfa,0xbf7,0xbf7,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, -0xc00,0xc00,0xc00,0xc00,0xc06,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, -0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, -0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc06,0xc06,0xc06,0xc00,0xc00,0xc00,0xc00,0xc00, -0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00, -0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc03,0xc00,0xc00,0xc00,0xc39,0xc39,0xc39,0xc39, -0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39, -0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xc39,0xcb7,0xd26,0xda1,0xda1, -0xda1,0xda1,0xda1,0xda1,0xda1,0xda1,0xe5b,0xe5b,0xda1,0xda1,0xda1,0xda1,0xda4,0xda4,0xebb,0xfab, -0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0x126f,0x126f,0x1245,0xcdb,0xcdb,0xcdb,0xcdb, -0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb, -0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcdb,0xcea,0xcea,0xcea,0xcea, -0xcea,0xcea,0xce1,0xce1,0xce1,0xce1,0xce1,0xcde,0xcf3,0xcf3,0xcf3,0xced,0xcf3,0xcf3,0xcf3,0xcf3, -0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xced,0xcf3,0xcf3,0xcf3,0xcf3,0xce7,0xce7,0xcf0,0xcf0, -0xcf0,0xcf0,0xce4,0xce4,0xce4,0xce4,0xce4,0xcea,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9, -0xdb9,0xdb9,0xdb9,0xdb9,0xdb6,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xcf3,0xcf3,0xcf3,0xcf3, -0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xced,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3, -0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xce7,0xce7,0xce7,0xcea,0xcea,0xcea,0xcea, -0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea, -0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcf6,0xcf6,0xcf6,0xcf6, -0xcf6,0xcf9,0xcf9,0xcf9,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc,0xdbc, -0xecd,0xecd,0xecd,0xecd,0xecd,0xecd,0xecd,0x10d7,0x10d7,0xfc6,0xfc6,0xfc6,0xcfc,0xcfc,0xcfc,0xcfc, -0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc, -0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02, -0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd02,0xd0b,0xd0b,0xd0b,0xd0b, -0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b, -0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd0b,0xd17,0xd17,0xd17,0xd17, -0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17, -0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd17,0xd23,0xd23,0xd23,0xd23, -0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, -0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xdc2,0xdc2,0xdc2,0xdc2, -0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2, -0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc8,0xdc8,0xdc8,0xdc8, -0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8, -0xdc8,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc5,0xdc8,0xdc8,0xdc8,0xdc8, -0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8, -0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xdc8,0xe88,0xe88,0xdda,0xdda, -0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xed0,0xfd2,0xfd2,0xfd2,0xfd2,0xfd2,0xfcf,0xfcf,0xfcf,0xfcf, -0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xfcf,0xde9,0xde6,0xde9,0xde6, -0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6, -0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xde9,0xde6,0xdf5,0xdf5,0xdf5,0xdf5, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, -0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdfb,0xdfb,0xdfb,0xdfb, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb, -0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xdfb,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13, -0xe13,0xe13,0xe13,0xed3,0xed3,0xed3,0xed3,0xfd5,0xfd5,0xfd5,0xfd5,0xfd5,0xe1c,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe25,0xe25,0xe25,0xe25, -0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25, -0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe25,0xe2e,0xe2e,0xe2e,0xe2e, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe28,0xe2b,0xe2b,0xe2b,0xe2b, -0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b, -0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2b,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe37,0xe37,0xe37,0xe37, -0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe37,0xe34,0xe34,0xe34,0xe34,0xe34,0xe34, -0xe34,0xe34,0xe31,0xe3a,0xfe1,0xfdb,0xfea,0xfd8,0xe37,0xe37,0xfd8,0xfd8,0xe4c,0xe4c,0xe3d,0xe4c, -0xe4c,0xe4c,0xe43,0xe4c,0xe4c,0xe4c,0xe4c,0xe3d,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c, -0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe67,0xe67,0xe67,0xe67, -0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67, -0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe67,0xe85,0xe85,0xe85,0xe85, -0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0xecd,0xecd,0xecd,0xecd, -0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc6,0xfc9,0xfc9,0xfc9,0xfc9, -0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xeee,0xeee,0xeee,0xeee, -0xf00,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf0c,0xf09,0xf09,0xf09,0xf0c,0xf09, -0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, -0xf09,0xf09,0xf09,0xf09,0xef1,0xf00,0xeee,0xeee,0xeee,0xeee,0xeee,0xf03,0xeee,0xf03,0xf00,0xf00, -0xf15,0xf12,0xf15,0xf15,0xf15,0xf12,0xf12,0xf15,0xf12,0xf15,0xf12,0xf15,0xf12,0xffc,0xffc,0xffc, -0x1137,0xff3,0xffc,0xff3,0xf12,0xf15,0xf12,0xf12,0xff3,0xff3,0xff3,0xff3,0xff6,0xff9,0x1137,0x1137, -0xf18,0xf18,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, -0x1005,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, -0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, -0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, -0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, -0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, -0xf2d,0xf2d,0xf2d,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7,0x14f7, -0x14f7,0x14f7,0x14f7,0x14f7,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, -0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, -0xf33,0xf33,0xf33,0xf33,0xf7b,0xf96,0xf8d,0xf8a,0xf8a,0xf96,0xf96,0xf8d,0xf8d,0xf8a,0xf8a,0xf8a, -0xf8a,0xf8a,0xf96,0xf96,0xf96,0xf7b,0xf7b,0xf7b,0xf7b,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf96, -0xf96,0xf96,0xf96,0xf96,0xf96,0xf96,0xf7b,0xf8d,0xf90,0xf7b,0xf7b,0xf93,0xf93,0xf93,0xf93,0xf93, -0xf93,0xf7e,0xf96,0xf93,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0xf87,0x1101,0x1101, -0x10fe,0x10fb,0xf84,0xf84,0xfae,0xfae,0xfae,0xfae,0x126f,0x126f,0x1245,0x1245,0x124b,0x1242,0x1242,0x1242, -0x1242,0x1245,0x136b,0x124b,0x1245,0x124b,0x1242,0x124b,0x126f,0x1242,0x1242,0x1242,0x1245,0x1245,0x1242,0x1242, -0x1245,0x1242,0x1242,0x1245,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9,0xfc6,0xfc6,0xfc9,0xfc9,0xfc9,0xfc9,0xfc9, -0xfc9,0x14d0,0x14d0,0x14d0,0x10d7,0xfc6,0xfc6,0xfc6,0xfc6,0x127b,0x1254,0x1254,0x1254,0x1254,0x14d0,0x14d0, -0x14d0,0x14d0,0x14d0,0x14d0,0xfe7,0xfe7,0xfe4,0xfde,0xfe4,0xfde,0xfe4,0xfde,0xfe4,0xfde,0xfdb,0xfdb, -0xfdb,0xfdb,0xff0,0xfed,0xfdb,0x1134,0x13cb,0x13ce,0x13ce,0x13cb,0x13cb,0x13cb,0x13cb,0x13cb,0x13d1,0x13d1, -0x14eb,0x14df,0x14df,0x14dc,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x1002,0xfff,0xfff,0x100e, -0x1005,0x130b,0x1308,0x16da,0x130b,0x1308,0x13da,0x13d7,0x14ee,0x14ee,0x14f4,0x14ee,0x14f4,0x14ee,0x14f4,0x14ee, -0x14f4,0x14ee,0x14f4,0x14ee,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, -0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005,0x100e,0x1005, -0x100e,0x1005,0x100e,0x1005,0x1008,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x1005,0x100e,0x1005,0x100e, -0x1005,0x100e,0x100e,0x1005,0x1011,0x1011,0x1017,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, -0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d, -0x101d,0x101d,0x101d,0x101d,0x101d,0x1017,0x1011,0x1011,0x1011,0x1011,0x1017,0x1017,0x1011,0x1011,0x101a,0x13e3, -0x13e0,0x13e0,0x101d,0x101d,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x1014,0x13e6,0x13e6, -0x13e6,0x13e6,0x13e6,0x13e6,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, -0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, -0x1032,0x1032,0x1032,0x1032,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b, -0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103b,0x103e,0x103e,0x103e,0x1041, -0x103e,0x103e,0x1044,0x1044,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, -0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, -0x1047,0x1047,0x1047,0x1047,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1053,0x104a,0x1059,0x1056,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, -0x1050,0x1050,0x1050,0x1050,0x1311,0x130e,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065, -0x106b,0x1065,0x1068,0x10e9,0x105c,0x105c,0x105c,0x1062,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9, -0x105f,0x105f,0x1062,0x106e,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065, -0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065,0x106b,0x1065, -0x106b,0x1065,0x106b,0x1065,0x1503,0x1500,0x1503,0x1500,0x1506,0x1506,0x16e3,0x13e9,0x1077,0x1077,0x107a,0x107a, -0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a, -0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x107a,0x1077,0x1077,0x1077,0x1077, -0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1080,0x1080, -0x1080,0x1080,0x1080,0x1083,0x1083,0x1083,0x10dd,0x108c,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b, -0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086, -0x1086,0x1086,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089, -0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, -0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa, -0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10aa,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, -0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc, -0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10bc,0x10c5,0x10c5,0x10c5,0x10c5,0x10da,0x10c5,0x10c5,0x10c5, -0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5, -0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, -0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, -0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149, -0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1149,0x1140,0x1140, -0x1143,0x1143,0x1149,0x1140,0x1140,0x1140,0x1140,0x1140,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, -0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c, -0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x114c,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167, -0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167, -0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1167,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, -0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173, -0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1170,0x1176,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, -0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182, -0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1182,0x1191,0x1191,0x1191,0x11a0,0x11a6,0x11a6,0x11a6,0x11a6, -0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6, -0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x1194,0x11a0,0x11a0,0x1191,0x1191, -0x1191,0x1191,0x11a0,0x11a0,0x1191,0x11a0,0x11a0,0x11a0,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2, -0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b5,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11ac, -0x11ac,0x11ac,0x11b2,0x11af,0x150c,0x150f,0x1512,0x1512,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, -0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11b8,0x11c4,0x11b8,0x11b8,0x11b8,0x11cd,0x11cd,0x11b8, -0x11b8,0x11cd,0x11c4,0x11cd,0x11cd,0x11c4,0x11b8,0x11bb,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, -0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4, -0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11c4,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df, -0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df, -0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7, -0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f7, -0x11f7,0x11f7,0x11f7,0x11f7,0x11f7,0x11f4,0x11f4,0x11f4,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, -0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f, -0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f, -0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x120f,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a, -0x122a,0x122a,0x122a,0x122d,0x122a,0x122a,0x122a,0x122a,0x1227,0x1227,0x1227,0x121b,0x121b,0x121b,0x121b,0x1227, -0x1227,0x1221,0x121e,0x1224,0x1224,0x1215,0x1230,0x1230,0x1218,0x1218,0x1227,0x122a,0x122a,0x122a,0x122a,0x122a, -0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a,0x122a, -0x122a,0x122a,0x122d,0x122a,0x122d,0x122a,0x122a,0x122a,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, -0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, -0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1239,0x1239,0x1239,0x1236,0x1236,0x1236,0x1233,0x1233, -0x1233,0x1233,0x1236,0x1233,0x1233,0x1233,0x1239,0x1236,0x1239,0x1236,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, -0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233,0x1233, -0x1233,0x1233,0x1233,0x1233,0x1233,0x1239,0x1236,0x1236,0x1233,0x1233,0x1233,0x1233,0x1245,0x1245,0x12ed,0x1242, -0x12ed,0x12ed,0x12ed,0x12ed,0x1242,0x1248,0x126f,0x1242,0x1242,0x1242,0x1242,0x1242,0x1248,0x124b,0x126f,0x126f, -0x124b,0x126f,0x1242,0x124b,0x124b,0x124e,0x126f,0x1242,0x1242,0x126f,0x1245,0x1245,0x135c,0x135c,0x135c,0x135c, -0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x1257,0x1257,0x1257,0x1257,0x1377,0x1356,0x1260,0x1377,0x1377,0x1377, -0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x1377,0x180f,0x180f,0x180f,0x180f,0x180f,0x135f,0x135f,0x1266,0x135f, -0x135f,0x135f,0x1266,0x135f,0x135f,0x135f,0x1260,0x1260,0x1260,0x1260,0x1260,0x1359,0x135c,0x135c,0x135c,0x135c, -0x135c,0x135c,0x135c,0x1263,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x1263,0x128d,0x128d,0x128d,0x128d, -0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d, -0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x128d,0x132f,0x132f,0x132f,0x132f, -0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f, -0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x132f,0x1344,0x1335,0x1344,0x1347, -0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347, -0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1335,0x1335,0x1335,0x1335, -0x1335,0x1335,0x1335,0x1335,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d, -0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d,0x134d, -0x134d,0x134d,0x134d,0x134d,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353,0x1353, -0x1353,0x1353,0x1353,0x1353,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c, -0x1389,0x138c,0x138c,0x138c,0x1389,0x138c,0x1389,0x138c,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c,0x1395,0x138c, -0x138c,0x138c,0x138c,0x1389,0x138c,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1389,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1389,0x1389,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x151e,0x151e, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x1527,0x1521,0x1521,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1764,0x1764,0x1764, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1527,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x1527,0x1764,0x1764,0x138c,0x138c,0x138c,0x138c,0x138c,0x1395,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1521,0x1521,0x1527,0x1527, -0x1521,0x1527,0x1527,0x1527,0x151e,0x151e,0x1527,0x1527,0x138c,0x138c,0x1392,0x1395,0x1395,0x1698,0x138c,0x1392, -0x138c,0x138c,0x1395,0x1530,0x152d,0x1527,0x1527,0x1764,0x1764,0x1764,0x1764,0x1764,0x1527,0x1527,0x1527,0x1527, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1521,0x1521,0x1527,0x1698,0x1527,0x1521,0x1527, -0x1764,0x1764,0x1764,0x1767,0x1767,0x1767,0x1767,0x1767,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1527,0x138c,0x1527,0x1395,0x1395,0x138c,0x138c,0x1395,0x1395, -0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1398,0x1398,0x1398,0x1398,0x1392,0x1392, -0x1392,0x1392,0x1395,0x1392,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x1395,0x138c,0x138c,0x138c, -0x1395,0x138c,0x138c,0x138c,0x138c,0x1395,0x1395,0x1395,0x138c,0x1395,0x1395,0x1395,0x138c,0x138c,0x138c,0x138f, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1698,0x138c,0x138c,0x138c,0x138c,0x1527,0x1521,0x1764, -0x13ef,0x13ef,0x13ef,0x13ef,0x151e,0x151e,0x151e,0x151e,0x151e,0x1524,0x1527,0x1764,0x1764,0x1764,0x1764,0x16ec, -0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1527,0x1521,0x1521,0x1527,0x152d,0x1530,0x1527,0x1527, -0x1527,0x1527,0x1818,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1521,0x1527,0x1521,0x1521,0x1521,0x1521, -0x152a,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1521,0x1521,0x1521,0x1527,0x151e,0x151e,0x151e,0x151e, -0x151e,0x151e,0x1527,0x138c,0x138c,0x138c,0x138c,0x138c,0x1479,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b, -0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x1479,0x139b,0x139b,0x139b,0x1479,0x139b,0x1479, -0x139b,0x1479,0x139b,0x1479,0x139b,0x139b,0x139b,0x1479,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x1479,0x1479, -0x139b,0x139b,0x139b,0x139b,0x1479,0x139b,0x1479,0x1479,0x139b,0x139b,0x139b,0x139b,0x1479,0x139b,0x139b,0x139b, -0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x139b,0x169e,0x169e,0x176a,0x176a,0x139e,0x139e,0x139e, -0x139b,0x139b,0x139b,0x139e,0x139e,0x139e,0x139e,0x139e,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, -0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a4,0x13a4,0x13a1, -0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1797,0x1797,0x1794,0x16ef,0x13f5,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x1539,0x1401,0x1401,0x1401,0x1413,0x1413,0x1413,0x1413,0x1413, -0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, -0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e, -0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e, -0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x142e,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437, -0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437, -0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x143d,0x143d,0x1449,0x144f,0x144f,0x144f,0x144f,0x144f, -0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f, -0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x1449,0x1449,0x1449,0x143d,0x143d, -0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d,0x1449,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, -0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, -0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1521,0x1521,0x1527,0x1527,0x1527,0x1521,0x1521,0x1521, -0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1527,0x1527,0x151e,0x151e,0x151e,0x151e, -0x151e,0x151e,0x151e,0x151e,0x1527,0x1527,0x1527,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1527, -0x1521,0x1521,0x1527,0x1527,0x1527,0x1527,0x1521,0x1521,0x1530,0x1521,0x1521,0x1521,0x1521,0x169b,0x169b,0x1521, -0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1815,0x1527,0x1521,0x1521,0x1527,0x1521,0x1521,0x1521, -0x1521,0x1521,0x1521,0x1521,0x1521,0x1527,0x1527,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521,0x1521, -0x1527,0x1521,0x1521,0x1521,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, -0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551,0x1551, -0x1551,0x1551,0x1551,0x1551,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, -0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, -0x1563,0x1563,0x1563,0x1563,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, -0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, -0x1569,0x1569,0x1569,0x1569,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, -0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c,0x156c, -0x156c,0x156c,0x156c,0x156c,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x159c,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4, -0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15b4,0x15ae, -0x15b7,0x15b7,0x15b7,0x15b7,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba,0x15ba, -0x15ba,0x15ba,0x15ba,0x15ba,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15cc,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5,0x15d5, -0x15d5,0x15d5,0x15d5,0x15d5,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de,0x15de, -0x15de,0x15de,0x15de,0x15de,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, -0x15f0,0x15f0,0x15f0,0x15f0,0x15ed,0x15ed,0x15ed,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15e1,0x15ed, -0x15ed,0x15e1,0x15ed,0x15e4,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, -0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, -0x15f0,0x15f0,0x15f0,0x15f0,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, -0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1614, -0x1614,0x1611,0x1611,0x1611,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, -0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x1623,0x1623,0x1623,0x1620,0x1620,0x1620, -0x161d,0x161d,0x161d,0x161d,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1638,0x1638,0x162c,0x1629,0x1629, -0x1629,0x1629,0x1629,0x1629,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb43,0xb43,0xc8a,0xc8a,0xb43,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc8a,0xb43,0xb43,0xb43, +0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64, +0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64, +0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0x151b,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xd11,0xd11, +0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, +0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xd0e,0xd0e,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xb6d,0xb6d,0xb6d,0xb6d, +0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d, +0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb70,0xb70,0xb70,0xb70, +0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70, +0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb7f,0xb7f,0xb7f,0xb7f, +0xb7f,0xb76,0xb82,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb85,0xb79,0xb79,0xb79,0xb79,0xb79,0xb73, +0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb88,0xb88,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb7c, +0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, +0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f, +0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb7c, +0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, +0xb7c,0xb7c,0xb88,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, +0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, +0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, +0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0x1725,0x1725,0xb94,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb8e,0xb8e,0xb8e,0xb8e, +0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e, +0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, +0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, +0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, +0xb97,0xb97,0xb97,0xb97,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, +0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, +0xb9d,0xb9d,0xb9d,0xb9d,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, +0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, +0xba0,0xba0,0xba0,0xba0,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbf7,0xbfa,0xbf7,0xbf7,0xbf7,0xbf7, +0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xd02,0xd05,0xdf2,0xdf2,0xdf2, +0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xf0f,0xf0f,0xf0f,0xf0f,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xdf8,0xeb2, +0xdf8,0xdfb,0xdfb,0xdf8,0xdf5,0xdf8,0xdf5,0xdf8,0xdf8,0x1002,0x1299,0x1299,0xe04,0xe04,0xe04,0xe04, +0xe04,0xe0a,0xe07,0xf21,0xf21,0xf21,0xf21,0x1416,0x1014,0x1416,0x1353,0x1353,0xc3f,0xc3f,0xc3f,0xc3f, +0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc6f,0xc6c, +0xc6f,0xc6c,0xc6f,0xc6c,0x1125,0x1122,0x101a,0x1017,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42, +0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc48,0xc48,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0xc4b,0xc4b,0xc4b,0xc51,0xc4e,0xc75,0xc72,0xc51,0xc4e,0xc51,0xc4e,0xc51, +0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc51,0xc4e,0xc51,0xc4e,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc51,0xc4e,0xc4b,0xc4b,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, +0xc5a,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, +0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, +0xc54,0xc54,0xc54,0xc54,0xc5a,0xc5a,0xc5a,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, +0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, +0xc54,0xc54,0xc54,0xc54,0xc57,0xc54,0xc54,0xc54,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, +0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, +0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xd0b,0xd7a,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, +0xdf5,0xdf5,0xeb2,0xeb2,0xdf5,0xdf5,0xdf5,0xdf5,0xdf8,0xdf8,0xf12,0x1002,0x1002,0x1002,0x1002,0x1002, +0x1002,0x1002,0x1002,0x1002,0x1002,0x12c6,0x12c6,0x129c,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, +0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, +0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd35,0xd35, +0xd35,0xd35,0xd35,0xd32,0xd47,0xd47,0xd47,0xd41,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, +0xd47,0xd47,0xd47,0xd41,0xd47,0xd47,0xd47,0xd47,0xd3b,0xd3b,0xd44,0xd44,0xd44,0xd44,0xd38,0xd38, +0xd38,0xd38,0xd38,0xd3e,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, +0xe0d,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, +0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd41,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, +0xd47,0xd47,0xd47,0xd47,0xd47,0xd3b,0xd3b,0xd3b,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e, +0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e, +0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4d,0xd4d,0xd4d, +0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xf24,0xf24,0xf24,0xf24, +0xf24,0xf24,0xf24,0x112e,0x112e,0x101d,0x101d,0x101d,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, +0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, +0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, +0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, +0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, +0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, +0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, +0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19, +0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19, +0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, +0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, +0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, +0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xedf,0xedf,0xe31,0xe31,0xf27,0xf27,0xf27,0xf27, +0xf27,0xf27,0xf27,0x1029,0x1029,0x1029,0x1029,0x1029,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026, +0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d, +0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d, +0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c, +0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c, +0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, +0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a, +0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xf2a, +0xf2a,0xf2a,0xf2a,0x102c,0x102c,0x102c,0x102c,0x102c,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73, +0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73, +0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85, +0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85, +0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe7f,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82, +0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82, +0xe82,0xe82,0xe82,0xe85,0xe85,0xe85,0xe85,0xe85,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e, +0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe88,0xe91, +0x1038,0x1032,0x1041,0x102f,0xe8e,0xe8e,0x102f,0x102f,0xea3,0xea3,0xe94,0xea3,0xea3,0xea3,0xe9a,0xea3, +0xea3,0xea3,0xea3,0xe94,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3, +0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6, +0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6, +0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe, +0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe, +0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc, +0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, +0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0xf24,0xf24,0xf24,0xf24,0x101d,0x101d,0x101d,0x101d, +0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020, +0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0xf45,0xf45,0xf45,0xf45,0xf57,0xf60,0xf63,0xf60, +0xf63,0xf60,0xf63,0xf60,0xf63,0xf60,0xf63,0xf60,0xf60,0xf60,0xf63,0xf60,0xf60,0xf60,0xf60,0xf60, +0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60, +0xf48,0xf57,0xf45,0xf45,0xf45,0xf45,0xf45,0xf5a,0xf45,0xf5a,0xf57,0xf57,0xf6c,0xf69,0xf6c,0xf6c, +0xf6c,0xf69,0xf69,0xf6c,0xf69,0xf6c,0xf69,0xf6c,0xf69,0x1053,0x1053,0x1053,0x118e,0x104a,0x1053,0x104a, +0xf69,0xf6c,0xf69,0xf69,0x104a,0x104a,0x104a,0x104a,0x104d,0x1050,0x118e,0x118e,0xf6f,0xf6f,0x1065,0x105c, +0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x105c,0x105c,0x1065,0x105c, +0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0xf75,0xf75,0xf75,0xf75, +0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75, +0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf84,0xf84,0xf84,0xf84, +0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84, +0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0x154e, +0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e, +0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a, +0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a, +0xfd2,0xfed,0xfe4,0xfe1,0xfe1,0xfed,0xfed,0xfe4,0xfe4,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfed,0xfed, +0xfed,0xfd2,0xfd2,0xfd2,0xfd2,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed, +0xfed,0xfed,0xfd2,0xfe4,0xfe7,0xfd2,0xfd2,0xfea,0xfea,0xfea,0xfea,0xfea,0xfea,0xfd5,0xfed,0xfea, +0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0x1158,0x1158,0x1155,0x1152,0xfdb,0xfdb, +0x1005,0x1005,0x1005,0x1005,0x12c6,0x12c6,0x129c,0x129c,0x12a2,0x1299,0x1299,0x1299,0x1299,0x129c,0x13c2,0x12a2, +0x129c,0x12a2,0x1299,0x12a2,0x12c6,0x1299,0x1299,0x1299,0x129c,0x129c,0x1299,0x1299,0x129c,0x1299,0x1299,0x129c, +0x1020,0x1020,0x1020,0x1020,0x1020,0x101d,0x101d,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1527,0x1527,0x1527, +0x112e,0x101d,0x101d,0x101d,0x101d,0x12d2,0x12ab,0x12ab,0x12ab,0x12ab,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, +0x103e,0x103e,0x103b,0x1035,0x103b,0x1035,0x103b,0x1035,0x103b,0x1035,0x1032,0x1032,0x1032,0x1032,0x1047,0x1044, +0x1032,0x118b,0x1422,0x1425,0x1425,0x1422,0x1422,0x1422,0x1422,0x1422,0x1428,0x1428,0x1542,0x1536,0x1536,0x1533, +0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1059,0x1056,0x1056,0x1065,0x105c,0x1362,0x135f,0x172e, +0x1362,0x135f,0x1431,0x142e,0x1545,0x1545,0x154b,0x1545,0x154b,0x1545,0x154b,0x1545,0x154b,0x1545,0x154b,0x1545, +0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c, +0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c, +0x105f,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x1065,0x105c, +0x1068,0x1068,0x106e,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074, +0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074, +0x1074,0x106e,0x1068,0x1068,0x1068,0x1068,0x106e,0x106e,0x1068,0x1068,0x1071,0x143a,0x1437,0x1437,0x1074,0x1074, +0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d, +0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089, +0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089, +0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092, +0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1095,0x1095,0x1095,0x1098,0x1095,0x1095,0x109b,0x109b, +0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e, +0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e, +0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10aa,0x10a1,0x10b0,0x10ad, +0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7, +0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7, +0x1368,0x1365,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10bf,0x1140, +0x10b3,0x10b3,0x10b3,0x10b9,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x10b6,0x10b6,0x10b9,0x10c5, +0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc, +0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc, +0x155a,0x1557,0x155a,0x1557,0x155d,0x155d,0x1737,0x1440,0x10ce,0x10ce,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, +0x10ce,0x10ce,0x10ce,0x10ce,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10da, +0x10da,0x10da,0x1134,0x10e3,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2, +0x10f2,0x10f2,0x10f2,0x10f2,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10e0,0x10e0, +0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0, +0x10e0,0x10e0,0x10e0,0x10e0,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101, +0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101, +0x1101,0x1101,0x1101,0x1101,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113, +0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113, +0x1113,0x1113,0x1113,0x1113,0x111c,0x111c,0x111c,0x111c,0x1131,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c, +0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c, +0x111c,0x111c,0x111c,0x111c,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, +0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, +0x111f,0x111f,0x111f,0x111f,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, +0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x1197,0x1197,0x119a,0x119a,0x11a0,0x1197, +0x1197,0x1197,0x1197,0x1197,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, +0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, +0x11a3,0x11a3,0x11a3,0x11a3,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, +0x11be,0x11be,0x11be,0x11be,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, +0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, +0x11ca,0x11ca,0x11c7,0x11cd,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, +0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, +0x11d9,0x11d9,0x11d9,0x11d9,0x11e8,0x11e8,0x11e8,0x11f7,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, +0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, +0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11eb,0x11f7,0x11f7,0x11e8,0x11e8,0x11e8,0x11e8,0x11f7,0x11f7, +0x11e8,0x11f7,0x11f7,0x11f7,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, +0x1209,0x1209,0x1209,0x1209,0x120c,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1203,0x1203,0x1203,0x1209,0x1206, +0x1563,0x1566,0x1569,0x1569,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, +0x121b,0x121b,0x121b,0x121b,0x120f,0x121b,0x120f,0x120f,0x120f,0x1224,0x1224,0x120f,0x120f,0x1224,0x121b,0x1224, +0x1224,0x121b,0x120f,0x1212,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, +0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, +0x121b,0x121b,0x121b,0x121b,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236, +0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236, +0x1236,0x1236,0x1236,0x1236,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, +0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, +0x124e,0x124b,0x124b,0x124b,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257, +0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257, +0x1257,0x1257,0x1257,0x1257,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, +0x1266,0x1266,0x1266,0x1266,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1284, +0x1281,0x1281,0x1281,0x1281,0x127e,0x127e,0x127e,0x1272,0x1272,0x1272,0x1272,0x127e,0x127e,0x1278,0x1275,0x127b, +0x127b,0x126c,0x1287,0x1287,0x126f,0x126f,0x127e,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, +0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1284,0x1281, +0x1284,0x1281,0x1281,0x1281,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, +0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, +0x128a,0x128a,0x128a,0x128a,0x1290,0x1290,0x1290,0x128d,0x128d,0x128d,0x128a,0x128a,0x128a,0x128a,0x128d,0x128a, +0x128a,0x128a,0x1290,0x128d,0x1290,0x128d,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, +0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, +0x128a,0x1290,0x128d,0x128d,0x128a,0x128a,0x128a,0x128a,0x129c,0x129c,0x1344,0x1299,0x1344,0x1344,0x1344,0x1344, +0x1299,0x129f,0x12c6,0x1299,0x1299,0x1299,0x1299,0x1299,0x129f,0x12a2,0x12c6,0x12c6,0x12a2,0x12c6,0x1299,0x12a2, +0x12a2,0x12a5,0x12c6,0x1299,0x1299,0x12c6,0x129c,0x129c,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x12ae,0x12ae,0x12ae,0x12ae,0x13ce,0x13ad,0x12b7,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce, +0x13ce,0x13ce,0x13ce,0x1863,0x1863,0x1863,0x1863,0x1863,0x13b6,0x13b6,0x12bd,0x13b6,0x13b6,0x13b6,0x12bd,0x13b6, +0x13b6,0x13b6,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x13b0,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x12ba, +0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x12ba,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, +0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, +0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, +0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x139b,0x138c,0x139b,0x139e,0x139e,0x139e,0x139e,0x139e, +0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e, +0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, +0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, +0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, +0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa, +0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e3,0x13e3,0x13e3, +0x13e0,0x13e3,0x13e0,0x13e3,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0, +0x13e3,0x13e0,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e6,0x13e3,0x13e3,0x13e3, +0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0, +0x13e0,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e0, +0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x1575,0x1575,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x157e,0x1578,0x1578, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x17b8,0x17b8,0x17b8,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x157e,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x157e,0x17b8,0x17b8,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e9,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6, +0x1578,0x1578,0x157e,0x157e,0x1578,0x157e,0x157e,0x157e,0x1575,0x1575,0x157e,0x157e,0x13e3,0x13e3,0x13e9,0x13e9, +0x13e9,0x16ec,0x13e3,0x13e9,0x13e3,0x13e3,0x13e9,0x1584,0x1584,0x157e,0x157e,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x1578,0x1578,0x157e, +0x16ec,0x157e,0x1578,0x157e,0x17b8,0x17b8,0x17b8,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x157e,0x13e3,0x157e,0x13e9,0x13e9, +0x13e3,0x13e3,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13ec,0x13ec, +0x13ec,0x13ec,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x13e3,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9, +0x13e9,0x13e3,0x13e3,0x13e3,0x13e9,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x13e9,0x13e9,0x13e3,0x13e9,0x13e9,0x13e9, +0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x16ec,0x13e3,0x13e3,0x13e3, +0x13e3,0x157e,0x1578,0x17b8,0x1446,0x1446,0x1446,0x1446,0x1575,0x1575,0x1575,0x1575,0x1575,0x157b,0x157e,0x17b8, +0x17b8,0x17b8,0x17b8,0x1740,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, +0x13e3,0x13e3,0x13e3,0x13e3,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x1578,0x1578,0x157e, +0x1584,0x1584,0x157e,0x157e,0x157e,0x157e,0x186c,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x1578,0x157e, +0x1578,0x1578,0x1578,0x1578,0x1581,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x1578,0x1578,0x1578,0x157e, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x157e,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x14d0,0x13ef,0x13ef,0x13ef, +0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x14d0,0x13ef,0x13ef, +0x13ef,0x14d0,0x13ef,0x14d0,0x13ef,0x14d0,0x13ef,0x14d0,0x13ef,0x13ef,0x13ef,0x14d0,0x13ef,0x13ef,0x13ef,0x13ef, +0x13ef,0x13ef,0x14d0,0x14d0,0x13ef,0x13ef,0x13ef,0x13ef,0x14d0,0x13ef,0x14d0,0x14d0,0x13ef,0x13ef,0x13ef,0x13ef, +0x14d0,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x16f2,0x16f2,0x17be, +0x17be,0x13f2,0x13f2,0x13f2,0x13ef,0x13ef,0x13ef,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x1671,0x1671,0x1671,0x1671, +0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x13f8,0x13f5,0x13f5,0x13f5, +0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f8,0x13f5, +0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13fb, +0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5, +0x13fb,0x13fb,0x13fb,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13fe,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, +0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x17eb,0x17eb,0x17e8,0x1743, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x144c,0x144c,0x144c,0x144c, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x158d,0x1458,0x1458,0x1458,0x146a, +0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a, +0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x1485,0x1485,0x1485,0x1485, +0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485, +0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, +0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x1494,0x1494,0x14a0,0x14a6, +0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6, +0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a0, +0x14a0,0x14a0,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x14a0,0x14c7,0x14c7,0x14c7,0x14c7, +0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7, +0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x1578,0x1578,0x157e,0x157e, +0x157e,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x157e, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x157e,0x157e,0x157e,0x1578,0x1578,0x1578,0x1578,0x1578, +0x1578,0x1578,0x1578,0x157e,0x1578,0x1578,0x157e,0x157e,0x157e,0x157e,0x1578,0x1578,0x1584,0x1578,0x1578,0x1578, +0x1578,0x16ef,0x16ef,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1869,0x157e,0x1578,0x1578, +0x157e,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x1578,0x1578,0x1578,0x1578,0x1578, +0x1578,0x1578,0x1578,0x1578,0x157e,0x1578,0x1578,0x1578,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, +0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7, +0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7, +0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, +0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff, +0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff, +0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15f0,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, +0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, +0x1608,0x1608,0x1608,0x1602,0x160b,0x160b,0x160b,0x160b,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, +0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, +0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629, +0x1620,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629, +0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, 0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e, -0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163b,0x163b,0x163b,0x163b,0x163b, -0x163b,0x163b,0x163b,0x163b,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, -0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1641, -0x1641,0x1641,0x1641,0x1641,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665, -0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665,0x1665, -0x1665,0x1665,0x1665,0x1665,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1671,0x1680,0x1680,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1680,0x1671,0x1683, -0x1683,0x1671,0x1683,0x1671,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, +0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1641,0x1641,0x1641,0x1635,0x1635,0x1635,0x1635,0x1635, +0x1635,0x1635,0x1635,0x1641,0x1641,0x1635,0x1641,0x1638,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668, +0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668, +0x1668,0x1668,0x1668,0x1668,0x1668,0x1665,0x1665,0x1665,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, +0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1677,0x1677, +0x1677,0x1674,0x1674,0x1674,0x1671,0x1671,0x1671,0x1671,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, +0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x168c, +0x168c,0x1680,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, 0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, -0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, -0x168f,0x168f,0x168f,0x168f,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, +0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692, +0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x168f, +0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, 0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, -0x1695,0x1695,0x1695,0x1695,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, -0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5,0x16f5, -0x16f5,0x16f5,0x16f5,0x16f5,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731, -0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731, -0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1737,0x1734,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731, -0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x1731,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, -0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d, -0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d, -0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x173d,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, -0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, -0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, -0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, -0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1758,0x1758,0x1758,0x1758,0x1755, -0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1755,0x1758,0x1758,0x1758, -0x1758,0x1758,0x1758,0x1758,0x1758,0x1755,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, -0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, -0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770, -0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770, -0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x1770,0x17b5,0x17b5,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, -0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, -0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, -0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5, -0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1800,0x1800,0x1800, -0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, -0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, -0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0,0,0,0 +0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, +0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, +0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16c5,0x16d4,0x16d4,0x16c5,0x16c5,0x16c5,0x16c5,0x16c5, +0x16c5,0x16d4,0x16c5,0x16d7,0x16d7,0x16c5,0x16d7,0x16c5,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, +0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, +0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, +0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, +0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9, +0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9, +0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, +0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, +0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x178b,0x1788,0x1785,0x1785,0x1785,0x1785, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x178e,0x178e,0x178e,0x178e, +0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e, +0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x1791,0x1791,0x1791,0x1791, +0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791, +0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x17a3,0x17a3,0x17a3,0x17a3, +0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3, +0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a6,0x17a6,0x17a6,0x17a6, +0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6, +0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a9,0x17a9,0x17a9,0x17a9, +0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, +0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17ac, +0x17ac,0x17ac,0x17ac,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, +0x17a9,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17a9,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac, +0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac, +0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17c4,0x17c4,0x17c4,0x17c4, +0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4, +0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x1809,0x1809,0x1806,0x1806, +0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806, +0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1809,0x1809,0x1809,0x1809, +0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809, +0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1857,0x1857,0x1857,0x1857, +0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857, +0x1857,0x1854,0x1854,0x1854,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x1857,0x1857,0x1857,0x1857, +0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857, +0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x187e,0x187e,0x187e,0x187e, +0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e, +0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x1881,0x1881,0x1881,0x1881, +0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, +0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0,0,0,0 }; static const UTrie2 propsVectorsTrie={ propsVectorsTrie_index, - propsVectorsTrie_index+4844, + propsVectorsTrie_index+4924, NULL, - 4844, - 23696, + 4924, + 24212, 0xa40, - 0x136c, + 0x13bc, 0x0, 0x0, 0x110000, - 0x6f78, + 0x71cc, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint32_t propsVectors[6195]={ -0x67,0,0,0x67,0,0xe00000,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67, -0,0,0xc67,0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1167,0, -0,0x1267,0,0,0x1367,0,0,0x1467,0,0,0x1567,0,0,0x1667,0,0, -0x1767,0,0,0x1867,0,0,0x1967,0,0,0x1a67,0,0,0x1b67,0,0,0x1d67, -0,0,0x1f67,0,0,0x2067,0,0,0x2267,0,0,0x2367,0,0,0x2467,0, -0,0x2567,0,0,0x2767,0,0,0x2867,0x80000,0x20,0x2967,0,0,0x2a67,0,0x1600000, -0x2b67,0,0,0x2d67,0,0,0x3067,0x20000000,0,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67, -0,0,0x3b67,0,0,0x3c67,0,0,0x3e67,0,0,0x4067,0,0,0x4167,0, -0,0x4367,0,0,0x4467,0,0,0x4867,0,0,0x4967,0,0,0x4a67,0,0, -0x5067,0,0,0x5167,0,0,0x5467,0,0,0x5567,0,0,0x5667,0x80000,0x20,0x5767, -0,0,0x5867,0,0,0x5967,0,0,0x5b67,0,0,0x5c67,0,0,0x5d67,0, +static const uint32_t propsVectors[6279]={ +0x67,0,0,0x67,0,0x200000,0x67,0,0x230400,0x67,0,0x230560,0x67,0,0x400000,0x67, +0,0x448000,0x67,0,0x500000,0x67,0,0x962460,0x67,0,0x962540,0x67,0,0xe00000,0x67,0, +0xe30000,0x67,0,0x1329800,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67,0,0, +0xc67,0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1067,0,0x200000,0x1067, +0,0x230400,0x1167,0,0,0x1267,0,0,0x1267,0,0x962460,0x1367,0,0,0x1467,0, +0,0x1567,0,0,0x1667,0,0,0x1767,0,0,0x1767,0,0x962460,0x1867,0,0, +0x1967,0,0,0x1a67,0,0,0x1b67,0,0,0x1d67,0,0,0x1f67,0,0,0x2067, +0,0,0x2267,0,0,0x2367,0,0,0x2467,0,0,0x2567,0,0,0x2767,0, +0,0x2867,0x80000,0x20,0x2967,0,0,0x2a67,0,0x1600000,0x2b67,0,0,0x2d67,0,0, +0x3067,0x20000000,0x200000,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67,0,0,0x3b67,0,0,0x3c67, +0,0,0x3e67,0,0,0x4067,0,0,0x4067,0,0xe30400,0x4167,0,0,0x4367,0, +0,0x4467,0,0,0x4867,0,0,0x4967,0,0,0x4a67,0,0,0x5067,0,0, +0x5167,0,0,0x5467,0,0,0x5567,0,0,0x5667,0x80000,0x20,0x5767,0,0,0x5867, +0,0,0x5867,0,0x230400,0x5967,0,0,0x5b67,0,0,0x5c67,0,0,0x5d67,0, 0,0x6067,0x80000,0x20,0x6267,0,0,0x6367,0,0,0x6467,0,0,0x6567,0,0, -0x6f67,0,0,0x7067,0,0,0x7367,0x20000000,0,0x7567,0,0,0x7667,0,0,0x7767, -0,0,0x7867,0,0,0x7a67,0,0,0x7b67,0,0,0x7c67,0,0,0x7e67,0, -0,0x7f67,0,0,0x8167,0,0,0x8267,0,0,0x8367,0,0,0x8467,0,0, -0x8567,0,0,0x8667,0,0,0x8767,0,0,0x8867,0,0,0x8967,0,0,0x8b67, -0,0,0x8c67,0,0,0x8e67,0x20000000,0,0x8f67,0,0,0x9067,0,0,0x9167,0, -0,0x9267,0,0,0x9367,0,0,0x9567,0,0,0x9667,0,0,0x9767,0,0, -0x9867,0,0,0x9967,0,0,0x9a67,0,0,0x9c67,0,0,0x9f67,0,0,0xa167, -0,0,0xa367,0,0,0xa467,0,0,0xa567,0,0,0xa667,0,0,0xa767,0, -0,0xa867,0,0,0xa967,0,0,0xaa67,0,0xe00000,0xab67,0,0xe00000,0xac67,0,0, -0xad67,0,0,0xae67,0,0,0xaf67,0,0,0xb167,0,0,0xb267,0,0,0xb367, -0,0,0xb467,0,0,0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0, -0,0xba67,0,0,0xbc67,0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0, -0xc067,0,0,0xc167,0,0,0xc267,0,0,0xc367,0,0xe00000,0xc467,0,0xe00000,0xc667, -0,0,0xc767,0,0,0xc867,0,0,0xc967,0,0,0xca67,0,0,0xcb67,0, -0,0xcc67,0,0xe00000,0xcf67,0,0xe00000,0xd067,0,0xe00000,0xd267,0,0,0xd367,0,0, -0xd467,0,0,0xd567,0,0,0xd667,0,0,0xd867,0,0,0xd967,0,0,0xda67, -0,0,0xdb67,0,0,0xdc67,0,0,0xdd67,0,0,0xde67,0,0,0xdf67,0, -0,0xe067,0,0,0xe167,0,0,0xe267,0,0,0xe367,0,0xe00000,0xe467,0,0, -0xe567,0,0,0xe667,0,0,0xe767,0,0,0xe867,0,0,0xe967,0,0,0xea67, -0,0,0xeb67,0,0,0xec67,0,0,0xed67,0,0,0xee67,0,0,0xef67,0, -0,0xf167,0,0,0xf367,0,0,0xf567,0,0,0xf667,0,0,0xf767,0,0, -0xf867,0,0,0xf967,0,0,0xfa67,0,0xe00000,0xfb67,0,0,0xfc67,0,0,0xfd67, -0,0,0xfe67,0,0,0x10167,0,0,0x10267,0,0,0x10367,0,0,0x10467,0, -0,0x10567,0,0xe00000,0x10667,0,0,0x10767,0,0,0x10867,0,0,0x10967,0,0, -0x10a67,0,0,0x10b67,0,0,0x10c67,0,0,0x10d67,0,0,0x10e67,0,0,0x10f67, -0,0,0x11067,0,0,0x11167,0,0,0xa0067,0,0xe00000,0xa4667,0,0xe00000,0xa4767,0, -0xe00000,0xa4f67,0,0xe00000,0xa5e67,0,0xe00000,0xa5f67,0,0xe00000,0xac567,0,0xe00000,0xad167,0,0xe00000, -0xb0067,0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100, -0x40000001,0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x10200000,0x11000200,0x24000008, -0x1710000,0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402, -0x11000319,0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419, -0x7c00100,0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100, -0x230400,0x11000600,0x4000400,0x200000,0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x201000,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400, -0x11000600,0x7c00500,0x530400,0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800, -0x6800010,0x201001,0x11000800,0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400, -0x200002,0x1100080e,0x7000500,0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400, -0x1100080e,0x7c00100,0x250401,0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908, -0x7c00100,0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100, -0x220400,0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000,0x200000, -0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800,0x11000c00, -0,0x218960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02,0x4000000, -0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100,0x230402, -0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000c02,0xc000010,0xb48000,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460,0x11000f0a, -0x2806400,0x962460,0x11000f0a,0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004,0x2802100, -0x962460,0x11001004,0x2802400,0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100,0x962540, -0x11001004,0x6800100,0x962541,0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460,0x11001110, -0x2806400,0x962460,0x11001110,0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f,0x2802400, -0x962460,0x1100120f,0x2806400,0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400,0x962460, -0x1100131f,0x2806400,0x962460,0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541,0x1100131f, -0x7c00100,0x230400,0x1100131f,0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423,0x6800100, -0x962541,0x11001423,0x7c00100,0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400,0x962460, -0x11001524,0x6800000,0x1329800,0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460,0x11001615, -0x6800000,0x1329800,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400, -0x962460,0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000, -0x11001926,0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926, -0x6800000,0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100, -0x1862460,0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002, -0x11001a18,0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12, -0x7c00100,0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400, -0x200001,0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820, -0x11002800,0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x440001,0x11002800,0x4000001,0x440002,0x11002800,0x4000001,0xc4000b,0x11002800, -0x6800000,0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000, -0x1410000,0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000, -0x11002800,0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x11248002,0x11002800, -0x40000001,0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0x2a65620,0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000, -0x20000f,0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e, -0x11002900,0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00, -0x4000000,0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000, -0x20000f,0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402, -0x11002c00,0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00, -0x4000000,0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020, -0x200000,0x11002e00,0x24000020,0x200001,0x11002e00,0x24000020,0x10200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002, -0x11002f00,0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x10200000,0x11003000, -0x24000020,0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020,0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000, -0x100003,0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000,0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000,0x10200000, -0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700,0x24000000,0x10200000,0x11003700,0x24000000,0x10e00000,0x11003700, -0x24000000,0x928045a0,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000, -0xe00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x10200000,0x11003800,0x24000000,0x10b00000,0x11003800,0x24000000,0x10e00000,0x11003800,0x24000000,0x10e05200, -0x11003800,0x24000000,0x928045a0,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801,0x11005013, -0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102,0x7000100, -0x230408,0x11005102,0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460, -0x11005500,0x80000,0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502, -0x7c00100,0x230409,0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400, -0x100002,0x11020200,0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000,0x1500000, -0x11020200,0x24000000,0x1600000,0x11020200,0x24000000,0x10200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219, -0x7c00100,0x220400,0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100, -0x220402,0x11020319,0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400, -0x11020600,0x4000400,0x100002,0x11020600,0x4000400,0x200000,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701, -0x2802400,0x962461,0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100, -0x220401,0x11020908,0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002, -0x11022800,0x24000000,0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800, -0x24000002,0x370000,0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020, -0x100000,0x11022800,0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f, -0x11022c00,0x4000000,0x100002,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1010000f,0x11022c00,0x7c00120,0x120405,0x11022c0e, -0x7c00100,0x250401,0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100, -0x150402,0x11022e00,0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022e00,0x24000020,0x10100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001, -0x11022f00,0x24000020,0x100002,0x11023000,0x24000000,0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300, -0x4000100,0x150403,0x11023300,0x4000100,0x10150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020, -0x100000,0x11023600,0x24000020,0x10100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700,0x24000000,0x10100000,0x11023700,0x24000000,0x10e00000, -0x11023700,0x24000020,0x100000,0x11023700,0x24000020,0x10100000,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67,0,0,0x11025600, -0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100,0xe3040a,0x11045712,0x7c80100, -0xe3040a,0x11045716,0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x440011,0x11065700,0x4000000,0x810011,0x11065700,0x4000000,0xe00011, -0x11065700,0x4000000,0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700,0x4000008,0xe00011,0x11065700, -0x4000008,0xe02c11,0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020,0xe00011,0x11065700,0x4000400, -0xe00011,0x11065700,0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe00011,0x11065700,0xc000010,0x80ac11,0x11065700,0xc000010,0xb48011, -0x11065719,0x7c00100,0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100,0x6800000,0x201c00,0x11080100, -0x68000c0,0x11329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,0x1500000,0x11080100,0x24000000, -0x1600000,0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x10200000,0x11080100,0x24000006,0xd70000,0x11080100,0x24000008,0x1713c00, -0x11080100,0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100,0x24000020,0x200000,0x11080100, -0x24000020,0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010,0xb48000,0x11080100,0x2c000010, -0x100ac00,0x11080100,0x44000001,0x1a40000,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400,0x11080119,0x7c001c0,0x250400, -0x11080200,0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200,0x24000020,0x200000,0x110a1e12, -0x7c00100,0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x30e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001,0x110a3700,0x24000000, -0x30200000,0x110a3d00,0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002,0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300,0xe30000,0x110a3d11,0x7c00900,0x1230400, -0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000,0x110a3e14,0x7c00900,0x1230000,0x110a3e14, -0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16,0x7c00900,0x1230c00,0x110a3f16,0x7c00900, -0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000,0xe00000,0x110a4412,0x4000000,0xe00002, -0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d,0x110a4711,0x7c40300,0xe30000,0x110a4f11, -0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300,0x4000000,0xe00010,0x110a5300,0x4000000, -0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000,0xe01c02,0x110a5300,0x6800000,0xe01c10, -0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c,0x110a5400,0x4000000,0x160000c,0x110a5400, -0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400,0x4000010,0x127100c,0x110a5400,0x4000020, -0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c,0x11400a0c,0xc000010,0x1049400,0x11400c0e,0x4000010,0xb00000, -0x11400c0e,0x4000010,0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c11,0x7c00900,0x230400,0x11400f34,0xc000010,0x448000,0x11400f44,0xc000010,0x448000,0x11401d70, -0x4000000,0x200000,0x11403d92,0x4000000,0xe00000,0x11445787,0x4000004,0x120000a,0x11445787,0x4000008,0x81000a,0x11445787,0x4000008,0x141000a,0x11445787,0x4000010, -0x87000a,0x11445787,0xc000010,0x84800a,0x11445790,0x3802500,0x126246a,0x11445790,0x7c00d00,0x2530c0a,0x114a3d87,0x24000000,0x810000,0x114a3d87,0x24000000,0x1410000, -0x114a3d87,0x24000008,0x810000,0x114a3d87,0x24000008,0x1410000,0x114a3d87,0x24000010,0x870000,0x114a3d87,0x2c000010,0x848000,0x114a3d8d,0x4000000,0xe00000,0x114a3d8d, -0x24000000,0xe00000,0x114a3d8d,0x24000002,0x1200000,0x114a3d8d,0x24000002,0x10e00000,0x114a3d8d,0x24000008,0x810000,0x114a3d8d,0x24000008,0x1410000,0x114a3d90,0x7c00900, -0x930c00,0x114a3d90,0x7c00900,0xe30c00,0x114a3d92,0x7c00300,0xe30000,0x114a3e90,0x7000400,0x1200c02,0x114a3f87,0x4000004,0x1200000,0x114a3f90,0x7c00d00,0x2530c00, -0x114a4292,0x4000000,0xe00000,0x114a4292,0x4000000,0xe0000f,0x114a4492,0x4000000,0xe00002,0x114a4492,0x4000000,0xe00003,0x114a4492,0x4000000,0x10e00003,0x114a4592, -0x4000000,0xe00002,0x114a4592,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c17,0x2802100,0x962460,0x11800c17,0x2802500,0x962460,0x11800f1d,0x2802400, -0x962460,0x11800f29,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3d93,0x2802400,0x962460,0x118a3e90,0x2802400,0x962460, -0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c1b,0x6800000,0x1329800,0x11c00f58,0x6800000,0x1329800,0x11c0105d,0x6800000,0x1329800,0x11c01161, -0x6800000,0x1329800,0x11c01265,0x6800000,0x1329800,0x11c01469,0x4000000,0x200000,0x11c01469,0x6800000,0x1329800,0x11c01469,0x7c00100,0x230400,0x11c0511b,0x7c00100, -0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460,0x20001b27,0x2802100,0x962461, -0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27,0x4000000,0x400000,0x20001b27, -0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000,0x1410000,0x20001b27,0x4000010, -0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540,0x20001b27,0x7c00100,0x230400, -0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900020,0x20004c67,0,0x1900020,0x20004d67, -0,0x1900020,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,0,0x200a4a12,0x7c00100, -0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400,0x30000419,0x7c00100,0x220401, -0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200000,0x30000600,0x7c00500,0x230400,0x30000605, -0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100,0x220401,0x30000908,0x7c00100, -0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400,0x30000d22,0,0x218960, -0x30000d22,0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22, -0x7c00100,0x230400,0x30000d22,0xc000010,0x248000,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100,0x962460,0x30001821,0x2806400, -0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400,0x30001b27,0x2802100,0x962460, -0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c,0x2802100,0x1862460,0x30001c1c, -0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100,0x1862540,0x30001c1c,0x7c00100, -0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000,0x30001f0b,0x4000010,0x400000, -0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128,0x4000010,0x200000,0x30002128, -0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,0x440000,0x3000221d,0x7c00100, -0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460,0x30002417,0x2806400,0x1862460, -0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417,0x4000010,0x400000,0x30002417, -0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100,0x1830000,0x3000251b,0x80000, -0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000,0x3000251b,0x4000010,0x400000, -0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b,0x7c00900,0x230400,0x3000251b, -0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x4000001,0xc41c0b,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010,0x1248002,0x30002800,0x2c000010, -0x11248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x10220405,0x30002d19,0x7c00100,0x250400, -0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000,0x200000,0x3000392e, -0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500000,0x30020701,0x2802400,0x962460,0x30020701,0x2802400, -0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000,0xe00000,0x300a3c00,0x4010000,0xe00000, -0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400,0x300a4829,0x7c00900,0x1230400,0x300a4929, -0x4000000,0xe00000,0x30402576,0x4000010,0x400000,0x30402576,0x4000010,0xb70000,0x30402576,0xc000010,0xb48000,0x304a3d92,0x4000000,0xe00000,0x30800c17,0x2802100, -0x962460,0x30c01c6e,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,0x250402,0x31005167,0x1000,0,0x3100581e,0x4000000,0x200000, -0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000,0x200000,0x31005c00, -0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,0x4000000,0x200000,0x31005c00,0x4000000,0x200001,0x31005c00,0x6800000, -0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00,0x7c00120,0x220405, -0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x962460,0x31006000,0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300,0xe30001,0x32000419, -0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,0x7c00100,0x250400,0x32000908,0x7c00100,0x220400,0x32000908,0x7c00100, -0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,0x230400,0x32002800,0x80000,0x1e18820,0x32002800,0x80020,0x218820, -0x32002800,0x4000001,0x440002,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x200002,0x32002800,0x24000020,0x200000,0x32002800,0x2c000010,0x1248002,0x32002919, -0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,0x2802000,0x962460,0x32002b01,0x2802020,0x962460,0x32002c00,0x4000000, -0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00,0x24000020,0x200000, -0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,0x32003500,0x24000000,0x200000,0x32003600,0x24000020,0x200000,0x32003600, -0x24000020,0x10200000,0x32003700,0x24000000,0x100000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x10200000,0x32003800,0x24000000,0x810000,0x32003800,0x24000000, -0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a,0x2802100,0x962460, -0x3200622a,0x2806000,0x962460,0x3200622a,0x7c00100,0x230400,0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460,0x3200632b,0x7c00100,0x230400,0x3200642c, -0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000,0x32006700,0x24000020, -0x200000,0x32006800,0x24000020,0x200000,0x32006800,0x24000020,0x10200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020,0x810000,0x32006900,0x24000020,0x1410000, -0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460,0x32023300,0x4000000,0x100000,0x32026c01, -0x12882000,0x962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000,0x32086900,0x24000020, -0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x30200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14,0x7c00100,0x2530000, -0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100,0x2530c00,0x32406372, -0xc000010,0x448000,0x324a3d95,0x4000000,0x10e00000,0x324a3d95,0x7c00100,0x1230400,0x324a3f90,0x4000002,0x1200c00,0x324a538d,0x24000000,0xe00000,0x32820701,0x2802000, -0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200000,0x4000080e,0x7c00100,0x220400,0x4000080e,0x7c00100,0x250400, -0x4000080e,0x7c00100,0x250402,0x40000c02,0,0x218960,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02, -0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,0x40000d22,0x7c00100,0x230400,0x40000f0a,0x7c00100,0x230400,0x40001004,0x7c00100, -0x230400,0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000,0x1600000,0x4000120f,0x7c00100,0x230400, -0x4000131f,0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460,0x40001615,0x7c00100,0x230400,0x40002417, -0x2802400,0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00,0x4000000,0x200002,0x40003000,0x24000000, -0x10200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x10200000,0x40005a09,0x7c00100,0x220400,0x40005a09,0x7c00100,0x250400, -0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30,0x6800000,0x1329800,0x40006f30, -0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000,0x200000,0x40007208,0x7c00100, -0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400,0x40007219,0x7c00500,0x220400, -0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x10200000,0x40007400,0x4000000,0x200000,0x40007531, -0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400,0x40007a32,0x6800000, -0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701,0x2802400,0xc62460, -0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x30200000,0x400a3700,0x24000000,0x30e00000,0x400a4400,0x4000000,0xe0000d,0x400a4412, -0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010,0x404077b8,0x4000000, -0x200000,0x404077bb,0x4000000,0x200000,0x404077bb,0x4000000,0x400000,0x40c0511b,0x4000000,0x200000,0x41000419,0x7c00100,0x220400,0x41000419,0x7c00100,0x250400, -0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,0x250400,0x41000b13,0x2802000,0x962460,0x41000b13, -0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0xb00000,0x41000c02,0x4000000,0x1500000,0x41000f0a,0x7c00100, -0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100,0x230400,0x41001d0c,0x7c00100,0x23040f, -0x41001f0b,0x2802100,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,0x200000,0x41002800,0x24000000,0x400000,0x41002919, -0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,0x41002c00,0x7c00120,0x220405,0x41003000,0x24000000, -0x200000,0x41003700,0x24000000,0x200000,0x41003700,0x24000000,0x10200000,0x41003700,0x24000000,0x10e00000,0x41005d00,0x7c00120,0x220405,0x41006600,0x24000020,0x200000, -0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100,0x220400,0x41007300,0x24000000,0x200000,0x41007e0e, -0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400,0x41008002,0x7c00100,0x230400,0x41008137,0x2802100, -0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301,0x2802000,0x962460,0x41008407,0x4000000,0x200000, -0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100,0x250400,0x4100850b,0x7c00100,0x230400,0x4100860b, -0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400,0x41008838,0x7c00100,0x250400,0x41008939,0x2802000, -0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939,0x4000000,0x400000,0x41008939,0x7c00100,0x230400, -0x41008939,0xc000010,0x448000,0x41008a00,0x4000000,0x200000,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000,0x1329800,0x41008b3b,0x7c00100,0x1830000,0x41008b3b, -0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f,0x41008d19,0x7c00100,0x220400,0x41008d19,0x7c00100, -0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00,0x24000006,0x400000,0x41008f3a,0x2802000,0x962460, -0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100,0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c, -0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460,0x410a3700,0x24000000,0x30200000,0x410a3700,0x24000000, -0x30e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100,0x4000000,0x800010,0x410a9100,0x4000000,0x810010, -0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000,0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100, -0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a8292,0x4000000,0xe00000,0x41808300,0x2802000,0x962460,0x41c01469,0x6800000,0x1329800,0x50000419,0x7c00100, -0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908,0x7c00100,0x250400,0x50000b13,0x2802500,0x962460, -0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020,0x962460,0x50002c00,0x4000000,0x200000,0x50002c19, -0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000,0x50003700,0x24000000,0x200000,0x50005d00,0x7c00120, -0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600,0x24000020,0x200000,0x50007300,0x24000000,0x200000, -0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000,0x200000,0x50009257,0x4000010,0x1071400,0x50009257, -0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400,0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100, -0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000,0x400000,0x5000933e,0x4000010,0x400000,0x5000933e,0x6800000,0x1329800, -0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540,0x5000933e,0x7c00100,0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e, -0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200000,0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100, -0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b,0x7c00100,0x230400,0x50009865,0x7c00100,0x230400, -0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409a92,0x4000000,0x200000,0x5100080e,0x7c00100,0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02, -0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400,0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500, -0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524,0x2802100,0x962460,0x51001524,0x4000000,0x200000, -0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000,0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27, -0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400,0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802400, -0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c,0x6800000,0x1862400,0x51001c1c,0x6800100,0x1862400, -0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800400,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100,0x230400,0x51002619,0x7c00100,0x220400,0x51002619, -0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400,0x51003700,0x24000000,0x200000,0x51003700,0x24000000, -0xe00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108,0x7c00100,0x250400,0x51006600,0x24000020,0x200000, -0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020,0x200000,0x51008002,0x7c00100,0x230400,0x51008301, -0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000,0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000, -0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00,0x24000002,0x200000,0x51008e00,0x24000500,0x230400, -0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100,0x22040f,0x51009419,0x7c00100,0x250400,0x51009500, -0x4000000,0x200000,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f,0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100, -0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71,0x6804400,0x962540,0x51009b71,0x7c00100,0x230400, -0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802c00,0x962460,0x51009c52,0x4000010,0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52, -0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800,0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500, -0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63,0x4000010,0x400000,0x51009f63,0x6800000,0x1329800, -0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010,0xb48000,0x5100a008,0x2000,0x962460,0x5100a008, -0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400,0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500, -0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f,0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000, -0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100,0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e, -0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540,0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100, -0x962460,0x5100a442,0x4000000,0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100,0x962540,0x5100a442,0x7c00100,0x230400,0x5100a442,0xc000010,0x448000, -0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b,0x7c00100,0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c, -0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0xe00000,0x5100ab00,0x4000000,0xe00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020, -0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x30200000,0x510aaa00,0x4000000,0x30e00000,0x5140a2b3,0x4000400,0x400000, -0x514a8292,0x4000000,0xe00000,0x51802b84,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008,0x2802400,0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a, -0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000,0x200000,0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100, -0x1862400,0x52001c1c,0x6800400,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520,0x52002128,0x4000002,0x400000,0x52002128,0x7c00100,0x230400, -0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000,0x24000000,0x200000,0x52006108,0x7c00100,0x220400,0x52006108, -0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100,0x220400,0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000, -0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400,0x5200975b,0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460, -0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e,0x7c00100,0x230400,0x5200ad28,0x7c00100,0x230400,0x5200ae6a, -0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,0x5200ae6a,0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000, -0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,0x7c00100,0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000, -0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,0x448000,0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182, -0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,0x5200b30a,0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100, -0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,0x4000000,0x200000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800, -0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,0x230400,0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c, -0x6800400,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,0x5200b77f,0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000, -0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,0x7c00500,0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000, -0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,0x1329800,0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873, -0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,0x5200b912,0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010, -0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,0x7c00100,0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000, -0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,0x230400,0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58, -0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0,0x218960,0x5200c178,0x2802000,0x962460,0x5200c178,0x2802100,0x962460,0x5200c178,0x2802400, -0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178,0x7c00100,0x230400,0x5200c178,0x7c00100,0x230401, -0x5200c178,0xc000010,0x448000,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247,0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00, -0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700,0x24000000,0x10100000,0x52023700,0x24000000,0x10e00000,0x52023700,0x24000000, -0x928045a0,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000,0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003, -0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d,0x5202c300,0x4000100,0x10150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700, -0x24000000,0x30e00000,0x520a3800,0x24000000,0x30100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001,0x520a7300,0x24000000,0x30100000,0x520ab412,0x7c00100, -0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000,0x30e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000, -0x5240af78,0x6800400,0x962540,0x5240af78,0x7c00100,0x230400,0x5240af79,0x4000400,0x200000,0x5240af79,0x6800100,0x962540,0x5240b298,0x4000000,0x200000,0x5240b2a2, -0x4000000,0x200000,0x5240b2a2,0x4000000,0x1500000,0x5240b5b6,0x7c00900,0x230400,0x524a4492,0x4000000,0xe00003,0x5280af78,0x2802400,0x962460,0x5280af79,0x2802400, -0x962460,0x5280af7b,0x2802400,0x962460,0x5280af7d,0x2802400,0x962460,0x52c0b3ad,0x2802400,0x962460,0x52c0b3b1,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460, -0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a,0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,0x6000171a, -0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000,0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802000, -0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x10200000,0x60003000,0x24000000,0x10e00000,0x60003700,0x24000000,0x200000, -0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108,0x7c00100,0x250400,0x60006600,0x24000020,0x200000,0x60008301, -0x2802000,0x962460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100,0x220400,0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100, -0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x32703580,0x6000c654,0x2802000,0x962460,0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100,0x230400, -0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f,0x6800100,0x962540,0x6000c73f,0x6804000,0x962540,0x6000c73f, -0x7c00100,0x230400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806000,0x962460,0x6000c941,0x4000000,0x200000,0x6000c941,0x4000010, -0x200000,0x6000c941,0x6800000,0x1329800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x230400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400, -0x6000cc00,0x4000000,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300, -0x4000100,0x15040d,0x6002c300,0x4000100,0x10150400,0x600a3000,0x24000000,0x30200000,0x600a3000,0x24000000,0x30e00000,0x600a3700,0x24000000,0x30200000,0x600a3800,0x24000000, -0x30200000,0x600a3800,0x24000000,0xb28045a0,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x30100000,0x600ac400,0x4000000,0x10e0000d,0x600ac400,0x4000000,0x30e0000d, -0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x30e00000,0x600acd00,0x4000000,0x30200000,0x600acd00,0x4000000,0x30e00000,0x600acd00, -0x4000000,0x30e05200,0x600acd00,0x4000000,0xb0e00000,0x600acd00,0x4000000,0xb28045a0,0x600acd00,0x4000000,0xb28049c0,0x600ace00,0x4000000,0x30e00000,0x600ace00,0x4000000, -0xb28045a0,0x600acf00,0x4000000,0x30e00000,0x600acf00,0x4000000,0xb28045a0,0x600ad111,0x7c40300,0xe30000,0x604ac492,0x4000000,0x30e00003,0x61000a03,0x4000000,0x1600000, -0x61000c02,0,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,0x1830000,0x61001d0c,0x7c00100,0x230400,0x61001d0c,0x7c00100,0x250400,0x61006600, -0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,0x6100870c,0x7c00100,0x220400,0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000, -0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,0x7c00100,0x220400,0x61009519,0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f, -0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,0x230400,0x6100a008,0x2802100,0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00, -0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,0x6100d202,0x7c00100,0x230400,0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120, -0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,0x2806400,0x962460,0x6100d476,0x4000000,0x400000,0x6100d476,0x6800000,0x1329800, -0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,0x448000,0x6100d573,0x2802100,0x962460,0x6100d573,0x2806400,0x962460,0x6100d573, -0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,0x6100d573,0xc000010,0x448000,0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100, -0x230400,0x6100d85c,0x2802400,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,0x7c00100,0x230400,0x6100d85c,0x7c00500,0x230400,0x6100d997,0x2802100,0x962460, -0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,0x1329800,0x6100d997,0x6800100,0x962540,0x6100d997,0x6804400,0x962540,0x6100d997, -0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,0x6100da98,0x6800000,0x1329800,0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000, -0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,0x6800000,0x1329800,0x6100dc99,0x6800100,0x962540,0x6100dc99,0x6804400,0x962540, -0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,0xe30001,0x610ace00,0x4000000,0x30e00000,0x6140af78,0x7c00100,0x230400,0x6140af79, -0x6800100,0x962540,0x6140af82,0x7c00100,0x230400,0x6180af79,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000,0x63000c00,0x80000,0x918820,0x63002800,0x80000, -0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0,0x218960,0x70000f0a,0x7c00100,0x230400,0x70001004,0x7c00100,0x230400, -0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460,0x7000171a,0x2802100,0x962460,0x70001821,0x6800000,0x1329800,0x70002320, -0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000,0x24000000,0x200000,0x70003000,0x24000000,0x10200000,0x70003800,0x24000000, -0xe00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108,0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400, -0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400,0x962460,0x70008e00,0x24000000,0x200000,0x70008e00, -0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000,0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100, -0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965,0x4000010,0x400000,0x70009965,0x7c00100,0x230400, -0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000,0x200000,0x7000b61c,0x2802400,0x1862460,0x7000b61c, -0x6800400,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0x962460,0x7000cc00,0x4000000,0xe00000,0x7000cd00,0x4000000, -0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x10200000,0x7000cd00,0x4000000,0x10e00000,0x7000cd00,0x4000000,0x10e05200,0x7000cd00,0x4000000,0x90e00000, -0x7000cd00,0x4000000,0x928045a0,0x7000cf00,0x4000000,0xe00000,0x7000cf00,0x4000000,0x10e00000,0x7000d202,0x2802100,0x962460,0x7000d202,0x7c00100,0x230400,0x7000d997, -0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86,0xc000010,0x448000,0x7000de9f,0x4000000, -0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000,0x962460,0x7000e187,0x2802100,0x962460, -0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400,0x7000e300,0x4000000,0x200000,0x7000e489, -0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489,0x6804400,0x962540,0x7000e489,0x7c00100, -0x230400,0x7000e489,0x7c00900,0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d,0x4000010,0x200000, -0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100,0x962460,0x7000e691, -0x2802400,0x962460,0x7000e691,0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400,0x7000e700,0x4000400, -0x200000,0x7000e70e,0x7c00100,0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0,0x2802400,0x962460, -0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000,0x200000,0x7000ea79, -0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000,0x7000eb8c,0x7c00100, -0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3,0x6800100,0x962540, -0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010,0x448000,0x7000ee1c, -0x2802400,0x1862460,0x7000ee1c,0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000,0x7000ef8f,0x7c00100, -0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200,0x4000000,0x200000, -0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802100,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010,0x400000,0x7000f34b, -0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000,0x7000f490,0x7c00100, -0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6,0x2802100,0x962460, -0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800,0x200000,0x7000f8a6, -0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000,0x7000fa00,0x4000000, -0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e,0x6800000,0x1329800, -0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000,0x1329800,0x7000fc92, -0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x30e00000,0x700acd00,0x4000000,0xb28045a0,0x700ace00,0x4000000, -0x30e00000,0x700acf00,0x4000000,0x30e00000,0x700acf00,0x4000000,0xb0e00000,0x7040dfbd,0x4000000,0x200000,0x7040f7c1,0x80000,0x918820,0x7080af79,0x2802400,0x962460, -0x7080dfbd,0x2802400,0x962460,0x70c0e4bf,0x2802400,0x962460,0x70c0e4bf,0x6800100,0x962540,0x8000120f,0x7c00100,0x230400,0x80001524,0x7c00100,0x230400,0x8000171a, -0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,0x80002d00,0x4000000,0x200000,0x80005208,0x2802400, -0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,0x7c00100,0x230400,0x80009519,0x7c00100,0x250400, -0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,0x230400,0x8000cd00,0x4000000,0xe00000,0x8000d202, -0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460,0x8000d997,0x4000000,0x200000,0x8000d997,0x4000000, -0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,0x2802100,0x962460,0x8000e489,0x7c00100,0x230400, -0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,0x448000,0x8000fda1,0x2802100,0x1862460,0x8000fda1, -0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540,0x8000fda1,0x7c00100,0x1830000,0x8000fda1,0xc000010, -0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,0x7c00100,0x220400,0x80010165,0x7c00100,0x230400, -0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,0x448000,0x8001044c,0x4000000,0x200000,0x8001044c, -0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670,0x4000010,0x400000,0x80010670,0xc000010, -0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x30e00000,0x800acd00,0x4000000,0x72904de0,0x800ace00,0x4000000,0x30e00000,0x800acf00,0x4000000,0x30e00000, -0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,0x90001615,0x7c00100,0x230400,0x9000171a,0x4000000,0x200000,0x9000171a, -0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460,0x90008e00,0x24000000,0x400000,0x90009519,0x7c00100, -0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202,0x2802100,0x962460,0x9000d202,0x7c00100,0x230400, -0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00,0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7, -0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460,0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000, -0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8,0x6800100,0x962540,0x900108a8,0x7c00100,0x230400, -0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100,0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9, -0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000,0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400, -0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa,0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800, -0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100,0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300, -0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x30e00000,0x900acd00,0x4000000,0xb28045a0,0x900acf00,0x4000000,0x30e00000,0x900b0500,0x4000000, -0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000, -0x90408e06,0x24000000,0x400000}; +0x6f67,0,0,0x7067,0,0,0x7367,0x20000000,0,0x7367,0x20000000,0x200000,0x7567,0,0,0x7667, +0,0,0x7767,0,0,0x7867,0,0,0x7a67,0,0,0x7b67,0,0,0x7c67,0, +0,0x7e67,0,0,0x7f67,0,0,0x8167,0,0,0x8267,0,0,0x8367,0,0, +0x8367,0,0x962460,0x8467,0,0,0x8567,0,0,0x8667,0,0,0x8767,0,0,0x8867, +0,0,0x8967,0,0,0x8b67,0,0,0x8c67,0,0,0x8e67,0x20000000,0,0x8e67,0x20000000, +0x400000,0x8f67,0,0,0x9067,0,0,0x9167,0,0,0x9267,0,0,0x9367,0,0, +0x9567,0,0,0x9667,0,0,0x9767,0,0,0x9867,0,0,0x9967,0,0,0x9a67, +0,0,0x9c67,0,0,0x9f67,0,0,0xa167,0,0,0xa367,0,0,0xa467,0, +0,0xa567,0,0,0xa667,0,0,0xa767,0,0,0xa867,0,0,0xa967,0,0, +0xaa67,0,0xe00000,0xab67,0,0xe00000,0xac67,0,0,0xad67,0,0,0xae67,0,0,0xaf67, +0,0,0xaf67,0,0x962540,0xb167,0,0,0xb267,0,0,0xb367,0,0,0xb467,0, +0,0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0,0,0xba67,0,0, +0xbc67,0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0,0xc067,0,0,0xc167, +0,0,0xc267,0,0,0xc367,0,0xe00000,0xc467,0,0xe00000,0xc667,0,0,0xc767,0, +0,0xc867,0,0,0xc967,0,0,0xca67,0,0,0xcb67,0,0xe30000,0xcc67,0,0xe00000, +0xcf67,0,0xe00000,0xcf67,0,0x30e00000,0xd067,0,0xe00000,0xd267,0,0,0xd367,0,0,0xd467, +0,0,0xd567,0,0,0xd667,0,0,0xd867,0,0,0xd967,0,0,0xda67,0, +0,0xdb67,0,0,0xdc67,0,0,0xdd67,0,0,0xde67,0,0,0xdf67,0,0, +0xe067,0,0,0xe167,0,0,0xe267,0,0,0xe367,0,0xe00000,0xe467,0,0,0xe567, +0,0,0xe667,0,0,0xe767,0,0,0xe867,0,0,0xe967,0,0,0xea67,0, +0,0xeb67,0,0,0xec67,0,0,0xed67,0,0,0xee67,0,0,0xef67,0,0, +0xf167,0,0,0xf367,0,0,0xf567,0,0,0xf667,0,0,0xf767,0,0,0xf867, +0,0,0xf967,0,0,0xfa67,0,0xe00000,0xfb67,0,0,0xfc67,0,0,0xfd67,0, +0,0xfe67,0,0,0x10167,0,0,0x10267,0,0,0x10367,0,0,0x10467,0,0, +0x10567,0,0x200000,0x10567,0,0xe00000,0x10567,0,0x30e00000,0x10567,0,0xb28045a0,0x10667,0,0,0x10767, +0,0,0x10867,0,0,0x10967,0,0,0x10a67,0,0,0x10b67,0,0,0x10b67,0, +0x1230400,0x10c67,0,0,0x10d67,0,0,0x10e67,0,0,0x10f67,0,0,0x11067,0,0, +0x11167,0,0,0xa0067,0,0xe00000,0xa0067,0,0xe30000,0xa4667,0,0xe00000,0xa4767,0,0xe00000,0xa4767, +0,0xe30000,0xa4f67,0,0xe00000,0xa5e67,0,0xe00000,0xa5f67,0,0xe00000,0xac567,0,0xe00000,0xad167,0, +0xe00000,0xb0067,0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040, +0x11000100,0x40000001,0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x10200000,0x11000200, +0x24000008,0x1710000,0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100, +0x220402,0x11000319,0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402, +0x11000419,0x7c00100,0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519, +0x7c00100,0x230400,0x11000600,0x4000400,0x200000,0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500, +0x230400,0x11000600,0x7c00500,0x530400,0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001, +0x11000800,0x6800010,0x201001,0x11000800,0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e, +0x4000400,0x200002,0x1100080e,0x7000500,0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100, +0x250400,0x1100080e,0x7c00100,0x250401,0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400, +0x11000908,0x7c00100,0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x270000,0x11000a03, +0x7c00100,0x220400,0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000, +0x200000,0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800, +0x11000c00,0,0x218960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02, +0x4000000,0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100, +0x230402,0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000c02,0xc000010,0xb48000,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460, +0x11000f0a,0x2806400,0x962460,0x11000f0a,0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004, +0x2802100,0x962460,0x11001004,0x2802400,0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100, +0x962540,0x11001004,0x6800100,0x962541,0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460, +0x11001110,0x2806400,0x962460,0x11001110,0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f, +0x2802400,0x962460,0x1100120f,0x2806400,0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400, +0x962460,0x1100131f,0x2806400,0x962460,0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541, +0x1100131f,0x7c00100,0x230400,0x1100131f,0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423, +0x6800100,0x962541,0x11001423,0x7c00100,0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400, +0x962460,0x11001524,0x6800000,0x1329800,0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460, +0x11001615,0x6800000,0x1329800,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a, +0x2806400,0x962460,0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000, +0x1600000,0x11001926,0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000, +0x11001926,0x6800000,0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18, +0x2802100,0x1862460,0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100, +0x1830002,0x11001a18,0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500, +0x11001e12,0x7c00100,0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e, +0x4000400,0x200001,0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000, +0x918820,0x11002800,0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x440001,0x11002800,0x4000001,0x440002,0x11002800,0x4000001,0xc4000b, +0x11002800,0x6800000,0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800, +0x24000000,0x1410000,0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008, +0x1410000,0x11002800,0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x11248002, +0x11002800,0x40000001,0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0x2a65620,0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900, +0x4000000,0x20000f,0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020, +0x141000e,0x11002900,0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000, +0x11002a00,0x4000000,0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00, +0x4000000,0x20000f,0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120, +0x230402,0x11002c00,0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006, +0x11002d00,0x4000000,0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00, +0x24000020,0x200000,0x11002e00,0x24000020,0x200001,0x11002e00,0x24000020,0x10200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020, +0x200002,0x11002f00,0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x10200000, +0x11003000,0x24000020,0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020,0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300, +0x4000000,0x100003,0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000,0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000, +0x10200000,0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700,0x24000000,0x10200000,0x11003700,0x24000000,0x10e00000, +0x11003700,0x24000000,0x928045a0,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800, +0x24000000,0xe00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x10200000,0x11003800,0x24000000,0x10b00000,0x11003800,0x24000000,0x10e00000,0x11003800,0x24000000, +0x10e05200,0x11003800,0x24000000,0x928045a0,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801, +0x11005013,0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102, +0x7000100,0x230408,0x11005102,0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400, +0x962460,0x11005500,0x80000,0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408, +0x11005502,0x7c00100,0x230409,0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200, +0x4000400,0x100002,0x11020200,0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000, +0x1500000,0x11020200,0x24000000,0x1600000,0x11020200,0x24000000,0x10200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f, +0x11020219,0x7c00100,0x220400,0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319, +0x7c00100,0x220402,0x11020319,0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100, +0x220400,0x11020600,0x4000400,0x100002,0x11020600,0x4000400,0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460, +0x11020701,0x2802400,0x962461,0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908, +0x7c00100,0x220401,0x11020908,0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000, +0x200002,0x11022800,0x24000000,0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000, +0x11022800,0x24000002,0x370000,0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800, +0x24000020,0x100000,0x11022800,0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100, +0x12040f,0x11022c00,0x4000000,0x100002,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1010000f,0x11022c00,0x7c00120,0x120405, +0x11022c0e,0x7c00100,0x250401,0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19, +0x7c00100,0x150402,0x11022e00,0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022e00,0x24000020,0x10100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020, +0x100001,0x11022f00,0x24000020,0x100002,0x11023000,0x24000000,0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403, +0x11023300,0x4000100,0x150403,0x11023300,0x4000100,0x10150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600, +0x24000020,0x100000,0x11023600,0x24000020,0x10100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700,0x24000000,0x10100000,0x11023700,0x24000000, +0x10e00000,0x11023700,0x24000020,0x100000,0x11023700,0x24000020,0x10100000,0x11023700,0x24000020,0x10105200,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000, +0x11024e67,0,0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712, +0x7c00100,0xe3040a,0x11045712,0x7c80100,0xe3040a,0x11045716,0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x440011,0x11065700,0x4000000, +0x810011,0x11065700,0x4000000,0xe00011,0x11065700,0x4000000,0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011, +0x11065700,0x4000008,0xe00011,0x11065700,0x4000008,0xe02c11,0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700, +0x4000020,0xe00011,0x11065700,0x4000400,0xe00011,0x11065700,0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe00011,0x11065700,0xc000010, +0x80ac11,0x11065700,0xc000010,0xb48011,0x11065719,0x7c00100,0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411, +0x11080100,0x6800000,0x201c00,0x11080100,0x68000c0,0x11329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100, +0x24000000,0x1500000,0x11080100,0x24000000,0x1600000,0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x10200000,0x11080100,0x24000006, +0xd70000,0x11080100,0x24000008,0x1713c00,0x11080100,0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400, +0x11080100,0x24000020,0x200000,0x11080100,0x24000020,0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100, +0x2c000010,0xb48000,0x11080100,0x2c000010,0x100ac00,0x11080100,0x44000001,0x1a40000,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0, +0x220400,0x11080119,0x7c001c0,0x250400,0x11080200,0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000, +0x11080200,0x24000020,0x200000,0x110a1e12,0x7c00100,0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x30e00000,0x110a3000,0x24100000,0x810001,0x110a3000, +0x24100000,0x1410001,0x110a3700,0x24000000,0x30200000,0x110a3d00,0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002,0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300, +0xe30000,0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000, +0x110a3e14,0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16, +0x7c00900,0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000, +0xe00000,0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d, +0x110a4711,0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300, +0x4000000,0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000, +0xe01c02,0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c, +0x110a5400,0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400, +0x4000010,0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c,0x11400a0c,0xc000010, +0x1049400,0x11400c0e,0x4000010,0xb00000,0x11400c0e,0x4000010,0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c11,0x7c00900,0x230400,0x11400f34,0xc000010,0x448000, +0x11400f44,0xc000010,0x448000,0x11401d70,0x4000000,0x200000,0x11403d92,0x4000000,0xe00000,0x11445787,0x4000004,0x120000a,0x11445787,0x4000008,0x81000a,0x11445787, +0x4000008,0x141000a,0x11445787,0x4000010,0x87000a,0x11445787,0xc000010,0x84800a,0x11445790,0x3802500,0x126246a,0x11445790,0x7c00d00,0x2530c0a,0x114a3d87,0x24000000, +0x810000,0x114a3d87,0x24000000,0x1410000,0x114a3d87,0x24000008,0x810000,0x114a3d87,0x24000008,0x1410000,0x114a3d87,0x24000010,0x870000,0x114a3d87,0x2c000010,0x848000, +0x114a3d8d,0x4000000,0xe00000,0x114a3d8d,0x24000000,0xe00000,0x114a3d8d,0x24000002,0x1200000,0x114a3d8d,0x24000002,0x10e00000,0x114a3d8d,0x24000008,0x810000,0x114a3d8d, +0x24000008,0x1410000,0x114a3d90,0x7c00900,0x930c00,0x114a3d90,0x7c00900,0xe30c00,0x114a3d92,0x7c00300,0xe30000,0x114a3e90,0x7000400,0x1200c02,0x114a3f87,0x4000004, +0x1200000,0x114a3f90,0x7c00d00,0x2530c00,0x114a4292,0x4000000,0xe00000,0x114a4292,0x4000000,0xe0000f,0x114a4492,0x4000000,0xe00002,0x114a4492,0x4000000,0xe00003, +0x114a4492,0x4000000,0x10e00003,0x114a4592,0x4000000,0xe00002,0x114a4592,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c17,0x2802100,0x962460,0x11800c17, +0x2802500,0x962460,0x11800f1d,0x2802400,0x962460,0x11800f29,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3d93,0x2802400, +0x962460,0x118a3e90,0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c1b,0x6800000,0x1329800,0x11c00f58,0x6800000,0x1329800, +0x11c0105d,0x6800000,0x1329800,0x11c01161,0x6800000,0x1329800,0x11c01265,0x6800000,0x1329800,0x11c01469,0x4000000,0x200000,0x11c01469,0x6800000,0x1329800,0x11c01469, +0x7c00100,0x230400,0x11c0511b,0x7c00100,0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100, +0x962460,0x20001b27,0x2802100,0x962461,0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000, +0x20001b27,0x4000000,0x400000,0x20001b27,0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27, +0x4000000,0x1410000,0x20001b27,0x4000010,0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400, +0x962540,0x20001b27,0x7c00100,0x230400,0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900020, +0x20004c67,0,0x1900020,0x20004d67,0,0x1900020,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67, +0,0,0x200a4a12,0x7c00100,0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100, +0x220400,0x30000419,0x7c00100,0x220401,0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400, +0x30000600,0x7c00500,0x230400,0x30000605,0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908, +0x7c00100,0x220401,0x30000908,0x7c00100,0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100, +0x230400,0x30000d22,0,0x218960,0x30000d22,0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000, +0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100,0x230400,0x30000d22,0xc000010,0x248000,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821, +0x2802100,0x962460,0x30001821,0x2806400,0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100, +0x230400,0x30001b27,0x2802100,0x962460,0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400, +0x30001c1c,0x2802100,0x1862460,0x30001c1c,0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c, +0x6800100,0x1862540,0x30001c1c,0x7c00100,0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010, +0x200000,0x30001f0b,0x4000010,0x400000,0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400, +0x30002128,0x4000010,0x200000,0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d, +0x4000001,0x440000,0x3000221d,0x7c00100,0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400, +0x1862460,0x30002417,0x2806400,0x1862460,0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000, +0x30002417,0x4000010,0x400000,0x30002417,0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417, +0x7d00100,0x1830000,0x3000251b,0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006, +0x500000,0x3000251b,0x4000010,0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400, +0x3000251b,0x7c00900,0x230400,0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x4000001,0xc41c0b,0x30002800,0x24000000,0x200000,0x30002800, +0x2c000010,0x1248002,0x30002800,0x2c000010,0x11248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100, +0x10220405,0x30002d19,0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000, +0x30003700,0x24000000,0x200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500400,0x30020701, +0x2802400,0x962460,0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000, +0xe00000,0x300a3c00,0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400, +0x300a4829,0x7c00900,0x1230400,0x300a4929,0x4000000,0xe00000,0x30402576,0x4000010,0x400000,0x30402576,0x4000010,0xb70000,0x30402576,0xc000010,0xb48000,0x304a3d92, +0x4000000,0xe00000,0x30800c17,0x2802100,0x962460,0x30c01c6e,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,0x250402,0x31005167,0x1000, +0,0x3100581e,0x4000000,0x200000,0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400, +0x31005b00,0x4000000,0x200000,0x31005c00,0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,0x4000000,0x200000,0x31005c00, +0x4000000,0x200001,0x31005c00,0x6800000,0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020, +0x1329805,0x31005d00,0x7c00120,0x220405,0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x962460,0x31006000,0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000, +0x310a5f11,0x7c00300,0xe30001,0x32000419,0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,0x7c00100,0x250400,0x32000908, +0x7c00100,0x220400,0x32000908,0x7c00100,0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,0x230400,0x32002800,0x80000, +0x1e18820,0x32002800,0x80020,0x218820,0x32002800,0x4000001,0x440002,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x200002,0x32002800,0x24000020,0x200000, +0x32002800,0x2c000010,0x1248002,0x32002919,0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,0x2802000,0x962460,0x32002b01, +0x2802020,0x962460,0x32002c00,0x4000000,0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120, +0x250405,0x32002e00,0x24000020,0x200000,0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,0x32003500,0x24000000,0x200000, +0x32003600,0x24000020,0x200000,0x32003600,0x24000020,0x10200000,0x32003700,0x24000000,0x100000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x10200000,0x32003800, +0x24000000,0x810000,0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100, +0x250400,0x3200622a,0x2802100,0x962460,0x3200622a,0x2806000,0x962460,0x3200622a,0x7c00100,0x230400,0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460, +0x3200632b,0x7c00100,0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600, +0x24000020,0x200000,0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,0x32006800,0x24000020,0x10200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020, +0x810000,0x32006900,0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460, +0x32023300,0x4000000,0x100000,0x32026c01,0x12882000,0x962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600, +0x24000020,0x1410000,0x32086900,0x24000020,0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x30200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100, +0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001, +0x320a6b16,0x7c00100,0x2530c00,0x32406372,0xc000010,0x448000,0x324a3d95,0x4000000,0x10e00000,0x324a3d95,0x7c00100,0x1230400,0x324a3f90,0x4000002,0x1200c00,0x324a538d, +0x24000000,0xe00000,0x32820701,0x2802000,0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400,0x4000080e,0x7c00100, +0x220400,0x4000080e,0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402,0x40000c02,0,0x218960,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460, +0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,0x40000d22,0x7c00100,0x230400,0x40000f0a, +0x7c00100,0x230400,0x40001004,0x7c00100,0x230400,0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000, +0x1600000,0x4000120f,0x7c00100,0x230400,0x4000131f,0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460, +0x40001615,0x7c00100,0x230400,0x40002417,0x2802400,0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00, +0x4000000,0x200002,0x40003000,0x24000000,0x10200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x10200000,0x40005a09,0x7c00100, +0x220400,0x40005a09,0x7c00100,0x250400,0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000, +0x40006f30,0x6800000,0x1329800,0x40006f30,0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117, +0x4000000,0x200000,0x40007208,0x7c00100,0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100, +0x220400,0x40007219,0x7c00500,0x220400,0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x10200000, +0x40007400,0x4000000,0x200000,0x40007531,0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933, +0x7c00100,0x230400,0x40007a32,0x6800000,0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400, +0x962460,0x40020701,0x2802400,0xc62460,0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x30200000,0x400a3700,0x24000000,0x30e00000, +0x400a4400,0x4000000,0xe0000d,0x400a4412,0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300, +0x4000000,0x1410010,0x404077b8,0x4000000,0x200000,0x404077bb,0x4000000,0x200000,0x404077bb,0x4000000,0x400000,0x40c0511b,0x4000000,0x200000,0x41000419,0x7c00100, +0x220400,0x41000419,0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,0x250400, +0x41000b13,0x2802000,0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0xb00000,0x41000c02, +0x4000000,0x1500000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100, +0x230400,0x41001d0c,0x7c00100,0x23040f,0x41001f0b,0x2802100,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,0x200000, +0x41002800,0x24000000,0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,0x41002c00, +0x7c00120,0x220405,0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x200000,0x41003700,0x24000000,0x10200000,0x41003700,0x24000000,0x10205200,0x41003700,0x24000000, +0x10e00000,0x41005d00,0x7c00120,0x220405,0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f, +0x41007219,0x7c00100,0x220400,0x41007300,0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e, +0x7c00100,0x230400,0x41008002,0x7c00100,0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100, +0x230400,0x41008301,0x2802000,0x962460,0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400, +0x41008407,0x7c00100,0x250400,0x4100850b,0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838, +0x7c00100,0x220400,0x41008838,0x7c00100,0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000, +0x200000,0x41008939,0x4000000,0x400000,0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000000,0x200000,0x41008b3b,0x4000000,0x1800000, +0x41008b3b,0x6800000,0x1329800,0x41008b3b,0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e, +0x7c00100,0x22040f,0x41008d19,0x7c00100,0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000, +0x1710000,0x41008e00,0x24000006,0x400000,0x41008f3a,0x2802000,0x962460,0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000, +0x41008f3a,0x6800100,0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c,0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701, +0x2802000,0xc62460,0x410a3700,0x24000000,0x30200000,0x410a3700,0x24000000,0x30e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300, +0xe30001,0x410a9100,0x4000000,0x800010,0x410a9100,0x4000000,0x810010,0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010, +0x410a9100,0x4000000,0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100,0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a8292,0x4000000,0xe00000,0x41808300, +0x2802000,0x962460,0x41c01469,0x6800000,0x1329800,0x50000419,0x7c00100,0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100, +0x220400,0x50000908,0x7c00100,0x250400,0x50000b13,0x2802500,0x962460,0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400, +0x50002b01,0x2802020,0x962460,0x50002c00,0x4000000,0x200000,0x50002c19,0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000, +0x24000020,0x200000,0x50003700,0x24000000,0x200000,0x50005d00,0x7c00120,0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100, +0x250400,0x50006600,0x24000020,0x200000,0x50007300,0x24000000,0x200000,0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460, +0x50009257,0x4000000,0x200000,0x50009257,0x4000010,0x1071400,0x50009257,0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257, +0x7c00900,0x230400,0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100,0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000, +0x400000,0x5000933e,0x4000010,0x400000,0x5000933e,0x6800000,0x1329800,0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540, +0x5000933e,0x7c00100,0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e,0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500, +0x4000400,0x200400,0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100,0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010, +0x400000,0x5000975b,0x7c00100,0x230400,0x50009865,0x7c00100,0x230400,0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409a92,0x4000000,0x200000, +0x5100080e,0x7c00100,0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02,0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02, +0x7c00100,0x230400,0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500,0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100, +0x230400,0x51001524,0x2802100,0x962460,0x51001524,0x4000000,0x200000,0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000, +0x5100171a,0x4000000,0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27,0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27, +0x7c00100,0x230400,0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802400,0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000, +0x1329800,0x51001c1c,0x6800000,0x1862400,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800400,0x1862400,0x51001c1c,0x7c00100,0x1830000, +0x5100251b,0x7c00100,0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19, +0x7c00100,0x230400,0x51003700,0x24000000,0x200000,0x51003700,0x24000000,0xe00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100, +0x220400,0x51006108,0x7c00100,0x250400,0x51006600,0x24000020,0x200000,0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000, +0x51007300,0x24000020,0x200000,0x51008002,0x7c00100,0x230400,0x51008301,0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00, +0x24000000,0x200000,0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000, +0x1710000,0x51008e00,0x24000002,0x200000,0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e, +0x51009419,0x7c00100,0x22040f,0x51009419,0x7c00100,0x250400,0x51009500,0x4000000,0x200400,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519, +0x7c00100,0x22040f,0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100, +0x962540,0x51009b71,0x6804400,0x962540,0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802c00,0x962460, +0x51009c52,0x4000010,0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d, +0x6800000,0x1329800,0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100, +0x962460,0x51009f63,0x4000010,0x400000,0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000, +0x51009f63,0xc000010,0xb48000,0x5100a008,0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008, +0x7c00100,0x230400,0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100, +0x962540,0x5100a16f,0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800, +0x5100a24f,0x7c00100,0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e, +0x6804400,0x962540,0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100, +0x962540,0x5100a442,0x7c00100,0x230400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460, +0x5100a76b,0x7c00100,0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0xe00000,0x5100ab00, +0x4000000,0xe00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000, +0x30200000,0x510aaa00,0x4000000,0x30e00000,0x5140a2b3,0x4000400,0x400000,0x514a8292,0x4000000,0xe00000,0x51802b84,0x2802000,0x962460,0x51c00908,0x2802400,0x962460, +0x51c0a008,0x2802400,0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00, +0x4000000,0x200000,0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800400,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100, +0x2330520,0x52002128,0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006, +0x52003000,0x24000000,0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407, +0x7c00100,0x220400,0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100, +0x250400,0x5200975b,0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000, +0x5200ac7e,0x7c00100,0x230400,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,0x5200ae6a, +0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,0x7c00100, +0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,0x448000, +0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,0x5200b30a, +0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,0x4000000, +0x200000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800,0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,0x230400, +0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,0x6800400,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,0x5200b77f, +0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,0x7c00500, +0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,0x1329800, +0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,0x5200b912, +0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,0x7c00100, +0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,0x230400, +0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0,0x218960,0x5200c178, +0x2802000,0x962460,0x5200c178,0x2802100,0x962460,0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100, +0x962540,0x5200c178,0x7c00100,0x230400,0x5200c178,0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400, +0x5200c247,0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700, +0x24000000,0x10100000,0x52023700,0x24000000,0x10e00000,0x52023700,0x24000000,0x928045a0,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000, +0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003,0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d, +0x5202c300,0x4000100,0x10150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0x30e00000,0x520a3800,0x24000000,0x30100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11, +0x7c00300,0xe30001,0x520a7300,0x24000000,0x30100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000, +0x30e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af78,0x6800400,0x962540,0x5240af78,0x7c00100,0x230400,0x5240af79,0x4000400,0x200000, +0x5240af79,0x6800100,0x962540,0x5240b298,0x4000000,0x200000,0x5240b2a2,0x4000000,0x200000,0x5240b2a2,0x4000000,0x1500000,0x5240b5b6,0x7c00900,0x230400,0x524a4492, +0x4000000,0xe00003,0x5280af78,0x2802400,0x962460,0x5280af79,0x2802400,0x962460,0x5280af7b,0x2802400,0x962460,0x5280af7d,0x2802400,0x962460,0x52c0b3ad,0x2802400, +0x962460,0x52c0b3b1,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540, +0x60000f0a,0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27, +0x4000000,0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802000,0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000, +0x10200000,0x60003000,0x24000000,0x10e00000,0x60003700,0x24000000,0x200000,0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400, +0x60006108,0x7c00100,0x250400,0x60006600,0x24000020,0x200000,0x60008301,0x2802000,0x962460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519, +0x7c00100,0x220400,0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x32703580,0x6000c654,0x2802000, +0x962460,0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100,0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000, +0x6000c73f,0x6800100,0x962540,0x6000c73f,0x6804000,0x962540,0x6000c73f,0x7c00100,0x230400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941, +0x2806000,0x962460,0x6000c941,0x4000000,0x200000,0x6000c941,0x4000010,0x200000,0x6000c941,0x6800000,0x1329800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100, +0x230400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400,0x6000cc00,0x4000000,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000, +0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,0x10150400,0x600a3000,0x24000000,0x30200000,0x600a3000, +0x24000000,0x30e00000,0x600a3700,0x24000000,0x30200000,0x600a3800,0x24000000,0x30200000,0x600a3800,0x24000000,0xb28045a0,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000, +0x30100000,0x600ac400,0x4000000,0x10e0000d,0x600ac400,0x4000000,0x30e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x30e00000, +0x600acd00,0x4000000,0x30200000,0x600acd00,0x4000000,0x30e00000,0x600acd00,0x4000000,0x30e05200,0x600acd00,0x4000000,0xb28045a0,0x600acd00,0x4000000,0xb28049c0,0x600ace00, +0x4000000,0x30e00000,0x600ace00,0x4000000,0xb28045a0,0x600acf00,0x4000000,0x30e00000,0x600acf00,0x4000000,0x30e05200,0x600acf00,0x4000000,0xb28045a0,0x600ad111,0x7c40300, +0xe30000,0x604ac492,0x4000000,0x30e00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,0x1830000, +0x61001d0c,0x7c00100,0x230400,0x61001d0c,0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,0x6100870c, +0x7c00100,0x220400,0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,0x7c00100, +0x220400,0x61009519,0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,0x230400, +0x6100a008,0x2802100,0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,0x6100d202, +0x7c00100,0x230400,0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,0x2806400, +0x962460,0x6100d476,0x4000000,0x400000,0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,0x448000, +0x6100d573,0x2802100,0x962460,0x6100d573,0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,0x6100d573, +0xc000010,0x448000,0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802400,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,0x7c00100, +0x230400,0x6100d85c,0x7c00500,0x230400,0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,0x1329800, +0x6100d997,0x6800100,0x962540,0x6100d997,0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,0x6100da98, +0x6800000,0x1329800,0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,0x6800000, +0x1329800,0x6100dc99,0x6800100,0x962540,0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,0xe30001, +0x610ace00,0x4000000,0x30e00000,0x6140af78,0x7c00100,0x230400,0x6140af79,0x6800100,0x962540,0x6140af82,0x7c00100,0x230400,0x6180af79,0x2802400,0x962460,0x62002a00, +0x4000000,0x1600000,0x63000c00,0x80000,0x918820,0x63002800,0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0, +0x218960,0x70000f0a,0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460, +0x7000171a,0x2802100,0x962460,0x70001821,0x6800000,0x1329800,0x70002320,0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000, +0x24000000,0x200000,0x70003000,0x24000000,0x10200000,0x70003800,0x24000000,0xe00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100, +0x220400,0x70006108,0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400,0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460, +0x70008301,0x2802400,0x962460,0x70008e00,0x24000000,0x200000,0x70008e00,0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00, +0x24000010,0x400000,0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100,0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100, +0x230400,0x70009965,0x4000010,0x400000,0x70009965,0x7c00100,0x230400,0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f, +0x7000a50e,0x4000000,0x200000,0x7000b61c,0x2802400,0x1862460,0x7000b61c,0x6800400,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941, +0x2806000,0x962460,0x7000cc00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x10200000,0x7000cd00,0x4000000, +0x10e00000,0x7000cd00,0x4000000,0x10e05200,0x7000cd00,0x4000000,0x928045a0,0x7000cf00,0x4000000,0xe00000,0x7000cf00,0x4000000,0x10e00000,0x7000d202,0x2802100,0x962460, +0x7000d202,0x7c00100,0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86, +0xc000010,0x448000,0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000, +0x962460,0x7000e187,0x2802100,0x962460,0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400, +0x7000e300,0x4000000,0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489, +0x6804400,0x962540,0x7000e489,0x7c00100,0x230400,0x7000e489,0x7c00900,0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000, +0x200000,0x7000e59d,0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000, +0x7000e691,0x2802100,0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691, +0x7c00100,0x230400,0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100, +0x230400,0x7000e9a0,0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460, +0x7000ea79,0x4000000,0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c, +0x4000000,0x200000,0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000, +0x1329800,0x7000eca3,0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400, +0x7000ed95,0xc000010,0x448000,0x7000ee1c,0x2802400,0x1862460,0x7000ee1c,0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f, +0x4000000,0x200000,0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100, +0x230400,0x7000f200,0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802100,0x962460,0x7000f34b,0x4000000,0x200000, +0x7000f34b,0x4000010,0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490, +0x4000000,0x200000,0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100, +0x230400,0x7000f8a6,0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000, +0x7000f8a6,0x4000800,0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921, +0x4000000,0x200000,0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000, +0x200000,0x7000fb9e,0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000, +0x7000fc92,0x6800000,0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x30e00000,0x700acd00, +0x4000000,0xb28045a0,0x700ace00,0x4000000,0x30e00000,0x700acf00,0x4000000,0x30e00000,0x700acf00,0x4000000,0xb28045a0,0x7040dfbd,0x4000000,0x200000,0x7040f7c1,0x80000, +0x918820,0x7080af79,0x2802400,0x962460,0x7080dfbd,0x2802400,0x962460,0x70c0e4bf,0x2802400,0x962460,0x70c0e4bf,0x6800100,0x962540,0x8000120f,0x7c00100,0x230400, +0x80001524,0x7c00100,0x230400,0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,0x80002d00, +0x4000000,0x200000,0x80005208,0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,0x7c00100, +0x230400,0x80009519,0x7c00100,0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,0x230400, +0x8000cd00,0x4000000,0xe00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460,0x8000d997, +0x4000000,0x200000,0x8000d997,0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,0x2802100, +0x962460,0x8000e489,0x7c00100,0x230400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,0x448000, +0x8000fda1,0x2802100,0x1862460,0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540,0x8000fda1, +0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,0x7c00100, +0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,0x448000, +0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670, +0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x30e00000,0x800acd00,0x4000000,0x72904de0,0x800ace00,0x4000000, +0x30e00000,0x800acf00,0x4000000,0x30e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,0x90001615,0x7c00100,0x230400, +0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460,0x90008e00, +0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202,0x2802100, +0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00,0x962460, +0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460,0x900108a8, +0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8,0x6800100, +0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100,0x962460, +0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000,0x90010eaa, +0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa,0x4000010, +0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100,0x220400, +0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x30e00000,0x900acd00,0x4000000,0xb28045a0,0x900acf00, +0x4000000,0x30e00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300, +0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000}; -static const int32_t countPropsVectors=6195; +static const int32_t countPropsVectors=6279; static const int32_t propsVectorsColumns=3; static const uint16_t scriptExtensions[194]={ 0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,3,0x800c,2,0x22, @@ -3539,6 +3581,6 @@ static const uint16_t scriptExtensions[194]={ 0x8023,0xa,0xaf,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89, 0x67,0x8087}; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x28aa,0x28aa,0x28aa,0x28aa,0x606c,3,0x789f,0x7900,0x7900,0x7900,0xb11ae,0x2a75631,0,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x28aa,0x28aa,0x28aa,0x28aa,0x6196,3,0x7a1d,0x7a7e,0x7a7e,0x7a7e,0xb11ae,0x2a75631,0,0,0,0}; #endif // INCLUDED_FROM_UCHAR_C diff --git a/deps/icu-small/source/common/ucharstrie.cpp b/deps/icu-small/source/common/ucharstrie.cpp index d04d315c7913e0..e0b33af5194393 100644 --- a/deps/icu-small/source/common/ucharstrie.cpp +++ b/deps/icu-small/source/common/ucharstrie.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucharstrie.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -175,7 +175,8 @@ UCharsTrie::next(int32_t uchar) { } UStringTrieResult -UCharsTrie::next(const UChar *s, int32_t sLength) { +UCharsTrie::next(ConstChar16Ptr ptr, int32_t sLength) { + const UChar *s=ptr; if(sLength<0 ? *s==0 : sLength==0) { // Empty input. return current(); diff --git a/deps/icu-small/source/common/ucharstriebuilder.cpp b/deps/icu-small/source/common/ucharstriebuilder.cpp index 412a58a45d6bd0..694648d0c811f7 100644 --- a/deps/icu-small/source/common/ucharstriebuilder.cpp +++ b/deps/icu-small/source/common/ucharstriebuilder.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucharstriebuilder.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucharstrieiterator.cpp b/deps/icu-small/source/common/ucharstrieiterator.cpp index 68ba8c2177878a..b3132241fe2b7a 100644 --- a/deps/icu-small/source/common/ucharstrieiterator.cpp +++ b/deps/icu-small/source/common/ucharstrieiterator.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucharstrieiterator.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -21,7 +21,7 @@ U_NAMESPACE_BEGIN -UCharsTrie::Iterator::Iterator(const UChar *trieUChars, int32_t maxStringLength, +UCharsTrie::Iterator::Iterator(ConstChar16Ptr trieUChars, int32_t maxStringLength, UErrorCode &errorCode) : uchars_(trieUChars), pos_(uchars_), initialPos_(uchars_), diff --git a/deps/icu-small/source/common/uchriter.cpp b/deps/icu-small/source/common/uchriter.cpp index fd0a407c6b1763..822168f5c8e600 100644 --- a/deps/icu-small/source/common/uchriter.cpp +++ b/deps/icu-small/source/common/uchriter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -25,14 +25,14 @@ UCharCharacterIterator::UCharCharacterIterator() // never default construct! } -UCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr, +UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length) : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0), text(textPtr) { } -UCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr, +UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, int32_t position) : CharacterIterator(textPtr != 0 ? (length>=0 ? length : u_strlen(textPtr)) : 0, position), @@ -40,7 +40,7 @@ UCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr, { } -UCharCharacterIterator::UCharCharacterIterator(const UChar* textPtr, +UCharCharacterIterator::UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, int32_t textBegin, int32_t textEnd, @@ -349,7 +349,7 @@ UCharCharacterIterator::move32(int32_t delta, CharacterIterator::EOrigin origin) return pos; } -void UCharCharacterIterator::setText(const UChar* newText, +void UCharCharacterIterator::setText(ConstChar16Ptr newText, int32_t newTextLength) { text = newText; if(newText == 0 || newTextLength < 0) { diff --git a/deps/icu-small/source/common/ucln.h b/deps/icu-small/source/common/ucln.h index 3c8c66ad2f39e5..fe6666efed3f18 100644 --- a/deps/icu-small/source/common/ucln.h +++ b/deps/icu-small/source/common/ucln.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucln.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucln_cmn.cpp b/deps/icu-small/source/common/ucln_cmn.cpp index 657ec337d7e041..7e541a1a5f0f3b 100644 --- a/deps/icu-small/source/common/ucln_cmn.cpp +++ b/deps/icu-small/source/common/ucln_cmn.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: ucln_cmn.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucln_cmn.h b/deps/icu-small/source/common/ucln_cmn.h index 56fa73053f5c0c..a6ecfd54bb55e4 100644 --- a/deps/icu-small/source/common/ucln_cmn.h +++ b/deps/icu-small/source/common/ucln_cmn.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: ucln_cmn.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucln_imp.h b/deps/icu-small/source/common/ucln_imp.h index 5aa5b0d19f3aab..2e985669793b82 100644 --- a/deps/icu-small/source/common/ucln_imp.h +++ b/deps/icu-small/source/common/ucln_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucln_imp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -121,7 +121,9 @@ U_CAPI void U_EXPORT2 UCLN_FINI () /* READ READ READ READ! Are you getting compilation errors from windows.h? Any source file which includes this (ucln_imp.h) header MUST be defined with language extensions ON. */ +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE diff --git a/deps/icu-small/source/common/ucmndata.c b/deps/icu-small/source/common/ucmndata.cpp similarity index 97% rename from deps/icu-small/source/common/ucmndata.c rename to deps/icu-small/source/common/ucmndata.cpp index 6b7d78d104d186..251c7ba1823887 100644 --- a/deps/icu-small/source/common/ucmndata.c +++ b/deps/icu-small/source/common/ucmndata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -207,7 +207,9 @@ pointerTOCPrefixBinarySearch(const char *s, const PointerTOCEntry *toc, int32_t return -1; } -static uint32_t offsetTOCEntryCount(const UDataMemory *pData) { +U_CDECL_BEGIN +static uint32_t U_CALLCONV +offsetTOCEntryCount(const UDataMemory *pData) { int32_t retVal=0; const UDataOffsetTOC *toc = (UDataOffsetTOC *)pData->toc; if (toc != NULL) { @@ -216,11 +218,12 @@ static uint32_t offsetTOCEntryCount(const UDataMemory *pData) { return retVal; } -static const DataHeader * +static const DataHeader * U_CALLCONV offsetTOCLookupFn(const UDataMemory *pData, const char *tocEntryName, int32_t *pLength, UErrorCode *pErrorCode) { + (void)pErrorCode; const UDataOffsetTOC *toc = (UDataOffsetTOC *)pData->toc; if(toc!=NULL) { const char *base=(const char *)toc; @@ -262,16 +265,16 @@ offsetTOCLookupFn(const UDataMemory *pData, } -static uint32_t pointerTOCEntryCount(const UDataMemory *pData) { +static uint32_t U_CALLCONV pointerTOCEntryCount(const UDataMemory *pData) { const PointerTOC *toc = (PointerTOC *)pData->toc; return (uint32_t)((toc != NULL) ? (toc->count) : 0); } - -static const DataHeader *pointerTOCLookupFn(const UDataMemory *pData, +static const DataHeader * U_CALLCONV pointerTOCLookupFn(const UDataMemory *pData, const char *name, int32_t *pLength, UErrorCode *pErrorCode) { + (void)pErrorCode; if(pData->toc!=NULL) { const PointerTOC *toc = (PointerTOC *)pData->toc; int32_t number, count=(int32_t)toc->count; @@ -300,6 +303,8 @@ static const DataHeader *pointerTOCLookupFn(const UDataMemory *pData, return pData->pHeader; } } +U_CDECL_END + static const commonDataFuncs CmnDFuncs = {offsetTOCLookupFn, offsetTOCEntryCount}; static const commonDataFuncs ToCPFuncs = {pointerTOCLookupFn, pointerTOCEntryCount}; diff --git a/deps/icu-small/source/common/ucmndata.h b/deps/icu-small/source/common/ucmndata.h index 4ff37cc20b0576..8c36897f16f200 100644 --- a/deps/icu-small/source/common/ucmndata.h +++ b/deps/icu-small/source/common/ucmndata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/ucnv.c b/deps/icu-small/source/common/ucnv.cpp similarity index 99% rename from deps/icu-small/source/common/ucnv.c rename to deps/icu-small/source/common/ucnv.cpp index 7ce05644c7ec9f..39ea5dfa6636f5 100644 --- a/deps/icu-small/source/common/ucnv.c +++ b/deps/icu-small/source/common/ucnv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/ucnv2022.cpp b/deps/icu-small/source/common/ucnv2022.cpp index d1d947f93c4ac3..1b625ea06c2649 100644 --- a/deps/icu-small/source/common/ucnv2022.cpp +++ b/deps/icu-small/source/common/ucnv2022.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv2022.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucnv_bld.cpp b/deps/icu-small/source/common/ucnv_bld.cpp index bfbb45a7d1c911..482034fd0c1b03 100644 --- a/deps/icu-small/source/common/ucnv_bld.cpp +++ b/deps/icu-small/source/common/ucnv_bld.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************** diff --git a/deps/icu-small/source/common/ucnv_bld.h b/deps/icu-small/source/common/ucnv_bld.h index aeb858c9d50cba..16dd14408a7504 100644 --- a/deps/icu-small/source/common/ucnv_bld.h +++ b/deps/icu-small/source/common/ucnv_bld.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ucnv_cb.c b/deps/icu-small/source/common/ucnv_cb.cpp similarity index 99% rename from deps/icu-small/source/common/ucnv_cb.c rename to deps/icu-small/source/common/ucnv_cb.cpp index 0c9cc2459f1844..1bb001201491aa 100644 --- a/deps/icu-small/source/common/ucnv_cb.c +++ b/deps/icu-small/source/common/ucnv_cb.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ucnv_cnv.c b/deps/icu-small/source/common/ucnv_cnv.cpp similarity index 96% rename from deps/icu-small/source/common/ucnv_cnv.c rename to deps/icu-small/source/common/ucnv_cnv.cpp index 01f84829dd3f7d..ea71acf92c7ae7 100644 --- a/deps/icu-small/source/common/ucnv_cnv.c +++ b/deps/icu-small/source/common/ucnv_cnv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -33,6 +33,9 @@ ucnv_getCompleteUnicodeSet(const UConverter *cnv, const USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode) { + (void)cnv; + (void)which; + (void)pErrorCode; sa->addRange(sa->set, 0, 0x10ffff); } @@ -41,6 +44,9 @@ ucnv_getNonSurrogateUnicodeSet(const UConverter *cnv, const USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode) { + (void)cnv; + (void)which; + (void)pErrorCode; sa->addRange(sa->set, 0, 0xd7ff); sa->addRange(sa->set, 0xe000, 0x10ffff); } diff --git a/deps/icu-small/source/common/ucnv_cnv.h b/deps/icu-small/source/common/ucnv_cnv.h index 48978130775a36..a996e2959784cf 100644 --- a/deps/icu-small/source/common/ucnv_cnv.h +++ b/deps/icu-small/source/common/ucnv_cnv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ucnv_ct.c b/deps/icu-small/source/common/ucnv_ct.cpp similarity index 97% rename from deps/icu-small/source/common/ucnv_ct.c rename to deps/icu-small/source/common/ucnv_ct.cpp index f76919c4a54f30..c9a0ce36930ec9 100644 --- a/deps/icu-small/source/common/ucnv_ct.c +++ b/deps/icu-small/source/common/ucnv_ct.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_ct.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -165,16 +165,17 @@ typedef struct{ } UConverterDataCompoundText; /*********** Compound Text Converter Protos ***********/ -static void +U_CDECL_BEGIN +static void U_CALLCONV _CompoundTextOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode); -static void +static void U_CALLCONV _CompoundTextClose(UConverter *converter); -static void +static void U_CALLCONV _CompoundTextReset(UConverter *converter, UConverterResetChoice choice); -static const char* +static const char* U_CALLCONV _CompoundTextgetName(const UConverter* cnv); @@ -257,14 +258,14 @@ static COMPOUND_TEXT_CONVERTERS findStateFromEscSeq(const char* source, const ch return state; } -static void +static void U_CALLCONV _CompoundTextOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ cnv->extraInfo = uprv_malloc (sizeof (UConverterDataCompoundText)); if (cnv->extraInfo != NULL) { UConverterDataCompoundText *myConverterData = (UConverterDataCompoundText *) cnv->extraInfo; UConverterNamePieces stackPieces; - UConverterLoadArgs stackArgs={ (int32_t)sizeof(UConverterLoadArgs) }; + UConverterLoadArgs stackArgs=UCNV_LOAD_ARGS_INITIALIZER; myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_0] = NULL; myConverterData->myConverterArray[COMPOUND_TEXT_SINGLE_1] = ucnv_loadSharedData("icu-internal-compound-s1", &stackPieces, &stackArgs, errorCode); @@ -300,7 +301,7 @@ _CompoundTextOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorC } -static void +static void U_CALLCONV _CompoundTextClose(UConverter *converter) { UConverterDataCompoundText* myConverterData = (UConverterDataCompoundText*)(converter->extraInfo); int32_t i; @@ -317,16 +318,19 @@ _CompoundTextClose(UConverter *converter) { } } -static void +static void U_CALLCONV _CompoundTextReset(UConverter *converter, UConverterResetChoice choice) { + (void)converter; + (void)choice; } -static const char* +static const char* U_CALLCONV _CompoundTextgetName(const UConverter* cnv){ + (void)cnv; return "x11-compound-text"; } -static void +static void U_CALLCONV UConverter_fromUnicode_CompoundText_OFFSETS(UConverterFromUnicodeArgs* args, UErrorCode* err){ UConverter *cnv = args->converter; uint8_t *target = (uint8_t *) args->target; @@ -458,7 +462,7 @@ UConverter_fromUnicode_CompoundText_OFFSETS(UConverterFromUnicodeArgs* args, UEr } -static void +static void U_CALLCONV UConverter_toUnicode_CompoundText_OFFSETS(UConverterToUnicodeArgs *args, UErrorCode* err){ const char *mySource = (char *) args->source; @@ -574,7 +578,7 @@ UConverter_toUnicode_CompoundText_OFFSETS(UConverterToUnicodeArgs *args, args->source = mySource; } -static void +static void U_CALLCONV _CompoundText_GetUnicodeSet(const UConverter *cnv, const USetAdder *sa, UConverterUnicodeSet which, @@ -591,6 +595,7 @@ _CompoundText_GetUnicodeSet(const UConverter *cnv, sa->addRange(sa->set, 0x0020, 0x007F); sa->addRange(sa->set, 0x00A0, 0x00FF); } +U_CDECL_END static const UConverterImpl _CompoundTextImpl = { @@ -613,8 +618,11 @@ static const UConverterImpl _CompoundTextImpl = { _CompoundTextgetName, NULL, NULL, - _CompoundText_GetUnicodeSet + _CompoundText_GetUnicodeSet, + NULL, + NULL }; + static const UConverterStaticData _CompoundTextStaticData = { sizeof(UConverterStaticData), "COMPOUND_TEXT", diff --git a/deps/icu-small/source/common/ucnv_err.c b/deps/icu-small/source/common/ucnv_err.cpp similarity index 97% rename from deps/icu-small/source/common/ucnv_err.c rename to deps/icu-small/source/common/ucnv_err.cpp index 449b162152e61e..18218835a2260e 100644 --- a/deps/icu-small/source/common/ucnv_err.c +++ b/deps/icu-small/source/common/ucnv_err.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** @@ -107,6 +107,10 @@ UCNV_FROM_U_CALLBACK_STOP ( UConverterCallbackReason reason, UErrorCode * err) { + (void)context; + (void)fromUArgs; + (void)codeUnits; + (void)length; if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) { /* @@ -130,6 +134,7 @@ UCNV_TO_U_CALLBACK_STOP ( UErrorCode * err) { /* the caller must have set the error code accordingly */ + (void)context; (void)toUArgs; (void)codePoints; (void)length; (void)reason; (void)err; return; } @@ -143,6 +148,9 @@ UCNV_FROM_U_CALLBACK_SKIP ( UConverterCallbackReason reason, UErrorCode * err) { + (void)fromUArgs; + (void)codeUnits; + (void)length; if (reason <= UCNV_IRREGULAR) { if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) @@ -171,6 +179,8 @@ UCNV_FROM_U_CALLBACK_SUBSTITUTE ( UConverterCallbackReason reason, UErrorCode * err) { + (void)codeUnits; + (void)length; if (reason <= UCNV_IRREGULAR) { if (reason == UCNV_UNASSIGNED && IS_DEFAULT_IGNORABLE_CODE_POINT(codePoint)) @@ -368,6 +378,9 @@ UCNV_TO_U_CALLBACK_SKIP ( UConverterCallbackReason reason, UErrorCode * err) { + (void)toArgs; + (void)codeUnits; + (void)length; if (reason <= UCNV_IRREGULAR) { if (context == NULL || (*((char*)context) == UCNV_PRV_STOP_ON_ILLEGAL && reason == UCNV_UNASSIGNED)) @@ -388,6 +401,8 @@ UCNV_TO_U_CALLBACK_SUBSTITUTE ( UConverterCallbackReason reason, UErrorCode * err) { + (void)codeUnits; + (void)length; if (reason <= UCNV_IRREGULAR) { if (context == NULL || (*((char*)context) == UCNV_PRV_STOP_ON_ILLEGAL && reason == UCNV_UNASSIGNED)) diff --git a/deps/icu-small/source/common/ucnv_ext.cpp b/deps/icu-small/source/common/ucnv_ext.cpp index f8605187240159..7dea4eef41a408 100644 --- a/deps/icu-small/source/common/ucnv_ext.cpp +++ b/deps/icu-small/source/common/ucnv_ext.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnv_ext.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -23,6 +23,7 @@ #if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION #include "unicode/uset.h" +#include "unicode/ustring.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "ucnv_ext.h" diff --git a/deps/icu-small/source/common/ucnv_ext.h b/deps/icu-small/source/common/ucnv_ext.h index e2ce7fa07293c4..7b753ac217d8d5 100644 --- a/deps/icu-small/source/common/ucnv_ext.h +++ b/deps/icu-small/source/common/ucnv_ext.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnv_ext.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucnv_imp.h b/deps/icu-small/source/common/ucnv_imp.h index 81aa80fd272409..c5e6aeb47e48d8 100644 --- a/deps/icu-small/source/common/ucnv_imp.h +++ b/deps/icu-small/source/common/ucnv_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ucnv_io.cpp b/deps/icu-small/source/common/ucnv_io.cpp index eaa08e47cd82cc..d9e91314ed5347 100644 --- a/deps/icu-small/source/common/ucnv_io.cpp +++ b/deps/icu-small/source/common/ucnv_io.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/ucnv_io.h b/deps/icu-small/source/common/ucnv_io.h index 8b3585786d3238..8f2d7b5a02bbfa 100644 --- a/deps/icu-small/source/common/ucnv_io.h +++ b/deps/icu-small/source/common/ucnv_io.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ucnv_lmb.c b/deps/icu-small/source/common/ucnv_lmb.cpp similarity index 98% rename from deps/icu-small/source/common/ucnv_lmb.c rename to deps/icu-small/source/common/ucnv_lmb.cpp index e595f931a08c09..4a5befde6145a2 100644 --- a/deps/icu-small/source/common/ucnv_lmb.c +++ b/deps/icu-small/source/common/ucnv_lmb.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_lmb.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 4 (not used) * indentation:4 * @@ -582,7 +582,9 @@ typedef struct } UConverterDataLMBCS; -static void _LMBCSClose(UConverter * _this); +U_CDECL_BEGIN +static void U_CALLCONV _LMBCSClose(UConverter * _this); +U_CDECL_END #define DECLARE_LMBCS_DATA(n) \ static const UConverterImpl _LMBCSImpl##n={\ @@ -600,7 +602,9 @@ static const UConverterImpl _LMBCSImpl##n={\ NULL,\ NULL,\ _LMBCSSafeClone,\ - ucnv_getCompleteUnicodeSet\ + ucnv_getCompleteUnicodeSet,\ + NULL,\ + NULL\ };\ static const UConverterStaticData _LMBCSStaticData##n={\ sizeof(UConverterStaticData),\ @@ -616,7 +620,7 @@ function, which will do basically the same thing except set a different optimization group. So, we put the common stuff into a worker function, and set up another macro to stamp out the 12 open functions:*/ #define DEFINE_LMBCS_OPEN(n) \ -static void \ +static void U_CALLCONV \ _LMBCSOpen##n(UConverter* _this, UConverterLoadArgs* pArgs, UErrorCode* err) \ { _LMBCSOpenWorker(_this, pArgs, err, n); } @@ -629,12 +633,12 @@ _LMBCSOpenWorker(UConverter* _this, UErrorCode* err, ulmbcs_byte_t OptGroup) { - UConverterDataLMBCS * extraInfo = _this->extraInfo = - (UConverterDataLMBCS*)uprv_malloc (sizeof (UConverterDataLMBCS)); + UConverterDataLMBCS * extraInfo = (UConverterDataLMBCS*)uprv_malloc (sizeof (UConverterDataLMBCS)); + _this->extraInfo = extraInfo; if(extraInfo != NULL) { UConverterNamePieces stackPieces; - UConverterLoadArgs stackArgs={ (int32_t)sizeof(UConverterLoadArgs) }; + UConverterLoadArgs stackArgs= UCNV_LOAD_ARGS_INITIALIZER; ulmbcs_byte_t i; uprv_memset(extraInfo, 0, sizeof(UConverterDataLMBCS)); @@ -661,7 +665,8 @@ _LMBCSOpenWorker(UConverter* _this, } } -static void +U_CDECL_BEGIN +static void U_CALLCONV _LMBCSClose(UConverter * _this) { if (_this->extraInfo != NULL) @@ -686,11 +691,12 @@ typedef struct LMBCSClone { UConverterDataLMBCS lmbcs; } LMBCSClone; -static UConverter * +static UConverter * U_CALLCONV _LMBCSSafeClone(const UConverter *cnv, void *stackBuffer, int32_t *pBufferSize, UErrorCode *status) { + (void)status; LMBCSClone *newLMBCS; UConverterDataLMBCS *extraInfo; int32_t i; @@ -842,7 +848,7 @@ LMBCSConvertUni(ulmbcs_byte_t * pLMBCS, UChar uniChar) /* The main Unicode to LMBCS conversion function */ -static void +static void U_CALLCONV _LMBCSFromUnicode(UConverterFromUnicodeArgs* args, UErrorCode* err) { @@ -1109,7 +1115,7 @@ GetUniFromLMBCSUni(char const ** ppLMBCSin) /* Called with LMBCS-style Unicode /* Return the Unicode representation for the current LMBCS character */ -static UChar32 +static UChar32 U_CALLCONV _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, UErrorCode* err) { @@ -1251,7 +1257,7 @@ _LMBCSGetNextUCharWorker(UConverterToUnicodeArgs* args, /* The exported function that converts lmbcs to one or more UChars - currently UTF-16 */ -static void +static void U_CALLCONV _LMBCSToUnicodeWithOffsets(UConverterToUnicodeArgs* args, UErrorCode* err) { @@ -1375,4 +1381,6 @@ DECLARE_LMBCS_DATA(17) DECLARE_LMBCS_DATA(18) DECLARE_LMBCS_DATA(19) +U_CDECL_END + #endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */ diff --git a/deps/icu-small/source/common/ucnv_set.c b/deps/icu-small/source/common/ucnv_set.cpp similarity index 95% rename from deps/icu-small/source/common/ucnv_set.c rename to deps/icu-small/source/common/ucnv_set.cpp index c3933ab6109cbf..926cee0de810ea 100644 --- a/deps/icu-small/source/common/ucnv_set.c +++ b/deps/icu-small/source/common/ucnv_set.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucnv_set.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucnv_u16.c b/deps/icu-small/source/common/ucnv_u16.cpp similarity index 98% rename from deps/icu-small/source/common/ucnv_u16.c rename to deps/icu-small/source/common/ucnv_u16.cpp index d8f4576f33763f..674d0323efddef 100644 --- a/deps/icu-small/source/common/ucnv_u16.c +++ b/deps/icu-small/source/common/ucnv_u16.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u16.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -21,6 +21,7 @@ #if !UCONFIG_NO_CONVERSION #include "unicode/ucnv.h" +#include "unicode/uversion.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "cmemory.h" @@ -29,11 +30,12 @@ enum { UCNV_NEED_TO_WRITE_BOM=1 }; +U_CDECL_BEGIN /* * The UTF-16 toUnicode implementation is also used for the Java-specific * "with BOM" variants of UTF-16BE and UTF-16LE. */ -static void +static void U_CALLCONV _UTF16ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode); @@ -46,7 +48,7 @@ _UTF16ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, #endif -static void +static void U_CALLCONV _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -250,7 +252,7 @@ _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, pArgs->offsets=offsets; } -static void +static void U_CALLCONV _UTF16BEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -488,7 +490,7 @@ _UTF16BEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, pArgs->offsets=offsets; } -static UChar32 +static UChar32 U_CALLCONV _UTF16BEGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { const uint8_t *s, *sourceLimit; UChar32 c; @@ -567,7 +569,7 @@ _UTF16BEGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { return c; } -static void +static void U_CALLCONV _UTF16BEReset(UConverter *cnv, UConverterResetChoice choice) { if(choice<=UCNV_RESET_TO_UNICODE) { /* reset toUnicode state */ @@ -583,10 +585,11 @@ _UTF16BEReset(UConverter *cnv, UConverterResetChoice choice) { } } -static void +static void U_CALLCONV _UTF16BEOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *pErrorCode) { + (void)pArgs; if(UCNV_GET_VERSION(cnv)<=1) { _UTF16BEReset(cnv, UCNV_RESET_BOTH); } else { @@ -594,7 +597,7 @@ _UTF16BEOpen(UConverter *cnv, } } -static const char * +static const char * U_CALLCONV _UTF16BEGetName(const UConverter *cnv) { if(UCNV_GET_VERSION(cnv)==0) { return "UTF-16BE"; @@ -602,6 +605,7 @@ _UTF16BEGetName(const UConverter *cnv) { return "UTF-16BE,version=1"; } } +U_CDECL_END static const UConverterImpl _UTF16BEImpl={ UCNV_UTF16_BigEndian, @@ -644,8 +648,8 @@ const UConverterSharedData _UTF16BEData= UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF16BEStaticData, &_UTF16BEImpl); /* UTF-16LE ----------------------------------------------------------------- */ - -static void +U_CDECL_BEGIN +static void U_CALLCONV _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -849,7 +853,7 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, pArgs->offsets=offsets; } -static void +static void U_CALLCONV _UTF16LEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -1087,7 +1091,7 @@ _UTF16LEToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, pArgs->offsets=offsets; } -static UChar32 +static UChar32 U_CALLCONV _UTF16LEGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { const uint8_t *s, *sourceLimit; UChar32 c; @@ -1166,7 +1170,7 @@ _UTF16LEGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *err) { return c; } -static void +static void U_CALLCONV _UTF16LEReset(UConverter *cnv, UConverterResetChoice choice) { if(choice<=UCNV_RESET_TO_UNICODE) { /* reset toUnicode state */ @@ -1182,10 +1186,11 @@ _UTF16LEReset(UConverter *cnv, UConverterResetChoice choice) { } } -static void +static void U_CALLCONV _UTF16LEOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *pErrorCode) { + (void)pArgs; if(UCNV_GET_VERSION(cnv)<=1) { _UTF16LEReset(cnv, UCNV_RESET_BOTH); } else { @@ -1193,7 +1198,7 @@ _UTF16LEOpen(UConverter *cnv, } } -static const char * +static const char * U_CALLCONV _UTF16LEGetName(const UConverter *cnv) { if(UCNV_GET_VERSION(cnv)==0) { return "UTF-16LE"; @@ -1201,6 +1206,7 @@ _UTF16LEGetName(const UConverter *cnv) { return "UTF-16LE,version=1"; } } +U_CDECL_END static const UConverterImpl _UTF16LEImpl={ UCNV_UTF16_LittleEndian, @@ -1268,8 +1274,8 @@ const UConverterSharedData _UTF16LEData= * - UTF-16BE,version=1 (Java "UnicodeBig" encoding) and * UTF-16LE,version=1 (Java "UnicodeLittle" encoding) treat a reverse BOM as an error. */ - -static void +U_CDECL_BEGIN +static void U_CALLCONV _UTF16Reset(UConverter *cnv, UConverterResetChoice choice) { if(choice<=UCNV_RESET_TO_UNICODE) { /* reset toUnicode: state=0 */ @@ -1280,10 +1286,10 @@ _UTF16Reset(UConverter *cnv, UConverterResetChoice choice) { cnv->fromUnicodeStatus=UCNV_NEED_TO_WRITE_BOM; } } - -static const UConverterSharedData _UTF16v2Data; - -static void +U_CDECL_END +extern const UConverterSharedData _UTF16v2Data; +U_CDECL_BEGIN +static void U_CALLCONV _UTF16Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *pErrorCode) { @@ -1304,7 +1310,7 @@ _UTF16Open(UConverter *cnv, } } -static const char * +static const char * U_CALLCONV _UTF16GetName(const UConverter *cnv) { if(UCNV_GET_VERSION(cnv)==0) { return "UTF-16"; @@ -1314,14 +1320,15 @@ _UTF16GetName(const UConverter *cnv) { return "UTF-16,version=2"; } } - -const UConverterSharedData _UTF16Data; +U_CDECL_END +extern const UConverterSharedData _UTF16Data; #define IS_UTF16BE(cnv) ((cnv)->sharedData==&_UTF16BEData) #define IS_UTF16LE(cnv) ((cnv)->sharedData==&_UTF16LEData) #define IS_UTF16(cnv) ((cnv)->sharedData==&_UTF16Data || (cnv)->sharedData==&_UTF16v2Data) -static void +U_CDECL_BEGIN +static void U_CALLCONV _UTF16ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv=pArgs->converter; @@ -1461,7 +1468,7 @@ _UTF16ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, cnv->mode=state; } -static UChar32 +static UChar32 U_CALLCONV _UTF16GetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { switch(pArgs->converter->mode) { @@ -1473,6 +1480,7 @@ _UTF16GetNextUChar(UConverterToUnicodeArgs *pArgs, return UCNV_GET_NEXT_UCHAR_USE_TO_U; } } +U_CDECL_END static const UConverterImpl _UTF16Impl = { UCNV_UTF16, @@ -1557,7 +1565,7 @@ static const UConverterStaticData _UTF16v2StaticData = { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */ }; -static const UConverterSharedData _UTF16v2Data = +const UConverterSharedData _UTF16v2Data = UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF16v2StaticData, &_UTF16v2Impl); #endif diff --git a/deps/icu-small/source/common/ucnv_u32.c b/deps/icu-small/source/common/ucnv_u32.cpp similarity index 98% rename from deps/icu-small/source/common/ucnv_u32.c rename to deps/icu-small/source/common/ucnv_u32.cpp index fa74b85c93c3b8..3fac04b300ed34 100644 --- a/deps/icu-small/source/common/ucnv_u32.c +++ b/deps/icu-small/source/common/ucnv_u32.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u32.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -42,8 +42,8 @@ enum { }; /* UTF-32BE ----------------------------------------------------------------- */ - -static void +U_CDECL_BEGIN +static void U_CALLCONV T_UConverter_toUnicode_UTF32_BE(UConverterToUnicodeArgs * args, UErrorCode * err) { @@ -122,7 +122,7 @@ T_UConverter_toUnicode_UTF32_BE(UConverterToUnicodeArgs * args, args->source = (const char *) mySource; } -static void +static void U_CALLCONV T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, UErrorCode * err) { @@ -209,7 +209,7 @@ T_UConverter_toUnicode_UTF32_BE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, args->offsets = myOffsets; } -static void +static void U_CALLCONV T_UConverter_fromUnicode_UTF32_BE(UConverterFromUnicodeArgs * args, UErrorCode * err) { @@ -310,7 +310,7 @@ T_UConverter_fromUnicode_UTF32_BE(UConverterFromUnicodeArgs * args, args->source = mySource; } -static void +static void U_CALLCONV T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, UErrorCode * err) { @@ -417,7 +417,7 @@ T_UConverter_fromUnicode_UTF32_BE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, args->offsets = myOffsets; } -static UChar32 +static UChar32 U_CALLCONV T_UConverter_getNextUChar_UTF32_BE(UConverterToUnicodeArgs* args, UErrorCode* err) { @@ -461,7 +461,7 @@ T_UConverter_getNextUChar_UTF32_BE(UConverterToUnicodeArgs* args, *err = U_ILLEGAL_CHAR_FOUND; return 0xffff; } - +U_CDECL_END static const UConverterImpl _UTF32BEImpl = { UCNV_UTF32_BigEndian, @@ -504,8 +504,8 @@ const UConverterSharedData _UTF32BEData = UCNV_IMMUTABLE_SHARED_DATA_INITIALIZER(&_UTF32BEStaticData, &_UTF32BEImpl); /* UTF-32LE ---------------------------------------------------------- */ - -static void +U_CDECL_BEGIN +static void U_CALLCONV T_UConverter_toUnicode_UTF32_LE(UConverterToUnicodeArgs * args, UErrorCode * err) { @@ -590,7 +590,7 @@ T_UConverter_toUnicode_UTF32_LE(UConverterToUnicodeArgs * args, args->source = (const char *) mySource; } -static void +static void U_CALLCONV T_UConverter_toUnicode_UTF32_LE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, UErrorCode * err) { @@ -687,7 +687,7 @@ T_UConverter_toUnicode_UTF32_LE_OFFSET_LOGIC(UConverterToUnicodeArgs * args, args->offsets = myOffsets; } -static void +static void U_CALLCONV T_UConverter_fromUnicode_UTF32_LE(UConverterFromUnicodeArgs * args, UErrorCode * err) { @@ -796,7 +796,7 @@ T_UConverter_fromUnicode_UTF32_LE(UConverterFromUnicodeArgs * args, args->source = mySource; } -static void +static void U_CALLCONV T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, UErrorCode * err) { @@ -912,7 +912,7 @@ T_UConverter_fromUnicode_UTF32_LE_OFFSET_LOGIC(UConverterFromUnicodeArgs * args, args->offsets = myOffsets; } -static UChar32 +static UChar32 U_CALLCONV T_UConverter_getNextUChar_UTF32_LE(UConverterToUnicodeArgs* args, UErrorCode* err) { @@ -956,7 +956,7 @@ T_UConverter_getNextUChar_UTF32_LE(UConverterToUnicodeArgs* args, *err = U_ILLEGAL_CHAR_FOUND; return 0xffff; } - +U_CDECL_END static const UConverterImpl _UTF32LEImpl = { UCNV_UTF32_LittleEndian, @@ -1021,8 +1021,8 @@ const UConverterSharedData _UTF32LEData = * * On output, emit U+FEFF as the first code point. */ - -static void +U_CDECL_BEGIN +static void U_CALLCONV _UTF32Reset(UConverter *cnv, UConverterResetChoice choice) { if(choice<=UCNV_RESET_TO_UNICODE) { /* reset toUnicode: state=0 */ @@ -1034,16 +1034,18 @@ _UTF32Reset(UConverter *cnv, UConverterResetChoice choice) { } } -static void +static void U_CALLCONV _UTF32Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *pErrorCode) { + (void)pArgs; + (void)pErrorCode; _UTF32Reset(cnv, UCNV_RESET_BOTH); } static const char utf32BOM[8]={ 0, 0, (char)0xfe, (char)0xff, (char)0xff, (char)0xfe, 0, 0 }; -static void +static void U_CALLCONV _UTF32ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv=pArgs->converter; @@ -1184,7 +1186,7 @@ _UTF32ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, cnv->mode=state; } -static UChar32 +static UChar32 U_CALLCONV _UTF32GetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { switch(pArgs->converter->mode) { @@ -1196,7 +1198,7 @@ _UTF32GetNextUChar(UConverterToUnicodeArgs *pArgs, return UCNV_GET_NEXT_UCHAR_USE_TO_U; } } - +U_CDECL_END static const UConverterImpl _UTF32Impl = { UCNV_UTF32, diff --git a/deps/icu-small/source/common/ucnv_u7.c b/deps/icu-small/source/common/ucnv_u7.cpp similarity index 99% rename from deps/icu-small/source/common/ucnv_u7.c rename to deps/icu-small/source/common/ucnv_u7.cpp index 3c1d240ed89d6d..ec7befe9fc9a78 100644 --- a/deps/icu-small/source/common/ucnv_u7.c +++ b/deps/icu-small/source/common/ucnv_u7.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u7.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -179,7 +179,8 @@ fromBase64[128]={ * */ -static void +U_CDECL_BEGIN +static void U_CALLCONV _UTF7Reset(UConverter *cnv, UConverterResetChoice choice) { if(choice<=UCNV_RESET_TO_UNICODE) { /* reset toUnicode */ @@ -192,10 +193,11 @@ _UTF7Reset(UConverter *cnv, UConverterResetChoice choice) { } } -static void +static void U_CALLCONV _UTF7Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *pErrorCode) { + (void)pArgs; if(UCNV_GET_VERSION(cnv)<=1) { /* TODO(markus): Should just use cnv->options rather than copying the version number. */ cnv->fromUnicodeStatus=UCNV_GET_VERSION(cnv)<<28; @@ -205,7 +207,7 @@ _UTF7Open(UConverter *cnv, } } -static void +static void U_CALLCONV _UTF7ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -456,7 +458,7 @@ _UTF7ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, return; } -static void +static void U_CALLCONV _UTF7FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -732,7 +734,7 @@ _UTF7FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, return; } -static const char * +static const char * U_CALLCONV _UTF7GetName(const UConverter *cnv) { switch(cnv->fromUnicodeStatus>>28) { case 1: @@ -741,6 +743,7 @@ _UTF7GetName(const UConverter *cnv) { return "UTF-7"; } } +U_CDECL_END static const UConverterImpl _UTF7Impl={ UCNV_UTF7, @@ -887,7 +890,8 @@ const UConverterSharedData _UTF7Data= * ignore bits 31..25 */ -static void +U_CDECL_BEGIN +static void U_CALLCONV _IMAPToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -1155,7 +1159,7 @@ _IMAPToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, return; } -static void +static void U_CALLCONV _IMAPFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -1441,6 +1445,7 @@ _IMAPFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, pArgs->offsets=offsets; return; } +U_CDECL_END static const UConverterImpl _IMAPImpl={ UCNV_IMAP_MAILBOX, @@ -1462,7 +1467,9 @@ static const UConverterImpl _IMAPImpl={ NULL, NULL, /* we don't need writeSub() because we never call a callback at fromUnicode() */ NULL, - ucnv_getCompleteUnicodeSet + ucnv_getCompleteUnicodeSet, + NULL, + NULL }; static const UConverterStaticData _IMAPStaticData={ diff --git a/deps/icu-small/source/common/ucnv_u8.c b/deps/icu-small/source/common/ucnv_u8.cpp similarity index 98% rename from deps/icu-small/source/common/ucnv_u8.c rename to deps/icu-small/source/common/ucnv_u8.cpp index ff73993bd629ef..b2d26f9c3b7f8e 100644 --- a/deps/icu-small/source/common/ucnv_u8.c +++ b/deps/icu-small/source/common/ucnv_u8.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnv_u8.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -97,8 +97,8 @@ static UBool hasCESU8Data(const UConverter *cnv) return (UBool)(cnv->sharedData == &_CESU8Data); #endif } - -static void ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, +U_CDECL_BEGIN +static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, UErrorCode * err) { UConverter *cnv = args->converter; @@ -226,7 +226,7 @@ static void ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, args->source = (const char *) mySource; } -static void ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeArgs * args, +static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeArgs * args, UErrorCode * err) { UConverter *cnv = args->converter; @@ -355,8 +355,9 @@ static void ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeArgs * args, args->source = (const char *) mySource; args->offsets = myOffsets; } +U_CDECL_END -U_CFUNC void ucnv_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args, +U_CFUNC void U_CALLCONV ucnv_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args, UErrorCode * err) { UConverter *cnv = args->converter; @@ -470,7 +471,7 @@ U_CFUNC void ucnv_fromUnicode_UTF8 (UConverterFromUnicodeArgs * args, args->source = mySource; } -U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, +U_CFUNC void U_CALLCONV ucnv_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, UErrorCode * err) { UConverter *cnv = args->converter; @@ -609,7 +610,8 @@ U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC (UConverterFromUnicodeArgs * ar args->offsets = myOffsets; } -static UChar32 ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, +U_CDECL_BEGIN +static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, UErrorCode *err) { UConverter *cnv; const uint8_t *sourceInitial; @@ -751,6 +753,7 @@ static UChar32 ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, *err = U_ILLEGAL_CHAR_FOUND; return 0xffff; } +U_CDECL_END /* UTF-8-from-UTF-8 conversion functions ------------------------------------ */ @@ -762,8 +765,9 @@ utf8_minLegal[5]={ 0, 0, 0x80, 0x800, 0x10000 }; static const UChar32 utf8_offsets[7]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; +U_CDECL_BEGIN /* "Convert" UTF-8 to UTF-8: Validate and copy. Modified from ucnv_DBCSFromUTF8(). */ -static void +static void U_CALLCONV ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, UConverterToUnicodeArgs *pToUArgs, UErrorCode *pErrorCode) { @@ -1008,6 +1012,8 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, pFromUArgs->target=(char *)target; } +U_CDECL_END + /* UTF-8 converter data ----------------------------------------------------- */ static const UConverterImpl _UTF8Impl={ diff --git a/deps/icu-small/source/common/ucnvbocu.cpp b/deps/icu-small/source/common/ucnvbocu.cpp index 69763ca32136af..5b66c5059a55ba 100644 --- a/deps/icu-small/source/common/ucnvbocu.cpp +++ b/deps/icu-small/source/common/ucnvbocu.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnvbocu.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucnvdisp.c b/deps/icu-small/source/common/ucnvdisp.cpp similarity index 97% rename from deps/icu-small/source/common/ucnvdisp.c rename to deps/icu-small/source/common/ucnvdisp.cpp index e30f665f4a08e3..ac86b98597066f 100644 --- a/deps/icu-small/source/common/ucnvdisp.c +++ b/deps/icu-small/source/common/ucnvdisp.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/ucnvhz.c b/deps/icu-small/source/common/ucnvhz.cpp similarity index 98% rename from deps/icu-small/source/common/ucnvhz.c rename to deps/icu-small/source/common/ucnvhz.cpp index dc5785b2adc1f0..5a24575f05c28a 100644 --- a/deps/icu-small/source/common/ucnvhz.c +++ b/deps/icu-small/source/common/ucnvhz.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnvhz.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -67,8 +67,8 @@ typedef struct{ }UConverterDataHZ; - -static void +U_CDECL_BEGIN +static void U_CALLCONV _HZOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ UConverter *gbConverter; if(pArgs->onlyTestIsLoadable) { @@ -94,7 +94,7 @@ _HZOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){ } } -static void +static void U_CALLCONV _HZClose(UConverter *cnv){ if(cnv->extraInfo != NULL) { ucnv_close (((UConverterDataHZ *) (cnv->extraInfo))->gbConverter); @@ -105,7 +105,7 @@ _HZClose(UConverter *cnv){ } } -static void +static void U_CALLCONV _HZReset(UConverter *cnv, UConverterResetChoice choice){ if(choice<=UCNV_RESET_TO_UNICODE) { cnv->toUnicodeStatus = 0; @@ -152,7 +152,7 @@ _HZReset(UConverter *cnv, UConverterResetChoice choice){ */ -static void +static void U_CALLCONV UConverter_toUnicode_HZ_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err){ char tempBuf[2]; @@ -332,7 +332,7 @@ UConverter_toUnicode_HZ_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, } -static void +static void U_CALLCONV UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, UErrorCode * err){ const UChar *mySource = args->source; @@ -496,7 +496,7 @@ UConverter_fromUnicode_HZ_OFFSETS_LOGIC (UConverterFromUnicodeArgs * args, myConverterData->isTargetUCharDBCS = isTargetUCharDBCS; } -static void +static void U_CALLCONV _HZ_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *err) { UConverter *cnv = args->converter; UConverterDataHZ *convData=(UConverterDataHZ *) cnv->extraInfo; @@ -535,7 +535,7 @@ struct cloneHZStruct }; -static UConverter * +static UConverter * U_CALLCONV _HZ_SafeClone(const UConverter *cnv, void *stackBuffer, int32_t *pBufferSize, @@ -568,7 +568,7 @@ _HZ_SafeClone(const UConverter *cnv, return &localClone->cnv; } -static void +static void U_CALLCONV _HZ_GetUnicodeSet(const UConverter *cnv, const USetAdder *sa, UConverterUnicodeSet which, @@ -582,7 +582,7 @@ _HZ_GetUnicodeSet(const UConverter *cnv, sa, which, UCNV_SET_FILTER_HZ, pErrorCode); } - +U_CDECL_END static const UConverterImpl _HZImpl={ UCNV_HZ, @@ -604,7 +604,9 @@ static const UConverterImpl _HZImpl={ NULL, _HZ_WriteSub, _HZ_SafeClone, - _HZ_GetUnicodeSet + _HZ_GetUnicodeSet, + NULL, + NULL }; static const UConverterStaticData _HZStaticData={ diff --git a/deps/icu-small/source/common/ucnvisci.c b/deps/icu-small/source/common/ucnvisci.cpp similarity index 98% rename from deps/icu-small/source/common/ucnvisci.c rename to deps/icu-small/source/common/ucnvisci.cpp index 8b509153514eca..d0c07f2b27fae9 100644 --- a/deps/icu-small/source/common/ucnvisci.c +++ b/deps/icu-small/source/common/ucnvisci.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnvisci.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -186,8 +186,9 @@ isPNJBindiTippi(UChar32 c) { return (UBool)(pnjMap[c - 0xa00] >> 1); } } - -static void _ISCIIOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode) { +U_CDECL_BEGIN +static void U_CALLCONV +_ISCIIOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode) { if(pArgs->onlyTestIsLoadable) { return; } @@ -231,7 +232,8 @@ static void _ISCIIOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *e } } -static void _ISCIIClose(UConverter *cnv) { +static void U_CALLCONV +_ISCIIClose(UConverter *cnv) { if (cnv->extraInfo!=NULL) { if (!cnv->isExtraLocal) { uprv_free(cnv->extraInfo); @@ -240,7 +242,8 @@ static void _ISCIIClose(UConverter *cnv) { } } -static const char* _ISCIIgetName(const UConverter* cnv) { +static const char* U_CALLCONV +_ISCIIgetName(const UConverter* cnv) { if (cnv->extraInfo) { UConverterDataISCII* myData= (UConverterDataISCII*)cnv->extraInfo; return myData->name; @@ -248,7 +251,8 @@ static const char* _ISCIIgetName(const UConverter* cnv) { return NULL; } -static void _ISCIIReset(UConverter *cnv, UConverterResetChoice choice) { +static void U_CALLCONV +_ISCIIReset(UConverter *cnv, UConverterResetChoice choice) { UConverterDataISCII* data =(UConverterDataISCII *) (cnv->extraInfo); if (choice<=UCNV_RESET_TO_UNICODE) { cnv->toUnicodeStatus = missingCharMarker; @@ -888,8 +892,8 @@ static const uint16_t nuktaSpecialCases[][2]={ * Soft Halant : * + */ - -static void UConverter_fromUnicode_ISCII_OFFSETS_LOGIC( +static void U_CALLCONV +UConverter_fromUnicode_ISCII_OFFSETS_LOGIC( UConverterFromUnicodeArgs * args, UErrorCode * err) { const UChar *source = args->source; const UChar *sourceLimit = args->sourceLimit; @@ -1172,7 +1176,8 @@ static const uint16_t lookupTable[][2]={ * */ -static void UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err) { +static void U_CALLCONV +UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, UErrorCode* err) { const char *source = ( char *) args->source; UChar *target = args->target; const char *sourceLimit = args->sourceLimit; @@ -1432,7 +1437,7 @@ static void UConverter_toUnicode_ISCII_OFFSETS_LOGIC(UConverterToUnicodeArgs *ar if (*toUnicodeStatus != missingCharMarker) { /* Check to make sure that consonant clusters are handled correct for Gurmukhi script. */ if (data->currentDeltaToUnicode == PNJ_DELTA && data->prevToUnicodeStatus != 0 && isPNJConsonant(data->prevToUnicodeStatus) && - (*toUnicodeStatus + PNJ_DELTA) == PNJ_SIGN_VIRAMA && (targetUniChar + PNJ_DELTA) == data->prevToUnicodeStatus) { + (*toUnicodeStatus + PNJ_DELTA) == PNJ_SIGN_VIRAMA && ((UChar32)(targetUniChar + PNJ_DELTA) == data->prevToUnicodeStatus)) { /* Consonant clusters C + HALANT + C should be encoded as ADHAK + C */ offset = (int)(source-args->source - 3); tempTargetUniChar = PNJ_ADHAK; /* This is necessary to avoid some compiler warnings. */ @@ -1522,7 +1527,7 @@ struct cloneISCIIStruct { UConverterDataISCII mydata; }; -static UConverter * +static UConverter * U_CALLCONV _ISCII_SafeClone(const UConverter *cnv, void *stackBuffer, int32_t *pBufferSize, @@ -1550,12 +1555,15 @@ _ISCII_SafeClone(const UConverter *cnv, return &localClone->cnv; } -static void +static void U_CALLCONV _ISCIIGetUnicodeSet(const UConverter *cnv, const USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode) { + (void)cnv; + (void)which; + (void)pErrorCode; int32_t idx, script; uint8_t mask; @@ -1576,7 +1584,7 @@ _ISCIIGetUnicodeSet(const UConverter *cnv, sa->add(sa->set, ZWNJ); sa->add(sa->set, ZWJ); } - +U_CDECL_END static const UConverterImpl _ISCIIImpl={ UCNV_ISCII, @@ -1598,7 +1606,9 @@ static const UConverterImpl _ISCIIImpl={ _ISCIIgetName, NULL, _ISCII_SafeClone, - _ISCIIGetUnicodeSet + _ISCIIGetUnicodeSet, + NULL, + NULL }; static const UConverterStaticData _ISCIIStaticData={ diff --git a/deps/icu-small/source/common/ucnvlat1.c b/deps/icu-small/source/common/ucnvlat1.cpp similarity index 97% rename from deps/icu-small/source/common/ucnvlat1.c rename to deps/icu-small/source/common/ucnvlat1.cpp index fe11b1844c4613..7a0dccd4469771 100644 --- a/deps/icu-small/source/common/ucnvlat1.c +++ b/deps/icu-small/source/common/ucnvlat1.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucnvlat1.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -30,7 +30,8 @@ /* ISO 8859-1 --------------------------------------------------------------- */ /* This is a table-less and callback-less version of ucnv_MBCSSingleToBMPWithOffsets(). */ -static void +U_CDECL_BEGIN +static void U_CALLCONV _Latin1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { const uint8_t *source; @@ -116,7 +117,7 @@ _Latin1ToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, } /* This is a table-less and callback-less version of ucnv_MBCSSingleGetNextUChar(). */ -static UChar32 +static UChar32 U_CALLCONV _Latin1GetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { const uint8_t *source=(const uint8_t *)pArgs->source; @@ -131,7 +132,7 @@ _Latin1GetNextUChar(UConverterToUnicodeArgs *pArgs, } /* This is a table-less version of ucnv_MBCSSingleFromBMPWithOffsets(). */ -static void +static void U_CALLCONV _Latin1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -318,7 +319,7 @@ _Latin1FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, } /* Convert UTF-8 to Latin-1. Adapted from ucnv_SBCSFromUTF8(). */ -static void +static void U_CALLCONV ucnv_Latin1FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, UConverterToUnicodeArgs *pToUArgs, UErrorCode *pErrorCode) { @@ -416,13 +417,18 @@ ucnv_Latin1FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, pFromUArgs->target=(char *)target; } -static void +static void U_CALLCONV _Latin1GetUnicodeSet(const UConverter *cnv, const USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode) { + (void)cnv; + (void)which; + (void)pErrorCode; sa->addRange(sa->set, 0, 0xff); } +U_CDECL_END + static const UConverterImpl _Latin1Impl={ UCNV_LATIN_1, @@ -465,8 +471,9 @@ const UConverterSharedData _Latin1Data= /* US-ASCII ----------------------------------------------------------------- */ +U_CDECL_BEGIN /* This is a table-less version of ucnv_MBCSSingleToBMPWithOffsets(). */ -static void +static void U_CALLCONV _ASCIIToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { const uint8_t *source, *sourceLimit; @@ -575,7 +582,7 @@ _ASCIIToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, } /* This is a table-less version of ucnv_MBCSSingleGetNextUChar(). */ -static UChar32 +static UChar32 U_CALLCONV _ASCIIGetNextUChar(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { const uint8_t *source; @@ -602,7 +609,7 @@ _ASCIIGetNextUChar(UConverterToUnicodeArgs *pArgs, } /* "Convert" UTF-8 to US-ASCII: Validate and copy. */ -static void +static void U_CALLCONV ucnv_ASCIIFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, UConverterToUnicodeArgs *pToUArgs, UErrorCode *pErrorCode) { @@ -690,13 +697,17 @@ ucnv_ASCIIFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, pFromUArgs->target=(char *)target; } -static void +static void U_CALLCONV _ASCIIGetUnicodeSet(const UConverter *cnv, const USetAdder *sa, UConverterUnicodeSet which, UErrorCode *pErrorCode) { + (void)cnv; + (void)which; + (void)pErrorCode; sa->addRange(sa->set, 0, 0x7f); } +U_CDECL_END static const UConverterImpl _ASCIIImpl={ UCNV_US_ASCII, diff --git a/deps/icu-small/source/common/ucnvmbcs.cpp b/deps/icu-small/source/common/ucnvmbcs.cpp index 0b598dbc34c256..4412be6739e934 100644 --- a/deps/icu-small/source/common/ucnvmbcs.cpp +++ b/deps/icu-small/source/common/ucnvmbcs.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnvmbcs.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucnvmbcs.h b/deps/icu-small/source/common/ucnvmbcs.h index 12d50b545cc67c..a750b92e499c6e 100644 --- a/deps/icu-small/source/common/ucnvmbcs.h +++ b/deps/icu-small/source/common/ucnvmbcs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnvmbcs.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucnvscsu.c b/deps/icu-small/source/common/ucnvscsu.cpp similarity index 99% rename from deps/icu-small/source/common/ucnvscsu.c rename to deps/icu-small/source/common/ucnvscsu.cpp index 4228b44e7fb1e1..eb7b7ad5c8793e 100644 --- a/deps/icu-small/source/common/ucnvscsu.c +++ b/deps/icu-small/source/common/ucnvscsu.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ucnvscsu.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -154,8 +154,8 @@ enum { }; /* SCSU setup functions ----------------------------------------------------- */ - -static void +U_CDECL_BEGIN +static void U_CALLCONV _SCSUReset(UConverter *cnv, UConverterResetChoice choice) { SCSUData *scsu=(SCSUData *)cnv->extraInfo; @@ -191,7 +191,7 @@ _SCSUReset(UConverter *cnv, UConverterResetChoice choice) { } } -static void +static void U_CALLCONV _SCSUOpen(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *pErrorCode) { @@ -216,7 +216,7 @@ _SCSUOpen(UConverter *cnv, cnv->subCharLen=-1; } -static void +static void U_CALLCONV _SCSUClose(UConverter *cnv) { if(cnv->extraInfo!=NULL) { if(!cnv->isExtraLocal) { @@ -228,7 +228,7 @@ _SCSUClose(UConverter *cnv) { /* SCSU-to-Unicode conversion functions ------------------------------------- */ -static void +static void U_CALLCONV _SCSUToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -582,7 +582,7 @@ _SCSUToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, * re-copy the original function and remove the variables * offsets, sourceIndex, and nextSourceIndex. */ -static void +static void U_CALLCONV _SCSUToUnicode(UConverterToUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -866,7 +866,7 @@ _SCSUToUnicode(UConverterToUnicodeArgs *pArgs, pArgs->target=target; return; } - +U_CDECL_END /* SCSU-from-Unicode conversion functions ----------------------------------- */ /* @@ -989,7 +989,7 @@ getDynamicOffset(uint32_t c, uint32_t *pOffset) { return -1; } } - +U_CDECL_BEGIN /* * Idea for compression: * - save SCSUData and other state before really starting work @@ -1007,7 +1007,7 @@ getDynamicOffset(uint32_t c, uint32_t *pOffset) { * - Only replace the result after an SDX or SCU? */ -static void +static void U_CALLCONV _SCSUFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -1515,7 +1515,7 @@ _SCSUFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, * re-copy the original function and remove the variables * offsets, sourceIndex, and nextSourceIndex. */ -static void +static void U_CALLCONV _SCSUFromUnicode(UConverterFromUnicodeArgs *pArgs, UErrorCode *pErrorCode) { UConverter *cnv; @@ -1949,7 +1949,7 @@ _SCSUFromUnicode(UConverterFromUnicodeArgs *pArgs, /* miscellaneous ------------------------------------------------------------ */ -static const char * +static const char * U_CALLCONV _SCSUGetName(const UConverter *cnv) { SCSUData *scsu=(SCSUData *)cnv->extraInfo; @@ -1968,7 +1968,7 @@ struct cloneSCSUStruct SCSUData mydata; }; -static UConverter * +static UConverter * U_CALLCONV _SCSUSafeClone(const UConverter *cnv, void *stackBuffer, int32_t *pBufferSize, @@ -1995,7 +1995,7 @@ _SCSUSafeClone(const UConverter *cnv, return &localClone->cnv; } - +U_CDECL_END static const UConverterImpl _SCSUImpl={ UCNV_SCSU, @@ -2017,7 +2017,9 @@ static const UConverterImpl _SCSUImpl={ _SCSUGetName, NULL, _SCSUSafeClone, - ucnv_getCompleteUnicodeSet + ucnv_getCompleteUnicodeSet, + NULL, + NULL }; static const UConverterStaticData _SCSUStaticData={ diff --git a/deps/icu-small/source/common/ucnvsel.cpp b/deps/icu-small/source/common/ucnvsel.cpp index f6384cf7497297..90c7a18b93a514 100644 --- a/deps/icu-small/source/common/ucnvsel.cpp +++ b/deps/icu-small/source/common/ucnvsel.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/ucol_data.h b/deps/icu-small/source/common/ucol_data.h index cdd328eccabed7..83f54abba133ab 100644 --- a/deps/icu-small/source/common/ucol_data.h +++ b/deps/icu-small/source/common/ucol_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucol_data.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucol_swp.cpp b/deps/icu-small/source/common/ucol_swp.cpp index ddec0ec1c673b1..3055abaca3ba09 100644 --- a/deps/icu-small/source/common/ucol_swp.cpp +++ b/deps/icu-small/source/common/ucol_swp.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucol_swp.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucol_swp.h b/deps/icu-small/source/common/ucol_swp.h index 422436dd30717d..fd8be9aa54ff45 100644 --- a/deps/icu-small/source/common/ucol_swp.h +++ b/deps/icu-small/source/common/ucol_swp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucol_swp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ucurr.cpp b/deps/icu-small/source/common/ucurr.cpp index 41fd8aa212a174..085f994858136d 100644 --- a/deps/icu-small/source/common/ucurr.cpp +++ b/deps/icu-small/source/common/ucurr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -1030,7 +1030,8 @@ collectCurrencyNames(const char* locale, const UnicodeString *symbol; while ((symbol = iter.next()) != NULL) { (*currencySymbols)[*total_currency_symbol_count].IsoCode = iso; - (*currencySymbols)[*total_currency_symbol_count].currencyName = (UChar*) symbol->getBuffer(); + (*currencySymbols)[*total_currency_symbol_count].currencyName = + const_cast(symbol->getBuffer()); (*currencySymbols)[*total_currency_symbol_count].flag = 0; (*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = symbol->length(); } diff --git a/deps/icu-small/source/common/ucurrimp.h b/deps/icu-small/source/common/ucurrimp.h index b35d6f47c62583..6e468fd4c94299 100644 --- a/deps/icu-small/source/common/ucurrimp.h +++ b/deps/icu-small/source/common/ucurrimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/udata.cpp b/deps/icu-small/source/common/udata.cpp index 7585855171673b..aa23ab719ab6c0 100644 --- a/deps/icu-small/source/common/udata.cpp +++ b/deps/icu-small/source/common/udata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: udata.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -110,8 +110,12 @@ static u_atomic_int32_t gHaveTriedToLoadCommonData = ATOMIC_INT32_T_INITIALIZER( static UHashtable *gCommonDataCache = NULL; /* Global hash table of opened ICU data files. */ static icu::UInitOnce gCommonDataCacheInitOnce = U_INITONCE_INITIALIZER; +#if U_PLATFORM_HAS_WINUWP_API == 0 static UDataFileAccess gDataFileAccess = UDATA_DEFAULT_ACCESS; // Access not synchronized. // Modifying is documented as thread-unsafe. +#else +static UDataFileAccess gDataFileAccess = UDATA_NO_FILES; // Windows UWP looks in one spot explicitly +#endif static UBool U_CALLCONV udata_cleanup(void) @@ -619,12 +623,14 @@ U_NAMESPACE_END /*----------------------------------------------------------------------* * * - * Add a static reference to the common data library * + * Add a static reference to the common data library * * Unless overridden by an explicit udata_setCommonData, this will be * * our common data. * * * *----------------------------------------------------------------------*/ +#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time extern "C" const DataHeader U_DATA_API U_ICUDATA_ENTRY_POINT; +#endif /* * This would be a good place for weak-linkage declarations of @@ -672,6 +678,7 @@ openCommonData(const char *path, /* Path from OpenChoice? */ if(gCommonICUDataArray[commonDataIndex] != NULL) { return gCommonICUDataArray[commonDataIndex]; } +#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time int32_t i; for(i = 0; i < commonDataIndex; ++i) { if(gCommonICUDataArray[i]->pHeader == &U_ICUDATA_ENTRY_POINT) { @@ -679,6 +686,7 @@ openCommonData(const char *path, /* Path from OpenChoice? */ return NULL; } } +#endif } /* Add the linked-in data to the list. */ @@ -694,11 +702,13 @@ openCommonData(const char *path, /* Path from OpenChoice? */ setCommonICUDataPointer(uprv_getICUData_conversion(), FALSE, pErrorCode); } */ +#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time setCommonICUDataPointer(&U_ICUDATA_ENTRY_POINT, FALSE, pErrorCode); { Mutex lock; return gCommonICUDataArray[commonDataIndex]; } +#endif } @@ -1245,9 +1255,14 @@ doOpenChoice(const char *path, const char *type, const char *name, fprintf(stderr, " tocEntryPath = %s\n", tocEntryName.data()); #endif +#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time if(path == NULL) { path = COMMON_DATA_NAME; /* "icudt26e" */ } +#else + // Windows UWP expects only a single data file. + path = COMMON_DATA_NAME; /* "icudt26e" */ +#endif /************************ Begin loop looking for ind. files ***************/ #ifdef UDATA_DEBUG diff --git a/deps/icu-small/source/common/udatamem.c b/deps/icu-small/source/common/udatamem.cpp similarity index 97% rename from deps/icu-small/source/common/udatamem.c rename to deps/icu-small/source/common/udatamem.cpp index daa919373b71bb..6bf7c01235c5e0 100644 --- a/deps/icu-small/source/common/udatamem.c +++ b/deps/icu-small/source/common/udatamem.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -44,7 +44,7 @@ U_CFUNC UDataMemory *UDataMemory_createNewInstance(UErrorCode *pErr) { if (U_FAILURE(*pErr)) { return NULL; } - This = uprv_malloc(sizeof(UDataMemory)); + This = (UDataMemory *)uprv_malloc(sizeof(UDataMemory)); if (This == NULL) { *pErr = U_MEMORY_ALLOCATION_ERROR; } else { diff --git a/deps/icu-small/source/common/udatamem.h b/deps/icu-small/source/common/udatamem.h index 385a77722cc87f..a05dd69756825e 100644 --- a/deps/icu-small/source/common/udatamem.h +++ b/deps/icu-small/source/common/udatamem.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/udataswp.c b/deps/icu-small/source/common/udataswp.cpp similarity index 98% rename from deps/icu-small/source/common/udataswp.c rename to deps/icu-small/source/common/udataswp.cpp index f47ac1f5e06f35..86f302bd9c3ab9 100644 --- a/deps/icu-small/source/common/udataswp.c +++ b/deps/icu-small/source/common/udataswp.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: udataswp.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -374,7 +374,7 @@ udata_openSwapper(UBool inIsBigEndian, uint8_t inCharset, } /* allocate the swapper */ - swapper=uprv_malloc(sizeof(UDataSwapper)); + swapper=(UDataSwapper *)uprv_malloc(sizeof(UDataSwapper)); if(swapper==NULL) { *pErrorCode=U_MEMORY_ALLOCATION_ERROR; return NULL; @@ -435,7 +435,7 @@ udata_openSwapperForInputData(const void *data, int32_t length, } pHeader=(const DataHeader *)data; - if( (length>=0 && length=0 && length<(int32_t)sizeof(DataHeader)) || pHeader->dataHeader.magic1!=0xda || pHeader->dataHeader.magic2!=0x27 || pHeader->info.sizeofUChar!=2 diff --git a/deps/icu-small/source/common/udataswp.h b/deps/icu-small/source/common/udataswp.h index 07e06c221a7075..5303870b1d3046 100644 --- a/deps/icu-small/source/common/udataswp.h +++ b/deps/icu-small/source/common/udataswp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: udataswp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uelement.h b/deps/icu-small/source/common/uelement.h index 9231f40ba1e8f2..9d45f09fb87f65 100644 --- a/deps/icu-small/source/common/uelement.h +++ b/deps/icu-small/source/common/uelement.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: uelement.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uenum.c b/deps/icu-small/source/common/uenum.cpp similarity index 98% rename from deps/icu-small/source/common/uenum.c rename to deps/icu-small/source/common/uenum.cpp index 4854b377c90872..f75cfb7ac3ff6a 100644 --- a/deps/icu-small/source/common/uenum.c +++ b/deps/icu-small/source/common/uenum.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uenum.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * diff --git a/deps/icu-small/source/common/uenumimp.h b/deps/icu-small/source/common/uenumimp.h index 04baac5dd13a34..93854406403b39 100644 --- a/deps/icu-small/source/common/uenumimp.h +++ b/deps/icu-small/source/common/uenumimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uenumimp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * diff --git a/deps/icu-small/source/common/uhash.c b/deps/icu-small/source/common/uhash.cpp similarity index 99% rename from deps/icu-small/source/common/uhash.c rename to deps/icu-small/source/common/uhash.cpp index 02572c80ea9f3b..0e2a3c03c62f50 100644 --- a/deps/icu-small/source/common/uhash.c +++ b/deps/icu-small/source/common/uhash.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/uhash.h b/deps/icu-small/source/common/uhash.h index 4aa50e40853c81..2e7cf6a394c912 100644 --- a/deps/icu-small/source/common/uhash.h +++ b/deps/icu-small/source/common/uhash.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/uhash_us.cpp b/deps/icu-small/source/common/uhash_us.cpp index ac76c1b97821f6..ef482c27463322 100644 --- a/deps/icu-small/source/common/uhash_us.cpp +++ b/deps/icu-small/source/common/uhash_us.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/uidna.cpp b/deps/icu-small/source/common/uidna.cpp index 2f133198491a9a..6d56fcb8f517af 100644 --- a/deps/icu-small/source/common/uidna.cpp +++ b/deps/icu-small/source/common/uidna.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uidna.cpp - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uinit.cpp b/deps/icu-small/source/common/uinit.cpp index 34e82a3db41752..624431be02c713 100644 --- a/deps/icu-small/source/common/uinit.cpp +++ b/deps/icu-small/source/common/uinit.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: uinit.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uinvchar.c b/deps/icu-small/source/common/uinvchar.cpp similarity index 99% rename from deps/icu-small/source/common/uinvchar.c rename to deps/icu-small/source/common/uinvchar.cpp index f1dbe4fe33e8f9..ed1ab8e761eef6 100644 --- a/deps/icu-small/source/common/uinvchar.c +++ b/deps/icu-small/source/common/uinvchar.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uinvchar.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * @@ -451,6 +451,7 @@ U_CFUNC int32_t uprv_compareInvAscii(const UDataSwapper *ds, const char *outString, int32_t outLength, const UChar *localString, int32_t localLength) { + (void)ds; int32_t minLength; UChar32 c1, c2; uint8_t c; @@ -496,6 +497,7 @@ U_CFUNC int32_t uprv_compareInvEbcdic(const UDataSwapper *ds, const char *outString, int32_t outLength, const UChar *localString, int32_t localLength) { + (void)ds; int32_t minLength; UChar32 c1, c2; uint8_t c; diff --git a/deps/icu-small/source/common/uinvchar.h b/deps/icu-small/source/common/uinvchar.h index 19a3b2696e758b..c4f9f88b9ad32f 100644 --- a/deps/icu-small/source/common/uinvchar.h +++ b/deps/icu-small/source/common/uinvchar.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uinvchar.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * @@ -64,7 +64,7 @@ uprv_isInvariantUString(const UChar *s, int32_t length); */ U_INTERNAL inline UBool U_EXPORT2 uprv_isInvariantUnicodeString(const icu::UnicodeString &s) { - return uprv_isInvariantUString(s.getBuffer(), s.length()); + return uprv_isInvariantUString(icu::toUCharPtr(s.getBuffer()), s.length()); } #endif /* __cplusplus */ diff --git a/deps/icu-small/source/common/uiter.cpp b/deps/icu-small/source/common/uiter.cpp index 26ca877814d0e8..b9252d81c2db5c 100644 --- a/deps/icu-small/source/common/uiter.cpp +++ b/deps/icu-small/source/common/uiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uiter.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ulist.c b/deps/icu-small/source/common/ulist.cpp similarity index 94% rename from deps/icu-small/source/common/ulist.c rename to deps/icu-small/source/common/ulist.cpp index 3b8e6c53ed583a..d4549328ea55fb 100644 --- a/deps/icu-small/source/common/ulist.c +++ b/deps/icu-small/source/common/ulist.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -29,7 +29,6 @@ struct UList { UListNode *tail; int32_t size; - int32_t currentIndex; }; static void ulist_addFirstItem(UList *list, UListNode *newItem); @@ -51,7 +50,6 @@ U_CAPI UList *U_EXPORT2 ulist_createEmptyList(UErrorCode *status) { newList->head = NULL; newList->tail = NULL; newList->size = 0; - newList->currentIndex = -1; return newList; } @@ -80,8 +78,9 @@ static void ulist_removeItem(UList *list, UListNode *p) { } else { p->next->previous = p->previous; } - list->curr = NULL; - list->currentIndex = 0; + if (p == list->curr) { + list->curr = p->next; + } --list->size; if (p->forceDelete) { uprv_free(p->data); @@ -150,7 +149,6 @@ U_CAPI void U_EXPORT2 ulist_addItemBeginList(UList *list, const void *data, UBoo newItem->next = list->head; list->head->previous = newItem; list->head = newItem; - list->currentIndex++; } list->size++; @@ -160,7 +158,7 @@ U_CAPI UBool U_EXPORT2 ulist_containsString(const UList *list, const char *data, if (list != NULL) { const UListNode *pointer; for (pointer = list->head; pointer != NULL; pointer = pointer->next) { - if (length == uprv_strlen(pointer->data)) { + if (length == (int32_t)uprv_strlen((const char *)pointer->data)) { if (uprv_memcmp(data, pointer->data, length) == 0) { return TRUE; } @@ -174,7 +172,7 @@ U_CAPI UBool U_EXPORT2 ulist_removeString(UList *list, const char *data) { if (list != NULL) { UListNode *pointer; for (pointer = list->head; pointer != NULL; pointer = pointer->next) { - if (uprv_strcmp(data, pointer->data) == 0) { + if (uprv_strcmp(data, (const char *)pointer->data) == 0) { ulist_removeItem(list, pointer); // Remove only the first occurrence, like Java LinkedList.remove(Object). return TRUE; @@ -193,7 +191,6 @@ U_CAPI void *U_EXPORT2 ulist_getNext(UList *list) { curr = list->curr; list->curr = curr->next; - list->currentIndex++; return curr->data; } @@ -209,7 +206,6 @@ U_CAPI int32_t U_EXPORT2 ulist_getListSize(const UList *list) { U_CAPI void U_EXPORT2 ulist_resetList(UList *list) { if (list != NULL) { list->curr = list->head; - list->currentIndex = 0; } } diff --git a/deps/icu-small/source/common/ulist.h b/deps/icu-small/source/common/ulist.h index 6f292bf9dcaff1..de58a4ad02c178 100644 --- a/deps/icu-small/source/common/ulist.h +++ b/deps/icu-small/source/common/ulist.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/ulistformatter.cpp b/deps/icu-small/source/common/ulistformatter.cpp index 98aa50e25fb604..c140c784b520cd 100644 --- a/deps/icu-small/source/common/ulistformatter.cpp +++ b/deps/icu-small/source/common/ulistformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/deps/icu-small/source/common/uloc.cpp b/deps/icu-small/source/common/uloc.cpp index 2a02b27c5ba1f7..4d854bbcca320e 100644 --- a/deps/icu-small/source/common/uloc.cpp +++ b/deps/icu-small/source/common/uloc.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -44,10 +44,11 @@ #include "uarrsort.h" #include "uenumimp.h" #include "uassert.h" +#include "charstr.h" #include /* for sprintf */ -using namespace icu; +U_NAMESPACE_USE /* ### Declarations **************************************************/ @@ -101,7 +102,7 @@ static const char * const LANGUAGES[] = { "aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", "af", "afh", "agq", "ain", "ak", "akk", "akz", "ale", "aln", "alt", "am", "an", "ang", "anp", "ar", "arc", - "arn", "aro", "arp", "arq", "arw", "ary", "arz", "as", + "arn", "aro", "arp", "arq", "ars", "arw", "ary", "arz", "as", "asa", "ase", "ast", "av", "avk", "awa", "ay", "az", "ba", "bal", "ban", "bar", "bas", "bax", "bbc", "bbj", "be", "bej", "bem", "bew", "bez", "bfd", "bfq", "bg", @@ -216,7 +217,7 @@ static const char * const LANGUAGES_3[] = { "aar", "abk", "ace", "ach", "ada", "ady", "ave", "aeb", "afr", "afh", "agq", "ain", "aka", "akk", "akz", "ale", "aln", "alt", "amh", "arg", "ang", "anp", "ara", "arc", - "arn", "aro", "arp", "arq", "arw", "ary", "arz", "asm", + "arn", "aro", "arp", "arq", "ars", "arw", "ary", "arz", "asm", "asa", "ase", "ast", "ava", "avk", "awa", "aym", "aze", "bak", "bal", "ban", "bar", "bas", "bax", "bbc", "bbj", "bel", "bej", "bem", "bew", "bez", "bfd", "bfq", "bul", @@ -560,6 +561,10 @@ static int32_t getShortestSubtagLength(const char *localeID) { } /* ### Keywords **************************************************/ +#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) +#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) +/* Punctuation/symbols allowed in legacy key values */ +#define UPRV_OK_VALUE_PUNCTUATION(c) ((c) == '_' || (c) == '-' || (c) == '+' || (c) == '/') #define ULOC_KEYWORD_BUFFER_LEN 25 #define ULOC_MAX_NO_KEYWORDS 25 @@ -596,20 +601,26 @@ locale_getKeywordsStart(const char *localeID) { */ static int32_t locale_canonKeywordName(char *buf, const char *keywordName, UErrorCode *status) { - int32_t i; - int32_t keywordNameLen = (int32_t)uprv_strlen(keywordName); + int32_t keywordNameLen = 0; - if(keywordNameLen >= ULOC_KEYWORD_BUFFER_LEN) { - /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; - return 0; + for (; *keywordName != 0; keywordName++) { + if (!UPRV_ISALPHANUM(*keywordName)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return 0; + } + if (keywordNameLen < ULOC_KEYWORD_BUFFER_LEN - 1) { + buf[keywordNameLen++] = uprv_tolower(*keywordName); + } else { + /* keyword name too long for internal buffer */ + *status = U_INTERNAL_PROGRAM_ERROR; + return 0; + } } - - /* normalize the keyword name */ - for(i = 0; i < keywordNameLen; i++) { - buf[i] = uprv_tolower(keywordName[i]); + if (keywordNameLen == 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name */ + return 0; } - buf[i] = 0; + buf[keywordNameLen] = 0; /* terminate */ return keywordNameLen; } @@ -837,87 +848,108 @@ uloc_getKeywordValue(const char* localeID, const char* nextSeparator = NULL; char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; char localeKeywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - int32_t i = 0; int32_t result = 0; if(status && U_SUCCESS(*status) && localeID) { char tempBuffer[ULOC_FULLNAME_CAPACITY]; const char* tmpLocaleID; + if (keywordName == NULL || keywordName[0] == 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + locale_canonKeywordName(keywordNameBuffer, keywordName, status); + if(U_FAILURE(*status)) { + return 0; + } + if (_hasBCP47Extension(localeID)) { _ConvertBCP47(tmpLocaleID, localeID, tempBuffer, sizeof(tempBuffer), status); } else { tmpLocaleID=localeID; } - startSearchHere = uprv_strchr(tmpLocaleID, '@'); /* TODO: REVISIT: shouldn't this be locale_getKeywordsStart ? */ + startSearchHere = locale_getKeywordsStart(tmpLocaleID); if(startSearchHere == NULL) { /* no keywords, return at once */ return 0; } - locale_canonKeywordName(keywordNameBuffer, keywordName, status); - if(U_FAILURE(*status)) { - return 0; - } - /* find the first keyword */ while(startSearchHere) { - startSearchHere++; - /* skip leading spaces (allowed?) */ + const char* keyValueTail; + int32_t keyValueLen; + + startSearchHere++; /* skip @ or ; */ + nextSeparator = uprv_strchr(startSearchHere, '='); + if(!nextSeparator) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* key must have =value */ + return 0; + } + /* strip leading & trailing spaces (TC decided to tolerate these) */ while(*startSearchHere == ' ') { startSearchHere++; } - nextSeparator = uprv_strchr(startSearchHere, '='); - /* need to normalize both keyword and keyword name */ - if(!nextSeparator) { - break; + keyValueTail = nextSeparator; + while (keyValueTail > startSearchHere && *(keyValueTail-1) == ' ') { + keyValueTail--; + } + /* now keyValueTail points to first char after the keyName */ + /* copy & normalize keyName from locale */ + if (startSearchHere == keyValueTail) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ + return 0; } - if(nextSeparator - startSearchHere >= ULOC_KEYWORD_BUFFER_LEN) { + keyValueLen = 0; + while (startSearchHere < keyValueTail) { + if (!UPRV_ISALPHANUM(*startSearchHere)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return 0; + } + if (keyValueLen < ULOC_KEYWORD_BUFFER_LEN - 1) { + localeKeywordNameBuffer[keyValueLen++] = uprv_tolower(*startSearchHere++); + } else { /* keyword name too long for internal buffer */ *status = U_INTERNAL_PROGRAM_ERROR; return 0; + } } - for(i = 0; i < nextSeparator - startSearchHere; i++) { - localeKeywordNameBuffer[i] = uprv_tolower(startSearchHere[i]); - } - /* trim trailing spaces */ - while(startSearchHere[i-1] == ' ') { - i--; - U_ASSERT(i>=0); - } - localeKeywordNameBuffer[i] = 0; + localeKeywordNameBuffer[keyValueLen] = 0; /* terminate */ startSearchHere = uprv_strchr(nextSeparator, ';'); if(uprv_strcmp(keywordNameBuffer, localeKeywordNameBuffer) == 0) { - nextSeparator++; + /* current entry matches the keyword. */ + nextSeparator++; /* skip '=' */ + /* First strip leading & trailing spaces (TC decided to tolerate these) */ while(*nextSeparator == ' ') { - nextSeparator++; + nextSeparator++; + } + keyValueTail = (startSearchHere)? startSearchHere: nextSeparator + uprv_strlen(nextSeparator); + while(keyValueTail > nextSeparator && *(keyValueTail-1) == ' ') { + keyValueTail--; + } + /* Now copy the value, but check well-formedness */ + if (nextSeparator == keyValueTail) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value name in passed-in locale */ + return 0; } - /* we actually found the keyword. Copy the value */ - if(startSearchHere && startSearchHere - nextSeparator < bufferCapacity) { - while(*(startSearchHere-1) == ' ') { - startSearchHere--; - } - uprv_strncpy(buffer, nextSeparator, startSearchHere - nextSeparator); - result = u_terminateChars(buffer, bufferCapacity, (int32_t)(startSearchHere - nextSeparator), status); - } else if(!startSearchHere && (int32_t)uprv_strlen(nextSeparator) < bufferCapacity) { /* last item in string */ - i = (int32_t)uprv_strlen(nextSeparator); - while(nextSeparator[i - 1] == ' ') { - i--; - } - uprv_strncpy(buffer, nextSeparator, i); - result = u_terminateChars(buffer, bufferCapacity, i, status); - } else { - /* give a bigger buffer, please */ - *status = U_BUFFER_OVERFLOW_ERROR; - if(startSearchHere) { - result = (int32_t)(startSearchHere - nextSeparator); - } else { - result = (int32_t)uprv_strlen(nextSeparator); - } + keyValueLen = 0; + while (nextSeparator < keyValueTail) { + if (!UPRV_ISALPHANUM(*nextSeparator) && !UPRV_OK_VALUE_PUNCTUATION(*nextSeparator)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed key value */ + return 0; + } + if (keyValueLen < bufferCapacity) { + /* Should we lowercase value to return here? Tests expect as-is. */ + buffer[keyValueLen++] = *nextSeparator++; + } else { /* keep advancing so we return correct length in case of overflow */ + keyValueLen++; + nextSeparator++; + } } + result = u_terminateChars(buffer, bufferCapacity, keyValueLen, status); return result; } } @@ -936,46 +968,59 @@ uloc_setKeywordValue(const char* keywordName, int32_t keywordValueLen; int32_t bufLen; int32_t needLen = 0; - int32_t foundValueLen; - int32_t keywordAtEnd = 0; /* is the keyword at the end of the string? */ char keywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; + char keywordValueBuffer[ULOC_KEYWORDS_CAPACITY+1]; char localeKeywordNameBuffer[ULOC_KEYWORD_BUFFER_LEN]; - int32_t i = 0; int32_t rc; char* nextSeparator = NULL; char* nextEqualsign = NULL; char* startSearchHere = NULL; char* keywordStart = NULL; - char *insertHere = NULL; + CharString updatedKeysAndValues; + int32_t updatedKeysAndValuesLen; + UBool handledInputKeyAndValue = FALSE; + char keyValuePrefix = '@'; + if(U_FAILURE(*status)) { return -1; } - if(bufferCapacity>1) { - bufLen = (int32_t)uprv_strlen(buffer); - } else { + if (keywordName == NULL || keywordName[0] == 0 || bufferCapacity <= 1) { *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } + bufLen = (int32_t)uprv_strlen(buffer); if(bufferCapacity= ULOC_KEYWORD_BUFFER_LEN) { - /* keyword name too long for internal buffer */ - *status = U_INTERNAL_PROGRAM_ERROR; + /* now keyValueTail points to first char after the keyName */ + /* copy & normalize keyName from locale */ + if (keywordStart == keyValueTail) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty keyword name in passed-in locale */ return 0; } - for(i = 0; i < nextEqualsign - keywordStart; i++) { - localeKeywordNameBuffer[i] = uprv_tolower(keywordStart[i]); - } - /* trim trailing spaces */ - while(keywordStart[i-1] == ' ') { - i--; + keyValueLen = 0; + while (keywordStart < keyValueTail) { + if (!UPRV_ISALPHANUM(*keywordStart)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* malformed keyword name */ + return 0; + } + if (keyValueLen < ULOC_KEYWORD_BUFFER_LEN - 1) { + localeKeywordNameBuffer[keyValueLen++] = uprv_tolower(*keywordStart++); + } else { + /* keyword name too long for internal buffer */ + *status = U_INTERNAL_PROGRAM_ERROR; + return 0; + } } - U_ASSERT(i>=0 && i nextEqualsign && *(keyValueTail-1) == ' ') { + keyValueTail--; + } + if (nextEqualsign == keyValueTail) { + *status = U_ILLEGAL_ARGUMENT_ERROR; /* empty key value in passed-in locale */ + return 0; + } + rc = uprv_strcmp(keywordNameBuffer, localeKeywordNameBuffer); if(rc == 0) { - nextEqualsign++; - while(*nextEqualsign == ' ') { - nextEqualsign++; - } - /* we actually found the keyword. Change the value */ - if (nextSeparator) { - keywordAtEnd = 0; - foundValueLen = (int32_t)(nextSeparator - nextEqualsign); - } else { - keywordAtEnd = 1; - foundValueLen = (int32_t)uprv_strlen(nextEqualsign); - } - if(keywordValue) { /* adding a value - not removing */ - if(foundValueLen == keywordValueLen) { - uprv_strncpy(nextEqualsign, keywordValue, keywordValueLen); - return bufLen; /* no change in size */ - } else if(foundValueLen > keywordValueLen) { - int32_t delta = foundValueLen - keywordValueLen; - if(nextSeparator) { /* RH side */ - uprv_memmove(nextSeparator - delta, nextSeparator, bufLen-(nextSeparator-buffer)); - } - uprv_strncpy(nextEqualsign, keywordValue, keywordValueLen); - bufLen -= delta; - buffer[bufLen]=0; - return bufLen; - } else { /* FVL < KVL */ - int32_t delta = keywordValueLen - foundValueLen; - if((bufLen+delta) >= bufferCapacity) { - *status = U_BUFFER_OVERFLOW_ERROR; - return bufLen+delta; - } - if(nextSeparator) { /* RH side */ - uprv_memmove(nextSeparator+delta,nextSeparator, bufLen-(nextSeparator-buffer)); - } - uprv_strncpy(nextEqualsign, keywordValue, keywordValueLen); - bufLen += delta; - buffer[bufLen]=0; - return bufLen; - } - } else { /* removing a keyword */ - if(keywordAtEnd) { - /* zero out the ';' or '@' just before startSearchhere */ - keywordStart[-1] = 0; - return (int32_t)((keywordStart-buffer)-1); /* (string length without keyword) minus separator */ - } else { - uprv_memmove(keywordStart, nextSeparator+1, bufLen-((nextSeparator+1)-buffer)); - keywordStart[bufLen-((nextSeparator+1)-buffer)]=0; - return (int32_t)(bufLen-((nextSeparator+1)-keywordStart)); - } + /* Current entry matches the input keyword. Update the entry */ + if(keywordValueLen > 0) { /* updating a value */ + updatedKeysAndValues.append(keyValuePrefix, *status); + keyValuePrefix = ';'; /* for any subsequent key-value pair */ + updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); + updatedKeysAndValues.append('=', *status); + updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + } /* else removing this entry, don't emit anything */ + handledInputKeyAndValue = TRUE; + } else { + /* input keyword sorts earlier than current entry, add before current entry */ + if (rc < 0 && keywordValueLen > 0 && !handledInputKeyAndValue) { + /* insert new entry at this location */ + updatedKeysAndValues.append(keyValuePrefix, *status); + keyValuePrefix = ';'; /* for any subsequent key-value pair */ + updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); + updatedKeysAndValues.append('=', *status); + updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + handledInputKeyAndValue = TRUE; } - } else if(rc<0){ /* end match keyword */ - /* could insert at this location. */ - insertHere = keywordStart; + /* copy the current entry */ + updatedKeysAndValues.append(keyValuePrefix, *status); + keyValuePrefix = ';'; /* for any subsequent key-value pair */ + updatedKeysAndValues.append(localeKeywordNameBuffer, keyValueLen, *status); + updatedKeysAndValues.append('=', *status); + updatedKeysAndValues.append(nextEqualsign, keyValueTail-nextEqualsign, *status); + } + if (!nextSeparator && keywordValueLen > 0 && !handledInputKeyAndValue) { + /* append new entry at the end, it sorts later than existing entries */ + updatedKeysAndValues.append(keyValuePrefix, *status); + /* skip keyValuePrefix update, no subsequent key-value pair */ + updatedKeysAndValues.append(keywordNameBuffer, keywordNameLen, *status); + updatedKeysAndValues.append('=', *status); + updatedKeysAndValues.append(keywordValueBuffer, keywordValueLen, *status); + handledInputKeyAndValue = TRUE; } keywordStart = nextSeparator; } /* end loop searching */ - if(!keywordValue) { - return bufLen; /* removal of non-extant keyword - no change */ - } - - /* we know there is at least one keyword. */ - needLen = bufLen+1+keywordNameLen+1+keywordValueLen; + /* Any error from updatedKeysAndValues.append above would be internal and not due to + * problems with the passed-in locale. So if we did encounter problems with the + * passed-in locale above, those errors took precedence and overrode any error + * status from updatedKeysAndValues.append, and also caused a return of 0. If there + * are errors here they are from updatedKeysAndValues.append; they do cause an + * error return but the passed-in locale is unmodified and the original bufLen is + * returned. + */ + if (!handledInputKeyAndValue || U_FAILURE(*status)) { + /* if input key/value specified removal of a keyword not present in locale, or + * there was an error in CharString.append, leave original locale alone. */ + return bufLen; + } + + updatedKeysAndValuesLen = updatedKeysAndValues.length(); + /* needLen = length of the part before '@' + length of updated key-value part including '@' */ + needLen = (int32_t)(startSearchHere - buffer) + updatedKeysAndValuesLen; if(needLen >= bufferCapacity) { *status = U_BUFFER_OVERFLOW_ERROR; return needLen; /* no change */ } - - if(insertHere) { - uprv_memmove(insertHere+(1+keywordNameLen+1+keywordValueLen), insertHere, bufLen-(insertHere-buffer)); - keywordStart = insertHere; - } else { - keywordStart = buffer+bufLen; - *keywordStart = ';'; - keywordStart++; - } - uprv_strncpy(keywordStart, keywordNameBuffer, keywordNameLen); - keywordStart += keywordNameLen; - *keywordStart = '='; - keywordStart++; - uprv_strncpy(keywordStart, keywordValue, keywordValueLen); /* terminates. */ - keywordStart+=keywordValueLen; - if(insertHere) { - *keywordStart = ';'; - keywordStart++; + if (updatedKeysAndValuesLen > 0) { + uprv_strncpy(startSearchHere, updatedKeysAndValues.data(), updatedKeysAndValuesLen); } buffer[needLen]=0; return needLen; @@ -2119,6 +2168,20 @@ uloc_getLCID(const char* localeID) { UErrorCode status = U_ZERO_ERROR; char langID[ULOC_FULLNAME_CAPACITY]; + uint32_t lcid = 0; + + /* Check for incomplete id. */ + if (!localeID || uprv_strlen(localeID) < 2) { + return 0; + } + + // Attempt platform lookup if available + lcid = uprv_convertToLCIDPlatform(localeID); + if (lcid > 0) + { + // Windows found an LCID, return that + return lcid; + } uloc_getLanguage(localeID, langID, sizeof(langID), &status); if (U_FAILURE(status)) { @@ -2529,9 +2592,6 @@ uloc_toUnicodeLocaleType(const char* keyword, const char* value) return bcpType; } -#define UPRV_ISDIGIT(c) (((c) >= '0') && ((c) <= '9')) -#define UPRV_ISALPHANUM(c) (uprv_isASCIILetter(c) || UPRV_ISDIGIT(c) ) - static UBool isWellFormedLegacyKey(const char* legacyKey) { @@ -2574,11 +2634,10 @@ uloc_toLegacyKey(const char* keyword) // Checks if the specified locale key is well-formed with the legacy locale syntax. // // Note: - // Neither ICU nor LDML/CLDR provides the definition of keyword syntax. - // However, a key should not contain '=' obviously. For now, all existing - // keys are using ASCII alphabetic letters only. We won't add any new key - // that is not compatible with the BCP 47 syntax. Therefore, we assume - // a valid key consist from [0-9a-zA-Z], no symbols. + // LDML/CLDR provides some definition of keyword syntax in + // * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier and + // * http://www.unicode.org/reports/tr35/#Old_Locale_Extension_Syntax + // Keys can only consist of [0-9a-zA-Z]. if (isWellFormedLegacyKey(keyword)) { return keyword; } @@ -2594,12 +2653,11 @@ uloc_toLegacyType(const char* keyword, const char* value) // Checks if the specified locale type is well-formed with the legacy locale syntax. // // Note: - // Neither ICU nor LDML/CLDR provides the definition of keyword syntax. - // However, a type should not contain '=' obviously. For now, all existing - // types are using ASCII alphabetic letters with a few symbol letters. We won't - // add any new type that is not compatible with the BCP 47 syntax except timezone - // IDs. For now, we assume a valid type start with [0-9a-zA-Z], but may contain - // '-' '_' '/' in the middle. + // LDML/CLDR provides some definition of keyword syntax in + // * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier and + // * http://www.unicode.org/reports/tr35/#Old_Locale_Extension_Syntax + // Values (types) can only consist of [0-9a-zA-Z], plus for legacy values + // we allow [/_-+] in the middle (e.g. "Etc/GMT+1", "Asia/Tel_Aviv") if (isWellFormedLegacyType(value)) { return value; } diff --git a/deps/icu-small/source/common/uloc_keytype.cpp b/deps/icu-small/source/common/uloc_keytype.cpp index 0bb337b1ff6ace..04b566a5d68b40 100644 --- a/deps/icu-small/source/common/uloc_keytype.cpp +++ b/deps/icu-small/source/common/uloc_keytype.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/uloc_tag.c b/deps/icu-small/source/common/uloc_tag.cpp similarity index 99% rename from deps/icu-small/source/common/uloc_tag.c rename to deps/icu-small/source/common/uloc_tag.cpp index 168b71256f7429..856407defe1ea1 100644 --- a/deps/icu-small/source/common/uloc_tag.c +++ b/deps/icu-small/source/common/uloc_tag.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -823,7 +823,7 @@ _appendVariantsToLanguageTag(const char* localeID, char* appendAt, int32_t capac /* validate */ if (_isVariantSubtag(pVar, -1)) { - if (uprv_strcmp(pVar,POSIX_VALUE) || len != uprv_strlen(POSIX_VALUE)) { + if (uprv_strcmp(pVar,POSIX_VALUE) || len != (int32_t)uprv_strlen(POSIX_VALUE)) { /* emit the variant to the list */ var = (VariantListEntry*)uprv_malloc(sizeof(VariantListEntry)); if (var == NULL) { @@ -923,7 +923,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac char extBuf[ULOC_KEYWORD_AND_VALUES_CAPACITY]; char *pExtBuf = extBuf; int32_t extBufCapacity = sizeof(extBuf); - const char *bcpKey, *bcpValue; + const char *bcpKey=nullptr, *bcpValue=nullptr; UErrorCode tmpStatus = U_ZERO_ERROR; int32_t keylen; UBool isBcpUExt; @@ -1371,7 +1371,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT U_ASSERT(pBcpKey != NULL); - if (bcpKeyLen >= sizeof(bcpKeyBuf)) { + if (bcpKeyLen >= (int32_t)sizeof(bcpKeyBuf)) { /* the BCP key is invalid */ *status = U_ILLEGAL_ARGUMENT_ERROR; goto cleanup; @@ -1406,7 +1406,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT if (pBcpType) { char bcpTypeBuf[128]; /* practically long enough even considering multiple subtag type */ - if (bcpTypeLen >= sizeof(bcpTypeBuf)) { + if (bcpTypeLen >= (int32_t)sizeof(bcpTypeBuf)) { /* the BCP type is too long */ *status = U_ILLEGAL_ARGUMENT_ERROR; goto cleanup; @@ -1642,6 +1642,7 @@ _appendKeywords(ULanguageTag* langtag, char* appendAt, int32_t capacity, UErrorC static int32_t _appendPrivateuseToLanguageTag(const char* localeID, char* appendAt, int32_t capacity, UBool strict, UBool hadPosix, UErrorCode* status) { + (void)hadPosix; char buf[ULOC_FULLNAME_CAPACITY]; char tmpAppend[ULOC_FULLNAME_CAPACITY]; UErrorCode tmpStatus = U_ZERO_ERROR; diff --git a/deps/icu-small/source/common/ulocimp.h b/deps/icu-small/source/common/ulocimp.h index 26d5c7963e0862..855f9235dc636f 100644 --- a/deps/icu-small/source/common/ulocimp.h +++ b/deps/icu-small/source/common/ulocimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/umapfile.c b/deps/icu-small/source/common/umapfile.cpp similarity index 93% rename from deps/icu-small/source/common/umapfile.c rename to deps/icu-small/source/common/umapfile.cpp index 377b14d30f2df8..749a84321886d0 100644 --- a/deps/icu-small/source/common/umapfile.c +++ b/deps/icu-small/source/common/umapfile.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -28,7 +28,9 @@ /* memory-mapping base definitions ------------------------------------------ */ #if MAP_IMPLEMENTATION==MAP_WIN32 +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE @@ -107,17 +109,42 @@ UDataMemory_init(pData); /* Clear the output struct. */ /* open the input file */ +#if U_PLATFORM_HAS_WINUWP_API == 0 file=CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_RANDOM_ACCESS, NULL); +#else + // First we need to go from char to UTF-16 + // u_UCharsToChars could work but it requires length. + WCHAR utf16Path[MAX_PATH]; + int32_t i; + for (i = 0; i < UPRV_LENGTHOF(utf16Path); i++) + { + utf16Path[i] = path[i]; + if (path[i] == '\0') + { + break; + } + } + if (i >= UPRV_LENGTHOF(utf16Path)) + { + // Ran out of room, unlikely but be safe + utf16Path[UPRV_LENGTHOF(utf16Path) - 1] = '\0'; + } + + // TODO: Is it worth setting extended parameters to specify random access? + file = CreateFile2(utf16Path, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, NULL); +#endif if(file==INVALID_HANDLE_VALUE) { return FALSE; } /* Declare and initialize a security descriptor. This is required for multiuser systems on Windows 2000 SP4 and beyond */ + // TODO: UWP does not have this function and I do not think it is required? +#if U_PLATFORM_HAS_WINUWP_API == 0 if (InitializeSecurityDescriptor(&securityDesc, SECURITY_DESCRIPTOR_REVISION)) { - /* give the security descriptor a Null Dacl done using the "TRUE, (PACL)NULL" here */ + /* give the security descriptor a Null Dacl done using the "TRUE, (PACL)NULL" here */ if (SetSecurityDescriptorDacl(&securityDesc, TRUE, (PACL)NULL, FALSE)) { /* Make the security attributes point to the security descriptor */ uprv_memset(&mappingAttributes, 0, sizeof(mappingAttributes)); @@ -132,6 +159,9 @@ /* create an unnamed Windows file-mapping object for the specified file */ map=CreateFileMapping(file, mappingAttributesPtr, PAGE_READONLY, 0, 0, NULL); +#else + map = CreateFileMappingFromApp(file, NULL, PAGE_READONLY, 0, NULL); +#endif CloseHandle(file); if(map==NULL) { return FALSE; diff --git a/deps/icu-small/source/common/umapfile.h b/deps/icu-small/source/common/umapfile.h index 70a6cc5f861784..24e476b11e93d0 100644 --- a/deps/icu-small/source/common/umapfile.h +++ b/deps/icu-small/source/common/umapfile.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/umath.c b/deps/icu-small/source/common/umath.cpp similarity index 90% rename from deps/icu-small/source/common/umath.c rename to deps/icu-small/source/common/umath.cpp index 86f58819e067ac..3ab72ab482386c 100644 --- a/deps/icu-small/source/common/umath.c +++ b/deps/icu-small/source/common/umath.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/umutex.cpp b/deps/icu-small/source/common/umutex.cpp index 13569cb075fa58..12bd7575d66b44 100644 --- a/deps/icu-small/source/common/umutex.cpp +++ b/deps/icu-small/source/common/umutex.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/umutex.h b/deps/icu-small/source/common/umutex.h index d6618ed76621fb..8f2f6123541f79 100644 --- a/deps/icu-small/source/common/umutex.h +++ b/deps/icu-small/source/common/umutex.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -86,7 +86,9 @@ U_NAMESPACE_END // Original plan was to use gcc atomics for MinGW, but they // aren't supported, so we fold MinGW into this path. +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE @@ -331,7 +333,9 @@ U_NAMESPACE_END * win32 APIs for Critical Sections. */ +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE diff --git a/deps/icu-small/source/common/unames.cpp b/deps/icu-small/source/common/unames.cpp index b8c4151f42ccc7..13a4572e1c38a1 100644 --- a/deps/icu-small/source/common/unames.cpp +++ b/deps/icu-small/source/common/unames.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: unames.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/appendable.h b/deps/icu-small/source/common/unicode/appendable.h index 2ae334505ef1f5..8512c2f30311b8 100644 --- a/deps/icu-small/source/common/unicode/appendable.h +++ b/deps/icu-small/source/common/unicode/appendable.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: appendable.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -19,7 +19,7 @@ /** * \file - * \brief C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (UChars). + * \brief C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts). */ #include "unicode/utypes.h" @@ -34,10 +34,10 @@ class UnicodeString; * Combines elements of Java Appendable and ICU4C ByteSink. * * This class can be used in APIs where it does not matter whether the actual destination is - * a UnicodeString, a UChar[] array, a UnicodeSet, or any other object + * a UnicodeString, a char16_t[] array, a UnicodeSet, or any other object * that receives and processes characters and/or strings. * - * Implementation classes must implement at least appendCodeUnit(UChar). + * Implementation classes must implement at least appendCodeUnit(char16_t). * The base class provides default implementations for the other methods. * * The methods do not take UErrorCode parameters. @@ -62,11 +62,11 @@ class U_COMMON_API Appendable : public UObject { * @return TRUE if the operation succeeded * @stable ICU 4.8 */ - virtual UBool appendCodeUnit(UChar c) = 0; + virtual UBool appendCodeUnit(char16_t c) = 0; /** * Appends a code point. - * The default implementation calls appendCodeUnit(UChar) once or twice. + * The default implementation calls appendCodeUnit(char16_t) once or twice. * @param c code point 0..0x10ffff * @return TRUE if the operation succeeded * @stable ICU 4.8 @@ -75,20 +75,20 @@ class U_COMMON_API Appendable : public UObject { /** * Appends a string. - * The default implementation calls appendCodeUnit(UChar) for each code unit. + * The default implementation calls appendCodeUnit(char16_t) for each code unit. * @param s string, must not be NULL if length!=0 * @param length string length, or -1 if NUL-terminated * @return TRUE if the operation succeeded * @stable ICU 4.8 */ - virtual UBool appendString(const UChar *s, int32_t length); + virtual UBool appendString(const char16_t *s, int32_t length); /** * Tells the object that the caller is going to append roughly - * appendCapacity UChars. A subclass might use this to pre-allocate + * appendCapacity char16_ts. A subclass might use this to pre-allocate * a larger buffer if necessary. * The default implementation does nothing. (It always returns TRUE.) - * @param appendCapacity estimated number of UChars that will be appended + * @param appendCapacity estimated number of char16_ts that will be appended * @return TRUE if the operation succeeded * @stable ICU 4.8 */ @@ -102,19 +102,19 @@ class U_COMMON_API Appendable : public UObject { * The returned buffer is only valid until the next operation * on this Appendable. * - * After writing at most *resultCapacity UChars, call appendString() with the - * pointer returned from this function and the number of UChars written. - * Many appendString() implementations will avoid copying UChars if this function + * After writing at most *resultCapacity char16_ts, call appendString() with the + * pointer returned from this function and the number of char16_ts written. + * Many appendString() implementations will avoid copying char16_ts if this function * returned an internal buffer. * * Partial usage example: * \code * int32_t capacity; - * UChar* buffer = app.getAppendBuffer(..., &capacity); - * ... Write n UChars into buffer, with n <= capacity. + * char16_t* buffer = app.getAppendBuffer(..., &capacity); + * ... Write n char16_ts into buffer, with n <= capacity. * app.appendString(buffer, n); * \endcode - * In many implementations, that call to append will avoid copying UChars. + * In many implementations, that call to append will avoid copying char16_ts. * * If the Appendable allocates or reallocates an internal buffer, it should use * the desiredCapacityHint if appropriate. @@ -138,9 +138,9 @@ class U_COMMON_API Appendable : public UObject { * @return a buffer with *resultCapacity>=minCapacity * @stable ICU 4.8 */ - virtual UChar *getAppendBuffer(int32_t minCapacity, + virtual char16_t *getAppendBuffer(int32_t minCapacity, int32_t desiredCapacityHint, - UChar *scratch, int32_t scratchCapacity, + char16_t *scratch, int32_t scratchCapacity, int32_t *resultCapacity); }; @@ -171,7 +171,7 @@ class U_COMMON_API UnicodeStringAppendable : public Appendable { * @return TRUE if the operation succeeded * @stable ICU 4.8 */ - virtual UBool appendCodeUnit(UChar c); + virtual UBool appendCodeUnit(char16_t c); /** * Appends a code point to the string. @@ -188,12 +188,12 @@ class U_COMMON_API UnicodeStringAppendable : public Appendable { * @return TRUE if the operation succeeded * @stable ICU 4.8 */ - virtual UBool appendString(const UChar *s, int32_t length); + virtual UBool appendString(const char16_t *s, int32_t length); /** * Tells the UnicodeString that the caller is going to append roughly - * appendCapacity UChars. - * @param appendCapacity estimated number of UChars that will be appended + * appendCapacity char16_ts. + * @param appendCapacity estimated number of char16_ts that will be appended * @return TRUE if the operation succeeded * @stable ICU 4.8 */ @@ -220,9 +220,9 @@ class U_COMMON_API UnicodeStringAppendable : public Appendable { * @return a buffer with *resultCapacity>=minCapacity * @stable ICU 4.8 */ - virtual UChar *getAppendBuffer(int32_t minCapacity, + virtual char16_t *getAppendBuffer(int32_t minCapacity, int32_t desiredCapacityHint, - UChar *scratch, int32_t scratchCapacity, + char16_t *scratch, int32_t scratchCapacity, int32_t *resultCapacity); private: diff --git a/deps/icu-small/source/common/unicode/brkiter.h b/deps/icu-small/source/common/unicode/brkiter.h index 88b39c6699b2f6..b1e4cc68c6dbef 100644 --- a/deps/icu-small/source/common/unicode/brkiter.h +++ b/deps/icu-small/source/common/unicode/brkiter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/common/unicode/bytestream.h b/deps/icu-small/source/common/unicode/bytestream.h index 4e404a6edc737b..477892b2759768 100644 --- a/deps/icu-small/source/common/unicode/bytestream.h +++ b/deps/icu-small/source/common/unicode/bytestream.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2012, International Business Machines // Corporation and others. All Rights Reserved. @@ -222,8 +222,6 @@ class U_COMMON_API CheckedArrayByteSink : public ByteSink { CheckedArrayByteSink &operator=(const CheckedArrayByteSink &); ///< assignment operator not implemented }; -#if U_HAVE_STD_STRING - /** * Implementation of ByteSink that writes to a "string". * The StringClass is usually instantiated with a std::string. @@ -252,8 +250,6 @@ class StringByteSink : public ByteSink { StringByteSink &operator=(const StringByteSink &); ///< assignment operator not implemented }; -#endif - U_NAMESPACE_END #endif // __BYTESTREAM_H__ diff --git a/deps/icu-small/source/common/unicode/bytestrie.h b/deps/icu-small/source/common/unicode/bytestrie.h index 4a30ce1c0428b5..c57b8ccfeb5960 100644 --- a/deps/icu-small/source/common/unicode/bytestrie.h +++ b/deps/icu-small/source/common/unicode/bytestrie.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: bytestrie.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/bytestriebuilder.h b/deps/icu-small/source/common/unicode/bytestriebuilder.h index 3ad800975b778c..0f9f5e2c060f13 100644 --- a/deps/icu-small/source/common/unicode/bytestriebuilder.h +++ b/deps/icu-small/source/common/unicode/bytestriebuilder.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: bytestriebuilder.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -127,14 +127,14 @@ class U_COMMON_API BytesTrieBuilder : public StringTrieBuilder { void buildBytes(UStringTrieBuildOption buildOption, UErrorCode &errorCode); virtual int32_t getElementStringLength(int32_t i) const; - virtual UChar getElementUnit(int32_t i, int32_t byteIndex) const; + virtual char16_t getElementUnit(int32_t i, int32_t byteIndex) const; virtual int32_t getElementValue(int32_t i) const; virtual int32_t getLimitOfLinearMatch(int32_t first, int32_t last, int32_t byteIndex) const; virtual int32_t countElementUnits(int32_t start, int32_t limit, int32_t byteIndex) const; virtual int32_t skipElementsBySomeUnits(int32_t i, int32_t byteIndex, int32_t count) const; - virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t byteIndex, UChar byte) const; + virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t byteIndex, char16_t byte) const; virtual UBool matchNodesCanHaveValues() const { return FALSE; } diff --git a/deps/icu-small/source/common/unicode/caniter.h b/deps/icu-small/source/common/unicode/caniter.h index b988b2003d73a8..543341f42c5fe2 100644 --- a/deps/icu-small/source/common/unicode/caniter.h +++ b/deps/icu-small/source/common/unicode/caniter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -187,7 +187,7 @@ class U_COMMON_API CanonicalIterator U_FINAL : public UObject { UnicodeString *getEquivalents(const UnicodeString &segment, int32_t &result_len, UErrorCode &status); //private String[] getEquivalents(String segment) //Set getEquivalents2(String segment); - Hashtable *getEquivalents2(Hashtable *fillinResult, const UChar *segment, int32_t segLen, UErrorCode &status); + Hashtable *getEquivalents2(Hashtable *fillinResult, const char16_t *segment, int32_t segLen, UErrorCode &status); //Hashtable *getEquivalents2(const UnicodeString &segment, int32_t segLen, UErrorCode &status); /** @@ -196,7 +196,7 @@ class U_COMMON_API CanonicalIterator U_FINAL : public UObject { * If so, take the remainder, and return the equivalents */ //Set extract(int comp, String segment, int segmentPos, StringBuffer buffer); - Hashtable *extract(Hashtable *fillinResult, UChar32 comp, const UChar *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status); + Hashtable *extract(Hashtable *fillinResult, UChar32 comp, const char16_t *segment, int32_t segLen, int32_t segmentPos, UErrorCode &status); //Hashtable *extract(UChar32 comp, const UnicodeString &segment, int32_t segLen, int32_t segmentPos, UErrorCode &status); void cleanPieces(); diff --git a/deps/icu-small/source/common/unicode/casemap.h b/deps/icu-small/source/common/unicode/casemap.h new file mode 100644 index 00000000000000..98184820d53457 --- /dev/null +++ b/deps/icu-small/source/common/unicode/casemap.h @@ -0,0 +1,359 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// casemap.h +// created: 2017jan12 Markus W. Scherer + +#ifndef __CASEMAP_H__ +#define __CASEMAP_H__ + +#include "unicode/utypes.h" +#include "unicode/uobject.h" + +/** + * \file + * \brief C++ API: Low-level C++ case mapping functions. + */ + +U_NAMESPACE_BEGIN + +#ifndef U_HIDE_DRAFT_API + +class BreakIterator; +class Edits; + +/** + * Low-level C++ case mapping functions. + * + * @draft ICU 59 + */ +class U_COMMON_API CaseMap U_FINAL : public UMemory { +public: + /** + * Lowercases a UTF-16 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see u_strToLower + * @draft ICU 59 + */ + static int32_t toLower( + const char *locale, uint32_t options, + const char16_t *src, int32_t srcLength, + char16_t *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + + /** + * Uppercases a UTF-16 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see u_strToUpper + * @draft ICU 59 + */ + static int32_t toUpper( + const char *locale, uint32_t options, + const char16_t *src, int32_t srcLength, + char16_t *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + + /** + * Titlecases a UTF-16 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * Titlecasing uses a break iterator to find the first characters of words + * that are to be titlecased. It titlecases those characters and lowercases + * all others. (This can be modified with options bits.) + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, + * U_TITLECASE_NO_LOWERCASE, U_TITLECASE_NO_BREAK_ADJUSTMENT. + * @param iter A break iterator to find the first characters of words that are to be titlecased. + * It is set to the source string (setText()) + * and used one or more times for iteration (first() and next()). + * If NULL, then a word break iterator for the locale is used + * (or something equivalent). + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see u_strToTitle + * @see ucasemap_toTitle + * @draft ICU 59 + */ + static int32_t toTitle( + const char *locale, uint32_t options, BreakIterator *iter, + const char16_t *src, int32_t srcLength, + char16_t *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + +#endif // UCONFIG_NO_BREAK_ITERATION + + /** + * Case-folds a UTF-16 string and optionally records edits. + * + * Case folding is locale-independent and not context-sensitive, + * but there is an option for whether to include or exclude mappings for dotted I + * and dotless i that are marked with 'T' in CaseFolding.txt. + * + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, + * U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of char16_ts). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see u_strFoldCase + * @draft ICU 59 + */ + static int32_t fold( + uint32_t options, + const char16_t *src, int32_t srcLength, + char16_t *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + + /** + * Lowercases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of bytes). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see ucasemap_utf8ToLower + * @draft ICU 59 + */ + static int32_t utf8ToLower( + const char *locale, uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + + /** + * Uppercases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of bytes). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see ucasemap_utf8ToUpper + * @draft ICU 59 + */ + static int32_t utf8ToUpper( + const char *locale, uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + + /** + * Titlecases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * Titlecasing uses a break iterator to find the first characters of words + * that are to be titlecased. It titlecases those characters and lowercases + * all others. (This can be modified with options bits.) + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, + * U_TITLECASE_NO_LOWERCASE, U_TITLECASE_NO_BREAK_ADJUSTMENT. + * @param iter A break iterator to find the first characters of words that are to be titlecased. + * It is set to the source string (setText()) + * and used one or more times for iteration (first() and next()). + * If NULL, then a word break iterator for the locale is used + * (or something equivalent). + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of bytes). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see ucasemap_utf8ToTitle + * @draft ICU 59 + */ + static int32_t utf8ToTitle( + const char *locale, uint32_t options, BreakIterator *iter, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + +#endif // UCONFIG_NO_BREAK_ITERATION + + /** + * Case-folds a UTF-8 string and optionally records edits. + * + * Case folding is locale-independent and not context-sensitive, + * but there is an option for whether to include or exclude mappings for dotted I + * and dotless i that are marked with 'T' in CaseFolding.txt. + * + * The result may be longer or shorter than the original. + * The source string and the destination buffer must not overlap. + * + * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, + * U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I. + * @param src The original string. + * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. + * @param dest A buffer for the result string. The result will be NUL-terminated if + * the buffer is large enough. + * The contents is undefined in case of failure. + * @param destCapacity The size of the buffer (number of bytes). If it is 0, then + * dest may be NULL and the function will only return the length of the result + * without writing any of the result string. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * @return The length of the result string, if successful. + * When the result would be longer than destCapacity, + * the full length is returned and a U_BUFFER_OVERFLOW_ERROR is set. + * + * @see ucasemap_utf8FoldCase + * @draft ICU 59 + */ + static int32_t utf8Fold( + uint32_t options, + const char *src, int32_t srcLength, + char *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode); + +private: + CaseMap() = delete; + CaseMap(const CaseMap &other) = delete; + CaseMap &operator=(const CaseMap &other) = delete; +}; + +#endif // U_HIDE_DRAFT_API + +U_NAMESPACE_END + +#endif // __CASEMAP_H__ diff --git a/deps/icu-small/source/common/unicode/char16ptr.h b/deps/icu-small/source/common/unicode/char16ptr.h new file mode 100644 index 00000000000000..fa17c62446cfb0 --- /dev/null +++ b/deps/icu-small/source/common/unicode/char16ptr.h @@ -0,0 +1,306 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// char16ptr.h +// created: 2017feb28 Markus W. Scherer + +#ifndef __CHAR16PTR_H__ +#define __CHAR16PTR_H__ + +#include +#include "unicode/utypes.h" + +/** + * \file + * \brief C++ API: char16_t pointer wrappers with + * implicit conversion from bit-compatible raw pointer types. + * Also conversion functions from char16_t * to UChar * and OldUChar *. + */ + +U_NAMESPACE_BEGIN + +/** + * \def U_ALIASING_BARRIER + * Barrier for pointer anti-aliasing optimizations even across function boundaries. + * @internal + */ +#ifdef U_ALIASING_BARRIER + // Use the predefined value. +#elif (defined(__clang__) || defined(__GNUC__)) && U_PLATFORM != U_PF_BROWSER_NATIVE_CLIENT +# define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory") +#endif + +// Do not use #ifndef U_HIDE_DRAFT_API for the following class, it +// is now used in place of UChar* in several stable C++ methods +/** + * char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types. + * @draft ICU 59 + */ +class U_COMMON_API Char16Ptr U_FINAL { +public: + /** + * Copies the pointer. + * @param p pointer + * @draft ICU 59 + */ + inline Char16Ptr(char16_t *p); +#if !U_CHAR16_IS_TYPEDEF + /** + * Converts the pointer to char16_t *. + * @param p pointer to be converted + * @draft ICU 59 + */ + inline Char16Ptr(uint16_t *p); +#endif +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * Converts the pointer to char16_t *. + * (Only defined if U_SIZEOF_WCHAR_T==2.) + * @param p pointer to be converted + * @draft ICU 59 + */ + inline Char16Ptr(wchar_t *p); +#endif + /** + * nullptr constructor. + * @param p nullptr + * @draft ICU 59 + */ + inline Char16Ptr(std::nullptr_t p); + /** + * Destructor. + * @draft ICU 59 + */ + inline ~Char16Ptr(); + + /** + * Pointer access. + * @return the wrapped pointer + * @draft ICU 59 + */ + inline char16_t *get() const; + /** + * char16_t pointer access via type conversion (e.g., static_cast). + * @return the wrapped pointer + * @draft ICU 59 + */ + inline operator char16_t *() const { return get(); } + +private: + Char16Ptr() = delete; + +#ifdef U_ALIASING_BARRIER + template static char16_t *cast(T *t) { + U_ALIASING_BARRIER(t); + return reinterpret_cast(t); + } + + char16_t *p; +#else + union { + char16_t *cp; + uint16_t *up; + wchar_t *wp; + } u; +#endif +}; + +#ifdef U_ALIASING_BARRIER + +Char16Ptr::Char16Ptr(char16_t *p) : p(p) {} +#if !U_CHAR16_IS_TYPEDEF +Char16Ptr::Char16Ptr(uint16_t *p) : p(cast(p)) {} +#endif +#if U_SIZEOF_WCHAR_T==2 +Char16Ptr::Char16Ptr(wchar_t *p) : p(cast(p)) {} +#endif +Char16Ptr::Char16Ptr(std::nullptr_t p) : p(p) {} +Char16Ptr::~Char16Ptr() { + U_ALIASING_BARRIER(p); +} + +char16_t *Char16Ptr::get() const { return p; } + +#else + +Char16Ptr::Char16Ptr(char16_t *p) { u.cp = p; } +#if !U_CHAR16_IS_TYPEDEF +Char16Ptr::Char16Ptr(uint16_t *p) { u.up = p; } +#endif +#if U_SIZEOF_WCHAR_T==2 +Char16Ptr::Char16Ptr(wchar_t *p) { u.wp = p; } +#endif +Char16Ptr::Char16Ptr(std::nullptr_t p) { u.cp = p; } +Char16Ptr::~Char16Ptr() {} + +char16_t *Char16Ptr::get() const { return u.cp; } + +#endif + +// Do not use #ifndef U_HIDE_DRAFT_API for the following class, it is +// now used in place of const UChar* in several stable C++ methods +/** + * const char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types. + * @draft ICU 59 + */ +class U_COMMON_API ConstChar16Ptr U_FINAL { +public: + /** + * Copies the pointer. + * @param p pointer + * @draft ICU 59 + */ + inline ConstChar16Ptr(const char16_t *p); +#if !U_CHAR16_IS_TYPEDEF + /** + * Converts the pointer to char16_t *. + * @param p pointer to be converted + * @draft ICU 59 + */ + inline ConstChar16Ptr(const uint16_t *p); +#endif +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * Converts the pointer to char16_t *. + * (Only defined if U_SIZEOF_WCHAR_T==2.) + * @param p pointer to be converted + * @draft ICU 59 + */ + inline ConstChar16Ptr(const wchar_t *p); +#endif + /** + * nullptr constructor. + * @param p nullptr + * @draft ICU 59 + */ + inline ConstChar16Ptr(const std::nullptr_t p); + + /** + * Destructor. + * @draft ICU 59 + */ + inline ~ConstChar16Ptr(); + + /** + * Pointer access. + * @return the wrapped pointer + * @draft ICU 59 + */ + inline const char16_t *get() const; + /** + * char16_t pointer access via type conversion (e.g., static_cast). + * @return the wrapped pointer + * @draft ICU 59 + */ + inline operator const char16_t *() const { return get(); } + +private: + ConstChar16Ptr() = delete; + +#ifdef U_ALIASING_BARRIER + template static const char16_t *cast(const T *t) { + U_ALIASING_BARRIER(t); + return reinterpret_cast(t); + } + + const char16_t *p; +#else + union { + const char16_t *cp; + const uint16_t *up; + const wchar_t *wp; + } u; +#endif +}; + +#ifdef U_ALIASING_BARRIER + +ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p(p) {} +#if !U_CHAR16_IS_TYPEDEF +ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) : p(cast(p)) {} +#endif +#if U_SIZEOF_WCHAR_T==2 +ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) : p(cast(p)) {} +#endif +ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) : p(p) {} +ConstChar16Ptr::~ConstChar16Ptr() { + U_ALIASING_BARRIER(p); +} + +const char16_t *ConstChar16Ptr::get() const { return p; } + +#else + +ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) { u.cp = p; } +#if !U_CHAR16_IS_TYPEDEF +ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) { u.up = p; } +#endif +#if U_SIZEOF_WCHAR_T==2 +ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) { u.wp = p; } +#endif +ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) { u.cp = p; } +ConstChar16Ptr::~ConstChar16Ptr() {} + +const char16_t *ConstChar16Ptr::get() const { return u.cp; } + +#endif + +/** + * Converts from const char16_t * to const UChar *. + * Includes an aliasing barrier if available. + * @param p pointer + * @return p as const UChar * + * @draft ICU 59 + */ +inline const UChar *toUCharPtr(const char16_t *p) { +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast(p); +} + +/** + * Converts from char16_t * to UChar *. + * Includes an aliasing barrier if available. + * @param p pointer + * @return p as UChar * + * @draft ICU 59 + */ +inline UChar *toUCharPtr(char16_t *p) { +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast(p); +} + +/** + * Converts from const char16_t * to const OldUChar *. + * Includes an aliasing barrier if available. + * @param p pointer + * @return p as const OldUChar * + * @draft ICU 59 + */ +inline const OldUChar *toOldUCharPtr(const char16_t *p) { +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast(p); +} + +/** + * Converts from char16_t * to OldUChar *. + * Includes an aliasing barrier if available. + * @param p pointer + * @return p as OldUChar * + * @draft ICU 59 + */ +inline OldUChar *toOldUCharPtr(char16_t *p) { +#ifdef U_ALIASING_BARRIER + U_ALIASING_BARRIER(p); +#endif + return reinterpret_cast(p); +} + +U_NAMESPACE_END + +#endif // __CHAR16PTR_H__ diff --git a/deps/icu-small/source/common/unicode/chariter.h b/deps/icu-small/source/common/unicode/chariter.h index 7c6f98f640eada..dbed89dbe61e0b 100644 --- a/deps/icu-small/source/common/unicode/chariter.h +++ b/deps/icu-small/source/common/unicode/chariter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************** @@ -78,7 +78,7 @@ U_NAMESPACE_BEGIN * } * * void function1(ForwardCharacterIterator &it) { - * UChar c; + * char16_t c; * while((c=it.nextPostInc())!=ForwardCharacterIterator::DONE) { * // use c * } @@ -149,7 +149,7 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * @return the current code unit. * @stable ICU 2.0 */ - virtual UChar nextPostInc(void) = 0; + virtual char16_t nextPostInc(void) = 0; /** * Gets the current code point for returning and advances to the next code point @@ -230,7 +230,7 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * showing a way to convert simple for() loops: * \code * void forward2(CharacterIterator &it) { - * UChar c; + * char16_t c; * for(c=it.firstPostInc(); c!=CharacterIterator::DONE; c=it.nextPostInc()) { * // use c * } @@ -249,7 +249,7 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * Backward iteration with a more traditional for() loop: * \code * void backward2(CharacterIterator &it) { - * UChar c; + * char16_t c; * for(c=it.last(); c!=CharacterIterator::DONE; c=it.previous()) { * // use c * } @@ -266,7 +266,7 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * // get the position * int32_t pos=it.getIndex(); * // get the previous code unit - * UChar u=it.previous(); + * char16_t u=it.previous(); * // move back one more code unit * it.move(-1, CharacterIterator::kCurrent); * // set the position back to where it was @@ -283,7 +283,7 @@ class U_COMMON_API ForwardCharacterIterator : public UObject { * Function processing characters, in this example simple output *
  * \code
- *  void processChar( UChar c )
+ *  void processChar( char16_t c )
  *  {
  *      cout << " " << c;
  *  }
@@ -294,7 +294,7 @@ class U_COMMON_API ForwardCharacterIterator : public UObject {
  * \code
  *  void traverseForward(CharacterIterator& iter)
  *  {
- *      for(UChar c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
+ *      for(char16_t c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
  *          processChar(c);
  *      }
  *  }
@@ -305,7 +305,7 @@ class U_COMMON_API ForwardCharacterIterator : public UObject {
  * \code
  *  void traverseBackward(CharacterIterator& iter)
  *  {
- *      for(UChar c = iter.last(); c != CharacterIterator.DONE; c = iter.previous()) {
+ *      for(char16_t c = iter.last(); c != CharacterIterator.DONE; c = iter.previous()) {
  *          processChar(c);
  *      }
  *  }
@@ -317,7 +317,7 @@ class U_COMMON_API ForwardCharacterIterator : public UObject {
  * \code
  * void traverseOut(CharacterIterator& iter, int32_t pos)
  * {
- *      UChar c;
+ *      char16_t c;
  *      for (c = iter.setIndex(pos);
  *      c != CharacterIterator.DONE && (Unicode::isLetter(c) || Unicode::isDigit(c));
  *          c = iter.next()) {}
@@ -386,7 +386,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator {
      * @return the first code unit in its iteration range.
      * @stable ICU 2.0
      */
-    virtual UChar         first(void) = 0;
+    virtual char16_t         first(void) = 0;
 
     /**
      * Sets the iterator to refer to the first code unit in its
@@ -396,7 +396,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator {
      * @return the first code unit in its iteration range.
      * @stable ICU 2.0
      */
-    virtual UChar         firstPostInc(void);
+    virtual char16_t         firstPostInc(void);
 
     /**
      * Sets the iterator to refer to the first code point in its
@@ -435,7 +435,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator {
      * @return the last code unit.
      * @stable ICU 2.0
      */
-    virtual UChar         last(void) = 0;
+    virtual char16_t         last(void) = 0;
 
     /**
      * Sets the iterator to refer to the last code point in its
@@ -463,7 +463,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator {
      * @return the "position"-th code unit.
      * @stable ICU 2.0
      */
-    virtual UChar         setIndex(int32_t position) = 0;
+    virtual char16_t         setIndex(int32_t position) = 0;
 
     /**
      * Sets the iterator to refer to the beginning of the code point
@@ -483,7 +483,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator {
      * @return the current code unit.
      * @stable ICU 2.0
      */
-    virtual UChar         current(void) const = 0;
+    virtual char16_t         current(void) const = 0;
 
     /**
      * Returns the code point the iterator currently refers to.
@@ -499,7 +499,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator {
      * @return the next code unit.
      * @stable ICU 2.0
      */
-    virtual UChar         next(void) = 0;
+    virtual char16_t         next(void) = 0;
 
     /**
      * Advances to the next code point in the iteration range
@@ -520,7 +520,7 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator {
      * @return the previous code unit.
      * @stable ICU 2.0
      */
-    virtual UChar         previous(void) = 0;
+    virtual char16_t         previous(void) = 0;
 
     /**
      * Advances to the previous code point in the iteration range
@@ -607,6 +607,10 @@ class U_COMMON_API CharacterIterator : public ForwardCharacterIterator {
      * @return the new position
      * @stable ICU 2.0
      */
+#ifdef move32
+     // One of the system headers right now is sometimes defining a conflicting macro we don't use
+#undef move32
+#endif
     virtual int32_t      move32(int32_t delta, EOrigin origin) = 0;
 
     /**
diff --git a/deps/icu-small/source/common/unicode/dbbi.h b/deps/icu-small/source/common/unicode/dbbi.h
index be9618c551c7dc..62509c5227b9da 100644
--- a/deps/icu-small/source/common/unicode/dbbi.h
+++ b/deps/icu-small/source/common/unicode/dbbi.h
@@ -1,4 +1,4 @@
-// Copyright (C) 2016 and later: Unicode, Inc. and others.
+// © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html
 /*
 **********************************************************************
diff --git a/deps/icu-small/source/common/unicode/docmain.h b/deps/icu-small/source/common/unicode/docmain.h
index 7b053b04640df2..6e59f3e3887e6d 100644
--- a/deps/icu-small/source/common/unicode/docmain.h
+++ b/deps/icu-small/source/common/unicode/docmain.h
@@ -1,4 +1,4 @@
-// Copyright (C) 2016 and later: Unicode, Inc. and others.
+// © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html
 /********************************************************************
  * COPYRIGHT:
@@ -98,6 +98,11 @@
  *     C API
  *   
  *   
+ *     Codepage Detection
+ *     ucsdet.h
+ *     C API
+ *   
+ *   
  *     Unicode Text Compression
  *     ucnv.h
(encoding name "SCSU" or "BOCU-1") * C API diff --git a/deps/icu-small/source/common/unicode/dtintrv.h b/deps/icu-small/source/common/unicode/dtintrv.h index c16ee63d9632e6..2221b36c9b293f 100644 --- a/deps/icu-small/source/common/unicode/dtintrv.h +++ b/deps/icu-small/source/common/unicode/dtintrv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/unicode/edits.h b/deps/icu-small/source/common/unicode/edits.h new file mode 100644 index 00000000000000..8d3becb7a2a580 --- /dev/null +++ b/deps/icu-small/source/common/unicode/edits.h @@ -0,0 +1,245 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// edits.h +// created: 2016dec30 Markus W. Scherer + +#ifndef __EDITS_H__ +#define __EDITS_H__ + +#include "unicode/utypes.h" +#include "unicode/uobject.h" + +/** + * \file + * \brief C++ API: C++ class Edits for low-level string transformations on styled text. + */ + +U_NAMESPACE_BEGIN + +#ifndef U_HIDE_DRAFT_API + +/** + * Records lengths of string edits but not replacement text. + * Supports replacements, insertions, deletions in linear progression. + * Does not support moving/reordering of text. + * + * An Edits object tracks a separate UErrorCode, but ICU string transformation functions + * (e.g., case mapping functions) merge any such errors into their API's UErrorCode. + * + * @draft ICU 59 + */ +class U_COMMON_API Edits U_FINAL : public UMemory { +public: + /** + * Constructs an empty object. + * @draft ICU 59 + */ + Edits() : + array(stackArray), capacity(STACK_CAPACITY), length(0), delta(0), + errorCode(U_ZERO_ERROR) {} + /** + * Destructor. + * @draft ICU 59 + */ + ~Edits(); + + /** + * Resets the data but may not release memory. + * @draft ICU 59 + */ + void reset(); + + /** + * Adds a record for an unchanged segment of text. + * Normally called from inside ICU string transformation functions, not user code. + * @draft ICU 59 + */ + void addUnchanged(int32_t unchangedLength); + /** + * Adds a record for a text replacement/insertion/deletion. + * Normally called from inside ICU string transformation functions, not user code. + * @draft ICU 59 + */ + void addReplace(int32_t oldLength, int32_t newLength); + /** + * Sets the UErrorCode if an error occurred while recording edits. + * Preserves older error codes in the outErrorCode. + * Normally called from inside ICU string transformation functions, not user code. + * @return TRUE if U_FAILURE(outErrorCode) + * @draft ICU 59 + */ + UBool copyErrorTo(UErrorCode &outErrorCode); + + /** + * How much longer is the new text compared with the old text? + * @return new length minus old length + * @draft ICU 59 + */ + int32_t lengthDelta() const { return delta; } + /** + * @return TRUE if there are any change edits + * @draft ICU 59 + */ + UBool hasChanges() const; + + /** + * Access to the list of edits. + * @see getCoarseIterator + * @see getFineIterator + * @draft ICU 59 + */ + struct U_COMMON_API Iterator U_FINAL : public UMemory { + /** + * Copy constructor. + * @draft ICU 59 + */ + Iterator(const Iterator &other) = default; + /** + * Assignment operator. + * @draft ICU 59 + */ + Iterator &operator=(const Iterator &other) = default; + + /** + * Advances to the next edit. + * @return TRUE if there is another edit + * @draft ICU 59 + */ + UBool next(UErrorCode &errorCode) { return next(onlyChanges_, errorCode); } + + /** + * Finds the edit that contains the source index. + * The source index may be found in a non-change + * even if normal iteration would skip non-changes. + * Normal iteration can continue from a found edit. + * + * The iterator state before this search logically does not matter. + * (It may affect the performance of the search.) + * + * The iterator state after this search is undefined + * if the source index is out of bounds for the source string. + * + * @param i source index + * @return TRUE if the edit for the source index was found + * @draft ICU 59 + */ + UBool findSourceIndex(int32_t i, UErrorCode &errorCode); + + /** + * @return TRUE if this edit replaces oldLength() units with newLength() different ones. + * FALSE if oldLength units remain unchanged. + * @draft ICU 59 + */ + UBool hasChange() const { return changed; } + /** + * @return the number of units in the original string which are replaced or remain unchanged. + * @draft ICU 59 + */ + int32_t oldLength() const { return oldLength_; } + /** + * @return the number of units in the modified string, if hasChange() is TRUE. + * Same as oldLength if hasChange() is FALSE. + * @draft ICU 59 + */ + int32_t newLength() const { return newLength_; } + + /** + * @return the current index into the source string + * @draft ICU 59 + */ + int32_t sourceIndex() const { return srcIndex; } + /** + * @return the current index into the replacement-characters-only string, + * not counting unchanged spans + * @draft ICU 59 + */ + int32_t replacementIndex() const { return replIndex; } + /** + * @return the current index into the full destination string + * @draft ICU 59 + */ + int32_t destinationIndex() const { return destIndex; } + + private: + friend class Edits; + + Iterator(const uint16_t *a, int32_t len, UBool oc, UBool crs); + + int32_t readLength(int32_t head); + void updateIndexes(); + UBool noNext(); + UBool next(UBool onlyChanges, UErrorCode &errorCode); + + const uint16_t *array; + int32_t index, length; + int32_t remaining; + UBool onlyChanges_, coarse; + + UBool changed; + int32_t oldLength_, newLength_; + int32_t srcIndex, replIndex, destIndex; + }; + + /** + * Returns an Iterator for coarse-grained changes for simple string updates. + * Skips non-changes. + * @return an Iterator that merges adjacent changes. + * @draft ICU 59 + */ + Iterator getCoarseChangesIterator() const { + return Iterator(array, length, TRUE, TRUE); + } + + /** + * Returns an Iterator for coarse-grained changes and non-changes for simple string updates. + * @return an Iterator that merges adjacent changes. + * @draft ICU 59 + */ + Iterator getCoarseIterator() const { + return Iterator(array, length, FALSE, TRUE); + } + + /** + * Returns an Iterator for fine-grained changes for modifying styled text. + * Skips non-changes. + * @return an Iterator that separates adjacent changes. + * @draft ICU 59 + */ + Iterator getFineChangesIterator() const { + return Iterator(array, length, TRUE, FALSE); + } + + /** + * Returns an Iterator for fine-grained changes and non-changes for modifying styled text. + * @return an Iterator that separates adjacent changes. + * @draft ICU 59 + */ + Iterator getFineIterator() const { + return Iterator(array, length, FALSE, FALSE); + } + +private: + Edits(const Edits &) = delete; + Edits &operator=(const Edits &) = delete; + + void setLastUnit(int32_t last) { array[length - 1] = (uint16_t)last; } + int32_t lastUnit() const { return length > 0 ? array[length - 1] : 0xffff; } + + void append(int32_t r); + UBool growArray(); + + static const int32_t STACK_CAPACITY = 100; + uint16_t *array; + int32_t capacity; + int32_t length; + int32_t delta; + UErrorCode errorCode; + uint16_t stackArray[STACK_CAPACITY]; +}; + +#endif // U_HIDE_DRAFT_API + +U_NAMESPACE_END + +#endif // __EDITS_H__ diff --git a/deps/icu-small/source/common/unicode/enumset.h b/deps/icu-small/source/common/unicode/enumset.h index e7c39c40dd2586..82b2074ec35875 100644 --- a/deps/icu-small/source/common/unicode/enumset.h +++ b/deps/icu-small/source/common/unicode/enumset.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/unicode/errorcode.h b/deps/icu-small/source/common/unicode/errorcode.h index 92feb2b1b6b87e..1e5df8f03e88fe 100644 --- a/deps/icu-small/source/common/unicode/errorcode.h +++ b/deps/icu-small/source/common/unicode/errorcode.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: errorcode.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/filteredbrk.h b/deps/icu-small/source/common/unicode/filteredbrk.h index 261151138cdc8f..51bb651fbac366 100644 --- a/deps/icu-small/source/common/unicode/filteredbrk.h +++ b/deps/icu-small/source/common/unicode/filteredbrk.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/common/unicode/icudataver.h b/deps/icu-small/source/common/unicode/icudataver.h index c5c44fc0754f15..d5c728da880f8f 100644 --- a/deps/icu-small/source/common/unicode/icudataver.h +++ b/deps/icu-small/source/common/unicode/icudataver.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/unicode/icuplug.h b/deps/icu-small/source/common/unicode/icuplug.h index ff5e054d38e24b..2a11b96be69c53 100644 --- a/deps/icu-small/source/common/unicode/icuplug.h +++ b/deps/icu-small/source/common/unicode/icuplug.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/unicode/idna.h b/deps/icu-small/source/common/unicode/idna.h index 23a1d7ca0e8441..f08658e502e200 100644 --- a/deps/icu-small/source/common/unicode/idna.h +++ b/deps/icu-small/source/common/unicode/idna.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: idna.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/listformatter.h b/deps/icu-small/source/common/unicode/listformatter.h index f2c898881a7939..180fbcb5cde5b7 100644 --- a/deps/icu-small/source/common/unicode/listformatter.h +++ b/deps/icu-small/source/common/unicode/listformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: listformatter.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -157,6 +157,8 @@ class U_COMMON_API ListFormatter : public UObject{ private: static void initializeHash(UErrorCode& errorCode); static const ListFormatInternal* getListFormatInternal(const Locale& locale, const char *style, UErrorCode& errorCode); + struct ListPatternsSink; + static ListFormatInternal* loadListFormatInternal(const Locale& locale, const char* style, UErrorCode& errorCode); ListFormatter(); diff --git a/deps/icu-small/source/common/unicode/localpointer.h b/deps/icu-small/source/common/unicode/localpointer.h index 9ac5de5f06d751..3ab820188f7f23 100644 --- a/deps/icu-small/source/common/unicode/localpointer.h +++ b/deps/icu-small/source/common/unicode/localpointer.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: localpointer.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -174,9 +174,9 @@ class LocalPointerBase { * \code * LocalPointer s(new UnicodeString((UChar32)0x50005)); * int32_t length=s->length(); // 2 - * UChar lead=s->charAt(0); // 0xd900 + * char16_t lead=s->charAt(0); // 0xd900 * if(some condition) { return; } // no need to explicitly delete the pointer - * s.adoptInstead(new UnicodeString((UChar)0xfffc)); + * s.adoptInstead(new UnicodeString((char16_t)0xfffc)); * length=s->length(); // 1 * // no need to explicitly delete the pointer * \endcode @@ -323,10 +323,10 @@ class LocalPointer : public LocalPointerBase { * Usage example: * \code * LocalArray a(new UnicodeString[2]); - * a[0].append((UChar)0x61); + * a[0].append((char16_t)0x61); * if(some condition) { return; } // no need to explicitly delete the array * a.adoptInstead(new UnicodeString[4]); - * a[3].append((UChar)0x62).append((UChar)0x63).reverse(); + * a[3].append((char16_t)0x62).append((char16_t)0x63).reverse(); * // no need to explicitly delete the array * \endcode * diff --git a/deps/icu-small/source/common/unicode/locdspnm.h b/deps/icu-small/source/common/unicode/locdspnm.h index b8c7a0ccae9281..7f227829b4cc00 100644 --- a/deps/icu-small/source/common/unicode/locdspnm.h +++ b/deps/icu-small/source/common/unicode/locdspnm.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -20,6 +20,7 @@ #if !UCONFIG_NO_FORMATTING #include "unicode/locid.h" +#include "unicode/strenum.h" #include "unicode/uscript.h" #include "unicode/uldnames.h" #include "unicode/udisplaycontext.h" diff --git a/deps/icu-small/source/common/unicode/locid.h b/deps/icu-small/source/common/unicode/locid.h index f797c25e8b6069..37a34f71403f24 100644 --- a/deps/icu-small/source/common/unicode/locid.h +++ b/deps/icu-small/source/common/unicode/locid.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -33,10 +33,8 @@ #include "unicode/utypes.h" #include "unicode/uobject.h" -#include "unicode/unistr.h" #include "unicode/putil.h" #include "unicode/uloc.h" -#include "unicode/strenum.h" /** * \file @@ -48,6 +46,9 @@ U_NAMESPACE_BEGIN // Forward Declarations void U_CALLCONV locale_available_init(); /**< @internal */ +class StringEnumeration; +class UnicodeString; + /** * A Locale object represents a specific geographical, political, * or cultural region. An operation that requires a Locale to perform diff --git a/deps/icu-small/source/common/unicode/messagepattern.h b/deps/icu-small/source/common/unicode/messagepattern.h index 8c1115e04dc1db..f28adafee0d2ac 100644 --- a/deps/icu-small/source/common/unicode/messagepattern.h +++ b/deps/icu-small/source/common/unicode/messagepattern.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: messagepattern.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/normalizer2.h b/deps/icu-small/source/common/unicode/normalizer2.h index 6a7668bfd5ff3e..d326da948a3573 100644 --- a/deps/icu-small/source/common/unicode/normalizer2.h +++ b/deps/icu-small/source/common/unicode/normalizer2.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: normalizer2.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -282,7 +282,7 @@ class U_COMMON_API Normalizer2 : public UObject { * * When used on a standard NFC Normalizer2 instance, * it returns the Decomposition_Mapping only if the Decomposition_Type (dt) is Canonical (Can); - * in this case, the result contains either one or two code points (=1..4 UChars). + * in this case, the result contains either one or two code points (=1..4 char16_ts). * * This function is independent of the mode of the Normalizer2. * The default implementation returns FALSE. diff --git a/deps/icu-small/source/common/unicode/normlzr.h b/deps/icu-small/source/common/unicode/normlzr.h index b9b67bc434df9d..82335ae6d7d19b 100644 --- a/deps/icu-small/source/common/unicode/normlzr.h +++ b/deps/icu-small/source/common/unicode/normlzr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************** @@ -168,7 +168,7 @@ class U_COMMON_API Normalizer : public UObject { * @param mode The normalization mode. * @deprecated ICU 56 Use Normalizer2 instead. */ - Normalizer(const UChar* str, int32_t length, UNormalizationMode mode); + Normalizer(ConstChar16Ptr str, int32_t length, UNormalizationMode mode); /** * Creates a new Normalizer object for iterating over the @@ -704,7 +704,7 @@ class U_COMMON_API Normalizer : public UObject { * @param status a UErrorCode * @deprecated ICU 56 Use Normalizer2 instead. */ - void setText(const UChar* newText, + void setText(ConstChar16Ptr newText, int32_t length, UErrorCode &status); /** @@ -796,8 +796,8 @@ Normalizer::compare(const UnicodeString &s1, const UnicodeString &s2, uint32_t options, UErrorCode &errorCode) { // all argument checking is done in unorm_compare - return unorm_compare(s1.getBuffer(), s1.length(), - s2.getBuffer(), s2.length(), + return unorm_compare(toUCharPtr(s1.getBuffer()), s1.length(), + toUCharPtr(s2.getBuffer()), s2.length(), options, &errorCode); } diff --git a/deps/icu-small/source/common/unicode/parseerr.h b/deps/icu-small/source/common/unicode/parseerr.h index f1976581a1ea63..c8283bfcc9daa0 100644 --- a/deps/icu-small/source/common/unicode/parseerr.h +++ b/deps/icu-small/source/common/unicode/parseerr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/parsepos.h b/deps/icu-small/source/common/unicode/parsepos.h index 7bc2627773ef01..50cc56db590cf8 100644 --- a/deps/icu-small/source/common/unicode/parsepos.h +++ b/deps/icu-small/source/common/unicode/parsepos.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 1997-2005, International Business Machines Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/common/unicode/platform.h b/deps/icu-small/source/common/unicode/platform.h index bf31af5d1331cc..23b9464c6507d2 100644 --- a/deps/icu-small/source/common/unicode/platform.h +++ b/deps/icu-small/source/common/unicode/platform.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -150,7 +150,7 @@ # define U_PLATFORM U_PF_ANDROID /* Android wchar_t support depends on the API level. */ # include -#elif defined(__native_client__) +#elif defined(__pnacl__) || defined(__native_client__) # define U_PLATFORM U_PF_BROWSER_NATIVE_CLIENT #elif defined(linux) || defined(__linux__) || defined(__linux) # define U_PLATFORM U_PF_LINUX @@ -233,6 +233,18 @@ # define U_PLATFORM_HAS_WIN32_API 0 #endif +/** + * \def U_PLATFORM_HAS_WINUWP_API + * Defines whether target is intended for Universal Windows Platform API + * Set to 1 for Windows10 Release Solution Configuration + * @internal + */ +#ifdef U_PLATFORM_HAS_WINUWP_API + /* Use the predefined value. */ +#else +# define U_PLATFORM_HAS_WINUWP_API 0 +#endif + /** * \def U_PLATFORM_IMPLEMENTS_POSIX * Defines whether the platform implements (most of) the POSIX API. @@ -343,17 +355,6 @@ #define U_IOSTREAM_SOURCE 199711 #endif -/** - * \def U_HAVE_STD_STRING - * Defines whether the standard C++ (STL) <string> header is available. - * @internal - */ -#ifdef U_HAVE_STD_STRING - /* Use the predefined value. */ -#else -# define U_HAVE_STD_STRING 1 -#endif - /*===========================================================================*/ /** @{ Compiler and environment features */ /*===========================================================================*/ @@ -430,7 +431,7 @@ # define U_HAVE_DEBUG_LOCATION_NEW 0 #endif -/* Compatibility with non clang compilers: http://clang.llvm.org/docs/LanguageExtensions.html */ +/* Compatibility with compilers other than clang: http://clang.llvm.org/docs/LanguageExtensions.html */ #ifndef __has_attribute # define __has_attribute(x) 0 #endif @@ -497,6 +498,13 @@ # define U_CPLUSPLUS_VERSION 1 #endif +#if (U_PLATFORM == U_PF_AIX || U_PLATFORM == U_PF_OS390) && defined(__cplusplus) &&(U_CPLUSPLUS_VERSION < 11) +// add in std::nullptr_t +namespace std { + typedef decltype(nullptr) nullptr_t; +}; +#endif + /** * \def U_HAVE_RVALUE_REFERENCES * Set to 1 if the compiler supports rvalue references. @@ -537,17 +545,22 @@ * http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough * @internal */ -#ifdef __cplusplus +#ifndef __cplusplus + // Not for C. +#elif defined(U_FALLTHROUGH) + // Use the predefined value. +#elif defined(__clang__) + // Test for compiler vs. feature separately. + // Other compilers might choke on the feature test. # if __has_cpp_attribute(clang::fallthrough) || \ (__has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")) # define U_FALLTHROUGH [[clang::fallthrough]] -# else -# define U_FALLTHROUGH # endif -#else -# define U_FALLTHROUGH #endif +#ifndef U_FALLTHROUGH +# define U_FALLTHROUGH +#endif /** @} */ @@ -764,6 +777,7 @@ * gcc 4.4 defines the __CHAR16_TYPE__ macro to a usable type but * does not support u"abc" string literals. * C++11 and C11 require support for UTF-16 literals + * TODO: Fix for plain C. Doesn't work on Mac. */ # if U_CPLUSPLUS_VERSION >= 11 || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) # define U_HAVE_CHAR16_T 1 diff --git a/deps/icu-small/source/common/unicode/ptypes.h b/deps/icu-small/source/common/unicode/ptypes.h index 69d7286d323e3d..6eaf2dbf035725 100644 --- a/deps/icu-small/source/common/unicode/ptypes.h +++ b/deps/icu-small/source/common/unicode/ptypes.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/unicode/putil.h b/deps/icu-small/source/common/unicode/putil.h index 6f3250ed685fdc..91d6bb10f76f9a 100644 --- a/deps/icu-small/source/common/unicode/putil.h +++ b/deps/icu-small/source/common/unicode/putil.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/unicode/rbbi.h b/deps/icu-small/source/common/unicode/rbbi.h index 9f2a1a62b369d1..d654154008bc7f 100644 --- a/deps/icu-small/source/common/unicode/rbbi.h +++ b/deps/icu-small/source/common/unicode/rbbi.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** diff --git a/deps/icu-small/source/common/unicode/rep.h b/deps/icu-small/source/common/unicode/rep.h index 8fa2332a71ca3e..b1023a37a2daf1 100644 --- a/deps/icu-small/source/common/unicode/rep.h +++ b/deps/icu-small/source/common/unicode/rep.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************** @@ -93,7 +93,7 @@ class U_COMMON_API Replaceable : public UObject { * @return 16-bit code unit of text at given offset * @stable ICU 1.8 */ - inline UChar charAt(int32_t offset) const; + inline char16_t charAt(int32_t offset) const; /** * Returns the 32-bit code point at the given 16-bit offset into @@ -230,7 +230,7 @@ class U_COMMON_API Replaceable : public UObject { * Virtual version of charAt(). * @stable ICU 2.4 */ - virtual UChar getCharAt(int32_t offset) const = 0; + virtual char16_t getCharAt(int32_t offset) const = 0; /** * Virtual version of char32At(). @@ -246,7 +246,7 @@ Replaceable::length() const { return getLength(); } -inline UChar +inline char16_t Replaceable::charAt(int32_t offset) const { return getCharAt(offset); } diff --git a/deps/icu-small/source/common/unicode/resbund.h b/deps/icu-small/source/common/unicode/resbund.h index 0d37d4209d6f44..358ed7eeb9e535 100644 --- a/deps/icu-small/source/common/unicode/resbund.h +++ b/deps/icu-small/source/common/unicode/resbund.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -216,7 +216,7 @@ class U_COMMON_API ResourceBundle : public UObject { * could be U_MISSING_RESOURCE_ERROR if the key is not found * could be a warning * e.g.: U_USING_FALLBACK_WARNING,U_USING_DEFAULT_WARNING - * @return a pointer to a zero-terminated UChar array which lives in a memory mapped/DLL file. + * @return a pointer to a zero-terminated char16_t array which lives in a memory mapped/DLL file. * @stable ICU 2.0 */ UnicodeString diff --git a/deps/icu-small/source/common/unicode/schriter.h b/deps/icu-small/source/common/unicode/schriter.h index b5fa32d0aecb8d..d83a57f8d04b57 100644 --- a/deps/icu-small/source/common/unicode/schriter.h +++ b/deps/icu-small/source/common/unicode/schriter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -175,7 +175,7 @@ class U_COMMON_API StringCharacterIterator : public UCharCharacterIterator { * @param newTextLength The length of the String * @stable ICU 2.0 */ - void setText(const UChar* newText, int32_t newTextLength); + void setText(const char16_t* newText, int32_t newTextLength); /** * Copy of the iterated string object. diff --git a/deps/icu-small/source/common/unicode/simpleformatter.h b/deps/icu-small/source/common/unicode/simpleformatter.h index 2b74f5ca527ca2..26eae01525292c 100644 --- a/deps/icu-small/source/common/unicode/simpleformatter.h +++ b/deps/icu-small/source/common/unicode/simpleformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -19,8 +19,6 @@ #include "unicode/utypes.h" #include "unicode/unistr.h" -#ifndef U_HIDE_DRAFT_API - U_NAMESPACE_BEGIN /** @@ -49,15 +47,15 @@ U_NAMESPACE_BEGIN * * @see MessageFormat * @see UMessagePatternApostropheMode - * @draft ICU 57 + * @stable ICU 57 */ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { public: /** * Default constructor. - * @draft ICU 57 + * @stable ICU 57 */ - SimpleFormatter() : compiledPattern((UChar)0) {} + SimpleFormatter() : compiledPattern((char16_t)0) {} /** * Constructs a formatter from the pattern string. @@ -66,7 +64,7 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * Set to U_ILLEGAL_ARGUMENT_ERROR for bad argument syntax. - * @draft ICU 57 + * @stable ICU 57 */ SimpleFormatter(const UnicodeString& pattern, UErrorCode &errorCode) { applyPattern(pattern, errorCode); @@ -84,7 +82,7 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * Must fulfill U_SUCCESS before the function call. * Set to U_ILLEGAL_ARGUMENT_ERROR for bad argument syntax and * too few or too many arguments. - * @draft ICU 57 + * @stable ICU 57 */ SimpleFormatter(const UnicodeString& pattern, int32_t min, int32_t max, UErrorCode &errorCode) { @@ -93,20 +91,20 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { /** * Copy constructor. - * @draft ICU 57 + * @stable ICU 57 */ SimpleFormatter(const SimpleFormatter& other) : compiledPattern(other.compiledPattern) {} /** * Assignment operator. - * @draft ICU 57 + * @stable ICU 57 */ SimpleFormatter &operator=(const SimpleFormatter& other); /** * Destructor. - * @draft ICU 57 + * @stable ICU 57 */ ~SimpleFormatter(); @@ -118,7 +116,7 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * Must fulfill U_SUCCESS before the function call. * Set to U_ILLEGAL_ARGUMENT_ERROR for bad argument syntax. * @return TRUE if U_SUCCESS(errorCode). - * @draft ICU 57 + * @stable ICU 57 */ UBool applyPattern(const UnicodeString &pattern, UErrorCode &errorCode) { return applyPatternMinMaxArguments(pattern, 0, INT32_MAX, errorCode); @@ -137,14 +135,14 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * Set to U_ILLEGAL_ARGUMENT_ERROR for bad argument syntax and * too few or too many arguments. * @return TRUE if U_SUCCESS(errorCode). - * @draft ICU 57 + * @stable ICU 57 */ UBool applyPatternMinMaxArguments(const UnicodeString &pattern, int32_t min, int32_t max, UErrorCode &errorCode); /** * @return The max argument number + 1. - * @draft ICU 57 + * @stable ICU 57 */ int32_t getArgumentLimit() const { return getArgumentLimit(compiledPattern.getBuffer(), compiledPattern.length()); @@ -160,7 +158,7 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return appendTo - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString &format( const UnicodeString &value0, @@ -177,7 +175,7 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return appendTo - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString &format( const UnicodeString &value0, @@ -196,7 +194,7 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return appendTo - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString &format( const UnicodeString &value0, @@ -221,7 +219,7 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return appendTo - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString &formatAndAppend( const UnicodeString *const *values, int32_t valuesLength, @@ -247,7 +245,7 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { * @param errorCode ICU error code in/out parameter. * Must fulfill U_SUCCESS before the function call. * @return result - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString &formatAndReplace( const UnicodeString *const *values, int32_t valuesLength, @@ -257,7 +255,7 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { /** * Returns the pattern text with none of the arguments. * Like formatting with all-empty string values. - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString getTextWithNoArguments() const { return getTextWithNoArguments(compiledPattern.getBuffer(), compiledPattern.length()); @@ -275,15 +273,15 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { */ UnicodeString compiledPattern; - static inline int32_t getArgumentLimit(const UChar *compiledPattern, + static inline int32_t getArgumentLimit(const char16_t *compiledPattern, int32_t compiledPatternLength) { return compiledPatternLength == 0 ? 0 : compiledPattern[0]; } - static UnicodeString getTextWithNoArguments(const UChar *compiledPattern, int32_t compiledPatternLength); + static UnicodeString getTextWithNoArguments(const char16_t *compiledPattern, int32_t compiledPatternLength); static UnicodeString &format( - const UChar *compiledPattern, int32_t compiledPatternLength, + const char16_t *compiledPattern, int32_t compiledPatternLength, const UnicodeString *const *values, UnicodeString &result, const UnicodeString *resultCopy, UBool forbidResultAsValue, int32_t *offsets, int32_t offsetsLength, @@ -292,6 +290,4 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { U_NAMESPACE_END -#endif /* U_HIDE_DRAFT_API */ - #endif // __SIMPLEFORMATTER_H__ diff --git a/deps/icu-small/source/common/unicode/std_string.h b/deps/icu-small/source/common/unicode/std_string.h index 104ef0c83e8cfe..729c56399506eb 100644 --- a/deps/icu-small/source/common/unicode/std_string.h +++ b/deps/icu-small/source/common/unicode/std_string.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: std_string.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -27,13 +27,11 @@ #include "unicode/utypes.h" -#if U_HAVE_STD_STRING - -#if !defined(_MSC_VER) -namespace std { class type_info; } // WORKAROUND: http://llvm.org/bugs/show_bug.cgi?id=13364 +// Workaround for a libstdc++ bug before libstdc++4.6 (2011). +// https://bugs.llvm.org/show_bug.cgi?id=13364 +#if defined(__GLIBCXX__) +namespace std { class type_info; } #endif #include -#endif // U_HAVE_STD_STRING - #endif // __STD_STRING_H__ diff --git a/deps/icu-small/source/common/unicode/strenum.h b/deps/icu-small/source/common/unicode/strenum.h index 74ff28decc3df2..fa525d4f5227da 100644 --- a/deps/icu-small/source/common/unicode/strenum.h +++ b/deps/icu-small/source/common/unicode/strenum.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -35,7 +35,7 @@ U_NAMESPACE_BEGIN * call, so the returned string still might not be 'valid' on * subsequent use.

* - *

Strings may take the form of const char*, const UChar*, or const + *

Strings may take the form of const char*, const char16_t*, or const * UnicodeString*. The type you get is determine by the variant of * 'next' that you call. In general the StringEnumeration is * optimized for one of these types, but all StringEnumerations can @@ -112,7 +112,7 @@ class U_COMMON_API StringEnumeration : public UObject { *

If the iterator is out of sync with its service, status is set * to U_ENUM_OUT_OF_SYNC_ERROR and NULL is returned.

* - *

If the native service string is a UChar* string, it is + *

If the native service string is a char16_t* string, it is * converted to char* with the invariant converter. If the * conversion fails (because a character cannot be converted) then * status is set to U_INVARIANT_CONVERSION_ERROR and the return @@ -131,7 +131,7 @@ class U_COMMON_API StringEnumeration : public UObject { virtual const char* next(int32_t *resultLength, UErrorCode& status); /** - *

Returns the next element as a NUL-terminated UChar*. If there + *

Returns the next element as a NUL-terminated char16_t*. If there * are no more elements, returns NULL. If the resultLength pointer * is not NULL, the length of the string (not counting the * terminating NUL) is returned at that address. If an error @@ -153,7 +153,7 @@ class U_COMMON_API StringEnumeration : public UObject { * * @stable ICU 2.4 */ - virtual const UChar* unext(int32_t *resultLength, UErrorCode& status); + virtual const char16_t* unext(int32_t *resultLength, UErrorCode& status); /** *

Returns the next element a UnicodeString*. If there are no diff --git a/deps/icu-small/source/common/unicode/stringpiece.h b/deps/icu-small/source/common/unicode/stringpiece.h index 43864ad81a8292..640fbac5a827d0 100644 --- a/deps/icu-small/source/common/unicode/stringpiece.h +++ b/deps/icu-small/source/common/unicode/stringpiece.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // Copyright (C) 2009-2013, International Business Machines // Corporation and others. All Rights Reserved. @@ -68,14 +68,12 @@ class U_COMMON_API StringPiece : public UMemory { * @stable ICU 4.2 */ StringPiece(const char* str); -#if U_HAVE_STD_STRING /** * Constructs from a std::string. * @stable ICU 4.2 */ StringPiece(const std::string& str) : ptr_(str.data()), length_(static_cast(str.size())) { } -#endif /** * Constructs from a const char * pointer and a specified length. * @param offset a const char * pointer (need not be terminated) diff --git a/deps/icu-small/source/common/unicode/stringtriebuilder.h b/deps/icu-small/source/common/unicode/stringtriebuilder.h index c2839fe53f29ff..d1ac003c48a643 100644 --- a/deps/icu-small/source/common/unicode/stringtriebuilder.h +++ b/deps/icu-small/source/common/unicode/stringtriebuilder.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: stringtriebuilder.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -105,7 +105,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { /** @internal */ virtual int32_t getElementStringLength(int32_t i) const = 0; /** @internal */ - virtual UChar getElementUnit(int32_t i, int32_t unitIndex) const = 0; + virtual char16_t getElementUnit(int32_t i, int32_t unitIndex) const = 0; /** @internal */ virtual int32_t getElementValue(int32_t i) const = 0; @@ -120,7 +120,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { /** @internal */ virtual int32_t skipElementsBySomeUnits(int32_t i, int32_t unitIndex, int32_t count) const = 0; /** @internal */ - virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, UChar unit) const = 0; + virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, char16_t unit) const = 0; /** @internal */ virtual UBool matchNodesCanHaveValues() const = 0; @@ -137,7 +137,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { /** @internal */ static const int32_t kMaxBranchLinearSubNodeLength=5; - // Maximum number of nested split-branch levels for a branch on all 2^16 possible UChar units. + // Maximum number of nested split-branch levels for a branch on all 2^16 possible char16_t units. // log2(2^16/kMaxBranchLinearSubNodeLength) rounded up. /** @internal */ static const int32_t kMaxSplitBranchLevels=14; @@ -338,7 +338,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { virtual void write(StringTrieBuilder &builder); // Adds a unit with a final value. void add(int32_t c, int32_t value) { - units[length]=(UChar)c; + units[length]=(char16_t)c; equal[length]=NULL; values[length]=value; ++length; @@ -346,7 +346,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { } // Adds a unit which leads to another match node. void add(int32_t c, Node *node) { - units[length]=(UChar)c; + units[length]=(char16_t)c; equal[length]=node; values[length]=0; ++length; @@ -356,7 +356,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { Node *equal[kMaxBranchLinearSubNodeLength]; // NULL means "has final value". int32_t length; int32_t values[kMaxBranchLinearSubNodeLength]; - UChar units[kMaxBranchLinearSubNodeLength]; + char16_t units[kMaxBranchLinearSubNodeLength]; }; /** @@ -364,7 +364,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { */ class SplitBranchNode : public BranchNode { public: - SplitBranchNode(UChar middleUnit, Node *lessThanNode, Node *greaterOrEqualNode) + SplitBranchNode(char16_t middleUnit, Node *lessThanNode, Node *greaterOrEqualNode) : BranchNode(((0x555555*37+middleUnit)*37+ hashCode(lessThanNode))*37+hashCode(greaterOrEqualNode)), unit(middleUnit), lessThan(lessThanNode), greaterOrEqual(greaterOrEqualNode) {} @@ -372,7 +372,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { virtual int32_t markRightEdgesFirst(int32_t edgeNumber); virtual void write(StringTrieBuilder &builder); protected: - UChar unit; + char16_t unit; Node *lessThan; Node *greaterOrEqual; }; diff --git a/deps/icu-small/source/common/unicode/symtable.h b/deps/icu-small/source/common/unicode/symtable.h index 829c8105d05d85..c2dc95a61bc020 100644 --- a/deps/icu-small/source/common/unicode/symtable.h +++ b/deps/icu-small/source/common/unicode/symtable.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/ubidi.h b/deps/icu-small/source/common/unicode/ubidi.h index e59969861f3402..ef21f2420666cd 100644 --- a/deps/icu-small/source/common/unicode/ubidi.h +++ b/deps/icu-small/source/common/unicode/ubidi.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ubidi.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -1196,11 +1196,14 @@ ubidi_setContext(UBiDi *pBiDi, * A level overrides the directional property of its corresponding * (same index) character if the level has the * #UBIDI_LEVEL_OVERRIDE bit set.

- * Except for that bit, it must be + * Aside from that bit, it must be * paraLevel<=embeddingLevels[]<=UBIDI_MAX_EXPLICIT_LEVEL, - * with one exception: a level of zero may be specified for a paragraph - * separator even if paraLevel>0 when multiple paragraphs - * are submitted in the same call to ubidi_setPara().

+ * except that level 0 is always allowed. + * Level 0 for a paragraph separator prevents reordering of paragraphs; + * this only works reliably if #UBIDI_LEVEL_OVERRIDE + * is also set for paragraph separators. + * Level 0 for other characters is treated as a wildcard + * and is lifted up to the resolved level of the surrounding paragraph.

* Caution: A copy of this pointer, not of the levels, * will be stored in the UBiDi object; * the embeddingLevels array must not be diff --git a/deps/icu-small/source/common/unicode/ubiditransform.h b/deps/icu-small/source/common/unicode/ubiditransform.h index 509f68bcc012e0..724587dddc8c49 100644 --- a/deps/icu-small/source/common/unicode/ubiditransform.h +++ b/deps/icu-small/source/common/unicode/ubiditransform.h @@ -1,12 +1,12 @@ /* ****************************************************************************** * -* Copyright (C) 2016 and later: Unicode, Inc. and others. +* © 2016 and later: Unicode, Inc. and others. * License & terms of use: http://www.unicode.org/copyright.html * ****************************************************************************** * file name: ubiditransform.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/ubrk.h b/deps/icu-small/source/common/unicode/ubrk.h index f43943ed1ab12c..22a4b99cd6dd2b 100644 --- a/deps/icu-small/source/common/unicode/ubrk.h +++ b/deps/icu-small/source/common/unicode/ubrk.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -267,6 +267,34 @@ ubrk_openRules(const UChar *rules, UParseError *parseErr, UErrorCode *status); +#ifndef U_HIDE_DRAFT_API +/** + * Open a new UBreakIterator for locating text boundaries using precompiled binary rules. + * Opening a UBreakIterator this way is substantially faster than using ubrk_openRules. + * Binary rules may be obtained using ubrk_getBinaryRules. The compiled rules are not + * compatible across different major versions of ICU, nor across platforms of different + * endianness or different base character set family (ASCII vs EBCDIC). + * @param binaryRules A set of compiled binary rules specifying the text breaking + * conventions. Ownership of the storage containing the compiled + * rules remains with the caller of this function. The compiled + * rules must not be modified or deleted during the life of the + * break iterator. + * @param rulesLength The length of binaryRules in bytes; must be >= 0. + * @param text The text to be iterated over. May be null, in which case + * ubrk_setText() is used to specify the text to be iterated. + * @param textLength The number of characters in text, or -1 if null-terminated. + * @param status Pointer to UErrorCode to receive any errors. + * @return UBreakIterator for the specified rules. + * @see ubrk_getBinaryRules + * @draft ICU 59 + */ +U_DRAFT UBreakIterator* U_EXPORT2 +ubrk_openBinaryRules(const uint8_t *binaryRules, int32_t rulesLength, + const UChar * text, int32_t textLength, + UErrorCode * status); + +#endif /* U_HIDE_DRAFT_API */ + /** * Thread safe cloning operation * @param bi iterator to be cloned @@ -566,6 +594,40 @@ ubrk_refreshUText(UBreakIterator *bi, UText *text, UErrorCode *status); + +#ifndef U_HIDE_DRAFT_API +/** + * Get a compiled binary version of the rules specifying the behavior of a UBreakIterator. + * The binary rules may be used with ubrk_openBinaryRules to open a new UBreakIterator + * more quickly than using ubrk_openRules. The compiled rules are not compatible across + * different major versions of ICU, nor across platforms of different endianness or + * different base character set family (ASCII vs EBCDIC). Supports preflighting (with + * binaryRules=NULL and rulesCapacity=0) to get the rules length without copying them to + * the binaryRules buffer. However, whether preflighting or not, if the actual length + * is greater than INT32_MAX, then the function returns 0 and sets *status to + * U_INDEX_OUTOFBOUNDS_ERROR. + + * @param bi The break iterator to use. + * @param binaryRules Buffer to receive the compiled binary rules; set to NULL for + * preflighting. + * @param rulesCapacity Capacity (in bytes) of the binaryRules buffer; set to 0 for + * preflighting. Must be >= 0. + * @param status Pointer to UErrorCode to receive any errors, such as + * U_BUFFER_OVERFLOW_ERROR, U_INDEX_OUTOFBOUNDS_ERROR, or + * U_ILLEGAL_ARGUMENT_ERROR. + * @return The actual byte length of the binary rules, if <= INT32_MAX; + * otherwise 0. If not preflighting and this is larger than + * rulesCapacity, *status will be set to an error. + * @see ubrk_openBinaryRules + * @draft ICU 59 + */ +U_DRAFT int32_t U_EXPORT2 +ubrk_getBinaryRules(UBreakIterator *bi, + uint8_t * binaryRules, int32_t rulesCapacity, + UErrorCode * status); + +#endif /* U_HIDE_DRAFT_API */ + #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ #endif diff --git a/deps/icu-small/source/common/unicode/ucasemap.h b/deps/icu-small/source/common/unicode/ucasemap.h index d7345e8a402ab6..18e6c2ba0b9e0b 100644 --- a/deps/icu-small/source/common/unicode/ucasemap.h +++ b/deps/icu-small/source/common/unicode/ucasemap.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucasemap.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -22,8 +22,8 @@ #define __UCASEMAP_H__ #include "unicode/utypes.h" -#include "unicode/ustring.h" #include "unicode/localpointer.h" +#include "unicode/ustring.h" /** * \file @@ -185,6 +185,15 @@ ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode); */ #define U_TITLECASE_NO_BREAK_ADJUSTMENT 0x200 +/** + * Omit unchanged text when case-mapping with Edits. + * + * @see CaseMap + * @see Edits + * @draft ICU 59 + */ +#define UCASEMAP_OMIT_UNCHANGED_TEXT 0x4000 + #if !UCONFIG_NO_BREAK_ITERATION /** @@ -253,7 +262,7 @@ ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode * @param dest A buffer for the result string. The result will be NUL-terminated if * the buffer is large enough. * The contents is undefined in case of failure. - * @param destCapacity The size of the buffer (number of bytes). If it is 0, then + * @param destCapacity The size of the buffer (number of UChars). If it is 0, then * dest may be NULL and the function will only return the length of the result * without writing any of the result string. * @param src The original string. @@ -272,7 +281,7 @@ ucasemap_toTitle(UCaseMap *csm, const UChar *src, int32_t srcLength, UErrorCode *pErrorCode); -#endif +#endif // UCONFIG_NO_BREAK_ITERATION /** * Lowercase the characters in a UTF-8 string. diff --git a/deps/icu-small/source/common/unicode/ucat.h b/deps/icu-small/source/common/unicode/ucat.h index 418b64fa19d919..f9c18b47d6c9b8 100644 --- a/deps/icu-small/source/common/unicode/ucat.h +++ b/deps/icu-small/source/common/unicode/ucat.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/uchar.h b/deps/icu-small/source/common/unicode/uchar.h index 7f6ea6d9343ab7..8174ca23e6f6ff 100644 --- a/deps/icu-small/source/common/unicode/uchar.h +++ b/deps/icu-small/source/common/unicode/uchar.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -399,36 +399,34 @@ typedef enum UProperty { UCHAR_CHANGES_WHEN_CASEMAPPED=55, /** Binary property Changes_When_NFKC_Casefolded. @stable ICU 4.4 */ UCHAR_CHANGES_WHEN_NFKC_CASEFOLDED=56, -#ifndef U_HIDE_DRAFT_API /** * Binary property Emoji. * See http://www.unicode.org/reports/tr51/#Emoji_Properties * - * @draft ICU 57 + * @stable ICU 57 */ UCHAR_EMOJI=57, /** * Binary property Emoji_Presentation. * See http://www.unicode.org/reports/tr51/#Emoji_Properties * - * @draft ICU 57 + * @stable ICU 57 */ UCHAR_EMOJI_PRESENTATION=58, /** * Binary property Emoji_Modifier. * See http://www.unicode.org/reports/tr51/#Emoji_Properties * - * @draft ICU 57 + * @stable ICU 57 */ UCHAR_EMOJI_MODIFIER=59, /** * Binary property Emoji_Modifier_Base. * See http://www.unicode.org/reports/tr51/#Emoji_Properties * - * @draft ICU 57 + * @stable ICU 57 */ UCHAR_EMOJI_MODIFIER_BASE=60, -#endif /* U_HIDE_DRAFT_API */ #ifndef U_HIDE_DEPRECATED_API /** * One more than the last constant for binary Unicode properties. diff --git a/deps/icu-small/source/common/unicode/ucharstrie.h b/deps/icu-small/source/common/unicode/ucharstrie.h index 8daed447cedab1..dfc93f6d0bae8a 100644 --- a/deps/icu-small/source/common/unicode/ucharstrie.h +++ b/deps/icu-small/source/common/unicode/ucharstrie.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucharstrie.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -36,7 +36,7 @@ class UVector32; /** * Light-weight, non-const reader class for a UCharsTrie. - * Traverses a UChar-serialized data structure with minimal state, + * Traverses a char16_t-serialized data structure with minimal state, * for mapping strings (16-bit-unit sequences) to non-negative integer values. * * This class owns the serialized trie data only if it was constructed by @@ -52,18 +52,18 @@ class U_COMMON_API UCharsTrie : public UMemory { /** * Constructs a UCharsTrie reader instance. * - * The trieUChars must contain a copy of a UChar sequence from the UCharsTrieBuilder, - * starting with the first UChar of that sequence. - * The UCharsTrie object will not read more UChars than + * The trieUChars must contain a copy of a char16_t sequence from the UCharsTrieBuilder, + * starting with the first char16_t of that sequence. + * The UCharsTrie object will not read more char16_ts than * the UCharsTrieBuilder generated in the corresponding build() call. * * The array is not copied/cloned and must not be modified while * the UCharsTrie object is in use. * - * @param trieUChars The UChar array that contains the serialized trie. + * @param trieUChars The char16_t array that contains the serialized trie. * @stable ICU 4.8 */ - UCharsTrie(const UChar *trieUChars) + UCharsTrie(ConstChar16Ptr trieUChars) : ownedArray_(NULL), uchars_(trieUChars), pos_(uchars_), remainingMatchLength_(-1) {} @@ -75,7 +75,7 @@ class U_COMMON_API UCharsTrie : public UMemory { /** * Copy constructor, copies the other trie reader object and its state, - * but not the UChar array which will be shared. (Shallow copy.) + * but not the char16_t array which will be shared. (Shallow copy.) * @param other Another UCharsTrie object. * @stable ICU 4.8 */ @@ -109,8 +109,8 @@ class U_COMMON_API UCharsTrie : public UMemory { private: friend class UCharsTrie; - const UChar *uchars; - const UChar *pos; + const char16_t *uchars; + const char16_t *pos; int32_t remainingMatchLength; }; @@ -148,14 +148,14 @@ class U_COMMON_API UCharsTrie : public UMemory { /** * Determines whether the string so far matches, whether it has a value, - * and whether another input UChar can continue a matching string. + * and whether another input char16_t can continue a matching string. * @return The match/value Result. * @stable ICU 4.8 */ UStringTrieResult current() const; /** - * Traverses the trie from the initial state for this input UChar. + * Traverses the trie from the initial state for this input char16_t. * Equivalent to reset().next(uchar). * @param uchar Input char value. Values below 0 and above 0xffff will never match. * @return The match/value Result. @@ -177,7 +177,7 @@ class U_COMMON_API UCharsTrie : public UMemory { UStringTrieResult firstForCodePoint(UChar32 cp); /** - * Traverses the trie from the current state for this input UChar. + * Traverses the trie from the current state for this input char16_t. * @param uchar Input char value. Values below 0 and above 0xffff will never match. * @return The match/value Result. * @stable ICU 4.8 @@ -208,7 +208,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * @return The match/value Result. * @stable ICU 4.8 */ - UStringTrieResult next(const UChar *s, int32_t length); + UStringTrieResult next(ConstChar16Ptr s, int32_t length); /** * Returns a matching string's value if called immediately after @@ -220,7 +220,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * @stable ICU 4.8 */ inline int32_t getValue() const { - const UChar *pos=pos_; + const char16_t *pos=pos_; int32_t leadUnit=*pos++; // U_ASSERT(leadUnit>=kMinValueLead); return leadUnit&kValueIsFinal ? @@ -237,16 +237,16 @@ class U_COMMON_API UCharsTrie : public UMemory { * @stable ICU 4.8 */ inline UBool hasUniqueValue(int32_t &uniqueValue) const { - const UChar *pos=pos_; + const char16_t *pos=pos_; // Skip the rest of a pending linear-match node. return pos!=NULL && findUniqueValue(pos+remainingMatchLength_+1, FALSE, uniqueValue); } /** - * Finds each UChar which continues the string from the current state. - * That is, each UChar c for which it would be next(c)!=USTRINGTRIE_NO_MATCH now. - * @param out Each next UChar is appended to this object. - * @return the number of UChars which continue the string from here + * Finds each char16_t which continues the string from the current state. + * That is, each char16_t c for which it would be next(c)!=USTRINGTRIE_NO_MATCH now. + * @param out Each next char16_t is appended to this object. + * @return the number of char16_ts which continue the string from here * @stable ICU 4.8 */ int32_t getNextUChars(Appendable &out) const; @@ -258,8 +258,8 @@ class U_COMMON_API UCharsTrie : public UMemory { class U_COMMON_API Iterator : public UMemory { public: /** - * Iterates from the root of a UChar-serialized UCharsTrie. - * @param trieUChars The trie UChars. + * Iterates from the root of a char16_t-serialized UCharsTrie. + * @param trieUChars The trie char16_ts. * @param maxStringLength If 0, the iterator returns full strings. * Otherwise, the iterator returns strings with this maximum length. * @param errorCode Standard ICU error code. Its input value must @@ -268,7 +268,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * function chaining. (See User Guide for details.) * @stable ICU 4.8 */ - Iterator(const UChar *trieUChars, int32_t maxStringLength, UErrorCode &errorCode); + Iterator(ConstChar16Ptr trieUChars, int32_t maxStringLength, UErrorCode &errorCode); /** * Iterates from the current state of the specified UCharsTrie. @@ -336,11 +336,11 @@ class U_COMMON_API UCharsTrie : public UMemory { return TRUE; } - const UChar *branchNext(const UChar *pos, int32_t length, UErrorCode &errorCode); + const char16_t *branchNext(const char16_t *pos, int32_t length, UErrorCode &errorCode); - const UChar *uchars_; - const UChar *pos_; - const UChar *initialPos_; + const char16_t *uchars_; + const char16_t *pos_; + const char16_t *initialPos_; int32_t remainingMatchLength_; int32_t initialRemainingMatchLength_; UBool skipValue_; // Skip intermediate value which was already delivered. @@ -368,7 +368,7 @@ class U_COMMON_API UCharsTrie : public UMemory { * this constructor adopts the builder's array. * This constructor is only called by the builder. */ - UCharsTrie(UChar *adoptUChars, const UChar *trieUChars) + UCharsTrie(char16_t *adoptUChars, const char16_t *trieUChars) : ownedArray_(adoptUChars), uchars_(trieUChars), pos_(uchars_), remainingMatchLength_(-1) {} @@ -381,7 +381,7 @@ class U_COMMON_API UCharsTrie : public UMemory { // Reads a compact 32-bit integer. // pos is already after the leadUnit, and the lead unit has bit 15 reset. - static inline int32_t readValue(const UChar *pos, int32_t leadUnit) { + static inline int32_t readValue(const char16_t *pos, int32_t leadUnit) { int32_t value; if(leadUnit=kMinTwoUnitValueLead) { if(leadUnit=kMinTwoUnitNodeValueLead) { if(leadUnit=kMinTwoUnitDeltaLead) { if(delta==kThreeUnitDeltaLead) { @@ -444,7 +444,7 @@ class U_COMMON_API UCharsTrie : public UMemory { return pos+delta; } - static const UChar *skipDelta(const UChar *pos) { + static const char16_t *skipDelta(const char16_t *pos) { int32_t delta=*pos++; if(delta>=kMinTwoUnitDeltaLead) { if(delta==kThreeUnitDeltaLead) { @@ -461,28 +461,28 @@ class U_COMMON_API UCharsTrie : public UMemory { } // Handles a branch node for both next(uchar) and next(string). - UStringTrieResult branchNext(const UChar *pos, int32_t length, int32_t uchar); + UStringTrieResult branchNext(const char16_t *pos, int32_t length, int32_t uchar); // Requires remainingLength_<0. - UStringTrieResult nextImpl(const UChar *pos, int32_t uchar); + UStringTrieResult nextImpl(const char16_t *pos, int32_t uchar); // Helper functions for hasUniqueValue(). // Recursively finds a unique value (or whether there is not a unique one) // from a branch. - static const UChar *findUniqueValueFromBranch(const UChar *pos, int32_t length, + static const char16_t *findUniqueValueFromBranch(const char16_t *pos, int32_t length, UBool haveUniqueValue, int32_t &uniqueValue); // Recursively finds a unique value (or whether there is not a unique one) // starting from a position on a node lead unit. - static UBool findUniqueValue(const UChar *pos, UBool haveUniqueValue, int32_t &uniqueValue); + static UBool findUniqueValue(const char16_t *pos, UBool haveUniqueValue, int32_t &uniqueValue); // Helper functions for getNextUChars(). // getNextUChars() when pos is on a branch node. - static void getNextBranchUChars(const UChar *pos, int32_t length, Appendable &out); + static void getNextBranchUChars(const char16_t *pos, int32_t length, Appendable &out); // UCharsTrie data structure // - // The trie consists of a series of UChar-serialized nodes for incremental - // Unicode string/UChar sequence matching. (UChar=16-bit unsigned integer) + // The trie consists of a series of char16_t-serialized nodes for incremental + // Unicode string/char16_t sequence matching. (char16_t=16-bit unsigned integer) // The root node is at the beginning of the trie data. // // Types of nodes are distinguished by their node lead unit ranges. @@ -491,9 +491,9 @@ class U_COMMON_API UCharsTrie : public UMemory { // // Node types: // - Final-value node: Stores a 32-bit integer in a compact, variable-length format. - // The value is for the string/UChar sequence so far. + // The value is for the string/char16_t sequence so far. // - Match node, optionally with an intermediate value in a different compact format. - // The value, if present, is for the string/UChar sequence so far. + // The value, if present, is for the string/char16_t sequence so far. // // Aside from the value, which uses the node lead unit's high bits: // @@ -560,15 +560,15 @@ class U_COMMON_API UCharsTrie : public UMemory { static const int32_t kMaxTwoUnitDelta=((kThreeUnitDeltaLead-kMinTwoUnitDeltaLead)<<16)-1; // 0x03feffff - UChar *ownedArray_; + char16_t *ownedArray_; // Fixed value referencing the UCharsTrie words. - const UChar *uchars_; + const char16_t *uchars_; // Iterator variables. // Pointer to next trie unit to read. NULL if no more matches. - const UChar *pos_; + const char16_t *pos_; // Remaining length of a linear-match node, minus 1. Negative if not in such a node. int32_t remainingMatchLength_; }; diff --git a/deps/icu-small/source/common/unicode/ucharstriebuilder.h b/deps/icu-small/source/common/unicode/ucharstriebuilder.h index cc9fb77a9176e0..2aa4757e52cb07 100644 --- a/deps/icu-small/source/common/unicode/ucharstriebuilder.h +++ b/deps/icu-small/source/common/unicode/ucharstriebuilder.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucharstriebuilder.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -89,21 +89,21 @@ class U_COMMON_API UCharsTrieBuilder : public StringTrieBuilder { UCharsTrie *build(UStringTrieBuildOption buildOption, UErrorCode &errorCode); /** - * Builds a UCharsTrie for the add()ed data and UChar-serializes it. + * Builds a UCharsTrie for the add()ed data and char16_t-serializes it. * Once built, no further data can be add()ed until clear() is called. * * A UCharsTrie cannot be empty. At least one (string, value) pair * must have been add()ed. * * Multiple calls to buildUnicodeString() set the UnicodeStrings to the - * builder's same UChar array, without rebuilding. + * builder's same char16_t array, without rebuilding. * If buildUnicodeString() is called after build(), the trie will be * re-serialized into a new array. * If build() is called after buildUnicodeString(), the trie object will become * the owner of the previously returned array. * After clear() has been called, a new array will be used as well. * @param buildOption Build option, see UStringTrieBuildOption. - * @param result A UnicodeString which will be set to the UChar-serialized + * @param result A UnicodeString which will be set to the char16_t-serialized * UCharsTrie for the add()ed data. * @param errorCode Standard ICU error code. Its input value must * pass the U_SUCCESS() test, or else the function returns @@ -135,14 +135,14 @@ class U_COMMON_API UCharsTrieBuilder : public StringTrieBuilder { void buildUChars(UStringTrieBuildOption buildOption, UErrorCode &errorCode); virtual int32_t getElementStringLength(int32_t i) const; - virtual UChar getElementUnit(int32_t i, int32_t unitIndex) const; + virtual char16_t getElementUnit(int32_t i, int32_t unitIndex) const; virtual int32_t getElementValue(int32_t i) const; virtual int32_t getLimitOfLinearMatch(int32_t first, int32_t last, int32_t unitIndex) const; virtual int32_t countElementUnits(int32_t start, int32_t limit, int32_t unitIndex) const; virtual int32_t skipElementsBySomeUnits(int32_t i, int32_t unitIndex, int32_t count) const; - virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, UChar unit) const; + virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, char16_t unit) const; virtual UBool matchNodesCanHaveValues() const { return TRUE; } @@ -152,11 +152,11 @@ class U_COMMON_API UCharsTrieBuilder : public StringTrieBuilder { class UCTLinearMatchNode : public LinearMatchNode { public: - UCTLinearMatchNode(const UChar *units, int32_t len, Node *nextNode); + UCTLinearMatchNode(const char16_t *units, int32_t len, Node *nextNode); virtual UBool operator==(const Node &other) const; virtual void write(StringTrieBuilder &builder); private: - const UChar *s; + const char16_t *s; }; virtual Node *createLinearMatchNode(int32_t i, int32_t unitIndex, int32_t length, @@ -164,7 +164,7 @@ class U_COMMON_API UCharsTrieBuilder : public StringTrieBuilder { UBool ensureCapacity(int32_t length); virtual int32_t write(int32_t unit); - int32_t write(const UChar *s, int32_t length); + int32_t write(const char16_t *s, int32_t length); virtual int32_t writeElementUnits(int32_t i, int32_t unitIndex, int32_t length); virtual int32_t writeValueAndFinal(int32_t i, UBool isFinal); virtual int32_t writeValueAndType(UBool hasValue, int32_t value, int32_t node); @@ -175,9 +175,9 @@ class U_COMMON_API UCharsTrieBuilder : public StringTrieBuilder { int32_t elementsCapacity; int32_t elementsLength; - // UChar serialization of the trie. + // char16_t serialization of the trie. // Grows from the back: ucharsLength measures from the end of the buffer! - UChar *uchars; + char16_t *uchars; int32_t ucharsCapacity; int32_t ucharsLength; }; diff --git a/deps/icu-small/source/common/unicode/uchriter.h b/deps/icu-small/source/common/unicode/uchriter.h index 1365c9b7d1a0ae..38f67c5b454cba 100644 --- a/deps/icu-small/source/common/unicode/uchriter.h +++ b/deps/icu-small/source/common/unicode/uchriter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -15,18 +15,18 @@ /** * \file - * \brief C++ API: UChar Character Iterator + * \brief C++ API: char16_t Character Iterator */ U_NAMESPACE_BEGIN /** * A concrete subclass of CharacterIterator that iterates over the - * characters (code units or code points) in a UChar array. + * characters (code units or code points) in a char16_t array. * It's possible not only to create an - * iterator that iterates over an entire UChar array, but also to - * create one that iterates over only a subrange of a UChar array - * (iterators over different subranges of the same UChar array don't + * iterator that iterates over an entire char16_t array, but also to + * create one that iterates over only a subrange of a char16_t array + * (iterators over different subranges of the same char16_t array don't * compare equal). * @see CharacterIterator * @see ForwardCharacterIterator @@ -35,34 +35,34 @@ U_NAMESPACE_BEGIN class U_COMMON_API UCharCharacterIterator : public CharacterIterator { public: /** - * Create an iterator over the UChar array referred to by "textPtr". + * Create an iterator over the char16_t array referred to by "textPtr". * The iteration range is 0 to length-1. * text is only aliased, not adopted (the * destructor will not delete it). - * @param textPtr The UChar array to be iterated over - * @param length The length of the UChar array + * @param textPtr The char16_t array to be iterated over + * @param length The length of the char16_t array * @stable ICU 2.0 */ - UCharCharacterIterator(const UChar* textPtr, int32_t length); + UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length); /** - * Create an iterator over the UChar array referred to by "textPtr". + * Create an iterator over the char16_t array referred to by "textPtr". * The iteration range is 0 to length-1. * text is only aliased, not adopted (the * destructor will not delete it). * The starting * position is specified by "position". If "position" is outside the valid * iteration range, the behavior of this object is undefined. - * @param textPtr The UChar array to be iteratd over - * @param length The length of the UChar array + * @param textPtr The char16_t array to be iteratd over + * @param length The length of the char16_t array * @param position The starting position of the iteration * @stable ICU 2.0 */ - UCharCharacterIterator(const UChar* textPtr, int32_t length, + UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, int32_t position); /** - * Create an iterator over the UChar array referred to by "textPtr". + * Create an iterator over the char16_t array referred to by "textPtr". * The iteration range is 0 to end-1. * text is only aliased, not adopted (the * destructor will not delete it). @@ -70,14 +70,14 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * position is specified by "position". If begin and end do not * form a valid iteration range or "position" is outside the valid * iteration range, the behavior of this object is undefined. - * @param textPtr The UChar array to be iterated over - * @param length The length of the UChar array + * @param textPtr The char16_t array to be iterated over + * @param length The length of the char16_t array * @param textBegin The begin position of the iteration range * @param textEnd The end position of the iteration range * @param position The starting position of the iteration * @stable ICU 2.0 */ - UCharCharacterIterator(const UChar* textPtr, int32_t length, + UCharCharacterIterator(ConstChar16Ptr textPtr, int32_t length, int32_t textBegin, int32_t textEnd, int32_t position); @@ -141,7 +141,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the first code unit in its iteration range. * @stable ICU 2.0 */ - virtual UChar first(void); + virtual char16_t first(void); /** * Sets the iterator to refer to the first code unit in its @@ -151,7 +151,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the first code unit in its iteration range * @stable ICU 2.0 */ - virtual UChar firstPostInc(void); + virtual char16_t firstPostInc(void); /** * Sets the iterator to refer to the first code point in its @@ -181,7 +181,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the last code unit in its iteration range. * @stable ICU 2.0 */ - virtual UChar last(void); + virtual char16_t last(void); /** * Sets the iterator to refer to the last code point in its @@ -200,7 +200,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the code unit * @stable ICU 2.0 */ - virtual UChar setIndex(int32_t position); + virtual char16_t setIndex(int32_t position); /** * Sets the iterator to refer to the beginning of the code point @@ -220,7 +220,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the code unit the iterator currently refers to. * @stable ICU 2.0 */ - virtual UChar current(void) const; + virtual char16_t current(void) const; /** * Returns the code point the iterator currently refers to. @@ -236,7 +236,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the next code unit in the iteration range. * @stable ICU 2.0 */ - virtual UChar next(void); + virtual char16_t next(void); /** * Gets the current code unit for returning and advances to the next code unit @@ -246,7 +246,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the current code unit. * @stable ICU 2.0 */ - virtual UChar nextPostInc(void); + virtual char16_t nextPostInc(void); /** * Advances to the next code point in the iteration range (toward @@ -288,7 +288,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the previous code unit in the iteration range. * @stable ICU 2.0 */ - virtual UChar previous(void); + virtual char16_t previous(void); /** * Advances to the previous code point in the iteration range (toward @@ -334,16 +334,20 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * @return the new position * @stable ICU 2.0 */ +#ifdef move32 + // One of the system headers right now is sometimes defining a conflicting macro we don't use +#undef move32 +#endif virtual int32_t move32(int32_t delta, EOrigin origin); /** * Sets the iterator to iterate over a new range of text * @stable ICU 2.0 */ - void setText(const UChar* newText, int32_t newTextLength); + void setText(ConstChar16Ptr newText, int32_t newTextLength); /** - * Copies the UChar array under iteration into the UnicodeString + * Copies the char16_t array under iteration into the UnicodeString * referred to by "result". Even if this iterator iterates across * only a part of this string, the whole string is copied. * @param result Receives a copy of the text under iteration. @@ -375,7 +379,7 @@ class U_COMMON_API UCharCharacterIterator : public CharacterIterator { * Protected member text * @stable ICU 2.0 */ - const UChar* text; + const char16_t* text; }; diff --git a/deps/icu-small/source/common/unicode/uclean.h b/deps/icu-small/source/common/unicode/uclean.h index 6a5a4f42b6c886..d0bfcb13a644e2 100644 --- a/deps/icu-small/source/common/unicode/uclean.h +++ b/deps/icu-small/source/common/unicode/uclean.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: uclean.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -101,7 +101,7 @@ u_init(UErrorCode *status); U_STABLE void U_EXPORT2 u_cleanup(void); - +U_CDECL_BEGIN /** * Pointer type for a user supplied memory allocation function. * @param context user supplied value, obtained from from u_setMemoryFunctions(). @@ -149,9 +149,10 @@ typedef void U_CALLCONV UMemFreeFn (const void *context, void *mem); * @system */ U_STABLE void U_EXPORT2 -u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMemFreeFn *f, +u_setMemoryFunctions(const void *context, UMemAllocFn * U_CALLCONV a, UMemReallocFn * U_CALLCONV r, UMemFreeFn * U_CALLCONV f, UErrorCode *status); +U_CDECL_END #ifndef U_HIDE_DEPRECATED_API /********************************************************************************* @@ -172,6 +173,7 @@ u_setMemoryFunctions(const void *context, UMemAllocFn *a, UMemReallocFn *r, UMem */ typedef void *UMTX; +U_CDECL_BEGIN /** * Function Pointer type for a user supplied mutex initialization function. * The user-supplied function will be called by ICU whenever ICU needs to create a @@ -201,7 +203,7 @@ typedef void U_CALLCONV UMtxInitFn (const void *context, UMTX *mutex, UErrorCod * @system */ typedef void U_CALLCONV UMtxFn (const void *context, UMTX *mutex); - +U_CDECL_END /** * Set the functions that ICU will use for mutex operations diff --git a/deps/icu-small/source/common/unicode/ucnv.h b/deps/icu-small/source/common/unicode/ucnv.h index 767c1a2a7f44f1..86e3b8447449d9 100644 --- a/deps/icu-small/source/common/unicode/ucnv.h +++ b/deps/icu-small/source/common/unicode/ucnv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/ucnv_cb.h b/deps/icu-small/source/common/unicode/ucnv_cb.h index a553481c45f893..632cc0b35f26c5 100644 --- a/deps/icu-small/source/common/unicode/ucnv_cb.h +++ b/deps/icu-small/source/common/unicode/ucnv_cb.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/ucnv_err.h b/deps/icu-small/source/common/unicode/ucnv_err.h index ea7f757d0ce799..e8a79bcd815fbc 100644 --- a/deps/icu-small/source/common/unicode/ucnv_err.h +++ b/deps/icu-small/source/common/unicode/ucnv_err.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/ucnvsel.h b/deps/icu-small/source/common/unicode/ucnvsel.h index b5820031a5a9f0..5fee53f179ace7 100644 --- a/deps/icu-small/source/common/unicode/ucnvsel.h +++ b/deps/icu-small/source/common/unicode/ucnvsel.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/unicode/uconfig.h b/deps/icu-small/source/common/unicode/uconfig.h index d681febf4f8c3d..25f19a1a61d475 100644 --- a/deps/icu-small/source/common/unicode/uconfig.h +++ b/deps/icu-small/source/common/unicode/uconfig.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: uconfig.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/ucurr.h b/deps/icu-small/source/common/unicode/ucurr.h index 8b5d41ae3b8a7f..ecb54d146f6ee3 100644 --- a/deps/icu-small/source/common/unicode/ucurr.h +++ b/deps/icu-small/source/common/unicode/ucurr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/udata.h b/deps/icu-small/source/common/unicode/udata.h index abc043f6d01c91..6419c359f606af 100644 --- a/deps/icu-small/source/common/unicode/udata.h +++ b/deps/icu-small/source/common/unicode/udata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: udata.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/udisplaycontext.h b/deps/icu-small/source/common/unicode/udisplaycontext.h index eaef02d7956ef4..c4f6c957e90bd3 100644 --- a/deps/icu-small/source/common/unicode/udisplaycontext.h +++ b/deps/icu-small/source/common/unicode/udisplaycontext.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/deps/icu-small/source/common/unicode/uenum.h b/deps/icu-small/source/common/unicode/uenum.h index 50dde60da1824b..56faae895279b6 100644 --- a/deps/icu-small/source/common/unicode/uenum.h +++ b/deps/icu-small/source/common/unicode/uenum.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uenum.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * @@ -23,7 +23,9 @@ #include "unicode/localpointer.h" #if U_SHOW_CPLUSPLUS_API -#include "unicode/strenum.h" +U_NAMESPACE_BEGIN +class StringEnumeration; +U_NAMESPACE_END #endif /** diff --git a/deps/icu-small/source/common/unicode/uidna.h b/deps/icu-small/source/common/unicode/uidna.h index d49729a29ce846..cb79ba8545008e 100644 --- a/deps/icu-small/source/common/unicode/uidna.h +++ b/deps/icu-small/source/common/unicode/uidna.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uidna.h - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/uiter.h b/deps/icu-small/source/common/unicode/uiter.h index 74075e5a6e0ea7..3b8537204cecfa 100644 --- a/deps/icu-small/source/common/unicode/uiter.h +++ b/deps/icu-small/source/common/unicode/uiter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uiter.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/uldnames.h b/deps/icu-small/source/common/unicode/uldnames.h index 8a3dfd0a6a36fa..3a3c0a06573c36 100644 --- a/deps/icu-small/source/common/unicode/uldnames.h +++ b/deps/icu-small/source/common/unicode/uldnames.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/unicode/ulistformatter.h b/deps/icu-small/source/common/unicode/ulistformatter.h index bed18984e9c255..e98a9f045221d9 100644 --- a/deps/icu-small/source/common/unicode/ulistformatter.h +++ b/deps/icu-small/source/common/unicode/ulistformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** @@ -49,7 +49,7 @@ typedef struct UListFormatter UListFormatter; /**< C typedef for struct UListFo * or NULL if an error occurred. * @stable ICU 55 */ -U_STABLE UListFormatter* U_EXPORT2 +U_CAPI UListFormatter* U_EXPORT2 ulistfmt_open(const char* locale, UErrorCode* status); @@ -59,7 +59,7 @@ ulistfmt_open(const char* locale, * The UListFormatter object to close. * @stable ICU 55 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 ulistfmt_close(UListFormatter *listfmt); @@ -116,7 +116,7 @@ U_NAMESPACE_END * total buffer size needed (e.g. for illegal arguments). * @stable ICU 55 */ -U_DRAFT int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 ulistfmt_format(const UListFormatter* listfmt, const UChar* const strings[], const int32_t * stringLengths, diff --git a/deps/icu-small/source/common/unicode/uloc.h b/deps/icu-small/source/common/unicode/uloc.h index 5146000f28cca4..5531070841187d 100644 --- a/deps/icu-small/source/common/unicode/uloc.h +++ b/deps/icu-small/source/common/unicode/uloc.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -61,7 +61,7 @@ * http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt * *

- * The second option includes an additonal ISO Country + * The second option includes an additional ISO Country * Code. These codes are the upper-case two-letter codes * as defined by ISO-3166. * You can find a full list of these codes at a number of sites, such as: @@ -69,7 +69,7 @@ * http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html * *

- * The third option requires another additonal information--the + * The third option requires another additional information--the * Variant. * The Variant codes are vendor and browser-specific. * For example, use WIN for Windows, MAC for Macintosh, and POSIX for POSIX. @@ -157,7 +157,7 @@ * just a mechanism for identifying these services. * *

- * Each international serivce that performs locale-sensitive operations + * Each international service that performs locale-sensitive operations * allows you * to get all the available objects of that type. You can sift * through these objects by language, country, or variant, @@ -539,6 +539,9 @@ uloc_getISO3Country(const char* localeID); * Gets the Win32 LCID value for the specified locale. * If the ICU locale is not recognized by Windows, 0 will be returned. * + * LCIDs were deprecated with Windows Vista and Microsoft recommends + * that developers use BCP47 style tags instead (uloc_toLanguageTag). + * * @param localeID the locale to get the Win32 LCID value with * @return country the Win32 LCID for localeID * @stable ICU 2.0 @@ -577,7 +580,7 @@ uloc_getDisplayLanguage(const char* locale, * if the locale's language code is "en", passing Locale::getFrench() for * inLocale would result in "", while passing Locale::getGerman() * for inLocale would result in "". NULL may be used to specify the default. - * @param script the displayable country code for localeID + * @param script the displayable script for the localeID * @param scriptCapacity the size of the script buffer to store the * displayable script code with * @param status error information if retrieving the displayable script code failed @@ -852,10 +855,12 @@ uloc_openKeywords(const char* localeID, * Get the value for a keyword. Locale name does not need to be normalized. * * @param localeID locale name containing the keyword ("de_DE@currency=EURO;collation=PHONEBOOK") - * @param keywordName name of the keyword for which we want the value. Case insensitive. + * @param keywordName name of the keyword for which we want the value; must not be + * NULL or empty, and must consist only of [A-Za-z0-9]. Case insensitive. * @param buffer receiving buffer * @param bufferCapacity capacity of receiving buffer - * @param status containing error code - buffer not big enough. + * @param status containing error code: e.g. buffer not big enough or ill-formed localeID + * or keywordName parameters. * @return the length of keyword value * @stable ICU 2.8 */ @@ -872,18 +877,26 @@ uloc_getKeywordValue(const char* localeID, * For removing all keywords, use uloc_getBaseName(). * * NOTE: Unlike almost every other ICU function which takes a - * buffer, this function will NOT truncate the output text. If a - * BUFFER_OVERFLOW_ERROR is received, it means that the original - * buffer is untouched. This is done to prevent incorrect or possibly - * even malformed locales from being generated and used. - * - * @param keywordName name of the keyword to be set. Case insensitive. + * buffer, this function will NOT truncate the output text, and will + * not update the buffer with unterminated text setting a status of + * U_STRING_NOT_TERMINATED_WARNING. If a BUFFER_OVERFLOW_ERROR is received, + * it means a terminated version of the updated locale ID would not fit + * in the buffer, and the original buffer is untouched. This is done to + * prevent incorrect or possibly even malformed locales from being generated + * and used. + * + * @param keywordName name of the keyword to be set; must not be + * NULL or empty, and must consist only of [A-Za-z0-9]. Case insensitive. * @param keywordValue value of the keyword to be set. If 0-length or - * NULL, will result in the keyword being removed. No error is given if - * that keyword does not exist. - * @param buffer input buffer containing locale to be modified. + * NULL, will result in the keyword being removed; no error is given if + * that keyword does not exist. Otherwise, must consist only of + * [A-Za-z0-9] and [/_+-]. + * @param buffer input buffer containing well-formed locale ID to be + * modified. * @param bufferCapacity capacity of receiving buffer - * @param status containing error code - buffer not big enough. + * @param status containing error code: e.g. buffer not big enough + * or ill-formed keywordName or keywordValue parameters, or ill-formed + * locale ID in buffer on input. * @return the length needed for the buffer * @see uloc_getKeywordValue * @stable ICU 3.2 diff --git a/deps/icu-small/source/common/unicode/umachine.h b/deps/icu-small/source/common/unicode/umachine.h index 22820d4b003a55..30de4dba0dbf5b 100644 --- a/deps/icu-small/source/common/unicode/umachine.h +++ b/deps/icu-small/source/common/unicode/umachine.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: umachine.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -51,29 +51,6 @@ */ #include -#ifndef U_HIDE_INTERNAL_API -/* - * U_USE_CHAR16_T - * When defined, force use of char16_t for UChar. - * Note: char16_t is expected to become the default and required in the future, - * and this option will be removed. - * @internal - */ -#ifdef U_USE_CHAR16_T -#ifdef UCHAR_TYPE -#undef UCHAR_TYPE -#endif -#define UCHAR_TYPE char16_t - -/* - * In plain C, is needed for the definition of char16_t - */ -#ifndef __cplusplus -#include -#endif -#endif -#endif /* U_HIDE_INTERNAL_API */ - /*==========================================================================*/ /* For C wrappers, we use the symbol U_STABLE. */ /* This works properly if the includer is C or C++. */ @@ -313,30 +290,92 @@ typedef int8_t UBool; /** Number of bytes in a UChar. @stable ICU 2.0 */ #define U_SIZEOF_UCHAR 2 +/** + * \def U_CHAR16_IS_TYPEDEF + * If 1, then char16_t is a typedef and not a real type (yet) + * @internal + */ +#if (U_PLATFORM == U_PF_AIX) && defined(__cplusplus) &&(U_CPLUSPLUS_VERSION < 11) +// for AIX, uchar.h needs to be included +# include +# define U_CHAR16_IS_TYPEDEF 1 +#else +# define U_CHAR16_IS_TYPEDEF 0 +#endif + + /** * \var UChar - * Define UChar to be UCHAR_TYPE, if that is #defined (for example, to char16_t), - * or wchar_t if that is 16 bits wide; always assumed to be unsigned. - * If neither is available, then define UChar to be uint16_t. * - * This makes the definition of UChar platform-dependent - * but allows direct string type compatibility with platforms with - * 16-bit wchar_t types. + * The base type for UTF-16 code units and pointers. + * Unsigned 16-bit integer. + * Starting with ICU 59, C++ API uses char16_t directly, while C API continues to use UChar. + * + * UChar is configurable by defining the macro UCHAR_TYPE + * on the preprocessor or compiler command line: + * -DUCHAR_TYPE=uint16_t or -DUCHAR_TYPE=wchar_t (if U_SIZEOF_WCHAR_T==2) etc. + * (The UCHAR_TYPE can also be #defined earlier in this file, for outside the ICU library code.) + * This is for transitional use from application code that uses uint16_t or wchar_t for UTF-16. + * + * The default is UChar=char16_t. + * + * C++11 defines char16_t as bit-compatible with uint16_t, but as a distinct type. + * + * In C, char16_t is a simple typedef of uint_least16_t. + * ICU requires uint_least16_t=uint16_t for data memory mapping. + * On macOS, char16_t is not available because the uchar.h standard header is missing. * * @stable ICU 4.4 */ -#if defined(UCHAR_TYPE) + +#if 1 + // #if 1 is normal. UChar defaults to char16_t in C++. + // For configuration testing of UChar=uint16_t temporarily change this to #if 0. + // The intltest Makefile #defines UCHAR_TYPE=char16_t, + // so we only #define it to uint16_t if it is undefined so far. +#elif !defined(UCHAR_TYPE) +# define UCHAR_TYPE uint16_t +#endif + +#if defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || \ + defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION) + // Inside the ICU library code, never configurable. + typedef char16_t UChar; +#elif defined(UCHAR_TYPE) typedef UCHAR_TYPE UChar; -/* Not #elif U_HAVE_CHAR16_T -- because that is type-incompatible with pre-C++11 callers - typedef char16_t UChar; */ -#elif U_SIZEOF_WCHAR_T==2 - typedef wchar_t UChar; -#elif defined(__CHAR16_TYPE__) - typedef __CHAR16_TYPE__ UChar; +#elif defined(__cplusplus) + typedef char16_t UChar; #else typedef uint16_t UChar; #endif +/** + * \var OldUChar + * Default ICU 58 definition of UChar. + * A base type for UTF-16 code units and pointers. + * Unsigned 16-bit integer. + * + * Define OldUChar to be wchar_t if that is 16 bits wide. + * If wchar_t is not 16 bits wide, then define UChar to be uint16_t. + * + * This makes the definition of OldUChar platform-dependent + * but allows direct string type compatibility with platforms with + * 16-bit wchar_t types. + * + * This is how UChar was defined in ICU 58, for transition convenience. + * Exception: ICU 58 UChar was defined to UCHAR_TYPE if that macro was defined. + * The current UChar responds to UCHAR_TYPE but OldUChar does not. + * + * @draft ICU 59 + */ +#if U_SIZEOF_WCHAR_T==2 + typedef wchar_t OldUChar; +#elif defined(__CHAR16_TYPE__) + typedef __CHAR16_TYPE__ OldUChar; +#else + typedef uint16_t OldUChar; +#endif + /** * Define UChar32 as a type for single Unicode code points. * UChar32 is a signed 32-bit integer (same as int32_t). diff --git a/deps/icu-small/source/common/unicode/umisc.h b/deps/icu-small/source/common/unicode/umisc.h index 4cc665721a00be..a46fa323c8c1a3 100644 --- a/deps/icu-small/source/common/unicode/umisc.h +++ b/deps/icu-small/source/common/unicode/umisc.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: umisc.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/unifilt.h b/deps/icu-small/source/common/unicode/unifilt.h index cedde81de4a0e1..99cce785b6eec8 100644 --- a/deps/icu-small/source/common/unicode/unifilt.h +++ b/deps/icu-small/source/common/unicode/unifilt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -30,7 +30,7 @@ U_NAMESPACE_BEGIN * defined range. * @stable ICU 3.0 */ -#define U_ETHER ((UChar)0xFFFF) +#define U_ETHER ((char16_t)0xFFFF) /** * diff --git a/deps/icu-small/source/common/unicode/unifunct.h b/deps/icu-small/source/common/unicode/unifunct.h index 724893ad962bb0..66a02ce7cd5ce8 100644 --- a/deps/icu-small/source/common/unicode/unifunct.h +++ b/deps/icu-small/source/common/unicode/unifunct.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/unimatch.h b/deps/icu-small/source/common/unicode/unimatch.h index a83199ef61f720..8bf39950187b1b 100644 --- a/deps/icu-small/source/common/unicode/unimatch.h +++ b/deps/icu-small/source/common/unicode/unimatch.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2001-2005, International Business Machines Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/common/unicode/uniset.h b/deps/icu-small/source/common/unicode/uniset.h index 32e973dd791d5d..914818a00ec41a 100644 --- a/deps/icu-small/source/common/unicode/uniset.h +++ b/deps/icu-small/source/common/unicode/uniset.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** @@ -294,7 +294,7 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { * indicating that toPattern() must generate a pattern * representation from the inversion list. */ - UChar *pat; + char16_t *pat; UVector* strings; // maintained in sorted order UnicodeSetStringSpan *stringSpan; @@ -891,7 +891,7 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { * @stable ICU 3.8 * @see USetSpanCondition */ - int32_t span(const UChar *s, int32_t length, USetSpanCondition spanCondition) const; + int32_t span(const char16_t *s, int32_t length, USetSpanCondition spanCondition) const; /** * Returns the end of the substring of the input string according to the USetSpanCondition. @@ -924,7 +924,7 @@ class U_COMMON_API UnicodeSet U_FINAL : public UnicodeFilter { * @stable ICU 3.8 * @see USetSpanCondition */ - int32_t spanBack(const UChar *s, int32_t length, USetSpanCondition spanCondition) const; + int32_t spanBack(const char16_t *s, int32_t length, USetSpanCondition spanCondition) const; /** * Returns the start of the substring of the input string according to the USetSpanCondition. diff --git a/deps/icu-small/source/common/unicode/unistr.h b/deps/icu-small/source/common/unicode/unistr.h index 6f62244a1e2824..e0ab0b9eb7c633 100644 --- a/deps/icu-small/source/common/unicode/unistr.h +++ b/deps/icu-small/source/common/unicode/unistr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -28,12 +28,13 @@ * \brief C++ API: Unicode String */ +#include #include "unicode/utypes.h" +#include "unicode/char16ptr.h" #include "unicode/rep.h" #include "unicode/std_string.h" #include "unicode/stringpiece.h" #include "unicode/bytestream.h" -#include "unicode/ucasemap.h" struct UConverter; // unicode/ucnv.h @@ -55,30 +56,34 @@ U_STABLE int32_t U_EXPORT2 u_strlen(const UChar *s); #endif -/** - * \def U_STRING_CASE_MAPPER_DEFINED - * @internal - */ -#ifndef U_STRING_CASE_MAPPER_DEFINED -#define U_STRING_CASE_MAPPER_DEFINED +U_NAMESPACE_BEGIN +#if !UCONFIG_NO_BREAK_ITERATION +class BreakIterator; // unicode/brkiter.h +#endif +class Edits; + +U_NAMESPACE_END + +// Not #ifndef U_HIDE_INTERNAL_API because UnicodeString needs the UStringCaseMapper. /** * Internal string case mapping function type. + * All error checking must be done. + * src and dest must not overlap. * @internal */ typedef int32_t U_CALLCONV -UStringCaseMapper(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - +UStringCaseMapper(int32_t caseLocale, uint32_t options, +#if !UCONFIG_NO_BREAK_ITERATION + icu::BreakIterator *iter, #endif + char16_t *dest, int32_t destCapacity, + const char16_t *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode); U_NAMESPACE_BEGIN -#if !UCONFIG_NO_BREAK_ITERATION -class BreakIterator; // unicode/brkiter.h -#endif class Locale; // unicode/locid.h class StringCharacterIterator; class UnicodeStringAppendable; // unicode/appendable.h @@ -99,10 +104,12 @@ class UnicodeStringAppendable; // unicode/appendable.h /** * Unicode String literals in C++. - * Dependent on the platform properties, different UnicodeString - * constructors should be used to create a UnicodeString object from - * a string literal. - * The macros are defined for maximum performance. + * + * Note: these macros are not recommended for new code. + * Prior to the availability of C++11 and u"unicode string literals", + * these macros were provided for portability and efficiency when + * initializing UnicodeStrings from literals. + * * They work only for strings that contain "invariant characters", i.e., * only latin letters, digits, and some punctuation. * See utypes.h for details. @@ -110,18 +117,12 @@ class UnicodeStringAppendable; // unicode/appendable.h * The string parameter must be a C string literal. * The length of the string, not including the terminating * NUL, must be specified as a constant. - * The U_STRING_DECL macro should be invoked exactly once for one - * such string variable before it is used. * @stable ICU 2.0 */ -#if defined(U_DECLARE_UTF16) -# define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const UChar *)U_DECLARE_UTF16(cs), _length) -#elif U_SIZEOF_WCHAR_T==U_SIZEOF_UCHAR && (U_CHARSET_FAMILY==U_ASCII_FAMILY || (U_SIZEOF_UCHAR == 2 && defined(U_WCHAR_IS_UTF16))) -# define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const UChar *)L ## cs, _length) -#elif U_SIZEOF_UCHAR==1 && U_CHARSET_FAMILY==U_ASCII_FAMILY -# define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const UChar *)cs, _length) +#if !U_CHAR16_IS_TYPEDEF +# define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, u ## cs, _length) #else -# define UNICODE_STRING(cs, _length) icu::UnicodeString(cs, _length, US_INV) +# define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const char16_t*)u ## cs, _length) #endif /** @@ -142,7 +143,7 @@ class UnicodeStringAppendable; // unicode/appendable.h /** * \def UNISTR_FROM_CHAR_EXPLICIT * This can be defined to be empty or "explicit". - * If explicit, then the UnicodeString(UChar) and UnicodeString(UChar32) + * If explicit, then the UnicodeString(char16_t) and UnicodeString(UChar32) * constructors are marked as explicit, preventing their inadvertent use. * @stable ICU 49 */ @@ -159,7 +160,7 @@ class UnicodeStringAppendable; // unicode/appendable.h /** * \def UNISTR_FROM_STRING_EXPLICIT * This can be defined to be empty or "explicit". - * If explicit, then the UnicodeString(const char *) and UnicodeString(const UChar *) + * If explicit, then the UnicodeString(const char *) and UnicodeString(const char16_t *) * constructors are marked as explicit, preventing their inadvertent use. * * In particular, this helps prevent accidentally depending on ICU conversion code @@ -193,18 +194,18 @@ class UnicodeStringAppendable; // unicode/appendable.h * to 4 * sizeof(pointer) (or 3 * sizeof(pointer) for P128 data models), * to hold the fields for heap-allocated strings. * Such a minimum size also ensures that the object is easily large enough - * to hold at least 2 UChars, for one supplementary code point (U16_MAX_LENGTH). + * to hold at least 2 char16_ts, for one supplementary code point (U16_MAX_LENGTH). * * sizeof(UnicodeString) >= 48 should work for all known platforms. * * For example, on a 64-bit machine where sizeof(vtable pointer) is 8, * sizeof(UnicodeString) = 64 would leave space for * (64 - sizeof(vtable pointer) - 2) / U_SIZEOF_UCHAR = (64 - 8 - 2) / 2 = 27 - * UChars stored inside the object. + * char16_ts stored inside the object. * * The minimum object size on a 64-bit machine would be * 4 * sizeof(pointer) = 4 * 8 = 32 bytes, - * and the internal buffer would hold up to 11 UChars in that case. + * and the internal buffer would hold up to 11 char16_ts in that case. * * @see U16_MAX_LENGTH * @stable ICU 56 @@ -236,7 +237,7 @@ class UnicodeStringAppendable; // unicode/appendable.h *

In ICU, a Unicode string consists of 16-bit Unicode code units. * A Unicode character may be stored with either one code unit * (the most common case) or with a matched pair of special code units - * ("surrogates"). The data type for code units is UChar. + * ("surrogates"). The data type for code units is char16_t. * For single-character handling, a Unicode character code point is a value * in the range 0..0x10ffff. ICU uses the UChar32 type for code points.

* @@ -252,7 +253,7 @@ class UnicodeStringAppendable; // unicode/appendable.h * than other ICU APIs. In particular: * - If indexes are out of bounds for a UnicodeString object * (<0 or >length()) then they are "pinned" to the nearest boundary. - * - If primitive string pointer values (e.g., const UChar * or char *) + * - If primitive string pointer values (e.g., const char16_t * or char *) * for input strings are NULL, then those input string parameters are treated * as if they pointed to an empty string. * However, this is not the case for char * parameters for charset names @@ -439,7 +440,7 @@ class U_COMMON_API UnicodeString : public Replaceable * in srcChars. * @stable ICU 2.0 */ - inline int8_t compare(const UChar *srcChars, + inline int8_t compare(ConstChar16Ptr srcChars, int32_t srcLength) const; /** @@ -458,7 +459,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline int8_t compare(int32_t start, int32_t length, - const UChar *srcChars) const; + const char16_t *srcChars) const; /** * Compare the characters bitwise in the range @@ -479,7 +480,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline int8_t compare(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -593,7 +594,7 @@ class U_COMMON_API UnicodeString : public Replaceable * in code point order * @stable ICU 2.0 */ - inline int8_t compareCodePointOrder(const UChar *srcChars, + inline int8_t compareCodePointOrder(ConstChar16Ptr srcChars, int32_t srcLength) const; /** @@ -617,7 +618,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline int8_t compareCodePointOrder(int32_t start, int32_t length, - const UChar *srcChars) const; + const char16_t *srcChars) const; /** * Compare two Unicode strings in code point order. @@ -642,7 +643,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline int8_t compareCodePointOrder(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -766,7 +767,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return A negative, zero, or positive integer indicating the comparison result. * @stable ICU 2.0 */ - inline int8_t caseCompare(const UChar *srcChars, + inline int8_t caseCompare(ConstChar16Ptr srcChars, int32_t srcLength, uint32_t options) const; @@ -792,7 +793,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline int8_t caseCompare(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, uint32_t options) const; /** @@ -819,7 +820,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline int8_t caseCompare(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength, uint32_t options) const; @@ -884,7 +885,7 @@ class U_COMMON_API UnicodeString : public Replaceable * FALSE otherwise * @stable ICU 2.0 */ - inline UBool startsWith(const UChar *srcChars, + inline UBool startsWith(ConstChar16Ptr srcChars, int32_t srcLength) const; /** @@ -896,7 +897,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return TRUE if this ends with the characters in srcChars, FALSE otherwise * @stable ICU 2.0 */ - inline UBool startsWith(const UChar *srcChars, + inline UBool startsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -931,7 +932,7 @@ class U_COMMON_API UnicodeString : public Replaceable * FALSE otherwise * @stable ICU 2.0 */ - inline UBool endsWith(const UChar *srcChars, + inline UBool endsWith(ConstChar16Ptr srcChars, int32_t srcLength) const; /** @@ -944,7 +945,7 @@ class U_COMMON_API UnicodeString : public Replaceable * FALSE otherwise * @stable ICU 2.0 */ - inline UBool endsWith(const UChar *srcChars, + inline UBool endsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -1021,7 +1022,7 @@ class U_COMMON_API UnicodeString : public Replaceable * or -1 if not found. * @stable ICU 2.0 */ - inline int32_t indexOf(const UChar *srcChars, + inline int32_t indexOf(const char16_t *srcChars, int32_t srcLength, int32_t start) const; @@ -1037,7 +1038,7 @@ class U_COMMON_API UnicodeString : public Replaceable * or -1 if not found. * @stable ICU 2.0 */ - inline int32_t indexOf(const UChar *srcChars, + inline int32_t indexOf(ConstChar16Ptr srcChars, int32_t srcLength, int32_t start, int32_t length) const; @@ -1058,7 +1059,7 @@ class U_COMMON_API UnicodeString : public Replaceable * or -1 if not found. * @stable ICU 2.0 */ - int32_t indexOf(const UChar *srcChars, + int32_t indexOf(const char16_t *srcChars, int32_t srcStart, int32_t srcLength, int32_t start, @@ -1071,7 +1072,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t indexOf(UChar c) const; + inline int32_t indexOf(char16_t c) const; /** * Locate in this the first occurrence of the code point c, @@ -1091,7 +1092,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t indexOf(UChar c, + inline int32_t indexOf(char16_t c, int32_t start) const; /** @@ -1116,7 +1117,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t indexOf(UChar c, + inline int32_t indexOf(char16_t c, int32_t start, int32_t length) const; @@ -1204,7 +1205,7 @@ class U_COMMON_API UnicodeString : public Replaceable * or -1 if not found. * @stable ICU 2.0 */ - inline int32_t lastIndexOf(const UChar *srcChars, + inline int32_t lastIndexOf(const char16_t *srcChars, int32_t srcLength, int32_t start) const; @@ -1220,7 +1221,7 @@ class U_COMMON_API UnicodeString : public Replaceable * or -1 if not found. * @stable ICU 2.0 */ - inline int32_t lastIndexOf(const UChar *srcChars, + inline int32_t lastIndexOf(ConstChar16Ptr srcChars, int32_t srcLength, int32_t start, int32_t length) const; @@ -1241,7 +1242,7 @@ class U_COMMON_API UnicodeString : public Replaceable * or -1 if not found. * @stable ICU 2.0 */ - int32_t lastIndexOf(const UChar *srcChars, + int32_t lastIndexOf(const char16_t *srcChars, int32_t srcStart, int32_t srcLength, int32_t start, @@ -1254,7 +1255,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t lastIndexOf(UChar c) const; + inline int32_t lastIndexOf(char16_t c) const; /** * Locate in this the last occurrence of the code point c, @@ -1274,7 +1275,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t lastIndexOf(UChar c, + inline int32_t lastIndexOf(char16_t c, int32_t start) const; /** @@ -1299,7 +1300,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return The offset into this of c, or -1 if not found. * @stable ICU 2.0 */ - inline int32_t lastIndexOf(UChar c, + inline int32_t lastIndexOf(char16_t c, int32_t start, int32_t length) const; @@ -1329,7 +1330,7 @@ class U_COMMON_API UnicodeString : public Replaceable * or 0xffff if the offset is not valid for this string * @stable ICU 2.0 */ - inline UChar charAt(int32_t offset) const; + inline char16_t charAt(int32_t offset) const; /** * Return the code unit at offset offset. @@ -1338,7 +1339,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return the code unit at offset offset * @stable ICU 2.0 */ - inline UChar operator[] (int32_t offset) const; + inline char16_t operator[] (int32_t offset) const; /** * Return the code point that contains the code unit @@ -1459,7 +1460,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline void extract(int32_t start, int32_t length, - UChar *dst, + Char16Ptr dst, int32_t dstStart = 0) const; /** @@ -1478,13 +1479,13 @@ class U_COMMON_API UnicodeString : public Replaceable * then extract() will not copy the contents. * * @param dest Destination string buffer. - * @param destCapacity Number of UChars available at dest. + * @param destCapacity Number of char16_ts available at dest. * @param errorCode ICU error code. * @return length() * @stable ICU 2.0 */ int32_t - extract(UChar *dest, int32_t destCapacity, + extract(Char16Ptr dest, int32_t destCapacity, UErrorCode &errorCode) const; /** @@ -1514,7 +1515,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline void extractBetween(int32_t start, int32_t limit, - UChar *dst, + char16_t *dst, int32_t dstStart = 0) const; /** @@ -1715,8 +1716,6 @@ class U_COMMON_API UnicodeString : public Replaceable */ void toUTF8(ByteSink &sink) const; -#if U_HAVE_STD_STRING - /** * Convert the UnicodeString to UTF-8 and append the result * to a standard string. @@ -1736,8 +1735,6 @@ class U_COMMON_API UnicodeString : public Replaceable return result; } -#endif - /** * Convert the UnicodeString to UTF-32. * Unpaired surrogates are replaced with U+FFFD. @@ -1759,7 +1756,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Return the length of the UnicodeString object. - * The length is the number of UChar code units are in the UnicodeString. + * The length is the number of char16_t code units are in the UnicodeString. * If you want the number of code points, please use countChar32(). * @return the length of the UnicodeString object * @see countChar32 @@ -1768,14 +1765,14 @@ class U_COMMON_API UnicodeString : public Replaceable inline int32_t length(void) const; /** - * Count Unicode code points in the length UChar code units of the string. - * A code point may occupy either one or two UChar code units. + * Count Unicode code points in the length char16_t code units of the string. + * A code point may occupy either one or two char16_t code units. * Counting code points involves reading all code units. * * This functions is basically the inverse of moveIndex32(). * * @param start the index of the first code unit to check - * @param length the number of UChar code units to check + * @param length the number of char16_t code units to check * @return the number of code points in the specified code units * @see length * @stable ICU 2.0 @@ -1784,7 +1781,7 @@ class U_COMMON_API UnicodeString : public Replaceable countChar32(int32_t start=0, int32_t length=INT32_MAX) const; /** - * Check if the length UChar code units of the string + * Check if the length char16_t code units of the string * contain more Unicode code points than a certain number. * This is more efficient than counting all code points in this part of the string * and comparing that number with a threshold. @@ -1792,10 +1789,10 @@ class U_COMMON_API UnicodeString : public Replaceable * falls within a certain range, and * never needs to count more than 'number+1' code points. * Logically equivalent to (countChar32(start, length)>number). - * A Unicode code point may occupy either one or two UChar code units. + * A Unicode code point may occupy either one or two char16_t code units. * * @param start the index of the first code unit to check (0 for the entire string) - * @param length the number of UChar code units to check + * @param length the number of char16_t code units to check * (use INT32_MAX for the entire string; remember that start/length * values are pinned) * @param number The number of code points in the (sub)string is compared against @@ -1821,7 +1818,7 @@ class U_COMMON_API UnicodeString : public Replaceable * This is useful together with the getBuffer functions. * See there for details. * - * @return the number of UChars available in the internal buffer + * @return the number of char16_ts available in the internal buffer * @see getBuffer * @stable ICU 2.0 */ @@ -1955,7 +1952,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& operator= (UChar ch); + inline UnicodeString& operator= (char16_t ch); /** * Assignment operator. Replace the characters in this UnicodeString @@ -2015,7 +2012,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& setTo(const UChar *srcChars, + inline UnicodeString& setTo(const char16_t *srcChars, int32_t srcLength); /** @@ -2026,7 +2023,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - UnicodeString& setTo(UChar srcChar); + UnicodeString& setTo(char16_t srcChar); /** * Set the characters in the UnicodeString object to the code point @@ -2039,7 +2036,7 @@ class U_COMMON_API UnicodeString : public Replaceable UnicodeString& setTo(UChar32 srcChar); /** - * Aliasing setTo() function, analogous to the readonly-aliasing UChar* constructor. + * Aliasing setTo() function, analogous to the readonly-aliasing char16_t* constructor. * The text will be used for the UnicodeString object, but * it will not be released when the UnicodeString is destroyed. * This has copy-on-write semantics: @@ -2062,11 +2059,11 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ UnicodeString &setTo(UBool isTerminated, - const UChar *text, + ConstChar16Ptr text, int32_t textLength); /** - * Aliasing setTo() function, analogous to the writable-aliasing UChar* constructor. + * Aliasing setTo() function, analogous to the writable-aliasing char16_t* constructor. * The text will be used for the UnicodeString object, but * it will not be released when the UnicodeString is destroyed. * This has write-through semantics: @@ -2075,16 +2072,16 @@ class U_COMMON_API UnicodeString : public Replaceable * a new buffer will be allocated and the contents copied as with regularly * constructed strings. * In an assignment to another UnicodeString, the buffer will be copied. - * The extract(UChar *dst) function detects whether the dst pointer is the same + * The extract(Char16Ptr dst) function detects whether the dst pointer is the same * as the string buffer itself and will in this case not copy the contents. * * @param buffer The characters to alias for the UnicodeString. * @param buffLength The number of Unicode characters in buffer to alias. - * @param buffCapacity The size of buffer in UChars. + * @param buffCapacity The size of buffer in char16_ts. * @return a reference to this * @stable ICU 2.0 */ - UnicodeString &setTo(UChar *buffer, + UnicodeString &setTo(char16_t *buffer, int32_t buffLength, int32_t buffCapacity); @@ -2120,7 +2117,7 @@ class U_COMMON_API UnicodeString : public Replaceable * s.truncate(0); // set to an empty string (complete truncation), or * s=UnicodeString(); // assign an empty string, or * s.setTo((UChar32)-1); // set to a pseudo code point that is out of range, or - * static const UChar nul=0; + * static const char16_t nul=0; * s.setTo(&nul, 0); // set to an empty C Unicode string * } * \endcode @@ -2138,7 +2135,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ UnicodeString& setCharAt(int32_t offset, - UChar ch); + char16_t ch); /* Append operations */ @@ -2150,7 +2147,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& operator+= (UChar ch); + inline UnicodeString& operator+= (char16_t ch); /** * Append operator. Append the code point ch to the UnicodeString @@ -2210,7 +2207,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(const UChar *srcChars, + inline UnicodeString& append(const char16_t *srcChars, int32_t srcStart, int32_t srcLength); @@ -2223,7 +2220,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(const UChar *srcChars, + inline UnicodeString& append(ConstChar16Ptr srcChars, int32_t srcLength); /** @@ -2232,7 +2229,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @return a reference to this * @stable ICU 2.0 */ - inline UnicodeString& append(UChar srcChar); + inline UnicodeString& append(char16_t srcChar); /** * Append the code point srcChar to the UnicodeString object. @@ -2288,7 +2285,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& insert(int32_t start, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength); @@ -2302,7 +2299,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& insert(int32_t start, - const UChar *srcChars, + ConstChar16Ptr srcChars, int32_t srcLength); /** @@ -2314,7 +2311,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ inline UnicodeString& insert(int32_t start, - UChar srcChar); + char16_t srcChar); /** * Insert the code point srcChar into the UnicodeString object at @@ -2388,7 +2385,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ UnicodeString& replace(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength); @@ -2406,7 +2403,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline UnicodeString& replace(int32_t start, int32_t length, - const UChar *srcChars, + ConstChar16Ptr srcChars, int32_t srcLength); /** @@ -2422,7 +2419,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ inline UnicodeString& replace(int32_t start, int32_t length, - UChar srcChar); + char16_t srcChar); /** * Replace the characters in the range @@ -2620,7 +2617,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ UBool padLeading(int32_t targetLength, - UChar padChar = 0x0020); + char16_t padChar = 0x0020); /** * Pad the end of this UnicodeString with the character padChar. @@ -2634,7 +2631,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ UBool padTrailing(int32_t targetLength, - UChar padChar = 0x0020); + char16_t padChar = 0x0020); /** * Truncate this UnicodeString to the targetLength. @@ -2821,7 +2818,7 @@ class U_COMMON_API UnicodeString : public Replaceable /** * Get a read/write pointer to the internal buffer. - * The buffer is guaranteed to be large enough for at least minCapacity UChars, + * The buffer is guaranteed to be large enough for at least minCapacity char16_ts, * writable, and is still owned by the UnicodeString object. * Calls to getBuffer(minCapacity) must not be nested, and * must be matched with calls to releaseBuffer(newLength). @@ -2852,17 +2849,17 @@ class U_COMMON_API UnicodeString : public Replaceable * - You must call releaseBuffer(newLength) before and in order to * return to normal UnicodeString operation. * - * @param minCapacity the minimum number of UChars that are to be available + * @param minCapacity the minimum number of char16_ts that are to be available * in the buffer, starting at the returned pointer; * default to the current string capacity if minCapacity==-1 * @return a writable pointer to the internal string buffer, - * or 0 if an error occurs (nested calls, out of memory) + * or nullptr if an error occurs (nested calls, out of memory) * * @see releaseBuffer * @see getTerminatedBuffer() * @stable ICU 2.0 */ - UChar *getBuffer(int32_t minCapacity); + char16_t *getBuffer(int32_t minCapacity); /** * Release a read/write buffer on a UnicodeString object with an @@ -2910,13 +2907,13 @@ class U_COMMON_API UnicodeString : public Replaceable * be modified. * * @return a read-only pointer to the internal string buffer, - * or 0 if the string is empty or bogus + * or nullptr if the string is empty or bogus * * @see getBuffer(int32_t minCapacity) * @see getTerminatedBuffer() * @stable ICU 2.0 */ - inline const UChar *getBuffer() const; + inline const char16_t *getBuffer() const; /** * Get a read-only pointer to the internal buffer, @@ -2951,7 +2948,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @see getBuffer() * @stable ICU 2.2 */ - const UChar *getTerminatedBuffer(); + const char16_t *getTerminatedBuffer(); //======================================== // Constructors @@ -2963,8 +2960,8 @@ class U_COMMON_API UnicodeString : public Replaceable inline UnicodeString(); /** - * Construct a UnicodeString with capacity to hold capacity UChars - * @param capacity the number of UChars this UnicodeString should hold + * Construct a UnicodeString with capacity to hold capacity char16_ts + * @param capacity the number of char16_ts this UnicodeString should hold * before a resize is necessary; if count is greater than 0 and count * code points c take up more space than capacity, then capacity is adjusted * accordingly. @@ -2976,7 +2973,7 @@ class U_COMMON_API UnicodeString : public Replaceable UnicodeString(int32_t capacity, UChar32 c, int32_t count); /** - * Single UChar (code unit) constructor. + * Single char16_t (code unit) constructor. * * It is recommended to mark this constructor "explicit" by * -DUNISTR_FROM_CHAR_EXPLICIT=explicit @@ -2984,7 +2981,7 @@ class U_COMMON_API UnicodeString : public Replaceable * @param ch the character to place in the UnicodeString * @stable ICU 2.0 */ - UNISTR_FROM_CHAR_EXPLICIT UnicodeString(UChar ch); + UNISTR_FROM_CHAR_EXPLICIT UnicodeString(char16_t ch); /** * Single UChar32 (code point) constructor. @@ -2998,7 +2995,7 @@ class U_COMMON_API UnicodeString : public Replaceable UNISTR_FROM_CHAR_EXPLICIT UnicodeString(UChar32 ch); /** - * UChar* constructor. + * char16_t* constructor. * * It is recommended to mark this constructor "explicit" by * -DUNISTR_FROM_STRING_EXPLICIT=explicit @@ -3007,20 +3004,121 @@ class U_COMMON_API UnicodeString : public Replaceable * must be NULL (U+0000) terminated. * @stable ICU 2.0 */ - UNISTR_FROM_STRING_EXPLICIT UnicodeString(const UChar *text); + UNISTR_FROM_STRING_EXPLICIT UnicodeString(const char16_t *text); + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if !U_CHAR16_IS_TYPEDEF + /** + * uint16_t * constructor. + * Delegates to UnicodeString(const char16_t *). + * + * It is recommended to mark this constructor "explicit" by + * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * on the compiler command line or similar. + * @param text NUL-terminated UTF-16 string + * @draft ICU 59 + */ + UNISTR_FROM_STRING_EXPLICIT UnicodeString(const uint16_t *text) : + UnicodeString(ConstChar16Ptr(text)) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * wchar_t * constructor. + * (Only defined if U_SIZEOF_WCHAR_T==2.) + * Delegates to UnicodeString(const char16_t *). + * + * It is recommended to mark this constructor "explicit" by + * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * on the compiler command line or similar. + * @param text NUL-terminated UTF-16 string + * @draft ICU 59 + */ + UNISTR_FROM_STRING_EXPLICIT UnicodeString(const wchar_t *text) : + UnicodeString(ConstChar16Ptr(text)) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ + /** + * nullptr_t constructor. + * Effectively the same as the default constructor, makes an empty string object. + * + * It is recommended to mark this constructor "explicit" by + * -DUNISTR_FROM_STRING_EXPLICIT=explicit + * on the compiler command line or similar. + * @param text nullptr + * @draft ICU 59 + */ + UNISTR_FROM_STRING_EXPLICIT inline UnicodeString(const std::nullptr_t text); /** - * UChar* constructor. + * char16_t* constructor. * @param text The characters to place in the UnicodeString. * @param textLength The number of Unicode characters in text * to copy. * @stable ICU 2.0 */ - UnicodeString(const UChar *text, + UnicodeString(const char16_t *text, int32_t textLength); + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if !U_CHAR16_IS_TYPEDEF /** - * Readonly-aliasing UChar* constructor. + * uint16_t * constructor. + * Delegates to UnicodeString(const char16_t *, int32_t). + * @param text UTF-16 string + * @param length string length + * @draft ICU 59 + */ + UnicodeString(const uint16_t *text, int32_t length) : + UnicodeString(ConstChar16Ptr(text), length) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * wchar_t * constructor. + * (Only defined if U_SIZEOF_WCHAR_T==2.) + * Delegates to UnicodeString(const char16_t *, int32_t). + * @param text NUL-terminated UTF-16 string + * @param length string length + * @draft ICU 59 + */ + UnicodeString(const wchar_t *text, int32_t length) : + UnicodeString(ConstChar16Ptr(text), length) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ + /** + * nullptr_t constructor. + * Effectively the same as the default constructor, makes an empty string object. + * @param text nullptr + * @param length ignored + * @draft ICU 59 + */ + inline UnicodeString(const std::nullptr_t text, int32_t length); + + /** + * Readonly-aliasing char16_t* constructor. * The text will be used for the UnicodeString object, but * it will not be released when the UnicodeString is destroyed. * This has copy-on-write semantics: @@ -3042,11 +3140,11 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 2.0 */ UnicodeString(UBool isTerminated, - const UChar *text, + ConstChar16Ptr text, int32_t textLength); /** - * Writable-aliasing UChar* constructor. + * Writable-aliasing char16_t* constructor. * The text will be used for the UnicodeString object, but * it will not be released when the UnicodeString is destroyed. * This has write-through semantics: @@ -3055,15 +3153,64 @@ class U_COMMON_API UnicodeString : public Replaceable * a new buffer will be allocated and the contents copied as with regularly * constructed strings. * In an assignment to another UnicodeString, the buffer will be copied. - * The extract(UChar *dst) function detects whether the dst pointer is the same + * The extract(Char16Ptr dst) function detects whether the dst pointer is the same * as the string buffer itself and will in this case not copy the contents. * * @param buffer The characters to alias for the UnicodeString. * @param buffLength The number of Unicode characters in buffer to alias. - * @param buffCapacity The size of buffer in UChars. + * @param buffCapacity The size of buffer in char16_ts. * @stable ICU 2.0 */ - UnicodeString(UChar *buffer, int32_t buffLength, int32_t buffCapacity); + UnicodeString(char16_t *buffer, int32_t buffLength, int32_t buffCapacity); + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if !U_CHAR16_IS_TYPEDEF + /** + * Writable-aliasing uint16_t * constructor. + * Delegates to UnicodeString(const char16_t *, int32_t, int32_t). + * @param buffer writable buffer of/for UTF-16 text + * @param buffLength length of the current buffer contents + * @param buffCapacity buffer capacity + * @draft ICU 59 + */ + UnicodeString(uint16_t *buffer, int32_t buffLength, int32_t buffCapacity) : + UnicodeString(Char16Ptr(buffer), buffLength, buffCapacity) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ +#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) + /** + * Writable-aliasing wchar_t * constructor. + * (Only defined if U_SIZEOF_WCHAR_T==2.) + * Delegates to UnicodeString(const char16_t *, int32_t, int32_t). + * @param buffer writable buffer of/for UTF-16 text + * @param buffLength length of the current buffer contents + * @param buffCapacity buffer capacity + * @draft ICU 59 + */ + UnicodeString(wchar_t *buffer, int32_t buffLength, int32_t buffCapacity) : + UnicodeString(Char16Ptr(buffer), buffLength, buffCapacity) {} +#endif + + /* + * Do not use #ifndef U_HIDE_DRAFT_API for the following constructor, + * it should always be available regardless of U_HIDE_DRAFT_API status + */ + /** + * Writable-aliasing nullptr_t constructor. + * Effectively the same as the default constructor, makes an empty string object. + * @param buffer nullptr + * @param buffLength ignored + * @param buffCapacity ignored + * @draft ICU 59 + */ + inline UnicodeString(std::nullptr_t buffer, int32_t buffLength, int32_t buffCapacity); #if U_CHARSET_IS_UTF8 || !UCONFIG_NO_CONVERSION @@ -3380,7 +3527,7 @@ class U_COMMON_API UnicodeString : public Replaceable * UnicodeString::charAt() to be inline again (see jitterbug 709). * @stable ICU 2.4 */ - virtual UChar getCharAt(int32_t offset) const; + virtual char16_t getCharAt(int32_t offset) const; /** * The change in Replaceable to use virtual getChar32At() allows @@ -3416,7 +3563,7 @@ class U_COMMON_API UnicodeString : public Replaceable int8_t doCompare(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -3429,7 +3576,7 @@ class U_COMMON_API UnicodeString : public Replaceable int8_t doCompareCodePointOrder(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const; @@ -3444,12 +3591,12 @@ class U_COMMON_API UnicodeString : public Replaceable int8_t doCaseCompare(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength, uint32_t options) const; - int32_t doIndexOf(UChar c, + int32_t doIndexOf(char16_t c, int32_t start, int32_t length) const; @@ -3457,7 +3604,7 @@ class U_COMMON_API UnicodeString : public Replaceable int32_t start, int32_t length) const; - int32_t doLastIndexOf(UChar c, + int32_t doLastIndexOf(char16_t c, int32_t start, int32_t length) const; @@ -3467,14 +3614,14 @@ class U_COMMON_API UnicodeString : public Replaceable void doExtract(int32_t start, int32_t length, - UChar *dst, + char16_t *dst, int32_t dstStart) const; inline void doExtract(int32_t start, int32_t length, UnicodeString& target) const; - inline UChar doCharAt(int32_t offset) const; + inline char16_t doCharAt(int32_t offset) const; UnicodeString& doReplace(int32_t start, int32_t length, @@ -3484,12 +3631,12 @@ class U_COMMON_API UnicodeString : public Replaceable UnicodeString& doReplace(int32_t start, int32_t length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength); UnicodeString& doAppend(const UnicodeString& src, int32_t srcStart, int32_t srcLength); - UnicodeString& doAppend(const UChar *srcChars, int32_t srcStart, int32_t srcLength); + UnicodeString& doAppend(const char16_t *srcChars, int32_t srcStart, int32_t srcLength); UnicodeString& doReverse(int32_t start, int32_t length); @@ -3499,8 +3646,8 @@ class U_COMMON_API UnicodeString : public Replaceable // get pointer to start of array // these do not check for kOpenGetBuffer, unlike the public getBuffer() function - inline UChar* getArrayStart(void); - inline const UChar* getArrayStart(void) const; + inline char16_t* getArrayStart(void); + inline const char16_t* getArrayStart(void) const; inline UBool hasShortLength() const; inline int32_t getShortLength() const; @@ -3517,7 +3664,7 @@ class U_COMMON_API UnicodeString : public Replaceable inline void setShortLength(int32_t len); inline void setLength(int32_t len); inline void setToEmpty(); - inline void setArray(UChar *array, int32_t len, int32_t capacity); // sets length but not flags + inline void setArray(char16_t *array, int32_t len, int32_t capacity); // sets length but not flags // allocate the array; result may be the stack buffer // sets refCount to 1 if appropriate @@ -3600,7 +3747,11 @@ class U_COMMON_API UnicodeString : public Replaceable * as in ustr_imp.h for ustrcase_map(). */ UnicodeString & - caseMap(const UCaseMap *csm, UStringCaseMapper *stringCaseMapper); + caseMap(int32_t caseLocale, uint32_t options, +#if !UCONFIG_NO_BREAK_ITERATION + BreakIterator *iter, +#endif + UStringCaseMapper *stringCaseMapper); // ref counting void addRef(void); @@ -3691,15 +3842,15 @@ class U_COMMON_API UnicodeString : public Replaceable // Each struct of the union must begin with fLengthAndFlags. struct { int16_t fLengthAndFlags; // bit fields: see constants above - UChar fBuffer[US_STACKBUF_SIZE]; // buffer for short strings + char16_t fBuffer[US_STACKBUF_SIZE]; // buffer for short strings } fStackFields; struct { int16_t fLengthAndFlags; // bit fields: see constants above int32_t fLength; // number of characters in fArray if >127; else undefined - int32_t fCapacity; // capacity of fArray (in UChars) + int32_t fCapacity; // capacity of fArray (in char16_ts) // array pointer last to minimize padding for machines with P128 data model // or pointer sizes that are not a power of 2 - UChar *fArray; // the Unicode data + char16_t *fArray; // the Unicode data } fFields; } fUnion; }; @@ -3752,13 +3903,13 @@ UnicodeString::pinIndices(int32_t& start, } } -inline UChar* +inline char16_t* UnicodeString::getArrayStart() { return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ? fUnion.fStackFields.fBuffer : fUnion.fFields.fArray; } -inline const UChar* +inline const char16_t* UnicodeString::getArrayStart() const { return (fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) ? fUnion.fStackFields.fBuffer : fUnion.fFields.fArray; @@ -3773,6 +3924,18 @@ UnicodeString::UnicodeString() { fUnion.fStackFields.fLengthAndFlags=kShortString; } +inline UnicodeString::UnicodeString(const std::nullptr_t /*text*/) { + fUnion.fStackFields.fLengthAndFlags=kShortString; +} + +inline UnicodeString::UnicodeString(const std::nullptr_t /*text*/, int32_t /*length*/) { + fUnion.fStackFields.fLengthAndFlags=kShortString; +} + +inline UnicodeString::UnicodeString(std::nullptr_t /*buffer*/, int32_t /*buffLength*/, int32_t /*buffCapacity*/) { + fUnion.fStackFields.fLengthAndFlags=kShortString; +} + //======================================== // Read-only implementation methods //======================================== @@ -3819,10 +3982,10 @@ UnicodeString::isBufferWritable() const (!(fUnion.fFields.fLengthAndFlags&kRefCounted) || refCount()==1)); } -inline const UChar * +inline const char16_t * UnicodeString::getBuffer() const { if(fUnion.fFields.fLengthAndFlags&(kIsBogus|kOpenGetBuffer)) { - return 0; + return nullptr; } else if(fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) { return fUnion.fStackFields.fBuffer; } else { @@ -3890,7 +4053,7 @@ UnicodeString::compare(int32_t start, { return doCompare(start, _length, srcText, 0, srcText.length()); } inline int8_t -UnicodeString::compare(const UChar *srcChars, +UnicodeString::compare(ConstChar16Ptr srcChars, int32_t srcLength) const { return doCompare(0, length(), srcChars, 0, srcLength); } @@ -3905,13 +4068,13 @@ UnicodeString::compare(int32_t start, inline int8_t UnicodeString::compare(int32_t start, int32_t _length, - const UChar *srcChars) const + const char16_t *srcChars) const { return doCompare(start, _length, srcChars, 0, _length); } inline int8_t UnicodeString::compare(int32_t start, int32_t _length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const { return doCompare(start, _length, srcChars, srcStart, srcLength); } @@ -3951,7 +4114,7 @@ UnicodeString::compareCodePointOrder(int32_t start, { return doCompareCodePointOrder(start, _length, srcText, 0, srcText.length()); } inline int8_t -UnicodeString::compareCodePointOrder(const UChar *srcChars, +UnicodeString::compareCodePointOrder(ConstChar16Ptr srcChars, int32_t srcLength) const { return doCompareCodePointOrder(0, length(), srcChars, 0, srcLength); } @@ -3966,13 +4129,13 @@ UnicodeString::compareCodePointOrder(int32_t start, inline int8_t UnicodeString::compareCodePointOrder(int32_t start, int32_t _length, - const UChar *srcChars) const + const char16_t *srcChars) const { return doCompareCodePointOrder(start, _length, srcChars, 0, _length); } inline int8_t UnicodeString::compareCodePointOrder(int32_t start, int32_t _length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const { return doCompareCodePointOrder(start, _length, srcChars, srcStart, srcLength); } @@ -4016,7 +4179,7 @@ UnicodeString::caseCompare(int32_t start, } inline int8_t -UnicodeString::caseCompare(const UChar *srcChars, +UnicodeString::caseCompare(ConstChar16Ptr srcChars, int32_t srcLength, uint32_t options) const { return doCaseCompare(0, length(), srcChars, 0, srcLength, options); @@ -4035,7 +4198,7 @@ UnicodeString::caseCompare(int32_t start, inline int8_t UnicodeString::caseCompare(int32_t start, int32_t _length, - const UChar *srcChars, + const char16_t *srcChars, uint32_t options) const { return doCaseCompare(start, _length, srcChars, 0, _length, options); } @@ -4043,7 +4206,7 @@ UnicodeString::caseCompare(int32_t start, inline int8_t UnicodeString::caseCompare(int32_t start, int32_t _length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength, uint32_t options) const { @@ -4094,7 +4257,7 @@ UnicodeString::indexOf(const UnicodeString& text, { return indexOf(text, 0, text.length(), start, _length); } inline int32_t -UnicodeString::indexOf(const UChar *srcChars, +UnicodeString::indexOf(const char16_t *srcChars, int32_t srcLength, int32_t start) const { pinIndex(start); @@ -4102,14 +4265,14 @@ UnicodeString::indexOf(const UChar *srcChars, } inline int32_t -UnicodeString::indexOf(const UChar *srcChars, +UnicodeString::indexOf(ConstChar16Ptr srcChars, int32_t srcLength, int32_t start, int32_t _length) const { return indexOf(srcChars, 0, srcLength, start, _length); } inline int32_t -UnicodeString::indexOf(UChar c, +UnicodeString::indexOf(char16_t c, int32_t start, int32_t _length) const { return doIndexOf(c, start, _length); } @@ -4121,7 +4284,7 @@ UnicodeString::indexOf(UChar32 c, { return doIndexOf(c, start, _length); } inline int32_t -UnicodeString::indexOf(UChar c) const +UnicodeString::indexOf(char16_t c) const { return doIndexOf(c, 0, length()); } inline int32_t @@ -4129,7 +4292,7 @@ UnicodeString::indexOf(UChar32 c) const { return indexOf(c, 0, length()); } inline int32_t -UnicodeString::indexOf(UChar c, +UnicodeString::indexOf(char16_t c, int32_t start) const { pinIndex(start); return doIndexOf(c, start, length() - start); @@ -4143,14 +4306,14 @@ UnicodeString::indexOf(UChar32 c, } inline int32_t -UnicodeString::lastIndexOf(const UChar *srcChars, +UnicodeString::lastIndexOf(ConstChar16Ptr srcChars, int32_t srcLength, int32_t start, int32_t _length) const { return lastIndexOf(srcChars, 0, srcLength, start, _length); } inline int32_t -UnicodeString::lastIndexOf(const UChar *srcChars, +UnicodeString::lastIndexOf(const char16_t *srcChars, int32_t srcLength, int32_t start) const { pinIndex(start); @@ -4191,7 +4354,7 @@ UnicodeString::lastIndexOf(const UnicodeString& text) const { return lastIndexOf(text, 0, text.length(), 0, length()); } inline int32_t -UnicodeString::lastIndexOf(UChar c, +UnicodeString::lastIndexOf(char16_t c, int32_t start, int32_t _length) const { return doLastIndexOf(c, start, _length); } @@ -4204,7 +4367,7 @@ UnicodeString::lastIndexOf(UChar32 c, } inline int32_t -UnicodeString::lastIndexOf(UChar c) const +UnicodeString::lastIndexOf(char16_t c) const { return doLastIndexOf(c, 0, length()); } inline int32_t @@ -4213,7 +4376,7 @@ UnicodeString::lastIndexOf(UChar32 c) const { } inline int32_t -UnicodeString::lastIndexOf(UChar c, +UnicodeString::lastIndexOf(char16_t c, int32_t start) const { pinIndex(start); return doLastIndexOf(c, start, length() - start); @@ -4237,17 +4400,17 @@ UnicodeString::startsWith(const UnicodeString& srcText, { return doCompare(0, srcLength, srcText, srcStart, srcLength) == 0; } inline UBool -UnicodeString::startsWith(const UChar *srcChars, int32_t srcLength) const { +UnicodeString::startsWith(ConstChar16Ptr srcChars, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(srcChars); + srcLength = u_strlen(toUCharPtr(srcChars)); } return doCompare(0, srcLength, srcChars, 0, srcLength) == 0; } inline UBool -UnicodeString::startsWith(const UChar *srcChars, int32_t srcStart, int32_t srcLength) const { +UnicodeString::startsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(srcChars); + srcLength = u_strlen(toUCharPtr(srcChars)); } return doCompare(0, srcLength, srcChars, srcStart, srcLength) == 0; } @@ -4267,21 +4430,21 @@ UnicodeString::endsWith(const UnicodeString& srcText, } inline UBool -UnicodeString::endsWith(const UChar *srcChars, +UnicodeString::endsWith(ConstChar16Ptr srcChars, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(srcChars); + srcLength = u_strlen(toUCharPtr(srcChars)); } return doCompare(length() - srcLength, srcLength, srcChars, 0, srcLength) == 0; } inline UBool -UnicodeString::endsWith(const UChar *srcChars, +UnicodeString::endsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const { if(srcLength < 0) { - srcLength = u_strlen(srcChars + srcStart); + srcLength = u_strlen(toUCharPtr(srcChars + srcStart)); } return doCompare(length() - srcLength, srcLength, srcChars, srcStart, srcLength) == 0; @@ -4307,14 +4470,14 @@ UnicodeString::replace(int32_t start, inline UnicodeString& UnicodeString::replace(int32_t start, int32_t _length, - const UChar *srcChars, + ConstChar16Ptr srcChars, int32_t srcLength) { return doReplace(start, _length, srcChars, 0, srcLength); } inline UnicodeString& UnicodeString::replace(int32_t start, int32_t _length, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) { return doReplace(start, _length, srcChars, srcStart, srcLength); } @@ -4322,7 +4485,7 @@ UnicodeString::replace(int32_t start, inline UnicodeString& UnicodeString::replace(int32_t start, int32_t _length, - UChar srcChar) + char16_t srcChar) { return doReplace(start, _length, &srcChar, 0, 1); } inline UnicodeString& @@ -4365,7 +4528,7 @@ UnicodeString::doExtract(int32_t start, inline void UnicodeString::extract(int32_t start, int32_t _length, - UChar *target, + Char16Ptr target, int32_t targetStart) const { doExtract(start, _length, target, targetStart); } @@ -4393,7 +4556,7 @@ UnicodeString::extract(int32_t start, inline void UnicodeString::extractBetween(int32_t start, int32_t limit, - UChar *dst, + char16_t *dst, int32_t dstStart) const { pinIndex(start); pinIndex(limit); @@ -4405,7 +4568,7 @@ UnicodeString::tempSubStringBetween(int32_t start, int32_t limit) const { return tempSubString(start, limit - start); } -inline UChar +inline char16_t UnicodeString::doCharAt(int32_t offset) const { if((uint32_t)offset < (uint32_t)length()) { @@ -4415,11 +4578,11 @@ UnicodeString::doCharAt(int32_t offset) const } } -inline UChar +inline char16_t UnicodeString::charAt(int32_t offset) const { return doCharAt(offset); } -inline UChar +inline char16_t UnicodeString::operator[] (int32_t offset) const { return doCharAt(offset); } @@ -4460,14 +4623,14 @@ UnicodeString::setToEmpty() { } inline void -UnicodeString::setArray(UChar *array, int32_t len, int32_t capacity) { +UnicodeString::setArray(char16_t *array, int32_t len, int32_t capacity) { setLength(len); fUnion.fFields.fArray = array; fUnion.fFields.fCapacity = capacity; } inline UnicodeString& -UnicodeString::operator= (UChar ch) +UnicodeString::operator= (char16_t ch) { return doReplace(0, length(), &ch, 0, 1); } inline UnicodeString& @@ -4499,7 +4662,7 @@ UnicodeString::setTo(const UnicodeString& srcText) } inline UnicodeString& -UnicodeString::setTo(const UChar *srcChars, +UnicodeString::setTo(const char16_t *srcChars, int32_t srcLength) { unBogus(); @@ -4507,7 +4670,7 @@ UnicodeString::setTo(const UChar *srcChars, } inline UnicodeString& -UnicodeString::setTo(UChar srcChar) +UnicodeString::setTo(char16_t srcChar) { unBogus(); return doReplace(0, length(), &srcChar, 0, 1); @@ -4531,22 +4694,22 @@ UnicodeString::append(const UnicodeString& srcText) { return doAppend(srcText, 0, srcText.length()); } inline UnicodeString& -UnicodeString::append(const UChar *srcChars, +UnicodeString::append(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) { return doAppend(srcChars, srcStart, srcLength); } inline UnicodeString& -UnicodeString::append(const UChar *srcChars, +UnicodeString::append(ConstChar16Ptr srcChars, int32_t srcLength) { return doAppend(srcChars, 0, srcLength); } inline UnicodeString& -UnicodeString::append(UChar srcChar) +UnicodeString::append(char16_t srcChar) { return doAppend(&srcChar, 0, 1); } inline UnicodeString& -UnicodeString::operator+= (UChar ch) +UnicodeString::operator+= (char16_t ch) { return doAppend(&ch, 0, 1); } inline UnicodeString& @@ -4572,20 +4735,20 @@ UnicodeString::insert(int32_t start, inline UnicodeString& UnicodeString::insert(int32_t start, - const UChar *srcChars, + const char16_t *srcChars, int32_t srcStart, int32_t srcLength) { return doReplace(start, 0, srcChars, srcStart, srcLength); } inline UnicodeString& UnicodeString::insert(int32_t start, - const UChar *srcChars, + ConstChar16Ptr srcChars, int32_t srcLength) { return doReplace(start, 0, srcChars, 0, srcLength); } inline UnicodeString& UnicodeString::insert(int32_t start, - UChar srcChar) + char16_t srcChar) { return doReplace(start, 0, &srcChar, 0, 1); } inline UnicodeString& diff --git a/deps/icu-small/source/common/unicode/unorm.h b/deps/icu-small/source/common/unicode/unorm.h index f527c263f0298a..1b5af16700fb9f 100644 --- a/deps/icu-small/source/common/unicode/unorm.h +++ b/deps/icu-small/source/common/unicode/unorm.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/common/unicode/unorm2.h b/deps/icu-small/source/common/unicode/unorm2.h index 56e99b2a22b413..c6d3494d7057f5 100644 --- a/deps/icu-small/source/common/unicode/unorm2.h +++ b/deps/icu-small/source/common/unicode/unorm2.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unorm2.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/uobject.h b/deps/icu-small/source/common/unicode/uobject.h index 96b1b8fbeadd19..080600e52650d5 100644 --- a/deps/icu-small/source/common/unicode/uobject.h +++ b/deps/icu-small/source/common/unicode/uobject.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: uobject.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/urename.h b/deps/icu-small/source/common/unicode/urename.h index b220a546975e47..21c839abbf908d 100644 --- a/deps/icu-small/source/common/unicode/urename.h +++ b/deps/icu-small/source/common/unicode/urename.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -7,7 +7,7 @@ ******************************************************************************* * * file name: urename.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -100,12 +100,16 @@ #define _UTF16BEData U_ICU_ENTRY_POINT_RENAME(_UTF16BEData) #define _UTF16Data U_ICU_ENTRY_POINT_RENAME(_UTF16Data) #define _UTF16LEData U_ICU_ENTRY_POINT_RENAME(_UTF16LEData) +#define _UTF16v2Data U_ICU_ENTRY_POINT_RENAME(_UTF16v2Data) #define _UTF32BEData U_ICU_ENTRY_POINT_RENAME(_UTF32BEData) #define _UTF32Data U_ICU_ENTRY_POINT_RENAME(_UTF32Data) #define _UTF32LEData U_ICU_ENTRY_POINT_RENAME(_UTF32LEData) #define _UTF7Data U_ICU_ENTRY_POINT_RENAME(_UTF7Data) #define _UTF8Data U_ICU_ENTRY_POINT_RENAME(_UTF8Data) +#define allowedHourFormatsCleanup U_ICU_ENTRY_POINT_RENAME(allowedHourFormatsCleanup) #define cmemory_cleanup U_ICU_ENTRY_POINT_RENAME(cmemory_cleanup) +#define dayPeriodRulesCleanup U_ICU_ENTRY_POINT_RENAME(dayPeriodRulesCleanup) +#define deleteAllowedHourFormats U_ICU_ENTRY_POINT_RENAME(deleteAllowedHourFormats) #define gTimeZoneFilesInitOnce U_ICU_ENTRY_POINT_RENAME(gTimeZoneFilesInitOnce) #define izrule_clone U_ICU_ENTRY_POINT_RENAME(izrule_clone) #define izrule_close U_ICU_ENTRY_POINT_RENAME(izrule_close) @@ -121,16 +125,6 @@ #define izrule_getStaticClassID U_ICU_ENTRY_POINT_RENAME(izrule_getStaticClassID) #define izrule_isEquivalentTo U_ICU_ENTRY_POINT_RENAME(izrule_isEquivalentTo) #define izrule_open U_ICU_ENTRY_POINT_RENAME(izrule_open) -#define le_close U_ICU_ENTRY_POINT_RENAME(le_close) -#define le_create U_ICU_ENTRY_POINT_RENAME(le_create) -#define le_getCharIndices U_ICU_ENTRY_POINT_RENAME(le_getCharIndices) -#define le_getCharIndicesWithBase U_ICU_ENTRY_POINT_RENAME(le_getCharIndicesWithBase) -#define le_getGlyphCount U_ICU_ENTRY_POINT_RENAME(le_getGlyphCount) -#define le_getGlyphPosition U_ICU_ENTRY_POINT_RENAME(le_getGlyphPosition) -#define le_getGlyphPositions U_ICU_ENTRY_POINT_RENAME(le_getGlyphPositions) -#define le_getGlyphs U_ICU_ENTRY_POINT_RENAME(le_getGlyphs) -#define le_layoutChars U_ICU_ENTRY_POINT_RENAME(le_layoutChars) -#define le_reset U_ICU_ENTRY_POINT_RENAME(le_reset) #define locale_getKeywords U_ICU_ENTRY_POINT_RENAME(locale_getKeywords) #define locale_getKeywordsStart U_ICU_ENTRY_POINT_RENAME(locale_getKeywordsStart) #define locale_get_default U_ICU_ENTRY_POINT_RENAME(locale_get_default) @@ -486,6 +480,7 @@ #define ubrk_first U_ICU_ENTRY_POINT_RENAME(ubrk_first) #define ubrk_following U_ICU_ENTRY_POINT_RENAME(ubrk_following) #define ubrk_getAvailable U_ICU_ENTRY_POINT_RENAME(ubrk_getAvailable) +#define ubrk_getBinaryRules U_ICU_ENTRY_POINT_RENAME(ubrk_getBinaryRules) #define ubrk_getLocaleByType U_ICU_ENTRY_POINT_RENAME(ubrk_getLocaleByType) #define ubrk_getRuleStatus U_ICU_ENTRY_POINT_RENAME(ubrk_getRuleStatus) #define ubrk_getRuleStatusVec U_ICU_ENTRY_POINT_RENAME(ubrk_getRuleStatusVec) @@ -493,6 +488,7 @@ #define ubrk_last U_ICU_ENTRY_POINT_RENAME(ubrk_last) #define ubrk_next U_ICU_ENTRY_POINT_RENAME(ubrk_next) #define ubrk_open U_ICU_ENTRY_POINT_RENAME(ubrk_open) +#define ubrk_openBinaryRules U_ICU_ENTRY_POINT_RENAME(ubrk_openBinaryRules) #define ubrk_openRules U_ICU_ENTRY_POINT_RENAME(ubrk_openRules) #define ubrk_preceding U_ICU_ENTRY_POINT_RENAME(ubrk_preceding) #define ubrk_previous U_ICU_ENTRY_POINT_RENAME(ubrk_previous) @@ -554,7 +550,6 @@ #define ucase_addStringCaseClosure U_ICU_ENTRY_POINT_RENAME(ucase_addStringCaseClosure) #define ucase_fold U_ICU_ENTRY_POINT_RENAME(ucase_fold) #define ucase_getCaseLocale U_ICU_ENTRY_POINT_RENAME(ucase_getCaseLocale) -#define ucase_getSingleton U_ICU_ENTRY_POINT_RENAME(ucase_getSingleton) #define ucase_getType U_ICU_ENTRY_POINT_RENAME(ucase_getType) #define ucase_getTypeOrIgnorable U_ICU_ENTRY_POINT_RENAME(ucase_getTypeOrIgnorable) #define ucase_hasBinaryProperty U_ICU_ENTRY_POINT_RENAME(ucase_hasBinaryProperty) @@ -1150,6 +1145,7 @@ #define unum_formatDecimal U_ICU_ENTRY_POINT_RENAME(unum_formatDecimal) #define unum_formatDouble U_ICU_ENTRY_POINT_RENAME(unum_formatDouble) #define unum_formatDoubleCurrency U_ICU_ENTRY_POINT_RENAME(unum_formatDoubleCurrency) +#define unum_formatDoubleForFields U_ICU_ENTRY_POINT_RENAME(unum_formatDoubleForFields) #define unum_formatInt64 U_ICU_ENTRY_POINT_RENAME(unum_formatInt64) #define unum_formatUFormattable U_ICU_ENTRY_POINT_RENAME(unum_formatUFormattable) #define unum_getAttribute U_ICU_ENTRY_POINT_RENAME(unum_getAttribute) @@ -1181,9 +1177,11 @@ #define unumsys_openAvailableNames U_ICU_ENTRY_POINT_RENAME(unumsys_openAvailableNames) #define unumsys_openByName U_ICU_ENTRY_POINT_RENAME(unumsys_openByName) #define uplrules_close U_ICU_ENTRY_POINT_RENAME(uplrules_close) +#define uplrules_getKeywords U_ICU_ENTRY_POINT_RENAME(uplrules_getKeywords) #define uplrules_open U_ICU_ENTRY_POINT_RENAME(uplrules_open) #define uplrules_openForType U_ICU_ENTRY_POINT_RENAME(uplrules_openForType) #define uplrules_select U_ICU_ENTRY_POINT_RENAME(uplrules_select) +#define uplrules_selectWithFormat U_ICU_ENTRY_POINT_RENAME(uplrules_selectWithFormat) #define uplug_closeLibrary U_ICU_ENTRY_POINT_RENAME(uplug_closeLibrary) #define uplug_findLibrary U_ICU_ENTRY_POINT_RENAME(uplug_findLibrary) #define uplug_getConfiguration U_ICU_ENTRY_POINT_RENAME(uplug_getConfiguration) @@ -1220,6 +1218,7 @@ #define uprv_compareInvEbcdic U_ICU_ENTRY_POINT_RENAME(uprv_compareInvEbcdic) #define uprv_compareInvEbcdicAsAscii U_ICU_ENTRY_POINT_RENAME(uprv_compareInvEbcdicAsAscii) #define uprv_convertToLCID U_ICU_ENTRY_POINT_RENAME(uprv_convertToLCID) +#define uprv_convertToLCIDPlatform U_ICU_ENTRY_POINT_RENAME(uprv_convertToLCIDPlatform) #define uprv_convertToPosix U_ICU_ENTRY_POINT_RENAME(uprv_convertToPosix) #define uprv_copyAscii U_ICU_ENTRY_POINT_RENAME(uprv_copyAscii) #define uprv_copyEbcdic U_ICU_ENTRY_POINT_RENAME(uprv_copyEbcdic) @@ -1654,12 +1653,13 @@ #define ustr_hashCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashCharsN) #define ustr_hashICharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashICharsN) #define ustr_hashUCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashUCharsN) +#define ustrcase_getCaseLocale U_ICU_ENTRY_POINT_RENAME(ustrcase_getCaseLocale) #define ustrcase_internalFold U_ICU_ENTRY_POINT_RENAME(ustrcase_internalFold) #define ustrcase_internalToLower U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToLower) #define ustrcase_internalToTitle U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToTitle) #define ustrcase_internalToUpper U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToUpper) #define ustrcase_map U_ICU_ENTRY_POINT_RENAME(ustrcase_map) -#define ustrcase_setTempCaseMapLocale U_ICU_ENTRY_POINT_RENAME(ustrcase_setTempCaseMapLocale) +#define ustrcase_mapWithOverlap U_ICU_ENTRY_POINT_RENAME(ustrcase_mapWithOverlap) #define utext_char32At U_ICU_ENTRY_POINT_RENAME(utext_char32At) #define utext_clone U_ICU_ENTRY_POINT_RENAME(utext_clone) #define utext_close U_ICU_ENTRY_POINT_RENAME(utext_close) @@ -1704,7 +1704,6 @@ #define utrace_functionName U_ICU_ENTRY_POINT_RENAME(utrace_functionName) #define utrace_getFunctions U_ICU_ENTRY_POINT_RENAME(utrace_getFunctions) #define utrace_getLevel U_ICU_ENTRY_POINT_RENAME(utrace_getLevel) -#define utrace_level U_ICU_ENTRY_POINT_RENAME(utrace_level) #define utrace_setFunctions U_ICU_ENTRY_POINT_RENAME(utrace_setFunctions) #define utrace_setLevel U_ICU_ENTRY_POINT_RENAME(utrace_setLevel) #define utrace_vformat U_ICU_ENTRY_POINT_RENAME(utrace_vformat) diff --git a/deps/icu-small/source/common/unicode/urep.h b/deps/icu-small/source/common/unicode/urep.h index 128f465319e2be..c54ba7c4661414 100644 --- a/deps/icu-small/source/common/unicode/urep.h +++ b/deps/icu-small/source/common/unicode/urep.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/unicode/ures.h b/deps/icu-small/source/common/unicode/ures.h index 620d9268aaceeb..918b9f208e2cd0 100644 --- a/deps/icu-small/source/common/unicode/ures.h +++ b/deps/icu-small/source/common/unicode/ures.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/uscript.h b/deps/icu-small/source/common/unicode/uscript.h index a20cd157a45507..1420578f02b7ae 100644 --- a/deps/icu-small/source/common/unicode/uscript.h +++ b/deps/icu-small/source/common/unicode/uscript.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/uset.h b/deps/icu-small/source/common/unicode/uset.h index b4ed176eb951a6..5b7c5db9ec03e5 100644 --- a/deps/icu-small/source/common/unicode/uset.h +++ b/deps/icu-small/source/common/unicode/uset.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uset.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/usetiter.h b/deps/icu-small/source/common/unicode/usetiter.h index d70e897b223335..057adbc04f5f05 100644 --- a/deps/icu-small/source/common/unicode/usetiter.h +++ b/deps/icu-small/source/common/unicode/usetiter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/ushape.h b/deps/icu-small/source/common/unicode/ushape.h index 97fe9e3880b843..5af8ffe1c58c31 100644 --- a/deps/icu-small/source/common/unicode/ushape.h +++ b/deps/icu-small/source/common/unicode/ushape.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ushape.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/usprep.h b/deps/icu-small/source/common/unicode/usprep.h index fce161759d9f9b..33ca1461ce0813 100644 --- a/deps/icu-small/source/common/unicode/usprep.h +++ b/deps/icu-small/source/common/unicode/usprep.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: usprep.h - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/ustring.h b/deps/icu-small/source/common/unicode/ustring.h index 8f4809c8159ca9..2099ab591300e3 100644 --- a/deps/icu-small/source/common/unicode/ustring.h +++ b/deps/icu-small/source/common/unicode/ustring.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unicode/ustringtrie.h b/deps/icu-small/source/common/unicode/ustringtrie.h index 50d31ba226c308..fd85648225408c 100644 --- a/deps/icu-small/source/common/unicode/ustringtrie.h +++ b/deps/icu-small/source/common/unicode/ustringtrie.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: udicttrie.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/utext.h b/deps/icu-small/source/common/unicode/utext.h index 84ff22ad630f38..edcb267597b92f 100644 --- a/deps/icu-small/source/common/unicode/utext.h +++ b/deps/icu-small/source/common/unicode/utext.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utext.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/utf.h b/deps/icu-small/source/common/unicode/utf.h index 7f40190eb81ac7..ab7e9ac96aa77f 100644 --- a/deps/icu-small/source/common/unicode/utf.h +++ b/deps/icu-small/source/common/unicode/utf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utf.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/utf16.h b/deps/icu-small/source/common/unicode/utf16.h index 3455a40e56cceb..06653816123089 100644 --- a/deps/icu-small/source/common/unicode/utf16.h +++ b/deps/icu-small/source/common/unicode/utf16.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utf16.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/utf32.h b/deps/icu-small/source/common/unicode/utf32.h index f93727c109442a..8822c4dd0962c8 100644 --- a/deps/icu-small/source/common/unicode/utf32.h +++ b/deps/icu-small/source/common/unicode/utf32.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utf32.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/utf8.h b/deps/icu-small/source/common/unicode/utf8.h index 095e955ecd3c7e..9e56b50474f404 100644 --- a/deps/icu-small/source/common/unicode/utf8.h +++ b/deps/icu-small/source/common/unicode/utf8.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utf8.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -41,25 +41,7 @@ /* internal definitions ----------------------------------------------------- */ -/** - * \var utf8_countTrailBytes - * Internal array with numbers of trail bytes for any given byte used in - * lead byte position. - * - * This is internal since it is not meant to be called directly by external clients; - * however it is called by public macros in this file and thus must remain stable, - * and should not be hidden when other internal functions are hidden (otherwise - * public macros would fail to compile). - * @internal - */ -#ifdef U_UTF8_IMPL -U_EXPORT const uint8_t -#elif defined(U_STATIC_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) -U_CFUNC const uint8_t -#else -U_CFUNC U_IMPORT const uint8_t /* U_IMPORT2? */ /*U_IMPORT*/ -#endif -utf8_countTrailBytes[256]; + /** * Counts the trail bytes for a UTF-8 lead byte. diff --git a/deps/icu-small/source/common/unicode/utf_old.h b/deps/icu-small/source/common/unicode/utf_old.h index b550b28ae3ad98..cb229cb301583e 100644 --- a/deps/icu-small/source/common/unicode/utf_old.h +++ b/deps/icu-small/source/common/unicode/utf_old.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utf_old.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -267,6 +267,25 @@ typedef int32_t UTextOffset; /* Formerly utf8.h ---------------------------------------------------------- */ +/** +* \var utf8_countTrailBytes +* Internal array with numbers of trail bytes for any given byte used in +* lead byte position. +* +* This is internal since it is not meant to be called directly by external clients; +* however it is called by public macros in this file and thus must remain stable, +* and should not be hidden when other internal functions are hidden (otherwise +* public macros would fail to compile). +* @internal +*/ +#ifdef U_UTF8_IMPL +// No forward declaration if compiling utf_impl.cpp, which defines utf8_countTrailBytes. +#elif defined(U_STATIC_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) +U_CFUNC const uint8_t utf8_countTrailBytes[]; +#else +U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_IMPORT*/ +#endif + /** * Count the trail bytes for a UTF-8 lead byte. * @deprecated ICU 2.4. Renamed to U8_COUNT_TRAIL_BYTES, see utf_old.h. diff --git a/deps/icu-small/source/common/unicode/utrace.h b/deps/icu-small/source/common/unicode/utrace.h index 9add16f1ccb078..5d561109c7f8fd 100644 --- a/deps/icu-small/source/common/unicode/utrace.h +++ b/deps/icu-small/source/common/unicode/utrace.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utrace.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unicode/utypes.h b/deps/icu-small/source/common/unicode/utypes.h index 8325d534ed1167..4c40e6a87c7653 100644 --- a/deps/icu-small/source/common/unicode/utypes.h +++ b/deps/icu-small/source/common/unicode/utypes.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -178,12 +178,12 @@ /** * \def NULL - * Define NULL if necessary, to 0 for C++ and to ((void *)0) for C. + * Define NULL if necessary, to nullptr for C++ and to ((void *)0) for C. * @stable ICU 2.0 */ #ifndef NULL #ifdef __cplusplus -#define NULL 0 +#define NULL nullptr #else #define NULL ((void *)0) #endif diff --git a/deps/icu-small/source/common/unicode/uvernum.h b/deps/icu-small/source/common/unicode/uvernum.h index 5590f9a5cc3edc..cae59ad880c411 100644 --- a/deps/icu-small/source/common/unicode/uvernum.h +++ b/deps/icu-small/source/common/unicode/uvernum.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -7,7 +7,7 @@ ******************************************************************************* * * file name: uvernum.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -58,13 +58,13 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 58 +#define U_ICU_VERSION_MAJOR_NUM 59 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 2 +#define U_ICU_VERSION_MINOR_NUM 1 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU @@ -84,7 +84,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _58 +#define U_ICU_VERSION_SUFFIX _59 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -119,19 +119,24 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "58.2" +#define U_ICU_VERSION "59.1" /** The current ICU library major/minor version as a string without dots, for library name suffixes. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SHORT "58" +#if U_PLATFORM_HAS_WINUWP_API == 0 +#define U_ICU_VERSION_SHORT "59" +#else +// U_DISABLE_RENAMING does not impact dat file name +#define U_ICU_VERSION_SHORT +#endif /* U_PLATFORM_HAS_WINUWP_API == 0 */ #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "58.2" +#define U_ICU_DATA_VERSION "59.1" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/deps/icu-small/source/common/unicode/uversion.h b/deps/icu-small/source/common/unicode/uversion.h index 63e2d17a363d94..cda24b6e0fc5ba 100644 --- a/deps/icu-small/source/common/unicode/uversion.h +++ b/deps/icu-small/source/common/unicode/uversion.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -7,7 +7,7 @@ ******************************************************************************* * * file name: uversion.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unifiedcache.cpp b/deps/icu-small/source/common/unifiedcache.cpp index 3e8e33a1ff2806..da1c88e84cba7d 100644 --- a/deps/icu-small/source/common/unifiedcache.cpp +++ b/deps/icu-small/source/common/unifiedcache.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/unifiedcache.h b/deps/icu-small/source/common/unifiedcache.h index 67c676d4531c72..5606e03bc99c70 100644 --- a/deps/icu-small/source/common/unifiedcache.h +++ b/deps/icu-small/source/common/unifiedcache.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/unifilt.cpp b/deps/icu-small/source/common/unifilt.cpp index 2d8ce355c7532a..4ab0d9b5f934ba 100644 --- a/deps/icu-small/source/common/unifilt.cpp +++ b/deps/icu-small/source/common/unifilt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/unifunct.cpp b/deps/icu-small/source/common/unifunct.cpp index 8fdc638407dee6..f3995b298d2c46 100644 --- a/deps/icu-small/source/common/unifunct.cpp +++ b/deps/icu-small/source/common/unifunct.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/uniset.cpp b/deps/icu-small/source/common/uniset.cpp index ef1b6113d9b96e..d828660796f743 100644 --- a/deps/icu-small/source/common/uniset.cpp +++ b/deps/icu-small/source/common/uniset.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/uniset_closure.cpp b/deps/icu-small/source/common/uniset_closure.cpp index cacadf47758334..b5cc21394109dc 100644 --- a/deps/icu-small/source/common/uniset_closure.cpp +++ b/deps/icu-small/source/common/uniset_closure.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uniset_closure.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -184,7 +184,6 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { return *this; } if (attribute & (USET_CASE_INSENSITIVE | USET_ADD_CASE_MAPPINGS)) { - const UCaseProps *csp = ucase_getSingleton(); { UnicodeSet foldSet(*this); UnicodeString str; @@ -207,7 +206,6 @@ UnicodeSet& UnicodeSet::closeOver(int32_t attribute) { int32_t n = getRangeCount(); UChar32 result; const UChar *full; - int32_t locCache = 0; for (int32_t i=0; isize(); ++j) { str = *(const UnicodeString *) strings->elementAt(j); str.foldCase(); - if(!ucase_addStringCaseClosure(csp, str.getBuffer(), str.length(), &sa)) { + if(!ucase_addStringCaseClosure(str.getBuffer(), str.length(), &sa)) { foldSet.add(str); // does not map to code points: add the folded string itself } } diff --git a/deps/icu-small/source/common/uniset_props.cpp b/deps/icu-small/source/common/uniset_props.cpp index 8348f8a33aa611..ea69d4161a2664 100644 --- a/deps/icu-small/source/common/uniset_props.cpp +++ b/deps/icu-small/source/common/uniset_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uniset_props.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -195,7 +195,7 @@ void U_CALLCONV UnicodeSet_initInclusion(int32_t src, UErrorCode &status) { if(U_SUCCESS(status)) { impl->addPropertyStarts(&sa, status); } - ucase_addPropertyStarts(ucase_getSingleton(), &sa, &status); + ucase_addPropertyStarts(&sa, &status); break; } case UPROPS_SRC_NFC: { @@ -228,7 +228,7 @@ void U_CALLCONV UnicodeSet_initInclusion(int32_t src, UErrorCode &status) { } #endif case UPROPS_SRC_CASE: - ucase_addPropertyStarts(ucase_getSingleton(), &sa, &status); + ucase_addPropertyStarts(&sa, &status); break; case UPROPS_SRC_BIDI: ubidi_addPropertyStarts(ubidi_getSingleton(), &sa, &status); diff --git a/deps/icu-small/source/common/unisetspan.cpp b/deps/icu-small/source/common/unisetspan.cpp index 1179495d4feb6a..09fb5b474c7e68 100644 --- a/deps/icu-small/source/common/unisetspan.cpp +++ b/deps/icu-small/source/common/unisetspan.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: unisetspan.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unisetspan.h b/deps/icu-small/source/common/unisetspan.h index 36cdd98d044d09..f1e78ff3ee2b00 100644 --- a/deps/icu-small/source/common/unisetspan.h +++ b/deps/icu-small/source/common/unisetspan.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: unisetspan.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/unistr.cpp b/deps/icu-small/source/common/unistr.cpp index f825de91bba9dc..2db2856f0bb46f 100644 --- a/deps/icu-small/source/common/unistr.cpp +++ b/deps/icu-small/source/common/unistr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -218,9 +218,10 @@ UnicodeString::UnicodeString(const UChar *text, } UnicodeString::UnicodeString(UBool isTerminated, - const UChar *text, + ConstChar16Ptr textPtr, int32_t textLength) { fUnion.fFields.fLengthAndFlags = kReadonlyAlias; + const UChar *text = textPtr; if(text == NULL) { // treat as an empty string, do not alias setToEmpty(); @@ -234,7 +235,8 @@ UnicodeString::UnicodeString(UBool isTerminated, // text is terminated, or else it would have failed the above test textLength = u_strlen(text); } - setArray((UChar *)text, textLength, isTerminated ? textLength + 1 : textLength); + setArray(const_cast(text), textLength, + isTerminated ? textLength + 1 : textLength); } } @@ -873,7 +875,7 @@ UnicodeString::doExtract(int32_t start, } int32_t -UnicodeString::extract(UChar *dest, int32_t destCapacity, +UnicodeString::extract(Char16Ptr dest, int32_t destCapacity, UErrorCode &errorCode) const { int32_t len = length(); if(U_SUCCESS(errorCode)) { @@ -1215,10 +1217,10 @@ UnicodeString::unBogus() { } } -const UChar * +const char16_t * UnicodeString::getTerminatedBuffer() { if(!isWritable()) { - return 0; + return nullptr; } UChar *array = getArrayStart(); int32_t len = length(); @@ -1249,14 +1251,14 @@ UnicodeString::getTerminatedBuffer() { array[len] = 0; return array; } else { - return NULL; + return nullptr; } } // setTo() analogous to the readonly-aliasing constructor with the same signature UnicodeString & UnicodeString::setTo(UBool isTerminated, - const UChar *text, + ConstChar16Ptr textPtr, int32_t textLength) { if(fUnion.fFields.fLengthAndFlags & kOpenGetBuffer) { @@ -1264,6 +1266,7 @@ UnicodeString::setTo(UBool isTerminated, return *this; } + const UChar *text = textPtr; if(text == NULL) { // treat as an empty string, do not alias releaseArray(); @@ -1713,14 +1716,14 @@ UnicodeString::doHashCode() const // External Buffer //======================================== -UChar * +char16_t * UnicodeString::getBuffer(int32_t minCapacity) { if(minCapacity>=-1 && cloneArrayIfNeeded(minCapacity)) { fUnion.fFields.fLengthAndFlags|=kOpenGetBuffer; setZeroLength(); return getArrayStart(); } else { - return 0; + return nullptr; } } diff --git a/deps/icu-small/source/common/unistr_case.cpp b/deps/icu-small/source/common/unistr_case.cpp index 1715b6ec66e268..1c62ce5e974e23 100644 --- a/deps/icu-small/source/common/unistr_case.cpp +++ b/deps/icu-small/source/common/unistr_case.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unistr_case.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * @@ -19,14 +19,17 @@ */ #include "unicode/utypes.h" +#include "unicode/casemap.h" +#include "unicode/edits.h" #include "unicode/putil.h" #include "cstring.h" #include "cmemory.h" #include "unicode/ustring.h" #include "unicode/unistr.h" #include "unicode/uchar.h" +#include "uassert.h" +#include "ucasemap_imp.h" #include "uelement.h" -#include "ustr_imp.h" U_NAMESPACE_BEGIN @@ -87,56 +90,104 @@ UnicodeString::doCaseCompare(int32_t start, //======================================== UnicodeString & -UnicodeString::caseMap(const UCaseMap *csm, +UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM UStringCaseMapper *stringCaseMapper) { if(isEmpty() || !isWritable()) { // nothing to do return *this; } - // We need to allocate a new buffer for the internal string case mapping function. - // This is very similar to how doReplace() keeps the old array pointer - // and deletes the old array itself after it is done. - // In addition, we are forcing cloneArrayIfNeeded() to always allocate a new array. - UChar oldStackBuffer[US_STACKBUF_SIZE]; + UChar oldBuffer[2 * US_STACKBUF_SIZE]; UChar *oldArray; - int32_t oldLength; - - if(fUnion.fFields.fLengthAndFlags&kUsingStackBuffer) { - // copy the stack buffer contents because it will be overwritten - oldArray = oldStackBuffer; - oldLength = getShortLength(); - u_memcpy(oldStackBuffer, fUnion.fStackFields.fBuffer, oldLength); + int32_t oldLength = length(); + int32_t newLength; + UBool writable = isBufferWritable(); + UErrorCode errorCode = U_ZERO_ERROR; + + // Try to avoid heap-allocating a new character array for this string. + if (writable ? oldLength <= UPRV_LENGTHOF(oldBuffer) : oldLength < US_STACKBUF_SIZE) { + // Short string: Copy the contents into a temporary buffer and + // case-map back into the current array, or into the stack buffer. + UChar *buffer = getArrayStart(); + int32_t capacity; + oldArray = oldBuffer; + u_memcpy(oldBuffer, buffer, oldLength); + if (writable) { + capacity = getCapacity(); + } else { + // Switch from the read-only alias or shared heap buffer to the stack buffer. + if (!cloneArrayIfNeeded(US_STACKBUF_SIZE, US_STACKBUF_SIZE, /* doCopyArray= */ FALSE)) { + return *this; + } + U_ASSERT(fUnion.fFields.fLengthAndFlags & kUsingStackBuffer); + buffer = fUnion.fStackFields.fBuffer; + capacity = US_STACKBUF_SIZE; + } + newLength = stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + buffer, capacity, + oldArray, oldLength, NULL, errorCode); + if (U_SUCCESS(errorCode)) { + setLength(newLength); + return *this; + } else if (errorCode == U_BUFFER_OVERFLOW_ERROR) { + // common overflow handling below + } else { + setToBogus(); + return *this; + } } else { + // Longer string or read-only buffer: + // Collect only changes and then apply them to this string. + // Case mapping often changes only small parts of a string, + // and often does not change its length. oldArray = getArrayStart(); - oldLength = length(); + Edits edits; + UChar replacementChars[200]; + stringCaseMapper(caseLocale, options | UCASEMAP_OMIT_UNCHANGED_TEXT, UCASEMAP_BREAK_ITERATOR + replacementChars, UPRV_LENGTHOF(replacementChars), + oldArray, oldLength, &edits, errorCode); + if (U_SUCCESS(errorCode)) { + // Grow the buffer at most once, not for multiple doReplace() calls. + newLength = oldLength + edits.lengthDelta(); + if (newLength > oldLength && !cloneArrayIfNeeded(newLength, newLength)) { + return *this; + } + for (Edits::Iterator ei = edits.getCoarseChangesIterator(); ei.next(errorCode);) { + doReplace(ei.destinationIndex(), ei.oldLength(), + replacementChars, ei.replacementIndex(), ei.newLength()); + } + if (U_FAILURE(errorCode)) { + setToBogus(); + } + return *this; + } else if (errorCode == U_BUFFER_OVERFLOW_ERROR) { + // common overflow handling below + newLength = oldLength + edits.lengthDelta(); + } else { + setToBogus(); + return *this; + } } - int32_t capacity; - if(oldLength <= US_STACKBUF_SIZE) { - capacity = US_STACKBUF_SIZE; - } else { - capacity = oldLength + 20; - } + // Handle buffer overflow, newLength is known. + // We need to allocate a new buffer for the internal string case mapping function. + // This is very similar to how doReplace() keeps the old array pointer + // and deletes the old array itself after it is done. + // In addition, we are forcing cloneArrayIfNeeded() to always allocate a new array. int32_t *bufferToDelete = 0; - if(!cloneArrayIfNeeded(capacity, capacity, FALSE, &bufferToDelete, TRUE)) { + if (!cloneArrayIfNeeded(newLength, newLength, FALSE, &bufferToDelete, TRUE)) { return *this; } - - // Case-map, and if the result is too long, then reallocate and repeat. - UErrorCode errorCode; - int32_t newLength; - do { - errorCode = U_ZERO_ERROR; - newLength = stringCaseMapper(csm, getArrayStart(), getCapacity(), - oldArray, oldLength, &errorCode); - setLength(newLength); - } while(errorCode==U_BUFFER_OVERFLOW_ERROR && cloneArrayIfNeeded(newLength, newLength, FALSE)); - + errorCode = U_ZERO_ERROR; + newLength = stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + getArrayStart(), getCapacity(), + oldArray, oldLength, NULL, errorCode); if (bufferToDelete) { uprv_free(bufferToDelete); } - if(U_FAILURE(errorCode)) { + if (U_SUCCESS(errorCode)) { + setLength(newLength); + } else { setToBogus(); } return *this; @@ -144,10 +195,7 @@ UnicodeString::caseMap(const UCaseMap *csm, UnicodeString & UnicodeString::foldCase(uint32_t options) { - UCaseMap csm=UCASEMAP_INITIALIZER; - csm.csp=ucase_getSingleton(); - csm.options=options; - return caseMap(&csm, ustrcase_internalFold); + return caseMap(UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalFold); } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unistr_case_locale.cpp b/deps/icu-small/source/common/unistr_case_locale.cpp index a01be5c30b372a..f0f3048d06f517 100644 --- a/deps/icu-small/source/common/unistr_case_locale.cpp +++ b/deps/icu-small/source/common/unistr_case_locale.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: unistr_case_locale.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -19,9 +19,9 @@ #include "unicode/utypes.h" #include "unicode/locid.h" +#include "unicode/ucasemap.h" #include "unicode/unistr.h" -#include "cmemory.h" -#include "ustr_imp.h" +#include "ucasemap_imp.h" U_NAMESPACE_BEGIN @@ -29,44 +29,28 @@ U_NAMESPACE_BEGIN // Write implementation //======================================== -/* - * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. - * Do this fast because it is called with every function call. - */ -static inline void -setTempCaseMap(UCaseMap *csm, const char *locale) { - if(csm->csp==NULL) { - csm->csp=ucase_getSingleton(); - } - if(locale!=NULL && locale[0]==0) { - csm->locale[0]=0; - } else { - ustrcase_setTempCaseMapLocale(csm, locale); - } -} - UnicodeString & UnicodeString::toLower() { - return toLower(Locale::getDefault()); + return caseMap(ustrcase_getCaseLocale(NULL), 0, + UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToLower); } UnicodeString & UnicodeString::toLower(const Locale &locale) { - UCaseMap csm=UCASEMAP_INITIALIZER; - setTempCaseMap(&csm, locale.getName()); - return caseMap(&csm, ustrcase_internalToLower); + return caseMap(ustrcase_getCaseLocale(locale.getBaseName()), 0, + UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToLower); } UnicodeString & UnicodeString::toUpper() { - return toUpper(Locale::getDefault()); + return caseMap(ustrcase_getCaseLocale(NULL), 0, + UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToUpper); } UnicodeString & UnicodeString::toUpper(const Locale &locale) { - UCaseMap csm=UCASEMAP_INITIALIZER; - setTempCaseMap(&csm, locale.getName()); - return caseMap(&csm, ustrcase_internalToUpper); + return caseMap(ustrcase_getCaseLocale(locale.getBaseName()), 0, + UCASEMAP_BREAK_ITERATOR_NULL ustrcase_internalToUpper); } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unistr_cnv.cpp b/deps/icu-small/source/common/unistr_cnv.cpp index a9b44ee424c33f..64d3c16801ccb8 100644 --- a/deps/icu-small/source/common/unistr_cnv.cpp +++ b/deps/icu-small/source/common/unistr_cnv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unistr_cnv.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * diff --git a/deps/icu-small/source/common/unistr_props.cpp b/deps/icu-small/source/common/unistr_props.cpp index 533a683928c0bc..691bd085d6a923 100644 --- a/deps/icu-small/source/common/unistr_props.cpp +++ b/deps/icu-small/source/common/unistr_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unistr_props.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * diff --git a/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp b/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp index 3d6737cfc5e3d9..3156fdfc5754af 100644 --- a/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: unistr_titlecase_brkiter.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:2 * @@ -22,36 +22,10 @@ #if !UCONFIG_NO_BREAK_ITERATION #include "unicode/brkiter.h" -#include "unicode/ubrk.h" +#include "unicode/locid.h" +#include "unicode/ucasemap.h" #include "unicode/unistr.h" -#include "unicode/ustring.h" -#include "cmemory.h" -#include "ustr_imp.h" - -static int32_t U_CALLCONV -unistr_case_internalToTitle(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - ubrk_setText(csm->iter, src, srcLength, pErrorCode); - return ustrcase_internalToTitle(csm, dest, destCapacity, src, srcLength, pErrorCode); -} - -/* - * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. - * Do this fast because it is called with every function call. - */ -static inline void -setTempCaseMap(UCaseMap *csm, const char *locale) { - if(csm->csp==NULL) { - csm->csp=ucase_getSingleton(); - } - if(locale!=NULL && locale[0]==0) { - csm->locale[0]=0; - } else { - ustrcase_setTempCaseMapLocale(csm, locale); - } -} +#include "ucasemap_imp.h" U_NAMESPACE_BEGIN @@ -67,9 +41,6 @@ UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale) { UnicodeString & UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options) { - UCaseMap csm=UCASEMAP_INITIALIZER; - csm.options=options; - setTempCaseMap(&csm, locale.getName()); BreakIterator *bi=titleIter; if(bi==NULL) { UErrorCode errorCode=U_ZERO_ERROR; @@ -79,8 +50,12 @@ UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t return *this; } } - csm.iter=reinterpret_cast(bi); - caseMap(&csm, unistr_case_internalToTitle); + // Because the "this" string is both the source and the destination, + // make a copy of the original source for use by the break iterator. + // See tickets #13127 and #13128 + UnicodeString copyOfInput(*this); + bi->setText(copyOfInput); + caseMap(ustrcase_getCaseLocale(locale.getBaseName()), options, bi, ustrcase_internalToTitle); if(titleIter==NULL) { delete bi; } diff --git a/deps/icu-small/source/common/unistrappender.h b/deps/icu-small/source/common/unistrappender.h index 600fd9033585a8..134f31497f1525 100644 --- a/deps/icu-small/source/common/unistrappender.h +++ b/deps/icu-small/source/common/unistrappender.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/unorm.cpp b/deps/icu-small/source/common/unorm.cpp index 75aaea9cdfc02b..93f77e66afb40e 100644 --- a/deps/icu-small/source/common/unorm.cpp +++ b/deps/icu-small/source/common/unorm.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/unormcmp.cpp b/deps/icu-small/source/common/unormcmp.cpp index b40a10a1385fb4..689b0b53b2d5f5 100644 --- a/deps/icu-small/source/common/unormcmp.cpp +++ b/deps/icu-small/source/common/unormcmp.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unormcmp.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -145,7 +145,6 @@ unorm_cmpEquivFold(const UChar *s1, int32_t length1, uint32_t options, UErrorCode *pErrorCode) { const Normalizer2Impl *nfcImpl; - const UCaseProps *csp; /* current-level start/limit - s1/s2 as current */ const UChar *start1, *start2, *limit1, *limit2; @@ -183,11 +182,6 @@ unorm_cmpEquivFold(const UChar *s1, int32_t length1, } else { nfcImpl=NULL; } - if((options&U_COMPARE_IGNORE_CASE)!=0) { - csp=ucase_getSingleton(); - } else { - csp=NULL; - } if(U_FAILURE(*pErrorCode)) { return 0; } @@ -319,7 +313,7 @@ unorm_cmpEquivFold(const UChar *s1, int32_t length1, */ if( level1==0 && (options&U_COMPARE_IGNORE_CASE) && - (length=ucase_toFullFolding(csp, (UChar32)cp1, &p, options))>=0 + (length=ucase_toFullFolding((UChar32)cp1, &p, options))>=0 ) { /* cp1 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c1)) { @@ -364,7 +358,7 @@ unorm_cmpEquivFold(const UChar *s1, int32_t length1, } if( level2==0 && (options&U_COMPARE_IGNORE_CASE) && - (length=ucase_toFullFolding(csp, (UChar32)cp2, &p, options))>=0 + (length=ucase_toFullFolding((UChar32)cp2, &p, options))>=0 ) { /* cp2 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c2)) { diff --git a/deps/icu-small/source/common/unormimp.h b/deps/icu-small/source/common/unormimp.h index c382f38b8beaae..7f280551f7ef8e 100644 --- a/deps/icu-small/source/common/unormimp.h +++ b/deps/icu-small/source/common/unormimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unormimp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uobject.cpp b/deps/icu-small/source/common/uobject.cpp index 37406e4a0dc07a..1133dd9b67aaa6 100644 --- a/deps/icu-small/source/common/uobject.cpp +++ b/deps/icu-small/source/common/uobject.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: uobject.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uposixdefs.h b/deps/icu-small/source/common/uposixdefs.h index 495deea49e3f7c..45ca1233ac731a 100644 --- a/deps/icu-small/source/common/uposixdefs.h +++ b/deps/icu-small/source/common/uposixdefs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: uposixdefs.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -54,22 +54,18 @@ * * z/OS needs this definition for timeval and to get usleep. */ -#if !defined(_XOPEN_SOURCE_EXTENDED) +#if !defined(_XOPEN_SOURCE_EXTENDED) && defined(__TOS_MVS__) # define _XOPEN_SOURCE_EXTENDED 1 #endif -/* - * There is an issue with turning on _XOPEN_SOURCE_EXTENDED on certain platforms. - * A compatibility issue exists between turning on _XOPEN_SOURCE_EXTENDED and using - * standard C++ string class. As a result, standard C++ string class needs to be - * turned off for the follwing platforms: - * -AIX/VACPP - * -Solaris/GCC +/** + * Solaris says: + * "...it is invalid to compile an XPG6 or a POSIX.1-2001 application with anything other + * than a c99 or later compiler." + * Apparently C++11 is not "or later". Work around this. */ -#if (U_PLATFORM == U_PF_AIX && !defined(__GNUC__)) || (U_PLATFORM == U_PF_SOLARIS && defined(__GNUC__)) -# if _XOPEN_SOURCE_EXTENDED && !defined(U_HAVE_STD_STRING) -# define U_HAVE_STD_STRING 0 -# endif +#if defined(__cplusplus) && (defined(sun) || defined(__sun)) && !defined (_STDC_C99) +# define _STDC_C99 #endif #endif /* __UPOSIXDEFS_H__ */ diff --git a/deps/icu-small/source/common/uprops.cpp b/deps/icu-small/source/common/uprops.cpp index 46ceb66d8cf632..fc91c8903d80ea 100644 --- a/deps/icu-small/source/common/uprops.cpp +++ b/deps/icu-small/source/common/uprops.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uprops.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -128,9 +128,8 @@ static UBool changesWhenCasefolded(const BinaryProperty &/*prop*/, UChar32 c, UP } if(c>=0) { /* single code point */ - const UCaseProps *csp=ucase_getSingleton(); const UChar *resultString; - return (UBool)(ucase_toFullFolding(csp, c, &resultString, U_FOLD_CASE_DEFAULT)>=0); + return (UBool)(ucase_toFullFolding(c, &resultString, U_FOLD_CASE_DEFAULT)>=0); } else { /* guess some large but stack-friendly capacity */ UChar dest[2*UCASE_MAX_STRING_LENGTH]; @@ -576,14 +575,13 @@ u_getFC_NFKC_Closure(UChar32 c, UChar *dest, int32_t destCapacity, UErrorCode *p // case folding and NFKC.) // For the derivation, see Unicode's DerivedNormalizationProps.txt. const Normalizer2 *nfkc=Normalizer2::getNFKCInstance(*pErrorCode); - const UCaseProps *csp=ucase_getSingleton(); if(U_FAILURE(*pErrorCode)) { return 0; } // first: b = NFKC(Fold(a)) UnicodeString folded1String; const UChar *folded1; - int32_t folded1Length=ucase_toFullFolding(csp, c, &folded1, U_FOLD_CASE_DEFAULT); + int32_t folded1Length=ucase_toFullFolding(c, &folded1, U_FOLD_CASE_DEFAULT); if(folded1Length<0) { const Normalizer2Impl *nfkcImpl=Normalizer2Factory::getImpl(nfkc); if(nfkcImpl->getCompQuickCheck(nfkcImpl->getNorm16(c))!=UNORM_NO) { diff --git a/deps/icu-small/source/common/uprops.h b/deps/icu-small/source/common/uprops.h index 63c588088ad1c3..f5d69fe79cf42a 100644 --- a/deps/icu-small/source/common/uprops.h +++ b/deps/icu-small/source/common/uprops.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uprops.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ures_cnv.c b/deps/icu-small/source/common/ures_cnv.cpp similarity index 92% rename from deps/icu-small/source/common/ures_cnv.c rename to deps/icu-small/source/common/ures_cnv.cpp index a810fc08567144..43515fda282972 100644 --- a/deps/icu-small/source/common/ures_cnv.c +++ b/deps/icu-small/source/common/ures_cnv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ures_cnv.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -43,7 +43,7 @@ ures_openU(const UChar *myPath, } else { length=u_strlen(myPath); - if(length>=sizeof(pathBuffer)) { + if(length>=(int32_t)sizeof(pathBuffer)) { *status=U_ILLEGAL_ARGUMENT_ERROR; return NULL; } else if(uprv_isInvariantUString(myPath, length)) { @@ -61,7 +61,7 @@ ures_openU(const UChar *myPath, if(U_FAILURE(*status)) { return NULL; } - if(length>=sizeof(pathBuffer)) { + if(length>=(int32_t)sizeof(pathBuffer)) { /* not NUL-terminated - path too long */ *status=U_ILLEGAL_ARGUMENT_ERROR; return NULL; diff --git a/deps/icu-small/source/common/uresbund.cpp b/deps/icu-small/source/common/uresbund.cpp index 6813645c98b614..0dcbcaaf90d6bd 100644 --- a/deps/icu-small/source/common/uresbund.cpp +++ b/deps/icu-small/source/common/uresbund.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/uresdata.cpp b/deps/icu-small/source/common/uresdata.cpp index f775bcdffb57a7..a0b8d3ba904ad6 100644 --- a/deps/icu-small/source/common/uresdata.cpp +++ b/deps/icu-small/source/common/uresdata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * and others. All Rights Reserved. ******************************************************************************* * file name: uresdata.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -758,7 +758,9 @@ res_getTableItemByIndex(const ResourceData *pResData, Resource table, int32_t indexR, const char **key) { uint32_t offset=RES_GET_OFFSET(table); int32_t length; - U_ASSERT(indexR>=0); /* to ensure the index is not negative */ + if (indexR < 0) { + return RES_BOGUS; + } switch(RES_GET_TYPE(table)) { case URES_TABLE: { if (offset != 0) { /* empty if offset==0 */ @@ -836,7 +838,9 @@ UBool icu::ResourceTable::getKeyAndValue(int32_t i, U_CAPI Resource U_EXPORT2 res_getArrayItem(const ResourceData *pResData, Resource array, int32_t indexR) { uint32_t offset=RES_GET_OFFSET(array); - U_ASSERT(indexR>=0); /* to ensure the index is not negative */ + if (indexR < 0) { + return RES_BOGUS; + } switch(RES_GET_TYPE(array)) { case URES_ARRAY: { if (offset!=0) { /* empty if offset==0 */ @@ -923,14 +927,14 @@ res_findResource(const ResourceData *pResData, Resource r, char** path, const ch if(t2 == RES_BOGUS) { /* if we fail to get the resource by key, maybe we got an index */ indexR = uprv_strtol(pathP, &closeIndex, 10); - if(*closeIndex == 0) { + if(indexR >= 0 && *closeIndex == 0) { /* if we indeed have an index, try to get the item by index */ t2 = res_getTableItemByIndex(pResData, t1, indexR, key); - } + } // else t2 is already RES_BOGUS } } else if(URES_IS_ARRAY(type)) { indexR = uprv_strtol(pathP, &closeIndex, 10); - if(*closeIndex == 0) { + if(indexR >= 0 && *closeIndex == 0) { t2 = res_getArrayItem(pResData, t1, indexR); } else { t2 = RES_BOGUS; /* have an array, but don't have a valid index */ diff --git a/deps/icu-small/source/common/uresdata.h b/deps/icu-small/source/common/uresdata.h index ae7d9a817d2b2f..8d845e3dfcfc83 100644 --- a/deps/icu-small/source/common/uresdata.h +++ b/deps/icu-small/source/common/uresdata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: uresdata.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uresimp.h b/deps/icu-small/source/common/uresimp.h index 8339240a276b6f..e4f75c9f115d0e 100644 --- a/deps/icu-small/source/common/uresimp.h +++ b/deps/icu-small/source/common/uresimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ureslocs.h b/deps/icu-small/source/common/ureslocs.h index 85dd8fb4b7f211..f7c3344ef201a8 100644 --- a/deps/icu-small/source/common/ureslocs.h +++ b/deps/icu-small/source/common/ureslocs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/usc_impl.c b/deps/icu-small/source/common/usc_impl.cpp similarity index 98% rename from deps/icu-small/source/common/usc_impl.c rename to deps/icu-small/source/common/usc_impl.cpp index c2b2a3656c4ebb..d69880326a4cbd 100644 --- a/deps/icu-small/source/common/usc_impl.c +++ b/deps/icu-small/source/common/usc_impl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -197,7 +197,7 @@ uscript_openRun(const UChar *src, int32_t length, UErrorCode *pErrorCode) return NULL; } - result = uprv_malloc(sizeof (UScriptRun)); + result = (UScriptRun *)uprv_malloc(sizeof (UScriptRun)); if (result == NULL) { *pErrorCode = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/common/usc_impl.h b/deps/icu-small/source/common/usc_impl.h index 7c9c5e095052ff..44899649d4c315 100644 --- a/deps/icu-small/source/common/usc_impl.h +++ b/deps/icu-small/source/common/usc_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/uscript.c b/deps/icu-small/source/common/uscript.cpp similarity index 98% rename from deps/icu-small/source/common/uscript.c rename to deps/icu-small/source/common/uscript.cpp index 336e185799ab96..83b5f7ef168f7e 100644 --- a/deps/icu-small/source/common/uscript.c +++ b/deps/icu-small/source/common/uscript.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/uscript_props.cpp b/deps/icu-small/source/common/uscript_props.cpp index 20c7cdce2ffad1..f8ec5e361d222b 100644 --- a/deps/icu-small/source/common/uscript_props.cpp +++ b/deps/icu-small/source/common/uscript_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: uscript_props.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uset.cpp b/deps/icu-small/source/common/uset.cpp index f15d4a14ab7d81..75ff5ddff52d1a 100644 --- a/deps/icu-small/source/common/uset.cpp +++ b/deps/icu-small/source/common/uset.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uset.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uset_imp.h b/deps/icu-small/source/common/uset_imp.h index 8cb31edfcf779e..5f4a3113d9aaf7 100644 --- a/deps/icu-small/source/common/uset_imp.h +++ b/deps/icu-small/source/common/uset_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uset_imp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uset_props.cpp b/deps/icu-small/source/common/uset_props.cpp index cf772957ee5eac..b68175c1d23b14 100644 --- a/deps/icu-small/source/common/uset_props.cpp +++ b/deps/icu-small/source/common/uset_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uset_props.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/usetiter.cpp b/deps/icu-small/source/common/usetiter.cpp index 2be2079c513069..5d5d3c4e3d6200 100644 --- a/deps/icu-small/source/common/usetiter.cpp +++ b/deps/icu-small/source/common/usetiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ushape.cpp b/deps/icu-small/source/common/ushape.cpp index 4913a3ff573ce7..d7886ac06c6b9d 100644 --- a/deps/icu-small/source/common/ushape.cpp +++ b/deps/icu-small/source/common/ushape.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: ushape.cpp - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/usprep.cpp b/deps/icu-small/source/common/usprep.cpp index fb9c18b66bc83e..c4f831be2e4fe2 100644 --- a/deps/icu-small/source/common/usprep.cpp +++ b/deps/icu-small/source/common/usprep.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: usprep.cpp - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ustack.cpp b/deps/icu-small/source/common/ustack.cpp index 1de79ecfe3559c..fb314b0ebe54cd 100644 --- a/deps/icu-small/source/common/ustack.cpp +++ b/deps/icu-small/source/common/ustack.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ustr_cnv.cpp b/deps/icu-small/source/common/ustr_cnv.cpp index 4b845d5adca0e7..951864f4a6c7db 100644 --- a/deps/icu-small/source/common/ustr_cnv.cpp +++ b/deps/icu-small/source/common/ustr_cnv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ustr_cnv.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ustr_cnv.h b/deps/icu-small/source/common/ustr_cnv.h index e647356560e95f..12e86ea02f7264 100644 --- a/deps/icu-small/source/common/ustr_cnv.h +++ b/deps/icu-small/source/common/ustr_cnv.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ustr_cnv.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/ustr_imp.h b/deps/icu-small/source/common/ustr_imp.h index 21ee6cba624aac..eb5d0722585e4c 100644 --- a/deps/icu-small/source/common/ustr_imp.h +++ b/deps/icu-small/source/common/ustr_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ustr_imp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -18,23 +18,6 @@ #define __USTR_IMP_H__ #include "unicode/utypes.h" -#include "unicode/uiter.h" -#include "ucase.h" - -/** Simple declaration to avoid including unicode/ubrk.h. */ -#ifndef UBRK_TYPEDEF_UBREAK_ITERATOR -# define UBRK_TYPEDEF_UBREAK_ITERATOR - typedef struct UBreakIterator UBreakIterator; -#endif - -#ifndef U_COMPARE_IGNORE_CASE -/* see also unorm.h */ -/** - * Option bit for unorm_compare: - * Perform case-insensitive comparison. - */ -#define U_COMPARE_IGNORE_CASE 0x10000 -#endif /** * Internal option for unorm_cmpEquivFold() for strncmp style. @@ -53,211 +36,6 @@ uprv_strCompare(const UChar *s1, int32_t length1, const UChar *s2, int32_t length2, UBool strncmpStyle, UBool codePointOrder); -/** - * Internal API, used by u_strcasecmp() etc. - * Compare strings case-insensitively, - * in code point order or code unit order. - */ -U_CFUNC int32_t -u_strcmpFold(const UChar *s1, int32_t length1, - const UChar *s2, int32_t length2, - uint32_t options, - UErrorCode *pErrorCode); - -/** - * Interanl API, used for detecting length of - * shared prefix case-insensitively. - * @param s1 input string 1 - * @param length1 length of string 1, or -1 (NULL terminated) - * @param s2 input string 2 - * @param length2 length of string 2, or -1 (NULL terminated) - * @param options compare options - * @param matchLen1 (output) length of partial prefix match in s1 - * @param matchLen2 (output) length of partial prefix match in s2 - * @param pErrorCode receives error status - */ -U_CAPI void -u_caseInsensitivePrefixMatch(const UChar *s1, int32_t length1, - const UChar *s2, int32_t length2, - uint32_t options, - int32_t *matchLen1, int32_t *matchLen2, - UErrorCode *pErrorCode); - -/** - * Are the Unicode properties loaded? - * This must be used before internal functions are called that do - * not perform this check. - * Generate a debug assertion failure if data is not loaded. - */ -U_CFUNC UBool -uprv_haveProperties(UErrorCode *pErrorCode); - -/** - * Load the Unicode property data. - * Intended primarily for use from u_init(). - * Has no effect if property data is already loaded. - * NOT thread safe. - */ -/*U_CFUNC int8_t -uprv_loadPropsData(UErrorCode *errorCode);*/ - -/* - * Internal string casing functions implementing - * ustring.h/ustrcase.c and UnicodeString case mapping functions. - */ - -struct UCaseMap { - const UCaseProps *csp; -#if !UCONFIG_NO_BREAK_ITERATION - UBreakIterator *iter; /* We adopt the iterator, so we own it. */ -#endif - char locale[32]; - int32_t locCache; - uint32_t options; -}; - -#ifndef __UCASEMAP_H__ -typedef struct UCaseMap UCaseMap; -#endif - -#if UCONFIG_NO_BREAK_ITERATION -# define UCASEMAP_INITIALIZER { NULL, { 0 }, 0, 0 } -#else -# define UCASEMAP_INITIALIZER { NULL, NULL, { 0 }, 0, 0 } -#endif - -U_CFUNC void -ustrcase_setTempCaseMapLocale(UCaseMap *csm, const char *locale); - -#ifndef U_STRING_CASE_MAPPER_DEFINED -#define U_STRING_CASE_MAPPER_DEFINED - -/** - * String case mapping function type, used by ustrcase_map(). - * All error checking must be done. - * The UCaseMap must be fully initialized, with locale and/or iter set as needed. - * src and dest must not overlap. - */ -typedef int32_t U_CALLCONV -UStringCaseMapper(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - -#endif - -/** Implements UStringCaseMapper. */ -U_CFUNC int32_t U_CALLCONV -ustrcase_internalToLower(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - -/** Implements UStringCaseMapper. */ -U_CFUNC int32_t U_CALLCONV -ustrcase_internalToUpper(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - -#if !UCONFIG_NO_BREAK_ITERATION - -/** Implements UStringCaseMapper. */ -U_CFUNC int32_t U_CALLCONV -ustrcase_internalToTitle(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - -#endif - -/** Implements UStringCaseMapper. */ -U_CFUNC int32_t U_CALLCONV -ustrcase_internalFold(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode); - -/** - * Implements argument checking and buffer handling - * for string case mapping as a common function. - */ -U_CFUNC int32_t -ustrcase_map(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UStringCaseMapper *stringCaseMapper, - UErrorCode *pErrorCode); - -/** - * UTF-8 string case mapping function type, used by ucasemap_mapUTF8(). - * UTF-8 version of UStringCaseMapper. - * All error checking must be done. - * The UCaseMap must be fully initialized, with locale and/or iter set as needed. - * src and dest must not overlap. - */ -typedef int32_t U_CALLCONV -UTF8CaseMapper(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode); - -/** Implements UTF8CaseMapper. */ -U_CFUNC int32_t U_CALLCONV -ucasemap_internalUTF8ToTitle(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UErrorCode *pErrorCode); - -/** - * Implements argument checking and buffer handling - * for UTF-8 string case mapping as a common function. - */ -U_CFUNC int32_t -ucasemap_mapUTF8(const UCaseMap *csm, - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, - UTF8CaseMapper *stringCaseMapper, - UErrorCode *pErrorCode); - -#ifdef __cplusplus - -U_NAMESPACE_BEGIN -namespace GreekUpper { - -// Data bits. -static const uint32_t UPPER_MASK = 0x3ff; -static const uint32_t HAS_VOWEL = 0x1000; -static const uint32_t HAS_YPOGEGRAMMENI = 0x2000; -static const uint32_t HAS_ACCENT = 0x4000; -static const uint32_t HAS_DIALYTIKA = 0x8000; -// Further bits during data building and processing, not stored in the data map. -static const uint32_t HAS_COMBINING_DIALYTIKA = 0x10000; -static const uint32_t HAS_OTHER_GREEK_DIACRITIC = 0x20000; - -static const uint32_t HAS_VOWEL_AND_ACCENT = HAS_VOWEL | HAS_ACCENT; -static const uint32_t HAS_VOWEL_AND_ACCENT_AND_DIALYTIKA = - HAS_VOWEL_AND_ACCENT | HAS_DIALYTIKA; -static const uint32_t HAS_EITHER_DIALYTIKA = HAS_DIALYTIKA | HAS_COMBINING_DIALYTIKA; - -// State bits. -static const uint32_t AFTER_CASED = 1; -static const uint32_t AFTER_VOWEL_WITH_ACCENT = 2; - -uint32_t getLetterData(UChar32 c); - -/** - * Returns a non-zero value for each of the Greek combining diacritics - * listed in The Unicode Standard, version 8, chapter 7.2 Greek, - * plus some perispomeni look-alikes. - */ -uint32_t getDiacriticData(UChar32 c); - -} // namespace GreekUpper -U_NAMESPACE_END - -#endif // __cplusplus - U_CAPI int32_t U_EXPORT2 ustr_hashUCharsN(const UChar *str, int32_t length); diff --git a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp index 63808776199cc4..0b2ba02064b324 100644 --- a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ustr_titlecase_brkiter.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -22,30 +22,17 @@ #if !UCONFIG_NO_BREAK_ITERATION #include "unicode/brkiter.h" +#include "unicode/casemap.h" +#include "unicode/localpointer.h" #include "unicode/ubrk.h" #include "unicode/ucasemap.h" #include "cmemory.h" #include "ucase.h" -#include "ustr_imp.h" +#include "ucasemap_imp.h" -/* functions available in the common library (for unistr_case.cpp) */ +U_NAMESPACE_USE -/* - * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. - * Do this fast because it is called with every function call. - * Duplicate of the same function in ustrcase.cpp, to keep it inline. - */ -static inline void -setTempCaseMap(UCaseMap *csm, const char *locale) { - if(csm->csp==NULL) { - csm->csp=ucase_getSingleton(); - } - if(locale!=NULL && locale[0]==0) { - csm->locale[0]=0; - } else { - ustrcase_setTempCaseMapLocale(csm, locale); - } -} +/* functions available in the common library (for unistr_case.cpp) */ /* public API functions */ @@ -55,39 +42,73 @@ u_strToTitle(UChar *dest, int32_t destCapacity, UBreakIterator *titleIter, const char *locale, UErrorCode *pErrorCode) { - UCaseMap csm=UCASEMAP_INITIALIZER; - setTempCaseMap(&csm, locale); + LocalPointer ownedIter; + BreakIterator *iter; if(titleIter!=NULL) { - ubrk_setText(csm.iter=titleIter, src, srcLength, pErrorCode); + iter=reinterpret_cast(titleIter); } else { - csm.iter=ubrk_open(UBRK_WORD, csm.locale, src, srcLength, pErrorCode); + iter=BreakIterator::createWordInstance(Locale(locale), *pErrorCode); + ownedIter.adoptInstead(iter); + } + if(U_FAILURE(*pErrorCode)) { + return 0; } - int32_t length=ustrcase_map( - &csm, + UnicodeString s(srcLength<0, src, srcLength); + iter->setText(s); + return ustrcase_mapWithOverlap( + ustrcase_getCaseLocale(locale), 0, iter, dest, destCapacity, src, srcLength, - ustrcase_internalToTitle, pErrorCode); - if(titleIter==NULL && csm.iter!=NULL) { - ubrk_close(csm.iter); + ustrcase_internalToTitle, *pErrorCode); +} + +U_NAMESPACE_BEGIN + +int32_t CaseMap::toTitle( + const char *locale, uint32_t options, BreakIterator *iter, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + LocalPointer ownedIter; + if(iter==NULL) { + iter=BreakIterator::createWordInstance(Locale(locale), errorCode); + ownedIter.adoptInstead(iter); + } + if(U_FAILURE(errorCode)) { + return 0; } - return length; + UnicodeString s(srcLength<0, src, srcLength); + iter->setText(s); + return ustrcase_map( + ustrcase_getCaseLocale(locale), options, iter, + dest, destCapacity, + src, srcLength, + ustrcase_internalToTitle, edits, errorCode); } +U_NAMESPACE_END + U_CAPI int32_t U_EXPORT2 ucasemap_toTitle(UCaseMap *csm, UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, UErrorCode *pErrorCode) { - if(csm->iter!=NULL) { - ubrk_setText(csm->iter, src, srcLength, pErrorCode); - } else { - csm->iter=ubrk_open(UBRK_WORD, csm->locale, src, srcLength, pErrorCode); + if (U_FAILURE(*pErrorCode)) { + return 0; + } + if (csm->iter == NULL) { + csm->iter = BreakIterator::createWordInstance(Locale(csm->locale), *pErrorCode); + } + if (U_FAILURE(*pErrorCode)) { + return 0; } + UnicodeString s(srcLength<0, src, srcLength); + csm->iter->setText(s); return ustrcase_map( - csm, + csm->caseLocale, csm->options, csm->iter, dest, destCapacity, src, srcLength, - ustrcase_internalToTitle, pErrorCode); + ustrcase_internalToTitle, NULL, *pErrorCode); } #endif // !UCONFIG_NO_BREAK_ITERATION diff --git a/deps/icu-small/source/common/ustr_wcs.cpp b/deps/icu-small/source/common/ustr_wcs.cpp index 572e41290f59f8..8b6e99221ee253 100644 --- a/deps/icu-small/source/common/ustr_wcs.cpp +++ b/deps/icu-small/source/common/ustr_wcs.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ustr_wcs.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -254,7 +254,7 @@ u_strToWCS(wchar_t *dest, srcLength = u_strlen(src); } if(0 < srcLength && srcLength <= destCapacity){ - u_memcpy(dest, src, srcLength); + u_memcpy((UChar *)dest, src, srcLength); } if(pDestLength){ *pDestLength = srcLength; @@ -509,7 +509,7 @@ u_strFromWCS(UChar *dest, srcLength = u_strlen((const UChar *)src); } if(0 < srcLength && srcLength <= destCapacity){ - u_memcpy(dest, src, srcLength); + u_memcpy(dest, (const UChar *)src, srcLength); } if(pDestLength){ *pDestLength = srcLength; diff --git a/deps/icu-small/source/common/ustrcase.cpp b/deps/icu-small/source/common/ustrcase.cpp index be5c988bd10804..b12e7a7c0b3a10 100644 --- a/deps/icu-small/source/common/ustrcase.cpp +++ b/deps/icu-small/source/common/ustrcase.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ustrcase.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -22,6 +22,8 @@ #include "unicode/utypes.h" #include "unicode/brkiter.h" +#include "unicode/casemap.h" +#include "unicode/edits.h" #include "unicode/ustring.h" #include "unicode/ucasemap.h" #include "unicode/ubrk.h" @@ -29,9 +31,30 @@ #include "unicode/utf16.h" #include "cmemory.h" #include "ucase.h" +#include "ucasemap_imp.h" #include "ustr_imp.h" #include "uassert.h" +U_NAMESPACE_BEGIN + +namespace { + +int32_t checkOverflowAndEditsError(int32_t destIndex, int32_t destCapacity, + Edits *edits, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + if (destIndex > destCapacity) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + } else if (edits != NULL) { + edits->copyErrorTo(errorCode); + } + } + return destIndex; +} + +} // namespace + +U_NAMESPACE_END + U_NAMESPACE_USE /* string casing ------------------------------------------------------------ */ @@ -39,21 +62,43 @@ U_NAMESPACE_USE /* Appends a full case mapping result, see UCASE_MAX_STRING_LENGTH. */ static inline int32_t appendResult(UChar *dest, int32_t destIndex, int32_t destCapacity, - int32_t result, const UChar *s) { + int32_t result, const UChar *s, + int32_t cpLength, uint32_t options, icu::Edits *edits) { UChar32 c; int32_t length; /* decode the result */ if(result<0) { /* (not) original code point */ + if(edits!=NULL) { + edits->addUnchanged(cpLength); + if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { + return destIndex; + } + } c=~result; - length=U16_LENGTH(c); - } else if(result<=UCASE_MAX_STRING_LENGTH) { - c=U_SENTINEL; - length=result; + if(destIndexaddReplace(cpLength, 1); + } + return destIndex; + } else { + c=result; + length=U16_LENGTH(c); + } + if(edits!=NULL) { + edits->addReplace(cpLength, length); + } } if(length>(INT32_MAX-destIndex)) { return -1; // integer overflow @@ -99,9 +144,15 @@ appendUChar(UChar *dest, int32_t destIndex, int32_t destCapacity, UChar c) { } static inline int32_t -appendString(UChar *dest, int32_t destIndex, int32_t destCapacity, - const UChar *s, int32_t length) { +appendUnchanged(UChar *dest, int32_t destIndex, int32_t destCapacity, + const UChar *s, int32_t length, uint32_t options, icu::Edits *edits) { if(length>0) { + if(edits!=NULL) { + edits->addUnchanged(length); + if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { + return destIndex; + } + } if(length>(INT32_MAX-destIndex)) { return -1; // integer overflow } @@ -150,84 +201,66 @@ utf16_caseContextIterator(void *context, int8_t dir) { * context [0..srcLength[ into account. */ static int32_t -_caseMap(const UCaseMap *csm, UCaseMapFull *map, +_caseMap(int32_t caseLocale, uint32_t options, UCaseMapFull *map, UChar *dest, int32_t destCapacity, const UChar *src, UCaseContext *csc, int32_t srcStart, int32_t srcLimit, - UErrorCode *pErrorCode) { - const UChar *s; - UChar32 c, c2 = 0; - int32_t srcIndex, destIndex; - int32_t locCache; - - locCache=csm->locCache; - + icu::Edits *edits, + UErrorCode &errorCode) { /* case mapping loop */ - srcIndex=srcStart; - destIndex=0; + int32_t srcIndex=srcStart; + int32_t destIndex=0; while(srcIndexcpStart=srcIndex; + int32_t cpStart; + csc->cpStart=cpStart=srcIndex; + UChar32 c; U16_NEXT(src, srcIndex, srcLimit, c); csc->cpLimit=srcIndex; - c=map(csm->csp, c, utf16_caseContextIterator, csc, &s, csm->locale, &locCache); - if((destIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } return destIndex; } #if !UCONFIG_NO_BREAK_ITERATION U_CFUNC int32_t U_CALLCONV -ustrcase_internalToTitle(const UCaseMap *csm, +ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *iter, UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - const UChar *s; - UChar32 c; - int32_t prev, titleStart, titleLimit, idx, destIndex; - UBool isFirstIndex; - - if(U_FAILURE(*pErrorCode)) { + icu::Edits *edits, + UErrorCode &errorCode) { + if(U_FAILURE(errorCode)) { return 0; } - // Use the C++ abstract base class to minimize dependencies. - // TODO: Change UCaseMap.iter to store a BreakIterator directly. - BreakIterator *bi=reinterpret_cast(csm->iter); - /* set up local variables */ - int32_t locCache=csm->locCache; UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - destIndex=0; - prev=0; - isFirstIndex=TRUE; + int32_t destIndex=0; + int32_t prev=0; + UBool isFirstIndex=TRUE; /* titlecasing loop */ while(prevfirst(); + index=iter->first(); } else { - idx=bi->next(); + index=iter->next(); } - if(idx==UBRK_DONE || idx>srcLength) { - idx=srcLength; + if(index==UBRK_DONE || index>srcLength) { + index=srcLength; } /* @@ -243,29 +276,32 @@ ustrcase_internalToTitle(const UCaseMap *csm, * b) first case letter (titlecase) [titleStart..titleLimit[ * c) subsequent characters (lowercase) [titleLimit..index[ */ - if(prevoptions&U_TITLECASE_NO_BREAK_ADJUSTMENT)==0 && UCASE_NONE==ucase_getType(csm->csp, c)) { + int32_t titleStart=prev; + int32_t titleLimit=prev; + UChar32 c; + U16_NEXT(src, titleLimit, index, c); + if((options&U_TITLECASE_NO_BREAK_ADJUSTMENT)==0 && UCASE_NONE==ucase_getType(c)) { /* Adjust the titlecasing index (titleStart) to the next cased character. */ for(;;) { titleStart=titleLimit; - if(titleLimit==idx) { + if(titleLimit==index) { /* * only uncased characters in [prev..index[ * stop with titleStart==titleLimit==index */ break; } - U16_NEXT(src, titleLimit, idx, c); - if(UCASE_NONE!=ucase_getType(csm->csp, c)) { + U16_NEXT(src, titleLimit, index, c); + if(UCASE_NONE!=ucase_getType(c)) { break; /* cased letter at [titleStart..titleLimit[ */ } } - destIndex=appendString(dest, destIndex, destCapacity, src+prev, titleStart-prev); + destIndex=appendUnchanged(dest, destIndex, destCapacity, + src+prev, titleStart-prev, options, edits); if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } } @@ -274,48 +310,64 @@ ustrcase_internalToTitle(const UCaseMap *csm, /* titlecase c which is from [titleStart..titleLimit[ */ csc.cpStart=titleStart; csc.cpLimit=titleLimit; - c=ucase_toFullTitle(csm->csp, c, utf16_caseContextIterator, &csc, &s, csm->locale, &locCache); - destIndex=appendResult(dest, destIndex, destCapacity, c, s); + const UChar *s; + c=ucase_toFullTitle(c, utf16_caseContextIterator, &csc, &s, caseLocale); + destIndex=appendResult(dest, destIndex, destCapacity, c, s, + titleLimit-titleStart, options, edits); if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } /* Special case Dutch IJ titlecasing */ - if (titleStart+1 < idx && - ucase_getCaseLocale(csm->locale,&locCache) == UCASE_LOC_DUTCH && - (src[titleStart] == 0x0049 || src[titleStart] == 0x0069) && - (src[titleStart+1] == 0x004A || src[titleStart+1] == 0x006A)) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A); - if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (titleStart+1 < index && + caseLocale == UCASE_LOC_DUTCH && + (src[titleStart] == 0x0049 || src[titleStart] == 0x0069)) { + if (src[titleStart+1] == 0x006A) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A); + if(destIndex<0) { + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + if(edits!=NULL) { + edits->addReplace(1, 1); + } + titleLimit++; + } else if (src[titleStart+1] == 0x004A) { + // Keep the capital J from getting lowercased. + destIndex=appendUnchanged(dest, destIndex, destCapacity, + src+titleStart+1, 1, options, edits); + if(destIndex<0) { + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } + titleLimit++; } - titleLimit++; } /* lowercase [titleLimit..index[ */ - if(titleLimitoptions&U_TITLECASE_NO_LOWERCASE)==0) { + if(titleLimitdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } #endif // !UCONFIG_NO_BREAK_ITERATION @@ -791,11 +840,11 @@ uint32_t getDiacriticData(UChar32 c) { } } -UBool isFollowedByCasedLetter(const UCaseProps *csp, const UChar *s, int32_t i, int32_t length) { +UBool isFollowedByCasedLetter(const UChar *s, int32_t i, int32_t length) { while (i < length) { UChar32 c; U16_NEXT(s, i, length, c); - int32_t type = ucase_getTypeOrIgnorable(csp, c); + int32_t type = ucase_getTypeOrIgnorable(c); if ((type & UCASE_IGNORABLE) != 0) { // Case-ignorable, continue with the loop. } else if (type != UCASE_NONE) { @@ -813,11 +862,11 @@ UBool isFollowedByCasedLetter(const UCaseProps *csp, const UChar *s, int32_t i, * for each character. * TODO: Try to re-consolidate one way or another with the non-Greek function. */ -int32_t toUpper(const UCaseMap *csm, +int32_t toUpper(uint32_t options, UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - int32_t locCache = UCASE_LOC_GREEK; + Edits *edits, + UErrorCode &errorCode) { int32_t destIndex=0; uint32_t state = 0; for (int32_t i = 0; i < srcLength;) { @@ -825,7 +874,7 @@ int32_t toUpper(const UCaseMap *csm, UChar32 c; U16_NEXT(src, nextIndex, srcLength, c); uint32_t nextState = 0; - int32_t type = ucase_getTypeOrIgnorable(csm->csp, c); + int32_t type = ucase_getTypeOrIgnorable(c); if ((type & UCASE_IGNORABLE) != 0) { // c is case-ignorable nextState |= (state & AFTER_CASED); @@ -872,7 +921,7 @@ int32_t toUpper(const UCaseMap *csm, (data & HAS_ACCENT) != 0 && numYpogegrammeni == 0 && (state & AFTER_CASED) == 0 && - !isFollowedByCasedLetter(csm->csp, src, nextIndex, srcLength)) { + !isFollowedByCasedLetter(src, nextIndex, srcLength)) { // Keep disjunctive "or" with (only) a tonos. // We use the same "word boundary" conditions as for the Final_Sigma test. if (i == nextIndex) { @@ -890,43 +939,67 @@ int32_t toUpper(const UCaseMap *csm, data &= ~HAS_EITHER_DIALYTIKA; } } - destIndex=appendUChar(dest, destIndex, destCapacity, (UChar)upper); - if (destIndex >= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x308); // restore or add a dialytika - } - if (destIndex >= 0 && addTonos) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x301); - } - while (destIndex >= 0 && numYpogegrammeni > 0) { - destIndex=appendUChar(dest, destIndex, destCapacity, 0x399); - --numYpogegrammeni; - } - if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + + UBool change = TRUE; + if (edits != NULL) { + // Find out first whether we are changing the text. + change = src[i] != upper || numYpogegrammeni > 0; + int32_t i2 = i + 1; + if ((data & HAS_EITHER_DIALYTIKA) != 0) { + change |= i2 >= nextIndex || src[i2] != 0x308; + ++i2; + } + if (addTonos) { + change |= i2 >= nextIndex || src[i2] != 0x301; + ++i2; + } + int32_t oldLength = nextIndex - i; + int32_t newLength = (i2 - i) + numYpogegrammeni; + change |= oldLength != newLength; + if (change) { + if (edits != NULL) { + edits->addReplace(oldLength, newLength); + } + } else { + if (edits != NULL) { + edits->addUnchanged(oldLength); + } + // Write unchanged text? + change = (options & UCASEMAP_OMIT_UNCHANGED_TEXT) == 0; + } } - } else { - const UChar *s; - UChar32 c2 = 0; - c=ucase_toFullUpper(csm->csp, c, NULL, NULL, &s, csm->locale, &locCache); - if((destIndex= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x308); // restore or add a dialytika + } + if (destIndex >= 0 && addTonos) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x301); + } + while (destIndex >= 0 && numYpogegrammeni > 0) { + destIndex=appendUChar(dest, destIndex, destCapacity, 0x399); + --numYpogegrammeni; + } if(destIndex<0) { - *pErrorCode=U_INDEX_OUTOFBOUNDS_ERROR; + errorCode=U_INDEX_OUTOFBOUNDS_ERROR; return 0; } } + } else { + const UChar *s; + c=ucase_toFullUpper(c, NULL, NULL, &s, UCASE_LOC_GREEK); + destIndex = appendResult(dest, destIndex, destCapacity, c, s, + nextIndex - i, options, edits); + if (destIndex < 0) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return 0; + } } i = nextIndex; state = nextState; } - if(destIndex>destCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } return destIndex; } @@ -936,94 +1009,128 @@ U_NAMESPACE_END /* functions available in the common library (for unistr_case.cpp) */ U_CFUNC int32_t U_CALLCONV -ustrcase_internalToLower(const UCaseMap *csm, +ustrcase_internalToLower(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { + icu::Edits *edits, + UErrorCode &errorCode) { UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - return _caseMap( - csm, ucase_toFullLower, + int32_t destIndex = _caseMap( + caseLocale, options, ucase_toFullLower, dest, destCapacity, src, &csc, 0, srcLength, - pErrorCode); + edits, errorCode); + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } U_CFUNC int32_t U_CALLCONV -ustrcase_internalToUpper(const UCaseMap *csm, +ustrcase_internalToUpper(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - int32_t locCache = csm->locCache; - if (ucase_getCaseLocale(csm->locale, &locCache) == UCASE_LOC_GREEK) { - return GreekUpper::toUpper(csm, dest, destCapacity, src, srcLength, pErrorCode); + icu::Edits *edits, + UErrorCode &errorCode) { + int32_t destIndex; + if (caseLocale == UCASE_LOC_GREEK) { + destIndex = GreekUpper::toUpper(options, dest, destCapacity, + src, srcLength, edits, errorCode); + } else { + UCaseContext csc=UCASECONTEXT_INITIALIZER; + csc.p=(void *)src; + csc.limit=srcLength; + destIndex = _caseMap( + caseLocale, options, ucase_toFullUpper, + dest, destCapacity, + src, &csc, 0, srcLength, + edits, errorCode); } - UCaseContext csc=UCASECONTEXT_INITIALIZER; - csc.p=(void *)src; - csc.limit=srcLength; - return _caseMap( - csm, ucase_toFullUpper, - dest, destCapacity, - src, &csc, 0, srcLength, - pErrorCode); + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } -static int32_t -ustr_foldCase(const UCaseProps *csp, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - uint32_t options, - UErrorCode *pErrorCode) { - int32_t srcIndex, destIndex; - - const UChar *s; - UChar32 c, c2 = 0; - +U_CFUNC int32_t U_CALLCONV +ustrcase_internalFold(int32_t /* caseLocale */, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + icu::Edits *edits, + UErrorCode &errorCode) { /* case mapping loop */ - srcIndex=destIndex=0; - while(srcIndexdestCapacity) { - *pErrorCode=U_BUFFER_OVERFLOW_ERROR; - } - return destIndex; -} - -U_CFUNC int32_t U_CALLCONV -ustrcase_internalFold(const UCaseMap *csm, - UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UErrorCode *pErrorCode) { - return ustr_foldCase(csm->csp, dest, destCapacity, src, srcLength, csm->options, pErrorCode); + return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } U_CFUNC int32_t -ustrcase_map(const UCaseMap *csm, +ustrcase_map(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, UStringCaseMapper *stringCaseMapper, - UErrorCode *pErrorCode) { + icu::Edits *edits, + UErrorCode &errorCode) { + int32_t destLength; + + /* check argument values */ + if(U_FAILURE(errorCode)) { + return 0; + } + if( destCapacity<0 || + (dest==NULL && destCapacity>0) || + src==NULL || + srcLength<-1 + ) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + /* get the string length */ + if(srcLength==-1) { + srcLength=u_strlen(src); + } + + /* check for overlapping source and destination */ + if( dest!=NULL && + ((src>=dest && src<(dest+destCapacity)) || + (dest>=src && dest<(src+srcLength))) + ) { + errorCode=U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + + if(edits!=NULL) { + edits->reset(); + } + destLength=stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + dest, destCapacity, src, srcLength, edits, errorCode); + return u_terminateUChars(dest, destCapacity, destLength, &errorCode); +} + +U_CFUNC int32_t +ustrcase_mapWithOverlap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UStringCaseMapper *stringCaseMapper, + UErrorCode &errorCode) { UChar buffer[300]; UChar *temp; int32_t destLength; /* check argument values */ - if(U_FAILURE(*pErrorCode)) { + if(U_FAILURE(errorCode)) { return 0; } if( destCapacity<0 || @@ -1031,7 +1138,7 @@ ustrcase_map(const UCaseMap *csm, src==NULL || srcLength<-1 ) { - *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; + errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } @@ -1053,7 +1160,7 @@ ustrcase_map(const UCaseMap *csm, /* allocate a buffer */ temp=(UChar *)uprv_malloc(destCapacity*U_SIZEOF_UCHAR); if(temp==NULL) { - *pErrorCode=U_MEMORY_ALLOCATION_ERROR; + errorCode=U_MEMORY_ALLOCATION_ERROR; return 0; } } @@ -1061,21 +1168,19 @@ ustrcase_map(const UCaseMap *csm, temp=dest; } - destLength=stringCaseMapper(csm, temp, destCapacity, src, srcLength, pErrorCode); + destLength=stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + temp, destCapacity, src, srcLength, NULL, errorCode); if(temp!=dest) { /* copy the result string to the destination buffer */ - if(destLength>0) { - int32_t copyLength= destLength<=destCapacity ? destLength : destCapacity; - if(copyLength>0) { - u_memmove(dest, temp, copyLength); - } + if (U_SUCCESS(errorCode) && 0 < destLength && destLength <= destCapacity) { + u_memmove(dest, temp, destLength); } if(temp!=buffer) { uprv_free(temp); } } - return u_terminateUChars(dest, destCapacity, destLength, pErrorCode); + return u_terminateUChars(dest, destCapacity, destLength, &errorCode); } /* public API functions */ @@ -1085,16 +1190,29 @@ u_strFoldCase(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, uint32_t options, UErrorCode *pErrorCode) { - UCaseMap csm=UCASEMAP_INITIALIZER; - csm.csp=ucase_getSingleton(); - csm.options=options; + return ustrcase_mapWithOverlap( + UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ustrcase_internalFold, *pErrorCode); +} + +U_NAMESPACE_BEGIN + +int32_t CaseMap::fold( + uint32_t options, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { return ustrcase_map( - &csm, + UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL dest, destCapacity, src, srcLength, - ustrcase_internalFold, pErrorCode); + ustrcase_internalFold, edits, errorCode); } +U_NAMESPACE_END + /* case-insensitive string comparisons -------------------------------------- */ /* @@ -1134,8 +1252,6 @@ static int32_t _cmpFold( UErrorCode *pErrorCode) { int32_t cmpRes = 0; - const UCaseProps *csp; - /* current-level start/limit - s1/s2 as current */ const UChar *start1, *start2, *limit1, *limit2; @@ -1167,7 +1283,6 @@ static int32_t _cmpFold( * assume that at least the option U_COMPARE_IGNORE_CASE is set * otherwise this function would have to behave exactly as uprv_strCompare() */ - csp=ucase_getSingleton(); if(U_FAILURE(*pErrorCode)) { return 0; } @@ -1349,7 +1464,7 @@ static int32_t _cmpFold( */ if( level1==0 && - (length=ucase_toFullFolding(csp, (UChar32)cp1, &p, options))>=0 + (length=ucase_toFullFolding((UChar32)cp1, &p, options))>=0 ) { /* cp1 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c1)) { @@ -1395,7 +1510,7 @@ static int32_t _cmpFold( } if( level2==0 && - (length=ucase_toFullFolding(csp, (UChar32)cp2, &p, options))>=0 + (length=ucase_toFullFolding((UChar32)cp2, &p, options))>=0 ) { /* cp2 case-folds to the code point "length" or to p[length] */ if(U_IS_SURROGATE(c2)) { diff --git a/deps/icu-small/source/common/ustrcase_locale.cpp b/deps/icu-small/source/common/ustrcase_locale.cpp index 78f4bbd7a2fe7f..2ecd24f03ec02e 100644 --- a/deps/icu-small/source/common/ustrcase_locale.cpp +++ b/deps/icu-small/source/common/ustrcase_locale.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ustrcase_locale.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -18,66 +18,24 @@ */ #include "unicode/utypes.h" +#include "uassert.h" +#include "unicode/brkiter.h" +#include "unicode/casemap.h" #include "unicode/ucasemap.h" #include "unicode/uloc.h" #include "unicode/ustring.h" #include "ucase.h" -#include "ustr_imp.h" +#include "ucasemap_imp.h" -U_CFUNC void -ustrcase_setTempCaseMapLocale(UCaseMap *csm, const char *locale) { - /* - * We could call ucasemap_setLocale(), but here we really only care about - * the initial language subtag, we need not return the real string via - * ucasemap_getLocale(), and we don't care about only getting "x" from - * "x-some-thing" etc. - * - * We ignore locales with a longer-than-3 initial subtag. - * - * We also do not fill in the locCache because it is rarely used, - * and not worth setting unless we reuse it for many case mapping operations. - * (That's why UCaseMap was created.) - */ - int i; - char c; - - /* the internal functions require locale!=NULL */ - if(locale==NULL) { - // Do not call uprv_getDefaultLocaleID() because that does not see - // changes to the default locale via uloc_setDefault(). - // It would also be inefficient if used frequently because uprv_getDefaultLocaleID() - // does not cache the locale ID. - // - // Unfortunately, uloc_getDefault() has many dependencies. - // We only care about a small set of language subtags, - // and we do not need the locale ID to be canonicalized. - // - // Best is to not call case mapping functions with a NULL locale ID. - locale=uloc_getDefault(); - } - for(i=0; i<4 && (c=locale[i])!=0 && c!='-' && c!='_'; ++i) { - csm->locale[i]=c; - } - if(i<=3) { - csm->locale[i]=0; /* Up to 3 non-separator characters. */ - } else { - csm->locale[0]=0; /* Longer-than-3 initial subtag: Ignore. */ - } -} - -/* - * Set parameters on an empty UCaseMap, for UCaseMap-less API functions. - * Do this fast because it is called with every function call. - */ -static inline void -setTempCaseMap(UCaseMap *csm, const char *locale) { - if(csm->csp==NULL) { - csm->csp=ucase_getSingleton(); +U_CFUNC int32_t +ustrcase_getCaseLocale(const char *locale) { + if (locale == NULL) { + locale = uloc_getDefault(); } - if(locale!=NULL && locale[0]==0) { - csm->locale[0]=0; + if (*locale == 0) { + return UCASE_LOC_ROOT; } else { - ustrcase_setTempCaseMapLocale(csm, locale); + return ucase_getCaseLocale(locale); } } @@ -88,13 +46,11 @@ u_strToLower(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, const char *locale, UErrorCode *pErrorCode) { - UCaseMap csm=UCASEMAP_INITIALIZER; - setTempCaseMap(&csm, locale); - return ustrcase_map( - &csm, + return ustrcase_mapWithOverlap( + ustrcase_getCaseLocale(locale), 0, UCASEMAP_BREAK_ITERATOR_NULL dest, destCapacity, src, srcLength, - ustrcase_internalToLower, pErrorCode); + ustrcase_internalToLower, *pErrorCode); } U_CAPI int32_t U_EXPORT2 @@ -102,11 +58,37 @@ u_strToUpper(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, const char *locale, UErrorCode *pErrorCode) { - UCaseMap csm=UCASEMAP_INITIALIZER; - setTempCaseMap(&csm, locale); + return ustrcase_mapWithOverlap( + ustrcase_getCaseLocale(locale), 0, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ustrcase_internalToUpper, *pErrorCode); +} + +U_NAMESPACE_BEGIN + +int32_t CaseMap::toLower( + const char *locale, uint32_t options, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { + return ustrcase_map( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + dest, destCapacity, + src, srcLength, + ustrcase_internalToLower, edits, errorCode); +} + +int32_t CaseMap::toUpper( + const char *locale, uint32_t options, + const UChar *src, int32_t srcLength, + UChar *dest, int32_t destCapacity, Edits *edits, + UErrorCode &errorCode) { return ustrcase_map( - &csm, + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL dest, destCapacity, src, srcLength, - ustrcase_internalToUpper, pErrorCode); + ustrcase_internalToUpper, edits, errorCode); } + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/ustrenum.cpp b/deps/icu-small/source/common/ustrenum.cpp index 699ce32cfef242..8be79c98999256 100644 --- a/deps/icu-small/source/common/ustrenum.cpp +++ b/deps/icu-small/source/common/ustrenum.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ustrenum.h b/deps/icu-small/source/common/ustrenum.h index 868fddcb53527d..582727cd1f742b 100644 --- a/deps/icu-small/source/common/ustrenum.h +++ b/deps/icu-small/source/common/ustrenum.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ustrfmt.c b/deps/icu-small/source/common/ustrfmt.cpp similarity index 96% rename from deps/icu-small/source/common/ustrfmt.c rename to deps/icu-small/source/common/ustrfmt.cpp index c7805d8d2a3062..1a9b15a59febce 100644 --- a/deps/icu-small/source/common/ustrfmt.c +++ b/deps/icu-small/source/common/ustrfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ustrfmt.h b/deps/icu-small/source/common/ustrfmt.h index 3cc3d69add5e05..53eb0557e45a18 100644 --- a/deps/icu-small/source/common/ustrfmt.h +++ b/deps/icu-small/source/common/ustrfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/ustring.cpp b/deps/icu-small/source/common/ustring.cpp index 8361fe37077fbd..a1a51f4b1e1734 100644 --- a/deps/icu-small/source/common/ustring.cpp +++ b/deps/icu-small/source/common/ustring.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -19,6 +19,7 @@ #include "unicode/utypes.h" #include "unicode/putil.h" +#include "unicode/uchar.h" #include "unicode/ustring.h" #include "unicode/utf16.h" #include "cstring.h" diff --git a/deps/icu-small/source/common/ustrtrns.cpp b/deps/icu-small/source/common/ustrtrns.cpp index b61d771fafcdc2..98d92fc4ab693b 100644 --- a/deps/icu-small/source/common/ustrtrns.cpp +++ b/deps/icu-small/source/common/ustrtrns.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/utext.cpp b/deps/icu-small/source/common/utext.cpp index a89e7a62b56366..eb163530fbee22 100644 --- a/deps/icu-small/source/common/utext.cpp +++ b/deps/icu-small/source/common/utext.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utext.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -847,9 +847,15 @@ U_CDECL_END //------------------------------------------------------------------------------ // Chunk size. -// Must be less than 85, because of byte mapping from UChar indexes to native indexes. -// Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes -// to two UChars.) +// Must be less than 42 (256/6), because of byte mapping from UChar indexes to native indexes. +// Worst case there are six UTF-8 bytes per UChar. +// obsolete 6 byte form fd + 5 trails maps to fffd +// obsolete 5 byte form fc + 4 trails maps to fffd +// non-shortest 4 byte forms maps to fffd +// normal supplementaries map to a pair of utf-16, two utf8 bytes per utf-16 unit +// mapToUChars array size must allow for the worst case, 6. +// This could be brought down to 4, by treating fd and fc as pure illegal, +// rather than obsolete lead bytes. But that is not compatible with the utf-8 access macros. // enum { UTF8_TEXT_CHUNK_SIZE=32 }; @@ -889,7 +895,7 @@ struct UTF8Buf { // Requires two extra slots, // one for a supplementary starting in the last normal position, // and one for an entry for the buffer limit position. - uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to + uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*6+6]; // Map native offset from bufNativeStart to // correspoding offset in filled part of buf. int32_t align; }; @@ -1032,6 +1038,7 @@ utf8TextAccess(UText *ut, int64_t index, UBool forward) { // Requested index is in this buffer. u8b = (UTF8Buf *)ut->p; // the current buffer mapIndex = ix - u8b->toUCharsMapStart; + U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars)); ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; return TRUE; @@ -1298,6 +1305,10 @@ utf8TextAccess(UText *ut, int64_t index, UBool forward) { // Can only do this if the incoming index is somewhere in the interior of the string. // If index is at the end, there is no character there to look at. if (ix != ut->b) { + // Note: this function will only move the index back if it is on a trail byte + // and there is a preceding lead byte and the sequence from the lead + // through this trail could be part of a valid UTF-8 sequence + // Otherwise the index remains unchanged. U8_SET_CP_START(s8, 0, ix); } @@ -1311,7 +1322,10 @@ utf8TextAccess(UText *ut, int64_t index, UBool forward) { UChar *buf = u8b->buf; uint8_t *mapToNative = u8b->mapToNative; uint8_t *mapToUChars = u8b->mapToUChars; - int32_t toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1); + int32_t toUCharsMapStart = ix - sizeof(UTF8Buf::mapToUChars) + 1; + // Note that toUCharsMapStart can be negative. Happens when the remaining + // text from current position to the beginning is less than the buffer size. + // + 1 because mapToUChars must have a slot at the end for the bufNativeLimit entry. int32_t destIx = UTF8_TEXT_CHUNK_SIZE+2; // Start in the overflow region // at end of buffer to leave room // for a surrogate pair at the @@ -1338,6 +1352,7 @@ utf8TextAccess(UText *ut, int64_t index, UBool forward) { if (c<0x80) { // Special case ASCII range for speed. buf[destIx] = (UChar)c; + U_ASSERT(toUCharsMapStart <= srcIx); mapToUChars[srcIx - toUCharsMapStart] = (uint8_t)destIx; mapToNative[destIx] = (uint8_t)(srcIx - toUCharsMapStart); } else { @@ -1367,6 +1382,7 @@ utf8TextAccess(UText *ut, int64_t index, UBool forward) { do { mapToUChars[sIx-- - toUCharsMapStart] = (uint8_t)destIx; } while (sIx >= srcIx); + U_ASSERT(toUCharsMapStart <= (srcIx+1)); // Set native indexing limit to be the current position. // We are processing a non-ascii, non-native-indexing char now; @@ -1541,6 +1557,7 @@ utf8TextMapIndexToUTF16(const UText *ut, int64_t index64) { U_ASSERT(index>=ut->chunkNativeStart+ut->nativeIndexingLimit); U_ASSERT(index<=ut->chunkNativeLimit); int32_t mapIndex = index - u8b->toUCharsMapStart; + U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars)); int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx; U_ASSERT(offset>=0 && offset<=ut->chunkLength); return offset; @@ -2225,13 +2242,13 @@ unistrTextCopy(UText *ut, } if(move) { - // move: copy to destIndex, then replace original with nothing + // move: copy to destIndex, then remove original int32_t segLength=limit32-start32; us->copy(start32, limit32, destIndex32); if(destIndex32replace(start32, segLength, NULL, 0); + us->remove(start32, segLength); } else { // copy us->copy(start32, limit32, destIndex32); diff --git a/deps/icu-small/source/common/utf_impl.c b/deps/icu-small/source/common/utf_impl.cpp similarity index 94% rename from deps/icu-small/source/common/utf_impl.c rename to deps/icu-small/source/common/utf_impl.cpp index 91cb9ba5f2935f..293e6f181f3a3f 100644 --- a/deps/icu-small/source/common/utf_impl.c +++ b/deps/icu-small/source/common/utf_impl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utf_impl.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -31,6 +31,15 @@ #include "uassert.h" /* + * Table of the number of utf8 trail bytes, indexed by the lead byte. + * Used by the deprecated macro UTF8_COUNT_TRAIL_BYTES, defined in utf_old.h + * + * The current macro, U8_COUNT_TRAIL_BYTES, does _not_ use this table. + * + * Note that this table cannot be removed, even if UTF8_COUNT_TRAIL_BYTES were + * changed to no longer use it. References to the table from expansions of UTF8_COUNT_TRAIL_BYTES + * may exist in old client code that must continue to run with newer icu library versions. + * * This table could be replaced on many machines by * a few lines of assembler code using an * "index of first 0-bit from msb" instruction and @@ -51,7 +60,7 @@ * lead bytes above 0xf4 are illegal. * We keep them in this table for skipping long ISO 10646-UTF-8 sequences. */ -U_EXPORT const uint8_t +extern "C" U_EXPORT const uint8_t utf8_countTrailBytes[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -146,6 +155,7 @@ utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, c=(c<<6)|trail; /* c>=0x110 would result in code point>0x10ffff, outside Unicode */ if(c>=0x110 || trail>0x3f) { break; } + U_FALLTHROUGH; case 2: trail=s[i++]-0x80; c=(c<<6)|trail; @@ -154,6 +164,7 @@ utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, * before the last (c<<6), a surrogate is c=360..37f */ if(((c&0xffe0)==0x360 && strict!=-2) || trail>0x3f) { break; } + U_FALLTHROUGH; case 1: trail=s[i++]-0x80; c=(c<<6)|trail; diff --git a/deps/icu-small/source/common/util.cpp b/deps/icu-small/source/common/util.cpp index b5d1fa4888ad27..838a201a73d803 100644 --- a/deps/icu-small/source/common/util.cpp +++ b/deps/icu-small/source/common/util.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/util.h b/deps/icu-small/source/common/util.h index b3ed037ab62696..7af9a32d8ffe53 100644 --- a/deps/icu-small/source/common/util.h +++ b/deps/icu-small/source/common/util.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/util_props.cpp b/deps/icu-small/source/common/util_props.cpp index 3b7bb20d254a86..36057a6066db94 100644 --- a/deps/icu-small/source/common/util_props.cpp +++ b/deps/icu-small/source/common/util_props.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/utrace.c b/deps/icu-small/source/common/utrace.cpp similarity index 97% rename from deps/icu-small/source/common/utrace.c rename to deps/icu-small/source/common/utrace.cpp index e702497d8c0f69..7d0ddc6f8b0339 100644 --- a/deps/icu-small/source/common/utrace.c +++ b/deps/icu-small/source/common/utrace.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,12 +6,11 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: utrace.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 */ -#define UTRACE_IMPL #include "unicode/utrace.h" #include "utracimp.h" #include "cstring.h" @@ -24,7 +23,11 @@ static UTraceExit *pTraceExitFunc = NULL; static UTraceData *pTraceDataFunc = NULL; static const void *gTraceContext = NULL; -U_EXPORT int32_t +/** + * \var utrace_level + * Trace level variable. Negative for "off". + */ +static int32_t utrace_level = UTRACE_ERROR; U_CAPI void U_EXPORT2 @@ -134,7 +137,7 @@ static void outputHexBytes(int64_t val, int32_t charsToOutput, /* Output a pointer value in hex. Work with any size of pointer */ static void outputPtrBytes(void *val, char *outBuf, int32_t *outIx, int32_t capacity) { - int32_t i; + uint32_t i; int32_t incVal = 1; /* +1 for big endian, -1 for little endian */ char *p = (char *)&val; /* point to current byte to output in the ptr val */ @@ -230,7 +233,7 @@ utrace_vformat(char *outBuf, int32_t capacity, int32_t indent, const char *fmt, case 'S': /* UChar * string, with length, len==-1 for null terminated. */ - ptrArg = va_arg(args, void *); /* Ptr */ + ptrArg = va_arg(args, char *); /* Ptr */ intArg =(int32_t)va_arg(args, int32_t); /* Length */ outputUString((const UChar *)ptrArg, intArg, outBuf, &outIx, capacity, indent); break; @@ -261,7 +264,7 @@ utrace_vformat(char *outBuf, int32_t capacity, int32_t indent, const char *fmt, case 'p': /* Pointers. */ - ptrArg = va_arg(args, void *); + ptrArg = va_arg(args, char *); outputPtrBytes(ptrArg, outBuf, &outIx, capacity); break; @@ -332,7 +335,7 @@ utrace_vformat(char *outBuf, int32_t capacity, int32_t indent, const char *fmt, break; case 's': charsToOutput = 0; - outputString(*ptrPtr, outBuf, &outIx, capacity, indent); + outputString((const char *)*ptrPtr, outBuf, &outIx, capacity, indent); outputChar('\n', outBuf, &outIx, capacity, indent); longArg = *ptrPtr==NULL? 0: 1; /* for test for null term. array. */ ptrPtr++; diff --git a/deps/icu-small/source/common/utracimp.h b/deps/icu-small/source/common/utracimp.h index 5ec047a967a858..c2819830e1ba52 100644 --- a/deps/icu-small/source/common/utracimp.h +++ b/deps/icu-small/source/common/utracimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: utracimp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -47,20 +47,6 @@ U_CDECL_BEGIN -/** - * \var utrace_level - * Trace level variable. Negative for "off". - * Use only via UTRACE_ macros. - * @internal - */ -#ifdef UTRACE_IMPL -U_EXPORT int32_t -#else -U_CFUNC U_COMMON_API int32_t -#endif -utrace_level; - - /** * Traced Function Exit return types. * Flags indicating the number and types of varargs included in a call diff --git a/deps/icu-small/source/common/utrie.cpp b/deps/icu-small/source/common/utrie.cpp index 478560df66eb3b..ecf9b1cba72c6d 100644 --- a/deps/icu-small/source/common/utrie.cpp +++ b/deps/icu-small/source/common/utrie.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/utrie.h b/deps/icu-small/source/common/utrie.h index 17e660b3e308cb..9c5382c5949b3b 100644 --- a/deps/icu-small/source/common/utrie.h +++ b/deps/icu-small/source/common/utrie.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/utrie2.cpp b/deps/icu-small/source/common/utrie2.cpp index 4bd35a924d874a..cec7224d90f5de 100644 --- a/deps/icu-small/source/common/utrie2.cpp +++ b/deps/icu-small/source/common/utrie2.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie2.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/utrie2.h b/deps/icu-small/source/common/utrie2.h index 810bcfc9591058..8e87bf8fbd3ea7 100644 --- a/deps/icu-small/source/common/utrie2.h +++ b/deps/icu-small/source/common/utrie2.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie2.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/utrie2_builder.cpp b/deps/icu-small/source/common/utrie2_builder.cpp index 664051c5f9bd04..d8a3a06757370d 100644 --- a/deps/icu-small/source/common/utrie2_builder.cpp +++ b/deps/icu-small/source/common/utrie2_builder.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie2_builder.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/utrie2_impl.h b/deps/icu-small/source/common/utrie2_impl.h index 48883638b185c4..b7dc9d3fb45fd4 100644 --- a/deps/icu-small/source/common/utrie2_impl.h +++ b/deps/icu-small/source/common/utrie2_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: utrie2_impl.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/uts46.cpp b/deps/icu-small/source/common/uts46.cpp index 7bc4f925caca0b..f2cff2d5ea33a1 100644 --- a/deps/icu-small/source/common/uts46.cpp +++ b/deps/icu-small/source/common/uts46.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: uts46.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/common/utypeinfo.h b/deps/icu-small/source/common/utypeinfo.h index b39aa0d6053344..c6663734fc3dc4 100644 --- a/deps/icu-small/source/common/utypeinfo.h +++ b/deps/icu-small/source/common/utypeinfo.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -24,7 +24,7 @@ #include using std::exception; #endif -#if !defined(_MSC_VER) +#if defined(__GLIBCXX__) namespace std { class type_info; } // WORKAROUND: http://llvm.org/bugs/show_bug.cgi?id=13364 #endif #include // for 'typeid' to work diff --git a/deps/icu-small/source/common/utypes.c b/deps/icu-small/source/common/utypes.cpp similarity index 99% rename from deps/icu-small/source/common/utypes.c rename to deps/icu-small/source/common/utypes.cpp index c506dd44f5424c..8f5791be160e17 100644 --- a/deps/icu-small/source/common/utypes.c +++ b/deps/icu-small/source/common/utypes.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/uvector.cpp b/deps/icu-small/source/common/uvector.cpp index e48913e55eac12..ad3a813e3706ac 100644 --- a/deps/icu-small/source/common/uvector.cpp +++ b/deps/icu-small/source/common/uvector.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/uvector.h b/deps/icu-small/source/common/uvector.h index f6abe3e78ad1c9..ad75e23400aa9b 100644 --- a/deps/icu-small/source/common/uvector.h +++ b/deps/icu-small/source/common/uvector.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/uvectr32.cpp b/deps/icu-small/source/common/uvectr32.cpp index 3607d974ce5a9d..6e0760d7184040 100644 --- a/deps/icu-small/source/common/uvectr32.cpp +++ b/deps/icu-small/source/common/uvectr32.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/uvectr32.h b/deps/icu-small/source/common/uvectr32.h index c975de769b55b4..3174e94c9f55a9 100644 --- a/deps/icu-small/source/common/uvectr32.h +++ b/deps/icu-small/source/common/uvectr32.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/uvectr64.cpp b/deps/icu-small/source/common/uvectr64.cpp index 9196274aba1826..145db246dc5a05 100644 --- a/deps/icu-small/source/common/uvectr64.cpp +++ b/deps/icu-small/source/common/uvectr64.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/common/uvectr64.h b/deps/icu-small/source/common/uvectr64.h index fec10983988de9..1db4a1fe2ea3c4 100644 --- a/deps/icu-small/source/common/uvectr64.h +++ b/deps/icu-small/source/common/uvectr64.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/common/wintz.c b/deps/icu-small/source/common/wintz.cpp similarity index 63% rename from deps/icu-small/source/common/wintz.c rename to deps/icu-small/source/common/wintz.cpp index 5a3ecae0a43f36..c30a5dbc606894 100644 --- a/deps/icu-small/source/common/wintz.c +++ b/deps/icu-small/source/common/wintz.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -13,7 +13,9 @@ #include "unicode/utypes.h" -#if U_PLATFORM_HAS_WIN32_API +// This file contains only desktop Windows behavior +// Windows UWP calls Windows::Globalization directly, so this isn't needed there. +#if U_PLATFORM_USES_ONLY_WIN32_API && (U_PLATFORM_HAS_WINUWP_API == 0) #include "wintz.h" #include "cmemory.h" @@ -22,7 +24,9 @@ #include "unicode/ures.h" #include "unicode/ustring.h" +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE @@ -46,102 +50,25 @@ typedef struct * Various registry keys and key fragments. */ static const char CURRENT_ZONE_REGKEY[] = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation\\"; -/* static const char STANDARD_NAME_REGKEY[] = "StandardName"; Currently unused constant */ static const char STANDARD_TIME_REGKEY[] = " Standard Time"; static const char TZI_REGKEY[] = "TZI"; static const char STD_REGKEY[] = "Std"; /** - * HKLM subkeys used to probe for the flavor of Windows. Note that we - * specifically check for the "GMT" zone subkey; this is present on - * NT, but on XP has become "GMT Standard Time". We need to - * discriminate between these cases. + * The time zone root keys (under HKLM) for Win7+ */ -static const char* const WIN_TYPE_PROBE_REGKEY[] = { - /* WIN_9X_ME_TYPE */ - "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones", - - /* WIN_NT_TYPE */ - "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\GMT" - - /* otherwise: WIN_2K_XP_TYPE */ -}; - -/** - * The time zone root subkeys (under HKLM) for different flavors of - * Windows. - */ -static const char* const TZ_REGKEY[] = { - /* WIN_9X_ME_TYPE */ - "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Time Zones\\", - - /* WIN_NT_TYPE | WIN_2K_XP_TYPE */ - "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\" -}; - -/** - * Flavor of Windows, from our perspective. Not a real OS version, - * but rather the flavor of the layout of the time zone information in - * the registry. - */ -enum { - WIN_9X_ME_TYPE = 1, - WIN_NT_TYPE = 2, - WIN_2K_XP_TYPE = 3 -}; - -static int32_t gWinType = 0; - -static int32_t detectWindowsType() -{ - int32_t winType; - LONG result; - HKEY hkey; - - /* Detect the version of windows by trying to open a sequence of - probe keys. We don't use the OS version API because what we - really want to know is how the registry is laid out. - Specifically, is it 9x/Me or not, and is it "GMT" or "GMT - Standard Time". */ - for (winType = 0; winType < 2; winType++) { - result = RegOpenKeyExA(HKEY_LOCAL_MACHINE, - WIN_TYPE_PROBE_REGKEY[winType], - 0, - KEY_QUERY_VALUE, - &hkey); - RegCloseKey(hkey); - - if (result == ERROR_SUCCESS) { - break; - } - } - - return winType+1; /* +1 to bring it inline with the enum */ -} +static const char TZ_REGKEY[] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\"; static LONG openTZRegKey(HKEY *hkey, const char *winid) { - char subKeyName[110]; /* TODO: why 96?? */ + char subKeyName[110]; /* TODO: why 110?? */ char *name; LONG result; - /* This isn't thread safe, but it's good enough because the result should be constant per system. */ - if (gWinType <= 0) { - gWinType = detectWindowsType(); - } - - uprv_strcpy(subKeyName, TZ_REGKEY[(gWinType != WIN_9X_ME_TYPE)]); + uprv_strcpy(subKeyName, TZ_REGKEY); name = &subKeyName[strlen(subKeyName)]; uprv_strcat(subKeyName, winid); - if (gWinType == WIN_9X_ME_TYPE) { - /* Remove " Standard Time" */ - char *pStd = uprv_strstr(subKeyName, STANDARD_TIME_REGKEY); - if (pStd) { - *pStd = 0; - } - } - result = RegOpenKeyExA(HKEY_LOCAL_MACHINE, subKeyName, 0, @@ -158,44 +85,44 @@ static LONG getTZI(const char *winid, TZI *tzi) result = openTZRegKey(&hkey, winid); - if (result == ERROR_SUCCESS) { + if (result == ERROR_SUCCESS) + { result = RegQueryValueExA(hkey, TZI_REGKEY, NULL, NULL, (LPBYTE)tzi, &cbData); - + RegCloseKey(hkey); } - RegCloseKey(hkey); - return result; } -static LONG getSTDName(const char *winid, char *regStdName, int32_t length) { +static LONG getSTDName(const char *winid, char *regStdName, int32_t length) +{ DWORD cbData = length; LONG result; HKEY hkey; result = openTZRegKey(&hkey, winid); - if (result == ERROR_SUCCESS) { + if (result == ERROR_SUCCESS) + { result = RegQueryValueExA(hkey, STD_REGKEY, NULL, NULL, (LPBYTE)regStdName, &cbData); - + RegCloseKey(hkey); } - RegCloseKey(hkey); - return result; } -static LONG getTZKeyName(char* tzKeyName, int32_t length) { +static LONG getTZKeyName(char* tzKeyName, int32_t length) +{ HKEY hkey; LONG result = FALSE; DWORD cbData = length; @@ -214,27 +141,27 @@ static LONG getTZKeyName(char* tzKeyName, int32_t length) { NULL, (LPBYTE)tzKeyName, &cbData); + + RegCloseKey(hkey); } return result; } /* - This code attempts to detect the Windows time zone, as set in the - Windows Date and Time control panel. It attempts to work on - multiple flavors of Windows (9x, Me, NT, 2000, XP) and on localized + This code attempts to detect the Windows time zone directly, + as set in the Windows Date and Time control panel. It attempts + to work on versions greater than Windows Vista and on localized installs. It works by directly interrogating the registry and comparing the data there with the data returned by the GetTimeZoneInformation API, along with some other strategies. The - registry contains time zone data under one of two keys (depending on - the flavor of Windows): + registry contains time zone data under this key: - HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones\ HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\ - Under this key are several subkeys, one for each time zone. These - subkeys are named "Pacific" on Win9x/Me and "Pacific Standard Time" - on WinNT/2k/XP. There are some other wrinkles; see the code for + Under this key are several subkeys, one for each time zone. For + example these subkeys are named "Pacific Standard Time" on Vista+. + There are some other wrinkles; see the code for details. The subkey name is NOT LOCALIZED, allowing us to support localized installs. @@ -272,7 +199,8 @@ static LONG getTZKeyName(char* tzKeyName, int32_t length) { * time zone, translated to an ICU time zone, or NULL upon failure. */ U_CFUNC const char* U_EXPORT2 -uprv_detectWindowsTimeZone() { +uprv_detectWindowsTimeZone() +{ UErrorCode status = U_ZERO_ERROR; UResourceBundle* bundle = NULL; char* icuid = NULL; @@ -282,7 +210,7 @@ uprv_detectWindowsTimeZone() { int32_t len; int id; int errorCode; - UChar ISOcodeW[3]; /* 2 letter iso code in UTF-16*/ + wchar_t ISOcodeW[3]; /* 2 letter iso code in UTF-16*/ char ISOcodeA[3]; /* 2 letter iso code in ansi */ LONG result; @@ -290,7 +218,6 @@ uprv_detectWindowsTimeZone() { TZI tziReg; TIME_ZONE_INFORMATION apiTZI; - BOOL isVistaOrHigher; BOOL tryPreVistaFallback; OSVERSIONINFO osVerInfo; @@ -314,8 +241,8 @@ uprv_detectWindowsTimeZone() { tmpid[0] = 0; id = GetUserGeoID(GEOCLASS_NATION); - errorCode = GetGeoInfoW(id,GEO_ISO2,ISOcodeW,3,0); - u_strToUTF8(ISOcodeA, 3, NULL, ISOcodeW, 3, &status); + errorCode = GetGeoInfoW(id, GEO_ISO2, ISOcodeW, 3, 0); + u_strToUTF8(ISOcodeA, 3, NULL, (const UChar *)ISOcodeW, 3, &status); bundle = ures_openDirect(NULL, "windowsZones", &status); ures_getByKey(bundle, "mapTimezones", bundle, &status); @@ -327,75 +254,86 @@ uprv_detectWindowsTimeZone() { */ uprv_memset(&osVerInfo, 0, sizeof(osVerInfo)); osVerInfo.dwOSVersionInfoSize = sizeof(osVerInfo); - GetVersionEx(&osVerInfo); - isVistaOrHigher = osVerInfo.dwMajorVersion >= 6; /* actually includes Windows Server 2008 as well, but don't worry about it */ tryPreVistaFallback = TRUE; - if(isVistaOrHigher) { - result = getTZKeyName(regStdName, sizeof(regStdName)); - if(ERROR_SUCCESS == result) { - UResourceBundle* winTZ = ures_getByKey(bundle, regStdName, NULL, &status); - if(U_SUCCESS(status)) { - const UChar* icuTZ = NULL; - if (errorCode != 0) { - icuTZ = ures_getStringByKey(winTZ, ISOcodeA, &len, &status); - } - if (errorCode==0 || icuTZ==NULL) { - /* fallback to default "001" and reset status */ - status = U_ZERO_ERROR; - icuTZ = ures_getStringByKey(winTZ, "001", &len, &status); - } + result = getTZKeyName(regStdName, sizeof(regStdName)); + if(ERROR_SUCCESS == result) + { + UResourceBundle* winTZ = ures_getByKey(bundle, regStdName, NULL, &status); + if(U_SUCCESS(status)) + { + const UChar* icuTZ = NULL; + if (errorCode != 0) + { + icuTZ = ures_getStringByKey(winTZ, ISOcodeA, &len, &status); + } + if (errorCode==0 || icuTZ==NULL) + { + /* fallback to default "001" and reset status */ + status = U_ZERO_ERROR; + icuTZ = ures_getStringByKey(winTZ, "001", &len, &status); + } - if(U_SUCCESS(status)) { - int index=0; - while (! (*icuTZ == '\0' || *icuTZ ==' ')) { - tmpid[index++]=(char)(*icuTZ++); /* safe to assume 'char' is ASCII compatible on windows */ - } - tmpid[index]='\0'; - tryPreVistaFallback = FALSE; + if(U_SUCCESS(status)) + { + int index=0; + while (! (*icuTZ == '\0' || *icuTZ ==' ')) + { + tmpid[index++]=(char)(*icuTZ++); /* safe to assume 'char' is ASCII compatible on windows */ } + tmpid[index]='\0'; + tryPreVistaFallback = FALSE; } - ures_close(winTZ); } + ures_close(winTZ); } - if(tryPreVistaFallback) { - + if(tryPreVistaFallback) + { /* Note: We get the winid not from static tables but from resource bundle. */ - while (U_SUCCESS(status) && ures_hasNext(bundle)) { + while (U_SUCCESS(status) && ures_hasNext(bundle)) + { UBool idFound = FALSE; const char* winid; UResourceBundle* winTZ = ures_getNextResource(bundle, NULL, &status); - if (U_FAILURE(status)) { + if (U_FAILURE(status)) + { break; } winid = ures_getKey(winTZ); result = getTZI(winid, &tziReg); - if (result == ERROR_SUCCESS) { + if (result == ERROR_SUCCESS) + { /* Windows alters the DaylightBias in some situations. Using the bias and the rules suffices, so overwrite these unreliable fields. */ tziKey.standardBias = tziReg.standardBias; tziKey.daylightBias = tziReg.daylightBias; - if (uprv_memcmp((char *)&tziKey, (char*)&tziReg, sizeof(tziKey)) == 0) { + if (uprv_memcmp((char *)&tziKey, (char*)&tziReg, sizeof(tziKey)) == 0) + { const UChar* icuTZ = NULL; - if (errorCode != 0) { + if (errorCode != 0) + { icuTZ = ures_getStringByKey(winTZ, ISOcodeA, &len, &status); } - if (errorCode==0 || icuTZ==NULL) { + if (errorCode==0 || icuTZ==NULL) + { /* fallback to default "001" and reset status */ status = U_ZERO_ERROR; icuTZ = ures_getStringByKey(winTZ, "001", &len, &status); } - if (U_SUCCESS(status)) { + if (U_SUCCESS(status)) + { /* Get the standard name from the registry key to compare with the one from Windows API call. */ uprv_memset(regStdName, 0, sizeof(regStdName)); result = getSTDName(winid, regStdName, sizeof(regStdName)); - if (result == ERROR_SUCCESS) { - if (uprv_strcmp(apiStdName, regStdName) == 0) { + if (result == ERROR_SUCCESS) + { + if (uprv_strcmp(apiStdName, regStdName) == 0) + { idFound = TRUE; } } @@ -404,10 +342,12 @@ uprv_detectWindowsTimeZone() { * If none is found, tmpid buffer will contain a fallback ID (i.e. the time zone ID matching * the current time zone information) */ - if (idFound || tmpid[0] == 0) { + if (idFound || tmpid[0] == 0) + { /* if icuTZ has more than one city, take only the first (i.e. terminate icuTZ at first space) */ int index=0; - while (! (*icuTZ == '\0' || *icuTZ ==' ')) { + while (! (*icuTZ == '\0' || *icuTZ ==' ')) + { tmpid[index++]=(char)(*icuTZ++); /* safe to assume 'char' is ASCII compatible on windows */ } tmpid[index]='\0'; @@ -416,7 +356,8 @@ uprv_detectWindowsTimeZone() { } } ures_close(winTZ); - if (idFound) { + if (idFound) + { break; } } @@ -425,10 +366,12 @@ uprv_detectWindowsTimeZone() { /* * Copy the timezone ID to icuid to be returned. */ - if (tmpid[0] != 0) { + if (tmpid[0] != 0) + { len = uprv_strlen(tmpid); icuid = (char*)uprv_calloc(len + 1, sizeof(char)); - if (icuid != NULL) { + if (icuid != NULL) + { uprv_strcpy(icuid, tmpid); } } @@ -438,4 +381,4 @@ uprv_detectWindowsTimeZone() { return icuid; } -#endif /* U_PLATFORM_HAS_WIN32_API */ +#endif /* U_PLATFORM_USES_ONLY_WIN32_API && (U_PLATFORM_HAS_WINUWP_API == 0) */ diff --git a/deps/icu-small/source/common/wintz.h b/deps/icu-small/source/common/wintz.h index 01a906a401348d..9e8cbbcfaba36f 100644 --- a/deps/icu-small/source/common/wintz.h +++ b/deps/icu-small/source/common/wintz.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -16,7 +16,9 @@ #include "unicode/utypes.h" -#if U_PLATFORM_HAS_WIN32_API +// This file contains only desktop windows behavior +// Windows UWP calls Windows::Globalization directly, so this isn't needed there. +#if U_PLATFORM_USES_ONLY_WIN32_API && (U_PLATFORM_HAS_WINUWP_API == 0) /** * \file @@ -31,6 +33,6 @@ U_CDECL_END U_CFUNC const char* U_EXPORT2 uprv_detectWindowsTimeZone(); -#endif /* U_PLATFORM_HAS_WIN32_API */ +#endif /* U_PLATFORM_USES_ONLY_WIN32_API && (U_PLATFORM_HAS_WINUWP_API == 0) */ #endif /* __WINTZ */ diff --git a/deps/icu-small/source/data/in/icudt58l.dat b/deps/icu-small/source/data/in/icudt59l.dat similarity index 68% rename from deps/icu-small/source/data/in/icudt58l.dat rename to deps/icu-small/source/data/in/icudt59l.dat index bc36c1313d9c7ea92e2d50f6ed624c0cc8ca7c2e..e7fb9b2598da5b1e305b826e9e7ab19ce6b1a913 100644 GIT binary patch delta 314363 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

aar~q!S?M`492@u5ob$ksdB715 zqT-AP>4XP-c|Vh$#c_JLD~`;l7%>T_S40nLILd__oq2j@{_wAc_Z=~3M2lJ0Lo{3m z(Ze%7jHr(jG0Jhm#iNmqIJ#mmj;NqVQ@kIwbk?Xr^>K1UbyCER^k|GjJL(Qf!x0@> zBSa4zv+)xS#b`IGH_p14HmYb;U7SqeoVsPShScqEVaGyr=&vDFaZto3ZCdpo&_*Ei z;E2x~b!ej@jrzOy@6x|_e?R!2^rz=V`1KEKV?*k;8PGqsk(Siz?~W5By!-dYnGpgR z)T1 zYSI)(EZ`NOe|xuMh42TNApAEaI1GH|s0H=TkZk^l$yg~!w z12iN{FEmaM7=-f`%!D4qKo4P{2QY|{ZgFnOIBsERz$kQeyHT9in?@fR4RITZVIsZy zxupc?$ualSIN4xGV0ha*fo}r|{%h)rdqCjGz;S_XadJVjmw(&*zou;20}=bC%HZO1&{Kk!^2QF!Q zD6ld*?;e;OxGHcf;^G3Ex7Cny?#_+>a1Uy`v@Q0=yu4K2dT-{F%8G+$S|BCupDOv(DMP>VGMf8fT$zgaJ<0cK^7bc5Q$>|G{hGN z4J;hvKXxEO!pD@4Q4^mrc4I4%5%ZPV`g4)0UrNw_bnNM|MlyIl&F61T-tU|G117LJ zYFAXD2Y&ZGDle)q>iZ~xAJJfRCxurGx^VggOPz6IXm{FV7Mal4Ml8Q;q$&}8j4#8C)`=WL$|@GOc7*Np4AgNl{5@ z$=Z^yO178mE-5P!kCvP+`Jv=e$+Z#}a;xNi$>WljCGSgYN)4rzORJSSmDVk7T-u`4 zwbY~3E~`svkJ7%Sj#+iG0!kZZg_eGj6_#idJ2SC+0X-BS8(>0bPD>+#Yvr5=MXl>S_Lqx4Q`g;@Hu^mS>M!5>QN ziZzL8h3$$OD|!reUQvHV(-nOOw_Fi0*nNfPif$`H2m7q>T@gJvaq#vuudD$p!dJwu zNM4b?V%Q25xo+=aLmz|L<9ieJn`+pjnLf5)kFD9GJA3TJ9(&+Xylx-Pn)PN<0DD}> zlxWsPT_f$nohg&p<25g;v{`F?T*zY9vPVbuxL2UHPZg16%+GI3^8bJ(%yB#cJ`#iSktDuyq%)ftRz#SBl|hu(rOe z?MC+am_6dpD`*$eys9xt!ycQm276c+E!bebOnJ`~1BqwR&nf{phOW7rGX2Tz5`xl^`B3rkC#ScR~?tf|SiM#3g>au3>tRqPu z#&#%?HE84;4A#GIqq$CnOd`fS2BG&dzALC6Z7}7oj6W?(Y`U; zja3)1``}wI+K~tALb@mwthSSe>Wf+YEvY;9c#_52 zdehou)^#V=R$5XzyL?;HXzdnOTbJ#3Q|51LF6bSLXy+M!$6Z`}XVYCKqXuUX@6Mh*Ek=fZti;laR$_@o?Nf`>E2$qK!scE`Jnmx6RY88^W^b^y<(r8XnDI@9hG<#(3tWL}W zbx4$vhpe15AM1B1QZ`Plx(Z9OI#WfDS2pn6-85VGi-9q!X{3YNfc!X8#?O+0pCiL( z*Njcb7WjRtG3{YWt+cr*_}V3-Ts)Yu5{t@A|21VU5r?an@2|zu%JwAV)5np1Bs=|8 zx<8>uP_IZIqz)##21w{gG)>C#s%L-wzJO)1i&3vi`0PeVvPp zC2iD426jev*R}&`uEToB%{VgseEKiQ&rlWFNpB(rZFlUB!@xiyq|vOk=LY_cl(Al9 zcKXGEU#l*&bhK`1$YhYJA>}q@na4BiG95EDq>uV5LbK-#B2|(5JVO1aYBaK5h;A&; zY#5=5&w0voWILznWbqL(^HS#N%rhBAB->G|?MOT1>j^<>*iTgnNWoKutV@5D`e*70 zq#&NG+JpnTzfO6QnoDR(o(|;Qz&9!b(n?C{it%4ANVU2I$*C+X&BXcCymXpqVzZdu zUHwFL#AXLsl7VEyvy<(bJ{%fYlOX?Pkz<7uuNx|PzV(ptJ#^3<&HR_~vE(&=J> zBDP*``1c@r`{jD;#!^ojmU`AJElu;E!&+lxPwE@r0?TWY)+Al;e;d%c8}fEa)BXFT zt&{w({gj7hJ<{|VvhZIW%d6sBhV8db`r|g%!IhUtj8bVKmryw&dF!RS$lIGuQB+yGr`M5+(mIt*>ExtZdA+pOdIwlN`CgFYtZSC0 zs+>NJVb@>2Qqn3v9!S18^8Q$#1Ja<B2SHtCh|?U-g2}n>z>eA zE3c*8*xH$LXenBbp##YG4y~b+v$m6_kM!Eqv0g#tm6q3R?MRAN?g1T)PSF}`9bUfT z%8MmWiT6RD|I%vZ;E!K4KkitXv-KLvlmEB}S*6j|&A0BbJQD3kl-?4oE0QafJ7Qgt zyh?cpxzm4({&=sXWl9qd!+%bv$sxLj+d=6Mw%XdYFn2fdssiMmba7o$}Xh!TUSJz(Fx1V zrTw5$v=zN{^zMbHB8<}C$g=^(HfU)RMZe0oE_RY z^mK@DNO2hNFx{chVS~dChZ7E$9qu{2cBt&=cTw^{0}6!8SSOJDzpid}74OPWx+? zDTCCg%}0$qxSHfU-osSHBmb-!@8IM(|4`EdQhS_~gK`U|gdtk4rR@UH<52Oh+0eCB z`D=@%$$E@jSevqeWp&EJj@&sa4_i@#4n?P2=cA>lFa_%} z#yf~~ZggYlw%K4^XE9s4{_prktFejW9q0yHXOG(o%Evn-I0RsuhyJykzi+fMTH%X- zyTaD1rwHOP()GN|ujl+jr!irAGmdxIe1c9;*+Rac_jsLngvRFMrlfmfou+6VkY3dQ z>;|orW}lCe?9({fX+HKx>g4o^p~tOzLhHsmRPeeMs8dcy>C+vhwf}fa_gBwT_R|(q_KW2Q=AtXwkgiP% zkQ>Oel&2u=i1aA!!QY4Gt75~@Udj*16a2U&4UVzJzqUdi! zmztuVDS=tEpD+2Ki&3w_t`x8~giNGk4axqE#w=Zg?_cQ(sYr%W(UYuD3|4|ht64*7 zTi3#uw{>15+KipwgSOei2ivBI{RY0gt2>V)c0H{1l6vGw4z#5u1%y`bDJkr`;==-sW$dzQ>wXg?FQ8*mKRX1J=b2)#kF6} z+IFIvh;4XC1D~Z`q=DUepyqdI?`GiZNKfL!wQ5vLeSz;ZJxM>VxlnD{5gpY6xYnL( zf+yafJxK`H`cZA{v{zJ%oJj-c%@{znWUduaZF9@NC$wcAwN(_{tJ=5VcoYQh-<)$+I|+^21iBvCD&YZ|J}Yx;m{g-pZ#SD|9Z^Ao7J zoCnsY+R%zER9nS0x2w<=#duL|J=eO?IJbuEuHMYG{#1*LW0T&_wH&HVFWo@f?&8`^ zs)_odn^fG##l=+Ie6pNshq$(!X~DCocARUgsn)#XPgMJ!Yu{0A-skLI_0nrvhf zG;*yD)i!LXN8>7Utvl6r%w*4Zd#+8Qi|gNKGmUfP+5j5YRh$w+#oAnqqvErX>_w$M z*CtYJ^SdG%*Mw`?R2vz&hiWajwv=_)zaQ1waBU;iQn#`lY{#{IRO{7*?LtS9i)W~K zsHGik+>L7$R1==C_k*5XtNjq#-7}svt}oXX(ADioT}!q8TsukQo}FO#Q83poQf+f* z);5A`;v*^seUm^N$8yp12-=#x!>N|UHAkww^9iR~8rND;ZMuoQntjH#mQ*Xe^DT`V z!L{C0b6CypkFi_}qS}s^q7x0A#KkBoRv8#cwa>YBjjnFNybn~%;o1Zmmpbw&)n;>T zqoWet=NmtHm)U6Z4qH(?Bv>gk*+Rv$4lDyJ1)+o zfrU@IQ0*Ysa;bKu#%ih^_Dz@J+lxjD)ww!7Xx7i@KxmNcnw6KZyXxx3S1yilnr+ujQ2iKPT0?oTG z>+d<&hSRv9(;aEtnf<#sAk~W zQmPeZkEU8BuC;g$?fPZ*ifPBSK2$qDz6OnR;Mxz*MTkSgW>e9bi&bAhyZiW0s@3D# zda6aeXE$79uI;-F?bt&H8rPg_yXcCqp9rK{YpxxnZBMzeH>b8-yGgaNlMdtapC|F; z;!7&J-7Kb!yK=4aOK5Rjw^FSK*XmQvyTNm+_2HUGwP)?w8<9WPc2Vs?H(MGP#I=*G zznJw@3x_7s?XRGs+nj7F#_+({SI|y9!~f!Xl0>f6x(1D8sHv99wfQveY!ds_G?;5U zsn+qL2aOxfwZ5;RZEIbXYGb(e*=zdwFY4?fDo*6$R2sPBeJ0hixVD07r&{i(S~l1A zQ0-9Phg6%zHODv53a@5SZ64P`skUS1N~$g7+Cr+CYqVsa|CVqunXb-$@<TvNY8+`ClviE9Vd=;yyw zDn1im)4;tvFq3Ky2M<&20N1{z+M-wN4eKb^E>W#YG<#`1#kK2Ho33W}LOIvY(8V3Q zlS}*ik!vpyCz8~T&8he^7yqP<$G#dxwd-7~@gCad9tBjp#kGh(XoG_Tux5Yd7g+4prZP{zUSciyx@yy{QTvIaxIu@Rf3k&xJF!iPPI&1_J;Kd*INAw?Oh`_=~i4zqFUG1DYUIS*H%(Z z+~aYdiXFK4l!^|AaA$gwE?hJH2Ce-O_7d#PwFXqXIR7&m*PCk#>FV^xV^s6wT6Y>( zE1x|h25`-fYR4`{&^R%Si)mEcoO6MS(OjEIwJOKh2a5!*&81q@pABf-K(1|~+KQp< zwLgPvd#SeOFngUJ#>hcxW;e7jtn96&FqQp;|H5 z4pHsq@XAyx<=R!MEjz_NM6BW38>+pV@`lE3FQ2xVL##S;o5K-D2!!qL}gr?M71lu*w5=Q0c8OHXEM{+u9$Y+1 zwV>!A8rYd@52#i}>qa#%uDzsM|3_n}){ASVyU_Nyun(=iTx(A?`}I#~Tp-svQ%%S? zCsHw#i~Xn=)vi6&qPW(HuCDOKWvazYu}808cOHd5~@8|L|^C0 zP_C_{TILrUsWz&JfBxIe#4qPjaXb&)PqjULZ&6L;+G(l{U8SYkRIXj5+6s5}MZ^rQ z-KE;GhYM-kT&_K4TII!5n-A>)zA+87S5L9c&#dlXFV45utIVn@DtncKs+P({)j-um z)m*j6zLm;N)n3(6)m7!K>ZR(Z>aPk?71@WWqEvCJBvq;^Lp4-2QZ-gJQB`7}shX;q zu9~fyr&^#|q$*S`Q>{>~wy#xrjcS8xvuc}ahiZ>%zv>YFf2+FvDb-okdDTVL71eds zP1W6eyBZFy)eS1=U*A>9zGjI1blVK|Q1wXlSoK78rh2M+x_Y*Hp4!tce`F1ZW@1;n zo9esj2kJl6&(yEfr`0{|E~qc5uc~jTBkXUf=h)`i9=G+k`@uHI?yBvtws&k}>>t?X z+ZNi+QRS*)>=vtvRLfN>RSEXam6zMDvR!YxU6pFLS2ft~uwvp>C~qS9_?J z*mYAMwaf49;80!su!y(_i;0T?R04Lu0XTztpfP9;T7$O06LbYVKp)@_fi3QmD?@FVycTnD$n@8A)5 z23~_dfz1-)q6ZdG71RK=KwZ!Xd;(elchCVpTe@_C;|+QPKQI7j7zxIK$zTeY4(5P7kPiyMa+b%m%sOOCbLr(jxfse|Gp^!Yk_aoL%(Q z^Fy)p|4r(p)>r|)92<-u13r`%o^M0{i^aH9ddsFFSy6bNc2JpV(*Ge@(6B0?|3zcJ zG=Fj}hel!;UN;iKD3A&AKoQsoc7TK66!;1J3M#-W@U|HD0QzzOjY+l2b!_U{G_+}A z^NG!;Hmz;kY}(m$u<2yep>kK7ku|(*dfN21>1X3_6KE4`6J`@>6Jrx^lVmf{W>9_$ zX9t})+Gd>1L>tlObDOp`r`ddclFZu%c7gri2sjQ-fpYL8xB_l~+u$B}0G@#7;0++B z$UF_u0}H4EssktB0vduQpap0n;-MYr1iAws&d zOafV88khm*fLyQ;ECxkjIamqSf{kDc5VzxDC)f+hz+rG4oCf9K0=NXOf*ar#xCbi0 zWAGfj2JeCDG*%7_zyfSRHQ)%GL0!-gGzBd{>(fM>=MKjMbOPN#56~OC80$E@hm;vU1T(A%<21Q^wSP9mGjbO`Zk<8l;XD8ST%D`c89GnK_ z-~zY=u7Vrj7Ptp0z+>U-<}FaQg%1=WBfa0YcjL(mko0IfwlxC0N+33LNJ zKyTm+0zfbb2hkuNB!e_C7z_iWz&J1oWPxd52ABhK!9uVY6oKVnC0GkK0&xo-wu7Bu zFDL_t!EtaJl!FW461WO(fLq`mr~r?_bMP9x2dXpJ0bl?YU<;}NN8k+Vf`*_eXmJMD zzcn0p-~l>;ZlDL~4SYcW2nOLG8pMNSkOl^WVPF&(2PT0mFb&KAb3iUw2o{4PupF!e zYr)1dxc*zdCk zj=&kz1r0${&_cvRYv2w%Kqt@*^Z>nqF9-m^ARI)4c#sUzz+f;8i~{4pB#;HBff-;9 z$OQ|*Vo(H@gOy+{5I5ps3)l{Jg1w*&90te1X;2O>fJ@*ixB+f~d!Pb52G7B3@E)kj zu>-&WEWj321CGEMY{7R$bzvKn`#?fZ<>i7z-wV$sh|%EywlGfin}#0rS9o@FiFb3c*rP0#<@GU_ICb zwt#KmTd)i41^dB4a0DC&r@$F-4qN~i!O!3qa0A>F@o)$H4l2MO;3;?kUW0ew15lsC zmI6I6fl9y@*n=9NCU6EWpgw2>nu6w_C1?ZOL3`i{I)iRN^u~h^=mUH~e=q=qfN&56 zVnG5(2B{z&d<3Fa>0T8DKW}0_1^(U=b()#bEh4T>lktR)ck5BiIbK zf^Wc1um|h|2f$%)44eetgK}^l`~)t8tKd5L4crFzzyt6IJOR(aEASTl2~;&K2eB41|4-(hr8lDy45IBIcJm_(h2Vchk z_puss!Djgb$u_URqDYy|EgPLsNvI~&6>8KBSdNdrAO@s>&ww}r52FA*rgAbGsfnxL zC9GRFp@Q`P9J*Z2LU}4sp*{yz)@Q<>qbSdVKVMP)68>U9+Z8JGrSMBC@P`R1;w7w9 zRIGu&9?%JGQA}tPv{h`PuEI7&{I~FTv3O5mFXCx`Un?fQA9V*=y_ax=Sy$mWx2G!b zi^=jz&OkiJD=u(*k=v`>UT4-z_>Grub9)a~I!kojI)_~(?g5)PJ&ShTx{?MYPWRBd zv*$3mAK5}Y1*3=xI^$pX$|^mSw#t@UdsumbHQ?7|x|iUr&|ToySCkvUZ>lIahu;#= zOVCE4yTcdT^9oNzMQ8ZknC>NbD|8?DeVFbl_%dBuVIUTPuN&j&B@0okv{DH^^aFVT z5oi;wXs6$WUkpoBG>AiGEk%QYC=UX3=0ljpiOY)k;n12Pp4N}$aT8$W0Vl)H;(E41 zp8rUx3Nf;Po|Od3$l4GYa*r z!n%g=n*h2KpD6TC;kV|x8@KJa?EouJs1y9IigFM5y;xbgS^HvAU$UFkRoGD?(woOi z@IwF{Fo4@2ZbP|^fRzV`h99RWC&Eurl+)pV255i7xE;yu7;eXNJ4u8icbo}-8n2kn z?JRERa+}Mnr?3F4pacA_c(&xDZV8b4D}ujFQ7(nQ3ea|Ixh~S1Zxaezc*Qnmy@YRh zc^9nQ;a>Rrxqgt_BZ~Ut@J}hqXW*X$bifPD`U*cQ?umP_j-{&iD!u5yHkN zt5BU=N3Pd`l?SW?zn-Gp5PlOy`4jl90NnvsZrgI}0sGhUzat7=sDKl+>6->#8sobE zL7zTS`4Zkldb6_hdJ%`!C-EH!VeKS69DWp_1IBWjpr}uVpUU-gSdj*PrU)1YeC= z{1tETHM3sAc3$4W?QU3kr^aKazC(X>piQhF>yDNwcGT%HnOFOR-WJ?v^mDwxe8-=yYb9=3L=a563(Gsj{h8W(|Fu;1h6fc z#qC^Jc|iI>B3Cicb#$_T)l1hpAN~^7&R1Bbh%18jKrvt`%By(XCPmy@XyOY#^DQXI zGu#G$Cu`s;e8+7Ww?|;*xRda|XJzXam$Lz+@`k1)?t@}L^9p=v3+ScMKcNfv5(Sgw z2$h(16>Pb+=e7o{JYY@u&Wf@N{Q7`)*hrx_h2Na(Efsnj`0k2w`zLt*cTxyl;d?2{ zJ>mCOl>5Q=2Xw$dZi5x|Velil9;49X;U_7|1K|$>_{AVEVX&fNDEtw$0t1ZZb^^DP zVdb63f&uO;gb)yr?@=> zE6?~G{0m&a$n8~buQTf@{Kh8YE8JELxB&xh;uE`vIJv(E@E_6ZFAGl~JXZv~g8vrK zmH)|f>8{o`BXRnt)*Z8XO8Otd0P>1WsH-}Vej0WaPBC42x>iD*EucGP&#bFZLxdww zpeB50Ug4t9>%(uv^`;8FIsBH2avS*WfDYVVp?8AcRZ;E%zZal!VqaEaeg67k_Vg7l zK(WF%SjC@w3xgFMg~5;H9mO!~E2JvgB|74<#f_u{&* zLhlcM0M|pf4d*rrR-R}q`~d4}(Vi1i*hfNMLR z$4z2!(vD`rpQb2Jhd&Fjn^)FFeAb(f!k4mu@?!XffWA;HWx6!*Z+JT`!Qk>ru4CYp zigs(@uUC{e!QTStfZMqJmfKz2ihJS69qxyJP*FYt|2Uu>oZ|M3qW&EG3rzPEE-EIb zUxoi;=kdRAdxP7XJpK;i@j4?4_Z1E8(Xcv@C-e}(k9osqu(JLV{u{1;;8y)yny3a= zj?=?8alI1LrJb~Wj&E4m&w%*(zYPYYE3C!>y#xntoq0nSZtKI!9XEpCR8ejYza^mk zwBgoWQQrZ6C$4wp){9#D{O<`z?zlJnek{OK2*51qJrJeXks#ECvU*n`g2zR(I9DNs zFC>oFCo=0Lq`=Dkr@_zQ^+RCU=l|h~fKl+r@_-2neKPzku21E52Dh_epPhB5_T)m)iQ@HRPpZ{sVHpLcSMCH%C!7s4#1a82;$;#4Av>u-We#h3!^>4+HZyb4WRl?Zud}2pa1)~aDdyxuyTjT;Gg9B_uQ6qdmdJfy9ED=qI?bhuYg|4 zTMGRy{QFFI6&}L=_5S}9g%`ZyHMj3zVpm}zU!nS?v?2|xJP{*&3)6iC zyO-9TsRC^#+R1U%QFeOCe*SkAYNH@m)P>(bQEm*s8K7I&g4lv`}LWaN}t|*U! zKUPtm0DrQG2ijp4w^O;zft5R&3I7X4IS>9qMR^hY0zmsI=61QFeg*v1it;-68+n<1 z|F;>1t%`sh@OLZ9-@z{fbbv$5dJ0FerS#?^Yv|qXC7j^;X{P%MXBAtnMT{QE3;F@E zKT7eUaEW(RRS|FnmDhms8vd&2uqI+}u?}2?yWCc=csP;`EAtdIucQ^Zp>w)Y19W-DX85)&&Q-AI@ikbytI$<3aVON(=5ckI#Y--?jbY{f zn!#^L%lN~fzrOEl!#fP*6X?VmSnIp;`Uu5<-iYx5bi#dDytD(p@cVOp0JkBE`f&JB z;IHR@ED8yLb~KRNLCkszgE6o?^YIvbD6b#EtgkRmQ9l~m=ZXnVL|NqVpL076miH&F zn~uUPUNM*3TyDRFRo(-O6$357AcZ_`IkziVytD(W;jiQRMy5+USp_d-o7qnK3g5g^ zeE+ur9c~762lnxX2e>`V?J;gob9)w6p5PDYbRzz4pFSH7@P01wxGOA9n%Fh?zcSrZ zxP`4@PouNE!Cgh*efSSqS(^DXK7f2F9;5CuYv(1rhEFH{j@u8coiw2OHR-PbayvbI z6QJ>8B}IiTe0yF|gIQ0Z=4*QGr3pC0cVT6z<5w8`4WD>@ML&(;H&v9I!*2=bfNl!C z-D|x5cTfnO;CJPLUd(z4J$bn|xBZyKr(;ZnZguUo(j^PxdZ=Q84Nw;eU0!(%{CF1U zDkL$TzyGJ9kijZ^g^`L5hCp*eCvpd4P#zED@+A151G=(l+)iip)~D?(Hc@=c=M$aF z<8rB`@Ba&!;3eeqiY43@alHgq9&jc6HLNTRuo<0iRZMt2>S7cV{s!fpig@}qzK6w2 z?Zt2KL*+h22ZPY~GuD9=Z~%3O0bSu}MaL)5>1o!nbT6ER|AV6ZBm7H%w!5Oxufe~` z^*i+X%PadG;v-)11Xk9c!+)hHzlTrWSnF-zYgyU4<)$~%gi90)p)0QpUG8@c>g?Vq ze*UkHP8)W$>eu*%!C!3J3&{;8oBbdMm z5f600ZmfYcpf`LUMY#`rUq!h;`~iTr3sLCd@T0gMtI!kRCo9US@Y8vjz5joP!Z1KP z9Len%79g!)B4+&+zVV>-FZhHrdE7K^r*k`twUZVy7yf)j`AhhV73IP=xc*C-APrQ4 zf%@R{KK)p|O0iW{*5P-f0iD2F#M8IyO{k~kT3p}4bo?mC>%Zmo4Nxy%^WCWX4#?#) zdi{^E242E(X7No2x8>ZPhm~Ie=}mM=F|qdO{0gg=R(u2gP2TPfv%W%wBK~)1J^6(H zp!M|m{}hfqqZjaB(+cSCxc#80SHHz;IiU4=Sh<}EekG=R3bt>pcXn$C&|e2&;|Ovg*P zBEC0#zqkDJe}JMQ2!1G__doZqaaN7%3zL~n>b-)h;$P?^~y7m}IE(f3-#M^~)8^vubw@K8} z|Nk2ZM{YO>{$N&?o_0eq$Otx&R2~O^qGI4c3>v~$n5F1vD*PNkFU?GaJ_r6hV6bu4 zXPCnUFhRi=f)TieA#k+58dwX77@ z3LAwj!ggV&&`#JZBwEUZ!@_alh~>0UE)-S$#`LT1f^bQ=D%=om3HO8w;j!>surs_C z-U}*?Mq|)eG`5;*8b?hnjffdssiBM1 z#A*^W$(l6HV9gNAFwH2;Ux@NX!o@Rk&k)}|yOtV6>MzcY)S>vJKrrDv{ zquH-Hq^WOzOmj*TX*{brueqqXqPecQsky6pp!q}dO!G?fPIJISw9N!Rq|EI7yqOou-|xJ!hJ&ou^%( zU8F74`Z@k?S*D$3zHM5eoo`;FZELqdyIH$Ud)lx=yGOfEJ4bs^dsKT;dq!KS`Z;Z| z{zvU)?JwG2wYRmuYaeQ#XkTdGX#doP>m4m>omOYmRnk?}RoB(j)z;P1HPkiLwa~TJ zx$Dx69=cAVuAA(=YO(rwj!tJ|&Hr@N{-s5`1VsVgy`(fy#SZU2+*vhJSd z7hRy~hVGW`h3TGdt$DoAQB$FNtb49=HPjbGWA)d%3e9_+O0Ury^cKCXzM9@qzgU~! z)ycM=7^_dz57ejYhv-M>$LJ^MyBI|MZ2c5{j{b9DmVS%*3;j3t^Y!`qC3>@|SYM)F zrC+Dtq~C7-TK|oHm;O8b0sRsEas6q1xjsm9L4QeqRexQ7Q-4=~U;jv7qObgh3_63!P}xw`P~A||P}@+?(8$oz*4fR{%C{k71tviO$au zXb3SJsu5v`F~l2^4b~%QCmFKxbpZ}_#Y2W;hEs;KhVzCT<3+<2!*#<=!(sCi%Mx>KVGkO}k z7`q#L8v7Xij3t&pV~DY&>Q7Z8j14U@#suRwU5atIX^`<9Op_1Q0ln`}xm4K}qf4>N^YMw!N$CYiEK7tGU4 zGfZ<#yM$cRLetll#ikP?XCpi`mv(&3s&LlXO1*{X6i<_mL#naNo(%sV2(#PUw*=-+a39)$EpA#Z1ZniO& z1WSr#kmWPWxvIl0TePDs<1LddpIfpmGc9v0xuRvEWwE8mvfQ%LvevTEvcz&BvmauI)C3g>Z2_Olif($Smj0R)DM34!lg6Uu;m<_~vc*p}^f+e63ECVaRDzFZ00Gq&O zunp`1-+}$$05}AWfMehkI1A2$AHhX%8C(IsfM3B)a2wn$!Jn``fb$SM0WZKC@D33A zdt5*OT3`fbPzh88)j>^A8@PZ5pb=;WnuAY48{h`ogASlG=nlL=PtdCr*S`-OKM)8) zKp2PsQ6Lp$fX~2iFcORgVJ)nO?_nG4g#C~SN8u!#hM(bA$bt)S39iC*$cEbs$p8C% zaIm1j3w$5|LLdwxAR3B7aVQC;pbV6Sau5p@;5B#yYC(O7hsMwpnn5dQ0}0R$+CxW^ zf1RN_^n^s{3;kdK41ysr3`W2x7z5*A0!)S}Fb!tGTu6oaun3mGa##uJuo~9GM%V&o z2LJZL4{#7N;W(UxpW#=y0GHt!WWz1E4R_%_JOqc#|AH3;KnS=Y45Fbp#6T%117+cb zMdW`uKE%RnP#LO1b$A2fpcd4D`p^IxLL+DlO`#dIfdps|ouMmqhn|oKeW4!=fI%<> zhQWwMjDc~G0+V4H%!1i47v{qPSOjUX64GHctcQ)T1-8Ln_yLZ>NjMEZ!>{lM zT!PDR4YFkx{1)7W9C!$i!O2{m7x;i51V9jkKo~?oG?au=P#Vg@3s4TqLo8H+%1{-m zLmj9O4Im!OM*M3GO`#dIfHsf-?Vvq$hVIZ4lAtdPfX^TqhQSCJ1>+zEroc3q1#=-4 z=EDM51WRD$V)B1AAJ)Qp*a%x719rl0*bDpNAY{UEI0>iWXZRKVfJ<;0uEKS=1$Q9_ z9)lBey%z*P2t+{C67s(!A4)-KC<8A*IVcaYPyt?p%1{;FfLc%+>Oy^J01crjG=nyf z0PUe8bcOEF6Oy1G41hr<|B_(@jDc}50a9QJOoJIP7v{qPSOjUX8rH)`_#U>vHpqaz zupfSagK!j%!%6rR{(uW$UgFWa4sduzz>2T1i~N+qM;}hhZraYW#9!U z53%qXRE0O77Sx9N&;S}j{8IA25g!^uQ)mV)pdECCB=`&lK{AYhG4KUUfE1Vl(_j|N zg+;I&(qS#EhwotvY=fP!8xBI|Qu6;OA5Oy0@GE4&1-JxP;X2%c+mHhf;W0SGVg_E| z2SE@8MWH0bKq)8#WuY9zLItPOuo(2=UMunnE*Z1#O@`bcXKG6A~c_ zK7&Cp1V+FZ_yQ(C3QU7pkP7o54bs6}&A;`q5x$3QkO8}4KOBU^kO@cOIGlvj@C#(Y zA8-LK!!^i;TW}Y0;4wIsky_vdeh>gb%gFx_KDZ$aA|M)yLrI8%(ohDrfruggWpp#6uHk0d1i@ba~7!=$?G&0|Q_%41>`y z4kp1g_!?4SA*8`~uogDKHrNIG;Sd~!Q}7G?4wv9B$c8(R15d!~3ET8J9x^3_58)6E zC7={M2j$=ucnzvS9J~$n;eBWf&7lo^0-d1;Btd@|1VdpId zsW1z^fd#M>R>B(C2wPz%>~j<{Qx5Xs2%LnokOddvD%^nE@BkizQK(Rg9|S`f6o%sP zG?alCAr@YRs!$VZLp^8+A3`%|4eg*)A+u0QcRuune(*UY!$|l7Cc+e$33K6FSOP0x zHEe(_umkqOkB|u`;Ai*^E&wk^O}P&LzByf zfVZG7ya$coBWML5Lr3TaiSQ|W2BLoijD-pC70iG+Fdxjt{96vIU_D6boSiPE)8Tl& zki&5l>2!<>nM*Tl|-6ZMjy6K%q3TpyH0|x4Zy$vjZrBmxwGQA`bkin zq~H&q@$IdBmc{_FFXR|sn<#B&Fw;HCgR~FkDDY}XZ)8y%r2l@XN$yU zUV+~vHJ5NLl2f9Vgd7R!TzGoVmZ2rh_d*J}YNGpXXaFBVGiVL%pgnYf9?%>5!w?t_ zV_-Z?fm!ekEP!R;;|OyVamBcvbG_uM;7Uu|Oi>CmD9=y2ec>AKN+I}Pxu&^hx+D^_UEjFo zyB4~ZxQ>S`bCoqth5Q_{(zVL9*0sU)y{o*j)s^Ae<$A@~>pI}7#9>%H3)e6Xx_)vU zb)9gXcAX0`&$@nf{qDNp`qOpQ^|veAl@;=j>#pm8>!It3%jx!Z`?>YmS%K~lcc@!V z(28&ub{BP*aKCTFxSw&$X8|a5$6eq3 zo;%+Cq5DcmQ+Io#xx1CSt-GE3T1W@e-PzsE-P7IMeIul=yTAK0_h5IjyOVJ%WVm~j z`%cJM_c(V~;|15hArsv_jLGh)?iuc{-HFCr_dItWV}ZM$vDlsFUg1u6uW_$;Z*p&O zZ+Gu>KMoma>~Rk=_Pb5vNB3d(5%)0Txcij*XZJbxYelo%=iQgwSKRM~TyvW@+_&6? zTzA~}-T%5DyGI&x3l|FY3iS;Q3U!A@ghq!J4~+>e9a=WDTxf;R%AqwvYlXfO+933U z(59g+LlZ(fgmw+>71}p+VCdk`p`oKfzYI+YofG0>nUkZOE{MGO( z;ctYSZ-v(le=odI_($Qb!aol07~U;BG5pi;&%({{5#eLQCxm|$J|lci_`L9i;Y-6; zgs%!;7rrTcYxs`vJ>dt!4~HKMKOKH9{EzTI!>@(k48I%xZ@44EJ0c*$6%i3pB%(yb z(-CDNUW|y1cr~JGM9qlW5p^RPM8rolj%XIqDk34GeMA>CqGv>(hyf9UBZftcju;m) zDPmg0*Ab}^3nS7ZzKd8Ju_LLmlTfy(d()Pu$_66V56ADa6g_;3U+!cFk@EtC=nZg>%1g&OcSG=kR94!S@R zd0+G{T5&Q+r z2c`G~k(BTvREN6o5hTDUm;uXR2ke8Ba2alcGZ+t`64ZhBApv^BD3}guV6NuhIk*LN zLWm`_fDT~7WLN?#VKt0)(WQf_@C~el9dHm%!Ow67?!zO9bd#FU6%t_xjD)$cz)k+& z<%3UXp%fRCfw$pf=m?3B2HW5e9Ea;rK8);vD)2V6f{xG|2Ej-e2Qy$1tb*@h7wm^a za173bk^fnI=#uD2IFI}j{(@|{4LR@_jBrXe1VJbih36p--h(F48a{?D&=dN?Krmr6 zjEBiE6XwFVuvmUv1}k9=Y=G}!JM4mkU_R?e_^^{BA(PKPLl&He%kURmighF$1+%jw z;S@5PYuk{wk@w*-I3q}92!O&61J8n4mVYlp=T{sFRgrNpiqBJ_9-o^+E9eTnp+C4I zsTZIIG=>(C03Dzk^oCDi5DbNpFb2j!3QUJNkQzz;FW|#sSP7e8I~;^#a0)6nawKFS z|AuV150AhZMRq`8C<-x923~~nPzkER8&De>!bk8ibb@ZsD~kN@!-s(|7?NQ)jDoQ+ z5hlYlm;>`+39NwCupTzS4%iI`;V7Jd)9@$Ug1hi9(78=9zy|^#*yLYfC<)~t7Aiqy zs17xuHq?hk&>Rw=19XSp&<}>dFc<^lVG7KGR9FNnVIN!u-)NpTI=Q8y3&oqy@~;fqWg}ZQv1Kz`wzOp%TYhZI_O|R4&D)qoQCIsy z4_hYMvX3qM*>a#Q2ielJ>kfGt0_TJZQ06}ZEe}kmK|)_*_PdqVr%G$>}_A`i&XjF z-@fpfEeG2&*_Oj?Im(t}Z8^@C6Ky%!mQ!sx!XWqJO3Bk7t(CG!j|c_ zTw}}iw%laPEwB>%X7BOvgLVOUb5vCTVAu} z4O`x_ZEf#+rK(IT8QOVDl&<&t&6>JZ|Q*+8B{98vosLBL|sl+l^1;QI~(DWxo;gO;DsO z@^@EQq-Dg3j1)6YbYxaYu}CrHR4ri4DH++f@Y9iU7`hmA%+itn%cgTaLSM&5Fpgc29%Z- zyVj8$2eqI!)PcHC9~wYIh=)ed7@9&eXaTLD4J1H2Xb&BsGjxUS&~vTBOituO67+?B zFaSP-K`;c8VHk{nQ7{I+fN?MZQeZMnfoU)UX2EQj3#l+47QiA{0%@=uR<1Q2$?1Gp z4QpXNY=rM&3v7c7*a^E~FYJdO;2<1^OgIY1;Ut`fpWzqy6|&$DxB!>nGF*jgaNXoz zHr#^Sa2M`F4m^a%;8=(C9lXE?{2%~=AOzeH1`!Yi(NGkMLrI8%QcxPoKv{SJ%7Iy) zf3Z*jD#2?|8LC2ccmv{~7Sx71P#5Y$184~G&f5(Saum;w_2G|6fVJmEh9k2`bz&)4Y&#az#X^;58z*T1W%yQdPlMW-rx)V5D3BGf=~#DNGJ?Npcs^Zr{HOL z2A+lIpd6G3GnRi9pb|K#>o-QGrJ2PU1%n^o(<3t?4@PE2PARm6xA~-{Eoa}*I%vn< zv{BqM7RJG^g&YYJkukWL5;-Gsc4TVgg2*M2%Olex*G6uP+=8Cnk^7adFC8!8>;9Y21obi7rKJ%Upb8d)--=%4C)=IJb@Jo(;oBdf~; zXZNvf4If9_;1gblSflUlBOU~!Hx$Al5(+~R4}WS9XfwOrsU#<%u8xEBy(g1mf-mqr zFIEZfTd_*-eo=YsIJ7~@jJRL(-6ye@)QV|1$GCj&hO_R;uB4WwM?7+SSrN!e*plmx z>t;gs^z%u9juT!n-iQ3B`__*t$hR8WMP)8nPV#nq<(J|o2^14N z2c`4iTUdBQronH{zHh{-{4NttiNgIEIEN0EePpxKVdf=^D3c#DkKDDAt>xdj%B2K*mU#J| zSoes!FZH>r`R;T7bW}y^m#3E+3G;KD{s%rW{2jl0g$7>@ZsIpT=#=j>UQZLCO9bXJ z`5$u)u0uB5hWn5Mj|;>$uCWzBDR`0%x6iIo+0dz07nKdMQ@5)C#i#y8HeL;WhD_`j z+$GAriG@@UwaJlH6j>Zp_I#3+)YLOy3MQxf(QV~XO0hAjB&Xl2OX0g3{Abvo0aEzN zpr|aAgIJX3>6*T6Sah^mSC#i_{8}^Lub8rHJ;+Tn^~{a_O9egdSf=u^c=Lru`sEzw z_z4|U)G}uMq<)V{u)V7VXk4*t9g@52Z9*Tm$*N6;Mdf=0%v zid{0kdX#uB-=*4}tP|vC5R=$f{$&bcfvs8vpY}d;0bqw}4 z2S!~Dp3m-`p;2T6f#?dopf`L917S#kl+m?E{LC+n{TFhaomRe^TlA`*DOR3CJyNL`d+{m>?p7+SSN^5*MF?vF0zeoyqinH!tzw#$vOgKj&& zZr|SsaI|F;;nm;{zW4kKv!knZU|W^7GYQZf_y*>|x3CZv!_rOEttNHWExWaslt2P$L#O_i6+C(baMxw4&~e&3lQKa`z{fvU(~#{E^e z4%r1FrmHo_yvr)3OI9BI4e{cV>ib*y#jE|#;w}kx!30gcLE$v?v zKY>EuQ`ds`_l_)oq-Oz6zil^fcH=N*@f;(iM2>U*jAm4KZG!{oUqtdkftVsVEQSJ4 z$BsUG^Tj;7KsLm_d&ep#v-YY$r@WtH#ND{#Jkq-pb+c4qFR|^6${yWip&Z0Q1^khe zl}KCunRdU3LM4yK?CR5vfjy*`Bg|hLKr4$JyZGd%0OBsSy=4mWR7bR2Ou1gI>@F-Tjf+Rzjn)UQEyDfjn}a zF_Su0?o08_-;0m}DycT^^KXod84sKp-8<32Tfw$sX&TE1O8q+&Plm&2_!7p$q`Z_c zRku`^#`u8yN@26EpQ|Ly@To>&v8wWKaQH1Ov{S|L?->;+?KX4VF7-XR-)2kpvYI|O zb%_K%rl-~NWER`u5jm5o$Q1H{SQJ0L-bfz!z?ocTfJ(mjr`B7FrmRm2QqS(Cz(m@` zzr8kdg{pzIsC?Jr#vhC7VaT$=K}3^4)AzPSUgR zjET;=az$nu1Jdq0ANG-3^wVCHX9HoW%lJ92aX`W+g z;UsX)-e0JCm_4IAP%gs#r9vu&+cNM1dJ5{02smzA6`SMVF-F<0_ngl84OD;Y62-IP zX6pafaa;w*a&vMss{u-NthSQ()L|v1(5U3LzbC$8-4}n}DpUyp)_2|Cj!)UB?$3_; zK3^(Hr{6P>sixh~#6_(lhApBb&M~#Jlce*eTgAA6(wEBrTTJ}!|9VXVnUcNJ3T(z! zCF57FQBpcCDiROZsMPE{bFE>@sBzA--K-M7XLnK&#{sV_@6o|}i+yRf(%12+PXTJ; zH`@1a%D)*fB}z6`FJkBN9ul!tP%TohHq?Q-P#+pVLx_h)&={IRGiU_~&`$Ed6Cb)j zPv`@mLVp+tpTl6XW++l8o9a_j+Eq-NS@lKPzFn((hY(*&^6)3;Q%6 z1j3*&6oaSWX?PZ%+v3Q2aSPAC?r2J%O{!JT@0mM(%Ke^t>s(UusJz0Xvp@nLyIiuy zwonj5-6Y2xO*JmJy6v3ZwhP_uJ6=7!ThNz?_d7u_-yjgRO#an@`p^*Kp)n!zOfucE z@Y*s!4ffp)Ue9eKKH>gO+%JKUf~@4#yuqFXQo7$#PIf0QH8MBlIM?--{^C+E8Nr&; zM)yKVZ|DR4mFIa~@6-m?s3x|=vD}o9?vso(#WQQfY27c^vnI&XWPO*4EdG}hxha#` z=~ufv>&G_kYF;^#*e8crLuHAG zXTY+WAH`pjf@cRHBTz1cM#aB(Iyb~(H_^i`$$zat%8GP2^mplmNX#XfW8=RuI#0ao zJl)?K^2R(8YmyaEsmdMaeoZRo_>{w0IB><}ycK^AP#M9oC`-JPsAkhSgQSVy?5IM1 zUvjp_6i&BzDqvK=7xe7qaDicD(I^-L<6r_zhG{Sh=0YkgfF-aT(qT2MhmEiWwm}A% zJNdU4_QOHQB>#^iPl7Ils@8kmYCPP-*Qr#}wlZz}6Jwu_rQ_u7q~s5*+B5x-)iP%J z{K)TClP>zw`>1kdMx_?E`fXW5ETdgKjgVvmDVb|+5(f!STm3oR#5yKfO|o=e<$m!< zl7IHN-A42)InMg6N9A@v#C_}ptDGedUa0P8rz(>C&-lu+8pgHEvnr|(UdZ3W!GxJq z)X|P1W&kI(9P|CmtD9f_sGz_FQAIh$WQ_mvs79Rpae^}~N=1DUxHhULhepT=5M%w* z(u}RV)EoRE5Q4!4;U@ngp)eGK67Uo}4bQ-H@I1T-FTu-O9a$BTuR|561~s52yahUm zrR2*vK~hG#YLYTBjaC@RcON*9-0n^le<`ppjgi?4M}6Q^6w6J;tNic&-w^H@R=^Wo zIYoc-jd8zijxelh_U!-!f4?1wMEZ)_QwfBmltfIo zp2|#aazPpoQF#B+bYtVz9Ow1M&2mewIFzBeFGFTIx2TEV6^u#612XaGD4c}T@H6~^ z$5}{EPqpbqYDkr;2Q9-!=C@YsYQ{Zf4IFMivqZ(logibly@ArOx;Xen^6>^r|A9Mj z4<5k3Dpjl&PX-^lmXsRKGXPdL+AZT>n{)4rq4z|9%&52|Yb>uHLv0+2+hUK`K3$DM zOMz52+N1Q>&*Wa0Zo9s&XCG3xTJ=R%wYuORZ0yCO;R0^lre%% zK@F%0Z^GN#99i{{?}E-6c?!g)XiAJyg1e{~#Y8=wTarKJ=7Bhrl*x+9Z*WYRnBP_| z#$35C^Tth;Lhaj*HD(0dbw2f6W6Uun{Mu4%mr;_2qH{QmhA(0KHiwz7a`3cls5;vo z?drJ_yU_ec+rTTTRRG*+);KZs*di67aNo9upF=X_YH&zYBxhP#=H8ijJ_qJ)qyP6U z9~Q!5SOzPIwN55^{9=5p?o&d?p$4Cw^Q*pLI{N5?c~3T zB||4qW$DAMRFDCM{GL(8GP7>%Ia8V3zv;pr6RxM=nGZ?&RnT}Ju>~~cNs2~sQ78#9 zP-?p)s|?apzhtSnk4rMG$|wFcYZge1%aUiMH?J}7-@fZCU!gB0xNY!OFR6S>MO8r2 zYfu@gLUokqQ*4`aMw}XEFdlRsjEyH1+p784y4>G@`<2IZQq@SwwC(%uOXqWICg~=7 zDi!Nzo+F2&eXYsHl2`6J|4M3$a;r-v&$D#9S=8; zOiCbPcUePusnW&s<$aj4nRnCKadJOZelor?t-ha_Sp7+|McAi?1l|dh+G=4?rOBFc{*^C(K+XV^SO#msC2Fd|KuYl7YlKBFXV3qU?FKZSGI<&n`4uI2#W||2B>H1AOwMZHLm4QGXXTLP!P7I{ z!+q$oCg>BF*Cdc3n3&Sis&Q{k6)U?+ev*}xeay;R%XVP(AH;N{J04o9RF?jqv|18M zX~jG}miAe$C)7O1b-M=?bT(H}T;hE7yB>;J?ydW>2uQ9+jHE@6Jks(MEU3I*rFOtS zy$mzd(JQ!$-%i!vlgF@$-yif>8U;S%^=Fv3aU($N-0u*}ci}zw06v5!@DVhJ*3cF{ zfez3KxEM|v-%38)oF=k~-wWi?L>ztvQ|&U~xk5lHq?9YC zRjhP(O~&*8E%g$oSOl6K2qyPc?ux~4`#CqcJ@1!pwRlvv+DtV!?9KjS z^$22F^K*0$y5c?4r?GbsoSZklE7S5Y~ zdzqUn;z&ZSA0v6BbYLXL^89*!w`_-bjgoX;Jb%wvWmQJHQHo9cIjN95|1!7`j}nI7!W0|y;NXq&haeJ`WSfklz|CmniiSo=}4PM}n*#w6ZAjS4r z^4T-=;#ic(_+F&c`yzD~NfxLS{CBEBW93{pqZ4LVv8Sc^?TMNnP@4eGME}?D4b0m? z{r@c=7Q*5JAr^a&DD#>(RxMxaT)H8Tj5VLTp8LPI1DQQA&$yskPkZKD*4lXnKKaa* zeBV>Aq+0X8UI{ad?BE<{%cG5GMpL~n1#Tq7Qt_sx?Zl(qupfSa!*JC0STF98*n4`U z+YP4sQN!>ksTCh;&lyG^w8np4l@}X+qjQ{*9jsYzZQD)!aup_anftd)57+#o z0%d(z@c@opB_Mym1-J}X;Tl|rY`8@r?;`Jmq+;d7#;VbA#08UzR%^*4i2c`Nf-!KX zBg?h3z%%bL+pQ`ZyCWHNc!3f9);;I!(9V>fOB|A0DylGUi@{Uq@k|j}IibHxPgzg- z?%!a3sY2CnLp_wV43MrzSrn9m*aAwl<*NJKF-GT-x1Hr)k{M1bo2qbsjsJ1~@s#mK zZ2ALdhklJzl`Gl$Huu+)`%RB2Qpqn#s{IX@8Z&M^aPID5Ey0k2s7twyg%mXDn8^G- z>&7rLc8U4`rA<)U9N7|DgXrsiuBM745pa4Wy-ImguZin|!yY&gkCL;*)}L3C>5**l zlC#v@?sZpt^~lQT@KfCMhtF}Z3Kx@7o^GWu>hF?$QV1nbahK;AWAPqS`r8J@0y?_d?Ifeo+;Hp5l|r2I39vBW|Tzqc%#tALRZn_~aZ3xKqyTsNa+-bZfG_Iz2IDBn}dTNX;4 z^qF_9m}QmTYu%46Pb-!J6`!`=h&%PbIqn~8`G%xKNyo=t^Elo9Z_cuRhok31IE4Lf zU=hEzoKzmgvEwQJW~%>2|I7Ykqh9A|?|OlsazJ(=POkolT249;XG!{V@Ee?mi|{A> z1vlU(`~&ykUw8yhpwKQJJ@5s82m}{|LO4W1VJKqquNahor{L*bj;v>qo`q4{aAgSY zd0lEXiFweL#p?N<7$oz*V)vnQN#L8Hr#ZBQw&<1AN_^pDJ{_ih6jB!DUzwnv0Npu} z!Gp?{vj>&bla0DD(M@mX4;CAh%^c@T_wuG`#hv7LuwzkRTTF4i0#5nrj= zl`RZv71Whbc85erf_^XnK7&Cp1d?GGF&Tv%1D>fN0rvc^SD;?b8n04kZqK(>rIk$I za4v4=!=hbgUPB?ZlV$a=hESp)w`0-8nrw?QstrR4@!#lQ@+cpS6yXG zcTIF97q{-Q=lr4)LesQgri#53A{|xNW$ko=cN(6h-^3e@C7UdZ+AWqe~R-?J{~*$PyEnH}{^DH-KT0QJB%nbmNfzw50M zrsRp|56PV^J6-7(+l_>`?l@B`jxtnIceI}S_|Ilf$vywM!Nqu|!&={AyqIBW*y(^OfgkXm zgw??-c;~@Z-gIz0suHgv7#q@`mk!X?3pVA20CLcOKhE+`OZ$#WVGV46O|TiZ!VcI4 zd*A>Zf+KJYPQWQR183nJ{06_ndAJBy;4kG3N3Yr=|BlR*ZSuZ3W7Qe8}ShD1vv+?9^7?|4z{}Oc{yWb&RDe?(9 zo|YE4ho%_9q3|BYe?|CE3`)RLgi4faE4Em>^>=N8lV?A-)a&jT%P@7|RVVc+YnUCM zWG%tdog7`;W^dWA^d_6nSoM4IPFZx4*FDlxYPw;`_0V1wC6AN7Uz%vWDne>fNrmoj zuQh1Wo$2kYNlGz3M5)w}T})kgq0S-yqP{hJO|i$+k9vdT8SLLMKsGjY;bkDQxrx2C zq(}v*1g}9=s19#HEvOB3pf1#h2G9^1L1SnN&7cLefdo>wJyKHCHs|H#zb-JpJesQ7 z>%A>yon~-oMeG7&aP$RCu(L>5S%PpKD)k_GQGH8**=y zeA9FEG4-&`pfKU{ow*LB1FEwj(Oz0fN~^hJF~MpNvX-C8y-#ewqDQ1;OGK}ADstUk zv+RSJCf%wCHr#~H68CVqE)WF%Ccm*F%G2;*fh6(XX;4)FGsQcEEVOwm+mtJ?#=J9&L&5Zyv1c=50>l^UGB-7R5JIx*^eIa-`+vI1xKF!2y{h5 zQ7DPdLbCoR;o9#1$UDzR%X59Glo8#P(p@!~x|2NClM%TyW%lHR-VfxtwouG(s_=^a zPZkx50$FUP3X58yZq)^9;lb&=p_P2sO{(VEeq)C`vsNc^CS;ul9-pF zBD@Y&pc?Qv#ngm1;VpO@>cPA49=s19!bi{?T0`3c*%wzR*G6Ei|4%MwO}nn$Jk5wZ zlH>faT3gD%95tsq90jA{OO;=FRxHmho5WtWYf0WW8#!A|-A;K~CZ4Z(*X1o%lJ`^4 zF%4$G?A!p^`#+>KdX{YIql>bQRR<{BUypNjRf&Fy61^A&%iz0QCH4@WUk}@+q*_b(TvS zWu(l?an8CU6I0gg*>UbYT_AuN#jF%co;OpOZ9kaW#o+l5QjbO!4lWdMpsQrBM{CvA z$InLgzys_4YuumxKko1TF=Ieyj&nk03+}gOzwdMZ!vgnHe^~QBLD6Hx7~~wYJ}x%~ zUi;_;?X#L=N33N`kX1~cDPS2X@{%+o?XJqUUow}f$%nq>TMo*t&WYI)$;H`9pTd)Ila;>Q%Sy1X>)79}Gs ztsL&lLo8H6pQl?rbCPQbmqCs^|FZB*G?W)$wqm)%6463s*OX3 zOLrj|uLfVCXD-S3If@3uP#EbET5+sb#>6lwp|Xl~!J=$;>=#Ddo!ic|;MOXjsq7q8 zsY(+qlhbK_8T2G#gKwih1-(;Xn&kfsJebXwx!@Ve7 z-PxyGP(H-?xV!L)peyPz-iy-x@BAAU@wVqp{CKsWGTmn3*#)=+SK$WS#B)_{*4$E&NO9y_oNgxQ&1DjMiCyvf zU#m4fX9hQC>CM&P7XCxkKA$HjE3}`11Negf{``-Zteg_}?K{jfnl*jk>@zSSxAKYP z{vrkLmkmj({ntAcbvC3N-Itr+@-)c6L-+0UGM$3oC5DNsuc#P`lz?OxS!^`>>yGpK zA6;oXtnE88B9@fZeFC-rCx~bKb+sD5iC>ezM^S$V`V=k|6~qhU($bzLZFJ@fz_OQTjS1@kZ0|ZrI5_cu~*Ym zfi5UwyAwr~TTWAo>YZt6)di}g7xDJN?k&~on=CTwfZ|Tj1$sa)Jn4fJ{W4P~Qp%L= zkJbL`hNkbcQ;o~(SYj9Y0ri2rR8Y1hbJzz8hQe?dT`(W*f#xq?4OW30b|x>DlevFd zf%|0+ATN?8wHJJmDAgj#gV0j!Y!e z!%;^z$hO?Q==uQ;qwgqEl3J$eRg&9}pB~ui0gkD+QEIzh=8O4fGh=Lr+77H2o9KE$ z+5_=G3`!En3r%Ml*?Y5{6T4bXuMA{e6!5~nuEH&O=W9n^u-e2gmRF9x7;rJLgh@i| z4mwL{&%tl-JDi7$@F!e>zu^Ylgn!@;+#{C%BE@qZDA{f&-wSrx^%`U8M@S$Cjp5Ne z_P{x&r`eNQtTYCtC;l}9Zd!wc1DIMM8j3$Ik^xedjiU%H`e4|C3p=Fsv@g{#K1Bb=k;uKb3CRTo6FcI z+PgU?ZF8T;qm(<3B(1rKI5mHL# z^sO1u1RS-4jwtbry>1CB%^I&ZFn@CXz1#|>7x(umaKH2`B+#;KQzU_~`hQ!(ry23z z+;;XZ+DgSr?6}esmYMrfQLB7DN13G5P#BKV(a3xOq3bPy@7%MyI#XkLMr>}6XA<{L zEf5gt2}=O7Tbgz!f~L?@p{|gUy`~wd`yM!FPkK)^Mos*l@#;z`nS;`K@GUHarFfte z(r570BOOxD@Aj-$l%CQ}FTbFJ4Hu>8x2acV1nMpem{&(wK4$GP{kM{214pVaf73go*4s=@AQ zMojcQ=i;f>vz%4JnhlMsVYPIb6^>G>uLf_TUOdQ)SEZ+ug$EblGM-#RUWaUu)RBd5 z+8-%%bmdHy5C5_3ip^%?K(F_f2?Ghx@|1OIX8fD;*7{8`BKZ@5OM%P%Tc|hmo+ERP z1V6;X$Kd>dMTg)6eh>gbKRB}7NYS6%%*;?8CEl@SFSK1>FFej&+i&l7^R$-B^Pg?o z`BINtX14+NzBBIs@xWPqU{_U;b8P{*4|2#9WLJjZzxx(p_KR)#A*}!J5_OYgiy=g% zpfr?$vhV_wgYr-TDiQL^$f_Wr&t!^5WUM}zU3tTCm{)IJ7c4tk?*ujE?YDP= z-zQ)nz=zNTK7y9e8rs6gM4$t*6Lf)YKd}E-6zgP6xR|%7OhT@wVbU8~9TaW*6;p}| zklJwSaKtUPo}TTmwou6~+33$^bLkuZ>O0PFepnLaqH^J(csd+L!dUq72m1fx`7jYC z5xS{J&!p4K=4Mo$YPegmM5mXWbYgX(7IN=W+(cnI+6FhG=DX$7nc8o6kQe1+6`rkub+8FG!&W@sf!qb2fz~^v z9%fh@l*UBmZBRPOy(jHJr?VYL_5ZXrI`+vam8^QVd%R=-#=79%X#hcuf#43{(uW`2`;H?AEeixf_U%@4n4(6u+yx}z`=`oaJ_kyz=)r+Sfr-l7|4*Ko2TTJF=+ zDY}~0&1=GBtNqYhy7YIMmKAq;S|+`SY0YNq3PtyVWevBEg~U=;!iz&|gk%*|>88uH ztz6e0>s1o64nSg^kvP{#OuX&J{o6c{h6D!s~*Eld>aW zG>nBWVLVI(a}xi)f~hbaX2RDn2fl%M@GUHarLYXXgH^Bw){$kKkegvEY=<4N3-*9# zDoTIR^ErTOb>cr+i||6LsCz+?4@<@JQc_V1}gPd?Osr<2+pA3f#; zrDF(ng6~1*4#0IVuj48mkGz1`_FtJEll*e`U8o+T-#(C25UvK_A|TNyC=M|mN~BE4 z!ZTGSZ2N!e(6dTM_a5x`%D(ShG+U0rvyMBILG1JBcnMyHSI{MHW6T0eYqfzfdCNS* zFCfR+`dO<-Ec1P0A(N^{7A93k$s14$MRky(tYEDvgU@^^Wt-i)2P{>FtMJ}k4b#gZ zr}bE8^}LUw51>b58yOYvIDh#$fvm91Cvx(c+$UA7q{cb+!e(N07>MG* zFbt1IAtg2R#&rE?#*DMZhO!bOS6>?af2pPPJg?^_1Mx@?9Ak-{XUMJj0V`0lxma}Q zUa@RO)gFi?RDRQEhFGU4SgEG`mFHh8mJ7P+^jt6`vm;VtNdaB%{hd1FDdDSrxydi? ztkV+m6ziQYa+pD+Bi6f`_lMqNy!U&1QG0MWlg~H4n|*Kke(z_l^*># z5Z`2yZwgF<888dJfqAeH7Q-?~ht;qFHo;cd0lQ!y+3+LsCpZR@9eSOZwQ$91=r|jK z^}lutsH;xd$FEaFvOuQFM1kz%RrzW!#dO#Q66iHSdZt`2GRo{}O|k1^`Sj8(ZGN{F zFf#ttd$#lzY3n$>yy-XTd`i-HKDWx)A9C9{uCTShP)0wV0hNjiSEGzcmz+N&>@ah z17GlmKnMmGghDt(LSZNZ#h?T{1y94Xha6eYBVPnbwFKj2ZeXRn=mkq^{4W>utfp+G z)3K84`H#z@l(UgUDYVbLlCt<=JlH*G+BON=w^{-tDjhcEKJvP#|Dt!CeX3jGkI~ zpyAl~z}cpn9Km)q_%E8%Qz$qKzuAGc&iu#=l;^59iM32zNK&W2KS#|69=Mx8ix?^u zkeZUcEct&Gh1cO$fso03u1XO-*0aw6x^RB6I%uMFc5~Id%2~qFygoulp~K7%fcN42 zd9HQoeZ_hLs`?bx|6>et#>IVzvL=3S2U-(QZj?ko6hxy;0-{U09?eKarLsu3e0G-U zF@MYuYjh-Mgn1S~JvLB%MD`y!E)QR-)_gw-w1(gEYzF0SyO10`<;zl8WeXQO?=uAI zS$GbfhZo@`co|-SitsvAA>cKT+H>{Xw>X;{82N5Gw&$($lnd6v@w|q_UCJ^bdv2qX zytO75*SSr-((!}W>6zS*%Vqp8)ygZp)>R# z7QK=A6g9E7(aN!Fp4SUDukj2xJ%872j4V>MuG9aMSnI|`FFu!$O5SP*3HISLawvr! zsH!y_975>nfo^PMZ;$8obdR%SR4Q}Gjrv`$|IKyCa#~M^(#m;$|BrQ_hw}~{P!TDx zE>suR*c<7puzFVKa=$4dlbFhaVC|8rvDhN7zsrq!!LTg3l{{|0bAzhqzbY?7_q_7r zX)_Rax}gz^hW zfo~}VN%*ExH0Cn_hg1b?rlSzq~y zQ^uhR)c7fXO{W{0<=?F}k{{l8z7-@#oZANwaDRgW_nX>~pcfx(j2>ll9)92X;k9^G z?~kQbYmCEY&;rL&R`P~V*2HuASqWrVjKoi;Csr9IGKz~u4|9ZQfb+X;;N!CHqvgk07{2uS~qfev29)b4^ z?;wA*!@pI~TmqE}3t$l}fizeS>988s6Zr3uo}TH6Dr-}EUXyL=S#PO;JRL|opbFvZ zX=+*C;P|}5CM5JyNPP*U*s)IsNUJ&4{}7%Yfn#tA&cHbW^E=X0w;tq1oAzW=x!IK{ zrB)X#o11UrNRnO-o)M`}z|dttuaxtw9VJk@YgTFQ9920j8`j*gj$O_>()=O%AA=*4 zKxLBuUVQL@fXw`ll3sQpV?arX(vSKn3s&;v7kM&Hg~^O}5!{u4r*JC))yK2yqnc#{ ztBQc`#CSBn65uS;-eh{PwRN&-?L*dfX<5(fXCK2Pt-l<^B-86<@$3aC2jw9aD!^+5 zpeoWcnYFcCua=a)rEa{$-YkJr_W#r}Q;j9{ZaJS`(N@iJt!JrBZPu>TL*aYyK70U8 z>{u2w)9a;o4_k~@o6A=R*C2(yR2%v}#@#2-3AcJwEOm}*8wQ+|@xL{U)X^S-rr&=5iI4nPBvc`+M*&JSq@CJ=RN{X&TY>?m9cvtWP~-Emrb7!d&1HkNsbgG`b{LKmWDi z_tkypKY!%e`y+4=eI$Ph=))xo9>Fgg)FmZ4PybBW6N4JQVMrv?&;7~7whYtc6!==f z*#DUGgEH^}%F81?lUOPt&+mHQj&Aj=lkF^XO2)tk(H73eqYOS&zLH@^#LCH9!#A>spLJ`DK-x_UI{$))sMj)-; z%T(^4$^8M&XfHA78b)YTd8L~ zErW~ z#M~N8It=neSmnSjVC;s`%A^2>kl%Iv{_-p8Kf?c@{}cZSte|Hw&!%<>>5_uMW1BtCZ|1Z^jM#WyA0bZ&9bk(-MQ|S}3B(EnU zStga&A+=htrT;zjJb-`Uk)-U={7;sZ#f-nR_cc@Jx{cT&69;)CT2&56BC&pyib@X( zMnULNM^+?KSG97Fq>^+{q`VaW2~MnH=;K?n|SmEK;ri)D}z~ z!`lz%sZ-9crL@TxLv5%`<%kt;M`Lg4fSd>z;{OVYD#EKMt%9r}ib+AMdd^Fs|M<>| zNtOSxShAus?l~*;k*c*f)2voWe+NbN;63;N<(|o{k5#Wb%vyGL>>zw6~m@A-k(8`I&yhyc&B~EIf{-dNNoo9&kKpi2p;T^?R5{ zSt1F&p$~it{b3+{4ue7N84AN;B#ef!@Fk3gi7*MKlEgESbKo182cB7?S3SvU8;RuY zaSR2!FZcnycwLGn!7^{v`3uYk!QLgnq( zR+-U@RCI$R`vY}VEVZbfOV%?iGL>6M_WvZ>3M`{gp50$hFvxmd&t#OxNMbc6lEdVD zIHqT357oAdo>0dQFK;aW-hQ?H4){IsTjGDge@no?z)69d0^`&xNvcKMBVrHWUw9&U zTj&_c1m55afe;KX2!(Jc3`L;CF-O+ZNQt=~3G1_5^;0AhQ1ZJrX6cl%c1u|)D4kJR z+G)y-dJ(~rrn(KYD?Qp6$v# zbb`UFXO`*pMWRQtZpxrkBlXN(XY@?do~5wglNLYh0osKw@08?m zvPQs5xp@T+Rf_QL23fLxyS0-2NB3Axe`#l1vC3+>!dUpElE;ml-jL&P{nT#RAox* zu}?;0{~rg36n6aLeZjkenj*RsxWH#0tDjE#eC1o+`x&pGz*_##1gs9Yr;ZG(87ya{ zts{jtz-HJA+hG^%g9Gp*9D<+V7@UGLa2C$NZ}2;uKSuxWB1wIPFMq+`pi@KIb-iWk z!r{3_-9?k6dQ@Ia zLMea5{wp3yXVJ$|+)vu{;W2Xc&~s1?a9U)OO1_j zInG`E#kgptMicIDUhsZkpjm>h;BgykyopXk@vKmm`~@Nlm7>SucRD z!RQ)#octfj7f(k8yGgR)$n$q;OeByS1Coung!|50{oke6R9P+6m6V%+zR55RW)(;g z{VESxPoN@dUhb(5icM%;RXrXOE18J8&T8GGVQFa#QL+@4q3AngzJPE>b{S+bxiR9x13Y%_nZv{I3)S=KAt0qbHP4x!p6W-F%u6z4n1~ zLTlNcGu}&Y(l~(fAK@oB2B!+dTpw&KomYu@=`C{&zlC?IJL_KWLMW~MzUOiHCtR^Z zDd)R+1|riw_tS2}r{A~{UD%xB-Ndh}@4GxWw{UtJ?n4edM2+sL%eYf2L}@ZSuc?Pm zt?sajm2@k_Frx2~+*TE-I=9NQ?&xc>Zw3o){)=LlF6h`gBF^$a94EA2r4pgL_ez5< zrL(PnPtqX2o|qeQvUC1x8Kutu$2C)yiWIz2Hn|kMCTmyOqBm}8^|-ElrsvNJ{K5q9}T{<4JpWAuCiouCVJ!!ys^*VbTZq(!gwRzQ!pW6A(Z ze#rdZ+Fu|>R8Ix^sIUcRcu{Gu`_3Wvt@G}r=cfYt_sOIH>ZdrrY5~s%w_%O*ag{!m zX!ZLOpwD42m@phh!f5&OB_W-NoCNBzmO9M-D?|Bexn{bKgmf;f zUs7)_bS-i5mU{ao^;@ET4q541<;r_a{r0Hx##UE`YnSU4V`tP}*8x{0JLXf za6NQAaXH;bqP*RHraR8a|GxVFe_vN`_I3Anf94+S&V66~|K-=!#}@uSzOddbn&m$4 zzU02*elO&j+j?XD|9)Y8wZeCKo3amYPAviNLPzKW!(ke%fX#3Seg`KnS}X~b;4Nqg z!(b|`1M?jJZbKk%aC-_~gZj`MI>11f3QOS!xCjrxpEo-dgYr-VhQk^-3Ae!D4KOc3 zGw24N!_V*zZ+{pFBOqlf&;M*bq`_7=2p8Z9yvMQegJBY^g1vAY{)Q(Ix}84F|HIl{ zhc}VMeZ!y0#Jy?KHf@q7O&X-M#oetqg@whTxEE((k-^=ifg%Np7T02nEG)2#Ebi{^ z4hzqBCTE5+_x(QC^T!LaG> z7XE_Epv4Do^Fd=642MC6kEMlz4~jrFXmJe3zc&&S;T$C5Q#gHLD$Iv9umg_69e58K zydmy@a?lSxK?S@cmkceT7fgfQa1TC$5wGrhp)@psuCNgoZwpd2)WPLK(w;SRh8FRln$z)aW(FCY@nE%HNUsK;W_0y;xK z7z+zwBOHV)@C+zCHq?Y3FcVgQj7kcxi$8`q2Y=2z*+-=a`FWE3B1t|I`4X#w?OASs zm68T)b2Q-UH%aQVCH1=`^?M}w{gV8lAN^T=3;vcgIQF9fUw=wce@T+RCduED^uI63 zKNj1w!Cm-FEC}XbO7d?d1ALOyf0g9FOWMnwKXy5{M>WXvhm0l1FjOcY`7lX`C`sNW zY44Tfb4%LCOX>@fJifsn+~OjV1|=l<(vp06NxqUKUrmy)Ey>qI9w#9yp0&RQ3&ebi zq(gg2zKbN^U6SvOyl|FtyL_;up5^oGkDJXXNry?2{B%h^O_HC7e9oKUB1wLkB)^jD z&yw3AH^a4DL5}<;Nq(zjfSr>1gOdE;lJ+Mg^=FW0bI$m@q{Agi{<>s;lGIyW?9UDCk_HaR03J!+FKHhq z$tOti#U=SNtfZj4Bwq#joLf*$QeRtAUtdz+T#|1k$+PVw19X<;QzadGOY*--@`EM) zhfDHfes0fZO_Vg4Cdtp19A9h-z#Z< zP?A3^X@5+TKbbSn;&y*dGQj1W4N!kWlD{p<-;?AYN%BvT&v_2L%2Cfh{(s3)z}*p1 z(Le7(1@buu&`R$@<-wgSjdniScZ!gJr5&8>{|2>2P@^IWo(xJa3KS+{iCH+T8 z@?$0KCy~7P_&;6JVV0yrK$4#?X`dm@&$w~UBqaf!!mw{`LqLAE%JYVDKd`PV#+q{ zH2uH45P8mY(R9st#dO`Ix0!6WOcvW+(*x6Elg;+b^wMA*r_^Y`!lh+n+YscibwJ|?6wl{Y&cQqHXrJ9S{dYNAs`wFi)vgVG= zYvV}qMaOcsinfo&E=*q27h`v(rEP|Jwt0@ZC$rGJ*xZL%YVOahFlU)t+t!*lm^YiZ znRl3XoA;XkG=DR;vkheaGXHqF@q~ESCi1kIoo zw1u+{I=LfaSLgwK;5Qg_0k8kCNQ{KBFcGH0ObCF{Nhi-k%z#W-0jps>Y=&&u1$*HD z9EPLtFPwo3a0QxSoEwOD-~l{=7x0^trIX(v@d3WTSTy{O$Xvwhb)W+ighDt(K{R+F z7wkp*IK)IK1jV2fl!Ho;1T~>9`~r=j8MK17(2>QWEA)Uq@EZ&Qu6!hng^4f~3c2Xy znTP?H2N{qFD_}J=Lj8Kg&5#YdU@shi!*CS-g)?vgt^j)ji#zZDp1=!u10UcEdOMO4B4;?_QC-;3`b!(*7NTry#99vnG0|Q z_Mq?v;vIMZCy_q~Pmq2AZ{P!bf$zXv#-0Hkm>?9wAqt|w3%MW;5}^8IUfWiAd?p`m;yw=>&#`5=Q-1{Z9jjzppZ12n;%?oko^p~4X z{tDkg=An}npavZnAq1=t4w2vlKjiVSbaFl<5}_cJg0fHnszPVGHbnJ#YYyz)=>96L1R7!zH*1H{dqhgNN`0p2I763m@P! z{0CGFoy>q9LLm(75CeH2A0$FSCl4$u`+p%3(jfv_A_ z!5Y{ITVm*JlgXYK!rDv?OwmjX!<|u0O)X5iNZ}bl@c97uY#`_P#XScIz9G5HB)kWC z*%*Al|M9+K@Lk8$@G=Z{#%XNaITw70x7cj9-~&7Vpw9ku5>{fWGTe#y^E-;%>F77- zF*jxs%>~H`*$jVXu!6ZVPE76rJoxY(Z);+1Mb1s`0h@c9kUKlMN9%XS@#GwxYR>s6 z%?2N$gAdS~@t{1AVVR@mQ+Oy2J`mr@@kSqQ>W>pR_~^SZTpn`ZDs}T8I0YBs2Hb~d z@D{#+>>71b17-*Z7sNt7D0B^B2F0=MB2yo3+%4HVa@n|cVnj_*T6BH@ADkO)Pg3{-}iP#>B=3Uq{2=m&#g zBus$mFb6VVIjn^(unYc#zu_cYfa`D%p28azi_bvcpl+(c1YzI=AH+dHC;{am3F<&Y zXbx?m3-p2kz`_`q46|S!EP++90kUBa`~}B=J%hz%xCIa41-ysW$e98p8As zEb-QhT9eKq=YIM1k)HdjXWS=&s^K%PN7*Y<&gD68 zk^cx^;5*2?!F~!vHA(9cO<)B!9E(VBf(K$DH^f5$C;}y*G?a%*P!+1fsXwWdT8Q{5ob}|k&%1vcV zC#E8WiFp?F$^v+9zXqQ-;<9m6Tc zon?cvyZh}|<=OS(?4u3(&Vd{>RvW9ZHB-1v%6;rKfyn*R`$28CA zX6Vd@XT}-2LHbtu*1E#F*ZOjXx!Ui>(Yp19y4a{+jQ1S8rDzRG-H0;Jj8-8l%RciPMzU)Y3H5bj2T{n5bEZul4WK{HwW& z`Qup?|Jt3>HI-p^%}np`oF(VTfU>VXK##vC&+`!!4+|NALoMv8S{=(9osA0e>QDcc$gc;4{h;YnK!#WYHZYus0C3gqBchDiux<+->6GbccPv}eTb4d z42}qg*OA~T?x^Uf<@nW+;^^Y&>lo@7gpQc8snPfTI5>m+T%Lry6C#= zdhL=&Tcf?vMWQQ3Cr7uA?ioEadTMk=^qS~h(SJu@jD8gTAzI-McgMO*xRczC-R<3d z+@svn+>6{B-TU12yiL6Sy05yQxn&-U$Ky%#RPfaEwDk1w4EId;Ec0yg9Ppg=un#=% zJ?fb7m^?AXW2(md64N%Ocg(1m88MkLn_>>fT#9)Z^C3p*jqt{L3wj^Q-ZN=TQ)Vc$ zU2$G!l_$%U%B!-zbZ=&yViXf8m#b%~D>6!E0P|5Lm+jMR(S+ewHBP9usZPoUC{HuB z)J>^>WIHtl$NR_7M(ChHY zr(@JbYA1D?x=xj)t*WPVMP)L*kT%Q4$(GW3=Bj!=HAS|8wkU^cR#J}{hvK$cuiPVB zLRpwFSr*-ZqII)m=`tVnP+f;{$hOfj>fEwF=>(ZfURcJKR9|P@^2+iK%&+p2vIr(Z zNoh{1>u4%!9%=Jxs%hS;m&?k_j>xxApVbkX8T2H2i&Cl4YjUek&_k6+Xutfn!i8TF z*+*G4d6h1WPx)9`RhD0wqNyc&uJ}m%H1%cqHM{8snpfIS+S1B(%EmIYx~L{qK0%Bm^* z%SLGi%ht$7$eL=l%TlNgR5vOg-J2Rf4W&j=6R2ra8ue7QQj?%KAup?n!Qa8_qAsk+ zlBd#@>H6y8s#=Ph@-g&6`6=x|1=~`Qp#GI^r_N6`R_A35)FDlC`9F#ps$ufqVvU1o#)8+}$jNp(^YLEX|;RV-C)P-Us=P-<2+jGn-_m_y80 zn zQ|V?ZnWmai%Sg-$p^_Oq<*P>>P!7VAt|7nzo;u-Qc0yl!8`@QWx{QA|_Ekqw&8N$F zZO8|WQ^sYl>t}bzNA+zT-=Rlp=bo+O`^NWeO(BctWmW6esh(UR`}h)jo-lh~sx@Z7 zEn87lsk&4hsydZSRiLQA@Y8ntSmO?RwsA+~N==Wl*L`?u=BCO(GitVOt}b0SU$+p? zK{9nqbt`r8RF-ZXmOFGUs8V>c)?aM92c>`N4qTh^p|%lgPt z@#L^YVDa_H0)gZTk;=&27_BXp2d#$i>uyO#KduXWydLRhN9wY4Zfb_djhj^|Y9vVy zKzcMuw?=x5m_8{hMU5r7&ZrqDrn#E&B-al$6T~!EGlk^Zqh_j@KFOkL8p*b%x*#`$ zrJ)5O1KqCYlVCt)a^#=`H~SAl6-H}Nv4e#Td53E{VS@4^f;t5 zNqL|D*$usxiYv*>loE4&DK58?)TLtUSLH}cR*q3v;pn$PQz6|G>2;)Accj;obQh#I zkaTaPH)2n1B>BG7W=xaIap&3bpGyDdYQgS96HuxHJ5)nC5DZkX-Nt|A*wb6Z~k5nBf{86B}}8IN6EW8~=<{<(Fx1 z1oA$N^aTpXINgDsAESKPS6@etq64?TM!NK-o7`UKwk1|Mw)xvgh{|sM){(5FH)XH= z?3k`mHp8jcf(o>gJADyOvm3brm_Tlv+HvN1s+_q6?j-oyz!ACAtZ0exDhE2sou0VC zNH)iHW&tWcRhX)R9M{+VKY9xtEWzrWT>>ZN&U}`V=3-beH_Kw?lIBuWQF9X;&FSZKi zOXkSOBb`9<3H++vSiLYpQIs^JN>YueU#OnAQ*BGNM~=I>3;U;_xhVEhS$;3M)%C|-U10A+rNcB0y)m)Qt%OQBA zuSz}O)9*;z@3b|YE1ksG%@aqcUPu_>Y&juStAvo+BBs_BL0NHrrGZL9b&E1W%9CG6 zjS*Ap#i4TtUJUel=+S|Y-@S=!7C!~vA`ju$~cA84KY=~C6rAO%Qi#_Wh2Gf z?_yaUalB_@s$CSf@!S{Os|NP|?hU6m1up#V%~Pn3K^Up)7a?`O2G{mD*Orp&xa9>t zeT1L)&_JO<*p?}QhJ(EE?f;G!dOZ=h`)Ns`%vM-PB^MA<8}bUN>cxaqXq=GhFQ(!X zgtFMc18$861De6!c-A3~en{N=^(zW(%a#{XiDiY9wWyF9TtP?;63cFjsZrv{?a5Ys zr@MaPwtur+=y#0$Q%JHch15bf*Jzd4sOwfPe@f0R?~7+zw@X5MO?9s33SWPZUoI67 z!-thZtCTT9s_I@LReCT!zZ^Vk-cJ)!4Mqv6D#L_SiQk1(%@IPX{7@maK9ifk3vt4G z?ZKMwbhk@^Swp;jIw7!Y2u{`Wdahw8e-aeX3EeaD38_C4h19*`LW(UYr0$BTWx0g1 zB<^;^-;AE-5mI%;Q$i-5PSt!^vy6%fbRFs~LQf4W9_lS;NSnk>CrZgJ2M3-F_2y!& z>B1;+U4+yh_+A~ij_>sS8bVp1yO65WLr8^H5!!X#Dx@^kh1$Pjh19LCLQ2s~NEzGn zsoYpeQnFC^X9pqGzmt%9Tbi3~`M@sLn~P2h++n?5c87RUd~ply;=MxZaBd;B!Y8DZ z;$$X@?IuJEwfDtTMRB~w9-;QUi)w)|Wsw0y|y2$!!&H zuDeSK!weE{%(ui;q&E_<<9?n{2>e8k$2}C zOyrk;kn{9A{o^K=6c|6;8&5wAWDm#0eWis-&Jl0*d&K*MmF0z6i+KB|#XI|O@x*-~ z)(#cRCW#|A5l{6;;t{y#=SOaUN21c=Z9*X)z7Arlig^Bq#t4&{AfErd#Ik?IRAOM` z2ppNpflDL2h1k56gkG_Ah17fTMk|zkr{CMTz1!BnEf4eeEb06%T*WW9^UK|Q?T^RM zO5wtYtF1yx7s8D&UCk{Qs_DSQk=WVa0y{=}^U%2icSd>>=^=s8QQkzEUK^-9${Rx$ z4Rjpk^%khlKSq?JxsLT{VK}?^*fcIlC_BL4wM+`^8s&{@b@e#cVIJQ(OFS#?d>0zG zHVUb@5FypPt&ln<&buZ*@6~Fdrqm{G+U$VGWIt$mwtr4c9OA%6v2qD#8 zOf{=dZaN?6G_jCbBQzW!t}xCbl=Tu`CUiI$;ELtq zW9HSyTs~CH2gH?h6<0DtT**X!B_+j`sOoUNWB4A66|@m|T2FDMtAjfUZHkFgJjzdTi8#f777DAKD)xIK_G>Km(^~&ZL&9%riTXdOu;u8>trWQ@fM@Y1RnvH@{fZSe(C3zqxmDzonL*svVw6WP9|{%i2)Mllen0~<-y2Ot4YBI61VaZZ#|IwO%m@R3KQfevZ7pY zSMQWe@W$5Q1o!b1bTNwO!9D6A(Lk~oWtEROYDQm~N3OcGa;xR%7Nd~`88Nq#S4&OH+OD0nEpN%qM4 zW5GQoAOG_q=E_;_WYeO8i-*a;r%AlPM;CLC#K$DQAn`4UpGf?Mm~%p}=LFB87=C;g z!@S@Qg^N*>Xm}xK`2q_m2(UsG~W?<2Iy7 zDefe7F`d{P9l469`GaR~D(QHSOz3fr0k{5-o^1_n2^~7LjqnNjnFLo?vW2`AI<>iTM$84m6q$ z9`j9Ppdx%b7gLM0Z%bk)61$Vw8!_;3t~Vb$jg-tLaRG@-_~>G`k^Da-{!8Ln5-*W> zoy0pNJ|yuOiLXigK;qY6WGU6F;6Bsy(ZxiPd^E`yCHWd8)+Mn4iA_jsNn%?PJCWF( z#NH(SM&e*T;x2ADDHucIL=vZwIGeK-|oQff`5#+UE}r)D-31IIBtj4J2+Q@lcNOxQY2R!G4`4 z$V%`XPmzY_NxVYhO%m^s_?X1kh=Gd>y}ruHZ-P^AOkxW}Vd~tfHjfCdYJz0yv&sj{ zr=dJx&hT2<^KrqFIb>sck`eon_`77}I(vidmy-75NV~}-&LA;B;(QWUkhq4#jlsxL z+epDK5)Y7ggv8?{o+j}EiC0OyMdE$LoV#GHB{ zNa8gTZixSqr(_4~YjzJWAq8L~bIu zhRn+1?lJU5gDadPnMg}>@Yb+UQeJ0#u>Dd=`FU&b31=3W_${)+`y@Ug@ntZw)H_n} zABl?h!DFu_(L|yZG3TzEA0C{*L9!wTY3Cu)PhuR2`AIBJVi`mk#d0sG1^2*#PQd{$ zk^!rbhPC;IKiaA51>4;w?HZDHO-XD;VmlJMk=TpG{v-}Ul(GCPdcg^-_5=t1h=Fr% z>8yUi@^6yzJ`028@<~6pS62;|%?+hiA5u=J zP#_SO>5Wr$iKi3RCzK1c$n@4${T?5k@JB-Jz{X7PSkJ{$u>^_%rd3vj;Bo#?fp@LjHuh3FnQW zrlRso%AMNndWA(}Zxr>`b=}P-v`DBI(>|t0!t{hy3E2sU63!)DNqC&_AwibdJoa*I zQ~%<)=)@91+4-giRm0zE;4YgIj%zyiHd7WquBNOmF< zIJO#3N*f{76k0$EOhA)Ph+QESdO=_K4W^;)cf=u(hV(GR`G^Z)5iEhFupCxG7Oa7F zumLu~PW1T$_Q8Q?xbE75!lTHXfKzZ5F2H5D2HQ}-9Ude73|_(;cn^C}eh@w({T050 z3>SZgP^LvRfEhv|4D4_Ob^pLII5CcuxlbZ-8qUIbxCocwD*S>Dzd{pe4%boE4zVM2 zf$q=~`oK-p-G;kxA0EPEcnZ(qCA@~W@E$gy&qo%C&+ruvqCkeL3pE(Q498IRFIbSa z!d0Yiz-SO_gqwit0Ktbi<73mafFY=a%J z8``1mUhazgPh|drBhUebClSxUdAI~u;Rf7>Zm91KeW5=Lh7m9d#=s<)0ka?t=0G~k zhlQ{dmcvTOf;Hpo9oQaI z3N)@?R`0;U)UqM|^|$9zMZW_zp5$S13RYIxs>A zuvRR>ArhS61~2#_59EVHCDP!K;WK=NZ$NQR+dvLV zP=gjGy~Xj@BVmCEn1ulXkPZuA5oE%0SOsffJ#2!lupM@R3w_-X14oeeA)Z9^Bj$#@ zkPjZ9ECI1Fyg<6-MBM&gBk>MC!WSrw%Cb-%DuM-1%PS++fJmfkA=ZIps1F5DRv3yw zNoatwiilOG?)QL&~6rD8q9}t$S*-$2^W#R0_=4x)}denY=SMY4YtE))a^u+ z;d%OQ#67SN{scS9jv)R6$KV842*}bD4T>h6=uL}m;>`*AuNWaumZAREo^|zunl&=ZrBTd zzQ^tVFC>n@Q8)po;4EB#%Ww^D!X3B|kKif1fY#LU< zDrJBH-}HvEs6Y5oKCP0GO37Zd#XIboa|^yR&3##UCcYB0%@#BQc^Y13ms#Q~U@k1o zz~y89@@WVB>g@7Id}eiE+aVXJ>jD7kTTHVsLvW$ch+YN%!rM(2Hd^O@<8%QpE>aB-#$yg z)z7TYPQBqvHh5<0XW||DB&sI9I=c+--6v5as8Vz(e5xvmnn$IZiUn>w_0_A85n2tO zVNRm{rs9m55ptw@(7ow?^f&E!!yfwqMR169nss;sJBeCH=fTJ58KnBrhv) zaj(&G_46<_ep8W(WpXodOafDY;r?8~3C&n#SLF#!591zPZDWL4ffh}e=1eQ54Rc5S zO_!-0sJtUr^DC%Hjbz3!tzD7Gt4pYGO!WX6~Vke*rCd!P=-v=ewX(*c`bFcnanzE2tEptMCDR0wl20Rk*c7qjIZ2tJLrObrP-r7 zXuJ?8_R?2?v4_|LU0?c~Y`&0uA^-4aUQKGXh5Hy3cfuv$U~#F+$^=t_iJM*{RZ~?9 z)mHsh{XO+sel5SN&e7-io@uJ%=Hq7W%v!J7q`Ge`tG#c`d2mA2Ok^EhFPohloHeGE zVO;Acs^KuN*fZKq-sS1h~N_#{K zci3#cqWYPvz3dggd3&^V^>qU`Ui;$c2Lat1pEtCJ<)OZ%ww-CN!lj+4 z_(gF+)gw^hjW5pd(J%%df=QyT(I1T;0|Vdq3N$Tm>TP!E%bWJ{NAzzh65j^pHgTq+ zqW-z2rTRI4`m_3-=AHcRm`D8``nx^nQJ$hHZ(kTPMYEdR32EsNYD?%kUD{ipmCdhd zANEMO+1No|PBVn&j?XoEzFtcwQDt@8tx0^B<;d5g&Kc|Rxyni{-Hb}mH^Uc7lc;Qb z_df|G9qBZ4E%{q@M}C?Y^ji#-`7L>^Z>ed?Pw{W+FN2aVt4ZzA?9rIeyGCHg18e@v>n? zZ)hF!_CUxxpQplGQ`HEgeu?ph;*?^F?Ha$=O~xX!iPqq~;YcRlnBQ0k_l7B<|5}^K z%gHU8l+aaVkA7pKv-`Zmn}}>v7nR%!+CgVXg+4Fu?7ig2qiH8zBnZ5DR$$5BSN2p#+qLDo_LJx>+i@0TL~s4RnN57zjgQG)#c0Fbn3v zB3K4lupYL+4%h>S;TW8P^Kc99!xMN3A3*J)@H1l+el-kxoW&v)`oI7f3rk=HtbvWN z4R*m1I1U%#8r+3P@Ekq?6+6PzEYO5_Ev^Fa^REW3e2z0*&V-Vf~gsdgykzMbEvTfH&F5PAhO}(jeWR8$%NYjspQ9$*`laVdi<{5&AA@g{O}1&!bFwYKrz@@^tytS1%PY+5 zwo*wt1qVvcumsj;oTS3(LE>;_=eq(2GlaqG&CeUSl<{+~I%Cds?lI;qRh076Ki9;M z+1!5Gm`{|FY6-#V1=qwrSbBBNH+;kqe^6Y~X?xb>jPqG}sJ~_LxLXQ#qEZ_+pnel_ zl^PaGYd2rW)t@&q?f3#A_uKrUf#>3MJ1ssG7`j-fdz+P(>0iU=SnQ~$SyM7y!7OsO z7MuypTKw}Ymu05S*_~OH8Gyqm3{q)K)urvm2szE#vTF*i6>>3Sb}St&)-4~CvFxyz zJCk{C?z!bcOLoHiiUDSkkbRtaZ|?Ku+;OTC;FdQ7LQTY?rE}<|Tv^0Yp)7IfySb_r zT-lT~ZrN9?*|+#v;JmoK?dHu*b1oEm6G1cVs2%6QraVam0$Vg&^0pjO_eQgMB^G| zvMv8yZmF6hjMaUiYkp;ZT8+g0dwyk;h0$3;iTZjwuCBryqiTw`hNer(%{{(M7-&a&y|f~H-{Jg?Y}`CITkwDDSivah?BXu&@*Q~ zzZ>`A4rsFN1iu`_54TBdb!5qex$*poJ3(Ce{?*r)+!PPrhOE&UC&XRfYgxneQ7gpl zPhGIT&|7})3H6XyAN#qb6H2=`ew`N}KlF7Z@+wQ|oqJ%6gT=X-q;&TU)E zH6>PLtl=h|OYB=^`P1~`V&DJR^d4!m#5;|BiyqIhE#o@8;)i-GZr`~@ALrx~kDhVf zz_b-&uS&~e)9dp)`LTG=_OEHN>K?ypCBLWA_?z?Gxxxl%Ggr=Sf&Il!ww2ikH5Asy+D^_>1w0vC)p~JvcU^IN-T;1=t`mnSlF?(1J5!j*xMl6r7vT5> zPv7bpgXa{@|uAWKLvSP9hvR<+~w#8wxh(h+*$hoqWvVF3ZzBy5=qW*|F6?H#~ zacuIL98r$^jw+63j-HOejy=A=ePbLm9ZMWL9ETid9Zwt@r`uV~ndJP%+1A;^Ihb`$ zaHcuW`IbAkIQKh`IWORMi{3kFm&s*!d0h#vimv*umiXZ!)-}_$-gUrr%5}x{+{Hxe zqobm8<422X;3tbF`UXUgh@KLi8NDfbcl6=tOVJObzek6;$NC%)Hi+GF&v4o_ZB2~S=8W>FWqh+b3W#F%zNLfm~SyUuN^;Ll;2z4Ti4s% z+rvA=JI*`HyU4r2`-k_4_q6w}_oeqgufZ4T%i}BQtL|&)Yvt?e8{j+2$}Y;D$x4S) z$>pFTRDo(x6Y4-cXaJ3%DYSqT_z*>*0NMeN90qX7xabS;CC1fQ(!jChgGl* z4!}vc5RPZ0*O9mfPvH%G208-I9Ki+-@IqcF0L7skRE6qL3x0uLp#`KsTj&D4U;wZ% z0!G6mm`3|c~KXa^l3HL?Sa5fXi25DbOUFb<|d8Z3ZCumaY>M%V(`um{{}_<_oKRElyw zmBM|CM2$}+(GDsF&)MR#6ET1gTV8>NAy^J+nh>T(0bslVi^^nnI{g zpbAli0&AzoMym=@1(7Y1eP(*BlMdn1!D?<*nMFIhB}N7BP51#a$wGg&x#zSaL5n$57MpZLb(=t)E*)D!FC#>fCZH ze^K9+u_O!7DKQDK4b1@NIfG;?faDZg~MMQ)Tt|>E`E0PUKsj#9z71MOmp> zD)4!NzbM;FHUw`HaF11+@Mv|Ezq`e0n5+jASilAm5CtyqfDf>Of5bnEaDtQ0>9rxot8BghjWLVqBy(x!+A+Q88;>VR#bSBf0K$W9{XQZs_c%u1HFmnc9RFMm~$m~ z4V4O}sw!VCscOqF#bHNB7zwlS$wmBG|WY7kx%SDrA}8hN@p}PWyN}c^ zQnru&i=<)|BS_yU^$?QssK=7jB&A*PW5RZYQ^D=QBK$I5fipiA6?%D>6Yq;D?uBED@sew8Ii z>3U^#KEo9NvKi@7P-#ahcp4Yt$KsaQ{?4Q+_mWI-erM_Kq^z9! z9p7{eKZSw(DtqzEQz~v!9=_H|R`FRWR|QAVsK2A^om@r68KS5~+H_Vo;CpI9}2hsjf#5w*6in-ZY2$pl`Z)ET#|33u0mGOLS2KT z+N$dcDb*>y^*Mg|H|f(`b%~^&(SMOtOVx3{O%oNl{p;yY7=$}HD!5_3DWJeEDkKxCt5Im7F32sfV0e9sFdD#L}OS|xF3aYQQ)UhNXkYksA>HaRLU5X@1}&S$11Vh z^<(o`#?dYI|8@<@#{PU2IVJWN=bTvXN^)uJVCRO|;Kd}n-1$fB|Gb_&8tZkPk4t}|!(xhu^~zw}yjvwy!oc)jU8;pZ+nFZ*A5@B9C^%g)#S@7bT``ExPO za57XDrr^_p8nvRrl_HTG8z7@@@lO+_YJ(v@aGM97WsdnvjTk=`F}N4qH1wn zC_Mkc?{8MlzO=|cRaq<^pE&4;7iqaC-JS5tdpA6d<(~BB$8+goR2!tLP#vj(cw*ZZ z>1uf5+8L?Nftf4(EwaC@@XO2oUp{c~^{y`>JMz9Cui6ikebBzdd+={%A7!b=U(|=4 zLyTXv8eO<9R#!+@L3h-0+35&RQGbZ+uAXH4T^$y4#Zp)I#PS8dOx;2^#=TQH&lnZj zRTmdJR;`ITq#US=iW;k%jUNWxsLL|OhnEW7VXPUtR~H}k%vmm~S!mbLBgR?kL7|J) z^`gp#Ph>;eM&0xm^OwnGi=FQ~8k-pV-M__mKbH1ak8K-!Tvs*;QPvW!TT$$rsPd*bYh6<<*8%^mm}5SNe@N^K zZy@%rZ&gf7Qz>g#i$dSs^ozfTznP_#Yp`jT`cHRn*B{=Arkd7tQ#0#mm%?!4j;e2_JdW3}sH_#W4G)2Hx>)+6e9)`|WVepjy5*2AX9?o+N^)>Pja?_Jk7 zw}tiWiSc{R#GE(XGif6}xQ<#M#zaNri+JQM<@hhAOhl;uySGk6tB9TvwH?}Mo3Etj zhPIC9iuH;0i?x;Gt;rcZJVIw{P-0y^;fk_#cDK0Rige6MU>5A_L##oM-*lBXB2DY*A+GO z`OVq#NR?mpS427Uez{lEM4w;NQD4XWNYTPvMpHx6&D>8vQr}2(K4OKVou;7bt>U|) zmu9-Ytf~h7&chDJg9z?N`r~Ya%oEI7mniM}LecWt*Y8pwBjI?3*+TRfD7VYHHdd?agcxJY8*v%u}P|>`S6Y z`?f}xwm;JziM|qD!S_76w!Ni&kgbRPo}P9u^lb9H(NDC^v*q%xwhgme-MQT7%%#0w zWfYU8nr`2w`coxm)Qp~C&CE>8McFRfUGrDp8}m`yA&)HNvgerQsH3Di1)mRyU>uB_ z$+S#l>~f`iwETv=sIr2xmhzGOjr>16feBGWDPk3gimCDvibl#d_=5ujlp~du6txwN z6s;9q75x;fV!Wb`{D9Vl--AA-J)vqOUt$jl*=(l`?vN|^`#OeejwiN*_AfSFSX9^x zhtqJ*9*5s#ukEfG7H3FtUshexlrY@4CmCpGL&JT|2m2dMTSG5HV#s|JrBz3=hS&IQ z~W+o*0%I`FqItkoL?`CO^~15@4Q1 zF2KicZpw-?n=NeQoRAeErJ3?fH1(dj#N3rt#z#$RG0DsUOJVJ_$a>yE7M*chh}~G- zIWMfLdU0ek=jt$7Oa<+x$ODmm+<%4Ki#*GQba&nf$z`mg-4*sagmo4%o{c;jMq4^~ zr#sD-O2%kQf+f@0OxsCY#uBE!$#j-CU>f6dKJAS73F)vA+KHB_+Ig0G#`)USmQ~ta zmTlT6VGo!X`AkKOdWv$c@=MrK%lygHIomN1-`!V zzokP1uipB{+T!quBo$>Q%TOu|>A1kecmD2lr@*Io{yfDB;NG_ub)M2vTPX*%9{;se zCySO^j{gVfOez!k0#p%MK3OHCxc{+KHeDdlp{v$ucskC3q!scY0->H+lvzs>!PQqmeagpQ)Q-{wxB3)3a( z@^mG-Dm^p|f1d}^U=K)?t(f04z6WTd&!X|Kl5CSKVFdLdc z=s{ZOEun@^=$(WvHH2cMCm@W7G-(Pd?S&B#kuD%zh!i1;!V5@K0j2)$}rVDQ_TwG3C?%GB8)*5J0M3}91^pd3vXJ_0wxF6_w zhRkia*Ww?66KEIIYKLqRbQ|{p?jx){C1%64ghΞ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

jOWTtzZBMwgmGqQV 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ȎWYj}0y{bZQoLNGiCM-F^~JjjOvD1<0Pqc}>U3@V@!s-qU_p#d7A zIa;DM;?NEq&~Yl~zcY=lNI)M9!5EB1GA3g>W?~NJVIdYH1uL;0Td@Osuonk$7)Nmu zr*R2sxQ<)6HvbuOvZG~#2n1SVx%AytFak7 zunT*!AKrs}If~;rjq|vKD@en2q~jLu-~lr51eth&*U*W#ieQEfF1Qg455kcRIq(T0 zkY_sQKaxfPM4>365rdK_g)%6I3aErCsEX>SgIF{~V>Cr`v_xxk#rKFuFZ97&{$l$A zZ#P}Rjr08M;tq|6c!KA64gCfF>=$;p5sGZcg-8@cQGAY4D32=m3UyE)jnM*e_!eE! z1HI4>gD}*~mr)ppiI|32n2*I+hE%M>X8eIYIDn%#h4Z+K>$r^vc#LQG7rKl55j|`O zga=vi3A~^3r2vYcIKDtRR7Q2wMl2ekIohBDy5M{CL|+WV5RAlFOu$t9f_Yek6#S00 z*o5sD`PtQO8vAhsCvgs!a1FO`9~pRxS9k~IFaG`*E`%T)IgtnX5rtwXiL$7KYN&;; z(Gbnh`Y+CZdm5e59SQgmi5QF#_zB6Ff|;0$g;malJGd}vJ; zW}H`-X`?Q)mig;hMmtZhYv9`UKeAn#jQ39YTroQC(}e!)Fqxi>V$k^i4tz?T_hAFi z%MBD8FLtC2J0dpz(*GyFPR^L#_j@8X;?Dorh=>0pd-6ZB=b8=DZY=-NMm<8WS>anv zA8}Mob9nyOb`~2EFz4gL=szuDZ(RSGC;Eqyh4Se=EnUN17sHphN4b7-jdx9OO?FLl z&2-In&2xpje|1H=7rU0aqTS0~%h{0C*n}NkzWj-UIEE8Ai;K8|blgVOw26L>%Hu{ZE};G00BJHQ?24s~aD=XU3J7jb{?F72-9E^Msg zuI8@cuI;YxZsKm`Ztw2m?&0q39^fAAE@~X<9^)>?2PCD1k8@9Q&v4ImFLEz)uX1m2 zZ*%W6O7KkA-jGJd10jb)j)j~IIUjN*Bt7I_NJhxBkk=vaLKIJcXSU1b3G#S6 zSv)@k&2we*TnowRiSXq06!LuL^~88ed&+s58pGWcJykrvx~h3T&@w7HB^Q`o&@@(*I^X%}nHSYG@4(VXr z>*-`X;5qC$=4lw*Jou#NjOV=PFHa%&Qdd{w6;F5LHBY=T-E-S>&(qWBedx*X{Ns7% zS(N>y=e6gZ#}H}>b%X|mhJ{AEvxepf&EOH6D>P4N-p~S}eT?p`g+q&mrlgGG;gpQ& z*n&Mcfy>B1z-3;TkOS?}4e?0CF#LpRSnB1=T5QK&9Ktc2!C$zG3`Azr#r;Elj(?%M z!mA)`a3KU)kOR3<0bimq+M_cP&<7K-8vEcq&zCgZ##898G8iII7PZhE-(nO}uo}Cu z7sqe~H<5|gP||eCR=5y?Y=}T!6hV2^LW4A3|C`cih40ZD126&;FcrUGE`G&gEW__u zjSbj>2QXdZHVws43U$y3_xU5*D*WPgGurLZ1>NuidR_Cf<;=XzFS)J!Mi&=^e$2?r zAH@u$4#qgl$2x4r6u78SjGsfyZYh}P(c zcd*~!P6l71HkzV6I->{rVi1O5G=9bu%)mVSiX~W%E!c?zIEqs^5AS8ZT*E>3_%`(+ z9wQSk;ZEnUA{;pofx@VOhG>JIFbOj;55M9!q+k`cVkh?DH2%U>+)C&C+i!9wiVFA& zEzy&|IsBHIfZiC0AsC4Xn1#7mgk?y@8f?N2?8X6{!X@0t3lzA;QA9f=BIy?Ae;AFC zn1E^c73;7SN05fQ$b{}T=N2vmBMdnZflrYS1rddE_zL6k3qtPj$v`NJ%BYGOUcP*d zhG>p9=zz}n4n5HagD?yuF$S}+3m0(>>G%h4QT;Br?1;mU7>UEUg4?){3_OMR1z-Nf zI~eZqT@T#Ig1o4XCTNcY48VM>!CqX#b=<-|Ji-$^g>s)Gggl5wZL~u#^n>?4=YJ%P z@tA^{n2*I+hBerLZPv ze{C9Hfk;29BR z(Zb7@-Vk*Yj^Gk*;0?+@=0ZUYG{kr4jU)teul>_wUF>*Fz+_CrOw7hS{EEd`iskqn ztFaE;(CWM!Wn+u1+hyG;>mFJ6$$C)MBeEWs^^~kdg zAIbVy)=XKS%lb;zH?r!U`1Zsot6A0nSsk(l${H+ds9N~|(Qp}Lm-Q1_bITejYkpY^ z$y!9#Xjwm(wWO@2Wi2ObMOmxJT1`~(0j4!%P+Qh|veuWip{z}0Z7ypoS>t4FFKb6x zyU5y2)*iAZ$l9Cg6&FEY84QqhkgS7c9VY8YS;xpaPS#{uC&@Zh))}(Sl69`E3uImN zME%<}ooX2um34!xn`PZ5>ke6W%eq(A1F{~L^_Z+DWj*sm{o8fEm6pL@ zvR;w(nyl%v-j?;AtPf?)ko6x~pUL`C*4MJWlhyE#@1iw%Wy30~T~?Q@L9%*e%_3_y zS#!!7A?v5I=99IctWmOlCTnq7y(MI$l&ocCtsrYcWZf$3AF}QeRXqOxl)-*k56OB|))TUx zriwQ!&QUMQ?6RzBvfhyOmaKPWeIV=KvOba3`&2ew$oj9WZ)MeI`mR((R*S4QS)H=F zWet%vOxCQj=8!d)ta*IZtII2c0!KsC~DGIbhe%6zu0^JM*1*2S_erM}{gsT!gF_k3!H`rh@a7dq8FOMToM7-ec$8bH#vN7VvG!36XIR}{yhwbdrauK&_>4O zP~UqQuS5LrTl^K0#WN}N!+RH{JvD;;Z&^$Y6>nOIHzj6-&I*mxyfv{gRJ=LyzuuVG z68iqF3Ge&&Cbox)cPDm+b~o+`^}R!}FVy!Q#ed(T@V_;2PoyRZj)u^$I<7)Nm&-jjSejk7q9i@1aCwU@!LLAP(awyvO-+5~pz%=W!92a0O|&j&$6@9o)kMJVFMZAQR8<0SYd+$t_7TbH;rI;5QcDMLk@g`2;@N|@}U3r1 z@D*yJHtOQ*1)Tr-G`>M2G(j`8Kr6ICTeQcw=!7o#4&BiMKcFXi<45$v01Si|gE17t zF%qNk6UO0Z(P086VG5>U27bY8%*A~CibePhOR)mKV-?n59Sl6z2ZyDk++ zpQyFc;alneb;3s*BYu2s=xeQJRCIZ*>GsN2F~|T0@nSHBs)KzPD`LuXb&U8&SJfKb zz*pn4-BzcMpHEZAKJ5K`xiPKFOT)&m+ZfHd1m`Yg6Tg1_#3WWQo`EM~GNxiWW@=V+ zn~lzBcP_!eMo*=G>fW;n5zcg`KWs?c*S?)f?RHaLu{(2vT6a{sqW1Ip_g?I^I9wf$ z&NAM4{P92y z(5NJaU1phUxS=^BV%g{-zVp81_aBY44X68;d4Jv?&_9Fz;xzkC3HzVg==A$N5(99q z)s?<(I^CGm^OYesXA92zj%?=xia5k+dBGsB@EW>BzQNeWcbjAi#O(nUBCgb)VvpUdNe{!U1Xd8iKJJI5c+Y5eV{>Y%3w zE;3f?_RMf)duOBABX{|6A6kzNqsyLeN(w%*e2|-a@y{L3ReY%W443huEDx1f^(tS-0-OG`K=jD_ zAFcd&m6z(?R62EB-H1B%7a3FUyfVz``mMURJ7ykJ=SRfd_toLY6D+z*VSB>F)t?^r zFzlH(Y$q%F69;gJ6&|CWz$qBjC!nce{;mD*vzyohag^L+pM11ox}gt0nih{F?O0-3 zjAi8a4|Ho=&rr|%#11Vv@9)AaS;Tn{%#tNbVptj*aT9lOAAjQ?y!g+N@jqv5E%%dg zfBGxKgOu9upL8sX`KMNk#Y6kUL)icP5aH#Jh&_nw{>Zl{_5*75Unuhy@9^cVkF!U< z=XrONTM0>99=)FydlGMYte%3*7b(U9iJ68$Q-3ttbanVUGQF#jPw(GJ zy%xkF_wT^GYB$xxZ_#D-@*t~h<hY%|6JlGx3xw9t~r6 zE;Q;^zcRG#-B#W5j1~_Q6rGs^nHXlZrKI#`kbW4zKwhf$yryQ#7cTj{Kg>AWn4I&K z!8EohPh<(sXO_gUQ7khSDKayoy2AU;_hfp=t;5zuZp0)mJ^=F}ptJ%Je*T3+hJc#KKG;AG=$vNqx5XYL63Yb@O~7=0|+*d%-!L zedk9KbI zf0~t&lADeC6nT*!1yLA9@EMAs1RGtNS{5IjN_mHs=$Pm=&a3*$uWin+NsfSf08l-3(*j zloy71C!4V&AFiQ@$frD#Cfn6-JHk^^k{D+QMlj|W>c@|N^)~Fo!s1m-TxgZLEmChD zU*`Ij>*Aet0@w8v7M_9G4D`_o<*k`6)AwX{>F6k9fv(RDOGnjF@1)YXJQuTE3YN31 zdjFTy)b}DYPq*54c+VYGtGH;?y_VDQ#eDr@Z}={%IGb7f~fc9i&n}aSQcfUPSC3b>9EV#6~7(>{6HWU-5Bg z*7(NZ=0x3z*K5?HnbCi(da4^||Bh>g`~TQK_atQ1tyhkiif8fvDRmHkGA;gKT0E)# zXt}`kUnWbHEaER=XYuEzyE%v*9P2oQ8?Xsmunm7;CwAjc?85;Z!ZDn}8C=9AT=Vkf z7Vh949^er&I5(M8|6x;am$};2J!$HDzOd%&>bq#imshy z_4lVh{kCnL=KDW2$ahU0Jh|^#-%9w-)xUBvUl%Oz;hvrRC>P&gii_0Rbe3`6)u)DY zmwqq?@cdtcZ$rwfe}Md(B3_gVvr(Vnb9{l)D7%F3|0>d`jB5Yc;@ASd?_9;rrGG=z zha9chiKiTA&s9--aJOI+DD;m*=EV-?!h#FM6jL zQ-6G6=<`P_4xtz%F^qqL7!eQt5#mP+i*GE%;TNw9+6_v+E}n#Z7pi)iW<32r--f6D zD-OT!_APnEb#=ZNE5bYL+WW!8VNN@E+IJeJo>2GFWANQZO}pMseP&B~dz5dt#nW+R*kBOL!>6pn*&7t}?#w(suwfAPncOLs_I%&l9 zgn3Uczu!pzDG*y9z5K&Xsn|o`EwxTJtIr(cotBw~()GF+ExPMUbJJJcOO&&oVl!8< z@^#pRZQ}gzq_G?PyU33Yx41to4sEzI`+~T^@+-Vh>v%=BCiME{D@Az`C^F9xb~@56N@PEnG}cd?3{@sF3*?Bx4rSFsUdIqwep zNwpDM_x$^g;vErjE=335xtDvoX7@+ehS+m)BO*@Ik}I=~oqv92NN(f%PB%7T+xzi! zm#-v$=?BwjuW5>@4NtT4_(+M$)>>H}TKM1uYZ4zxVCN$O zlK8$r{6#qb8Z?4`4I1$;-a)^V|E`MwI1z*pWI=Z1!l%fKf+&p7Pz;}=1WKdqQqF%x z8ecBerF})M`TvM}@A#bV|NsA7*SYq}m3>8qAe7pzmYT6@REbf0gi@O{)M_}fS7?k% zN@#3Ci5b+0J*t(eDypQd60H$xget$s^L5Va*bWIo`wy3*;u5datCP9HQv&?>#2^YCbpK?LI^8fRKYV z=F91vJaH}4k6tK~xr^laKqV{ z&JLj#Ts<+`-aWJ-u4`BjIu(`g&X9hgEpXDGj_nUYA8`y~a{@>LlRz?<0%m|&V9rLA z|M_@G1q;Dqummgx8DIs-1gnrd>makhX0QchgY959;4wxXrf~tq49)XU%$U+Pi^)%( z8E^eM3|0IMXMZ$CzroB+P=NH$Cr!2fZ17+EfA}(M{$rgZeAF{+zzVUb&vWC9i@gx- za>eow^uB@_t*7|>K&?Y-*bK?*BL~X*CDcULEKCq&DYY5;E9Uv%1X|H>@f$ z&Q5KIP}E^Fe1R|*48jz%)GIDw7Dbb*S;M4sRx=&5**K%q_*SB1g0J~xQCV0P11f?l zu#_97XyxO!o%WAeOcl5)tJQIB=fxe>FTw!T>CY-mP)MikO3;WW&@HfjV#mzHSKHP&;niq+K)`9*R^BLRaFvQ)oTpq;49 z?@++{59CIjikrk5N1jN=Yo~^?m9JIknKj0hOVl^32ZtJg#-J%^0p8O&%=>q?gLB0V zOP(9Er?)~VS{uU}^4vjsLLwoQ2vuZ><==;h8a_3Uw53U?!(B>nIL@ zWrM+RFj8k}_Eb6aG-#zz?J4&KtKZuW>nfKh*liM)xoF7V7pp51V8!1p#25NveKrK)Q-!3oF$snI;9Ym}!p9%v?*56c3QwVq; zuQ2s9anSQ;Mt8&qs7nl%qKuxfJA@w?&XRV*}oG$fl> z#)xo~cT8wNOQEJ>OR{5 zY>P%Z~ z7#A-FptCkD^n&e)H6`>ATm9?rx)5?70et`-1L-OL`~&_4hObbe02^=s7w`Zt2m&Er z3HhZUBLELA)pXRfQq=BgJwwE^vBI5}YU!y1z4c*^>!;X>KPgwo=qpHSw2?);n-q8O ziuzt_fT!WvW9e*}wW+B$ivgO%vI(PI7tJ#)XG4nY)ZA`HbK4A#w*;+0TM!32fzI$y zcgPa!Ki(1YNF{%*T!u4Np_p|oG6uJ3Ek`qY$28IC!2t3Cn$E$nU^o~F%SJKFG(9P0 zg(Evj-aC}*DPH7Cg5G49VfBfmltn75+9;y3sZ~=5xtd~%CLOt&Vkmc;T-JHxQX}CC z%M;Y!Cx>Y2o{}i&<27QPv?s>R#|Dc|p{+^kj*C(APzWDd23Z$}9&{{1X_y5c&H*VP z6)XnnAOoxbnP3%Iqe)km4}O)*QaHYN3{O$a7no_Y z8c%vKfxdrgoDzG z!`f{!zso-M&QFSUo6 z51?NgGx{MJ4N%CwI?LCHzNXSsqs2N1ndAm82~7&=1;c&809d58gjTG$ntHW-`SeuI zT;{30J6gexwhro!kAV3^Fh*ww?}q1JTopOS_`7Wc;nG5z5)qx7M?fq`$+p^VG}K}kye35k}yKDhJ;47 zy?$$%vthIxup5>@V;*P0E{y*xR=-#vwrU74%%jxmGuCQ z{S6+2r{Ev(FL(tETT5n2J_1htXE__Z9Nk8X&+-U3U@Mwy=qJzctvhm&R!R=W7PRcc z`hUr9{>*$!vmiWuX<0?PE=18zYO;_Pp-9FJEt$?V z_7k=LvX7{1%^@}A8^W2`guH-sC&+WXELH&G+Uh3_V=NACpUquU>n#4 za=>2jH8=ncfx`&MambTE8w(}NK5D=YlDto|Ab%dK;p%?SoJC6l`gp&<@UP$xSjH`( z3P_%WkTWGM%c%W>!Sd2fbod??dKyjh%uB5x?Tn*X;elnDoBIE>cbgWJ^&t9GWqa4*}PYF=;lr)dGX56z{E1_jjby0h~Sk`Aq_al1Ik(u4dY78|0OI| zHW*;(gf#MUOH1&i&inVcnlD&Pw4%jJUX>zdlwmm^_wjs?Iphp8U!$A6xiK1>9+hfY zV*5UlBhDmJ-;EsMOJwo>S*qpa7-b^v7^!)gr%-9%Q>DZ_OVjJHF9G{LNb*?G)`GdQ z64qulV|ub!UfY#JMQWj~JYPeViq;`@dj99L%mKYQNIN>8XCX(xx%qP5rkcTKnWcye~m$InNR+rVW zVYsa@#(hxvpn{!!N}&usp&)-Up*KF2FdlnaE8`0W1M$TIgU4ch$9f?21AHf-(7D=5 zH~+`tYW|M6lK(?oygwgT>`x25Z*$mBguZ2;W}k(#6~E&udn>N3Ut|3Qch5^rFf^`? z3*kHBmiP6z*FDF1F7&6+`nYbrfk(o{>gWT67K9GA(p~2B-1{-8yoWmBA$S6cz;o~d z2-&D?fC<=u3wS{Q2m&F%2TFkm5Cx(o{3#1!Kt=F6r~;~i8lV=a1L}hMpdp9_O+X9K z3cLr}fsWt<&<*qey+9w(7YqP{!Ei7Vi~^qkX)OMH3MP^QOa(K+Y%mvm1{Q%d@C8@~ zz67hmTCg5$0$+h`*+Tv<$Q-a28~}&FVQ?I1yJA!o1KR(EIhhLbv|ECwn%cu{unnQy zR$TQ`_lkBkXfq=@|ml7aiy}a=6Yr4w0?P(t&CFr zAOFPxW&!Wj@and3|0(u9wY6NoCm$)^qCs6X-W%dWEY(3}4-sv@=N_VliZ|0#lTs`! zj@&6qXw!{T>&xqZG>H(xVuQ}}bjD{!_SzlzItNXwtO==#*coiE>!1@peek^lI^~m< zH4-uMF&G6t0pr1^U?P|drh@5UCYTN8f_Y#8ShNl6f1l$a4SWHXgD(-it05^$g*mk1 zS=_)-rXinK%=w%(*KOO-uErjwve@N)5@t?=Z^H(!?ZQTo&T zENLJ~p-XySp5Gf=L!RHG4o46Uo`tz5vc=fOwwqXp4KhXIdml|4Hhjl_Qy;;=Z zdmnt^L%n2ka8|Rzen5f$O77$MKZq$O*qT?qA&fVctBQDi^|Ko+*vIyLGiir zriA#>msl)Fr}EZ_ai(X+w~h=GgAt{#Sw2Ct+6y1t@!@+mpW3?NvoVY9+4j-Slu!e{ zf3nii-MSEUy?9`31YzlAdrIwVVJ(0-JH(~xy za8G9kMZeaLT#MGtFjj=ar&4|iPR#qVNN})SSme<^HE~5){IQ+v3}9Zv;i~@1&|m$(=&u;IUaVup{-5TDy2F6H8eJO(>gf#d zSq_(P7Mt%$pB1ZypegjXfPN|wLXDe=B;_5H#W5yNN))Sev!1YI%dfc+YX~U+Q>V+v zC#gNRu&uQQA7v^#_UpHU1MNXa&;|5>V|^gWq1$(nfjeTe1TezDXB-C!QG3 z+xsGq)xvk7t|4b+WetV-;b0^fCFw%TS3vko2p{FpHa!+fW%g^_-(QNc-Jcn6-j&Y{ z(|XTEv%ilVm;{TbfN5X`m<8tO+~E_@Zx3oUlkN2g*iYLhVIfkDoCd7lPm2yF#9TLoZ!j95H88&cd<8qUL6XPixuoJ`(01jhXi~CKX-bb= z$4=GcL=Hx*89Wcr52rxwgFX8}E;uIpO)5URt!zG_wFH(l*f~p<^}IJ*jD7sbc>hLE z=25(2O>yRj`ABMmXNheydJbW}vPkN4u=oe?Blrmp{0#XE&?YV4Q%3v8)xHDyo@dge z6DcfN&X4KF9OOf9@)$XoXnqstY*)HnxT5zqEWZoxgTLY6Q^;q40-!%t$Fl`L_Co<- zdk32B{gSPOeSM=l_JkNbZ-*@i{R@TFyc2Z+Z~`~*+gY-h)2gU8WVEiJ?Vi&aW8RU8 zEiIq2Ny=Hqs)RQ8+rh0cH`Y%7VM__&aG*3O2P%Ts;TVM?RVcY7o1dtn&{6Vu3zo9o zGJZ3lg60C+J>mezMXwizK9EHVY zp0^dL>lcazyKurXygkyrs&dvgD{BYL?*cjCYke{*UH_|#CNj_6_`bfRhVldqoY5Je z4M*BgQnjpA^BOQ{FV>Q$KQ@l+Cs#O)Z4=p+pYyQuBDeys>Fk!*lr(1tX?H6{UBcXj3v7{&y7d2W3WO)few;Y5v085nqUGj4vnlv4uK*ca}#yoOSuZ zv;H6u1cOiz2EsukCWC9?EXxdln5JfjRkUMx8I~W<> zB2F%XtTHMtNz~q$CDiw{dPqxmNw9Ddm;wi8K+aMe(3S$K<>>wZav*hxe8WPGCykI% z<%P?|FtY?Kg&kT?@y4yz(s}Hl{D;54&q^NlPG@DUhJp1u1GG*+p`-m`B>6GTinl)( zu+%A1}Fe`z&%h1haW*| z9pPJfH`JcX&ZPfQkD`8{g<{?y?ZzpX-6hjX->#FIJauX65;5BM)c9(mTwL=bhP-Tx4TMQr>W;+uvv33jG<0QsAxx2P=c>peA?|yaj6S z#@O*4_^bgG0GTmmf&N?kBg{@!ZFBGqf5l&%*-Y-r2hhlkpM_Mjv90CWM}Ko8Id^o7R< zKn?`tsXVNtkfa+nNYdRyB&nmyW0`qUIn=?&@b-K8r!6W1P4EY!q zZ;C0s$U^G5lFXj47b|VY?Cl-B99yy9ZXiBfO2;(+b#=yfI9;A3cx)0#22;Q^Fbm89 zDPTSVAT7khVz30H1G1P$WBeb*Te!&Qe6=LIt=tLWQ?xYULFVLBl(;b^LM}bkugR?+ zC8HfDsA(hoch+&XckwM*fy1Cn=Nl6$fEAe*7nB%^23}nH5q+t?*t^`4@9! zU(*2;7X8YcagA3$F*QHJt>2uSdW>dQFMRI+&p&GHV7rgJca)ue z6@&}xc8I5JkB$3Ij)f0pi)k80J{eiua*;*;!W5hXtb)&6k4Fjm)6zP0ap;fMZLT1E zWBE2Jpq=;ttTP7#7vKl{K_CbQVIUHe&O!Q@!9zJv9=rxBfy#)H>X2^&ZB+8Z4aYp` zBA$)MCij6y<=qnPq4xur;~uAN{k-SHt9MF&ZXb2mvj35a&-BvqOKw13l#pW}A@4?s zfdu7t(#I{Ll0l6UB^^~vR5NBqZ)IuSLg`uY3X77$&E_W>+nU>&TZ<%Tc{d%ysf=NS z&GEwB3!&%>J_G~6U@#nv1f#%M@F|#xkWPl23iKY)s(=;^bAd=L(igCBIamqSDjAdS_2hd2_`y?N!_gjN3O!%+;5%$+FhcL+7s~AiKh(t4 zSe2EShWz;bO!A&BuTWGqc0y}IMSID~VtEuKCljr%Qs;u+bBFn623oGCP;WTCTuexK zWZau7w+FG~v3GzB@FK(0iHAfz`=eapLle=Zg@gEvyb<4qrv=R($o*mXta+jHv6Yr6 zXW={C|KP%kZjN@&vFyXn=oPV#Ip^Xl%?ZAiukiJ|5(D+v}&0#m>Y zU1<58VSB26#`^PqDbx}cSJ5>F%R4dXxE8xvA!JY~^5_EC^*QYN0&+Phk^b_YU$R8L zu8YQld^D5VYl)cq=40c~&GAUjVm(yN($!rQ8)q>8ehCu`>tJyf*b0YsKvHb*)7HFb z*4Uwp|7ZZgEuX zRJ{9*Iga|9TTE)+bjo8qr9H?!kjNJ@F7^6~U0h_DH%5(qGDj7c)*gO#gf_(m3z6oE z=2-J5=3V9o5{48voH>@ytedRASl8Jy?cX~tJ3hrw`;O~l+$nbm(RUae1;@cja29+A z&Vvi!68HsN2RFb?@F%zj3c({JLlNW)AncWsgKy`Okh9;`BtF35%NMfzfVrtK_!LoS#rMfiJy3);=zg$_WP-AIy#9c%Jaxr%_VR9qtTDnqf`<3aH-`>EQ9yMjuYA%P{vx``lWTNbs%<>ZAfC}JsPz6*2Z-83hZBPf)1@%Eg5DS`sX5d}W z60`RwD0wIKv9pFCBrItzYrxG z#m=}9+t{4)l2vp=jy!~O;NBrOF2$i4X0y}i8i`yc(L~^6_-ZPc3Fd-%U;+3Xq=7Hs z`{j^ik$&QlPr*%lPrf_M)U76~@2OM16=t@9T`o$pKzFvp!4l{UuMU(k2EHLcD9Kk->bMj>s#h#&! zZQ7W@Q4N;<$3|t)(ws5pr+Bm}VQ%>{&#WvD?DB#j;Dend>VLk;oOi$I&^l$Nf-&pa z4GGCR)qKRlujJsZTl6G(h)tJSX&vYNectbz_00yhyE@$?kEm%5(1C*t zSpT523@6zJRk|yZ=4M;L1Mh+NK|9bMbOaxOZlDJ|*9Ve2NX0d^`_HNeNG%*H-c?Cz zc~`caY^3&u=>| zvt!9QtlqvZJK2I#eFs8ymg{EBmA&A%o1TK zXPIERX#Umuhc((Z$0n_?W!VnfPTOAEJoXIxAm1x{H3uEOOLJ0rFu1+$2zOI=FZU{B zmUUnQ*bK74POuy71N*^2kPD80W8f4x3%&#A!9{QdTm|{y#y*Vy3-E9U6oQA~5hw!B z!AoHL8k?BD#wI367x0205CV7%QAwc+MysYJ#=|ga){lbp3&?!4O6Jp<>@1NBH))#$I|iWg4A>OdH4V%H zDLN1FW!w0TB_}Q<{zD;#*yIU1tV)t*KuFT+H-*4fZ>@M~-4o;CCUS>@4zk)212?f6 zy2El0^FKdh8NSe+2FI6y$ZC^oO=Y-F3@ z(xeJBgH^17a;X)*r0M7sHX%JE^bQ;?1P{RzPy}AUGs6Cop5dETe9{nh^LCYtTCiL0 zRrx`0;C`ipqg?wy`_S0@UvYIPFGln3RrX&QtTH-2tsC2za1uw6X@g=oEQ`jFBFVnlTFDBDqoF5j*$x2@H+}pTe+q#7aA#)(e!U) zwcqG;9t(_oc7)D=X$?`IpT>b6p^kaDc?i2#Zia2AJ=ea;S;kcdMK;g1(vp=m4Y4&F z%m<4=8pr@E!8))BYy~^P9>nT?$iskp_}VI*9i&af{A4W6Ols4MCY)JL#=bJj$@xv^ ziFt_+jE{O#pFhz(n(d`b3i%n9=7ZnBO;7;GwDwS@6-?xd_WIcxU`-3AJ#v!*&fy zLspg@=AFO~_#coxsD3+w)_ciEd7n)ZeXX7tm(*;H%0oWb8UX{*iUIzu37(TPIxiD# zi;9d-uNF_mSA_m5I{o}IL*2FRQatU7C5H#4OCE_Vx^fY+6_flnmEx76WlSlfKL`ygyEplzA-We52T zK^r&{2RebypeyL93z^>G{F(B0(ByKTi-m#DjHkEAYsh@(1I?OKz!EWA_OIk}d4|B! z5g-v3kAWNqDAVyhL3>6FWHD1`eWY5SPl29kI*;%*{@C@C*f=3|Z6j5G3iPMy^wa8? z+W%)&t8!~Xo-1AS20t(^n?dDN-l&=m3o<|^vqY{LsUqP$qk`{xGf(EHg~L&~L$VS2 zzk+@W%zrG!;RaSDJMQia#5(>TkBreK+7F(`KFqQU26MpIieYVaOgC!sNhs}heA=qd zw`%ci`+PY^dwUAa|MB<9^Q7Y2Q7D7(q1L#scCeN0#ibK?O~pQ7Kxr*+9Fk*zCM&sR zl+ip$*IKrpY!-WheUJSw`!sA+sf41u!u0}|c4TE8L!eH8GvF-9lkn#}xBxDKE8r@~ zN62qL-UfF8tAvzG=Q6!=SB>8-Ej(Ppn&}t+_CwSc_a!K4sFK>tw&bPw%m=Zb5ZHn9 zppfqe=_odkHex`SkL`z&XMb7hvb`+Sh1lZ?hxXDiRt~bb0>z>`x)VGXO#5uUn7-(d zv7mR!3js-w$ZC_NuBtHq2JCqolI0BLupbK!&4=fPWwN`nXN>P%B0PL%kZuq$3ui;9 z8?iZLv9A#ZgG74hg#W&*fSfq2;}053tZ@kyA=CjT~p4#AHbq6 zpa5aI15PB@cV)kdZM9`_D zXxmVm!FM(!!?(s))g{leTy-t>1!AAYr-+e>KmwD&RC<^WW`fyZE|>>C0}H?+@Ht2W zUw~y`IrtK+Mij4y+yuS?TY)x7XeSZH0&Q=h7H31nrDEpc=fw*;W1O}hO;0r*$ii|HXogb%DWY`biK z*%sUL?Ask9oim*~oGsahEe5#FhfoaxJ8%O(;12>pu!KKhARI)3(x40|4_*V64`F8j zB>9{VS@~_D$;uV@e7cFphZ&eQE(`Bp_ zb^JJD;T8GPFBbRomK^Lb zI$@bASu2@?Oh#u-yPso&<1QO2w{X*qU%7~)Bj5x$11Tm+ZE6>tsw25x|x zpaA>{?tpus5K;XI@(CycJT};Ph@T!3#;y=su6u4Ap4J2DByX~b%tdj`m3wsjfEKNp zQ>fbvSu1)kKQ~^lC2y{fkGd9DSo#S%8gWn^y3)t$_MF$aE9~@#fIm005eoEcAwfemVzu=R0$C5<8^TCa3}Q%ei|9^pDW! zr%cO7fP!ZZ%PXDpn1>`ZAh>iJ1|~2Aa<23yeZy{&pb(@l%M!Ei;abA-qv1et^z!2+ zRBfAtUog06f%W68tSPW-2JD&xIUi`v=zBy7U2%t^Rs%H}3v{*xS2n8e9)usJ<)McfDrZZ`4!ZqxKosK$Y3+&iV z>Aw>e?SU-e5nMN?Rr3y~?VV|?4SzqjHEYA^D|3fo_Bc2Vdnmuq`kK}(U4yMvQ*q~N ziG0pS0fpg9MBmP5#w%TE{%eAXFRh%10Vbzv|( zDIa;g19OGoq2fupsSKVduK)S9l)Sy>#WMM`sce-n6$5m$FxlML*4^3>q5cP!{R<3- z(dhu@!zE{tsNK-7E>Y6ZJ6`*-{ZR5WB4sT3-a{(qay}@2N5@d~?`Y;&|Bkk<(mU<| z-5@6G!NIOYUy0~X8Xpx7N31Az(|Tz1ec6!u67O=${{A19)20l)gS1y(|BeP}^v=UR z;#256;Ldc=Auif0o8|l0Ro^Wi=JH3Z;ahg-e1Os*22=voz?+~pqO=}lENBi|gLZ&2 znSM(O9k`R(!^CWRWrSj(oWr_4}Ad?_R{3 zDAq%&*j{r~b+^Zs;$tj=>Z5EX!$Z@+3@{6%fcYR5EQUwZA(sMH&Z(>`{|u;-H{*AM z;eYi3bIte5CBOgG2h6L7=K3A=o9?;d`=38yo)|jU^P}G-zv7RWe-c_*Y~pS1ZRxEh zjtiaXo#U-3{?`wg<2&Zk|KEqqb3*y2%=d-X2>3t#F>@*K|Lw=jr5|-4GoS7IKleHF zuY6p>1U4laQ^ zz`Rw$-8Q%fX9!pWPJ`RvWHuI1aH~W=uoip|9NTf412h6{L0_;6d!d+1j8Rm<~3AN1!@3&&7iFpda`I z%mH75J-~>KIz7RcU@tfUE`r~|V_?Tpb_A#nnt;AwG4NqAFCL5p6Te3Kr{ZBN_!*cm z^B)Q-fqI|=7!D+G9NYm$%nk;F7*GQ=1My%2m<1MtHDDV!1nz@C%q>&|b;0}KLofzx zJBakp$HN04U|>)a3p%}pL9^LPOy5D`e-y?Oum(lz# zk&j|DFG&5GPF+Q3L3Q2lZ|Hunt^2)^PTjOvEwLzRp|hZkP90Zlfa&k3Q+L*>yX(yN z(f!^}RZDW34A2=EqEnAl4aoY(>(og){gZX-X*&J0xmr>(#eAKCMO=gOd%8}&OsD=* zr(UH~uhXeFDr&5U$RXOI)38IQ&VgE+3HR&NCv^J1(W&!v>K|maBo_l@x=VPWb>KIh zfj@NWKXv*a>eNql>K8h-;VG3mtcUU#u&@`!YNt-^fm-XqK%LsBQ-|x!N9%rnoz#-1 zTvyi_sHHRTj_&vRI&~wRx|z;=E8Xw!LoKN_5t1NIr{M#g1zmN&_tO0yuTu}u=^vz1 z4}B^~#Z@6Zkf5{R6PUBExCaAS} zWQ*?i9lGE5=tFQsXW+O_eMV=&Ii31~PX8sH`WKyA`b}rSEuH#~&cFlR?@x55tZ_%j@*NUP6uiFjaL1-q5Mv)~V~2uplcd zR`+{zow}t?{hn4$?SDJ%3#dClt<6MTbieo2sXx-Ghw98H=+vKR^t1MVoKC|;jRxuu zOws*5Q}=s{?)L?{-xuqC|DyPJx&2>R{DQUb>vZZ(I(4>Ay+fzY(W&?A)Q6##V_0eb zPpB{C*6{bo&Kvj^{+bhAKW}|{|opFr8&N|T=)CGI<@gx z$x>!k)N1>0(`oRBTAK+&bn0-O{?fYNE9unLbo$?v)y3_9tj<7loq?7*bsL@jcDmm? z=zi~_`@K6;Yuf)lIt~4G77W&@N9gpA()~V8r%ux8PbRg*2LdQ&Q*|0<=`5J1Q>W_m zFVg*0bqPiS~b;PQxah1=%|FE}i~;I`u)F`iRc_$!BQ)wVCX!PQ&*)^+lcf zGSu3($=~6*Zp4bOxOPZr87{dGw@jV`*WT8rB1)`c}WjipwC}Nb zwNIyx)Tztr)D@tn7U@H+iGewrCcbwYBBUzgzS!Q1?H`sMiT^Xut3 z;FtTqF%?-+{KK!nuaWnEXCm^2_k`q~@0pEx$p2{?a)Ia5V84Je0e^UC3iAKP^yBV8 z>1be+fTf-jfiCZy;CaCxh^fIZ0+)L{LHA)ptC_= z2cHY-6wp23e9(W)HlqCt9xfgW{x#@U&?xb4P+`#DL2JXG1-%G*6%-O&!y6VH5qu`N z(7W05ZE#+2+2HcQ6@z~W9wS~1_J&ms{>Jyc?VsI&473DoKpf}OK+T5+Fx|aUcmKgK1zENCBx}F-Qj) zAQOy+xiyd*z-EvQc7i=%Kgb2gz$tJRKQ&jmbO0#`vkxB(8sq5{Y}pb$I)Mc@~_ ze*q~R!(0)#3$+c>1-u{#_&@}R1~H%_r~+z$@=t}hT99=>eGq$0Le$`)C1?ZUKqt@@ z^aSysKNtjtfdnubi~~s^8B7DSKnh3&i$Oa00*+-sW`Z?f1K13*!A@`hzweRoupi`t zW8f4x3-Z7Pa0y%m`QQd90Czwkcm#^T3m_avi~t*O0WSywJ`e$-K@6w}s(>1x7Le-T zPkqp{NQjGtYzA6_HXsgk0$o8*5D)r;L0}k202weh8gd*+0?A++m<3WmDp(BCK?cYK zYrqDu`8d))8xK3d9kxn#9e~C3i81X5QBFGkas{KcpK_^;1QmS zzzZOpK+FIeZ~-p}0zMFN0_h)(hZs;1Q~@y42eF_TXbIYYIM4}n1wBDL=nn>g zVITpF2ID{yNCwluERX_H!D5gOG9>)T1Z%(suo+~7onQ~x4|2gVa0kWS8MXIK$isq|D=lr&KcY3KBrnR7IBCP`D`~LPm@xEa7?H``k0;&eka*otM zoD_W1H#%T!KvVHu@nOKr0KwZzT6pe1+@v<2-!C(s3S z2faW%_z-*q27^Q}Uc#RwKynuN3@ikngLJSQWP;UT9oPuAgB*|xj)D{5G&l>s2N%F) za1~q!t``Ux2mqm=6tG~y(g@Ou7Kg>9#Vrl9OJ+C~a#j+x0vQB3)GLseD9`zA@KUy$<(cb|`vApDk@7-hzOSxGnQ(A0Wkb2qPYnJf z_#1y}>RB@{Dfv>)ma*bEf6AKEf*<+G+4FHg5zC;SK>xrtqQx5;C}+`jVh8cO_mVf8 zttZM2`aERUb4qrlCj8gH$ROT;Q{ydX+YLe5hFg+bZMn_v97fxk2`ZRSQ0QO342KTmip=0&pKZ0sjKiX(8VU0zepu2Cso?;4M)9v>@d- z#Y1b*9&`nLz(-&>7!5uJQ^0JH3evy|uoi3vJHS407@PvnG55Y4aoDuS^ zzypFo#2E?uo$>HGs0r$TM&MoWKIjB`fPP>wNC0EOBrqMMfJI;_SP3?Otzb7e0FHrg zzPVjFbIqUW57f(4a@}#!51JCtOr}buCqx0{dhPE&VcX1C2$?w1b4wB@DDJ4E9BdO z7Z^~IW#)Ut?+`QC`9WVK%68J`%{JyC=JK{<&SV#To0|@R-*7H-ePP*apTM@^^>)yg zNa#HEMYB}oENc%keHnfQJDEqC8kncrjLtchYu2~JhTAXU9Q-!-E_ak`yd&HC9loS4 zn&^7f2QK;)SXI}z?l|muZQ%LLwZcVvM60+5TZh}oCx^|m;j`S_>&B#f|+10m=6|#G_VYO308r1U?bQJwt`z<3h~<^bHF}u z5F7!=!D(<7d=C!7!xtbgfuF&3@H@Em0^{L8bXjcTcyYS8P+TvDnnFD_JX<{lo|?gz zgL{Q!`vSv8hffTjA6_v93#*{iOd)<^ije%(JRy1de5`|}V@Yy3-mgGM9y9|vtI&;E zgY9NmhCGX2M7>j3XZ;rI-``w zscF^kgiV&-#babVqt4z1{uZ@V4-CyT`ix{X8D4>#*~%(*>G3tGWj|%ejJGq0Y};JDoLM(>?34 zx9V5Ff8GDOALH*5&pN+Fe(ODU@3-zm*fG!j%5%ik%RSmN!}XQBwC6)lIX`KJYq(zr z&wbYpSCM0$vyp42qvZc{&ZW*@+~=It|20bFk}uS374}XTGbdd#2;AXOwffy8(jL*t5s;hWCBkrlfYmwDr3$azO zy^Svwb;V}}N8w9F3v4U#t)g6fV(yCVj_tY4W)HE)*x$4_vv;z8Xdh*tY+qzwhhssf z>_6FW*dN&qjzEVL>gpQeN_M5XRwM3?xX!z7xt_S3?o#g8-SymUaAN;s_jGrf zd!u`=`y2N)_dOf~4D^)u)bcd*bo6}W`P8$>v&C~t@?7&2dAxq*{c8C&^Xuf-&+lWu zd48FGTmAO?<@x>Y_sq}c^?6_O*7mmc_Vf<-PV|1}UE$s4J?_2ez3DCTI{hR3tNSjQQN91pk{a2s7}zrg6g zw*y-S_6n4S22KuK7`QrcXW)sz%YpX;Ma(pm4|*%8dC&(z1A`_6%?(->v^6L<==-3* zf`s4z4ESpYw+`+RJS=!p@IuTsYzW>Fd<9@8DHBpHq;5!ykd7gJ zLx$ng+OtE_LRR6ZP)^8k9ICt)@@L4i5HZvn8W~zy3auO3JhW42-_Vhv6GP{RW`=$h zx;OM#==Y)5L;nhW8fx-|_+InX^wsmd=j-kp>>KTy>Pz)y_%`@<`;PnaeAj$;eL|Qk ztW?-*VQ+@ThP@ZoIc#9qsIbXlsbMR_wuBuH`!4KS*!{3qVS%N}m8w;$MXBDUJ}xz- z)aRu(lsZ`ITq!BPRADJYcu;u7@cQ9x!mE_4Rjya~fbfyw6T+v5r-m;LUlYD1d{6k1 z@U!6;!}G)c41XLhL^vZtBFaQmj(97gQADeVjuE{g21a}wF)?C(#PWzO5&I*~MqG)w z6Y(O#9T^!}HL^iuyU1RVBO)h7&W~Ifxh?WgJk$*)#i*!W!q^Q@U>O?h<>Kyf9 z)W=a$)ZD1_sEtuMQAeZBMg0A|HZl%7*Mt@OImJ4+ue zeWCPkr3*_NqrK5F(QiaIjgE`%9X&Go)9AU;8PS`f>z8X*ZeR4t=u6ReqyLR|l_^!G zN}2j)T9xTuW>}e|GO1;jm)TP0P#NibnP1ENUB*~8sBF2iHOn?E+qP`4vLnk*EIYsK z^0M2@9xMAp+26`OC@YrpmWwQR!+1wb5#z+s;uiCHqr>#B>4o`{F~KlMoMfILdQH!* zb8L0Q7se6dJ*!~cZO^j1Y#VIHtedT8jUz0l#3r`R!U$XWVY^ z*EwjW^7X z45jRCjTP*B46W_g9k(2BSk_oN87;Od_Wq`Ewmicf$r5GEFkUsp8@n4X8jjlU8J-wh zi@zCOif`D!WMPJoA}kbsv#zkmn2(uiS$*axbG+?!bEavCA=c2+R?XVPe9<(;u-J6SvCrJe zEXCM57`of42yJcAqFvZ;?_kO`$6Cjj5=`qIZwO$`>|Yldxuxxe9z zwV&8bm}OmMYik~4zbSlVUTnQ$>1|qKyJlQsUTP{O<{BTF>e~)lpO_2HYwRJ`t&SW= zy1kTe%91Ww3XLiD0#hg33UQLHGY)j^vBsKi*ml}}Gi8Yx=2hn1mVLGq%RZPrm z8yOxQ3uQ$FtFpJM(8$|MsDvObEF)_n&1vW7Mpkjx_L4>PzOJ`+nlmMGYg*^>QJy6O z!cA$}sgaJH8!3?mCTCrtuFzKaL>MLvOKXf8dgj7~L=-3uqCpu@HfQ0&a-Bv z?+Sf!PIsxWKzM5SY%_nlbCiDh#Yle>kjdT^Zn0O4S6KYtS zHr*Ig>CMJ&Zqtn-{&cxD>HU`U3Qw6|e`3#Hv*(Y~el;R2lhZ^ormD2RDmQga4fplB z{GF{9e`;EjKdpY9Kh>|zpDdO6(_r-}x*C7yt3WOU+pRRJI|1vcAoqMmFY8Bh+_4s!wB8o4YFEePy^&ME==f;^vx5 zx%@G)H-B0XO`0~Unr>_-_4myCm(@J@$3?FHMN9hqXZHIa>~ETyKw0a!u8uSK)1m$R zsd^H&s>%6j<9z-H@>h6f6A`TpDxwmPl<2vr=QfP^w;>ix>Ukg0lQv_KQ&e} z%VX8%dNFX*CI8D^&~u*Q^=HmjN9UNqMiU5-EPtH__0#_*?S>eD1u-^9}V*UReD zTdIBUmEpghjv^m4QIhYKVYVYh{^^zBdRhY;ymc>a0E9G6EsPt~g1ogJw`PP|%rB@< zZZ(BlsQOl`1^%pB%nMYT$FXAGp5>@BYBXG@{9gsx;*~+J;^UcyN$l?dC7-@B6c@R= zX|?S!RSo%R1MKj4XnpRQ~hi zxKx4J+zD+|bv5S}sd>GdnviwWcb2l;GZWSP-(P)qM13lo*2jUAshu{{5%Z=L*_4~| zwc}5>)k4ePy)xVmqonTaroSgy%`%TgVFvrViT&Nmel2cY-wx$At_b2!FTG^L0vr8Z zVKbz?<3waXNE_&ksbmOGTi}eTZb(Qw3}Jj_PkZQ$DQl>d7VL^CSF<^5JsKIvV0#0% z&ZV|mpSIxdcC)HQN*nBo3Geg4H)LQwGrU~Q6+Qpunmc*;Q3hb5uuqtBy=p9ht-& zsjE8j{CzSV%yLp~%)!1ZoM)-thW%Ar=H7;lszo5owWMJnX&<46#p309zW$4Tk(-<_wQy8aQ+}WN zl&t29ztnfPS95#HGaDruk@QwQU=QIxPhuXJrFx*5>Va~e0Bm_uS}8yd(>TpDZW%z9Ae;=^g=@<5QA4`t$?EUGq@u4yG2KQw@v}b=esiAptUiRNB1AlsI$W`MaN^K|R zsbOsxL=K-;qrA}=QeRMWbwpaEFQ$x?agqo8x@ui-)w(UJb(5HN7gg)-^rRJhTF0k) zI4kRwL5T12kulzYIjOTVj2M`t2sdw=Fhh|d+*9P=kX-*$=pRtcATa}%6a%I|WdnYS z3{qs6BBK;pPLUNASyhp5D6+O9>npM`lTl&^NbUjh@B)0)jd`F59?T`;`0LeW_ z9$8Xfj_L~Vi1z(=+hq?{VIGVUA1UUYf5|cHRb;RtrBcd6X+_2;vXUaJDe_H4)=^{w zCZoi*ih6(|hbVHSB1bE7ydozla;hvPVV3e@o+1}2GEI>gid@5Fl(5_QI#U>RxCcO$P-LPi5C=kS&`Qi`MV+u6nPg?>!Dvi zm-EnkB`F>%`kpHC1xX2+%y5U&CQ7t0nId=;83@TOBpDN*@MR9=i#WD+EIm@*qL*SVS~r1!j(oY1}hqKX{yv&^F@!aj|C z6p$@-D3c;)XBs6n_tFoj5LofLq8PlOc<8dm0&;l45IL=HXdEW-`H3Q>3H(8k(-fJa z$OTMBiE9=0UPT^M-~6nRyVzbf*kEG6MD<;4?4{=;OHXul^%nTN?J zvAm*wN0AK`*;J7&75Tm*J1DY?B6}*buOdHU66JrW@*+WzpD1#IA|*vmQ{-$#&R66j zMW!oqxgu9F871z9T}#B2Uryqav?p3{Y<8#bpJ{15x62Mc)mbzSUWB zUfBSB+(9z`M?1OR*rI#i^}HcoqFlL?S)3xgWEQ6g;(a;lZIIj|@;SFCS7*^XF|xxa z6nmB`=D$?r8b$8X*hd~)Zc*C*3yQ&9MdNWro>AmEMP5+kWkvp~$jXJXhifSEEk)K< zWFtkkP-GiOIbb+~M?R^NEQjEUE@bY8^7|Kx2ivO#WpnK+$-kRs%jLX};y`~z4%X>! zuwT~iRrHTd3y#7x(h^1cGDT)8a;+k>6uDiIIf~q`$is>}p~!C(nWxAfA$dYla4UFa zZ`75&AqiJ>8Xg*C4NagyYp~{4IV-i)y$>uU>u;-s>$L}Rf>c*zEk)K>WMf6Pg2Z=W zC#wzn zOs#mAYWJ!38`U0D?Mc=CsM^cee>cRtjk*&q`_Bvww>&dkqt5WLTEPp|zESOa)$%IH z|EZW!pZi?8OD*q9zOu6is5Vr!Q7`l^cSaFaD5Khns!dmIE!EajZ6@~LOS1o|XNITM z8Mam9x~TRO)%I2G0M(9o;qtW1h4AkRtFHA_c>6y+6Wz?C-&bceU9D)2Y8R?@v1(VS zcCBhRsrEC~?owu~bj?219>V^+A(KjYW~iV3zk5Rii)U{z|3^PI*%NR5kA5`3bJ-G# zuFUVOIzQKWHE~6?H&pwZYJXSlOVz$r?LVs3{qesI4hiuzAWfZ-5BbUrt*Q-CZKTIG z5aLw9q1qzYfA>Je?w$&3s1=s{PyV=up8WdcOV4acNv@`9O|4YhUbUV7Q!**eQ?fH9 z|2;>`K#%^(fArs%dh~w((Z^Ny=z~1E%RMMncIe#Uo{SOyDxjRq^7XO*(v|qXYkT4+ zqbq%u`O4FG%~jh*wH;O4Rkb};+uv==%oK*J!gSTnQSCz2E>`Ud)o#FM$!{G=ue4s3 zQzoT`NPiScDr{_+awla$YNBK>oYcVBAw`$EI<=TIyl~PKV@^t9>dw@3$yg-mf%a*t z^rA>o$*6nr@8UC3TBdxGGCXB$%Dj|qDMwSTrL0PkQ%=h@Q<4g6T(44sQ%j^?@C))U zt-oy8XWrxM6=;fR8TB&u7h9Lq^wh=)-4dFn4o;nwx->N}b#LmS)YGX~Q}3p>vtO~d zNnTx8S2U(*;iBb>)+ySkXosSCd1o0T{{)X1-T#ce0N3D8{CDsVXc&h6f@XTi!NwQo zCeCg64er8ycnH746L_haChXU=-{} zI|yS)kA)vdpN1b{JpM$O3{zpcGUA&_Vm>T{Tv!B4U>W!@pjv@l1sfn7KMG{8bM7bL!fJ+KcBz(E*Cfp4)Bu~T3=%z_hW zbFm8`7Z$@ZSP5%jJ#2z4aF*C@*q!hN$nX=|A?!DB)Wzg`_yJDCk8p{AU*IO(hWqdY zp1}+F6aE1~xjY3u7{D9MV1+;khENEHNQj06NCGG0sv_Vj%A`1yg0hfIW>su;s0DSP zJ~RT6yh2a}QXvhBLrEwNWuZJ&glWWA##V(~(u-jktb{dC4L$EM`~PP+JK%Hp5^9i9 z3u;4Ms1FSx6PiFXXaTL@8S#HW8`AASV925ao{q}wfS(0Hq(dPBq9G0vpfh=eo)p(- zrr@MO2`CL+$>nbcG(!3;IG141^&t97cf) z#=|6-3Nv6f%!7p>!Aa^q4QF99{#MuyyPmQ+{Dim<=MwfS>=o=a_yumlZTL;`$-9fa zi+upU!&7(xui#I32mgSE@r)jfUPZ@Ccs3b9f1F;4k z5JDgvq97LHAqko>gCf`#*j7-EbQ^3ts71O1wkvdpPoNj{fqsw!17HvgfsxNy|HDX( zfr&7I3MRuem`a&qGX7lbA?$qYLdbkcs2j zXqy(i;ahw^Z18kWxyNu$z$u7CjD}dSK>{Sf1M-rw&#@x55EOw_@aC$$B(^k^h4N4l zDnk-^Rk78eHWb6Ji!F!E#5S4EDYqGk7SIYZ$!LRZ2OS^_dZ6`!zK{dm(FS6Nz;GA^ zE*KA!U@FXj*)R_lf&@!oIjn-UumLtJ1-HU>*af>`5A277a2URYV{iga!C5#57vM5n zgBx%g?!bL`1W({Oyo5LK7yJ#vOHNE+0GEl0FZe?sgg`h%K`g{W5;&j`q(B;!fYMM7 zDnb>g1~s8J)Psi57@9##Xansb3%Wq}m+WIbN%Vni7yyG|7>tB5Fb*cd6qpXPU@k0x zTv!atU?r@9^{@%Hz&6+kUw{nz;4AnVj=*;>ImR9*aT3nJPjDVC!BzMLZozMG4<5o} zcm{vKYj_Lq;R9$HD0zW5_<$b-KrnOupUPMMi78|K1%SO~e$kNid0A=o9@G1zgCIg!Z}ScbR)R>2xr2W!zc zU=6~gqMM5@D9Woqi}q$%^{a_53R;A$aj=Q}EwA)*OZy2~%H!N}PQ|3Lk7E{xc)lvP zfQPr2hIkmyXR;bNFIx)Pi~0H0MO14V%JNjhgtokyk?G6scdscRjETghqttF1~=56iNDXOJ$mb;QaWde}29@q>H^@$q_wP)~Sh>CXr68Nzs> zf~EowJY@(=g^~U`DQvL4v2%S;Fb^JQ2*(9qzwB^5scg*v&0x(_vuv3jam340#Y)pk zY2ILakk=g3Z$WdU&4caEqK$(Z^T!|Cj`&EBK z8aKoqQRir2W6Rs1eIYNsj|N^fe4$Z-257eFmI`LgA#-HpPXFG~CiiT%=^h7mk5t-w zM)%b8)TH#qHSJy91KnQzUVR7Y*CF~^K*Ui059VyL#3dO<}1El+L1xu8;^M( zcUMwRXcU<1?(M1iGo~|qUY{Xc*Zl4GH_xAB2;b>v8fO}nCfwH#&?rrawG{L25_Kvn zKy5;CV{xMr`9Z%|yO)OrlofNAZ=WekU(~C3q*p1gvR)OuDto1Sjn-E23)e64KI5~; z`%`UIY4=cjd?}aD9G_$QLp~)8odeSip`pq`Ebz+pTI@B+_cvXbVUl~B_}r_uPWcIj z3}LV)+mtQ&46`SuzqPgsSZd7GMS1PzhdJI_UFHw^mj2GbD(1DimF56;8)|84xwp1UhG1i`QQ1IV8_b%x zfVhAYZoQtcGjJ!51u4sz%34)YH4OgzDXng4Y-4P1%=OLnz2N;0GLzVDH#wW%Ky5jl@?wK7I zy7+c+cZl7)im8fwWmWWEu3xTKVlQjY=r;Q50ynxN256f2HgTt>dw(!}aK|1Og84#? zX8|T!4)Cx>hT!_eyPvV2dmSDZD)G-#)pz=I-+TV)zRHq$*8H@<)#1|u@~Q9M zYO0&!b@A>h+neHi<9wB+8e$r5>f<%al&#zD6JsqLlC942ob{a5GxNUQuXtue>BsX$ z_-3s#%i}`2S9`;qu%=ee4t8Dh!1Oy?wOP~A6dL$>cJm|O-Cpl~y9Z|)*9BY%pBr?>Y_Vhp-!P8}NboLdscMPykpoTyXo8Z0 z%LhLT=;(9Af0kfkrkAzz%nQwud5L+sd6n6$d93Yh8Q@ndB->|{_hW50?Q{3i9yF)< zrb%HV?S(a$r0OH>i9v${kNY+<*YscPY9igKYQ8u4E|Pl{_35BL2P0yG*_j^8#F^ zE$;O)m~TC4gnc~ar0id>4byyQ`p)sqFwFNgYesA0O)Wwn7#8|<*Qc3AYm_y2U9+q! zS?r2Fn}ajlRcyd-EPUzL*zMI|18*z%`?eL7naaNVsLZVCp_yi_ufOBn!`;w}zMoo3 zxtHpNZzEG9bxYb{dBY=Z%HevuX}ffMl-(ZE(?8p6@v0e6#w*WQ!hf{aMz8O*b0pnp zd*Qel-k%zF8kU8`_^sC3^+m0X3_kjImTB5fe$JqD>t?CJXnTD6dH=xhr#=(>Zt&wf zu8`~QzW4Vlr5zRQ*(4_DQuuy(368nlgT4-Kt*@fjnYssUR{QlIomJjG+HTUgl4FI; z!jJ}~pgdH88qgTpKu72bJz)S0g;6j8rotRp2#a9_tcN_<4&T6!Z~^YY3(&<0nSKxy zCp5_nClL?HP#Ee$BWMP#p#$`UelQS*!8Di+t051z!xwNKu1LEx0}{Ih*o4ebhyoip zAr(qMd8i3>p)s_8wvYuqpbzwiAutlg!X%gppTZJY3G1ZiE_;ycD9NAU0VKrJjZhw{ zKn-XL{a_#rgV8V^rocj24C`PsY=h5X4;+CLa20-oNALpv25o|nX$0Q{!JZjFA`O~C zE9eb5-~x?c6V3%z(SfZ znsUvAozqbSTr%7-cFqRHk1wQ>M+EE7L)XG{W7GjXbn^H^j&^LAdTzruSoX z!mFr1qjp98C9Kh{(do#45j8$!%90AXm6mCQ@ga+rDAOp)j1SrDPM6!9A9ZF!)1_lv zn+$3pPeof-CP{}^o)m&KLkp_QT$UzXSeaj}%d(2nqm}<#s>S5jJ%>(yCX^NuH2<4Z zYVw6{izdGk3_=_5G|w}qx9grPvaWZTG+M#$KZUmEtz3C3&nZ0Brf^j86iVzjteN-F ze6M@+nz=)k<$GP1ewuq@dA>JoS#3#JmG6yMeMy?TI^TPgw`pz6)_m{Ryj8BXAqDOq z%kM}VR{w7+<+Ym@onBi_H%RDL(3EFbP3 zBHYoda+RFP1vx*h{vh2iSl%H^x8xRGkzcC%iZ63p7I@3og)J%Wa#!-tYNe9x1sz&t z)whejD5z4iW$MyhoAN99W?7@$^X`r7qYBv`-o7QRbKkjV>9<@dHh8O+>8_~b zEj0`_#)ni}tV|;cX6IUwwycG_Sv?E3gHxM&uL#Y{Z^HD=*(>|zQOXq(@2;|>d)i0( z-?bmNWz4EdThevk3mFA_L!UK`7vET)U(pXsy5wfK%Pw&5WJ{JRP04aMDBHc#Zo8-7 z7nEqTyl-ybf{oR+e?{`5@oVy{Td-=Fw5g!YXI7Lg(z8{5Ud>OxpOx(H@@A`)nRF{y z%U`XUC~4a&+T4Pz=FR$ROK!VYZnnEI7u_YdF3qpaf5Vu?jtx4Ox`qxey`B53dkGd5 zH0I5U5{tIEyYVLuK;uJhx~H?;)qPtKb!E-6#Z@*a`O6AszGus`H5Ut3-^M&?<L;VluyAys`=J>8*{fRjfyQO+j7G{OX?Ps^CF-gj(Bk^HxwD&N@-w*`#3(uT}85c$1UXE zH%hu^=jWc?7X_=L!s>P<)7|~s(p|1c!Q5^yjgU&XRw`8sUQqp_O(&OM-<+4XLpbe~Z2ZQ1fkvY(qwTJ}6p|bICQOWojGV1quHCI& zl{71AMbz%7<59mvy^G3AGDZhQi_w*ML&hi3gQCAoI-E2ndPek;=$+9Ac}K>t(VCd> zn4&RNV(P`Tjp-3HC}uow$T*d>!WFYMW^c^5F=t|K#600O8OGRv*r?d#*z&P;-S5d5 z%3Crv#_o?j9(ykKZtS~QeOwUl$ViE+7S}p%LQ)Rz$e0|rG%k;KWE_h7G45vEn>at4 z-B#3A(N^2m)YjQH!ZzQw+_u@a&vq&4xb3R#*QAHGw>Cq3aC}01vG|O5SBv=0@x$V0 z#xIHA5dV4n!T96x*Ww??e~33FgeJ^NN=zupdot=Lv`pxmFfw6MLTPXPb6MTyr1|g(JLu1DL$!q zQhHK@q?Sotl5)}G>a18*aAg>lUX#h@gVf$~rZszPO&)F0qvnH^oD-WABKSoCc`wC33I}E2V*XY#jpxCLLTgdJ#YxVfunE& zPQh8Y2v^`1+=oZ-1fIh`;1$7TC-_4kFb>ZQhbV{zI~0Ku5iYu$L^{-f3}^_Ap%t`+ z4$uicfovE6!(kM-U_4BMnJ@=(VL7aWEwBxC!WXa~zJcR#63!?UT!71P6Yjwicn&Y& z9cUwYNhJ6}5QIVmL_;DZgA>xA3{-}6r~w&J7aBk&G=(LLTz64SXjZ1W!a*tA~dd)|SKEYM|&gLEn;u6l2 zRxaY@r2Y2ZTCaY+`(+Q6;!i|G$a}uBJ0r9M2g)}u*gKkh?Dq8fb<&#(9XocE>)y0a z)yh|H+i&Zo@9){0nRB?Y*-^-303b)+x8F2GR2MpNjo3x_i>bhfU?ABg84;9|gPz(8 zJFNdZJ}5276+@FR=uE|hG7J|=3TaYQWOAIbIB%j!70Srzk;yR{c|cThA8kN>Ni|O> zEnSUCF8nW9si7P*(#0mP)T%X>6Us_kY{@tN6;_V0QbI{-N__Ij|HvhUlJbZ6(}leuTNvu@%=`|>A6hAM zSH?fHxN(snoK04yp$28zr;aksbB~<@+AHa$ZItQz2Fi4Y%kBK?&c2+bNM5~^=`(lQ z*hxt@?x#%8x?`5sRMNf6DARA!l(}CH^%F z#WM)kcyZqwy}`@m6{s%CU&eN7>9@wV1@Ra3N<&BU3-yP{^P zq4NzXv{+d-LGXmx)g{Gr6?Iu(iJfUz)Nc3mnA+4@x~giYZ{S6QI_}{ArRV0q zyUB^(%iOUI+_NmDs#^>--6_|uD5rO&f)+l~vrgRG!DsI2KDBA54Q6yrBFYeNpdfZmqF8qb`C)ZDa>FM^BSla|cpch;s&>uU5J>!_eH_x=!xt9kpmF z?@R8gl!4@~sO#?ZZM6aS4DH>qzZa~}+xm~IPBN5J>o{&`sg_7Jgpl%V#zozADN~le zn;NRzr}4D!tfr@`Rq%f94ju1q!eI9-`?{y6I9{-~xN{@aS-ds~++0@{$jkd3+H<{5 zt!KDbZ8fHwcc#0fmnYH{^>N2gwqH;2bZ>vPqEmvAZ-DNK3Re9L?+7*Z*x1-T^8sq7 znvJ8~4IAg4PI6CU-Ltx)Zm4C9^E?r1i3Z+@Mwe2#=ngC9UdHwAkQBEvO>KQe<7&66 zeEg#H)TWUIX|s_`4Wuc;}!;i)l?n+%@Ac2&JFx0+7K;!-S&F}_DU zjQ9*8L4&Aj6TF1E{k?=NKDW*~Amk4!E7_G{Wi$J`sIK<^x1r@w`~MCuC)?}A%(W{6 z%w_gLF`Mk3L8fa(%x?StbC`L=9u<4qo*aAK{>c7uxcPCg`M3S!aMP3=p8WrB$XPU5 z8FW@m_6$4gCAUf5=VI*HGx_7_b4c>X@#p{d@N<0f|7`&JarikiSs8#XP5$o?bW8Hy zWX~`(@w;SYB>GeG{ls6A|8Jwwhskf`)=3VBE@t`y&m#p~t_brNc!+mj?QvZoEq6F} zORYqQsPES!yN@(lbhMCuX5ybAR3oU4P=jf8p}t(s>6l|E{0aBw`?&ATSLa|-llQO< zAip?w=8JKsnu{K^9>Q>eOL^%-QAc}I1FksxA!W-g(;TMCQd)0^UY_00p*6XNY5z1o z<5T*V+CR0~e$BkUj~V0l-fZ>>_eu6C=~K<;WZ>19n6OUXe@6E6p5-^vJ1pT^V5ZOS zf$sx-gF5(3vF$f3^NSAZ<5MJPs<%1nm|=uZbktOzT%UD5yL`6zrG`}u+UHk4=xd+U zs3$R1quK@a2|DigsrRU$HQr64s)WsS1$B)&nVgvHbZG2TlVp38{ZaC&q@V1M?WOFE z?5BM)d8z4k?`uBQlLmx6^tt3$Bw0;{NZ0CWI{vTOYR6_GQ?1TX5{wsDn|y!Dpi!vC+ZhV{b>f zUPh(+7YWYvZxFjZ`O}0wN#4ml?F$ko*v}^AC3N(!7~Ch&;M>o?N^;xec7a*3qx}zf zAF&OL-JCenzkcvi|8~KXV-3;A!ukYZL9Td5{Go)4{&)R-!vBmt8T@lXba+bm z`NWFR4-zVe2m3xsY!sdq-aouyv`?HSsY3isbEEic!N2oUGFj2D{A1(Bhx>+fiC+-D zE_}KDpM(L?#o{JL*N6*C+8yp2mK!}Zeu@5^VUyPl!{=U)3<l?!b?_a&w>7RN3 z?X5GKO)h_9n(slc=#U_5f;G%^+^e$h&tBW~H@xcm7PIcrM;RT)@4~BEztJa|+V~bT zed625`p~O`wX&(6sjqd2??m5LriJPxwwTZZO632GCw{Z^J8w zEHGa3-D5RJd~RB493A(yseVXQM7xj~@qI#$S?9(TiC7!gKk3W3N)b=Y$K$TWr6fI# zYZ%cnVpK>@#9d#lZ6)`cUi!}Dy}Ch(TSLZ0gxEye1*@3&UMuLf80SaG#v?|(&RgfJ zv+7(6121V0gxs;-PkL!R8FDOM7jQNHl<8!21zQ%60EFwJbvE6)z!|zoy-`0|e^Xz^ zP|eW5@Q~}|fArp5B}aQDd!>2J)tC2bW$0q)XBcjnXsF@U(5sbKXRkh9L%ha%P4{Y~ z|JEF*_t*bqK4Wa9UmFn^@I{2y5+86a#OkvA68(F~(TMjUzM;{f&!S^37b1#;Rt#-u zs~=j#(#dw!c*RuSaxbE`MH|z?a?kW<#7k3G%K%GSz&)eJY>FIf`NR0ZINK5&(=N11 zKyu77iyzOvGz`eI^a(8-IVv>D+&*BBrB6V`$nPvaTgt}Vwm9^Kg)qI3e!704zNy~z zy*WwONiXV(=!)u}#y_((h!oBLSUN=dc+U*YjvN^0K0Nqt^y`)yz;^SsDPiK7C2{p5g1zq&EYLNmPA zM7E3B8mddEX8t_#+sHw-?*i^do)75fiuo--^lM~35c)^J*qG9O=Oa&sY6F`j&W{NQ ztl?)1EE>2jrk%N`xpH8b_bpv7eKTDv9t7&vz$Sjn&07QW%m)Hx z^Y5Yeb&2|gUWwjw3`-2}L)RNtczqdD)VqTB4nu>$f%+i*1@nDvw(fUrJN+=NMUbYB za=hRLQX@w@rUV&zX2}Z5G)M?#T1*NX-M{+WfI zfo5R?|Bh(Z3TyGX6QM1ltxih$XJ^QhD%~05D2xekIVS0fQRiZpqm!nv^v>ldY%DC? z($o=rrIfLbQug;c9+VRH2+K5;gfz|1+QLF%-YoL*-z2VqdP-BqI+|;W$=Am^f^@QN zq9aKY`S!zy4>pF?${+7{7jEM#njpxjlN^h*u8YDi!Y$!}@QfG3eh}DnG=aPnHeTb< z6xEdC;jwg04NZn-U?@M905d>>wXhxb!!bAqH{cPx0bQ7I(;uS10VSXc)Pt75jnkXi zFj8bP1s1?c*a9+e$MohIxC-~+52^1|M+x874Al8A)SiELe(n!qxU^@gBid3doL^*s z>fwU5rhIFvBT-{&j6VT?E)TUij2g=_{DW`=?UWQh!;ulez08~Ua35fm+hhuXFh?FY z!y#(}UZKB*VG%SmLa;8A>&$kv)E4=`W!4*`ki)IUoBol)&9F$pS{%!r3L$6kg%w%- zRXrAbNDF>M6%9vWLe+uEj`9_dnhlj2=P+<3P*_a^p(R)I`Eq3 z|IYs9FiTtKIci&KQR4s@O6?P5&3s3YHY9(}i_u@e8}j@m=R$`oATf%bh7>3fC0I*K zdlx$1Su$|zLN?NH>F}qHE|zJy3qe9!EEUUjICzn1>s&{L==G@E;d63!W0gA~%ldR& z_2hLYUh5dW_uT(sRmLrYoz1C@zf!vt*YXjV$MhxDEG+dLWIH92p^RaX;W{ zqCHhAH?snz>yqPFiv`IFC87muMd{Qc#~Vw1+MY}d~35~j>a+%|1_LK`%NCb#o^NU{fS>9o_WPHuXt(22FF8b>UM{3?l#9N zOItD)!%8xD$e(RfX80|>Hi2J-Nf4~za)TX;Rs^4CMQ&!Jjg=qoRJ4WoKf*<{`|_;M z9lvT!@9`TY3f8XD@ZFB=fT4-}3=6nm0`g?}?QTbJjY-14h<{)1E3>5q>|p1)#=3lo z9+xCo3rp+wIC`6^B~cr0Qz>Gv;|EhmTo>+C`SD&yOO0tE{u%sVqz3yPUHpE>eGYGs z{z{S#?sr@!CF%O@oUF9ZHTPy;0==LV>n0ND|zn`N0`QBbkN5R!CFPS{H>#-r4ep3Xo=KD zs(I8=J)#$GHg12cvPE=;k?bg+$g7V!j_5*0qmP3$k(xxonuQIP`pb?e$yQh_E1f*< zXyxvvb2M!TnKKBQCzU!uH*LWE99Nb$pKvs_9Krn#en2`Un|^Q{``Gxa=xv<*qL7pI zDBU^bXla>`E5TBv>ko>N>hwdyS+$>s1u%^qJ zA6cdGt?}oBgtif@>{{GR6@GwNjs*SWSwA_dYhz^c4nRy{y0@@kt%N1peS^EN{P<_b zIZZ@kv}UlD{5@)Z4l(29%NHDB+JbhRB<~CqEh1QJOJ0{9k4$Zfu#MnOlipr-G&M=M zD{L{KXsPi{$2(I> zDnIIj+g@&d%aN^fx8XYLq93}kD2JA!g0+Nv`8TStG{RpBE73lecHVV#v>nAggL@9E zoU6jCt@~10Y|gqLS|v~EDW%PDgqy|P%1M~5;!7#kEJj*x5Pb{oQIg~4Jx7qV?4F}! z$Q!hGXn$jsTE@Z{`OZDZ1YLaoO7cnLN1Z@U6RfwfO58Y@CQp0h7^)3;iS`D%6ccXt zD8}hT3V7mJU|)>81$PJ5i}1lP0cOBIw7e(v*rmp=9l`STC!9m=UlaHp{0>hk_!m~$ z!Y2YlSDpqJgmzLVix@52pK*{42`nz$426L(v^XbYtW&8mTJHA3;jgi5KsXEM$h;ws z`@=DTBPM=o3HFT=g0;FF@QS0dr8WLIn1VK6YVg`|C}0!r0XT$o6zf!GoFtWdvuNm);p?%P9O)a1QN(yz_(Oh&Du1 znq38kgR3-WFl-A?Z>`sg?=+S#5iDgmZIuzMg{05)Vg*xG-0HYBrRREaWqf1YPS69X z4_4XpBuJ#=vmr;`=_UT44H!kF=Di+p6gqLS8 zhU(=7YeTHk#Ptxt8!E+f1#{_6R!^8h*c`cBAVmv~?rYJ{q2G`P2Z;{P?tF=sy+EH> zfie{Y>u1u=P;o&)D-I){L%u9G4--FVOb_v^SL6sUw~r8w+K@gKxeUU;fmK@c8T68e zM~O#t0ngC>fHjr)sjo`(oZKKzJoNF1dLO-5WlqwS1#3MyK3>#mBiiF{gU`{9W0g90 zz+kyjBJ0g^3+*@XuOe6@B>jTUMFe;wsH&+`mxFT#bdVCRn4SzG>VIJH?F7z*+baeuB$z z6_i8n))HkFxIcp3lO`6i6sB+ms6qwl((^R&NJssZlh>3MM`!}`GXtu#(N`C&9ji;J zWyOCY2H~&7&%-L6br{Cd*hzBDa$*&Y-{EnV=zV5R2CO#Lx;0--eMQHOWp(M zSd(k*no?d>F)wC8O@22IHllroRc3b_2GG_aa{qMkqBb)B0_iaMN1;|NnpaD(_N^s% zt|6K=mT?Fh5q4rTr2wlqL4IFToT`cW4k0XqEi8j8HLOzmX&6E66Xewy;=7OM+Xmz} z2LIa1<<`!6;^*e(wYj#!9a3BBS6}R4o`^pOe|~N0LVfW`;C-{_if#q^5%g2Fuqj)_oUa(5+HJB`4ZzX=N zDTrN8-YU2a_lSL~#$G4ZCGTz{9@0kUw;`xLXIfYQQhlza>dUj+i?217lL#>l*qs{) z)^hT^j^fadn`i^{8R*LzNRgeyCg$z(vVJK3-fpQXYhY&AYJGrmN)-`|118T z26AL)F;MIG6rpZIw)2L9wMRp#d{?n@&`|u5_@l9nX{qqpBI(Q~zRLDhSJ7XiX)Imu zCN}e7?=&l!{7GY1JCdZdTMn!Abpuf!oxgETqk^kc^c>69AqXj2i4| zcc$E{uUJbHatz@ef~m1*mHt7KUrI;&iD#mskYb@iV=ig1#mUNC5Rq5)@3qqQZ1E@Q zc^@%a>i3CglE#WogP&HzKV4p)FL684q{@|@p;FbpqRrf#!ZWC3abro_Uwr7BfA}m- zpp^cjSXvr$!C{b!3=oU>Z6Wp++#~*VW4ZePalR(P(1bm;3D>q*Wt)BrDfDg~DPWLT zBCIcRe;7!}U~F}=-;X{oJ>4aamM;wwts3h%LRO#x)L&ZiKb5r~o_=}rLFNTS=%$xDIf~$4vQ)S4{e9q*#)t_oP2YilwAxy+mv1*c>6}AZzQUvX&{*mZCkIN##e0sZyU& zVl%(7h*Mz(8MB+or$>q9wedX2nx$OJuOq{!xnNCh?&$|TeZVJleB|PEiLQV$$Q7U( zWDr(Y+UpV=O2f!h`zgG%t$vfCW9y3X-tF`B6o+YD9OWMukU)@+Hb8Jo41Qs;^d{YK%BfeC1n zTFcYtiqkbA3lJ_M+{Y>l6;4HQl5@T|GU899cVKKISbf@fvLnfklD?WRRXGeu_dmu~6(DwGw?TY=SMsZNsJ$^TP60*#max=89)c zhY@vc*-WL&x#Ap)qb-{`lt3yi4VJ{UAq{c6;P%8Sjpox=AyH0Q!~+3-!_h{;M)E&z zD_2|0mLGB$!Pri)Mzr%3uv4Ih^lFKiVJVE13MI%cCDmCf&WNavTOXPtwZtm3;43x4 zMfvekF+&r2lucaO344;)2i6j|vz=UbIUQ;`f?#Z~-0iu(f-S==w&#S3Kd!wzew8>| z6E+Xw9Ks!J32MHk9;O^?#1lH5-b)%FI#a!M?n6`3zYa~NHxww`fs>5Xf327(En6#A zHP`DvGtpXfknXM(tA%vO?~UIVt2Fx!q)C<5iBB>g&n~*LYsT6-QR+%S{ zrwL7^otwlh&RnF$u$}DPSOeKSpd)C(7s|qDh?gd97NwYDgq(&O@GC_gV3iun5z<^L zmnROj{E74qbXkJcAb*u7F3^NTXK{gr-yf@lS0KEJ+-<8ErU{&YHW{|V=foV!l4gG< z9yFiDe}w-cOK!1^vrUM$69<7#3`~2^5L|d|}^w&r+R$6z#VJ-RZ!}KhwnF~j#@~m2A1l45#|Ansm{@LNa zY`?#o^Ve@g+=E9%Kkh6id?{{Y?IKj^!rJX3Uy;RJjk!k`_Em(hy2vB;B7~el2|)ks8Zhv;**td|!F@ zL9vX^FSZ+lV%Xk|n*`nDzYcTNV0wyBraPwzdGis5Rpz$cIga7a>MkApR%{Zo3V$R1 zW~|bWO_@nE$$nIP<0m8SgBxT&=q?xfP7KtAyhE7MgB!y=Jn=kU$pn|!*J?tl;7`F{f>mbMj^cgf=O;xUZA>28XQ1iHD(@*+ zW3ft1dt!P^5og2&F(r}8Ky9c;NMkjm10nq-su?BMJWJmNW|7eaWH?0Ng`V>3A34wQ zag~sDnM2SMGOG3B6xxd`4y>~2DSw@)si$Q6S)34#UOq)q4}@kADU9N`Y}>L{t~NPhR>rx^I;`ygYEDJ{)D&i7rc{3-x0%HM=5d^ zltq8`+;b08!#Mq-s$~uQs9jUF%x)jGTdG#I__o6xfQsY-``Iz-V)#fh$sOhCncg3Jerfkn5;^KbDO@WwC-(ZPm<= zS~&N4sUk+r`g+sHtOQj%`{hT?p=vk3{iqd@H20{Yn3|PV=wnuCRjaCeOvazmiVCWx zJm{RSRh1f3MctZe7ME-VS#?#7V{d`hNY&V9u3Bl#9WgYaHCj7R&V@VC zcfl7hfE7LvhI-;6yAab$E$^w()71Xia_D`rq1HTv%&Xa)a&bjNSvWDXW-AkUzQ_3`CS~Kv2R7VhwvJ!v|t}|J`GpkCj1J|lmbdPqoilQa0~k8Q!!KH*9KLBr9^D)FIRppcGgCOQYC62R;|oAF?&@`hjFX_{Rz9R zWzL&T-#lyB>PXI^a^F5nD|_@=Zu#$W8pI!aHv84FtY2RJkhMGaWLCW+r*4L?Ih~cV z_Dt5LS!c8SC;XVRIP0gZ=bg{pJedCT&04XSpY6GO`Q|B$ch3Bm-dPV{OWOmTA%>fM zCi&+?O8VkwU2d5^4H5wEezI=Mjq4wi>UI^SqwtfRONf-a-j6tT+Y@jLMS zdf}2hE1Gp0vk-j|oP&$R-NP#N%pm5nY>#zz(MG&O`v-cA7Odk(d-4yEe^p*>b8<6j z3EFbF1Xqc9G+Hi{;2fig_<&Gm3_I8u&&;n==mz{QA5L`Yv>~0)yTJiCMBD{zRjIwv z*-`c;F9wHQW@nC>U&B%~+;Mmaa}_D1I->lnl%WS+;`=_=(|6DihmLRD*p9}(h0@ChyMuwG36^eo0#6?$2+ggEx(8Ozr$0s=hLLRO`N4oAMkb4 zl}?=2#M#p1Kb@@wH$r;Q#M##3z%2wtk%~!;n>w@o(s64+J*0-yrPEEF9b&TZd*k=R zDj!-@peFT!7nzkIs%u$i+-#76whupMnD zmKucWOlnBYn>(xc9YXpBj*)$Qy0oUbvzGZh{#E?z)1?>9ohK|0@bxn|(a%sGKs(;T zS;iEHn}}`Vgd>#Zhw>pXOtg0{PpgQXoSf-O<@nS1CWfJ~6+-Q{uyBd*c6nq;#m-zmGyi zDrXS~7jF|7?+-$-6PK_Ts=i|u3N1oN4c@`{`bq>2Nd_G68Ud1YH{P#%Z(Hz;Y z7Yh}d-^gbKO_|G`jJbk!|6F-QU#FkO^#j5i1noR76sdwycMe0(oT^k72s{p#Q#YJ1 zHUhVBa`=9?+bU@edpSv}eTH6G^%c7|La->N4Iw)ariA=tWrGSgw$-PoR@U|R-!12v~Q93=fSOmPafb#NOR77}bb zphjWAb{Ld}XjDY7&4`rWAs!OnSO{G9l!FCYxm;4IpXJAMZY!6^& zF~PPUyow99#qbasmJn>q;VdMS6l^0wsrVOcjZ%VbFx0?*jon;Yu$3w!*e2pDy;Gm` zU?}V=E7<0#;tC6c>B?KAr`DvgFsPPbI{5f`oC32u>Dlm z6F9e?#~SJjwnI>@fnZw?hv70jgq((SBP45uocGwkMxJy6wm8&+OYDawU=e9ereMp4 zZy>ZWs}1<@FlPhyLu1x|8iAiQ5o{yiH>ll|4GQ)^40#F71ltfOOIl$$X#+N;xnOGv zIWQh}Lx~oG?IE!5@&`O0aE%@6mt2-h}MdY*#KOe?Vv(!InX05o{!O33e|e zv_*$Ope#`$>?57rj@<`3gE!h9Y+`#Vgcne&gJ9#+$DB^sK`<45f%?S0!1`f3bY%U{ zWAZgTgODu2HU_?jzag^|Erk$*)8Reo*v?c2cKplOn%EcE&Rsk+Jb^9Vm0pA|Agmj` z3XQu9wp`c+%_#E>dx`I|=IrUg(tIM=%7b#OTaWEafTO2iYX!GJ@w@gCY;)lN)auQ~ zh&CL11+w~hVmhHMB;6j{4#N9#9KrU0UeEz}+9Jn*RW|e;yfDBmEW=Tbn*%Ap0~5;a zo}52OmnCp4X&ws5ISk4!mIF%66;QNmz~dh|h1ej+VU>gIWy+Q5$NmrdK{+8DK|4o! z9`*|M2K?q?@&KN|AMhvq4cctJxCXuu07{`yY!ukQ4uzm7l!S6n8LC5VXaG&1B`9ST zI+E@SJ4p{xtxKE3h6Ecy(_gTiA+rH?H(Vv%cz|I03?c^7K>Qil-(cS$jtzr7@jFyI zV2H>616ygRU|S2H3?r6uO^0(HfdL~pN5FSzy+*SCdyV460V2W^?3~e_0xz&F#|XCT zP{)NOU#Vyd>EyAVnBmwXU>nC)4u{GA4VyCF(^#d!Bfm$`MXM1m&8$fC(4!Ioq(`!fp5y%+om~qbFd?Lu(ieb72kafz!aH zZO(7l@EIJSNGoLukuDGIfZ_*K;`CA*Bp+MzvFxK{>nj1EsT+&QVa>vymarkAsSet(); // Everything up to first 0 is the prefix - unit->prefix = formatStr.tempSubString(0, firstIdx); + unit->prefix = positivePart.tempSubString(0, firstIdx); fixQuotes(unit->prefix); // Everything beyond the last 0 is the suffix - unit->suffix = formatStr.tempSubString(lastIdx + 1); + unit->suffix = positivePart.tempSubString(lastIdx + 1); fixQuotes(unit->suffix); // If there is effectively no prefix or suffix, ignore the actual number of @@ -804,7 +813,7 @@ static int32_t populatePrefixSuffix( // Calculate number of zeros before decimal point int32_t idx = firstIdx + 1; - while (idx <= lastIdx && formatStr.charAt(idx) == u_0) { + while (idx <= lastIdx && positivePart.charAt(idx) == u_0) { ++idx; } return (idx - firstIdx); diff --git a/deps/icu-small/source/i18n/coptccal.cpp b/deps/icu-small/source/i18n/coptccal.cpp index ce531ca0e851bd..39691217d0fcb5 100644 --- a/deps/icu-small/source/i18n/coptccal.cpp +++ b/deps/icu-small/source/i18n/coptccal.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/coptccal.h b/deps/icu-small/source/i18n/coptccal.h index 523769fabe57f0..0b82c36088fb0d 100644 --- a/deps/icu-small/source/i18n/coptccal.h +++ b/deps/icu-small/source/i18n/coptccal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/cpdtrans.cpp b/deps/icu-small/source/i18n/cpdtrans.cpp index b6e328f92c223c..a204de5a5352dd 100644 --- a/deps/icu-small/source/i18n/cpdtrans.cpp +++ b/deps/icu-small/source/i18n/cpdtrans.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/cpdtrans.h b/deps/icu-small/source/i18n/cpdtrans.h index 6f832df883cb85..29f3ba83fc1d57 100644 --- a/deps/icu-small/source/i18n/cpdtrans.h +++ b/deps/icu-small/source/i18n/cpdtrans.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csdetect.cpp b/deps/icu-small/source/i18n/csdetect.cpp index 8ddbe8129b68d7..0afecb287a7a40 100644 --- a/deps/icu-small/source/i18n/csdetect.cpp +++ b/deps/icu-small/source/i18n/csdetect.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csdetect.h b/deps/icu-small/source/i18n/csdetect.h index d0dc0d20777d44..d4bfa75eef25fe 100644 --- a/deps/icu-small/source/i18n/csdetect.h +++ b/deps/icu-small/source/i18n/csdetect.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csmatch.cpp b/deps/icu-small/source/i18n/csmatch.cpp index ea8d37cd202703..7ed6e0ee1a8d53 100644 --- a/deps/icu-small/source/i18n/csmatch.cpp +++ b/deps/icu-small/source/i18n/csmatch.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csmatch.h b/deps/icu-small/source/i18n/csmatch.h index a94b86ae7c0ca4..0dc0a9e468c5dd 100644 --- a/deps/icu-small/source/i18n/csmatch.h +++ b/deps/icu-small/source/i18n/csmatch.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csr2022.cpp b/deps/icu-small/source/i18n/csr2022.cpp index 9566ee479612be..aa7f8446eb947c 100644 --- a/deps/icu-small/source/i18n/csr2022.cpp +++ b/deps/icu-small/source/i18n/csr2022.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csr2022.h b/deps/icu-small/source/i18n/csr2022.h index 9ff2648505f141..6d5b7bffccacc5 100644 --- a/deps/icu-small/source/i18n/csr2022.h +++ b/deps/icu-small/source/i18n/csr2022.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csrecog.cpp b/deps/icu-small/source/i18n/csrecog.cpp index 7ae7765399f20a..d02be2bef68666 100644 --- a/deps/icu-small/source/i18n/csrecog.cpp +++ b/deps/icu-small/source/i18n/csrecog.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csrecog.h b/deps/icu-small/source/i18n/csrecog.h index 1759ca561b363a..51c25396adbe14 100644 --- a/deps/icu-small/source/i18n/csrecog.h +++ b/deps/icu-small/source/i18n/csrecog.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csrmbcs.cpp b/deps/icu-small/source/i18n/csrmbcs.cpp index d61269f5e33770..0c2df594d56a75 100644 --- a/deps/icu-small/source/i18n/csrmbcs.cpp +++ b/deps/icu-small/source/i18n/csrmbcs.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csrmbcs.h b/deps/icu-small/source/i18n/csrmbcs.h index 6a49a859724be8..8ccf1d56a95f65 100644 --- a/deps/icu-small/source/i18n/csrmbcs.h +++ b/deps/icu-small/source/i18n/csrmbcs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csrsbcs.cpp b/deps/icu-small/source/i18n/csrsbcs.cpp index 48e7dc51233c53..3d0b7269ccac3b 100644 --- a/deps/icu-small/source/i18n/csrsbcs.cpp +++ b/deps/icu-small/source/i18n/csrsbcs.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csrsbcs.h b/deps/icu-small/source/i18n/csrsbcs.h index 2f967dd9c2888d..bae124c05a8426 100644 --- a/deps/icu-small/source/i18n/csrsbcs.h +++ b/deps/icu-small/source/i18n/csrsbcs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csrucode.cpp b/deps/icu-small/source/i18n/csrucode.cpp index 201b2996c78cab..b84011c259095a 100644 --- a/deps/icu-small/source/i18n/csrucode.cpp +++ b/deps/icu-small/source/i18n/csrucode.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csrucode.h b/deps/icu-small/source/i18n/csrucode.h index 10e5fafe66febd..4465bf35a1a917 100644 --- a/deps/icu-small/source/i18n/csrucode.h +++ b/deps/icu-small/source/i18n/csrucode.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csrutf8.cpp b/deps/icu-small/source/i18n/csrutf8.cpp index 4f29fa2af7fe28..bc06fa8bb8dd4e 100644 --- a/deps/icu-small/source/i18n/csrutf8.cpp +++ b/deps/icu-small/source/i18n/csrutf8.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/csrutf8.h b/deps/icu-small/source/i18n/csrutf8.h index 71309eade75657..dc4f79b8246118 100644 --- a/deps/icu-small/source/i18n/csrutf8.h +++ b/deps/icu-small/source/i18n/csrutf8.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/curramt.cpp b/deps/icu-small/source/i18n/curramt.cpp index 4475ff611eeec0..019c17df8e3379 100644 --- a/deps/icu-small/source/i18n/curramt.cpp +++ b/deps/icu-small/source/i18n/curramt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -19,12 +19,12 @@ U_NAMESPACE_BEGIN -CurrencyAmount::CurrencyAmount(const Formattable& amount, const UChar* isoCode, +CurrencyAmount::CurrencyAmount(const Formattable& amount, ConstChar16Ptr isoCode, UErrorCode& ec) : Measure(amount, new CurrencyUnit(isoCode, ec), ec) { } -CurrencyAmount::CurrencyAmount(double amount, const UChar* isoCode, +CurrencyAmount::CurrencyAmount(double amount, ConstChar16Ptr isoCode, UErrorCode& ec) : Measure(Formattable(amount), new CurrencyUnit(isoCode, ec), ec) { } diff --git a/deps/icu-small/source/i18n/currfmt.cpp b/deps/icu-small/source/i18n/currfmt.cpp index b92aa00e5cb8b5..06bdad042aad0e 100644 --- a/deps/icu-small/source/i18n/currfmt.cpp +++ b/deps/icu-small/source/i18n/currfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/currfmt.h b/deps/icu-small/source/i18n/currfmt.h index 83e027246562eb..97d44cbb1d146f 100644 --- a/deps/icu-small/source/i18n/currfmt.h +++ b/deps/icu-small/source/i18n/currfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/currpinf.cpp b/deps/icu-small/source/i18n/currpinf.cpp index 7c16fff961dc40..5d3ca620891500 100644 --- a/deps/icu-small/source/i18n/currpinf.cpp +++ b/deps/icu-small/source/i18n/currpinf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -20,6 +20,7 @@ #include "unicode/locid.h" #include "unicode/plurrule.h" +#include "unicode/strenum.h" #include "unicode/ures.h" #include "unicode/numsys.h" #include "cstring.h" diff --git a/deps/icu-small/source/i18n/currunit.cpp b/deps/icu-small/source/i18n/currunit.cpp index f538d65ada657d..2192492696a5bb 100644 --- a/deps/icu-small/source/i18n/currunit.cpp +++ b/deps/icu-small/source/i18n/currunit.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -19,10 +19,10 @@ U_NAMESPACE_BEGIN -CurrencyUnit::CurrencyUnit(const UChar* _isoCode, UErrorCode& ec) { +CurrencyUnit::CurrencyUnit(ConstChar16Ptr _isoCode, UErrorCode& ec) { *isoCode = 0; if (U_SUCCESS(ec)) { - if (_isoCode && u_strlen(_isoCode)==3) { + if (_isoCode != nullptr && u_strlen(_isoCode)==3) { u_strcpy(isoCode, _isoCode); char simpleIsoCode[4]; u_UCharsToChars(isoCode, simpleIsoCode, 4); diff --git a/deps/icu-small/source/i18n/dangical.cpp b/deps/icu-small/source/i18n/dangical.cpp index 3a7b2ebb8fca2d..bc3951f210ec45 100644 --- a/deps/icu-small/source/i18n/dangical.cpp +++ b/deps/icu-small/source/i18n/dangical.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/dangical.h b/deps/icu-small/source/i18n/dangical.h index 17a5004bdc6d32..1a1e06b9020295 100644 --- a/deps/icu-small/source/i18n/dangical.h +++ b/deps/icu-small/source/i18n/dangical.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** diff --git a/deps/icu-small/source/i18n/datefmt.cpp b/deps/icu-small/source/i18n/datefmt.cpp index 00f46cfdfdf2c0..47cc852691700b 100644 --- a/deps/icu-small/source/i18n/datefmt.cpp +++ b/deps/icu-small/source/i18n/datefmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -80,7 +80,7 @@ class U_I18N_API DateFmtBestPatternKey : public LocaleCacheKey::hashCode() + fSkeleton.hashCode(); + return (int32_t)(37u * (uint32_t)LocaleCacheKey::hashCode() + (uint32_t)fSkeleton.hashCode()); } virtual UBool operator==(const CacheKeyBase &other) const { // reflexive @@ -498,7 +498,7 @@ DateFormat* U_EXPORT2 DateFormat::create(EStyle timeStyle, EStyle dateStyle, const Locale& locale) { UErrorCode status = U_ZERO_ERROR; -#if U_PLATFORM_HAS_WIN32_API +#if U_PLATFORM_USES_ONLY_WIN32_API char buffer[8]; int32_t count = locale.getKeywordValue("compat", buffer, sizeof(buffer), status); diff --git a/deps/icu-small/source/i18n/dayperiodrules.cpp b/deps/icu-small/source/i18n/dayperiodrules.cpp index 30414823efdfe3..f7ec1e6dc2dded 100644 --- a/deps/icu-small/source/i18n/dayperiodrules.cpp +++ b/deps/icu-small/source/i18n/dayperiodrules.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -174,7 +174,7 @@ struct DayPeriodRulesDataSink : public ResourceSink { } } - void addCutoff(CutoffType type, UnicodeString hour_str, UErrorCode &errorCode) { + void addCutoff(CutoffType type, const UnicodeString &hour_str, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return; } if (type == CUTOFF_TYPE_UNKNOWN) { diff --git a/deps/icu-small/source/i18n/dayperiodrules.h b/deps/icu-small/source/i18n/dayperiodrules.h index 3c006cdc2f59dd..610c6175bf5fb9 100644 --- a/deps/icu-small/source/i18n/dayperiodrules.h +++ b/deps/icu-small/source/i18n/dayperiodrules.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/dcfmtimp.h b/deps/icu-small/source/i18n/dcfmtimp.h index 58858728419641..e582efb344b3b8 100644 --- a/deps/icu-small/source/i18n/dcfmtimp.h +++ b/deps/icu-small/source/i18n/dcfmtimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/dcfmtsym.cpp b/deps/icu-small/source/i18n/dcfmtsym.cpp index b8b9c32a42fa25..c702c2e7d0e8cb 100644 --- a/deps/icu-small/source/i18n/dcfmtsym.cpp +++ b/deps/icu-small/source/i18n/dcfmtsym.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/decContext.c b/deps/icu-small/source/i18n/decContext.cpp similarity index 99% rename from deps/icu-small/source/i18n/decContext.c rename to deps/icu-small/source/i18n/decContext.cpp index 498e1fede9a994..bead83efff7b83 100644 --- a/deps/icu-small/source/i18n/decContext.c +++ b/deps/icu-small/source/i18n/decContext.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ------------------------------------------------------------------ */ /* Decimal Context module */ diff --git a/deps/icu-small/source/i18n/decContext.h b/deps/icu-small/source/i18n/decContext.h index 62123ff440a903..1fd18e5d3df537 100644 --- a/deps/icu-small/source/i18n/decContext.h +++ b/deps/icu-small/source/i18n/decContext.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ------------------------------------------------------------------ */ /* Decimal Context module header */ diff --git a/deps/icu-small/source/i18n/decNumber.c b/deps/icu-small/source/i18n/decNumber.cpp similarity index 99% rename from deps/icu-small/source/i18n/decNumber.c rename to deps/icu-small/source/i18n/decNumber.cpp index b25845e0aacceb..3ae22b1b42f472 100644 --- a/deps/icu-small/source/i18n/decNumber.c +++ b/deps/icu-small/source/i18n/decNumber.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ------------------------------------------------------------------ */ /* Decimal Number arithmetic module */ @@ -5007,7 +5007,7 @@ static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs, /* Make sure no signed int overflow below. This is always true */ /* if the given numbers have less digits than DEC_MAX_DIGITS. */ - U_ASSERT(iacc <= INT32_MAX/sizeof(uLong)); + U_ASSERT((uint32_t)iacc <= INT32_MAX/sizeof(uLong)); needbytes=iacc*sizeof(uLong); #if DECDPUN==1 zoff=(iacc+7)/8; /* items to offset by */ diff --git a/deps/icu-small/source/i18n/decNumber.h b/deps/icu-small/source/i18n/decNumber.h index 90269d9f66ebfd..92be8e8c0acd64 100644 --- a/deps/icu-small/source/i18n/decNumber.h +++ b/deps/icu-small/source/i18n/decNumber.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ------------------------------------------------------------------ */ /* Decimal Number arithmetic module header */ diff --git a/deps/icu-small/source/i18n/decNumberLocal.h b/deps/icu-small/source/i18n/decNumberLocal.h index 294d5f519da6df..a45b7d8cc63ef2 100644 --- a/deps/icu-small/source/i18n/decNumberLocal.h +++ b/deps/icu-small/source/i18n/decNumberLocal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ------------------------------------------------------------------ */ /* decNumber package local type, tuning, and macro definitions */ diff --git a/deps/icu-small/source/i18n/decfmtst.cpp b/deps/icu-small/source/i18n/decfmtst.cpp index 4af758787720bb..5dff3c164509e5 100644 --- a/deps/icu-small/source/i18n/decfmtst.cpp +++ b/deps/icu-small/source/i18n/decfmtst.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/decfmtst.h b/deps/icu-small/source/i18n/decfmtst.h index 719f0aa9761319..63ae50c6df904a 100644 --- a/deps/icu-small/source/i18n/decfmtst.h +++ b/deps/icu-small/source/i18n/decfmtst.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/decimalformatpattern.cpp b/deps/icu-small/source/i18n/decimalformatpattern.cpp index ca90e968a118a0..c7ec5cd966a3ec 100644 --- a/deps/icu-small/source/i18n/decimalformatpattern.cpp +++ b/deps/icu-small/source/i18n/decimalformatpattern.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/decimalformatpattern.h b/deps/icu-small/source/i18n/decimalformatpattern.h index 2ebbdf9ffcad97..1c297575ead1e7 100644 --- a/deps/icu-small/source/i18n/decimalformatpattern.h +++ b/deps/icu-small/source/i18n/decimalformatpattern.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/decimalformatpatternimpl.h b/deps/icu-small/source/i18n/decimalformatpatternimpl.h index 67bc96db6181a7..8cecc8cca02c72 100644 --- a/deps/icu-small/source/i18n/decimalformatpatternimpl.h +++ b/deps/icu-small/source/i18n/decimalformatpatternimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/decimfmt.cpp b/deps/icu-small/source/i18n/decimfmt.cpp index 440adf5a6bfdae..116c0c90bb198f 100644 --- a/deps/icu-small/source/i18n/decimfmt.cpp +++ b/deps/icu-small/source/i18n/decimfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -49,6 +49,7 @@ #include "unicode/utf16.h" #include "unicode/numsys.h" #include "unicode/localpointer.h" +#include "unicode/ustring.h" #include "uresimp.h" #include "ucurrimp.h" #include "charstr.h" diff --git a/deps/icu-small/source/i18n/decimfmtimpl.cpp b/deps/icu-small/source/i18n/decimfmtimpl.cpp index 342ce5b5e4ed1f..dc7c8adf67d0dc 100644 --- a/deps/icu-small/source/i18n/decimfmtimpl.cpp +++ b/deps/icu-small/source/i18n/decimfmtimpl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/decimfmtimpl.h b/deps/icu-small/source/i18n/decimfmtimpl.h index 537107c6f74de4..b4438cba9e1ea8 100644 --- a/deps/icu-small/source/i18n/decimfmtimpl.h +++ b/deps/icu-small/source/i18n/decimfmtimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/digitaffix.cpp b/deps/icu-small/source/i18n/digitaffix.cpp index 262bc49427062a..396df2cf1d75eb 100644 --- a/deps/icu-small/source/i18n/digitaffix.cpp +++ b/deps/icu-small/source/i18n/digitaffix.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/digitaffix.h b/deps/icu-small/source/i18n/digitaffix.h index a1a100654f4e84..005c36f8488d8f 100644 --- a/deps/icu-small/source/i18n/digitaffix.h +++ b/deps/icu-small/source/i18n/digitaffix.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/digitaffixesandpadding.cpp b/deps/icu-small/source/i18n/digitaffixesandpadding.cpp index 716ab4a32ebfb3..487d9a345d3e21 100644 --- a/deps/icu-small/source/i18n/digitaffixesandpadding.cpp +++ b/deps/icu-small/source/i18n/digitaffixesandpadding.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/digitaffixesandpadding.h b/deps/icu-small/source/i18n/digitaffixesandpadding.h index e837e07c8fbe0e..d570599d180e77 100644 --- a/deps/icu-small/source/i18n/digitaffixesandpadding.h +++ b/deps/icu-small/source/i18n/digitaffixesandpadding.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/digitformatter.cpp b/deps/icu-small/source/i18n/digitformatter.cpp index d1a88f95eee80f..abb571dc5fa9f2 100644 --- a/deps/icu-small/source/i18n/digitformatter.cpp +++ b/deps/icu-small/source/i18n/digitformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/digitformatter.h b/deps/icu-small/source/i18n/digitformatter.h index d92d4251513f38..54a54c3639a629 100644 --- a/deps/icu-small/source/i18n/digitformatter.h +++ b/deps/icu-small/source/i18n/digitformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/digitgrouping.cpp b/deps/icu-small/source/i18n/digitgrouping.cpp index 0d96b407c5039f..cffa122b6ceaf6 100644 --- a/deps/icu-small/source/i18n/digitgrouping.cpp +++ b/deps/icu-small/source/i18n/digitgrouping.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/digitgrouping.h b/deps/icu-small/source/i18n/digitgrouping.h index 33835ff665cfb1..f3f8679b879e95 100644 --- a/deps/icu-small/source/i18n/digitgrouping.h +++ b/deps/icu-small/source/i18n/digitgrouping.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/digitinterval.cpp b/deps/icu-small/source/i18n/digitinterval.cpp index b1ba811606b371..32d952e0267950 100644 --- a/deps/icu-small/source/i18n/digitinterval.cpp +++ b/deps/icu-small/source/i18n/digitinterval.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/digitinterval.h b/deps/icu-small/source/i18n/digitinterval.h index 5dbf3f9a296f8b..95d406da206f4c 100644 --- a/deps/icu-small/source/i18n/digitinterval.h +++ b/deps/icu-small/source/i18n/digitinterval.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/digitlst.cpp b/deps/icu-small/source/i18n/digitlst.cpp index e3873eb59f2d4e..fd96a07d71da23 100644 --- a/deps/icu-small/source/i18n/digitlst.cpp +++ b/deps/icu-small/source/i18n/digitlst.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/digitlst.h b/deps/icu-small/source/i18n/digitlst.h index 27e6e8c410b4ad..6befaf32e6f340 100644 --- a/deps/icu-small/source/i18n/digitlst.h +++ b/deps/icu-small/source/i18n/digitlst.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/dt_impl.h b/deps/icu-small/source/i18n/dt_impl.h index 9b01bad79edd9b..a4058c69244d0d 100644 --- a/deps/icu-small/source/i18n/dt_impl.h +++ b/deps/icu-small/source/i18n/dt_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/dtfmtsym.cpp b/deps/icu-small/source/i18n/dtfmtsym.cpp index c412c5be05242b..e465fe1762ba3e 100644 --- a/deps/icu-small/source/i18n/dtfmtsym.cpp +++ b/deps/icu-small/source/i18n/dtfmtsym.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -1368,7 +1368,7 @@ DateFormatSymbols::setZoneStrings(const UnicodeString* const *strings, int32_t r //------------------------------------------------------ -const UChar * U_EXPORT2 +const char16_t * U_EXPORT2 DateFormatSymbols::getPatternUChars(void) { return gPatternChars; diff --git a/deps/icu-small/source/i18n/dtitv_impl.h b/deps/icu-small/source/i18n/dtitv_impl.h index 7e5d53921e4a58..18fe0b8c9b527d 100644 --- a/deps/icu-small/source/i18n/dtitv_impl.h +++ b/deps/icu-small/source/i18n/dtitv_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/dtitvfmt.cpp b/deps/icu-small/source/i18n/dtitvfmt.cpp index 48068d3cc2da20..743b534fc8f9cf 100644 --- a/deps/icu-small/source/i18n/dtitvfmt.cpp +++ b/deps/icu-small/source/i18n/dtitvfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************************* * Copyright (C) 2008-2016, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/dtitvinf.cpp b/deps/icu-small/source/i18n/dtitvinf.cpp index 07129db928b31a..c863a683a5c2f8 100644 --- a/deps/icu-small/source/i18n/dtitvinf.cpp +++ b/deps/icu-small/source/i18n/dtitvinf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************************* * Copyright (C) 2008-2016, International Business Machines Corporation and diff --git a/deps/icu-small/source/i18n/dtptngen.cpp b/deps/icu-small/source/i18n/dtptngen.cpp index 17e7ec7cde8a21..5ce3630d98f987 100644 --- a/deps/icu-small/source/i18n/dtptngen.cpp +++ b/deps/icu-small/source/i18n/dtptngen.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -475,7 +475,7 @@ struct AllowedHourFormatsSink : public ResourceSink { } } - AllowedHourFormat getHourFormatFromUnicodeString(UnicodeString s) { + AllowedHourFormat getHourFormatFromUnicodeString(const UnicodeString &s) { if (s.length() == 1) { if (s[0] == LOW_H) { return ALLOWED_HOUR_FORMAT_h; } if (s[0] == CAP_H) { return ALLOWED_HOUR_FORMAT_H; } diff --git a/deps/icu-small/source/i18n/dtptngen_impl.h b/deps/icu-small/source/i18n/dtptngen_impl.h index 00a707585b7a5b..38afd5ff5a8d7f 100644 --- a/deps/icu-small/source/i18n/dtptngen_impl.h +++ b/deps/icu-small/source/i18n/dtptngen_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -15,6 +15,9 @@ #define __DTPTNGEN_IMPL_H__ #include "unicode/udatpg.h" + +#include "unicode/strenum.h" +#include "unicode/unistr.h" #include "uvector.h" // TODO(claireho): Split off Builder class. diff --git a/deps/icu-small/source/i18n/dtrule.cpp b/deps/icu-small/source/i18n/dtrule.cpp index 41b61ae045be57..6847f1d16e89ff 100644 --- a/deps/icu-small/source/i18n/dtrule.cpp +++ b/deps/icu-small/source/i18n/dtrule.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/esctrn.cpp b/deps/icu-small/source/i18n/esctrn.cpp index 9be926f138c7f1..900bed7e45734b 100644 --- a/deps/icu-small/source/i18n/esctrn.cpp +++ b/deps/icu-small/source/i18n/esctrn.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/esctrn.h b/deps/icu-small/source/i18n/esctrn.h index 7afea1b503fca5..60ecc74b498456 100644 --- a/deps/icu-small/source/i18n/esctrn.h +++ b/deps/icu-small/source/i18n/esctrn.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/ethpccal.cpp b/deps/icu-small/source/i18n/ethpccal.cpp index e27f005583dac6..4377c59b325a1b 100644 --- a/deps/icu-small/source/i18n/ethpccal.cpp +++ b/deps/icu-small/source/i18n/ethpccal.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/ethpccal.h b/deps/icu-small/source/i18n/ethpccal.h index a9adac6f57af83..5fae2fb1bea2c7 100644 --- a/deps/icu-small/source/i18n/ethpccal.h +++ b/deps/icu-small/source/i18n/ethpccal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/fmtable.cpp b/deps/icu-small/source/i18n/fmtable.cpp index feb4e28a07377f..73f9b66ab6f950 100644 --- a/deps/icu-small/source/i18n/fmtable.cpp +++ b/deps/icu-small/source/i18n/fmtable.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/fmtable_cnv.cpp b/deps/icu-small/source/i18n/fmtable_cnv.cpp index ff4deae92d2a2f..9a647927797dbd 100644 --- a/deps/icu-small/source/i18n/fmtable_cnv.cpp +++ b/deps/icu-small/source/i18n/fmtable_cnv.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/fmtableimp.h b/deps/icu-small/source/i18n/fmtableimp.h index 8b3778ccc34066..0e6ccd24da7f02 100644 --- a/deps/icu-small/source/i18n/fmtableimp.h +++ b/deps/icu-small/source/i18n/fmtableimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -12,6 +12,8 @@ #include "digitlst.h" +#if !UCONFIG_NO_FORMATTING + U_NAMESPACE_BEGIN /** @@ -35,4 +37,5 @@ static const int64_t MAX_INT64_IN_DOUBLE = 0x001FFFFFFFFFFFFFLL; U_NAMESPACE_END +#endif // #if !UCONFIG_NO_FORMATTING #endif diff --git a/deps/icu-small/source/i18n/format.cpp b/deps/icu-small/source/i18n/format.cpp index e951b3082ed077..e5abbe9eb0fa7d 100644 --- a/deps/icu-small/source/i18n/format.cpp +++ b/deps/icu-small/source/i18n/format.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/fphdlimp.cpp b/deps/icu-small/source/i18n/fphdlimp.cpp index 6a004a6685296c..abcec97ee3171c 100644 --- a/deps/icu-small/source/i18n/fphdlimp.cpp +++ b/deps/icu-small/source/i18n/fphdlimp.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/fphdlimp.h b/deps/icu-small/source/i18n/fphdlimp.h index b1fe42bb40fa57..f3ac12c2bacb9a 100644 --- a/deps/icu-small/source/i18n/fphdlimp.h +++ b/deps/icu-small/source/i18n/fphdlimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/fpositer.cpp b/deps/icu-small/source/i18n/fpositer.cpp index 426226d69d7bbb..79e2791db8d371 100644 --- a/deps/icu-small/source/i18n/fpositer.cpp +++ b/deps/icu-small/source/i18n/fpositer.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/funcrepl.cpp b/deps/icu-small/source/i18n/funcrepl.cpp index 683e00a2c8db51..30bcebbf908794 100644 --- a/deps/icu-small/source/i18n/funcrepl.cpp +++ b/deps/icu-small/source/i18n/funcrepl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/funcrepl.h b/deps/icu-small/source/i18n/funcrepl.h index 954150cf002c40..a835d5be7c2173 100644 --- a/deps/icu-small/source/i18n/funcrepl.h +++ b/deps/icu-small/source/i18n/funcrepl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/gender.cpp b/deps/icu-small/source/i18n/gender.cpp index 4847ce95848e1d..e60bc520bcc0e8 100644 --- a/deps/icu-small/source/i18n/gender.cpp +++ b/deps/icu-small/source/i18n/gender.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/gregocal.cpp b/deps/icu-small/source/i18n/gregocal.cpp index 959228ab49b31b..49c4226049d9c8 100644 --- a/deps/icu-small/source/i18n/gregocal.cpp +++ b/deps/icu-small/source/i18n/gregocal.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/gregoimp.cpp b/deps/icu-small/source/i18n/gregoimp.cpp index fa886f5a6fa037..01465973d63b1d 100644 --- a/deps/icu-small/source/i18n/gregoimp.cpp +++ b/deps/icu-small/source/i18n/gregoimp.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/gregoimp.h b/deps/icu-small/source/i18n/gregoimp.h index 19e44c7a5a01d2..a7834c4ee52654 100644 --- a/deps/icu-small/source/i18n/gregoimp.h +++ b/deps/icu-small/source/i18n/gregoimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/hebrwcal.cpp b/deps/icu-small/source/i18n/hebrwcal.cpp index 0b329a87158733..66a3e47a4f1e0f 100644 --- a/deps/icu-small/source/i18n/hebrwcal.cpp +++ b/deps/icu-small/source/i18n/hebrwcal.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/hebrwcal.h b/deps/icu-small/source/i18n/hebrwcal.h index 0824fb7c784e9e..9323ad62aa72fa 100644 --- a/deps/icu-small/source/i18n/hebrwcal.h +++ b/deps/icu-small/source/i18n/hebrwcal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/indiancal.cpp b/deps/icu-small/source/i18n/indiancal.cpp index 7964d45312ea4d..a2a7f2dcdd3e9e 100644 --- a/deps/icu-small/source/i18n/indiancal.cpp +++ b/deps/icu-small/source/i18n/indiancal.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2003-2014, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/indiancal.h b/deps/icu-small/source/i18n/indiancal.h index fcc21d729bf0aa..d40af5ad450c9e 100644 --- a/deps/icu-small/source/i18n/indiancal.h +++ b/deps/icu-small/source/i18n/indiancal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** diff --git a/deps/icu-small/source/i18n/inputext.cpp b/deps/icu-small/source/i18n/inputext.cpp index 4e053aef2ea1ee..96e59b24d878ff 100644 --- a/deps/icu-small/source/i18n/inputext.cpp +++ b/deps/icu-small/source/i18n/inputext.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/inputext.h b/deps/icu-small/source/i18n/inputext.h index 6a5d253e0568c2..06ad627c622d47 100644 --- a/deps/icu-small/source/i18n/inputext.h +++ b/deps/icu-small/source/i18n/inputext.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/islamcal.cpp b/deps/icu-small/source/i18n/islamcal.cpp index 7c2d1b6b98e74c..733301d98eeff6 100644 --- a/deps/icu-small/source/i18n/islamcal.cpp +++ b/deps/icu-small/source/i18n/islamcal.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/islamcal.h b/deps/icu-small/source/i18n/islamcal.h index 4e2a1e3d52fe1b..17fb6687ef7b63 100644 --- a/deps/icu-small/source/i18n/islamcal.h +++ b/deps/icu-small/source/i18n/islamcal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/japancal.cpp b/deps/icu-small/source/i18n/japancal.cpp index 0c8396f6f8c620..a2738e86a91edb 100644 --- a/deps/icu-small/source/i18n/japancal.cpp +++ b/deps/icu-small/source/i18n/japancal.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/japancal.h b/deps/icu-small/source/i18n/japancal.h index ab267f81f17271..356351d28dd28a 100644 --- a/deps/icu-small/source/i18n/japancal.h +++ b/deps/icu-small/source/i18n/japancal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/measfmt.cpp b/deps/icu-small/source/i18n/measfmt.cpp index 4ac2f7d5ebe768..4e9d4a56f2b397 100644 --- a/deps/icu-small/source/i18n/measfmt.cpp +++ b/deps/icu-small/source/i18n/measfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -26,6 +26,7 @@ #include "unicode/decimfmt.h" #include "uresimp.h" #include "unicode/ures.h" +#include "unicode/ustring.h" #include "ureslocs.h" #include "cstring.h" #include "mutex.h" @@ -41,7 +42,7 @@ #include "standardplural.h" #include "unifiedcache.h" -#define MEAS_UNIT_COUNT 138 +#define MEAS_UNIT_COUNT 135 #define WIDTH_INDEX_COUNT (UMEASFMT_WIDTH_NARROW + 1) U_NAMESPACE_BEGIN @@ -288,10 +289,8 @@ struct UnitDataSink : public ResourceSink { return; } - if (value.getType() == URES_STRING) { - // Units like "coordinate" that don't have plural variants - setFormatterIfAbsent(StandardPlural::OTHER, value, 0, errorCode); - } else if (value.getType() == URES_TABLE) { + // We no longer handle units like "coordinate" here (which do not have plural variants) + if (value.getType() == URES_TABLE) { // Units that have plural variants ResourceTable patternTableTable = value.getTable(errorCode); if (U_FAILURE(errorCode)) { return; } @@ -333,6 +332,8 @@ struct UnitDataSink : public ResourceSink { consumeCompoundPattern(key, value, errorCode); } } + } else if (uprv_strcmp(key, "coordinate") == 0) { + // special handling but we need to determine what that is } else { type = key; ResourceTable subtypeTable = value.getTable(errorCode); diff --git a/deps/icu-small/source/i18n/measunit.cpp b/deps/icu-small/source/i18n/measunit.cpp index a3021b740521fd..43c8fd4bab8076 100644 --- a/deps/icu-small/source/i18n/measunit.cpp +++ b/deps/icu-small/source/i18n/measunit.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -40,21 +40,20 @@ static const int32_t gOffsets[] = { 16, 20, 24, - 28, - 288, - 298, - 309, - 313, - 319, - 323, - 342, - 343, - 354, - 360, - 365, - 369, - 373, - 398 + 285, + 295, + 306, + 310, + 316, + 320, + 340, + 341, + 352, + 358, + 363, + 367, + 371, + 396 }; static const int32_t gIndexes[] = { @@ -64,21 +63,20 @@ static const int32_t gIndexes[] = { 16, 20, 24, - 28, - 28, - 38, + 24, + 34, + 45, 49, - 53, + 55, 59, - 63, - 82, - 83, - 94, - 100, - 105, - 109, - 113, - 138 + 79, + 80, + 91, + 97, + 102, + 106, + 110, + 135 }; // Must be sorted alphabetically. @@ -88,7 +86,6 @@ static const char * const gTypes[] = { "area", "concentr", "consumption", - "coordinate", "currency", "digital", "duration", @@ -131,10 +128,6 @@ static const char * const gSubTypes[] = { "liter-per-kilometer", "mile-per-gallon", "mile-per-gallon-imperial", - "east", - "north", - "south", - "west", "ADP", "AED", "AFA", @@ -178,6 +171,7 @@ static const char * const gSubTypes[] = { "BTN", "BWP", "BYB", + "BYN", "BYR", "BZD", "CAD", @@ -448,6 +442,7 @@ static const char * const gSubTypes[] = { "nautical-mile", "parsec", "picometer", + "point", "yard", "lux", "carat", @@ -509,14 +504,14 @@ static const char * const gSubTypes[] = { // Must be sorted by first value and then second value. static int32_t unitPerUnitToSingleUnit[][4] = { - {330, 300, 17, 0}, - {332, 306, 17, 2}, - {334, 300, 17, 3}, - {334, 387, 4, 2}, - {334, 388, 4, 3}, - {348, 385, 3, 1}, - {351, 11, 16, 4}, - {390, 330, 4, 1} + {327, 297, 16, 0}, + {329, 303, 16, 2}, + {331, 297, 16, 3}, + {331, 385, 4, 2}, + {331, 386, 4, 3}, + {346, 383, 3, 1}, + {349, 11, 15, 4}, + {388, 327, 4, 1} }; MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) { @@ -615,460 +610,456 @@ MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) { return MeasureUnit::create(4, 3, status); } -MeasureUnit *MeasureUnit::createEast(UErrorCode &status) { - return MeasureUnit::create(5, 0, status); -} +// MeasureUnit *MeasureUnit::createEast(UErrorCode &status) {...} -MeasureUnit *MeasureUnit::createNorth(UErrorCode &status) { - return MeasureUnit::create(5, 1, status); -} +// MeasureUnit *MeasureUnit::createNorth(UErrorCode &status) {...} -MeasureUnit *MeasureUnit::createSouth(UErrorCode &status) { - return MeasureUnit::create(5, 2, status); -} +// MeasureUnit *MeasureUnit::createSouth(UErrorCode &status) {...} -MeasureUnit *MeasureUnit::createWest(UErrorCode &status) { - return MeasureUnit::create(5, 3, status); -} +// MeasureUnit *MeasureUnit::createWest(UErrorCode &status) {...} MeasureUnit *MeasureUnit::createBit(UErrorCode &status) { - return MeasureUnit::create(7, 0, status); + return MeasureUnit::create(6, 0, status); } MeasureUnit *MeasureUnit::createByte(UErrorCode &status) { - return MeasureUnit::create(7, 1, status); + return MeasureUnit::create(6, 1, status); } MeasureUnit *MeasureUnit::createGigabit(UErrorCode &status) { - return MeasureUnit::create(7, 2, status); + return MeasureUnit::create(6, 2, status); } MeasureUnit *MeasureUnit::createGigabyte(UErrorCode &status) { - return MeasureUnit::create(7, 3, status); + return MeasureUnit::create(6, 3, status); } MeasureUnit *MeasureUnit::createKilobit(UErrorCode &status) { - return MeasureUnit::create(7, 4, status); + return MeasureUnit::create(6, 4, status); } MeasureUnit *MeasureUnit::createKilobyte(UErrorCode &status) { - return MeasureUnit::create(7, 5, status); + return MeasureUnit::create(6, 5, status); } MeasureUnit *MeasureUnit::createMegabit(UErrorCode &status) { - return MeasureUnit::create(7, 6, status); + return MeasureUnit::create(6, 6, status); } MeasureUnit *MeasureUnit::createMegabyte(UErrorCode &status) { - return MeasureUnit::create(7, 7, status); + return MeasureUnit::create(6, 7, status); } MeasureUnit *MeasureUnit::createTerabit(UErrorCode &status) { - return MeasureUnit::create(7, 8, status); + return MeasureUnit::create(6, 8, status); } MeasureUnit *MeasureUnit::createTerabyte(UErrorCode &status) { - return MeasureUnit::create(7, 9, status); + return MeasureUnit::create(6, 9, status); } MeasureUnit *MeasureUnit::createCentury(UErrorCode &status) { - return MeasureUnit::create(8, 0, status); + return MeasureUnit::create(7, 0, status); } MeasureUnit *MeasureUnit::createDay(UErrorCode &status) { - return MeasureUnit::create(8, 1, status); + return MeasureUnit::create(7, 1, status); } MeasureUnit *MeasureUnit::createHour(UErrorCode &status) { - return MeasureUnit::create(8, 2, status); + return MeasureUnit::create(7, 2, status); } MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) { - return MeasureUnit::create(8, 3, status); + return MeasureUnit::create(7, 3, status); } MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) { - return MeasureUnit::create(8, 4, status); + return MeasureUnit::create(7, 4, status); } MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) { - return MeasureUnit::create(8, 5, status); + return MeasureUnit::create(7, 5, status); } MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) { - return MeasureUnit::create(8, 6, status); + return MeasureUnit::create(7, 6, status); } MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) { - return MeasureUnit::create(8, 7, status); + return MeasureUnit::create(7, 7, status); } MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) { - return MeasureUnit::create(8, 8, status); + return MeasureUnit::create(7, 8, status); } MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) { - return MeasureUnit::create(8, 9, status); + return MeasureUnit::create(7, 9, status); } MeasureUnit *MeasureUnit::createYear(UErrorCode &status) { - return MeasureUnit::create(8, 10, status); + return MeasureUnit::create(7, 10, status); } MeasureUnit *MeasureUnit::createAmpere(UErrorCode &status) { - return MeasureUnit::create(9, 0, status); + return MeasureUnit::create(8, 0, status); } MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) { - return MeasureUnit::create(9, 1, status); + return MeasureUnit::create(8, 1, status); } MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) { - return MeasureUnit::create(9, 2, status); + return MeasureUnit::create(8, 2, status); } MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) { - return MeasureUnit::create(9, 3, status); + return MeasureUnit::create(8, 3, status); } MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) { - return MeasureUnit::create(10, 0, status); + return MeasureUnit::create(9, 0, status); } MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) { - return MeasureUnit::create(10, 1, status); + return MeasureUnit::create(9, 1, status); } MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) { - return MeasureUnit::create(10, 2, status); + return MeasureUnit::create(9, 2, status); } MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) { - return MeasureUnit::create(10, 3, status); + return MeasureUnit::create(9, 3, status); } MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) { - return MeasureUnit::create(10, 4, status); + return MeasureUnit::create(9, 4, status); } MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) { - return MeasureUnit::create(10, 5, status); + return MeasureUnit::create(9, 5, status); } MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) { - return MeasureUnit::create(11, 0, status); + return MeasureUnit::create(10, 0, status); } MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) { - return MeasureUnit::create(11, 1, status); + return MeasureUnit::create(10, 1, status); } MeasureUnit *MeasureUnit::createKilohertz(UErrorCode &status) { - return MeasureUnit::create(11, 2, status); + return MeasureUnit::create(10, 2, status); } MeasureUnit *MeasureUnit::createMegahertz(UErrorCode &status) { - return MeasureUnit::create(11, 3, status); + return MeasureUnit::create(10, 3, status); } MeasureUnit *MeasureUnit::createAstronomicalUnit(UErrorCode &status) { - return MeasureUnit::create(12, 0, status); + return MeasureUnit::create(11, 0, status); } MeasureUnit *MeasureUnit::createCentimeter(UErrorCode &status) { - return MeasureUnit::create(12, 1, status); + return MeasureUnit::create(11, 1, status); } MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) { - return MeasureUnit::create(12, 2, status); + return MeasureUnit::create(11, 2, status); } MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) { - return MeasureUnit::create(12, 3, status); + return MeasureUnit::create(11, 3, status); } MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) { - return MeasureUnit::create(12, 4, status); + return MeasureUnit::create(11, 4, status); } MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) { - return MeasureUnit::create(12, 5, status); + return MeasureUnit::create(11, 5, status); } MeasureUnit *MeasureUnit::createInch(UErrorCode &status) { - return MeasureUnit::create(12, 6, status); + return MeasureUnit::create(11, 6, status); } MeasureUnit *MeasureUnit::createKilometer(UErrorCode &status) { - return MeasureUnit::create(12, 7, status); + return MeasureUnit::create(11, 7, status); } MeasureUnit *MeasureUnit::createLightYear(UErrorCode &status) { - return MeasureUnit::create(12, 8, status); + return MeasureUnit::create(11, 8, status); } MeasureUnit *MeasureUnit::createMeter(UErrorCode &status) { - return MeasureUnit::create(12, 9, status); + return MeasureUnit::create(11, 9, status); } MeasureUnit *MeasureUnit::createMicrometer(UErrorCode &status) { - return MeasureUnit::create(12, 10, status); + return MeasureUnit::create(11, 10, status); } MeasureUnit *MeasureUnit::createMile(UErrorCode &status) { - return MeasureUnit::create(12, 11, status); + return MeasureUnit::create(11, 11, status); } MeasureUnit *MeasureUnit::createMileScandinavian(UErrorCode &status) { - return MeasureUnit::create(12, 12, status); + return MeasureUnit::create(11, 12, status); } MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) { - return MeasureUnit::create(12, 13, status); + return MeasureUnit::create(11, 13, status); } MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) { - return MeasureUnit::create(12, 14, status); + return MeasureUnit::create(11, 14, status); } MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) { - return MeasureUnit::create(12, 15, status); + return MeasureUnit::create(11, 15, status); } MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) { - return MeasureUnit::create(12, 16, status); + return MeasureUnit::create(11, 16, status); } MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) { - return MeasureUnit::create(12, 17, status); + return MeasureUnit::create(11, 17, status); +} + +MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) { + return MeasureUnit::create(11, 18, status); } MeasureUnit *MeasureUnit::createYard(UErrorCode &status) { - return MeasureUnit::create(12, 18, status); + return MeasureUnit::create(11, 19, status); } MeasureUnit *MeasureUnit::createLux(UErrorCode &status) { - return MeasureUnit::create(13, 0, status); + return MeasureUnit::create(12, 0, status); } MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) { - return MeasureUnit::create(14, 0, status); + return MeasureUnit::create(13, 0, status); } MeasureUnit *MeasureUnit::createGram(UErrorCode &status) { - return MeasureUnit::create(14, 1, status); + return MeasureUnit::create(13, 1, status); } MeasureUnit *MeasureUnit::createKilogram(UErrorCode &status) { - return MeasureUnit::create(14, 2, status); + return MeasureUnit::create(13, 2, status); } MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) { - return MeasureUnit::create(14, 3, status); + return MeasureUnit::create(13, 3, status); } MeasureUnit *MeasureUnit::createMicrogram(UErrorCode &status) { - return MeasureUnit::create(14, 4, status); + return MeasureUnit::create(13, 4, status); } MeasureUnit *MeasureUnit::createMilligram(UErrorCode &status) { - return MeasureUnit::create(14, 5, status); + return MeasureUnit::create(13, 5, status); } MeasureUnit *MeasureUnit::createOunce(UErrorCode &status) { - return MeasureUnit::create(14, 6, status); + return MeasureUnit::create(13, 6, status); } MeasureUnit *MeasureUnit::createOunceTroy(UErrorCode &status) { - return MeasureUnit::create(14, 7, status); + return MeasureUnit::create(13, 7, status); } MeasureUnit *MeasureUnit::createPound(UErrorCode &status) { - return MeasureUnit::create(14, 8, status); + return MeasureUnit::create(13, 8, status); } MeasureUnit *MeasureUnit::createStone(UErrorCode &status) { - return MeasureUnit::create(14, 9, status); + return MeasureUnit::create(13, 9, status); } MeasureUnit *MeasureUnit::createTon(UErrorCode &status) { - return MeasureUnit::create(14, 10, status); + return MeasureUnit::create(13, 10, status); } MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) { - return MeasureUnit::create(15, 0, status); + return MeasureUnit::create(14, 0, status); } MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) { - return MeasureUnit::create(15, 1, status); + return MeasureUnit::create(14, 1, status); } MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) { - return MeasureUnit::create(15, 2, status); + return MeasureUnit::create(14, 2, status); } MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) { - return MeasureUnit::create(15, 3, status); + return MeasureUnit::create(14, 3, status); } MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) { - return MeasureUnit::create(15, 4, status); + return MeasureUnit::create(14, 4, status); } MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) { - return MeasureUnit::create(15, 5, status); + return MeasureUnit::create(14, 5, status); } MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) { - return MeasureUnit::create(16, 0, status); + return MeasureUnit::create(15, 0, status); } MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) { - return MeasureUnit::create(16, 1, status); + return MeasureUnit::create(15, 1, status); } MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) { - return MeasureUnit::create(16, 2, status); + return MeasureUnit::create(15, 2, status); } MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) { - return MeasureUnit::create(16, 3, status); + return MeasureUnit::create(15, 3, status); } MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) { - return MeasureUnit::create(16, 4, status); + return MeasureUnit::create(15, 4, status); } MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) { - return MeasureUnit::create(17, 0, status); + return MeasureUnit::create(16, 0, status); } MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) { - return MeasureUnit::create(17, 1, status); + return MeasureUnit::create(16, 1, status); } MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) { - return MeasureUnit::create(17, 2, status); + return MeasureUnit::create(16, 2, status); } MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) { - return MeasureUnit::create(17, 3, status); + return MeasureUnit::create(16, 3, status); } MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) { - return MeasureUnit::create(18, 0, status); + return MeasureUnit::create(17, 0, status); } MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) { - return MeasureUnit::create(18, 1, status); + return MeasureUnit::create(17, 1, status); } MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) { - return MeasureUnit::create(18, 2, status); + return MeasureUnit::create(17, 2, status); } MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) { - return MeasureUnit::create(18, 3, status); + return MeasureUnit::create(17, 3, status); } MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) { - return MeasureUnit::create(19, 0, status); + return MeasureUnit::create(18, 0, status); } MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) { - return MeasureUnit::create(19, 1, status); + return MeasureUnit::create(18, 1, status); } MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) { - return MeasureUnit::create(19, 2, status); + return MeasureUnit::create(18, 2, status); } MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) { - return MeasureUnit::create(19, 3, status); + return MeasureUnit::create(18, 3, status); } MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) { - return MeasureUnit::create(19, 4, status); + return MeasureUnit::create(18, 4, status); } MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) { - return MeasureUnit::create(19, 5, status); + return MeasureUnit::create(18, 5, status); } MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) { - return MeasureUnit::create(19, 6, status); + return MeasureUnit::create(18, 6, status); } MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) { - return MeasureUnit::create(19, 7, status); + return MeasureUnit::create(18, 7, status); } MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) { - return MeasureUnit::create(19, 8, status); + return MeasureUnit::create(18, 8, status); } MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) { - return MeasureUnit::create(19, 9, status); + return MeasureUnit::create(18, 9, status); } MeasureUnit *MeasureUnit::createCup(UErrorCode &status) { - return MeasureUnit::create(19, 10, status); + return MeasureUnit::create(18, 10, status); } MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) { - return MeasureUnit::create(19, 11, status); + return MeasureUnit::create(18, 11, status); } MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) { - return MeasureUnit::create(19, 12, status); + return MeasureUnit::create(18, 12, status); } MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) { - return MeasureUnit::create(19, 13, status); + return MeasureUnit::create(18, 13, status); } MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) { - return MeasureUnit::create(19, 14, status); + return MeasureUnit::create(18, 14, status); } MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) { - return MeasureUnit::create(19, 15, status); + return MeasureUnit::create(18, 15, status); } MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) { - return MeasureUnit::create(19, 16, status); + return MeasureUnit::create(18, 16, status); } MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) { - return MeasureUnit::create(19, 17, status); + return MeasureUnit::create(18, 17, status); } MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) { - return MeasureUnit::create(19, 18, status); + return MeasureUnit::create(18, 18, status); } MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) { - return MeasureUnit::create(19, 19, status); + return MeasureUnit::create(18, 19, status); } MeasureUnit *MeasureUnit::createPint(UErrorCode &status) { - return MeasureUnit::create(19, 20, status); + return MeasureUnit::create(18, 20, status); } MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) { - return MeasureUnit::create(19, 21, status); + return MeasureUnit::create(18, 21, status); } MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) { - return MeasureUnit::create(19, 22, status); + return MeasureUnit::create(18, 22, status); } MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) { - return MeasureUnit::create(19, 23, status); + return MeasureUnit::create(18, 23, status); } MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) { - return MeasureUnit::create(19, 24, status); + return MeasureUnit::create(18, 24, status); } // End generated code diff --git a/deps/icu-small/source/i18n/measure.cpp b/deps/icu-small/source/i18n/measure.cpp index 3459e71b8077ca..d9084f87db2baa 100644 --- a/deps/icu-small/source/i18n/measure.cpp +++ b/deps/icu-small/source/i18n/measure.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/msgfmt.cpp b/deps/icu-small/source/i18n/msgfmt.cpp index 4658528050cfe1..94a0286196a92b 100644 --- a/deps/icu-small/source/i18n/msgfmt.cpp +++ b/deps/icu-small/source/i18n/msgfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: diff --git a/deps/icu-small/source/i18n/msgfmt_impl.h b/deps/icu-small/source/i18n/msgfmt_impl.h index 80a07dc1ea28f6..0f77d12d0bb6e1 100644 --- a/deps/icu-small/source/i18n/msgfmt_impl.h +++ b/deps/icu-small/source/i18n/msgfmt_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/name2uni.cpp b/deps/icu-small/source/i18n/name2uni.cpp index acd9c0af997ada..d901eb126a8a46 100644 --- a/deps/icu-small/source/i18n/name2uni.cpp +++ b/deps/icu-small/source/i18n/name2uni.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/name2uni.h b/deps/icu-small/source/i18n/name2uni.h index 2ba4c8f792b357..4c743def32ede2 100644 --- a/deps/icu-small/source/i18n/name2uni.h +++ b/deps/icu-small/source/i18n/name2uni.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/nfrlist.h b/deps/icu-small/source/i18n/nfrlist.h index 65b21c6b1dbaac..db28c4d36f8d18 100644 --- a/deps/icu-small/source/i18n/nfrlist.h +++ b/deps/icu-small/source/i18n/nfrlist.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfrlist.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/nfrs.cpp b/deps/icu-small/source/i18n/nfrs.cpp index 5cbd33d0e2ef8b..8119aefd5eccb1 100644 --- a/deps/icu-small/source/i18n/nfrs.cpp +++ b/deps/icu-small/source/i18n/nfrs.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfrs.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -23,6 +23,7 @@ #include "nfrule.h" #include "nfrlist.h" #include "patternprops.h" +#include "putilimp.h" #ifdef RBNF_DEBUG #include "cmemory.h" @@ -544,7 +545,7 @@ NFRuleSet::findNormalRule(int64_t number) const // an explanation of the rollback rule). If we do, roll back // one rule and return that one instead of the one we'd normally // return - if (result->shouldRollBack((double)number)) { + if (result->shouldRollBack(number)) { if (hi == 1) { // bad rule set, no prior rule to rollback to from this base return NULL; } @@ -829,18 +830,20 @@ int64_t util64_fromDouble(double d) { return result; } -int64_t util64_pow(int32_t r, uint32_t e) { - if (r == 0) { +int64_t util64_pow(int32_t base, uint16_t exponent) { + if (base == 0) { return 0; - } else if (e == 0) { - return 1; - } else { - int64_t n = r; - while (--e > 0) { - n *= r; + } + int64_t result = 1; + int64_t pow = base; + while (exponent > 0) { + if ((exponent & 1) == 1) { + result *= pow; } - return n; + pow *= pow; + exponent >>= 1; } + return result; } static const uint8_t asciiDigits[] = { diff --git a/deps/icu-small/source/i18n/nfrs.h b/deps/icu-small/source/i18n/nfrs.h index b06c2b2215ad54..eafb1ca4413337 100644 --- a/deps/icu-small/source/i18n/nfrs.h +++ b/deps/icu-small/source/i18n/nfrs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfrs.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -88,7 +88,7 @@ class NFRuleSet : public UMemory { int64_t util64_fromDouble(double d); // raise radix to the power exponent, only non-negative exponents -int64_t util64_pow(int32_t radix, uint32_t exponent); +int64_t util64_pow(int32_t radix, uint16_t exponent); // convert n to digit string in buffer, return length of string uint32_t util64_tou(int64_t n, UChar* buffer, uint32_t buflen, uint32_t radix = 10, UBool raw = FALSE); diff --git a/deps/icu-small/source/i18n/nfrule.cpp b/deps/icu-small/source/i18n/nfrule.cpp index 100a46490daca0..2c26aff2d11fde 100644 --- a/deps/icu-small/source/i18n/nfrule.cpp +++ b/deps/icu-small/source/i18n/nfrule.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfrule.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -30,6 +30,7 @@ #include "nfrlist.h" #include "nfsubs.h" #include "patternprops.h" +#include "putilimp.h" U_NAMESPACE_BEGIN @@ -715,6 +716,12 @@ NFRule::_appendRuleText(UnicodeString& result) const result.append(gSemicolon); } +int64_t NFRule::getDivisor() const +{ + return util64_pow(radix, exponent); +} + + //----------------------------------------------------------------------- // formatting //----------------------------------------------------------------------- @@ -749,7 +756,7 @@ NFRule::doFormat(int64_t number, UnicodeString& toInsertInto, int32_t pos, int32 toInsertInto.insert(pos, ruleText.tempSubString(pluralRuleEnd + 2)); } toInsertInto.insert(pos, - rulePatternFormat->format((int32_t)(number/uprv_pow(radix, exponent)), status)); + rulePatternFormat->format((int32_t)(number/util64_pow(radix, exponent)), status)); if (pluralRuleStart > 0) { toInsertInto.insert(pos, ruleText.tempSubString(0, pluralRuleStart)); } @@ -798,10 +805,10 @@ NFRule::doFormat(double number, UnicodeString& toInsertInto, int32_t pos, int32_ if (0 <= pluralVal && pluralVal < 1) { // We're in a fractional rule, and we have to match the NumeratorSubstitution behavior. // 2.3 can become 0.2999999999999998 for the fraction due to rounding errors. - pluralVal = uprv_round(pluralVal * uprv_pow(radix, exponent)); + pluralVal = uprv_round(pluralVal * util64_pow(radix, exponent)); } else { - pluralVal = pluralVal / uprv_pow(radix, exponent); + pluralVal = pluralVal / util64_pow(radix, exponent); } toInsertInto.insert(pos, rulePatternFormat->format((int32_t)(pluralVal), status)); if (pluralRuleStart > 0) { @@ -827,7 +834,7 @@ NFRule::doFormat(double number, UnicodeString& toInsertInto, int32_t pos, int32_ * this one in its list; false if it should use this rule */ UBool -NFRule::shouldRollBack(double number) const +NFRule::shouldRollBack(int64_t number) const { // we roll back if the rule contains a modulus substitution, // the number being formatted is an even multiple of the rule's @@ -847,7 +854,7 @@ NFRule::shouldRollBack(double number) const // multiple of 100. This is called the "rollback rule." if ((sub1 != NULL && sub1->isModulusSubstitution()) || (sub2 != NULL && sub2->isModulusSubstitution())) { int64_t re = util64_pow(radix, exponent); - return uprv_fmod(number, (double)re) == 0 && (baseValue % re) != 0; + return (number % re) == 0 && (baseValue % re) != 0; } return FALSE; } diff --git a/deps/icu-small/source/i18n/nfrule.h b/deps/icu-small/source/i18n/nfrule.h index 5424b968a1fd90..21cdd24fbd0573 100644 --- a/deps/icu-small/source/i18n/nfrule.h +++ b/deps/icu-small/source/i18n/nfrule.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -17,7 +17,6 @@ #include "unicode/utypes.h" #include "unicode/uobject.h" #include "unicode/unistr.h" -#include "putilimp.h" U_NAMESPACE_BEGIN @@ -66,7 +65,7 @@ class NFRule : public UMemory { UChar getDecimalPoint() const { return decimalPoint; } - double getDivisor() const { return uprv_pow(radix, exponent); } + int64_t getDivisor() const; void doFormat(int64_t number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const; void doFormat(double number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const; @@ -77,7 +76,7 @@ class NFRule : public UMemory { double upperBound, Formattable& result) const; - UBool shouldRollBack(double number) const; + UBool shouldRollBack(int64_t number) const; void _appendRuleText(UnicodeString& result) const; diff --git a/deps/icu-small/source/i18n/nfsubs.cpp b/deps/icu-small/source/i18n/nfsubs.cpp index 58039c8bacd570..6e7eabe350a60e 100644 --- a/deps/icu-small/source/i18n/nfsubs.cpp +++ b/deps/icu-small/source/i18n/nfsubs.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfsubs.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -20,6 +20,7 @@ #include "nfsubs.h" #include "digitlst.h" +#include "fmtableimp.h" #if U_HAVE_RBNF @@ -68,27 +69,24 @@ class SameValueSubstitution : public NFSubstitution { SameValueSubstitution::~SameValueSubstitution() {} class MultiplierSubstitution : public NFSubstitution { - double divisor; - int64_t ldivisor; + int64_t divisor; public: MultiplierSubstitution(int32_t _pos, - double _divisor, + const NFRule *rule, const NFRuleSet* _ruleSet, const UnicodeString& description, UErrorCode& status) - : NFSubstitution(_pos, _ruleSet, description, status), divisor(_divisor) + : NFSubstitution(_pos, _ruleSet, description, status), divisor(rule->getDivisor()) { - ldivisor = util64_fromDouble(divisor); if (divisor == 0) { status = U_PARSE_ERROR; } } virtual ~MultiplierSubstitution(); - virtual void setDivisor(int32_t radix, int32_t exponent, UErrorCode& status) { - divisor = uprv_pow(radix, exponent); - ldivisor = util64_fromDouble(divisor); + virtual void setDivisor(int32_t radix, int16_t exponent, UErrorCode& status) { + divisor = util64_pow(radix, exponent); if(divisor == 0) { status = U_PARSE_ERROR; @@ -98,14 +96,14 @@ class MultiplierSubstitution : public NFSubstitution { virtual UBool operator==(const NFSubstitution& rhs) const; virtual int64_t transformNumber(int64_t number) const { - return number / ldivisor; + return number / divisor; } virtual double transformNumber(double number) const { if (getRuleSet()) { return uprv_floor(number / divisor); } else { - return number/divisor; + return number / divisor; } } @@ -125,21 +123,19 @@ class MultiplierSubstitution : public NFSubstitution { MultiplierSubstitution::~MultiplierSubstitution() {} class ModulusSubstitution : public NFSubstitution { - double divisor; - int64_t ldivisor; + int64_t divisor; const NFRule* ruleToUse; public: ModulusSubstitution(int32_t pos, - double _divisor, + const NFRule* rule, const NFRule* rulePredecessor, const NFRuleSet* ruleSet, const UnicodeString& description, UErrorCode& status); virtual ~ModulusSubstitution(); - virtual void setDivisor(int32_t radix, int32_t exponent, UErrorCode& status) { - divisor = uprv_pow(radix, exponent); - ldivisor = util64_fromDouble(divisor); + virtual void setDivisor(int32_t radix, int16_t exponent, UErrorCode& status) { + divisor = util64_pow(radix, exponent); if (divisor == 0) { status = U_PARSE_ERROR; @@ -151,7 +147,7 @@ class ModulusSubstitution : public NFSubstitution { virtual void doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t pos, int32_t recursionCount, UErrorCode& status) const; virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos, int32_t recursionCount, UErrorCode& status) const; - virtual int64_t transformNumber(int64_t number) const { return number % ldivisor; } + virtual int64_t transformNumber(int64_t number) const { return number % divisor; } virtual double transformNumber(double number) const { return uprv_fmod(number, divisor); } virtual UBool doParse(const UnicodeString& text, @@ -353,7 +349,7 @@ NFSubstitution::makeSubstitution(int32_t pos, // otherwise, return a MultiplierSubstitution else { - return new MultiplierSubstitution(pos, rule->getDivisor(), ruleSet, + return new MultiplierSubstitution(pos, rule, ruleSet, description, status); } @@ -383,7 +379,7 @@ NFSubstitution::makeSubstitution(int32_t pos, // otherwise, return a ModulusSubstitution else { - return new ModulusSubstitution(pos, rule->getDivisor(), predecessor, + return new ModulusSubstitution(pos, rule, predecessor, ruleSet, description, status); } @@ -491,7 +487,7 @@ NFSubstitution::~NFSubstitution() * @param exponent The exponent of the divisor */ void -NFSubstitution::setDivisor(int32_t /*radix*/, int32_t /*exponent*/, UErrorCode& /*status*/) { +NFSubstitution::setDivisor(int32_t /*radix*/, int16_t /*exponent*/, UErrorCode& /*status*/) { // a no-op for all substitutions except multiplier and modulus substitutions } @@ -572,23 +568,38 @@ void NFSubstitution::doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t _pos, int32_t recursionCount, UErrorCode& status) const { if (ruleSet != NULL) { - // perform a transformation on the number that is dependent + // Perform a transformation on the number that is dependent // on the type of substitution this is, then just call its // rule set's format() method to format the result ruleSet->format(transformNumber(number), toInsertInto, _pos + this->pos, recursionCount, status); } else if (numberFormat != NULL) { - // or perform the transformation on the number (preserving - // the result's fractional part if the formatter it set - // to show it), then use that formatter's format() method - // to format the result - double numberToFormat = transformNumber((double)number); - if (numberFormat->getMaximumFractionDigits() == 0) { - numberToFormat = uprv_floor(numberToFormat); - } + if (number <= MAX_INT64_IN_DOUBLE) { + // or perform the transformation on the number (preserving + // the result's fractional part if the formatter it set + // to show it), then use that formatter's format() method + // to format the result + double numberToFormat = transformNumber((double)number); + if (numberFormat->getMaximumFractionDigits() == 0) { + numberToFormat = uprv_floor(numberToFormat); + } - UnicodeString temp; - numberFormat->format(numberToFormat, temp, status); - toInsertInto.insert(_pos + this->pos, temp); + UnicodeString temp; + numberFormat->format(numberToFormat, temp, status); + toInsertInto.insert(_pos + this->pos, temp); + } + else { + // We have gone beyond double precision. Something has to give. + // We're favoring accuracy of the large number over potential rules + // that round like a CompactDecimalFormat, which is not a common use case. + // + // Perform a transformation on the number that is dependent + // on the type of substitution this is, then just call its + // rule set's format() method to format the result + int64_t numberToFormat = transformNumber(number); + UnicodeString temp; + numberFormat->format(numberToFormat, temp, status); + toInsertInto.insert(_pos + this->pos, temp); + } } } @@ -809,22 +820,20 @@ UBool MultiplierSubstitution::operator==(const NFSubstitution& rhs) const * regular rule. */ ModulusSubstitution::ModulusSubstitution(int32_t _pos, - double _divisor, + const NFRule* rule, const NFRule* predecessor, const NFRuleSet* _ruleSet, const UnicodeString& description, UErrorCode& status) : NFSubstitution(_pos, _ruleSet, description, status) - , divisor(_divisor) + , divisor(rule->getDivisor()) , ruleToUse(NULL) { - ldivisor = util64_fromDouble(_divisor); - // the owning rule's divisor controls the behavior of this // substitution: rather than keeping a backpointer to the rule, // we keep a copy of the divisor - if (ldivisor == 0) { + if (divisor == 0) { status = U_PARSE_ERROR; } diff --git a/deps/icu-small/source/i18n/nfsubs.h b/deps/icu-small/source/i18n/nfsubs.h index 4fb0c06caf600e..e77f7ada8c7fe3 100644 --- a/deps/icu-small/source/i18n/nfsubs.h +++ b/deps/icu-small/source/i18n/nfsubs.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfsubs.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -91,7 +91,7 @@ class NFSubstitution : public UObject { * @param radix The radix of the divisor * @param exponent The exponent of the divisor */ - virtual void setDivisor(int32_t radix, int32_t exponent, UErrorCode& status); + virtual void setDivisor(int32_t radix, int16_t exponent, UErrorCode& status); /** * Replaces result with the string describing the substitution. diff --git a/deps/icu-small/source/i18n/nortrans.cpp b/deps/icu-small/source/i18n/nortrans.cpp index da0206776ced93..589c82482ec9b9 100644 --- a/deps/icu-small/source/i18n/nortrans.cpp +++ b/deps/icu-small/source/i18n/nortrans.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/nortrans.h b/deps/icu-small/source/i18n/nortrans.h index 79d1be3b072179..d309452f9a4d6a 100644 --- a/deps/icu-small/source/i18n/nortrans.h +++ b/deps/icu-small/source/i18n/nortrans.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/nultrans.cpp b/deps/icu-small/source/i18n/nultrans.cpp index 600873e3735f41..62d1290ac75e93 100644 --- a/deps/icu-small/source/i18n/nultrans.cpp +++ b/deps/icu-small/source/i18n/nultrans.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/nultrans.h b/deps/icu-small/source/i18n/nultrans.h index a9856bde5b2b2e..a01b04e9ba1ec9 100644 --- a/deps/icu-small/source/i18n/nultrans.h +++ b/deps/icu-small/source/i18n/nultrans.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/numfmt.cpp b/deps/icu-small/source/i18n/numfmt.cpp index c00955a781a22e..90c53ce390674b 100644 --- a/deps/icu-small/source/i18n/numfmt.cpp +++ b/deps/icu-small/source/i18n/numfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -529,7 +529,7 @@ UnicodeString& NumberFormat::format(const DigitList &number, FieldPositionIterator* posIter, UErrorCode& status) const { // DecimalFormat overrides this function, and handles DigitList based big decimals. - // Other subclasses (ChoiceFormat, RuleBasedNumberFormat) do not (yet) handle DigitLists, + // Other subclasses (ChoiceFormat) do not (yet) handle DigitLists, // so this default implementation falls back to formatting decimal numbers as doubles. if (U_FAILURE(status)) { return appendTo; @@ -547,7 +547,7 @@ NumberFormat::format(const DigitList &number, FieldPosition& pos, UErrorCode &status) const { // DecimalFormat overrides this function, and handles DigitList based big decimals. - // Other subclasses (ChoiceFormat, RuleBasedNumberFormat) do not (yet) handle DigitLists, + // Other subclasses (ChoiceFormat) do not (yet) handle DigitLists, // so this default implementation falls back to formatting decimal numbers as doubles. if (U_FAILURE(status)) { return appendTo; @@ -1188,7 +1188,7 @@ void NumberFormat::setCurrency(const UChar* theCurrency, UErrorCode& ec) { } } -const UChar* NumberFormat::getCurrency() const { +const char16_t* NumberFormat::getCurrency() const { return fCurrency; } diff --git a/deps/icu-small/source/i18n/numsys.cpp b/deps/icu-small/source/i18n/numsys.cpp index 442ad7f255abe3..b24340f0d2e2c9 100644 --- a/deps/icu-small/source/i18n/numsys.cpp +++ b/deps/icu-small/source/i18n/numsys.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -230,7 +230,7 @@ void NumberingSystem::setAlgorithmic(UBool c) { algorithmic = c; } -void NumberingSystem::setDesc(UnicodeString d) { +void NumberingSystem::setDesc(const UnicodeString &d) { desc.setTo(d); } void NumberingSystem::setName(const char *n) { diff --git a/deps/icu-small/source/i18n/numsys_impl.h b/deps/icu-small/source/i18n/numsys_impl.h index d39faba5afa3a9..6385fa5408a152 100644 --- a/deps/icu-small/source/i18n/numsys_impl.h +++ b/deps/icu-small/source/i18n/numsys_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/olsontz.cpp b/deps/icu-small/source/i18n/olsontz.cpp index f4c3dd24c9273f..df025c0808388e 100644 --- a/deps/icu-small/source/i18n/olsontz.cpp +++ b/deps/icu-small/source/i18n/olsontz.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/olsontz.h b/deps/icu-small/source/i18n/olsontz.h index 7dbc303a05fa68..6f0d36e5de5db0 100644 --- a/deps/icu-small/source/i18n/olsontz.h +++ b/deps/icu-small/source/i18n/olsontz.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/persncal.cpp b/deps/icu-small/source/i18n/persncal.cpp index 210646ca8c22ca..0ccff4d2bdc0d3 100644 --- a/deps/icu-small/source/i18n/persncal.cpp +++ b/deps/icu-small/source/i18n/persncal.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/persncal.h b/deps/icu-small/source/i18n/persncal.h index 3fe5a614643416..ec818822b33a41 100644 --- a/deps/icu-small/source/i18n/persncal.h +++ b/deps/icu-small/source/i18n/persncal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/pluralaffix.cpp b/deps/icu-small/source/i18n/pluralaffix.cpp index f6a51a79ef9ab7..ea400206b38b81 100644 --- a/deps/icu-small/source/i18n/pluralaffix.cpp +++ b/deps/icu-small/source/i18n/pluralaffix.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/pluralaffix.h b/deps/icu-small/source/i18n/pluralaffix.h index a08f2131d96ee6..94366ce4cf81ec 100644 --- a/deps/icu-small/source/i18n/pluralaffix.h +++ b/deps/icu-small/source/i18n/pluralaffix.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/plurfmt.cpp b/deps/icu-small/source/i18n/plurfmt.cpp index 8a000ce6e97bd9..e14ef6d831ecce 100644 --- a/deps/icu-small/source/i18n/plurfmt.cpp +++ b/deps/icu-small/source/i18n/plurfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/plurrule.cpp b/deps/icu-small/source/i18n/plurrule.cpp index 7b5063455169ce..08ea969b5ae6fb 100644 --- a/deps/icu-small/source/i18n/plurrule.cpp +++ b/deps/icu-small/source/i18n/plurrule.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -17,6 +17,8 @@ #include "unicode/plurrule.h" #include "unicode/upluralrules.h" #include "unicode/ures.h" +#include "unicode/numfmt.h" +#include "unicode/decimfmt.h" #include "charstr.h" #include "cmemory.h" #include "cstring.h" @@ -36,7 +38,6 @@ #include "digitinterval.h" #include "visibledigits.h" - #if !UCONFIG_NO_FORMATTING U_NAMESPACE_BEGIN @@ -246,6 +247,26 @@ PluralRules::select(double number) const { return select(FixedDecimal(number)); } +UnicodeString +PluralRules::select(const Formattable& obj, const NumberFormat& fmt, UErrorCode& status) const { + if (U_SUCCESS(status)) { + const DecimalFormat *decFmt = dynamic_cast(&fmt); + if (decFmt != NULL) { + VisibleDigitsWithExponent digits; + decFmt->initVisibleDigitsWithExponent(obj, digits, status); + if (U_SUCCESS(status)) { + return select(digits); + } + } else { + double number = obj.getDouble(status); + if (U_SUCCESS(status)) { + return select(number); + } + } + } + return UnicodeString(); +} + UnicodeString PluralRules::select(const FixedDecimal &number) const { if (mRules == NULL) { diff --git a/deps/icu-small/source/i18n/plurrule_impl.h b/deps/icu-small/source/i18n/plurrule_impl.h index c6e4767a096a72..9f5f66c1b74122 100644 --- a/deps/icu-small/source/i18n/plurrule_impl.h +++ b/deps/icu-small/source/i18n/plurrule_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -24,6 +24,7 @@ #include "unicode/format.h" #include "unicode/locid.h" #include "unicode/parseerr.h" +#include "unicode/strenum.h" #include "unicode/ures.h" #include "uvector.h" #include "hash.h" diff --git a/deps/icu-small/source/i18n/precision.cpp b/deps/icu-small/source/i18n/precision.cpp index 5d07e0f9ee3d78..4a68b0d8867053 100644 --- a/deps/icu-small/source/i18n/precision.cpp +++ b/deps/icu-small/source/i18n/precision.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/precision.h b/deps/icu-small/source/i18n/precision.h index f002fd228bf77d..0598fa17d62771 100644 --- a/deps/icu-small/source/i18n/precision.h +++ b/deps/icu-small/source/i18n/precision.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/quant.cpp b/deps/icu-small/source/i18n/quant.cpp index 6e08e628fc2e10..1908a504846b07 100644 --- a/deps/icu-small/source/i18n/quant.cpp +++ b/deps/icu-small/source/i18n/quant.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/quant.h b/deps/icu-small/source/i18n/quant.h index 21adf19e70d87a..1abb0db61aa386 100644 --- a/deps/icu-small/source/i18n/quant.h +++ b/deps/icu-small/source/i18n/quant.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/quantityformatter.cpp b/deps/icu-small/source/i18n/quantityformatter.cpp index c44357a53b6908..208e064700ab2b 100644 --- a/deps/icu-small/source/i18n/quantityformatter.cpp +++ b/deps/icu-small/source/i18n/quantityformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/quantityformatter.h b/deps/icu-small/source/i18n/quantityformatter.h index 0f61022666531b..6698b7a8a028fd 100644 --- a/deps/icu-small/source/i18n/quantityformatter.h +++ b/deps/icu-small/source/i18n/quantityformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/rbnf.cpp b/deps/icu-small/source/i18n/rbnf.cpp index 5e32d804441dbf..d4fd57499825cc 100644 --- a/deps/icu-small/source/i18n/rbnf.cpp +++ b/deps/icu-small/source/i18n/rbnf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -27,12 +27,14 @@ #include "unicode/udata.h" #include "unicode/udisplaycontext.h" #include "unicode/brkiter.h" -#include "nfrs.h" +#include "unicode/ucasemap.h" #include "cmemory.h" #include "cstring.h" #include "patternprops.h" #include "uresimp.h" +#include "nfrs.h" +#include "digitlst.h" // debugging // #define RBNF_DEBUG @@ -1078,18 +1080,77 @@ RuleBasedNumberFormat::findRuleSet(const UnicodeString& name, UErrorCode& status return NULL; } +UnicodeString& +RuleBasedNumberFormat::format(const DigitList &number, + UnicodeString &appendTo, + FieldPositionIterator *posIter, + UErrorCode &status) const { + if (U_FAILURE(status)) { + return appendTo; + } + DigitList copy(number); + if (copy.fitsIntoInt64(false)) { + format(((DigitList &)number).getInt64(), appendTo, posIter, status); + } + else { + copy.roundAtExponent(0); + if (copy.fitsIntoInt64(false)) { + format(number.getDouble(), appendTo, posIter, status); + } + else { + // We're outside of our normal range that this framework can handle. + // The DecimalFormat will provide more accurate results. + + // TODO this section should probably be optimized. The DecimalFormat is shared in ICU4J. + NumberFormat *decimalFormat = NumberFormat::createInstance(locale, UNUM_DECIMAL, status); + Formattable f; + f.adoptDigitList(new DigitList(number)); + decimalFormat->format(f, appendTo, posIter, status); + delete decimalFormat; + } + } + return appendTo; +} + + +UnicodeString& +RuleBasedNumberFormat::format(const DigitList &number, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode &status) const { + if (U_FAILURE(status)) { + return appendTo; + } + DigitList copy(number); + if (copy.fitsIntoInt64(false)) { + format(((DigitList &)number).getInt64(), appendTo, pos, status); + } + else { + copy.roundAtExponent(0); + if (copy.fitsIntoInt64(false)) { + format(number.getDouble(), appendTo, pos, status); + } + else { + // We're outside of our normal range that this framework can handle. + // The DecimalFormat will provide more accurate results. + + // TODO this section should probably be optimized. The DecimalFormat is shared in ICU4J. + NumberFormat *decimalFormat = NumberFormat::createInstance(locale, UNUM_DECIMAL, status); + Formattable f; + f.adoptDigitList(new DigitList(number)); + decimalFormat->format(f, appendTo, pos, status); + delete decimalFormat; + } + } + return appendTo; +} + UnicodeString& RuleBasedNumberFormat::format(int32_t number, UnicodeString& toAppendTo, - FieldPosition& /* pos */) const + FieldPosition& pos) const { - if (defaultRuleSet) { - UErrorCode status = U_ZERO_ERROR; - int32_t startPos = toAppendTo.length(); - defaultRuleSet->format((int64_t)number, toAppendTo, toAppendTo.length(), 0, status); - adjustForCapitalizationContext(startPos, toAppendTo); - } - return toAppendTo; + return format((int64_t)number, toAppendTo, pos); } @@ -1100,9 +1161,7 @@ RuleBasedNumberFormat::format(int64_t number, { if (defaultRuleSet) { UErrorCode status = U_ZERO_ERROR; - int32_t startPos = toAppendTo.length(); - defaultRuleSet->format(number, toAppendTo, toAppendTo.length(), 0, status); - adjustForCapitalizationContext(startPos, toAppendTo); + format(number, defaultRuleSet, toAppendTo, status); } return toAppendTo; } @@ -1114,11 +1173,11 @@ RuleBasedNumberFormat::format(double number, FieldPosition& /* pos */) const { int32_t startPos = toAppendTo.length(); + UErrorCode status = U_ZERO_ERROR; if (defaultRuleSet) { - UErrorCode status = U_ZERO_ERROR; defaultRuleSet->format(number, toAppendTo, toAppendTo.length(), 0, status); } - return adjustForCapitalizationContext(startPos, toAppendTo); + return adjustForCapitalizationContext(startPos, toAppendTo, status); } @@ -1126,24 +1185,10 @@ UnicodeString& RuleBasedNumberFormat::format(int32_t number, const UnicodeString& ruleSetName, UnicodeString& toAppendTo, - FieldPosition& /* pos */, + FieldPosition& pos, UErrorCode& status) const { - // return format((int64_t)number, ruleSetName, toAppendTo, pos, status); - if (U_SUCCESS(status)) { - if (ruleSetName.indexOf(gPercentPercent, 2, 0) == 0) { - // throw new IllegalArgumentException("Can't use internal rule set"); - status = U_ILLEGAL_ARGUMENT_ERROR; - } else { - NFRuleSet *rs = findRuleSet(ruleSetName, status); - if (rs) { - int32_t startPos = toAppendTo.length(); - rs->format((int64_t)number, toAppendTo, toAppendTo.length(), 0, status); - adjustForCapitalizationContext(startPos, toAppendTo); - } - } - } - return toAppendTo; + return format((int64_t)number, ruleSetName, toAppendTo, pos, status); } @@ -1161,9 +1206,7 @@ RuleBasedNumberFormat::format(int64_t number, } else { NFRuleSet *rs = findRuleSet(ruleSetName, status); if (rs) { - int32_t startPos = toAppendTo.length(); - rs->format(number, toAppendTo, toAppendTo.length(), 0, status); - adjustForCapitalizationContext(startPos, toAppendTo); + format(number, rs, toAppendTo, status); } } } @@ -1187,27 +1230,72 @@ RuleBasedNumberFormat::format(double number, if (rs) { int32_t startPos = toAppendTo.length(); rs->format(number, toAppendTo, toAppendTo.length(), 0, status); - adjustForCapitalizationContext(startPos, toAppendTo); + adjustForCapitalizationContext(startPos, toAppendTo, status); } } } return toAppendTo; } +/** + * Bottleneck through which all the public format() methods + * that take a long pass. By the time we get here, we know + * which rule set we're using to do the formatting. + * @param number The number to format + * @param ruleSet The rule set to use to format the number + * @return The text that resulted from formatting the number + */ +UnicodeString& +RuleBasedNumberFormat::format(int64_t number, NFRuleSet *ruleSet, UnicodeString& toAppendTo, UErrorCode& status) const +{ + // all API format() routines that take a double vector through + // here. We have these two identical functions-- one taking a + // double and one taking a long-- the couple digits of precision + // that long has but double doesn't (both types are 8 bytes long, + // but double has to borrow some of the mantissa bits to hold + // the exponent). + // Create an empty string buffer where the result will + // be built, and pass it to the rule set (along with an insertion + // position of 0 and the number being formatted) to the rule set + // for formatting + + if (U_SUCCESS(status)) { + if (number == U_INT64_MIN) { + // We can't handle this value right now. Provide an accurate default value. + + // TODO this section should probably be optimized. The DecimalFormat is shared in ICU4J. + NumberFormat *decimalFormat = NumberFormat::createInstance(locale, UNUM_DECIMAL, status); + Formattable f; + FieldPosition pos(FieldPosition::DONT_CARE); + DigitList *digitList = new DigitList(); + digitList->set(number); + f.adoptDigitList(digitList); + decimalFormat->format(f, toAppendTo, pos, status); + delete decimalFormat; + } + else { + int32_t startPos = toAppendTo.length(); + ruleSet->format(number, toAppendTo, toAppendTo.length(), 0, status); + adjustForCapitalizationContext(startPos, toAppendTo, status); + } + } + return toAppendTo; +} + UnicodeString& RuleBasedNumberFormat::adjustForCapitalizationContext(int32_t startPos, - UnicodeString& currentResult) const + UnicodeString& currentResult, + UErrorCode& status) const { #if !UCONFIG_NO_BREAK_ITERATION - if (startPos==0 && currentResult.length() > 0) { + UDisplayContext capitalizationContext = getContext(UDISPCTX_TYPE_CAPITALIZATION, status); + if (capitalizationContext != UDISPCTX_CAPITALIZATION_NONE && startPos == 0 && currentResult.length() > 0) { // capitalize currentResult according to context UChar32 ch = currentResult.char32At(0); - UErrorCode status = U_ZERO_ERROR; - UDisplayContext capitalizationContext = getContext(UDISPCTX_TYPE_CAPITALIZATION, status); - if ( u_islower(ch) && U_SUCCESS(status) && capitalizationBrkIter!= NULL && - ( capitalizationContext==UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE || - (capitalizationContext==UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU && capitalizationForUIListMenu) || - (capitalizationContext==UDISPCTX_CAPITALIZATION_FOR_STANDALONE && capitalizationForStandAlone)) ) { + if (u_islower(ch) && U_SUCCESS(status) && capitalizationBrkIter != NULL && + ( capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE || + (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU && capitalizationForUIListMenu) || + (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_STANDALONE && capitalizationForStandAlone)) ) { // titlecase first word of currentResult, here use sentence iterator unlike current implementations // in LocaleDisplayNamesImpl::adjustForUsageAndContext and RelativeDateFormat::format currentResult.toTitle(capitalizationBrkIter, locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); diff --git a/deps/icu-small/source/i18n/rbt.cpp b/deps/icu-small/source/i18n/rbt.cpp index 62aae52f18eb4d..0444729b252412 100644 --- a/deps/icu-small/source/i18n/rbt.cpp +++ b/deps/icu-small/source/i18n/rbt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/rbt.h b/deps/icu-small/source/i18n/rbt.h index 9add715acabcb9..005fb853847b11 100644 --- a/deps/icu-small/source/i18n/rbt.h +++ b/deps/icu-small/source/i18n/rbt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/rbt_data.cpp b/deps/icu-small/source/i18n/rbt_data.cpp index 1b6163956c61fe..7a9707b988b42e 100644 --- a/deps/icu-small/source/i18n/rbt_data.cpp +++ b/deps/icu-small/source/i18n/rbt_data.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/rbt_data.h b/deps/icu-small/source/i18n/rbt_data.h index 29e39a59ef076c..52a961dde010d3 100644 --- a/deps/icu-small/source/i18n/rbt_data.h +++ b/deps/icu-small/source/i18n/rbt_data.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/rbt_pars.cpp b/deps/icu-small/source/i18n/rbt_pars.cpp index 5e7c0ff5f9c5dc..8e49a8473a5ab0 100644 --- a/deps/icu-small/source/i18n/rbt_pars.cpp +++ b/deps/icu-small/source/i18n/rbt_pars.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/rbt_pars.h b/deps/icu-small/source/i18n/rbt_pars.h index 48067905b9c819..d51f2e852bb5b4 100644 --- a/deps/icu-small/source/i18n/rbt_pars.h +++ b/deps/icu-small/source/i18n/rbt_pars.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/rbt_rule.cpp b/deps/icu-small/source/i18n/rbt_rule.cpp index a04a535f0e9508..db02f76035c9ea 100644 --- a/deps/icu-small/source/i18n/rbt_rule.cpp +++ b/deps/icu-small/source/i18n/rbt_rule.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/rbt_rule.h b/deps/icu-small/source/i18n/rbt_rule.h index b25afd6ef07651..eb8556df0cda5d 100644 --- a/deps/icu-small/source/i18n/rbt_rule.h +++ b/deps/icu-small/source/i18n/rbt_rule.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) {1999-2001}, International Business Machines Corporation and others. All Rights Reserved. diff --git a/deps/icu-small/source/i18n/rbt_set.cpp b/deps/icu-small/source/i18n/rbt_set.cpp index f2c78ca9c8d46b..939c0ea39ade63 100644 --- a/deps/icu-small/source/i18n/rbt_set.cpp +++ b/deps/icu-small/source/i18n/rbt_set.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/rbt_set.h b/deps/icu-small/source/i18n/rbt_set.h index ed76e6ddf7d71e..9b2b8b38dba5ca 100644 --- a/deps/icu-small/source/i18n/rbt_set.h +++ b/deps/icu-small/source/i18n/rbt_set.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/rbtz.cpp b/deps/icu-small/source/i18n/rbtz.cpp index fb458dd5020b73..951073abc51ddf 100644 --- a/deps/icu-small/source/i18n/rbtz.cpp +++ b/deps/icu-small/source/i18n/rbtz.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/regexcmp.cpp b/deps/icu-small/source/i18n/regexcmp.cpp index d0e166cfa446d9..6cfa61f187e01e 100644 --- a/deps/icu-small/source/i18n/regexcmp.cpp +++ b/deps/icu-small/source/i18n/regexcmp.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // file: regexcmp.cpp @@ -2637,6 +2637,16 @@ void RegexCompile::findCaseInsensitiveStarters(UChar32 c, UnicodeSet *starterCh } +// Increment with overflow check. +// val and delta will both be positive. + +static int32_t safeIncrement(int32_t val, int32_t delta) { + if (INT32_MAX - val > delta) { + return val + delta; + } else { + return INT32_MAX; + } +} //------------------------------------------------------------------------------ @@ -2737,7 +2747,7 @@ void RegexCompile::matchStartType() { fRXPat->fInitialChars->add(URX_VAL(op)); numInitialStrings += 2; } - currentLen++; + currentLen = safeIncrement(currentLen, 1); atStart = FALSE; break; @@ -2750,7 +2760,7 @@ void RegexCompile::matchStartType() { fRXPat->fInitialChars->addAll(*s); numInitialStrings += 2; } - currentLen++; + currentLen = safeIncrement(currentLen, 1); atStart = FALSE; break; @@ -2787,7 +2797,7 @@ void RegexCompile::matchStartType() { fRXPat->fInitialChars->addAll(*s); numInitialStrings += 2; } - currentLen++; + currentLen = safeIncrement(currentLen, 1); atStart = FALSE; break; @@ -2802,7 +2812,7 @@ void RegexCompile::matchStartType() { fRXPat->fInitialChars->addAll(sc); numInitialStrings += 2; } - currentLen++; + currentLen = safeIncrement(currentLen, 1); atStart = FALSE; break; @@ -2819,7 +2829,7 @@ void RegexCompile::matchStartType() { fRXPat->fInitialChars->addAll(s); numInitialStrings += 2; } - currentLen++; + currentLen = safeIncrement(currentLen, 1); atStart = FALSE; break; @@ -2836,7 +2846,7 @@ void RegexCompile::matchStartType() { fRXPat->fInitialChars->addAll(s); numInitialStrings += 2; } - currentLen++; + currentLen = safeIncrement(currentLen, 1); atStart = FALSE; break; @@ -2855,7 +2865,7 @@ void RegexCompile::matchStartType() { fRXPat->fInitialChars->addAll(s); numInitialStrings += 2; } - currentLen++; + currentLen = safeIncrement(currentLen, 1); atStart = FALSE; break; @@ -2879,7 +2889,7 @@ void RegexCompile::matchStartType() { } numInitialStrings += 2; } - currentLen++; + currentLen = safeIncrement(currentLen, 1); atStart = FALSE; break; @@ -2895,7 +2905,7 @@ void RegexCompile::matchStartType() { fRXPat->fInitialChars->complement(); numInitialStrings += 2; } - currentLen++; + currentLen = safeIncrement(currentLen, 1); atStart = FALSE; break; @@ -2975,7 +2985,7 @@ void RegexCompile::matchStartType() { fRXPat->fInitialStringLen = stringLen; } - currentLen += stringLen; + currentLen = safeIncrement(currentLen, stringLen); atStart = FALSE; } break; @@ -3000,7 +3010,7 @@ void RegexCompile::matchStartType() { fRXPat->fInitialChars->addAll(s); numInitialStrings += 2; // Matching on an initial string not possible. } - currentLen += stringLen; + currentLen = safeIncrement(currentLen, stringLen); atStart = FALSE; } break; @@ -3258,7 +3268,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { case URX_DOTANY_ALL: // . matches one or two. case URX_DOTANY: case URX_DOTANY_UNIX: - currentLen++; + currentLen = safeIncrement(currentLen, 1); break; @@ -3310,7 +3320,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { { loc++; int32_t stringLenOp = (int32_t)fRXPat->fCompiledPat->elementAti(loc); - currentLen += URX_VAL(stringLenOp); + currentLen = safeIncrement(currentLen, URX_VAL(stringLenOp)); } break; @@ -3323,7 +3333,7 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { // Assume a min length of one for now. A min length of zero causes // optimization failures for a pattern like "string"+ // currentLen += URX_VAL(stringLenOp); - currentLen += 1; + currentLen = safeIncrement(currentLen, 1); } break; @@ -3433,18 +3443,6 @@ int32_t RegexCompile::minMatchLength(int32_t start, int32_t end) { return currentLen; } -// Increment with overflow check. -// val and delta will both be positive. - -static int32_t safeIncrement(int32_t val, int32_t delta) { - if (INT32_MAX - val > delta) { - return val + delta; - } else { - return INT32_MAX; - } -} - - //------------------------------------------------------------------------------ // // maxMatchLength Calculate the length of the longest string that could diff --git a/deps/icu-small/source/i18n/regexcmp.h b/deps/icu-small/source/i18n/regexcmp.h index 931f2387b5169b..85b7586793b9ff 100644 --- a/deps/icu-small/source/i18n/regexcmp.h +++ b/deps/icu-small/source/i18n/regexcmp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // regexcmp.h diff --git a/deps/icu-small/source/i18n/regexcst.h b/deps/icu-small/source/i18n/regexcst.h index 259b44f5dd734e..a07d85a277c3dd 100644 --- a/deps/icu-small/source/i18n/regexcst.h +++ b/deps/icu-small/source/i18n/regexcst.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html //--------------------------------------------------------------------------------- // diff --git a/deps/icu-small/source/i18n/regeximp.cpp b/deps/icu-small/source/i18n/regeximp.cpp index c1360ebf6cd943..454e7f836b3111 100644 --- a/deps/icu-small/source/i18n/regeximp.cpp +++ b/deps/icu-small/source/i18n/regeximp.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 2012 International Business Machines Corporation @@ -19,8 +19,7 @@ U_NAMESPACE_BEGIN CaseFoldingUTextIterator::CaseFoldingUTextIterator(UText &text) : - fUText(text), fcsp(NULL), fFoldChars(NULL), fFoldLength(0) { - fcsp = ucase_getSingleton(); + fUText(text), fFoldChars(NULL), fFoldLength(0) { } CaseFoldingUTextIterator::~CaseFoldingUTextIterator() {} @@ -35,7 +34,7 @@ UChar32 CaseFoldingUTextIterator::next() { if (originalC == U_SENTINEL) { return originalC; } - fFoldLength = ucase_toFullFolding(fcsp, originalC, &fFoldChars, U_FOLD_CASE_DEFAULT); + fFoldLength = ucase_toFullFolding(originalC, &fFoldChars, U_FOLD_CASE_DEFAULT); if (fFoldLength >= UCASE_MAX_STRING_LENGTH || fFoldLength < 0) { // input code point folds to a single code point, possibly itself. // See comment in ucase.h for explanation of return values from ucase_toFullFoldings. @@ -65,8 +64,7 @@ UBool CaseFoldingUTextIterator::inExpansion() { CaseFoldingUCharIterator::CaseFoldingUCharIterator(const UChar *chars, int64_t start, int64_t limit) : - fChars(chars), fIndex(start), fLimit(limit), fcsp(NULL), fFoldChars(NULL), fFoldLength(0) { - fcsp = ucase_getSingleton(); + fChars(chars), fIndex(start), fLimit(limit), fFoldChars(NULL), fFoldLength(0) { } @@ -84,7 +82,7 @@ UChar32 CaseFoldingUCharIterator::next() { } U16_NEXT(fChars, fIndex, fLimit, originalC); - fFoldLength = ucase_toFullFolding(fcsp, originalC, &fFoldChars, U_FOLD_CASE_DEFAULT); + fFoldLength = ucase_toFullFolding(originalC, &fFoldChars, U_FOLD_CASE_DEFAULT); if (fFoldLength >= UCASE_MAX_STRING_LENGTH || fFoldLength < 0) { // input code point folds to a single code point, possibly itself. // See comment in ucase.h for explanation of return values from ucase_toFullFoldings. diff --git a/deps/icu-small/source/i18n/regeximp.h b/deps/icu-small/source/i18n/regeximp.h index 0261c58c637a25..da4a861bde52dd 100644 --- a/deps/icu-small/source/i18n/regeximp.h +++ b/deps/icu-small/source/i18n/regeximp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // Copyright (C) 2002-2015 International Business Machines Corporation @@ -374,7 +374,6 @@ class CaseFoldingUTextIterator: public UMemory { // folding of the same code point from the orignal UText. private: UText &fUText; - const UCaseProps *fcsp; const UChar *fFoldChars; int32_t fFoldLength; int32_t fFoldIndex; @@ -404,7 +403,6 @@ class CaseFoldingUCharIterator: public UMemory { const UChar *fChars; int64_t fIndex; int64_t fLimit; - const UCaseProps *fcsp; const UChar *fFoldChars; int32_t fFoldLength; int32_t fFoldIndex; diff --git a/deps/icu-small/source/i18n/regexst.cpp b/deps/icu-small/source/i18n/regexst.cpp index a8feffa1bd2009..ad74ee508e7133 100644 --- a/deps/icu-small/source/i18n/regexst.cpp +++ b/deps/icu-small/source/i18n/regexst.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // regexst.h diff --git a/deps/icu-small/source/i18n/regexst.h b/deps/icu-small/source/i18n/regexst.h index 21f7ec945c748a..f0696c25a32df9 100644 --- a/deps/icu-small/source/i18n/regexst.h +++ b/deps/icu-small/source/i18n/regexst.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // regexst.h diff --git a/deps/icu-small/source/i18n/regextxt.cpp b/deps/icu-small/source/i18n/regextxt.cpp index d6157f5ed6d02e..41bb4a944b3530 100644 --- a/deps/icu-small/source/i18n/regextxt.cpp +++ b/deps/icu-small/source/i18n/regextxt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: diff --git a/deps/icu-small/source/i18n/regextxt.h b/deps/icu-small/source/i18n/regextxt.h index c5651aefd4f74c..9cfabbe4153416 100644 --- a/deps/icu-small/source/i18n/regextxt.h +++ b/deps/icu-small/source/i18n/regextxt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: diff --git a/deps/icu-small/source/i18n/region.cpp b/deps/icu-small/source/i18n/region.cpp index fdd467fc98a411..66f9ef35ded9ee 100644 --- a/deps/icu-small/source/i18n/region.cpp +++ b/deps/icu-small/source/i18n/region.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/region_impl.h b/deps/icu-small/source/i18n/region_impl.h index 852209603b116a..c0702af7dfb3d1 100644 --- a/deps/icu-small/source/i18n/region_impl.h +++ b/deps/icu-small/source/i18n/region_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/reldatefmt.cpp b/deps/icu-small/source/i18n/reldatefmt.cpp index 7009b190a25cb9..18c073b9eee1df 100644 --- a/deps/icu-small/source/i18n/reldatefmt.cpp +++ b/deps/icu-small/source/i18n/reldatefmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -15,6 +15,7 @@ #if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION #include "unicode/dtfmtsym.h" +#include "unicode/ucasemap.h" #include "unicode/ureldatefmt.h" #include "unicode/udisplaycontext.h" #include "unicode/unum.h" diff --git a/deps/icu-small/source/i18n/reldtfmt.cpp b/deps/icu-small/source/i18n/reldtfmt.cpp index 4a928695356b0c..d3ab45dc631ba0 100644 --- a/deps/icu-small/source/i18n/reldtfmt.cpp +++ b/deps/icu-small/source/i18n/reldtfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -20,7 +20,7 @@ #include "unicode/udisplaycontext.h" #include "unicode/uchar.h" #include "unicode/brkiter.h" - +#include "unicode/ucasemap.h" #include "reldtfmt.h" #include "cmemory.h" #include "uresimp.h" diff --git a/deps/icu-small/source/i18n/reldtfmt.h b/deps/icu-small/source/i18n/reldtfmt.h index ea091a91c393d5..5063a6388f63b0 100644 --- a/deps/icu-small/source/i18n/reldtfmt.h +++ b/deps/icu-small/source/i18n/reldtfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/rematch.cpp b/deps/icu-small/source/i18n/rematch.cpp index 5a5bb80e05e642..e3fdff7484506f 100644 --- a/deps/icu-small/source/i18n/rematch.cpp +++ b/deps/icu-small/source/i18n/rematch.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************** @@ -3566,7 +3566,14 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { } } fp = StateSave(fp, fp->fPatIdx, status); + } else { + // Increment time-out counter. (StateSave() does it if count >= minCount) + fTickCounter--; + if (fTickCounter <= 0) { + IncrementTime(status); // Re-initializes fTickCounter + } } + fp->fPatIdx = opValue + 4; // Loop back. } break; @@ -3623,6 +3630,11 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) { // We haven't met the minimum number of matches yet. // Loop back for another one. fp->fPatIdx = opValue + 4; // Loop back. + // Increment time-out counter. (StateSave() does it if count >= minCount) + fTickCounter--; + if (fTickCounter <= 0) { + IncrementTime(status); // Re-initializes fTickCounter + } } else { // We do have the minimum number of matches. @@ -5099,6 +5111,12 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu } } fp = StateSave(fp, fp->fPatIdx, status); + } else { + // Increment time-out counter. (StateSave() does it if count >= minCount) + fTickCounter--; + if (fTickCounter <= 0) { + IncrementTime(status); // Re-initializes fTickCounter + } } fp->fPatIdx = opValue + 4; // Loop back. } @@ -5156,6 +5174,10 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu // We haven't met the minimum number of matches yet. // Loop back for another one. fp->fPatIdx = opValue + 4; // Loop back. + fTickCounter--; + if (fTickCounter <= 0) { + IncrementTime(status); // Re-initializes fTickCounter + } } else { // We do have the minimum number of matches. diff --git a/deps/icu-small/source/i18n/remtrans.cpp b/deps/icu-small/source/i18n/remtrans.cpp index 89837f991d6f30..70a6ed3935b579 100644 --- a/deps/icu-small/source/i18n/remtrans.cpp +++ b/deps/icu-small/source/i18n/remtrans.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/remtrans.h b/deps/icu-small/source/i18n/remtrans.h index a5635781f979c7..ed038d5f2fe0d5 100644 --- a/deps/icu-small/source/i18n/remtrans.h +++ b/deps/icu-small/source/i18n/remtrans.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/repattrn.cpp b/deps/icu-small/source/i18n/repattrn.cpp index b792ca048445b5..b03873066c9016 100644 --- a/deps/icu-small/source/i18n/repattrn.cpp +++ b/deps/icu-small/source/i18n/repattrn.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html // // file: repattrn.cpp diff --git a/deps/icu-small/source/i18n/rulebasedcollator.cpp b/deps/icu-small/source/i18n/rulebasedcollator.cpp index 4852667ada8079..ab65f10a3bdfa8 100644 --- a/deps/icu-small/source/i18n/rulebasedcollator.cpp +++ b/deps/icu-small/source/i18n/rulebasedcollator.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/scientificnumberformatter.cpp b/deps/icu-small/source/i18n/scientificnumberformatter.cpp index 56a43f9b7fa45e..adf032d989dd90 100644 --- a/deps/icu-small/source/i18n/scientificnumberformatter.cpp +++ b/deps/icu-small/source/i18n/scientificnumberformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/scriptset.cpp b/deps/icu-small/source/i18n/scriptset.cpp index 951fe440803573..9358e63b9ee403 100644 --- a/deps/icu-small/source/i18n/scriptset.cpp +++ b/deps/icu-small/source/i18n/scriptset.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/scriptset.h b/deps/icu-small/source/i18n/scriptset.h index e8de3b9613f990..385c3e3e534086 100644 --- a/deps/icu-small/source/i18n/scriptset.h +++ b/deps/icu-small/source/i18n/scriptset.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/search.cpp b/deps/icu-small/source/i18n/search.cpp index 77323cc664fc19..baf879414b64f9 100644 --- a/deps/icu-small/source/i18n/search.cpp +++ b/deps/icu-small/source/i18n/search.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/selfmt.cpp b/deps/icu-small/source/i18n/selfmt.cpp index 041fea515c88ba..29aee3645751f2 100644 --- a/deps/icu-small/source/i18n/selfmt.cpp +++ b/deps/icu-small/source/i18n/selfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: diff --git a/deps/icu-small/source/i18n/selfmtimpl.h b/deps/icu-small/source/i18n/selfmtimpl.h index 75bc3e343a8f36..74d6dc218135e7 100644 --- a/deps/icu-small/source/i18n/selfmtimpl.h +++ b/deps/icu-small/source/i18n/selfmtimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: diff --git a/deps/icu-small/source/i18n/sharedbreakiterator.cpp b/deps/icu-small/source/i18n/sharedbreakiterator.cpp index ca962c6283374a..82f482bdd7f428 100644 --- a/deps/icu-small/source/i18n/sharedbreakiterator.cpp +++ b/deps/icu-small/source/i18n/sharedbreakiterator.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/sharedbreakiterator.h b/deps/icu-small/source/i18n/sharedbreakiterator.h index 58be1f6a76e906..b6d67bc8e8ea5e 100644 --- a/deps/icu-small/source/i18n/sharedbreakiterator.h +++ b/deps/icu-small/source/i18n/sharedbreakiterator.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/sharedcalendar.h b/deps/icu-small/source/i18n/sharedcalendar.h index f6d97b55bc128f..1526f92e88fef3 100644 --- a/deps/icu-small/source/i18n/sharedcalendar.h +++ b/deps/icu-small/source/i18n/sharedcalendar.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/shareddateformatsymbols.h b/deps/icu-small/source/i18n/shareddateformatsymbols.h index a11a8a391b55ba..ca9a2108190c4d 100644 --- a/deps/icu-small/source/i18n/shareddateformatsymbols.h +++ b/deps/icu-small/source/i18n/shareddateformatsymbols.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/sharednumberformat.h b/deps/icu-small/source/i18n/sharednumberformat.h index fcb618a4d48d50..a7e105b5ac19cb 100644 --- a/deps/icu-small/source/i18n/sharednumberformat.h +++ b/deps/icu-small/source/i18n/sharednumberformat.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/sharedpluralrules.h b/deps/icu-small/source/i18n/sharedpluralrules.h index faed6dea0e174d..28d8b25c14bc67 100644 --- a/deps/icu-small/source/i18n/sharedpluralrules.h +++ b/deps/icu-small/source/i18n/sharedpluralrules.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/significantdigitinterval.h b/deps/icu-small/source/i18n/significantdigitinterval.h index 336af784a50649..fc23370de5b6fd 100644 --- a/deps/icu-small/source/i18n/significantdigitinterval.h +++ b/deps/icu-small/source/i18n/significantdigitinterval.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/simpletz.cpp b/deps/icu-small/source/i18n/simpletz.cpp index 7dadef5ae60620..557b02620bec00 100644 --- a/deps/icu-small/source/i18n/simpletz.cpp +++ b/deps/icu-small/source/i18n/simpletz.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -1189,13 +1189,22 @@ SimpleTimeZone::initTransitionRules(UErrorCode& status) { // Create a TimeZoneRule for initial time if (firstStdStart < firstDstStart) { initialRule = new InitialTimeZoneRule(tzid+UnicodeString(DST_STR), getRawOffset(), dstRule->getDSTSavings()); + if (initialRule == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + deleteTransitionRules(); + return; + } firstTransition = new TimeZoneTransition(firstStdStart, *initialRule, *stdRule); } else { initialRule = new InitialTimeZoneRule(tzid+UnicodeString(STD_STR), getRawOffset(), 0); + if (initialRule == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + deleteTransitionRules(); + return; + } firstTransition = new TimeZoneTransition(firstDstStart, *initialRule, *dstRule); } - // Check for null pointers. - if (initialRule == NULL || firstTransition == NULL) { + if (firstTransition == NULL) { status = U_MEMORY_ALLOCATION_ERROR; deleteTransitionRules(); return; diff --git a/deps/icu-small/source/i18n/smallintformatter.cpp b/deps/icu-small/source/i18n/smallintformatter.cpp index b96f6dad3b5f5d..0c56e38bd69560 100644 --- a/deps/icu-small/source/i18n/smallintformatter.cpp +++ b/deps/icu-small/source/i18n/smallintformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/smallintformatter.h b/deps/icu-small/source/i18n/smallintformatter.h index 846d6b405472ae..3373a9c35ffcec 100644 --- a/deps/icu-small/source/i18n/smallintformatter.h +++ b/deps/icu-small/source/i18n/smallintformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/smpdtfmt.cpp b/deps/icu-small/source/i18n/smpdtfmt.cpp index 85cc162a11f39f..3c0670446b3876 100644 --- a/deps/icu-small/source/i18n/smpdtfmt.cpp +++ b/deps/icu-small/source/i18n/smpdtfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -48,6 +48,7 @@ #include "unicode/simpletz.h" #include "unicode/rbtz.h" #include "unicode/tzfmt.h" +#include "unicode/ucasemap.h" #include "unicode/utf16.h" #include "unicode/vtzone.h" #include "unicode/udisplaycontext.h" @@ -64,6 +65,7 @@ #include #include "smpdtfst.h" #include "sharednumberformat.h" +#include "ucasemap_imp.h" #include "ustr_imp.h" #include "charstr.h" #include "uvector.h" diff --git a/deps/icu-small/source/i18n/smpdtfst.cpp b/deps/icu-small/source/i18n/smpdtfst.cpp index 50980a99e4dfa5..ff0dec232d29f7 100644 --- a/deps/icu-small/source/i18n/smpdtfst.cpp +++ b/deps/icu-small/source/i18n/smpdtfst.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/smpdtfst.h b/deps/icu-small/source/i18n/smpdtfst.h index 38ad558de2dfc0..ed8ce4371f6d6d 100644 --- a/deps/icu-small/source/i18n/smpdtfst.h +++ b/deps/icu-small/source/i18n/smpdtfst.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -16,6 +16,7 @@ #ifndef SMPDTFST_H #define SMPDTFST_H +#include "unicode/uobject.h" #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING diff --git a/deps/icu-small/source/i18n/sortkey.cpp b/deps/icu-small/source/i18n/sortkey.cpp index 68b0f062b8daf4..fb030c499083e6 100644 --- a/deps/icu-small/source/i18n/sortkey.cpp +++ b/deps/icu-small/source/i18n/sortkey.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/standardplural.cpp b/deps/icu-small/source/i18n/standardplural.cpp index c39bae1ab18b9c..0391034b3e4a8d 100644 --- a/deps/icu-small/source/i18n/standardplural.cpp +++ b/deps/icu-small/source/i18n/standardplural.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/standardplural.h b/deps/icu-small/source/i18n/standardplural.h index 56c63c347cee1e..33e1d605f6856b 100644 --- a/deps/icu-small/source/i18n/standardplural.h +++ b/deps/icu-small/source/i18n/standardplural.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/strmatch.cpp b/deps/icu-small/source/i18n/strmatch.cpp index e72cfc9ab03d00..d5b018aa6b62b6 100644 --- a/deps/icu-small/source/i18n/strmatch.cpp +++ b/deps/icu-small/source/i18n/strmatch.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/strmatch.h b/deps/icu-small/source/i18n/strmatch.h index 0241adfd3f01f0..7152a24a0765e4 100644 --- a/deps/icu-small/source/i18n/strmatch.h +++ b/deps/icu-small/source/i18n/strmatch.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2001-2011, International Business Machines Corporation diff --git a/deps/icu-small/source/i18n/strrepl.cpp b/deps/icu-small/source/i18n/strrepl.cpp index d061eff579e58a..132c844c2dff27 100644 --- a/deps/icu-small/source/i18n/strrepl.cpp +++ b/deps/icu-small/source/i18n/strrepl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/strrepl.h b/deps/icu-small/source/i18n/strrepl.h index a452db993fb45d..feec058152a8a3 100644 --- a/deps/icu-small/source/i18n/strrepl.h +++ b/deps/icu-small/source/i18n/strrepl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/stsearch.cpp b/deps/icu-small/source/i18n/stsearch.cpp index 643ec21b277395..bf4d80b6db8ed0 100644 --- a/deps/icu-small/source/i18n/stsearch.cpp +++ b/deps/icu-small/source/i18n/stsearch.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/taiwncal.cpp b/deps/icu-small/source/i18n/taiwncal.cpp index f1ca6fa135bd34..e2757dbd550dd9 100644 --- a/deps/icu-small/source/i18n/taiwncal.cpp +++ b/deps/icu-small/source/i18n/taiwncal.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/taiwncal.h b/deps/icu-small/source/i18n/taiwncal.h index b15cff5beb75b8..99bbfb53f2b1ab 100644 --- a/deps/icu-small/source/i18n/taiwncal.h +++ b/deps/icu-small/source/i18n/taiwncal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/timezone.cpp b/deps/icu-small/source/i18n/timezone.cpp index 427674aac4ff3d..e662bf7674b9f4 100644 --- a/deps/icu-small/source/i18n/timezone.cpp +++ b/deps/icu-small/source/i18n/timezone.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/titletrn.cpp b/deps/icu-small/source/i18n/titletrn.cpp index a1de8be6669567..4e75c824a0f7f1 100644 --- a/deps/icu-small/source/i18n/titletrn.cpp +++ b/deps/icu-small/source/i18n/titletrn.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -97,7 +97,7 @@ void TitlecaseTransliterator::handleTransliterate( int32_t start; for (start = offsets.start - 1; start >= offsets.contextStart; start -= U16_LENGTH(c)) { c = text.char32At(start); - type=ucase_getTypeOrIgnorable(fCsp, c); + type=ucase_getTypeOrIgnorable(c); if(type>0) { // cased doTitle=FALSE; break; @@ -118,19 +118,19 @@ void TitlecaseTransliterator::handleTransliterate( UnicodeString tmp; const UChar *s; - int32_t textPos, delta, result, locCache=0; + int32_t textPos, delta, result; for(textPos=offsets.start; textPos=0) { // not case-ignorable if(doTitle) { - result=ucase_toFullTitle(fCsp, c, utrans_rep_caseContextIterator, &csc, &s, "", &locCache); + result=ucase_toFullTitle(c, utrans_rep_caseContextIterator, &csc, &s, UCASE_LOC_ROOT); } else { - result=ucase_toFullLower(fCsp, c, utrans_rep_caseContextIterator, &csc, &s, "", &locCache); + result=ucase_toFullLower(c, utrans_rep_caseContextIterator, &csc, &s, UCASE_LOC_ROOT); } doTitle = (UBool)(type==0); // doTitle=isUncased diff --git a/deps/icu-small/source/i18n/titletrn.h b/deps/icu-small/source/i18n/titletrn.h index a6380e3bd142c6..166378fe9da5c2 100644 --- a/deps/icu-small/source/i18n/titletrn.h +++ b/deps/icu-small/source/i18n/titletrn.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/tmunit.cpp b/deps/icu-small/source/i18n/tmunit.cpp index d9da2681251c2f..ca308cca225972 100644 --- a/deps/icu-small/source/i18n/tmunit.cpp +++ b/deps/icu-small/source/i18n/tmunit.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/tmutamt.cpp b/deps/icu-small/source/i18n/tmutamt.cpp index 7be730765bfff4..0e2b91fbb2bb6f 100644 --- a/deps/icu-small/source/i18n/tmutamt.cpp +++ b/deps/icu-small/source/i18n/tmutamt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/tmutfmt.cpp b/deps/icu-small/source/i18n/tmutfmt.cpp index 1669546f767535..50dac8b7cef8c0 100644 --- a/deps/icu-small/source/i18n/tmutfmt.cpp +++ b/deps/icu-small/source/i18n/tmutfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/tolowtrn.cpp b/deps/icu-small/source/i18n/tolowtrn.cpp index f0a59bbd0b4716..063cc88d1c40ce 100644 --- a/deps/icu-small/source/i18n/tolowtrn.cpp +++ b/deps/icu-small/source/i18n/tolowtrn.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/tolowtrn.h b/deps/icu-small/source/i18n/tolowtrn.h index 616e59899f974d..e311431224e5c2 100644 --- a/deps/icu-small/source/i18n/tolowtrn.h +++ b/deps/icu-small/source/i18n/tolowtrn.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/toupptrn.cpp b/deps/icu-small/source/i18n/toupptrn.cpp index a34792e07cfb82..098dba9a3ce4f9 100644 --- a/deps/icu-small/source/i18n/toupptrn.cpp +++ b/deps/icu-small/source/i18n/toupptrn.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/toupptrn.h b/deps/icu-small/source/i18n/toupptrn.h index eae44e7d187dfa..677a04e5c771a9 100644 --- a/deps/icu-small/source/i18n/toupptrn.h +++ b/deps/icu-small/source/i18n/toupptrn.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/translit.cpp b/deps/icu-small/source/i18n/translit.cpp index 79328baa2bb157..de54e952dcb570 100644 --- a/deps/icu-small/source/i18n/translit.cpp +++ b/deps/icu-small/source/i18n/translit.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/transreg.cpp b/deps/icu-small/source/i18n/transreg.cpp index cc1d51dea84749..d864ad34636178 100644 --- a/deps/icu-small/source/i18n/transreg.cpp +++ b/deps/icu-small/source/i18n/transreg.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/transreg.h b/deps/icu-small/source/i18n/transreg.h index 334963f8d1e9c2..6fc35c8247b341 100644 --- a/deps/icu-small/source/i18n/transreg.h +++ b/deps/icu-small/source/i18n/transreg.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/tridpars.cpp b/deps/icu-small/source/i18n/tridpars.cpp index 140e3d7d1cf74d..68bbd2d0407a7c 100644 --- a/deps/icu-small/source/i18n/tridpars.cpp +++ b/deps/icu-small/source/i18n/tridpars.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/tridpars.h b/deps/icu-small/source/i18n/tridpars.h index 7c226023ef8011..3d657ed17c9784 100644 --- a/deps/icu-small/source/i18n/tridpars.h +++ b/deps/icu-small/source/i18n/tridpars.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************** diff --git a/deps/icu-small/source/i18n/tzfmt.cpp b/deps/icu-small/source/i18n/tzfmt.cpp index 783edac34fde70..45eda6ffb61043 100644 --- a/deps/icu-small/source/i18n/tzfmt.cpp +++ b/deps/icu-small/source/i18n/tzfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -14,8 +14,10 @@ #include "unicode/calendar.h" #include "unicode/tzfmt.h" #include "unicode/numsys.h" +#include "unicode/strenum.h" #include "unicode/uchar.h" #include "unicode/udat.h" +#include "unicode/ustring.h" #include "tzgnames.h" #include "cmemory.h" #include "cstring.h" diff --git a/deps/icu-small/source/i18n/tzgnames.cpp b/deps/icu-small/source/i18n/tzgnames.cpp index 4fc726ea54de9b..b14e9835d9ab97 100644 --- a/deps/icu-small/source/i18n/tzgnames.cpp +++ b/deps/icu-small/source/i18n/tzgnames.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -18,6 +18,7 @@ #include "unicode/rbtz.h" #include "unicode/simpleformatter.h" #include "unicode/simpletz.h" +#include "unicode/strenum.h" #include "unicode/vtzone.h" #include "cmemory.h" diff --git a/deps/icu-small/source/i18n/tzgnames.h b/deps/icu-small/source/i18n/tzgnames.h index e78e8ee991734e..d896af8ba82f1b 100644 --- a/deps/icu-small/source/i18n/tzgnames.h +++ b/deps/icu-small/source/i18n/tzgnames.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/tznames.cpp b/deps/icu-small/source/i18n/tznames.cpp index 6aefd13b536fc0..689fdeb0915300 100644 --- a/deps/icu-small/source/i18n/tznames.cpp +++ b/deps/icu-small/source/i18n/tznames.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/tznames_impl.cpp b/deps/icu-small/source/i18n/tznames_impl.cpp index 3e92acb6f9606e..d00d7e114543bf 100644 --- a/deps/icu-small/source/i18n/tznames_impl.cpp +++ b/deps/icu-small/source/i18n/tznames_impl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -15,6 +15,7 @@ #if !UCONFIG_NO_FORMATTING +#include "unicode/strenum.h" #include "unicode/ustring.h" #include "unicode/timezone.h" diff --git a/deps/icu-small/source/i18n/tznames_impl.h b/deps/icu-small/source/i18n/tznames_impl.h index 6b913bb6bf8c1b..9251f9ef470f6e 100644 --- a/deps/icu-small/source/i18n/tznames_impl.h +++ b/deps/icu-small/source/i18n/tznames_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/tzrule.cpp b/deps/icu-small/source/i18n/tzrule.cpp index 2ff61302b8180e..f60a5e0dd59a6a 100644 --- a/deps/icu-small/source/i18n/tzrule.cpp +++ b/deps/icu-small/source/i18n/tzrule.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/tztrans.cpp b/deps/icu-small/source/i18n/tztrans.cpp index 76e259c5aef672..3199b78ea833e9 100644 --- a/deps/icu-small/source/i18n/tztrans.cpp +++ b/deps/icu-small/source/i18n/tztrans.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/ucal.cpp b/deps/icu-small/source/i18n/ucal.cpp index a9377b1e511f9e..4154eea83f2fa9 100644 --- a/deps/icu-small/source/i18n/ucal.cpp +++ b/deps/icu-small/source/i18n/ucal.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/ucln_in.cpp b/deps/icu-small/source/i18n/ucln_in.cpp index b33a68923767ca..74c8acfab13ea4 100644 --- a/deps/icu-small/source/i18n/ucln_in.cpp +++ b/deps/icu-small/source/i18n/ucln_in.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * * ****************************************************************************** * file name: ucln_in.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/ucln_in.h b/deps/icu-small/source/i18n/ucln_in.h index b609fce0c2da5a..35a8a23e90c22a 100644 --- a/deps/icu-small/source/i18n/ucln_in.h +++ b/deps/icu-small/source/i18n/ucln_in.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: ucln_in.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/ucol.cpp b/deps/icu-small/source/i18n/ucol.cpp index c622aef7c245b7..34a394682f1c16 100644 --- a/deps/icu-small/source/i18n/ucol.cpp +++ b/deps/icu-small/source/i18n/ucol.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucol.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/ucol_imp.h b/deps/icu-small/source/i18n/ucol_imp.h index 7c9e8f68911209..a251fc461d3ac2 100644 --- a/deps/icu-small/source/i18n/ucol_imp.h +++ b/deps/icu-small/source/i18n/ucol_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -10,7 +10,7 @@ * * Private implementation header for C collation * file name: ucol_imp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/ucol_res.cpp b/deps/icu-small/source/i18n/ucol_res.cpp index 314b766ee6db02..d1597021c3ee47 100644 --- a/deps/icu-small/source/i18n/ucol_res.cpp +++ b/deps/icu-small/source/i18n/ucol_res.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucol_res.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -680,6 +680,7 @@ ucol_getKeywordValuesForLocale(const char* /*key*/, const char* locale, return NULL; } memcpy(en, &defaultKeywordValues, sizeof(UEnumeration)); + ulist_resetList(sink.values); // Initialize the iterator. en->context = sink.values; sink.values = NULL; // Avoid deletion in the sink destructor. return en; diff --git a/deps/icu-small/source/i18n/ucol_sit.cpp b/deps/icu-small/source/i18n/ucol_sit.cpp index c81977b8a34cc0..cf507f61ed3521 100644 --- a/deps/icu-small/source/i18n/ucol_sit.cpp +++ b/deps/icu-small/source/i18n/ucol_sit.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucol_sit.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/ucoleitr.cpp b/deps/icu-small/source/i18n/ucoleitr.cpp index 4b46b205aa07db..6842061bab0912 100644 --- a/deps/icu-small/source/i18n/ucoleitr.cpp +++ b/deps/icu-small/source/i18n/ucoleitr.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/i18n/ucsdet.cpp b/deps/icu-small/source/i18n/ucsdet.cpp index dd69d9f548b78a..46f69cf90cba6b 100644 --- a/deps/icu-small/source/i18n/ucsdet.cpp +++ b/deps/icu-small/source/i18n/ucsdet.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/udat.cpp b/deps/icu-small/source/i18n/udat.cpp index b07e1ceab7436d..d086067c034da6 100644 --- a/deps/icu-small/source/i18n/udat.cpp +++ b/deps/icu-small/source/i18n/udat.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/udateintervalformat.cpp b/deps/icu-small/source/i18n/udateintervalformat.cpp index e6eec44847453c..44ba6b9fb1df38 100644 --- a/deps/icu-small/source/i18n/udateintervalformat.cpp +++ b/deps/icu-small/source/i18n/udateintervalformat.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/deps/icu-small/source/i18n/udatpg.cpp b/deps/icu-small/source/i18n/udatpg.cpp index d8824afdfc4adf..9ba82b529c507b 100644 --- a/deps/icu-small/source/i18n/udatpg.cpp +++ b/deps/icu-small/source/i18n/udatpg.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: udatpg.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/ufieldpositer.cpp b/deps/icu-small/source/i18n/ufieldpositer.cpp index b1c9c64805889c..64de856c30867e 100644 --- a/deps/icu-small/source/i18n/ufieldpositer.cpp +++ b/deps/icu-small/source/i18n/ufieldpositer.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/deps/icu-small/source/i18n/uitercollationiterator.cpp b/deps/icu-small/source/i18n/uitercollationiterator.cpp index eb71725380a635..103c91cac8b132 100644 --- a/deps/icu-small/source/i18n/uitercollationiterator.cpp +++ b/deps/icu-small/source/i18n/uitercollationiterator.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/uitercollationiterator.h b/deps/icu-small/source/i18n/uitercollationiterator.h index da9f8d34687d0b..62b6f8341933bb 100644 --- a/deps/icu-small/source/i18n/uitercollationiterator.h +++ b/deps/icu-small/source/i18n/uitercollationiterator.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/ulocdata.c b/deps/icu-small/source/i18n/ulocdata.cpp similarity index 99% rename from deps/icu-small/source/i18n/ulocdata.c rename to deps/icu-small/source/i18n/ulocdata.cpp index e1e61ce8706abc..551f6c64ed5668 100644 --- a/deps/icu-small/source/i18n/ulocdata.c +++ b/deps/icu-small/source/i18n/ulocdata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * * ****************************************************************************** * file name: ulocdata.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/umsg.cpp b/deps/icu-small/source/i18n/umsg.cpp index 75647e37d6bbdf..a385eb487d55d3 100644 --- a/deps/icu-small/source/i18n/umsg.cpp +++ b/deps/icu-small/source/i18n/umsg.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: umsg.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/umsg_imp.h b/deps/icu-small/source/i18n/umsg_imp.h index e3538d39710f31..43ef1c78f0d17d 100644 --- a/deps/icu-small/source/i18n/umsg_imp.h +++ b/deps/icu-small/source/i18n/umsg_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: umsg_imp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/unesctrn.cpp b/deps/icu-small/source/i18n/unesctrn.cpp index 2e79067dee6aa9..fcce9528e2f3dc 100644 --- a/deps/icu-small/source/i18n/unesctrn.cpp +++ b/deps/icu-small/source/i18n/unesctrn.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/unesctrn.h b/deps/icu-small/source/i18n/unesctrn.h index 7ae8302b0fcb33..e8e171f2bc4a69 100644 --- a/deps/icu-small/source/i18n/unesctrn.h +++ b/deps/icu-small/source/i18n/unesctrn.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/uni2name.cpp b/deps/icu-small/source/i18n/uni2name.cpp index 24323b3f60642f..86d7a4904a815e 100644 --- a/deps/icu-small/source/i18n/uni2name.cpp +++ b/deps/icu-small/source/i18n/uni2name.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/uni2name.h b/deps/icu-small/source/i18n/uni2name.h index 7d85113f665b1d..4d6eaa0a9a6b65 100644 --- a/deps/icu-small/source/i18n/uni2name.h +++ b/deps/icu-small/source/i18n/uni2name.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/alphaindex.h b/deps/icu-small/source/i18n/unicode/alphaindex.h index e9e8739ed28a00..54bd29ff88668a 100644 --- a/deps/icu-small/source/i18n/unicode/alphaindex.h +++ b/deps/icu-small/source/i18n/unicode/alphaindex.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -15,6 +15,7 @@ #include "unicode/utypes.h" #include "unicode/uobject.h" #include "unicode/locid.h" +#include "unicode/unistr.h" #if !UCONFIG_NO_COLLATION diff --git a/deps/icu-small/source/i18n/unicode/basictz.h b/deps/icu-small/source/i18n/unicode/basictz.h index 8da4a00bf877be..eb62abaf0a679c 100644 --- a/deps/icu-small/source/i18n/unicode/basictz.h +++ b/deps/icu-small/source/i18n/unicode/basictz.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/calendar.h b/deps/icu-small/source/i18n/unicode/calendar.h index b7da5f3c5b8b94..e43c181c8a3368 100644 --- a/deps/icu-small/source/i18n/unicode/calendar.h +++ b/deps/icu-small/source/i18n/unicode/calendar.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/choicfmt.h b/deps/icu-small/source/i18n/unicode/choicfmt.h index ab3c28fe0740d7..c9f0f1114f89ed 100644 --- a/deps/icu-small/source/i18n/unicode/choicfmt.h +++ b/deps/icu-small/source/i18n/unicode/choicfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/coleitr.h b/deps/icu-small/source/i18n/unicode/coleitr.h index 628b461f9453d4..bf0e1d51a41833 100644 --- a/deps/icu-small/source/i18n/unicode/coleitr.h +++ b/deps/icu-small/source/i18n/unicode/coleitr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -47,6 +47,7 @@ U_NAMESPACE_BEGIN struct CollationData; +class CharacterIterator; class CollationIterator; class RuleBasedCollator; class UCollationPCE; diff --git a/deps/icu-small/source/i18n/unicode/coll.h b/deps/icu-small/source/i18n/unicode/coll.h index e41be2ee81a25c..7e467df80e0409 100644 --- a/deps/icu-small/source/i18n/unicode/coll.h +++ b/deps/icu-small/source/i18n/unicode/coll.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -58,7 +58,7 @@ #include "unicode/uobject.h" #include "unicode/ucol.h" -#include "unicode/normlzr.h" +#include "unicode/unorm.h" #include "unicode/locid.h" #include "unicode/uniset.h" #include "unicode/umisc.h" @@ -158,7 +158,7 @@ class CollationKey; * @see CollationKey * @see CollationElementIterator * @see Locale -* @see Normalizer +* @see Normalizer2 * @version 2.0 11/15/01 */ @@ -393,8 +393,8 @@ class U_I18N_API Collator : public UObject { * is less than, greater than or equal to another string array. *

Example of use: *

-     * .       UChar ABC[] = {0x41, 0x42, 0x43, 0};  // = "ABC"
-     * .       UChar abc[] = {0x61, 0x62, 0x63, 0};  // = "abc"
+     * .       char16_t ABC[] = {0x41, 0x42, 0x43, 0};  // = "ABC"
+     * .       char16_t abc[] = {0x61, 0x62, 0x63, 0};  // = "abc"
      * .       UErrorCode status = U_ZERO_ERROR;
      * .       Collator *myCollation =
      * .                         Collator::createInstance(Locale::getUS(), status);
@@ -420,8 +420,8 @@ class U_I18N_API Collator : public UObject {
      *         target
      * @deprecated ICU 2.6 use the overload with UErrorCode &
      */
-    virtual EComparisonResult compare(const UChar* source, int32_t sourceLength,
-                                      const UChar* target, int32_t targetLength)
+    virtual EComparisonResult compare(const char16_t* source, int32_t sourceLength,
+                                      const char16_t* target, int32_t targetLength)
                                       const;
 
     /**
@@ -440,8 +440,8 @@ class U_I18N_API Collator : public UObject {
      * than target
      * @stable ICU 2.6
      */
-    virtual UCollationResult compare(const UChar* source, int32_t sourceLength,
-                                      const UChar* target, int32_t targetLength,
+    virtual UCollationResult compare(const char16_t* source, int32_t sourceLength,
+                                      const char16_t* target, int32_t targetLength,
                                       UErrorCode &status) const = 0;
 
     /**
@@ -517,7 +517,7 @@ class U_I18N_API Collator : public UObject {
      * @see CollationKey#compare
      * @stable ICU 2.0
      */
-    virtual CollationKey& getCollationKey(const UChar*source,
+    virtual CollationKey& getCollationKey(const char16_t*source,
                                           int32_t sourceLength,
                                           CollationKey& key,
                                           UErrorCode& status) const = 0;
@@ -911,7 +911,7 @@ class U_I18N_API Collator : public UObject {
      * the top of one of the supported reordering groups,
      * and it must not be beyond the last of those groups.
      * See setMaxVariable().
-     * @param varTop one or more (if contraction) UChars to which the variable top should be set
+     * @param varTop one or more (if contraction) char16_ts to which the variable top should be set
      * @param len length of variable top string. If -1 it is considered to be zero terminated.
      * @param status error code. If error code is set, the return value is undefined. Errors set by this function are: 
* U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction
@@ -920,7 +920,7 @@ class U_I18N_API Collator : public UObject { * @return variable top primary weight * @deprecated ICU 53 Call setMaxVariable() instead. */ - virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status) = 0; + virtual uint32_t setVariableTop(const char16_t *varTop, int32_t len, UErrorCode &status) = 0; /** * Sets the variable top to the primary weight of the specified string. @@ -929,7 +929,7 @@ class U_I18N_API Collator : public UObject { * the top of one of the supported reordering groups, * and it must not be beyond the last of those groups. * See setMaxVariable(). - * @param varTop a UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set + * @param varTop a UnicodeString size 1 or more (if contraction) of char16_ts to which the variable top should be set * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
* U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction
* U_ILLEGAL_ARGUMENT_ERROR if the variable top is beyond @@ -1002,7 +1002,7 @@ class U_I18N_API Collator : public UObject { int32_t resultLength) const = 0; /** - * Get the sort key as an array of bytes from a UChar buffer. + * Get the sort key as an array of bytes from a char16_t buffer. * Sort key byte arrays are zero-terminated and can be compared using * strcmp(). * @@ -1020,7 +1020,7 @@ class U_I18N_API Collator : public UObject { * @return Number of bytes needed for storing the sort key * @stable ICU 2.2 */ - virtual int32_t getSortKey(const UChar*source, int32_t sourceLength, + virtual int32_t getSortKey(const char16_t*source, int32_t sourceLength, uint8_t*result, int32_t resultLength) const = 0; /** diff --git a/deps/icu-small/source/i18n/unicode/compactdecimalformat.h b/deps/icu-small/source/i18n/unicode/compactdecimalformat.h index 1fcc5c581e089d..3fbe5da9cee4b2 100644 --- a/deps/icu-small/source/i18n/unicode/compactdecimalformat.h +++ b/deps/icu-small/source/i18n/unicode/compactdecimalformat.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/curramt.h b/deps/icu-small/source/i18n/unicode/curramt.h index 268d53c0b15f7e..03ec856e3bf585 100644 --- a/deps/icu-small/source/i18n/unicode/curramt.h +++ b/deps/icu-small/source/i18n/unicode/curramt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -46,7 +46,7 @@ class U_I18N_API CurrencyAmount: public Measure { * is invalid, then this will be set to a failing value. * @stable ICU 3.0 */ - CurrencyAmount(const Formattable& amount, const UChar* isoCode, + CurrencyAmount(const Formattable& amount, ConstChar16Ptr isoCode, UErrorCode &ec); /** @@ -59,7 +59,7 @@ class U_I18N_API CurrencyAmount: public Measure { * then this will be set to a failing value. * @stable ICU 3.0 */ - CurrencyAmount(double amount, const UChar* isoCode, + CurrencyAmount(double amount, ConstChar16Ptr isoCode, UErrorCode &ec); /** @@ -115,14 +115,14 @@ class U_I18N_API CurrencyAmount: public Measure { * Return the ISO currency code of this object. * @stable ICU 3.0 */ - inline const UChar* getISOCurrency() const; + inline const char16_t* getISOCurrency() const; }; inline const CurrencyUnit& CurrencyAmount::getCurrency() const { return (const CurrencyUnit&) getUnit(); } -inline const UChar* CurrencyAmount::getISOCurrency() const { +inline const char16_t* CurrencyAmount::getISOCurrency() const { return getCurrency().getISOCurrency(); } diff --git a/deps/icu-small/source/i18n/unicode/currpinf.h b/deps/icu-small/source/i18n/unicode/currpinf.h index 133de38fc2fd99..1a327c5bae0033 100644 --- a/deps/icu-small/source/i18n/unicode/currpinf.h +++ b/deps/icu-small/source/i18n/unicode/currpinf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/currunit.h b/deps/icu-small/source/i18n/unicode/currunit.h index 313c92a6acacfc..b72dc5e68dd645 100644 --- a/deps/icu-small/source/i18n/unicode/currunit.h +++ b/deps/icu-small/source/i18n/unicode/currunit.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -28,7 +28,7 @@ U_NAMESPACE_BEGIN /** * A unit of currency, such as USD (U.S. dollars) or JPY (Japanese - * yen). This class is a thin wrapper over a UChar string that + * yen). This class is a thin wrapper over a char16_t string that * subclasses MeasureUnit, for use with Measure and MeasureFormat. * * @author Alan Liu @@ -44,7 +44,7 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { * then this will be set to a failing value. * @stable ICU 3.0 */ - CurrencyUnit(const UChar* isoCode, UErrorCode &ec); + CurrencyUnit(ConstChar16Ptr isoCode, UErrorCode &ec); /** * Copy constructor @@ -93,16 +93,16 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { * Return the ISO currency code of this object. * @stable ICU 3.0 */ - inline const UChar* getISOCurrency() const; + inline const char16_t* getISOCurrency() const; private: /** * The ISO 4217 code of this object. */ - UChar isoCode[4]; + char16_t isoCode[4]; }; -inline const UChar* CurrencyUnit::getISOCurrency() const { +inline const char16_t* CurrencyUnit::getISOCurrency() const { return isoCode; } diff --git a/deps/icu-small/source/i18n/unicode/datefmt.h b/deps/icu-small/source/i18n/unicode/datefmt.h index 6e3a78f2913ce1..d70d8d1dd5cd99 100644 --- a/deps/icu-small/source/i18n/unicode/datefmt.h +++ b/deps/icu-small/source/i18n/unicode/datefmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/dcfmtsym.h b/deps/icu-small/source/i18n/unicode/dcfmtsym.h index 946227addb7557..3a502d0ec03d1c 100644 --- a/deps/icu-small/source/i18n/unicode/dcfmtsym.h +++ b/deps/icu-small/source/i18n/unicode/dcfmtsym.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -35,6 +35,7 @@ #include "unicode/uobject.h" #include "unicode/locid.h" #include "unicode/unum.h" +#include "unicode/unistr.h" /** * \file @@ -392,7 +393,7 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * Returns that pattern stored in currecy info. Internal API for use by NumberFormat API. * @internal */ - inline const UChar* getCurrencyPattern(void) const; + inline const char16_t* getCurrencyPattern(void) const; #endif /* U_HIDE_INTERNAL_API */ private: @@ -423,7 +424,7 @@ class U_I18N_API DecimalFormatSymbols : public UObject { char actualLocale[ULOC_FULLNAME_CAPACITY]; char validLocale[ULOC_FULLNAME_CAPACITY]; - const UChar* currPattern; + const char16_t* currPattern; UnicodeString currencySpcBeforeSym[UNUM_CURRENCY_SPACING_COUNT]; UnicodeString currencySpcAfterSym[UNUM_CURRENCY_SPACING_COUNT]; @@ -491,7 +492,7 @@ DecimalFormatSymbols::getLocale() const { } #ifndef U_HIDE_INTERNAL_API -inline const UChar* +inline const char16_t* DecimalFormatSymbols::getCurrencyPattern() const { return currPattern; } diff --git a/deps/icu-small/source/i18n/unicode/decimfmt.h b/deps/icu-small/source/i18n/unicode/decimfmt.h index 7339399f72e001..1deff5bf921c87 100644 --- a/deps/icu-small/source/i18n/unicode/decimfmt.h +++ b/deps/icu-small/source/i18n/unicode/decimfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -604,7 +604,7 @@ template class U_I18N_API EnumSet"* #0 o''clock", the format width is 10. * - *
  • The width is counted in 16-bit code units (UChars). + *
  • The width is counted in 16-bit code units (char16_ts). * *
  • Some parameters which usually do not matter have meaning when padding is * used, because the pattern width is significant with padding. In the pattern @@ -1961,14 +1961,14 @@ class U_I18N_API DecimalFormat: public NumberFormat { * @param ec input-output error code * @stable ICU 3.0 */ - virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec); + virtual void setCurrency(const char16_t* theCurrency, UErrorCode& ec); /** * Sets the currency used to display currency amounts. See - * setCurrency(const UChar*, UErrorCode&). - * @deprecated ICU 3.0. Use setCurrency(const UChar*, UErrorCode&). + * setCurrency(const char16_t*, UErrorCode&). + * @deprecated ICU 3.0. Use setCurrency(const char16_t*, UErrorCode&). */ - virtual void setCurrency(const UChar* theCurrency); + virtual void setCurrency(const char16_t* theCurrency); /** * Sets the Currency Context object used to display currency. @@ -2108,7 +2108,7 @@ class U_I18N_API DecimalFormat: public NumberFormat { void parse(const UnicodeString& text, Formattable& result, ParsePosition& pos, - UChar* currency) const; + char16_t* currency) const; enum { fgStatusInfinite, @@ -2124,7 +2124,7 @@ class U_I18N_API DecimalFormat: public NumberFormat { int8_t type, ParsePosition& parsePosition, DigitList& digits, UBool* status, - UChar* currency) const; + char16_t* currency) const; // Mixed style parsing for currency. // It parses against the current currency pattern @@ -2135,7 +2135,7 @@ class U_I18N_API DecimalFormat: public NumberFormat { ParsePosition& parsePosition, DigitList& digits, UBool* status, - UChar* currency) const; + char16_t* currency) const; int32_t skipPadding(const UnicodeString& text, int32_t position) const; @@ -2146,7 +2146,7 @@ class U_I18N_API DecimalFormat: public NumberFormat { const UnicodeString* affixPat, UBool complexCurrencyParsing, int8_t type, - UChar* currency) const; + char16_t* currency) const; static UnicodeString& trimMarksFromAffix(const UnicodeString& affix, UnicodeString& trimmedAffix); @@ -2169,7 +2169,7 @@ class U_I18N_API DecimalFormat: public NumberFormat { const UnicodeString& input, int32_t pos, int8_t type, - UChar* currency) const; + char16_t* currency) const; static int32_t match(const UnicodeString& text, int32_t pos, UChar32 ch); @@ -2195,11 +2195,11 @@ class U_I18N_API DecimalFormat: public NumberFormat { void setupCurrencyAffixPatterns(UErrorCode& status); // get the currency rounding with respect to currency usage - double getCurrencyRounding(const UChar* currency, + double getCurrencyRounding(const char16_t* currency, UErrorCode* ec) const; // get the currency fraction with respect to currency usage - int getCurrencyFractionDigits(const UChar* currency, + int getCurrencyFractionDigits(const char16_t* currency, UErrorCode* ec) const; // hashtable operations @@ -2271,7 +2271,7 @@ class U_I18N_API DecimalFormat: public NumberFormat { * have a capacity of at least 4 * @internal */ - virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const; + virtual void getEffectiveCurrency(char16_t* result, UErrorCode& ec) const; /** number of integer digits * @stable ICU 2.4 diff --git a/deps/icu-small/source/i18n/unicode/dtfmtsym.h b/deps/icu-small/source/i18n/unicode/dtfmtsym.h index 507868e2c328fb..ed7c1898465e5d 100644 --- a/deps/icu-small/source/i18n/unicode/dtfmtsym.h +++ b/deps/icu-small/source/i18n/unicode/dtfmtsym.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -25,6 +25,7 @@ #if !UCONFIG_NO_FORMATTING #include "unicode/calendar.h" +#include "unicode/strenum.h" #include "unicode/uobject.h" #include "unicode/locid.h" #include "unicode/udat.h" @@ -426,13 +427,13 @@ class U_I18N_API DateFormatSymbols U_FINAL : public UObject { * doesn't specify any time separator, and always recognized when parsing. * @internal */ - static const UChar DEFAULT_TIME_SEPARATOR = 0x003a; // ':' + static const char16_t DEFAULT_TIME_SEPARATOR = 0x003a; // ':' /** * This alternate time separator is always recognized when parsing. * @internal */ - static const UChar ALTERNATE_TIME_SEPARATOR = 0x002e; // '.' + static const char16_t ALTERNATE_TIME_SEPARATOR = 0x002e; // '.' /** * Gets the time separator string. For example: ":". @@ -566,7 +567,7 @@ class U_I18N_API DateFormatSymbols U_FINAL : public UObject { * @return the non-localized date-time pattern characters * @stable ICU 2.0 */ - static const UChar * U_EXPORT2 getPatternUChars(void); + static const char16_t * U_EXPORT2 getPatternUChars(void); /** * Gets localized date-time pattern characters. For example: 'u', 't', etc. @@ -977,7 +978,7 @@ class U_I18N_API DateFormatSymbols U_FINAL : public UObject { * Returns the date format field index of the pattern character c, * or UDAT_FIELD_COUNT if c is not a pattern character. */ - static UDateFormatField U_EXPORT2 getPatternCharIndex(UChar c); + static UDateFormatField U_EXPORT2 getPatternCharIndex(char16_t c); /** * Returns TRUE if f (with its pattern character repeated count times) is a numeric field. @@ -987,7 +988,7 @@ class U_I18N_API DateFormatSymbols U_FINAL : public UObject { /** * Returns TRUE if c (repeated count times) is the pattern character for a numeric field. */ - static UBool U_EXPORT2 isNumericPatternChar(UChar c, int32_t count); + static UBool U_EXPORT2 isNumericPatternChar(char16_t c, int32_t count); public: #ifndef U_HIDE_INTERNAL_API /** diff --git a/deps/icu-small/source/i18n/unicode/dtitvfmt.h b/deps/icu-small/source/i18n/unicode/dtitvfmt.h index 68360b87dffaf5..5eaa559d0eaf48 100644 --- a/deps/icu-small/source/i18n/unicode/dtitvfmt.h +++ b/deps/icu-small/source/i18n/unicode/dtitvfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************************** * Copyright (C) 2008-2016, International Business Machines Corporation and @@ -996,7 +996,7 @@ class U_I18N_API DateIntervalFormat : public Format { // from calendar field to pattern letter - static const UChar fgCalendarFieldToPatternLetter[]; + static const char16_t fgCalendarFieldToPatternLetter[]; /** diff --git a/deps/icu-small/source/i18n/unicode/dtitvinf.h b/deps/icu-small/source/i18n/unicode/dtitvinf.h index b31061e16aff10..e537bed0c9fa22 100644 --- a/deps/icu-small/source/i18n/unicode/dtitvinf.h +++ b/deps/icu-small/source/i18n/unicode/dtitvinf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/dtptngen.h b/deps/icu-small/source/i18n/unicode/dtptngen.h index fd617ce3cdcbfb..6fd5f5fd308a35 100644 --- a/deps/icu-small/source/i18n/unicode/dtptngen.h +++ b/deps/icu-small/source/i18n/unicode/dtptngen.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -27,6 +27,7 @@ U_NAMESPACE_BEGIN */ +class CharString; class Hashtable; class FormatParser; class DateTimeMatcher; @@ -517,7 +518,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { DateTimeMatcher *skipMatcher; Hashtable *fAvailableFormatKeyHash; UnicodeString emptyString; - UChar fDefaultHourFormatChar; + char16_t fDefaultHourFormatChar; int32_t fAllowedHourFormats[7]; // Actually an array of AllowedHourFormat enum type, ending with UNKNOWN. diff --git a/deps/icu-small/source/i18n/unicode/dtrule.h b/deps/icu-small/source/i18n/unicode/dtrule.h index 32d230ea778244..24dfc69de1df22 100644 --- a/deps/icu-small/source/i18n/unicode/dtrule.h +++ b/deps/icu-small/source/i18n/unicode/dtrule.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/fieldpos.h b/deps/icu-small/source/i18n/unicode/fieldpos.h index 6091941106e87d..78561a4de7d8b1 100644 --- a/deps/icu-small/source/i18n/unicode/fieldpos.h +++ b/deps/icu-small/source/i18n/unicode/fieldpos.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/fmtable.h b/deps/icu-small/source/i18n/unicode/fmtable.h index ac5daba893646f..766a71969deadc 100644 --- a/deps/icu-small/source/i18n/unicode/fmtable.h +++ b/deps/icu-small/source/i18n/unicode/fmtable.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/format.h b/deps/icu-small/source/i18n/unicode/format.h index 1484e9f00edf6d..e64cc1c6eb39b4 100644 --- a/deps/icu-small/source/i18n/unicode/format.h +++ b/deps/icu-small/source/i18n/unicode/format.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/fpositer.h b/deps/icu-small/source/i18n/unicode/fpositer.h index 694a1d8770d019..898b66ceea50a8 100644 --- a/deps/icu-small/source/i18n/unicode/fpositer.h +++ b/deps/icu-small/source/i18n/unicode/fpositer.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/gender.h b/deps/icu-small/source/i18n/unicode/gender.h index 02948951843c10..467b64ec5ebad0 100644 --- a/deps/icu-small/source/i18n/unicode/gender.h +++ b/deps/icu-small/source/i18n/unicode/gender.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/gregocal.h b/deps/icu-small/source/i18n/unicode/gregocal.h index 60ba0cc6acf6f4..1d881e0be76067 100644 --- a/deps/icu-small/source/i18n/unicode/gregocal.h +++ b/deps/icu-small/source/i18n/unicode/gregocal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 1997-2013, International Business Machines Corporation and others. diff --git a/deps/icu-small/source/i18n/unicode/measfmt.h b/deps/icu-small/source/i18n/unicode/measfmt.h index 866d7d3227cae7..dcd4f423430a05 100644 --- a/deps/icu-small/source/i18n/unicode/measfmt.h +++ b/deps/icu-small/source/i18n/unicode/measfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/measunit.h b/deps/icu-small/source/i18n/unicode/measunit.h index 9810b91194616b..1cb97ed549a121 100644 --- a/deps/icu-small/source/i18n/unicode/measunit.h +++ b/deps/icu-small/source/i18n/unicode/measunit.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -345,35 +345,29 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createKarat(UErrorCode &status); -#ifndef U_HIDE_DRAFT_API /** * Returns unit of concentr: milligram-per-deciliter. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 57 + * @stable ICU 57 */ static MeasureUnit *createMilligramPerDeciliter(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ -#ifndef U_HIDE_DRAFT_API /** * Returns unit of concentr: millimole-per-liter. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 57 + * @stable ICU 57 */ static MeasureUnit *createMillimolePerLiter(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ -#ifndef U_HIDE_DRAFT_API /** * Returns unit of concentr: part-per-million. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 57 + * @stable ICU 57 */ static MeasureUnit *createPartPerMillion(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of consumption: liter-per-100kilometers. @@ -399,55 +393,21 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createMilePerGallon(UErrorCode &status); -#ifndef U_HIDE_DRAFT_API /** * Returns unit of consumption: mile-per-gallon-imperial. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 57 + * @stable ICU 57 */ static MeasureUnit *createMilePerGallonImperial(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ - -#ifndef U_HIDE_DRAFT_API - /** - * Returns unit of coordinate: east. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @draft ICU 58 - */ - static MeasureUnit *createEast(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ -#ifndef U_HIDE_DRAFT_API - /** - * Returns unit of coordinate: north. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @draft ICU 58 + /* + * The following were draft ICU 58, but have been withdrawn: + * static MeasureUnit *createEast(UErrorCode &status); + * static MeasureUnit *createNorth(UErrorCode &status); + * static MeasureUnit *createSouth(UErrorCode &status); + * static MeasureUnit *createWest(UErrorCode &status); */ - static MeasureUnit *createNorth(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ - -#ifndef U_HIDE_DRAFT_API - /** - * Returns unit of coordinate: south. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @draft ICU 58 - */ - static MeasureUnit *createSouth(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ - -#ifndef U_HIDE_DRAFT_API - /** - * Returns unit of coordinate: west. - * Caller owns returned value and must free it. - * @param status ICU error code. - * @draft ICU 58 - */ - static MeasureUnit *createWest(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of digital: bit. @@ -873,6 +833,16 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createPicometer(UErrorCode &status); +#ifndef U_HIDE_DRAFT_API + /** + * Returns unit of length: point. + * Caller owns returned value and must free it. + * @param status ICU error code. + * @draft ICU 59 + */ + static MeasureUnit *createPoint(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ + /** * Returns unit of length: yard. * Caller owns returned value and must free it. @@ -1249,15 +1219,13 @@ class U_I18N_API MeasureUnit: public UObject { */ static MeasureUnit *createGallon(UErrorCode &status); -#ifndef U_HIDE_DRAFT_API /** * Returns unit of volume: gallon-imperial. * Caller owns returned value and must free it. * @param status ICU error code. - * @draft ICU 57 + * @stable ICU 57 */ static MeasureUnit *createGallonImperial(UErrorCode &status); -#endif /* U_HIDE_DRAFT_API */ /** * Returns unit of volume: hectoliter. diff --git a/deps/icu-small/source/i18n/unicode/measure.h b/deps/icu-small/source/i18n/unicode/measure.h index 719bc6bc8f6054..71438d5c856b78 100644 --- a/deps/icu-small/source/i18n/unicode/measure.h +++ b/deps/icu-small/source/i18n/unicode/measure.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/msgfmt.h b/deps/icu-small/source/i18n/unicode/msgfmt.h index 1a9973872d627d..fef80107747bf8 100644 --- a/deps/icu-small/source/i18n/unicode/msgfmt.h +++ b/deps/icu-small/source/i18n/unicode/msgfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2007-2013, International Business Machines Corporation and @@ -939,7 +939,7 @@ class U_I18N_API MessageFormat : public Format { * @return the index of the list which matches the keyword s. */ static int32_t findKeyword( const UnicodeString& s, - const UChar * const *list); + const char16_t * const *list); /** * Thin wrapper around the format(... AppendableWrapper ...) variant. diff --git a/deps/icu-small/source/i18n/unicode/numfmt.h b/deps/icu-small/source/i18n/unicode/numfmt.h index 9e3d5d34ec4cca..7147204a7cbd8c 100644 --- a/deps/icu-small/source/i18n/unicode/numfmt.h +++ b/deps/icu-small/source/i18n/unicode/numfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -931,7 +931,7 @@ class U_I18N_API NumberFormat : public Format { * @param ec input-output error code * @stable ICU 3.0 */ - virtual void setCurrency(const UChar* theCurrency, UErrorCode& ec); + virtual void setCurrency(const char16_t* theCurrency, UErrorCode& ec); /** * Gets the currency used to display currency @@ -940,7 +940,7 @@ class U_I18N_API NumberFormat : public Format { * the currency in use, or a pointer to the empty string. * @stable ICU 2.6 */ - const UChar* getCurrency() const; + const char16_t* getCurrency() const; /** * Set a particular UDisplayContext value in the formatter, such as @@ -1018,7 +1018,7 @@ class U_I18N_API NumberFormat : public Format { * have a capacity of at least 4 * @internal */ - virtual void getEffectiveCurrency(UChar* result, UErrorCode& ec) const; + virtual void getEffectiveCurrency(char16_t* result, UErrorCode& ec) const; #ifndef U_HIDE_INTERNAL_API /** @@ -1065,7 +1065,7 @@ class U_I18N_API NumberFormat : public Format { UBool fLenient; // TRUE => lenient parse is enabled // ISO currency code - UChar fCurrency[4]; + char16_t fCurrency[4]; UDisplayContext fCapitalizationContext; diff --git a/deps/icu-small/source/i18n/unicode/numsys.h b/deps/icu-small/source/i18n/unicode/numsys.h index da181551c272d0..5f527212783ccd 100644 --- a/deps/icu-small/source/i18n/unicode/numsys.h +++ b/deps/icu-small/source/i18n/unicode/numsys.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -193,7 +193,7 @@ class U_I18N_API NumberingSystem : public UObject { void setAlgorithmic(UBool algorithmic); - void setDesc(UnicodeString desc); + void setDesc(const UnicodeString &desc); void setName(const char* name); diff --git a/deps/icu-small/source/i18n/unicode/plurfmt.h b/deps/icu-small/source/i18n/unicode/plurfmt.h index b10e4179b6bab0..9a83e52550c540 100644 --- a/deps/icu-small/source/i18n/unicode/plurfmt.h +++ b/deps/icu-small/source/i18n/unicode/plurfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/plurrule.h b/deps/icu-small/source/i18n/unicode/plurrule.h index 146e6bea831f09..a14f392b7a2e52 100644 --- a/deps/icu-small/source/i18n/unicode/plurrule.h +++ b/deps/icu-small/source/i18n/unicode/plurrule.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -29,6 +29,9 @@ #include "unicode/format.h" #include "unicode/upluralrules.h" +#ifndef U_HIDE_INTERNAL_API +#include "unicode/numfmt.h" +#endif /* U_HIDE_INTERNAL_API */ /** * Value returned by PluralRules::getUniqueKeywordValue() when there is no @@ -345,6 +348,22 @@ class U_I18N_API PluralRules : public UObject { UnicodeString select(double number) const; #ifndef U_HIDE_INTERNAL_API + /** + * Given a number and a format, returns the keyword of the first applicable + * rule for this PluralRules object. + * Note: This internal preview interface may be removed in the future if + * an architecturally cleaner solution reaches stable status. + * @param obj The numeric object for which the rule should be determined. + * @param fmt The NumberFormat specifying how the number will be formatted + * (this can affect the plural form, e.g. "1 dollar" vs "1.0 dollars"). + * @param status Input/output parameter. If at entry this indicates a + * failure status, the method returns immediately; otherwise + * this is set to indicate the outcome of the call. + * @return The keyword of the selected rule. Undefined in the case of an error. + * @internal ICU 59 technology preview, may be removed in the future + */ + UnicodeString select(const Formattable& obj, const NumberFormat& fmt, UErrorCode& status) const; + /** * @internal */ diff --git a/deps/icu-small/source/i18n/unicode/rbnf.h b/deps/icu-small/source/i18n/unicode/rbnf.h index 14230f8982d2ef..b4cbb0673249b4 100644 --- a/deps/icu-small/source/i18n/unicode/rbnf.h +++ b/deps/icu-small/source/i18n/unicode/rbnf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -866,6 +866,52 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { FieldPosition& pos, UErrorCode& status) const; +protected: + /** + * Format a decimal number. + * The number is a DigitList wrapper onto a floating point decimal number. + * The default implementation in NumberFormat converts the decimal number + * to a double and formats that. Subclasses of NumberFormat that want + * to specifically handle big decimal numbers must override this method. + * class DecimalFormat does so. + * + * @param number The number, a DigitList format Decimal Floating Point. + * @param appendTo Output parameter to receive result. + * Result is appended to existing contents. + * @param posIter On return, can be used to iterate over positions + * of fields generated by this format call. + * @param status Output param filled with success/failure status. + * @return Reference to 'appendTo' parameter. + * @internal + */ + virtual UnicodeString& format(const DigitList &number, + UnicodeString& appendTo, + FieldPositionIterator* posIter, + UErrorCode& status) const; + + /** + * Format a decimal number. + * The number is a DigitList wrapper onto a floating point decimal number. + * The default implementation in NumberFormat converts the decimal number + * to a double and formats that. Subclasses of NumberFormat that want + * to specifically handle big decimal numbers must override this method. + * class DecimalFormat does so. + * + * @param number The number, a DigitList format Decimal Floating Point. + * @param appendTo Output parameter to receive result. + * Result is appended to existing contents. + * @param pos On input: an alignment field, if desired. + * On output: the offsets of the alignment field. + * @param status Output param filled with success/failure status. + * @return Reference to 'appendTo' parameter. + * @internal + */ + virtual UnicodeString& format(const DigitList &number, + UnicodeString& appendTo, + FieldPosition& pos, + UErrorCode& status) const; +public: + using NumberFormat::parse; /** @@ -1031,7 +1077,8 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { NFRule * initializeDefaultNaNRule(UErrorCode &status); const NFRule * getDefaultNaNRule() const; PluralFormat *createPluralFormat(UPluralType pluralType, const UnicodeString &pattern, UErrorCode& status) const; - UnicodeString& adjustForCapitalizationContext(int32_t startPos, UnicodeString& currentResult) const; + UnicodeString& adjustForCapitalizationContext(int32_t startPos, UnicodeString& currentResult, UErrorCode& status) const; + UnicodeString& format(int64_t number, NFRuleSet *ruleSet, UnicodeString& toAppendTo, UErrorCode& status) const; private: NFRuleSet **ruleSets; diff --git a/deps/icu-small/source/i18n/unicode/rbtz.h b/deps/icu-small/source/i18n/unicode/rbtz.h index 20de34bb1743dc..542a7c140cda2b 100644 --- a/deps/icu-small/source/i18n/unicode/rbtz.h +++ b/deps/icu-small/source/i18n/unicode/rbtz.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/regex.h b/deps/icu-small/source/i18n/unicode/regex.h index 96c64874a4cf43..7a68039fe80ab1 100644 --- a/deps/icu-small/source/i18n/unicode/regex.h +++ b/deps/icu-small/source/i18n/unicode/regex.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: regex.h -* encoding: US-ASCII +* encoding: UTF-8 * indentation:4 * * created on: 2002oct22 @@ -350,17 +350,17 @@ class U_I18N_API RegexPattern U_FINAL : public UObject { private: /** * Cause a compilation error if an application accidentally attempts to - * create a matcher with a (UChar *) string as input rather than + * create a matcher with a (char16_t *) string as input rather than * a UnicodeString. Avoids a dangling reference to a temporary string. *

    - * To efficiently work with UChar *strings, wrap the data in a UnicodeString + * To efficiently work with char16_t *strings, wrap the data in a UnicodeString * using one of the aliasing constructors, such as - * UnicodeString(UBool isTerminated, const UChar *text, int32_t textLength); + * UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength); * or in a UText, using - * utext_openUChars(UText *ut, const UChar *text, int64_t textLength, UErrorCode *status); + * utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status); * */ - RegexMatcher *matcher(const UChar *input, + RegexMatcher *matcher(const char16_t *input, UErrorCode &status) const; public: @@ -748,17 +748,17 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { private: /** * Cause a compilation error if an application accidentally attempts to - * create a matcher with a (UChar *) string as input rather than + * create a matcher with a (char16_t *) string as input rather than * a UnicodeString. Avoids a dangling reference to a temporary string. *

    - * To efficiently work with UChar *strings, wrap the data in a UnicodeString + * To efficiently work with char16_t *strings, wrap the data in a UnicodeString * using one of the aliasing constructors, such as - * UnicodeString(UBool isTerminated, const UChar *text, int32_t textLength); + * UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength); * or in a UText, using - * utext_openUChars(UText *ut, const UChar *text, int64_t textLength, UErrorCode *status); + * utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status); * */ - RegexMatcher(const UnicodeString ®exp, const UChar *input, + RegexMatcher(const UnicodeString ®exp, const char16_t *input, uint32_t flags, UErrorCode &status); public: @@ -1156,17 +1156,17 @@ class U_I18N_API RegexMatcher U_FINAL : public UObject { private: /** * Cause a compilation error if an application accidentally attempts to - * reset a matcher with a (UChar *) string as input rather than + * reset a matcher with a (char16_t *) string as input rather than * a UnicodeString. Avoids a dangling reference to a temporary string. *

    - * To efficiently work with UChar *strings, wrap the data in a UnicodeString + * To efficiently work with char16_t *strings, wrap the data in a UnicodeString * using one of the aliasing constructors, such as - * UnicodeString(UBool isTerminated, const UChar *text, int32_t textLength); + * UnicodeString(UBool isTerminated, const char16_t *text, int32_t textLength); * or in a UText, using - * utext_openUChars(UText *ut, const UChar *text, int64_t textLength, UErrorCode *status); + * utext_openUChars(UText *ut, const char16_t *text, int64_t textLength, UErrorCode *status); * */ - RegexMatcher &reset(const UChar *input); + RegexMatcher &reset(const char16_t *input); public: /** diff --git a/deps/icu-small/source/i18n/unicode/region.h b/deps/icu-small/source/i18n/unicode/region.h index 47829944a3bfaf..667c4051f0eb74 100644 --- a/deps/icu-small/source/i18n/unicode/region.h +++ b/deps/icu-small/source/i18n/unicode/region.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/reldatefmt.h b/deps/icu-small/source/i18n/unicode/reldatefmt.h index 8e659e2bc83b1a..abd43522c3a965 100644 --- a/deps/icu-small/source/i18n/unicode/reldatefmt.h +++ b/deps/icu-small/source/i18n/unicode/reldatefmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** @@ -230,6 +230,7 @@ typedef enum UDateDirection { U_NAMESPACE_BEGIN +class BreakIterator; class RelativeDateTimeCacheData; class SharedNumberFormat; class SharedPluralRules; @@ -414,7 +415,6 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { UnicodeString& appendTo, UErrorCode& status) const; -#ifndef U_HIDE_DRAFT_API /** * Format a combination of URelativeDateTimeUnit and numeric offset * using a numeric style, e.g. "1 week ago", "in 1 week", @@ -430,7 +430,7 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * appended. * @param status ICU error code returned here. * @return appendTo - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString& formatNumeric( double offset, @@ -453,14 +453,13 @@ class U_I18N_API RelativeDateTimeFormatter : public UObject { * appended. * @param status ICU error code returned here. * @return appendTo - * @draft ICU 57 + * @stable ICU 57 */ UnicodeString& format( double offset, URelativeDateTimeUnit unit, UnicodeString& appendTo, UErrorCode& status) const; -#endif /* U_HIDE_DRAFT_API */ /** * Combines a relative date string and a time string in this object's diff --git a/deps/icu-small/source/i18n/unicode/scientificnumberformatter.h b/deps/icu-small/source/i18n/unicode/scientificnumberformatter.h index 0b34755dc2858b..30edee7ecce289 100644 --- a/deps/icu-small/source/i18n/unicode/scientificnumberformatter.h +++ b/deps/icu-small/source/i18n/unicode/scientificnumberformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/search.h b/deps/icu-small/source/i18n/unicode/search.h index 35a05526236db7..12dd5c77278f67 100644 --- a/deps/icu-small/source/i18n/unicode/search.h +++ b/deps/icu-small/source/i18n/unicode/search.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/selfmt.h b/deps/icu-small/source/i18n/unicode/selfmt.h index 37a8f2b82192fc..08e9d444ee9715 100755 --- a/deps/icu-small/source/i18n/unicode/selfmt.h +++ b/deps/icu-small/source/i18n/unicode/selfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: diff --git a/deps/icu-small/source/i18n/unicode/simpletz.h b/deps/icu-small/source/i18n/unicode/simpletz.h index 7e41a4ab8a4849..1b23ab79d11383 100644 --- a/deps/icu-small/source/i18n/unicode/simpletz.h +++ b/deps/icu-small/source/i18n/unicode/simpletz.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/smpdtfmt.h b/deps/icu-small/source/i18n/unicode/smpdtfmt.h index e6cf28d22be00d..4733e759aa705f 100644 --- a/deps/icu-small/source/i18n/unicode/smpdtfmt.h +++ b/deps/icu-small/source/i18n/unicode/smpdtfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 1997-2016, International Business Machines Corporation and @@ -1170,7 +1170,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @param field The UDateFormatField to get * @stable ICU 54 */ - const NumberFormat * getNumberFormatForField(UChar field) const; + const NumberFormat * getNumberFormatForField(char16_t field) const; #ifndef U_HIDE_INTERNAL_API /** @@ -1262,7 +1262,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * succeeds. */ void subFormat(UnicodeString &appendTo, - UChar ch, + char16_t ch, int32_t count, UDisplayContext capitalizationContext, int32_t fieldNum, @@ -1294,7 +1294,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * Return true if the given format character, occuring count * times, represents a numeric field. */ - static UBool isNumeric(UChar formatChar, int32_t count); + static UBool isNumeric(char16_t formatChar, int32_t count); /** * Returns TRUE if the patternOffset is at the start of a numeric field. @@ -1412,7 +1412,7 @@ class U_I18N_API SimpleDateFormat: public DateFormat { * @return the new start position if matching succeeded; a negative number * indicating matching failure, otherwise. */ - int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count, + int32_t subParse(const UnicodeString& text, int32_t& start, char16_t ch, int32_t count, UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal, int32_t patLoc, MessageFormat * numericLeapMonthFormatter, UTimeZoneFormatTimeType *tzTimeType, SimpleDateFormatMutableNFs &mutableNFs, int32_t *dayPeriod=NULL) const; @@ -1523,12 +1523,12 @@ class U_I18N_API SimpleDateFormat: public DateFormat { /** * Map calendar field letter into calendar field level. */ - static int32_t getLevelFromChar(UChar ch); + static int32_t getLevelFromChar(char16_t ch); /** * Tell if a character can be used to define a field in a format string. */ - static UBool isSyntaxChar(UChar ch); + static UBool isSyntaxChar(char16_t ch); /** * The formatting pattern for this formatter. diff --git a/deps/icu-small/source/i18n/unicode/sortkey.h b/deps/icu-small/source/i18n/unicode/sortkey.h index 6f1543da4003d9..6895be7a2b0ee4 100644 --- a/deps/icu-small/source/i18n/unicode/sortkey.h +++ b/deps/icu-small/source/i18n/unicode/sortkey.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/stsearch.h b/deps/icu-small/source/i18n/unicode/stsearch.h index 1cae53d12859de..46bc51b30e2346 100644 --- a/deps/icu-small/source/i18n/unicode/stsearch.h +++ b/deps/icu-small/source/i18n/unicode/stsearch.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/tblcoll.h b/deps/icu-small/source/i18n/unicode/tblcoll.h index c48ea38c130a2f..24ba213b41eacc 100644 --- a/deps/icu-small/source/i18n/unicode/tblcoll.h +++ b/deps/icu-small/source/i18n/unicode/tblcoll.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -308,8 +308,8 @@ class U_I18N_API RuleBasedCollator : public Collator { * than target * @stable ICU 2.6 */ - virtual UCollationResult compare(const UChar* source, int32_t sourceLength, - const UChar* target, int32_t targetLength, + virtual UCollationResult compare(const char16_t* source, int32_t sourceLength, + const char16_t* target, int32_t targetLength, UErrorCode &status) const; /** @@ -377,7 +377,7 @@ class U_I18N_API RuleBasedCollator : public Collator { * @see CollationKey * @stable ICU 2.0 */ - virtual CollationKey& getCollationKey(const UChar *source, + virtual CollationKey& getCollationKey(const char16_t *source, int32_t sourceLength, CollationKey& key, UErrorCode& status) const; @@ -552,7 +552,7 @@ class U_I18N_API RuleBasedCollator : public Collator { * the top of one of the supported reordering groups, * and it must not be beyond the last of those groups. * See setMaxVariable(). - * @param varTop one or more (if contraction) UChars to which the variable top should be set + * @param varTop one or more (if contraction) char16_ts to which the variable top should be set * @param len length of variable top string. If -1 it is considered to be zero terminated. * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
    * U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction
    @@ -561,7 +561,7 @@ class U_I18N_API RuleBasedCollator : public Collator { * @return variable top primary weight * @deprecated ICU 53 Call setMaxVariable() instead. */ - virtual uint32_t setVariableTop(const UChar *varTop, int32_t len, UErrorCode &status); + virtual uint32_t setVariableTop(const char16_t *varTop, int32_t len, UErrorCode &status); /** * Sets the variable top to the primary weight of the specified string. @@ -570,7 +570,7 @@ class U_I18N_API RuleBasedCollator : public Collator { * the top of one of the supported reordering groups, * and it must not be beyond the last of those groups. * See setMaxVariable(). - * @param varTop a UnicodeString size 1 or more (if contraction) of UChars to which the variable top should be set + * @param varTop a UnicodeString size 1 or more (if contraction) of char16_ts to which the variable top should be set * @param status error code. If error code is set, the return value is undefined. Errors set by this function are:
    * U_CE_NOT_FOUND_ERROR if more than one character was passed and there is no such contraction
    * U_ILLEGAL_ARGUMENT_ERROR if the variable top is beyond @@ -631,7 +631,7 @@ class U_I18N_API RuleBasedCollator : public Collator { int32_t resultLength) const; /** - * Get the sort key as an array of bytes from a UChar buffer. + * Get the sort key as an array of bytes from a char16_t buffer. * * Note that sort keys are often less efficient than simply doing comparison. * For more details, see the ICU User Guide. @@ -646,7 +646,7 @@ class U_I18N_API RuleBasedCollator : public Collator { * @return Number of bytes needed for storing the sort key * @stable ICU 2.2 */ - virtual int32_t getSortKey(const UChar *source, int32_t sourceLength, + virtual int32_t getSortKey(const char16_t *source, int32_t sourceLength, uint8_t *result, int32_t resultLength) const; /** @@ -821,17 +821,17 @@ class U_I18N_API RuleBasedCollator : public Collator { void adoptTailoring(CollationTailoring *t, UErrorCode &errorCode); // Both lengths must be <0 or else both must be >=0. - UCollationResult doCompare(const UChar *left, int32_t leftLength, - const UChar *right, int32_t rightLength, + UCollationResult doCompare(const char16_t *left, int32_t leftLength, + const char16_t *right, int32_t rightLength, UErrorCode &errorCode) const; UCollationResult doCompare(const uint8_t *left, int32_t leftLength, const uint8_t *right, int32_t rightLength, UErrorCode &errorCode) const; - void writeSortKey(const UChar *s, int32_t length, + void writeSortKey(const char16_t *s, int32_t length, SortKeyByteSink &sink, UErrorCode &errorCode) const; - void writeIdenticalLevel(const UChar *s, const UChar *limit, + void writeIdenticalLevel(const char16_t *s, const char16_t *limit, SortKeyByteSink &sink, UErrorCode &errorCode) const; const CollationSettings &getDefaultSettings() const; diff --git a/deps/icu-small/source/i18n/unicode/timezone.h b/deps/icu-small/source/i18n/unicode/timezone.h index 58c84d062bebad..d4cd7cb36d326a 100644 --- a/deps/icu-small/source/i18n/unicode/timezone.h +++ b/deps/icu-small/source/i18n/unicode/timezone.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /************************************************************************* * Copyright (c) 1997-2016, International Business Machines Corporation @@ -863,7 +863,7 @@ class U_I18N_API TimeZone : public UObject { * @param id zone id string * @return the pointer of the ID resource, or NULL. */ - static const UChar* findID(const UnicodeString& id); + static const char16_t* findID(const UnicodeString& id); /** * Resolve a link in Olson tzdata. When the given id is known and it's not a link, @@ -873,7 +873,7 @@ class U_I18N_API TimeZone : public UObject { * @param id zone id string * @return the dereferenced zone or NULL */ - static const UChar* dereferOlsonLink(const UnicodeString& id); + static const char16_t* dereferOlsonLink(const UnicodeString& id); /** * Returns the region code associated with the given zone, @@ -881,7 +881,7 @@ class U_I18N_API TimeZone : public UObject { * @param id zone id string * @return the region associated with the given zone */ - static const UChar* getRegion(const UnicodeString& id); + static const char16_t* getRegion(const UnicodeString& id); public: #ifndef U_HIDE_INTERNAL_API @@ -893,7 +893,7 @@ class U_I18N_API TimeZone : public UObject { * @return the region associated with the given zone * @internal */ - static const UChar* getRegion(const UnicodeString& id, UErrorCode& status); + static const char16_t* getRegion(const UnicodeString& id, UErrorCode& status); #endif /* U_HIDE_INTERNAL_API */ private: diff --git a/deps/icu-small/source/i18n/unicode/tmunit.h b/deps/icu-small/source/i18n/unicode/tmunit.h index a19a1f3c1760c3..fa59f104734baa 100644 --- a/deps/icu-small/source/i18n/unicode/tmunit.h +++ b/deps/icu-small/source/i18n/unicode/tmunit.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/tmutamt.h b/deps/icu-small/source/i18n/unicode/tmutamt.h index 887150121fe545..1717b7605fb3c5 100644 --- a/deps/icu-small/source/i18n/unicode/tmutamt.h +++ b/deps/icu-small/source/i18n/unicode/tmutamt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/tmutfmt.h b/deps/icu-small/source/i18n/unicode/tmutfmt.h index b90d4a096d71bb..8f245859a622ba 100644 --- a/deps/icu-small/source/i18n/unicode/tmutfmt.h +++ b/deps/icu-small/source/i18n/unicode/tmutfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/translit.h b/deps/icu-small/source/i18n/unicode/translit.h index 1e49bfb9697a62..dc31d97bc63643 100644 --- a/deps/icu-small/source/i18n/unicode/translit.h +++ b/deps/icu-small/source/i18n/unicode/translit.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -1319,7 +1319,7 @@ inline int32_t Transliterator::getMaximumContextLength(void) const { inline void Transliterator::setID(const UnicodeString& id) { ID = id; // NUL-terminate the ID string, which is a non-aliased copy. - ID.append((UChar)0); + ID.append((char16_t)0); ID.truncate(ID.length()-1); } diff --git a/deps/icu-small/source/i18n/unicode/tzfmt.h b/deps/icu-small/source/i18n/unicode/tzfmt.h index dd86f1b48c9619..633cd8dc6987ce 100644 --- a/deps/icu-small/source/i18n/unicode/tzfmt.h +++ b/deps/icu-small/source/i18n/unicode/tzfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -942,7 +942,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @param parsedLen the parsed length, or 0 on failure. * @return the parsed offset in milliseconds. */ - int32_t parseDefaultOffsetFields(const UnicodeString& text, int32_t start, UChar separator, + int32_t parseDefaultOffsetFields(const UnicodeString& text, int32_t start, char16_t separator, int32_t& parsedLen) const; /** @@ -982,7 +982,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @param maxFields The maximum fields * @return The offset string */ - static UnicodeString& formatOffsetWithAsciiDigits(int32_t offset, UChar sep, + static UnicodeString& formatOffsetWithAsciiDigits(int32_t offset, char16_t sep, OffsetFields minFields, OffsetFields maxFields, UnicodeString& result); /** @@ -1012,7 +1012,7 @@ class U_I18N_API TimeZoneFormat : public Format { * @param maxFields The maximum Fields to be parsed * @return Parsed offset, 0 or positive number. */ - static int32_t parseAsciiOffsetFields(const UnicodeString& text, ParsePosition& pos, UChar sep, + static int32_t parseAsciiOffsetFields(const UnicodeString& text, ParsePosition& pos, char16_t sep, OffsetFields minFields, OffsetFields maxFields); /** diff --git a/deps/icu-small/source/i18n/unicode/tznames.h b/deps/icu-small/source/i18n/unicode/tznames.h index 8861a7d026b89b..60f0e5e4a1a975 100644 --- a/deps/icu-small/source/i18n/unicode/tznames.h +++ b/deps/icu-small/source/i18n/unicode/tznames.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/tzrule.h b/deps/icu-small/source/i18n/unicode/tzrule.h index 5e020bc1a38c56..171486f1c79d2a 100644 --- a/deps/icu-small/source/i18n/unicode/tzrule.h +++ b/deps/icu-small/source/i18n/unicode/tzrule.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/tztrans.h b/deps/icu-small/source/i18n/unicode/tztrans.h index b2e09999bb9263..1276d67c312b9a 100644 --- a/deps/icu-small/source/i18n/unicode/tztrans.h +++ b/deps/icu-small/source/i18n/unicode/tztrans.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/ucal.h b/deps/icu-small/source/i18n/unicode/ucal.h index 18522f6475e15e..10d8bc52745d2b 100644 --- a/deps/icu-small/source/i18n/unicode/ucal.h +++ b/deps/icu-small/source/i18n/unicode/ucal.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -425,8 +425,8 @@ enum UCalendarDateFields { */ UCAL_IS_LEAP_MONTH, - // Do not conditionalize with #ifndef U_HIDE_DEPRECATED_API, - // it is needed for layout of Calendar, DateFormat, and other objects + /* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, + * it is needed for layout of Calendar, DateFormat, and other objects */ /** * One more than the highest normal UCalendarDateFields value. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. diff --git a/deps/icu-small/source/i18n/unicode/ucol.h b/deps/icu-small/source/i18n/unicode/ucol.h index 0b3fab90b1a05d..b5bacbfcb4734e 100644 --- a/deps/icu-small/source/i18n/unicode/ucol.h +++ b/deps/icu-small/source/i18n/unicode/ucol.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -131,7 +131,7 @@ typedef enum { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UCOL_ATTRIBUTE_VALUE_COUNT -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } UColAttributeValue; /** @@ -204,7 +204,7 @@ typedef enum { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UCOL_REORDER_CODE_LIMIT = 0x1005 -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } UColReorderCode; /** @@ -342,8 +342,8 @@ typedef enum { */ UCOL_NUMERIC_COLLATION = UCOL_STRENGTH + 2, - // Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, - // it is needed for layout of RuleBasedCollator object. + /* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, + * it is needed for layout of RuleBasedCollator object. */ /** * One more than the highest normal UColAttribute value. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. @@ -1067,7 +1067,7 @@ typedef enum { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UCOL_BOUND_VALUE_COUNT -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } UColBoundMode; /** diff --git a/deps/icu-small/source/i18n/unicode/ucoleitr.h b/deps/icu-small/source/i18n/unicode/ucoleitr.h index 89fd9e85cf79a0..1d644fc259b429 100644 --- a/deps/icu-small/source/i18n/unicode/ucoleitr.h +++ b/deps/icu-small/source/i18n/unicode/ucoleitr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/ucsdet.h b/deps/icu-small/source/i18n/unicode/ucsdet.h index a926d2f22cbbc4..7a8564f9eabe37 100644 --- a/deps/icu-small/source/i18n/unicode/ucsdet.h +++ b/deps/icu-small/source/i18n/unicode/ucsdet.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: ucsdet.h - * encoding: US-ASCII + * encoding: UTF-8 * indentation:4 * * created on: 2005Aug04 @@ -45,6 +45,10 @@ * in a single language, and a minimum of a few hundred bytes worth of plain text * in the language are needed. The detection process will attempt to * ignore html or xml style markup that could otherwise obscure the content. + *

    + * An alternative to the ICU Charset Detector is the + * Compact Encoding Detector, https://github.com/google/compact_enc_det. + * It often gives more accurate results, especially with short input samples. */ @@ -395,7 +399,7 @@ ucsdet_getDetectableCharsets(const UCharsetDetector *ucsd, UErrorCode *status); /** * Enable or disable individual charset encoding. * A name of charset encoding must be included in the names returned by - * {@link #getAllDetectableCharsets()}. + * {@link #ucsdet_getAllDetectableCharsets()}. * * @param ucsd a Charset detector. * @param encoding encoding the name of charset encoding. diff --git a/deps/icu-small/source/i18n/unicode/udat.h b/deps/icu-small/source/i18n/unicode/udat.h index cacfbe85009c23..90aff20df2a122 100644 --- a/deps/icu-small/source/i18n/unicode/udat.h +++ b/deps/icu-small/source/i18n/unicode/udat.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -763,21 +763,19 @@ typedef enum UDateFormatField { UDAT_RELATED_YEAR_FIELD = 34, #endif /* U_HIDE_INTERNAL_API */ -#ifndef U_HIDE_DRAFT_API /** * FieldPosition selector for 'b' field alignment. * Displays midnight and noon for 12am and 12pm, respectively, if available; * otherwise fall back to AM / PM. - * @draft ICU 57 + * @stable ICU 57 */ UDAT_AM_PM_MIDNIGHT_NOON_FIELD = 35, /* FieldPosition selector for 'B' field alignment. * Displays flexible day periods, such as "in the morning", if available. - * @draft ICU 57 + * @stable ICU 57 */ UDAT_FLEXIBLE_DAY_PERIOD_FIELD = 36, -#endif /* U_HIDE_DRAFT_API */ #ifndef U_HIDE_INTERNAL_API /** @@ -797,7 +795,7 @@ typedef enum UDateFormatField { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UDAT_FIELD_COUNT = 38 -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } UDateFormatField; @@ -819,7 +817,7 @@ typedef enum UDateFormatField { * of error (e.g., the input field is UDAT_FIELD_COUNT). * @stable ICU 4.4 */ -U_STABLE UCalendarDateFields U_EXPORT2 +U_CAPI UCalendarDateFields U_EXPORT2 udat_toCalendarDateField(UDateFormatField field); @@ -851,7 +849,7 @@ udat_toCalendarDateField(UDateFormatField field); * an error occurred. * @stable ICU 2.0 */ -U_STABLE UDateFormat* U_EXPORT2 +U_CAPI UDateFormat* U_EXPORT2 udat_open(UDateFormatStyle timeStyle, UDateFormatStyle dateStyle, const char *locale, @@ -868,7 +866,7 @@ udat_open(UDateFormatStyle timeStyle, * @param format The formatter to close. * @stable ICU 2.0 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_close(UDateFormat* format); @@ -902,8 +900,8 @@ typedef enum UDateFormatBooleanAttribute { */ UDAT_PARSE_MULTIPLE_PATTERNS_FOR_MATCH = 3, - // Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, - // it is needed for layout of DateFormat object. + /* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, + * it is needed for layout of DateFormat object. */ /** * One more than the highest normal UDateFormatBooleanAttribute value. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. @@ -921,7 +919,7 @@ typedef enum UDateFormatBooleanAttribute { * @return The value of attr. * @stable ICU 53 */ -U_STABLE UBool U_EXPORT2 +U_CAPI UBool U_EXPORT2 udat_getBooleanAttribute(const UDateFormat* fmt, UDateFormatBooleanAttribute attr, UErrorCode* status); /** @@ -934,7 +932,7 @@ udat_getBooleanAttribute(const UDateFormat* fmt, UDateFormatBooleanAttribute att * @param status A pointer to an UErrorCode to receive any errors * @stable ICU 53 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_setBooleanAttribute(UDateFormat *fmt, UDateFormatBooleanAttribute attr, UBool newValue, UErrorCode* status); @@ -966,7 +964,7 @@ U_NAMESPACE_END * @return A pointer to a UDateFormat identical to fmt. * @stable ICU 2.0 */ -U_STABLE UDateFormat* U_EXPORT2 +U_CAPI UDateFormat* U_EXPORT2 udat_clone(const UDateFormat *fmt, UErrorCode *status); @@ -988,7 +986,7 @@ udat_clone(const UDateFormat *fmt, * @see UFieldPosition * @stable ICU 2.0 */ -U_STABLE int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 udat_format( const UDateFormat* format, UDate dateToFormat, UChar* result, @@ -1018,7 +1016,7 @@ udat_format( const UDateFormat* format, * @see UFieldPosition * @stable ICU 55 */ -U_STABLE int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 udat_formatCalendar( const UDateFormat* format, UCalendar* calendar, UChar* result, @@ -1053,7 +1051,7 @@ udat_formatCalendar( const UDateFormat* format, * @see UFieldPositionIterator * @stable ICU 55 */ -U_STABLE int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 udat_formatForFields( const UDateFormat* format, UDate dateToFormat, UChar* result, @@ -1091,7 +1089,7 @@ udat_formatForFields( const UDateFormat* format, * @see UFieldPositionIterator * @stable ICU 55 */ -U_STABLE int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 udat_formatCalendarForFields( const UDateFormat* format, UCalendar* calendar, UChar* result, @@ -1125,7 +1123,7 @@ udat_formatCalendarForFields( const UDateFormat* format, * @see udat_format * @stable ICU 2.0 */ -U_STABLE UDate U_EXPORT2 +U_CAPI UDate U_EXPORT2 udat_parse(const UDateFormat* format, const UChar* text, int32_t textLength, @@ -1153,7 +1151,7 @@ udat_parse(const UDateFormat* format, * @see udat_format * @stable ICU 2.0 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_parseCalendar(const UDateFormat* format, UCalendar* calendar, const UChar* text, @@ -1170,7 +1168,7 @@ udat_parseCalendar(const UDateFormat* format, * @see udat_setLenient * @stable ICU 2.0 */ -U_STABLE UBool U_EXPORT2 +U_CAPI UBool U_EXPORT2 udat_isLenient(const UDateFormat* fmt); /** @@ -1182,7 +1180,7 @@ udat_isLenient(const UDateFormat* fmt); * @see dat_isLenient * @stable ICU 2.0 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_setLenient( UDateFormat* fmt, UBool isLenient); @@ -1195,7 +1193,7 @@ udat_setLenient( UDateFormat* fmt, * @see udat_setCalendar * @stable ICU 2.0 */ -U_STABLE const UCalendar* U_EXPORT2 +U_CAPI const UCalendar* U_EXPORT2 udat_getCalendar(const UDateFormat* fmt); /** @@ -1207,7 +1205,7 @@ udat_getCalendar(const UDateFormat* fmt); * @see udat_setCalendar * @stable ICU 2.0 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_setCalendar( UDateFormat* fmt, const UCalendar* calendarToSet); @@ -1220,7 +1218,7 @@ udat_setCalendar( UDateFormat* fmt, * @see udat_setNumberFormat * @stable ICU 2.0 */ -U_STABLE const UNumberFormat* U_EXPORT2 +U_CAPI const UNumberFormat* U_EXPORT2 udat_getNumberFormat(const UDateFormat* fmt); /** @@ -1232,7 +1230,7 @@ udat_getNumberFormat(const UDateFormat* fmt); * @see udat_setNumberFormatForField * @stable ICU 54 */ -U_STABLE const UNumberFormat* U_EXPORT2 +U_CAPI const UNumberFormat* U_EXPORT2 udat_getNumberFormatForField(const UDateFormat* fmt, UChar field); /** @@ -1250,7 +1248,7 @@ udat_getNumberFormatForField(const UDateFormat* fmt, UChar field); * @see udat_getNumberFormatForField * @stable ICU 54 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_adoptNumberFormatForFields( UDateFormat* fmt, const UChar* fields, UNumberFormat* numberFormatToSet, @@ -1267,7 +1265,7 @@ udat_adoptNumberFormatForFields( UDateFormat* fmt, * @see udat_setNumberFormatForField * @stable ICU 2.0 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_setNumberFormat( UDateFormat* fmt, const UNumberFormat* numberFormatToSet); /** @@ -1279,7 +1277,7 @@ udat_setNumberFormat( UDateFormat* fmt, * @see udat_getNumberFormat * @stable ICU 54 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_adoptNumberFormat( UDateFormat* fmt, UNumberFormat* numberFormatToAdopt); /** @@ -1291,7 +1289,7 @@ udat_adoptNumberFormat( UDateFormat* fmt, * @see udat_countAvailable * @stable ICU 2.0 */ -U_STABLE const char* U_EXPORT2 +U_CAPI const char* U_EXPORT2 udat_getAvailable(int32_t localeIndex); /** @@ -1302,7 +1300,7 @@ udat_getAvailable(int32_t localeIndex); * @see udat_getAvailable * @stable ICU 2.0 */ -U_STABLE int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 udat_countAvailable(void); /** @@ -1315,7 +1313,7 @@ udat_countAvailable(void); * @see udat_Set2DigitYearStart * @stable ICU 2.0 */ -U_STABLE UDate U_EXPORT2 +U_CAPI UDate U_EXPORT2 udat_get2DigitYearStart( const UDateFormat *fmt, UErrorCode *status); @@ -1329,7 +1327,7 @@ udat_get2DigitYearStart( const UDateFormat *fmt, * @see udat_Set2DigitYearStart * @stable ICU 2.0 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_set2DigitYearStart( UDateFormat *fmt, UDate d, UErrorCode *status); @@ -1346,7 +1344,7 @@ udat_set2DigitYearStart( UDateFormat *fmt, * @see udat_applyPattern * @stable ICU 2.0 */ -U_STABLE int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 udat_toPattern( const UDateFormat *fmt, UBool localized, UChar *result, @@ -1363,7 +1361,7 @@ udat_toPattern( const UDateFormat *fmt, * @see udat_toPattern * @stable ICU 2.0 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_applyPattern( UDateFormat *format, UBool localized, const UChar *pattern, @@ -1489,7 +1487,7 @@ typedef struct UDateFormatSymbols UDateFormatSymbols; * @see udat_setSymbols * @stable ICU 2.0 */ -U_STABLE int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 udat_getSymbols(const UDateFormat *fmt, UDateFormatSymbolType type, int32_t symbolIndex, @@ -1509,7 +1507,7 @@ udat_getSymbols(const UDateFormat *fmt, * @see udat_setSymbols * @stable ICU 2.0 */ -U_STABLE int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 udat_countSymbols( const UDateFormat *fmt, UDateFormatSymbolType type); @@ -1528,7 +1526,7 @@ udat_countSymbols( const UDateFormat *fmt, * @see udat_countSymbols * @stable ICU 2.0 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_setSymbols( UDateFormat *format, UDateFormatSymbolType type, int32_t symbolIndex, @@ -1545,7 +1543,7 @@ udat_setSymbols( UDateFormat *format, * @return the locale name * @stable ICU 2.8 */ -U_STABLE const char* U_EXPORT2 +U_CAPI const char* U_EXPORT2 udat_getLocaleByType(const UDateFormat *fmt, ULocDataLocaleType type, UErrorCode* status); @@ -1558,7 +1556,7 @@ udat_getLocaleByType(const UDateFormat *fmt, * @param status A pointer to an UErrorCode to receive any errors * @stable ICU 51 */ -U_DRAFT void U_EXPORT2 +U_CAPI void U_EXPORT2 udat_setContext(UDateFormat* fmt, UDisplayContext value, UErrorCode* status); /** @@ -1570,7 +1568,7 @@ udat_setContext(UDateFormat* fmt, UDisplayContext value, UErrorCode* status); * @return The UDisplayContextValue for the specified type. * @stable ICU 53 */ -U_STABLE UDisplayContext U_EXPORT2 +U_CAPI UDisplayContext U_EXPORT2 udat_getContext(const UDateFormat* fmt, UDisplayContextType type, UErrorCode* status); #ifndef U_HIDE_INTERNAL_API diff --git a/deps/icu-small/source/i18n/unicode/udateintervalformat.h b/deps/icu-small/source/i18n/unicode/udateintervalformat.h index 81bff16d6e67af..70cbadeb575597 100644 --- a/deps/icu-small/source/i18n/unicode/udateintervalformat.h +++ b/deps/icu-small/source/i18n/unicode/udateintervalformat.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/udatpg.h b/deps/icu-small/source/i18n/unicode/udatpg.h index 365d51c493c5fe..9e3bdd411490b6 100644 --- a/deps/icu-small/source/i18n/unicode/udatpg.h +++ b/deps/icu-small/source/i18n/unicode/udatpg.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: udatpg.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -86,8 +86,8 @@ typedef enum UDateTimePatternField { /** @stable ICU 3.8 */ UDATPG_ZONE_FIELD, - // Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, - // it is needed for layout of DateTimePatternGenerator object. + /* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, + * it is needed for layout of DateTimePatternGenerator object. */ /** * One more than the highest normal UDateTimePatternField value. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. diff --git a/deps/icu-small/source/i18n/unicode/ufieldpositer.h b/deps/icu-small/source/i18n/unicode/ufieldpositer.h index 8dfa3df5a409d0..3ae73b6d843974 100644 --- a/deps/icu-small/source/i18n/unicode/ufieldpositer.h +++ b/deps/icu-small/source/i18n/unicode/ufieldpositer.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/uformattable.h b/deps/icu-small/source/i18n/unicode/uformattable.h index e4683d56c35898..9ba2a36901aa83 100644 --- a/deps/icu-small/source/i18n/unicode/uformattable.h +++ b/deps/icu-small/source/i18n/unicode/uformattable.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -57,7 +57,7 @@ typedef enum UFormattableType { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UFMT_COUNT -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } UFormattableType; diff --git a/deps/icu-small/source/i18n/unicode/ugender.h b/deps/icu-small/source/i18n/unicode/ugender.h index c1e591ed28fb0e..d015a2300cf6d6 100644 --- a/deps/icu-small/source/i18n/unicode/ugender.h +++ b/deps/icu-small/source/i18n/unicode/ugender.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/ulocdata.h b/deps/icu-small/source/i18n/unicode/ulocdata.h index ecf6fdcb3f532e..de8d8539c6749a 100644 --- a/deps/icu-small/source/i18n/unicode/ulocdata.h +++ b/deps/icu-small/source/i18n/unicode/ulocdata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * * ****************************************************************************** * file name: ulocdata.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -55,7 +55,7 @@ typedef enum ULocaleDataExemplarSetType { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ ULOCDATA_ES_COUNT=4 -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } ULocaleDataExemplarSetType; /** The possible types of delimiters. @@ -76,7 +76,7 @@ typedef enum ULocaleDataDelimiterType { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ ULOCDATA_DELIMITER_COUNT = 4 -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } ULocaleDataDelimiterType; /** @@ -207,7 +207,7 @@ typedef enum UMeasurementSystem { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UMS_LIMIT -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } UMeasurementSystem; /** diff --git a/deps/icu-small/source/i18n/unicode/umsg.h b/deps/icu-small/source/i18n/unicode/umsg.h index 0beb39d5abbee0..68188206129148 100644 --- a/deps/icu-small/source/i18n/unicode/umsg.h +++ b/deps/icu-small/source/i18n/unicode/umsg.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: @@ -8,7 +8,7 @@ ******************************************************************** * * file name: umsg.h - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/unicode/unirepl.h b/deps/icu-small/source/i18n/unicode/unirepl.h index 37815a9a24cfa4..8fb25d46890d9e 100644 --- a/deps/icu-small/source/i18n/unicode/unirepl.h +++ b/deps/icu-small/source/i18n/unicode/unirepl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/unum.h b/deps/icu-small/source/i18n/unicode/unum.h index 7c652e09cf701b..5fc65486fc9374 100644 --- a/deps/icu-small/source/i18n/unicode/unum.h +++ b/deps/icu-small/source/i18n/unicode/unum.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -25,6 +25,7 @@ #include "unicode/parseerr.h" #include "unicode/uformattable.h" #include "unicode/udisplaycontext.h" +#include "unicode/ufieldpositer.h" /** * \file @@ -249,7 +250,7 @@ typedef enum UNumberFormatStyle { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UNUM_FORMAT_STYLE_COUNT=17, -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ /** * Default format @@ -326,8 +327,8 @@ enum UCurrencySpacing { /** @stable ICU 4.8 */ UNUM_CURRENCY_INSERT, - // Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, - // it is needed for layout of DecimalFormatSymbols object. + /* Do not conditionalize the following with #ifndef U_HIDE_DEPRECATED_API, + * it is needed for layout of DecimalFormatSymbols object. */ /** * One more than the highest normal UCurrencySpacing value. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. @@ -371,7 +372,7 @@ typedef enum UNumberFormatFields { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UNUM_FIELD_COUNT -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } UNumberFormatFields; @@ -553,6 +554,59 @@ unum_formatDouble( const UNumberFormat* fmt, UFieldPosition *pos, /* 0 if ignore */ UErrorCode* status); +#ifndef U_HIDE_DRAFT_API +/** +* Format a double using a UNumberFormat according to the UNumberFormat's locale, +* and initialize a UFieldPositionIterator that enumerates the subcomponents of +* the resulting string. +* +* @param format +* The formatter to use. +* @param number +* The number to format. +* @param result +* A pointer to a buffer to receive the NULL-terminated formatted +* number. If the formatted number fits into dest but cannot be +* NULL-terminated (length == resultLength) then the error code is set +* to U_STRING_NOT_TERMINATED_WARNING. If the formatted number doesn't +* fit into result then the error code is set to +* U_BUFFER_OVERFLOW_ERROR. +* @param resultLength +* The maximum size of result. +* @param fpositer +* A pointer to a UFieldPositionIterator created by {@link #ufieldpositer_open} +* (may be NULL if field position information is not needed, but in this +* case it's preferable to use {@link #unum_formatDouble}). Iteration +* information already present in the UFieldPositionIterator is deleted, +* and the iterator is reset to apply to the fields in the formatted +* string created by this function call. The field values and indexes +* returned by {@link #ufieldpositer_next} represent fields denoted by +* the UNumberFormatFields enum. Fields are not returned in a guaranteed +* order. Fields cannot overlap, but they may nest. For example, 1234 +* could format as "1,234" which might consist of a grouping separator +* field for ',' and an integer field encompassing the entire string. +* @param status +* A pointer to an UErrorCode to receive any errors +* @return +* The total buffer size needed; if greater than resultLength, the +* output was truncated. +* @see unum_formatDouble +* @see unum_parse +* @see unum_parseDouble +* @see UFieldPositionIterator +* @see UNumberFormatFields +* @draft ICU 59 +*/ +U_DRAFT int32_t U_EXPORT2 +unum_formatDoubleForFields(const UNumberFormat* format, + double number, + UChar* result, + int32_t resultLength, + UFieldPositionIterator* fpositer, + UErrorCode* status); + +#endif /* U_HIDE_DRAFT_API */ + /** * Format a decimal number using a UNumberFormat. * The number will be formatted according to the UNumberFormat's locale. @@ -1291,7 +1345,7 @@ typedef enum UNumberFormatSymbol { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UNUM_FORMAT_SYMBOL_COUNT = 28 -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } UNumberFormatSymbol; /** diff --git a/deps/icu-small/source/i18n/unicode/unumsys.h b/deps/icu-small/source/i18n/unicode/unumsys.h index 396d55d6b7699b..2c794c23d3c8a7 100644 --- a/deps/icu-small/source/i18n/unicode/unumsys.h +++ b/deps/icu-small/source/i18n/unicode/unumsys.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/deps/icu-small/source/i18n/unicode/upluralrules.h b/deps/icu-small/source/i18n/unicode/upluralrules.h index 52e34d8d25dd66..99d93a4e0517ab 100644 --- a/deps/icu-small/source/i18n/unicode/upluralrules.h +++ b/deps/icu-small/source/i18n/unicode/upluralrules.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** @@ -15,6 +15,10 @@ #if !UCONFIG_NO_FORMATTING #include "unicode/localpointer.h" +#include "unicode/uenum.h" +#ifndef U_HIDE_INTERNAL_API +#include "unicode/unum.h" +#endif /* U_HIDE_INTERNAL_API */ /** * \file @@ -60,7 +64,7 @@ enum UPluralType { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UPLURAL_TYPE_COUNT -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ }; /** * @stable ICU 50 @@ -83,7 +87,7 @@ typedef struct UPluralRules UPluralRules; /**< C typedef for struct UPluralRule * @return A UPluralRules for the specified locale, or NULL if an error occurred. * @stable ICU 4.8 */ -U_STABLE UPluralRules* U_EXPORT2 +U_CAPI UPluralRules* U_EXPORT2 uplrules_open(const char *locale, UErrorCode *status); /** @@ -95,7 +99,7 @@ uplrules_open(const char *locale, UErrorCode *status); * @return A UPluralRules for the specified locale, or NULL if an error occurred. * @stable ICU 50 */ -U_DRAFT UPluralRules* U_EXPORT2 +U_CAPI UPluralRules* U_EXPORT2 uplrules_openForType(const char *locale, UPluralType type, UErrorCode *status); /** @@ -103,7 +107,7 @@ uplrules_openForType(const char *locale, UPluralType type, UErrorCode *status); * @param uplrules The UPluralRules object to close. * @stable ICU 4.8 */ -U_STABLE void U_EXPORT2 +U_CAPI void U_EXPORT2 uplrules_close(UPluralRules *uplrules); @@ -138,12 +142,55 @@ U_NAMESPACE_END * @return The length of keyword. * @stable ICU 4.8 */ -U_STABLE int32_t U_EXPORT2 +U_CAPI int32_t U_EXPORT2 uplrules_select(const UPluralRules *uplrules, double number, UChar *keyword, int32_t capacity, UErrorCode *status); +#ifndef U_HIDE_INTERNAL_API +/** + * Given a number, returns the keyword of the first rule that applies to the + * number, according to the UPluralRules object and given the number format + * specified by the UNumberFormat object. + * Note: This internal preview interface may be removed in the future if + * an architecturally cleaner solution reaches stable status. + * @param uplrules The UPluralRules object specifying the rules. + * @param number The number for which the rule has to be determined. + * @param fmt The UNumberFormat specifying how the number will be formatted + * (this can affect the plural form, e.g. "1 dollar" vs "1.0 dollars"). + * If this is NULL, the function behaves like uplrules_select. + * @param keyword The keyword of the rule that applies to number. + * @param capacity The capacity of the keyword buffer. + * @param status A pointer to a UErrorCode to receive any errors. + * @return The length of keyword. + * @internal ICU 59 technology preview, may be removed in the future + */ +U_INTERNAL int32_t U_EXPORT2 +uplrules_selectWithFormat(const UPluralRules *uplrules, + double number, + const UNumberFormat *fmt, + UChar *keyword, int32_t capacity, + UErrorCode *status); + +#endif /* U_HIDE_INTERNAL_API */ + +#ifndef U_HIDE_DRAFT_API +/** + * Creates a string enumeration of all plural rule keywords used in this + * UPluralRules object. The rule "other" is always present by default. + * @param uplrules The UPluralRules object specifying the rules for + * a given locale. + * @param status A pointer to a UErrorCode to receive any errors. + * @return a string enumeration over plural rule keywords, or NULL + * upon error. The caller is responsible for closing the result. + * @draft ICU 59 + */ +U_DRAFT UEnumeration* U_EXPORT2 +uplrules_getKeywords(const UPluralRules *uplrules, + UErrorCode *status); +#endif /* U_HIDE_DRAFT_API */ + #endif /* #if !UCONFIG_NO_FORMATTING */ #endif diff --git a/deps/icu-small/source/i18n/unicode/uregex.h b/deps/icu-small/source/i18n/unicode/uregex.h index 7806a74afcc745..69c0eead956fc9 100644 --- a/deps/icu-small/source/i18n/unicode/uregex.h +++ b/deps/icu-small/source/i18n/unicode/uregex.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ********************************************************************** * file name: uregex.h -* encoding: US-ASCII +* encoding: UTF-8 * indentation:4 * * created on: 2004mar09 diff --git a/deps/icu-small/source/i18n/unicode/uregion.h b/deps/icu-small/source/i18n/unicode/uregion.h index b5d03691cabfe9..9d0c1e99de3864 100644 --- a/deps/icu-small/source/i18n/unicode/uregion.h +++ b/deps/icu-small/source/i18n/unicode/uregion.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** @@ -113,7 +113,7 @@ typedef enum URegionType { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ URGN_LIMIT -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } URegionType; #if !UCONFIG_NO_FORMATTING diff --git a/deps/icu-small/source/i18n/unicode/ureldatefmt.h b/deps/icu-small/source/i18n/unicode/ureldatefmt.h index fad8ffd9e184b8..0eff80a16b2086 100644 --- a/deps/icu-small/source/i18n/unicode/ureldatefmt.h +++ b/deps/icu-small/source/i18n/unicode/ureldatefmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** @@ -34,7 +34,7 @@ * for determining which unit to use, such as deciding between "in 7 days" * and "in 1 week". * - * @draft ICU 57 + * @stable ICU 57 */ /** @@ -66,104 +66,103 @@ typedef enum UDateRelativeDateTimeFormatterStyle { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UDAT_STYLE_COUNT -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } UDateRelativeDateTimeFormatterStyle; -#ifndef U_HIDE_DRAFT_API /** * Represents the unit for formatting a relative date. e.g "in 5 days" * or "next year" - * @draft ICU 57 + * @stable ICU 57 */ typedef enum URelativeDateTimeUnit { /** * Specifies that relative unit is year, e.g. "last year", * "in 5 years". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_YEAR, /** * Specifies that relative unit is quarter, e.g. "last quarter", * "in 5 quarters". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_QUARTER, /** * Specifies that relative unit is month, e.g. "last month", * "in 5 months". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_MONTH, /** * Specifies that relative unit is week, e.g. "last week", * "in 5 weeks". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_WEEK, /** * Specifies that relative unit is day, e.g. "yesterday", * "in 5 days". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_DAY, /** * Specifies that relative unit is hour, e.g. "1 hour ago", * "in 5 hours". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_HOUR, /** * Specifies that relative unit is minute, e.g. "1 minute ago", * "in 5 minutes". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_MINUTE, /** * Specifies that relative unit is second, e.g. "1 second ago", * "in 5 seconds". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_SECOND, /** * Specifies that relative unit is Sunday, e.g. "last Sunday", * "this Sunday", "next Sunday", "in 5 Sundays". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_SUNDAY, /** * Specifies that relative unit is Monday, e.g. "last Monday", * "this Monday", "next Monday", "in 5 Mondays". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_MONDAY, /** * Specifies that relative unit is Tuesday, e.g. "last Tuesday", * "this Tuesday", "next Tuesday", "in 5 Tuesdays". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_TUESDAY, /** * Specifies that relative unit is Wednesday, e.g. "last Wednesday", * "this Wednesday", "next Wednesday", "in 5 Wednesdays". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_WEDNESDAY, /** * Specifies that relative unit is Thursday, e.g. "last Thursday", * "this Thursday", "next Thursday", "in 5 Thursdays". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_THURSDAY, /** * Specifies that relative unit is Friday, e.g. "last Friday", * "this Friday", "next Friday", "in 5 Fridays". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_FRIDAY, /** * Specifies that relative unit is Saturday, e.g. "last Saturday", * "this Saturday", "next Saturday", "in 5 Saturdays". - * @draft ICU 57 + * @stable ICU 57 */ UDAT_REL_UNIT_SATURDAY, #ifndef U_HIDE_DEPRECATED_API @@ -172,18 +171,15 @@ typedef enum URelativeDateTimeUnit { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ UDAT_REL_UNIT_COUNT -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } URelativeDateTimeUnit; -#endif /* U_HIDE_DRAFT_API */ - -#ifndef U_HIDE_DRAFT_API /** * Opaque URelativeDateTimeFormatter object for use in C programs. - * @draft ICU 57 + * @stable ICU 57 */ struct URelativeDateTimeFormatter; -typedef struct URelativeDateTimeFormatter URelativeDateTimeFormatter; /**< C typedef for struct URelativeDateTimeFormatter. @draft ICU 57 */ +typedef struct URelativeDateTimeFormatter URelativeDateTimeFormatter; /**< C typedef for struct URelativeDateTimeFormatter. @stable ICU 57 */ /** @@ -216,9 +212,9 @@ typedef struct URelativeDateTimeFormatter URelativeDateTimeFormatter; /**< C ty * @return * A pointer to a URelativeDateTimeFormatter object for the specified locale, * or NULL if an error occurred. - * @draft ICU 57 + * @stable ICU 57 */ -U_DRAFT URelativeDateTimeFormatter* U_EXPORT2 +U_STABLE URelativeDateTimeFormatter* U_EXPORT2 ureldatefmt_open( const char* locale, UNumberFormat* nfToAdopt, UDateRelativeDateTimeFormatterStyle width, @@ -229,9 +225,9 @@ ureldatefmt_open( const char* locale, * Close a URelativeDateTimeFormatter object. Once closed it may no longer be used. * @param reldatefmt * The URelativeDateTimeFormatter object to close. - * @draft ICU 57 + * @stable ICU 57 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 ureldatefmt_close(URelativeDateTimeFormatter *reldatefmt); #if U_SHOW_CPLUSPLUS_API @@ -245,7 +241,7 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 57 + * @stable ICU 57 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalURelativeDateTimeFormatterPointer, URelativeDateTimeFormatter, ureldatefmt_close); @@ -279,9 +275,9 @@ U_NAMESPACE_END * @return * The length of the formatted result; may be greater * than resultCapacity, in which case an error is returned. - * @draft ICU 57 + * @stable ICU 57 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ureldatefmt_formatNumeric( const URelativeDateTimeFormatter* reldatefmt, double offset, URelativeDateTimeUnit unit, @@ -315,9 +311,9 @@ ureldatefmt_formatNumeric( const URelativeDateTimeFormatter* reldatefmt, * @return * The length of the formatted result; may be greater * than resultCapacity, in which case an error is returned. - * @draft ICU 57 + * @stable ICU 57 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt, double offset, URelativeDateTimeUnit unit, @@ -352,9 +348,9 @@ ureldatefmt_format( const URelativeDateTimeFormatter* reldatefmt, * @return * The length of the formatted result; may be greater than resultCapacity, * in which case an error is returned. - * @draft ICU 57 + * @stable ICU 57 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 ureldatefmt_combineDateAndTime( const URelativeDateTimeFormatter* reldatefmt, const UChar * relativeDateString, int32_t relativeDateStringLen, @@ -364,8 +360,6 @@ ureldatefmt_combineDateAndTime( const URelativeDateTimeFormatter* reldatefmt, int32_t resultCapacity, UErrorCode* status ); -#endif /* U_HIDE_DRAFT_API */ - #endif /* !UCONFIG_NO_FORMATTING && !UCONFIG_NO_BREAK_ITERATION */ #endif diff --git a/deps/icu-small/source/i18n/unicode/usearch.h b/deps/icu-small/source/i18n/unicode/usearch.h index dcdb7fe420b814..600f9142b45021 100644 --- a/deps/icu-small/source/i18n/unicode/usearch.h +++ b/deps/icu-small/source/i18n/unicode/usearch.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -196,7 +196,7 @@ typedef enum { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ USEARCH_ATTRIBUTE_COUNT = 3 -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } USearchAttribute; /** @@ -272,7 +272,7 @@ typedef enum { * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ USEARCH_ATTRIBUTE_VALUE_COUNT -#endif // U_HIDE_DEPRECATED_API +#endif /* U_HIDE_DEPRECATED_API */ } USearchAttributeValue; /* open and close ------------------------------------------------------ */ diff --git a/deps/icu-small/source/i18n/unicode/uspoof.h b/deps/icu-small/source/i18n/unicode/uspoof.h index 40b73380c57d52..6c2ac5e109fd55 100644 --- a/deps/icu-small/source/i18n/unicode/uspoof.h +++ b/deps/icu-small/source/i18n/unicode/uspoof.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** @@ -6,7 +6,7 @@ * and others. All Rights Reserved. *************************************************************************** * file name: uspoof.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/unicode/utmscale.h b/deps/icu-small/source/i18n/unicode/utmscale.h index 6b4b389ac8ad24..2392c6414e4f8b 100644 --- a/deps/icu-small/source/i18n/unicode/utmscale.h +++ b/deps/icu-small/source/i18n/unicode/utmscale.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -283,10 +283,14 @@ typedef enum UDateTimeScale { */ UDTS_UNIX_MICROSECONDS_TIME, +#ifndef U_HIDE_DEPRECATED_API /** * The first unused time scale value. The limit of this enum + * @deprecated ICU 59 The numeric value may change over time, see ICU ticket #12420. */ UDTS_MAX_SCALE +#endif /* U_HIDE_DEPRECATED_API */ + } UDateTimeScale; /** @@ -423,12 +427,15 @@ typedef enum UTimeScaleValue { #endif /* U_HIDE_INTERNAL_API */ +#ifndef U_HIDE_DEPRECATED_API /** * The number of time scale values, in other words limit of this enum. * * @see utmscale_getTimeScaleValue + * @deprecated ICU 59 The numeric value may change over time, see ICU ticket #12420. */ UTSV_MAX_SCALE_VALUE=11 +#endif /* U_HIDE_DEPRECATED_API */ } UTimeScaleValue; diff --git a/deps/icu-small/source/i18n/unicode/utrans.h b/deps/icu-small/source/i18n/unicode/utrans.h index 661ee5d3850860..a4158726ca08c6 100644 --- a/deps/icu-small/source/i18n/unicode/utrans.h +++ b/deps/icu-small/source/i18n/unicode/utrans.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unicode/vtzone.h b/deps/icu-small/source/i18n/unicode/vtzone.h index 1682a3d526ccfb..5d161778682313 100644 --- a/deps/icu-small/source/i18n/unicode/vtzone.h +++ b/deps/icu-small/source/i18n/unicode/vtzone.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/unum.cpp b/deps/icu-small/source/i18n/unum.cpp index 0e224858db0a1d..95c744c128de78 100644 --- a/deps/icu-small/source/i18n/unum.cpp +++ b/deps/icu-small/source/i18n/unum.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -247,6 +247,33 @@ unum_formatDouble( const UNumberFormat* fmt, return res.extract(result, resultLength, *status); } +U_CAPI int32_t U_EXPORT2 +unum_formatDoubleForFields(const UNumberFormat* format, + double number, + UChar* result, + int32_t resultLength, + UFieldPositionIterator* fpositer, + UErrorCode* status) +{ + if (U_FAILURE(*status)) + return -1; + + if (result == NULL ? resultLength != 0 : resultLength < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return -1; + } + + UnicodeString res; + if (result != NULL) { + // NULL destination for pure preflighting: empty dummy string + // otherwise, alias the destination buffer + res.setTo(result, 0, resultLength); + } + + ((const NumberFormat*)format)->format(number, res, (FieldPositionIterator*)fpositer, *status); + + return res.extract(result, resultLength, *status); +} U_CAPI int32_t U_EXPORT2 unum_formatDecimal(const UNumberFormat* fmt, diff --git a/deps/icu-small/source/i18n/unumsys.cpp b/deps/icu-small/source/i18n/unumsys.cpp index f643e342ebc762..4a0d0fa3b6f347 100644 --- a/deps/icu-small/source/i18n/unumsys.cpp +++ b/deps/icu-small/source/i18n/unumsys.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/deps/icu-small/source/i18n/upluralrules.cpp b/deps/icu-small/source/i18n/upluralrules.cpp index 5e1eebf53d5dc2..24e74e3ee223f5 100644 --- a/deps/icu-small/source/i18n/upluralrules.cpp +++ b/deps/icu-small/source/i18n/upluralrules.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** @@ -15,6 +15,8 @@ #include "unicode/plurrule.h" #include "unicode/locid.h" #include "unicode/unistr.h" +#include "unicode/unum.h" +#include "unicode/numfmt.h" U_NAMESPACE_USE @@ -54,5 +56,48 @@ uplrules_select(const UPluralRules *uplrules, return result.extract(keyword, capacity, *status); } +U_CAPI int32_t U_EXPORT2 +uplrules_selectWithFormat(const UPluralRules *uplrules, + double number, + const UNumberFormat *fmt, + UChar *keyword, int32_t capacity, + UErrorCode *status) +{ + if (U_FAILURE(*status)) { + return 0; + } + const PluralRules* plrules = reinterpret_cast(uplrules); + const NumberFormat* nf = reinterpret_cast(fmt); + if (plrules == NULL || nf == NULL || ((keyword == NULL)? capacity != 0 : capacity < 0)) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + Formattable obj(number); + UnicodeString result = plrules->select(obj, *nf, *status); + return result.extract(keyword, capacity, *status); +} + +U_CAPI UEnumeration* U_EXPORT2 +uplrules_getKeywords(const UPluralRules *uplrules, + UErrorCode *status) +{ + if (U_FAILURE(*status)) { + return NULL; + } + const PluralRules* plrules = reinterpret_cast(uplrules); + if (plrules == NULL) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + StringEnumeration *senum = plrules->getKeywords(*status); + if (U_FAILURE(*status)) { + return NULL; + } + if (senum == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + return NULL; + } + return uenum_openFromStringEnumeration(senum, status); +} #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/uregex.cpp b/deps/icu-small/source/i18n/uregex.cpp index 03e2586c5f74f4..a5dee6241dce24 100644 --- a/deps/icu-small/source/i18n/uregex.cpp +++ b/deps/icu-small/source/i18n/uregex.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/uregexc.cpp b/deps/icu-small/source/i18n/uregexc.cpp index 6d0dc2062c6037..8674b4f17f5876 100644 --- a/deps/icu-small/source/i18n/uregexc.cpp +++ b/deps/icu-small/source/i18n/uregexc.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/uregion.cpp b/deps/icu-small/source/i18n/uregion.cpp index 8e079ec593318c..79a623730c9487 100644 --- a/deps/icu-small/source/i18n/uregion.cpp +++ b/deps/icu-small/source/i18n/uregion.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ***************************************************************************************** diff --git a/deps/icu-small/source/i18n/usearch.cpp b/deps/icu-small/source/i18n/usearch.cpp index 5e1617eb3e8d8d..e1e6c28e2bc985 100644 --- a/deps/icu-small/source/i18n/usearch.cpp +++ b/deps/icu-small/source/i18n/usearch.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/uspoof.cpp b/deps/icu-small/source/i18n/uspoof.cpp index d81b5b2149a206..1cb726e0b0c60e 100644 --- a/deps/icu-small/source/i18n/uspoof.cpp +++ b/deps/icu-small/source/i18n/uspoof.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** @@ -6,7 +6,7 @@ * and others. All Rights Reserved. *************************************************************************** * file name: uspoof.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/uspoof_build.cpp b/deps/icu-small/source/i18n/uspoof_build.cpp index d676fe997741b3..7d2440e5af65e8 100644 --- a/deps/icu-small/source/i18n/uspoof_build.cpp +++ b/deps/icu-small/source/i18n/uspoof_build.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** @@ -6,7 +6,7 @@ * and others. All Rights Reserved. *************************************************************************** * file name: uspoof_build.cpp - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/uspoof_conf.cpp b/deps/icu-small/source/i18n/uspoof_conf.cpp index 6edd1fa3f3cd66..e5d9bb633835b2 100644 --- a/deps/icu-small/source/i18n/uspoof_conf.cpp +++ b/deps/icu-small/source/i18n/uspoof_conf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: uspoof_conf.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/uspoof_conf.h b/deps/icu-small/source/i18n/uspoof_conf.h index 72cd028104fdad..ee8aa2678e90c5 100644 --- a/deps/icu-small/source/i18n/uspoof_conf.h +++ b/deps/icu-small/source/i18n/uspoof_conf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * file name: uspoof_conf.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/i18n/uspoof_impl.cpp b/deps/icu-small/source/i18n/uspoof_impl.cpp index fba742c3ffc013..0ca85c00a98a8d 100644 --- a/deps/icu-small/source/i18n/uspoof_impl.cpp +++ b/deps/icu-small/source/i18n/uspoof_impl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/uspoof_impl.h b/deps/icu-small/source/i18n/uspoof_impl.h index 62480e39e89791..1184b8d9060662 100644 --- a/deps/icu-small/source/i18n/uspoof_impl.h +++ b/deps/icu-small/source/i18n/uspoof_impl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* *************************************************************************** diff --git a/deps/icu-small/source/i18n/usrchimp.h b/deps/icu-small/source/i18n/usrchimp.h index e6693d16b7ac51..5438417e7e60aa 100644 --- a/deps/icu-small/source/i18n/usrchimp.h +++ b/deps/icu-small/source/i18n/usrchimp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/i18n/utf16collationiterator.cpp b/deps/icu-small/source/i18n/utf16collationiterator.cpp index 733729fae79ece..7598b0ee521f6e 100644 --- a/deps/icu-small/source/i18n/utf16collationiterator.cpp +++ b/deps/icu-small/source/i18n/utf16collationiterator.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/utf16collationiterator.h b/deps/icu-small/source/i18n/utf16collationiterator.h index 505ab810d37921..fd3a05e9efab0b 100644 --- a/deps/icu-small/source/i18n/utf16collationiterator.h +++ b/deps/icu-small/source/i18n/utf16collationiterator.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/utf8collationiterator.cpp b/deps/icu-small/source/i18n/utf8collationiterator.cpp index 0a0205e7b31cc2..85d4b76b08e00b 100644 --- a/deps/icu-small/source/i18n/utf8collationiterator.cpp +++ b/deps/icu-small/source/i18n/utf8collationiterator.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/utf8collationiterator.h b/deps/icu-small/source/i18n/utf8collationiterator.h index 8deb5ea395b7af..9a3ec45aeb41eb 100644 --- a/deps/icu-small/source/i18n/utf8collationiterator.h +++ b/deps/icu-small/source/i18n/utf8collationiterator.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/utmscale.c b/deps/icu-small/source/i18n/utmscale.cpp similarity index 99% rename from deps/icu-small/source/i18n/utmscale.c rename to deps/icu-small/source/i18n/utmscale.cpp index 6868b9db2261a1..461985937acca4 100644 --- a/deps/icu-small/source/i18n/utmscale.c +++ b/deps/icu-small/source/i18n/utmscale.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/utrans.cpp b/deps/icu-small/source/i18n/utrans.cpp index aed817ce2636e7..62fd630d9e83d3 100644 --- a/deps/icu-small/source/i18n/utrans.cpp +++ b/deps/icu-small/source/i18n/utrans.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/valueformatter.cpp b/deps/icu-small/source/i18n/valueformatter.cpp index 45b08f60b653ac..e769f369d48609 100644 --- a/deps/icu-small/source/i18n/valueformatter.cpp +++ b/deps/icu-small/source/i18n/valueformatter.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/valueformatter.h b/deps/icu-small/source/i18n/valueformatter.h index da2dd1b33787e5..836a05b17c5209 100644 --- a/deps/icu-small/source/i18n/valueformatter.h +++ b/deps/icu-small/source/i18n/valueformatter.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/visibledigits.cpp b/deps/icu-small/source/i18n/visibledigits.cpp index 1fea3504dfeee8..03cfc68d255380 100644 --- a/deps/icu-small/source/i18n/visibledigits.cpp +++ b/deps/icu-small/source/i18n/visibledigits.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* * Copyright (C) 2016, International Business Machines diff --git a/deps/icu-small/source/i18n/visibledigits.h b/deps/icu-small/source/i18n/visibledigits.h index cd18239a56601a..03c8013e393374 100644 --- a/deps/icu-small/source/i18n/visibledigits.h +++ b/deps/icu-small/source/i18n/visibledigits.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* * Copyright (C) 2015, International Business Machines diff --git a/deps/icu-small/source/i18n/vtzone.cpp b/deps/icu-small/source/i18n/vtzone.cpp index ba5f3bc0d7bde2..85b42b0e06639d 100644 --- a/deps/icu-small/source/i18n/vtzone.cpp +++ b/deps/icu-small/source/i18n/vtzone.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -358,7 +358,7 @@ static void millisToOffset(int32_t millis, UnicodeString& str) { /* * Create a default TZNAME from TZID */ -static void getDefaultTZName(const UnicodeString tzid, UBool isDST, UnicodeString& zonename) { +static void getDefaultTZName(const UnicodeString &tzid, UBool isDST, UnicodeString& zonename) { zonename = tzid; if (isDST) { zonename += UNICODE_STRING_SIMPLE("(DST)"); diff --git a/deps/icu-small/source/i18n/vzone.cpp b/deps/icu-small/source/i18n/vzone.cpp index 7ee95e4edecd6a..6db3ba04c581f7 100644 --- a/deps/icu-small/source/i18n/vzone.cpp +++ b/deps/icu-small/source/i18n/vzone.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/vzone.h b/deps/icu-small/source/i18n/vzone.h index 22a41b4e37b478..700687e0cb76ab 100644 --- a/deps/icu-small/source/i18n/vzone.h +++ b/deps/icu-small/source/i18n/vzone.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/windtfmt.cpp b/deps/icu-small/source/i18n/windtfmt.cpp index 20ce338bb4b88a..70a9364a0cf3cc 100644 --- a/deps/icu-small/source/i18n/windtfmt.cpp +++ b/deps/icu-small/source/i18n/windtfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -13,7 +13,7 @@ #include "unicode/utypes.h" -#if U_PLATFORM_HAS_WIN32_API +#if U_PLATFORM_USES_ONLY_WIN32_API #if !UCONFIG_NO_FORMATTING @@ -35,7 +35,9 @@ #include "windtfmt.h" #include "wintzimpl.h" +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE @@ -92,12 +94,83 @@ UnicodeString* Win32DateFormat::getTimeDateFormat(const Calendar *cal, const Loc return result; } +// TODO: This is copied in both winnmfmt.cpp and windtfmt.cpp, but really should +// be factored out into a common helper for both. +static UErrorCode GetEquivalentWindowsLocaleName(const Locale& locale, UnicodeString** buffer) +{ + UErrorCode status = U_ZERO_ERROR; + char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; + + // Convert from names like "en_CA" and "de_DE@collation=phonebook" to "en-CA" and "de-DE-u-co-phonebk". + int32_t length = uloc_toLanguageTag(locale.getName(), asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &status); + + if (U_SUCCESS(status)) + { + // Need it to be UTF-16, not 8-bit + // TODO: This seems like a good thing for a helper + wchar_t bcp47Tag[LOCALE_NAME_MAX_LENGTH] = {}; + int32_t i; + for (i = 0; i < UPRV_LENGTHOF(bcp47Tag); i++) + { + if (asciiBCP47Tag[i] == '\0') + { + break; + } + else + { + // normally just copy the character + bcp47Tag[i] = static_cast(asciiBCP47Tag[i]); + } + } + + // Ensure it's null terminated + if (i < (UPRV_LENGTHOF(bcp47Tag) - 1)) + { + bcp47Tag[i] = L'\0'; + } + else + { + // Ran out of room. + bcp47Tag[UPRV_LENGTHOF(bcp47Tag) - 1] = L'\0'; + } + + + wchar_t windowsLocaleName[LOCALE_NAME_MAX_LENGTH] = {}; + + // Note: On Windows versions below 10, there is no support for locale name aliases. + // This means that it will fail for locales where ICU has a completely different + // name (like ku vs ckb), and it will also not work for alternate sort locale + // names like "de-DE-u-co-phonebk". + + // TODO: We could add some sort of exception table for cases like ku vs ckb. + + int length = ResolveLocaleName(bcp47Tag, windowsLocaleName, UPRV_LENGTHOF(windowsLocaleName)); + + if (length > 0) + { + *buffer = new UnicodeString(windowsLocaleName); + } + else + { + status = U_UNSUPPORTED_ERROR; + } + } + return status; +} + // TODO: Range-check timeStyle, dateStyle Win32DateFormat::Win32DateFormat(DateFormat::EStyle timeStyle, DateFormat::EStyle dateStyle, const Locale &locale, UErrorCode &status) - : DateFormat(), fDateTimeMsg(NULL), fTimeStyle(timeStyle), fDateStyle(dateStyle), fLocale(locale), fZoneID() + : DateFormat(), fDateTimeMsg(NULL), fTimeStyle(timeStyle), fDateStyle(dateStyle), fLocale(locale), fZoneID(), fWindowsLocaleName(nullptr) { if (U_SUCCESS(status)) { - fLCID = locale.getLCID(); + GetEquivalentWindowsLocaleName(locale, &fWindowsLocaleName); + // Note: In the previous code, it would look up the LCID for the locale, and if + // the locale was not recognized then it would get an LCID of 0, which is a + // synonym for LOCALE_USER_DEFAULT on Windows. + // If the above method fails, then fWindowsLocaleName will remain as nullptr, and + // then we will pass nullptr to API GetLocaleInfoEx, which is the same as passing + // LOCALE_USER_DEFAULT. + fTZI = NEW_ARRAY(TIME_ZONE_INFORMATION, 1); uprv_memset(fTZI, 0, sizeof(TIME_ZONE_INFORMATION)); adoptCalendar(Calendar::createInstance(locale, status)); @@ -115,6 +188,7 @@ Win32DateFormat::~Win32DateFormat() // delete fCalendar; uprv_free(fTZI); delete fDateTimeMsg; + delete fWindowsLocaleName; } Win32DateFormat &Win32DateFormat::operator=(const Win32DateFormat &other) @@ -128,13 +202,14 @@ Win32DateFormat &Win32DateFormat::operator=(const Win32DateFormat &other) this->fTimeStyle = other.fTimeStyle; this->fDateStyle = other.fDateStyle; this->fLocale = other.fLocale; - this->fLCID = other.fLCID; // this->fCalendar = other.fCalendar->clone(); this->fZoneID = other.fZoneID; this->fTZI = NEW_ARRAY(TIME_ZONE_INFORMATION, 1); *this->fTZI = *other.fTZI; + this->fWindowsLocaleName = other.fWindowsLocaleName == NULL ? NULL : new UnicodeString(*other.fWindowsLocaleName); + return *this; } @@ -231,18 +306,25 @@ static const DWORD dfFlags[] = {DATE_LONGDATE, DATE_LONGDATE, DATE_SHORTDATE, DA void Win32DateFormat::formatDate(const SYSTEMTIME *st, UnicodeString &appendTo) const { - int result; + int result=0; wchar_t stackBuffer[STACK_BUFFER_SIZE]; wchar_t *buffer = stackBuffer; + const wchar_t *localeName = nullptr; + + if (fWindowsLocaleName != nullptr) + { + localeName = reinterpret_cast(toOldUCharPtr(fWindowsLocaleName->getTerminatedBuffer())); + } - result = GetDateFormatW(fLCID, dfFlags[fDateStyle - kDateOffset], st, NULL, buffer, STACK_BUFFER_SIZE); + result = GetDateFormatEx(localeName, dfFlags[fDateStyle - kDateOffset], st, NULL, buffer, STACK_BUFFER_SIZE, NULL); if (result == 0) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { - int newLength = GetDateFormatW(fLCID, dfFlags[fDateStyle - kDateOffset], st, NULL, NULL, 0); + int newLength = GetDateFormatEx(localeName, dfFlags[fDateStyle - kDateOffset], st, NULL, NULL, 0, NULL); buffer = NEW_ARRAY(wchar_t, newLength); - GetDateFormatW(fLCID, dfFlags[fDateStyle - kDateOffset], st, NULL, buffer, newLength); + + GetDateFormatEx(localeName, dfFlags[fDateStyle - kDateOffset], st, NULL, buffer, newLength, NULL); } } @@ -260,15 +342,22 @@ void Win32DateFormat::formatTime(const SYSTEMTIME *st, UnicodeString &appendTo) int result; wchar_t stackBuffer[STACK_BUFFER_SIZE]; wchar_t *buffer = stackBuffer; + const wchar_t *localeName = nullptr; - result = GetTimeFormatW(fLCID, tfFlags[fTimeStyle], st, NULL, buffer, STACK_BUFFER_SIZE); + if (fWindowsLocaleName != nullptr) + { + localeName = reinterpret_cast(toOldUCharPtr(fWindowsLocaleName->getTerminatedBuffer())); + } + + result = GetTimeFormatEx(localeName, tfFlags[fTimeStyle], st, NULL, buffer, STACK_BUFFER_SIZE); if (result == 0) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { - int newLength = GetTimeFormatW(fLCID, tfFlags[fTimeStyle], st, NULL, NULL, 0); + int newLength = GetTimeFormatEx(localeName, tfFlags[fTimeStyle], st, NULL, NULL, 0); buffer = NEW_ARRAY(wchar_t, newLength); - GetDateFormatW(fLCID, tfFlags[fTimeStyle], st, NULL, buffer, newLength); + + GetTimeFormatEx(localeName, tfFlags[fTimeStyle], st, NULL, buffer, newLength); } } @@ -314,4 +403,4 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ -#endif // U_PLATFORM_HAS_WIN32_API +#endif // U_PLATFORM_USES_ONLY_WIN32_API diff --git a/deps/icu-small/source/i18n/windtfmt.h b/deps/icu-small/source/i18n/windtfmt.h index a8221943706ef0..43b6fe6dba269e 100644 --- a/deps/icu-small/source/i18n/windtfmt.h +++ b/deps/icu-small/source/i18n/windtfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -16,7 +16,7 @@ #include "unicode/utypes.h" -#if U_PLATFORM_HAS_WIN32_API +#if U_PLATFORM_USES_ONLY_WIN32_API #if !UCONFIG_NO_FORMATTING @@ -95,7 +95,7 @@ class Win32DateFormat : public DateFormat *

          * .   Base* polymorphic_pointer = createPolymorphicObject();
          * .   if (polymorphic_pointer->getDynamicClassID() ==
    -     * .       erived::getStaticClassID()) ...
    +     * .       derived::getStaticClassID()) ...
          * 
    * @return The class ID for all objects of this class. */ @@ -124,15 +124,16 @@ class Win32DateFormat : public DateFormat DateFormat::EStyle fTimeStyle; DateFormat::EStyle fDateStyle; Locale fLocale; - int32_t fLCID; UnicodeString fZoneID; TIME_ZONE_INFORMATION *fTZI; + + UnicodeString* fWindowsLocaleName; // Stores the equivalent Windows locale name. }; U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ -#endif // U_PLATFORM_HAS_WIN32_API +#endif // U_PLATFORM_USES_ONLY_WIN32_API #endif // __WINDTFMT diff --git a/deps/icu-small/source/i18n/winnmfmt.cpp b/deps/icu-small/source/i18n/winnmfmt.cpp index d7e98723bb271d..40b4b647763abb 100644 --- a/deps/icu-small/source/i18n/winnmfmt.cpp +++ b/deps/icu-small/source/i18n/winnmfmt.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -28,7 +28,9 @@ #include "uassert.h" #include "locmap.h" +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE @@ -58,43 +60,43 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(Win32NumberFormat) * end in ";0" then the return value should be multiplied by 10. * (e.g. "3" => 30, "3;2" => 320) */ -static UINT getGrouping(const char *grouping) +static UINT getGrouping(const wchar_t *grouping) { UINT g = 0; - const char *s; + const wchar_t *s; - for (s = grouping; *s != '\0'; s += 1) { - if (*s > '0' && *s < '9') { - g = g * 10 + (*s - '0'); - } else if (*s != ';') { + for (s = grouping; *s != L'\0'; s += 1) { + if (*s > L'0' && *s < L'9') { + g = g * 10 + (*s - L'0'); + } else if (*s != L';') { break; } } - if (*s != '0') { + if (*s != L'0') { g *= 10; } return g; } -static void getNumberFormat(NUMBERFMTW *fmt, int32_t lcid) +static void getNumberFormat(NUMBERFMTW *fmt, const wchar_t *windowsLocaleName) { - char buf[10]; + wchar_t buf[10]; - GetLocaleInfoW(lcid, LOCALE_RETURN_NUMBER|LOCALE_IDIGITS, (LPWSTR) &fmt->NumDigits, sizeof(UINT)); - GetLocaleInfoW(lcid, LOCALE_RETURN_NUMBER|LOCALE_ILZERO, (LPWSTR) &fmt->LeadingZero, sizeof(UINT)); + GetLocaleInfoEx(windowsLocaleName, LOCALE_RETURN_NUMBER|LOCALE_IDIGITS, (LPWSTR) &fmt->NumDigits, sizeof(UINT)); + GetLocaleInfoEx(windowsLocaleName, LOCALE_RETURN_NUMBER|LOCALE_ILZERO, (LPWSTR) &fmt->LeadingZero, sizeof(UINT)); - GetLocaleInfoA(lcid, LOCALE_SGROUPING, buf, 10); + GetLocaleInfoEx(windowsLocaleName, LOCALE_SGROUPING, (LPWSTR)buf, 10); fmt->Grouping = getGrouping(buf); fmt->lpDecimalSep = NEW_ARRAY(wchar_t, 6); - GetLocaleInfoW(lcid, LOCALE_SDECIMAL, fmt->lpDecimalSep, 6); + GetLocaleInfoEx(windowsLocaleName, LOCALE_SDECIMAL, fmt->lpDecimalSep, 6); fmt->lpThousandSep = NEW_ARRAY(wchar_t, 6); - GetLocaleInfoW(lcid, LOCALE_STHOUSAND, fmt->lpThousandSep, 6); + GetLocaleInfoEx(windowsLocaleName, LOCALE_STHOUSAND, fmt->lpThousandSep, 6); - GetLocaleInfoW(lcid, LOCALE_RETURN_NUMBER|LOCALE_INEGNUMBER, (LPWSTR) &fmt->NegativeOrder, sizeof(UINT)); + GetLocaleInfoEx(windowsLocaleName, LOCALE_RETURN_NUMBER|LOCALE_INEGNUMBER, (LPWSTR) &fmt->NegativeOrder, sizeof(UINT)); } static void freeNumberFormat(NUMBERFMTW *fmt) @@ -105,27 +107,27 @@ static void freeNumberFormat(NUMBERFMTW *fmt) } } -static void getCurrencyFormat(CURRENCYFMTW *fmt, int32_t lcid) +static void getCurrencyFormat(CURRENCYFMTW *fmt, const wchar_t *windowsLocaleName) { - char buf[10]; + wchar_t buf[10]; - GetLocaleInfoW(lcid, LOCALE_RETURN_NUMBER|LOCALE_ICURRDIGITS, (LPWSTR) &fmt->NumDigits, sizeof(UINT)); - GetLocaleInfoW(lcid, LOCALE_RETURN_NUMBER|LOCALE_ILZERO, (LPWSTR) &fmt->LeadingZero, sizeof(UINT)); + GetLocaleInfoEx(windowsLocaleName, LOCALE_RETURN_NUMBER|LOCALE_ICURRDIGITS, (LPWSTR) &fmt->NumDigits, sizeof(UINT)); + GetLocaleInfoEx(windowsLocaleName, LOCALE_RETURN_NUMBER|LOCALE_ILZERO, (LPWSTR) &fmt->LeadingZero, sizeof(UINT)); - GetLocaleInfoA(lcid, LOCALE_SMONGROUPING, buf, sizeof(buf)); + GetLocaleInfoEx(windowsLocaleName, LOCALE_SMONGROUPING, (LPWSTR)buf, sizeof(buf)); fmt->Grouping = getGrouping(buf); fmt->lpDecimalSep = NEW_ARRAY(wchar_t, 6); - GetLocaleInfoW(lcid, LOCALE_SMONDECIMALSEP, fmt->lpDecimalSep, 6); + GetLocaleInfoEx(windowsLocaleName, LOCALE_SMONDECIMALSEP, fmt->lpDecimalSep, 6); fmt->lpThousandSep = NEW_ARRAY(wchar_t, 6); - GetLocaleInfoW(lcid, LOCALE_SMONTHOUSANDSEP, fmt->lpThousandSep, 6); + GetLocaleInfoEx(windowsLocaleName, LOCALE_SMONTHOUSANDSEP, fmt->lpThousandSep, 6); - GetLocaleInfoW(lcid, LOCALE_RETURN_NUMBER|LOCALE_INEGCURR, (LPWSTR) &fmt->NegativeOrder, sizeof(UINT)); - GetLocaleInfoW(lcid, LOCALE_RETURN_NUMBER|LOCALE_ICURRENCY, (LPWSTR) &fmt->PositiveOrder, sizeof(UINT)); + GetLocaleInfoEx(windowsLocaleName, LOCALE_RETURN_NUMBER|LOCALE_INEGCURR, (LPWSTR) &fmt->NegativeOrder, sizeof(UINT)); + GetLocaleInfoEx(windowsLocaleName, LOCALE_RETURN_NUMBER|LOCALE_ICURRENCY, (LPWSTR) &fmt->PositiveOrder, sizeof(UINT)); fmt->lpCurrencySymbol = NEW_ARRAY(wchar_t, 8); - GetLocaleInfoW(lcid, LOCALE_SCURRENCY, (LPWSTR) fmt->lpCurrencySymbol, 8); + GetLocaleInfoEx(windowsLocaleName, LOCALE_SCURRENCY, (LPWSTR) fmt->lpCurrencySymbol, 8); } static void freeCurrencyFormat(CURRENCYFMTW *fmt) @@ -137,12 +139,84 @@ static void freeCurrencyFormat(CURRENCYFMTW *fmt) } } +// TODO: This is copied in both winnmfmt.cpp and windtfmt.cpp, but really should +// be factored out into a common helper for both. +static UErrorCode GetEquivalentWindowsLocaleName(const Locale& locale, UnicodeString** buffer) +{ + UErrorCode status = U_ZERO_ERROR; + char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; + + // Convert from names like "en_CA" and "de_DE@collation=phonebook" to "en-CA" and "de-DE-u-co-phonebk". + int32_t length = uloc_toLanguageTag(locale.getName(), asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &status); + + if (U_SUCCESS(status)) + { + // Need it to be UTF-16, not 8-bit + // TODO: This seems like a good thing for a helper + wchar_t bcp47Tag[LOCALE_NAME_MAX_LENGTH] = {}; + int32_t i; + for (i = 0; i < UPRV_LENGTHOF(bcp47Tag); i++) + { + if (asciiBCP47Tag[i] == '\0') + { + break; + } + else + { + // normally just copy the character + bcp47Tag[i] = static_cast(asciiBCP47Tag[i]); + } + } + + // Ensure it's null terminated + if (i < (UPRV_LENGTHOF(bcp47Tag) - 1)) + { + bcp47Tag[i] = L'\0'; + } + else + { + // Ran out of room. + bcp47Tag[UPRV_LENGTHOF(bcp47Tag) - 1] = L'\0'; + } + + + wchar_t windowsLocaleName[LOCALE_NAME_MAX_LENGTH] = {}; + + // Note: On Windows versions below 10, there is no support for locale name aliases. + // This means that it will fail for locales where ICU has a completely different + // name (like ku vs ckb), and it will also not work for alternate sort locale + // names like "de-DE-u-co-phonebk". + + // TODO: We could add some sort of exception table for cases like ku vs ckb. + + int length = ResolveLocaleName(bcp47Tag, windowsLocaleName, UPRV_LENGTHOF(windowsLocaleName)); + + if (length > 0) + { + *buffer = new UnicodeString(windowsLocaleName); + } + else + { + status = U_UNSUPPORTED_ERROR; + } + } + return status; +} + Win32NumberFormat::Win32NumberFormat(const Locale &locale, UBool currency, UErrorCode &status) - : NumberFormat(), fCurrency(currency), fFormatInfo(NULL), fFractionDigitsSet(FALSE) + : NumberFormat(), fCurrency(currency), fFormatInfo(NULL), fFractionDigitsSet(FALSE), fWindowsLocaleName(nullptr) { if (!U_FAILURE(status)) { fLCID = locale.getLCID(); + GetEquivalentWindowsLocaleName(locale, &fWindowsLocaleName); + // Note: In the previous code, it would look up the LCID for the locale, and if + // the locale was not recognized then it would get an LCID of 0, which is a + // synonym for LOCALE_USER_DEFAULT on Windows. + // If the above method fails, then fWindowsLocaleName will remain as nullptr, and + // then we will pass nullptr to API GetLocaleInfoEx, which is the same as passing + // LOCALE_USER_DEFAULT. + // Resolve actual locale to be used later UErrorCode tmpsts = U_ZERO_ERROR; char tmpLocID[ULOC_FULLNAME_CAPACITY]; @@ -152,12 +226,19 @@ Win32NumberFormat::Win32NumberFormat(const Locale &locale, UBool currency, UErro fLocale = Locale((const char*)tmpLocID); } + const wchar_t *localeName = nullptr; + + if (fWindowsLocaleName != nullptr) + { + localeName = reinterpret_cast(toOldUCharPtr(fWindowsLocaleName->getTerminatedBuffer())); + } + fFormatInfo = (FormatInfo*)uprv_malloc(sizeof(FormatInfo)); if (fCurrency) { - getCurrencyFormat(&fFormatInfo->currency, fLCID); + getCurrencyFormat(&fFormatInfo->currency, localeName); } else { - getNumberFormat(&fFormatInfo->number, fLCID); + getNumberFormat(&fFormatInfo->number, localeName); } } } @@ -182,6 +263,7 @@ Win32NumberFormat::~Win32NumberFormat() uprv_free(fFormatInfo); } + delete fWindowsLocaleName; } Win32NumberFormat &Win32NumberFormat::operator=(const Win32NumberFormat &other) @@ -192,13 +274,21 @@ Win32NumberFormat &Win32NumberFormat::operator=(const Win32NumberFormat &other) this->fLocale = other.fLocale; this->fLCID = other.fLCID; this->fFractionDigitsSet = other.fFractionDigitsSet; + this->fWindowsLocaleName = other.fWindowsLocaleName == NULL ? NULL : new UnicodeString(*other.fWindowsLocaleName); + + const wchar_t *localeName = nullptr; + + if (fWindowsLocaleName != nullptr) + { + localeName = reinterpret_cast(toOldUCharPtr(fWindowsLocaleName->getTerminatedBuffer())); + } if (fCurrency) { freeCurrencyFormat(&fFormatInfo->currency); - getCurrencyFormat(&fFormatInfo->currency, fLCID); + getCurrencyFormat(&fFormatInfo->currency, localeName); } else { freeNumberFormat(&fFormatInfo->number); - getNumberFormat(&fFormatInfo->number, fLCID); + getNumberFormat(&fFormatInfo->number, localeName); } return *this; @@ -299,6 +389,13 @@ UnicodeString &Win32NumberFormat::format(int32_t numDigits, UnicodeString &appen formatInfo = *fFormatInfo; buffer[0] = 0x0000; + const wchar_t *localeName = nullptr; + + if (fWindowsLocaleName != nullptr) + { + localeName = reinterpret_cast(toOldUCharPtr(fWindowsLocaleName->getTerminatedBuffer())); + } + if (fCurrency) { if (fFractionDigitsSet) { formatInfo.currency.NumDigits = (UINT) numDigits; @@ -308,17 +405,17 @@ UnicodeString &Win32NumberFormat::format(int32_t numDigits, UnicodeString &appen formatInfo.currency.Grouping = 0; } - result = GetCurrencyFormatW(fLCID, 0, nBuffer, &formatInfo.currency, buffer, STACK_BUFFER_SIZE); + result = GetCurrencyFormatEx(localeName, 0, nBuffer, &formatInfo.currency, buffer, STACK_BUFFER_SIZE); if (result == 0) { DWORD lastError = GetLastError(); if (lastError == ERROR_INSUFFICIENT_BUFFER) { - int newLength = GetCurrencyFormatW(fLCID, 0, nBuffer, &formatInfo.currency, NULL, 0); + int newLength = GetCurrencyFormatEx(localeName, 0, nBuffer, &formatInfo.currency, NULL, 0); buffer = NEW_ARRAY(wchar_t, newLength); buffer[0] = 0x0000; - GetCurrencyFormatW(fLCID, 0, nBuffer, &formatInfo.currency, buffer, newLength); + GetCurrencyFormatEx(localeName, 0, nBuffer, &formatInfo.currency, buffer, newLength); } } } else { @@ -330,15 +427,15 @@ UnicodeString &Win32NumberFormat::format(int32_t numDigits, UnicodeString &appen formatInfo.number.Grouping = 0; } - result = GetNumberFormatW(fLCID, 0, nBuffer, &formatInfo.number, buffer, STACK_BUFFER_SIZE); + result = GetNumberFormatEx(localeName, 0, nBuffer, &formatInfo.number, buffer, STACK_BUFFER_SIZE); if (result == 0) { if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { - int newLength = GetNumberFormatW(fLCID, 0, nBuffer, &formatInfo.number, NULL, 0); + int newLength = GetNumberFormatEx(localeName, 0, nBuffer, &formatInfo.number, NULL, 0); buffer = NEW_ARRAY(wchar_t, newLength); buffer[0] = 0x0000; - GetNumberFormatW(fLCID, 0, nBuffer, &formatInfo.number, buffer, newLength); + GetNumberFormatEx(localeName, 0, nBuffer, &formatInfo.number, buffer, newLength); } } } diff --git a/deps/icu-small/source/i18n/winnmfmt.h b/deps/icu-small/source/i18n/winnmfmt.h index 3b0df915e1439b..7ea5da91705476 100644 --- a/deps/icu-small/source/i18n/winnmfmt.h +++ b/deps/icu-small/source/i18n/winnmfmt.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -128,7 +128,7 @@ class Win32NumberFormat : public NumberFormat *
          * .   Base* polymorphic_pointer = createPolymorphicObject();
          * .   if (polymorphic_pointer->getDynamicClassID() ==
    -     * .       erived::getStaticClassID()) ...
    +     * .       derived::getStaticClassID()) ...
          * 
    * @return The class ID for all objects of this class. */ @@ -155,6 +155,7 @@ class Win32NumberFormat : public NumberFormat FormatInfo *fFormatInfo; UBool fFractionDigitsSet; + UnicodeString* fWindowsLocaleName; // Stores the equivalent Windows locale name. }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/wintzimpl.cpp b/deps/icu-small/source/i18n/wintzimpl.cpp index 4c042d54213d05..07aad2178701a7 100644 --- a/deps/icu-small/source/i18n/wintzimpl.cpp +++ b/deps/icu-small/source/i18n/wintzimpl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -13,7 +13,7 @@ #include "unicode/utypes.h" -#if U_PLATFORM_HAS_WIN32_API && !UCONFIG_NO_FORMATTING +#if U_PLATFORM_USES_ONLY_WIN32_API && !UCONFIG_NO_FORMATTING #include "wintzimpl.h" @@ -24,7 +24,9 @@ #include "uassert.h" #include "cmemory.h" +#ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN +#endif # define VC_EXTRALEAN # define NOUSER # define NOSERVICE diff --git a/deps/icu-small/source/i18n/wintzimpl.h b/deps/icu-small/source/i18n/wintzimpl.h index 8149fc14173814..c36f2ad5f5f057 100644 --- a/deps/icu-small/source/i18n/wintzimpl.h +++ b/deps/icu-small/source/i18n/wintzimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************** @@ -16,7 +16,7 @@ #include "unicode/utypes.h" -#if U_PLATFORM_HAS_WIN32_API +#if U_PLATFORM_USES_ONLY_WIN32_API /** * \file * \brief C API: Utilities for dealing w/ Windows time zones. @@ -34,6 +34,6 @@ U_CAPI UBool U_EXPORT2 uprv_getWindowsTimeZoneInfo(TIME_ZONE_INFORMATION *zoneInfo, const UChar *icuid, int32_t length); -#endif /* U_PLATFORM_HAS_WIN32_API */ +#endif /* U_PLATFORM_USES_ONLY_WIN32_API */ #endif /* __WINTZIMPL */ diff --git a/deps/icu-small/source/i18n/zonemeta.cpp b/deps/icu-small/source/i18n/zonemeta.cpp index fdf333c3712aef..84a965780291c9 100644 --- a/deps/icu-small/source/i18n/zonemeta.cpp +++ b/deps/icu-small/source/i18n/zonemeta.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -17,7 +17,7 @@ #include "unicode/ustring.h" #include "unicode/putil.h" #include "unicode/simpletz.h" - +#include "unicode/strenum.h" #include "umutex.h" #include "uvector.h" #include "cmemory.h" @@ -28,6 +28,7 @@ #include "uresimp.h" #include "uhash.h" #include "olsontz.h" +#include "uinvchar.h" static UMutex gZoneMetaLock = U_MUTEX_INITIALIZER; @@ -255,6 +256,12 @@ ZoneMeta::getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status) { tzid.extract(utzid, ZID_KEY_MAX + 1, tmpStatus); U_ASSERT(tmpStatus == U_ZERO_ERROR); // we checked the length of tzid already + if (!uprv_isInvariantUString(utzid, -1)) { + // All of known tz IDs are only containing ASCII invariant characters. + status = U_ILLEGAL_ARGUMENT_ERROR; + return NULL; + } + // Check if it was already cached umtx_lock(&gZoneMetaLock); { diff --git a/deps/icu-small/source/i18n/zonemeta.h b/deps/icu-small/source/i18n/zonemeta.h index 84be5553ea797e..9dbcc878a22dc8 100644 --- a/deps/icu-small/source/i18n/zonemeta.h +++ b/deps/icu-small/source/i18n/zonemeta.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -41,7 +41,11 @@ class U_I18N_API ZoneMeta { /** * Return the canonical id for this tzid defined by CLDR, which might be the id itself. * This overload method returns a persistent const UChar*, which is guranteed to persist - * (a pointer to a resource). + * (a pointer to a resource). If the given system tzid is not known, U_ILLEGAL_ARGUMENT_ERROR + * is set in the status. + * @param tzid Zone ID + * @param status Receives the status + * @return The canonical ID for the input time zone ID */ static const UChar* U_EXPORT2 getCanonicalCLDRID(const UnicodeString &tzid, UErrorCode& status); diff --git a/deps/icu-small/source/i18n/zrule.cpp b/deps/icu-small/source/i18n/zrule.cpp index ad64ab6e161ed5..c13411fc8e3f49 100644 --- a/deps/icu-small/source/i18n/zrule.cpp +++ b/deps/icu-small/source/i18n/zrule.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/zrule.h b/deps/icu-small/source/i18n/zrule.h index b9827bf5201a66..272f954f06905b 100644 --- a/deps/icu-small/source/i18n/zrule.h +++ b/deps/icu-small/source/i18n/zrule.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/ztrans.cpp b/deps/icu-small/source/i18n/ztrans.cpp index 956b563a2a0310..d2d93da1334b3e 100644 --- a/deps/icu-small/source/i18n/ztrans.cpp +++ b/deps/icu-small/source/i18n/ztrans.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/i18n/ztrans.h b/deps/icu-small/source/i18n/ztrans.h index 0101dc06e36bae..8b63eb47e88bbb 100644 --- a/deps/icu-small/source/i18n/ztrans.h +++ b/deps/icu-small/source/i18n/ztrans.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/io/locbund.cpp b/deps/icu-small/source/io/locbund.cpp index 4dc50d50df1e4c..f15788ee195599 100644 --- a/deps/icu-small/source/io/locbund.cpp +++ b/deps/icu-small/source/io/locbund.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/io/locbund.h b/deps/icu-small/source/io/locbund.h index b9e19484b654d2..5879e28f0154dc 100644 --- a/deps/icu-small/source/io/locbund.h +++ b/deps/icu-small/source/io/locbund.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/io/sprintf.c b/deps/icu-small/source/io/sprintf.cpp similarity index 99% rename from deps/icu-small/source/io/sprintf.c rename to deps/icu-small/source/io/sprintf.cpp index 17cdb2dcdd3f5e..20b9e52a217fe7 100644 --- a/deps/icu-small/source/io/sprintf.c +++ b/deps/icu-small/source/io/sprintf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/io/sscanf.c b/deps/icu-small/source/io/sscanf.cpp similarity index 98% rename from deps/icu-small/source/io/sscanf.c rename to deps/icu-small/source/io/sscanf.cpp index 2e14cdbcb65968..5409ebb7162ca6 100644 --- a/deps/icu-small/source/io/sscanf.c +++ b/deps/icu-small/source/io/sscanf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/io/ucln_io.cpp b/deps/icu-small/source/io/ucln_io.cpp index 5822d22be15981..388abbb4e955be 100644 --- a/deps/icu-small/source/io/ucln_io.cpp +++ b/deps/icu-small/source/io/ucln_io.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * * ****************************************************************************** * file name: ucln_io.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/io/ucln_io.h b/deps/icu-small/source/io/ucln_io.h index 97d06a12ffd18c..20dcb88ac74e1c 100644 --- a/deps/icu-small/source/io/ucln_io.h +++ b/deps/icu-small/source/io/ucln_io.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * * ****************************************************************************** * file name: ucln_io.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/io/ufile.c b/deps/icu-small/source/io/ufile.cpp similarity index 87% rename from deps/icu-small/source/io/ufile.c rename to deps/icu-small/source/io/ufile.cpp index 71d27a5e2596dd..6cbb897555d3c7 100644 --- a/deps/icu-small/source/io/ufile.c +++ b/deps/icu-small/source/io/ufile.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -8,7 +8,7 @@ * ****************************************************************************** * -* File ufile.c +* File ufile.cpp * * Modification History: * @@ -20,10 +20,11 @@ ****************************************************************************** */ -/* - * fileno is not declared when building with GCC in strict mode. - */ -#if defined(__GNUC__) && defined(__STRICT_ANSI__) +#include "unicode/platform.h" +#if defined(__GNUC__) && !defined(__clang__) && defined(__STRICT_ANSI__) +// g++, fileno isn't defined if __STRICT_ANSI__ is defined. +// clang fails to compile the header unless __STRICT_ANSI__ is defined. +// __GNUC__ is set by both gcc and clang. #undef __STRICT_ANSI__ #endif @@ -32,6 +33,8 @@ #if !UCONFIG_NO_CONVERSION +#include + #include "ufile.h" #include "unicode/uloc.h" #include "unicode/ures.h" @@ -64,33 +67,7 @@ finit_owner(FILE *f, uprv_memset(result, 0, sizeof(UFILE)); result->fFileno = fileno(f); - -#if U_PLATFORM_USES_ONLY_WIN32_API && _MSC_VER < 1900 - /* - * Below is a very old workaround (ICU ticket:231). - * - * Previously, 'FILE*' from inside and outside ICU's DLL - * were different, because they pointed into local copies - * of the io block. At least by VS 2015 the implementation - * is something like: - * stdio = _acrt_iob_func(0) - * .. which is a function call, so should return the same pointer - * regardless of call site. - * As of _MSC_VER 1900 this patch is retired, at 16 years old. - */ - if (0 <= result->fFileno && result->fFileno <= 2) { - /* stdin, stdout and stderr need to be special cased for Windows 98 */ -#if _MSC_VER >= 1400 - result->fFile = &__iob_func()[_fileno(f)]; -#else - result->fFile = &_iob[_fileno(f)]; -#endif - } - else -#endif - { - result->fFile = f; - } + result->fFile = f; result->str.fBuffer = result->fUCBuffer; result->str.fPos = result->fUCBuffer; @@ -180,7 +157,11 @@ u_fopen_u(const UChar *filename, #if U_PLATFORM_USES_ONLY_WIN32_API /* Try Windows API _wfopen if the above fails. */ if (!result) { - FILE *systemFile = _wfopen(filename, (UChar*)perm); + // TODO: test this code path, including wperm. + wchar_t wperm[40] = {}; + size_t retVal; + mbstowcs_s(&retVal, wperm, perm, _TRUNCATE); + FILE *systemFile = _wfopen((const wchar_t *)filename, wperm); if (systemFile) { result = finit_owner(systemFile, locale, codepage, TRUE); } @@ -208,7 +189,7 @@ u_fstropen(UChar *stringBuf, result = (UFILE*) uprv_malloc(sizeof(UFILE)); /* Null pointer test */ if (result == NULL) { - return NULL; /* Just get out. */ + return NULL; /* Just get out. */ } uprv_memset(result, 0, sizeof(UFILE)); result->str.fBuffer = stringBuf; diff --git a/deps/icu-small/source/io/ufile.h b/deps/icu-small/source/io/ufile.h index b2562747e6e1ac..ed897275437fb0 100644 --- a/deps/icu-small/source/io/ufile.h +++ b/deps/icu-small/source/io/ufile.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -25,6 +25,8 @@ #if !UCONFIG_NO_CONVERSION +#include + #include "unicode/ucnv.h" #include "unicode/utrans.h" #include "locbund.h" diff --git a/deps/icu-small/source/io/ufmt_cmn.c b/deps/icu-small/source/io/ufmt_cmn.cpp similarity index 99% rename from deps/icu-small/source/io/ufmt_cmn.c rename to deps/icu-small/source/io/ufmt_cmn.cpp index e896bc560d44bc..760d2711bd624c 100644 --- a/deps/icu-small/source/io/ufmt_cmn.c +++ b/deps/icu-small/source/io/ufmt_cmn.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/io/ufmt_cmn.h b/deps/icu-small/source/io/ufmt_cmn.h index 7daeee881363b2..d9cfd6a5f332b6 100644 --- a/deps/icu-small/source/io/ufmt_cmn.h +++ b/deps/icu-small/source/io/ufmt_cmn.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -26,7 +26,7 @@ #include "unicode/utf16.h" #define UFMT_DEFAULT_BUFFER_SIZE 128 -#define MAX_UCHAR_BUFFER_SIZE(buffer) (sizeof(buffer)/(U16_MAX_LENGTH*sizeof(UChar))) +#define MAX_UCHAR_BUFFER_SIZE(buffer) ((int32_t)(sizeof(buffer)/(U16_MAX_LENGTH*sizeof(UChar)))) #define MAX_UCHAR_BUFFER_NEEDED(strLen) ((strLen+1)*U16_MAX_LENGTH*sizeof(UChar)) /** diff --git a/deps/icu-small/source/io/unicode/ustdio.h b/deps/icu-small/source/io/unicode/ustdio.h index 5e11bb67666c45..565b5b3fc57f49 100644 --- a/deps/icu-small/source/io/unicode/ustdio.h +++ b/deps/icu-small/source/io/unicode/ustdio.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/io/unicode/ustream.h b/deps/icu-small/source/io/unicode/ustream.h index ab52f6a28a0728..df1506ebfb2552 100644 --- a/deps/icu-small/source/io/unicode/ustream.h +++ b/deps/icu-small/source/io/unicode/ustream.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** @@ -30,7 +30,7 @@ * C++ I/O stream API. */ -#if !defined(_MSC_VER) +#if defined(__GLIBCXX__) namespace std { class type_info; } // WORKAROUND: http://llvm.org/bugs/show_bug.cgi?id=13364 #endif diff --git a/deps/icu-small/source/io/uprintf.cpp b/deps/icu-small/source/io/uprintf.cpp index e6062ade297862..316c794498fba6 100644 --- a/deps/icu-small/source/io/uprintf.cpp +++ b/deps/icu-small/source/io/uprintf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/io/uprintf.h b/deps/icu-small/source/io/uprintf.h index 0a07e6b7d6a0c3..0fd6066e5623af 100644 --- a/deps/icu-small/source/io/uprintf.h +++ b/deps/icu-small/source/io/uprintf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/io/uprntf_p.c b/deps/icu-small/source/io/uprntf_p.cpp similarity index 99% rename from deps/icu-small/source/io/uprntf_p.c rename to deps/icu-small/source/io/uprntf_p.cpp index 81f52696581960..ecf2e67235b1cc 100644 --- a/deps/icu-small/source/io/uprntf_p.c +++ b/deps/icu-small/source/io/uprntf_p.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** @@ -184,6 +184,9 @@ u_printf_simple_percent_handler(const u_printf_stream_handler *handler, const u_printf_spec_info *info, const ufmt_args *args) { + (void)formatBundle; + (void)info; + (void)args; static const UChar PERCENT[] = { UP_PERCENT }; /* put a single '%' onto the output */ @@ -198,6 +201,7 @@ u_printf_string_handler(const u_printf_stream_handler *handler, const u_printf_spec_info *info, const ufmt_args *args) { + (void)formatBundle; UChar *s; UChar buffer[UFMT_DEFAULT_BUFFER_SIZE]; int32_t len, written; @@ -248,6 +252,7 @@ u_printf_char_handler(const u_printf_stream_handler *handler, const u_printf_spec_info *info, const ufmt_args *args) { + (void)formatBundle; UChar s[U16_MAX_LENGTH+1]; int32_t len = 1, written; unsigned char arg = (unsigned char)(args[0].int64Value); @@ -418,6 +423,7 @@ u_printf_hex_handler(const u_printf_stream_handler *handler, const u_printf_spec_info *info, const ufmt_args *args) { + (void)formatBundle; int64_t num = args[0].int64Value; UChar result[UPRINTF_BUFFER_SIZE]; int32_t len = UPRINTF_BUFFER_SIZE; @@ -453,6 +459,7 @@ u_printf_octal_handler(const u_printf_stream_handler *handler, const u_printf_spec_info *info, const ufmt_args *args) { + (void)formatBundle; int64_t num = args[0].int64Value; UChar result[UPRINTF_BUFFER_SIZE]; int32_t len = UPRINTF_BUFFER_SIZE; @@ -540,6 +547,7 @@ u_printf_pointer_handler(const u_printf_stream_handler *handler, const u_printf_spec_info *info, const ufmt_args *args) { + (void)formatBundle; UChar result[UPRINTF_BUFFER_SIZE]; int32_t len = UPRINTF_BUFFER_SIZE; @@ -751,6 +759,7 @@ u_printf_ustring_handler(const u_printf_stream_handler *handler, const u_printf_spec_info *info, const ufmt_args *args) { + (void)formatBundle; int32_t len, written; const UChar *arg = (const UChar*)(args[0].ptrValue); @@ -779,6 +788,7 @@ u_printf_uchar_handler(const u_printf_stream_handler *handler, const u_printf_spec_info *info, const ufmt_args *args) { + (void)formatBundle; int32_t written = 0; UChar arg = (UChar)(args[0].int64Value); @@ -858,6 +868,9 @@ u_printf_count_handler(const u_printf_stream_handler *handler, const u_printf_spec_info *info, const ufmt_args *args) { + (void)handler; + (void)context; + (void)formatBundle; int32_t *count = (int32_t*)(args[0].ptrValue); /* in the special case of count, the u_printf_spec_info's width */ diff --git a/deps/icu-small/source/io/uscanf.c b/deps/icu-small/source/io/uscanf.cpp similarity index 97% rename from deps/icu-small/source/io/uscanf.c rename to deps/icu-small/source/io/uscanf.cpp index 9866963201ea53..0febd213985bda 100644 --- a/deps/icu-small/source/io/uscanf.c +++ b/deps/icu-small/source/io/uscanf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/io/uscanf.h b/deps/icu-small/source/io/uscanf.h index bbe84d9e2bbf2a..760691cb0a20aa 100644 --- a/deps/icu-small/source/io/uscanf.h +++ b/deps/icu-small/source/io/uscanf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/io/uscanf_p.c b/deps/icu-small/source/io/uscanf_p.cpp similarity index 98% rename from deps/icu-small/source/io/uscanf_p.c rename to deps/icu-small/source/io/uscanf_p.cpp index f17502038ae45b..c08949d7299934 100644 --- a/deps/icu-small/source/io/uscanf_p.c +++ b/deps/icu-small/source/io/uscanf_p.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -380,6 +380,11 @@ u_scanf_simple_percent_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)info; + (void)args; + (void)fmt; + (void)fmtConsumed; + /* make sure the next character in the input is a percent */ *argConverted = 0; if(u_fgetc(input) != 0x0025) { @@ -396,6 +401,10 @@ u_scanf_count_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)input; + (void)fmt; + (void)fmtConsumed; + /* in the special case of count, the u_scanf_spec_info's width */ /* will contain the # of items converted thus far */ if (!info->fSkipArg) { @@ -420,6 +429,9 @@ u_scanf_double_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + int32_t len; double num; UNumberFormat *format; @@ -485,6 +497,9 @@ u_scanf_scientific_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + int32_t len; double num; UNumberFormat *format; @@ -582,6 +597,9 @@ u_scanf_scidbl_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + int32_t len; double num; UNumberFormat *scientificFormat, *genericFormat; @@ -672,6 +690,9 @@ u_scanf_integer_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + int32_t len; void *num = (void*) (args[0].ptrValue); UNumberFormat *format; @@ -745,6 +766,9 @@ u_scanf_percent_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + int32_t len; double num; UNumberFormat *format; @@ -802,6 +826,9 @@ u_scanf_string_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + const UChar *source; UConverter *conv; char *arg = (char*)(args[0].ptrValue); @@ -900,6 +927,9 @@ u_scanf_ustring_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + UChar *arg = (UChar*)(args[0].ptrValue); UChar *alias = arg; int32_t count; @@ -969,6 +999,9 @@ u_scanf_spellout_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + int32_t len; double num; UNumberFormat *format; @@ -1028,6 +1061,9 @@ u_scanf_hex_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + int32_t len; int32_t skipped; void *num = (void*) (args[0].ptrValue); @@ -1084,6 +1120,9 @@ u_scanf_octal_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + int32_t len; int32_t skipped; void *num = (void*) (args[0].ptrValue); @@ -1131,6 +1170,9 @@ u_scanf_pointer_handler(UFILE *input, int32_t *fmtConsumed, int32_t *argConverted) { + (void)fmt; + (void)fmtConsumed; + int32_t len; int32_t skipped; void *result; diff --git a/deps/icu-small/source/io/ustdio.c b/deps/icu-small/source/io/ustdio.cpp similarity index 99% rename from deps/icu-small/source/io/ustdio.c rename to deps/icu-small/source/io/ustdio.cpp index 4b156595bb18f5..790a097980b1af 100644 --- a/deps/icu-small/source/io/ustdio.c +++ b/deps/icu-small/source/io/ustdio.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/io/ustream.cpp b/deps/icu-small/source/io/ustream.cpp index 8e0087edbe6b21..a537d14383fc4f 100644 --- a/deps/icu-small/source/io/ustream.cpp +++ b/deps/icu-small/source/io/ustream.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ********************************************************************** diff --git a/deps/icu-small/source/stubdata/stubdata.c b/deps/icu-small/source/stubdata/stubdata.cpp similarity index 95% rename from deps/icu-small/source/stubdata/stubdata.c rename to deps/icu-small/source/stubdata/stubdata.cpp index a1a16545605de1..de49b9a733a66e 100644 --- a/deps/icu-small/source/stubdata/stubdata.c +++ b/deps/icu-small/source/stubdata/stubdata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * @@ -40,7 +40,7 @@ typedef struct { /* pointerTOC to OffsetTOC. */ } ICU_Data_Header; -U_EXPORT const ICU_Data_Header U_ICUDATA_ENTRY_POINT = { +extern "C" U_EXPORT const ICU_Data_Header U_ICUDATA_ENTRY_POINT = { 32, /* headerSize */ 0xda, /* magic1, (see struct MappedData in udata.c) */ 0x27, /* magic2 */ diff --git a/deps/icu-small/source/tools/escapesrc/cptbl.h b/deps/icu-small/source/tools/escapesrc/cptbl.h new file mode 100644 index 00000000000000..efaa9642e10e75 --- /dev/null +++ b/deps/icu-small/source/tools/escapesrc/cptbl.h @@ -0,0 +1,520 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. License & terms of use: http://www.unicode.org/copyright.html +// generated by tblgen. You weren't going to edit it by hand, were you? + +static const char cp1047_8859_1[256] = { + (char)0x00, /* 00 */ + (char)0x01, /* 01 */ + (char)0x02, /* 02 */ + (char)0x03, /* 03 */ + (char)0x9C, /* 04 */ + (char)0x09, /* 05 */ + (char)0x86, /* 06 */ + (char)0x7F, /* 07 */ + (char)0x97, /* 08 */ + (char)0x8D, /* 09 */ + (char)0x8E, /* 0A */ + (char)0x0B, /* 0B */ + (char)0x0C, /* 0C */ + (char)0x0D, /* 0D */ + (char)0x0E, /* 0E */ + (char)0x0F, /* 0F */ + (char)0x10, /* 10 */ + (char)0x11, /* 11 */ + (char)0x12, /* 12 */ + (char)0x13, /* 13 */ + (char)0x9D, /* 14 */ + (char)0x85, /* 15 */ + (char)0x08, /* 16 */ + (char)0x87, /* 17 */ + (char)0x18, /* 18 */ + (char)0x19, /* 19 */ + (char)0x92, /* 1A */ + (char)0x8F, /* 1B */ + (char)0x1C, /* 1C */ + (char)0x1D, /* 1D */ + (char)0x1E, /* 1E */ + (char)0x1F, /* 1F */ + (char)0x80, /* 20 */ + (char)0x81, /* 21 */ + (char)0x82, /* 22 */ + (char)0x83, /* 23 */ + (char)0x84, /* 24 */ + (char)0x0A, /* 25 */ + (char)0x17, /* 26 */ + (char)0x1B, /* 27 */ + (char)0x88, /* 28 */ + (char)0x89, /* 29 */ + (char)0x8A, /* 2A */ + (char)0x8B, /* 2B */ + (char)0x8C, /* 2C */ + (char)0x05, /* 2D */ + (char)0x06, /* 2E */ + (char)0x07, /* 2F */ + (char)0x90, /* 30 */ + (char)0x91, /* 31 */ + (char)0x16, /* 32 */ + (char)0x93, /* 33 */ + (char)0x94, /* 34 */ + (char)0x95, /* 35 */ + (char)0x96, /* 36 */ + (char)0x04, /* 37 */ + (char)0x98, /* 38 */ + (char)0x99, /* 39 */ + (char)0x9A, /* 3A */ + (char)0x9B, /* 3B */ + (char)0x14, /* 3C */ + (char)0x15, /* 3D */ + (char)0x9E, /* 3E */ + (char)0x1A, /* 3F */ + (char)0x20, /* 40 */ + (char)0xA0, /* 41 */ + (char)0xE2, /* 42 */ + (char)0xE4, /* 43 */ + (char)0xE0, /* 44 */ + (char)0xE1, /* 45 */ + (char)0xE3, /* 46 */ + (char)0xE5, /* 47 */ + (char)0xE7, /* 48 */ + (char)0xF1, /* 49 */ + (char)0xA2, /* 4A */ + (char)0x2E, /* 4B */ + (char)0x3C, /* 4C */ + (char)0x28, /* 4D */ + (char)0x2B, /* 4E */ + (char)0x7C, /* 4F */ + (char)0x26, /* 50 */ + (char)0xE9, /* 51 */ + (char)0xEA, /* 52 */ + (char)0xEB, /* 53 */ + (char)0xE8, /* 54 */ + (char)0xED, /* 55 */ + (char)0xEE, /* 56 */ + (char)0xEF, /* 57 */ + (char)0xEC, /* 58 */ + (char)0xDF, /* 59 */ + (char)0x21, /* 5A */ + (char)0x24, /* 5B */ + (char)0x2A, /* 5C */ + (char)0x29, /* 5D */ + (char)0x3B, /* 5E */ + (char)0x5E, /* 5F */ + (char)0x2D, /* 60 */ + (char)0x2F, /* 61 */ + (char)0xC2, /* 62 */ + (char)0xC4, /* 63 */ + (char)0xC0, /* 64 */ + (char)0xC1, /* 65 */ + (char)0xC3, /* 66 */ + (char)0xC5, /* 67 */ + (char)0xC7, /* 68 */ + (char)0xD1, /* 69 */ + (char)0xA6, /* 6A */ + (char)0x2C, /* 6B */ + (char)0x25, /* 6C */ + (char)0x5F, /* 6D */ + (char)0x3E, /* 6E */ + (char)0x3F, /* 6F */ + (char)0xF8, /* 70 */ + (char)0xC9, /* 71 */ + (char)0xCA, /* 72 */ + (char)0xCB, /* 73 */ + (char)0xC8, /* 74 */ + (char)0xCD, /* 75 */ + (char)0xCE, /* 76 */ + (char)0xCF, /* 77 */ + (char)0xCC, /* 78 */ + (char)0x60, /* 79 */ + (char)0x3A, /* 7A */ + (char)0x23, /* 7B */ + (char)0x40, /* 7C */ + (char)0x27, /* 7D */ + (char)0x3D, /* 7E */ + (char)0x22, /* 7F */ + (char)0xD8, /* 80 */ + (char)0x61, /* 81 */ + (char)0x62, /* 82 */ + (char)0x63, /* 83 */ + (char)0x64, /* 84 */ + (char)0x65, /* 85 */ + (char)0x66, /* 86 */ + (char)0x67, /* 87 */ + (char)0x68, /* 88 */ + (char)0x69, /* 89 */ + (char)0xAB, /* 8A */ + (char)0xBB, /* 8B */ + (char)0xF0, /* 8C */ + (char)0xFD, /* 8D */ + (char)0xFE, /* 8E */ + (char)0xB1, /* 8F */ + (char)0xB0, /* 90 */ + (char)0x6A, /* 91 */ + (char)0x6B, /* 92 */ + (char)0x6C, /* 93 */ + (char)0x6D, /* 94 */ + (char)0x6E, /* 95 */ + (char)0x6F, /* 96 */ + (char)0x70, /* 97 */ + (char)0x71, /* 98 */ + (char)0x72, /* 99 */ + (char)0xAA, /* 9A */ + (char)0xBA, /* 9B */ + (char)0xE6, /* 9C */ + (char)0xB8, /* 9D */ + (char)0xC6, /* 9E */ + (char)0xA4, /* 9F */ + (char)0xB5, /* A0 */ + (char)0x7E, /* A1 */ + (char)0x73, /* A2 */ + (char)0x74, /* A3 */ + (char)0x75, /* A4 */ + (char)0x76, /* A5 */ + (char)0x77, /* A6 */ + (char)0x78, /* A7 */ + (char)0x79, /* A8 */ + (char)0x7A, /* A9 */ + (char)0xA1, /* AA */ + (char)0xBF, /* AB */ + (char)0xD0, /* AC */ + (char)0x5B, /* AD */ + (char)0xDE, /* AE */ + (char)0xAE, /* AF */ + (char)0xAC, /* B0 */ + (char)0xA3, /* B1 */ + (char)0xA5, /* B2 */ + (char)0xB7, /* B3 */ + (char)0xA9, /* B4 */ + (char)0xA7, /* B5 */ + (char)0xB6, /* B6 */ + (char)0xBC, /* B7 */ + (char)0xBD, /* B8 */ + (char)0xBE, /* B9 */ + (char)0xDD, /* BA */ + (char)0xA8, /* BB */ + (char)0xAF, /* BC */ + (char)0x5D, /* BD */ + (char)0xB4, /* BE */ + (char)0xD7, /* BF */ + (char)0x7B, /* C0 */ + (char)0x41, /* C1 */ + (char)0x42, /* C2 */ + (char)0x43, /* C3 */ + (char)0x44, /* C4 */ + (char)0x45, /* C5 */ + (char)0x46, /* C6 */ + (char)0x47, /* C7 */ + (char)0x48, /* C8 */ + (char)0x49, /* C9 */ + (char)0xAD, /* CA */ + (char)0xF4, /* CB */ + (char)0xF6, /* CC */ + (char)0xF2, /* CD */ + (char)0xF3, /* CE */ + (char)0xF5, /* CF */ + (char)0x7D, /* D0 */ + (char)0x4A, /* D1 */ + (char)0x4B, /* D2 */ + (char)0x4C, /* D3 */ + (char)0x4D, /* D4 */ + (char)0x4E, /* D5 */ + (char)0x4F, /* D6 */ + (char)0x50, /* D7 */ + (char)0x51, /* D8 */ + (char)0x52, /* D9 */ + (char)0xB9, /* DA */ + (char)0xFB, /* DB */ + (char)0xFC, /* DC */ + (char)0xF9, /* DD */ + (char)0xFA, /* DE */ + (char)0xFF, /* DF */ + (char)0x5C, /* E0 */ + (char)0xF7, /* E1 */ + (char)0x53, /* E2 */ + (char)0x54, /* E3 */ + (char)0x55, /* E4 */ + (char)0x56, /* E5 */ + (char)0x57, /* E6 */ + (char)0x58, /* E7 */ + (char)0x59, /* E8 */ + (char)0x5A, /* E9 */ + (char)0xB2, /* EA */ + (char)0xD4, /* EB */ + (char)0xD6, /* EC */ + (char)0xD2, /* ED */ + (char)0xD3, /* EE */ + (char)0xD5, /* EF */ + (char)0x30, /* F0 */ + (char)0x31, /* F1 */ + (char)0x32, /* F2 */ + (char)0x33, /* F3 */ + (char)0x34, /* F4 */ + (char)0x35, /* F5 */ + (char)0x36, /* F6 */ + (char)0x37, /* F7 */ + (char)0x38, /* F8 */ + (char)0x39, /* F9 */ + (char)0xB3, /* FA */ + (char)0xDB, /* FB */ + (char)0xDC, /* FC */ + (char)0xD9, /* FD */ + (char)0xDA, /* FE */ + (char)0x9F, /* FF */ +}; + +static const bool oldIllegal[256] = { + false, /* U+0000 */ + false, /* U+0001 */ + false, /* U+0002 */ + false, /* U+0003 */ + false, /* U+0004 */ + false, /* U+0005 */ + false, /* U+0006 */ + false, /* U+0007 */ + false, /* U+0008 */ + false, /* U+0009 */ + false, /* U+000A */ + false, /* U+000B */ + false, /* U+000C */ + false, /* U+000D */ + false, /* U+000E */ + false, /* U+000F */ + false, /* U+0010 */ + false, /* U+0011 */ + false, /* U+0012 */ + false, /* U+0013 */ + false, /* U+0014 */ + false, /* U+0015 */ + false, /* U+0016 */ + false, /* U+0017 */ + false, /* U+0018 */ + false, /* U+0019 */ + false, /* U+001A */ + false, /* U+001B */ + false, /* U+001C */ + false, /* U+001D */ + false, /* U+001E */ + false, /* U+001F */ + true, /* U+0020 */ + true, /* U+0021 */ + true, /* U+0022 */ + true, /* U+0023 */ + false, /* U+0024 */ + true, /* U+0025 */ + true, /* U+0026 */ + true, /* U+0027 */ + true, /* U+0028 */ + true, /* U+0029 */ + true, /* U+002A */ + true, /* U+002B */ + true, /* U+002C */ + true, /* U+002D */ + true, /* U+002E */ + true, /* U+002F */ + true, /* U+0030 */ + true, /* U+0031 */ + true, /* U+0032 */ + true, /* U+0033 */ + true, /* U+0034 */ + true, /* U+0035 */ + true, /* U+0036 */ + true, /* U+0037 */ + true, /* U+0038 */ + true, /* U+0039 */ + true, /* U+003A */ + true, /* U+003B */ + true, /* U+003C */ + true, /* U+003D */ + true, /* U+003E */ + true, /* U+003F */ + false, /* U+0040 */ + true, /* U+0041 */ + true, /* U+0042 */ + true, /* U+0043 */ + true, /* U+0044 */ + true, /* U+0045 */ + true, /* U+0046 */ + true, /* U+0047 */ + true, /* U+0048 */ + true, /* U+0049 */ + true, /* U+004A */ + true, /* U+004B */ + true, /* U+004C */ + true, /* U+004D */ + true, /* U+004E */ + true, /* U+004F */ + true, /* U+0050 */ + true, /* U+0051 */ + true, /* U+0052 */ + true, /* U+0053 */ + true, /* U+0054 */ + true, /* U+0055 */ + true, /* U+0056 */ + true, /* U+0057 */ + true, /* U+0058 */ + true, /* U+0059 */ + true, /* U+005A */ + true, /* U+005B */ + false, /* U+005C */ + true, /* U+005D */ + true, /* U+005E */ + true, /* U+005F */ + false, /* U+0060 */ + true, /* U+0061 */ + true, /* U+0062 */ + true, /* U+0063 */ + true, /* U+0064 */ + true, /* U+0065 */ + true, /* U+0066 */ + true, /* U+0067 */ + true, /* U+0068 */ + true, /* U+0069 */ + true, /* U+006A */ + true, /* U+006B */ + true, /* U+006C */ + true, /* U+006D */ + true, /* U+006E */ + true, /* U+006F */ + true, /* U+0070 */ + true, /* U+0071 */ + true, /* U+0072 */ + true, /* U+0073 */ + true, /* U+0074 */ + true, /* U+0075 */ + true, /* U+0076 */ + true, /* U+0077 */ + true, /* U+0078 */ + true, /* U+0079 */ + true, /* U+007A */ + true, /* U+007B */ + true, /* U+007C */ + true, /* U+007D */ + true, /* U+007E */ + false, /* U+007F */ + false, /* U+0080 */ + false, /* U+0081 */ + false, /* U+0082 */ + false, /* U+0083 */ + false, /* U+0084 */ + false, /* U+0085 */ + false, /* U+0086 */ + false, /* U+0087 */ + false, /* U+0088 */ + false, /* U+0089 */ + false, /* U+008A */ + false, /* U+008B */ + false, /* U+008C */ + false, /* U+008D */ + false, /* U+008E */ + false, /* U+008F */ + false, /* U+0090 */ + false, /* U+0091 */ + false, /* U+0092 */ + false, /* U+0093 */ + false, /* U+0094 */ + false, /* U+0095 */ + false, /* U+0096 */ + false, /* U+0097 */ + false, /* U+0098 */ + false, /* U+0099 */ + false, /* U+009A */ + false, /* U+009B */ + false, /* U+009C */ + false, /* U+009D */ + false, /* U+009E */ + false, /* U+009F */ + false, /* U+00A0 */ + false, /* U+00A1 */ + false, /* U+00A2 */ + false, /* U+00A3 */ + false, /* U+00A4 */ + false, /* U+00A5 */ + false, /* U+00A6 */ + false, /* U+00A7 */ + false, /* U+00A8 */ + false, /* U+00A9 */ + false, /* U+00AA */ + false, /* U+00AB */ + false, /* U+00AC */ + false, /* U+00AD */ + false, /* U+00AE */ + false, /* U+00AF */ + false, /* U+00B0 */ + false, /* U+00B1 */ + false, /* U+00B2 */ + false, /* U+00B3 */ + false, /* U+00B4 */ + false, /* U+00B5 */ + false, /* U+00B6 */ + false, /* U+00B7 */ + false, /* U+00B8 */ + false, /* U+00B9 */ + false, /* U+00BA */ + false, /* U+00BB */ + false, /* U+00BC */ + false, /* U+00BD */ + false, /* U+00BE */ + false, /* U+00BF */ + false, /* U+00C0 */ + false, /* U+00C1 */ + false, /* U+00C2 */ + false, /* U+00C3 */ + false, /* U+00C4 */ + false, /* U+00C5 */ + false, /* U+00C6 */ + false, /* U+00C7 */ + false, /* U+00C8 */ + false, /* U+00C9 */ + false, /* U+00CA */ + false, /* U+00CB */ + false, /* U+00CC */ + false, /* U+00CD */ + false, /* U+00CE */ + false, /* U+00CF */ + false, /* U+00D0 */ + false, /* U+00D1 */ + false, /* U+00D2 */ + false, /* U+00D3 */ + false, /* U+00D4 */ + false, /* U+00D5 */ + false, /* U+00D6 */ + false, /* U+00D7 */ + false, /* U+00D8 */ + false, /* U+00D9 */ + false, /* U+00DA */ + false, /* U+00DB */ + false, /* U+00DC */ + false, /* U+00DD */ + false, /* U+00DE */ + false, /* U+00DF */ + false, /* U+00E0 */ + false, /* U+00E1 */ + false, /* U+00E2 */ + false, /* U+00E3 */ + false, /* U+00E4 */ + false, /* U+00E5 */ + false, /* U+00E6 */ + false, /* U+00E7 */ + false, /* U+00E8 */ + false, /* U+00E9 */ + false, /* U+00EA */ + false, /* U+00EB */ + false, /* U+00EC */ + false, /* U+00ED */ + false, /* U+00EE */ + false, /* U+00EF */ + false, /* U+00F0 */ + false, /* U+00F1 */ + false, /* U+00F2 */ + false, /* U+00F3 */ + false, /* U+00F4 */ + false, /* U+00F5 */ + false, /* U+00F6 */ + false, /* U+00F7 */ + false, /* U+00F8 */ + false, /* U+00F9 */ + false, /* U+00FA */ + false, /* U+00FB */ + false, /* U+00FC */ + false, /* U+00FD */ + false, /* U+00FE */ + false, /* U+00FF */ +}; diff --git a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp new file mode 100644 index 00000000000000..1127cd4ffb8bec --- /dev/null +++ b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp @@ -0,0 +1,409 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include +#include +#include +#include +#include +#include +#include +#include + +// with caution: +#include "unicode/utf8.h" + +static const char + kSPACE = 0x20, + kTAB = 0x09, + kLF = 0x0A, + kCR = 0x0D, + // kHASH = 0x23, + // kSLASH = 0x2f, + kBKSLASH = 0x5C, + // kSTAR = 0x2A, + kL_U = 0x75, + kU_U = 0x55, + kQUOT = 0x27, + kDBLQ = 0x22; + +# include "cptbl.h" + +# define cp1047_to_8859(c) cp1047_8859_1[c] + +std::string prog; + +void usage() { + fprintf(stderr, "%s: usage: %s infile.cpp outfile.cpp\n", prog.c_str(), prog.c_str()); +} + + +int cleanup(const std::string &outfile) { + const char *outstr = outfile.c_str(); + if(outstr && *outstr) { + int rc = unlink(outstr); + if(rc == 0) { + fprintf(stderr, "%s: deleted %s\n", prog.c_str(), outstr); + return 0; + } else { + if( errno == ENOENT ) { + return 0; // File did not exist - no error. + } else { + perror("unlink"); + return 1; + } + } + } + return 0; +} + +// inline bool hasNonAscii(const char *line, size_t len) { +// const unsigned char *uline = reinterpret_cast(line); +// for(size_t i=0;i 0x7F) { +// return true; +// } +// } +// return false; +// } + +inline const char *skipws(const char *p, const char *e) { + for(;p0; pos2++,trail--) { + linestr[pos2] = cp1047_to_8859(linestr[pos2]); + if(linestr[pos2] == 0x0A) { + linestr[pos2] = 0x85; // NL is ambiguous here + } + } +#endif + + // Proceed to decode utf-8 + const uint8_t *s = (const uint8_t*) (linestr.c_str()); + int32_t length = linestr.size(); + UChar32 c; + if(U8_IS_SINGLE((uint8_t)s[i]) && oldIllegal[s[i]]) { +#if (U_CHARSET_FAMILY == U_EBCDIC_FAMILY) + linestr[pos] = old_byte; // put it back +#endif + continue; // single code point not previously legal for \u escaping + } + + // otherwise, convert it to \u / \U + { + U8_NEXT(s, i, length, c); + } + if(c<0) { + fprintf(stderr, "Illegal utf-8 sequence at Column: %d\n", old_pos); + fprintf(stderr, "Line: >>%s<<\n", linestr.c_str()); + return true; + } + + size_t seqLen = (i-pos); + + //printf("U+%04X pos %d [len %d]\n", c, pos, seqLen);fflush(stdout); + + char newSeq[20]; + if( c <= 0xFFFF) { + sprintf(newSeq, "\\u%04X", c); + } else { + sprintf(newSeq, "\\U%08X", c); + } + linestr.replace(pos, seqLen, newSeq); + pos += strlen(newSeq) - 1; + } + } + + return false; +} + +/** + * false = no err + * true = had err + */ +bool fixLine(int /*no*/, std::string &linestr) { + const char *line = linestr.c_str(); + size_t len = linestr.size(); + + // no u' in the line? + if(!strstr(line, "u'") && !strstr(line, "u\"") && !strstr(line, "u8\"")) { + return false; // Nothing to do. No u' or u" detected + } + + // lines such as u8"\u0308" are all ASCII. + // // Quick Check: all ascii? + // if(!hasNonAscii(line, len)) { + // return false; // ASCII + // } + + // // comment or empty line? + // if(isCommentOrEmpty(line, len)) { + // return false; // Comment or just empty + // } + + // start from the end and find all u" cases + size_t pos = len = linestr.size(); + while((pos>0) && (pos = linestr.rfind("u\"", pos)) != std::string::npos) { + //printf("found doublequote at %d\n", pos); + if(fixAt(linestr, pos)) return true; + if(pos == 0) break; + pos--; + } + + // reset and find all u' cases + pos = len = linestr.size(); + while((pos>0) && (pos = linestr.rfind("u'", pos)) != std::string::npos) { + //printf("found singlequote at %d\n", pos); + if(fixAt(linestr, pos)) return true; + if(pos == 0) break; + pos--; + } + + // reset and find all u8" cases + pos = len = linestr.size(); + while((pos>0) && (pos = linestr.rfind("u8\"", pos)) != std::string::npos) { + if(fixAt(linestr, pos)) return true; + if(pos == 0) break; + pos--; + } + + //fprintf(stderr, "%d - fixed\n", no); + return false; +} + +int convert(const std::string &infile, const std::string &outfile) { + fprintf(stderr, "escapesrc: %s -> %s\n", infile.c_str(), outfile.c_str()); + + std::ifstream inf; + + inf.open(infile.c_str(), std::ios::in); + + if(!inf.is_open()) { + fprintf(stderr, "%s: could not open input file %s\n", prog.c_str(), infile.c_str()); + cleanup(outfile); + return 1; + } + + std::ofstream outf; + + outf.open(outfile.c_str(), std::ios::out); + + if(!outf.is_open()) { + fprintf(stderr, "%s: could not open output file %s\n", prog.c_str(), outfile.c_str()); + return 1; + } + + // TODO: any platform variations of #line? + outf << "#line 1 \"" << infile << "\"" << '\n'; + + int no = 0; + std::string linestr; + while( getline( inf, linestr)) { + no++; + if(fixLine(no, linestr)) { + outf.close(); + fprintf(stderr, "%s:%d: Fixup failed by %s\n", infile.c_str(), no, prog.c_str()); + cleanup(outfile); + return 1; + } + outf << linestr << '\n'; + } + + return 0; +} + +int main(int argc, const char *argv[]) { + prog = argv[0]; + + if(argc != 3) { + usage(); + return 1; + } + + std::string infile = argv[1]; + std::string outfile = argv[2]; + + return convert(infile, outfile); +} + + +#include "utf_impl.cpp" diff --git a/deps/icu-small/source/tools/escapesrc/expect-simple.cpp b/deps/icu-small/source/tools/escapesrc/expect-simple.cpp new file mode 100644 index 00000000000000..a6019a8d403f76 --- /dev/null +++ b/deps/icu-small/source/tools/escapesrc/expect-simple.cpp @@ -0,0 +1,17 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +u"sa\u0127\u0127a"; +u'\u6587'; +u"\U000219F2"; +u"\u039C\u03C5\u03C3\u03C4\u03AE\u03C1\u03B9\u03BF"; + + u"sa\u0127\u0127a"; + u'\u6587'; u"\U000219F2"; + +"\x20\xCC\x81"; +"\xCC\x88\x20"; +"\x73\x61\xC4\xA7\xC4\xA7\x61"; +"\xE6\x96\x87"; +"\xF0\xA1\xA7\xB2"; +"\x73\x61\xC4\xA7\xC4\xA7\x61"; diff --git a/deps/icu-small/source/tools/escapesrc/tblgen.cpp b/deps/icu-small/source/tools/escapesrc/tblgen.cpp new file mode 100644 index 00000000000000..9bf59a9db9a5df --- /dev/null +++ b/deps/icu-small/source/tools/escapesrc/tblgen.cpp @@ -0,0 +1,80 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" +#include "unicode/ucnv.h" +#include "unicode/uniset.h" +#include + +static const char *kConverter = "ibm-1047"; + +int main(int argc, const char *argv[]) { + printf("// %s\n", U_COPYRIGHT_STRING); + printf("// generated by tblgen. You weren't going to edit it by hand, were you?\n"); + printf("\n"); + + UErrorCode status = U_ZERO_ERROR; + LocalUConverterPointer cnv(ucnv_open(kConverter, &status)); + + if(U_FAILURE(status)) { + fprintf(stderr, "Failed to open %s: %s\n", kConverter, u_errorName(status)); + return 1; + } + + printf("static const char cp1047_8859_1[256] = { \n"); + for(int i=0x00; i<0x100; i++) { + char cp1047[1]; + cp1047[0] = i; + UChar u[1]; + UChar *target = u; + const char *source = cp1047; + ucnv_toUnicode(cnv.getAlias(), &target, u+1, &source, cp1047+1, nullptr, true, &status); + if(U_FAILURE(status)) { + fprintf(stderr, "Conversion failure at #%X: %s\n", i, u_errorName(status)); + return 2; + } + printf(" (char)0x%02X, /* %02X */\n", u[0], i); + } + printf("};\n\n"); + + // + // UnicodeSet oldIllegal("[:print:]", status); // [a-zA-Z0-9_}{#)(><%:;.?*+-/^&|~!=,\\u005b\\u005d\\u005c]", status); + UnicodeSet oldIllegal("[0-9 a-z A-Z " + "_ \\{ \\} \\[ \\] # \\( \\) < > % \\: ; . " + "? * + \\- / \\^ \\& | ~ ! = , \\ \" ' ]", status); + + /* + +http://www.lirmm.fr/~ducour/Doc-objets/ISO+IEC+14882-1998.pdf ( note: 1998 ) page 10, section 2.2 says: + +1 The basic source character set consists of 96 characters: the space character, the control characters repre- 15) +senting horizontal tab, vertical tab, form feed, and new-line, plus the following 91 graphical characters: +a b c d e f g h i j k l m n opqrstuvwxyz +A B C D E F G H I J K L M N OPQRSTUVWXYZ +0 12 3 4 5 6 7 8 9 + _ { } [ ] # ( ) < > % : ; . ?*+-/^&|~!=,\" +2 The universal-character-name construct provides a way to name other characters. hex-quad: +hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit +universal-character-name: \u hex-quad +\U hex-quad hex-quad +The character designated by the universal-character-name \UNNNNNNNN is that character whose character short name in ISO/IEC 10646 is NNNNNNNN; the character designated by the universal-character-name \uNNNN is that character whose character short name in ISO/IEC 10646 is 0000NNNN. If the hexadecimal value for a universal character name is less than 0x20 or in the range 0x7F-0x9F (inclusive), or if the uni- versal character name designates a character in the basic source character set, then the program is ill- formed. + + +So basically: printable ASCII plus 0x00-0x1F, 0x7F-0x9F, was all illegal. + +Some discussion at http://unicode.org/mail-arch/unicode-ml/y2003-m10/0471.html + + */ + + + + printf("static const bool oldIllegal[256] = { \n"); + for(UChar i=0x00; i<0x100;i++) { + printf(" %s, /* U+%04X */\n", + (oldIllegal.contains(i))?" true":"false", + i); + } + printf("};\n\n"); + + return 0; +} diff --git a/deps/icu-small/source/tools/escapesrc/test-nochange.cpp b/deps/icu-small/source/tools/escapesrc/test-nochange.cpp new file mode 100644 index 00000000000000..8c0d04b8099201 --- /dev/null +++ b/deps/icu-small/source/tools/escapesrc/test-nochange.cpp @@ -0,0 +1,5 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// This is a source file with no changes needed in it. +// In fact, the only non-ASCII character is the comment line at top. diff --git a/deps/icu-small/source/tools/escapesrc/test-simple.cpp b/deps/icu-small/source/tools/escapesrc/test-simple.cpp new file mode 100644 index 00000000000000..b03f28f7067295 --- /dev/null +++ b/deps/icu-small/source/tools/escapesrc/test-simple.cpp @@ -0,0 +1,17 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +u"saħħa"; +u'文'; +u"𡧲"; +u"Μυστήριο"; + + u"saħħa"; + u'文'; u"𡧲"; + +u8" \u0301"; +u8"\u0308 "; +u8"saħħa"; +u8"文"; +u8"𡧲"; +u8"saħ\u0127a"; diff --git a/deps/icu-small/source/tools/genccode/genccode.c b/deps/icu-small/source/tools/genccode/genccode.c index 2534820bac33b6..d35b5890105d9c 100644 --- a/deps/icu-small/source/tools/genccode/genccode.c +++ b/deps/icu-small/source/tools/genccode/genccode.c @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: gennames.c - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/gencmn/gencmn.c b/deps/icu-small/source/tools/gencmn/gencmn.c index d328a305215159..77f0c20c6131a4 100644 --- a/deps/icu-small/source/tools/gencmn/gencmn.c +++ b/deps/icu-small/source/tools/gencmn/gencmn.c @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: gencmn.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/genrb/derb.cpp b/deps/icu-small/source/tools/genrb/derb.cpp index 22e275ef353700..ac26d95be4ca01 100644 --- a/deps/icu-small/source/tools/genrb/derb.cpp +++ b/deps/icu-small/source/tools/genrb/derb.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: derb.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/genrb/errmsg.c b/deps/icu-small/source/tools/genrb/errmsg.c index 7340f01af2a7d8..603f26a174c4e9 100644 --- a/deps/icu-small/source/tools/genrb/errmsg.c +++ b/deps/icu-small/source/tools/genrb/errmsg.c @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/errmsg.h b/deps/icu-small/source/tools/genrb/errmsg.h index 5026ecf7be54bb..e01b9558f03813 100644 --- a/deps/icu-small/source/tools/genrb/errmsg.h +++ b/deps/icu-small/source/tools/genrb/errmsg.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/genrb.cpp b/deps/icu-small/source/tools/genrb/genrb.cpp index 685fb5884e405c..68870bd90a175d 100644 --- a/deps/icu-small/source/tools/genrb/genrb.cpp +++ b/deps/icu-small/source/tools/genrb/genrb.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/genrb.h b/deps/icu-small/source/tools/genrb/genrb.h index 99c604f7809454..019020a34a9821 100644 --- a/deps/icu-small/source/tools/genrb/genrb.h +++ b/deps/icu-small/source/tools/genrb/genrb.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/parse.cpp b/deps/icu-small/source/tools/genrb/parse.cpp index f448daab6cc460..88b08c21d0c72c 100644 --- a/deps/icu-small/source/tools/genrb/parse.cpp +++ b/deps/icu-small/source/tools/genrb/parse.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/parse.h b/deps/icu-small/source/tools/genrb/parse.h index d7341be6dd9fc4..dfe3b8dda06e55 100644 --- a/deps/icu-small/source/tools/genrb/parse.h +++ b/deps/icu-small/source/tools/genrb/parse.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/prscmnts.cpp b/deps/icu-small/source/tools/genrb/prscmnts.cpp index edae16c5c5f99b..5d494cd9ad3f2b 100644 --- a/deps/icu-small/source/tools/genrb/prscmnts.cpp +++ b/deps/icu-small/source/tools/genrb/prscmnts.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/prscmnts.h b/deps/icu-small/source/tools/genrb/prscmnts.h index c9958cd0713119..82cf0deaa13f96 100644 --- a/deps/icu-small/source/tools/genrb/prscmnts.h +++ b/deps/icu-small/source/tools/genrb/prscmnts.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/rbutil.c b/deps/icu-small/source/tools/genrb/rbutil.c index 174b4d7b44c4c6..808d35bb1b3d7c 100644 --- a/deps/icu-small/source/tools/genrb/rbutil.c +++ b/deps/icu-small/source/tools/genrb/rbutil.c @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/rbutil.h b/deps/icu-small/source/tools/genrb/rbutil.h index d2a303516ab820..9a12c509596e46 100644 --- a/deps/icu-small/source/tools/genrb/rbutil.h +++ b/deps/icu-small/source/tools/genrb/rbutil.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/read.c b/deps/icu-small/source/tools/genrb/read.c index 313fb61677f01f..c20b4510a28ac4 100644 --- a/deps/icu-small/source/tools/genrb/read.c +++ b/deps/icu-small/source/tools/genrb/read.c @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/read.h b/deps/icu-small/source/tools/genrb/read.h index 74b8c823a2e970..e5b8d155dad2e5 100644 --- a/deps/icu-small/source/tools/genrb/read.h +++ b/deps/icu-small/source/tools/genrb/read.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/reslist.cpp b/deps/icu-small/source/tools/genrb/reslist.cpp index 9420184a9df806..2e04bbce21ef74 100644 --- a/deps/icu-small/source/tools/genrb/reslist.cpp +++ b/deps/icu-small/source/tools/genrb/reslist.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -271,7 +271,7 @@ StringBaseResource::StringBaseResource(SRBRoot *bundle, const char *tag, int8_t return; } - fString.setTo(value, len); + fString.setTo(ConstChar16Ptr(value), len); fString.getTerminatedBuffer(); // Some code relies on NUL-termination. if (U_SUCCESS(errorCode) && fString.isBogus()) { errorCode = U_MEMORY_ALLOCATION_ERROR; @@ -1031,7 +1031,7 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, if (f16BitUnits.length() <= 1) { // no pool strings to checksum } else if (U_IS_BIG_ENDIAN) { - checksum = computeCRC((const char *)f16BitUnits.getBuffer(), + checksum = computeCRC(reinterpret_cast(f16BitUnits.getBuffer()), (uint32_t)f16BitUnits.length() * 2, checksum); } else { // Swap to big-endian so we get the same checksum on all platforms @@ -1039,7 +1039,7 @@ void SRBRoot::write(const char *outputDir, const char *outputPkg, UnicodeString s(f16BitUnits); s.append((UChar)1); // Ensure that we own this buffer. assert(!s.isBogus()); - uint16_t *p = (uint16_t *)s.getBuffer(); + uint16_t *p = const_cast(reinterpret_cast(s.getBuffer())); for (int32_t count = f16BitUnits.length(); count > 0; --count) { uint16_t x = *p; *p++ = (uint16_t)((x << 8) | (x >> 8)); diff --git a/deps/icu-small/source/tools/genrb/reslist.h b/deps/icu-small/source/tools/genrb/reslist.h index 614be2d10f9c56..53ade5b82c07e8 100644 --- a/deps/icu-small/source/tools/genrb/reslist.h +++ b/deps/icu-small/source/tools/genrb/reslist.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -304,7 +304,7 @@ class StringBaseResource : public SResource { StringBaseResource(int8_t type, const UChar *value, int32_t len, UErrorCode &errorCode); virtual ~StringBaseResource(); - const UChar *getBuffer() const { return fString.getBuffer(); } + const UChar *getBuffer() const { return icu::toUCharPtr(fString.getBuffer()); } int32_t length() const { return fString.length(); } virtual void handlePreWrite(uint32_t *byteOffset); diff --git a/deps/icu-small/source/tools/genrb/rle.c b/deps/icu-small/source/tools/genrb/rle.c index 4a69cd52985ad7..08495c2b4f4666 100644 --- a/deps/icu-small/source/tools/genrb/rle.c +++ b/deps/icu-small/source/tools/genrb/rle.c @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/rle.h b/deps/icu-small/source/tools/genrb/rle.h index 93d51a3750e8b2..9f580733d5846b 100644 --- a/deps/icu-small/source/tools/genrb/rle.h +++ b/deps/icu-small/source/tools/genrb/rle.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/ustr.c b/deps/icu-small/source/tools/genrb/ustr.c index 1631a205ff9fe0..f1436ae8aec172 100644 --- a/deps/icu-small/source/tools/genrb/ustr.c +++ b/deps/icu-small/source/tools/genrb/ustr.c @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/ustr.h b/deps/icu-small/source/tools/genrb/ustr.h index c27a78104fbdb1..91483d1f0fc0a5 100644 --- a/deps/icu-small/source/tools/genrb/ustr.h +++ b/deps/icu-small/source/tools/genrb/ustr.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/wrtjava.cpp b/deps/icu-small/source/tools/genrb/wrtjava.cpp index 329753717b1f64..a0d72f72d8fe0f 100644 --- a/deps/icu-small/source/tools/genrb/wrtjava.cpp +++ b/deps/icu-small/source/tools/genrb/wrtjava.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/genrb/wrtxml.cpp b/deps/icu-small/source/tools/genrb/wrtxml.cpp index 62fdd2427cd249..2bfcfebf9efd70 100644 --- a/deps/icu-small/source/tools/genrb/wrtxml.cpp +++ b/deps/icu-small/source/tools/genrb/wrtxml.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -73,7 +73,7 @@ static int32_t write_utf8_file(FileStream* fileStream, UnicodeString outString) u_strToUTF8(NULL, 0, &len, - outString.getBuffer(), + toUCharPtr(outString.getBuffer()), outString.length(), &status); @@ -85,7 +85,7 @@ static int32_t write_utf8_file(FileStream* fileStream, UnicodeString outString) u_strToUTF8(dest, len, &len, - outString.getBuffer(), + toUCharPtr(outString.getBuffer()), outString.length(), &status); diff --git a/deps/icu-small/source/tools/icupkg/icupkg.cpp b/deps/icu-small/source/tools/icupkg/icupkg.cpp index 20239304410e7a..ea7be4a90923fd 100644 --- a/deps/icu-small/source/tools/icupkg/icupkg.cpp +++ b/deps/icu-small/source/tools/icupkg/icupkg.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: icupkg.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/pkgdata/pkgdata.cpp b/deps/icu-small/source/tools/pkgdata/pkgdata.cpp index bf933186025baf..d4dc271732d80f 100644 --- a/deps/icu-small/source/tools/pkgdata/pkgdata.cpp +++ b/deps/icu-small/source/tools/pkgdata/pkgdata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2000-2016, International Business Machines @@ -26,7 +26,7 @@ #include "putilimp.h" #if U_HAVE_POPEN -#if (U_PF_MINGW <= U_PLATFORM || U_PLATFORM <= U_PF_CYGWIN) && defined(__STRICT_ANSI__) +#if (U_PF_MINGW <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN) && defined(__STRICT_ANSI__) /* popen/pclose aren't defined in strict ANSI on Cygwin and MinGW */ #undef __STRICT_ANSI__ #endif @@ -121,7 +121,9 @@ enum { LIBNAME, QUIET, WITHOUT_ASSEMBLY, - PDS_BUILD + PDS_BUILD, + UWP_BUILD, + UWP_ARM_BUILD }; /* This sets the modes that are available */ @@ -163,7 +165,9 @@ static UOption options[]={ /*18*/ UOPTION_DEF( "libname", 'L', UOPT_REQUIRES_ARG), /*19*/ UOPTION_DEF( "quiet", 'q', UOPT_NO_ARG), /*20*/ UOPTION_DEF( "without-assembly", 'w', UOPT_NO_ARG), - /*21*/ UOPTION_DEF( "zos-pds-build", 'z', UOPT_NO_ARG) + /*21*/ UOPTION_DEF("zos-pds-build", 'z', UOPT_NO_ARG), + /*22*/ UOPTION_DEF("windows-uwp-build", 'u', UOPT_NO_ARG), + /*23*/ UOPTION_DEF("windows-uwp-arm-build", 'a', UOPT_NO_ARG) }; /* This enum and the following char array should be kept in sync. */ @@ -250,9 +254,11 @@ const char options_help[][320]={ "Specify a version when packaging in dll or static mode", "Add package to all file names if not present", "Library name to build (if different than package name)", - "Quite mode. (e.g. Do not output a readme file for static libraries)", + "Quiet mode. (e.g. Do not output a readme file for static libraries)", "Build the data without assembly code", - "Build PDS dataset (zOS build only)" + "Build PDS dataset (zOS build only)", + "Build for Universal Windows Platform (Windows build only)", + "Set DLL machine type for UWP to target windows ARM (Windows UWP build only)" }; const char *progname = "PKGDATA"; @@ -1751,7 +1757,14 @@ static int32_t pkg_createWithoutAssemblyCode(UPKGOptions *o, const char *targetD #ifdef WINDOWS_WITH_MSVC #define LINK_CMD "link.exe /nologo /release /out:" -#define LINK_FLAGS "/DLL /NOENTRY /MANIFEST:NO /base:0x4ad00000 /implib:" +#define LINK_FLAGS "/DLL /NOENTRY /MANIFEST:NO /implib:" +#ifdef _WIN64 +#define LINK_EXTRA_UWP_FLAGS "/NXCOMPAT /DYNAMICBASE /APPCONTAINER " +#else +#define LINK_EXTRA_UWP_FLAGS "/NXCOMPAT /SAFESEH /DYNAMICBASE /APPCONTAINER /MACHINE:X86" +#endif +#define LINK_EXTRA_UWP_FLAGS_ARM "/NXCOMPAT /DYNAMICBASE /APPCONTAINER /MACHINE:ARM" +#define LINK_EXTRA_NO_UWP_FLAGS "/base:0x4ad00000 " #define LIB_CMD "LIB.exe /nologo /out:" #define LIB_FILE "icudt.lib" #define LIB_EXT UDATA_LIB_SUFFIX @@ -1831,14 +1844,33 @@ static int32_t pkg_createWindowsDLL(const char mode, const char *gencFilePath, U return 0; } - sprintf(cmd, "%s\"%s\" %s\"%s\" \"%s\" %s", - LINK_CMD, - dllFilePath, - LINK_FLAGS, - libFilePath, - gencFilePath, - resFilePath - ); + char *extraFlags = ""; +#ifdef WINDOWS_WITH_MSVC + if (options[UWP_BUILD].doesOccur) + { + if (options[UWP_ARM_BUILD].doesOccur) + { + extraFlags = LINK_EXTRA_UWP_FLAGS_ARM; + } + else + { + extraFlags = LINK_EXTRA_UWP_FLAGS; + } + } + else + { + extraFlags = LINK_EXTRA_NO_UWP_FLAGS; + } +#endif + sprintf(cmd, "%s\"%s\" %s %s\"%s\" \"%s\" %s", + LINK_CMD, + dllFilePath, + extraFlags, + LINK_FLAGS, + libFilePath, + gencFilePath, + resFilePath + ); } result = runCommand(cmd, TRUE); diff --git a/deps/icu-small/source/tools/pkgdata/pkgtypes.c b/deps/icu-small/source/tools/pkgdata/pkgtypes.c index eadf634db385e8..43ee3dfb5e2c33 100644 --- a/deps/icu-small/source/tools/pkgdata/pkgtypes.c +++ b/deps/icu-small/source/tools/pkgdata/pkgtypes.c @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /************************************************************************** * diff --git a/deps/icu-small/source/tools/pkgdata/pkgtypes.h b/deps/icu-small/source/tools/pkgdata/pkgtypes.h index c7eeba42cb218e..3297d0a2daf4d5 100644 --- a/deps/icu-small/source/tools/pkgdata/pkgtypes.h +++ b/deps/icu-small/source/tools/pkgdata/pkgtypes.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /************************************************************************** * diff --git a/deps/icu-small/source/tools/toolutil/collationinfo.cpp b/deps/icu-small/source/tools/toolutil/collationinfo.cpp index bbb1839ef1a5a4..6bad90e13331c7 100644 --- a/deps/icu-small/source/tools/toolutil/collationinfo.cpp +++ b/deps/icu-small/source/tools/toolutil/collationinfo.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/toolutil/collationinfo.h b/deps/icu-small/source/tools/toolutil/collationinfo.h index 48cd5561844cb8..815b89d40d68e6 100644 --- a/deps/icu-small/source/tools/toolutil/collationinfo.h +++ b/deps/icu-small/source/tools/toolutil/collationinfo.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/toolutil/dbgutil.cpp b/deps/icu-small/source/tools/toolutil/dbgutil.cpp index 345715163baacd..29bab927535e78 100644 --- a/deps/icu-small/source/tools/toolutil/dbgutil.cpp +++ b/deps/icu-small/source/tools/toolutil/dbgutil.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: @@ -117,7 +117,7 @@ U_CAPI int32_t udbg_stoi(const UnicodeString &s) { char ch[256]; - const UChar *u = s.getBuffer(); + const UChar *u = toUCharPtr(s.getBuffer()); int32_t len = s.length(); u_UCharsToChars(u, ch, len); ch[len] = 0; /* include terminating \0 */ @@ -129,7 +129,7 @@ U_CAPI double udbg_stod(const UnicodeString &s) { char ch[256]; - const UChar *u = s.getBuffer(); + const UChar *u = toUCharPtr(s.getBuffer()); int32_t len = s.length(); u_UCharsToChars(u, ch, len); ch[len] = 0; /* include terminating \0 */ diff --git a/deps/icu-small/source/tools/toolutil/dbgutil.h b/deps/icu-small/source/tools/toolutil/dbgutil.h index 704090cc21d6c1..314a9ae885d5fa 100644 --- a/deps/icu-small/source/tools/toolutil/dbgutil.h +++ b/deps/icu-small/source/tools/toolutil/dbgutil.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* diff --git a/deps/icu-small/source/tools/toolutil/denseranges.cpp b/deps/icu-small/source/tools/toolutil/denseranges.cpp index 3b83715f28cfce..f5e52b1bbb53bb 100644 --- a/deps/icu-small/source/tools/toolutil/denseranges.cpp +++ b/deps/icu-small/source/tools/toolutil/denseranges.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: denseranges.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/denseranges.h b/deps/icu-small/source/tools/toolutil/denseranges.h index 7b072f4654ce59..c489ca47d8915f 100644 --- a/deps/icu-small/source/tools/toolutil/denseranges.h +++ b/deps/icu-small/source/tools/toolutil/denseranges.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: denseranges.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/filestrm.c b/deps/icu-small/source/tools/toolutil/filestrm.cpp similarity index 98% rename from deps/icu-small/source/tools/toolutil/filestrm.c rename to deps/icu-small/source/tools/toolutil/filestrm.cpp index 446125de6b1a83..cfffa1b75d7724 100644 --- a/deps/icu-small/source/tools/toolutil/filestrm.c +++ b/deps/icu-small/source/tools/toolutil/filestrm.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/tools/toolutil/filestrm.h b/deps/icu-small/source/tools/toolutil/filestrm.h index b42345140681c6..86fac3063f35e3 100644 --- a/deps/icu-small/source/tools/toolutil/filestrm.h +++ b/deps/icu-small/source/tools/toolutil/filestrm.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** diff --git a/deps/icu-small/source/tools/toolutil/filetools.cpp b/deps/icu-small/source/tools/toolutil/filetools.cpp index b0d4ed81a560dd..176a791b0df853 100644 --- a/deps/icu-small/source/tools/toolutil/filetools.cpp +++ b/deps/icu-small/source/tools/toolutil/filetools.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2009-2013, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/filetools.h b/deps/icu-small/source/tools/toolutil/filetools.h index 5ede02761ac46a..6a25c3601c0178 100644 --- a/deps/icu-small/source/tools/toolutil/filetools.h +++ b/deps/icu-small/source/tools/toolutil/filetools.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: filetools.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/flagparser.c b/deps/icu-small/source/tools/toolutil/flagparser.cpp similarity index 95% rename from deps/icu-small/source/tools/toolutil/flagparser.c rename to deps/icu-small/source/tools/toolutil/flagparser.cpp index c87beb147cf44b..c8d791c636d14a 100644 --- a/deps/icu-small/source/tools/toolutil/flagparser.c +++ b/deps/icu-small/source/tools/toolutil/flagparser.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2009-2015, International Business Machines @@ -35,8 +35,8 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, goto parseFlagsFile_cleanup; } - buffer = uprv_malloc(sizeof(char) * currentBufferSize); - tmpFlagBuffer = uprv_malloc(sizeof(char) * flagBufferSize); + buffer = (char *)uprv_malloc(sizeof(char) * currentBufferSize); + tmpFlagBuffer = (char *)uprv_malloc(sizeof(char) * flagBufferSize); if (buffer == NULL || tmpFlagBuffer == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; @@ -48,7 +48,7 @@ parseFlagsFile(const char *fileName, char **flagBuffer, int32_t flagBufferSize, allocateMoreSpace = FALSE; currentBufferSize *= 2; uprv_free(buffer); - buffer = uprv_malloc(sizeof(char) * currentBufferSize); + buffer = (char *)uprv_malloc(sizeof(char) * currentBufferSize); if (buffer == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; goto parseFlagsFile_cleanup; diff --git a/deps/icu-small/source/tools/toolutil/flagparser.h b/deps/icu-small/source/tools/toolutil/flagparser.h index 4aa03c8a5fdca4..aa425471642ba5 100644 --- a/deps/icu-small/source/tools/toolutil/flagparser.h +++ b/deps/icu-small/source/tools/toolutil/flagparser.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: flagparser.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/package.cpp b/deps/icu-small/source/tools/toolutil/package.cpp index d069147708ed3d..e3354b3524325c 100644 --- a/deps/icu-small/source/tools/toolutil/package.cpp +++ b/deps/icu-small/source/tools/toolutil/package.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: package.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -1290,7 +1290,7 @@ void Package::setItemCapacity(int32_t max) Item *oldItems = items; if(newItems == NULL) { fprintf(stderr, "icupkg: Out of memory trying to allocate %lu bytes for %d items\n", - (unsigned long)max*sizeof(items[0]), max); + (unsigned long)(max*sizeof(items[0])), max); exit(U_MEMORY_ALLOCATION_ERROR); } if(items && itemCount>0) { diff --git a/deps/icu-small/source/tools/toolutil/package.h b/deps/icu-small/source/tools/toolutil/package.h index 4d60202999243b..3263c84feb4c37 100644 --- a/deps/icu-small/source/tools/toolutil/package.h +++ b/deps/icu-small/source/tools/toolutil/package.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: package.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/pkg_genc.c b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp similarity index 96% rename from deps/icu-small/source/tools/toolutil/pkg_genc.c rename to deps/icu-small/source/tools/toolutil/pkg_genc.cpp index c85a12322b9381..ec2cb2b67f0b84 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_genc.c +++ b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2009-2016, International Business Machines @@ -283,7 +283,7 @@ writeAssemblyCode(const char *filename, const char *destdir, const char *optEntr uprv_strcpy(outFilePath, bufferStr); } -#ifdef WINDOWS_WITH_GNUC +#if defined (WINDOWS_WITH_GNUC) && U_PLATFORM != U_PF_CYGWIN /* Need to fix the file seperator character when using MinGW. */ swapFileSepChar(outFilePath, U_FILE_SEP_CHAR, '/'); #endif @@ -687,12 +687,19 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char /* _M_IA64 should be defined in windows.h */ # if defined(_M_IA64) *pCPU=IMAGE_FILE_MACHINE_IA64; + *pBits = 64; # elif defined(_M_AMD64) - *pCPU=IMAGE_FILE_MACHINE_AMD64; +// link.exe does not really care about the .obj machine type and this will +// allow us to build a dll for both ARM & x64 with an amd64 built tool +// ARM is same as x64 except for first 2 bytes of object file + *pCPU = IMAGE_FILE_MACHINE_UNKNOWN; + // *pCPU = IMAGE_FILE_MACHINE_ARMNT; // If we wanted to be explicit + // *pCPU = IMAGE_FILE_MACHINE_AMD64; // We would use one of these names + *pBits = 64; // Doesn't seem to be used for anything interesting? # else - *pCPU=IMAGE_FILE_MACHINE_I386; + *pCPU=IMAGE_FILE_MACHINE_I386; // We would use one of these names + *pBits = 32; # endif - *pBits= *pCPU==IMAGE_FILE_MACHINE_I386 ? 32 : 64; *pIsBigEndian=FALSE; #else # error "Unknown platform for CAN_GENERATE_OBJECTS." @@ -708,7 +715,7 @@ getArchitecture(uint16_t *pCPU, uint16_t *pBits, UBool *pIsBigEndian, const char length=T_FileStream_read(in, buffer.bytes, sizeof(buffer.bytes)); #ifdef U_ELF - if(lengthbasename, ((File *)file2)->basename); } +U_CDECL_END static void fixDirToTreePath(char *s) { + (void)s; #if (U_FILE_SEP_CHAR != U_TREE_ENTRY_SEP_CHAR) || ((U_FILE_ALT_SEP_CHAR != U_FILE_SEP_CHAR) && (U_FILE_ALT_SEP_CHAR != U_TREE_ENTRY_SEP_CHAR)) char *t; #endif diff --git a/deps/icu-small/source/tools/toolutil/pkg_gencmn.h b/deps/icu-small/source/tools/toolutil/pkg_gencmn.h index 62f8327cdfdf91..238239960ae682 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_gencmn.h +++ b/deps/icu-small/source/tools/toolutil/pkg_gencmn.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2008, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/pkg_icu.cpp b/deps/icu-small/source/tools/toolutil/pkg_icu.cpp index e679c23be84f99..ce0bfc215b7199 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_icu.cpp +++ b/deps/icu-small/source/tools/toolutil/pkg_icu.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2008-2015, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/pkg_icu.h b/deps/icu-small/source/tools/toolutil/pkg_icu.h index 3d620f78dfb6cc..638056e60b8c2b 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_icu.h +++ b/deps/icu-small/source/tools/toolutil/pkg_icu.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /****************************************************************************** * Copyright (C) 2008-2016, International Business Machines diff --git a/deps/icu-small/source/tools/toolutil/pkg_imp.h b/deps/icu-small/source/tools/toolutil/pkg_imp.h index c9fe81bd73a20a..29abd8d83c0a18 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_imp.h +++ b/deps/icu-small/source/tools/toolutil/pkg_imp.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: pkg_imp.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/pkgitems.cpp b/deps/icu-small/source/tools/toolutil/pkgitems.cpp index 91c85201101c01..dd414c2f873e22 100644 --- a/deps/icu-small/source/tools/toolutil/pkgitems.cpp +++ b/deps/icu-small/source/tools/toolutil/pkgitems.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: pkgitems.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/ppucd.cpp b/deps/icu-small/source/tools/toolutil/ppucd.cpp index 18d317e3e330f2..cccde81c7abfac 100644 --- a/deps/icu-small/source/tools/toolutil/ppucd.cpp +++ b/deps/icu-small/source/tools/toolutil/ppucd.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ppucd.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -515,12 +515,12 @@ PreparsedUCD::parseCodePointRange(const char *s, UChar32 &start, UChar32 &end, U void PreparsedUCD::parseString(const char *s, UnicodeString &uni, UErrorCode &errorCode) { - UChar *buffer=uni.getBuffer(-1); + UChar *buffer=toUCharPtr(uni.getBuffer(-1)); int32_t length=u_parseString(s, buffer, uni.getCapacity(), NULL, &errorCode); if(errorCode==U_BUFFER_OVERFLOW_ERROR) { errorCode=U_ZERO_ERROR; uni.releaseBuffer(0); - buffer=uni.getBuffer(length); + buffer=toUCharPtr(uni.getBuffer(length)); length=u_parseString(s, buffer, uni.getCapacity(), NULL, &errorCode); } uni.releaseBuffer(length); diff --git a/deps/icu-small/source/tools/toolutil/ppucd.h b/deps/icu-small/source/tools/toolutil/ppucd.h index 593bd247996c23..3cd6feee00e05d 100644 --- a/deps/icu-small/source/tools/toolutil/ppucd.h +++ b/deps/icu-small/source/tools/toolutil/ppucd.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ppucd.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/swapimpl.cpp b/deps/icu-small/source/tools/toolutil/swapimpl.cpp index 6cc21623016849..620a387e244091 100644 --- a/deps/icu-small/source/tools/toolutil/swapimpl.cpp +++ b/deps/icu-small/source/tools/toolutil/swapimpl.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: swapimpl.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/swapimpl.h b/deps/icu-small/source/tools/toolutil/swapimpl.h index 0e4d41734433d2..8c6474f6626f89 100644 --- a/deps/icu-small/source/tools/toolutil/swapimpl.h +++ b/deps/icu-small/source/tools/toolutil/swapimpl.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: swapimpl.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/toolutil.cpp b/deps/icu-small/source/tools/toolutil/toolutil.cpp index bb393a2e7d0302..0f7d0984a8b232 100644 --- a/deps/icu-small/source/tools/toolutil/toolutil.cpp +++ b/deps/icu-small/source/tools/toolutil/toolutil.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: toolutil.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/toolutil.h b/deps/icu-small/source/tools/toolutil/toolutil.h index 026e75aeb2ef47..be07787a9fa950 100644 --- a/deps/icu-small/source/tools/toolutil/toolutil.h +++ b/deps/icu-small/source/tools/toolutil/toolutil.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: toolutil.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/ucbuf.cpp b/deps/icu-small/source/tools/toolutil/ucbuf.cpp index b6b0150afc1b48..5269c8177cab7f 100644 --- a/deps/icu-small/source/tools/toolutil/ucbuf.cpp +++ b/deps/icu-small/source/tools/toolutil/ucbuf.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/toolutil/ucbuf.h b/deps/icu-small/source/tools/toolutil/ucbuf.h index cb9509b427a718..48d41ef4cd2d95 100644 --- a/deps/icu-small/source/tools/toolutil/ucbuf.h +++ b/deps/icu-small/source/tools/toolutil/ucbuf.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* diff --git a/deps/icu-small/source/tools/toolutil/ucln_tu.cpp b/deps/icu-small/source/tools/toolutil/ucln_tu.cpp index 2f67641768e27e..5354fe1753ae6b 100644 --- a/deps/icu-small/source/tools/toolutil/ucln_tu.cpp +++ b/deps/icu-small/source/tools/toolutil/ucln_tu.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: diff --git a/deps/icu-small/source/tools/toolutil/ucm.c b/deps/icu-small/source/tools/toolutil/ucm.cpp similarity index 99% rename from deps/icu-small/source/tools/toolutil/ucm.c rename to deps/icu-small/source/tools/toolutil/ucm.cpp index 8d4cdfc40f1e45..28c3f3f4f89e0d 100644 --- a/deps/icu-small/source/tools/toolutil/ucm.c +++ b/deps/icu-small/source/tools/toolutil/ucm.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucm.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -199,9 +199,9 @@ compareMappings(UCMTable *lTable, const UCMapping *l, /* compare the flags */ return l->f-r->f; } - +U_CDECL_BEGIN /* sorting by Unicode first sorts mappings directly */ -static int32_t +static int32_t U_CALLCONV compareMappingsUnicodeFirst(const void *context, const void *left, const void *right) { return compareMappings( (UCMTable *)context, (const UCMapping *)left, @@ -209,7 +209,7 @@ compareMappingsUnicodeFirst(const void *context, const void *left, const void *r } /* sorting by bytes first sorts the reverseMap; use indirection to mappings */ -static int32_t +static int32_t U_CALLCONV compareMappingsBytesFirst(const void *context, const void *left, const void *right) { UCMTable *table=(UCMTable *)context; int32_t l=*(const int32_t *)left, r=*(const int32_t *)right; @@ -217,6 +217,7 @@ compareMappingsBytesFirst(const void *context, const void *left, const void *rig table, table->mappings+l, table, table->mappings+r, FALSE); } +U_CDECL_END U_CAPI void U_EXPORT2 ucm_sortTable(UCMTable *t) { @@ -310,6 +311,8 @@ enum { static uint8_t checkBaseExtUnicode(UCMStates *baseStates, UCMTable *base, UCMTable *ext, UBool moveToExt, UBool intersectBase) { + (void)baseStates; + UCMapping *mb, *me, *mbLimit, *meLimit; int32_t cmp; uint8_t result; @@ -1043,6 +1046,7 @@ ucm_mappingType(UCMStates *baseStates, UCMapping *m, UChar32 codePoints[UCNV_EXT_MAX_UCHARS], uint8_t bytes[UCNV_EXT_MAX_BYTES]) { + (void)codePoints; /* check validity of the bytes and count the characters in them */ int32_t count=ucm_countChars(baseStates, bytes, m->bLen); if(count<1) { diff --git a/deps/icu-small/source/tools/toolutil/ucm.h b/deps/icu-small/source/tools/toolutil/ucm.h index 0058adab5da1d1..3af939758552d7 100644 --- a/deps/icu-small/source/tools/toolutil/ucm.h +++ b/deps/icu-small/source/tools/toolutil/ucm.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -6,7 +6,7 @@ * Corporation and others. All Rights Reserved. ******************************************************************************* * file name: ucm.h - * encoding: US-ASCII + * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/ucmstate.c b/deps/icu-small/source/tools/toolutil/ucmstate.cpp similarity index 99% rename from deps/icu-small/source/tools/toolutil/ucmstate.c rename to deps/icu-small/source/tools/toolutil/ucmstate.cpp index 7c8559090b2a9b..277657522963fa 100644 --- a/deps/icu-small/source/tools/toolutil/ucmstate.c +++ b/deps/icu-small/source/tools/toolutil/ucmstate.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: ucmstate.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -916,10 +916,13 @@ compactToUnicodeHelper(UCMStates *states, } } -static int32_t +U_CDECL_BEGIN +static int32_t U_CALLCONV compareFallbacks(const void *context, const void *fb1, const void *fb2) { + (void)context; return ((const _MBCSToUFallback *)fb1)->offset-((const _MBCSToUFallback *)fb2)->offset; } +U_CDECL_END U_CAPI void U_EXPORT2 ucm_optimizeStates(UCMStates *states, diff --git a/deps/icu-small/source/tools/toolutil/udbgutil.cpp b/deps/icu-small/source/tools/toolutil/udbgutil.cpp index bbb814ba901c41..446e11aaf9084f 100644 --- a/deps/icu-small/source/tools/toolutil/udbgutil.cpp +++ b/deps/icu-small/source/tools/toolutil/udbgutil.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: @@ -351,8 +351,10 @@ int32_t udbg_enumByName(UDebugEnumType type, const char *value) { */ U_CAPI const char *udbg_getPlatform(void) { -#if U_PLATFORM_HAS_WIN32_API +#if U_PLATFORM_USES_ONLY_WIN32_API return "Windows"; +#elif U_PLATFORM == U_PF_CYGWIN + return "Cygwin"; #elif U_PLATFORM == U_PF_UNKNOWN return "unknown"; #elif U_PLATFORM == U_PF_DARWIN @@ -613,40 +615,6 @@ U_CAPI char *udbg_knownIssueURLFrom(const char *ticket, char *buf) { } -#if !U_HAVE_STD_STRING -const char *warning = "WARNING: Don't have std::string (STL) - known issue logs will be deficient."; - -U_CAPI void *udbg_knownIssue_openU(void *ptr, const char *ticket, char *where, const UChar *msg, UBool *firstForTicket, - UBool *firstForWhere) { - if(ptr==NULL) { - puts(warning); - } - printf("%s\tKnown Issue #%s\n", where, ticket); - - return (void*)warning; -} - -U_CAPI void *udbg_knownIssue_open(void *ptr, const char *ticket, char *where, const char *msg, UBool *firstForTicket, - UBool *firstForWhere) { - if(ptr==NULL) { - puts(warning); - } - if(msg==NULL) msg = ""; - printf("%s\tKnown Issue #%s \"%s\n", where, ticket, msg); - - return (void*)warning; -} - -U_CAPI UBool udbg_knownIssue_print(void *ptr) { - puts(warning); - return FALSE; -} - -U_CAPI void udbg_knownIssue_close(void *ptr) { - // nothing to do -} -#else - #include #include #include @@ -785,5 +753,3 @@ U_CAPI void udbg_knownIssue_close(void *ptr) { KnownIssues *t = static_cast(ptr); delete t; } - -#endif diff --git a/deps/icu-small/source/tools/toolutil/udbgutil.h b/deps/icu-small/source/tools/toolutil/udbgutil.h index 4bfb4cf86720a9..2f186e6ed87f26 100644 --- a/deps/icu-small/source/tools/toolutil/udbgutil.h +++ b/deps/icu-small/source/tools/toolutil/udbgutil.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ************************************************************************ diff --git a/deps/icu-small/source/tools/toolutil/unewdata.c b/deps/icu-small/source/tools/toolutil/unewdata.cpp similarity index 98% rename from deps/icu-small/source/tools/toolutil/unewdata.c rename to deps/icu-small/source/tools/toolutil/unewdata.cpp index f3b152c0796ce0..5c28e992c9a98b 100644 --- a/deps/icu-small/source/tools/toolutil/unewdata.c +++ b/deps/icu-small/source/tools/toolutil/unewdata.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unewdata.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/unewdata.h b/deps/icu-small/source/tools/toolutil/unewdata.h index 9cc39942258700..137fb49584a5ba 100644 --- a/deps/icu-small/source/tools/toolutil/unewdata.h +++ b/deps/icu-small/source/tools/toolutil/unewdata.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: unewdata.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/uoptions.c b/deps/icu-small/source/tools/toolutil/uoptions.cpp similarity index 98% rename from deps/icu-small/source/tools/toolutil/uoptions.c rename to deps/icu-small/source/tools/toolutil/uoptions.cpp index e5ce64a3728e99..53a77bcc4cc762 100644 --- a/deps/icu-small/source/tools/toolutil/uoptions.c +++ b/deps/icu-small/source/tools/toolutil/uoptions.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uoptions.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/uoptions.h b/deps/icu-small/source/tools/toolutil/uoptions.h index 72652feadba560..a7a2e96c61b19f 100644 --- a/deps/icu-small/source/tools/toolutil/uoptions.h +++ b/deps/icu-small/source/tools/toolutil/uoptions.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uoptions.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/uparse.c b/deps/icu-small/source/tools/toolutil/uparse.cpp similarity index 99% rename from deps/icu-small/source/tools/toolutil/uparse.c rename to deps/icu-small/source/tools/toolutil/uparse.cpp index a7142c3cba6cde..937728d78afb5b 100644 --- a/deps/icu-small/source/tools/toolutil/uparse.c +++ b/deps/icu-small/source/tools/toolutil/uparse.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uparse.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/uparse.h b/deps/icu-small/source/tools/toolutil/uparse.h index 5ad766cf104c85..df0e79a21fa644 100644 --- a/deps/icu-small/source/tools/toolutil/uparse.h +++ b/deps/icu-small/source/tools/toolutil/uparse.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: uparse.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/writesrc.c b/deps/icu-small/source/tools/toolutil/writesrc.cpp similarity index 98% rename from deps/icu-small/source/tools/toolutil/writesrc.c rename to deps/icu-small/source/tools/toolutil/writesrc.cpp index e3f14f2c46e377..c05a07acd3aa34 100644 --- a/deps/icu-small/source/tools/toolutil/writesrc.c +++ b/deps/icu-small/source/tools/toolutil/writesrc.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: writesrc.c -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -74,7 +74,7 @@ U_CAPI FILE * U_EXPORT2 usrc_create(const char *path, const char *filename, const char *generator) { // TODO: Add parameter for the first year this file was generated, not before 2016. static const char *header= - "// Copyright (C) 2016 and later: Unicode, Inc. and others.\n" + "// © 2016 and later: Unicode, Inc. and others.\n" "// License & terms of use: http://www.unicode.org/copyright.html\n" "//\n" "// Copyright (C) 1999-2016, International Business Machines\n" diff --git a/deps/icu-small/source/tools/toolutil/writesrc.h b/deps/icu-small/source/tools/toolutil/writesrc.h index c82bf3c3345edd..fdcf1f9a6b40f3 100644 --- a/deps/icu-small/source/tools/toolutil/writesrc.h +++ b/deps/icu-small/source/tools/toolutil/writesrc.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: writesrc.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * diff --git a/deps/icu-small/source/tools/toolutil/xmlparser.cpp b/deps/icu-small/source/tools/toolutil/xmlparser.cpp index 2fc6e1f78c21b1..ae7ef170207cf5 100644 --- a/deps/icu-small/source/tools/toolutil/xmlparser.cpp +++ b/deps/icu-small/source/tools/toolutil/xmlparser.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: xmlparser.cpp -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * @@ -209,7 +209,7 @@ UXMLParser::parseFile(const char *filename, UErrorCode &errorCode) { goto exit; } - buffer=src.getBuffer(bytesLength); + buffer=toUCharPtr(src.getBuffer(bytesLength)); if(buffer==NULL) { // unexpected failure to reserve some string capacity errorCode=U_MEMORY_ALLOCATION_ERROR; @@ -278,7 +278,7 @@ UXMLParser::parseFile(const char *filename, UErrorCode &errorCode) { pb=bytes; for(;;) { length=src.length(); - buffer=src.getBuffer(capacity); + buffer=toUCharPtr(src.getBuffer(capacity)); if(buffer==NULL) { // unexpected failure to reserve some string capacity errorCode=U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/tools/toolutil/xmlparser.h b/deps/icu-small/source/tools/toolutil/xmlparser.h index 5c08903f86ac1a..72f7ec8fa84645 100644 --- a/deps/icu-small/source/tools/toolutil/xmlparser.h +++ b/deps/icu-small/source/tools/toolutil/xmlparser.h @@ -1,4 +1,4 @@ -// Copyright (C) 2016 and later: Unicode, Inc. and others. +// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ******************************************************************************* @@ -8,7 +8,7 @@ * ******************************************************************************* * file name: xmlparser.h -* encoding: US-ASCII +* encoding: UTF-8 * tab size: 8 (not used) * indentation:4 * From a164c9a85b6bfc97c1e427fa4ca728bea58386af Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 21 Sep 2017 15:31:38 -0700 Subject: [PATCH 29/31] deps: ICU 60 bump - Update to released ICU 60.1, including: - CLDR 32 (many new languages and data improvements) - Unicode 10 (8,518 new characters, including four new scripts, 7,494 new Han characters, and 56 new emoji characters) - UTF-8 malformed bytes now handled according to W3C/WHATWG spec Fixes: https://github.com/nodejs/node/issues/15540 PR-URL: https://github.com/nodejs/node/pull/16876 Reviewed-By: James M Snell Reviewed-By: Michael Dawson --- LICENSE | 2 +- configure | 4 +- deps/icu-small/LICENSE | 2 +- deps/icu-small/README-SMALL-ICU.txt | 4 +- deps/icu-small/source/common/bmpset.cpp | 108 +- deps/icu-small/source/common/bmpset.h | 15 +- deps/icu-small/source/common/brkeng.cpp | 29 +- deps/icu-small/source/common/brkeng.h | 13 +- deps/icu-small/source/common/brkiter.cpp | 23 +- deps/icu-small/source/common/bytesinkutil.cpp | 123 + deps/icu-small/source/common/bytesinkutil.h | 53 + deps/icu-small/source/common/bytestream.cpp | 6 + deps/icu-small/source/common/caniter.cpp | 2 +- deps/icu-small/source/common/cmemory.h | 12 +- deps/icu-small/source/common/dictbe.cpp | 55 +- deps/icu-small/source/common/dictbe.h | 22 +- deps/icu-small/source/common/edits.cpp | 600 +- deps/icu-small/source/common/filteredbrk.cpp | 2 +- .../source/common/filterednormalizer2.cpp | 73 + deps/icu-small/source/common/hash.h | 34 + .../icu-small/source/common/listformatter.cpp | 2 +- .../source/common/loadednormalizer2impl.cpp | 4 +- deps/icu-small/source/common/locavailable.cpp | 6 +- deps/icu-small/source/common/locdispnames.cpp | 8 +- deps/icu-small/source/common/locdspnm.cpp | 5 +- deps/icu-small/source/common/loclikely.cpp | 5 +- deps/icu-small/source/common/locmap.cpp | 70 +- deps/icu-small/source/common/norm2_nfc_data.h | 1866 ++--- deps/icu-small/source/common/norm2allmodes.h | 54 +- deps/icu-small/source/common/normalizer2.cpp | 66 +- .../source/common/normalizer2impl.cpp | 1676 +++-- .../icu-small/source/common/normalizer2impl.h | 304 +- deps/icu-small/source/common/propname_data.h | 1724 ++--- deps/icu-small/source/common/putil.cpp | 137 +- deps/icu-small/source/common/putilimp.h | 33 +- deps/icu-small/source/common/rbbi.cpp | 976 +-- deps/icu-small/source/common/rbbi_cache.cpp | 630 ++ deps/icu-small/source/common/rbbi_cache.h | 203 + deps/icu-small/source/common/rbbicst.pl | 0 deps/icu-small/source/common/rbbidata.cpp | 76 +- deps/icu-small/source/common/rbbidata.h | 17 +- deps/icu-small/source/common/rbbirb.cpp | 66 +- deps/icu-small/source/common/rbbirb.h | 6 + deps/icu-small/source/common/rbbiscan.cpp | 5 + deps/icu-small/source/common/rbbisetb.cpp | 92 +- deps/icu-small/source/common/rbbisetb.h | 13 +- .../source/common/ubidi_props_data.h | 714 +- deps/icu-small/source/common/ucase.cpp | 2 + deps/icu-small/source/common/ucase.h | 12 +- .../source/common/ucase_props_data.h | 597 +- deps/icu-small/source/common/ucasemap.cpp | 527 +- deps/icu-small/source/common/ucasemap_imp.h | 86 +- .../common/ucasemap_titlecase_brkiter.cpp | 49 +- deps/icu-small/source/common/uchar.cpp | 5 +- .../source/common/uchar_props_data.h | 6614 +++++++++-------- .../source/common/ucharstriebuilder.cpp | 2 +- deps/icu-small/source/common/ucln_cmn.h | 2 +- deps/icu-small/source/common/ucnv_ct.cpp | 3 +- deps/icu-small/source/common/ucnv_lmb.cpp | 8 +- deps/icu-small/source/common/ucnv_u16.cpp | 14 +- deps/icu-small/source/common/ucnv_u8.cpp | 324 +- deps/icu-small/source/common/ucnvlat1.cpp | 5 +- deps/icu-small/source/common/ucnvmbcs.cpp | 171 +- deps/icu-small/source/common/ucurr.cpp | 173 +- deps/icu-small/source/common/udata.cpp | 8 +- deps/icu-small/source/common/uhash.cpp | 22 +- deps/icu-small/source/common/uhash.h | 19 + deps/icu-small/source/common/uinvchar.cpp | 4 +- deps/icu-small/source/common/ulist.cpp | 2 +- deps/icu-small/source/common/uloc.cpp | 16 +- deps/icu-small/source/common/uloc_tag.cpp | 6 +- deps/icu-small/source/common/umapfile.cpp | 8 +- deps/icu-small/source/common/umutex.cpp | 2 +- .../icu-small/source/common/unicode/brkiter.h | 24 +- .../source/common/unicode/bytestream.h | 33 +- .../icu-small/source/common/unicode/casemap.h | 177 +- .../source/common/unicode/char16ptr.h | 52 +- .../icu-small/source/common/unicode/docmain.h | 2 +- deps/icu-small/source/common/unicode/edits.h | 195 +- .../source/common/unicode/filteredbrk.h | 42 +- .../source/common/unicode/localpointer.h | 37 - deps/icu-small/source/common/unicode/locid.h | 2 +- .../source/common/unicode/normalizer2.h | 140 +- .../source/common/unicode/platform.h | 69 +- deps/icu-small/source/common/unicode/rbbi.h | 135 +- .../source/common/unicode/simpleformatter.h | 10 + .../source/common/unicode/stringoptions.h | 198 + .../source/common/unicode/stringtriebuilder.h | 18 +- .../source/common/unicode/ubiditransform.h | 31 +- deps/icu-small/source/common/unicode/ubrk.h | 3 +- .../source/common/unicode/ucasemap.h | 53 +- deps/icu-small/source/common/unicode/uchar.h | 80 +- deps/icu-small/source/common/unicode/uclean.h | 2 +- .../icu-small/source/common/unicode/uconfig.h | 9 +- .../source/common/unicode/udisplaycontext.h | 10 +- deps/icu-small/source/common/unicode/unistr.h | 23 +- deps/icu-small/source/common/unicode/unorm.h | 16 +- deps/icu-small/source/common/unicode/unorm2.h | 25 +- .../icu-small/source/common/unicode/urename.h | 3 + .../icu-small/source/common/unicode/uscript.h | 9 +- .../icu-small/source/common/unicode/ustring.h | 10 - deps/icu-small/source/common/unicode/utext.h | 2 +- deps/icu-small/source/common/unicode/utf.h | 34 +- deps/icu-small/source/common/unicode/utf16.h | 132 +- deps/icu-small/source/common/unicode/utf8.h | 148 +- .../icu-small/source/common/unicode/utf_old.h | 19 +- .../icu-small/source/common/unicode/uvernum.h | 15 +- deps/icu-small/source/common/unifiedcache.cpp | 4 +- deps/icu-small/source/common/unifiedcache.h | 2 +- deps/icu-small/source/common/uniset_props.cpp | 21 +- deps/icu-small/source/common/unisetspan.cpp | 21 +- deps/icu-small/source/common/unistr.cpp | 2 - deps/icu-small/source/common/unistr_case.cpp | 22 +- .../common/unistr_titlecase_brkiter.cpp | 36 +- deps/icu-small/source/common/uprops.cpp | 8 + deps/icu-small/source/common/uprops.h | 9 +- deps/icu-small/source/common/uresbund.cpp | 1 + .../icu-small/source/common/uscript_props.cpp | 17 +- deps/icu-small/source/common/ustr_imp.h | 59 + .../source/common/ustr_titlecase_brkiter.cpp | 199 +- deps/icu-small/source/common/ustrcase.cpp | 70 +- deps/icu-small/source/common/ustrtrns.cpp | 669 +- deps/icu-small/source/common/utext.cpp | 16 +- deps/icu-small/source/common/utf_impl.cpp | 283 +- deps/icu-small/source/common/utrie2.cpp | 4 +- deps/icu-small/source/common/utrie2.h | 38 +- deps/icu-small/source/common/uts46.cpp | 14 +- .../data/in/{icudt59l.dat => icudt60l.dat} | Bin 2717856 -> 2710368 bytes .../source/i18n/affixpatternparser.cpp | 14 +- deps/icu-small/source/i18n/anytrans.cpp | 14 +- deps/icu-small/source/i18n/calendar.cpp | 15 +- deps/icu-small/source/i18n/coll.cpp | 2 + .../source/i18n/collationdatareader.cpp | 3 +- .../source/i18n/collationdatawriter.cpp | 2 +- .../source/i18n/collationfastlatinbuilder.cpp | 2 +- deps/icu-small/source/i18n/collationfcd.cpp | 106 +- .../icu-small/source/i18n/collationiterator.h | 19 +- .../source/i18n/collationweights.cpp | 2 +- deps/icu-small/source/i18n/currunit.cpp | 24 +- deps/icu-small/source/i18n/datefmt.cpp | 3 +- deps/icu-small/source/i18n/dayperiodrules.cpp | 2 +- deps/icu-small/source/i18n/dcfmtsym.cpp | 41 +- deps/icu-small/source/i18n/decNumber.cpp | 28 +- deps/icu-small/source/i18n/decfmtst.cpp | 4 +- deps/icu-small/source/i18n/decimfmt.cpp | 24 +- deps/icu-small/source/i18n/decimfmtimpl.cpp | 7 +- deps/icu-small/source/i18n/digitformatter.cpp | 2 +- deps/icu-small/source/i18n/digitlst.cpp | 7 +- deps/icu-small/source/i18n/dtfmtsym.cpp | 22 +- deps/icu-small/source/i18n/dtptngen.cpp | 258 +- deps/icu-small/source/i18n/dtptngen_impl.h | 8 +- deps/icu-small/source/i18n/gregoimp.cpp | 5 + deps/icu-small/source/i18n/gregoimp.h | 11 + deps/icu-small/source/i18n/measfmt.cpp | 47 +- deps/icu-small/source/i18n/measunit.cpp | 153 +- deps/icu-small/source/i18n/msgfmt.cpp | 5 +- deps/icu-small/source/i18n/nfrs.cpp | 13 +- deps/icu-small/source/i18n/nfrs.h | 4 +- deps/icu-small/source/i18n/nfsubs.cpp | 8 +- deps/icu-small/source/i18n/nounit.cpp | 42 + .../source/i18n/number_affixutils.cpp | 403 + .../icu-small/source/i18n/number_affixutils.h | 224 + deps/icu-small/source/i18n/number_compact.cpp | 326 + deps/icu-small/source/i18n/number_compact.h | 91 + .../source/i18n/number_decimalquantity.cpp | 1011 +++ .../source/i18n/number_decimalquantity.h | 438 ++ .../source/i18n/number_decimfmtprops.cpp | 102 + .../source/i18n/number_decimfmtprops.h | 108 + deps/icu-small/source/i18n/number_fluent.cpp | 369 + .../source/i18n/number_formatimpl.cpp | 464 ++ .../icu-small/source/i18n/number_formatimpl.h | 125 + .../icu-small/source/i18n/number_grouping.cpp | 55 + .../source/i18n/number_integerwidth.cpp | 48 + .../source/i18n/number_longnames.cpp | 165 + deps/icu-small/source/i18n/number_longnames.h | 48 + .../source/i18n/number_modifiers.cpp | 303 + deps/icu-small/source/i18n/number_modifiers.h | 254 + .../icu-small/source/i18n/number_notation.cpp | 75 + deps/icu-small/source/i18n/number_padding.cpp | 84 + .../source/i18n/number_patternmodifier.cpp | 351 + .../source/i18n/number_patternmodifier.h | 259 + .../source/i18n/number_patternstring.cpp | 839 +++ .../source/i18n/number_patternstring.h | 266 + .../icu-small/source/i18n/number_rounding.cpp | 347 + .../source/i18n/number_roundingutils.h | 141 + .../source/i18n/number_scientific.cpp | 138 + .../icu-small/source/i18n/number_scientific.h | 62 + .../source/i18n/number_stringbuilder.cpp | 460 ++ .../source/i18n/number_stringbuilder.h | 135 + deps/icu-small/source/i18n/number_types.h | 293 + deps/icu-small/source/i18n/number_utils.h | 130 + deps/icu-small/source/i18n/numfmt.cpp | 18 + deps/icu-small/source/i18n/numsys.cpp | 7 + deps/icu-small/source/i18n/persncal.cpp | 2 +- deps/icu-small/source/i18n/plurrule.cpp | 77 +- deps/icu-small/source/i18n/plurrule_impl.h | 88 +- deps/icu-small/source/i18n/precision.cpp | 4 +- deps/icu-small/source/i18n/rbnf.cpp | 86 +- deps/icu-small/source/i18n/regexcst.pl | 0 deps/icu-small/source/i18n/reldatefmt.cpp | 2 +- deps/icu-small/source/i18n/rematch.cpp | 2 +- deps/icu-small/source/i18n/smpdtfmt.cpp | 30 +- deps/icu-small/source/i18n/transreg.cpp | 153 +- deps/icu-small/source/i18n/transreg.h | 10 +- deps/icu-small/source/i18n/tzfmt.cpp | 45 +- deps/icu-small/source/i18n/tzgnames.cpp | 10 +- deps/icu-small/source/i18n/tznames_impl.cpp | 34 +- deps/icu-small/source/i18n/tznames_impl.h | 5 + deps/icu-small/source/i18n/ucln_in.h | 1 + deps/icu-small/source/i18n/ucol_res.cpp | 10 +- deps/icu-small/source/i18n/ucol_sit.cpp | 11 +- deps/icu-small/source/i18n/umsg.cpp | 6 +- deps/icu-small/source/i18n/unicode/calendar.h | 4 +- deps/icu-small/source/i18n/unicode/coll.h | 4 +- deps/icu-small/source/i18n/unicode/currunit.h | 18 + deps/icu-small/source/i18n/unicode/dcfmtsym.h | 26 +- deps/icu-small/source/i18n/unicode/decimfmt.h | 24 - deps/icu-small/source/i18n/unicode/dtitvinf.h | 2 - deps/icu-small/source/i18n/unicode/dtptngen.h | 37 +- deps/icu-small/source/i18n/unicode/fpositer.h | 12 +- deps/icu-small/source/i18n/unicode/measfmt.h | 4 +- deps/icu-small/source/i18n/unicode/measunit.h | 13 +- deps/icu-small/source/i18n/unicode/nounit.h | 111 + .../source/i18n/unicode/numberformatter.h | 1998 +++++ deps/icu-small/source/i18n/unicode/numfmt.h | 49 +- deps/icu-small/source/i18n/unicode/plurrule.h | 6 +- deps/icu-small/source/i18n/unicode/rbnf.h | 17 +- deps/icu-small/source/i18n/unicode/selfmt.h | 0 deps/icu-small/source/i18n/unicode/smpdtfmt.h | 10 + deps/icu-small/source/i18n/unicode/tznames.h | 6 +- deps/icu-small/source/i18n/unicode/ucoleitr.h | 4 +- deps/icu-small/source/i18n/unicode/unum.h | 13 +- deps/icu-small/source/i18n/unicode/uspoof.h | 49 +- deps/icu-small/source/i18n/unum.cpp | 97 +- deps/icu-small/source/i18n/uspoof.cpp | 8 +- deps/icu-small/source/i18n/uspoof_conf.cpp | 1 + deps/icu-small/source/i18n/uspoof_conf.h | 2 + .../source/i18n/utf8collationiterator.cpp | 68 +- deps/icu-small/source/i18n/vtzone.cpp | 26 +- deps/icu-small/source/i18n/windtfmt.cpp | 6 +- deps/icu-small/source/i18n/winnmfmt.cpp | 8 +- deps/icu-small/source/i18n/wintzimpl.cpp | 28 +- deps/icu-small/source/i18n/zonemeta.cpp | 3 +- .../source/tools/escapesrc/escapesrc.cpp | 9 +- deps/icu-small/source/tools/genrb/parse.cpp | 4 +- deps/icu-small/source/tools/genrb/wrtjava.cpp | 22 +- deps/icu-small/source/tools/genrb/wrtxml.cpp | 5 + .../source/tools/toolutil/package.cpp | 2 +- .../source/tools/toolutil/pkg_genc.cpp | 3 +- .../icu-small/source/tools/toolutil/ppucd.cpp | 43 +- deps/icu-small/source/tools/toolutil/ppucd.h | 7 +- .../source/tools/toolutil/swapimpl.cpp | 1 + .../source/tools/toolutil/uparse.cpp | 4 +- tools/icu/icu-generic.gyp | 1 + 254 files changed, 23876 insertions(+), 10365 deletions(-) create mode 100644 deps/icu-small/source/common/bytesinkutil.cpp create mode 100644 deps/icu-small/source/common/bytesinkutil.h create mode 100644 deps/icu-small/source/common/rbbi_cache.cpp create mode 100644 deps/icu-small/source/common/rbbi_cache.h mode change 100755 => 100644 deps/icu-small/source/common/rbbicst.pl create mode 100644 deps/icu-small/source/common/unicode/stringoptions.h rename deps/icu-small/source/data/in/{icudt59l.dat => icudt60l.dat} (50%) create mode 100644 deps/icu-small/source/i18n/nounit.cpp create mode 100644 deps/icu-small/source/i18n/number_affixutils.cpp create mode 100644 deps/icu-small/source/i18n/number_affixutils.h create mode 100644 deps/icu-small/source/i18n/number_compact.cpp create mode 100644 deps/icu-small/source/i18n/number_compact.h create mode 100644 deps/icu-small/source/i18n/number_decimalquantity.cpp create mode 100644 deps/icu-small/source/i18n/number_decimalquantity.h create mode 100644 deps/icu-small/source/i18n/number_decimfmtprops.cpp create mode 100644 deps/icu-small/source/i18n/number_decimfmtprops.h create mode 100644 deps/icu-small/source/i18n/number_fluent.cpp create mode 100644 deps/icu-small/source/i18n/number_formatimpl.cpp create mode 100644 deps/icu-small/source/i18n/number_formatimpl.h create mode 100644 deps/icu-small/source/i18n/number_grouping.cpp create mode 100644 deps/icu-small/source/i18n/number_integerwidth.cpp create mode 100644 deps/icu-small/source/i18n/number_longnames.cpp create mode 100644 deps/icu-small/source/i18n/number_longnames.h create mode 100644 deps/icu-small/source/i18n/number_modifiers.cpp create mode 100644 deps/icu-small/source/i18n/number_modifiers.h create mode 100644 deps/icu-small/source/i18n/number_notation.cpp create mode 100644 deps/icu-small/source/i18n/number_padding.cpp create mode 100644 deps/icu-small/source/i18n/number_patternmodifier.cpp create mode 100644 deps/icu-small/source/i18n/number_patternmodifier.h create mode 100644 deps/icu-small/source/i18n/number_patternstring.cpp create mode 100644 deps/icu-small/source/i18n/number_patternstring.h create mode 100644 deps/icu-small/source/i18n/number_rounding.cpp create mode 100644 deps/icu-small/source/i18n/number_roundingutils.h create mode 100644 deps/icu-small/source/i18n/number_scientific.cpp create mode 100644 deps/icu-small/source/i18n/number_scientific.h create mode 100644 deps/icu-small/source/i18n/number_stringbuilder.cpp create mode 100644 deps/icu-small/source/i18n/number_stringbuilder.h create mode 100644 deps/icu-small/source/i18n/number_types.h create mode 100644 deps/icu-small/source/i18n/number_utils.h mode change 100755 => 100644 deps/icu-small/source/i18n/regexcst.pl create mode 100644 deps/icu-small/source/i18n/unicode/nounit.h create mode 100644 deps/icu-small/source/i18n/unicode/numberformatter.h mode change 100755 => 100644 deps/icu-small/source/i18n/unicode/selfmt.h diff --git a/LICENSE b/LICENSE index 19a8c36a4fb8dd..196fa789a4644b 100644 --- a/LICENSE +++ b/LICENSE @@ -231,7 +231,7 @@ The externally maintained libraries used by Node.js are: # ---------COPYING.libtabe ---- BEGIN-------------------- # # /* - # * Copyrighy (c) 1999 TaBE Project. + # * Copyright (c) 1999 TaBE Project. # * Copyright (c) 1999 Pai-Hsiang Hsiao. # * All rights reserved. # * diff --git a/configure b/configure index bd8e6e29f49c3b..a6e609eed3a43f 100755 --- a/configure +++ b/configure @@ -1075,8 +1075,8 @@ def glob_to_var(dir_base, dir_sub, patch_dir): def configure_intl(o): icus = [ { - 'url': 'https://ssl.icu-project.org/files/icu4c/59.1/icu4c-59_1-src.zip', - 'md5': '29a41f9bb576b06c7eef0487a84a7674', + 'url': 'https://ssl.icu-project.org/files/icu4c/60.1/icu4c-60_1-src.zip', + 'md5': 'e6cb990ac2a3161d31a3def8435f80cb', }, ] def icu_download(path): diff --git a/deps/icu-small/LICENSE b/deps/icu-small/LICENSE index c5295daeefff12..c84076cd072b80 100644 --- a/deps/icu-small/LICENSE +++ b/deps/icu-small/LICENSE @@ -131,7 +131,7 @@ property of their respective owners. # ---------COPYING.libtabe ---- BEGIN-------------------- # # /* - # * Copyrighy (c) 1999 TaBE Project. + # * Copyright (c) 1999 TaBE Project. # * Copyright (c) 1999 Pai-Hsiang Hsiao. # * All rights reserved. # * diff --git a/deps/icu-small/README-SMALL-ICU.txt b/deps/icu-small/README-SMALL-ICU.txt index e1079443d13c26..c6dc0b30515162 100644 --- a/deps/icu-small/README-SMALL-ICU.txt +++ b/deps/icu-small/README-SMALL-ICU.txt @@ -1,8 +1,8 @@ Small ICU sources - auto generated by shrink-icu-src.py This directory contains the ICU subset used by --with-intl=small-icu (the default) -It is a strict subset of ICU 59 source files with the following exception(s): -* deps/icu-small/source/data/in/icudt59l.dat : Reduced-size data file +It is a strict subset of ICU 60 source files with the following exception(s): +* deps/icu-small/source/data/in/icudt60l.dat : Reduced-size data file To rebuild this directory, see ../../tools/icu/README.md diff --git a/deps/icu-small/source/common/bmpset.cpp b/deps/icu-small/source/common/bmpset.cpp index 08f9bed0664bb5..f84bfd7f5bfcf1 100644 --- a/deps/icu-small/source/common/bmpset.cpp +++ b/deps/icu-small/source/common/bmpset.cpp @@ -28,7 +28,7 @@ U_NAMESPACE_BEGIN BMPSet::BMPSet(const int32_t *parentList, int32_t parentListLength) : list(parentList), listLength(parentListLength) { - uprv_memset(asciiBytes, 0, sizeof(asciiBytes)); + uprv_memset(latin1Contains, 0, sizeof(latin1Contains)); uprv_memset(table7FF, 0, sizeof(table7FF)); uprv_memset(bmpBlockBits, 0, sizeof(bmpBlockBits)); @@ -45,14 +45,16 @@ BMPSet::BMPSet(const int32_t *parentList, int32_t parentListLength) : list4kStarts[i]=findCodePoint(i<<12, list4kStarts[i-1], listLength-1); } list4kStarts[0x11]=listLength-1; + containsFFFD=containsSlow(0xfffd, list4kStarts[0xf], list4kStarts[0x10]); initBits(); overrideIllegal(); } BMPSet::BMPSet(const BMPSet &otherBMPSet, const int32_t *newParentList, int32_t newParentListLength) : + containsFFFD(otherBMPSet.containsFFFD), list(newParentList), listLength(newParentListLength) { - uprv_memcpy(asciiBytes, otherBMPSet.asciiBytes, sizeof(asciiBytes)); + uprv_memcpy(latin1Contains, otherBMPSet.latin1Contains, sizeof(latin1Contains)); uprv_memcpy(table7FF, otherBMPSet.table7FF, sizeof(table7FF)); uprv_memcpy(bmpBlockBits, otherBMPSet.bmpBlockBits, sizeof(bmpBlockBits)); uprv_memcpy(list4kStarts, otherBMPSet.list4kStarts, sizeof(list4kStarts)); @@ -120,7 +122,7 @@ void BMPSet::initBits() { UChar32 start, limit; int32_t listIndex=0; - // Set asciiBytes[]. + // Set latin1Contains[]. do { start=list[listIndex++]; if(listIndex=0x80) { + if(start>=0x100) { break; } do { - asciiBytes[start++]=1; - } while(start0x80) { + if(start<0x80) { + start=0x80; + } + break; + } + } // Set table7FF[]. while(start<0x800) { @@ -204,19 +223,14 @@ void BMPSet::initBits() { * for faster validity checking at runtime. * No need to set 0 values where they were reset to 0 in the constructor * and not modified by initBits(). - * (asciiBytes[] trail bytes, table7FF[] 0..7F, bmpBlockBits[] 0..7FF) + * (table7FF[] 0..7F, bmpBlockBits[] 0..7FF) * Need to set 0 values for surrogates D800..DFFF. */ void BMPSet::overrideIllegal() { uint32_t bits, mask; int32_t i; - if(containsSlow(0xfffd, list4kStarts[0xf], list4kStarts[0x10])) { - // contains(FFFD)==TRUE - for(i=0x80; i<0xc0; ++i) { - asciiBytes[i]=1; - } - + if(containsFFFD) { bits=3; // Lead bytes 0xC0 and 0xC1. for(i=0; i<64; ++i) { table7FF[i]|=bits; @@ -233,7 +247,6 @@ void BMPSet::overrideIllegal() { bmpBlockBits[i]=(bmpBlockBits[i]&mask)|bits; } } else { - // contains(FFFD)==FALSE mask=~(0x10001<<0xd); // Lead byte 0xED. for(i=32; i<64; ++i) { // Second half of 4k block. bmpBlockBits[i]&=mask; @@ -277,8 +290,8 @@ int32_t BMPSet::findCodePoint(UChar32 c, int32_t lo, int32_t hi) const { UBool BMPSet::contains(UChar32 c) const { - if((uint32_t)c<=0x7f) { - return (UBool)asciiBytes[c]; + if((uint32_t)c<=0xff) { + return (UBool)latin1Contains[c]; } else if((uint32_t)c<=0x7ff) { return (UBool)((table7FF[c&0x3f]&((uint32_t)1<<(c>>6)))!=0); } else if((uint32_t)c<0xd800 || (c>=0xe000 && c<=0xffff)) { @@ -314,8 +327,8 @@ BMPSet::span(const UChar *s, const UChar *limit, USetSpanCondition spanCondition // span do { c=*s; - if(c<=0x7f) { - if(!asciiBytes[c]) { + if(c<=0xff) { + if(!latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -354,8 +367,8 @@ BMPSet::span(const UChar *s, const UChar *limit, USetSpanCondition spanCondition // span not do { c=*s; - if(c<=0x7f) { - if(asciiBytes[c]) { + if(c<=0xff) { + if(latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -403,8 +416,8 @@ BMPSet::spanBack(const UChar *s, const UChar *limit, USetSpanCondition spanCondi // span for(;;) { c=*(--limit); - if(c<=0x7f) { - if(!asciiBytes[c]) { + if(c<=0xff) { + if(!latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -446,8 +459,8 @@ BMPSet::spanBack(const UChar *s, const UChar *limit, USetSpanCondition spanCondi // span not for(;;) { c=*(--limit); - if(c<=0x7f) { - if(asciiBytes[c]) { + if(c<=0xff) { + if(latin1Contains[c]) { break; } } else if(c<=0x7ff) { @@ -497,22 +510,22 @@ const uint8_t * BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCondition) const { const uint8_t *limit=s+length; uint8_t b=*s; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { // Initial all-ASCII span. if(spanCondition) { do { - if(!asciiBytes[b] || ++s==limit) { + if(!latin1Contains[b] || ++s==limit) { return s; } b=*s; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } else { do { - if(asciiBytes[b] || ++s==limit) { + if(latin1Contains[b] || ++s==limit) { return s; } b=*s; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } length=(int32_t)(limit-s); } @@ -540,20 +553,20 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi // single trail byte, check for preceding 3- or 4-byte lead byte if(length>=2 && (b=*(limit-2))>=0xe0) { limit-=2; - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { limit0=limit; } } else if(b<0xc0 && b>=0x80 && length>=3 && (b=*(limit-3))>=0xf0) { // 4-byte lead byte with only two trail bytes limit-=3; - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { limit0=limit; } } } else { // lead byte with no trail bytes --limit; - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { limit0=limit; } } @@ -563,26 +576,26 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi while(s=0xc0 && (t1=(uint8_t)(*s-0x80)) <= 0x3f ) { if((USetSpanCondition)((table7FF[t1]&((uint32_t)1<<(b&0x1f)))!=0) != spanCondition) { @@ -642,7 +656,7 @@ BMPSet::spanUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanConditi // Give an illegal sequence the same value as the result of contains(FFFD). // Handle each byte of an illegal sequence separately to simplify the code; // no need to optimize error handling. - if(asciiBytes[0x80]!=spanCondition) { + if(containsFFFD!=spanCondition) { return s-1; } } @@ -667,26 +681,26 @@ BMPSet::spanBackUTF8(const uint8_t *s, int32_t length, USetSpanCondition spanCon do { b=s[--length]; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { // ASCII sub-span if(spanCondition) { do { - if(!asciiBytes[b]) { + if(!latin1Contains[b]) { return length+1; } else if(length==0) { return 0; } b=s[--length]; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } else { do { - if(asciiBytes[b]) { + if(latin1Contains[b]) { return length+1; } else if(length==0) { return 0; } b=s[--length]; - } while((int8_t)b>=0); + } while(U8_IS_SINGLE(b)); } } diff --git a/deps/icu-small/source/common/bmpset.h b/deps/icu-small/source/common/bmpset.h index 87375d2cace070..018aeb7f95b078 100644 --- a/deps/icu-small/source/common/bmpset.h +++ b/deps/icu-small/source/common/bmpset.h @@ -28,11 +28,12 @@ U_NAMESPACE_BEGIN * Helper class for frozen UnicodeSets, implements contains() and span() * optimized for BMP code points. Structured to be UTF-8-friendly. * - * ASCII: Look up bytes. + * Latin-1: Look up bytes. * 2-byte characters: Bits organized vertically. * 3-byte characters: Use zero/one/mixed data per 64-block in U+0000..U+FFFF, * with mixed for illegal ranges. - * Supplementary characters: Call contains() on the parent set. + * Supplementary characters: Binary search over + * the supplementary part of the parent set's inversion list. */ class BMPSet : public UMemory { public: @@ -96,12 +97,12 @@ class BMPSet : public UMemory { inline UBool containsSlow(UChar32 c, int32_t lo, int32_t hi) const; /* - * One byte per ASCII character, or trail byte in lead position. - * 0 or 1 for ASCII characters. - * The value for trail bytes is the result of contains(FFFD) - * for faster validity checking at runtime. + * One byte 0 or 1 per Latin-1 character. */ - UBool asciiBytes[0xc0]; + UBool latin1Contains[0x100]; + + /* TRUE if contains(U+FFFD). */ + UBool containsFFFD; /* * One bit per code point from U+0000..U+07FF. diff --git a/deps/icu-small/source/common/brkeng.cpp b/deps/icu-small/source/common/brkeng.cpp index 354998dac4dd07..da64b3bdef9bbc 100644 --- a/deps/icu-small/source/common/brkeng.cpp +++ b/deps/icu-small/source/common/brkeng.cpp @@ -11,9 +11,6 @@ #if !UCONFIG_NO_BREAK_ITERATION -#include "brkeng.h" -#include "cmemory.h" -#include "dictbe.h" #include "unicode/uchar.h" #include "unicode/uniset.h" #include "unicode/chariter.h" @@ -24,6 +21,10 @@ #include "unicode/uscript.h" #include "unicode/ucharstrie.h" #include "unicode/bytestrie.h" + +#include "brkeng.h" +#include "cmemory.h" +#include "dictbe.h" #include "charstr.h" #include "dictionarydata.h" #include "mutex.h" @@ -80,23 +81,15 @@ UnhandledEngine::handles(UChar32 c, int32_t breakType) const { int32_t UnhandledEngine::findBreaks( UText *text, - int32_t startPos, - int32_t endPos, - UBool reverse, - int32_t breakType, - UStack &/*foundBreaks*/ ) const { + int32_t /* startPos */, + int32_t endPos, + int32_t breakType, + UVector32 &/*foundBreaks*/ ) const { if (breakType >= 0 && breakType < UPRV_LENGTHOF(fHandled)) { UChar32 c = utext_current32(text); - if (reverse) { - while((int32_t)utext_getNativeIndex(text) > startPos && fHandled[breakType]->contains(c)) { - c = utext_previous32(text); - } - } - else { - while((int32_t)utext_getNativeIndex(text) < endPos && fHandled[breakType]->contains(c)) { - utext_next32(text); // TODO: recast loop to work with post-increment operations. - c = utext_current32(text); - } + while((int32_t)utext_getNativeIndex(text) < endPos && fHandled[breakType]->contains(c)) { + utext_next32(text); // TODO: recast loop to work with post-increment operations. + c = utext_current32(text); } } return 0; diff --git a/deps/icu-small/source/common/brkeng.h b/deps/icu-small/source/common/brkeng.h index ccb95320d25e55..5c61d2ed5d5d70 100644 --- a/deps/icu-small/source/common/brkeng.h +++ b/deps/icu-small/source/common/brkeng.h @@ -19,6 +19,7 @@ U_NAMESPACE_BEGIN class UnicodeSet; class UStack; +class UVector32; class DictionaryMatcher; /******************************************************************* @@ -67,18 +68,15 @@ class LanguageBreakEngine : public UMemory { * is capable of handling. * @param startPos The start of the run within the supplied text. * @param endPos The end of the run within the supplied text. - * @param reverse Whether the caller is looking for breaks in a reverse - * direction. * @param breakType The type of break desired, or -1. - * @param foundBreaks An allocated C array of the breaks found, if any + * @param foundBreaks A Vector of int32_t to receive the breaks. * @return The number of breaks found. */ virtual int32_t findBreaks( UText *text, int32_t startPos, int32_t endPos, - UBool reverse, int32_t breakType, - UStack &foundBreaks ) const = 0; + UVector32 &foundBreaks ) const = 0; }; @@ -192,8 +190,6 @@ class UnhandledEngine : public LanguageBreakEngine { * is capable of handling. * @param startPos The start of the run within the supplied text. * @param endPos The end of the run within the supplied text. - * @param reverse Whether the caller is looking for breaks in a reverse - * direction. * @param breakType The type of break desired, or -1. * @param foundBreaks An allocated C array of the breaks found, if any * @return The number of breaks found. @@ -201,9 +197,8 @@ class UnhandledEngine : public LanguageBreakEngine { virtual int32_t findBreaks( UText *text, int32_t startPos, int32_t endPos, - UBool reverse, int32_t breakType, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; /** *

    Tell the engine to handle a particular character and break type.

    diff --git a/deps/icu-small/source/common/brkiter.cpp b/deps/icu-small/source/common/brkiter.cpp index e2904b0544cb07..a509ff10c946ec 100644 --- a/deps/icu-small/source/common/brkiter.cpp +++ b/deps/icu-small/source/common/brkiter.cpp @@ -195,7 +195,7 @@ BreakIterator::getAvailableLocales(int32_t& count) // ------------------------------------------ // -// Default constructor and destructor +// Constructors, destructor and assignment operator // //------------------------------------------- @@ -204,6 +204,19 @@ BreakIterator::BreakIterator() *validLocale = *actualLocale = 0; } +BreakIterator::BreakIterator(const BreakIterator &other) : UObject(other) { + uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale)); + uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale)); +} + +BreakIterator &BreakIterator::operator =(const BreakIterator &other) { + if (this != &other) { + uprv_strncpy(actualLocale, other.actualLocale, sizeof(actualLocale)); + uprv_strncpy(validLocale, other.validLocale, sizeof(validLocale)); + } + return *this; +} + BreakIterator::~BreakIterator() { } @@ -265,7 +278,7 @@ ICUBreakIteratorService::~ICUBreakIteratorService() {} // defined in ucln_cmn.h U_NAMESPACE_END -static icu::UInitOnce gInitOnce; +static icu::UInitOnce gInitOnceBrkiter; static icu::ICULocaleService* gService = NULL; @@ -280,7 +293,7 @@ static UBool U_CALLCONV breakiterator_cleanup(void) { delete gService; gService = NULL; } - gInitOnce.reset(); + gInitOnceBrkiter.reset(); #endif return TRUE; } @@ -296,7 +309,7 @@ initService(void) { static ICULocaleService* getService(void) { - umtx_initOnce(gInitOnce, &initService); + umtx_initOnce(gInitOnceBrkiter, &initService); return gService; } @@ -306,7 +319,7 @@ getService(void) static inline UBool hasService(void) { - return !gInitOnce.isReset() && getService() != NULL; + return !gInitOnceBrkiter.isReset() && getService() != NULL; } // ------------------------------------- diff --git a/deps/icu-small/source/common/bytesinkutil.cpp b/deps/icu-small/source/common/bytesinkutil.cpp new file mode 100644 index 00000000000000..bf1a2d45f8ae5a --- /dev/null +++ b/deps/icu-small/source/common/bytesinkutil.cpp @@ -0,0 +1,123 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// bytesinkutil.cpp +// created: 2017sep14 Markus W. Scherer + +#include "unicode/utypes.h" +#include "unicode/bytestream.h" +#include "unicode/edits.h" +#include "unicode/stringoptions.h" +#include "unicode/utf8.h" +#include "unicode/utf16.h" +#include "bytesinkutil.h" +#include "cmemory.h" +#include "uassert.h" + +U_NAMESPACE_BEGIN + +UBool +ByteSinkUtil::appendChange(int32_t length, const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + char scratch[200]; + int32_t s8Length = 0; + for (int32_t i = 0; i < s16Length;) { + int32_t capacity; + int32_t desiredCapacity = s16Length - i; + if (desiredCapacity < (INT32_MAX / 3)) { + desiredCapacity *= 3; // max 3 UTF-8 bytes per UTF-16 code unit + } else if (desiredCapacity < (INT32_MAX / 2)) { + desiredCapacity *= 2; + } else { + desiredCapacity = INT32_MAX; + } + char *buffer = sink.GetAppendBuffer(U8_MAX_LENGTH, desiredCapacity, + scratch, UPRV_LENGTHOF(scratch), &capacity); + capacity -= U8_MAX_LENGTH - 1; + int32_t j = 0; + for (; i < s16Length && j < capacity;) { + UChar32 c; + U16_NEXT_UNSAFE(s16, i, c); + U8_APPEND_UNSAFE(buffer, j, c); + } + if (j > (INT32_MAX - s8Length)) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + sink.Append(buffer, j); + s8Length += j; + } + if (edits != nullptr) { + edits->addReplace(length, s8Length); + } + return TRUE; +} + +UBool +ByteSinkUtil::appendChange(const uint8_t *s, const uint8_t *limit, + const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if ((limit - s) > INT32_MAX) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + return appendChange((int32_t)(limit - s), s16, s16Length, sink, edits, errorCode); +} + +void +ByteSinkUtil::appendCodePoint(int32_t length, UChar32 c, ByteSink &sink, Edits *edits) { + char s8[U8_MAX_LENGTH]; + int32_t s8Length = 0; + U8_APPEND_UNSAFE(s8, s8Length, c); + if (edits != nullptr) { + edits->addReplace(length, s8Length); + } + sink.Append(s8, s8Length); +} + +namespace { + +// See unicode/utf8.h U8_APPEND_UNSAFE(). +inline uint8_t getTwoByteLead(UChar32 c) { return (uint8_t)((c >> 6) | 0xc0); } +inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } + +} // namespace + +void +ByteSinkUtil::appendTwoBytes(UChar32 c, ByteSink &sink) { + U_ASSERT(0x80 <= c && c <= 0x7ff); // 2-byte UTF-8 + char s8[2] = { (char)getTwoByteLead(c), (char)getTwoByteTrail(c) }; + sink.Append(s8, 2); +} + +UBool +ByteSinkUtil::appendUnchanged(const uint8_t *s, int32_t length, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if (length > 0) { + if (edits != nullptr) { + edits->addUnchanged(length); + } + if ((options & U_OMIT_UNCHANGED_TEXT) == 0) { + sink.Append(reinterpret_cast(s), length); + } + } + return TRUE; +} + +UBool +ByteSinkUtil::appendUnchanged(const uint8_t *s, const uint8_t *limit, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if ((limit - s) > INT32_MAX) { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return FALSE; + } + return appendUnchanged(s, (int32_t)(limit - s), sink, options, edits, errorCode); +} + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/bytesinkutil.h b/deps/icu-small/source/common/bytesinkutil.h new file mode 100644 index 00000000000000..004b49c4ce62ea --- /dev/null +++ b/deps/icu-small/source/common/bytesinkutil.h @@ -0,0 +1,53 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// bytesinkutil.h +// created: 2017sep14 Markus W. Scherer + +#include "unicode/utypes.h" +#include "unicode/bytestream.h" +#include "unicode/edits.h" +#include "cmemory.h" +#include "uassert.h" + +U_NAMESPACE_BEGIN + +class ByteSink; +class Edits; + +class U_COMMON_API ByteSinkUtil { +public: + ByteSinkUtil() = delete; // all static + + /** (length) bytes were mapped to valid (s16, s16Length). */ + static UBool appendChange(int32_t length, + const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode); + + /** The bytes at [s, limit[ were mapped to valid (s16, s16Length). */ + static UBool appendChange(const uint8_t *s, const uint8_t *limit, + const char16_t *s16, int32_t s16Length, + ByteSink &sink, Edits *edits, UErrorCode &errorCode); + + /** (length) bytes were mapped/changed to valid code point c. */ + static void appendCodePoint(int32_t length, UChar32 c, ByteSink &sink, Edits *edits = nullptr); + + /** The few bytes at [src, nextSrc[ were mapped/changed to valid code point c. */ + static inline void appendCodePoint(const uint8_t *src, const uint8_t *nextSrc, UChar32 c, + ByteSink &sink, Edits *edits = nullptr) { + appendCodePoint((int32_t)(nextSrc - src), c, sink, edits); + } + + /** Append the two-byte character (U+0080..U+07FF). */ + static void appendTwoBytes(UChar32 c, ByteSink &sink); + + static UBool appendUnchanged(const uint8_t *s, int32_t length, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode); + + static UBool appendUnchanged(const uint8_t *s, const uint8_t *limit, + ByteSink &sink, uint32_t options, Edits *edits, + UErrorCode &errorCode); +}; + +U_NAMESPACE_END diff --git a/deps/icu-small/source/common/bytestream.cpp b/deps/icu-small/source/common/bytestream.cpp index bfd7bded714d91..0d0e4dda39b088 100644 --- a/deps/icu-small/source/common/bytestream.cpp +++ b/deps/icu-small/source/common/bytestream.cpp @@ -45,6 +45,12 @@ void CheckedArrayByteSink::Append(const char* bytes, int32_t n) { if (n <= 0) { return; } + if (n > (INT32_MAX - appended_)) { + // TODO: Report as integer overflow, not merely buffer overflow. + appended_ = INT32_MAX; + overflowed_ = TRUE; + return; + } appended_ += n; int32_t available = capacity_ - size_; if (n > available) { diff --git a/deps/icu-small/source/common/caniter.cpp b/deps/icu-small/source/common/caniter.cpp index eea0398d12f1f4..d57c64247fc591 100644 --- a/deps/icu-small/source/common/caniter.cpp +++ b/deps/icu-small/source/common/caniter.cpp @@ -405,7 +405,7 @@ UnicodeString* CanonicalIterator::getEquivalents(const UnicodeString &segment, i //String[] finalResult = new String[result.size()]; UnicodeString *finalResult = NULL; int32_t resultCount; - if((resultCount = result.count())) { + if((resultCount = result.count()) != 0) { finalResult = new UnicodeString[resultCount]; if (finalResult == 0) { status = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/common/cmemory.h b/deps/icu-small/source/common/cmemory.h index c77b8268675dd3..83a0129651e468 100644 --- a/deps/icu-small/source/common/cmemory.h +++ b/deps/icu-small/source/common/cmemory.h @@ -162,7 +162,6 @@ class LocalMemory : public LocalPointerBase { * @param p simple pointer to an array of T items that is adopted */ explicit LocalMemory(T *p=NULL) : LocalPointerBase(p) {} -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, leaves src with isNull(). * @param src source smart pointer @@ -170,14 +169,12 @@ class LocalMemory : public LocalPointerBase { LocalMemory(LocalMemory &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } -#endif /** * Destructor deletes the memory it owns. */ ~LocalMemory() { uprv_free(LocalPointerBase::ptr); } -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -187,7 +184,6 @@ class LocalMemory : public LocalPointerBase { LocalMemory &operator=(LocalMemory &&src) U_NOEXCEPT { return moveFrom(src); } -#endif /** * Move assignment, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -312,6 +308,14 @@ class MaybeStackArray { * Default constructor initializes with internal T[stackCapacity] buffer. */ MaybeStackArray() : ptr(stackArray), capacity(stackCapacity), needToRelease(FALSE) {} + /** + * Automatically allocates the heap array if the argument is larger than the stack capacity. + * Intended for use when an approximate capacity is known at compile time but the true + * capacity is not known until runtime. + */ + MaybeStackArray(int32_t newCapacity) : MaybeStackArray() { + if (capacity < newCapacity) { resize(newCapacity); } + }; /** * Destructor deletes the array (if owned). */ diff --git a/deps/icu-small/source/common/dictbe.cpp b/deps/icu-small/source/common/dictbe.cpp index 6c0413a31b9a5c..02fc8a4726cf21 100644 --- a/deps/icu-small/source/common/dictbe.cpp +++ b/deps/icu-small/source/common/dictbe.cpp @@ -46,9 +46,9 @@ int32_t DictionaryBreakEngine::findBreaks( UText *text, int32_t startPos, int32_t endPos, - UBool reverse, int32_t breakType, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { + (void)startPos; // TODO: remove this param? int32_t result = 0; // Find the span of characters included in the set. @@ -60,34 +60,12 @@ DictionaryBreakEngine::findBreaks( UText *text, int32_t rangeStart; int32_t rangeEnd; UChar32 c = utext_current32(text); - if (reverse) { - UBool isDict = fSet.contains(c); - while((current = (int32_t)utext_getNativeIndex(text)) > startPos && isDict) { - c = utext_previous32(text); - isDict = fSet.contains(c); - } - if (current < startPos) { - rangeStart = startPos; - } else { - rangeStart = current; - if (!isDict) { - utext_next32(text); - rangeStart = (int32_t)utext_getNativeIndex(text); - } - } - // rangeEnd = start + 1; - utext_setNativeIndex(text, start); - utext_next32(text); - rangeEnd = (int32_t)utext_getNativeIndex(text); - } - else { - while((current = (int32_t)utext_getNativeIndex(text)) < endPos && fSet.contains(c)) { - utext_next32(text); // TODO: recast loop for postincrement - c = utext_current32(text); - } - rangeStart = start; - rangeEnd = current; + while((current = (int32_t)utext_getNativeIndex(text)) < endPos && fSet.contains(c)) { + utext_next32(text); // TODO: recast loop for postincrement + c = utext_current32(text); } + rangeStart = start; + rangeEnd = current; if (breakType >= 0 && breakType < 32 && (((uint32_t)1 << breakType) & fTypes)) { result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks); utext_setNativeIndex(text, current); @@ -248,7 +226,7 @@ int32_t ThaiBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { utext_setNativeIndex(text, rangeStart); utext_moveIndex32(text, THAI_MIN_WORD_SPAN); if (utext_getNativeIndex(text) >= rangeEnd) { @@ -487,7 +465,7 @@ int32_t LaoBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if ((rangeEnd - rangeStart) < LAO_MIN_WORD_SPAN) { return 0; // Not enough characters for two words } @@ -680,7 +658,7 @@ int32_t BurmeseBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if ((rangeEnd - rangeStart) < BURMESE_MIN_WORD_SPAN) { return 0; // Not enough characters for two words } @@ -885,7 +863,7 @@ int32_t KhmerBreakEngine::divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if ((rangeEnd - rangeStart) < KHMER_MIN_WORD_SPAN) { return 0; // Not enough characters for two words } @@ -1110,9 +1088,9 @@ static inline uint32_t getKatakanaCost(int32_t wordLength){ return (wordLength > kMaxKatakanaLength) ? 8192 : katakanaCost[wordLength]; } -static inline bool isKatakana(uint16_t value) { - return (value >= 0x30A1u && value <= 0x30FEu && value != 0x30FBu) || - (value >= 0xFF66u && value <= 0xFF9fu); +static inline bool isKatakana(UChar32 value) { + return (value >= 0x30A1 && value <= 0x30FE && value != 0x30FB) || + (value >= 0xFF66 && value <= 0xFF9f); } @@ -1128,14 +1106,14 @@ static inline int32_t utext_i32_flag(int32_t bitIndex) { * @param text A UText representing the text * @param rangeStart The start of the range of dictionary characters * @param rangeEnd The end of the range of dictionary characters - * @param foundBreaks Output of C array of int32_t break positions, or 0 + * @param foundBreaks vector to receive the break positions * @return The number of breaks found */ int32_t CjkBreakEngine::divideUpDictionaryRange( UText *inText, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const { + UVector32 &foundBreaks ) const { if (rangeStart >= rangeEnd) { return 0; } @@ -1405,6 +1383,7 @@ CjkBreakEngine::divideUpDictionaryRange( UText *inText, prevCPPos = cpPos; prevUTextPos = utextPos; } + (void)prevCPPos; // suppress compiler warnings about unused variable // inString goes out of scope // inputMap goes out of scope diff --git a/deps/icu-small/source/common/dictbe.h b/deps/icu-small/source/common/dictbe.h index 088bcb788d7a8e..ffc1ae9f269236 100644 --- a/deps/icu-small/source/common/dictbe.h +++ b/deps/icu-small/source/common/dictbe.h @@ -15,6 +15,7 @@ #include "unicode/utext.h" #include "brkeng.h" +#include "uvectr32.h" U_NAMESPACE_BEGIN @@ -84,21 +85,18 @@ class DictionaryBreakEngine : public LanguageBreakEngine { * * @param text A UText representing the text. The iterator is left at * the end of the run of characters which the engine is capable of handling - * that starts from the first (or last) character in the range. + * that starts from the first character in the range. * @param startPos The start of the run within the supplied text. * @param endPos The end of the run within the supplied text. - * @param reverse Whether the caller is looking for breaks in a reverse - * direction. * @param breakType The type of break desired, or -1. - * @param foundBreaks An allocated C array of the breaks found, if any + * @param foundBreaks vector of int32_t to receive the break positions * @return The number of breaks found. */ virtual int32_t findBreaks( UText *text, int32_t startPos, int32_t endPos, - UBool reverse, int32_t breakType, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; protected: @@ -128,7 +126,7 @@ class DictionaryBreakEngine : public LanguageBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const = 0; + UVector32 &foundBreaks ) const = 0; }; @@ -185,7 +183,7 @@ class ThaiBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -241,7 +239,7 @@ class LaoBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -297,7 +295,7 @@ class BurmeseBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -353,7 +351,7 @@ class KhmerBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; @@ -417,7 +415,7 @@ class CjkBreakEngine : public DictionaryBreakEngine { virtual int32_t divideUpDictionaryRange( UText *text, int32_t rangeStart, int32_t rangeEnd, - UStack &foundBreaks ) const; + UVector32 &foundBreaks ) const; }; diff --git a/deps/icu-small/source/common/edits.cpp b/deps/icu-small/source/common/edits.cpp index 58a70d5c92796e..9ec005624fef0c 100644 --- a/deps/icu-small/source/common/edits.cpp +++ b/deps/icu-small/source/common/edits.cpp @@ -17,10 +17,10 @@ namespace { const int32_t MAX_UNCHANGED_LENGTH = 0x1000; const int32_t MAX_UNCHANGED = MAX_UNCHANGED_LENGTH - 1; -// 0wwwcccccccccccc with w=1..6 records ccc+1 replacements of w:w text units. -// No length change. -const int32_t MAX_SHORT_WIDTH = 6; -const int32_t MAX_SHORT_CHANGE_LENGTH = 0xfff; +// 0mmmnnnccccccccc with m=1..6 records ccc+1 replacements of m:n text units. +const int32_t MAX_SHORT_CHANGE_OLD_LENGTH = 6; +const int32_t MAX_SHORT_CHANGE_NEW_LENGTH = 7; +const int32_t SHORT_CHANGE_NUM_MASK = 0x1ff; const int32_t MAX_SHORT_CHANGE = 0x6fff; // 0111mmmmmmnnnnnn records a replacement of m text units with n. @@ -33,20 +33,85 @@ const int32_t LENGTH_IN_2TRAIL = 62; } // namespace -Edits::~Edits() { - if(array != stackArray) { +void Edits::releaseArray() U_NOEXCEPT { + if (array != stackArray) { uprv_free(array); } } -void Edits::reset() { - length = delta = 0; +Edits &Edits::copyArray(const Edits &other) { + if (U_FAILURE(errorCode_)) { + length = delta = numChanges = 0; + return *this; + } + if (length > capacity) { + uint16_t *newArray = (uint16_t *)uprv_malloc((size_t)length * 2); + if (newArray == nullptr) { + length = delta = numChanges = 0; + errorCode_ = U_MEMORY_ALLOCATION_ERROR; + return *this; + } + releaseArray(); + array = newArray; + capacity = length; + } + if (length > 0) { + uprv_memcpy(array, other.array, (size_t)length * 2); + } + return *this; +} + +Edits &Edits::moveArray(Edits &src) U_NOEXCEPT { + if (U_FAILURE(errorCode_)) { + length = delta = numChanges = 0; + return *this; + } + releaseArray(); + if (length > STACK_CAPACITY) { + array = src.array; + capacity = src.capacity; + src.array = src.stackArray; + src.capacity = STACK_CAPACITY; + src.reset(); + return *this; + } + array = stackArray; + capacity = STACK_CAPACITY; + if (length > 0) { + uprv_memcpy(array, src.array, (size_t)length * 2); + } + return *this; +} + +Edits &Edits::operator=(const Edits &other) { + length = other.length; + delta = other.delta; + numChanges = other.numChanges; + errorCode_ = other.errorCode_; + return copyArray(other); +} + +Edits &Edits::operator=(Edits &&src) U_NOEXCEPT { + length = src.length; + delta = src.delta; + numChanges = src.numChanges; + errorCode_ = src.errorCode_; + return moveArray(src); +} + +Edits::~Edits() { + releaseArray(); +} + +void Edits::reset() U_NOEXCEPT { + length = delta = numChanges = 0; + errorCode_ = U_ZERO_ERROR; } void Edits::addUnchanged(int32_t unchangedLength) { - if(U_FAILURE(errorCode) || unchangedLength == 0) { return; } + if(U_FAILURE(errorCode_) || unchangedLength == 0) { return; } if(unchangedLength < 0) { - errorCode = U_ILLEGAL_ARGUMENT_ERROR; + errorCode_ = U_ILLEGAL_ARGUMENT_ERROR; return; } // Merge into previous unchanged-text record, if any. @@ -72,38 +137,41 @@ void Edits::addUnchanged(int32_t unchangedLength) { } void Edits::addReplace(int32_t oldLength, int32_t newLength) { - if(U_FAILURE(errorCode)) { return; } - if(oldLength == newLength && 0 < oldLength && oldLength <= MAX_SHORT_WIDTH) { - // Replacement of short oldLength text units by same-length new text. - // Merge into previous short-replacement record, if any. - int32_t last = lastUnit(); - if(MAX_UNCHANGED < last && last < MAX_SHORT_CHANGE && - (last >> 12) == oldLength && (last & 0xfff) < MAX_SHORT_CHANGE_LENGTH) { - setLastUnit(last + 1); - return; - } - append(oldLength << 12); - return; - } - + if(U_FAILURE(errorCode_)) { return; } if(oldLength < 0 || newLength < 0) { - errorCode = U_ILLEGAL_ARGUMENT_ERROR; + errorCode_ = U_ILLEGAL_ARGUMENT_ERROR; return; } if (oldLength == 0 && newLength == 0) { return; } + ++numChanges; int32_t newDelta = newLength - oldLength; if (newDelta != 0) { if ((newDelta > 0 && delta >= 0 && newDelta > (INT32_MAX - delta)) || (newDelta < 0 && delta < 0 && newDelta < (INT32_MIN - delta))) { // Integer overflow or underflow. - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR; return; } delta += newDelta; } + if(0 < oldLength && oldLength <= MAX_SHORT_CHANGE_OLD_LENGTH && + newLength <= MAX_SHORT_CHANGE_NEW_LENGTH) { + // Merge into previous same-lengths short-replacement record, if any. + int32_t u = (oldLength << 12) | (newLength << 9); + int32_t last = lastUnit(); + if(MAX_UNCHANGED < last && last < MAX_SHORT_CHANGE && + (last & ~SHORT_CHANGE_NUM_MASK) == u && + (last & SHORT_CHANGE_NUM_MASK) < SHORT_CHANGE_NUM_MASK) { + setLastUnit(last + 1); + return; + } + append(u); + return; + } + int32_t head = 0x7000; if (oldLength < LENGTH_IN_1TRAIL && newLength < LENGTH_IN_1TRAIL) { head |= oldLength << 6; @@ -149,7 +217,7 @@ UBool Edits::growArray() { } else if (capacity == INT32_MAX) { // Not U_BUFFER_OVERFLOW_ERROR because that could be confused on a string transform API // with a result-string-buffer overflow. - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR; return FALSE; } else if (capacity >= (INT32_MAX / 2)) { newCapacity = INT32_MAX; @@ -158,18 +226,16 @@ UBool Edits::growArray() { } // Grow by at least 5 units so that a maximal change record will fit. if ((newCapacity - capacity) < 5) { - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + errorCode_ = U_INDEX_OUTOFBOUNDS_ERROR; return FALSE; } uint16_t *newArray = (uint16_t *)uprv_malloc((size_t)newCapacity * 2); if (newArray == NULL) { - errorCode = U_MEMORY_ALLOCATION_ERROR; + errorCode_ = U_MEMORY_ALLOCATION_ERROR; return FALSE; } uprv_memcpy(newArray, array, (size_t)length * 2); - if (array != stackArray) { - uprv_free(array); - } + releaseArray(); array = newArray; capacity = newCapacity; return TRUE; @@ -177,27 +243,161 @@ UBool Edits::growArray() { UBool Edits::copyErrorTo(UErrorCode &outErrorCode) { if (U_FAILURE(outErrorCode)) { return TRUE; } - if (U_SUCCESS(errorCode)) { return FALSE; } - outErrorCode = errorCode; + if (U_SUCCESS(errorCode_)) { return FALSE; } + outErrorCode = errorCode_; return TRUE; } -UBool Edits::hasChanges() const { - if (delta != 0) { - return TRUE; - } - for (int32_t i = 0; i < length; ++i) { - if (array[i] > MAX_UNCHANGED) { - return TRUE; +Edits &Edits::mergeAndAppend(const Edits &ab, const Edits &bc, UErrorCode &errorCode) { + if (copyErrorTo(errorCode)) { return *this; } + // Picture string a --(Edits ab)--> string b --(Edits bc)--> string c. + // Parallel iteration over both Edits. + Iterator abIter = ab.getFineIterator(); + Iterator bcIter = bc.getFineIterator(); + UBool abHasNext = TRUE, bcHasNext = TRUE; + // Copy iterator state into local variables, so that we can modify and subdivide spans. + // ab old & new length, bc old & new length + int32_t aLength = 0, ab_bLength = 0, bc_bLength = 0, cLength = 0; + // When we have different-intermediate-length changes, we accumulate a larger change. + int32_t pending_aLength = 0, pending_cLength = 0; + for (;;) { + // At this point, for each of the two iterators: + // Either we are done with the locally cached current edit, + // and its intermediate-string length has been reset, + // or we will continue to work with a truncated remainder of this edit. + // + // If the current edit is done, and the iterator has not yet reached the end, + // then we fetch the next edit. This is true for at least one of the iterators. + // + // Normally it does not matter whether we fetch from ab and then bc or vice versa. + // However, the result is observably different when + // ab deletions meet bc insertions at the same intermediate-string index. + // Some users expect the bc insertions to come first, so we fetch from bc first. + if (bc_bLength == 0) { + if (bcHasNext && (bcHasNext = bcIter.next(errorCode))) { + bc_bLength = bcIter.oldLength(); + cLength = bcIter.newLength(); + if (bc_bLength == 0) { + // insertion + if (ab_bLength == 0 || !abIter.hasChange()) { + addReplace(pending_aLength, pending_cLength + cLength); + pending_aLength = pending_cLength = 0; + } else { + pending_cLength += cLength; + } + continue; + } + } + // else see if the other iterator is done, too. + } + if (ab_bLength == 0) { + if (abHasNext && (abHasNext = abIter.next(errorCode))) { + aLength = abIter.oldLength(); + ab_bLength = abIter.newLength(); + if (ab_bLength == 0) { + // deletion + if (bc_bLength == bcIter.oldLength() || !bcIter.hasChange()) { + addReplace(pending_aLength + aLength, pending_cLength); + pending_aLength = pending_cLength = 0; + } else { + pending_aLength += aLength; + } + continue; + } + } else if (bc_bLength == 0) { + // Both iterators are done at the same time: + // The intermediate-string lengths match. + break; + } else { + // The ab output string is shorter than the bc input string. + if (!copyErrorTo(errorCode)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return *this; + } + } + if (bc_bLength == 0) { + // The bc input string is shorter than the ab output string. + if (!copyErrorTo(errorCode)) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + } + return *this; + } + // Done fetching: ab_bLength > 0 && bc_bLength > 0 + + // The current state has two parts: + // - Past: We accumulate a longer ac edit in the "pending" variables. + // - Current: We have copies of the current ab/bc edits in local variables. + // At least one side is newly fetched. + // One side might be a truncated remainder of an edit we fetched earlier. + + if (!abIter.hasChange() && !bcIter.hasChange()) { + // An unchanged span all the way from string a to string c. + if (pending_aLength != 0 || pending_cLength != 0) { + addReplace(pending_aLength, pending_cLength); + pending_aLength = pending_cLength = 0; + } + int32_t unchangedLength = aLength <= cLength ? aLength : cLength; + addUnchanged(unchangedLength); + ab_bLength = aLength -= unchangedLength; + bc_bLength = cLength -= unchangedLength; + // At least one of the unchanged spans is now empty. + continue; + } + if (!abIter.hasChange() && bcIter.hasChange()) { + // Unchanged a->b but changed b->c. + if (ab_bLength >= bc_bLength) { + // Split the longer unchanged span into change + remainder. + addReplace(pending_aLength + bc_bLength, pending_cLength + cLength); + pending_aLength = pending_cLength = 0; + aLength = ab_bLength -= bc_bLength; + bc_bLength = 0; + continue; + } + // Handle the shorter unchanged span below like a change. + } else if (abIter.hasChange() && !bcIter.hasChange()) { + // Changed a->b and then unchanged b->c. + if (ab_bLength <= bc_bLength) { + // Split the longer unchanged span into change + remainder. + addReplace(pending_aLength + aLength, pending_cLength + ab_bLength); + pending_aLength = pending_cLength = 0; + cLength = bc_bLength -= ab_bLength; + ab_bLength = 0; + continue; + } + // Handle the shorter unchanged span below like a change. + } else { // both abIter.hasChange() && bcIter.hasChange() + if (ab_bLength == bc_bLength) { + // Changes on both sides up to the same position. Emit & reset. + addReplace(pending_aLength + aLength, pending_cLength + cLength); + pending_aLength = pending_cLength = 0; + ab_bLength = bc_bLength = 0; + continue; + } + } + // Accumulate the a->c change, reset the shorter side, + // keep a remainder of the longer one. + pending_aLength += aLength; + pending_cLength += cLength; + if (ab_bLength < bc_bLength) { + bc_bLength -= ab_bLength; + cLength = ab_bLength = 0; + } else { // ab_bLength > bc_bLength + ab_bLength -= bc_bLength; + aLength = bc_bLength = 0; } } - return FALSE; + if (pending_aLength != 0 || pending_cLength != 0) { + addReplace(pending_aLength, pending_cLength); + } + copyErrorTo(errorCode); + return *this; } Edits::Iterator::Iterator(const uint16_t *a, int32_t len, UBool oc, UBool crs) : array(a), index(0), length(len), remaining(0), onlyChanges_(oc), coarse(crs), - changed(FALSE), oldLength_(0), newLength_(0), + dir(0), changed(FALSE), oldLength_(0), newLength_(0), srcIndex(0), replIndex(0), destIndex(0) {} int32_t Edits::Iterator::readLength(int32_t head) { @@ -219,7 +419,7 @@ int32_t Edits::Iterator::readLength(int32_t head) { } } -void Edits::Iterator::updateIndexes() { +void Edits::Iterator::updateNextIndexes() { srcIndex += oldLength_; if (changed) { replIndex += newLength_; @@ -227,22 +427,52 @@ void Edits::Iterator::updateIndexes() { destIndex += newLength_; } +void Edits::Iterator::updatePreviousIndexes() { + srcIndex -= oldLength_; + if (changed) { + replIndex -= newLength_; + } + destIndex -= newLength_; +} + UBool Edits::Iterator::noNext() { - // No change beyond the string. + // No change before or beyond the string. + dir = 0; changed = FALSE; oldLength_ = newLength_ = 0; return FALSE; } UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) { + // Forward iteration: Update the string indexes to the limit of the current span, + // and post-increment-read array units to assemble a new span. + // Leaves the array index one after the last unit of that span. if (U_FAILURE(errorCode)) { return FALSE; } // We have an errorCode in case we need to start guarding against integer overflows. // It is also convenient for caller loops if we bail out when an error was set elsewhere. - updateIndexes(); - if (remaining > 0) { - // Fine-grained iterator: Continue a sequence of equal-length changes. - --remaining; - return TRUE; + if (dir > 0) { + updateNextIndexes(); + } else { + if (dir < 0) { + // Turn around from previous() to next(). + // Post-increment-read the same span again. + if (remaining > 0) { + // Fine-grained iterator: + // Stay on the current one of a sequence of compressed changes. + ++index; // next() rests on the index after the sequence unit. + dir = 1; + return TRUE; + } + } + dir = 1; + } + if (remaining >= 1) { + // Fine-grained iterator: Continue a sequence of compressed changes. + if (remaining > 1) { + --remaining; + return TRUE; + } + remaining = 0; } if (index >= length) { return noNext(); @@ -258,7 +488,7 @@ UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) { } newLength_ = oldLength_; if (onlyChanges) { - updateIndexes(); + updateNextIndexes(); if (index >= length) { return noNext(); } @@ -270,14 +500,19 @@ UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) { } changed = TRUE; if (u <= MAX_SHORT_CHANGE) { + int32_t oldLen = u >> 12; + int32_t newLen = (u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH; + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; if (coarse) { - int32_t w = u >> 12; - int32_t len = (u & 0xfff) + 1; - oldLength_ = newLength_ = len * w; + oldLength_ = num * oldLen; + newLength_ = num * newLen; } else { - // Split a sequence of equal-length changes that was compressed into one unit. - oldLength_ = newLength_ = u >> 12; - remaining = u & 0xfff; + // Split a sequence of changes that was compressed into one unit. + oldLength_ = oldLen; + newLength_ = newLen; + if (num > 1) { + remaining = num; // This is the first of two or more changes. + } return TRUE; } } else { @@ -292,55 +527,250 @@ UBool Edits::Iterator::next(UBool onlyChanges, UErrorCode &errorCode) { while (index < length && (u = array[index]) > MAX_UNCHANGED) { ++index; if (u <= MAX_SHORT_CHANGE) { - int32_t w = u >> 12; - int32_t len = (u & 0xfff) + 1; - len = len * w; - oldLength_ += len; - newLength_ += len; + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; + oldLength_ += (u >> 12) * num; + newLength_ += ((u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH) * num; } else { U_ASSERT(u <= 0x7fff); - int32_t oldLen = readLength((u >> 6) & 0x3f); - int32_t newLen = readLength(u & 0x3f); - oldLength_ += oldLen; - newLength_ += newLen; + oldLength_ += readLength((u >> 6) & 0x3f); + newLength_ += readLength(u & 0x3f); } } return TRUE; } -UBool Edits::Iterator::findSourceIndex(int32_t i, UErrorCode &errorCode) { - if (U_FAILURE(errorCode) || i < 0) { return FALSE; } - if (i < srcIndex) { +UBool Edits::Iterator::previous(UErrorCode &errorCode) { + // Backward iteration: Pre-decrement-read array units to assemble a new span, + // then update the string indexes to the start of that span. + // Leaves the array index on the head unit of that span. + if (U_FAILURE(errorCode)) { return FALSE; } + // We have an errorCode in case we need to start guarding against integer overflows. + // It is also convenient for caller loops if we bail out when an error was set elsewhere. + if (dir >= 0) { + if (dir > 0) { + // Turn around from next() to previous(). + // Set the string indexes to the span limit and + // pre-decrement-read the same span again. + if (remaining > 0) { + // Fine-grained iterator: + // Stay on the current one of a sequence of compressed changes. + --index; // previous() rests on the sequence unit. + dir = -1; + return TRUE; + } + updateNextIndexes(); + } + dir = -1; + } + if (remaining > 0) { + // Fine-grained iterator: Continue a sequence of compressed changes. + int32_t u = array[index]; + U_ASSERT(MAX_UNCHANGED < u && u <= MAX_SHORT_CHANGE); + if (remaining <= (u & SHORT_CHANGE_NUM_MASK)) { + ++remaining; + updatePreviousIndexes(); + return TRUE; + } + remaining = 0; + } + if (index <= 0) { + return noNext(); + } + int32_t u = array[--index]; + if (u <= MAX_UNCHANGED) { + // Combine adjacent unchanged ranges. + changed = FALSE; + oldLength_ = u + 1; + while (index > 0 && (u = array[index - 1]) <= MAX_UNCHANGED) { + --index; + oldLength_ += u + 1; + } + newLength_ = oldLength_; + // No need to handle onlyChanges as long as previous() is called only from findIndex(). + updatePreviousIndexes(); + return TRUE; + } + changed = TRUE; + if (u <= MAX_SHORT_CHANGE) { + int32_t oldLen = u >> 12; + int32_t newLen = (u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH; + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; + if (coarse) { + oldLength_ = num * oldLen; + newLength_ = num * newLen; + } else { + // Split a sequence of changes that was compressed into one unit. + oldLength_ = oldLen; + newLength_ = newLen; + if (num > 1) { + remaining = 1; // This is the last of two or more changes. + } + updatePreviousIndexes(); + return TRUE; + } + } else { + if (u <= 0x7fff) { + // The change is encoded in u alone. + oldLength_ = readLength((u >> 6) & 0x3f); + newLength_ = readLength(u & 0x3f); + } else { + // Back up to the head of the change, read the lengths, + // and reset the index to the head again. + U_ASSERT(index > 0); + while ((u = array[--index]) > 0x7fff) {} + U_ASSERT(u > MAX_SHORT_CHANGE); + int32_t headIndex = index++; + oldLength_ = readLength((u >> 6) & 0x3f); + newLength_ = readLength(u & 0x3f); + index = headIndex; + } + if (!coarse) { + updatePreviousIndexes(); + return TRUE; + } + } + // Combine adjacent changes. + while (index > 0 && (u = array[index - 1]) > MAX_UNCHANGED) { + --index; + if (u <= MAX_SHORT_CHANGE) { + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1; + oldLength_ += (u >> 12) * num; + newLength_ += ((u >> 9) & MAX_SHORT_CHANGE_NEW_LENGTH) * num; + } else if (u <= 0x7fff) { + // Read the lengths, and reset the index to the head again. + int32_t headIndex = index++; + oldLength_ += readLength((u >> 6) & 0x3f); + newLength_ += readLength(u & 0x3f); + index = headIndex; + } + } + updatePreviousIndexes(); + return TRUE; +} + +int32_t Edits::Iterator::findIndex(int32_t i, UBool findSource, UErrorCode &errorCode) { + if (U_FAILURE(errorCode) || i < 0) { return -1; } + int32_t spanStart, spanLength; + if (findSource) { // find source index + spanStart = srcIndex; + spanLength = oldLength_; + } else { // find destination index + spanStart = destIndex; + spanLength = newLength_; + } + if (i < spanStart) { + if (i >= (spanStart / 2)) { + // Search backwards. + for (;;) { + UBool hasPrevious = previous(errorCode); + U_ASSERT(hasPrevious); // because i>=0 and the first span starts at 0 + (void)hasPrevious; // avoid unused-variable warning + spanStart = findSource ? srcIndex : destIndex; + if (i >= spanStart) { + // The index is in the current span. + return 0; + } + if (remaining > 0) { + // Is the index in one of the remaining compressed edits? + // spanStart is the start of the current span, first of the remaining ones. + spanLength = findSource ? oldLength_ : newLength_; + int32_t u = array[index]; + U_ASSERT(MAX_UNCHANGED < u && u <= MAX_SHORT_CHANGE); + int32_t num = (u & SHORT_CHANGE_NUM_MASK) + 1 - remaining; + int32_t len = num * spanLength; + if (i >= (spanStart - len)) { + int32_t n = ((spanStart - i - 1) / spanLength) + 1; + // 1 <= n <= num + srcIndex -= n * oldLength_; + replIndex -= n * newLength_; + destIndex -= n * newLength_; + remaining += n; + return 0; + } + // Skip all of these edits at once. + srcIndex -= num * oldLength_; + replIndex -= num * newLength_; + destIndex -= num * newLength_; + remaining = 0; + } + } + } // Reset the iterator to the start. + dir = 0; index = remaining = oldLength_ = newLength_ = srcIndex = replIndex = destIndex = 0; - } else if (i < (srcIndex + oldLength_)) { + } else if (i < (spanStart + spanLength)) { // The index is in the current span. - return TRUE; + return 0; } while (next(FALSE, errorCode)) { - if (i < (srcIndex + oldLength_)) { + if (findSource) { + spanStart = srcIndex; + spanLength = oldLength_; + } else { + spanStart = destIndex; + spanLength = newLength_; + } + if (i < (spanStart + spanLength)) { // The index is in the current span. - return TRUE; + return 0; } - if (remaining > 0) { + if (remaining > 1) { // Is the index in one of the remaining compressed edits? - // srcIndex is the start of the current span, before the remaining ones. - int32_t len = (remaining + 1) * oldLength_; - if (i < (srcIndex + len)) { - int32_t n = (i - srcIndex) / oldLength_; // 1 <= n <= remaining - len = n * oldLength_; - srcIndex += len; - replIndex += len; - destIndex += len; + // spanStart is the start of the current span, first of the remaining ones. + int32_t len = remaining * spanLength; + if (i < (spanStart + len)) { + int32_t n = (i - spanStart) / spanLength; // 1 <= n <= remaining - 1 + srcIndex += n * oldLength_; + replIndex += n * newLength_; + destIndex += n * newLength_; remaining -= n; - return TRUE; + return 0; } // Make next() skip all of these edits at once. - oldLength_ = newLength_ = len; + oldLength_ *= remaining; + newLength_ *= remaining; remaining = 0; } } - return FALSE; + return 1; +} + +int32_t Edits::Iterator::destinationIndexFromSourceIndex(int32_t i, UErrorCode &errorCode) { + int32_t where = findIndex(i, TRUE, errorCode); + if (where < 0) { + // Error or before the string. + return 0; + } + if (where > 0 || i == srcIndex) { + // At or after string length, or at start of the found span. + return destIndex; + } + if (changed) { + // In a change span, map to its end. + return destIndex + newLength_; + } else { + // In an unchanged span, offset 1:1 within it. + return destIndex + (i - srcIndex); + } +} + +int32_t Edits::Iterator::sourceIndexFromDestinationIndex(int32_t i, UErrorCode &errorCode) { + int32_t where = findIndex(i, FALSE, errorCode); + if (where < 0) { + // Error or before the string. + return 0; + } + if (where > 0 || i == destIndex) { + // At or after string length, or at start of the found span. + return srcIndex; + } + if (changed) { + // In a change span, map to its end. + return srcIndex + oldLength_; + } else { + // In an unchanged span, offset within it. + return srcIndex + (i - destIndex); + } } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/filteredbrk.cpp b/deps/icu-small/source/common/filteredbrk.cpp index 0f642b19f6c828..6a38b1bf3baf40 100644 --- a/deps/icu-small/source/common/filteredbrk.cpp +++ b/deps/icu-small/source/common/filteredbrk.cpp @@ -694,7 +694,7 @@ FilteredBreakIteratorBuilder::createInstance(const Locale& where, UErrorCode& st } FilteredBreakIteratorBuilder * -FilteredBreakIteratorBuilder::createInstance(UErrorCode& status) { +FilteredBreakIteratorBuilder::createEmptyInstance(UErrorCode& status) { if(U_FAILURE(status)) return NULL; LocalPointer ret(new SimpleFilteredBreakIteratorBuilder(status), status); return (U_SUCCESS(status))? ret.orphan(): NULL; diff --git a/deps/icu-small/source/common/filterednormalizer2.cpp b/deps/icu-small/source/common/filterednormalizer2.cpp index 28e5f6cbddefaf..1a0914d3f7b34c 100644 --- a/deps/icu-small/source/common/filterednormalizer2.cpp +++ b/deps/icu-small/source/common/filterednormalizer2.cpp @@ -20,7 +20,9 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/uniset.h" #include "unicode/unistr.h" #include "unicode/unorm.h" @@ -85,6 +87,52 @@ FilteredNormalizer2::normalize(const UnicodeString &src, return dest; } +void +FilteredNormalizer2::normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + options |= U_EDITS_NO_RESET; // Do not reset for each span. + normalizeUTF8(options, src.data(), src.length(), sink, edits, USET_SPAN_SIMPLE, errorCode); +} + +void +FilteredNormalizer2::normalizeUTF8(uint32_t options, const char *src, int32_t length, + ByteSink &sink, Edits *edits, + USetSpanCondition spanCondition, + UErrorCode &errorCode) const { + while (length > 0) { + int32_t spanLength = set.spanUTF8(src, length, spanCondition); + if (spanCondition == USET_SPAN_NOT_CONTAINED) { + if (spanLength != 0) { + if (edits != nullptr) { + edits->addUnchanged(spanLength); + } + if ((options & U_OMIT_UNCHANGED_TEXT) == 0) { + sink.Append(src, spanLength); + } + } + spanCondition = USET_SPAN_SIMPLE; + } else { + if (spanLength != 0) { + // Not norm2.normalizeSecondAndAppend() because we do not want + // to modify the non-filter part of dest. + norm2.normalizeUTF8(options, StringPiece(src, spanLength), sink, edits, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + } + spanCondition = USET_SPAN_NOT_CONTAINED; + } + src += spanLength; + length -= spanLength; + } +} + UnicodeString & FilteredNormalizer2::normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, @@ -196,6 +244,31 @@ FilteredNormalizer2::isNormalized(const UnicodeString &s, UErrorCode &errorCode) return TRUE; } +UBool +FilteredNormalizer2::isNormalizedUTF8(StringPiece sp, UErrorCode &errorCode) const { + if(U_FAILURE(errorCode)) { + return FALSE; + } + const char *s = sp.data(); + int32_t length = sp.length(); + USetSpanCondition spanCondition = USET_SPAN_SIMPLE; + while (length > 0) { + int32_t spanLength = set.spanUTF8(s, length, spanCondition); + if (spanCondition == USET_SPAN_NOT_CONTAINED) { + spanCondition = USET_SPAN_SIMPLE; + } else { + if (!norm2.isNormalizedUTF8(StringPiece(s, spanLength), errorCode) || + U_FAILURE(errorCode)) { + return FALSE; + } + spanCondition = USET_SPAN_NOT_CONTAINED; + } + s += spanLength; + length -= spanLength; + } + return TRUE; +} + UNormalizationCheckResult FilteredNormalizer2::quickCheck(const UnicodeString &s, UErrorCode &errorCode) const { uprv_checkCanGetBuffer(s, errorCode); diff --git a/deps/icu-small/source/common/hash.h b/deps/icu-small/source/common/hash.h index 900c8120984e84..cc82ad2454b440 100644 --- a/deps/icu-small/source/common/hash.h +++ b/deps/icu-small/source/common/hash.h @@ -33,6 +33,8 @@ class U_COMMON_API Hashtable : public UMemory { inline void init(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status); + inline void initSize(UHashFunction *keyHash, UKeyComparator *keyComp, UValueComparator *valueComp, int32_t size, UErrorCode& status); + public: /** * Construct a hashtable @@ -41,6 +43,14 @@ class U_COMMON_API Hashtable : public UMemory { */ Hashtable(UBool ignoreKeyCase, UErrorCode& status); + /** + * Construct a hashtable + * @param ignoreKeyCase If true, keys are case insensitive. + * @param size initial size allocation + * @param status Error code + */ + Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status); + /** * Construct a hashtable * @param keyComp Comparator for comparing the keys @@ -119,10 +129,23 @@ inline void Hashtable::init(UHashFunction *keyHash, UKeyComparator *keyComp, } } +inline void Hashtable::initSize(UHashFunction *keyHash, UKeyComparator *keyComp, + UValueComparator *valueComp, int32_t size, UErrorCode& status) { + if (U_FAILURE(status)) { + return; + } + uhash_initSize(&hashObj, keyHash, keyComp, valueComp, size, &status); + if (U_SUCCESS(status)) { + hash = &hashObj; + uhash_setKeyDeleter(hash, uprv_deleteUObject); + } +} + inline Hashtable::Hashtable(UKeyComparator *keyComp, UValueComparator *valueComp, UErrorCode& status) : hash(0) { init( uhash_hashUnicodeString, keyComp, valueComp, status); } + inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) : hash(0) { @@ -134,6 +157,17 @@ inline Hashtable::Hashtable(UBool ignoreKeyCase, UErrorCode& status) status); } +inline Hashtable::Hashtable(UBool ignoreKeyCase, int32_t size, UErrorCode& status) + : hash(0) +{ + initSize(ignoreKeyCase ? uhash_hashCaselessUnicodeString + : uhash_hashUnicodeString, + ignoreKeyCase ? uhash_compareCaselessUnicodeString + : uhash_compareUnicodeString, + NULL, size, + status); +} + inline Hashtable::Hashtable(UErrorCode& status) : hash(0) { diff --git a/deps/icu-small/source/common/listformatter.cpp b/deps/icu-small/source/common/listformatter.cpp index d105654755fd1e..33a8ac28671fc6 100644 --- a/deps/icu-small/source/common/listformatter.cpp +++ b/deps/icu-small/source/common/listformatter.cpp @@ -63,7 +63,7 @@ ListFormatInternal(const ListFormatInternal &other) : static Hashtable* listPatternHash = NULL; static UMutex listFormatterMutex = U_MUTEX_INITIALIZER; -static const char *STANDARD_STYLE = "standard"; +static const char STANDARD_STYLE[] = "standard"; U_CDECL_BEGIN static UBool U_CALLCONV uprv_listformatter_cleanup() { diff --git a/deps/icu-small/source/common/loadednormalizer2impl.cpp b/deps/icu-small/source/common/loadednormalizer2impl.cpp index 2b2d9a8e809b04..6fb9b816dc6591 100644 --- a/deps/icu-small/source/common/loadednormalizer2impl.cpp +++ b/deps/icu-small/source/common/loadednormalizer2impl.cpp @@ -62,7 +62,7 @@ LoadedNormalizer2Impl::isAcceptable(void * /*context*/, pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6d && pInfo->dataFormat[3]==0x32 && - pInfo->formatVersion[0]==2 + pInfo->formatVersion[0]==3 ) { // Normalizer2Impl *me=(Normalizer2Impl *)context; // uprv_memcpy(me->dataVersion, pInfo->dataVersion, 4); @@ -84,7 +84,7 @@ LoadedNormalizer2Impl::load(const char *packageName, const char *name, UErrorCod const uint8_t *inBytes=(const uint8_t *)udata_getMemory(memory); const int32_t *inIndexes=(const int32_t *)inBytes; int32_t indexesLength=inIndexes[IX_NORM_TRIE_OFFSET]/4; - if(indexesLength<=IX_MIN_MAYBE_YES) { + if(indexesLength<=IX_MIN_LCCC_CP) { errorCode=U_INVALID_FORMAT_ERROR; // Not enough indexes. return; } diff --git a/deps/icu-small/source/common/locavailable.cpp b/deps/icu-small/source/common/locavailable.cpp index 5079885936ae32..b3a3346a195995 100644 --- a/deps/icu-small/source/common/locavailable.cpp +++ b/deps/icu-small/source/common/locavailable.cpp @@ -35,7 +35,7 @@ U_NAMESPACE_BEGIN static icu::Locale* availableLocaleList = NULL; static int32_t availableLocaleListCount; -static icu::UInitOnce gInitOnce = U_INITONCE_INITIALIZER; +static icu::UInitOnce gInitOnceLocale = U_INITONCE_INITIALIZER; U_NAMESPACE_END @@ -50,7 +50,7 @@ static UBool U_CALLCONV locale_available_cleanup(void) availableLocaleList = NULL; } availableLocaleListCount = 0; - gInitOnce.reset(); + gInitOnceLocale.reset(); return TRUE; } @@ -81,7 +81,7 @@ void U_CALLCONV locale_available_init() { const Locale* U_EXPORT2 Locale::getAvailableLocales(int32_t& count) { - umtx_initOnce(gInitOnce, &locale_available_init); + umtx_initOnce(gInitOnceLocale, &locale_available_init); count = availableLocaleListCount; return availableLocaleList; } diff --git a/deps/icu-small/source/common/locdispnames.cpp b/deps/icu-small/source/common/locdispnames.cpp index f5cd9a48f333c0..83c7bc30c02703 100644 --- a/deps/icu-small/source/common/locdispnames.cpp +++ b/deps/icu-small/source/common/locdispnames.cpp @@ -542,7 +542,7 @@ uloc_getDisplayName(const char *locale, return 0; } separator = (const UChar *)p0 + subLen; - sepLen = p1 - separator; + sepLen = static_cast(p1 - separator); } if(patLen==0 || (patLen==defaultPatLen && !u_strncmp(pattern, defaultPattern, patLen))) { @@ -558,8 +558,8 @@ uloc_getDisplayName(const char *locale, *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; } - sub0Pos=p0-pattern; - sub1Pos=p1-pattern; + sub0Pos = static_cast(p0-pattern); + sub1Pos = static_cast(p1-pattern); if (sub1Pos < sub0Pos) { /* a very odd pattern */ int32_t t=sub0Pos; sub0Pos=sub1Pos; sub1Pos=t; langi=1; @@ -821,6 +821,8 @@ uloc_getDisplayKeywordValue( const char* locale, /* get the keyword value */ keywordValue[0]=0; keywordValueLen = uloc_getKeywordValue(locale, keyword, keywordValue, capacity, status); + if (*status == U_STRING_NOT_TERMINATED_WARNING) + *status = U_BUFFER_OVERFLOW_ERROR; /* * if the keyword is equal to currency .. then to get the display name diff --git a/deps/icu-small/source/common/locdspnm.cpp b/deps/icu-small/source/common/locdspnm.cpp index 39934dc6c33020..6ceb6cfc8bc653 100644 --- a/deps/icu-small/source/common/locdspnm.cpp +++ b/deps/icu-small/source/common/locdspnm.cpp @@ -54,7 +54,7 @@ static int32_t ncat(char *buffer, uint32_t buflen, ...) { *p = 0; va_end(args); - return p - buffer; + return static_cast(p - buffer); } U_NAMESPACE_BEGIN @@ -636,8 +636,9 @@ LocaleDisplayNamesImpl::localeDisplayName(const Locale& locale, char value[ULOC_KEYWORD_AND_VALUES_CAPACITY]; // sigh, no ULOC_VALUE_CAPACITY const char* key; while ((key = e->next((int32_t *)0, status)) != NULL) { + value[0] = 0; locale.getKeywordValue(key, value, ULOC_KEYWORD_AND_VALUES_CAPACITY, status); - if (U_FAILURE(status)) { + if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { return result; } keyDisplayName(key, temp, TRUE); diff --git a/deps/icu-small/source/common/loclikely.cpp b/deps/icu-small/source/common/loclikely.cpp index 1fbad9b9ff6e6c..e5876e2ea22773 100644 --- a/deps/icu-small/source/common/loclikely.cpp +++ b/deps/icu-small/source/common/loclikely.cpp @@ -511,7 +511,7 @@ parseTagString( unknownLanguage); *langLength = (int32_t)uprv_strlen(lang); } - else if (_isIDSeparator(*position)) { + if (_isIDSeparator(*position)) { ++position; } @@ -1281,7 +1281,7 @@ uloc_minimizeSubtags(const char* localeID, // Pairs of (language subtag, + or -) for finding out fast if common languages // are LTR (minus) or RTL (plus). -static const char* LANG_DIR_STRING = +static const char LANG_DIR_STRING[] = "root-en-es-pt-zh-ja-ko-de-fr-it-ar+he+fa+ru-nl-pl-th-tr-"; // Implemented here because this calls uloc_addLikelySubtags(). @@ -1383,4 +1383,3 @@ ulocimp_getRegionForSupplementalData(const char *localeID, UBool inferRegion, uprv_strncpy(region, rgBuf, regionCapacity); return u_terminateChars(region, regionCapacity, rgLen, status); } - diff --git a/deps/icu-small/source/common/locmap.cpp b/deps/icu-small/source/common/locmap.cpp index 8e47c84b1ee741..029c1edf032a00 100644 --- a/deps/icu-small/source/common/locmap.cpp +++ b/deps/icu-small/source/common/locmap.cpp @@ -190,7 +190,10 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0423, be, be_BY) ILCID_POSIX_ELEMENT_ARRAY(0x0402, bg, bg_BG) -ILCID_POSIX_ELEMENT_ARRAY(0x0466, bin, bin_NG) +ILCID_POSIX_SUBTABLE(bin) { + {0x66, "bin"}, + {0x0466, "bin_NG"} +}; ILCID_POSIX_SUBTABLE(bn) { {0x45, "bn"}, @@ -214,7 +217,13 @@ ILCID_POSIX_SUBTABLE(ca) { }; ILCID_POSIX_ELEMENT_ARRAY(0x0483, co, co_FR) -ILCID_POSIX_ELEMENT_ARRAY(0x045c, chr,chr_US) + +ILCID_POSIX_SUBTABLE(chr) { + {0x05c, "chr"}, + {0x7c5c, "chr_Cher"}, + {0x045c, "chr_Cher_US"}, + {0x045c, "chr_US"} +}; // ICU has chosen different names for these. ILCID_POSIX_SUBTABLE(ckb) { @@ -263,10 +272,10 @@ ILCID_POSIX_SUBTABLE(en) { {0x2C09, "en_TT"}, {0x0409, "en_US"}, {0x007f, "en_US_POSIX"}, /* duplicate for round-tripping */ - {0x2409, "en_VI"}, /* Virgin Islands AKA Caribbean Islands (en_CB). On Windows8+ This is 0x1000 or dynamically assigned */ + {0x2409, "en_029"}, {0x1c09, "en_ZA"}, {0x3009, "en_ZW"}, - {0x2409, "en_029"}, + {0x2409, "en_VI"}, /* Virgin Islands AKA Caribbean Islands (en_CB). On Windows8+ This is 0x1000 or dynamically assigned */ {0x0409, "en_AS"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ {0x0409, "en_GU"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ {0x0409, "en_MH"}, /* Alias for en_US. Leave last. On Windows8+ This is 0x1000 or dynamically assigned */ @@ -419,7 +428,12 @@ ILCID_POSIX_SUBTABLE(hsb) { ILCID_POSIX_ELEMENT_ARRAY(0x040e, hu, hu_HU) ILCID_POSIX_ELEMENT_ARRAY(0x042b, hy, hy_AM) -ILCID_POSIX_ELEMENT_ARRAY(0x0469, ibb, ibb_NG) + +ILCID_POSIX_SUBTABLE(ibb) { + {0x69, "ibb"}, + {0x0469, "ibb_NG"} +}; + ILCID_POSIX_ELEMENT_ARRAY(0x0421, id, id_ID) ILCID_POSIX_ELEMENT_ARRAY(0x0470, ig, ig_NG) ILCID_POSIX_ELEMENT_ARRAY(0x0478, ii, ii_CN) @@ -458,13 +472,18 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0471, kr, kr_NG) ILCID_POSIX_SUBTABLE(ks) { /* We could add PK and CN too */ {0x60, "ks"}, - {0x0860, "ks_IN"}, /* Documentation doesn't mention script */ {0x0460, "ks_Arab_IN"}, {0x0860, "ks_Deva_IN"} }; ILCID_POSIX_ELEMENT_ARRAY(0x0440, ky, ky_KG) /* Kyrgyz is spoken in Kyrgyzstan */ -ILCID_POSIX_ELEMENT_ARRAY(0x0476, la, la_IT) /* TODO: Verify the country */ + +ILCID_POSIX_SUBTABLE(la) { + {0x76, "la"}, + {0x0476, "la_001"}, + {0x0476, "la_IT"} /*Left in for compatibility*/ +}; + ILCID_POSIX_ELEMENT_ARRAY(0x046e, lb, lb_LU) ILCID_POSIX_ELEMENT_ARRAY(0x0454, lo, lo_LA) ILCID_POSIX_ELEMENT_ARRAY(0x0427, lt, lt_LT) @@ -535,15 +554,19 @@ ILCID_POSIX_SUBTABLE(or_IN) { {0x0448, "or_IN"}, }; - ILCID_POSIX_SUBTABLE(pa) { {0x46, "pa"}, {0x0446, "pa_IN"}, - {0x0846, "pa_PK"}, - {0x0846, "pa_Arab_PK"} + {0x0846, "pa_Arab_PK"}, + {0x0846, "pa_PK"} +}; + +ILCID_POSIX_SUBTABLE(pap) { + {0x79, "pap"}, + {0x0479, "pap_029"}, + {0x0479, "pap_AN"} /*Left in for compatibility*/ }; -ILCID_POSIX_ELEMENT_ARRAY(0x0479, pap, pap_AN) ILCID_POSIX_ELEMENT_ARRAY(0x0415, pl, pl_PL) ILCID_POSIX_ELEMENT_ARRAY(0x0463, ps, ps_AF) @@ -619,9 +642,11 @@ ILCID_POSIX_ELEMENT_ARRAY(0x0485, sah,sah_RU) ILCID_POSIX_SUBTABLE(sd) { {0x59, "sd"}, - {0x0459, "sd_IN"}, {0x0459, "sd_Deva_IN"}, - {0x0859, "sd_PK"} + {0x0459, "sd_IN"}, + {0x0859, "sd_Arab_PK"}, + {0x0859, "sd_PK"}, + {0x7c59, "sd_Arab"} }; ILCID_POSIX_SUBTABLE(se) { @@ -645,9 +670,8 @@ ILCID_POSIX_ELEMENT_ARRAY(0x045b, si, si_LK) ILCID_POSIX_ELEMENT_ARRAY(0x041b, sk, sk_SK) ILCID_POSIX_ELEMENT_ARRAY(0x0424, sl, sl_SI) -ILCID_POSIX_SUBTABLE(so) { /* TODO: Verify the country */ +ILCID_POSIX_SUBTABLE(so) { {0x77, "so"}, - {0x0477, "so_ET"}, {0x0477, "so_SO"} }; @@ -739,7 +763,12 @@ ILCID_POSIX_SUBTABLE(ve) { /* TODO: Verify the country */ ILCID_POSIX_ELEMENT_ARRAY(0x042a, vi, vi_VN) ILCID_POSIX_ELEMENT_ARRAY(0x0488, wo, wo_SN) ILCID_POSIX_ELEMENT_ARRAY(0x0434, xh, xh_ZA) -ILCID_POSIX_ELEMENT_ARRAY(0x043d, yi, yi) + +ILCID_POSIX_SUBTABLE(yi) { + {0x003d, "yi"}, + {0x043d, "yi_001"} +}; + ILCID_POSIX_ELEMENT_ARRAY(0x046a, yo, yo_NG) // Windows & ICU tend to different names for some of these @@ -1033,6 +1062,8 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr const char *pPosixID = NULL; #ifdef USE_WINDOWS_LCID_MAPPING_API + char locName[LOCALE_NAME_MAX_LENGTH] = {}; // ICU name can't be longer than Windows name + // Note: Windows primary lang ID 0x92 in LCID is used for Central Kurdish and // GetLocaleInfo() maps such LCID to "ku". However, CLDR uses "ku" for // Northern Kurdish and "ckb" for Central Kurdish. For this reason, we cannot @@ -1040,7 +1071,6 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr if ((hostid & 0x3FF) != 0x92) { int32_t tmpLen = 0; UChar windowsLocaleName[LOCALE_NAME_MAX_LENGTH]; // ULOC_FULLNAME_CAPACITY > LOCALE_NAME_MAX_LENGTH - char locName[LOCALE_NAME_MAX_LENGTH]; // ICU name can't be longer than Windows name // Note: LOCALE_ALLOW_NEUTRAL_NAMES was enabled in Windows7+, prior versions did not handle neutral (no-region) locale names. tmpLen = LCIDToLocaleName(hostid, (PWSTR)windowsLocaleName, UPRV_LENGTHOF(windowsLocaleName), LOCALE_ALLOW_NEUTRAL_NAMES); @@ -1102,7 +1132,7 @@ uprv_convertToPosix(uint32_t hostid, char *posixID, int32_t posixIDCapacity, UEr } if (pPosixID) { - int32_t resLen = uprv_strlen(pPosixID); + int32_t resLen = static_cast(uprv_strlen(pPosixID)); int32_t copyLen = resLen <= posixIDCapacity ? resLen : posixIDCapacity; uprv_memcpy(posixID, pPosixID, copyLen); if (resLen < posixIDCapacity) { @@ -1176,7 +1206,7 @@ uprv_convertToLCIDPlatform(const char* localeID) char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; // this will change it from de_DE@collation=phonebook to de-DE-u-co-phonebk form - int32_t bcp47Len = uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &myStatus); + (void)uloc_toLanguageTag(mylocaleID, asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &myStatus); if (U_SUCCESS(myStatus)) { @@ -1213,6 +1243,8 @@ uprv_convertToLCIDPlatform(const char* localeID) } } } +#else + (void)localeID; // Suppress unused variable warning. #endif /* USE_WINDOWS_LCID_MAPPING_API */ // No found, or not implemented on platforms without native name->lcid conversion diff --git a/deps/icu-small/source/common/norm2_nfc_data.h b/deps/icu-small/source/common/norm2_nfc_data.h index 9295404a35bac6..8f5c4346db5ffe 100644 --- a/deps/icu-small/source/common/norm2_nfc_data.h +++ b/deps/icu-small/source/common/norm2_nfc_data.h @@ -1,49 +1,50 @@ // © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html -/* - * Copyright (C) 1999-2016, International Business Machines - * Corporation and others. All Rights Reserved. - * - * file name: norm2_nfc_data.h - * - * machine-generated by: icu/source/tools/gennorm2/n2builder.cpp - */ +// +// Copyright (C) 1999-2016, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: norm2_nfc_data.h +// +// machine-generated by: icu/source/tools/gennorm2/n2builder.cpp + #ifdef INCLUDED_FROM_NORMALIZER2_CPP -static const UVersionInfo norm2_nfc_data_formatVersion={2,0,0,0}; -static const UVersionInfo norm2_nfc_data_dataVersion={9,0,0,0}; +static const UVersionInfo norm2_nfc_data_formatVersion={3,0,0,0}; +static const UVersionInfo norm2_nfc_data_dataVersion={0xa,0,0,0}; static const int32_t norm2_nfc_data_indexes[Normalizer2Impl::IX_COUNT]={ -0x40,0x4bb8,0x880c,0x890c,0x890c,0x890c,0x890c,0x890c,0xc0,0x300,0x56e,0x14e7,0x1e2a,0xfe00,0x941,0 +0x50,0x4cc0,0x8918,0x8a18,0x8a18,0x8a18,0x8a18,0x8a18,0xc0,0x300,0xadc,0x29d0,0x3c56,0xfc00,0x1282,0x3b8c, +0x3c24,0x3c56,0x300,0 }; -static const uint16_t norm2_nfc_data_trieIndex[9652]={ +static const uint16_t norm2_nfc_data_trieIndex[9776]={ 0x2a8,0x2b0,0x2b8,0x2c0,0x2ce,0x2d6,0x2de,0x2e6,0x2ee,0x2f6,0x2fe,0x306,0x30e,0x316,0x31c,0x324, 0x32c,0x334,0x2c7,0x2cf,0x339,0x341,0x2c7,0x2cf,0x349,0x351,0x359,0x361,0x369,0x371,0x379,0x381, 0x389,0x391,0x399,0x3a1,0x3a9,0x3b1,0x3b9,0x3c1,0x2c7,0x2cf,0x2c7,0x2cf,0x3c8,0x3d0,0x3d8,0x3e0, 0x3e4,0x3ec,0x3f2,0x3fa,0x2c7,0x2cf,0x402,0x40a,0x40e,0x416,0x41e,0x426,0x2c7,0x2cf,0x424,0x42c, 0x431,0x438,0x43c,0x2c7,0x2c7,0x2c7,0x443,0x44b,0x2c7,0x453,0x45b,0x2c7,0x2c7,0x463,0x46b,0x2c7, 0x2c7,0x473,0x47b,0x2c7,0x2c7,0x483,0x48b,0x2c7,0x2c7,0x463,0x492,0x2c7,0x49a,0x4a0,0x4a8,0x2c7, -0x2c7,0x2c7,0x4af,0x2c7,0x2c7,0x4b5,0x4bd,0x2c7,0x2c7,0x4a0,0x4c4,0x2c7,0x2c7,0x2c7,0x4ca,0x2c7, -0x2c7,0x4d2,0x4d9,0x2c7,0x2c7,0x4dc,0x4e3,0x2c7,0x4e6,0x4ed,0x4f5,0x4fd,0x505,0x50d,0x514,0x2c7, -0x2c7,0x51b,0x2c7,0x2c7,0x522,0x2c7,0x2c7,0x2c7,0x929,0x2c7,0x2c7,0x931,0x2c7,0x937,0x93f,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x526,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x4af,0x2c7,0x2c7,0x4b5,0x4bd,0x2c7,0x2c7,0x4c3,0x4cb,0x2c7,0x2c7,0x2c7,0x4d1,0x2c7, +0x2c7,0x4d9,0x4e0,0x2c7,0x2c7,0x4e3,0x4ea,0x2c7,0x4ed,0x4f4,0x4fc,0x504,0x50c,0x514,0x51b,0x2c7, +0x2c7,0x522,0x2c7,0x2c7,0x529,0x2c7,0x2c7,0x2c7,0x93b,0x2c7,0x2c7,0x943,0x2c7,0x949,0x951,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x52d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x52e,0x52e,0x2c7,0x2c7,0x2c7,0x2c7,0x534,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x53c,0x2c7,0x2c7,0x2c7,0x53f,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x546,0x2c7,0x2c7,0x54e,0x2c7,0x556,0x2c7,0x2c7,0x55e,0x563,0x56b,0x571,0x2c7,0x577,0x2c7,0x57e, -0x2c7,0x583,0x2c7,0x2c7,0x2c7,0x2c7,0x589,0x591,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x599,0x59e, -0x5a6,0x5ae,0x5b6,0x5be,0x5c6,0x5ce,0x5d6,0x5de,0x5e6,0x5ee,0x5f6,0x5fe,0x606,0x60e,0x616,0x61e, -0x626,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x62a,0x632,0x2c7,0x639,0x2c7,0x2c7,0x63d,0x644,0x649,0x2c7, -0x651,0x659,0x661,0x669,0x671,0x679,0x2c7,0x681,0x2c7,0x687,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x535,0x535,0x2c7,0x2c7,0x2c7,0x2c7,0x53b,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x543,0x2c7,0x2c7,0x2c7,0x546,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x54d,0x2c7,0x2c7,0x555,0x2c7,0x55d,0x2c7,0x2c7,0x565,0x56a,0x572,0x578,0x2c7,0x57e,0x2c7,0x585, +0x2c7,0x58a,0x2c7,0x2c7,0x2c7,0x2c7,0x590,0x598,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x5a0,0x5a5, +0x5ad,0x5b5,0x5bd,0x5c5,0x5cd,0x5d5,0x5dd,0x5e5,0x5ed,0x5f5,0x5fd,0x605,0x60d,0x615,0x61d,0x625, +0x62d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x631,0x639,0x2c7,0x640,0x2c7,0x2c7,0x644,0x64b,0x650,0x2c7, +0x658,0x660,0x668,0x670,0x678,0x680,0x2c7,0x688,0x2c7,0x68e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x68a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x692,0x2c7,0x2c7,0x2c7,0x697,0x2c7,0x2c7,0x2c7,0x69f, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x691,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x699,0x2c7,0x2c7,0x2c7,0x69e,0x2c7,0x2c7,0x2c7,0x6a6, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x6a7,0x6ae,0x6b6,0x6be,0x6c6,0x6ce,0x6d6,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x6ae,0x6b5,0x6bd,0x6c5,0x6cd,0x6d5,0x6dd,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, @@ -102,32 +103,32 @@ static const uint16_t norm2_nfc_data_trieIndex[9652]={ 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x6de,0x6e6,0x2c7,0x2c7,0x6ee,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x6f5,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x6fc,0x704,0x2c7,0x70a,0x70e,0x2c7,0x2c7,0x584,0x716,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x71a,0x722,0x725,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x48b, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947, -0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x947,0x94e,0x2c7,0x2c7, -0x956,0x95d,0x2a8,0x964,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, +0x2c7,0x2c7,0x2c7,0x6e5,0x6ed,0x2c7,0x2c7,0x6f5,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x6fc,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x703,0x70b,0x2c7,0x711,0x715,0x2c7,0x2c7,0x58b,0x71d,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x721,0x729,0x72c,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x48b, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a, +0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c, +0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e, +0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959, +0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b, +0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d, +0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a, +0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c, +0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e, +0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959, +0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b, +0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d, +0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a, +0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c, +0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e, +0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959, +0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b, +0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d, +0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d, +0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x96d,0x959,0x95a,0x95b,0x95c,0x95d,0x95e,0x965,0x2c7,0x2c7, +0x975,0x97c,0x2a8,0x983,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, 0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8,0x2a8, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, @@ -143,489 +144,496 @@ static const uint16_t norm2_nfc_data_trieIndex[9652]={ 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x72d,0x735,0x73d,0x745,0x74d,0x755,0x75d,0x765, -0x76d,0x775,0x77d,0x785,0x78d,0x795,0x79d,0x2c7,0x7a4,0x7ac,0x7b4,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x734,0x73c,0x744,0x74c,0x754,0x75c,0x764,0x76c, +0x774,0x77c,0x784,0x78c,0x794,0x79c,0x7a4,0x2c7,0x7ab,0x7b3,0x7bb,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x7bc,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x7c3,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, 0xb20,0xb20,0xb38,0xb78,0xbb8,0xbf8,0xc38,0xc70,0xcb0,0xb1c,0xce4,0xb1c,0xd24,0xd64,0xda4,0xde4, 0xe24,0xe64,0xea4,0xee4,0xb1c,0xb1c,0xf20,0xf60,0xf90,0xfc8,0xb1c,0x1008,0x1038,0x1078,0xb1c,0x1090, -0x880,0x8b0,0x8ee,0x928,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x951,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x96d,0x188,0x188,0x9a3,0x188,0x9e3,0xa1d,0x188,0x188, +0x880,0x8b0,0x8ee,0x928,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x953,0x188,0x188, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x96f,0x188,0x188,0x9a5,0x188,0x9e5,0xa1f,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xa5d, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c0, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c8,0x2c7,0x2c7,0x2c7,0x7cb,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x7d2,0x7d6,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7de,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x6f5,0x697,0x7e0,0x7e8,0x2c7,0x2c7,0x7f0,0x7f7,0x2c7,0x584,0x2c7,0x2c7,0x7ff,0x2c7,0x2c7,0x802, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x808,0x2c7,0x463,0x80f,0x816,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x81e,0x2c7,0x2c7,0x822,0x82a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x82f,0x837,0x2c7,0x2c7,0x697, -0x2c7,0x2c7,0x2c7,0x83a,0x2c7,0x2c7,0x2c7,0x840,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x697,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x844,0x2c7,0x84a,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x850,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x858,0x860,0x868, -0x86e,0x876,0x2c7,0x2c7,0x2c7,0x87e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x886,0x88e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x892,0x2c7,0x2c7,0x2c7,0x899,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x8a1,0x8a9,0x8b1, -0x8b9,0x8c1,0x8c9,0x8d1,0x8d9,0x8e1,0x8e9,0x8f1,0x8f9,0x901,0x909,0x911,0x919,0x921,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, -0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2a7,0x2a7,0x2a7, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,2,4,6,0, -0,8,0x28,0x2e,0x38,0x44,0x66,0x68,0x76,0x84,0xa2,0xa4,0xae,0xba,0xc0,0xd2, -0xf2,0,0xf6,0x106,0x114,0x122,0x148,0x14c,0x158,0x15c,0x16e,0,0,0,0,0, -0,0x17a,0x19a,0x1a0,0x1aa,0x1b6,0x1d8,0x1da,0x1e8,0x1f8,0x214,0x218,0x222,0x22e,0x234,0x246, -0x266,0,0x26a,0x27a,0x288,0x298,0x2be,0x2c2,0x2d0,0x2d4,0x2e8,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x2f4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x941,0x944,0x56f,0x947,0x57a,0x57f,0x2fa,0x584, -0x94a,0x94d,0x589,0x950,0x953,0x956,0x959,0x594,0,0x95c,0x95f,0x962,0x599,0x5a4,0x5ad,0, -0x2fe,0x965,0x968,0x96b,0x5b2,0x96e,0,0,0x971,0x974,0x5bd,0x977,0x5c8,0x5cd,0x300,0x5d2, -0x97a,0x97d,0x5d7,0x980,0x983,0x986,0x989,0x5e2,0,0x98c,0x98f,0x992,0x5e7,0x5f2,0x5fb,0, -0x304,0x995,0x998,0x99b,0x600,0x99e,0,0x9a1,0x9a4,0x9a7,0x60b,0x616,0x9aa,0x9ad,0x9b0,0x9b3, -0x9b6,0x9b9,0x9bc,0x9bf,0x9c2,0x9c5,0x9c8,0x9cb,0,0,0x621,0x628,0x9ce,0x9d1,0x9d4,0x9d7, -0x9da,0x9dd,0x9e0,0x9e3,0x9e6,0x9e9,0x9ec,0x9ef,0x9f2,0x9f5,0x9f8,0x9fb,0x9fe,0xa01,0,0, -0xa04,0xa07,0xa0a,0xa0d,0xa10,0xa13,0xa16,0xa19,0xa1c,0,0,0,0xa1f,0xa22,0xa25,0xa28, -0,0xa2b,0xa2e,0xa31,0xa34,0xa37,0xa3a,0,0,0,0,0xa3d,0xa40,0xa43,0xa46,0xa49, -0xa4c,0,0,0,0x62f,0x636,0xa4f,0xa52,0xa55,0xa58,0,0,0xa5b,0xa5e,0xa61,0xa64, -0xa67,0xa6a,0x63d,0x642,0xa6d,0xa70,0xa73,0xa76,0x647,0x64c,0xa79,0xa7c,0xa7f,0xa82,0,0, -0x651,0x656,0x65b,0x660,0xa85,0xa88,0xa8b,0xa8e,0xa91,0xa94,0xa97,0xa9a,0xa9d,0xaa0,0xaa3,0xaa6, -0xaa9,0xaac,0xaaf,0xab2,0xab5,0xab8,0xabb,0x306,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x665,0x672,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x67f,0x68c,0,0,0,0,0,0,0x308, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xabe,0xac1,0xac4, -0xac7,0xaca,0xacd,0xad0,0xad3,0xad7,0xadc,0xae1,0xae6,0xaeb,0xaf0,0xaf5,0xafa,0,0xaff,0xb04, -0xb09,0xb0e,0xb12,0xb15,0,0,0xb18,0xb1b,0xb1e,0xb21,0x699,0x69e,0xb25,0xb2a,0xb2e,0xb31, -0xb34,0,0,0,0xb37,0xb3a,0,0,0xb3d,0xb40,0xb44,0xb49,0xb4d,0xb50,0xb53,0xb56, -0xb59,0xb5c,0xb5f,0xb62,0xb65,0xb68,0xb6b,0xb6e,0xb71,0xb74,0xb77,0xb7a,0xb7d,0xb80,0xb83,0xb86, -0xb89,0xb8c,0xb8f,0xb92,0xb95,0xb98,0xb9b,0xb9e,0xba1,0xba4,0xba7,0xbaa,0,0,0xbad,0xbb0, -0,0,0,0,0,0,0x6a3,0x6a8,0x6ad,0x6b2,0xbb4,0xbb9,0xbbe,0xbc3,0x6b7,0x6bc, -0xbc8,0xbcd,0xbd1,0xbd4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x30a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6,0xffe6,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6,0xfee6, -0xfee6,0xffe6,0xffe6,0xfee6,0xffe6,0xfee6,0xffe6,0xfee6,0xfee6,0xffe8,0xffdc,0xffdc,0xffdc,0xffdc,0xffe8,0xfed8, -0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffca,0xffca,0xfedc,0xfedc,0xfedc,0xfedc,0xfeca,0xfeca,0xffdc,0xffdc,0xffdc, -0xffdc,0xfedc,0xfedc,0xffdc,0xfedc,0xfedc,0xffdc,0xffdc,0xff01,0xff01,0xff01,0xff01,0xfe01,0xffdc,0xffdc,0xffdc, -0xffdc,0xffe6,0xffe6,0xffe6,0x14e8,0x14eb,0xfee6,0x14ee,0x14f1,0xfef0,0xffe6,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, -0xffe6,0xffdc,0xffdc,0,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe8,0xffdc,0xffdc,0xffe6, -0xffe9,0xffea,0xffea,0xffe9,0xffea,0xffea,0xffe9,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0x14f4,0,0,0,0,0,0,0, -0,0,0x14f6,0,0,0,0,0,0,0xbd7,0xbda,0x14f8,0xbdd,0xbe0,0xbe3,0, -0xbe6,0,0xbe9,0xbec,0xbf0,0x30c,0,0,0,0x31a,0,0x322,0,0x32c,0,0, -0,0,0,0x33a,0,0x342,0,0,0,0x344,0,0,0,0x350,0xbf4,0xbf7, -0x6c1,0xbfa,0x6c6,0xbfd,0xc01,0x35a,0,0,0,0x36a,0,0x372,0,0x37e,0,0, -0,0,0,0x38e,0,0x396,0,0,0,0x39a,0,0,0,0x3aa,0x6cb,0x6d4, -0xc05,0xc08,0x6dd,0,0,0,0x3b6,0xc0b,0xc0e,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xc11,0xc14,0,0xc17,0,0,0x3ba,0xc1a,0,0,0,0, -0xc1d,0xc20,0xc23,0,0x3bc,0,0,0x3c0,0,0x3c2,0x3c8,0x3cc,0x3ce,0xc26,0x3d6,0, -0,0,0x3d8,0,0,0,0,0x3da,0,0,0,0x3e2,0,0,0,0x3e4, -0,0x3e6,0,0,0x3e8,0,0,0x3ec,0,0x3ee,0x3f4,0x3f8,0x3fa,0xc29,0x402,0, -0,0,0x404,0,0,0,0,0x406,0,0,0,0x40e,0,0,0,0x410, -0,0x412,0,0,0xc2c,0xc2f,0,0xc32,0,0,0x414,0xc35,0,0,0,0, -0xc38,0xc3b,0xc3e,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x416,0x418,0xc41,0xc44,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xc47,0xc4a,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xc4d,0xc50,0xc53,0xc56,0,0,0xc59,0xc5c,0x41a,0x41c,0xc5f,0xc62, -0xc65,0xc68,0xc6b,0xc6e,0,0,0xc71,0xc74,0xc77,0xc7a,0xc7d,0xc80,0x41e,0x420,0xc83,0xc86, -0xc89,0xc8c,0xc8f,0xc92,0xc95,0xc98,0xc9b,0xc9e,0xca1,0xca4,0,0,0xca7,0xcaa,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffde,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffde,0xffe4,0xffe6, -0xff0a,0xff0b,0xff0c,0xff0d,0xff0e,0xff0f,0xff10,0xff11,0xff12,0xff13,0xff13,0xff14,0xff15,0xff16,0,0xff17, -0,0xff18,0xff19,0,0xffe6,0xffdc,0,0xff12,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xff1e,0xff1f,0xff20,0,0,0,0,0, -0,0,0xcad,0xcb0,0xcb3,0xcb6,0xcb9,0x422,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x428,0,0x42a,0xff1b,0xff1c,0xff1d,0xff1e,0xff1f,0xff20,0xff21,0xff22,0xfee6,0xfee6,0xfedc,0xffdc,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff23,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xcbc,0x42c,0xcbf,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x42e,0xcc2,0,0x430,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0,0,0xffe6, -0xffe6,0,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff24,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc, -0xffdc,0xffdc,0xffe6,0xffdc,0xffdc,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6,0xffdc,0xffe6,0xffdc,0xffe6, -0xffdc,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffdc,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffdc, -0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xff1b,0xff1c,0xff1d,0xffe6, -0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffdc,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0x432,0xcc5,0,0,0,0,0,0,0x434,0xcc8,0,0x436, -0xccb,0,0,0,0,0,0,0,0xfe07,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0xffe6,0xffdc,0xffe6, -0xffe6,0,0,0,0x14fa,0x14fd,0x1500,0x1503,0x1506,0x1509,0x150c,0x150f,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff07,0,0xfe00,0,0,0,0,0, -0,0,0,0x438,0,0,0,0xcce,0xcd1,0xff09,0,0,0,0,0,0, -0,0,0,0xfe00,0,0,0,0,0x1512,0x1515,0,0x1518,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x151b, -0,0,0x151e,0,0,0,0,0,0xff07,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0, -0,0,0,0,0,0x1521,0x1524,0x1527,0,0,0x152a,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff07,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x43c, -0xcd4,0,0,0xcd7,0xcda,0xff09,0,0,0,0,0,0,0,0,0xfe00,0xfe00, -0,0,0,0,0x152d,0x1530,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x442,0,0xcdd,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe00,0, -0,0,0,0,0,0,0x444,0x448,0,0,0xce0,0xce3,0xce6,0xff09,0,0, -0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, -0,0,0x44a,0,0xce9,0,0,0,0,0xff09,0,0,0,0,0,0, -0,0xff54,0xfe5b,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff07,0,0,0x44c,0xcec,0,0xfe00,0,0,0,0x44e,0xcef,0xcf2,0,0x6e2,0xcf6, -0,0xff09,0,0,0,0,0,0,0,0xfe00,0xfe00,0,0,0,0,0, -0,0,0,0,0,0,0x454,0x458,0,0,0xcfa,0xcfd,0xd00,0xff09,0,0, -0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, -0,0,0xfe09,0,0,0,0,0xfe00,0,0,0,0,0,0,0,0, -0,0x45a,0xd03,0,0x6e7,0xd07,0xd0b,0xfe00,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff67,0xff67,0xff09,0,0,0,0,0,0,0,0,0,0xff6b,0xff6b,0xff6b,0xff6b, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xff76,0xff76,0,0,0,0,0,0, -0,0,0,0,0xff7a,0xff7a,0xff7a,0xff7a,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffdc,0xffdc,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xffdc,0,0xffdc,0,0xffd8,0,0, -0,0,0,0,0,0,0,0x1533,0,0,0,0,0,0,0,0, -0,0x1536,0,0,0,0,0x1539,0,0,0,0,0x153c,0,0,0,0, -0x153f,0,0,0,0,0,0,0,0,0,0,0,0,0x1542,0,0, -0,0,0,0,0,0xff81,0xff82,0x1546,0xff84,0x154a,0x154d,0,0x1550,0,0xff82,0xff82, -0xff82,0xff82,0,0,0xff82,0x1554,0xffe6,0xffe6,0xff09,0,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0,0,0,0x1557,0,0,0,0,0,0,0,0, -0,0x155a,0,0,0,0,0x155d,0,0,0,0,0x1560,0,0,0,0, -0x1563,0,0,0,0,0,0,0,0,0,0,0,0,0x1566,0,0, -0,0,0,0,0,0,0xffdc,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x460,0xd0e,0,0,0,0,0,0,0,0xfe00,0,0,0,0,0, -0,0,0,0xff07,0,0xff09,0xff09,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffdc,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0xffe6,0,0, -0,0,0,0,0,0,0,0,0,0xffe4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffde,0xffe6,0xffdc,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6, -0xffdc,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0xffdc,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc, -0xffdc,0xffdc,0xffdc,0xffe6,0xffe6,0xffdc,0,0,0,0,0,0,0,0x462,0xd11,0x464, -0xd14,0x466,0xd17,0x468,0xd1a,0x46a,0xd1d,0,0,0x46c,0xd20,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff07,0xfe00,0,0,0,0,0x46e,0xd23,0x470,0xd26,0x472,0x474,0xd29,0xd2c,0x476,0xd2f, -0xff09,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xffe6, -0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xff09,0xff09,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff07,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0xff09,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xff07,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xffe6,0xffe6,0xffe6,0,0xff01,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, -0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0,0xff01,0xff01,0xff01,0xff01,0xff01,0xff01,0xff01,0,0,0, -0,0xffdc,0,0,0,0,0,0,0xffe6,0,0,0,0xffe6,0xffe6,0,0, -0,0,0,0,0xffe6,0xffe6,0xffdc,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffe6, -0xffe6,0xffea,0xffd6,0xffdc,0xffca,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0, -0,0,0,0xffe6,0xffe9,0xffdc,0xffe6,0xffdc,0xd32,0xd35,0xd38,0xd3b,0xd3e,0xd41,0xd44,0xd47, -0xd4b,0xd50,0xd54,0xd57,0xd5a,0xd5d,0xd60,0xd63,0xd66,0xd69,0xd6c,0xd6f,0xd73,0xd78,0xd7d,0xd82, -0xd86,0xd89,0xd8c,0xd8f,0xd93,0xd98,0xd9c,0xd9f,0xda2,0xda5,0xda8,0xdab,0xdae,0xdb1,0xdb4,0xdb7, -0xdba,0xdbd,0xdc0,0xdc3,0xdc6,0xdc9,0xdcd,0xdd2,0xdd6,0xdd9,0xddc,0xddf,0xde2,0xde5,0x6ec,0x6f1, -0xde9,0xdee,0xdf2,0xdf5,0xdf8,0xdfb,0xdfe,0xe01,0xe04,0xe07,0xe0a,0xe0d,0xe10,0xe13,0xe16,0xe19, -0xe1c,0xe1f,0xe22,0xe25,0xe29,0xe2e,0xe33,0xe38,0xe3d,0xe42,0xe47,0xe4c,0xe50,0xe53,0xe56,0xe59, -0xe5c,0xe5f,0x6f6,0x6fb,0xe63,0xe68,0xe6c,0xe6f,0xe72,0xe75,0x700,0x705,0xe79,0xe7e,0xe83,0xe88, -0xe8d,0xe92,0xe96,0xe99,0xe9c,0xe9f,0xea2,0xea5,0xea8,0xeab,0xeae,0xeb1,0xeb4,0xeb7,0xeba,0xebd, -0xec1,0xec6,0xecb,0xed0,0xed4,0xed7,0xeda,0xedd,0xee0,0xee3,0xee6,0xee9,0xeec,0xeef,0xef2,0xef5, -0xef8,0xefb,0xefe,0xf01,0xf04,0xf07,0xf0a,0xf0d,0xf10,0xf13,0xf16,0xf19,0xf1c,0xf1f,0xf22,0xf25, -0xf28,0xf2b,0,0xf2e,0,0,0,0,0x70a,0x711,0xf31,0xf34,0xf38,0xf3d,0xf42,0xf47, -0xf4c,0xf51,0xf56,0xf5b,0xf60,0xf65,0xf6a,0xf6f,0xf74,0xf79,0xf7e,0xf83,0xf88,0xf8d,0xf92,0xf97, -0x718,0x71d,0xf9b,0xf9e,0xfa1,0xfa4,0xfa8,0xfad,0xfb2,0xfb7,0xfbc,0xfc1,0xfc6,0xfcb,0xfd0,0xfd5, -0xfd9,0xfdc,0xfdf,0xfe2,0x722,0x727,0xfe5,0xfe8,0xfec,0xff1,0xff6,0xffb,0x1000,0x1005,0x100a,0x100f, -0x1014,0x1019,0x101e,0x1023,0x1028,0x102d,0x1032,0x1037,0x103c,0x1041,0x1046,0x104b,0x104f,0x1052,0x1055,0x1058, -0x105c,0x1061,0x1066,0x106b,0x1070,0x1075,0x107a,0x107f,0x1084,0x1089,0x108d,0x1090,0x1093,0x1096,0x1099,0x109c, -0x109f,0x10a2,0,0,0,0,0,0,0x72c,0x737,0x743,0x74a,0x751,0x758,0x75f,0x766, -0x76c,0x777,0x783,0x78a,0x791,0x798,0x79f,0x7a6,0x7ac,0x7b3,0x10a6,0x10ab,0x10b0,0x10b5,0,0, -0x7ba,0x7c1,0x10ba,0x10bf,0x10c4,0x10c9,0,0,0x7c8,0x7d3,0x7df,0x7e6,0x7ed,0x7f4,0x7fb,0x802, -0x808,0x813,0x81f,0x826,0x82d,0x834,0x83b,0x842,0x848,0x851,0x10ce,0x10d3,0x10d8,0x10dd,0x10e2,0x10e7, -0x85a,0x863,0x10ec,0x10f1,0x10f6,0x10fb,0x1100,0x1105,0x86c,0x873,0x110a,0x110f,0x1114,0x1119,0,0, -0x87a,0x881,0x111e,0x1123,0x1128,0x112d,0,0,0x888,0x891,0x1132,0x1137,0x113c,0x1141,0x1146,0x114b, -0,0x89a,0,0x1150,0,0x1155,0,0x115a,0x8a3,0x8ae,0x8ba,0x8c1,0x8c8,0x8cf,0x8d6,0x8dd, -0x8e3,0x8ee,0x8fa,0x901,0x908,0x90f,0x916,0x91d,0x923,0x156a,0x115e,0x156e,0x928,0x1572,0x1161,0x1576, -0x1164,0x157a,0x1167,0x157e,0x92d,0x1582,0,0,0x116b,0x1170,0x1177,0x117f,0x1187,0x118f,0x1197,0x119f, -0x11a5,0x11aa,0x11b1,0x11b9,0x11c1,0x11c9,0x11d1,0x11d9,0x11df,0x11e4,0x11eb,0x11f3,0x11fb,0x1203,0x120b,0x1213, -0x1219,0x121e,0x1225,0x122d,0x1235,0x123d,0x1245,0x124d,0x1253,0x1258,0x125f,0x1267,0x126f,0x1277,0x127f,0x1287, -0x128d,0x1292,0x1299,0x12a1,0x12a9,0x12b1,0x12b9,0x12c1,0x12c6,0x12c9,0x12cd,0x12d1,0x12d5,0,0x932,0x12da, -0x12de,0x12e1,0x12e4,0x1586,0x12e7,0,0x1589,0x478,0,0x12ea,0x12ee,0x12f2,0x12f6,0,0x937,0x12fb, -0x12ff,0x158c,0x1302,0x1590,0x1305,0x1308,0x130b,0x130e,0x1311,0x1314,0x1318,0x1595,0,0,0x131c,0x1320, -0x1324,0x1327,0x132a,0x159a,0,0x132d,0x1330,0x1333,0x1336,0x1339,0x133d,0x159f,0x1341,0x1344,0x1347,0x134b, -0x134f,0x1352,0x1355,0x15a4,0x1358,0x135b,0x15a8,0x15ab,0,0,0x135f,0x1363,0x1367,0,0x93c,0x136c, -0x1370,0x15ae,0x1373,0x15b2,0x1376,0x15b5,0x47e,0,0xfdc1,0xfdc1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xff01,0xff01,0xffe6,0xffe6,0xffe6,0xffe6, -0xff01,0xff01,0xff01,0xffe6,0xffe6,0,0,0,0,0xffe6,0,0,0,0xff01,0xff01,0xffe6, -0xffdc,0xffe6,0xff01,0xff01,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x15b7,0,0,0,0x15b9,0x15bc, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x484,0,0x486,0,0x488,0,0,0,0,0,0x1379,0x137c, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x137f,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x1382,0x1385,0x1388,0x48a,0,0x48c,0,0x48e,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x490,0x138b,0,0,0,0x492,0x138e,0,0x494, -0x1391,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x496,0x1394,0x498,0x1397,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x49a,0,0,0,0,0x139a,0,0x49c,0x139d,0x49e,0,0x13a0,0x4a0,0x13a3,0,0, -0,0x4a2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x13a6,0x4a4,0x13a9,0,0x4a6,0x4a8,0,0,0,0,0,0, -0,0x13ac,0x13af,0x13b2,0x13b5,0x13b8,0x4aa,0x4ac,0x13bb,0x13be,0x4ae,0x4b0,0x13c1,0x13c4,0x4b2,0x4b4, -0x4b6,0x4b8,0,0,0x13c7,0x13ca,0x4ba,0x4bc,0x13cd,0x13d0,0x4be,0x4c0,0x13d3,0x13d6,0,0, -0,0,0,0,0,0x4c2,0x4c4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x4c6,0,0,0,0,0,0x4c8,0x4ca,0,0x4cc, -0x13d9,0x13dc,0x13df,0x13e2,0,0,0x4ce,0x4d0,0x4d2,0x4d4,0,0,0,0,0,0, -0,0,0,0,0x13e5,0x13e8,0x13eb,0x13ee,0,0,0,0,0,0,0x13f1,0x13f4, -0x13f7,0x13fa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0x15bf,0x15c1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x15c3,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xff09,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0, -0,0,0,0,0,0,0xffda,0xffe4,0xffe8,0xffde,0xffe0,0xffe0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x4d6,0, -0,0,0,0x4d8,0x13fd,0x4da,0x1400,0x4dc,0x1403,0x4de,0x1406,0x4e0,0x1409,0x4e2,0x140c,0x4e4, -0x140f,0x4e6,0x1412,0x4e8,0x1415,0x4ea,0x1418,0x4ec,0x141b,0x4ee,0x141e,0,0x4f0,0x1421,0x4f2,0x1424, -0x4f4,0x1427,0,0,0,0,0,0x4f6,0x142a,0x142d,0x4fa,0x1430,0x1433,0x4fe,0x1436,0x1439, -0x502,0x143c,0x143f,0x506,0x1442,0x1445,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1448,0,0,0, -0,0xfe08,0xfe08,0,0,0x50a,0x144b,0,0,0,0,0,0,0,0x50c,0, -0,0,0,0x50e,0x144e,0x510,0x1451,0x512,0x1454,0x514,0x1457,0x516,0x145a,0x518,0x145d,0x51a, -0x1460,0x51c,0x1463,0x51e,0x1466,0x520,0x1469,0x522,0x146c,0x524,0x146f,0,0x526,0x1472,0x528,0x1475, -0x52a,0x1478,0,0,0,0,0,0x52c,0x147b,0x147e,0x530,0x1481,0x1484,0x534,0x1487,0x148a, -0x538,0x148d,0x1490,0x53c,0x1493,0x1496,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x540,0x542,0x544,0x546,0,0x1499,0,0,0x149c, -0x149f,0x14a2,0x14a5,0,0,0x548,0x14a8,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xffe6,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xffe6,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xff09,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xffdc,0xffdc,0xffdc,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0, -0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0,0xffe6,0xffe6,0xffdc,0,0,0xffe6, -0xffe6,0,0,0,0,0,0xffe6,0xffe6,0,0xffe6,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0,0, -0,0,0,0,0x15c6,0x15c8,0x15ca,0x15cc,0x15ce,0x15d0,0x15d2,0x15d4,0x15d4,0x15d6,0x15d8,0x15da, -0x15dc,0x15de,0x15e0,0x15e2,0x15e4,0x15e6,0x15e8,0x15ea,0x15ec,0x15ee,0x15f0,0x15f2,0x15f4,0x15f6,0x15f8,0x15fa, -0x15fc,0x15fe,0x1600,0x1602,0x1604,0x1606,0x1608,0x160a,0x160c,0x160e,0x1610,0x1612,0x1614,0x1616,0x1618,0x161a, -0x161c,0x161e,0x1620,0x1622,0x1624,0x1626,0x1628,0x162a,0x162c,0x162e,0x1630,0x1632,0x1634,0x1636,0x1638,0x163a, -0x163c,0x163e,0x1640,0x1642,0x1644,0x1646,0x1648,0x164a,0x164c,0x164e,0x1650,0x1652,0x1654,0x1656,0x1658,0x165a, -0x165c,0x165e,0x1660,0x1662,0x1664,0x1666,0x1668,0x166a,0x166c,0x166e,0x1670,0x1672,0x1674,0x1676,0x1678,0x167a, -0x15ec,0x167c,0x167e,0x1680,0x1682,0x1684,0x1686,0x1688,0x168a,0x168c,0x168e,0x1690,0x1692,0x1694,0x1696,0x1698, -0x169a,0x169c,0x169e,0x16a0,0x16a2,0x16a4,0x16a6,0x16a8,0x16aa,0x16ac,0x16ae,0x16b0,0x16b2,0x16b4,0x16b6,0x16b8, -0x16ba,0x16bc,0x16be,0x16c0,0x16c2,0x16c4,0x16c6,0x16c8,0x16ca,0x16cc,0x16ce,0x16d0,0x16d2,0x16d4,0x16d6,0x16d8, -0x16da,0x16dc,0x16de,0x16e0,0x16e2,0x16e4,0x16e6,0x16e8,0x16ea,0x16ec,0x16ee,0x16f0,0x16f2,0x16f4,0x16f6,0x16f8, -0x16fa,0x16fc,0x16fe,0x1700,0x1702,0x16a0,0x1704,0x1706,0x1708,0x170a,0x170c,0x170e,0x1710,0x1712,0x1680,0x1714, -0x1716,0x1718,0x171a,0x171c,0x171e,0x1720,0x1722,0x1724,0x1726,0x1728,0x172a,0x172c,0x172e,0x1730,0x1732,0x1734, -0x1736,0x1738,0x173a,0x15ec,0x173c,0x173e,0x1740,0x1742,0x1744,0x1746,0x1748,0x174a,0x174c,0x174e,0x1750,0x1752, -0x1754,0x1756,0x1758,0x175a,0x175c,0x175e,0x1760,0x1762,0x1764,0x1766,0x1768,0x176a,0x176c,0x176e,0x1770,0x1684, -0x1772,0x1774,0x1776,0x1778,0x177a,0x177c,0x177e,0x1780,0x1782,0x1784,0x1786,0x1788,0x178a,0x178c,0x178e,0x1790, -0x1792,0x1794,0x1796,0x1798,0x179a,0x179c,0x179e,0x17a0,0x17a2,0x17a4,0x17a6,0x17a8,0x17aa,0x17ac,0x17ae,0x17b0, -0x17b2,0x17b4,0x17b6,0x17b8,0x17ba,0x17bc,0x17be,0x17c0,0x17c2,0x17c4,0x17c6,0x17c8,0x17ca,0x17cc,0x17ce,0x17d0, -0x17d2,0x17d4,0,0,0x17d6,0,0x17d8,0,0,0x17da,0x17dc,0x17de,0x17e0,0x17e2,0x17e4,0x17e6, -0x17e8,0x17ea,0x17ec,0,0x17ee,0,0x17f0,0,0,0x17f2,0x17f4,0,0,0,0x17f6,0x17f8, -0x17fa,0x17fc,0x17fe,0x1800,0x1802,0x1804,0x1806,0x1808,0x180a,0x180c,0x180e,0x1810,0x1812,0x1814,0x1816,0x1818, -0x181a,0x181c,0x181e,0x1820,0x1822,0x1824,0x1826,0x1828,0x182a,0x182c,0x182e,0x1830,0x1832,0x1834,0x1836,0x1838, -0x183a,0x183c,0x183e,0x1840,0x1842,0x1844,0x1846,0x1848,0x184a,0x184c,0x184e,0x16ee,0x1850,0x1852,0x1854,0x1856, -0x1858,0x185a,0x185a,0x185c,0x185e,0x1860,0x1862,0x1864,0x1866,0x1868,0x186a,0x17f2,0x186c,0x186e,0x1870,0x1872, -0x1874,0x1877,0,0,0x1879,0x187b,0x187d,0x187f,0x1881,0x1883,0x1885,0x1887,0x180e,0x1889,0x188b,0x188d, -0x17d6,0x188f,0x1891,0x1893,0x1895,0x1897,0x1899,0x189b,0x189d,0x189f,0x18a1,0x18a3,0x18a5,0x1820,0x18a7,0x1822, -0x18a9,0x18ab,0x18ad,0x18af,0x18b1,0x17d8,0x1616,0x18b3,0x18b5,0x18b7,0x16a2,0x1750,0x18b9,0x18bb,0x1830,0x18bd, -0x1832,0x18bf,0x18c1,0x18c3,0x17dc,0x18c5,0x18c7,0x18c9,0x18cb,0x18cd,0x17de,0x18cf,0x18d1,0x18d3,0x18d5,0x18d7, -0x18d9,0x184e,0x18db,0x18dd,0x16ee,0x18df,0x1856,0x18e1,0x18e3,0x18e5,0x18e7,0x18e9,0x1860,0x18eb,0x17f0,0x18ed, -0x1862,0x167c,0x18ef,0x1864,0x18f1,0x1868,0x18f3,0x18f5,0x18f7,0x18f9,0x18fb,0x186c,0x17e8,0x18fd,0x186e,0x18ff, -0x1870,0x1901,0x15d4,0x1903,0x1906,0x1909,0x190c,0x190e,0x1910,0x1912,0x1915,0x1918,0x191b,0x191d,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x191f,0xff1a,0x1922, -0,0,0,0,0,0,0,0,0,0,0x1925,0x1928,0x192c,0x1931,0x1935,0x1938, -0x193b,0x193e,0x1941,0x1944,0x1947,0x194a,0x194d,0,0x1950,0x1953,0x1956,0x1959,0x195c,0,0x195f,0, -0x1962,0x1965,0,0x1968,0x196b,0,0x196e,0x1971,0x1974,0x1977,0x197a,0x197d,0x1980,0x1983,0x1986,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffe6,0xffe6, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xffdc,0,0, -0xffdc,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xffdc,0,0xffe6,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xffe6,0xff01,0xffdc,0,0,0,0,0xff09,0,0,0,0,0,0xffe6,0xffdc,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x54a,0x14ab,0x54d,0x14b0,0,0,0, -0,0,0,0,0,0x550,0,0,0,0,0,0x14b5,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xff09,0xfe07,0,0,0,0,0, -0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xfe00,0,0,0,0,0,0,0x14ba,0x14bf,0,0x553,0x556,0xff09, -0xff09,0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0, -0,0,0,0,0,0,0xff07,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0xff07,0, -0,0,0,0,0,0,0,0,0,0xff07,0xff09,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x559,0,0,0,0x14c4,0x14c9,0xff09,0,0,0,0,0,0, -0,0,0,0xfe00,0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0xff07,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xfe00,0,0,0,0,0,0,0, -0,0x55f,0xfe00,0x14ce,0x14d3,0xfe00,0x14d8,0,0,0,0xff09,0xff07,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xfe00,0,0,0,0, -0,0,0,0,0x568,0x56b,0x14dd,0x14e2,0,0,0,0xff09,0xff07,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff09,0xff07, -0,0,0,0,0,0,0,0,0,0,0,0xff09,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xff01,0xff01,0xff01,0xff01,0xff01,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff01,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1989,0x198e, -0x1998,0x19a4,0x19b0,0x19bc,0x19c8,0xffd8,0xffd8,0xff01,0xff01,0xff01,0,0,0,0xffe2,0xffd8,0xffd8, -0xffd8,0xffd8,0xffd8,0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc, -0xffdc,0xffdc,0xffdc,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffdc,0xffdc,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xffe6,0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x19cf,0x19d4,0x19de,0x19ea,0x19f6,0x1a02,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0, -0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6, -0xffe6,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0,0xffe6,0xffe6,0,0xffe6,0xffe6, -0xffe6,0xffe6,0xffe6,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0xffdc,0, -0,0,0,0,0,0,0,0,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xffe6,0xff07,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1a09,0x1a0b,0x1a0d,0x1a0f,0x1a12,0x1802,0x1a14,0x1a16,0x1a18,0x1a1a,0x1804,0x1a1c, -0x1a1e,0x1a20,0x1806,0x1a23,0x1a25,0x1a27,0x1a29,0x1a2c,0x1a2e,0x1a30,0x1a32,0x1a35,0x1a37,0x1a39,0x1a3b,0x187b, -0x1a3d,0x1a40,0x1a42,0x1a44,0x1a46,0x1a48,0x1a4a,0x1a4c,0x1a4e,0x1885,0x1808,0x180a,0x1887,0x1a50,0x1a52,0x1688, -0x1a54,0x180c,0x1a56,0x1a58,0x1a5a,0x1a5c,0x1a5c,0x1a5c,0x1a5e,0x1a61,0x1a63,0x1a65,0x1a67,0x1a6a,0x1a6c,0x1a6e, -0x1a70,0x1a72,0x1a74,0x1a76,0x1a78,0x1a7a,0x1a7c,0x1a7e,0x1a80,0x1a82,0x1a82,0x188b,0x1a84,0x1a86,0x1a88,0x1a8a, -0x1810,0x1a8c,0x1a8e,0x1a90,0x17ba,0x1a92,0x1a94,0x1a96,0x1a98,0x1a9a,0x1a9c,0x1a9e,0x1aa0,0x1aa2,0x1aa5,0x1aa7, -0x1aa9,0x1aab,0x1aad,0x1aaf,0x1ab1,0x1ab4,0x1ab7,0x1ab9,0x1abb,0x1abd,0x1abf,0x1ac1,0x1ac3,0x1ac5,0x1ac7,0x1ac7, -0x1ac9,0x1acc,0x1ace,0x1680,0x1ad0,0x1ad2,0x1ad5,0x1ad7,0x1ad9,0x1adb,0x1add,0x1adf,0x181a,0x1ae1,0x1ae3,0x1ae5, -0x1ae8,0x1aea,0x1aed,0x1aef,0x1af1,0x1af3,0x1af5,0x1af7,0x1af9,0x1afb,0x1afd,0x1aff,0x1b01,0x1b03,0x1b06,0x1b08, -0x1b0a,0x1b0c,0x1614,0x1b0e,0x1b11,0x1b13,0x1b13,0x1b16,0x1b18,0x1b18,0x1b1a,0x1b1c,0x1b1f,0x1b22,0x1b24,0x1b26, -0x1b28,0x1b2a,0x1b2c,0x1b2e,0x1b30,0x1b32,0x1b34,0x181c,0x1b36,0x1b39,0x1b3b,0x1b3d,0x18a3,0x1b3d,0x1b3f,0x1820, -0x1b41,0x1b43,0x1b45,0x1b47,0x1822,0x15de,0x1b49,0x1b4b,0x1b4d,0x1b4f,0x1b51,0x1b53,0x1b55,0x1b58,0x1b5a,0x1b5c, -0x1b5e,0x1b60,0x1b62,0x1b65,0x1b67,0x1b69,0x1b6b,0x1b6d,0x1b6f,0x1b71,0x1b73,0x1b75,0x1824,0x1b77,0x1b79,0x1b7c, -0x1b7e,0x1b80,0x1b82,0x1828,0x1b84,0x1b86,0x1b88,0x1b8a,0x1b8c,0x1b8e,0x1b90,0x1b92,0x1616,0x18b3,0x1b94,0x1b96, -0x1b98,0x1b9a,0x1b9d,0x1b9f,0x1ba1,0x1ba3,0x182a,0x1ba5,0x1ba8,0x1baa,0x1bac,0x190c,0x1bae,0x1bb0,0x1bb2,0x1bb4, -0x1bb6,0x1bb9,0x1bbb,0x1bbd,0x1bbf,0x1bc2,0x1bc4,0x1bc6,0x1bc8,0x16a2,0x1bca,0x1bcc,0x1bcf,0x1bd2,0x1bd5,0x1bd7, -0x1bda,0x1bdc,0x1bde,0x1be0,0x1be2,0x182c,0x1750,0x1be4,0x1be6,0x1be8,0x1bea,0x1bed,0x1bef,0x1bf1,0x1bf3,0x18bb, -0x1bf5,0x1bf7,0x1bfa,0x1bfc,0x1bfe,0x1c01,0x1c04,0x1c06,0x18bd,0x1c08,0x1c0a,0x1c0c,0x1c0e,0x1c10,0x1c12,0x1c14, -0x1c17,0x1c19,0x1c1c,0x1c1e,0x1c21,0x18c1,0x1c23,0x1c25,0x1c28,0x1c2a,0x1c2c,0x1c2f,0x1c32,0x1c34,0x1c36,0x1c38, -0x1c3a,0x1c3a,0x1c3c,0x1c3e,0x18c5,0x1c40,0x1c42,0x1c44,0x1c46,0x1c48,0x1c4b,0x1c4d,0x1686,0x1c50,0x1c53,0x1c55, -0x1c58,0x1c5b,0x1c5e,0x1c60,0x18d1,0x1c62,0x1c65,0x1c68,0x1c6b,0x1c6e,0x1c70,0x1c70,0x18d3,0x1910,0x1c72,0x1c74, -0x1c76,0x1c78,0x1c7b,0x163a,0x18d7,0x1c7d,0x1c7f,0x1842,0x1c82,0x1c85,0x17e6,0x1c88,0x1c8a,0x184a,0x1c8c,0x1c8e, -0x1c90,0x1c93,0x1c93,0x1c96,0x1c98,0x1c9a,0x1c9d,0x1c9f,0x1ca1,0x1ca3,0x1ca6,0x1ca8,0x1caa,0x1cac,0x1cae,0x1cb0, -0x1cb3,0x1cb5,0x1cb7,0x1cb9,0x1cbb,0x1cbd,0x1cbf,0x1cc2,0x1cc5,0x1cc7,0x1cca,0x1ccc,0x1ccf,0x1cd1,0x1856,0x1cd3, -0x1cd6,0x1cd9,0x1cdb,0x1cde,0x1ce0,0x1ce3,0x1ce5,0x1ce7,0x1ce9,0x1ceb,0x1ced,0x1cef,0x1cf2,0x1cf5,0x1cf8,0x1b16, -0x1cfb,0x1cfd,0x1cff,0x1d01,0x1d03,0x1d05,0x1d07,0x1d09,0x1d0b,0x1d0d,0x1d0f,0x1d11,0x16aa,0x1d14,0x1d16,0x1d18, -0x1d1a,0x1d1c,0x1d1e,0x185c,0x1d20,0x1d22,0x1d24,0x1d26,0x1d28,0x1d2b,0x1d2e,0x1d31,0x1d33,0x1d35,0x1d37,0x1d39, -0x1d3c,0x1d3e,0x1d41,0x1d43,0x1d45,0x1d48,0x1d4b,0x1d4d,0x1630,0x1d4f,0x1d51,0x1d53,0x1d55,0x1d57,0x1d59,0x18e5, -0x1d5b,0x1d5d,0x1d5f,0x1d61,0x1d63,0x1d65,0x1d67,0x1d69,0x1d6b,0x1d6d,0x1d70,0x1d72,0x1d74,0x1d76,0x1d78,0x1d7a, -0x1d7d,0x1d80,0x1d82,0x1d84,0x18ef,0x18f1,0x1d86,0x1d88,0x1d8b,0x1d8d,0x1d8f,0x1d91,0x1d93,0x1d96,0x1d99,0x1d9b, -0x1d9d,0x1d9f,0x1da2,0x18f3,0x1da4,0x1da7,0x1daa,0x1dac,0x1dae,0x1db0,0x1db3,0x1db5,0x1db7,0x1db9,0x1dbb,0x1dbd, -0x1dbf,0x1dc1,0x1dc4,0x1dc6,0x1dc8,0x1dca,0x1dcd,0x1dcf,0x1dd1,0x1dd3,0x1dd5,0x1dd8,0x1ddb,0x1ddd,0x1ddf,0x1de1, -0x1de4,0x1de6,0x18ff,0x18ff,0x1de9,0x1deb,0x1dee,0x1df0,0x1df2,0x1df4,0x1df6,0x1df8,0x1dfa,0x1dfc,0x1901,0x1dff, -0x1e01,0x1e03,0x1e05,0x1e07,0x1e09,0x1e0c,0x1e0e,0x1e11,0x1e14,0x1e17,0x1e19,0x1e1b,0x1e1d,0x1e1f,0x1e21,0x1e23, -0x1e25,0x1e27,0,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, -0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0,0,0,0,0,0, -0,0,0,0,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00, -0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0xff00,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x56e,0x56e,0x56e,0x56e, -0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e, -0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0x56e,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1e29,0,0x1e29,0,0x1e29,0x1e29,0,0x1e29, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x1e29,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x1e29,0,0,0,0,0x1e29,0,0,0,0x1e29,0,0x1e29,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1e27,0, -0,0,0,0 +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xa5f, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7cf,0x2c7,0x2c7,0x2c7,0x7d2,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x7d9,0x7dd,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x7e5,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x6fc,0x69e,0x7e7,0x7ef,0x2c7,0x2c7,0x7f7,0x7fe,0x2c7,0x58b,0x2c7,0x2c7,0x806,0x2c7,0x2c7,0x809, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x80f,0x2c7,0x463,0x816,0x81d,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x825,0x2c7,0x2c7,0x829,0x831,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x836,0x83e,0x2c7,0x2c7,0x69e, +0x2c7,0x2c7,0x2c7,0x841,0x2c7,0x2c7,0x2c7,0x847,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x535,0x848,0x2c7,0x84a,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x69e,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x852,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x856,0x2c7,0x85c,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x862,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x86a, +0x872,0x87a,0x880,0x888,0x2c7,0x2c7,0x2c7,0x890,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x898,0x8a0,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x8a4,0x2c7,0x2c7,0x2c7,0x8ab,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x8b3, +0x8bb,0x8c3,0x8cb,0x8d3,0x8db,0x8e3,0x8eb,0x8f3,0x8fb,0x903,0x90b,0x913,0x91b,0x923,0x92b,0x933, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7, +0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2c7,0x2a7, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,4,8,0xc,1, +1,0x10,0x50,0x5c,0x70,0x88,0xcc,0xd0,0xec,0x108,0x144,0x148,0x15c,0x174,0x180,0x1a4, +0x1e4,1,0x1ec,0x20c,0x228,0x244,0x290,0x298,0x2b0,0x2b8,0x2dc,1,1,1,1,1, +1,0x2f4,0x334,0x340,0x354,0x36c,0x3b0,0x3b4,0x3d0,0x3f0,0x428,0x430,0x444,0x45c,0x468,0x48c, +0x4cc,1,0x4d4,0x4f4,0x510,0x530,0x57c,0x584,0x5a0,0x5a8,0x5d0,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x5e8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x1284,0x128a,0xade,0x1290,0xaf4,0xafe,0x5f4,0xb08, +0x1296,0x129c,0xb12,0x12a2,0x12a8,0x12ae,0x12b4,0xb28,1,0x12ba,0x12c0,0x12c6,0xb32,0xb48,0xb5a,1, +0x5fc,0x12cc,0x12d2,0x12d8,0xb64,0x12de,1,1,0x12e4,0x12ea,0xb7a,0x12f0,0xb90,0xb9a,0x600,0xba4, +0x12f6,0x12fc,0xbae,0x1302,0x1308,0x130e,0x1314,0xbc4,1,0x131a,0x1320,0x1326,0xbce,0xbe4,0xbf6,1, +0x608,0x132c,0x1332,0x1338,0xc00,0x133e,1,0x1344,0x134a,0x1350,0xc16,0xc2c,0x1357,0x135d,0x1362,0x1368, +0x136e,0x1374,0x137a,0x1380,0x1386,0x138c,0x1392,0x1398,1,1,0xc42,0xc50,0x139e,0x13a4,0x13aa,0x13b0, +0x13b7,0x13bd,0x13c2,0x13c8,0x13ce,0x13d4,0x13da,0x13e0,0x13e6,0x13ec,0x13f3,0x13f9,0x13fe,0x1404,1,1, +0x140a,0x1410,0x1416,0x141c,0x1422,0x1428,0x142f,0x1435,0x143a,1,1,1,0x1441,0x1447,0x144d,0x1453, +1,0x1458,0x145e,0x1465,0x146b,0x1470,0x1476,1,1,1,1,0x147c,0x1482,0x1489,0x148f,0x1494, +0x149a,1,1,1,0xc5e,0xc6c,0x14a0,0x14a6,0x14ac,0x14b2,1,1,0x14b8,0x14be,0x14c5,0x14cb, +0x14d0,0x14d6,0xc7a,0xc84,0x14dc,0x14e2,0x14e9,0x14ef,0xc8e,0xc98,0x14f5,0x14fb,0x1500,0x1506,1,1, +0xca2,0xcac,0xcb6,0xcc0,0x150c,0x1512,0x1518,0x151e,0x1524,0x152a,0x1531,0x1537,0x153c,0x1542,0x1548,0x154e, +0x1554,0x155a,0x1560,0x1566,0x156c,0x1572,0x1578,0x60c,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xcca,0xce4,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xcfe,0xd18,1,1,1,1,1,1,0x610, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x157e,0x1584,0x158a, +0x1590,0x1596,0x159c,0x15a2,0x15a8,0x15b0,0x15ba,0x15c4,0x15ce,0x15d8,0x15e2,0x15ec,0x15f6,1,0x1600,0x160a, +0x1614,0x161e,0x1627,0x162d,1,1,0x1632,0x1638,0x163e,0x1644,0xd32,0xd3c,0x164d,0x1657,0x165f,0x1665, +0x166b,1,1,1,0x1670,0x1676,1,1,0x167c,0x1682,0x168a,0x1694,0x169d,0x16a3,0x16a9,0x16af, +0x16b4,0x16ba,0x16c0,0x16c6,0x16cc,0x16d2,0x16d8,0x16de,0x16e4,0x16ea,0x16f0,0x16f6,0x16fc,0x1702,0x1708,0x170e, +0x1714,0x171a,0x1720,0x1726,0x172c,0x1732,0x1738,0x173e,0x1744,0x174a,0x1750,0x1756,1,1,0x175c,0x1762, +1,1,1,1,1,1,0xd46,0xd50,0xd5a,0xd64,0x176a,0x1774,0x177e,0x1788,0xd6e,0xd78, +0x1792,0x179c,0x17a4,0x17aa,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x614,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xffcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc,0xfdcc, +0xfdcc,0xffcc,0xffcc,0xfdcc,0xffcc,0xfdcc,0xffcc,0xfdcc,0xfdcc,0xffd0,0xffb8,0xffb8,0xffb8,0xffb8,0xffd0,0xfdb0, +0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xff94,0xff94,0xfdb8,0xfdb8,0xfdb8,0xfdb8,0xfd94,0xfd94,0xffb8,0xffb8,0xffb8, +0xffb8,0xfdb8,0xfdb8,0xffb8,0xfdb8,0xfdb8,0xffb8,0xffb8,0xfe02,0xfe02,0xfe02,0xfe02,0xfc02,0xffb8,0xffb8,0xffb8, +0xffb8,0xffcc,0xffcc,0xffcc,0x3c26,0x3c2c,0xfdcc,0x3c32,0x3c38,0xfde0,0xffcc,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc, +0xffcc,0xffb8,0xffb8,1,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffd0,0xffb8,0xffb8,0xffcc, +0xffd2,0xffd4,0xffd4,0xffd2,0xffd4,0xffd4,0xffd2,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,0x29d1,1,1,1,1,1,1,1, +1,1,0x29d5,1,1,1,1,1,1,0x17b1,0x17b7,0x29d9,0x17bd,0x17c3,0x17c9,1, +0x17cf,1,0x17d5,0x17db,0x17e3,0x618,1,1,1,0x634,1,0x644,1,0x658,1,1, +1,1,1,0x674,1,0x684,1,1,1,0x688,1,1,1,0x6a0,0x17eb,0x17f1, +0xd82,0x17f7,0xd8c,0x17fd,0x1805,0x6b4,1,1,1,0x6d4,1,0x6e4,1,0x6fc,1,1, +1,1,1,0x71c,1,0x72c,1,1,1,0x734,1,1,1,0x754,0xd96,0xda8, +0x180d,0x1813,0xdba,1,1,1,0x76c,0x1819,0x181f,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x1825,0x182b,1,0x1831,1,1,0x774,0x1837,1,1,1,1, +0x183d,0x1843,0x1849,1,0x778,1,1,0x780,1,0x784,0x790,0x798,0x79c,0x184f,0x7ac,1, +1,1,0x7b0,1,1,1,1,0x7b4,1,1,1,0x7c4,1,1,1,0x7c8, +1,0x7cc,1,1,0x7d0,1,1,0x7d8,1,0x7dc,0x7e8,0x7f0,0x7f4,0x1855,0x804,1, +1,1,0x808,1,1,1,1,0x80c,1,1,1,0x81c,1,1,1,0x820, +1,0x824,1,1,0x185b,0x1861,1,0x1867,1,1,0x828,0x186d,1,1,1,1, +0x1873,0x1879,0x187f,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x82c,0x830,0x1885,0x188b,1,1,1,1, +1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0x1891,0x1897,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x189d,0x18a3,0x18a9,0x18af,1,1,0x18b5,0x18bb,0x834,0x838,0x18c1,0x18c7, +0x18cd,0x18d3,0x18d9,0x18df,1,1,0x18e5,0x18eb,0x18f1,0x18f7,0x18fd,0x1903,0x83c,0x840,0x1909,0x190f, +0x1915,0x191b,0x1921,0x1927,0x192d,0x1933,0x1939,0x193f,0x1945,0x194b,1,1,0x1951,0x1957,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffbc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffbc,0xffc8,0xffcc, +0xfe14,0xfe16,0xfe18,0xfe1a,0xfe1c,0xfe1e,0xfe20,0xfe22,0xfe24,0xfe26,0xfe26,0xfe28,0xfe2a,0xfe2c,1,0xfe2e, +1,0xfe30,0xfe32,1,0xffcc,0xffb8,1,0xfe24,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe3c,0xfe3e,0xfe40,1,1,1,1,1, +1,1,0x195c,0x1962,0x1969,0x196f,0x1975,0x844,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x850,1,0x854,0xfe36,0xfe38,0xfe3a,0xfe3c,0xfe3e,0xfe40,0xfe42,0xfe44,0xfdcc,0xfdcc,0xfdb8,0xffb8,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe46,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x197b,0x858,0x1981,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x85c,0x1987,1,0x860,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,1,1,0xffcc, +0xffcc,1,0xffb8,0xffcc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe48,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8, +0xffb8,0xffb8,0xffcc,0xffb8,0xffb8,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffb8,0xffcc,0xffb8,0xffcc, +0xffb8,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,0xffb8,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffb8, +0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xfe36,0xfe38,0xfe3a,0xffcc, +0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1, +1,1,1,1,0x864,0x198d,1,1,1,1,1,1,0x868,0x1993,1,0x86c, +0x1999,1,1,1,1,1,1,1,0xfc0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,0xffcc,0xffb8,0xffcc, +0xffcc,1,1,1,0x29dc,0x29e2,0x29e8,0x29ee,0x29f4,0x29fa,0x2a00,0x2a06,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe0e,1,0xfc00,1,1,1,1,1, +1,1,1,0x870,1,1,1,0x199f,0x19a5,0xfe12,1,1,1,1,1,1, +1,1,1,0xfc00,1,1,1,1,0x2a0c,0x2a12,1,0x2a18,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x2a1e, +1,1,0x2a24,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1, +1,1,1,1,1,0x2a2a,0x2a30,0x2a36,1,1,0x2a3c,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x878, +0x19ab,1,1,0x19b1,0x19b7,0xfe12,1,1,1,1,1,1,1,1,0xfc00,0xfc00, +1,1,1,1,0x2a42,0x2a48,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x884,1,0x19bd,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfc00,1, +1,1,1,1,1,1,0x888,0x890,1,1,0x19c3,0x19c9,0x19cf,0xfe12,1,1, +1,1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1, +1,1,0x894,1,0x19d5,1,1,1,1,0xfe12,1,1,1,1,1,1, +1,0xfea8,0xfcb6,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xfe0e,1,1,0x898,0x19db,1,0xfc00,1,1,1,0x89c,0x19e1,0x19e7,1,0xdc4,0x19ef, +1,0xfe12,1,1,1,1,1,1,1,0xfc00,0xfc00,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,0xfe12,1,0xfc00,1,1,1,1,1, +1,1,0x8a8,0x8b0,1,1,0x19f7,0x19fd,0x1a03,0xfe12,1,1,1,1,1,1, +1,1,1,0xfc00,1,1,1,1,1,1,1,1,1,1,0xfc12,1, +1,1,1,0xfc00,1,1,1,1,1,1,1,1,1,0x8b4,0x1a09,1, +0xdce,0x1a11,0x1a19,0xfc00,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xfece,0xfece,0xfe12,1, +1,1,1,1,1,1,1,1,0xfed6,0xfed6,0xfed6,0xfed6,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfeec,0xfeec,1,1,1,1,1,1,1,1,1,1, +0xfef4,0xfef4,0xfef4,0xfef4,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffb8,0xffb8,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xffb8,1,0xffb8,1,0xffb0,1,1,1,1,1,1, +1,1,1,0x2a4f,1,1,1,1,1,1,1,1,1,0x2a55,1,1, +1,1,0x2a5b,1,1,1,1,0x2a61,1,1,1,1,0x2a67,1,1,1, +1,1,1,1,1,1,1,1,1,0x2a6d,1,1,1,1,1,1, +1,0xff02,0xff04,0x3c40,0xff08,0x3c48,0x2a72,1,0x2a78,1,0xff04,0xff04,0xff04,0xff04,1,1, +0xff04,0x3c50,0xffcc,0xffcc,0xfe12,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1, +1,1,1,0x2a7f,1,1,1,1,1,1,1,1,1,0x2a85,1,1, +1,1,0x2a8b,1,1,1,1,0x2a91,1,1,1,1,0x2a97,1,1,1, +1,1,1,1,1,1,1,1,1,0x2a9d,1,1,1,1,1,1, +1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x8c0,0x1a1f,1, +1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1,0xfe0e, +1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe12,1, +1,1,1,1,1,1,1,1,1,0xffcc,1,1,1,1,1,1, +1,1,1,1,1,0xffc8,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffbc,0xffcc,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,1,1,1, +1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,1,1,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc, +0xffcc,0xffb8,1,1,1,1,1,1,1,0x8c4,0x1a25,0x8c8,0x1a2b,0x8cc,0x1a31,0x8d0, +0x1a37,0x8d4,0x1a3d,1,1,0x8d8,0x1a43,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xfe0e,0xfc00,1,1, +1,1,0x8dc,0x1a49,0x8e0,0x1a4f,0x8e4,0x8e8,0x1a55,0x1a5b,0x8ec,0x1a61,0xfe12,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xfe0e,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe0e, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,1,0xfe02,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8, +0xffcc,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1,1,0xffb8,1,1, +1,1,1,1,0xffcc,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1, +0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffb8,0xffcc,0xffcc,0xffd4,0xffac,0xffb8, +0xff94,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffd0,0xffc8,0xffc8,0xffb8,1,0xffcc, +0xffd2,0xffb8,0xffcc,0xffb8,0x1a66,0x1a6c,0x1a72,0x1a78,0x1a7f,0x1a85,0x1a8b,0x1a91,0x1a99,0x1aa3,0x1aaa,0x1ab0, +0x1ab6,0x1abc,0x1ac2,0x1ac8,0x1acf,0x1ad5,0x1ada,0x1ae0,0x1ae8,0x1af2,0x1afc,0x1b06,0x1b0e,0x1b14,0x1b1a,0x1b20, +0x1b29,0x1b33,0x1b3b,0x1b41,0x1b46,0x1b4c,0x1b52,0x1b58,0x1b5e,0x1b64,0x1b6a,0x1b70,0x1b77,0x1b7d,0x1b82,0x1b88, +0x1b8e,0x1b94,0x1b9c,0x1ba6,0x1bae,0x1bb4,0x1bba,0x1bc0,0x1bc6,0x1bcc,0xdd8,0xde2,0x1bd4,0x1bde,0x1be6,0x1bec, +0x1bf2,0x1bf8,0x1bfe,0x1c04,0x1c0a,0x1c10,0x1c17,0x1c1d,0x1c22,0x1c28,0x1c2e,0x1c34,0x1c3a,0x1c40,0x1c46,0x1c4c, +0x1c54,0x1c5e,0x1c68,0x1c72,0x1c7c,0x1c86,0x1c90,0x1c9a,0x1ca3,0x1ca9,0x1caf,0x1cb5,0x1cba,0x1cc0,0xdec,0xdf6, +0x1cc8,0x1cd2,0x1cda,0x1ce0,0x1ce6,0x1cec,0xe00,0xe0a,0x1cf4,0x1cfe,0x1d08,0x1d12,0x1d1c,0x1d26,0x1d2e,0x1d34, +0x1d3a,0x1d40,0x1d46,0x1d4c,0x1d52,0x1d58,0x1d5e,0x1d64,0x1d6a,0x1d70,0x1d76,0x1d7c,0x1d84,0x1d8e,0x1d98,0x1da2, +0x1daa,0x1db0,0x1db7,0x1dbd,0x1dc2,0x1dc8,0x1dce,0x1dd4,0x1dda,0x1de0,0x1de6,0x1dec,0x1df3,0x1df9,0x1dff,0x1e05, +0x1e0b,0x1e11,0x1e16,0x1e1c,0x1e22,0x1e28,0x1e2f,0x1e35,0x1e3b,0x1e41,0x1e46,0x1e4c,0x1e52,0x1e58,1,0x1e5f, +1,1,1,1,0xe14,0xe22,0x1e64,0x1e6a,0x1e72,0x1e7c,0x1e86,0x1e90,0x1e9a,0x1ea4,0x1eae,0x1eb8, +0x1ec2,0x1ecc,0x1ed6,0x1ee0,0x1eea,0x1ef4,0x1efe,0x1f08,0x1f12,0x1f1c,0x1f26,0x1f30,0xe30,0xe3a,0x1f38,0x1f3e, +0x1f44,0x1f4a,0x1f52,0x1f5c,0x1f66,0x1f70,0x1f7a,0x1f84,0x1f8e,0x1f98,0x1fa2,0x1fac,0x1fb4,0x1fba,0x1fc0,0x1fc6, +0xe44,0xe4e,0x1fcc,0x1fd2,0x1fda,0x1fe4,0x1fee,0x1ff8,0x2002,0x200c,0x2016,0x2020,0x202a,0x2034,0x203e,0x2048, +0x2052,0x205c,0x2066,0x2070,0x207a,0x2084,0x208e,0x2098,0x20a0,0x20a6,0x20ac,0x20b2,0x20ba,0x20c4,0x20ce,0x20d8, +0x20e2,0x20ec,0x20f6,0x2100,0x210a,0x2114,0x211c,0x2122,0x2129,0x212f,0x2134,0x213a,0x2140,0x2146,1,1, +1,1,1,1,0xe58,0xe6e,0xe86,0xe94,0xea2,0xeb0,0xebe,0xecc,0xed8,0xeee,0xf06,0xf14, +0xf22,0xf30,0xf3e,0xf4c,0xf58,0xf66,0x214f,0x2159,0x2163,0x216d,1,1,0xf74,0xf82,0x2177,0x2181, +0x218b,0x2195,1,1,0xf90,0xfa6,0xfbe,0xfcc,0xfda,0xfe8,0xff6,0x1004,0x1010,0x1026,0x103e,0x104c, +0x105a,0x1068,0x1076,0x1084,0x1090,0x10a2,0x219f,0x21a9,0x21b3,0x21bd,0x21c7,0x21d1,0x10b4,0x10c6,0x21db,0x21e5, +0x21ef,0x21f9,0x2203,0x220d,0x10d8,0x10e6,0x2217,0x2221,0x222b,0x2235,1,1,0x10f4,0x1102,0x223f,0x2249, +0x2253,0x225d,1,1,0x1110,0x1122,0x2267,0x2271,0x227b,0x2285,0x228f,0x2299,1,0x1134,1,0x22a3, +1,0x22ad,1,0x22b7,0x1146,0x115c,0x1174,0x1182,0x1190,0x119e,0x11ac,0x11ba,0x11c6,0x11dc,0x11f4,0x1202, +0x1210,0x121e,0x122c,0x123a,0x1246,0x3b8e,0x22bf,0x3b96,0x1250,0x3b9e,0x22c5,0x3ba6,0x22cb,0x3bae,0x22d1,0x3bb6, +0x125a,0x3bbe,1,1,0x22d8,0x22e2,0x22f1,0x2301,0x2311,0x2321,0x2331,0x2341,0x234c,0x2356,0x2365,0x2375, +0x2385,0x2395,0x23a5,0x23b5,0x23c0,0x23ca,0x23d9,0x23e9,0x23f9,0x2409,0x2419,0x2429,0x2434,0x243e,0x244d,0x245d, +0x246d,0x247d,0x248d,0x249d,0x24a8,0x24b2,0x24c1,0x24d1,0x24e1,0x24f1,0x2501,0x2511,0x251c,0x2526,0x2535,0x2545, +0x2555,0x2565,0x2575,0x2585,0x258f,0x2595,0x259d,0x25a4,0x25ad,1,0x1264,0x25b7,0x25bf,0x25c5,0x25cb,0x3bc6, +0x25d0,1,0x2aa2,0x8f0,1,0x25d7,0x25df,0x25e6,0x25ef,1,0x126e,0x25f9,0x2601,0x3bce,0x2607,0x3bd6, +0x260c,0x2613,0x2619,0x261f,0x2625,0x262b,0x2633,0x3be0,1,1,0x263b,0x2643,0x264b,0x2651,0x2657,0x3bea, +1,0x265d,0x2663,0x2669,0x266f,0x2675,0x267d,0x3bf4,0x2685,0x268b,0x2691,0x2699,0x26a1,0x26a7,0x26ad,0x3bfe, +0x26b3,0x26b9,0x3c06,0x2aa7,1,1,0x26c1,0x26c8,0x26d1,1,0x1278,0x26db,0x26e3,0x3c0e,0x26e9,0x3c16, +0x26ee,0x2aab,0x8fc,1,0xfa09,0xfa09,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,0xfe02,0xfe02,0xffcc,0xffcc,0xffcc,0xffcc,0xfe02,0xfe02,0xfe02,0xffcc, +0xffcc,1,1,1,1,0xffcc,1,1,1,0xfe02,0xfe02,0xffcc,0xffb8,0xffcc,0xfe02,0xfe02, +0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x2aae,1,1,1,0x2ab2,0x3c1e,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x908,1,0x90c,1,0x910,1,1,1,1,1,0x26f5,0x26fb,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x2701,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x2707,0x270d,0x2713, +0x914,1,0x918,1,0x91c,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0x920,0x2719,1,1,1,0x924,0x271f,1,0x928,0x2725,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0x92c,0x272b,0x930,0x2731,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x934,1,1,1, +1,0x2737,1,0x938,0x273d,0x93c,1,0x2743,0x940,0x2749,1,1,1,0x944,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x274f,0x948,0x2755,1,0x94c,0x950,1,1,1,1,1,1,1,0x275b,0x2761,0x2767, +0x276d,0x2773,0x954,0x958,0x2779,0x277f,0x95c,0x960,0x2785,0x278b,0x964,0x968,0x96c,0x970,1,1, +0x2791,0x2797,0x974,0x978,0x279d,0x27a3,0x97c,0x980,0x27a9,0x27af,1,1,1,1,1,1, +1,0x984,0x988,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0x98c,1,1,1,1,1,0x990,0x994,1,0x998,0x27b5,0x27bb,0x27c1,0x27c7, +1,1,0x99c,0x9a0,0x9a4,0x9a8,1,1,1,1,1,1,1,1,1,1, +0x27cd,0x27d3,0x27d9,0x27df,1,1,1,1,1,1,0x27e5,0x27eb,0x27f1,0x27f7,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0x2ab7,0x2abb,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0x2abf,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1, +1,1,0xffb4,0xffc8,0xffd0,0xffbc,0xffc0,0xffc0,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x9ac,1,1,1,1,0x9b0, +0x27fd,0x9b4,0x2803,0x9b8,0x2809,0x9bc,0x280f,0x9c0,0x2815,0x9c4,0x281b,0x9c8,0x2821,0x9cc,0x2827,0x9d0, +0x282d,0x9d4,0x2833,0x9d8,0x2839,0x9dc,0x283f,1,0x9e0,0x2845,0x9e4,0x284b,0x9e8,0x2851,1,1, +1,1,1,0x9ec,0x2857,0x285d,0x9f4,0x2863,0x2869,0x9fc,0x286f,0x2875,0xa04,0x287b,0x2881,0xa0c, +0x2887,0x288d,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0x2893,1,1,1,1,0xfc10,0xfc10,1, +1,0xa14,0x2899,1,1,1,1,1,1,1,0xa18,1,1,1,1,0xa1c, +0x289f,0xa20,0x28a5,0xa24,0x28ab,0xa28,0x28b1,0xa2c,0x28b7,0xa30,0x28bd,0xa34,0x28c3,0xa38,0x28c9,0xa3c, +0x28cf,0xa40,0x28d5,0xa44,0x28db,0xa48,0x28e1,1,0xa4c,0x28e7,0xa50,0x28ed,0xa54,0x28f3,1,1, +1,1,1,0xa58,0x28f9,0x28ff,0xa60,0x2905,0x290b,0xa68,0x2911,0x2917,0xa70,0x291d,0x2923,0xa78, +0x2929,0x292f,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xa80,0xa84,0xa88,0xa8c,1,0x2935,1,1,0x293b,0x2941,0x2947,0x294d,1, +1,0xa90,0x2953,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,0xffcc,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xfe12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffb8, +0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xffcc,1,0xffcc,0xffcc,0xffb8,1,1,0xffcc,0xffcc,1,1,1, +1,1,0xffcc,0xffcc,1,0xffcc,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1,1, +0x2ac5,0x2ac9,0x2acd,0x2ad1,0x2ad5,0x2ad9,0x2add,0x2ae1,0x2ae1,0x2ae5,0x2ae9,0x2aed,0x2af1,0x2af5,0x2af9,0x2afd, +0x2b01,0x2b05,0x2b09,0x2b0d,0x2b11,0x2b15,0x2b19,0x2b1d,0x2b21,0x2b25,0x2b29,0x2b2d,0x2b31,0x2b35,0x2b39,0x2b3d, +0x2b41,0x2b45,0x2b49,0x2b4d,0x2b51,0x2b55,0x2b59,0x2b5d,0x2b61,0x2b65,0x2b69,0x2b6d,0x2b71,0x2b75,0x2b79,0x2b7d, +0x2b81,0x2b85,0x2b89,0x2b8d,0x2b91,0x2b95,0x2b99,0x2b9d,0x2ba1,0x2ba5,0x2ba9,0x2bad,0x2bb1,0x2bb5,0x2bb9,0x2bbd, +0x2bc1,0x2bc5,0x2bc9,0x2bcd,0x2bd1,0x2bd5,0x2bd9,0x2bdd,0x2be1,0x2be5,0x2be9,0x2bed,0x2bf1,0x2bf5,0x2bf9,0x2bfd, +0x2c01,0x2c05,0x2c09,0x2c0d,0x2c11,0x2c15,0x2c19,0x2c1d,0x2c21,0x2c25,0x2c29,0x2c2d,0x2b11,0x2c31,0x2c35,0x2c39, +0x2c3d,0x2c41,0x2c45,0x2c49,0x2c4d,0x2c51,0x2c55,0x2c59,0x2c5d,0x2c61,0x2c65,0x2c69,0x2c6d,0x2c71,0x2c75,0x2c79, +0x2c7d,0x2c81,0x2c85,0x2c89,0x2c8d,0x2c91,0x2c95,0x2c99,0x2c9d,0x2ca1,0x2ca5,0x2ca9,0x2cad,0x2cb1,0x2cb5,0x2cb9, +0x2cbd,0x2cc1,0x2cc5,0x2cc9,0x2ccd,0x2cd1,0x2cd5,0x2cd9,0x2cdd,0x2ce1,0x2ce5,0x2ce9,0x2ced,0x2cf1,0x2cf5,0x2cf9, +0x2cfd,0x2d01,0x2d05,0x2d09,0x2d0d,0x2d11,0x2d15,0x2d19,0x2d1d,0x2d21,0x2d25,0x2d29,0x2d2d,0x2d31,0x2d35,0x2d39, +0x2d3d,0x2c79,0x2d41,0x2d45,0x2d49,0x2d4d,0x2d51,0x2d55,0x2d59,0x2d5d,0x2c39,0x2d61,0x2d65,0x2d69,0x2d6d,0x2d71, +0x2d75,0x2d79,0x2d7d,0x2d81,0x2d85,0x2d89,0x2d8d,0x2d91,0x2d95,0x2d99,0x2d9d,0x2da1,0x2da5,0x2da9,0x2dad,0x2b11, +0x2db1,0x2db5,0x2db9,0x2dbd,0x2dc1,0x2dc5,0x2dc9,0x2dcd,0x2dd1,0x2dd5,0x2dd9,0x2ddd,0x2de1,0x2de5,0x2de9,0x2ded, +0x2df1,0x2df5,0x2df9,0x2dfd,0x2e01,0x2e05,0x2e09,0x2e0d,0x2e11,0x2e15,0x2e19,0x2c41,0x2e1d,0x2e21,0x2e25,0x2e29, +0x2e2d,0x2e31,0x2e35,0x2e39,0x2e3d,0x2e41,0x2e45,0x2e49,0x2e4d,0x2e51,0x2e55,0x2e59,0x2e5d,0x2e61,0x2e65,0x2e69, +0x2e6d,0x2e71,0x2e75,0x2e79,0x2e7d,0x2e81,0x2e85,0x2e89,0x2e8d,0x2e91,0x2e95,0x2e99,0x2e9d,0x2ea1,0x2ea5,0x2ea9, +0x2ead,0x2eb1,0x2eb5,0x2eb9,0x2ebd,0x2ec1,0x2ec5,0x2ec9,0x2ecd,0x2ed1,0x2ed5,0x2ed9,0x2edd,0x2ee1,1,1, +0x2ee5,1,0x2ee9,1,1,0x2eed,0x2ef1,0x2ef5,0x2ef9,0x2efd,0x2f01,0x2f05,0x2f09,0x2f0d,0x2f11,1, +0x2f15,1,0x2f19,1,1,0x2f1d,0x2f21,1,1,1,0x2f25,0x2f29,0x2f2d,0x2f31,0x2f35,0x2f39, +0x2f3d,0x2f41,0x2f45,0x2f49,0x2f4d,0x2f51,0x2f55,0x2f59,0x2f5d,0x2f61,0x2f65,0x2f69,0x2f6d,0x2f71,0x2f75,0x2f79, +0x2f7d,0x2f81,0x2f85,0x2f89,0x2f8d,0x2f91,0x2f95,0x2f99,0x2f9d,0x2fa1,0x2fa5,0x2fa9,0x2fad,0x2fb1,0x2fb5,0x2fb9, +0x2fbd,0x2fc1,0x2fc5,0x2fc9,0x2fcd,0x2fd1,0x2fd5,0x2d15,0x2fd9,0x2fdd,0x2fe1,0x2fe5,0x2fe9,0x2fed,0x2fed,0x2ff1, +0x2ff5,0x2ff9,0x2ffd,0x3001,0x3005,0x3009,0x300d,0x2f1d,0x3011,0x3015,0x3019,0x301d,0x3021,0x3027,1,1, +0x302b,0x302f,0x3033,0x3037,0x303b,0x303f,0x3043,0x3047,0x2f55,0x304b,0x304f,0x3053,0x2ee5,0x3057,0x305b,0x305f, +0x3063,0x3067,0x306b,0x306f,0x3073,0x3077,0x307b,0x307f,0x3083,0x2f79,0x3087,0x2f7d,0x308b,0x308f,0x3093,0x3097, +0x309b,0x2ee9,0x2b65,0x309f,0x30a3,0x30a7,0x2c7d,0x2dd9,0x30ab,0x30af,0x2f99,0x30b3,0x2f9d,0x30b7,0x30bb,0x30bf, +0x2ef1,0x30c3,0x30c7,0x30cb,0x30cf,0x30d3,0x2ef5,0x30d7,0x30db,0x30df,0x30e3,0x30e7,0x30eb,0x2fd5,0x30ef,0x30f3, +0x2d15,0x30f7,0x2fe5,0x30fb,0x30ff,0x3103,0x3107,0x310b,0x2ff9,0x310f,0x2f19,0x3113,0x2ffd,0x2c31,0x3117,0x3001, +0x311b,0x3009,0x311f,0x3123,0x3127,0x312b,0x312f,0x3011,0x2f09,0x3133,0x3015,0x3137,0x3019,0x313b,0x2ae1,0x313f, +0x3145,0x314b,0x3151,0x3155,0x3159,0x315d,0x3163,0x3169,0x316f,0x3173,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0x3176,0xfe34,0x317c,1,1,1,1, +1,1,1,1,1,1,0x3182,0x3188,0x3190,0x319a,0x31a2,0x31a8,0x31ae,0x31b4,0x31ba,0x31c0, +0x31c6,0x31cc,0x31d2,1,0x31d8,0x31de,0x31e4,0x31ea,0x31f0,1,0x31f6,1,0x31fc,0x3202,1,0x3208, +0x320e,1,0x3214,0x321a,0x3220,0x3226,0x322c,0x3232,0x3238,0x323e,0x3244,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffcc,0xffcc,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xffb8,1,1,0xffb8,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xffb8,1,0xffcc,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xffcc,0xfe02,0xffb8,1, +1,1,1,0xfe12,1,1,1,1,1,0xffcc,0xffb8,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xa94,0x2959,0xa9a,0x2963,1,1,1,1,1,1,1, +1,0xaa0,1,1,1,1,1,0x296d,1,1,1,1,1,1,1,1, +1,1,1,1,1,0xfe12,0xfc0e,1,1,1,1,1,0xffcc,0xffcc,0xffcc,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xfc00, +1,1,1,1,1,1,0x2977,0x2981,1,0xaa6,0xaac,0xfe12,0xfe12,1,1,1, +1,1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1, +1,1,0xfe0e,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1,1, +1,1,1,1,1,0xfe0e,0xfe12,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xab2, +1,1,1,0x298b,0x2995,0xfe12,1,1,1,1,1,1,1,1,1,0xfc00, +1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe12,1,1,1,0xfe0e,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xfc00,1,1,1,1,1,1,1,1,0xabe,0xfc00,0x299f, +0x29a9,0xfc00,0x29b3,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xfc00,1,1,1,1,1,1,1,1, +0xad0,0xad6,0x29bd,0x29c7,1,1,1,0xfe12,0xfe0e,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xfe12,0xfe0e,1,1,1,1, +1,1,1,1,1,1,1,0xfe12,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0xfe12,1,1,1,1,1,1,1,1,0xfe0e,1,0xfe12,0xfe12,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,0xfe02,0xfe02,0xfe02,0xfe02,0xfe02,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0xfe02,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,0x324a,0x3254,0x3268,0x3280,0x3298,0x32b0,0x32c8,0xffb0,0xffb0,0xfe02, +0xfe02,0xfe02,1,1,1,0xffc4,0xffb0,0xffb0,0xffb0,0xffb0,0xffb0,1,1,1,1,1, +1,1,1,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0xffcc,0xffcc,0xffcc,0xffcc,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x32d6,0x32e0,0x32f4,0x330c,0x3324, +0x333c,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,0xffcc,0xffcc,0xffcc,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc, +0xffcc,0xffcc,1,0xffcc,0xffcc,1,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,0xffb8,1,1,1,1,1,1,1,1,1, +0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xffcc,0xfe0e,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0x334b,0x334f,0x3353,0x3357, +0x335d,0x2f3d,0x3361,0x3365,0x3369,0x336d,0x2f41,0x3371,0x3375,0x3379,0x2f45,0x337f,0x3383,0x3387,0x338b,0x3391, +0x3395,0x3399,0x339d,0x33a3,0x33a7,0x33ab,0x33af,0x302f,0x33b3,0x33b9,0x33bd,0x33c1,0x33c5,0x33c9,0x33cd,0x33d1, +0x33d5,0x3043,0x2f49,0x2f4d,0x3047,0x33d9,0x33dd,0x2c49,0x33e1,0x2f51,0x33e5,0x33e9,0x33ed,0x33f1,0x33f1,0x33f1, +0x33f5,0x33fb,0x33ff,0x3403,0x3407,0x340d,0x3411,0x3415,0x3419,0x341d,0x3421,0x3425,0x3429,0x342d,0x3431,0x3435, +0x3439,0x343d,0x343d,0x304f,0x3441,0x3445,0x3449,0x344d,0x2f59,0x3451,0x3455,0x3459,0x2ead,0x345d,0x3461,0x3465, +0x3469,0x346d,0x3471,0x3475,0x3479,0x347d,0x3483,0x3487,0x348b,0x348f,0x3493,0x3497,0x349b,0x34a1,0x34a7,0x34ab, +0x34af,0x34b3,0x34b7,0x34bb,0x34bf,0x34c3,0x34c7,0x34c7,0x34cb,0x34d1,0x34d5,0x2c39,0x34d9,0x34dd,0x34e3,0x34e7, +0x34eb,0x34ef,0x34f3,0x34f7,0x2f6d,0x34fb,0x34ff,0x3503,0x3509,0x350d,0x3513,0x3517,0x351b,0x351f,0x3523,0x3527, +0x352b,0x352f,0x3533,0x3537,0x353b,0x353f,0x3545,0x3549,0x354d,0x3551,0x2b61,0x3555,0x355b,0x355f,0x355f,0x3565, +0x3569,0x3569,0x356d,0x3571,0x3577,0x357d,0x3581,0x3585,0x3589,0x358d,0x3591,0x3595,0x3599,0x359d,0x35a1,0x2f71, +0x35a5,0x35ab,0x35af,0x35b3,0x307f,0x35b3,0x35b7,0x2f79,0x35bb,0x35bf,0x35c3,0x35c7,0x2f7d,0x2af5,0x35cb,0x35cf, +0x35d3,0x35d7,0x35db,0x35df,0x35e3,0x35e9,0x35ed,0x35f1,0x35f5,0x35f9,0x35fd,0x3603,0x3607,0x360b,0x360f,0x3613, +0x3617,0x361b,0x361f,0x3623,0x2f81,0x3627,0x362b,0x3631,0x3635,0x3639,0x363d,0x2f89,0x3641,0x3645,0x3649,0x364d, +0x3651,0x3655,0x3659,0x365d,0x2b65,0x309f,0x3661,0x3665,0x3669,0x366d,0x3673,0x3677,0x367b,0x367f,0x2f8d,0x3683, +0x3689,0x368d,0x3691,0x3151,0x3695,0x3699,0x369d,0x36a1,0x36a5,0x36ab,0x36af,0x36b3,0x36b7,0x36bd,0x36c1,0x36c5, +0x36c9,0x2c7d,0x36cd,0x36d1,0x36d7,0x36dd,0x36e3,0x36e7,0x36ed,0x36f1,0x36f5,0x36f9,0x36fd,0x2f91,0x2dd9,0x3701, +0x3705,0x3709,0x370d,0x3713,0x3717,0x371b,0x371f,0x30af,0x3723,0x3727,0x372d,0x3731,0x3735,0x373b,0x3741,0x3745, +0x30b3,0x3749,0x374d,0x3751,0x3755,0x3759,0x375d,0x3761,0x3767,0x376b,0x3771,0x3775,0x377b,0x30bb,0x377f,0x3783, +0x3789,0x378d,0x3791,0x3797,0x379d,0x37a1,0x37a5,0x37a9,0x37ad,0x37ad,0x37b1,0x37b5,0x30c3,0x37b9,0x37bd,0x37c1, +0x37c5,0x37c9,0x37cf,0x37d3,0x2c45,0x37d9,0x37df,0x37e3,0x37e9,0x37ef,0x37f5,0x37f9,0x30db,0x37fd,0x3803,0x3809, +0x380f,0x3815,0x3819,0x3819,0x30df,0x3159,0x381d,0x3821,0x3825,0x3829,0x382f,0x2bad,0x30e7,0x3833,0x3837,0x2fbd, +0x383d,0x3843,0x2f05,0x3849,0x384d,0x2fcd,0x3851,0x3855,0x3859,0x385f,0x385f,0x3865,0x3869,0x386d,0x3873,0x3877, +0x387b,0x387f,0x3885,0x3889,0x388d,0x3891,0x3895,0x3899,0x389f,0x38a3,0x38a7,0x38ab,0x38af,0x38b3,0x38b7,0x38bd, +0x38c3,0x38c7,0x38cd,0x38d1,0x38d7,0x38db,0x2fe5,0x38df,0x38e5,0x38eb,0x38ef,0x38f5,0x38f9,0x38ff,0x3903,0x3907, +0x390b,0x390f,0x3913,0x3917,0x391d,0x3923,0x3929,0x3565,0x392f,0x3933,0x3937,0x393b,0x393f,0x3943,0x3947,0x394b, +0x394f,0x3953,0x3957,0x395b,0x2c8d,0x3961,0x3965,0x3969,0x396d,0x3971,0x3975,0x2ff1,0x3979,0x397d,0x3981,0x3985, +0x3989,0x398f,0x3995,0x399b,0x399f,0x39a3,0x39a7,0x39ab,0x39b1,0x39b5,0x39bb,0x39bf,0x39c3,0x39c9,0x39cf,0x39d3, +0x2b99,0x39d7,0x39db,0x39df,0x39e3,0x39e7,0x39eb,0x3103,0x39ef,0x39f3,0x39f7,0x39fb,0x39ff,0x3a03,0x3a07,0x3a0b, +0x3a0f,0x3a13,0x3a19,0x3a1d,0x3a21,0x3a25,0x3a29,0x3a2d,0x3a33,0x3a39,0x3a3d,0x3a41,0x3117,0x311b,0x3a45,0x3a49, +0x3a4f,0x3a53,0x3a57,0x3a5b,0x3a5f,0x3a65,0x3a6b,0x3a6f,0x3a73,0x3a77,0x3a7d,0x311f,0x3a81,0x3a87,0x3a8d,0x3a91, +0x3a95,0x3a99,0x3a9f,0x3aa3,0x3aa7,0x3aab,0x3aaf,0x3ab3,0x3ab7,0x3abb,0x3ac1,0x3ac5,0x3ac9,0x3acd,0x3ad3,0x3ad7, +0x3adb,0x3adf,0x3ae3,0x3ae9,0x3aef,0x3af3,0x3af7,0x3afb,0x3b01,0x3b05,0x3137,0x3137,0x3b0b,0x3b0f,0x3b15,0x3b19, +0x3b1d,0x3b21,0x3b25,0x3b29,0x3b2d,0x3b31,0x313b,0x3b37,0x3b3b,0x3b3f,0x3b43,0x3b47,0x3b4b,0x3b51,0x3b55,0x3b5b, +0x3b61,0x3b67,0x3b6b,0x3b6f,0x3b73,0x3b77,0x3b7b,0x3b7f,0x3b83,0x3b87,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,1,1,1,1,1,1,1,1,1,1,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00, +0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,0xfe00,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,0x1283,0x1283,0x1283,0x1283,0xadc,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283,0x1283, +0x1283,0x1283,0x1283,0x1283,0x3c54,1,0x3c54,1,0x3c54,0x3c54,0x3c54,0x3c54,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3c54,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x3c54, +1,1,1,1,0x3c54,1,1,1,0x3c54,1,0x3c54,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x3b87,1,1,1,1,1 }; -static const uint16_t norm2_nfc_data_extraData[7722]={ +static const uint16_t norm2_nfc_data_extraData[7724]={ 0xffff,0xffff,0x8670,0x44dc,0x8670,0x44c0,0x8670,0x44de,0x600,0x180,0x602,0x182,0x604,0x185,0x606,0x186, 0x608,0x200,0x60c,0x205,0x60e,0x44d,0x610,0x189,0x612,0x3d44,0x614,0x18b,0x618,0x39a,0x61e,0x400, 0x622,0x404,0x646,0x3d41,0x64a,0x3c00,0x8650,0x208,0x60e,0x3c04,0x646,0x3c08,0x8662,0x3c0c,0x602,0x20c, @@ -712,407 +720,407 @@ static const uint16_t norm2_nfc_data_extraData[7722]={ 0x6132,0x61a6,0xe134,0x61a8,0x6132,0x61ac,0xe134,0x61ae,0x6132,0x61b2,0xe134,0x61b4,0x6132,0x61b8,0xe134,0x61ba, 0xe132,0x61ee,0xe132,0x61f0,0xe132,0x61f2,0xe132,0x61f4,0xe132,0x61fc,0xb489,0x2e82,0x2134,0xb489,0x2e82,0x2138, 0xb489,0x2e82,0x2156,0xb489,0x49c2,0x225c,0xb489,0x49c2,0x225e,0x3489,0xcf82,0x2696,0xb489,0xd5c2,0x2698,0x348b, -0x2c02,0x2978,0x348b,0x2e82,0x2976,0xb48b,0x2f42,0x297c,0xb48b,0x6bc2,0x2b74,0xb48b,0x6bc2,0x2b76,0,0xe622, -0x41,0x302,0x600,0x3d4c,0x602,0x3d48,0x606,0x3d54,0x8612,0x3d50,0xe622,0x41,0x308,0x8608,0x3bc,0xe622, -0x41,0x30a,0x8602,0x3f4,0xca22,0x43,0x327,0x8602,0x3c10,0xe622,0x45,0x302,0x600,0x3d80,0x602,0x3d7c, -0x606,0x3d88,0x8612,0x3d84,0xe622,0x49,0x308,0x8602,0x3c5c,0xe622,0x4f,0x302,0x600,0x3da4,0x602,0x3da0, -0x606,0x3dac,0x8612,0x3da8,0xe622,0x4f,0x303,0x602,0x3c98,0x608,0x458,0x8610,0x3c9c,0xe622,0x4f,0x308, -0x8608,0x454,0xe622,0x55,0x308,0x600,0x3b6,0x602,0x3ae,0x608,0x3aa,0x8618,0x3b2,0xe622,0x61,0x302, -0x600,0x3d4e,0x602,0x3d4a,0x606,0x3d56,0x8612,0x3d52,0xe622,0x61,0x308,0x8608,0x3be,0xe622,0x61,0x30a, -0x8602,0x3f6,0xca22,0x63,0x327,0x8602,0x3c12,0xe622,0x65,0x302,0x600,0x3d82,0x602,0x3d7e,0x606,0x3d8a, -0x8612,0x3d86,0xe622,0x69,0x308,0x8602,0x3c5e,0xe622,0x6f,0x302,0x600,0x3da6,0x602,0x3da2,0x606,0x3dae, -0x8612,0x3daa,0xe622,0x6f,0x303,0x602,0x3c9a,0x608,0x45a,0x8610,0x3c9e,0xe622,0x6f,0x308,0x8608,0x456, -0xe622,0x75,0x308,0x600,0x3b8,0x602,0x3b0,0x608,0x3ac,0x8618,0x3b4,0xe622,0x41,0x306,0x600,0x3d60, -0x602,0x3d5c,0x606,0x3d68,0x8612,0x3d64,0xe622,0x61,0x306,0x600,0x3d62,0x602,0x3d5e,0x606,0x3d6a,0x8612, -0x3d66,0xe622,0x45,0x304,0x600,0x3c28,0x8602,0x3c2c,0xe622,0x65,0x304,0x600,0x3c2a,0x8602,0x3c2e,0xe622, -0x4f,0x304,0x600,0x3ca0,0x8602,0x3ca4,0xe622,0x6f,0x304,0x600,0x3ca2,0x8602,0x3ca6,0xe622,0x53,0x301, -0x860e,0x3cc8,0xe622,0x73,0x301,0x860e,0x3cca,0xe622,0x53,0x30c,0x860e,0x3ccc,0xe622,0x73,0x30c,0x860e, -0x3cce,0xe622,0x55,0x303,0x8602,0x3cf0,0xe622,0x75,0x303,0x8602,0x3cf2,0xe622,0x55,0x304,0x8610,0x3cf4, -0xe622,0x75,0x304,0x8610,0x3cf6,0xd822,0x4f,0x31b,0x600,0x3db8,0x602,0x3db4,0x606,0x3dc0,0x612,0x3dbc, -0x8646,0x3dc4,0xd822,0x6f,0x31b,0x600,0x3dba,0x602,0x3db6,0x606,0x3dc2,0x612,0x3dbe,0x8646,0x3dc6,0xd822, -0x55,0x31b,0x600,0x3dd4,0x602,0x3dd0,0x606,0x3ddc,0x612,0x3dd8,0x8646,0x3de0,0xd822,0x75,0x31b,0x600, -0x3dd6,0x602,0x3dd2,0x606,0x3dde,0x612,0x3dda,0x8646,0x3de2,0xca22,0x4f,0x328,0x8608,0x3d8,0xca22,0x6f, -0x328,0x8608,0x3da,0xe622,0x41,0x307,0x8608,0x3c0,0xe622,0x61,0x307,0x8608,0x3c2,0xca22,0x45,0x327, -0x860c,0x3c38,0xca22,0x65,0x327,0x860c,0x3c3a,0xe622,0x4f,0x307,0x8608,0x460,0xe622,0x6f,0x307,0x8608, -0x462,0xe622,0x3b1,0x301,0x868a,0x3f68,0xe622,0x3b7,0x301,0x868a,0x3f88,0xe622,0x3b9,0x308,0x600,0x3fa4, -0x602,0x720,0x8684,0x3fae,0xe622,0x3c5,0x308,0x600,0x3fc4,0x602,0x760,0x8684,0x3fce,0xe622,0x3c9,0x301, -0x868a,0x3fe8,0x22,0xcc6,0xcc2,0x99aa,0x1996,0x22,0xdd9,0xdcf,0x9b94,0x1bba,0xdc22,0x4c,0x323,0x8608, -0x3c70,0xdc22,0x6c,0x323,0x8608,0x3c72,0xdc22,0x52,0x323,0x8608,0x3cb8,0xdc22,0x72,0x323,0x8608,0x3cba, -0xdc22,0x53,0x323,0x860e,0x3cd0,0xdc22,0x73,0x323,0x860e,0x3cd2,0xdc22,0x41,0x323,0x604,0x3d58,0x860c, -0x3d6c,0xdc22,0x61,0x323,0x604,0x3d5a,0x860c,0x3d6e,0xdc22,0x45,0x323,0x8604,0x3d8c,0xdc22,0x65,0x323, -0x8604,0x3d8e,0xdc22,0x4f,0x323,0x8604,0x3db0,0xdc22,0x6f,0x323,0x8604,0x3db2,0xe622,0x3b1,0x313,0x600, -0x3e05,0x602,0x3e09,0x684,0x3e0d,0x868a,0x3f00,0xe622,0x3b1,0x314,0x600,0x3e07,0x602,0x3e0b,0x684,0x3e0f, -0x868a,0x3f02,0x1f00,0xe663,0x3b1,0x313,0x300,0x868a,0x3f04,0x1f01,0xe663,0x3b1,0x314,0x300,0x868a,0x3f06, -0x1f00,0xe663,0x3b1,0x313,0x301,0x868a,0x3f08,0x1f01,0xe663,0x3b1,0x314,0x301,0x868a,0x3f0a,0x1f00,0xe663, -0x3b1,0x313,0x342,0x868a,0x3f0c,0x1f01,0xe663,0x3b1,0x314,0x342,0x868a,0x3f0e,0xe622,0x391,0x313,0x600, -0x3e15,0x602,0x3e19,0x684,0x3e1d,0x868a,0x3f10,0xe622,0x391,0x314,0x600,0x3e17,0x602,0x3e1b,0x684,0x3e1f, -0x868a,0x3f12,0x1f08,0xe663,0x391,0x313,0x300,0x868a,0x3f14,0x1f09,0xe663,0x391,0x314,0x300,0x868a,0x3f16, -0x1f08,0xe663,0x391,0x313,0x301,0x868a,0x3f18,0x1f09,0xe663,0x391,0x314,0x301,0x868a,0x3f1a,0x1f08,0xe663, -0x391,0x313,0x342,0x868a,0x3f1c,0x1f09,0xe663,0x391,0x314,0x342,0x868a,0x3f1e,0xe622,0x3b5,0x313,0x600, -0x3e24,0x8602,0x3e28,0xe622,0x3b5,0x314,0x600,0x3e26,0x8602,0x3e2a,0xe622,0x395,0x313,0x600,0x3e34,0x8602, -0x3e38,0xe622,0x395,0x314,0x600,0x3e36,0x8602,0x3e3a,0xe622,0x3b7,0x313,0x600,0x3e45,0x602,0x3e49,0x684, -0x3e4d,0x868a,0x3f20,0xe622,0x3b7,0x314,0x600,0x3e47,0x602,0x3e4b,0x684,0x3e4f,0x868a,0x3f22,0x1f20,0xe663, -0x3b7,0x313,0x300,0x868a,0x3f24,0x1f21,0xe663,0x3b7,0x314,0x300,0x868a,0x3f26,0x1f20,0xe663,0x3b7,0x313, -0x301,0x868a,0x3f28,0x1f21,0xe663,0x3b7,0x314,0x301,0x868a,0x3f2a,0x1f20,0xe663,0x3b7,0x313,0x342,0x868a, -0x3f2c,0x1f21,0xe663,0x3b7,0x314,0x342,0x868a,0x3f2e,0xe622,0x397,0x313,0x600,0x3e55,0x602,0x3e59,0x684, -0x3e5d,0x868a,0x3f30,0xe622,0x397,0x314,0x600,0x3e57,0x602,0x3e5b,0x684,0x3e5f,0x868a,0x3f32,0x1f28,0xe663, -0x397,0x313,0x300,0x868a,0x3f34,0x1f29,0xe663,0x397,0x314,0x300,0x868a,0x3f36,0x1f28,0xe663,0x397,0x313, -0x301,0x868a,0x3f38,0x1f29,0xe663,0x397,0x314,0x301,0x868a,0x3f3a,0x1f28,0xe663,0x397,0x313,0x342,0x868a, -0x3f3c,0x1f29,0xe663,0x397,0x314,0x342,0x868a,0x3f3e,0xe622,0x3b9,0x313,0x600,0x3e64,0x602,0x3e68,0x8684, -0x3e6c,0xe622,0x3b9,0x314,0x600,0x3e66,0x602,0x3e6a,0x8684,0x3e6e,0xe622,0x399,0x313,0x600,0x3e74,0x602, -0x3e78,0x8684,0x3e7c,0xe622,0x399,0x314,0x600,0x3e76,0x602,0x3e7a,0x8684,0x3e7e,0xe622,0x3bf,0x313,0x600, -0x3e84,0x8602,0x3e88,0xe622,0x3bf,0x314,0x600,0x3e86,0x8602,0x3e8a,0xe622,0x39f,0x313,0x600,0x3e94,0x8602, -0x3e98,0xe622,0x39f,0x314,0x600,0x3e96,0x8602,0x3e9a,0xe622,0x3c5,0x313,0x600,0x3ea4,0x602,0x3ea8,0x8684, -0x3eac,0xe622,0x3c5,0x314,0x600,0x3ea6,0x602,0x3eaa,0x8684,0x3eae,0xe622,0x3a5,0x314,0x600,0x3eb6,0x602, -0x3eba,0x8684,0x3ebe,0xe622,0x3c9,0x313,0x600,0x3ec5,0x602,0x3ec9,0x684,0x3ecd,0x868a,0x3f40,0xe622,0x3c9, -0x314,0x600,0x3ec7,0x602,0x3ecb,0x684,0x3ecf,0x868a,0x3f42,0x1f60,0xe663,0x3c9,0x313,0x300,0x868a,0x3f44, -0x1f61,0xe663,0x3c9,0x314,0x300,0x868a,0x3f46,0x1f60,0xe663,0x3c9,0x313,0x301,0x868a,0x3f48,0x1f61,0xe663, -0x3c9,0x314,0x301,0x868a,0x3f4a,0x1f60,0xe663,0x3c9,0x313,0x342,0x868a,0x3f4c,0x1f61,0xe663,0x3c9,0x314, -0x342,0x868a,0x3f4e,0xe622,0x3a9,0x313,0x600,0x3ed5,0x602,0x3ed9,0x684,0x3edd,0x868a,0x3f50,0xe622,0x3a9, -0x314,0x600,0x3ed7,0x602,0x3edb,0x684,0x3edf,0x868a,0x3f52,0x1f68,0xe663,0x3a9,0x313,0x300,0x868a,0x3f54, -0x1f69,0xe663,0x3a9,0x314,0x300,0x868a,0x3f56,0x1f68,0xe663,0x3a9,0x313,0x301,0x868a,0x3f58,0x1f69,0xe663, -0x3a9,0x314,0x301,0x868a,0x3f5a,0x1f68,0xe663,0x3a9,0x313,0x342,0x868a,0x3f5c,0x1f69,0xe663,0x3a9,0x314, -0x342,0x868a,0x3f5e,0xe622,0x3b1,0x300,0x868a,0x3f64,0xe622,0x3b7,0x300,0x868a,0x3f84,0xe622,0x3c9,0x300, -0x868a,0x3fe4,0xe622,0x3b1,0x342,0x868a,0x3f6e,0xe622,0x3b7,0x342,0x868a,0x3f8e,0xe622,0x3c9,0x342,0x868a, -0x3fee,0xe622,0x41,0x300,0xe622,0x41,0x301,0xe622,0x41,0x303,0xe622,0x45,0x300,0xe622,0x45,0x301, -0xe622,0x45,0x308,0xe622,0x49,0x300,0xe622,0x49,0x301,0xe622,0x49,0x302,0xe622,0x4e,0x303,0xe622, -0x4f,0x300,0xe622,0x4f,0x301,0xe622,0x55,0x300,0xe622,0x55,0x301,0xe622,0x55,0x302,0xe622,0x59, -0x301,0xe622,0x61,0x300,0xe622,0x61,0x301,0xe622,0x61,0x303,0xe622,0x65,0x300,0xe622,0x65,0x301, -0xe622,0x65,0x308,0xe622,0x69,0x300,0xe622,0x69,0x301,0xe622,0x69,0x302,0xe622,0x6e,0x303,0xe622, -0x6f,0x300,0xe622,0x6f,0x301,0xe622,0x75,0x300,0xe622,0x75,0x301,0xe622,0x75,0x302,0xe622,0x79, -0x301,0xe622,0x79,0x308,0xe622,0x41,0x304,0xe622,0x61,0x304,0xca02,0x41,0x328,0xca02,0x61,0x328, -0xe622,0x43,0x301,0xe622,0x63,0x301,0xe622,0x43,0x302,0xe622,0x63,0x302,0xe622,0x43,0x307,0xe622, -0x63,0x307,0xe622,0x43,0x30c,0xe622,0x63,0x30c,0xe622,0x44,0x30c,0xe622,0x64,0x30c,0xe622,0x45, -0x306,0xe622,0x65,0x306,0xe622,0x45,0x307,0xe622,0x65,0x307,0xca02,0x45,0x328,0xca02,0x65,0x328, -0xe622,0x45,0x30c,0xe622,0x65,0x30c,0xe622,0x47,0x302,0xe622,0x67,0x302,0xe622,0x47,0x306,0xe622, -0x67,0x306,0xe622,0x47,0x307,0xe622,0x67,0x307,0xca02,0x47,0x327,0xca02,0x67,0x327,0xe622,0x48, -0x302,0xe622,0x68,0x302,0xe622,0x49,0x303,0xe622,0x69,0x303,0xe622,0x49,0x304,0xe622,0x69,0x304, -0xe622,0x49,0x306,0xe622,0x69,0x306,0xca02,0x49,0x328,0xca02,0x69,0x328,0xe622,0x49,0x307,0xe602, -0x4a,0x302,0xe602,0x6a,0x302,0xca02,0x4b,0x327,0xca02,0x6b,0x327,0xe622,0x4c,0x301,0xe622,0x6c, -0x301,0xca02,0x4c,0x327,0xca02,0x6c,0x327,0xe622,0x4c,0x30c,0xe622,0x6c,0x30c,0xe622,0x4e,0x301, -0xe622,0x6e,0x301,0xca02,0x4e,0x327,0xca02,0x6e,0x327,0xe622,0x4e,0x30c,0xe622,0x6e,0x30c,0xe622, -0x4f,0x306,0xe622,0x6f,0x306,0xe622,0x4f,0x30b,0xe622,0x6f,0x30b,0xe622,0x52,0x301,0xe622,0x72, -0x301,0xca02,0x52,0x327,0xca02,0x72,0x327,0xe622,0x52,0x30c,0xe622,0x72,0x30c,0xe622,0x53,0x302, -0xe622,0x73,0x302,0xca02,0x53,0x327,0xca02,0x73,0x327,0xca02,0x54,0x327,0xca02,0x74,0x327,0xe622, -0x54,0x30c,0xe622,0x74,0x30c,0xe622,0x55,0x306,0xe622,0x75,0x306,0xe622,0x55,0x30a,0xe622,0x75, -0x30a,0xe622,0x55,0x30b,0xe622,0x75,0x30b,0xca02,0x55,0x328,0xca02,0x75,0x328,0xe622,0x57,0x302, -0xe622,0x77,0x302,0xe622,0x59,0x302,0xe622,0x79,0x302,0xe622,0x59,0x308,0xe622,0x5a,0x301,0xe622, -0x7a,0x301,0xe622,0x5a,0x307,0xe622,0x7a,0x307,0xe622,0x5a,0x30c,0xe622,0x7a,0x30c,0xe622,0x41, -0x30c,0xe622,0x61,0x30c,0xe622,0x49,0x30c,0xe622,0x69,0x30c,0xe622,0x4f,0x30c,0xe622,0x6f,0x30c, -0xe622,0x55,0x30c,0xe622,0x75,0x30c,0xdc,0xe663,0x55,0x308,0x304,0xfc,0xe663,0x75,0x308,0x304, -0xdc,0xe663,0x55,0x308,0x301,0xfc,0xe663,0x75,0x308,0x301,0xdc,0xe663,0x55,0x308,0x30c,0xfc, -0xe663,0x75,0x308,0x30c,0xdc,0xe663,0x55,0x308,0x300,0xfc,0xe663,0x75,0x308,0x300,0xc4,0xe663, -0x41,0x308,0x304,0xe4,0xe663,0x61,0x308,0x304,0x226,0xe663,0x41,0x307,0x304,0x227,0xe663,0x61, -0x307,0x304,0xe602,0xc6,0x304,0xe602,0xe6,0x304,0xe622,0x47,0x30c,0xe622,0x67,0x30c,0xe622,0x4b, -0x30c,0xe622,0x6b,0x30c,0x1ea,0xe643,0x4f,0x328,0x304,0x1eb,0xe643,0x6f,0x328,0x304,0xe602,0x1b7, -0x30c,0xe602,0x292,0x30c,0xe602,0x6a,0x30c,0xe622,0x47,0x301,0xe622,0x67,0x301,0xe622,0x4e,0x300, -0xe622,0x6e,0x300,0xc5,0xe663,0x41,0x30a,0x301,0xe5,0xe663,0x61,0x30a,0x301,0xe602,0xc6,0x301, -0xe602,0xe6,0x301,0xe602,0xd8,0x301,0xe602,0xf8,0x301,0xe622,0x41,0x30f,0xe622,0x61,0x30f,0xe622, -0x41,0x311,0xe622,0x61,0x311,0xe622,0x45,0x30f,0xe622,0x65,0x30f,0xe622,0x45,0x311,0xe622,0x65, -0x311,0xe622,0x49,0x30f,0xe622,0x69,0x30f,0xe622,0x49,0x311,0xe622,0x69,0x311,0xe622,0x4f,0x30f, -0xe622,0x6f,0x30f,0xe622,0x4f,0x311,0xe622,0x6f,0x311,0xe622,0x52,0x30f,0xe622,0x72,0x30f,0xe622, -0x52,0x311,0xe622,0x72,0x311,0xe622,0x55,0x30f,0xe622,0x75,0x30f,0xe622,0x55,0x311,0xe622,0x75, -0x311,0xdc22,0x53,0x326,0xdc22,0x73,0x326,0xdc22,0x54,0x326,0xdc22,0x74,0x326,0xe622,0x48,0x30c, -0xe622,0x68,0x30c,0xd6,0xe663,0x4f,0x308,0x304,0xf6,0xe663,0x6f,0x308,0x304,0xd5,0xe663,0x4f, -0x303,0x304,0xf5,0xe663,0x6f,0x303,0x304,0x22e,0xe663,0x4f,0x307,0x304,0x22f,0xe663,0x6f,0x307, -0x304,0xe622,0x59,0x304,0xe622,0x79,0x304,0xe602,0xa8,0x301,0xe602,0x391,0x301,0xe602,0x395,0x301, -0xe602,0x397,0x301,0xe602,0x399,0x301,0xe602,0x39f,0x301,0xe602,0x3a5,0x301,0xe602,0x3a9,0x301,0x3ca, -0xe643,0x3b9,0x308,0x301,0xe602,0x399,0x308,0xe602,0x3a5,0x308,0xe602,0x3b5,0x301,0xe602,0x3b9,0x301, -0x3cb,0xe643,0x3c5,0x308,0x301,0xe602,0x3bf,0x301,0xe602,0x3c5,0x301,0xe602,0x3d2,0x301,0xe602,0x3d2, -0x308,0xe602,0x415,0x300,0xe602,0x415,0x308,0xe602,0x413,0x301,0xe602,0x406,0x308,0xe602,0x41a,0x301, -0xe602,0x418,0x300,0xe602,0x423,0x306,0xe602,0x418,0x306,0xe602,0x438,0x306,0xe602,0x435,0x300,0xe602, -0x435,0x308,0xe602,0x433,0x301,0xe602,0x456,0x308,0xe602,0x43a,0x301,0xe602,0x438,0x300,0xe602,0x443, -0x306,0xe602,0x474,0x30f,0xe602,0x475,0x30f,0xe602,0x416,0x306,0xe602,0x436,0x306,0xe602,0x410,0x306, -0xe602,0x430,0x306,0xe602,0x410,0x308,0xe602,0x430,0x308,0xe602,0x415,0x306,0xe602,0x435,0x306,0xe602, -0x4d8,0x308,0xe602,0x4d9,0x308,0xe602,0x416,0x308,0xe602,0x436,0x308,0xe602,0x417,0x308,0xe602,0x437, -0x308,0xe602,0x418,0x304,0xe602,0x438,0x304,0xe602,0x418,0x308,0xe602,0x438,0x308,0xe602,0x41e,0x308, -0xe602,0x43e,0x308,0xe602,0x4e8,0x308,0xe602,0x4e9,0x308,0xe602,0x42d,0x308,0xe602,0x44d,0x308,0xe602, -0x423,0x304,0xe602,0x443,0x304,0xe602,0x423,0x308,0xe602,0x443,0x308,0xe602,0x423,0x30b,0xe602,0x443, -0x30b,0xe602,0x427,0x308,0xe602,0x447,0x308,0xe602,0x42b,0x308,0xe602,0x44b,0x308,0xe622,0x627,0x653, -0xe622,0x627,0x654,0xe602,0x648,0x654,0xdc02,0x627,0x655,0xe602,0x64a,0x654,0xe602,0x6d5,0x654,0xe602, -0x6c1,0x654,0xe602,0x6d2,0x654,0x702,0x928,0x93c,0x702,0x930,0x93c,0x702,0x933,0x93c,2,0x9c7, -0x9be,2,0x9c7,0x9d7,2,0xb47,0xb56,2,0xb47,0xb3e,2,0xb47,0xb57,2,0xb92,0xbd7, -2,0xbc6,0xbbe,2,0xbc7,0xbbe,2,0xbc6,0xbd7,0x5b02,0xc46,0xc56,2,0xcbf,0xcd5,2, -0xcc6,0xcd5,2,0xcc6,0xcd6,0xcca,0x43,0xcc6,0xcc2,0xcd5,2,0xd46,0xd3e,2,0xd47,0xd3e, -2,0xd46,0xd57,0x902,0xdd9,0xdca,0xddc,0x943,0xdd9,0xdcf,0xdca,2,0xdd9,0xddf,2,0x1025, -0x102e,2,0x1b05,0x1b35,2,0x1b07,0x1b35,2,0x1b09,0x1b35,2,0x1b0b,0x1b35,2,0x1b0d,0x1b35, -2,0x1b11,0x1b35,2,0x1b3a,0x1b35,2,0x1b3c,0x1b35,2,0x1b3e,0x1b35,2,0x1b3f,0x1b35,2, -0x1b42,0x1b35,0xdc22,0x41,0x325,0xdc22,0x61,0x325,0xe622,0x42,0x307,0xe622,0x62,0x307,0xdc02,0x42, -0x323,0xdc02,0x62,0x323,0xdc02,0x42,0x331,0xdc02,0x62,0x331,0xc7,0xe643,0x43,0x327,0x301,0xe7, -0xe643,0x63,0x327,0x301,0xe622,0x44,0x307,0xe622,0x64,0x307,0xdc22,0x44,0x323,0xdc22,0x64,0x323, -0xdc22,0x44,0x331,0xdc22,0x64,0x331,0xca02,0x44,0x327,0xca02,0x64,0x327,0xdc22,0x44,0x32d,0xdc22, -0x64,0x32d,0x112,0xe663,0x45,0x304,0x300,0x113,0xe663,0x65,0x304,0x300,0x112,0xe663,0x45,0x304, -0x301,0x113,0xe663,0x65,0x304,0x301,0xdc22,0x45,0x32d,0xdc22,0x65,0x32d,0xdc22,0x45,0x330,0xdc22, -0x65,0x330,0x228,0xe643,0x45,0x327,0x306,0x229,0xe643,0x65,0x327,0x306,0xe602,0x46,0x307,0xe602, -0x66,0x307,0xe622,0x47,0x304,0xe622,0x67,0x304,0xe622,0x48,0x307,0xe622,0x68,0x307,0xdc22,0x48, -0x323,0xdc22,0x68,0x323,0xe622,0x48,0x308,0xe622,0x68,0x308,0xca02,0x48,0x327,0xca02,0x68,0x327, -0xdc22,0x48,0x32e,0xdc22,0x68,0x32e,0xdc22,0x49,0x330,0xdc22,0x69,0x330,0xcf,0xe663,0x49,0x308, -0x301,0xef,0xe663,0x69,0x308,0x301,0xe622,0x4b,0x301,0xe622,0x6b,0x301,0xdc22,0x4b,0x323,0xdc22, -0x6b,0x323,0xdc22,0x4b,0x331,0xdc22,0x6b,0x331,0x1e36,0xe663,0x4c,0x323,0x304,0x1e37,0xe663,0x6c, -0x323,0x304,0xdc22,0x4c,0x331,0xdc22,0x6c,0x331,0xdc22,0x4c,0x32d,0xdc22,0x6c,0x32d,0xe622,0x4d, -0x301,0xe622,0x6d,0x301,0xe622,0x4d,0x307,0xe622,0x6d,0x307,0xdc02,0x4d,0x323,0xdc02,0x6d,0x323, -0xe622,0x4e,0x307,0xe622,0x6e,0x307,0xdc22,0x4e,0x323,0xdc22,0x6e,0x323,0xdc22,0x4e,0x331,0xdc22, -0x6e,0x331,0xdc22,0x4e,0x32d,0xdc22,0x6e,0x32d,0xd5,0xe663,0x4f,0x303,0x301,0xf5,0xe663,0x6f, -0x303,0x301,0xd5,0xe663,0x4f,0x303,0x308,0xf5,0xe663,0x6f,0x303,0x308,0x14c,0xe663,0x4f,0x304, -0x300,0x14d,0xe663,0x6f,0x304,0x300,0x14c,0xe663,0x4f,0x304,0x301,0x14d,0xe663,0x6f,0x304,0x301, -0xe602,0x50,0x301,0xe602,0x70,0x301,0xe602,0x50,0x307,0xe602,0x70,0x307,0xe622,0x52,0x307,0xe622, -0x72,0x307,0x1e5a,0xe663,0x52,0x323,0x304,0x1e5b,0xe663,0x72,0x323,0x304,0xdc22,0x52,0x331,0xdc22, -0x72,0x331,0xe622,0x53,0x307,0xe622,0x73,0x307,0x15a,0xe663,0x53,0x301,0x307,0x15b,0xe663,0x73, -0x301,0x307,0x160,0xe663,0x53,0x30c,0x307,0x161,0xe663,0x73,0x30c,0x307,0x1e62,0xe663,0x53,0x323, -0x307,0x1e63,0xe663,0x73,0x323,0x307,0xe622,0x54,0x307,0xe622,0x74,0x307,0xdc22,0x54,0x323,0xdc22, -0x74,0x323,0xdc22,0x54,0x331,0xdc22,0x74,0x331,0xdc22,0x54,0x32d,0xdc22,0x74,0x32d,0xdc22,0x55, -0x324,0xdc22,0x75,0x324,0xdc22,0x55,0x330,0xdc22,0x75,0x330,0xdc22,0x55,0x32d,0xdc22,0x75,0x32d, -0x168,0xe663,0x55,0x303,0x301,0x169,0xe663,0x75,0x303,0x301,0x16a,0xe663,0x55,0x304,0x308,0x16b, -0xe663,0x75,0x304,0x308,0xe622,0x56,0x303,0xe622,0x76,0x303,0xdc02,0x56,0x323,0xdc02,0x76,0x323, -0xe622,0x57,0x300,0xe622,0x77,0x300,0xe622,0x57,0x301,0xe622,0x77,0x301,0xe622,0x57,0x308,0xe622, -0x77,0x308,0xe622,0x57,0x307,0xe622,0x77,0x307,0xdc02,0x57,0x323,0xdc02,0x77,0x323,0xe602,0x58, -0x307,0xe602,0x78,0x307,0xe602,0x58,0x308,0xe602,0x78,0x308,0xe622,0x59,0x307,0xe622,0x79,0x307, -0xe622,0x5a,0x302,0xe622,0x7a,0x302,0xdc02,0x5a,0x323,0xdc02,0x7a,0x323,0xdc02,0x5a,0x331,0xdc02, -0x7a,0x331,0xdc22,0x68,0x331,0xe622,0x74,0x308,0xe622,0x77,0x30a,0xe622,0x79,0x30a,0xe602,0x17f, -0x307,0xe622,0x41,0x309,0xe622,0x61,0x309,0xc2,0xe663,0x41,0x302,0x301,0xe2,0xe663,0x61,0x302, -0x301,0xc2,0xe663,0x41,0x302,0x300,0xe2,0xe663,0x61,0x302,0x300,0xc2,0xe663,0x41,0x302,0x309, -0xe2,0xe663,0x61,0x302,0x309,0xc2,0xe663,0x41,0x302,0x303,0xe2,0xe663,0x61,0x302,0x303,0x1ea0, -0xe663,0x41,0x323,0x302,0x1ea1,0xe663,0x61,0x323,0x302,0x102,0xe663,0x41,0x306,0x301,0x103,0xe663, -0x61,0x306,0x301,0x102,0xe663,0x41,0x306,0x300,0x103,0xe663,0x61,0x306,0x300,0x102,0xe663,0x41, -0x306,0x309,0x103,0xe663,0x61,0x306,0x309,0x102,0xe663,0x41,0x306,0x303,0x103,0xe663,0x61,0x306, -0x303,0x1ea0,0xe663,0x41,0x323,0x306,0x1ea1,0xe663,0x61,0x323,0x306,0xe622,0x45,0x309,0xe622,0x65, -0x309,0xe622,0x45,0x303,0xe622,0x65,0x303,0xca,0xe663,0x45,0x302,0x301,0xea,0xe663,0x65,0x302, -0x301,0xca,0xe663,0x45,0x302,0x300,0xea,0xe663,0x65,0x302,0x300,0xca,0xe663,0x45,0x302,0x309, -0xea,0xe663,0x65,0x302,0x309,0xca,0xe663,0x45,0x302,0x303,0xea,0xe663,0x65,0x302,0x303,0x1eb8, -0xe663,0x45,0x323,0x302,0x1eb9,0xe663,0x65,0x323,0x302,0xe622,0x49,0x309,0xe622,0x69,0x309,0xdc22, -0x49,0x323,0xdc22,0x69,0x323,0xe622,0x4f,0x309,0xe622,0x6f,0x309,0xd4,0xe663,0x4f,0x302,0x301, -0xf4,0xe663,0x6f,0x302,0x301,0xd4,0xe663,0x4f,0x302,0x300,0xf4,0xe663,0x6f,0x302,0x300,0xd4, -0xe663,0x4f,0x302,0x309,0xf4,0xe663,0x6f,0x302,0x309,0xd4,0xe663,0x4f,0x302,0x303,0xf4,0xe663, -0x6f,0x302,0x303,0x1ecc,0xe663,0x4f,0x323,0x302,0x1ecd,0xe663,0x6f,0x323,0x302,0x1a0,0xe663,0x4f, -0x31b,0x301,0x1a1,0xe663,0x6f,0x31b,0x301,0x1a0,0xe663,0x4f,0x31b,0x300,0x1a1,0xe663,0x6f,0x31b, -0x300,0x1a0,0xe663,0x4f,0x31b,0x309,0x1a1,0xe663,0x6f,0x31b,0x309,0x1a0,0xe663,0x4f,0x31b,0x303, -0x1a1,0xe663,0x6f,0x31b,0x303,0x1a0,0xdc63,0x4f,0x31b,0x323,0x1a1,0xdc63,0x6f,0x31b,0x323,0xdc22, -0x55,0x323,0xdc22,0x75,0x323,0xe622,0x55,0x309,0xe622,0x75,0x309,0x1af,0xe663,0x55,0x31b,0x301, -0x1b0,0xe663,0x75,0x31b,0x301,0x1af,0xe663,0x55,0x31b,0x300,0x1b0,0xe663,0x75,0x31b,0x300,0x1af, -0xe663,0x55,0x31b,0x309,0x1b0,0xe663,0x75,0x31b,0x309,0x1af,0xe663,0x55,0x31b,0x303,0x1b0,0xe663, -0x75,0x31b,0x303,0x1af,0xdc63,0x55,0x31b,0x323,0x1b0,0xdc63,0x75,0x31b,0x323,0xe622,0x59,0x300, -0xe622,0x79,0x300,0xdc02,0x59,0x323,0xdc02,0x79,0x323,0xe622,0x59,0x309,0xe622,0x79,0x309,0xe622, -0x59,0x303,0xe622,0x79,0x303,0x1f10,0xe643,0x3b5,0x313,0x300,0x1f11,0xe643,0x3b5,0x314,0x300,0x1f10, -0xe643,0x3b5,0x313,0x301,0x1f11,0xe643,0x3b5,0x314,0x301,0x1f18,0xe643,0x395,0x313,0x300,0x1f19,0xe643, -0x395,0x314,0x300,0x1f18,0xe643,0x395,0x313,0x301,0x1f19,0xe643,0x395,0x314,0x301,0x1f30,0xe643,0x3b9, -0x313,0x300,0x1f31,0xe643,0x3b9,0x314,0x300,0x1f30,0xe643,0x3b9,0x313,0x301,0x1f31,0xe643,0x3b9,0x314, -0x301,0x1f30,0xe643,0x3b9,0x313,0x342,0x1f31,0xe643,0x3b9,0x314,0x342,0x1f38,0xe643,0x399,0x313,0x300, -0x1f39,0xe643,0x399,0x314,0x300,0x1f38,0xe643,0x399,0x313,0x301,0x1f39,0xe643,0x399,0x314,0x301,0x1f38, -0xe643,0x399,0x313,0x342,0x1f39,0xe643,0x399,0x314,0x342,0x1f40,0xe643,0x3bf,0x313,0x300,0x1f41,0xe643, -0x3bf,0x314,0x300,0x1f40,0xe643,0x3bf,0x313,0x301,0x1f41,0xe643,0x3bf,0x314,0x301,0x1f48,0xe643,0x39f, -0x313,0x300,0x1f49,0xe643,0x39f,0x314,0x300,0x1f48,0xe643,0x39f,0x313,0x301,0x1f49,0xe643,0x39f,0x314, -0x301,0x1f50,0xe643,0x3c5,0x313,0x300,0x1f51,0xe643,0x3c5,0x314,0x300,0x1f50,0xe643,0x3c5,0x313,0x301, -0x1f51,0xe643,0x3c5,0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x342,0x1f51,0xe643,0x3c5,0x314,0x342,0x1f59, -0xe643,0x3a5,0x314,0x300,0x1f59,0xe643,0x3a5,0x314,0x301,0x1f59,0xe643,0x3a5,0x314,0x342,0xe602,0x3b5, -0x300,0xe602,0x3b9,0x300,0xe602,0x3bf,0x300,0xe602,0x3c5,0x300,0x1f00,0xf063,0x3b1,0x313,0x345,0x1f01, -0xf063,0x3b1,0x314,0x345,0x1f02,0x345,2,0xf044,0x3b1,0x313,0x300,0x345,0x1f03,0x345,2,0xf044, -0x3b1,0x314,0x300,0x345,0x1f04,0x345,2,0xf044,0x3b1,0x313,0x301,0x345,0x1f05,0x345,2,0xf044, -0x3b1,0x314,0x301,0x345,0x1f06,0x345,2,0xf044,0x3b1,0x313,0x342,0x345,0x1f07,0x345,2,0xf044, -0x3b1,0x314,0x342,0x345,0x1f08,0xf063,0x391,0x313,0x345,0x1f09,0xf063,0x391,0x314,0x345,0x1f0a,0x345, -2,0xf044,0x391,0x313,0x300,0x345,0x1f0b,0x345,2,0xf044,0x391,0x314,0x300,0x345,0x1f0c,0x345, -2,0xf044,0x391,0x313,0x301,0x345,0x1f0d,0x345,2,0xf044,0x391,0x314,0x301,0x345,0x1f0e,0x345, -2,0xf044,0x391,0x313,0x342,0x345,0x1f0f,0x345,2,0xf044,0x391,0x314,0x342,0x345,0x1f20,0xf063, -0x3b7,0x313,0x345,0x1f21,0xf063,0x3b7,0x314,0x345,0x1f22,0x345,2,0xf044,0x3b7,0x313,0x300,0x345, -0x1f23,0x345,2,0xf044,0x3b7,0x314,0x300,0x345,0x1f24,0x345,2,0xf044,0x3b7,0x313,0x301,0x345, -0x1f25,0x345,2,0xf044,0x3b7,0x314,0x301,0x345,0x1f26,0x345,2,0xf044,0x3b7,0x313,0x342,0x345, -0x1f27,0x345,2,0xf044,0x3b7,0x314,0x342,0x345,0x1f28,0xf063,0x397,0x313,0x345,0x1f29,0xf063,0x397, -0x314,0x345,0x1f2a,0x345,2,0xf044,0x397,0x313,0x300,0x345,0x1f2b,0x345,2,0xf044,0x397,0x314, -0x300,0x345,0x1f2c,0x345,2,0xf044,0x397,0x313,0x301,0x345,0x1f2d,0x345,2,0xf044,0x397,0x314, -0x301,0x345,0x1f2e,0x345,2,0xf044,0x397,0x313,0x342,0x345,0x1f2f,0x345,2,0xf044,0x397,0x314, -0x342,0x345,0x1f60,0xf063,0x3c9,0x313,0x345,0x1f61,0xf063,0x3c9,0x314,0x345,0x1f62,0x345,2,0xf044, -0x3c9,0x313,0x300,0x345,0x1f63,0x345,2,0xf044,0x3c9,0x314,0x300,0x345,0x1f64,0x345,2,0xf044, -0x3c9,0x313,0x301,0x345,0x1f65,0x345,2,0xf044,0x3c9,0x314,0x301,0x345,0x1f66,0x345,2,0xf044, -0x3c9,0x313,0x342,0x345,0x1f67,0x345,2,0xf044,0x3c9,0x314,0x342,0x345,0x1f68,0xf063,0x3a9,0x313, -0x345,0x1f69,0xf063,0x3a9,0x314,0x345,0x1f6a,0x345,2,0xf044,0x3a9,0x313,0x300,0x345,0x1f6b,0x345, -2,0xf044,0x3a9,0x314,0x300,0x345,0x1f6c,0x345,2,0xf044,0x3a9,0x313,0x301,0x345,0x1f6d,0x345, -2,0xf044,0x3a9,0x314,0x301,0x345,0x1f6e,0x345,2,0xf044,0x3a9,0x313,0x342,0x345,0x1f6f,0x345, -2,0xf044,0x3a9,0x314,0x342,0x345,0xe602,0x3b1,0x306,0xe602,0x3b1,0x304,0x1f70,0xf043,0x3b1,0x300, -0x345,0xf022,0x3b1,0x345,0x3ac,0xf043,0x3b1,0x301,0x345,0x1fb6,0xf043,0x3b1,0x342,0x345,0xe602,0x391, -0x306,0xe602,0x391,0x304,0xe602,0x391,0x300,0xf022,0x391,0x345,0xe602,0xa8,0x342,0x1f74,0xf043,0x3b7, -0x300,0x345,0xf022,0x3b7,0x345,0x3ae,0xf043,0x3b7,0x301,0x345,0x1fc6,0xf043,0x3b7,0x342,0x345,0xe602, -0x395,0x300,0xe602,0x397,0x300,0xf022,0x397,0x345,0xe602,0x1fbf,0x300,0xe602,0x1fbf,0x301,0xe602,0x1fbf, -0x342,0xe602,0x3b9,0x306,0xe602,0x3b9,0x304,0x3ca,0xe643,0x3b9,0x308,0x300,0xe602,0x3b9,0x342,0x3ca, -0xe643,0x3b9,0x308,0x342,0xe602,0x399,0x306,0xe602,0x399,0x304,0xe602,0x399,0x300,0xe602,0x1ffe,0x300, -0xe602,0x1ffe,0x301,0xe602,0x1ffe,0x342,0xe602,0x3c5,0x306,0xe602,0x3c5,0x304,0x3cb,0xe643,0x3c5,0x308, -0x300,0xe602,0x3c1,0x313,0xe602,0x3c1,0x314,0xe602,0x3c5,0x342,0x3cb,0xe643,0x3c5,0x308,0x342,0xe602, -0x3a5,0x306,0xe602,0x3a5,0x304,0xe602,0x3a5,0x300,0xe602,0x3a1,0x314,0xe602,0xa8,0x300,0x1f7c,0xf043, -0x3c9,0x300,0x345,0xf022,0x3c9,0x345,0x3ce,0xf043,0x3c9,0x301,0x345,0x1ff6,0xf043,0x3c9,0x342,0x345, -0xe602,0x39f,0x300,0xe602,0x3a9,0x300,0xf022,0x3a9,0x345,0x102,0x2190,0x338,0x102,0x2192,0x338,0x102, -0x2194,0x338,0x102,0x21d0,0x338,0x102,0x21d4,0x338,0x102,0x21d2,0x338,0x102,0x2203,0x338,0x102,0x2208, -0x338,0x102,0x220b,0x338,0x102,0x2223,0x338,0x102,0x2225,0x338,0x102,0x223c,0x338,0x102,0x2243,0x338, -0x102,0x2245,0x338,0x102,0x2248,0x338,0x102,0x3d,0x338,0x102,0x2261,0x338,0x102,0x224d,0x338,0x102, -0x3c,0x338,0x102,0x3e,0x338,0x102,0x2264,0x338,0x102,0x2265,0x338,0x102,0x2272,0x338,0x102,0x2273, -0x338,0x102,0x2276,0x338,0x102,0x2277,0x338,0x102,0x227a,0x338,0x102,0x227b,0x338,0x102,0x2282,0x338, -0x102,0x2283,0x338,0x102,0x2286,0x338,0x102,0x2287,0x338,0x102,0x22a2,0x338,0x102,0x22a8,0x338,0x102, -0x22a9,0x338,0x102,0x22ab,0x338,0x102,0x227c,0x338,0x102,0x227d,0x338,0x102,0x2291,0x338,0x102,0x2292, -0x338,0x102,0x22b2,0x338,0x102,0x22b3,0x338,0x102,0x22b4,0x338,0x102,0x22b5,0x338,0x802,0x304b,0x3099, -0x802,0x304d,0x3099,0x802,0x304f,0x3099,0x802,0x3051,0x3099,0x802,0x3053,0x3099,0x802,0x3055,0x3099,0x802, -0x3057,0x3099,0x802,0x3059,0x3099,0x802,0x305b,0x3099,0x802,0x305d,0x3099,0x802,0x305f,0x3099,0x802,0x3061, -0x3099,0x802,0x3064,0x3099,0x802,0x3066,0x3099,0x802,0x3068,0x3099,0x802,0x306f,0x3099,0x802,0x306f,0x309a, -0x802,0x3072,0x3099,0x802,0x3072,0x309a,0x802,0x3075,0x3099,0x802,0x3075,0x309a,0x802,0x3078,0x3099,0x802, -0x3078,0x309a,0x802,0x307b,0x3099,0x802,0x307b,0x309a,0x802,0x3046,0x3099,0x802,0x309d,0x3099,0x802,0x30ab, -0x3099,0x802,0x30ad,0x3099,0x802,0x30af,0x3099,0x802,0x30b1,0x3099,0x802,0x30b3,0x3099,0x802,0x30b5,0x3099, -0x802,0x30b7,0x3099,0x802,0x30b9,0x3099,0x802,0x30bb,0x3099,0x802,0x30bd,0x3099,0x802,0x30bf,0x3099,0x802, -0x30c1,0x3099,0x802,0x30c4,0x3099,0x802,0x30c6,0x3099,0x802,0x30c8,0x3099,0x802,0x30cf,0x3099,0x802,0x30cf, -0x309a,0x802,0x30d2,0x3099,0x802,0x30d2,0x309a,0x802,0x30d5,0x3099,0x802,0x30d5,0x309a,0x802,0x30d8,0x3099, -0x802,0x30d8,0x309a,0x802,0x30db,0x3099,0x802,0x30db,0x309a,0x802,0x30a6,0x3099,0x802,0x30ef,0x3099,0x802, -0x30f0,0x3099,0x802,0x30f1,0x3099,0x802,0x30f2,0x3099,0x802,0x30fd,0x3099,0x704,0xd804,0xdc99,0xd804,0xdcba, -0x704,0xd804,0xdc9b,0xd804,0xdcba,0x704,0xd804,0xdca5,0xd804,0xdcba,4,0xd804,0xdd31,0xd804,0xdd27,4, -0xd804,0xdd32,0xd804,0xdd27,4,0xd804,0xdf47,0xd804,0xdf3e,4,0xd804,0xdf47,0xd804,0xdf57,4,0xd805, -0xdcb9,0xd805,0xdcba,4,0xd805,0xdcb9,0xd805,0xdcb0,4,0xd805,0xdcb9,0xd805,0xdcbd,4,0xd805,0xddb8, -0xd805,0xddaf,4,0xd805,0xddb9,0xd805,0xddaf,0xe6e6,0xe6a1,0x300,0xe6e6,0xe6a1,0x301,0xe6e6,0xe6a1,0x313, -0xe6e6,0xe6a2,0x308,0x301,1,0x2b9,1,0x3b,1,0xb7,0x702,0x915,0x93c,0x702,0x916,0x93c, -0x702,0x917,0x93c,0x702,0x91c,0x93c,0x702,0x921,0x93c,0x702,0x922,0x93c,0x702,0x92b,0x93c,0x702, -0x92f,0x93c,0x702,0x9a1,0x9bc,0x702,0x9a2,0x9bc,0x702,0x9af,0x9bc,0x702,0xa32,0xa3c,0x702,0xa38, -0xa3c,0x702,0xa16,0xa3c,0x702,0xa17,0xa3c,0x702,0xa1c,0xa3c,0x702,0xa2b,0xa3c,0x702,0xb21,0xb3c, -0x702,0xb22,0xb3c,2,0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7,2,0xf56,0xfb7,2, -0xf5b,0xfb7,2,0xf40,0xfb5,0x8100,0x82a2,0xf71,0xf72,0x8100,0x84a2,0xf71,0xf74,0x8202,0xfb2,0xf80, -0x8202,0xfb3,0xf80,0x8100,0x82a2,0xf71,0xf80,2,0xf92,0xfb7,2,0xf9c,0xfb7,2,0xfa1,0xfb7, -2,0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90,0xfb5,0x3ac,0xe662,0x3b1,0x301,0x3ad,0xe642,0x3b5, -0x301,0x3ae,0xe662,0x3b7,0x301,0x3af,0xe642,0x3b9,0x301,0x3cc,0xe642,0x3bf,0x301,0x3cd,0xe642,0x3c5, -0x301,0x3ce,0xe662,0x3c9,0x301,0x386,0xe642,0x391,0x301,0x21,0x3b9,0x388,0xe642,0x395,0x301,0x389, -0xe642,0x397,0x301,0x390,1,0xe643,0x3b9,0x308,0x301,0x38a,0xe642,0x399,0x301,0x3b0,1,0xe643, -0x3c5,0x308,0x301,0x38e,0xe642,0x3a5,0x301,0x385,0xe642,0xa8,0x301,1,0x60,0x38c,0xe642,0x39f, -0x301,0x38f,0xe642,0x3a9,0x301,1,0xb4,0x21,0x3a9,0x21,0x4b,0xc5,0xe662,0x41,0x30a,1, -0x3008,1,0x3009,0x102,0x2add,0x338,1,0x8c48,1,0x66f4,1,0x8eca,1,0x8cc8,1,0x6ed1, -1,0x4e32,1,0x53e5,1,0x9f9c,1,0x5951,1,0x91d1,1,0x5587,1,0x5948,1,0x61f6, -1,0x7669,1,0x7f85,1,0x863f,1,0x87ba,1,0x88f8,1,0x908f,1,0x6a02,1,0x6d1b, -1,0x70d9,1,0x73de,1,0x843d,1,0x916a,1,0x99f1,1,0x4e82,1,0x5375,1,0x6b04, -1,0x721b,1,0x862d,1,0x9e1e,1,0x5d50,1,0x6feb,1,0x85cd,1,0x8964,1,0x62c9, -1,0x81d8,1,0x881f,1,0x5eca,1,0x6717,1,0x6d6a,1,0x72fc,1,0x90ce,1,0x4f86, -1,0x51b7,1,0x52de,1,0x64c4,1,0x6ad3,1,0x7210,1,0x76e7,1,0x8001,1,0x8606, -1,0x865c,1,0x8def,1,0x9732,1,0x9b6f,1,0x9dfa,1,0x788c,1,0x797f,1,0x7da0, -1,0x83c9,1,0x9304,1,0x9e7f,1,0x8ad6,1,0x58df,1,0x5f04,1,0x7c60,1,0x807e, -1,0x7262,1,0x78ca,1,0x8cc2,1,0x96f7,1,0x58d8,1,0x5c62,1,0x6a13,1,0x6dda, -1,0x6f0f,1,0x7d2f,1,0x7e37,1,0x964b,1,0x52d2,1,0x808b,1,0x51dc,1,0x51cc, -1,0x7a1c,1,0x7dbe,1,0x83f1,1,0x9675,1,0x8b80,1,0x62cf,1,0x8afe,1,0x4e39, -1,0x5be7,1,0x6012,1,0x7387,1,0x7570,1,0x5317,1,0x78fb,1,0x4fbf,1,0x5fa9, -1,0x4e0d,1,0x6ccc,1,0x6578,1,0x7d22,1,0x53c3,1,0x585e,1,0x7701,1,0x8449, -1,0x8aaa,1,0x6bba,1,0x8fb0,1,0x6c88,1,0x62fe,1,0x82e5,1,0x63a0,1,0x7565, -1,0x4eae,1,0x5169,1,0x51c9,1,0x6881,1,0x7ce7,1,0x826f,1,0x8ad2,1,0x91cf, -1,0x52f5,1,0x5442,1,0x5973,1,0x5eec,1,0x65c5,1,0x6ffe,1,0x792a,1,0x95ad, -1,0x9a6a,1,0x9e97,1,0x9ece,1,0x529b,1,0x66c6,1,0x6b77,1,0x8f62,1,0x5e74, -1,0x6190,1,0x6200,1,0x649a,1,0x6f23,1,0x7149,1,0x7489,1,0x79ca,1,0x7df4, -1,0x806f,1,0x8f26,1,0x84ee,1,0x9023,1,0x934a,1,0x5217,1,0x52a3,1,0x54bd, -1,0x70c8,1,0x88c2,1,0x5ec9,1,0x5ff5,1,0x637b,1,0x6bae,1,0x7c3e,1,0x7375, -1,0x4ee4,1,0x56f9,1,0x5dba,1,0x601c,1,0x73b2,1,0x7469,1,0x7f9a,1,0x8046, -1,0x9234,1,0x96f6,1,0x9748,1,0x9818,1,0x4f8b,1,0x79ae,1,0x91b4,1,0x96b8, -1,0x60e1,1,0x4e86,1,0x50da,1,0x5bee,1,0x5c3f,1,0x6599,1,0x71ce,1,0x7642, -1,0x84fc,1,0x907c,1,0x9f8d,1,0x6688,1,0x962e,1,0x5289,1,0x677b,1,0x67f3, -1,0x6d41,1,0x6e9c,1,0x7409,1,0x7559,1,0x786b,1,0x7d10,1,0x985e,1,0x516d, -1,0x622e,1,0x9678,1,0x502b,1,0x5d19,1,0x6dea,1,0x8f2a,1,0x5f8b,1,0x6144, -1,0x6817,1,0x9686,1,0x5229,1,0x540f,1,0x5c65,1,0x6613,1,0x674e,1,0x68a8, -1,0x6ce5,1,0x7406,1,0x75e2,1,0x7f79,1,0x88cf,1,0x88e1,1,0x91cc,1,0x96e2, -1,0x533f,1,0x6eba,1,0x541d,1,0x71d0,1,0x7498,1,0x85fa,1,0x96a3,1,0x9c57, -1,0x9e9f,1,0x6797,1,0x6dcb,1,0x81e8,1,0x7acb,1,0x7b20,1,0x7c92,1,0x72c0, -1,0x7099,1,0x8b58,1,0x4ec0,1,0x8336,1,0x523a,1,0x5207,1,0x5ea6,1,0x62d3, -1,0x7cd6,1,0x5b85,1,0x6d1e,1,0x66b4,1,0x8f3b,1,0x884c,1,0x964d,1,0x898b, -1,0x5ed3,1,0x5140,1,0x55c0,1,0x585a,1,0x6674,1,0x51de,1,0x732a,1,0x76ca, -1,0x793c,1,0x795e,1,0x7965,1,0x798f,1,0x9756,1,0x7cbe,1,0x7fbd,1,0x8612, -1,0x8af8,1,0x9038,1,0x90fd,1,0x98ef,1,0x98fc,1,0x9928,1,0x9db4,1,0x90de, -1,0x96b7,1,0x4fae,1,0x50e7,1,0x514d,1,0x52c9,1,0x52e4,1,0x5351,1,0x559d, -1,0x5606,1,0x5668,1,0x5840,1,0x58a8,1,0x5c64,1,0x5c6e,1,0x6094,1,0x6168, -1,0x618e,1,0x61f2,1,0x654f,1,0x65e2,1,0x6691,1,0x6885,1,0x6d77,1,0x6e1a, -1,0x6f22,1,0x716e,1,0x722b,1,0x7422,1,0x7891,1,0x793e,1,0x7949,1,0x7948, -1,0x7950,1,0x7956,1,0x795d,1,0x798d,1,0x798e,1,0x7a40,1,0x7a81,1,0x7bc0, -1,0x7e09,1,0x7e41,1,0x7f72,1,0x8005,1,0x81ed,1,0x8279,1,0x8457,1,0x8910, -1,0x8996,1,0x8b01,1,0x8b39,1,0x8cd3,1,0x8d08,1,0x8fb6,1,0x96e3,1,0x97ff, -1,0x983b,1,0x6075,2,0xd850,0xdeee,1,0x8218,1,0x4e26,1,0x51b5,1,0x5168,1, -0x4f80,1,0x5145,1,0x5180,1,0x52c7,1,0x52fa,1,0x5555,1,0x5599,1,0x55e2,1, -0x58b3,1,0x5944,1,0x5954,1,0x5a62,1,0x5b28,1,0x5ed2,1,0x5ed9,1,0x5f69,1, -0x5fad,1,0x60d8,1,0x614e,1,0x6108,1,0x6160,1,0x6234,1,0x63c4,1,0x641c,1, -0x6452,1,0x6556,1,0x671b,1,0x6756,1,0x6b79,1,0x6edb,1,0x6ecb,1,0x701e,1, -0x77a7,1,0x7235,1,0x72af,1,0x7471,1,0x7506,1,0x753b,1,0x761d,1,0x761f,1, -0x76db,1,0x76f4,1,0x774a,1,0x7740,1,0x78cc,1,0x7ab1,1,0x7c7b,1,0x7d5b,1, -0x7f3e,1,0x8352,1,0x83ef,1,0x8779,1,0x8941,1,0x8986,1,0x8abf,1,0x8acb,1, -0x8aed,1,0x8b8a,1,0x8f38,1,0x9072,1,0x9199,1,0x9276,1,0x967c,1,0x97db,1, -0x980b,1,0x9b12,2,0xd84a,0xdc4a,2,0xd84a,0xdc44,2,0xd84c,0xdfd5,1,0x3b9d,1,0x4018, -1,0x4039,2,0xd854,0xde49,2,0xd857,0xdcd0,2,0xd85f,0xded3,1,0x9f43,1,0x9f8e,0xe02, -0x5d9,0x5b4,0x1102,0x5f2,0x5b7,0x1802,0x5e9,0x5c1,0x1902,0x5e9,0x5c2,0xfb49,0x1843,0x5e9,0x5bc,0x5c1, -0xfb49,0x1943,0x5e9,0x5bc,0x5c2,0x1102,0x5d0,0x5b7,0x1202,0x5d0,0x5b8,0x1502,0x5d0,0x5bc,0x1502,0x5d1, -0x5bc,0x1502,0x5d2,0x5bc,0x1502,0x5d3,0x5bc,0x1502,0x5d4,0x5bc,0x1502,0x5d5,0x5bc,0x1502,0x5d6,0x5bc, -0x1502,0x5d8,0x5bc,0x1502,0x5d9,0x5bc,0x1502,0x5da,0x5bc,0x1502,0x5db,0x5bc,0x1502,0x5dc,0x5bc,0x1502, -0x5de,0x5bc,0x1502,0x5e0,0x5bc,0x1502,0x5e1,0x5bc,0x1502,0x5e3,0x5bc,0x1502,0x5e4,0x5bc,0x1502,0x5e6, -0x5bc,0x1502,0x5e7,0x5bc,0x1502,0x5e8,0x5bc,0x1502,0x5e9,0x5bc,0x1502,0x5ea,0x5bc,0x1302,0x5d5,0x5b9, -0x1702,0x5d1,0x5bf,0x1702,0x5db,0x5bf,0x1702,0x5e4,0x5bf,0xd804,0xd834,0xdd57,0xd834,0xdd65,0xd804,0xd834, -0xdd58,0xd834,0xdd65,0xd834,0xdd5f,0xd834,0xdd6e,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6e,0xd834, -0xdd5f,0xd834,0xdd6f,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xdd5f,0xd834,0xdd70,4, -0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd70,0xd834,0xdd5f,0xd834,0xdd71,4,0xd846,0xd834,0xdd58,0xd834, -0xdd65,0xd834,0xdd71,0xd834,0xdd5f,0xd834,0xdd72,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd72,0xd804, -0xd834,0xddb9,0xd834,0xdd65,0xd804,0xd834,0xddba,0xd834,0xdd65,0xd834,0xddbb,0xd834,0xdd6e,4,0xd846,0xd834, -0xddb9,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xddbc,0xd834,0xdd6e,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834, -0xdd6e,0xd834,0xddbb,0xd834,0xdd6f,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xddbc,0xd834, -0xdd6f,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834,0xdd6f,1,0x4e3d,1,0x4e38,1,0x4e41,2, -0xd840,0xdd22,1,0x4f60,1,0x4fbb,1,0x5002,1,0x507a,1,0x5099,1,0x50cf,1,0x349e, -2,0xd841,0xde3a,1,0x5154,1,0x5164,1,0x5177,2,0xd841,0xdd1c,1,0x34b9,1,0x5167, -1,0x518d,2,0xd841,0xdd4b,1,0x5197,1,0x51a4,1,0x4ecc,1,0x51ac,2,0xd864,0xdddf, -1,0x51f5,1,0x5203,1,0x34df,1,0x523b,1,0x5246,1,0x5272,1,0x5277,1,0x3515, -1,0x5305,1,0x5306,1,0x5349,1,0x535a,1,0x5373,1,0x537d,1,0x537f,2,0xd842, -0xde2c,1,0x7070,1,0x53ca,1,0x53df,2,0xd842,0xdf63,1,0x53eb,1,0x53f1,1,0x5406, -1,0x549e,1,0x5438,1,0x5448,1,0x5468,1,0x54a2,1,0x54f6,1,0x5510,1,0x5553, -1,0x5563,1,0x5584,1,0x55ab,1,0x55b3,1,0x55c2,1,0x5716,1,0x5717,1,0x5651, -1,0x5674,1,0x58ee,1,0x57ce,1,0x57f4,1,0x580d,1,0x578b,1,0x5832,1,0x5831, -1,0x58ac,2,0xd845,0xdce4,1,0x58f2,1,0x58f7,1,0x5906,1,0x591a,1,0x5922,1, -0x5962,2,0xd845,0xdea8,2,0xd845,0xdeea,1,0x59ec,1,0x5a1b,1,0x5a27,1,0x59d8,1, -0x5a66,1,0x36ee,1,0x36fc,1,0x5b08,1,0x5b3e,2,0xd846,0xddc8,1,0x5bc3,1,0x5bd8, -1,0x5bf3,2,0xd846,0xdf18,1,0x5bff,1,0x5c06,1,0x5f53,1,0x5c22,1,0x3781,1, -0x5c60,1,0x5cc0,1,0x5c8d,2,0xd847,0xdde4,1,0x5d43,2,0xd847,0xdde6,1,0x5d6e,1, -0x5d6b,1,0x5d7c,1,0x5de1,1,0x5de2,1,0x382f,1,0x5dfd,1,0x5e28,1,0x5e3d,1, -0x5e69,1,0x3862,2,0xd848,0xdd83,1,0x387c,1,0x5eb0,1,0x5eb3,1,0x5eb6,2,0xd868, -0xdf92,1,0x5efe,2,0xd848,0xdf31,1,0x8201,1,0x5f22,1,0x38c7,2,0xd84c,0xdeb8,2, -0xd858,0xddda,1,0x5f62,1,0x5f6b,1,0x38e3,1,0x5f9a,1,0x5fcd,1,0x5fd7,1,0x5ff9, -1,0x6081,1,0x393a,1,0x391c,2,0xd849,0xded4,1,0x60c7,1,0x6148,1,0x614c,1, -0x617a,1,0x61b2,1,0x61a4,1,0x61af,1,0x61de,1,0x6210,1,0x621b,1,0x625d,1, -0x62b1,1,0x62d4,1,0x6350,2,0xd84a,0xdf0c,1,0x633d,1,0x62fc,1,0x6368,1,0x6383, -1,0x63e4,2,0xd84a,0xdff1,1,0x6422,1,0x63c5,1,0x63a9,1,0x3a2e,1,0x6469,1, -0x647e,1,0x649d,1,0x6477,1,0x3a6c,1,0x656c,2,0xd84c,0xdc0a,1,0x65e3,1,0x66f8, -1,0x6649,1,0x3b19,1,0x3b08,1,0x3ae4,1,0x5192,1,0x5195,1,0x6700,1,0x669c, -1,0x80ad,1,0x43d9,1,0x6721,1,0x675e,1,0x6753,2,0xd84c,0xdfc3,1,0x3b49,1, -0x67fa,1,0x6785,1,0x6852,2,0xd84d,0xdc6d,1,0x688e,1,0x681f,1,0x6914,1,0x6942, -1,0x69a3,1,0x69ea,1,0x6aa8,2,0xd84d,0xdea3,1,0x6adb,1,0x3c18,1,0x6b21,2, -0xd84e,0xdca7,1,0x6b54,1,0x3c4e,1,0x6b72,1,0x6b9f,1,0x6bbb,2,0xd84e,0xde8d,2, -0xd847,0xdd0b,2,0xd84e,0xdefa,1,0x6c4e,2,0xd84f,0xdcbc,1,0x6cbf,1,0x6ccd,1,0x6c67, -1,0x6d16,1,0x6d3e,1,0x6d69,1,0x6d78,1,0x6d85,2,0xd84f,0xdd1e,1,0x6d34,1, -0x6e2f,1,0x6e6e,1,0x3d33,1,0x6ec7,2,0xd84f,0xded1,1,0x6df9,1,0x6f6e,2,0xd84f, -0xdf5e,2,0xd84f,0xdf8e,1,0x6fc6,1,0x7039,1,0x701b,1,0x3d96,1,0x704a,1,0x707d, -1,0x7077,1,0x70ad,2,0xd841,0xdd25,1,0x7145,2,0xd850,0xde63,1,0x719c,2,0xd850, -0xdfab,1,0x7228,1,0x7250,2,0xd851,0xde08,1,0x7280,1,0x7295,2,0xd851,0xdf35,2, -0xd852,0xdc14,1,0x737a,1,0x738b,1,0x3eac,1,0x73a5,1,0x3eb8,1,0x7447,1,0x745c, -1,0x7485,1,0x74ca,1,0x3f1b,1,0x7524,2,0xd853,0xdc36,1,0x753e,2,0xd853,0xdc92, -2,0xd848,0xdd9f,1,0x7610,2,0xd853,0xdfa1,2,0xd853,0xdfb8,2,0xd854,0xdc44,1,0x3ffc, -1,0x4008,2,0xd854,0xdcf3,2,0xd854,0xdcf2,2,0xd854,0xdd19,2,0xd854,0xdd33,1,0x771e, -1,0x771f,1,0x778b,1,0x4046,1,0x4096,2,0xd855,0xdc1d,1,0x784e,1,0x40e3,2, -0xd855,0xde26,2,0xd855,0xde9a,2,0xd855,0xdec5,1,0x79eb,1,0x412f,1,0x7a4a,1,0x7a4f, -2,0xd856,0xdd7c,2,0xd856,0xdea7,1,0x7aee,1,0x4202,2,0xd856,0xdfab,1,0x7bc6,1, -0x7bc9,1,0x4227,2,0xd857,0xdc80,1,0x7cd2,1,0x42a0,1,0x7ce8,1,0x7ce3,1,0x7d00, -2,0xd857,0xdf86,1,0x7d63,1,0x4301,1,0x7dc7,1,0x7e02,1,0x7e45,1,0x4334,2, -0xd858,0xde28,2,0xd858,0xde47,1,0x4359,2,0xd858,0xded9,1,0x7f7a,2,0xd858,0xdf3e,1, -0x7f95,1,0x7ffa,2,0xd859,0xdcda,2,0xd859,0xdd23,1,0x8060,2,0xd859,0xdda8,1,0x8070, -2,0xd84c,0xdf5f,1,0x43d5,1,0x80b2,1,0x8103,1,0x440b,1,0x813e,1,0x5ab5,2, -0xd859,0xdfa7,2,0xd859,0xdfb5,2,0xd84c,0xdf93,2,0xd84c,0xdf9c,1,0x8204,1,0x8f9e,1, -0x446b,1,0x8291,1,0x828b,1,0x829d,1,0x52b3,1,0x82b1,1,0x82b3,1,0x82bd,1, -0x82e6,2,0xd85a,0xdf3c,1,0x831d,1,0x8363,1,0x83ad,1,0x8323,1,0x83bd,1,0x83e7, -1,0x8353,1,0x83ca,1,0x83cc,1,0x83dc,2,0xd85b,0xdc36,2,0xd85b,0xdd6b,2,0xd85b, -0xdcd5,1,0x452b,1,0x84f1,1,0x84f3,1,0x8516,2,0xd85c,0xdfca,1,0x8564,2,0xd85b, -0xdf2c,1,0x455d,1,0x4561,2,0xd85b,0xdfb1,2,0xd85c,0xdcd2,1,0x456b,1,0x8650,1, -0x8667,1,0x8669,1,0x86a9,1,0x8688,1,0x870e,1,0x86e2,1,0x8728,1,0x876b,1, -0x8786,1,0x45d7,1,0x87e1,1,0x8801,1,0x45f9,1,0x8860,1,0x8863,2,0xd85d,0xde67, -1,0x88d7,1,0x88de,1,0x4635,1,0x88fa,1,0x34bb,2,0xd85e,0xdcae,2,0xd85e,0xdd66, -1,0x46be,1,0x46c7,1,0x8aa0,1,0x8c55,2,0xd85f,0xdca8,1,0x8cab,1,0x8cc1,1, -0x8d1b,1,0x8d77,2,0xd85f,0xdf2f,2,0xd842,0xdc04,1,0x8dcb,1,0x8dbc,1,0x8df0,2, -0xd842,0xdcde,1,0x8ed4,2,0xd861,0xddd2,2,0xd861,0xdded,1,0x9094,1,0x90f1,1,0x9111, -2,0xd861,0xdf2e,1,0x911b,1,0x9238,1,0x92d7,1,0x92d8,1,0x927c,1,0x93f9,1, -0x9415,2,0xd862,0xdffa,1,0x958b,1,0x4995,1,0x95b7,2,0xd863,0xdd77,1,0x49e6,1, -0x96c3,1,0x5db2,1,0x9723,2,0xd864,0xdd45,2,0xd864,0xde1a,1,0x4a6e,1,0x4a76,1, -0x97e0,2,0xd865,0xdc0a,1,0x4ab2,2,0xd865,0xdc96,1,0x9829,2,0xd865,0xddb6,1,0x98e2, -1,0x4b33,1,0x9929,1,0x99a7,1,0x99c2,1,0x99fe,1,0x4bce,2,0xd866,0xdf30,1, -0x9c40,1,0x9cfd,1,0x4cce,1,0x4ced,1,0x9d67,2,0xd868,0xdcce,1,0x4cf8,2,0xd868, -0xdd05,2,0xd868,0xde0e,2,0xd868,0xde91,1,0x9ebb,1,0x4d56,1,0x9ef9,1,0x9efe,1, -0x9f05,1,0x9f0f,1,0x9f16,1,0x9f3b,2,0xd869,0xde00 +0x2c02,0x2978,0x348b,0x2e82,0x2976,0xb48b,0x2f42,0x297c,0xb48b,0x6bc2,0x2b74,0xb48b,0x6bc2,0x2b76,2,0xe602, +0x41,0x302,0x600,0x3d4c,0x602,0x3d48,0x606,0x3d54,0x8612,0x3d50,0xe602,0x41,0x308,0x8608,0x3bc,0xe602, +0x41,0x30a,0x8602,0x3f4,0xca02,0x43,0x327,0x8602,0x3c10,0xe602,0x45,0x302,0x600,0x3d80,0x602,0x3d7c, +0x606,0x3d88,0x8612,0x3d84,0xe602,0x49,0x308,0x8602,0x3c5c,0xe602,0x4f,0x302,0x600,0x3da4,0x602,0x3da0, +0x606,0x3dac,0x8612,0x3da8,0xe602,0x4f,0x303,0x602,0x3c98,0x608,0x458,0x8610,0x3c9c,0xe602,0x4f,0x308, +0x8608,0x454,0xe602,0x55,0x308,0x600,0x3b6,0x602,0x3ae,0x608,0x3aa,0x8618,0x3b2,0xe602,0x61,0x302, +0x600,0x3d4e,0x602,0x3d4a,0x606,0x3d56,0x8612,0x3d52,0xe602,0x61,0x308,0x8608,0x3be,0xe602,0x61,0x30a, +0x8602,0x3f6,0xca02,0x63,0x327,0x8602,0x3c12,0xe602,0x65,0x302,0x600,0x3d82,0x602,0x3d7e,0x606,0x3d8a, +0x8612,0x3d86,0xe602,0x69,0x308,0x8602,0x3c5e,0xe602,0x6f,0x302,0x600,0x3da6,0x602,0x3da2,0x606,0x3dae, +0x8612,0x3daa,0xe602,0x6f,0x303,0x602,0x3c9a,0x608,0x45a,0x8610,0x3c9e,0xe602,0x6f,0x308,0x8608,0x456, +0xe602,0x75,0x308,0x600,0x3b8,0x602,0x3b0,0x608,0x3ac,0x8618,0x3b4,0xe602,0x41,0x306,0x600,0x3d60, +0x602,0x3d5c,0x606,0x3d68,0x8612,0x3d64,0xe602,0x61,0x306,0x600,0x3d62,0x602,0x3d5e,0x606,0x3d6a,0x8612, +0x3d66,0xe602,0x45,0x304,0x600,0x3c28,0x8602,0x3c2c,0xe602,0x65,0x304,0x600,0x3c2a,0x8602,0x3c2e,0xe602, +0x4f,0x304,0x600,0x3ca0,0x8602,0x3ca4,0xe602,0x6f,0x304,0x600,0x3ca2,0x8602,0x3ca6,0xe602,0x53,0x301, +0x860e,0x3cc8,0xe602,0x73,0x301,0x860e,0x3cca,0xe602,0x53,0x30c,0x860e,0x3ccc,0xe602,0x73,0x30c,0x860e, +0x3cce,0xe602,0x55,0x303,0x8602,0x3cf0,0xe602,0x75,0x303,0x8602,0x3cf2,0xe602,0x55,0x304,0x8610,0x3cf4, +0xe602,0x75,0x304,0x8610,0x3cf6,0xd802,0x4f,0x31b,0x600,0x3db8,0x602,0x3db4,0x606,0x3dc0,0x612,0x3dbc, +0x8646,0x3dc4,0xd802,0x6f,0x31b,0x600,0x3dba,0x602,0x3db6,0x606,0x3dc2,0x612,0x3dbe,0x8646,0x3dc6,0xd802, +0x55,0x31b,0x600,0x3dd4,0x602,0x3dd0,0x606,0x3ddc,0x612,0x3dd8,0x8646,0x3de0,0xd802,0x75,0x31b,0x600, +0x3dd6,0x602,0x3dd2,0x606,0x3dde,0x612,0x3dda,0x8646,0x3de2,0xca02,0x4f,0x328,0x8608,0x3d8,0xca02,0x6f, +0x328,0x8608,0x3da,0xe602,0x41,0x307,0x8608,0x3c0,0xe602,0x61,0x307,0x8608,0x3c2,0xca02,0x45,0x327, +0x860c,0x3c38,0xca02,0x65,0x327,0x860c,0x3c3a,0xe602,0x4f,0x307,0x8608,0x460,0xe602,0x6f,0x307,0x8608, +0x462,0xe602,0x3b1,0x301,0x868a,0x3f68,0xe602,0x3b7,0x301,0x868a,0x3f88,0xe602,0x3b9,0x308,0x600,0x3fa4, +0x602,0x720,0x8684,0x3fae,0xe602,0x3c5,0x308,0x600,0x3fc4,0x602,0x760,0x8684,0x3fce,0xe602,0x3c9,0x301, +0x868a,0x3fe8,2,0xcc6,0xcc2,0x99aa,0x1996,2,0xdd9,0xdcf,0x9b94,0x1bba,0xdc02,0x4c,0x323,0x8608, +0x3c70,0xdc02,0x6c,0x323,0x8608,0x3c72,0xdc02,0x52,0x323,0x8608,0x3cb8,0xdc02,0x72,0x323,0x8608,0x3cba, +0xdc02,0x53,0x323,0x860e,0x3cd0,0xdc02,0x73,0x323,0x860e,0x3cd2,0xdc02,0x41,0x323,0x604,0x3d58,0x860c, +0x3d6c,0xdc02,0x61,0x323,0x604,0x3d5a,0x860c,0x3d6e,0xdc02,0x45,0x323,0x8604,0x3d8c,0xdc02,0x65,0x323, +0x8604,0x3d8e,0xdc02,0x4f,0x323,0x8604,0x3db0,0xdc02,0x6f,0x323,0x8604,0x3db2,0xe602,0x3b1,0x313,0x600, +0x3e05,0x602,0x3e09,0x684,0x3e0d,0x868a,0x3f00,0xe602,0x3b1,0x314,0x600,0x3e07,0x602,0x3e0b,0x684,0x3e0f, +0x868a,0x3f02,0x1f00,0xe643,0x3b1,0x313,0x300,0x868a,0x3f04,0x1f01,0xe643,0x3b1,0x314,0x300,0x868a,0x3f06, +0x1f00,0xe643,0x3b1,0x313,0x301,0x868a,0x3f08,0x1f01,0xe643,0x3b1,0x314,0x301,0x868a,0x3f0a,0x1f00,0xe643, +0x3b1,0x313,0x342,0x868a,0x3f0c,0x1f01,0xe643,0x3b1,0x314,0x342,0x868a,0x3f0e,0xe602,0x391,0x313,0x600, +0x3e15,0x602,0x3e19,0x684,0x3e1d,0x868a,0x3f10,0xe602,0x391,0x314,0x600,0x3e17,0x602,0x3e1b,0x684,0x3e1f, +0x868a,0x3f12,0x1f08,0xe643,0x391,0x313,0x300,0x868a,0x3f14,0x1f09,0xe643,0x391,0x314,0x300,0x868a,0x3f16, +0x1f08,0xe643,0x391,0x313,0x301,0x868a,0x3f18,0x1f09,0xe643,0x391,0x314,0x301,0x868a,0x3f1a,0x1f08,0xe643, +0x391,0x313,0x342,0x868a,0x3f1c,0x1f09,0xe643,0x391,0x314,0x342,0x868a,0x3f1e,0xe602,0x3b5,0x313,0x600, +0x3e24,0x8602,0x3e28,0xe602,0x3b5,0x314,0x600,0x3e26,0x8602,0x3e2a,0xe602,0x395,0x313,0x600,0x3e34,0x8602, +0x3e38,0xe602,0x395,0x314,0x600,0x3e36,0x8602,0x3e3a,0xe602,0x3b7,0x313,0x600,0x3e45,0x602,0x3e49,0x684, +0x3e4d,0x868a,0x3f20,0xe602,0x3b7,0x314,0x600,0x3e47,0x602,0x3e4b,0x684,0x3e4f,0x868a,0x3f22,0x1f20,0xe643, +0x3b7,0x313,0x300,0x868a,0x3f24,0x1f21,0xe643,0x3b7,0x314,0x300,0x868a,0x3f26,0x1f20,0xe643,0x3b7,0x313, +0x301,0x868a,0x3f28,0x1f21,0xe643,0x3b7,0x314,0x301,0x868a,0x3f2a,0x1f20,0xe643,0x3b7,0x313,0x342,0x868a, +0x3f2c,0x1f21,0xe643,0x3b7,0x314,0x342,0x868a,0x3f2e,0xe602,0x397,0x313,0x600,0x3e55,0x602,0x3e59,0x684, +0x3e5d,0x868a,0x3f30,0xe602,0x397,0x314,0x600,0x3e57,0x602,0x3e5b,0x684,0x3e5f,0x868a,0x3f32,0x1f28,0xe643, +0x397,0x313,0x300,0x868a,0x3f34,0x1f29,0xe643,0x397,0x314,0x300,0x868a,0x3f36,0x1f28,0xe643,0x397,0x313, +0x301,0x868a,0x3f38,0x1f29,0xe643,0x397,0x314,0x301,0x868a,0x3f3a,0x1f28,0xe643,0x397,0x313,0x342,0x868a, +0x3f3c,0x1f29,0xe643,0x397,0x314,0x342,0x868a,0x3f3e,0xe602,0x3b9,0x313,0x600,0x3e64,0x602,0x3e68,0x8684, +0x3e6c,0xe602,0x3b9,0x314,0x600,0x3e66,0x602,0x3e6a,0x8684,0x3e6e,0xe602,0x399,0x313,0x600,0x3e74,0x602, +0x3e78,0x8684,0x3e7c,0xe602,0x399,0x314,0x600,0x3e76,0x602,0x3e7a,0x8684,0x3e7e,0xe602,0x3bf,0x313,0x600, +0x3e84,0x8602,0x3e88,0xe602,0x3bf,0x314,0x600,0x3e86,0x8602,0x3e8a,0xe602,0x39f,0x313,0x600,0x3e94,0x8602, +0x3e98,0xe602,0x39f,0x314,0x600,0x3e96,0x8602,0x3e9a,0xe602,0x3c5,0x313,0x600,0x3ea4,0x602,0x3ea8,0x8684, +0x3eac,0xe602,0x3c5,0x314,0x600,0x3ea6,0x602,0x3eaa,0x8684,0x3eae,0xe602,0x3a5,0x314,0x600,0x3eb6,0x602, +0x3eba,0x8684,0x3ebe,0xe602,0x3c9,0x313,0x600,0x3ec5,0x602,0x3ec9,0x684,0x3ecd,0x868a,0x3f40,0xe602,0x3c9, +0x314,0x600,0x3ec7,0x602,0x3ecb,0x684,0x3ecf,0x868a,0x3f42,0x1f60,0xe643,0x3c9,0x313,0x300,0x868a,0x3f44, +0x1f61,0xe643,0x3c9,0x314,0x300,0x868a,0x3f46,0x1f60,0xe643,0x3c9,0x313,0x301,0x868a,0x3f48,0x1f61,0xe643, +0x3c9,0x314,0x301,0x868a,0x3f4a,0x1f60,0xe643,0x3c9,0x313,0x342,0x868a,0x3f4c,0x1f61,0xe643,0x3c9,0x314, +0x342,0x868a,0x3f4e,0xe602,0x3a9,0x313,0x600,0x3ed5,0x602,0x3ed9,0x684,0x3edd,0x868a,0x3f50,0xe602,0x3a9, +0x314,0x600,0x3ed7,0x602,0x3edb,0x684,0x3edf,0x868a,0x3f52,0x1f68,0xe643,0x3a9,0x313,0x300,0x868a,0x3f54, +0x1f69,0xe643,0x3a9,0x314,0x300,0x868a,0x3f56,0x1f68,0xe643,0x3a9,0x313,0x301,0x868a,0x3f58,0x1f69,0xe643, +0x3a9,0x314,0x301,0x868a,0x3f5a,0x1f68,0xe643,0x3a9,0x313,0x342,0x868a,0x3f5c,0x1f69,0xe643,0x3a9,0x314, +0x342,0x868a,0x3f5e,0xe602,0x3b1,0x300,0x868a,0x3f64,0xe602,0x3b7,0x300,0x868a,0x3f84,0xe602,0x3c9,0x300, +0x868a,0x3fe4,0xe602,0x3b1,0x342,0x868a,0x3f6e,0xe602,0x3b7,0x342,0x868a,0x3f8e,0xe602,0x3c9,0x342,0x868a, +0x3fee,3,0xe602,0x41,0x300,0xe602,0x41,0x301,0xe602,0x41,0x303,0xe602,0x45,0x300,0xe602,0x45, +0x301,0xe602,0x45,0x308,0xe602,0x49,0x300,0xe602,0x49,0x301,0xe602,0x49,0x302,0xe602,0x4e,0x303, +0xe602,0x4f,0x300,0xe602,0x4f,0x301,0xe602,0x55,0x300,0xe602,0x55,0x301,0xe602,0x55,0x302,0xe602, +0x59,0x301,0xe602,0x61,0x300,0xe602,0x61,0x301,0xe602,0x61,0x303,0xe602,0x65,0x300,0xe602,0x65, +0x301,0xe602,0x65,0x308,0xe602,0x69,0x300,0xe602,0x69,0x301,0xe602,0x69,0x302,0xe602,0x6e,0x303, +0xe602,0x6f,0x300,0xe602,0x6f,0x301,0xe602,0x75,0x300,0xe602,0x75,0x301,0xe602,0x75,0x302,0xe602, +0x79,0x301,0xe602,0x79,0x308,0xe602,0x41,0x304,0xe602,0x61,0x304,0xca02,0x41,0x328,0xca02,0x61, +0x328,0xe602,0x43,0x301,0xe602,0x63,0x301,0xe602,0x43,0x302,0xe602,0x63,0x302,0xe602,0x43,0x307, +0xe602,0x63,0x307,0xe602,0x43,0x30c,0xe602,0x63,0x30c,0xe602,0x44,0x30c,0xe602,0x64,0x30c,0xe602, +0x45,0x306,0xe602,0x65,0x306,0xe602,0x45,0x307,0xe602,0x65,0x307,0xca02,0x45,0x328,0xca02,0x65, +0x328,0xe602,0x45,0x30c,0xe602,0x65,0x30c,0xe602,0x47,0x302,0xe602,0x67,0x302,0xe602,0x47,0x306, +0xe602,0x67,0x306,0xe602,0x47,0x307,0xe602,0x67,0x307,0xca02,0x47,0x327,0xca02,0x67,0x327,0xe602, +0x48,0x302,0xe602,0x68,0x302,0xe602,0x49,0x303,0xe602,0x69,0x303,0xe602,0x49,0x304,0xe602,0x69, +0x304,0xe602,0x49,0x306,0xe602,0x69,0x306,0xca02,0x49,0x328,0xca02,0x69,0x328,0xe602,0x49,0x307, +0xe602,0x4a,0x302,0xe602,0x6a,0x302,0xca02,0x4b,0x327,0xca02,0x6b,0x327,0xe602,0x4c,0x301,0xe602, +0x6c,0x301,0xca02,0x4c,0x327,0xca02,0x6c,0x327,0xe602,0x4c,0x30c,0xe602,0x6c,0x30c,0xe602,0x4e, +0x301,0xe602,0x6e,0x301,0xca02,0x4e,0x327,0xca02,0x6e,0x327,0xe602,0x4e,0x30c,0xe602,0x6e,0x30c, +0xe602,0x4f,0x306,0xe602,0x6f,0x306,0xe602,0x4f,0x30b,0xe602,0x6f,0x30b,0xe602,0x52,0x301,0xe602, +0x72,0x301,0xca02,0x52,0x327,0xca02,0x72,0x327,0xe602,0x52,0x30c,0xe602,0x72,0x30c,0xe602,0x53, +0x302,0xe602,0x73,0x302,0xca02,0x53,0x327,0xca02,0x73,0x327,0xca02,0x54,0x327,0xca02,0x74,0x327, +0xe602,0x54,0x30c,0xe602,0x74,0x30c,0xe602,0x55,0x306,0xe602,0x75,0x306,0xe602,0x55,0x30a,0xe602, +0x75,0x30a,0xe602,0x55,0x30b,0xe602,0x75,0x30b,0xca02,0x55,0x328,0xca02,0x75,0x328,0xe602,0x57, +0x302,0xe602,0x77,0x302,0xe602,0x59,0x302,0xe602,0x79,0x302,0xe602,0x59,0x308,0xe602,0x5a,0x301, +0xe602,0x7a,0x301,0xe602,0x5a,0x307,0xe602,0x7a,0x307,0xe602,0x5a,0x30c,0xe602,0x7a,0x30c,0xe602, +0x41,0x30c,0xe602,0x61,0x30c,0xe602,0x49,0x30c,0xe602,0x69,0x30c,0xe602,0x4f,0x30c,0xe602,0x6f, +0x30c,0xe602,0x55,0x30c,0xe602,0x75,0x30c,0xdc,0xe643,0x55,0x308,0x304,0xfc,0xe643,0x75,0x308, +0x304,0xdc,0xe643,0x55,0x308,0x301,0xfc,0xe643,0x75,0x308,0x301,0xdc,0xe643,0x55,0x308,0x30c, +0xfc,0xe643,0x75,0x308,0x30c,0xdc,0xe643,0x55,0x308,0x300,0xfc,0xe643,0x75,0x308,0x300,0xc4, +0xe643,0x41,0x308,0x304,0xe4,0xe643,0x61,0x308,0x304,0x226,0xe643,0x41,0x307,0x304,0x227,0xe643, +0x61,0x307,0x304,0xe602,0xc6,0x304,0xe602,0xe6,0x304,0xe602,0x47,0x30c,0xe602,0x67,0x30c,0xe602, +0x4b,0x30c,0xe602,0x6b,0x30c,0x1ea,0xe643,0x4f,0x328,0x304,0x1eb,0xe643,0x6f,0x328,0x304,0xe602, +0x1b7,0x30c,0xe602,0x292,0x30c,0xe602,0x6a,0x30c,0xe602,0x47,0x301,0xe602,0x67,0x301,0xe602,0x4e, +0x300,0xe602,0x6e,0x300,0xc5,0xe643,0x41,0x30a,0x301,0xe5,0xe643,0x61,0x30a,0x301,0xe602,0xc6, +0x301,0xe602,0xe6,0x301,0xe602,0xd8,0x301,0xe602,0xf8,0x301,0xe602,0x41,0x30f,0xe602,0x61,0x30f, +0xe602,0x41,0x311,0xe602,0x61,0x311,0xe602,0x45,0x30f,0xe602,0x65,0x30f,0xe602,0x45,0x311,0xe602, +0x65,0x311,0xe602,0x49,0x30f,0xe602,0x69,0x30f,0xe602,0x49,0x311,0xe602,0x69,0x311,0xe602,0x4f, +0x30f,0xe602,0x6f,0x30f,0xe602,0x4f,0x311,0xe602,0x6f,0x311,0xe602,0x52,0x30f,0xe602,0x72,0x30f, +0xe602,0x52,0x311,0xe602,0x72,0x311,0xe602,0x55,0x30f,0xe602,0x75,0x30f,0xe602,0x55,0x311,0xe602, +0x75,0x311,0xdc02,0x53,0x326,0xdc02,0x73,0x326,0xdc02,0x54,0x326,0xdc02,0x74,0x326,0xe602,0x48, +0x30c,0xe602,0x68,0x30c,0xd6,0xe643,0x4f,0x308,0x304,0xf6,0xe643,0x6f,0x308,0x304,0xd5,0xe643, +0x4f,0x303,0x304,0xf5,0xe643,0x6f,0x303,0x304,0x22e,0xe643,0x4f,0x307,0x304,0x22f,0xe643,0x6f, +0x307,0x304,0xe602,0x59,0x304,0xe602,0x79,0x304,0xe602,0xa8,0x301,0xe602,0x391,0x301,0xe602,0x395, +0x301,0xe602,0x397,0x301,0xe602,0x399,0x301,0xe602,0x39f,0x301,0xe602,0x3a5,0x301,0xe602,0x3a9,0x301, +0x3ca,0xe643,0x3b9,0x308,0x301,0xe602,0x399,0x308,0xe602,0x3a5,0x308,0xe602,0x3b5,0x301,0xe602,0x3b9, +0x301,0x3cb,0xe643,0x3c5,0x308,0x301,0xe602,0x3bf,0x301,0xe602,0x3c5,0x301,0xe602,0x3d2,0x301,0xe602, +0x3d2,0x308,0xe602,0x415,0x300,0xe602,0x415,0x308,0xe602,0x413,0x301,0xe602,0x406,0x308,0xe602,0x41a, +0x301,0xe602,0x418,0x300,0xe602,0x423,0x306,0xe602,0x418,0x306,0xe602,0x438,0x306,0xe602,0x435,0x300, +0xe602,0x435,0x308,0xe602,0x433,0x301,0xe602,0x456,0x308,0xe602,0x43a,0x301,0xe602,0x438,0x300,0xe602, +0x443,0x306,0xe602,0x474,0x30f,0xe602,0x475,0x30f,0xe602,0x416,0x306,0xe602,0x436,0x306,0xe602,0x410, +0x306,0xe602,0x430,0x306,0xe602,0x410,0x308,0xe602,0x430,0x308,0xe602,0x415,0x306,0xe602,0x435,0x306, +0xe602,0x4d8,0x308,0xe602,0x4d9,0x308,0xe602,0x416,0x308,0xe602,0x436,0x308,0xe602,0x417,0x308,0xe602, +0x437,0x308,0xe602,0x418,0x304,0xe602,0x438,0x304,0xe602,0x418,0x308,0xe602,0x438,0x308,0xe602,0x41e, +0x308,0xe602,0x43e,0x308,0xe602,0x4e8,0x308,0xe602,0x4e9,0x308,0xe602,0x42d,0x308,0xe602,0x44d,0x308, +0xe602,0x423,0x304,0xe602,0x443,0x304,0xe602,0x423,0x308,0xe602,0x443,0x308,0xe602,0x423,0x30b,0xe602, +0x443,0x30b,0xe602,0x427,0x308,0xe602,0x447,0x308,0xe602,0x42b,0x308,0xe602,0x44b,0x308,0xe602,0x627, +0x653,0xe602,0x627,0x654,0xe602,0x648,0x654,0xdc02,0x627,0x655,0xe602,0x64a,0x654,0xe602,0x6d5,0x654, +0xe602,0x6c1,0x654,0xe602,0x6d2,0x654,0x702,0x928,0x93c,0x702,0x930,0x93c,0x702,0x933,0x93c,2, +0x9c7,0x9be,2,0x9c7,0x9d7,2,0xb47,0xb56,2,0xb47,0xb3e,2,0xb47,0xb57,2,0xb92, +0xbd7,2,0xbc6,0xbbe,2,0xbc7,0xbbe,2,0xbc6,0xbd7,0x5b02,0xc46,0xc56,2,0xcbf,0xcd5, +2,0xcc6,0xcd5,2,0xcc6,0xcd6,0xcca,0x43,0xcc6,0xcc2,0xcd5,2,0xd46,0xd3e,2,0xd47, +0xd3e,2,0xd46,0xd57,0x902,0xdd9,0xdca,0xddc,0x943,0xdd9,0xdcf,0xdca,2,0xdd9,0xddf,2, +0x1025,0x102e,2,0x1b05,0x1b35,2,0x1b07,0x1b35,2,0x1b09,0x1b35,2,0x1b0b,0x1b35,2,0x1b0d, +0x1b35,2,0x1b11,0x1b35,2,0x1b3a,0x1b35,2,0x1b3c,0x1b35,2,0x1b3e,0x1b35,2,0x1b3f,0x1b35, +2,0x1b42,0x1b35,0xdc02,0x41,0x325,0xdc02,0x61,0x325,0xe602,0x42,0x307,0xe602,0x62,0x307,0xdc02, +0x42,0x323,0xdc02,0x62,0x323,0xdc02,0x42,0x331,0xdc02,0x62,0x331,0xc7,0xe643,0x43,0x327,0x301, +0xe7,0xe643,0x63,0x327,0x301,0xe602,0x44,0x307,0xe602,0x64,0x307,0xdc02,0x44,0x323,0xdc02,0x64, +0x323,0xdc02,0x44,0x331,0xdc02,0x64,0x331,0xca02,0x44,0x327,0xca02,0x64,0x327,0xdc02,0x44,0x32d, +0xdc02,0x64,0x32d,0x112,0xe643,0x45,0x304,0x300,0x113,0xe643,0x65,0x304,0x300,0x112,0xe643,0x45, +0x304,0x301,0x113,0xe643,0x65,0x304,0x301,0xdc02,0x45,0x32d,0xdc02,0x65,0x32d,0xdc02,0x45,0x330, +0xdc02,0x65,0x330,0x228,0xe643,0x45,0x327,0x306,0x229,0xe643,0x65,0x327,0x306,0xe602,0x46,0x307, +0xe602,0x66,0x307,0xe602,0x47,0x304,0xe602,0x67,0x304,0xe602,0x48,0x307,0xe602,0x68,0x307,0xdc02, +0x48,0x323,0xdc02,0x68,0x323,0xe602,0x48,0x308,0xe602,0x68,0x308,0xca02,0x48,0x327,0xca02,0x68, +0x327,0xdc02,0x48,0x32e,0xdc02,0x68,0x32e,0xdc02,0x49,0x330,0xdc02,0x69,0x330,0xcf,0xe643,0x49, +0x308,0x301,0xef,0xe643,0x69,0x308,0x301,0xe602,0x4b,0x301,0xe602,0x6b,0x301,0xdc02,0x4b,0x323, +0xdc02,0x6b,0x323,0xdc02,0x4b,0x331,0xdc02,0x6b,0x331,0x1e36,0xe643,0x4c,0x323,0x304,0x1e37,0xe643, +0x6c,0x323,0x304,0xdc02,0x4c,0x331,0xdc02,0x6c,0x331,0xdc02,0x4c,0x32d,0xdc02,0x6c,0x32d,0xe602, +0x4d,0x301,0xe602,0x6d,0x301,0xe602,0x4d,0x307,0xe602,0x6d,0x307,0xdc02,0x4d,0x323,0xdc02,0x6d, +0x323,0xe602,0x4e,0x307,0xe602,0x6e,0x307,0xdc02,0x4e,0x323,0xdc02,0x6e,0x323,0xdc02,0x4e,0x331, +0xdc02,0x6e,0x331,0xdc02,0x4e,0x32d,0xdc02,0x6e,0x32d,0xd5,0xe643,0x4f,0x303,0x301,0xf5,0xe643, +0x6f,0x303,0x301,0xd5,0xe643,0x4f,0x303,0x308,0xf5,0xe643,0x6f,0x303,0x308,0x14c,0xe643,0x4f, +0x304,0x300,0x14d,0xe643,0x6f,0x304,0x300,0x14c,0xe643,0x4f,0x304,0x301,0x14d,0xe643,0x6f,0x304, +0x301,0xe602,0x50,0x301,0xe602,0x70,0x301,0xe602,0x50,0x307,0xe602,0x70,0x307,0xe602,0x52,0x307, +0xe602,0x72,0x307,0x1e5a,0xe643,0x52,0x323,0x304,0x1e5b,0xe643,0x72,0x323,0x304,0xdc02,0x52,0x331, +0xdc02,0x72,0x331,0xe602,0x53,0x307,0xe602,0x73,0x307,0x15a,0xe643,0x53,0x301,0x307,0x15b,0xe643, +0x73,0x301,0x307,0x160,0xe643,0x53,0x30c,0x307,0x161,0xe643,0x73,0x30c,0x307,0x1e62,0xe643,0x53, +0x323,0x307,0x1e63,0xe643,0x73,0x323,0x307,0xe602,0x54,0x307,0xe602,0x74,0x307,0xdc02,0x54,0x323, +0xdc02,0x74,0x323,0xdc02,0x54,0x331,0xdc02,0x74,0x331,0xdc02,0x54,0x32d,0xdc02,0x74,0x32d,0xdc02, +0x55,0x324,0xdc02,0x75,0x324,0xdc02,0x55,0x330,0xdc02,0x75,0x330,0xdc02,0x55,0x32d,0xdc02,0x75, +0x32d,0x168,0xe643,0x55,0x303,0x301,0x169,0xe643,0x75,0x303,0x301,0x16a,0xe643,0x55,0x304,0x308, +0x16b,0xe643,0x75,0x304,0x308,0xe602,0x56,0x303,0xe602,0x76,0x303,0xdc02,0x56,0x323,0xdc02,0x76, +0x323,0xe602,0x57,0x300,0xe602,0x77,0x300,0xe602,0x57,0x301,0xe602,0x77,0x301,0xe602,0x57,0x308, +0xe602,0x77,0x308,0xe602,0x57,0x307,0xe602,0x77,0x307,0xdc02,0x57,0x323,0xdc02,0x77,0x323,0xe602, +0x58,0x307,0xe602,0x78,0x307,0xe602,0x58,0x308,0xe602,0x78,0x308,0xe602,0x59,0x307,0xe602,0x79, +0x307,0xe602,0x5a,0x302,0xe602,0x7a,0x302,0xdc02,0x5a,0x323,0xdc02,0x7a,0x323,0xdc02,0x5a,0x331, +0xdc02,0x7a,0x331,0xdc02,0x68,0x331,0xe602,0x74,0x308,0xe602,0x77,0x30a,0xe602,0x79,0x30a,0xe602, +0x17f,0x307,0xe602,0x41,0x309,0xe602,0x61,0x309,0xc2,0xe643,0x41,0x302,0x301,0xe2,0xe643,0x61, +0x302,0x301,0xc2,0xe643,0x41,0x302,0x300,0xe2,0xe643,0x61,0x302,0x300,0xc2,0xe643,0x41,0x302, +0x309,0xe2,0xe643,0x61,0x302,0x309,0xc2,0xe643,0x41,0x302,0x303,0xe2,0xe643,0x61,0x302,0x303, +0x1ea0,0xe643,0x41,0x323,0x302,0x1ea1,0xe643,0x61,0x323,0x302,0x102,0xe643,0x41,0x306,0x301,0x103, +0xe643,0x61,0x306,0x301,0x102,0xe643,0x41,0x306,0x300,0x103,0xe643,0x61,0x306,0x300,0x102,0xe643, +0x41,0x306,0x309,0x103,0xe643,0x61,0x306,0x309,0x102,0xe643,0x41,0x306,0x303,0x103,0xe643,0x61, +0x306,0x303,0x1ea0,0xe643,0x41,0x323,0x306,0x1ea1,0xe643,0x61,0x323,0x306,0xe602,0x45,0x309,0xe602, +0x65,0x309,0xe602,0x45,0x303,0xe602,0x65,0x303,0xca,0xe643,0x45,0x302,0x301,0xea,0xe643,0x65, +0x302,0x301,0xca,0xe643,0x45,0x302,0x300,0xea,0xe643,0x65,0x302,0x300,0xca,0xe643,0x45,0x302, +0x309,0xea,0xe643,0x65,0x302,0x309,0xca,0xe643,0x45,0x302,0x303,0xea,0xe643,0x65,0x302,0x303, +0x1eb8,0xe643,0x45,0x323,0x302,0x1eb9,0xe643,0x65,0x323,0x302,0xe602,0x49,0x309,0xe602,0x69,0x309, +0xdc02,0x49,0x323,0xdc02,0x69,0x323,0xe602,0x4f,0x309,0xe602,0x6f,0x309,0xd4,0xe643,0x4f,0x302, +0x301,0xf4,0xe643,0x6f,0x302,0x301,0xd4,0xe643,0x4f,0x302,0x300,0xf4,0xe643,0x6f,0x302,0x300, +0xd4,0xe643,0x4f,0x302,0x309,0xf4,0xe643,0x6f,0x302,0x309,0xd4,0xe643,0x4f,0x302,0x303,0xf4, +0xe643,0x6f,0x302,0x303,0x1ecc,0xe643,0x4f,0x323,0x302,0x1ecd,0xe643,0x6f,0x323,0x302,0x1a0,0xe643, +0x4f,0x31b,0x301,0x1a1,0xe643,0x6f,0x31b,0x301,0x1a0,0xe643,0x4f,0x31b,0x300,0x1a1,0xe643,0x6f, +0x31b,0x300,0x1a0,0xe643,0x4f,0x31b,0x309,0x1a1,0xe643,0x6f,0x31b,0x309,0x1a0,0xe643,0x4f,0x31b, +0x303,0x1a1,0xe643,0x6f,0x31b,0x303,0x1a0,0xdc43,0x4f,0x31b,0x323,0x1a1,0xdc43,0x6f,0x31b,0x323, +0xdc02,0x55,0x323,0xdc02,0x75,0x323,0xe602,0x55,0x309,0xe602,0x75,0x309,0x1af,0xe643,0x55,0x31b, +0x301,0x1b0,0xe643,0x75,0x31b,0x301,0x1af,0xe643,0x55,0x31b,0x300,0x1b0,0xe643,0x75,0x31b,0x300, +0x1af,0xe643,0x55,0x31b,0x309,0x1b0,0xe643,0x75,0x31b,0x309,0x1af,0xe643,0x55,0x31b,0x303,0x1b0, +0xe643,0x75,0x31b,0x303,0x1af,0xdc43,0x55,0x31b,0x323,0x1b0,0xdc43,0x75,0x31b,0x323,0xe602,0x59, +0x300,0xe602,0x79,0x300,0xdc02,0x59,0x323,0xdc02,0x79,0x323,0xe602,0x59,0x309,0xe602,0x79,0x309, +0xe602,0x59,0x303,0xe602,0x79,0x303,0x1f10,0xe643,0x3b5,0x313,0x300,0x1f11,0xe643,0x3b5,0x314,0x300, +0x1f10,0xe643,0x3b5,0x313,0x301,0x1f11,0xe643,0x3b5,0x314,0x301,0x1f18,0xe643,0x395,0x313,0x300,0x1f19, +0xe643,0x395,0x314,0x300,0x1f18,0xe643,0x395,0x313,0x301,0x1f19,0xe643,0x395,0x314,0x301,0x1f30,0xe643, +0x3b9,0x313,0x300,0x1f31,0xe643,0x3b9,0x314,0x300,0x1f30,0xe643,0x3b9,0x313,0x301,0x1f31,0xe643,0x3b9, +0x314,0x301,0x1f30,0xe643,0x3b9,0x313,0x342,0x1f31,0xe643,0x3b9,0x314,0x342,0x1f38,0xe643,0x399,0x313, +0x300,0x1f39,0xe643,0x399,0x314,0x300,0x1f38,0xe643,0x399,0x313,0x301,0x1f39,0xe643,0x399,0x314,0x301, +0x1f38,0xe643,0x399,0x313,0x342,0x1f39,0xe643,0x399,0x314,0x342,0x1f40,0xe643,0x3bf,0x313,0x300,0x1f41, +0xe643,0x3bf,0x314,0x300,0x1f40,0xe643,0x3bf,0x313,0x301,0x1f41,0xe643,0x3bf,0x314,0x301,0x1f48,0xe643, +0x39f,0x313,0x300,0x1f49,0xe643,0x39f,0x314,0x300,0x1f48,0xe643,0x39f,0x313,0x301,0x1f49,0xe643,0x39f, +0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x300,0x1f51,0xe643,0x3c5,0x314,0x300,0x1f50,0xe643,0x3c5,0x313, +0x301,0x1f51,0xe643,0x3c5,0x314,0x301,0x1f50,0xe643,0x3c5,0x313,0x342,0x1f51,0xe643,0x3c5,0x314,0x342, +0x1f59,0xe643,0x3a5,0x314,0x300,0x1f59,0xe643,0x3a5,0x314,0x301,0x1f59,0xe643,0x3a5,0x314,0x342,0xe602, +0x3b5,0x300,0xe602,0x3b9,0x300,0xe602,0x3bf,0x300,0xe602,0x3c5,0x300,0x1f00,0xf043,0x3b1,0x313,0x345, +0x1f01,0xf043,0x3b1,0x314,0x345,0x1f02,0x345,2,0xf044,0x3b1,0x313,0x300,0x345,0x1f03,0x345,2, +0xf044,0x3b1,0x314,0x300,0x345,0x1f04,0x345,2,0xf044,0x3b1,0x313,0x301,0x345,0x1f05,0x345,2, +0xf044,0x3b1,0x314,0x301,0x345,0x1f06,0x345,2,0xf044,0x3b1,0x313,0x342,0x345,0x1f07,0x345,2, +0xf044,0x3b1,0x314,0x342,0x345,0x1f08,0xf043,0x391,0x313,0x345,0x1f09,0xf043,0x391,0x314,0x345,0x1f0a, +0x345,2,0xf044,0x391,0x313,0x300,0x345,0x1f0b,0x345,2,0xf044,0x391,0x314,0x300,0x345,0x1f0c, +0x345,2,0xf044,0x391,0x313,0x301,0x345,0x1f0d,0x345,2,0xf044,0x391,0x314,0x301,0x345,0x1f0e, +0x345,2,0xf044,0x391,0x313,0x342,0x345,0x1f0f,0x345,2,0xf044,0x391,0x314,0x342,0x345,0x1f20, +0xf043,0x3b7,0x313,0x345,0x1f21,0xf043,0x3b7,0x314,0x345,0x1f22,0x345,2,0xf044,0x3b7,0x313,0x300, +0x345,0x1f23,0x345,2,0xf044,0x3b7,0x314,0x300,0x345,0x1f24,0x345,2,0xf044,0x3b7,0x313,0x301, +0x345,0x1f25,0x345,2,0xf044,0x3b7,0x314,0x301,0x345,0x1f26,0x345,2,0xf044,0x3b7,0x313,0x342, +0x345,0x1f27,0x345,2,0xf044,0x3b7,0x314,0x342,0x345,0x1f28,0xf043,0x397,0x313,0x345,0x1f29,0xf043, +0x397,0x314,0x345,0x1f2a,0x345,2,0xf044,0x397,0x313,0x300,0x345,0x1f2b,0x345,2,0xf044,0x397, +0x314,0x300,0x345,0x1f2c,0x345,2,0xf044,0x397,0x313,0x301,0x345,0x1f2d,0x345,2,0xf044,0x397, +0x314,0x301,0x345,0x1f2e,0x345,2,0xf044,0x397,0x313,0x342,0x345,0x1f2f,0x345,2,0xf044,0x397, +0x314,0x342,0x345,0x1f60,0xf043,0x3c9,0x313,0x345,0x1f61,0xf043,0x3c9,0x314,0x345,0x1f62,0x345,2, +0xf044,0x3c9,0x313,0x300,0x345,0x1f63,0x345,2,0xf044,0x3c9,0x314,0x300,0x345,0x1f64,0x345,2, +0xf044,0x3c9,0x313,0x301,0x345,0x1f65,0x345,2,0xf044,0x3c9,0x314,0x301,0x345,0x1f66,0x345,2, +0xf044,0x3c9,0x313,0x342,0x345,0x1f67,0x345,2,0xf044,0x3c9,0x314,0x342,0x345,0x1f68,0xf043,0x3a9, +0x313,0x345,0x1f69,0xf043,0x3a9,0x314,0x345,0x1f6a,0x345,2,0xf044,0x3a9,0x313,0x300,0x345,0x1f6b, +0x345,2,0xf044,0x3a9,0x314,0x300,0x345,0x1f6c,0x345,2,0xf044,0x3a9,0x313,0x301,0x345,0x1f6d, +0x345,2,0xf044,0x3a9,0x314,0x301,0x345,0x1f6e,0x345,2,0xf044,0x3a9,0x313,0x342,0x345,0x1f6f, +0x345,2,0xf044,0x3a9,0x314,0x342,0x345,0xe602,0x3b1,0x306,0xe602,0x3b1,0x304,0x1f70,0xf043,0x3b1, +0x300,0x345,0xf002,0x3b1,0x345,0x3ac,0xf043,0x3b1,0x301,0x345,0x1fb6,0xf043,0x3b1,0x342,0x345,0xe602, +0x391,0x306,0xe602,0x391,0x304,0xe602,0x391,0x300,0xf002,0x391,0x345,0xe602,0xa8,0x342,0x1f74,0xf043, +0x3b7,0x300,0x345,0xf002,0x3b7,0x345,0x3ae,0xf043,0x3b7,0x301,0x345,0x1fc6,0xf043,0x3b7,0x342,0x345, +0xe602,0x395,0x300,0xe602,0x397,0x300,0xf002,0x397,0x345,0xe602,0x1fbf,0x300,0xe602,0x1fbf,0x301,0xe602, +0x1fbf,0x342,0xe602,0x3b9,0x306,0xe602,0x3b9,0x304,0x3ca,0xe643,0x3b9,0x308,0x300,0xe602,0x3b9,0x342, +0x3ca,0xe643,0x3b9,0x308,0x342,0xe602,0x399,0x306,0xe602,0x399,0x304,0xe602,0x399,0x300,0xe602,0x1ffe, +0x300,0xe602,0x1ffe,0x301,0xe602,0x1ffe,0x342,0xe602,0x3c5,0x306,0xe602,0x3c5,0x304,0x3cb,0xe643,0x3c5, +0x308,0x300,0xe602,0x3c1,0x313,0xe602,0x3c1,0x314,0xe602,0x3c5,0x342,0x3cb,0xe643,0x3c5,0x308,0x342, +0xe602,0x3a5,0x306,0xe602,0x3a5,0x304,0xe602,0x3a5,0x300,0xe602,0x3a1,0x314,0xe602,0xa8,0x300,0x1f7c, +0xf043,0x3c9,0x300,0x345,0xf002,0x3c9,0x345,0x3ce,0xf043,0x3c9,0x301,0x345,0x1ff6,0xf043,0x3c9,0x342, +0x345,0xe602,0x39f,0x300,0xe602,0x3a9,0x300,0xf002,0x3a9,0x345,0x102,0x2190,0x338,0x102,0x2192,0x338, +0x102,0x2194,0x338,0x102,0x21d0,0x338,0x102,0x21d4,0x338,0x102,0x21d2,0x338,0x102,0x2203,0x338,0x102, +0x2208,0x338,0x102,0x220b,0x338,0x102,0x2223,0x338,0x102,0x2225,0x338,0x102,0x223c,0x338,0x102,0x2243, +0x338,0x102,0x2245,0x338,0x102,0x2248,0x338,0x102,0x3d,0x338,0x102,0x2261,0x338,0x102,0x224d,0x338, +0x102,0x3c,0x338,0x102,0x3e,0x338,0x102,0x2264,0x338,0x102,0x2265,0x338,0x102,0x2272,0x338,0x102, +0x2273,0x338,0x102,0x2276,0x338,0x102,0x2277,0x338,0x102,0x227a,0x338,0x102,0x227b,0x338,0x102,0x2282, +0x338,0x102,0x2283,0x338,0x102,0x2286,0x338,0x102,0x2287,0x338,0x102,0x22a2,0x338,0x102,0x22a8,0x338, +0x102,0x22a9,0x338,0x102,0x22ab,0x338,0x102,0x227c,0x338,0x102,0x227d,0x338,0x102,0x2291,0x338,0x102, +0x2292,0x338,0x102,0x22b2,0x338,0x102,0x22b3,0x338,0x102,0x22b4,0x338,0x102,0x22b5,0x338,0x802,0x304b, +0x3099,0x802,0x304d,0x3099,0x802,0x304f,0x3099,0x802,0x3051,0x3099,0x802,0x3053,0x3099,0x802,0x3055,0x3099, +0x802,0x3057,0x3099,0x802,0x3059,0x3099,0x802,0x305b,0x3099,0x802,0x305d,0x3099,0x802,0x305f,0x3099,0x802, +0x3061,0x3099,0x802,0x3064,0x3099,0x802,0x3066,0x3099,0x802,0x3068,0x3099,0x802,0x306f,0x3099,0x802,0x306f, +0x309a,0x802,0x3072,0x3099,0x802,0x3072,0x309a,0x802,0x3075,0x3099,0x802,0x3075,0x309a,0x802,0x3078,0x3099, +0x802,0x3078,0x309a,0x802,0x307b,0x3099,0x802,0x307b,0x309a,0x802,0x3046,0x3099,0x802,0x309d,0x3099,0x802, +0x30ab,0x3099,0x802,0x30ad,0x3099,0x802,0x30af,0x3099,0x802,0x30b1,0x3099,0x802,0x30b3,0x3099,0x802,0x30b5, +0x3099,0x802,0x30b7,0x3099,0x802,0x30b9,0x3099,0x802,0x30bb,0x3099,0x802,0x30bd,0x3099,0x802,0x30bf,0x3099, +0x802,0x30c1,0x3099,0x802,0x30c4,0x3099,0x802,0x30c6,0x3099,0x802,0x30c8,0x3099,0x802,0x30cf,0x3099,0x802, +0x30cf,0x309a,0x802,0x30d2,0x3099,0x802,0x30d2,0x309a,0x802,0x30d5,0x3099,0x802,0x30d5,0x309a,0x802,0x30d8, +0x3099,0x802,0x30d8,0x309a,0x802,0x30db,0x3099,0x802,0x30db,0x309a,0x802,0x30a6,0x3099,0x802,0x30ef,0x3099, +0x802,0x30f0,0x3099,0x802,0x30f1,0x3099,0x802,0x30f2,0x3099,0x802,0x30fd,0x3099,0x704,0xd804,0xdc99,0xd804, +0xdcba,0x704,0xd804,0xdc9b,0xd804,0xdcba,0x704,0xd804,0xdca5,0xd804,0xdcba,4,0xd804,0xdd31,0xd804,0xdd27, +4,0xd804,0xdd32,0xd804,0xdd27,4,0xd804,0xdf47,0xd804,0xdf3e,4,0xd804,0xdf47,0xd804,0xdf57,4, +0xd805,0xdcb9,0xd805,0xdcba,4,0xd805,0xdcb9,0xd805,0xdcb0,4,0xd805,0xdcb9,0xd805,0xdcbd,4,0xd805, +0xddb8,0xd805,0xddaf,4,0xd805,0xddb9,0xd805,0xddaf,1,0x2b9,1,0x3b,1,0xb7,0x702,0x915, +0x93c,0x702,0x916,0x93c,0x702,0x917,0x93c,0x702,0x91c,0x93c,0x702,0x921,0x93c,0x702,0x922,0x93c, +0x702,0x92b,0x93c,0x702,0x92f,0x93c,0x702,0x9a1,0x9bc,0x702,0x9a2,0x9bc,0x702,0x9af,0x9bc,0x702, +0xa32,0xa3c,0x702,0xa38,0xa3c,0x702,0xa16,0xa3c,0x702,0xa17,0xa3c,0x702,0xa1c,0xa3c,0x702,0xa2b, +0xa3c,0x702,0xb21,0xb3c,0x702,0xb22,0xb3c,2,0xf42,0xfb7,2,0xf4c,0xfb7,2,0xf51,0xfb7, +2,0xf56,0xfb7,2,0xf5b,0xfb7,2,0xf40,0xfb5,0x8202,0xfb2,0xf80,0x8202,0xfb3,0xf80,2, +0xf92,0xfb7,2,0xf9c,0xfb7,2,0xfa1,0xfb7,2,0xfa6,0xfb7,2,0xfab,0xfb7,2,0xf90, +0xfb5,1,0x3b9,1,0x60,1,0xb4,1,0x3a9,1,0x4b,1,0x3008,1,0x3009,0x102, +0x2add,0x338,1,0x8c48,1,0x66f4,1,0x8eca,1,0x8cc8,1,0x6ed1,1,0x4e32,1,0x53e5, +1,0x9f9c,1,0x5951,1,0x91d1,1,0x5587,1,0x5948,1,0x61f6,1,0x7669,1,0x7f85, +1,0x863f,1,0x87ba,1,0x88f8,1,0x908f,1,0x6a02,1,0x6d1b,1,0x70d9,1,0x73de, +1,0x843d,1,0x916a,1,0x99f1,1,0x4e82,1,0x5375,1,0x6b04,1,0x721b,1,0x862d, +1,0x9e1e,1,0x5d50,1,0x6feb,1,0x85cd,1,0x8964,1,0x62c9,1,0x81d8,1,0x881f, +1,0x5eca,1,0x6717,1,0x6d6a,1,0x72fc,1,0x90ce,1,0x4f86,1,0x51b7,1,0x52de, +1,0x64c4,1,0x6ad3,1,0x7210,1,0x76e7,1,0x8001,1,0x8606,1,0x865c,1,0x8def, +1,0x9732,1,0x9b6f,1,0x9dfa,1,0x788c,1,0x797f,1,0x7da0,1,0x83c9,1,0x9304, +1,0x9e7f,1,0x8ad6,1,0x58df,1,0x5f04,1,0x7c60,1,0x807e,1,0x7262,1,0x78ca, +1,0x8cc2,1,0x96f7,1,0x58d8,1,0x5c62,1,0x6a13,1,0x6dda,1,0x6f0f,1,0x7d2f, +1,0x7e37,1,0x964b,1,0x52d2,1,0x808b,1,0x51dc,1,0x51cc,1,0x7a1c,1,0x7dbe, +1,0x83f1,1,0x9675,1,0x8b80,1,0x62cf,1,0x8afe,1,0x4e39,1,0x5be7,1,0x6012, +1,0x7387,1,0x7570,1,0x5317,1,0x78fb,1,0x4fbf,1,0x5fa9,1,0x4e0d,1,0x6ccc, +1,0x6578,1,0x7d22,1,0x53c3,1,0x585e,1,0x7701,1,0x8449,1,0x8aaa,1,0x6bba, +1,0x8fb0,1,0x6c88,1,0x62fe,1,0x82e5,1,0x63a0,1,0x7565,1,0x4eae,1,0x5169, +1,0x51c9,1,0x6881,1,0x7ce7,1,0x826f,1,0x8ad2,1,0x91cf,1,0x52f5,1,0x5442, +1,0x5973,1,0x5eec,1,0x65c5,1,0x6ffe,1,0x792a,1,0x95ad,1,0x9a6a,1,0x9e97, +1,0x9ece,1,0x529b,1,0x66c6,1,0x6b77,1,0x8f62,1,0x5e74,1,0x6190,1,0x6200, +1,0x649a,1,0x6f23,1,0x7149,1,0x7489,1,0x79ca,1,0x7df4,1,0x806f,1,0x8f26, +1,0x84ee,1,0x9023,1,0x934a,1,0x5217,1,0x52a3,1,0x54bd,1,0x70c8,1,0x88c2, +1,0x5ec9,1,0x5ff5,1,0x637b,1,0x6bae,1,0x7c3e,1,0x7375,1,0x4ee4,1,0x56f9, +1,0x5dba,1,0x601c,1,0x73b2,1,0x7469,1,0x7f9a,1,0x8046,1,0x9234,1,0x96f6, +1,0x9748,1,0x9818,1,0x4f8b,1,0x79ae,1,0x91b4,1,0x96b8,1,0x60e1,1,0x4e86, +1,0x50da,1,0x5bee,1,0x5c3f,1,0x6599,1,0x71ce,1,0x7642,1,0x84fc,1,0x907c, +1,0x9f8d,1,0x6688,1,0x962e,1,0x5289,1,0x677b,1,0x67f3,1,0x6d41,1,0x6e9c, +1,0x7409,1,0x7559,1,0x786b,1,0x7d10,1,0x985e,1,0x516d,1,0x622e,1,0x9678, +1,0x502b,1,0x5d19,1,0x6dea,1,0x8f2a,1,0x5f8b,1,0x6144,1,0x6817,1,0x9686, +1,0x5229,1,0x540f,1,0x5c65,1,0x6613,1,0x674e,1,0x68a8,1,0x6ce5,1,0x7406, +1,0x75e2,1,0x7f79,1,0x88cf,1,0x88e1,1,0x91cc,1,0x96e2,1,0x533f,1,0x6eba, +1,0x541d,1,0x71d0,1,0x7498,1,0x85fa,1,0x96a3,1,0x9c57,1,0x9e9f,1,0x6797, +1,0x6dcb,1,0x81e8,1,0x7acb,1,0x7b20,1,0x7c92,1,0x72c0,1,0x7099,1,0x8b58, +1,0x4ec0,1,0x8336,1,0x523a,1,0x5207,1,0x5ea6,1,0x62d3,1,0x7cd6,1,0x5b85, +1,0x6d1e,1,0x66b4,1,0x8f3b,1,0x884c,1,0x964d,1,0x898b,1,0x5ed3,1,0x5140, +1,0x55c0,1,0x585a,1,0x6674,1,0x51de,1,0x732a,1,0x76ca,1,0x793c,1,0x795e, +1,0x7965,1,0x798f,1,0x9756,1,0x7cbe,1,0x7fbd,1,0x8612,1,0x8af8,1,0x9038, +1,0x90fd,1,0x98ef,1,0x98fc,1,0x9928,1,0x9db4,1,0x90de,1,0x96b7,1,0x4fae, +1,0x50e7,1,0x514d,1,0x52c9,1,0x52e4,1,0x5351,1,0x559d,1,0x5606,1,0x5668, +1,0x5840,1,0x58a8,1,0x5c64,1,0x5c6e,1,0x6094,1,0x6168,1,0x618e,1,0x61f2, +1,0x654f,1,0x65e2,1,0x6691,1,0x6885,1,0x6d77,1,0x6e1a,1,0x6f22,1,0x716e, +1,0x722b,1,0x7422,1,0x7891,1,0x793e,1,0x7949,1,0x7948,1,0x7950,1,0x7956, +1,0x795d,1,0x798d,1,0x798e,1,0x7a40,1,0x7a81,1,0x7bc0,1,0x7e09,1,0x7e41, +1,0x7f72,1,0x8005,1,0x81ed,1,0x8279,1,0x8457,1,0x8910,1,0x8996,1,0x8b01, +1,0x8b39,1,0x8cd3,1,0x8d08,1,0x8fb6,1,0x96e3,1,0x97ff,1,0x983b,1,0x6075, +2,0xd850,0xdeee,1,0x8218,1,0x4e26,1,0x51b5,1,0x5168,1,0x4f80,1,0x5145,1, +0x5180,1,0x52c7,1,0x52fa,1,0x5555,1,0x5599,1,0x55e2,1,0x58b3,1,0x5944,1, +0x5954,1,0x5a62,1,0x5b28,1,0x5ed2,1,0x5ed9,1,0x5f69,1,0x5fad,1,0x60d8,1, +0x614e,1,0x6108,1,0x6160,1,0x6234,1,0x63c4,1,0x641c,1,0x6452,1,0x6556,1, +0x671b,1,0x6756,1,0x6b79,1,0x6edb,1,0x6ecb,1,0x701e,1,0x77a7,1,0x7235,1, +0x72af,1,0x7471,1,0x7506,1,0x753b,1,0x761d,1,0x761f,1,0x76db,1,0x76f4,1, +0x774a,1,0x7740,1,0x78cc,1,0x7ab1,1,0x7c7b,1,0x7d5b,1,0x7f3e,1,0x8352,1, +0x83ef,1,0x8779,1,0x8941,1,0x8986,1,0x8abf,1,0x8acb,1,0x8aed,1,0x8b8a,1, +0x8f38,1,0x9072,1,0x9199,1,0x9276,1,0x967c,1,0x97db,1,0x980b,1,0x9b12,2, +0xd84a,0xdc4a,2,0xd84a,0xdc44,2,0xd84c,0xdfd5,1,0x3b9d,1,0x4018,1,0x4039,2,0xd854, +0xde49,2,0xd857,0xdcd0,2,0xd85f,0xded3,1,0x9f43,1,0x9f8e,0xe02,0x5d9,0x5b4,0x1102,0x5f2, +0x5b7,0x1802,0x5e9,0x5c1,0x1902,0x5e9,0x5c2,0xfb49,0x1843,0x5e9,0x5bc,0x5c1,0xfb49,0x1943,0x5e9,0x5bc, +0x5c2,0x1102,0x5d0,0x5b7,0x1202,0x5d0,0x5b8,0x1502,0x5d0,0x5bc,0x1502,0x5d1,0x5bc,0x1502,0x5d2,0x5bc, +0x1502,0x5d3,0x5bc,0x1502,0x5d4,0x5bc,0x1502,0x5d5,0x5bc,0x1502,0x5d6,0x5bc,0x1502,0x5d8,0x5bc,0x1502, +0x5d9,0x5bc,0x1502,0x5da,0x5bc,0x1502,0x5db,0x5bc,0x1502,0x5dc,0x5bc,0x1502,0x5de,0x5bc,0x1502,0x5e0, +0x5bc,0x1502,0x5e1,0x5bc,0x1502,0x5e3,0x5bc,0x1502,0x5e4,0x5bc,0x1502,0x5e6,0x5bc,0x1502,0x5e7,0x5bc, +0x1502,0x5e8,0x5bc,0x1502,0x5e9,0x5bc,0x1502,0x5ea,0x5bc,0x1302,0x5d5,0x5b9,0x1702,0x5d1,0x5bf,0x1702, +0x5db,0x5bf,0x1702,0x5e4,0x5bf,0xd804,0xd834,0xdd57,0xd834,0xdd65,0xd804,0xd834,0xdd58,0xd834,0xdd65,0xd834, +0xdd5f,0xd834,0xdd6e,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xdd5f,0xd834,0xdd6f,4, +0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xdd5f,0xd834,0xdd70,4,0xd846,0xd834,0xdd58,0xd834, +0xdd65,0xd834,0xdd70,0xd834,0xdd5f,0xd834,0xdd71,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd71,0xd834, +0xdd5f,0xd834,0xdd72,4,0xd846,0xd834,0xdd58,0xd834,0xdd65,0xd834,0xdd72,0xd804,0xd834,0xddb9,0xd834,0xdd65, +0xd804,0xd834,0xddba,0xd834,0xdd65,0xd834,0xddbb,0xd834,0xdd6e,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834, +0xdd6e,0xd834,0xddbc,0xd834,0xdd6e,4,0xd846,0xd834,0xddba,0xd834,0xdd65,0xd834,0xdd6e,0xd834,0xddbb,0xd834, +0xdd6f,4,0xd846,0xd834,0xddb9,0xd834,0xdd65,0xd834,0xdd6f,0xd834,0xddbc,0xd834,0xdd6f,4,0xd846,0xd834, +0xddba,0xd834,0xdd65,0xd834,0xdd6f,1,0x4e3d,1,0x4e38,1,0x4e41,2,0xd840,0xdd22,1,0x4f60, +1,0x4fbb,1,0x5002,1,0x507a,1,0x5099,1,0x50cf,1,0x349e,2,0xd841,0xde3a,1, +0x5154,1,0x5164,1,0x5177,2,0xd841,0xdd1c,1,0x34b9,1,0x5167,1,0x518d,2,0xd841, +0xdd4b,1,0x5197,1,0x51a4,1,0x4ecc,1,0x51ac,2,0xd864,0xdddf,1,0x51f5,1,0x5203, +1,0x34df,1,0x523b,1,0x5246,1,0x5272,1,0x5277,1,0x3515,1,0x5305,1,0x5306, +1,0x5349,1,0x535a,1,0x5373,1,0x537d,1,0x537f,2,0xd842,0xde2c,1,0x7070,1, +0x53ca,1,0x53df,2,0xd842,0xdf63,1,0x53eb,1,0x53f1,1,0x5406,1,0x549e,1,0x5438, +1,0x5448,1,0x5468,1,0x54a2,1,0x54f6,1,0x5510,1,0x5553,1,0x5563,1,0x5584, +1,0x55ab,1,0x55b3,1,0x55c2,1,0x5716,1,0x5717,1,0x5651,1,0x5674,1,0x58ee, +1,0x57ce,1,0x57f4,1,0x580d,1,0x578b,1,0x5832,1,0x5831,1,0x58ac,2,0xd845, +0xdce4,1,0x58f2,1,0x58f7,1,0x5906,1,0x591a,1,0x5922,1,0x5962,2,0xd845,0xdea8, +2,0xd845,0xdeea,1,0x59ec,1,0x5a1b,1,0x5a27,1,0x59d8,1,0x5a66,1,0x36ee,1, +0x36fc,1,0x5b08,1,0x5b3e,2,0xd846,0xddc8,1,0x5bc3,1,0x5bd8,1,0x5bf3,2,0xd846, +0xdf18,1,0x5bff,1,0x5c06,1,0x5f53,1,0x5c22,1,0x3781,1,0x5c60,1,0x5cc0,1, +0x5c8d,2,0xd847,0xdde4,1,0x5d43,2,0xd847,0xdde6,1,0x5d6e,1,0x5d6b,1,0x5d7c,1, +0x5de1,1,0x5de2,1,0x382f,1,0x5dfd,1,0x5e28,1,0x5e3d,1,0x5e69,1,0x3862,2, +0xd848,0xdd83,1,0x387c,1,0x5eb0,1,0x5eb3,1,0x5eb6,2,0xd868,0xdf92,1,0x5efe,2, +0xd848,0xdf31,1,0x8201,1,0x5f22,1,0x38c7,2,0xd84c,0xdeb8,2,0xd858,0xddda,1,0x5f62, +1,0x5f6b,1,0x38e3,1,0x5f9a,1,0x5fcd,1,0x5fd7,1,0x5ff9,1,0x6081,1,0x393a, +1,0x391c,2,0xd849,0xded4,1,0x60c7,1,0x6148,1,0x614c,1,0x617a,1,0x61b2,1, +0x61a4,1,0x61af,1,0x61de,1,0x6210,1,0x621b,1,0x625d,1,0x62b1,1,0x62d4,1, +0x6350,2,0xd84a,0xdf0c,1,0x633d,1,0x62fc,1,0x6368,1,0x6383,1,0x63e4,2,0xd84a, +0xdff1,1,0x6422,1,0x63c5,1,0x63a9,1,0x3a2e,1,0x6469,1,0x647e,1,0x649d,1, +0x6477,1,0x3a6c,1,0x656c,2,0xd84c,0xdc0a,1,0x65e3,1,0x66f8,1,0x6649,1,0x3b19, +1,0x3b08,1,0x3ae4,1,0x5192,1,0x5195,1,0x6700,1,0x669c,1,0x80ad,1,0x43d9, +1,0x6721,1,0x675e,1,0x6753,2,0xd84c,0xdfc3,1,0x3b49,1,0x67fa,1,0x6785,1, +0x6852,2,0xd84d,0xdc6d,1,0x688e,1,0x681f,1,0x6914,1,0x6942,1,0x69a3,1,0x69ea, +1,0x6aa8,2,0xd84d,0xdea3,1,0x6adb,1,0x3c18,1,0x6b21,2,0xd84e,0xdca7,1,0x6b54, +1,0x3c4e,1,0x6b72,1,0x6b9f,1,0x6bbb,2,0xd84e,0xde8d,2,0xd847,0xdd0b,2,0xd84e, +0xdefa,1,0x6c4e,2,0xd84f,0xdcbc,1,0x6cbf,1,0x6ccd,1,0x6c67,1,0x6d16,1,0x6d3e, +1,0x6d69,1,0x6d78,1,0x6d85,2,0xd84f,0xdd1e,1,0x6d34,1,0x6e2f,1,0x6e6e,1, +0x3d33,1,0x6ec7,2,0xd84f,0xded1,1,0x6df9,1,0x6f6e,2,0xd84f,0xdf5e,2,0xd84f,0xdf8e, +1,0x6fc6,1,0x7039,1,0x701b,1,0x3d96,1,0x704a,1,0x707d,1,0x7077,1,0x70ad, +2,0xd841,0xdd25,1,0x7145,2,0xd850,0xde63,1,0x719c,2,0xd850,0xdfab,1,0x7228,1, +0x7250,2,0xd851,0xde08,1,0x7280,1,0x7295,2,0xd851,0xdf35,2,0xd852,0xdc14,1,0x737a, +1,0x738b,1,0x3eac,1,0x73a5,1,0x3eb8,1,0x7447,1,0x745c,1,0x7485,1,0x74ca, +1,0x3f1b,1,0x7524,2,0xd853,0xdc36,1,0x753e,2,0xd853,0xdc92,2,0xd848,0xdd9f,1, +0x7610,2,0xd853,0xdfa1,2,0xd853,0xdfb8,2,0xd854,0xdc44,1,0x3ffc,1,0x4008,2,0xd854, +0xdcf3,2,0xd854,0xdcf2,2,0xd854,0xdd19,2,0xd854,0xdd33,1,0x771e,1,0x771f,1,0x778b, +1,0x4046,1,0x4096,2,0xd855,0xdc1d,1,0x784e,1,0x40e3,2,0xd855,0xde26,2,0xd855, +0xde9a,2,0xd855,0xdec5,1,0x79eb,1,0x412f,1,0x7a4a,1,0x7a4f,2,0xd856,0xdd7c,2, +0xd856,0xdea7,1,0x7aee,1,0x4202,2,0xd856,0xdfab,1,0x7bc6,1,0x7bc9,1,0x4227,2, +0xd857,0xdc80,1,0x7cd2,1,0x42a0,1,0x7ce8,1,0x7ce3,1,0x7d00,2,0xd857,0xdf86,1, +0x7d63,1,0x4301,1,0x7dc7,1,0x7e02,1,0x7e45,1,0x4334,2,0xd858,0xde28,2,0xd858, +0xde47,1,0x4359,2,0xd858,0xded9,1,0x7f7a,2,0xd858,0xdf3e,1,0x7f95,1,0x7ffa,2, +0xd859,0xdcda,2,0xd859,0xdd23,1,0x8060,2,0xd859,0xdda8,1,0x8070,2,0xd84c,0xdf5f,1, +0x43d5,1,0x80b2,1,0x8103,1,0x440b,1,0x813e,1,0x5ab5,2,0xd859,0xdfa7,2,0xd859, +0xdfb5,2,0xd84c,0xdf93,2,0xd84c,0xdf9c,1,0x8204,1,0x8f9e,1,0x446b,1,0x8291,1, +0x828b,1,0x829d,1,0x52b3,1,0x82b1,1,0x82b3,1,0x82bd,1,0x82e6,2,0xd85a,0xdf3c, +1,0x831d,1,0x8363,1,0x83ad,1,0x8323,1,0x83bd,1,0x83e7,1,0x8353,1,0x83ca, +1,0x83cc,1,0x83dc,2,0xd85b,0xdc36,2,0xd85b,0xdd6b,2,0xd85b,0xdcd5,1,0x452b,1, +0x84f1,1,0x84f3,1,0x8516,2,0xd85c,0xdfca,1,0x8564,2,0xd85b,0xdf2c,1,0x455d,1, +0x4561,2,0xd85b,0xdfb1,2,0xd85c,0xdcd2,1,0x456b,1,0x8650,1,0x8667,1,0x8669,1, +0x86a9,1,0x8688,1,0x870e,1,0x86e2,1,0x8728,1,0x876b,1,0x8786,1,0x45d7,1, +0x87e1,1,0x8801,1,0x45f9,1,0x8860,1,0x8863,2,0xd85d,0xde67,1,0x88d7,1,0x88de, +1,0x4635,1,0x88fa,1,0x34bb,2,0xd85e,0xdcae,2,0xd85e,0xdd66,1,0x46be,1,0x46c7, +1,0x8aa0,1,0x8c55,2,0xd85f,0xdca8,1,0x8cab,1,0x8cc1,1,0x8d1b,1,0x8d77,2, +0xd85f,0xdf2f,2,0xd842,0xdc04,1,0x8dcb,1,0x8dbc,1,0x8df0,2,0xd842,0xdcde,1,0x8ed4, +2,0xd861,0xddd2,2,0xd861,0xdded,1,0x9094,1,0x90f1,1,0x9111,2,0xd861,0xdf2e,1, +0x911b,1,0x9238,1,0x92d7,1,0x92d8,1,0x927c,1,0x93f9,1,0x9415,2,0xd862,0xdffa, +1,0x958b,1,0x4995,1,0x95b7,2,0xd863,0xdd77,1,0x49e6,1,0x96c3,1,0x5db2,1, +0x9723,2,0xd864,0xdd45,2,0xd864,0xde1a,1,0x4a6e,1,0x4a76,1,0x97e0,2,0xd865,0xdc0a, +1,0x4ab2,2,0xd865,0xdc96,1,0x9829,2,0xd865,0xddb6,1,0x98e2,1,0x4b33,1,0x9929, +1,0x99a7,1,0x99c2,1,0x99fe,1,0x4bce,2,0xd866,0xdf30,1,0x9c40,1,0x9cfd,1, +0x4cce,1,0x4ced,1,0x9d67,2,0xd868,0xdcce,1,0x4cf8,2,0xd868,0xdd05,2,0xd868,0xde0e, +2,0xd868,0xde91,1,0x9ebb,1,0x4d56,1,0x9ef9,1,0x9efe,1,0x9f05,1,0x9f0f,1, +0x9f16,1,0x9f3b,2,0xd869,0xde00,0x3ac,0xe642,0x3b1,0x301,0x3ad,0xe642,0x3b5,0x301,0x3ae,0xe642, +0x3b7,0x301,0x3af,0xe642,0x3b9,0x301,0x3cc,0xe642,0x3bf,0x301,0x3cd,0xe642,0x3c5,0x301,0x3ce,0xe642, +0x3c9,0x301,0x386,0xe642,0x391,0x301,0x388,0xe642,0x395,0x301,0x389,0xe642,0x397,0x301,0x390,1, +0xe643,0x3b9,0x308,0x301,0x38a,0xe642,0x399,0x301,0x3b0,1,0xe643,0x3c5,0x308,0x301,0x38e,0xe642, +0x3a5,0x301,0x385,0xe642,0xa8,0x301,0x38c,0xe642,0x39f,0x301,0x38f,0xe642,0x3a9,0x301,0xc5,0xe642, +0x41,0x30a,0xe6e6,0xe681,0x300,0xe6e6,0xe681,0x301,0xe6e6,0xe681,0x313,0xe6e6,0xe682,0x308,0x301,0x8100, +0x8282,0xf71,0xf72,0x8100,0x8482,0xf71,0xf74,0x8100,0x8282,0xf71,0xf80,0 }; static const uint8_t norm2_nfc_data_smallFCD[256]={ -0xc0,0xef,3,0x7f,0xdf,0x70,0xcf,0x87,0xc7,0x66,0x66,0x46,0x64,0x44,0x66,0x5b, +0xc0,0xef,3,0x7f,0xdf,0x70,0xcf,0x87,0xc7,0x66,0x66,0x46,0x64,0x46,0x66,0x5b, 0x12,0,0,4,0,0,0,0x43,0x20,2,0x29,0xae,0xc2,0xc0,0xff,0xff, 0xc0,0x72,0xbf,0,0,0,0,0,0,0,0x40,0,0x80,0x88,0,0, 0xfe,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -1135,13 +1143,13 @@ static const UTrie2 norm2_nfc_data_trie={ norm2_nfc_data_trieIndex+2720, NULL, 2720, - 6932, + 7056, 0x188, 0xb1c, - 0x0, - 0x0, + 0x1, + 0x1, 0x30000, - 0x25b0, + 0x262c, NULL, 0, FALSE, FALSE, 0, NULL }; diff --git a/deps/icu-small/source/common/norm2allmodes.h b/deps/icu-small/source/common/norm2allmodes.h index 9516817e4aa8f3..682ece28f13092 100644 --- a/deps/icu-small/source/common/norm2allmodes.h +++ b/deps/icu-small/source/common/norm2allmodes.h @@ -5,7 +5,7 @@ * Copyright (C) 2014, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************* -* loadednormalizer2impl.h +* norm2allmodes.h * * created on: 2014sep07 * created by: Markus W. Scherer @@ -18,7 +18,9 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/unistr.h" #include "cpputils.h" #include "normalizer2impl.h" @@ -210,8 +212,8 @@ class DecomposeNormalizer2 : public Normalizer2WithImpl { virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const { return impl.isDecompYes(impl.getNorm16(c)) ? UNORM_YES : UNORM_NO; } - virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasDecompBoundary(c, TRUE); } - virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasDecompBoundary(c, FALSE); } + virtual UBool hasBoundaryBefore(UChar32 c) const { return impl.hasDecompBoundaryBefore(c); } + virtual UBool hasBoundaryAfter(UChar32 c) const { return impl.hasDecompBoundaryAfter(c); } virtual UBool isInert(UChar32 c) const { return impl.isDecompInert(c); } }; @@ -224,19 +226,35 @@ class ComposeNormalizer2 : public Normalizer2WithImpl { private: virtual void normalize(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.compose(src, limit, onlyContiguous, TRUE, buffer, errorCode); } using Normalizer2WithImpl::normalize; // Avoid warning about hiding base class function. + + void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + const uint8_t *s = reinterpret_cast(src.data()); + impl.composeUTF8(options, onlyContiguous, s, s + src.length(), + &sink, edits, errorCode); + sink.Flush(); + } + virtual void normalizeAndAppend(const UChar *src, const UChar *limit, UBool doNormalize, UnicodeString &safeMiddle, - ReorderingBuffer &buffer, UErrorCode &errorCode) const { + ReorderingBuffer &buffer, UErrorCode &errorCode) const U_OVERRIDE { impl.composeAndAppend(src, limit, doNormalize, onlyContiguous, safeMiddle, buffer, errorCode); } virtual UBool - isNormalized(const UnicodeString &s, UErrorCode &errorCode) const { + isNormalized(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { return FALSE; } @@ -252,8 +270,16 @@ class ComposeNormalizer2 : public Normalizer2WithImpl { } return impl.compose(sArray, sArray+s.length(), onlyContiguous, FALSE, buffer, errorCode); } + virtual UBool + isNormalizedUTF8(StringPiece sp, UErrorCode &errorCode) const U_OVERRIDE { + if(U_FAILURE(errorCode)) { + return FALSE; + } + const uint8_t *s = reinterpret_cast(sp.data()); + return impl.composeUTF8(0, onlyContiguous, s, s + sp.length(), nullptr, nullptr, errorCode); + } virtual UNormalizationCheckResult - quickCheck(const UnicodeString &s, UErrorCode &errorCode) const { + quickCheck(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE { if(U_FAILURE(errorCode)) { return UNORM_MAYBE; } @@ -267,21 +293,21 @@ class ComposeNormalizer2 : public Normalizer2WithImpl { return qcResult; } virtual const UChar * - spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &) const { + spanQuickCheckYes(const UChar *src, const UChar *limit, UErrorCode &) const U_OVERRIDE { return impl.composeQuickCheck(src, limit, onlyContiguous, NULL); } using Normalizer2WithImpl::spanQuickCheckYes; // Avoid warning about hiding base class function. - virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const { + virtual UNormalizationCheckResult getQuickCheck(UChar32 c) const U_OVERRIDE { return impl.getCompQuickCheck(impl.getNorm16(c)); } - virtual UBool hasBoundaryBefore(UChar32 c) const { + virtual UBool hasBoundaryBefore(UChar32 c) const U_OVERRIDE { return impl.hasCompBoundaryBefore(c); } - virtual UBool hasBoundaryAfter(UChar32 c) const { - return impl.hasCompBoundaryAfter(c, onlyContiguous, FALSE); + virtual UBool hasBoundaryAfter(UChar32 c) const U_OVERRIDE { + return impl.hasCompBoundaryAfter(c, onlyContiguous); } - virtual UBool isInert(UChar32 c) const { - return impl.hasCompBoundaryAfter(c, onlyContiguous, TRUE); + virtual UBool isInert(UChar32 c) const U_OVERRIDE { + return impl.isCompInert(c, onlyContiguous); } const UBool onlyContiguous; diff --git a/deps/icu-small/source/common/normalizer2.cpp b/deps/icu-small/source/common/normalizer2.cpp index dfdaa3bdce5f24..133770cbc4d9aa 100644 --- a/deps/icu-small/source/common/normalizer2.cpp +++ b/deps/icu-small/source/common/normalizer2.cpp @@ -20,7 +20,9 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/unistr.h" #include "unicode/unorm.h" #include "cstring.h" @@ -42,6 +44,20 @@ U_NAMESPACE_BEGIN Normalizer2::~Normalizer2() {} +void +Normalizer2::normalizeUTF8(uint32_t /*options*/, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return; + } + if (edits != nullptr) { + errorCode = U_UNSUPPORTED_ERROR; + return; + } + UnicodeString src16 = UnicodeString::fromUTF8(src); + normalize(src16, errorCode).toUTF8(sink); +} + UBool Normalizer2::getRawDecomposition(UChar32, UnicodeString &) const { return FALSE; @@ -57,6 +73,11 @@ Normalizer2::getCombiningClass(UChar32 /*c*/) const { return 0; } +UBool +Normalizer2::isNormalizedUTF8(StringPiece s, UErrorCode &errorCode) const { + return U_SUCCESS(errorCode) && isNormalized(UnicodeString::fromUTF8(s), errorCode); +} + // Normalizer2 implementation for the old UNORM_NONE. class NoopNormalizer2 : public Normalizer2 { virtual ~NoopNormalizer2(); @@ -64,7 +85,7 @@ class NoopNormalizer2 : public Normalizer2 { virtual UnicodeString & normalize(const UnicodeString &src, UnicodeString &dest, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_SUCCESS(errorCode)) { if(&dest!=&src) { dest=src; @@ -74,10 +95,27 @@ class NoopNormalizer2 : public Normalizer2 { } return dest; } + virtual void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE { + if(U_SUCCESS(errorCode)) { + if (edits != nullptr) { + if ((options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + edits->addUnchanged(src.length()); + } + if ((options & U_OMIT_UNCHANGED_TEXT) == 0) { + sink.Append(src.data(), src.length()); + } + sink.Flush(); + } + } + virtual UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_SUCCESS(errorCode)) { if(&first!=&second) { first.append(second); @@ -90,7 +128,7 @@ class NoopNormalizer2 : public Normalizer2 { virtual UnicodeString & append(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const { + UErrorCode &errorCode) const U_OVERRIDE { if(U_SUCCESS(errorCode)) { if(&first!=&second) { first.append(second); @@ -101,25 +139,29 @@ class NoopNormalizer2 : public Normalizer2 { return first; } virtual UBool - getDecomposition(UChar32, UnicodeString &) const { + getDecomposition(UChar32, UnicodeString &) const U_OVERRIDE { return FALSE; } - // No need to override the default getRawDecomposition(). + // No need to U_OVERRIDE the default getRawDecomposition(). + virtual UBool + isNormalized(const UnicodeString &, UErrorCode &errorCode) const U_OVERRIDE { + return U_SUCCESS(errorCode); + } virtual UBool - isNormalized(const UnicodeString &, UErrorCode &) const { - return TRUE; + isNormalizedUTF8(StringPiece, UErrorCode &errorCode) const U_OVERRIDE { + return U_SUCCESS(errorCode); } virtual UNormalizationCheckResult - quickCheck(const UnicodeString &, UErrorCode &) const { + quickCheck(const UnicodeString &, UErrorCode &) const U_OVERRIDE { return UNORM_YES; } virtual int32_t - spanQuickCheckYes(const UnicodeString &s, UErrorCode &) const { + spanQuickCheckYes(const UnicodeString &s, UErrorCode &) const U_OVERRIDE { return s.length(); } - virtual UBool hasBoundaryBefore(UChar32) const { return TRUE; } - virtual UBool hasBoundaryAfter(UChar32) const { return TRUE; } - virtual UBool isInert(UChar32) const { return TRUE; } + virtual UBool hasBoundaryBefore(UChar32) const U_OVERRIDE { return TRUE; } + virtual UBool hasBoundaryAfter(UChar32) const U_OVERRIDE { return TRUE; } + virtual UBool isInert(UChar32) const U_OVERRIDE { return TRUE; } }; NoopNormalizer2::~NoopNormalizer2() {} diff --git a/deps/icu-small/source/common/normalizer2impl.cpp b/deps/icu-small/source/common/normalizer2impl.cpp index 41305cc5878187..15b4a528934779 100644 --- a/deps/icu-small/source/common/normalizer2impl.cpp +++ b/deps/icu-small/source/common/normalizer2impl.cpp @@ -20,10 +20,15 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/bytestream.h" +#include "unicode/edits.h" #include "unicode/normalizer2.h" +#include "unicode/stringoptions.h" #include "unicode/udata.h" #include "unicode/ustring.h" #include "unicode/utf16.h" +#include "unicode/utf8.h" +#include "bytesinkutil.h" #include "cmemory.h" #include "mutex.h" #include "normalizer2impl.h" @@ -35,8 +40,142 @@ U_NAMESPACE_BEGIN +namespace { + +/** + * UTF-8 lead byte for minNoMaybeCP. + * Can be lower than the actual lead byte for c. + * Typically U+0300 for NFC/NFD, U+00A0 for NFKC/NFKD, U+0041 for NFKC_Casefold. + */ +inline uint8_t leadByteForCP(UChar32 c) { + if (c <= 0x7f) { + return (uint8_t)c; + } else if (c <= 0x7ff) { + return (uint8_t)(0xc0+(c>>6)); + } else { + // Should not occur because ccc(U+0300)!=0. + return 0xe0; + } +} + +/** + * Returns the code point from one single well-formed UTF-8 byte sequence + * between cpStart and cpLimit. + * + * UTrie2 UTF-8 macros do not assemble whole code points (for efficiency). + * When we do need the code point, we call this function. + * We should not need it for normalization-inert data (norm16==0). + * Illegal sequences yield the error value norm16==0 just like real normalization-inert code points. + */ +UChar32 codePointFromValidUTF8(const uint8_t *cpStart, const uint8_t *cpLimit) { + // Similar to U8_NEXT_UNSAFE(s, i, c). + U_ASSERT(cpStart < cpLimit); + uint8_t c = *cpStart; + switch(cpLimit-cpStart) { + case 1: + return c; + case 2: + return ((c&0x1f)<<6) | (cpStart[1]&0x3f); + case 3: + // no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (UChar) + return (UChar)((c<<12) | ((cpStart[1]&0x3f)<<6) | (cpStart[2]&0x3f)); + case 4: + return ((c&7)<<18) | ((cpStart[1]&0x3f)<<12) | ((cpStart[2]&0x3f)<<6) | (cpStart[3]&0x3f); + default: + U_ASSERT(FALSE); // Should not occur. + return U_SENTINEL; + } +} + +/** + * Returns the last code point in [start, p[ if it is valid and in U+1000..U+D7FF. + * Otherwise returns a negative value. + */ +UChar32 previousHangulOrJamo(const uint8_t *start, const uint8_t *p) { + if ((p - start) >= 3) { + p -= 3; + uint8_t l = *p; + uint8_t t1, t2; + if (0xe1 <= l && l <= 0xed && + (t1 = (uint8_t)(p[1] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(p[2] - 0x80)) <= 0x3f && + (l < 0xed || t1 <= 0x1f)) { + return ((l & 0xf) << 12) | (t1 << 6) | t2; + } + } + return U_SENTINEL; +} + +/** + * Returns the offset from the Jamo T base if [src, limit[ starts with a single Jamo T code point. + * Otherwise returns a negative value. + */ +int32_t getJamoTMinusBase(const uint8_t *src, const uint8_t *limit) { + // Jamo T: E1 86 A8..E1 87 82 + if ((limit - src) >= 3 && *src == 0xe1) { + if (src[1] == 0x86) { + uint8_t t = src[2]; + // The first Jamo T is U+11A8 but JAMO_T_BASE is 11A7. + // Offset 0 does not correspond to any conjoining Jamo. + if (0xa8 <= t && t <= 0xbf) { + return t - 0xa7; + } + } else if (src[1] == 0x87) { + uint8_t t = src[2]; + if ((int8_t)t <= (int8_t)0x82) { + return t - (0xa7 - 0x40); + } + } + } + return -1; +} + +void +appendCodePointDelta(const uint8_t *cpStart, const uint8_t *cpLimit, int32_t delta, + ByteSink &sink, Edits *edits) { + char buffer[U8_MAX_LENGTH]; + int32_t length; + int32_t cpLength = (int32_t)(cpLimit - cpStart); + if (cpLength == 1) { + // The builder makes ASCII map to ASCII. + buffer[0] = (uint8_t)(*cpStart + delta); + length = 1; + } else { + int32_t trail = *(cpLimit-1) + delta; + if (0x80 <= trail && trail <= 0xbf) { + // The delta only changes the last trail byte. + --cpLimit; + length = 0; + do { buffer[length++] = *cpStart++; } while (cpStart < cpLimit); + buffer[length++] = (uint8_t)trail; + } else { + // Decode the code point, add the delta, re-encode. + UChar32 c = codePointFromValidUTF8(cpStart, cpLimit) + delta; + length = 0; + U8_APPEND_UNSAFE(buffer, length, c); + } + } + if (edits != nullptr) { + edits->addReplace(cpLength, length); + } + sink.Append(buffer, length); +} + +} // namespace + // ReorderingBuffer -------------------------------------------------------- *** +ReorderingBuffer::ReorderingBuffer(const Normalizer2Impl &ni, UnicodeString &dest, + UErrorCode &errorCode) : + impl(ni), str(dest), + start(str.getBuffer(8)), reorderStart(start), limit(start), + remainingCapacity(str.getCapacity()), lastCC(0) { + if (start == nullptr && U_SUCCESS(errorCode)) { + // getBuffer() already did str.setToBogus() + errorCode = U_MEMORY_ALLOCATION_ERROR; + } +} + UBool ReorderingBuffer::init(int32_t destCapacity, UErrorCode &errorCode) { int32_t length=str.length(); start=str.getBuffer(destCapacity); @@ -69,6 +208,32 @@ UBool ReorderingBuffer::equals(const UChar *otherStart, const UChar *otherLimit) 0==u_memcmp(start, otherStart, length); } +UBool ReorderingBuffer::equals(const uint8_t *otherStart, const uint8_t *otherLimit) const { + U_ASSERT((otherLimit - otherStart) <= INT32_MAX); // ensured by caller + int32_t length = (int32_t)(limit - start); + int32_t otherLength = (int32_t)(otherLimit - otherStart); + // For equal strings, UTF-8 is at least as long as UTF-16, and at most three times as long. + if (otherLength < length || (otherLength / 3) > length) { + return FALSE; + } + // Compare valid strings from between normalization boundaries. + // (Invalid sequences are normalization-inert.) + for (int32_t i = 0, j = 0;;) { + if (i >= length) { + return j >= otherLength; + } else if (j >= otherLength) { + return FALSE; + } + // Not at the end of either string yet. + UChar32 c, other; + U16_NEXT_UNSAFE(start, i, c); + U8_NEXT_UNSAFE(otherStart, j, other); + if (c != other) { + return FALSE; + } + } +} + UBool ReorderingBuffer::appendSupplementary(UChar32 c, uint8_t cc, UErrorCode &errorCode) { if(remainingCapacity<2 && !resize(2, errorCode)) { return FALSE; @@ -216,16 +381,12 @@ uint8_t ReorderingBuffer::previousCC() { return 0; } UChar32 c=*--codePointStart; - if(c>DELTA_SHIFT)-MAX_DELTA-1; normTrie=inTrie; maybeYesCompositions=inExtraData; - extraData=maybeYesCompositions+(MIN_NORMAL_MAYBE_YES-minMaybeYes); + extraData=maybeYesCompositions+((MIN_NORMAL_MAYBE_YES-minMaybeYes)>>OFFSET_SHIFT); smallFCD=inSmallFCD; - - // Build tccc180[]. - // gennorm2 enforces lccc=0 for c>=1) { - if((c&0xff)==0) { - bits=smallFCD[c>>8]; // one byte per 0x100 code points - } - if(bits&1) { - for(int i=0; i<0x20; ++i, ++c) { - tccc180[c]=(uint8_t)getFCD16FromNormData(c); - } - } else { - uprv_memset(tccc180+c, 0, 0x20); - c+=0x20; - } - } -} - -uint8_t Normalizer2Impl::getTrailCCFromCompYesAndZeroCC(const UChar *cpStart, const UChar *cpLimit) const { - UChar32 c; - if(cpStart==(cpLimit-1)) { - c=*cpStart; - } else { - c=U16_GET_SUPPLEMENTARY(cpStart[0], cpStart[1]); - } - uint16_t prevNorm16=getNorm16(c); - if(prevNorm16<=minYesNo) { - return 0; // yesYes and Hangul LV/LVT have ccc=tccc=0 - } else { - return (uint8_t)(*getMapping(prevNorm16)>>8); // tccc from yesNo - } } -namespace { - class LcccContext { public: LcccContext(const Normalizer2Impl &ni, UnicodeSet &s) : impl(ni), set(s) {} void handleRange(UChar32 start, UChar32 end, uint16_t norm16) { - if(impl.isAlgorithmicNoNo(norm16)) { - // Range of code points with same-norm16-value algorithmic decompositions. - // They might have different non-zero FCD16 values. - do { - uint16_t fcd16=impl.getFCD16(start); - if(fcd16>0xff) { set.add(start); } - } while(++start<=end); - } else { + if (norm16 > Normalizer2Impl::MIN_NORMAL_MAYBE_YES && + norm16 != Normalizer2Impl::JAMO_VT) { + set.add(start, end); + } else if (impl.minNoNoCompNoMaybeCC <= norm16 && norm16 < impl.limitNoNo) { uint16_t fcd16=impl.getFCD16(start); if(fcd16>0xff) { set.add(start, end); } } @@ -335,6 +464,8 @@ class LcccContext { UnicodeSet &set; }; +namespace { + struct PropertyStartsContext { PropertyStartsContext(const Normalizer2Impl &ni, const USetAdder *adder) : impl(ni), sa(adder) {} @@ -359,7 +490,8 @@ enumNorm16PropertyStartsRange(const void *context, UChar32 start, UChar32 end, u const PropertyStartsContext *ctx=(const PropertyStartsContext *)context; const USetAdder *sa=ctx->sa; sa->add(sa->set, start); - if(start!=end && ctx->impl.isAlgorithmicNoNo((uint16_t)value)) { + if (start != end && ctx->impl.isAlgorithmicNoNo((uint16_t)value) && + (value & Normalizer2Impl::DELTA_TCCC_MASK) > Normalizer2Impl::DELTA_TCCC_1) { // Range of code points with same-norm16-value algorithmic decompositions. // They might have different non-zero FCD16 values. uint16_t prevFCD16=ctx->impl.getFCD16(start); @@ -391,7 +523,6 @@ U_CDECL_END void Normalizer2Impl::addLcccChars(UnicodeSet &set) const { - /* add the start code point of each same-value range of each trie */ LcccContext context(*this, set); utrie2_enum(normTrie, NULL, enumLcccRange, &context); } @@ -568,77 +699,174 @@ Normalizer2Impl::decompose(const UChar *src, const UChar *limit, // fail the quick check loop and/or where the quick check loop's overhead // is unlikely to be amortized. // Called by the compose() and makeFCD() implementations. -UBool Normalizer2Impl::decomposeShort(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, - UErrorCode &errorCode) const { +const UChar * +Normalizer2Impl::decomposeShort(const UChar *src, const UChar *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return nullptr; + } while(src= limitNoNo) { + if (isMaybeOrNonZeroCC(norm16)) { return buffer.append(c, getCCFromYesOrMaybe(norm16), errorCode); - } else if(isHangul(norm16)) { + } + // Maps to an isCompYesAndZeroCC. + c=mapAlgorithmic(c, norm16); + norm16=getNorm16(c); + } + if (norm16 < minYesNo) { + // c does not decompose + return buffer.append(c, 0, errorCode); + } else if(isHangulLV(norm16) || isHangulLVT(norm16)) { + // Hangul syllable: decompose algorithmically + UChar jamos[3]; + return buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode); + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + int32_t length=firstUnit&MAPPING_LENGTH_MASK; + uint8_t leadCC, trailCC; + trailCC=(uint8_t)(firstUnit>>8); + if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { + leadCC=(uint8_t)(*(mapping-1)>>8); + } else { + leadCC=0; + } + return buffer.append((const UChar *)mapping+1, length, leadCC, trailCC, errorCode); +} + +const uint8_t * +Normalizer2Impl::decomposeShort(const uint8_t *src, const uint8_t *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const { + if (U_FAILURE(errorCode)) { + return nullptr; + } + while (src < limit) { + const uint8_t *prevSrc = src; + uint16_t norm16; + UTRIE2_U8_NEXT16(normTrie, src, limit, norm16); + // Get the decomposition and the lead and trail cc's. + UChar32 c = U_SENTINEL; + if (norm16 >= limitNoNo) { + if (isMaybeOrNonZeroCC(norm16)) { + // No boundaries around this character. + c = codePointFromValidUTF8(prevSrc, src); + if (!buffer.append(c, getCCFromYesOrMaybe(norm16), errorCode)) { + return nullptr; + } + continue; + } + // Maps to an isCompYesAndZeroCC. + if (stopAtCompBoundary) { + return prevSrc; + } + c = codePointFromValidUTF8(prevSrc, src); + c = mapAlgorithmic(c, norm16); + norm16 = getNorm16(c); + } else if (stopAtCompBoundary && norm16 < minNoNoCompNoMaybeCC) { + return prevSrc; + } + // norm16!=INERT guarantees that [prevSrc, src[ is valid UTF-8. + // We do not see invalid UTF-8 here because + // its norm16==INERT is normalization-inert, + // so it gets copied unchanged in the fast path, + // and we stop the slow path where invalid UTF-8 begins. + U_ASSERT(norm16 != INERT); + if (norm16 < minYesNo) { + if (c < 0) { + c = codePointFromValidUTF8(prevSrc, src); + } + // does not decompose + if (!buffer.append(c, 0, errorCode)) { + return nullptr; + } + } else if (isHangulLV(norm16) || isHangulLVT(norm16)) { // Hangul syllable: decompose algorithmically - UChar jamos[3]; - return buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode); - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - norm16=getNorm16(c); + if (c < 0) { + c = codePointFromValidUTF8(prevSrc, src); + } + char16_t jamos[3]; + if (!buffer.appendZeroCC(jamos, jamos+Hangul::decompose(c, jamos), errorCode)) { + return nullptr; + } } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - int32_t length=firstUnit&MAPPING_LENGTH_MASK; - uint8_t leadCC, trailCC; - trailCC=(uint8_t)(firstUnit>>8); - if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { - leadCC=(uint8_t)(*(mapping-1)>>8); + // The character decomposes, get everything from the variable-length extra data. + const uint16_t *mapping = getMapping(norm16); + uint16_t firstUnit = *mapping; + int32_t length = firstUnit & MAPPING_LENGTH_MASK; + uint8_t trailCC = (uint8_t)(firstUnit >> 8); + uint8_t leadCC; + if (firstUnit & MAPPING_HAS_CCC_LCCC_WORD) { + leadCC = (uint8_t)(*(mapping-1) >> 8); } else { - leadCC=0; + leadCC = 0; + } + if (!buffer.append((const char16_t *)mapping+1, length, leadCC, trailCC, errorCode)) { + return nullptr; } - return buffer.append((const UChar *)mapping+1, length, leadCC, trailCC, errorCode); + } + if (stopAtCompBoundary && norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + return src; } } + return src; } const UChar * Normalizer2Impl::getDecomposition(UChar32 c, UChar buffer[4], int32_t &length) const { - const UChar *decomp=NULL; uint16_t norm16; - for(;;) { - if(c>7)&1)-1; - uint16_t rm0=*rawMapping; - if(rm0<=MAPPING_LENGTH_MASK) { - length=rm0; - return (const UChar *)rawMapping-rm0; - } else { - // Copy the normal mapping and replace its first two code units with rm0. - buffer[0]=(UChar)rm0; - u_memcpy(buffer+1, (const UChar *)mapping+1+2, mLength-2); - length=mLength-1; - return buffer; - } + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + int32_t mLength=firstUnit&MAPPING_LENGTH_MASK; // length of normal mapping + if(firstUnit&MAPPING_HAS_RAW_MAPPING) { + // Read the raw mapping from before the firstUnit and before the optional ccc/lccc word. + // Bit 7=MAPPING_HAS_CCC_LCCC_WORD + const uint16_t *rawMapping=mapping-((firstUnit>>7)&1)-1; + uint16_t rm0=*rawMapping; + if(rm0<=MAPPING_LENGTH_MASK) { + length=rm0; + return (const UChar *)rawMapping-rm0; } else { - length=mLength; - return (const UChar *)mapping+1; + // Copy the normal mapping and replace its first two code units with rm0. + buffer[0]=(UChar)rm0; + u_memcpy(buffer+1, (const UChar *)mapping+1+2, mLength-2); + length=mLength-1; + return buffer; } + } else { + length=mLength; + return (const UChar *)mapping+1; } } @@ -717,43 +942,60 @@ void Normalizer2Impl::decomposeAndAppend(const UChar *src, const UChar *limit, } } -// Note: hasDecompBoundary() could be implemented as aliases to -// hasFCDBoundaryBefore() and hasFCDBoundaryAfter() -// at the cost of building the FCD trie for a decomposition normalizer. -UBool Normalizer2Impl::hasDecompBoundary(UChar32 c, UBool before) const { - for(;;) { - if(cMIN_NORMAL_MAYBE_YES) { - return FALSE; // ccc!=0 - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - if((firstUnit&MAPPING_LENGTH_MASK)==0) { - return FALSE; - } - if(!before) { - // decomp after-boundary: same as hasFCDBoundaryAfter(), - // fcd16<=1 || trailCC==0 - if(firstUnit>0x1ff) { - return FALSE; // trailCC>1 - } - if(firstUnit<=0xff) { - return TRUE; // trailCC==0 - } - // if(trailCC==1) test leadCC==0, same as checking for before-boundary - } - // TRUE if leadCC==0 (hasFCDBoundaryBefore()) - return (firstUnit&MAPPING_HAS_CCC_LCCC_WORD)==0 || (*(mapping-1)&0xff00)==0; - } +UBool Normalizer2Impl::hasDecompBoundaryBefore(UChar32 c) const { + return c < minLcccCP || (c <= 0xffff && !singleLeadMightHaveNonZeroFCD16(c)) || + norm16HasDecompBoundaryBefore(getNorm16(c)); +} + +UBool Normalizer2Impl::norm16HasDecompBoundaryBefore(uint16_t norm16) const { + if (norm16 < minNoNoCompNoMaybeCC) { + return TRUE; } + if (norm16 >= limitNoNo) { + return norm16 <= MIN_NORMAL_MAYBE_YES || norm16 == JAMO_VT; + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + // TRUE if leadCC==0 (hasFCDBoundaryBefore()) + return (firstUnit&MAPPING_HAS_CCC_LCCC_WORD)==0 || (*(mapping-1)&0xff00)==0; +} + +UBool Normalizer2Impl::hasDecompBoundaryAfter(UChar32 c) const { + if (c < minDecompNoCP) { + return TRUE; + } + if (c <= 0xffff && !singleLeadMightHaveNonZeroFCD16(c)) { + return TRUE; + } + return norm16HasDecompBoundaryAfter(getNorm16(c)); +} + +UBool Normalizer2Impl::norm16HasDecompBoundaryAfter(uint16_t norm16) const { + if(norm16 <= minYesNo || isHangulLVT(norm16)) { + return TRUE; + } + if (norm16 >= limitNoNo) { + if (isMaybeOrNonZeroCC(norm16)) { + return norm16 <= MIN_NORMAL_MAYBE_YES || norm16 == JAMO_VT; + } + // Maps to an isCompYesAndZeroCC. + return (norm16 & DELTA_TCCC_MASK) <= DELTA_TCCC_1; + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + // decomp after-boundary: same as hasFCDBoundaryAfter(), + // fcd16<=1 || trailCC==0 + if(firstUnit>0x1ff) { + return FALSE; // trailCC>1 + } + if(firstUnit<=0xff) { + return TRUE; // trailCC==0 + } + // if(trailCC==1) test leadCC==0, same as checking for before-boundary + // TRUE if leadCC==0 (hasFCDBoundaryBefore()) + return (firstUnit&MAPPING_HAS_CCC_LCCC_WORD)==0 || (*(mapping-1)&0xff00)==0; } /* @@ -1031,6 +1273,7 @@ Normalizer2Impl::composePair(UChar32 a, UChar32 b) const { if(isInert(norm16)) { return U_SENTINEL; } else if(norm16minYesNo) { // composite 'a' has both mapping & compositions list list+= // mapping pointer - 1+ // +1 to skip the first unit with the mapping lenth + 1+ // +1 to skip the first unit with the mapping length (*list&MAPPING_LENGTH_MASK); // + mapping length } } } else if(norm16=minNoNo. + // The current character is either a "noNo" (has a mapping) + // or a "maybeYes" (combines backward) + // or a "yesYes" with ccc!=0. + // It is not a Hangul syllable or Jamo L because those have "yes" properties. + + // Medium-fast path: Handle cases that do not require full decomposition and recomposition. + if (!isMaybeOrNonZeroCC(norm16)) { // minNoNo <= norm16 < minMaybeYes + if (!doCompose) { + return FALSE; } - // Set prevBoundary to the last character in the quick check loop. - prevBoundary=src-1; - if( U16_IS_TRAIL(*prevBoundary) && prevSrc(getMapping(norm16)); + int32_t length = *mapping++ & MAPPING_LENGTH_MASK; + if(!buffer.appendZeroCC(mapping, mapping + length, errorCode)) { + break; + } + prevBoundary = src; + continue; + } + } else if (norm16 >= minNoNoEmpty) { + // The current character maps to nothing. + // Simply omit it from the output if there is a boundary before _or_ after it. + // The character itself implies no boundaries. + if (hasCompBoundaryBefore(src, limit) || + hasCompBoundaryAfter(prevBoundary, prevSrc, onlyContiguous)) { + if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; + } + prevBoundary = src; + continue; + } } - // The start of the current character (c). - prevSrc=src; - } else if(src==limit) { - break; - } - - src+=U16_LENGTH(c); - /* - * isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. - * c is either a "noNo" (has a mapping) or a "maybeYes" (combines backward) - * or has ccc!=0. - * Check for Jamo V/T, then for regular characters. - * c is not a Hangul syllable or Jamo L because those have "yes" properties. - */ - if(isJamoVT(norm16) && prevBoundary!=prevSrc) { + // Other "noNo" type, or need to examine more text around this character: + // Fall through to the slow path. + } else if (isJamoVT(norm16) && prevBoundary != prevSrc) { UChar prev=*(prevSrc-1); - UBool needToDecompose=FALSE; if(c= 0) { + UChar32 syllable = Hangul::HANGUL_BASE + + (l*Hangul::JAMO_V_COUNT + (c-Hangul::JAMO_V_BASE)) * + Hangul::JAMO_T_COUNT + t; + --prevSrc; // Replace the Jamo L as well. + if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; + } + if(!buffer.appendBMP((UChar)syllable, 0, errorCode)) { + break; + } + prevBoundary = src; continue; } // If we see L+V+x where x!=T then we drop to the slow path, // decompose and recompose. // This is to deal with NFKC finding normal L and V but a - // compatibility variant of a T. We need to either fully compose that - // combination here (which would complicate the code and may not work - // with strange custom data) or use the slow path -- or else our replacing - // two input characters (L+V) with one output character (LV syllable) - // would violate the invariant that [prevBoundary..prevSrc[ has the same - // length as what we appended to the buffer since prevBoundary. - needToDecompose=TRUE; + // compatibility variant of a T. + // We need to either fully compose that combination here + // (which would complicate the code and may not work with strange custom data) + // or use the slow path. } - } else if(Hangul::isHangulWithoutJamoT(prev)) { - // c is a Jamo Trailing consonant, + } else if (Hangul::isHangulLV(prev)) { + // The current character is a Jamo Trailing consonant, // compose with previous Hangul LV that does not contain a Jamo T. - if(!doCompose) { + if (!doCompose) { return FALSE; } - buffer.setLastChar((UChar)(prev+c-Hangul::JAMO_T_BASE)); - prevBoundary=src; - continue; - } - if(!needToDecompose) { - // The Jamo V/T did not compose into a Hangul syllable. - if(doCompose) { - if(!buffer.appendBMP((UChar)c, 0, errorCode)) { - break; - } - } else { - prevCC=0; + UChar32 syllable = prev + c - Hangul::JAMO_T_BASE; + --prevSrc; // Replace the Hangul LV as well. + if (prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; } + if(!buffer.appendBMP((UChar)syllable, 0, errorCode)) { + break; + } + prevBoundary = src; continue; } - } - /* - * Source buffer pointers: - * - * all done quick check current char not yet - * "yes" but (c) processed - * may combine - * forward - * [-------------[-------------[-------------[-------------[ - * | | | | | - * orig. src prevBoundary prevSrc src limit - * - * - * Destination buffer pointers inside the ReorderingBuffer: - * - * all done might take not filled yet - * characters for - * reordering - * [-------------[-------------[-------------[ - * | | | | - * start reorderStart limit | - * +remainingCap.+ - */ - if(norm16>=MIN_YES_YES_WITH_CC) { - uint8_t cc=(uint8_t)norm16; // cc!=0 - if( onlyContiguous && // FCC - (doCompose ? buffer.getLastCC() : prevCC)==0 && - prevBoundarycc - ) { + // No matching context, or may need to decompose surrounding text first: + // Fall through to the slow path. + } else if (norm16 > JAMO_VT) { // norm16 >= MIN_YES_YES_WITH_CC + // One or more combining marks that do not combine-back: + // Check for canonical order, copy unchanged if ok and + // if followed by a character with a boundary-before. + uint8_t cc = getCCFromNormalYesOrMaybe(norm16); // cc!=0 + if (onlyContiguous /* FCC */ && getPreviousTrailCC(prevBoundary, prevSrc) > cc) { // Fails FCD test, need to decompose and contiguously recompose. - if(!doCompose) { + if (!doCompose) { return FALSE; } - } else if(doCompose) { - if(!buffer.append(c, cc, errorCode)) { - break; - } - continue; - } else if(prevCC<=cc) { - prevCC=cc; - continue; } else { - return FALSE; + // If !onlyContiguous (not FCC), then we ignore the tccc of + // the previous character which passed the quick check "yes && ccc==0" test. + const UChar *nextSrc; + uint16_t n16; + for (;;) { + if (src == limit) { + if (doCompose) { + buffer.appendZeroCC(prevBoundary, limit, errorCode); + } + return TRUE; + } + uint8_t prevCC = cc; + nextSrc = src; + UTRIE2_U16_NEXT16(normTrie, nextSrc, limit, c, n16); + if (n16 >= MIN_YES_YES_WITH_CC) { + cc = getCCFromNormalYesOrMaybe(n16); + if (prevCC > cc) { + if (!doCompose) { + return FALSE; + } + break; + } + } else { + break; + } + src = nextSrc; + } + // src is after the last in-order combining mark. + // If there is a boundary here, then we continue with no change. + if (norm16HasCompBoundaryBefore(n16)) { + if (isCompYesAndZeroCC(n16)) { + src = nextSrc; + } + continue; + } + // Use the slow path. There is no boundary in [prevSrc, src[. } - } else if(!doCompose && !isMaybeOrNonZeroCC(norm16)) { - return FALSE; } - /* - * Find appropriate boundaries around this character, - * decompose the source text from between the boundaries, - * and recompose it. - * - * We may need to remove the last few characters from the ReorderingBuffer - * to account for source text that was copied or appended - * but needs to take part in the recomposition. - */ - - /* - * Find the last composition boundary in [prevBoundary..src[. - * It is either the decomposition of the current character (at prevSrc), - * or prevBoundary. - */ - if(hasCompBoundaryBefore(c, norm16)) { - prevBoundary=prevSrc; - } else if(doCompose) { - buffer.removeSuffix((int32_t)(prevSrc-prevBoundary)); - } - - // Find the next composition boundary in [src..limit[ - - // modifies src to point to the next starter. - src=(UChar *)findNextCompBoundary(src, limit); - - // Decompose [prevBoundary..src[ into the buffer and then recompose that part of it. + // Slow path: Find the nearest boundaries around the current character, + // decompose and recompose. + if (prevBoundary != prevSrc && !norm16HasCompBoundaryBefore(norm16)) { + const UChar *p = prevSrc; + UTRIE2_U16_PREV16(normTrie, prevBoundary, p, c, norm16); + if (!norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + prevSrc = p; + } + } + if (doCompose && prevBoundary != prevSrc && !buffer.appendZeroCC(prevBoundary, prevSrc, errorCode)) { + break; + } int32_t recomposeStartIndex=buffer.length(); - if(!decomposeShort(prevBoundary, src, buffer, errorCode)) { + // We know there is not a boundary here. + decomposeShort(prevSrc, src, FALSE /* !stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + // Decompose until the next boundary. + src = decomposeShort(src, limit, TRUE /* stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + if (U_FAILURE(errorCode)) { break; } + if ((src - prevSrc) > INT32_MAX) { // guard before buffer.equals() + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + return TRUE; + } recompose(buffer, recomposeStartIndex, onlyContiguous); if(!doCompose) { - if(!buffer.equals(prevBoundary, src)) { + if(!buffer.equals(prevSrc, src)) { return FALSE; } buffer.remove(); - prevCC=0; } - - // Move to the next starter. We never need to look back before this point again. prevBoundary=src; } return TRUE; @@ -1340,30 +1600,28 @@ const UChar * Normalizer2Impl::composeQuickCheck(const UChar *src, const UChar *limit, UBool onlyContiguous, UNormalizationCheckResult *pQCResult) const { - /* - * prevBoundary points to the last character before the current one - * that has a composition boundary before it with ccc==0 and quick check "yes". - */ const UChar *prevBoundary=src; UChar32 minNoMaybeCP=minCompNoMaybeCP; if(limit==NULL) { UErrorCode errorCode=U_ZERO_ERROR; src=copyLowPrefixFromNulTerminated(src, minNoMaybeCP, NULL, errorCode); - if(prevBoundary=minNoNo. + // The current character is either a "noNo" (has a mapping) + // or a "maybeYes" (combines backward) + // or a "yesYes" with ccc!=0. + // It is not a Hangul syllable or Jamo L because those have "yes" properties. + + uint16_t prevNorm16 = INERT; + if (prevBoundary != prevSrc) { + if (norm16HasCompBoundaryBefore(norm16)) { + prevBoundary = prevSrc; + } else { + const UChar *p = prevSrc; + uint16_t n16; + UTRIE2_U16_PREV16(normTrie, prevBoundary, p, c, n16); + if (norm16HasCompBoundaryAfter(n16, onlyContiguous)) { + prevBoundary = prevSrc; + } else { + prevBoundary = p; + prevNorm16 = n16; + } } - prevCC=0; - // The start of the current character (c). - prevSrc=src; } - src+=U16_LENGTH(c); - /* - * isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. - * c is either a "noNo" (has a mapping) or a "maybeYes" (combines backward) - * or has ccc!=0. - */ if(isMaybeOrNonZeroCC(norm16)) { uint8_t cc=getCCFromYesOrMaybe(norm16); - if( onlyContiguous && // FCC - cc!=0 && - prevCC==0 && - prevBoundarycc - ) { - // Fails FCD test. - } else if(prevCC<=cc || cc==0) { - prevCC=cc; - if(norm16 cc) { + // The [prevBoundary..prevSrc[ character + // passed the quick check "yes && ccc==0" test + // but is out of canonical order with the current combining mark. + } else { + // If !onlyContiguous (not FCC), then we ignore the tccc of + // the previous character which passed the quick check "yes && ccc==0" test. + const UChar *nextSrc; + for (;;) { + if (norm16 < MIN_YES_YES_WITH_CC) { + if (pQCResult != nullptr) { + *pQCResult = UNORM_MAYBE; + } else { + return prevBoundary; + } + } + if (src == limit) { + return src; + } + uint8_t prevCC = cc; + nextSrc = src; + UTRIE2_U16_NEXT16(normTrie, nextSrc, limit, c, norm16); + if (isMaybeOrNonZeroCC(norm16)) { + cc = getCCFromYesOrMaybe(norm16); + if (!(prevCC <= cc || cc == 0)) { + break; + } } else { - return prevBoundary; + break; } + src = nextSrc; + } + // src is after the last in-order combining mark. + if (isCompYesAndZeroCC(norm16)) { + prevBoundary = src; + src = nextSrc; + continue; } - continue; } } if(pQCResult!=NULL) { @@ -1453,10 +1732,10 @@ void Normalizer2Impl::composeAndAppend(const UChar *src, const UChar *limit, ReorderingBuffer &buffer, UErrorCode &errorCode) const { if(!buffer.isEmpty()) { - const UChar *firstStarterInSrc=findNextCompBoundary(src, limit); + const UChar *firstStarterInSrc=findNextCompBoundary(src, limit, onlyContiguous); if(src!=firstStarterInSrc) { const UChar *lastStarterInDest=findPreviousCompBoundary(buffer.getStart(), - buffer.getLimit()); + buffer.getLimit(), onlyContiguous); int32_t destSuffixLength=(int32_t)(buffer.getLimit()-lastStarterInDest); UnicodeString middle(lastStarterInDest, destSuffixLength); buffer.removeSuffix(destSuffixLength); @@ -1481,91 +1760,349 @@ void Normalizer2Impl::composeAndAppend(const UChar *src, const UChar *limit, } } -/** - * Does c have a composition boundary before it? - * True if its decomposition begins with a character that has - * ccc=0 && NFC_QC=Yes (isCompYesAndZeroCC()). - * As a shortcut, this is true if c itself has ccc=0 && NFC_QC=Yes - * (isCompYesAndZeroCC()) so we need not decompose. - */ -UBool Normalizer2Impl::hasCompBoundaryBefore(UChar32 c, uint16_t norm16) const { - for(;;) { - if(isCompYesAndZeroCC(norm16)) { +UBool +Normalizer2Impl::composeUTF8(uint32_t options, UBool onlyContiguous, + const uint8_t *src, const uint8_t *limit, + ByteSink *sink, Edits *edits, UErrorCode &errorCode) const { + U_ASSERT(limit != nullptr); + UnicodeString s16; + uint8_t minNoMaybeLead = leadByteForCP(minCompNoMaybeCP); + const uint8_t *prevBoundary = src; + + for (;;) { + // Fast path: Scan over a sequence of characters below the minimum "no or maybe" code point, + // or with (compYes && ccc==0) properties. + const uint8_t *prevSrc; + uint16_t norm16 = 0; + for (;;) { + if (src == limit) { + if (prevBoundary != limit && sink != nullptr) { + ByteSinkUtil::appendUnchanged(prevBoundary, limit, + *sink, options, edits, errorCode); + } + return TRUE; + } + if (*src < minNoMaybeLead) { + ++src; + } else { + prevSrc = src; + UTRIE2_U8_NEXT16(normTrie, src, limit, norm16); + if (!isCompYesAndZeroCC(norm16)) { + break; + } + } + } + // isCompYesAndZeroCC(norm16) is false, that is, norm16>=minNoNo. + // The current character is either a "noNo" (has a mapping) + // or a "maybeYes" (combines backward) + // or a "yesYes" with ccc!=0. + // It is not a Hangul syllable or Jamo L because those have "yes" properties. + + // Medium-fast path: Handle cases that do not require full decomposition and recomposition. + if (!isMaybeOrNonZeroCC(norm16)) { // minNoNo <= norm16 < minMaybeYes + if (sink == nullptr) { + return FALSE; + } + // Fast path for mapping a character that is immediately surrounded by boundaries. + // In this case, we need not decompose around the current character. + if (isDecompNoAlgorithmic(norm16)) { + // Maps to a single isCompYesAndZeroCC character + // which also implies hasCompBoundaryBefore. + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous) || + hasCompBoundaryBefore(src, limit)) { + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + appendCodePointDelta(prevSrc, src, getAlgorithmicDelta(norm16), *sink, edits); + prevBoundary = src; + continue; + } + } else if (norm16 < minNoNoCompBoundaryBefore) { + // The mapping is comp-normalized which also implies hasCompBoundaryBefore. + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous) || + hasCompBoundaryBefore(src, limit)) { + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + const uint16_t *mapping = getMapping(norm16); + int32_t length = *mapping++ & MAPPING_LENGTH_MASK; + if (!ByteSinkUtil::appendChange(prevSrc, src, (const UChar *)mapping, length, + *sink, edits, errorCode)) { + break; + } + prevBoundary = src; + continue; + } + } else if (norm16 >= minNoNoEmpty) { + // The current character maps to nothing. + // Simply omit it from the output if there is a boundary before _or_ after it. + // The character itself implies no boundaries. + if (hasCompBoundaryBefore(src, limit) || + hasCompBoundaryAfter(prevBoundary, prevSrc, onlyContiguous)) { + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + if (edits != nullptr) { + edits->addReplace((int32_t)(src - prevSrc), 0); + } + prevBoundary = src; + continue; + } + } + // Other "noNo" type, or need to examine more text around this character: + // Fall through to the slow path. + } else if (isJamoVT(norm16)) { + // Jamo L: E1 84 80..92 + // Jamo V: E1 85 A1..B5 + // Jamo T: E1 86 A8..E1 87 82 + U_ASSERT((src - prevSrc) == 3 && *prevSrc == 0xe1); + UChar32 prev = previousHangulOrJamo(prevBoundary, prevSrc); + if (prevSrc[1] == 0x85) { + // The current character is a Jamo Vowel, + // compose with previous Jamo L and following Jamo T. + UChar32 l = prev - Hangul::JAMO_L_BASE; + if ((uint32_t)l < Hangul::JAMO_L_COUNT) { + if (sink == nullptr) { + return FALSE; + } + int32_t t = getJamoTMinusBase(src, limit); + if (t >= 0) { + // The next character is a Jamo T. + src += 3; + } else if (hasCompBoundaryBefore(src, limit)) { + // No Jamo T follows, not even via decomposition. + t = 0; + } + if (t >= 0) { + UChar32 syllable = Hangul::HANGUL_BASE + + (l*Hangul::JAMO_V_COUNT + (prevSrc[2]-0xa1)) * + Hangul::JAMO_T_COUNT + t; + prevSrc -= 3; // Replace the Jamo L as well. + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + ByteSinkUtil::appendCodePoint(prevSrc, src, syllable, *sink, edits); + prevBoundary = src; + continue; + } + // If we see L+V+x where x!=T then we drop to the slow path, + // decompose and recompose. + // This is to deal with NFKC finding normal L and V but a + // compatibility variant of a T. + // We need to either fully compose that combination here + // (which would complicate the code and may not work with strange custom data) + // or use the slow path. + } + } else if (Hangul::isHangulLV(prev)) { + // The current character is a Jamo Trailing consonant, + // compose with previous Hangul LV that does not contain a Jamo T. + if (sink == nullptr) { + return FALSE; + } + UChar32 syllable = prev + getJamoTMinusBase(prevSrc, src); + prevSrc -= 3; // Replace the Hangul LV as well. + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; + } + ByteSinkUtil::appendCodePoint(prevSrc, src, syllable, *sink, edits); + prevBoundary = src; + continue; + } + // No matching context, or may need to decompose surrounding text first: + // Fall through to the slow path. + } else if (norm16 > JAMO_VT) { // norm16 >= MIN_YES_YES_WITH_CC + // One or more combining marks that do not combine-back: + // Check for canonical order, copy unchanged if ok and + // if followed by a character with a boundary-before. + uint8_t cc = getCCFromNormalYesOrMaybe(norm16); // cc!=0 + if (onlyContiguous /* FCC */ && getPreviousTrailCC(prevBoundary, prevSrc) > cc) { + // Fails FCD test, need to decompose and contiguously recompose. + if (sink == nullptr) { + return FALSE; + } + } else { + // If !onlyContiguous (not FCC), then we ignore the tccc of + // the previous character which passed the quick check "yes && ccc==0" test. + const uint8_t *nextSrc; + uint16_t n16; + for (;;) { + if (src == limit) { + if (sink != nullptr) { + ByteSinkUtil::appendUnchanged(prevBoundary, limit, + *sink, options, edits, errorCode); + } + return TRUE; + } + uint8_t prevCC = cc; + nextSrc = src; + UTRIE2_U8_NEXT16(normTrie, nextSrc, limit, n16); + if (n16 >= MIN_YES_YES_WITH_CC) { + cc = getCCFromNormalYesOrMaybe(n16); + if (prevCC > cc) { + if (sink == nullptr) { + return FALSE; + } + break; + } + } else { + break; + } + src = nextSrc; + } + // src is after the last in-order combining mark. + // If there is a boundary here, then we continue with no change. + if (norm16HasCompBoundaryBefore(n16)) { + if (isCompYesAndZeroCC(n16)) { + src = nextSrc; + } + continue; + } + // Use the slow path. There is no boundary in [prevSrc, src[. + } + } + + // Slow path: Find the nearest boundaries around the current character, + // decompose and recompose. + if (prevBoundary != prevSrc && !norm16HasCompBoundaryBefore(norm16)) { + const uint8_t *p = prevSrc; + UTRIE2_U8_PREV16(normTrie, prevBoundary, p, norm16); + if (!norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + prevSrc = p; + } + } + ReorderingBuffer buffer(*this, s16, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + // We know there is not a boundary here. + decomposeShort(prevSrc, src, FALSE /* !stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + // Decompose until the next boundary. + src = decomposeShort(src, limit, TRUE /* stopAtCompBoundary */, onlyContiguous, + buffer, errorCode); + if (U_FAILURE(errorCode)) { + break; + } + if ((src - prevSrc) > INT32_MAX) { // guard before buffer.equals() + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; return TRUE; - } else if(isMaybeOrNonZeroCC(norm16)) { - return FALSE; - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - norm16=getNorm16(c); - } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - if((firstUnit&MAPPING_LENGTH_MASK)==0) { + } + recompose(buffer, 0, onlyContiguous); + if (!buffer.equals(prevSrc, src)) { + if (sink == nullptr) { return FALSE; } - if((firstUnit&MAPPING_HAS_CCC_LCCC_WORD) && (*(mapping-1)&0xff00)) { - return FALSE; // non-zero leadCC + if (prevBoundary != prevSrc && + !ByteSinkUtil::appendUnchanged(prevBoundary, prevSrc, + *sink, options, edits, errorCode)) { + break; } - int32_t i=1; // skip over the firstUnit - UChar32 c; - U16_NEXT_UNSAFE(mapping, i, c); - return isCompYesAndZeroCC(getNorm16(c)); + if (!ByteSinkUtil::appendChange(prevSrc, src, buffer.getStart(), buffer.length(), + *sink, edits, errorCode)) { + break; + } + prevBoundary = src; } } + return TRUE; } -UBool Normalizer2Impl::hasCompBoundaryAfter(UChar32 c, UBool onlyContiguous, UBool testInert) const { - for(;;) { - uint16_t norm16=getNorm16(c); - if(isInert(norm16)) { - return TRUE; - } else if(norm16<=minYesNo) { - // Hangul: norm16==minYesNo - // Hangul LVT has a boundary after it. - // Hangul LV and non-inert yesYes characters combine forward. - return isHangul(norm16) && !Hangul::isHangulWithoutJamoT((UChar)c); - } else if(norm16>= (testInert ? minNoNo : minMaybeYes)) { - return FALSE; - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - } else { - // c decomposes, get everything from the variable-length extra data. - // If testInert, then c must be a yesNo character which has lccc=0, - // otherwise it could be a noNo. - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - // TRUE if - // not MAPPING_NO_COMP_BOUNDARY_AFTER - // (which is set if - // c is not deleted, and - // it and its decomposition do not combine forward, and it has a starter) - // and if FCC then trailCC<=1 - return - (firstUnit&MAPPING_NO_COMP_BOUNDARY_AFTER)==0 && - (!onlyContiguous || firstUnit<=0x1ff); - } +UBool Normalizer2Impl::hasCompBoundaryBefore(const UChar *src, const UChar *limit) const { + if (src == limit || *src < minCompNoMaybeCP) { + return TRUE; } + UChar32 c; + uint16_t norm16; + UTRIE2_U16_NEXT16(normTrie, src, limit, c, norm16); + return norm16HasCompBoundaryBefore(norm16); } -const UChar *Normalizer2Impl::findPreviousCompBoundary(const UChar *start, const UChar *p) const { - BackwardUTrie2StringIterator iter(normTrie, start, p); +UBool Normalizer2Impl::hasCompBoundaryBefore(const uint8_t *src, const uint8_t *limit) const { + if (src == limit) { + return TRUE; + } uint16_t norm16; - do { - norm16=iter.previous16(); - } while(!hasCompBoundaryBefore(iter.codePoint, norm16)); - // We could also test hasCompBoundaryAfter() and return iter.codePointLimit, - // but that's probably not worth the extra cost. - return iter.codePointStart; + UTRIE2_U8_NEXT16(normTrie, src, limit, norm16); + return norm16HasCompBoundaryBefore(norm16); } -const UChar *Normalizer2Impl::findNextCompBoundary(const UChar *p, const UChar *limit) const { - ForwardUTrie2StringIterator iter(normTrie, p, limit); +UBool Normalizer2Impl::hasCompBoundaryAfter(const UChar *start, const UChar *p, + UBool onlyContiguous) const { + if (start == p) { + return TRUE; + } + UChar32 c; uint16_t norm16; - do { - norm16=iter.next16(); - } while(!hasCompBoundaryBefore(iter.codePoint, norm16)); - return iter.codePointStart; + UTRIE2_U16_PREV16(normTrie, start, p, c, norm16); + return norm16HasCompBoundaryAfter(norm16, onlyContiguous); +} + +UBool Normalizer2Impl::hasCompBoundaryAfter(const uint8_t *start, const uint8_t *p, + UBool onlyContiguous) const { + if (start == p) { + return TRUE; + } + uint16_t norm16; + UTRIE2_U8_PREV16(normTrie, start, p, norm16); + return norm16HasCompBoundaryAfter(norm16, onlyContiguous); +} + +const UChar *Normalizer2Impl::findPreviousCompBoundary(const UChar *start, const UChar *p, + UBool onlyContiguous) const { + BackwardUTrie2StringIterator iter(normTrie, start, p); + for(;;) { + uint16_t norm16=iter.previous16(); + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + return iter.codePointLimit; + } + if (hasCompBoundaryBefore(iter.codePoint, norm16)) { + return iter.codePointStart; + } + } +} + +const UChar *Normalizer2Impl::findNextCompBoundary(const UChar *p, const UChar *limit, + UBool onlyContiguous) const { + ForwardUTrie2StringIterator iter(normTrie, p, limit); + for(;;) { + uint16_t norm16=iter.next16(); + if (hasCompBoundaryBefore(iter.codePoint, norm16)) { + return iter.codePointStart; + } + if (norm16HasCompBoundaryAfter(norm16, onlyContiguous)) { + return iter.codePointLimit; + } + } +} + +uint8_t Normalizer2Impl::getPreviousTrailCC(const UChar *start, const UChar *p) const { + if (start == p) { + return 0; + } + int32_t i = (int32_t)(p - start); + UChar32 c; + U16_PREV(start, 0, i, c); + return (uint8_t)getFCD16(c); +} + +uint8_t Normalizer2Impl::getPreviousTrailCC(const uint8_t *start, const uint8_t *p) const { + if (start == p) { + return 0; + } + int32_t i = (int32_t)(p - start); + UChar32 c; + U8_PREV(start, 0, i, c); + return (uint8_t)getFCD16(c); } // Note: normalizer2impl.cpp r30982 (2011-nov-27) @@ -1573,43 +2110,41 @@ const UChar *Normalizer2Impl::findNextCompBoundary(const UChar *p, const UChar * // That provided faster access to FCD data than getFCD16FromNormData() // but required synchronization and consumed some 10kB of heap memory // in any process that uses FCD (e.g., via collation). -// tccc180[] and smallFCD[] are intended to help with any loss of performance, -// at least for Latin & CJK. +// minDecompNoCP etc. and smallFCD[] are intended to help with any loss of performance, +// at least for ASCII & CJK. // Gets the FCD value from the regular normalization data. uint16_t Normalizer2Impl::getFCD16FromNormData(UChar32 c) const { - // Only loops for 1:1 algorithmic mappings. - for(;;) { - uint16_t norm16=getNorm16(c); - if(norm16<=minYesNo) { - // no decomposition or Hangul syllable, all zeros - return 0; - } else if(norm16>=MIN_NORMAL_MAYBE_YES) { + uint16_t norm16=getNorm16(c); + if (norm16 >= limitNoNo) { + if(norm16>=MIN_NORMAL_MAYBE_YES) { // combining mark - norm16&=0xff; + norm16=getCCFromNormalYesOrMaybe(norm16); return norm16|(norm16<<8); } else if(norm16>=minMaybeYes) { return 0; - } else if(isDecompNoAlgorithmic(norm16)) { - c=mapAlgorithmic(c, norm16); - } else { - // c decomposes, get everything from the variable-length extra data - const uint16_t *mapping=getMapping(norm16); - uint16_t firstUnit=*mapping; - if((firstUnit&MAPPING_LENGTH_MASK)==0) { - // A character that is deleted (maps to an empty string) must - // get the worst-case lccc and tccc values because arbitrary - // characters on both sides will become adjacent. - return 0x1ff; - } else { - norm16=firstUnit>>8; // tccc - if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { - norm16|=*(mapping-1)&0xff00; // lccc - } - return norm16; + } else { // isDecompNoAlgorithmic(norm16) + uint16_t deltaTrailCC = norm16 & DELTA_TCCC_MASK; + if (deltaTrailCC <= DELTA_TCCC_1) { + return deltaTrailCC >> OFFSET_SHIFT; } + // Maps to an isCompYesAndZeroCC. + c=mapAlgorithmic(c, norm16); + norm16=getNorm16(c); } } + if(norm16<=minYesNo || isHangulLVT(norm16)) { + // no decomposition or Hangul syllable, all zeros + return 0; + } + // c decomposes, get everything from the variable-length extra data + const uint16_t *mapping=getMapping(norm16); + uint16_t firstUnit=*mapping; + norm16=firstUnit>>8; // tccc + if(firstUnit&MAPPING_HAS_CCC_LCCC_WORD) { + norm16|=*(mapping-1)&0xff00; // lccc + } + return norm16; } // Dual functionality: @@ -1624,7 +2159,7 @@ Normalizer2Impl::makeFCD(const UChar *src, const UChar *limit, const UChar *prevBoundary=src; int32_t prevFCD16=0; if(limit==NULL) { - src=copyLowPrefixFromNulTerminated(src, MIN_CCC_LCCC_CP, buffer, errorCode); + src=copyLowPrefixFromNulTerminated(src, minLcccCP, buffer, errorCode); if(U_FAILURE(errorCode)) { return src; } @@ -1653,7 +2188,7 @@ Normalizer2Impl::makeFCD(const UChar *src, const UChar *limit, for(;;) { // count code units with lccc==0 for(prevSrc=src; src!=limit;) { - if((c=*src)1) { - --prevBoundary; + if(prev1) { + --prevBoundary; + } } } else { const UChar *p=src-1; @@ -1748,7 +2287,8 @@ Normalizer2Impl::makeFCD(const UChar *src, const UChar *limit, * The source text does not fulfill the conditions for FCD. * Decompose and reorder a limited piece of the text. */ - if(!decomposeShort(prevBoundary, src, *buffer, errorCode)) { + decomposeShort(prevBoundary, src, FALSE, FALSE, *buffer, errorCode); + if (U_FAILURE(errorCode)) { break; } prevBoundary=src; @@ -1792,16 +2332,33 @@ void Normalizer2Impl::makeFCDAndAppend(const UChar *src, const UChar *limit, } const UChar *Normalizer2Impl::findPreviousFCDBoundary(const UChar *start, const UChar *p) const { - while(start

    0xff) {} + while(startmakeCanonIterDataFromNorm16( - start, end, (uint16_t)value, *impl->fCanonIterData, errorCode); + InitCanonIterData::handleRange(impl, start, end, (uint16_t)value, errorCode); } return U_SUCCESS(errorCode); } +U_CDECL_END - -// UInitOnce instantiation function for CanonIterData - -static void U_CALLCONV -initCanonIterData(Normalizer2Impl *impl, UErrorCode &errorCode) { +void InitCanonIterData::doInit(Normalizer2Impl *impl, UErrorCode &errorCode) { U_ASSERT(impl->fCanonIterData == NULL); impl->fCanonIterData = new CanonIterData(errorCode); if (impl->fCanonIterData == NULL) { errorCode=U_MEMORY_ALLOCATION_ERROR; } if (U_SUCCESS(errorCode)) { - utrie2_enum(impl->getNormTrie(), NULL, enumCIDRangeHandler, impl); + utrie2_enum(impl->normTrie, NULL, enumCIDRangeHandler, impl); utrie2_freeze(impl->fCanonIterData->trie, UTRIE2_32_VALUE_BITS, &errorCode); } if (U_FAILURE(errorCode)) { @@ -1881,12 +2447,15 @@ initCanonIterData(Normalizer2Impl *impl, UErrorCode &errorCode) { } } -U_CDECL_END +void InitCanonIterData::handleRange( + Normalizer2Impl *impl, UChar32 start, UChar32 end, uint16_t value, UErrorCode &errorCode) { + impl->makeCanonIterDataFromNorm16(start, end, value, *impl->fCanonIterData, errorCode); +} -void Normalizer2Impl::makeCanonIterDataFromNorm16(UChar32 start, UChar32 end, uint16_t norm16, +void Normalizer2Impl::makeCanonIterDataFromNorm16(UChar32 start, UChar32 end, const uint16_t norm16, CanonIterData &newData, UErrorCode &errorCode) const { - if(norm16==0 || (minYesNo<=norm16 && norm16=minMaybeYes) { + if(isMaybeOrNonZeroCC(norm16)) { // not a segment starter if it occurs in a decomposition or has cc!=0 newValue|=CANON_NOT_SEGMENT_STARTER; if(norm16 minYesNo) { // c decomposes, get everything from the variable-length extra data const uint16_t *mapping=getMapping(norm16_2); uint16_t firstUnit=*mapping; @@ -2017,7 +2590,7 @@ unorm2_swap(const UDataSwapper *ds, uint8_t *outBytes; const int32_t *inIndexes; - int32_t indexes[Normalizer2Impl::IX_MIN_MAYBE_YES+1]; + int32_t indexes[Normalizer2Impl::IX_TOTAL_SIZE+1]; int32_t i, offset, nextOffset, size; @@ -2029,12 +2602,13 @@ unorm2_swap(const UDataSwapper *ds, /* check data format and format version */ pInfo=(const UDataInfo *)((const char *)inData+4); + uint8_t formatVersion0=pInfo->formatVersion[0]; if(!( pInfo->dataFormat[0]==0x4e && /* dataFormat="Nrm2" */ pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6d && pInfo->dataFormat[3]==0x32 && - (pInfo->formatVersion[0]==1 || pInfo->formatVersion[0]==2) + (1<=formatVersion0 && formatVersion0<=3) )) { udata_printError(ds, "unorm2_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized as Normalizer2 data\n", pInfo->dataFormat[0], pInfo->dataFormat[1], @@ -2048,10 +2622,18 @@ unorm2_swap(const UDataSwapper *ds, outBytes=(uint8_t *)outData+headerSize; inIndexes=(const int32_t *)inBytes; + int32_t minIndexesLength; + if(formatVersion0==1) { + minIndexesLength=Normalizer2Impl::IX_MIN_MAYBE_YES+1; + } else if(formatVersion0==2) { + minIndexesLength=Normalizer2Impl::IX_MIN_YES_NO_MAPPINGS_ONLY+1; + } else { + minIndexesLength=Normalizer2Impl::IX_MIN_LCCC_CP+1; + } if(length>=0) { length-=headerSize; - if(length<(int32_t)sizeof(indexes)) { + if(length=MIN_NORMAL_MAYBE_YES) { - return (uint8_t)norm16; + return getCCFromNormalYesOrMaybe(norm16); } if(norm16> OFFSET_SHIFT); + } static uint8_t getCCFromYesOrMaybe(uint16_t norm16) { - return norm16>=MIN_NORMAL_MAYBE_YES ? (uint8_t)norm16 : 0; + return norm16>=MIN_NORMAL_MAYBE_YES ? getCCFromNormalYesOrMaybe(norm16) : 0; + } + uint8_t getCCFromYesOrMaybeCP(UChar32 c) const { + if (c < minCompNoMaybeCP) { return 0; } + return getCCFromYesOrMaybe(getNorm16(c)); } /** @@ -272,10 +295,8 @@ class U_COMMON_API Normalizer2Impl : public UObject { * @return The lccc(c) in bits 15..8 and tccc(c) in bits 7..0. */ uint16_t getFCD16(UChar32 c) const { - if(c<0) { + if(c1) for quick FCC boundary-after tests. + DELTA_TCCC_0=0, + DELTA_TCCC_1=2, + DELTA_TCCC_GT_1=4, + DELTA_TCCC_MASK=6, + DELTA_SHIFT=3, - enum { - MIN_YES_YES_WITH_CC=0xff01, - JAMO_VT=0xff00, - MIN_NORMAL_MAYBE_YES=0xfe00, - JAMO_L=1, MAX_DELTA=0x40 }; @@ -394,21 +419,32 @@ class U_COMMON_API Normalizer2Impl : public UObject { IX_MIN_COMP_NO_MAYBE_CP, // Norm16 value thresholds for quick check combinations and types of extra data. - IX_MIN_YES_NO, // Mappings & compositions in [minYesNo..minYesNoMappingsOnly[. + + /** Mappings & compositions in [minYesNo..minYesNoMappingsOnly[. */ + IX_MIN_YES_NO, + /** Mappings are comp-normalized. */ IX_MIN_NO_NO, IX_LIMIT_NO_NO, IX_MIN_MAYBE_YES, - IX_MIN_YES_NO_MAPPINGS_ONLY, // Mappings only in [minYesNoMappingsOnly..minNoNo[. - - IX_RESERVED15, + /** Mappings only in [minYesNoMappingsOnly..minNoNo[. */ + IX_MIN_YES_NO_MAPPINGS_ONLY, + /** Mappings are not comp-normalized but have a comp boundary before. */ + IX_MIN_NO_NO_COMP_BOUNDARY_BEFORE, + /** Mappings do not have a comp boundary before. */ + IX_MIN_NO_NO_COMP_NO_MAYBE_CC, + /** Mappings to the empty string. */ + IX_MIN_NO_NO_EMPTY, + + IX_MIN_LCCC_CP, + IX_RESERVED19, IX_COUNT }; enum { MAPPING_HAS_CCC_LCCC_WORD=0x80, MAPPING_HAS_RAW_MAPPING=0x40, - MAPPING_NO_COMP_BOUNDARY_AFTER=0x20, + // unused bit 0x20, MAPPING_LENGTH_MASK=0x1f }; @@ -457,6 +493,12 @@ class U_COMMON_API Normalizer2Impl : public UObject { UnicodeString &safeMiddle, ReorderingBuffer &buffer, UErrorCode &errorCode) const; + + /** sink==nullptr: isNormalized() */ + UBool composeUTF8(uint32_t options, UBool onlyContiguous, + const uint8_t *src, const uint8_t *limit, + ByteSink *sink, icu::Edits *edits, UErrorCode &errorCode) const; + const UChar *makeFCD(const UChar *src, const UChar *limit, ReorderingBuffer *buffer, UErrorCode &errorCode) const; void makeFCDAndAppend(const UChar *src, const UChar *limit, @@ -465,27 +507,42 @@ class U_COMMON_API Normalizer2Impl : public UObject { ReorderingBuffer &buffer, UErrorCode &errorCode) const; - UBool hasDecompBoundary(UChar32 c, UBool before) const; + UBool hasDecompBoundaryBefore(UChar32 c) const; + UBool norm16HasDecompBoundaryBefore(uint16_t norm16) const; + UBool hasDecompBoundaryAfter(UChar32 c) const; + UBool norm16HasDecompBoundaryAfter(uint16_t norm16) const; UBool isDecompInert(UChar32 c) const { return isDecompYesAndZeroCC(getNorm16(c)); } UBool hasCompBoundaryBefore(UChar32 c) const { - return c=minMaybeYes; } - static UBool isInert(uint16_t norm16) { return norm16==0; } - static UBool isJamoL(uint16_t norm16) { return norm16==1; } + static UBool isInert(uint16_t norm16) { return norm16==INERT; } + static UBool isJamoL(uint16_t norm16) { return norm16==JAMO_L; } static UBool isJamoVT(uint16_t norm16) { return norm16==JAMO_VT; } - UBool isHangul(uint16_t norm16) const { return norm16==minYesNo; } + uint16_t hangulLVT() const { return minYesNoMappingsOnly|HAS_COMP_BOUNDARY_AFTER; } + UBool isHangulLV(uint16_t norm16) const { return norm16==minYesNo; } + UBool isHangulLVT(uint16_t norm16) const { + return norm16==hangulLVT(); + } UBool isCompYesAndZeroCC(uint16_t norm16) const { return norm16=MIN_YES_YES_WITH_CC || norm16=MIN_YES_YES_WITH_CC ? (uint8_t)norm16 : 0; + // return norm16>=MIN_YES_YES_WITH_CC ? getCCFromNormalYesOrMaybe(norm16) : 0; // } uint8_t getCCFromNoNo(uint16_t norm16) const { const uint16_t *mapping=getMapping(norm16); @@ -525,30 +582,47 @@ class U_COMMON_API Normalizer2Impl : public UObject { } } // requires that the [cpStart..cpLimit[ character passes isCompYesAndZeroCC() - uint8_t getTrailCCFromCompYesAndZeroCC(const UChar *cpStart, const UChar *cpLimit) const; + uint8_t getTrailCCFromCompYesAndZeroCC(uint16_t norm16) const { + if(norm16<=minYesNo) { + return 0; // yesYes and Hangul LV have ccc=tccc=0 + } else { + // For Hangul LVT we harmlessly fetch a firstUnit with tccc=0 here. + return (uint8_t)(*getMapping(norm16)>>8); // tccc from yesNo + } + } + uint8_t getPreviousTrailCC(const UChar *start, const UChar *p) const; + uint8_t getPreviousTrailCC(const uint8_t *start, const uint8_t *p) const; // Requires algorithmic-NoNo. UChar32 mapAlgorithmic(UChar32 c, uint16_t norm16) const { - return c+norm16-(minMaybeYes-MAX_DELTA-1); + return c+(norm16>>DELTA_SHIFT)-centerNoNoDelta; + } + UChar32 getAlgorithmicDelta(uint16_t norm16) const { + return (norm16>>DELTA_SHIFT)-centerNoNoDelta; } // Requires minYesNo>OFFSET_SHIFT); } const uint16_t *getCompositionsListForDecompYes(uint16_t norm16) const { - if(norm16==0 || MIN_NORMAL_MAYBE_YES<=norm16) { + if(norm16>OFFSET_SHIFT); + } /** * @param c code point must have compositions * @return compositions list pointer @@ -563,46 +637,78 @@ class U_COMMON_API Normalizer2Impl : public UObject { UChar32 minNeedDataCP, ReorderingBuffer *buffer, UErrorCode &errorCode) const; - UBool decomposeShort(const UChar *src, const UChar *limit, - ReorderingBuffer &buffer, UErrorCode &errorCode) const; + const UChar *decomposeShort(const UChar *src, const UChar *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const; UBool decompose(UChar32 c, uint16_t norm16, ReorderingBuffer &buffer, UErrorCode &errorCode) const; + const uint8_t *decomposeShort(const uint8_t *src, const uint8_t *limit, + UBool stopAtCompBoundary, UBool onlyContiguous, + ReorderingBuffer &buffer, UErrorCode &errorCode) const; + static int32_t combine(const uint16_t *list, UChar32 trail); void addComposites(const uint16_t *list, UnicodeSet &set) const; void recompose(ReorderingBuffer &buffer, int32_t recomposeStartIndex, UBool onlyContiguous) const; - UBool hasCompBoundaryBefore(UChar32 c, uint16_t norm16) const; - const UChar *findPreviousCompBoundary(const UChar *start, const UChar *p) const; - const UChar *findNextCompBoundary(const UChar *p, const UChar *limit) const; + UBool hasCompBoundaryBefore(UChar32 c, uint16_t norm16) const { + return c -# include "unicode\uloc.h" +# include "unicode/uloc.h" #if U_PLATFORM_HAS_WINUWP_API == 0 # include "wintz.h" #else // U_PLATFORM_HAS_WINUWP_API typedef PVOID LPMSG; // TODO: figure out how to get rid of this typedef #include #include -#include -#include +#include +#include using namespace ABI::Windows::Foundation; using namespace Microsoft::WRL; @@ -675,6 +675,16 @@ extern U_IMPORT char *U_TZNAME[]; #if !UCONFIG_NO_FILE_IO && ((U_PLATFORM_IS_DARWIN_BASED && (U_PLATFORM != U_PF_IPHONE || defined(U_TIMEZONE))) || U_PLATFORM_IS_LINUX_BASED || U_PLATFORM == U_PF_BSD || U_PLATFORM == U_PF_SOLARIS) /* These platforms are likely to use Olson timezone IDs. */ +/* common targets of the symbolic link at TZDEFAULT are: + * "/usr/share/zoneinfo/" default, older Linux distros, macOS to 10.12 + * "../usr/share/zoneinfo/" newer Linux distros: Red Hat Enterprise Linux 7, Ubuntu 16, SuSe Linux 12 + * "/usr/share/lib/zoneinfo/" Solaris + * "../usr/share/lib/zoneinfo/" Solaris + * "/var/db/timezone/zoneinfo/" macOS 10.13 + * To avoid checking lots of paths, just check that the target path + * before the ends with "/zoneinfo/", and the is valid. + */ + #define CHECK_LOCALTIME_LINK 1 #if U_PLATFORM_IS_DARWIN_BASED #include @@ -682,12 +692,12 @@ extern U_IMPORT char *U_TZNAME[]; #elif U_PLATFORM == U_PF_SOLARIS #define TZDEFAULT "/etc/localtime" #define TZZONEINFO "/usr/share/lib/zoneinfo/" -#define TZZONEINFO2 "../usr/share/lib/zoneinfo/" #define TZ_ENV_CHECK "localtime" #else #define TZDEFAULT "/etc/localtime" #define TZZONEINFO "/usr/share/zoneinfo/" #endif +#define TZZONEINFOTAIL "/zoneinfo/" #if U_HAVE_DIRENT_H #define TZFILE_SKIP "posixrules" /* tz file to skip when searching. */ /* Some Linux distributions have 'localtime' in /usr/share/zoneinfo @@ -939,30 +949,30 @@ static CharString *gSearchTZFileResult = NULL; * This function is not thread safe - it uses a global, gSearchTZFileResult, to hold its results. */ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { - DIR* dirp = opendir(path); - DIR* subDirp = NULL; + DIR* dirp = NULL; struct dirent* dirEntry = NULL; - char* result = NULL; + UErrorCode status = U_ZERO_ERROR; + + /* Save the current path */ + CharString curpath(path, -1, status); + if (U_FAILURE(status)) { + goto cleanupAndReturn; + } + + dirp = opendir(path); if (dirp == NULL) { - return result; + goto cleanupAndReturn; } if (gSearchTZFileResult == NULL) { gSearchTZFileResult = new CharString; if (gSearchTZFileResult == NULL) { - return NULL; + goto cleanupAndReturn; } ucln_common_registerCleanup(UCLN_COMMON_PUTIL, putil_cleanup); } - /* Save the current path */ - UErrorCode status = U_ZERO_ERROR; - CharString curpath(path, -1, status); - if (U_FAILURE(status)) { - return NULL; - } - /* Check each entry in the directory. */ while((dirEntry = readdir(dirp)) != NULL) { const char* dirName = dirEntry->d_name; @@ -971,15 +981,16 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { CharString newpath(curpath, status); newpath.append(dirName, -1, status); if (U_FAILURE(status)) { - return NULL; + break; } + DIR* subDirp = NULL; if ((subDirp = opendir(newpath.data())) != NULL) { /* If this new path is a directory, make a recursive call with the newpath. */ closedir(subDirp); newpath.append('/', status); if (U_FAILURE(status)) { - return NULL; + break; } result = searchForTZFile(newpath.data(), tzInfo); /* @@ -1003,7 +1014,7 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { gSearchTZFileResult->clear(); gSearchTZFileResult->append(zoneid, -1, status); if (U_FAILURE(status)) { - return NULL; + break; } result = gSearchTZFileResult->data(); /* Get out after the first one found. */ @@ -1012,7 +1023,11 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) { } } } - closedir(dirp); + + cleanupAndReturn: + if (dirp) { + closedir(dirp); + } return result; } #endif @@ -1045,7 +1060,7 @@ uprv_getWindowsTimeZone() hr = timezone->GetTimeZone(timezoneString.GetAddressOf()); if (SUCCEEDED(hr)) { - int32_t length = wcslen(timezoneString.GetRawBuffer(NULL)); + int32_t length = static_cast(wcslen(timezoneString.GetRawBuffer(NULL))); char* asciiId = (char*)uprv_calloc(length + 1, sizeof(char)); if (asciiId != nullptr) { @@ -1064,6 +1079,7 @@ uprv_getWindowsTimeZone() U_CAPI const char* U_EXPORT2 uprv_tzname(int n) { + (void)n; // Avoid unreferenced parameter warning. const char *tzid = NULL; #if U_PLATFORM_USES_ONLY_WIN32_API #if U_PLATFORM_HAS_WINUWP_API > 0 @@ -1125,24 +1141,15 @@ uprv_tzname(int n) */ int32_t ret = (int32_t)readlink(TZDEFAULT, gTimeZoneBuffer, sizeof(gTimeZoneBuffer)-1); if (0 < ret) { - int32_t tzZoneInfoLen = uprv_strlen(TZZONEINFO); + int32_t tzZoneInfoTailLen = uprv_strlen(TZZONEINFOTAIL); gTimeZoneBuffer[ret] = 0; - if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO, tzZoneInfoLen) == 0 - && isValidOlsonID(gTimeZoneBuffer + tzZoneInfoLen)) - { - return (gTimeZoneBufferPtr = gTimeZoneBuffer + tzZoneInfoLen); - } -#if U_PLATFORM == U_PF_SOLARIS - else + char * tzZoneInfoTailPtr = uprv_strstr(gTimeZoneBuffer, TZZONEINFOTAIL); + + if (tzZoneInfoTailPtr != NULL + && isValidOlsonID(tzZoneInfoTailPtr + tzZoneInfoTailLen)) { - tzZoneInfoLen = uprv_strlen(TZZONEINFO2); - if (uprv_strncmp(gTimeZoneBuffer, TZZONEINFO2, tzZoneInfoLen) == 0 - && isValidOlsonID(gTimeZoneBuffer + tzZoneInfoLen)) - { - return (gTimeZoneBufferPtr = gTimeZoneBuffer + tzZoneInfoLen); - } + return (gTimeZoneBufferPtr = tzZoneInfoTailPtr + tzZoneInfoTailLen); } -#endif } else { #if defined(SEARCH_TZFILE) DefaultTZInfo* tzInfo = (DefaultTZInfo*)uprv_malloc(sizeof(DefaultTZInfo)); @@ -1228,7 +1235,7 @@ UInitOnce gTimeZoneFilesInitOnce = U_INITONCE_INITIALIZER; static CharString *gTimeZoneFilesDirectory = NULL; #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API - static char *gCorrectedPOSIXLocale = NULL; /* Sometimes heap allocated */ + static const char *gCorrectedPOSIXLocale = NULL; /* Sometimes heap allocated */ static bool gCorrectedPOSIXLocaleHeapAllocated = false; #endif @@ -1251,7 +1258,7 @@ static UBool U_CALLCONV putil_cleanup(void) #if U_POSIX_LOCALE || U_PLATFORM_USES_ONLY_WIN32_API if (gCorrectedPOSIXLocale && gCorrectedPOSIXLocaleHeapAllocated) { - uprv_free(gCorrectedPOSIXLocale); + uprv_free(const_cast(gCorrectedPOSIXLocale)); gCorrectedPOSIXLocale = NULL; gCorrectedPOSIXLocaleHeapAllocated = false; } @@ -1287,7 +1294,7 @@ u_setDataDirectory(const char *directory) { #if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) { char *p; - while(p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) { + while((p = uprv_strchr(newDataDir, U_FILE_ALT_SEP_CHAR)) != NULL) { *p = U_FILE_SEP_CHAR; } } @@ -1445,7 +1452,7 @@ static void setTimeZoneFilesDir(const char *path, UErrorCode &status) { gTimeZoneFilesDirectory->append(path, status); #if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) char *p = gTimeZoneFilesDirectory->data(); - while (p = uprv_strchr(p, U_FILE_ALT_SEP_CHAR)) { + while ((p = uprv_strchr(p, U_FILE_ALT_SEP_CHAR)) != NULL) { *p = U_FILE_SEP_CHAR; } #endif @@ -1809,6 +1816,8 @@ The leftmost codepage (.xxx) wins. } // Now normalize the resulting name + correctedPOSIXLocale = static_cast(uprv_malloc(POSIX_LOCALE_CAPACITY + 1)); + /* TODO: Should we just exit on memory allocation failure? */ if (correctedPOSIXLocale) { int32_t posixLen = uloc_canonicalize(modifiedWindowsLocale, correctedPOSIXLocale, POSIX_LOCALE_CAPACITY, &status); @@ -2326,19 +2335,16 @@ u_getVersion(UVersionInfo versionArray) { * icucfg.h dependent code */ -#if U_ENABLE_DYLOAD - -#if HAVE_DLOPEN && !U_PLATFORM_USES_ONLY_WIN32_API +#if U_ENABLE_DYLOAD && HAVE_DLOPEN && !U_PLATFORM_USES_ONLY_WIN32_API #if HAVE_DLFCN_H - #ifdef __MVS__ #ifndef __SUSV3 #define __SUSV3 1 #endif #endif #include -#endif +#endif /* HAVE_DLFCN_H */ U_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status) { @@ -2378,38 +2384,10 @@ uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { return uret.fp; } -#else - -/* null (nonexistent) implementation. */ - -U_INTERNAL void * U_EXPORT2 -uprv_dl_open(const char *libName, UErrorCode *status) { - if(U_FAILURE(*status)) return NULL; - *status = U_UNSUPPORTED_ERROR; - return NULL; -} - -U_INTERNAL void U_EXPORT2 -uprv_dl_close(void *lib, UErrorCode *status) { - if(U_FAILURE(*status)) return; - *status = U_UNSUPPORTED_ERROR; - return; -} - - -U_INTERNAL UVoidFunction* U_EXPORT2 -uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { - if(U_SUCCESS(*status)) { - *status = U_UNSUPPORTED_ERROR; - } - return (UVoidFunction*)NULL; -} - +#elif U_ENABLE_DYLOAD && U_PLATFORM_USES_ONLY_WIN32_API && !U_PLATFORM_HAS_WINUWP_API - -#endif - -#elif U_PLATFORM_USES_ONLY_WIN32_API +/* Windows API implementation. */ +// Note: UWP does not expose/allow these APIs, so the UWP version gets the null implementation. */ U_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status) { @@ -2436,7 +2414,6 @@ uprv_dl_close(void *lib, UErrorCode *status) { return; } - U_INTERNAL UVoidFunction* U_EXPORT2 uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { HMODULE handle = (HMODULE)lib; @@ -2458,10 +2435,9 @@ uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { return addr; } - #else -/* No dynamic loading set. */ +/* No dynamic loading, null (nonexistent) implementation. */ U_INTERNAL void * U_EXPORT2 uprv_dl_open(const char *libName, UErrorCode *status) { @@ -2479,7 +2455,6 @@ uprv_dl_close(void *lib, UErrorCode *status) { return; } - U_INTERNAL UVoidFunction* U_EXPORT2 uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { (void)lib; @@ -2490,7 +2465,7 @@ uprv_dlsym_func(void *lib, const char* sym, UErrorCode *status) { return (UVoidFunction*)NULL; } -#endif /* U_ENABLE_DYLOAD */ +#endif /* * Hey, Emacs, please set the following: diff --git a/deps/icu-small/source/common/putilimp.h b/deps/icu-small/source/common/putilimp.h index b797a9a280f401..56ea8df00959d1 100644 --- a/deps/icu-small/source/common/putilimp.h +++ b/deps/icu-small/source/common/putilimp.h @@ -72,15 +72,6 @@ typedef size_t uintptr_t; #endif -/** - * \def U_HAVE_MSVC_2003_OR_EARLIER - * Flag for workaround of MSVC 2003 optimization bugs - * @internal - */ -#if !defined(U_HAVE_MSVC_2003_OR_EARLIER) && defined(_MSC_VER) && (_MSC_VER < 1400) -#define U_HAVE_MSVC_2003_OR_EARLIER -#endif - /*===========================================================================*/ /** @{ Information about POSIX support */ /*===========================================================================*/ @@ -120,15 +111,15 @@ typedef size_t uintptr_t; /* Use the predefined value. */ #elif U_PLATFORM == U_PF_ANDROID # define U_TIMEZONE timezone +#elif defined(__UCLIBC__) + // uClibc does not have __timezone or _timezone. +#elif defined(_NEWLIB_VERSION) +# define U_TIMEZONE _timezone +#elif defined(__GLIBC__) + // glibc +# define U_TIMEZONE __timezone #elif U_PLATFORM_IS_LINUX_BASED -# if defined(__UCLIBC__) - /* uClibc does not have __timezone or _timezone. */ -# elif defined(_NEWLIB_VERSION) -# define U_TIMEZONE _timezone -# elif defined(__GLIBC__) - /* glibc */ -# define U_TIMEZONE __timezone -# endif + // not defined #elif U_PLATFORM_USES_ONLY_WIN32_API # define U_TIMEZONE _timezone #elif U_PLATFORM == U_PF_BSD && !defined(__NetBSD__) @@ -214,7 +205,7 @@ typedef size_t uintptr_t; /** * \def U_HAVE_STD_ATOMICS * Defines whether the standard C++11 is available. - * ICU will use this when avialable, + * ICU will use this when available, * otherwise will fall back to compiler or platform specific alternatives. * @internal */ @@ -239,7 +230,7 @@ typedef size_t uintptr_t; /** * \def U_HAVE_CLANG_ATOMICS - * Defines whether Clang c11 style built-in atomics are avaialable. + * Defines whether Clang c11 style built-in atomics are available. * These are used in preference to gcc atomics when both are available. */ #ifdef U_HAVE_CLANG_ATOMICS @@ -277,7 +268,7 @@ typedef size_t uintptr_t; /** * Platform utilities isolates the platform dependencies of the - * libarary. For each platform which this code is ported to, these + * library. For each platform which this code is ported to, these * functions may have to be re-implemented. */ @@ -425,7 +416,7 @@ U_INTERNAL const char* U_EXPORT2 uprv_getDefaultCodepage(void); /** * Please use uloc_getDefault() instead. - * Return the default locale ID string by querying ths system, or + * Return the default locale ID string by querying the system, or * zero if one cannot be found. * This function can call setlocale() on Unix platforms. Please read the * platform documentation on setlocale() before calling this function. diff --git a/deps/icu-small/source/common/rbbi.cpp b/deps/icu-small/source/common/rbbi.cpp index 2a501bf1671072..54b289e24d1e0a 100644 --- a/deps/icu-small/source/common/rbbi.cpp +++ b/deps/icu-small/source/common/rbbi.cpp @@ -7,7 +7,7 @@ *************************************************************************** */ // -// file: rbbi.c Contains the implementation of the rule based break iterator +// file: rbbi.cpp Contains the implementation of the rule based break iterator // runtime engine and the API implementation for // class RuleBasedBreakIterator // @@ -21,18 +21,19 @@ #include "unicode/rbbi.h" #include "unicode/schriter.h" #include "unicode/uchriter.h" -#include "unicode/udata.h" #include "unicode/uclean.h" -#include "rbbidata.h" -#include "rbbirb.h" +#include "unicode/udata.h" + +#include "brkeng.h" +#include "ucln_cmn.h" #include "cmemory.h" #include "cstring.h" -#include "umutex.h" -#include "ucln_cmn.h" -#include "brkeng.h" - +#include "rbbidata.h" +#include "rbbi_cache.h" +#include "rbbirb.h" #include "uassert.h" -#include "uvector.h" +#include "umutex.h" +#include "uvectr32.h" // if U_LOCAL_SERVICE_HOOK is defined, then localsvc.cpp is expected to be included. #if U_LOCAL_SERVICE_HOOK @@ -40,16 +41,16 @@ #endif #ifdef RBBI_DEBUG -static UBool fTrace = FALSE; +static UBool gTrace = FALSE; #endif U_NAMESPACE_BEGIN // The state number of the starting state -#define START_STATE 1 +constexpr int32_t START_STATE = 1; // The state-transition value indicating "stop" -#define STOP_STATE 0 +constexpr int32_t STOP_STATE = 0; UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedBreakIterator) @@ -63,9 +64,8 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RuleBasedBreakIterator) * Constructs a RuleBasedBreakIterator that uses the already-created * tables object that is passed in as a parameter. */ -RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status) -{ - init(); +RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status) { + init(status); fData = new RBBIDataWrapper(data, status); // status checked in constructor if (U_FAILURE(status)) {return;} if(fData == 0) { @@ -81,7 +81,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode RuleBasedBreakIterator::RuleBasedBreakIterator(const uint8_t *compiledRules, uint32_t ruleLength, UErrorCode &status) { - init(); + init(status); if (U_FAILURE(status)) { return; } @@ -111,7 +111,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator(const uint8_t *compiledRules, //------------------------------------------------------------------------------- RuleBasedBreakIterator::RuleBasedBreakIterator(UDataMemory* udm, UErrorCode &status) { - init(); + init(status); fData = new RBBIDataWrapper(udm, status); // status checked in constructor if (U_FAILURE(status)) {return;} if(fData == 0) { @@ -131,7 +131,7 @@ RuleBasedBreakIterator::RuleBasedBreakIterator( const UnicodeString &rules, UParseError &parseError, UErrorCode &status) { - init(); + init(status); if (U_FAILURE(status)) {return;} RuleBasedBreakIterator *bi = (RuleBasedBreakIterator *) RBBIRuleBuilder::createRuleBasedBreakIterator(rules, &parseError, status); @@ -153,7 +153,8 @@ RuleBasedBreakIterator::RuleBasedBreakIterator( const UnicodeString &rules, // of rules. //------------------------------------------------------------------------------- RuleBasedBreakIterator::RuleBasedBreakIterator() { - init(); + UErrorCode status = U_ZERO_ERROR; + init(status); } @@ -166,7 +167,8 @@ RuleBasedBreakIterator::RuleBasedBreakIterator() { RuleBasedBreakIterator::RuleBasedBreakIterator(const RuleBasedBreakIterator& other) : BreakIterator(other) { - this->init(); + UErrorCode status = U_ZERO_ERROR; + this->init(status); *this = other; } @@ -181,7 +183,7 @@ RuleBasedBreakIterator::~RuleBasedBreakIterator() { } fCharIter = NULL; delete fSCharIter; - fCharIter = NULL; + fSCharIter = NULL; delete fDCharIter; fDCharIter = NULL; @@ -191,18 +193,17 @@ RuleBasedBreakIterator::~RuleBasedBreakIterator() { fData->removeReference(); fData = NULL; } - if (fCachedBreakPositions) { - uprv_free(fCachedBreakPositions); - fCachedBreakPositions = NULL; - } - if (fLanguageBreakEngines) { - delete fLanguageBreakEngines; - fLanguageBreakEngines = NULL; - } - if (fUnhandledBreakEngine) { - delete fUnhandledBreakEngine; - fUnhandledBreakEngine = NULL; - } + delete fBreakCache; + fBreakCache = NULL; + + delete fDictionaryCache; + fDictionaryCache = NULL; + + delete fLanguageBreakEngines; + fLanguageBreakEngines = NULL; + + delete fUnhandledBreakEngine; + fUnhandledBreakEngine = NULL; } /** @@ -214,7 +215,8 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { if (this == &that) { return *this; } - reset(); // Delete break cache information + BreakIterator::operator=(that); + fBreakType = that.fBreakType; if (fLanguageBreakEngines != NULL) { delete fLanguageBreakEngines; @@ -244,6 +246,17 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { fData = that.fData->addReference(); } + fPosition = that.fPosition; + fRuleStatusIndex = that.fRuleStatusIndex; + fDone = that.fDone; + + // TODO: both the dictionary and the main cache need to be copied. + // Current position could be within a dictionary range. Trying to continue + // the iteration without the caches present would go to the rules, with + // the assumption that the current position is on a rule boundary. + fBreakCache->reset(fPosition, fRuleStatusIndex); + fDictionaryCache->reset(); + return *this; } @@ -255,33 +268,43 @@ RuleBasedBreakIterator::operator=(const RuleBasedBreakIterator& that) { // Initializes all fields, leaving the object in a consistent state. // //----------------------------------------------------------------------------- -void RuleBasedBreakIterator::init() { - UErrorCode status = U_ZERO_ERROR; - fText = utext_openUChars(NULL, NULL, 0, &status); +void RuleBasedBreakIterator::init(UErrorCode &status) { + fText = NULL; fCharIter = NULL; fSCharIter = NULL; fDCharIter = NULL; fData = NULL; - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; + fPosition = 0; + fRuleStatusIndex = 0; + fDone = false; fDictionaryCharCount = 0; fBreakType = UBRK_WORD; // Defaulting BreakType to word gives reasonable // dictionary behavior for Break Iterators that are // built from rules. Even better would be the ability to // declare the type in the rules. - fCachedBreakPositions = NULL; - fLanguageBreakEngines = NULL; - fUnhandledBreakEngine = NULL; - fNumCachedBreakPositions = 0; - fPositionInCache = 0; + fLanguageBreakEngines = NULL; + fUnhandledBreakEngine = NULL; + fBreakCache = NULL; + fDictionaryCache = NULL; + + if (U_FAILURE(status)) { + return; + } + + fText = utext_openUChars(NULL, NULL, 0, &status); + fDictionaryCache = new DictionaryCache(this, status); + fBreakCache = new BreakCache(this, status); + if (U_SUCCESS(status) && (fText == NULL || fDictionaryCache == NULL || fBreakCache == NULL)) { + status = U_MEMORY_ALLOCATION_ERROR; + } #ifdef RBBI_DEBUG static UBool debugInitDone = FALSE; if (debugInitDone == FALSE) { char *debugEnv = getenv("U_RBBIDEBUG"); if (debugEnv && uprv_strstr(debugEnv, "trace")) { - fTrace = TRUE; + gTrace = TRUE; } debugInitDone = TRUE; } @@ -311,16 +334,28 @@ RuleBasedBreakIterator::operator==(const BreakIterator& that) const { if (typeid(*this) != typeid(that)) { return FALSE; } + if (this == &that) { + return TRUE; + } + + // The base class BreakIterator carries no state that participates in equality, + // and does not implement an equality function that would otherwise be + // checked at this point. const RuleBasedBreakIterator& that2 = (const RuleBasedBreakIterator&) that; if (!utext_equals(fText, that2.fText)) { // The two break iterators are operating on different text, - // or have a different interation position. + // or have a different iteration position. + // Note that fText's position is always the same as the break iterator's position. return FALSE; }; - // TODO: need a check for when in a dictionary region at different offsets. + if (!(fPosition == that2.fPosition && + fRuleStatusIndex == that2.fRuleStatusIndex && + fDone == that2.fDone)) { + return FALSE; + } if (that2.fData == fData || (fData != NULL && that2.fData != NULL && *that2.fData == *fData)) { @@ -348,7 +383,8 @@ void RuleBasedBreakIterator::setText(UText *ut, UErrorCode &status) { if (U_FAILURE(status)) { return; } - reset(); + fBreakCache->reset(); + fDictionaryCache->reset(); fText = utext_clone(fText, ut, FALSE, TRUE, &status); // Set up a dummy CharacterIterator to be returned if anyone @@ -382,27 +418,6 @@ UText *RuleBasedBreakIterator::getUText(UText *fillIn, UErrorCode &status) const } - -/** - * Returns the description used to create this iterator - */ -const UnicodeString& -RuleBasedBreakIterator::getRules() const { - if (fData != NULL) { - return fData->getRuleSourceString(); - } else { - static const UnicodeString *s; - if (s == NULL) { - // TODO: something more elegant here. - // perhaps API should return the string by value. - // Note: thread unsafe init & leak are semi-ok, better than - // what was before. Sould be cleaned up, though. - s = new UnicodeString; - } - return *s; - } -} - //======================================================================= // BreakIterator overrides //======================================================================= @@ -430,7 +445,8 @@ RuleBasedBreakIterator::adoptText(CharacterIterator* newText) { fCharIter = newText; UErrorCode status = U_ZERO_ERROR; - reset(); + fBreakCache->reset(); + fDictionaryCache->reset(); if (newText==NULL || newText->startIndex() != 0) { // startIndex !=0 wants to be an error, but there's no way to report it. // Make the iterator text be an empty string. @@ -449,7 +465,8 @@ RuleBasedBreakIterator::adoptText(CharacterIterator* newText) { void RuleBasedBreakIterator::setText(const UnicodeString& newText) { UErrorCode status = U_ZERO_ERROR; - reset(); + fBreakCache->reset(); + fDictionaryCache->reset(); fText = utext_openConstUnicodeString(fText, &newText, &status); // Set up a character iterator on the string. @@ -509,13 +526,12 @@ RuleBasedBreakIterator &RuleBasedBreakIterator::refreshInputText(UText *input, U * @return The new iterator position, which is zero. */ int32_t RuleBasedBreakIterator::first(void) { - reset(); - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - //if (fText == NULL) - // return BreakIterator::DONE; - - utext_setNativeIndex(fText, 0); + UErrorCode status = U_ZERO_ERROR; + if (!fBreakCache->seek(0)) { + fBreakCache->populateNear(0, status); + } + fBreakCache->current(); + U_ASSERT(fPosition == 0); return 0; } @@ -524,17 +540,12 @@ int32_t RuleBasedBreakIterator::first(void) { * @return The text's past-the-end offset. */ int32_t RuleBasedBreakIterator::last(void) { - reset(); - if (fText == NULL) { - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - return BreakIterator::DONE; - } - - fLastStatusIndexValid = FALSE; - int32_t pos = (int32_t)utext_nativeLength(fText); - utext_setNativeIndex(fText, pos); - return pos; + int32_t endPos = (int32_t)utext_nativeLength(fText); + UBool endShouldBeBoundary = isBoundary(endPos); // Has side effect of setting iterator position. + (void)endShouldBeBoundary; + U_ASSERT(endShouldBeBoundary); + U_ASSERT(fPosition == endPos); + return endPos; } /** @@ -547,14 +558,17 @@ int32_t RuleBasedBreakIterator::last(void) { * the current one. */ int32_t RuleBasedBreakIterator::next(int32_t n) { - int32_t result = current(); - while (n > 0) { - result = next(); - --n; - } - while (n < 0) { - result = previous(); - ++n; + int32_t result = 0; + if (n > 0) { + for (; n > 0 && result != UBRK_DONE; --n) { + result = next(); + } + } else if (n < 0) { + for (; n < 0 && result != UBRK_DONE; ++n) { + result = previous(); + } + } else { + result = current(); } return result; } @@ -564,396 +578,120 @@ int32_t RuleBasedBreakIterator::next(int32_t n) { * @return The position of the first boundary after this one. */ int32_t RuleBasedBreakIterator::next(void) { - // if we have cached break positions and we're still in the range - // covered by them, just move one step forward in the cache - if (fCachedBreakPositions != NULL) { - if (fPositionInCache < fNumCachedBreakPositions - 1) { - ++fPositionInCache; - int32_t pos = fCachedBreakPositions[fPositionInCache]; - utext_setNativeIndex(fText, pos); - return pos; - } - else { - reset(); - } - } - - int32_t startPos = current(); - fDictionaryCharCount = 0; - int32_t result = handleNext(fData->fForwardTable); - if (fDictionaryCharCount > 0) { - result = checkDictionary(startPos, result, FALSE); - } - return result; + fBreakCache->next(); + return fDone ? UBRK_DONE : fPosition; } /** - * Advances the iterator backwards, to the last boundary preceding this one. - * @return The position of the last boundary position preceding this one. + * Move the iterator backwards, to the boundary preceding the current one. + * + * Starts from the current position within fText. + * Starting position need not be on a boundary. + * + * @return The position of the boundary position immediately preceding the starting position. */ int32_t RuleBasedBreakIterator::previous(void) { - int32_t result; - int32_t startPos; - - // if we have cached break positions and we're still in the range - // covered by them, just move one step backward in the cache - if (fCachedBreakPositions != NULL) { - if (fPositionInCache > 0) { - --fPositionInCache; - // If we're at the beginning of the cache, need to reevaluate the - // rule status - if (fPositionInCache <= 0) { - fLastStatusIndexValid = FALSE; - } - int32_t pos = fCachedBreakPositions[fPositionInCache]; - utext_setNativeIndex(fText, pos); - return pos; - } - else { - reset(); - } - } - - // if we're already sitting at the beginning of the text, return DONE - if (fText == NULL || (startPos = current()) == 0) { - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - return BreakIterator::DONE; - } - - if (fData->fSafeRevTable != NULL || fData->fSafeFwdTable != NULL) { - result = handlePrevious(fData->fReverseTable); - if (fDictionaryCharCount > 0) { - result = checkDictionary(result, startPos, TRUE); - } - return result; - } - - // old rule syntax - // set things up. handlePrevious() will back us up to some valid - // break position before the current position (we back our internal - // iterator up one step to prevent handlePrevious() from returning - // the current position), but not necessarily the last one before - // where we started - - int32_t start = current(); - - (void)UTEXT_PREVIOUS32(fText); - int32_t lastResult = handlePrevious(fData->fReverseTable); - if (lastResult == UBRK_DONE) { - lastResult = 0; - utext_setNativeIndex(fText, 0); - } - result = lastResult; - int32_t lastTag = 0; - UBool breakTagValid = FALSE; - - // iterate forward from the known break position until we pass our - // starting point. The last break position before the starting - // point is our return value - - for (;;) { - result = next(); - if (result == BreakIterator::DONE || result >= start) { - break; - } - lastResult = result; - lastTag = fLastRuleStatusIndex; - breakTagValid = TRUE; - } - - // fLastBreakTag wants to have the value for section of text preceding - // the result position that we are to return (in lastResult.) If - // the backwards rules overshot and the above loop had to do two or more - // next()s to move up to the desired return position, we will have a valid - // tag value. But, if handlePrevious() took us to exactly the correct result position, - // we wont have a tag value for that position, which is only set by handleNext(). - - // Set the current iteration position to be the last break position - // before where we started, and then return that value. - utext_setNativeIndex(fText, lastResult); - fLastRuleStatusIndex = lastTag; // for use by getRuleStatus() - fLastStatusIndexValid = breakTagValid; - - // No need to check the dictionary; it will have been handled by - // next() - - return lastResult; + UErrorCode status = U_ZERO_ERROR; + fBreakCache->previous(status); + return fDone ? UBRK_DONE : fPosition; } /** * Sets the iterator to refer to the first boundary position following * the specified position. - * @offset The position from which to begin searching for a break position. + * @param startPos The position from which to begin searching for a break position. * @return The position of the first break after the current position. */ -int32_t RuleBasedBreakIterator::following(int32_t offset) { - // if the offset passed in is already past the end of the text, - // just return DONE; if it's before the beginning, return the +int32_t RuleBasedBreakIterator::following(int32_t startPos) { + // if the supplied position is before the beginning, return the // text's starting offset - if (fText == NULL || offset >= utext_nativeLength(fText)) { - last(); - return next(); - } - else if (offset < 0) { + if (startPos < 0) { return first(); } // Move requested offset to a code point start. It might be on a trail surrogate, - // or on a trail byte if the input is UTF-8. - utext_setNativeIndex(fText, offset); - offset = (int32_t)utext_getNativeIndex(fText); - - // if we have cached break positions and offset is in the range - // covered by them, use them - // TODO: could use binary search - // TODO: what if offset is outside range, but break is not? - if (fCachedBreakPositions != NULL) { - if (offset >= fCachedBreakPositions[0] - && offset < fCachedBreakPositions[fNumCachedBreakPositions - 1]) { - fPositionInCache = 0; - // We are guaranteed not to leave the array due to range test above - while (offset >= fCachedBreakPositions[fPositionInCache]) { - ++fPositionInCache; - } - int32_t pos = fCachedBreakPositions[fPositionInCache]; - utext_setNativeIndex(fText, pos); - return pos; - } - else { - reset(); - } - } - - // Set our internal iteration position (temporarily) - // to the position passed in. If this is the _beginning_ position, - // then we can just use next() to get our return value - - int32_t result = 0; + // or on a trail byte if the input is UTF-8. Or it may be beyond the end of the text. + utext_setNativeIndex(fText, startPos); + startPos = (int32_t)utext_getNativeIndex(fText); - if (fData->fSafeRevTable != NULL) { - // new rule syntax - utext_setNativeIndex(fText, offset); - // move forward one codepoint to prepare for moving back to a - // safe point. - // this handles offset being between a supplementary character - // TODO: is this still needed, with move to code point boundary handled above? - (void)UTEXT_NEXT32(fText); - // handlePrevious will move most of the time to < 1 boundary away - handlePrevious(fData->fSafeRevTable); - int32_t result = next(); - while (result <= offset) { - result = next(); - } - return result; - } - if (fData->fSafeFwdTable != NULL) { - // backup plan if forward safe table is not available - utext_setNativeIndex(fText, offset); - (void)UTEXT_PREVIOUS32(fText); - // handle next will give result >= offset - handleNext(fData->fSafeFwdTable); - // previous will give result 0 or 1 boundary away from offset, - // most of the time - // we have to - int32_t oldresult = previous(); - while (oldresult > offset) { - int32_t result = previous(); - if (result <= offset) { - return oldresult; - } - oldresult = result; - } - int32_t result = next(); - if (result <= offset) { - return next(); - } - return result; - } - // otherwise, we have to sync up first. Use handlePrevious() to back - // up to a known break position before the specified position (if - // we can determine that the specified position is a break position, - // we don't back up at all). This may or may not be the last break - // position at or before our starting position. Advance forward - // from here until we've passed the starting position. The position - // we stop on will be the first break position after the specified one. - // old rule syntax - - utext_setNativeIndex(fText, offset); - if (offset==0 || - (offset==1 && utext_getNativeIndex(fText)==0)) { - return next(); - } - result = previous(); - - while (result != BreakIterator::DONE && result <= offset) { - result = next(); - } - - return result; + UErrorCode status = U_ZERO_ERROR; + fBreakCache->following(startPos, status); + return fDone ? UBRK_DONE : fPosition; } /** * Sets the iterator to refer to the last boundary position before the * specified position. - * @offset The position to begin searching for a break from. + * @param offset The position to begin searching for a break from. * @return The position of the last boundary before the starting position. */ int32_t RuleBasedBreakIterator::preceding(int32_t offset) { - // if the offset passed in is already past the end of the text, - // just return DONE; if it's before the beginning, return the - // text's starting offset if (fText == NULL || offset > utext_nativeLength(fText)) { return last(); } - else if (offset < 0) { - return first(); - } // Move requested offset to a code point start. It might be on a trail surrogate, // or on a trail byte if the input is UTF-8. - utext_setNativeIndex(fText, offset); - offset = (int32_t)utext_getNativeIndex(fText); - - // if we have cached break positions and offset is in the range - // covered by them, use them - if (fCachedBreakPositions != NULL) { - // TODO: binary search? - // TODO: What if offset is outside range, but break is not? - if (offset > fCachedBreakPositions[0] - && offset <= fCachedBreakPositions[fNumCachedBreakPositions - 1]) { - fPositionInCache = 0; - while (fPositionInCache < fNumCachedBreakPositions - && offset > fCachedBreakPositions[fPositionInCache]) - ++fPositionInCache; - --fPositionInCache; - // If we're at the beginning of the cache, need to reevaluate the - // rule status - if (fPositionInCache <= 0) { - fLastStatusIndexValid = FALSE; - } - utext_setNativeIndex(fText, fCachedBreakPositions[fPositionInCache]); - return fCachedBreakPositions[fPositionInCache]; - } - else { - reset(); - } - } - - // if we start by updating the current iteration position to the - // position specified by the caller, we can just use previous() - // to carry out this operation - - if (fData->fSafeFwdTable != NULL) { - // new rule syntax - utext_setNativeIndex(fText, offset); - int32_t newOffset = (int32_t)UTEXT_GETNATIVEINDEX(fText); - if (newOffset != offset) { - // Will come here if specified offset was not a code point boundary AND - // the underlying implmentation is using UText, which snaps any non-code-point-boundary - // indices to the containing code point. - // For breakitereator::preceding only, these non-code-point indices need to be moved - // up to refer to the following codepoint. - (void)UTEXT_NEXT32(fText); - offset = (int32_t)UTEXT_GETNATIVEINDEX(fText); - } - // TODO: (synwee) would it be better to just check for being in the middle of a surrogate pair, - // rather than adjusting the position unconditionally? - // (Change would interact with safe rules.) - // TODO: change RBBI behavior for off-boundary indices to match that of UText? - // affects only preceding(), seems cleaner, but is slightly different. - (void)UTEXT_PREVIOUS32(fText); - handleNext(fData->fSafeFwdTable); - int32_t result = (int32_t)UTEXT_GETNATIVEINDEX(fText); - while (result >= offset) { - result = previous(); - } - return result; - } - if (fData->fSafeRevTable != NULL) { - // backup plan if forward safe table is not available - // TODO: check whether this path can be discarded - // It's probably OK to say that rules must supply both safe tables - // if they use safe tables at all. We have certainly never described - // to anyone how to work with just one safe table. - utext_setNativeIndex(fText, offset); - (void)UTEXT_NEXT32(fText); - - // handle previous will give result <= offset - handlePrevious(fData->fSafeRevTable); - - // next will give result 0 or 1 boundary away from offset, - // most of the time - // we have to - int32_t oldresult = next(); - while (oldresult < offset) { - int32_t result = next(); - if (result >= offset) { - return oldresult; - } - oldresult = result; - } - int32_t result = previous(); - if (result >= offset) { - return previous(); - } - return result; - } - - // old rule syntax utext_setNativeIndex(fText, offset); - return previous(); + int32_t adjustedOffset = utext_getNativeIndex(fText); + + UErrorCode status = U_ZERO_ERROR; + fBreakCache->preceding(adjustedOffset, status); + return fDone ? UBRK_DONE : fPosition; } /** * Returns true if the specfied position is a boundary position. As a side * effect, leaves the iterator pointing to the first boundary position at * or after "offset". + * * @param offset the offset to check. * @return True if "offset" is a boundary position. */ UBool RuleBasedBreakIterator::isBoundary(int32_t offset) { - // the beginning index of the iterator is always a boundary position by definition - if (offset == 0) { - first(); // For side effects on current position, tag values. - return TRUE; - } - - if (offset == (int32_t)utext_nativeLength(fText)) { - last(); // For side effects on current position, tag values. - return TRUE; - } - // out-of-range indexes are never boundary positions if (offset < 0) { first(); // For side effects on current position, tag values. return FALSE; } - if (offset > utext_nativeLength(fText)) { - last(); // For side effects on current position, tag values. - return FALSE; + // Adjust offset to be on a code point boundary and not beyond the end of the text. + // Note that isBoundary() is always be false for offsets that are not on code point boundaries. + // But we still need the side effect of leaving iteration at the following boundary. + + utext_setNativeIndex(fText, offset); + int32_t adjustedOffset = utext_getNativeIndex(fText); + + bool result = false; + UErrorCode status = U_ZERO_ERROR; + if (fBreakCache->seek(adjustedOffset) || fBreakCache->populateNear(adjustedOffset, status)) { + result = (fBreakCache->current() == offset); } - // otherwise, we can use following() on the position before the specified - // one and return true if the position we get back is the one the user - // specified - utext_previous32From(fText, offset); - int32_t backOne = (int32_t)UTEXT_GETNATIVEINDEX(fText); - UBool result = following(backOne) == offset; + if (result && adjustedOffset < offset && utext_char32At(fText, offset) == U_SENTINEL) { + // Original offset is beyond the end of the text. Return FALSE, it's not a boundary, + // but the iteration position remains set to the end of the text, which is a boundary. + return FALSE; + } + if (!result) { + // Not on a boundary. isBoundary() must leave iterator on the following boundary. + // Cache->seek(), above, left us on the preceding boundary, so advance one. + next(); + } return result; } + /** * Returns the current iteration position. * @return The current iteration position. */ int32_t RuleBasedBreakIterator::current(void) const { - int32_t pos = (int32_t)UTEXT_GETNATIVEINDEX(fText); - return pos; + return fPosition; } + //======================================================================= // implementation //======================================================================= @@ -1020,15 +758,11 @@ struct LookAheadResults { //----------------------------------------------------------------------------------- // -// handleNext(stateTable) -// This method is the actual implementation of the rbbi next() method. -// This method initializes the state machine to state 1 -// and advances through the text character by character until we reach the end -// of the text or the state machine transitions to state 0. We update our return -// value every time the state machine passes through an accepting state. +// handleNext() +// Run the state machine to find a boundary // //----------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { +int32_t RuleBasedBreakIterator::handleNext() { int32_t state; uint16_t category = 0; RBBIRunMode mode; @@ -1038,25 +772,29 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { LookAheadResults lookAheadMatches; int32_t result = 0; int32_t initialPosition = 0; + const RBBIStateTable *statetable = fData->fForwardTable; const char *tableData = statetable->fTableData; uint32_t tableRowLen = statetable->fRowLen; - #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPuts("Handle Next pos char state category"); } #endif - // No matter what, handleNext alway correctly sets the break tag value. - fLastStatusIndexValid = TRUE; - fLastRuleStatusIndex = 0; + // handleNext alway sets the break tag value. + // Set the default for it. + fRuleStatusIndex = 0; + + fDictionaryCharCount = 0; // if we're already at the end of the text, return DONE. - initialPosition = (int32_t)UTEXT_GETNATIVEINDEX(fText); + initialPosition = fPosition; + UTEXT_SETNATIVEINDEX(fText, initialPosition); result = initialPosition; c = UTEXT_NEXT32(fText); - if (fData == NULL || c==U_SENTINEL) { - return BreakIterator::DONE; + if (c==U_SENTINEL) { + fDone = TRUE; + return UBRK_DONE; } // Set the initial state for the state machine @@ -1100,10 +838,10 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned, // not the size of the character going in, which is a UChar32. // - UTRIE_GET16(&fData->fTrie, c, category); + category = UTRIE2_GET16(fData->fTrie, c); // Check the dictionary bit in the character's category. - // Counter is only used by dictionary based iterators (subclasses). + // Counter is only used by dictionary based iteration. // Chars that need to be handled by a dictionary have a flag bit set // in their category values. // @@ -1115,7 +853,7 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { } #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf(" %4ld ", utext_getNativeIndex(fText)); if (0x20<=c && c<0x7f) { RBBIDebugPrintf("\"%c\" ", c); @@ -1144,7 +882,7 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { if (mode != RBBI_START) { result = (int32_t)UTEXT_GETNATIVEINDEX(fText); } - fLastRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) values. + fRuleStatusIndex = row->fTagIdx; // Remember the break status (tag) values. } int16_t completedRule = row->fAccepting; @@ -1152,8 +890,8 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // Lookahead match is completed. int32_t lookaheadResult = lookAheadMatches.getPosition(completedRule); if (lookaheadResult >= 0) { - fLastRuleStatusIndex = row->fTagIdx; - UTEXT_SETNATIVEINDEX(fText, lookaheadResult); + fRuleStatusIndex = row->fTagIdx; + fPosition = lookaheadResult; return lookaheadResult; } } @@ -1182,8 +920,6 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { mode = RBBI_RUN; } } - - } // The state machine is done. Check whether it found a match... @@ -1192,15 +928,16 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // (This really indicates a defect in the break rules. They should always match // at least one character.) if (result == initialPosition) { - UTEXT_SETNATIVEINDEX(fText, initialPosition); - UTEXT_NEXT32(fText); - result = (int32_t)UTEXT_GETNATIVEINDEX(fText); + utext_setNativeIndex(fText, initialPosition); + utext_next32(fText); + result = (int32_t)utext_getNativeIndex(fText); + fRuleStatusIndex = 0; } // Leave the iterator at our result position. - UTEXT_SETNATIVEINDEX(fText, result); + fPosition = result; #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf("result = %d\n\n", result); } #endif @@ -1213,13 +950,11 @@ int32_t RuleBasedBreakIterator::handleNext(const RBBIStateTable *statetable) { // // handlePrevious() // -// Iterate backwards, according to the logic of the reverse rules. -// This version handles the exact style backwards rules. -// +// Iterate backwards using the safe reverse rules. // The logic of this function is very similar to handleNext(), above. // //----------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) { +int32_t RuleBasedBreakIterator::handlePrevious(int32_t fromPosition) { int32_t state; uint16_t category = 0; RBBIRunMode mode; @@ -1229,19 +964,14 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) int32_t result = 0; int32_t initialPosition = 0; + const RBBIStateTable *stateTable = fData->fSafeRevTable; + UTEXT_SETNATIVEINDEX(fText, fromPosition); #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPuts("Handle Previous pos char state category"); } #endif - // handlePrevious() never gets the rule status. - // Flag the status as invalid; if the user ever asks for status, we will need - // to back up, then re-find the break position using handleNext(), which does - // get the status value. - fLastStatusIndexValid = FALSE; - fLastRuleStatusIndex = 0; - // if we're already at the start of the text, return DONE. if (fText == NULL || fData == NULL || UTEXT_GETNATIVEINDEX(fText)==0) { return BreakIterator::DONE; @@ -1255,10 +985,10 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) // Set the initial state for the state machine state = START_STATE; row = (RBBIStateTableRow *) - (statetable->fTableData + (statetable->fRowLen * state)); + (stateTable->fTableData + (stateTable->fRowLen * state)); category = 3; mode = RBBI_RUN; - if (statetable->fFlags & RBBI_BOF_REQUIRED) { + if (stateTable->fFlags & RBBI_BOF_REQUIRED) { category = 2; mode = RBBI_START; } @@ -1273,12 +1003,6 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) // We have already run the loop one last time with the // character set to the psueudo {eof} value. Now it is time // to unconditionally bail out. - if (result == initialPosition) { - // Ran off start, no match found. - // move one index one (towards the start, since we are doing a previous()) - UTEXT_SETNATIVEINDEX(fText, initialPosition); - (void)UTEXT_PREVIOUS32(fText); // TODO: shouldn't be necessary. We're already at beginning. Check. - } break; } // Run the loop one last time with the fake end-of-input character category. @@ -1297,22 +1021,13 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) // Note: the 16 in UTRIE_GET16 refers to the size of the data being returned, // not the size of the character going in, which is a UChar32. // - UTRIE_GET16(&fData->fTrie, c, category); - - // Check the dictionary bit in the character's category. - // Counter is only used by dictionary based iterators (subclasses). - // Chars that need to be handled by a dictionary have a flag bit set - // in their category values. - // - if ((category & 0x4000) != 0) { - fDictionaryCharCount++; - // And off the dictionary flag bit. - category &= ~0x4000; - } + // And off the dictionary flag bit. For reverse iteration it is not used. + category = UTRIE2_GET16(fData->fTrie, c); + category &= ~0x4000; } #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf(" %4d ", (int32_t)utext_getNativeIndex(fText)); if (0x20<=c && c<0x7f) { RBBIDebugPrintf("\"%c\" ", c); @@ -1332,7 +1047,7 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) U_ASSERT(categoryfHeader->fCatCount); state = row->fNextState[category]; /*Not accessing beyond memory*/ row = (RBBIStateTableRow *) - (statetable->fTableData + (statetable->fRowLen * state)); + (stateTable->fTableData + (stateTable->fRowLen * state)); if (row->fAccepting == -1) { // Match found, common case. @@ -1386,10 +1101,8 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) result = (int32_t)UTEXT_GETNATIVEINDEX(fText); } - // Leave the iterator at our result position. - UTEXT_SETNATIVEINDEX(fText, result); #ifdef RBBI_DEBUG - if (fTrace) { + if (gTrace) { RBBIDebugPrintf("result = %d\n\n", result); } #endif @@ -1397,20 +1110,6 @@ int32_t RuleBasedBreakIterator::handlePrevious(const RBBIStateTable *statetable) } -void -RuleBasedBreakIterator::reset() -{ - if (fCachedBreakPositions) { - uprv_free(fCachedBreakPositions); - } - fCachedBreakPositions = NULL; - fNumCachedBreakPositions = 0; - fDictionaryCharCount = 0; - fPositionInCache = 0; -} - - - //------------------------------------------------------------------------------- // // getRuleStatus() Return the break rule tag associated with the current @@ -1418,64 +1117,27 @@ RuleBasedBreakIterator::reset() // position by iterating forwards, the value will have been // cached by the handleNext() function. // -// If no cached status value is available, the status is -// found by doing a previous() followed by a next(), which -// leaves the iterator where it started, and computes the -// status while doing the next(). -// //------------------------------------------------------------------------------- -void RuleBasedBreakIterator::makeRuleStatusValid() { - if (fLastStatusIndexValid == FALSE) { - // No cached status is available. - if (fText == NULL || current() == 0) { - // At start of text, or there is no text. Status is always zero. - fLastRuleStatusIndex = 0; - fLastStatusIndexValid = TRUE; - } else { - // Not at start of text. Find status the tedious way. - int32_t pa = current(); - previous(); - if (fNumCachedBreakPositions > 0) { - reset(); // Blow off the dictionary cache - } - int32_t pb = next(); - if (pa != pb) { - // note: the if (pa != pb) test is here only to eliminate warnings for - // unused local variables on gcc. Logically, it isn't needed. - U_ASSERT(pa == pb); - } - } - } - U_ASSERT(fLastRuleStatusIndex >= 0 && fLastRuleStatusIndex < fData->fStatusMaxIdx); -} - int32_t RuleBasedBreakIterator::getRuleStatus() const { - RuleBasedBreakIterator *nonConstThis = (RuleBasedBreakIterator *)this; - nonConstThis->makeRuleStatusValid(); // fLastRuleStatusIndex indexes to the start of the appropriate status record // (the number of status values.) // This function returns the last (largest) of the array of status values. - int32_t idx = fLastRuleStatusIndex + fData->fRuleStatusTable[fLastRuleStatusIndex]; + int32_t idx = fRuleStatusIndex + fData->fRuleStatusTable[fRuleStatusIndex]; int32_t tagVal = fData->fRuleStatusTable[idx]; return tagVal; } - - int32_t RuleBasedBreakIterator::getRuleStatusVec( - int32_t *fillInVec, int32_t capacity, UErrorCode &status) -{ + int32_t *fillInVec, int32_t capacity, UErrorCode &status) { if (U_FAILURE(status)) { return 0; } - RuleBasedBreakIterator *nonConstThis = (RuleBasedBreakIterator *)this; - nonConstThis->makeRuleStatusValid(); - int32_t numVals = fData->fRuleStatusTable[fLastRuleStatusIndex]; + int32_t numVals = fData->fRuleStatusTable[fRuleStatusIndex]; int32_t numValsToCopy = numVals; if (numVals > capacity) { status = U_BUFFER_OVERFLOW_ERROR; @@ -1483,7 +1145,7 @@ int32_t RuleBasedBreakIterator::getRuleStatusVec( } int i; for (i=0; ifRuleStatusTable[fLastRuleStatusIndex + i + 1]; + fillInVec[i] = fData->fRuleStatusTable[fRuleStatusIndex + i + 1]; } return numVals; } @@ -1531,205 +1193,25 @@ BreakIterator * RuleBasedBreakIterator::createBufferClone(void * /*stackBuffer* return (RuleBasedBreakIterator *)clonedBI; } - -//------------------------------------------------------------------------------- -// -// isDictionaryChar Return true if the category lookup for this char -// indicates that it is in the set of dictionary lookup -// chars. -// -// This function is intended for use by dictionary based -// break iterators. -// -//------------------------------------------------------------------------------- -/*UBool RuleBasedBreakIterator::isDictionaryChar(UChar32 c) { - if (fData == NULL) { - return FALSE; - } - uint16_t category; - UTRIE_GET16(&fData->fTrie, c, category); - return (category & 0x4000) != 0; -}*/ - - -//------------------------------------------------------------------------------- -// -// checkDictionary This function handles all processing of characters in -// the "dictionary" set. It will determine the appropriate -// course of action, and possibly set up a cache in the -// process. -// -//------------------------------------------------------------------------------- -int32_t RuleBasedBreakIterator::checkDictionary(int32_t startPos, - int32_t endPos, - UBool reverse) { - // Reset the old break cache first. - reset(); - - // note: code segment below assumes that dictionary chars are in the - // startPos-endPos range - // value returned should be next character in sequence - if ((endPos - startPos) <= 1) { - return (reverse ? startPos : endPos); - } - - // Starting from the starting point, scan towards the proposed result, - // looking for the first dictionary character (which may be the one - // we're on, if we're starting in the middle of a range). - utext_setNativeIndex(fText, reverse ? endPos : startPos); - if (reverse) { - UTEXT_PREVIOUS32(fText); - } - - int32_t rangeStart = startPos; - int32_t rangeEnd = endPos; - - uint16_t category; - int32_t current; - UErrorCode status = U_ZERO_ERROR; - UStack breaks(status); - int32_t foundBreakCount = 0; - UChar32 c = utext_current32(fText); - - UTRIE_GET16(&fData->fTrie, c, category); - - // Is the character we're starting on a dictionary character? If so, we - // need to back up to include the entire run; otherwise the results of - // the break algorithm will differ depending on where we start. Since - // the result is cached and there is typically a non-dictionary break - // within a small number of words, there should be little performance impact. - if (category & 0x4000) { - if (reverse) { - do { - utext_next32(fText); // TODO: recast to work directly with postincrement. - c = utext_current32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } while (c != U_SENTINEL && (category & 0x4000)); - // Back up to the last dictionary character - rangeEnd = (int32_t)UTEXT_GETNATIVEINDEX(fText); - if (c == U_SENTINEL) { - // c = fText->last32(); - // TODO: why was this if needed? - c = UTEXT_PREVIOUS32(fText); - } - else { - c = UTEXT_PREVIOUS32(fText); - } - } - else { - do { - c = UTEXT_PREVIOUS32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } - while (c != U_SENTINEL && (category & 0x4000)); - // Back up to the last dictionary character - if (c == U_SENTINEL) { - // c = fText->first32(); - c = utext_current32(fText); - } - else { - utext_next32(fText); - c = utext_current32(fText); - } - rangeStart = (int32_t)UTEXT_GETNATIVEINDEX(fText);; - } - UTRIE_GET16(&fData->fTrie, c, category); - } - - // Loop through the text, looking for ranges of dictionary characters. - // For each span, find the appropriate break engine, and ask it to find - // any breaks within the span. - // Note: we always do this in the forward direction, so that the break - // cache is built in the right order. - if (reverse) { - utext_setNativeIndex(fText, rangeStart); - c = utext_current32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } - while(U_SUCCESS(status)) { - while((current = (int32_t)UTEXT_GETNATIVEINDEX(fText)) < rangeEnd && (category & 0x4000) == 0) { - utext_next32(fText); // TODO: tweak for post-increment operation - c = utext_current32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } - if (current >= rangeEnd) { - break; - } - - // We now have a dictionary character. Get the appropriate language object - // to deal with it. - const LanguageBreakEngine *lbe = getLanguageBreakEngine(c); - - // Ask the language object if there are any breaks. It will leave the text - // pointer on the other side of its range, ready to search for the next one. - if (lbe != NULL) { - foundBreakCount += lbe->findBreaks(fText, rangeStart, rangeEnd, FALSE, fBreakType, breaks); - } - - // Reload the loop variables for the next go-round - c = utext_current32(fText); - UTRIE_GET16(&fData->fTrie, c, category); - } - - // If we found breaks, build a new break cache. The first and last entries must - // be the original starting and ending position. - if (foundBreakCount > 0) { - U_ASSERT(foundBreakCount == breaks.size()); - int32_t totalBreaks = foundBreakCount; - if (startPos < breaks.elementAti(0)) { - totalBreaks += 1; - } - if (endPos > breaks.peeki()) { - totalBreaks += 1; - } - fCachedBreakPositions = (int32_t *)uprv_malloc(totalBreaks * sizeof(int32_t)); - if (fCachedBreakPositions != NULL) { - int32_t out = 0; - fNumCachedBreakPositions = totalBreaks; - if (startPos < breaks.elementAti(0)) { - fCachedBreakPositions[out++] = startPos; - } - for (int32_t i = 0; i < foundBreakCount; ++i) { - fCachedBreakPositions[out++] = breaks.elementAti(i); - } - if (endPos > fCachedBreakPositions[out-1]) { - fCachedBreakPositions[out] = endPos; - } - // If there are breaks, then by definition, we are replacing the original - // proposed break by one of the breaks we found. Use following() and - // preceding() to do the work. They should never recurse in this case. - if (reverse) { - return preceding(endPos); - } - else { - return following(startPos); - } - } - // If the allocation failed, just fall through to the "no breaks found" case. - } - - // If we get here, there were no language-based breaks. Set the text pointer - // to the original proposed break. - utext_setNativeIndex(fText, reverse ? startPos : endPos); - return (reverse ? startPos : endPos); -} - U_NAMESPACE_END -static icu::UStack *gLanguageBreakFactories = NULL; +static icu::UStack *gLanguageBreakFactories = nullptr; +static const icu::UnicodeString *gEmptyString = nullptr; static icu::UInitOnce gLanguageBreakFactoriesInitOnce = U_INITONCE_INITIALIZER; +static icu::UInitOnce gRBBIInitOnce = U_INITONCE_INITIALIZER; /** * Release all static memory held by breakiterator. */ U_CDECL_BEGIN -static UBool U_CALLCONV breakiterator_cleanup_dict(void) { - if (gLanguageBreakFactories) { - delete gLanguageBreakFactories; - gLanguageBreakFactories = NULL; - } +static UBool U_CALLCONV rbbi_cleanup(void) { + delete gLanguageBreakFactories; + gLanguageBreakFactories = nullptr; + delete gEmptyString; + gEmptyString = nullptr; gLanguageBreakFactoriesInitOnce.reset(); + gRBBIInitOnce.reset(); return TRUE; } U_CDECL_END @@ -1741,6 +1223,11 @@ static void U_CALLCONV _deleteFactory(void *obj) { U_CDECL_END U_NAMESPACE_BEGIN +static void U_CALLCONV rbbiInit() { + gEmptyString = new UnicodeString(); + ucln_common_registerCleanup(UCLN_COMMON_RBBI, rbbi_cleanup); +} + static void U_CALLCONV initLanguageFactories() { UErrorCode status = U_ZERO_ERROR; U_ASSERT(gLanguageBreakFactories == NULL); @@ -1755,7 +1242,7 @@ static void U_CALLCONV initLanguageFactories() { } #endif } - ucln_common_registerCleanup(UCLN_COMMON_BREAKITERATOR_DICT, breakiterator_cleanup_dict); + ucln_common_registerCleanup(UCLN_COMMON_RBBI, rbbi_cleanup); } @@ -1853,7 +1340,24 @@ RuleBasedBreakIterator::getLanguageBreakEngine(UChar32 c) { void RuleBasedBreakIterator::setBreakType(int32_t type) { fBreakType = type; - reset(); +} + +void RuleBasedBreakIterator::dumpCache() { + fBreakCache->dumpCache(); +} + +/** + * Returns the description used to create this iterator + */ + +const UnicodeString& +RuleBasedBreakIterator::getRules() const { + if (fData != NULL) { + return fData->getRuleSourceString(); + } else { + umtx_initOnce(gRBBIInitOnce, &rbbiInit); + return *gEmptyString; + } } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/rbbi_cache.cpp b/deps/icu-small/source/common/rbbi_cache.cpp new file mode 100644 index 00000000000000..9d716bb34274c4 --- /dev/null +++ b/deps/icu-small/source/common/rbbi_cache.cpp @@ -0,0 +1,630 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// file: rbbi_cache.cpp + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + +#include "unicode/ubrk.h" +#include "unicode/rbbi.h" + +#include "rbbi_cache.h" + +#include "brkeng.h" +#include "cmemory.h" +#include "rbbidata.h" +#include "rbbirb.h" +#include "uassert.h" +#include "uvectr32.h" + +U_NAMESPACE_BEGIN + +/* + * DictionaryCache implementation + */ + +RuleBasedBreakIterator::DictionaryCache::DictionaryCache(RuleBasedBreakIterator *bi, UErrorCode &status) : + fBI(bi), fBreaks(NULL), fPositionInCache(-1), + fStart(0), fLimit(0), fFirstRuleStatusIndex(0), fOtherRuleStatusIndex(0) { + fBreaks = new UVector32(status); +} + +RuleBasedBreakIterator::DictionaryCache::~DictionaryCache() { + delete fBreaks; + fBreaks = NULL; +} + +void RuleBasedBreakIterator::DictionaryCache::reset() { + fPositionInCache = -1; + fStart = 0; + fLimit = 0; + fFirstRuleStatusIndex = 0; + fOtherRuleStatusIndex = 0; + fBreaks->removeAllElements(); +} + +UBool RuleBasedBreakIterator::DictionaryCache::following(int32_t fromPos, int32_t *result, int32_t *statusIndex) { + if (fromPos >= fLimit || fromPos < fStart) { + fPositionInCache = -1; + return FALSE; + } + + // Sequential iteration, move from previous boundary to the following + + int32_t r = 0; + if (fPositionInCache >= 0 && fPositionInCache < fBreaks->size() && fBreaks->elementAti(fPositionInCache) == fromPos) { + ++fPositionInCache; + if (fPositionInCache >= fBreaks->size()) { + fPositionInCache = -1; + return FALSE; + } + r = fBreaks->elementAti(fPositionInCache); + U_ASSERT(r > fromPos); + *result = r; + *statusIndex = fOtherRuleStatusIndex; + return TRUE; + } + + // Random indexing. Linear search for the boundary following the given position. + + for (fPositionInCache = 0; fPositionInCache < fBreaks->size(); ++fPositionInCache) { + r= fBreaks->elementAti(fPositionInCache); + if (r > fromPos) { + *result = r; + *statusIndex = fOtherRuleStatusIndex; + return TRUE; + } + } + U_ASSERT(FALSE); + fPositionInCache = -1; + return FALSE; +} + + +UBool RuleBasedBreakIterator::DictionaryCache::preceding(int32_t fromPos, int32_t *result, int32_t *statusIndex) { + if (fromPos <= fStart || fromPos > fLimit) { + fPositionInCache = -1; + return FALSE; + } + + if (fromPos == fLimit) { + fPositionInCache = fBreaks->size() - 1; + if (fPositionInCache >= 0) { + U_ASSERT(fBreaks->elementAti(fPositionInCache) == fromPos); + } + } + + int32_t r; + if (fPositionInCache > 0 && fPositionInCache < fBreaks->size() && fBreaks->elementAti(fPositionInCache) == fromPos) { + --fPositionInCache; + r = fBreaks->elementAti(fPositionInCache); + U_ASSERT(r < fromPos); + *result = r; + *statusIndex = ( r== fStart) ? fFirstRuleStatusIndex : fOtherRuleStatusIndex; + return TRUE; + } + + if (fPositionInCache == 0) { + fPositionInCache = -1; + return FALSE; + } + + for (fPositionInCache = fBreaks->size()-1; fPositionInCache >= 0; --fPositionInCache) { + r = fBreaks->elementAti(fPositionInCache); + if (r < fromPos) { + *result = r; + *statusIndex = ( r == fStart) ? fFirstRuleStatusIndex : fOtherRuleStatusIndex; + return TRUE; + } + } + U_ASSERT(FALSE); + fPositionInCache = -1; + return FALSE; +} + +void RuleBasedBreakIterator::DictionaryCache::populateDictionary(int32_t startPos, int32_t endPos, + int32_t firstRuleStatus, int32_t otherRuleStatus) { + if ((endPos - startPos) <= 1) { + return; + } + + reset(); + fFirstRuleStatusIndex = firstRuleStatus; + fOtherRuleStatusIndex = otherRuleStatus; + + int32_t rangeStart = startPos; + int32_t rangeEnd = endPos; + + uint16_t category; + int32_t current; + UErrorCode status = U_ZERO_ERROR; + int32_t foundBreakCount = 0; + UText *text = fBI->fText; + + // Loop through the text, looking for ranges of dictionary characters. + // For each span, find the appropriate break engine, and ask it to find + // any breaks within the span. + + utext_setNativeIndex(text, rangeStart); + UChar32 c = utext_current32(text); + category = UTRIE2_GET16(fBI->fData->fTrie, c); + + while(U_SUCCESS(status)) { + while((current = (int32_t)UTEXT_GETNATIVEINDEX(text)) < rangeEnd && (category & 0x4000) == 0) { + utext_next32(text); // TODO: cleaner loop structure. + c = utext_current32(text); + category = UTRIE2_GET16(fBI->fData->fTrie, c); + } + if (current >= rangeEnd) { + break; + } + + // We now have a dictionary character. Get the appropriate language object + // to deal with it. + const LanguageBreakEngine *lbe = fBI->getLanguageBreakEngine(c); + + // Ask the language object if there are any breaks. It will add them to the cache and + // leave the text pointer on the other side of its range, ready to search for the next one. + if (lbe != NULL) { + foundBreakCount += lbe->findBreaks(text, rangeStart, rangeEnd, fBI->fBreakType, *fBreaks); + } + + // Reload the loop variables for the next go-round + c = utext_current32(text); + category = UTRIE2_GET16(fBI->fData->fTrie, c); + } + + // If we found breaks, ensure that the first and last entries are + // the original starting and ending position. And initialize the + // cache iteration position to the first entry. + + // printf("foundBreakCount = %d\n", foundBreakCount); + if (foundBreakCount > 0) { + U_ASSERT(foundBreakCount == fBreaks->size()); + if (startPos < fBreaks->elementAti(0)) { + // The dictionary did not place a boundary at the start of the segment of text. + // Add one now. This should not commonly happen, but it would be easy for interactions + // of the rules for dictionary segments and the break engine implementations to + // inadvertently cause it. Cover it here, just in case. + fBreaks->insertElementAt(startPos, 0, status); + } + if (endPos > fBreaks->peeki()) { + fBreaks->push(endPos, status); + } + fPositionInCache = 0; + // Note: Dictionary matching may extend beyond the original limit. + fStart = fBreaks->elementAti(0); + fLimit = fBreaks->peeki(); + } else { + // there were no language-based breaks, even though the segment contained + // dictionary characters. Subsequent attempts to fetch boundaries from the dictionary cache + // for this range will fail, and the calling code will fall back to the rule based boundaries. + } +} + + +/* + * BreakCache implemetation + */ + +RuleBasedBreakIterator::BreakCache::BreakCache(RuleBasedBreakIterator *bi, UErrorCode &status) : + fBI(bi), fSideBuffer(status) { + reset(); +} + + +RuleBasedBreakIterator::BreakCache::~BreakCache() { +} + + +void RuleBasedBreakIterator::BreakCache::reset(int32_t pos, int32_t ruleStatus) { + fStartBufIdx = 0; + fEndBufIdx = 0; + fTextIdx = pos; + fBufIdx = 0; + fBoundaries[0] = pos; + fStatuses[0] = (uint16_t)ruleStatus; +} + + +int32_t RuleBasedBreakIterator::BreakCache::current() { + fBI->fPosition = fTextIdx; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + fBI->fDone = FALSE; + return fTextIdx; +} + + +void RuleBasedBreakIterator::BreakCache::following(int32_t startPos, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + if (startPos == fTextIdx || seek(startPos) || populateNear(startPos, status)) { + // startPos is in the cache. Do a next() from that position. + // TODO: an awkward set of interactions with bi->fDone + // seek() does not clear it; it can't because of interactions with populateNear(). + // next() does not clear it in the fast-path case, where everything matters. Maybe it should. + // So clear it here, for the case where seek() succeeded on an iterator that had previously run off the end. + fBI->fDone = false; + next(); + } + return; +} + + +void RuleBasedBreakIterator::BreakCache::preceding(int32_t startPos, UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + if (startPos == fTextIdx || seek(startPos) || populateNear(startPos, status)) { + if (startPos == fTextIdx) { + previous(status); + } else { + // seek() leaves the BreakCache positioned at the preceding boundary + // if the requested position is between two bounaries. + // current() pushes the BreakCache position out to the BreakIterator itself. + U_ASSERT(startPos > fTextIdx); + current(); + } + } + return; +} + + +/* + * Out-of-line code for BreakCache::next(). + * Cache does not already contain the boundary + */ +void RuleBasedBreakIterator::BreakCache::nextOL() { + fBI->fDone = !populateFollowing(); + fBI->fPosition = fTextIdx; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + return; +} + + +void RuleBasedBreakIterator::BreakCache::previous(UErrorCode &status) { + if (U_FAILURE(status)) { + return; + } + int32_t initialBufIdx = fBufIdx; + if (fBufIdx == fStartBufIdx) { + // At start of cache. Prepend to it. + populatePreceding(status); + } else { + // Cache already holds the next boundary + fBufIdx = modChunkSize(fBufIdx - 1); + fTextIdx = fBoundaries[fBufIdx]; + } + fBI->fDone = (fBufIdx == initialBufIdx); + fBI->fPosition = fTextIdx; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + return; +} + + +UBool RuleBasedBreakIterator::BreakCache::seek(int32_t pos) { + if (pos < fBoundaries[fStartBufIdx] || pos > fBoundaries[fEndBufIdx]) { + return FALSE; + } + if (pos == fBoundaries[fStartBufIdx]) { + // Common case: seek(0), from BreakIterator::first() + fBufIdx = fStartBufIdx; + fTextIdx = fBoundaries[fBufIdx]; + return TRUE; + } + if (pos == fBoundaries[fEndBufIdx]) { + fBufIdx = fEndBufIdx; + fTextIdx = fBoundaries[fBufIdx]; + return TRUE; + } + + int32_t min = fStartBufIdx; + int32_t max = fEndBufIdx; + while (min != max) { + int32_t probe = (min + max + (min>max ? CACHE_SIZE : 0)) / 2; + probe = modChunkSize(probe); + if (fBoundaries[probe] > pos) { + max = probe; + } else { + min = modChunkSize(probe + 1); + } + } + U_ASSERT(fBoundaries[max] > pos); + fBufIdx = modChunkSize(max - 1); + fTextIdx = fBoundaries[fBufIdx]; + U_ASSERT(fTextIdx <= pos); + return TRUE; +} + + +UBool RuleBasedBreakIterator::BreakCache::populateNear(int32_t position, UErrorCode &status) { + if (U_FAILURE(status)) { + return FALSE; + } + U_ASSERT(position < fBoundaries[fStartBufIdx] || position > fBoundaries[fEndBufIdx]); + + // Find a boundary somewhere in the vicinity of the requested position. + // Depending on the safe rules and the text data, it could be either before, at, or after + // the requested position. + + + // If the requested position is not near already cached positions, clear the existing cache, + // find a near-by boundary and begin new cache contents there. + + if ((position < fBoundaries[fStartBufIdx] - 15) || position > (fBoundaries[fEndBufIdx] + 15)) { + int32_t aBoundary = 0; + int32_t ruleStatusIndex = 0; + // TODO: check for position == length of text. Although may still need to back up to get rule status. + if (position > 20) { + int32_t backupPos = fBI->handlePrevious(position); + fBI->fPosition = backupPos; + aBoundary = fBI->handleNext(); // Ignore dictionary, just finding a rule based boundary. + ruleStatusIndex = fBI->fRuleStatusIndex; + } + reset(aBoundary, ruleStatusIndex); // Reset cache to hold aBoundary as a single starting point. + } + + // Fill in boundaries between existing cache content and the new requested position. + + if (fBoundaries[fEndBufIdx] < position) { + // The last position in the cache precedes the requested position. + // Add following position(s) to the cache. + while (fBoundaries[fEndBufIdx] < position) { + if (!populateFollowing()) { + U_ASSERT(false); + return false; + } + } + fBufIdx = fEndBufIdx; // Set iterator position to the end of the buffer. + fTextIdx = fBoundaries[fBufIdx]; // Required because populateFollowing may add extra boundaries. + while (fTextIdx > position) { // Move backwards to a position at or preceding the requested pos. + previous(status); + } + return true; + } + + if (fBoundaries[fStartBufIdx] > position) { + // The first position in the cache is beyond the requested position. + // back up more until we get a boundary <= the requested position. + while (fBoundaries[fStartBufIdx] > position) { + populatePreceding(status); + } + fBufIdx = fStartBufIdx; // Set iterator position to the start of the buffer. + fTextIdx = fBoundaries[fBufIdx]; // Required because populatePreceding may add extra boundaries. + while (fTextIdx < position) { // Move forwards to a position at or following the requested pos. + next(); + } + if (fTextIdx > position) { + // If position is not itself a boundary, the next() loop above will overshoot. + // Back up one, leaving cache position at the boundary preceding the requested position. + previous(status); + } + return true; + } + + U_ASSERT(fTextIdx == position); + return true; +} + + + +UBool RuleBasedBreakIterator::BreakCache::populateFollowing() { + int32_t fromPosition = fBoundaries[fEndBufIdx]; + int32_t fromRuleStatusIdx = fStatuses[fEndBufIdx]; + int32_t pos = 0; + int32_t ruleStatusIdx = 0; + + if (fBI->fDictionaryCache->following(fromPosition, &pos, &ruleStatusIdx)) { + addFollowing(pos, ruleStatusIdx, UpdateCachePosition); + return TRUE; + } + + fBI->fPosition = fromPosition; + pos = fBI->handleNext(); + if (pos == UBRK_DONE) { + return FALSE; + } + + ruleStatusIdx = fBI->fRuleStatusIndex; + if (fBI->fDictionaryCharCount > 0) { + // The text segment obtained from the rules includes dictionary characters. + // Subdivide it, with subdivided results going into the dictionary cache. + fBI->fDictionaryCache->populateDictionary(fromPosition, pos, fromRuleStatusIdx, ruleStatusIdx); + if (fBI->fDictionaryCache->following(fromPosition, &pos, &ruleStatusIdx)) { + addFollowing(pos, ruleStatusIdx, UpdateCachePosition); + return TRUE; + // TODO: may want to move a sizable chunk of dictionary cache to break cache at this point. + // But be careful with interactions with populateNear(). + } + } + + // Rule based segment did not include dictionary characters. + // Or, it did contain dictionary chars, but the dictionary segmenter didn't handle them, + // meaning that we didn't take the return, above. + // Add its end point to the cache. + addFollowing(pos, ruleStatusIdx, UpdateCachePosition); + + // Add several non-dictionary boundaries at this point, to optimize straight forward iteration. + // (subsequent calls to BreakIterator::next() will take the fast path, getting cached results. + // + for (int count=0; count<6; ++count) { + pos = fBI->handleNext(); + if (pos == UBRK_DONE || fBI->fDictionaryCharCount > 0) { + break; + } + addFollowing(pos, fBI->fRuleStatusIndex, RetainCachePosition); + } + + return TRUE; +} + + +UBool RuleBasedBreakIterator::BreakCache::populatePreceding(UErrorCode &status) { + if (U_FAILURE(status)) { + return FALSE; + } + + int32_t fromPosition = fBoundaries[fStartBufIdx]; + if (fromPosition == 0) { + return FALSE; + } + + int32_t position = 0; + int32_t positionStatusIdx = 0; + + if (fBI->fDictionaryCache->preceding(fromPosition, &position, &positionStatusIdx)) { + addPreceding(position, positionStatusIdx, UpdateCachePosition); + return TRUE; + } + + int32_t backupPosition = fromPosition; + + // Find a boundary somewhere preceding the first already-cached boundary + do { + backupPosition = backupPosition - 30; + if (backupPosition <= 0) { + backupPosition = 0; + } else { + backupPosition = fBI->handlePrevious(backupPosition); + } + if (backupPosition == UBRK_DONE || backupPosition == 0) { + position = 0; + positionStatusIdx = 0; + } else { + fBI->fPosition = backupPosition; // TODO: pass starting position in a clearer way. + position = fBI->handleNext(); + positionStatusIdx = fBI->fRuleStatusIndex; + + } + } while (position >= fromPosition); + + // Find boundaries between the one we just located and the first already-cached boundary + // Put them in a side buffer, because we don't yet know where they will fall in the circular cache buffer.. + + fSideBuffer.removeAllElements(); + fSideBuffer.addElement(position, status); + fSideBuffer.addElement(positionStatusIdx, status); + + do { + int32_t prevPosition = fBI->fPosition = position; + int32_t prevStatusIdx = positionStatusIdx; + position = fBI->handleNext(); + positionStatusIdx = fBI->fRuleStatusIndex; + if (position == UBRK_DONE) { + break; + } + + UBool segmentHandledByDictionary = FALSE; + if (fBI->fDictionaryCharCount != 0) { + // Segment from the rules includes dictionary characters. + // Subdivide it, with subdivided results going into the dictionary cache. + int32_t dictSegEndPosition = position; + fBI->fDictionaryCache->populateDictionary(prevPosition, dictSegEndPosition, prevStatusIdx, positionStatusIdx); + while (fBI->fDictionaryCache->following(prevPosition, &position, &positionStatusIdx)) { + segmentHandledByDictionary = true; + U_ASSERT(position > prevPosition); + if (position >= fromPosition) { + break; + } + U_ASSERT(position <= dictSegEndPosition); + fSideBuffer.addElement(position, status); + fSideBuffer.addElement(positionStatusIdx, status); + prevPosition = position; + } + U_ASSERT(position==dictSegEndPosition || position>=fromPosition); + } + + if (!segmentHandledByDictionary && position < fromPosition) { + fSideBuffer.addElement(position, status); + fSideBuffer.addElement(positionStatusIdx, status); + } + } while (position < fromPosition); + + // Move boundaries from the side buffer to the main circular buffer. + UBool success = FALSE; + if (!fSideBuffer.isEmpty()) { + positionStatusIdx = fSideBuffer.popi(); + position = fSideBuffer.popi(); + addPreceding(position, positionStatusIdx, UpdateCachePosition); + success = TRUE; + } + + while (!fSideBuffer.isEmpty()) { + positionStatusIdx = fSideBuffer.popi(); + position = fSideBuffer.popi(); + if (!addPreceding(position, positionStatusIdx, RetainCachePosition)) { + // No space in circular buffer to hold a new preceding result while + // also retaining the current cache (iteration) position. + // Bailing out is safe; the cache will refill again if needed. + break; + } + } + + return success; +} + + +void RuleBasedBreakIterator::BreakCache::addFollowing(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update) { + U_ASSERT(position > fBoundaries[fEndBufIdx]); + U_ASSERT(ruleStatusIdx <= UINT16_MAX); + int32_t nextIdx = modChunkSize(fEndBufIdx + 1); + if (nextIdx == fStartBufIdx) { + fStartBufIdx = modChunkSize(fStartBufIdx + 6); // TODO: experiment. Probably revert to 1. + } + fBoundaries[nextIdx] = position; + fStatuses[nextIdx] = ruleStatusIdx; + fEndBufIdx = nextIdx; + if (update == UpdateCachePosition) { + // Set current position to the newly added boundary. + fBufIdx = nextIdx; + fTextIdx = position; + } else { + // Retaining the original cache position. + // Check if the added boundary wraps around the buffer, and would over-write the original position. + // It's the responsibility of callers of this function to not add too many. + U_ASSERT(nextIdx != fBufIdx); + } +} + +bool RuleBasedBreakIterator::BreakCache::addPreceding(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update) { + U_ASSERT(position < fBoundaries[fStartBufIdx]); + U_ASSERT(ruleStatusIdx <= UINT16_MAX); + int32_t nextIdx = modChunkSize(fStartBufIdx - 1); + if (nextIdx == fEndBufIdx) { + if (fBufIdx == fEndBufIdx && update == RetainCachePosition) { + // Failure. The insertion of the new boundary would claim the buffer position that is the + // current iteration position. And we also want to retain the current iteration position. + // (The buffer is already completely full of entries that precede the iteration position.) + return false; + } + fEndBufIdx = modChunkSize(fEndBufIdx - 1); + } + fBoundaries[nextIdx] = position; + fStatuses[nextIdx] = ruleStatusIdx; + fStartBufIdx = nextIdx; + if (update == UpdateCachePosition) { + fBufIdx = nextIdx; + fTextIdx = position; + } + return true; +} + + +void RuleBasedBreakIterator::BreakCache::dumpCache() { +#ifdef RBBI_DEBUG + RBBIDebugPrintf("fTextIdx:%d fBufIdx:%d\n", fTextIdx, fBufIdx); + for (int32_t i=fStartBufIdx; ; i=modChunkSize(i+1)) { + RBBIDebugPrintf("%d %d\n", i, fBoundaries[i]); + if (i == fEndBufIdx) { + break; + } + } +#endif +} + +U_NAMESPACE_END + +#endif // #if !UCONFIG_NO_BREAK_ITERATION diff --git a/deps/icu-small/source/common/rbbi_cache.h b/deps/icu-small/source/common/rbbi_cache.h new file mode 100644 index 00000000000000..b8a18d81deb1d9 --- /dev/null +++ b/deps/icu-small/source/common/rbbi_cache.h @@ -0,0 +1,203 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// file: rbbi_cache.h +// +#ifndef RBBI_CACHE_H +#define RBBI_CACHE_H + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + +#include "unicode/rbbi.h" +#include "unicode/uobject.h" + +#include "uvectr32.h" + +U_NAMESPACE_BEGIN + +/* DictionaryCache stores the boundaries obtained from a run of dictionary characters. + * Dictionary boundaries are moved first to this cache, then from here + * to the main BreakCache, where they may inter-leave with non-dictionary + * boundaries. The public BreakIterator API always fetches directly + * from the main BreakCache, not from here. + * + * In common situations, the number of boundaries in a single dictionary run + * should be quite small, it will be terminated by punctuation, spaces, + * or any other non-dictionary characters. The main BreakCache may end + * up with boundaries from multiple dictionary based runs. + * + * The boundaries are stored in a simple ArrayList (vector), with the + * assumption that they will be accessed sequentially. + */ +class RuleBasedBreakIterator::DictionaryCache: public UMemory { + public: + DictionaryCache(RuleBasedBreakIterator *bi, UErrorCode &status); + ~DictionaryCache(); + + void reset(); + + UBool following(int32_t fromPos, int32_t *pos, int32_t *statusIndex); + UBool preceding(int32_t fromPos, int32_t *pos, int32_t *statusIndex); + + /** + * Populate the cache with the dictionary based boundaries within a region of text. + * @param startPos The start position of a range of text + * @param endPos The end position of a range of text + * @param firstRuleStatus The rule status index that applies to the break at startPos + * @param otherRuleStatus The rule status index that applies to boundaries other than startPos + * @internal + */ + void populateDictionary(int32_t startPos, int32_t endPos, + int32_t firstRuleStatus, int32_t otherRuleStatus); + + + + RuleBasedBreakIterator *fBI; + + UVector32 *fBreaks; // A vector containing the boundaries. + int32_t fPositionInCache; // Index in fBreaks of last boundary returned by following() + // or preceding(). Optimizes sequential access. + int32_t fStart; // Text position of first boundary in cache. + int32_t fLimit; // Last boundary in cache. Which is the limit of the + // text segment being handled by the dictionary. + int32_t fFirstRuleStatusIndex; // Rule status info for first boundary. + int32_t fOtherRuleStatusIndex; // Rule status info for 2nd through last boundaries. +}; + + +/* + * class BreakCache + * + * Cache of break boundary positions and rule status values. + * Break iterator API functions, next(), previous(), etc., will use cached results + * when possible, and otherwise cache new results as they are obtained. + * + * Uniformly caches both dictionary and rule based (non-dictionary) boundaries. + * + * The cache is implemented as a single circular buffer. + */ + +/* + * size of the circular cache buffer. + */ + +class RuleBasedBreakIterator::BreakCache: public UMemory { + public: + BreakCache(RuleBasedBreakIterator *bi, UErrorCode &status); + virtual ~BreakCache(); + void reset(int32_t pos = 0, int32_t ruleStatus = 0); + void next() { if (fBufIdx == fEndBufIdx) { + nextOL(); + } else { + fBufIdx = modChunkSize(fBufIdx + 1); + fTextIdx = fBI->fPosition = fBoundaries[fBufIdx]; + fBI->fRuleStatusIndex = fStatuses[fBufIdx]; + } + }; + + + void nextOL(); + void previous(UErrorCode &status); + + // Move the iteration state to the position following the startPosition. + // Input position must be pinned to the input length. + void following(int32_t startPosition, UErrorCode &status); + + void preceding(int32_t startPosition, UErrorCode &status); + + /* + * Update the state of the public BreakIterator (fBI) to reflect the + * current state of the break iterator cache (this). + */ + int32_t current(); + + /** + * Add boundaries to the cache near the specified position. + * The given position need not be a boundary itself. + * The input position must be within the range of the text, and + * on a code point boundary. + * If the requested position is a break boundary, leave the iteration + * position on it. + * If the requested position is not a boundary, leave the iteration + * position on the preceding boundary and include both the the + * preceding and following boundaries in the cache. + * Additional boundaries, either preceding or following, may be added + * to the cache as a side effect. + * + * Return FALSE if the operation failed. + */ + UBool populateNear(int32_t position, UErrorCode &status); + + /** + * Add boundary(s) to the cache following the current last boundary. + * Return FALSE if at the end of the text, and no more boundaries can be added. + * Leave iteration position at the first newly added boundary, or unchanged if no boundary was added. + */ + UBool populateFollowing(); + + /** + * Add one or more boundaries to the cache preceding the first currently cached boundary. + * Leave the iteration position on the first added boundary. + * Return false if no boundaries could be added (if at the start of the text.) + */ + UBool populatePreceding(UErrorCode &status); + + enum UpdatePositionValues { + RetainCachePosition = 0, + UpdateCachePosition = 1 + }; + + /* + * Add the boundary following the current position. + * The current position can be left as it was, or changed to the newly added boundary, + * as specified by the update parameter. + */ + void addFollowing(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update); + + + /* + * Add the boundary preceding the current position. + * The current position can be left as it was, or changed to the newly added boundary, + * as specified by the update parameter. + */ + bool addPreceding(int32_t position, int32_t ruleStatusIdx, UpdatePositionValues update); + + /** + * Set the cache position to the specified position, or, if the position + * falls between to cached boundaries, to the preceding boundary. + * Fails if the requested position is outside of the range of boundaries currently held by the cache. + * The startPosition must be on a code point boundary. + * + * Return TRUE if successful, FALSE if the specified position is after + * the last cached boundary or before the first. + */ + UBool seek(int32_t startPosition); + + void dumpCache(); + + private: + static inline int32_t modChunkSize(int index) { return index & (CACHE_SIZE - 1); }; + + static constexpr int32_t CACHE_SIZE = 128; + static_assert((CACHE_SIZE & (CACHE_SIZE-1)) == 0, "CACHE_SIZE must be power of two."); + + RuleBasedBreakIterator *fBI; + int32_t fStartBufIdx; + int32_t fEndBufIdx; // inclusive + + int32_t fTextIdx; + int32_t fBufIdx; + + int32_t fBoundaries[CACHE_SIZE]; + uint16_t fStatuses[CACHE_SIZE]; + + UVector32 fSideBuffer; +}; + +U_NAMESPACE_END + +#endif // #if !UCONFIG_NO_BREAK_ITERATION + +#endif // RBBI_CACHE_H diff --git a/deps/icu-small/source/common/rbbicst.pl b/deps/icu-small/source/common/rbbicst.pl old mode 100755 new mode 100644 diff --git a/deps/icu-small/source/common/rbbidata.cpp b/deps/icu-small/source/common/rbbidata.cpp index ecdc8f416560d4..d66eca82f80b39 100644 --- a/deps/icu-small/source/common/rbbidata.cpp +++ b/deps/icu-small/source/common/rbbidata.cpp @@ -14,7 +14,7 @@ #include "unicode/utypes.h" #include "rbbidata.h" #include "rbbirb.h" -#include "utrie.h" +#include "utrie2.h" #include "udatamem.h" #include "cmemory.h" #include "cstring.h" @@ -23,23 +23,6 @@ #include "uassert.h" -//----------------------------------------------------------------------------------- -// -// Trie access folding function. Copied as-is from properties code in uchar.c -// -//----------------------------------------------------------------------------------- -U_CDECL_BEGIN -static int32_t U_CALLCONV -getFoldingOffset(uint32_t data) { - /* if bit 15 is set, then the folding offset is in bits 14..0 of the 16-bit trie result */ - if(data&0x8000) { - return (int32_t)(data&0x7fff); - } else { - return 0; - } -} -U_CDECL_END - U_NAMESPACE_BEGIN //----------------------------------------------------------------------------- @@ -71,9 +54,8 @@ RBBIDataWrapper::RBBIDataWrapper(UDataMemory* udm, UErrorCode &status) { dh->info.dataFormat[0] == 0x42 && // dataFormat="Brk " dh->info.dataFormat[1] == 0x72 && dh->info.dataFormat[2] == 0x6b && - dh->info.dataFormat[3] == 0x20) - // Note: info.fFormatVersion is duplicated in the RBBIDataHeader, and is - // validated when checking that. + dh->info.dataFormat[3] == 0x20 && + isDataVersionAcceptable(dh->info.formatVersion)) ) { status = U_INVALID_FORMAT_ERROR; return; @@ -84,6 +66,11 @@ RBBIDataWrapper::RBBIDataWrapper(UDataMemory* udm, UErrorCode &status) { fUDataMem = udm; } +UBool RBBIDataWrapper::isDataVersionAcceptable(const UVersionInfo version) { + return RBBI_DATA_FORMAT_VERSION[0] == version[0]; +} + + //----------------------------------------------------------------------------- // // init(). Does most of the work of construction, shared between the @@ -96,10 +83,11 @@ void RBBIDataWrapper::init0() { fReverseTable = NULL; fSafeFwdTable = NULL; fSafeRevTable = NULL; - fRuleSource = NULL; + fRuleSource = NULL; fRuleStatusTable = NULL; - fUDataMem = NULL; - fRefCount = 0; + fTrie = NULL; + fUDataMem = NULL; + fRefCount = 0; fDontFreeData = TRUE; } @@ -108,8 +96,7 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { return; } fHeader = data; - if (fHeader->fMagic != 0xb1a0 || fHeader->fFormatVersion[0] != 3) - { + if (fHeader->fMagic != 0xb1a0 || !isDataVersionAcceptable(fHeader->fFormatVersion)) { status = U_INVALID_FORMAT_ERROR; return; } @@ -131,16 +118,23 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { fSafeRevTable = (RBBIStateTable *)((char *)data + fHeader->fSRTable); } + // Rule Compatibility Hacks + // If a rule set includes reverse rules but does not explicitly include safe reverse rules, + // the reverse rules are to be treated as safe reverse rules. + + if (fSafeRevTable == NULL && fReverseTable != NULL) { + fSafeRevTable = fReverseTable; + fReverseTable = NULL; + } - utrie_unserialize(&fTrie, - (uint8_t *)data + fHeader->fTrie, - fHeader->fTrieLen, - &status); + fTrie = utrie2_openFromSerialized(UTRIE2_16_VALUE_BITS, + (uint8_t *)data + fHeader->fTrie, + fHeader->fTrieLen, + NULL, // *actual length + &status); if (U_FAILURE(status)) { return; } - fTrie.getFoldingOffset=getFoldingOffset; - fRuleSource = (UChar *)((char *)data + fHeader->fRuleSource); fRuleString.setTo(TRUE, fRuleSource, -1); @@ -165,6 +159,8 @@ void RBBIDataWrapper::init(const RBBIDataHeader *data, UErrorCode &status) { //----------------------------------------------------------------------------- RBBIDataWrapper::~RBBIDataWrapper() { U_ASSERT(fRefCount == 0); + utrie2_close(fTrie); + fTrie = NULL; if (fUDataMem) { udata_close(fUDataMem); } else if (!fDontFreeData) { @@ -323,7 +319,7 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD pInfo->dataFormat[1]==0x72 && pInfo->dataFormat[2]==0x6b && pInfo->dataFormat[3]==0x20 && - pInfo->formatVersion[0]==3 )) { + RBBIDataWrapper::isDataVersionAcceptable(pInfo->formatVersion) )) { udata_printError(ds, "ubrk_swap(): data format %02x.%02x.%02x.%02x (format version %02x) is not recognized\n", pInfo->dataFormat[0], pInfo->dataFormat[1], pInfo->dataFormat[2], pInfo->dataFormat[3], @@ -344,17 +340,11 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD // // Get the RRBI Data Header, and check that it appears to be OK. // - // Note: ICU 3.2 and earlier, RBBIDataHeader::fDataFormat was actually - // an int32_t with a value of 1. Starting with ICU 3.4, - // RBBI's fDataFormat matches the dataFormat field from the - // UDataInfo header, four int8_t bytes. The value is {3,1,0,0} - // const uint8_t *inBytes =(const uint8_t *)inData+headerSize; RBBIDataHeader *rbbiDH = (RBBIDataHeader *)inBytes; if (ds->readUInt32(rbbiDH->fMagic) != 0xb1a0 || - rbbiDH->fFormatVersion[0] != 3 || - ds->readUInt32(rbbiDH->fLength) < sizeof(RBBIDataHeader)) - { + !RBBIDataWrapper::isDataVersionAcceptable(rbbiDH->fFormatVersion) || + ds->readUInt32(rbbiDH->fLength) < sizeof(RBBIDataHeader)) { udata_printError(ds, "ubrk_swap(): RBBI Data header is invalid.\n"); *status=U_UNSUPPORTED_ERROR; return 0; @@ -451,8 +441,8 @@ ubrk_swap(const UDataSwapper *ds, const void *inData, int32_t length, void *outD } // Trie table for character categories - utrie_swap(ds, inBytes+ds->readUInt32(rbbiDH->fTrie), ds->readUInt32(rbbiDH->fTrieLen), - outBytes+ds->readUInt32(rbbiDH->fTrie), status); + utrie2_swap(ds, inBytes+ds->readUInt32(rbbiDH->fTrie), ds->readUInt32(rbbiDH->fTrieLen), + outBytes+ds->readUInt32(rbbiDH->fTrie), status); // Source Rules Text. It's UChar data ds->swapArray16(ds, inBytes+ds->readUInt32(rbbiDH->fRuleSource), ds->readUInt32(rbbiDH->fRuleSourceLen), diff --git a/deps/icu-small/source/common/rbbidata.h b/deps/icu-small/source/common/rbbidata.h index d33ef7d45e5dc9..75427863d9fa2a 100644 --- a/deps/icu-small/source/common/rbbidata.h +++ b/deps/icu-small/source/common/rbbidata.h @@ -51,22 +51,23 @@ ubrk_swap(const UDataSwapper *ds, #include "unicode/uobject.h" #include "unicode/unistr.h" +#include "unicode/uversion.h" #include "umutex.h" -#include "utrie.h" +#include "utrie2.h" U_NAMESPACE_BEGIN +// The current RBBI data format version. +static const uint8_t RBBI_DATA_FORMAT_VERSION[] = {4, 0, 0, 0}; + /* * The following structs map exactly onto the raw data from ICU common data file. */ struct RBBIDataHeader { uint32_t fMagic; /* == 0xbla0 */ - uint8_t fFormatVersion[4]; /* Data Format. Same as the value in struct UDataInfo */ + UVersionInfo fFormatVersion; /* Data Format. Same as the value in struct UDataInfo */ /* if there is one associated with this data. */ /* (version originates in rbbi, is copied to UDataInfo) */ - /* For ICU 3.2 and earlier, this field was */ - /* uint32_t fVersion */ - /* with a value of 1. */ uint32_t fLength; /* Total length in bytes of this RBBI Data, */ /* including all sections, not just the header. */ uint32_t fCatCount; /* Number of character categories. */ @@ -152,6 +153,8 @@ class RBBIDataWrapper : public UMemory { RBBIDataWrapper(UDataMemory* udm, UErrorCode &status); ~RBBIDataWrapper(); + static UBool isDataVersionAcceptable(const UVersionInfo version); + void init0(); void init(const RBBIDataHeader *data, UErrorCode &status); RBBIDataWrapper *addReference(); @@ -181,11 +184,11 @@ class RBBIDataWrapper : public UMemory { /* number of int32_t values in the rule status table. Used to sanity check indexing */ int32_t fStatusMaxIdx; - UTrie fTrie; + UTrie2 *fTrie; private: u_atomic_int32_t fRefCount; - UDataMemory *fUDataMem; + UDataMemory *fUDataMem; UnicodeString fRuleString; UBool fDontFreeData; diff --git a/deps/icu-small/source/common/rbbirb.cpp b/deps/icu-small/source/common/rbbirb.cpp index b94ae9605f737b..c67f6f8166c0a0 100644 --- a/deps/icu-small/source/common/rbbirb.cpp +++ b/deps/icu-small/source/common/rbbirb.cpp @@ -24,16 +24,16 @@ #include "unicode/uchriter.h" #include "unicode/parsepos.h" #include "unicode/parseerr.h" + #include "cmemory.h" #include "cstring.h" - #include "rbbirb.h" #include "rbbinode.h" - #include "rbbiscan.h" #include "rbbisetb.h" #include "rbbitblb.h" #include "rbbidata.h" +#include "uassert.h" U_NAMESPACE_BEGIN @@ -164,8 +164,13 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { int32_t statusTableSize = align8(fRuleStatusVals->size() * sizeof(int32_t)); int32_t rulesSize = align8((strippedRules.length()+1) * sizeof(UChar)); - int32_t totalSize = headerSize + forwardTableSize + reverseTableSize - + safeFwdTableSize + safeRevTableSize + (void)safeFwdTableSize; + + int32_t totalSize = headerSize + + forwardTableSize + + /* reverseTableSize */ 0 + + /* safeFwdTableSize */ 0 + + (safeRevTableSize ? safeRevTableSize : reverseTableSize) + statusTableSize + trieSize + rulesSize; RBBIDataHeader *data = (RBBIDataHeader *)uprv_malloc(totalSize); @@ -177,23 +182,45 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { data->fMagic = 0xb1a0; - data->fFormatVersion[0] = 3; - data->fFormatVersion[1] = 1; - data->fFormatVersion[2] = 0; - data->fFormatVersion[3] = 0; + data->fFormatVersion[0] = RBBI_DATA_FORMAT_VERSION[0]; + data->fFormatVersion[1] = RBBI_DATA_FORMAT_VERSION[1]; + data->fFormatVersion[2] = RBBI_DATA_FORMAT_VERSION[2]; + data->fFormatVersion[3] = RBBI_DATA_FORMAT_VERSION[3]; data->fLength = totalSize; data->fCatCount = fSetBuilder->getNumCharCategories(); + // Only save the forward table and the safe reverse table, + // because these are the only ones used at run-time. + // + // For the moment, we still build the other tables if they are present in the rule source files, + // for backwards compatibility. Old rule files need to work, and this is the simplest approach. + // + // Additional backwards compatibility consideration: if no safe rules are provided, consider the + // reverse rules to actually be the safe reverse rules. + data->fFTable = headerSize; data->fFTableLen = forwardTableSize; + + // Do not save Reverse Table. data->fRTable = data->fFTable + forwardTableSize; - data->fRTableLen = reverseTableSize; - data->fSFTable = data->fRTable + reverseTableSize; - data->fSFTableLen = safeFwdTableSize; - data->fSRTable = data->fSFTable + safeFwdTableSize; - data->fSRTableLen = safeRevTableSize; + data->fRTableLen = 0; + + // Do not save the Safe Forward table. + data->fSFTable = data->fRTable + 0; + data->fSFTableLen = 0; + + data->fSRTable = data->fSFTable + 0; + if (safeRevTableSize > 0) { + data->fSRTableLen = safeRevTableSize; + } else if (reverseTableSize > 0) { + data->fSRTableLen = reverseTableSize; + } else { + U_ASSERT(FALSE); // Rule build should have failed for lack of a reverse table + // before reaching this point. + } - data->fTrie = data->fSRTable + safeRevTableSize; + + data->fTrie = data->fSRTable + data->fSRTableLen; data->fTrieLen = fSetBuilder->getTrieSize(); data->fStatusTable = data->fTrie + trieSize; data->fStatusTableLen= statusTableSize; @@ -203,9 +230,14 @@ RBBIDataHeader *RBBIRuleBuilder::flattenData() { uprv_memset(data->fReserved, 0, sizeof(data->fReserved)); fForwardTables->exportTable((uint8_t *)data + data->fFTable); - fReverseTables->exportTable((uint8_t *)data + data->fRTable); - fSafeFwdTables->exportTable((uint8_t *)data + data->fSFTable); - fSafeRevTables->exportTable((uint8_t *)data + data->fSRTable); + // fReverseTables->exportTable((uint8_t *)data + data->fRTable); + // fSafeFwdTables->exportTable((uint8_t *)data + data->fSFTable); + if (safeRevTableSize > 0) { + fSafeRevTables->exportTable((uint8_t *)data + data->fSRTable); + } else { + fReverseTables->exportTable((uint8_t *)data + data->fSRTable); + } + fSetBuilder->serializeTrie ((uint8_t *)data + data->fTrie); int32_t *ruleStatusTable = (int32_t *)((uint8_t *)data + data->fStatusTable); diff --git a/deps/icu-small/source/common/rbbirb.h b/deps/icu-small/source/common/rbbirb.h index 3cde8da3cc47a5..6fbdbff7449a9f 100644 --- a/deps/icu-small/source/common/rbbirb.h +++ b/deps/icu-small/source/common/rbbirb.h @@ -15,6 +15,9 @@ #define RBBIRB_H #include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + #include "unicode/uobject.h" #include "unicode/rbbi.h" #include "unicode/uniset.h" @@ -207,4 +210,7 @@ struct RBBISetTableEl { #endif U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ + #endif diff --git a/deps/icu-small/source/common/rbbiscan.cpp b/deps/icu-small/source/common/rbbiscan.cpp index 6688c965c3f721..1653a0c7bc7fe2 100644 --- a/deps/icu-small/source/common/rbbiscan.cpp +++ b/deps/icu-small/source/common/rbbiscan.cpp @@ -47,6 +47,7 @@ // //------------------------------------------------------------------------------ static const UChar gRuleSet_rule_char_pattern[] = { + // Characters that may appear as literals in patterns without escaping or quoting. // [ ^ [ \ p { Z } \ u 0 0 2 0 0x5b, 0x5e, 0x5b, 0x5c, 0x70, 0x7b, 0x5a, 0x7d, 0x5c, 0x75, 0x30, 0x30, 0x32, 0x30, // - \ u 0 0 7 f ] - [ \ p @@ -558,6 +559,10 @@ UBool RBBIRuleScanner::doParseActions(int32_t action) fRB->fDefaultTree = &fRB->fSafeRevTree; } else if (opt == UNICODE_STRING("lookAheadHardBreak", 18)) { fRB->fLookAheadHardBreak = TRUE; + } else if (opt == UNICODE_STRING("quoted_literals_only", 20)) { + fRuleSets[kRuleSet_rule_char-128].clear(); + } else if (opt == UNICODE_STRING("unquoted_literals", 17)) { + fRuleSets[kRuleSet_rule_char-128].applyPattern(UnicodeString(gRuleSet_rule_char_pattern), *fRB->fStatus); } else { error(U_BRK_UNRECOGNIZED_OPTION); } diff --git a/deps/icu-small/source/common/rbbisetb.cpp b/deps/icu-small/source/common/rbbisetb.cpp index d17916c9e9e1ba..c172da00df7964 100644 --- a/deps/icu-small/source/common/rbbisetb.cpp +++ b/deps/icu-small/source/common/rbbisetb.cpp @@ -35,7 +35,7 @@ #if !UCONFIG_NO_BREAK_ITERATION #include "unicode/uniset.h" -#include "utrie.h" +#include "utrie2.h" #include "uvector.h" #include "uassert.h" #include "cmemory.h" @@ -44,43 +44,6 @@ #include "rbbisetb.h" #include "rbbinode.h" - -//------------------------------------------------------------------------ -// -// getFoldedRBBIValue Call-back function used during building of Trie table. -// Folding value: just store the offset (16 bits) -// if there is any non-0 entry. -// (It'd really be nice if the Trie builder would provide a -// simple default, so this function could go away from here.) -// -//------------------------------------------------------------------------ -/* folding value: just store the offset (16 bits) if there is any non-0 entry */ -U_CDECL_BEGIN -static uint32_t U_CALLCONV -getFoldedRBBIValue(UNewTrie *trie, UChar32 start, int32_t offset) { - uint32_t value; - UChar32 limit; - UBool inBlockZero; - - limit=start+0x400; - while(startfNext) { - utrie_setRange32(fTrie, rlRange->fStartChar, rlRange->fEndChar+1, rlRange->fNum, TRUE); + fTrie = utrie2_open(0, // Initial value for all code points. + 0, // Error value for out-of-range input. + fStatus); + + for (rlRange = fRangeList; rlRange!=0 && U_SUCCESS(*fStatus); rlRange=rlRange->fNext) { + utrie2_setRange32(fTrie, + rlRange->fStartChar, // Range start + rlRange->fEndChar, // Range end (inclusive) + rlRange->fNum, // value for range + TRUE, // Overwrite previously written values + fStatus); } } - //----------------------------------------------------------------------------------- // // getTrieSize() Return the size that will be required to serialize the Trie. // //----------------------------------------------------------------------------------- -int32_t RBBISetBuilder::getTrieSize() /*const*/ { - fTrieSize = utrie_serialize(fTrie, - NULL, // Buffer - 0, // Capacity - getFoldedRBBIValue, - TRUE, // Reduce to 16 bits - fStatus); +int32_t RBBISetBuilder::getTrieSize() { + if (U_FAILURE(*fStatus)) { + return 0; + } + utrie2_freeze(fTrie, UTRIE2_16_VALUE_BITS, fStatus); + fTrieSize = utrie2_serialize(fTrie, + NULL, // Buffer + 0, // Capacity + fStatus); + if (*fStatus == U_BUFFER_OVERFLOW_ERROR) { + *fStatus = U_ZERO_ERROR; + } // RBBIDebugPrintf("Trie table size is %d\n", trieSize); return fTrieSize; } @@ -327,12 +295,10 @@ int32_t RBBISetBuilder::getTrieSize() /*const*/ { // //----------------------------------------------------------------------------------- void RBBISetBuilder::serializeTrie(uint8_t *where) { - utrie_serialize(fTrie, - where, // Buffer - fTrieSize, // Capacity - getFoldedRBBIValue, - TRUE, // Reduce to 16 bits - fStatus); + utrie2_serialize(fTrie, + where, // Buffer + fTrieSize, // Capacity + fStatus); } //------------------------------------------------------------------------ diff --git a/deps/icu-small/source/common/rbbisetb.h b/deps/icu-small/source/common/rbbisetb.h index a7d1e7af3bcfb2..7cedb45b33550f 100644 --- a/deps/icu-small/source/common/rbbisetb.h +++ b/deps/icu-small/source/common/rbbisetb.h @@ -13,12 +13,14 @@ #define RBBISETB_H #include "unicode/utypes.h" + +#if !UCONFIG_NO_BREAK_ITERATION + #include "unicode/uobject.h" #include "rbbirb.h" +#include "utrie2.h" #include "uvector.h" -struct UNewTrie; - U_NAMESPACE_BEGIN // @@ -109,8 +111,8 @@ class RBBISetBuilder : public UMemory { RangeDescriptor *fRangeList; // Head of the linked list of RangeDescriptors - UNewTrie *fTrie; // The mapping TRIE that is the end result of processing - uint32_t fTrieSize; // the Unicode Sets. + UTrie2 *fTrie; // The mapping TRIE that is the end result of processing + uint32_t fTrieSize; // the Unicode Sets. // Groups correspond to character categories - // groups of ranges that are in the same original UnicodeSets. @@ -129,4 +131,7 @@ class RBBISetBuilder : public UMemory { U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_BREAK_ITERATION */ + #endif diff --git a/deps/icu-small/source/common/ubidi_props_data.h b/deps/icu-small/source/common/ubidi_props_data.h index 8d6856d371c4c7..98f21510e7d42c 100644 --- a/deps/icu-small/source/common/ubidi_props_data.h +++ b/deps/icu-small/source/common/ubidi_props_data.h @@ -11,37 +11,37 @@ #ifdef INCLUDED_FROM_UBIDI_PROPS_C -static const UVersionInfo ubidi_props_dataVersion={9,0,0,0}; +static const UVersionInfo ubidi_props_dataVersion={0xa,0,0,0}; -static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x6060,0x5ce8,0x1a,0x620,0x8c0,0x10ac0,0x10af0,0,0,0,0,0,0,0,0x5802b6}; +static const int32_t ubidi_props_indexes[UBIDI_IX_TOP]={0x10,0x6028,0x5cb0,0x1a,0x620,0x8c0,0x10ac0,0x10af0,0,0,0,0,0,0,0,0x6302b6}; -static const uint16_t ubidi_props_trieIndex[11884]={ +static const uint16_t ubidi_props_trieIndex[11856]={ 0x36a,0x372,0x37a,0x382,0x39a,0x3a2,0x3aa,0x3b2,0x38a,0x392,0x38a,0x392,0x38a,0x392,0x38a,0x392, 0x38a,0x392,0x38a,0x392,0x3b8,0x3c0,0x3c8,0x3d0,0x3d8,0x3e0,0x3dc,0x3e4,0x3ec,0x3f4,0x3ef,0x3f7, 0x38a,0x392,0x38a,0x392,0x3ff,0x407,0x38a,0x392,0x38a,0x392,0x38a,0x392,0x40d,0x415,0x41d,0x425, 0x42d,0x435,0x43d,0x445,0x44b,0x453,0x45b,0x463,0x46b,0x473,0x479,0x481,0x489,0x491,0x499,0x4a1, 0x4ad,0x4a9,0x4b5,0x4bd,0x41f,0x4cd,0x4d5,0x4c5,0x4dd,0x4df,0x4e7,0x4ef,0x4f7,0x4f8,0x500,0x508, 0x510,0x4f8,0x518,0x51d,0x510,0x4f8,0x525,0x52d,0x4f7,0x535,0x53d,0x4ef,0x542,0x38a,0x54a,0x54e, -0x556,0x557,0x55f,0x567,0x4f7,0x56f,0x577,0x4ef,0x57f,0x581,0x500,0x4ef,0x38a,0x38a,0x589,0x38a, -0x38a,0x58f,0x597,0x38a,0x38a,0x59b,0x5a3,0x38a,0x5a7,0x5ae,0x38a,0x5b6,0x5be,0x5c5,0x541,0x38a, -0x38a,0x5cd,0x5d5,0x5dd,0x5e5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x5ed,0x38a,0x5f5,0x38a,0x38a,0x38a, -0x5fd,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x605,0x38a,0x38a,0x38a,0x60d,0x60d,0x504,0x504,0x38a,0x613,0x61b,0x5f5, -0x631,0x623,0x623,0x639,0x640,0x629,0x38a,0x38a,0x38a,0x648,0x650,0x38a,0x38a,0x38a,0x652,0x65a, -0x662,0x38a,0x669,0x671,0x38a,0x679,0x38a,0x38a,0x681,0x684,0x542,0x68c,0x401,0x694,0x38a,0x69b, -0x38a,0x6a0,0x38a,0x38a,0x38a,0x38a,0x6a6,0x6ae,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0x6b6, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x6be,0x6c6,0x6ca, -0x6e2,0x6e8,0x6d2,0x6da,0x6f0,0x6f8,0x6fc,0x5c8,0x704,0x70c,0x714,0x38a,0x71c,0x65a,0x65a,0x65a, -0x72c,0x734,0x73c,0x744,0x749,0x751,0x759,0x724,0x761,0x769,0x38a,0x76f,0x776,0x65a,0x65a,0x65a, -0x65a,0x56d,0x77c,0x65a,0x784,0x38a,0x38a,0x657,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, -0x65a,0x65a,0x65a,0x65a,0x65a,0x78c,0x65a,0x65a,0x65a,0x65a,0x65a,0x792,0x65a,0x65a,0x79a,0x7a2, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a,0x65a,0x65a,0x65a,0x7b2,0x7b9,0x7c1,0x7aa, -0x7d1,0x7d9,0x7e1,0x7e8,0x7f0,0x7f8,0x7ff,0x7c9,0x65a,0x65a,0x65a,0x807,0x80d,0x813,0x81b,0x820, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x827,0x38a,0x38a,0x38a,0x82f,0x38a,0x38a,0x38a,0x3d8, -0x837,0x83f,0x76c,0x38a,0x842,0x65a,0x65a,0x65d,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x849,0x84f, -0x85f,0x857,0x38a,0x38a,0x867,0x5fd,0x38a,0x3b1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a,0x82e, -0x3bf,0x38a,0x86f,0x877,0x38a,0x87f,0x820,0x38a,0x38a,0x38a,0x38a,0x887,0x38a,0x38a,0x652,0x3b0, +0x556,0x557,0x55f,0x567,0x4f7,0x56f,0x577,0x4ef,0x401,0x57b,0x500,0x4ef,0x38a,0x38a,0x583,0x38a, +0x38a,0x589,0x591,0x38a,0x38a,0x595,0x59d,0x38a,0x5a1,0x5a8,0x38a,0x5b0,0x5b8,0x5bf,0x541,0x38a, +0x38a,0x5c7,0x5cf,0x5d7,0x5df,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x5e7,0x38a,0x5ef,0x38a,0x38a,0x38a, +0x5f7,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x5ff,0x38a,0x38a,0x38a,0x607,0x607,0x504,0x504,0x38a,0x60d,0x615,0x5ef, +0x62b,0x61d,0x61d,0x633,0x63a,0x623,0x38a,0x38a,0x38a,0x642,0x64a,0x38a,0x38a,0x38a,0x64c,0x654, +0x65c,0x38a,0x663,0x66b,0x38a,0x673,0x38a,0x38a,0x534,0x67b,0x542,0x683,0x401,0x68b,0x38a,0x692, +0x38a,0x697,0x38a,0x38a,0x38a,0x38a,0x69d,0x6a5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0x6ad, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x6b5,0x6bd,0x6c1, +0x6d9,0x6df,0x6c9,0x6d1,0x6e7,0x6ef,0x6f3,0x5c2,0x6fb,0x703,0x70b,0x38a,0x713,0x654,0x654,0x654, +0x723,0x72b,0x733,0x73b,0x740,0x748,0x750,0x71b,0x758,0x760,0x38a,0x766,0x76d,0x654,0x654,0x654, +0x654,0x56d,0x773,0x654,0x77b,0x38a,0x38a,0x651,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x783,0x654,0x654,0x654,0x654,0x654,0x789,0x654,0x654,0x791,0x799, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x654,0x654,0x654,0x654,0x7a9,0x7b0,0x7b8,0x7a1, +0x7c8,0x7d0,0x7d8,0x7df,0x7e7,0x7ef,0x7f6,0x7c0,0x654,0x654,0x654,0x7fe,0x804,0x80a,0x812,0x817, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x81e,0x38a,0x38a,0x38a,0x826,0x38a,0x38a,0x38a,0x3d8, +0x82e,0x836,0x763,0x38a,0x839,0x654,0x654,0x657,0x654,0x654,0x654,0x654,0x654,0x654,0x840,0x846, +0x856,0x84e,0x38a,0x38a,0x85e,0x5f7,0x38a,0x3b1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x654,0x825, +0x3bf,0x38a,0x866,0x86e,0x38a,0x876,0x817,0x38a,0x38a,0x38a,0x38a,0x87e,0x38a,0x38a,0x64c,0x3b0, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -54,7 +54,7 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a,0x65a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x654,0x654, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -98,10 +98,10 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x86f,0x65a,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x88e,0x38a,0x38a,0x893,0x557,0x38a,0x38a,0x5a9,0x65a,0x651,0x38a,0x38a,0x89b,0x38a,0x38a,0x38a, -0x8a3,0x8aa,0x623,0x8b2,0x38a,0x38a,0x8b9,0x8c1,0x38a,0x8c8,0x8cf,0x38a,0x4dd,0x8d4,0x38a,0x4f6, -0x38a,0x8dc,0x8e4,0x4f8,0x38a,0x8e8,0x4f7,0x8f0,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8f7, +0x38a,0x38a,0x38a,0x38a,0x866,0x654,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x885,0x38a,0x38a,0x88a,0x557,0x38a,0x38a,0x5a3,0x654,0x64b,0x38a,0x38a,0x892,0x38a,0x38a,0x38a, +0x89a,0x8a1,0x61d,0x8a9,0x38a,0x38a,0x579,0x8b1,0x38a,0x8b8,0x8bf,0x38a,0x4dd,0x8c4,0x38a,0x4f6, +0x38a,0x8cc,0x8d4,0x4f8,0x38a,0x8d8,0x4f7,0x8e0,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8e7, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, @@ -141,9 +141,9 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x90b,0x8ff,0x903,0x489,0x489,0x489,0x489,0x489, -0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x913,0x489,0x489,0x489,0x489,0x91b,0x91f, -0x927,0x92f,0x933,0x93b,0x489,0x489,0x489,0x93f,0x947,0x37a,0x94f,0x957,0x38a,0x38a,0x38a,0x95f, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x8fb,0x8ef,0x8f3,0x489,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x903,0x489,0x489,0x489,0x489,0x90b,0x90f, +0x917,0x91f,0x923,0x92b,0x489,0x489,0x489,0x92f,0x937,0x37a,0x93f,0x947,0x38a,0x38a,0x38a,0x94f, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0xe28,0xe28,0xe68,0xea8,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xee0,0xf20,0xf60,0xf70,0xfb0,0xfbc, @@ -180,61 +180,61 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0, 0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0x1a0,0xd17, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x967,0x38a,0x65a,0x65a,0x96f,0x5fd,0x38a,0x4f0, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x977,0x38a,0x38a,0x38a,0x97e,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x957,0x38a,0x654,0x654,0x95f,0x5f7,0x38a,0x4f0, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x967,0x38a,0x38a,0x38a,0x96e,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x986,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x98e,0x992,0x41f,0x41f,0x41f,0x41f,0x9a2,0x99a,0x41f,0x9aa,0x41f,0x41f,0x9b2,0x9b8,0x41f,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x976,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x97e,0x982,0x41f,0x41f,0x41f,0x41f,0x992,0x98a,0x41f,0x99a,0x41f,0x41f,0x9a2,0x9a8,0x41f,0x41f, 0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x9c0,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x4f7,0x8bb,0x9c8,0x9cf,0x401,0x9d2,0x38a,0x38a,0x4dd,0x9da,0x38a,0x9e0,0x401,0x9e5,0x60f,0x38a, -0x38a,0x9ed,0x38a,0x38a,0x38a,0x38a,0x82f,0x9f5,0x401,0x4f8,0x556,0x9fc,0x38a,0x38a,0x38a,0x38a, -0x38a,0x8bb,0xa04,0x38a,0x38a,0xa08,0xa10,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa14,0xa1c,0x38a, -0x38a,0xa24,0x556,0xa2c,0x38a,0xa32,0x38a,0x38a,0x5ed,0xa3a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa42,0xa46,0xa4e,0x38a,0xa55,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa5c,0x38a,0x38a,0xa64,0xa6a, -0x38a,0x38a,0x38a,0xa70,0xa78,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa7c,0x38a,0xa82,0x38a, +0x41f,0x41f,0x41f,0x9b0,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x4f7,0x9b8,0x9bf,0x9c6,0x401,0x9c9,0x38a,0x38a,0x4dd,0x9d1,0x38a,0x9d7,0x401,0x9dc,0x609,0x38a, +0x38a,0x9e4,0x38a,0x38a,0x38a,0x38a,0x826,0x9ec,0x401,0x4f8,0x556,0x9f3,0x38a,0x38a,0x38a,0x38a, +0x38a,0x9b8,0x9fb,0x38a,0x38a,0x9ff,0xa07,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa0b,0xa13,0x38a, +0x38a,0xa1b,0x556,0xa23,0x38a,0xa29,0x38a,0x38a,0x5e7,0xa31,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa39,0xa3d,0xa45,0x38a,0xa4c,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa53,0x38a,0x38a,0xa61,0xa5b, +0x38a,0x38a,0x38a,0xa69,0xa71,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xa75,0x38a,0xa7b,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0xa88,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0xa81,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x511,0xa90,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x511,0xa89,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0xa97,0xa9f,0xaa5,0x38a,0x38a,0x65a,0x65a,0xaad,0x38a,0x38a,0x38a,0x38a,0x38a,0x65a, -0x65a,0xab5,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xabb,0x38a,0xac2, -0x38a,0xabe,0x38a,0xac5,0x38a,0xacd,0xad1,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0xad9,0x3d8,0xae0,0xae7,0xaef,0x38a,0x38a,0x38a, +0x38a,0x38a,0xa90,0xa98,0xa9e,0x38a,0x38a,0x654,0x654,0xaa6,0x38a,0x38a,0x38a,0x38a,0x38a,0x654, +0x654,0xaae,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xab4,0x38a,0xabb, +0x38a,0xab7,0x38a,0xabe,0x38a,0xac6,0xaca,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x3d8,0xad2,0x3d8,0xad9,0xae0,0xae8,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xaf7,0xaff,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xaf0,0xaf8,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0xb07,0x41f,0xb0f, -0xb0f,0xb16,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0xb00,0x41f,0xb08, +0xb08,0xb0f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, 0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f, -0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0xb1e,0x41f, -0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x65a,0xb26,0x65a,0x65a,0x65d,0xb2b,0xb2f,0x849,0xb37, -0x38a,0x38a,0xb3d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x76d,0x38a,0x38a,0x38a,0x38a,0x65a, -0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, -0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0xb45,0xb4d,0x65a, -0x65a,0x65a,0x65d,0x65a,0x65a,0xb45,0x38a,0xb26,0x65a,0xb55,0x65a,0xb5d,0x84b,0x38a,0x38a,0xb26, -0xb61,0xb69,0x65f,0x65c,0x38a,0xb71,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0xb17,0x41f, +0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x41f,0x654,0xb1f,0x654,0x654,0x657,0xb24,0xb28,0x840,0xb30, +0x38a,0x38a,0xb36,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x764,0x38a,0x38a,0x38a,0x38a,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0xb3e,0xb46,0x654, +0x654,0x654,0x657,0x654,0x654,0xb3e,0x38a,0xb1f,0x654,0xb4e,0x654,0xb56,0x842,0x38a,0x38a,0xb1f, +0xb5a,0xb62,0x659,0x656,0x38a,0xb6a,0x56d,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb79,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb72,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, 0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0x38a, -0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb79,0xb89,0xb81,0xb81,0xb81,0xb8a,0xb8a,0xb8a,0xb8a,0x3d8, -0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0xb92,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, -0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, -0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, -0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a, -0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0xb8a,0x369,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0x38a,0x38a,0x38a,0x38a,0x38a,0x38a,0xb72,0xb82,0xb7a,0xb7a,0xb7a,0xb83,0xb83,0xb83,0xb83,0x3d8, +0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0xb8b,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83, +0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0xb83,0x369,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,8,7,8,9,7,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,7,7,7,8,9,0xa,0xa,4,4,4,0xa,0xa, 0x310a,0xf20a,0xa,3,6,3,6,6,2,2,2,2,2,2,2,2, @@ -319,7 +319,7 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1,1,0xb1, 0xb1,0xb1,0xb1,0xb1,0x81,0x41,0x41,0x41,0x41,0x41,0x81,0x81,0x41,0x81,0x41,0x41, 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x81,0x41,1,1,1,0xb1,0xb1,0xb1, -1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, +1,1,1,1,0x4d,0xd,0x4d,0x4d,0x4d,0x4d,0xd,0x8d,0x4d,0x8d,0x8d,0xd, 0xd,0xd,0xd,0xd,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0xb1,0xb1,5,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, @@ -348,8 +348,8 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0, 0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0,0,0,0,0,0,0,0,0x11,0x11, -0x11,0x11,0x11,0x11,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xb1,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, 0,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0, @@ -367,215 +367,211 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0xb1,0,0,0xa0,0,0,0,0, 0,0,0xa0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x11,0xb1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x11, -0x11,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,4,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1, -0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, -0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0, -0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,4,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, -0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0,0xb1,0,0xb1,0x310a,0xf20a,0x310a,0xf20a,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x310a, -0xf20a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0, -0,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0,0,0,0,0,0,4,0,0xb1,0,0,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xb1,0x40,0, +0,0,0,0,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x4a,0xa,0xa,0x2a,0xb1, -0xb1,0xb1,0x12,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0xa,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x310a,0xf20a,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,4, +0,0xb1,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0xb1,0x40,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0x4a,0xa,0xa,0x2a,0xb1,0xb1,0xb1,0x12,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0xb1,0xb1,0xb1,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0,0, -0,0,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0, -0xa,0,0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xb1,0xb1,0xb1,0,0,0,0,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0, +0,0xb1,0xb1,0xb1,0,0,0,0,0xa,0,0,0,0xa,0xa,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0,0,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0,0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0, +0,0,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0xb1,0, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0xb1,0,0,0, -0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x11,0x11, -0x11,0x11,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0,0,0,0, -0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xa,0xa,0,0xa,0xa,0xa,0xa,6,0x310a,0xf20a,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0x814,0x815, -0x813,0x816,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,2,0,0,0,2,2,2,2, -2,2,3,3,0xa,0x310a,0xf20a,0,9,9,9,9,9,9,9,9, -9,9,9,0xb2,0x412,0x432,0x8a0,0x8a1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae,0x8b0,0x8ac,0x8af,6, -4,4,4,4,4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, -2,2,2,2,2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xa,0xa,0,0xa,0xa,0xa,0xa,0,0xa,0xa,0,0,0,0,0,0, -0,0,0,0,0xa,0,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa, -0xa,0xa,0xa,0xa,0,0xa,0,0xa,0,0xa,0,0,0,0,4,0, -0,0,0,0,0,0,0,0,0,0,0xa,0xa,0,0,0,0, -0x100a,0xa,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0,0, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0, +0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0xb1,0,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, +0xb1,0xb1,0,0,0,0xb1,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, +0,0xb1,0,0,0,0,0,0,0xb1,0,0,0,0xb1,0xb1,0,0, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xa,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, +0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xa,0xa,0,0xa,0xa,0xa,0xa,6,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, -0x300a,0xf00a,0x900a,0x900a,0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a,0x900a,0x900a,0x900a,0x100a, -0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a,0xb00a,0xb00a,0xa,0xa, -0xa,0x100a,3,4,0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a, -0x100a,0x100a,0x100a,0xa,0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,0x300a,0xf00a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa, -0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a, -0x100a,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a,0x900a,0x900a,0x100a,0x900a, -0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0xa, -0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a, -0xf00a,0x900a,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, -0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, +0xa,0xa,0xa,9,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0x814,0x815,0x813,0x816,0xb2,0xb2, +0xb2,0xb2,0xb2,0xb2,2,0,0,0,2,2,2,2,2,2,3,3, +0xa,0x310a,0xf20a,0,9,9,9,9,9,9,9,9,9,9,9,0xb2, +0x412,0x432,0x8a0,0x8a1,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,9,7,0x8ab,0x8ae,0x8b0,0x8ac,0x8af,6,4,4,4,4, +4,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,2,2,2,2, +2,2,2,2,2,2,3,3,0xa,0x310a,0xf20a,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0xa, +0xa,0xa,0xa,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0, +0xa,0,0xa,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa, +0,0xa,0,0xa,0,0xa,0,0,0,0,4,0,0,0,0,0, +0,0,0,0,0,0,0xa,0xa,0,0,0,0,0x100a,0xa,0xa,0xa, +0xa,0,0,0,0,0,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, +0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x900a,0x900a, +0x900a,0x100a,0x900a,0x900a,0x100a,0x100a,0x900a,0x900a,0x900a,0x900a,0x900a,0x100a,0xa,0x100a,0x100a,0x100a, +0x100a,0xa,0xa,0xa,0x700a,0x700a,0x700a,0xb00a,0xb00a,0xb00a,0xa,0xa,0xa,0x100a,3,4, +0xa,0x900a,0x100a,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa, +0x100a,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x900a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0x100a,0xa, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a, +0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0x300a,0xf00a,0xa,0xa,0x900a,0x100a,0x900a,0x900a,0x100a,0x900a,0x100a,0x100a,0x100a,0x100a, +0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x900a,0xa,0xa, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, +0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa, -0x300a,0xf00a,0xa,0x500a,0x100a,0xd00a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa, -0xa,0xa,0xa,0xa,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,0x100a,0x100a,0xa,0xa, -0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a,0x100a,0x100a, -0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a, -0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x710a,0x320a,0xf10a,0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a, -0xf20a,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa, -0xa,0xa,0x100a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, -0x100a,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a,0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a, -0xa,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a, +0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x100a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0xa,0x300a,0xf00a,0xa,0x500a, +0x100a,0xd00a,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa, +0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x100a,0x100a,0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x900a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa, +0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a, +0xf20a,0x710a,0x320a,0xf10a,0xb20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x100a, 0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0xa,0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a, -0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, -0x300a,0xf00a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a, -0x100a,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a, -0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a, -0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a, -0x100a,0x300a,0xf00a,0x100a,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a, -0xf00a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, -0xf00a,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0xa,0x100a,0x300a, +0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a,0x100a,0xa,0xa,0xa, +0xa,0xa,0x100a,0x900a,0x900a,0x900a,0x100a,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa, +0xa,0xa,0xa,0x100a,0xa,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x100a,0xa,0x100a,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a, +0x100a,0x100a,0xa,0xa,0x100a,0xa,0x100a,0xa,0xa,0x100a,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa, +0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x100a,0x100a,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0x300a,0xf00a,0xa,0xa,0xa,0xa,0x100a,0x100a,0x100a,0x100a,0xa,0x100a,0x100a,0xa,0xa,0x100a, +0x100a,0xa,0xa,0xa,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a, +0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a, +0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x100a, +0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa,0x300a,0xf00a,0x100a,0x100a,0x300a, +0xf00a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0x300a,0xf00a,0xa, +0xa,0xa,0xa,0xa,0x100a,0xa,0x900a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xb1,0xb1,0xb1,0,0, -0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xa,0xa,0x300a,0xf00a, -0x300a,0xf00a,0xa,0xa,0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xa,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xa,0,0,0, -0,0,0xa,0xa,0,0,0,0,0,0xa,0xa,0xa,9,0xa,0xa,0xa, -0xa,0,0,0,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa, -0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0, +0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xa, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0,0,0, -0,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0, -0,0,0xb1,0,0,0,0,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,0,0,0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, -0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60,0,0xa,0xa,0xa,0xa, -0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, +0xa,0xa,0xa,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xa,0xa,0x300a,0xf00a,0x300a,0xf00a,0xa,0xa, +0xa,0x300a,0xf00a,0xa,0x300a,0xf00a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0x300a,0xf00a,0xa,0xa,0x300a,0xf00a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0,0,0,0,0xa,0,0,0,0,0,0,0, +0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xa,0,0,0,0,0,0xa,0xa, +0,0,0,0,0,0xa,0xa,0xa,9,0xa,0xa,0xa,0xa,0,0,0, +0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0x310a,0xf20a,0x310a,0xf20a, +0x310a,0xf20a,0x310a,0xf20a,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa, +0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xa,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xa,0xa,0,0,0,0,0,0,0,0, +0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xb1,0,0,0,0xb1,0, +0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0, +0,0,0,0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, +0x40,0x40,0x40,0x40,0x40,0x40,0x60,0,0xa,0xa,0xa,0xa,0,0,0,0, 0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0, @@ -642,123 +638,125 @@ static const uint16_t ubidi_props_trieIndex[11884]={ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0, -0,0xb1,0xb1,0,0,0xa0,0,0,0,0,0,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0xb1,0,0,0,0, -0,0,0xb1,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0xb1, -0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0, +0,0xa0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0,0xb1, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0,0,0xb1,0,0xb1,0xb1,0,0,0,0,0,0,0xb1,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, +0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11,0x11,0, -0,0x11,0x11,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11, -0x11,0,0,0x11,0x11,0x11,0x11,0,0,0,0,0,0,0,0,0x11, -0,0,0,0,0,0,0,0,0,0x11,0x11,0x11,0x11,0x11,0x11,0, -0,0x11,0x11,0x11,0,0,0,0,0,0,0,0,0,0,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0,0x11,0x11,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, +0xb1,0xb1,0,0,0,0,0,0,0xb1,0xb1,0,0xb1,0xb1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0, +0,0,0,0,0,0,0,0,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0,0xb1,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x11,0x11,0x11,0x11,0x11,0x11,0,0,0,0x11,0,0x11,0x11,0,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0,0x11,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1, +0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1, +0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xa0,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1, +0,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0xb1,0, +0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1, +0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, 0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xb2,0xb2,0xb2,0xb2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xb2,0xb2,0xb2,0xb2,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0xb2, -0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, -0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1, -0xb1,0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xb1,0xb1,0xb1,0xa,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0,0,0,0,0,0, +0,0,0,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0, +0,0,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xb1,0xb1,0xb1,0xa,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x100a,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0x100a,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x100a,0,0,0,0,0,0,0,0, -0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +0,0,0,0,0,0,0,0,0,0,0,0x100a,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x100a,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x100a,0,0,0,0, +0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0, -0,0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0, -0xb1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1, -0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,0x41,0x41,0x41,0x41, -0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, -0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd,0xd,0xd,0xd,0xd, -0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,2,2,2,2, -2,2,2,2,2,2,2,0xa,0xa,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa,0xa, +2,2,2,2,2,2,2,2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0, +0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0,0,0,0,0,0,0,0,0xb1,0,0,0,0,0,0, +0,0,0,0,0xb1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0,0xb1,0xb1,0,0xb1,0xb1,0xb1,0xb1,0xb1,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,0xd,0xd,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xd,0xd, +0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +2,2,2,2,2,2,2,2,2,2,2,0xa,0xa,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, 0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, -0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0,0,0,0,0, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xa,0xa,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, +0,0,0,0,0,0,0x12,0x12,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, 0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2, -0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, +0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0xb2,0x12,0xb2,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, -0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0,0,0,0 +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0x12,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0,0,0,0 }; static const uint32_t ubidi_props_mirrors[26]={ @@ -803,7 +801,7 @@ static const uint8_t ubidi_props_jgArray[672]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x5d,0x5a,0x60,0x63,0x5e,0x5f,0x59,0x61,0x5b,0x5c,0x62,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -828,13 +826,13 @@ static const UBiDiProps ubidi_props_singleton={ ubidi_props_trieIndex+3496, NULL, 3496, - 8388, + 8360, 0x1a0, 0xe28, 0x0, 0x0, 0x110000, - 0x2e68, + 0x2e4c, NULL, 0, FALSE, FALSE, 0, NULL }, { 2,2,0,0 } diff --git a/deps/icu-small/source/common/ucase.cpp b/deps/icu-small/source/common/ucase.cpp index 566014245f0fc2..1f41dbf6de3edb 100644 --- a/deps/icu-small/source/common/ucase.cpp +++ b/deps/icu-small/source/common/ucase.cpp @@ -961,6 +961,7 @@ ucase_toFullLower(UChar32 c, 0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE 0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE */ + *pString=nullptr; return 0; /* remove the dot (continue without output) */ } else if(loc==UCASE_LOC_TURKISH && c==0x49 && !isFollowedByDotAbove(iter, context)) { /* @@ -1059,6 +1060,7 @@ toUpperOrTitle(UChar32 c, 0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE */ + *pString=nullptr; return 0; /* remove the dot (continue without output) */ } else { /* no known conditional special case mapping, use a normal mapping */ diff --git a/deps/icu-small/source/common/ucase.h b/deps/icu-small/source/common/ucase.h index e15bae6604daef..9d6365eadfcca2 100644 --- a/deps/icu-small/source/common/ucase.h +++ b/deps/icu-small/source/common/ucase.h @@ -61,7 +61,7 @@ enum { /** * Bit mask for getting just the options from a string compare options word * that are relevant for case-insensitive string comparison. - * See uchar.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER. + * See stringoptions.h. Also include _STRNCMP_STYLE and U_COMPARE_CODE_POINT_ORDER. * @internal */ #define _STRCASECMP_OPTIONS_MASK 0xffff @@ -69,10 +69,16 @@ enum { /** * Bit mask for getting just the options from a string compare options word * that are relevant for case folding (of a single string or code point). - * See uchar.h. + * + * Currently only bit 0 for U_FOLD_CASE_EXCLUDE_SPECIAL_I. + * It is conceivable that at some point we might use one more bit for using uppercase sharp s. + * It is conceivable that at some point we might want the option to use only simple case foldings + * when operating on strings. + * + * See stringoptions.h. * @internal */ -#define _FOLD_CASE_OPTIONS_MASK 0xff +#define _FOLD_CASE_OPTIONS_MASK 7 /* single-code point functions */ diff --git a/deps/icu-small/source/common/ucase_props_data.h b/deps/icu-small/source/common/ucase_props_data.h index 3663592173cc66..fe620efc6e2cbc 100644 --- a/deps/icu-small/source/common/ucase_props_data.h +++ b/deps/icu-small/source/common/ucase_props_data.h @@ -11,36 +11,36 @@ #ifdef INCLUDED_FROM_UCASE_CPP -static const UVersionInfo ucase_props_dataVersion={9,0,0,0}; +static const UVersionInfo ucase_props_dataVersion={0xa,0,0,0}; -static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6c6c,0x5a10,0x79c,0x172,0,0,0,0,0,0,0,0,0,0,3}; +static const int32_t ucase_props_indexes[UCASE_IX_TOP]={0x10,0x6dfc,0x5ba0,0x79c,0x172,0,0,0,0,0,0,0,0,0,0,3}; -static const uint16_t ucase_props_trieIndex[11520]={ +static const uint16_t ucase_props_trieIndex[11720]={ 0x327,0x32f,0x337,0x33f,0x34d,0x355,0x35d,0x365,0x36d,0x375,0x37c,0x384,0x38c,0x394,0x39c,0x3a4, 0x3aa,0x3b2,0x3ba,0x3c2,0x3ca,0x3d2,0x3da,0x3e2,0x3ea,0x3f2,0x3fa,0x402,0x40a,0x412,0x41a,0x422, 0x42a,0x432,0x43a,0x442,0x44a,0x452,0x45a,0x462,0x45e,0x466,0x46b,0x473,0x47a,0x482,0x48a,0x492, 0x49a,0x4a2,0x4aa,0x4b2,0x346,0x34e,0x4b7,0x4bf,0x4c4,0x4cc,0x4d4,0x4dc,0x4db,0x4e3,0x4e8,0x4f0, 0x4f7,0x4fe,0x502,0x346,0x346,0x327,0x512,0x50a,0x51a,0x51c,0x524,0x52c,0x530,0x531,0x539,0x541, -0x549,0x531,0x551,0x556,0x549,0x531,0x55e,0x541,0x530,0x562,0x56a,0x541,0x56f,0x346,0x577,0x346, -0x4a1,0x4dd,0x57f,0x541,0x530,0x562,0x586,0x541,0x530,0x346,0x539,0x541,0x346,0x346,0x58c,0x346, -0x346,0x592,0x599,0x346,0x346,0x59d,0x5a5,0x346,0x5a9,0x5b0,0x346,0x5b7,0x5bf,0x5c6,0x5ce,0x346, -0x346,0x5d3,0x5db,0x5e3,0x5eb,0x5f3,0x5fb,0x490,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x5ff,0x346,0x346,0x60f,0x617,0x607, +0x549,0x531,0x551,0x556,0x549,0x531,0x55e,0x566,0x530,0x56e,0x576,0x541,0x57b,0x346,0x583,0x346, +0x4a1,0x4dd,0x58b,0x541,0x530,0x56e,0x592,0x541,0x59a,0x59c,0x539,0x541,0x346,0x346,0x5a4,0x346, +0x346,0x5aa,0x5b1,0x346,0x346,0x5b5,0x5bd,0x346,0x5c1,0x5c8,0x346,0x5cf,0x5d7,0x5de,0x5e6,0x346, +0x346,0x5eb,0x5f3,0x5fb,0x603,0x60b,0x613,0x490,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x617,0x346,0x346,0x627,0x62f,0x61f, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x61f,0x61f,0x53d,0x53d,0x346,0x625,0x62d,0x346, -0x635,0x346,0x63d,0x346,0x548,0x643,0x346,0x346,0x346,0x64b,0x346,0x346,0x346,0x346,0x346,0x346, -0x652,0x346,0x659,0x661,0x346,0x669,0x346,0x346,0x671,0x674,0x67c,0x682,0x68a,0x692,0x346,0x699, -0x346,0x69e,0x346,0x6a4,0x6ac,0x346,0x6b0,0x6b8,0x6c0,0x6c5,0x6c8,0x6d0,0x6e0,0x6d8,0x6f0,0x6e8, -0x36d,0x6f8,0x36d,0x700,0x703,0x36d,0x70b,0x36d,0x713,0x71b,0x723,0x72b,0x733,0x73b,0x743,0x74b, -0x753,0x75a,0x346,0x762,0x76a,0x346,0x772,0x77a,0x782,0x78a,0x792,0x79a,0x7a2,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x637,0x637,0x53d,0x53d,0x346,0x63d,0x645,0x346, +0x64d,0x346,0x655,0x346,0x548,0x65b,0x346,0x346,0x346,0x663,0x346,0x346,0x346,0x346,0x346,0x346, +0x66a,0x346,0x671,0x679,0x346,0x681,0x346,0x346,0x56d,0x689,0x691,0x697,0x59a,0x69f,0x346,0x6a6, +0x346,0x6ab,0x346,0x6b1,0x6b9,0x346,0x6bd,0x6c5,0x6cd,0x6d2,0x6d5,0x6dd,0x6ed,0x6e5,0x6fd,0x6f5, +0x36d,0x705,0x36d,0x70d,0x710,0x36d,0x718,0x36d,0x720,0x728,0x730,0x738,0x740,0x748,0x750,0x758, +0x760,0x767,0x346,0x76f,0x777,0x346,0x77f,0x787,0x78f,0x797,0x79f,0x7a7,0x7af,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x7a5,0x7ab,0x7b1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x7b2,0x7b8,0x7be,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x7b9,0x7be,0x7c2,0x7ca,0x36d,0x36d,0x36d,0x7d2,0x7da,0x7e2,0x346,0x7e7,0x346,0x346,0x346,0x7ef, -0x346,0x63a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x52f,0x7f7,0x346,0x346,0x7fe,0x346,0x346,0x806,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x7c6,0x7cb,0x7cf,0x7d7,0x36d,0x36d,0x36d,0x7df,0x7e7,0x7ef,0x346,0x7f4,0x346,0x346,0x346,0x7fc, +0x346,0x652,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x52f,0x804,0x346,0x346,0x80b,0x346,0x346,0x813,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, @@ -96,12 +96,12 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x80e,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x81b,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x6a4,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x814,0x346,0x81c,0x821,0x829,0x346,0x346,0x831,0x839,0x841,0x36d,0x846,0x84e,0x854,0x346,0x85a, -0x862,0x548,0x346,0x346,0x346,0x346,0x869,0x871,0x346,0x878,0x87f,0x346,0x51a,0x884,0x88c,0x548, -0x346,0x892,0x89a,0x89e,0x346,0x8a6,0x8ae,0x8b6,0x346,0x8bc,0x8c0,0x8c8,0x8d8,0x8d0,0x346,0x8e0, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x6b1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x821,0x346,0x829,0x82e,0x836,0x346,0x346,0x83e,0x846,0x84e,0x36d,0x853,0x85b,0x861,0x346,0x867, +0x86f,0x548,0x346,0x346,0x346,0x346,0x876,0x87e,0x346,0x885,0x88c,0x346,0x51a,0x891,0x899,0x548, +0x346,0x89f,0x8a7,0x8ab,0x346,0x8b3,0x8bb,0x8c3,0x346,0x8c9,0x8cd,0x8d5,0x8e5,0x8dd,0x346,0x8ed, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, @@ -141,15 +141,15 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x8e8,0x346,0x346,0x346,0x346,0x8f0,0x68a,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x8f5,0x346,0x346,0x346,0x346,0x8fd,0x59a,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x8f5,0x8fd,0x901,0x346,0x346,0x346,0x346,0x329,0x32f,0x909,0x911,0x918,0x4dd,0x346,0x346,0x920, +0x902,0x90a,0x90e,0x346,0x346,0x346,0x346,0x329,0x32f,0x916,0x91e,0x925,0x4dd,0x346,0x346,0x92d, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0xd1c,0xd1c,0xd34,0xd74,0xdb4,0xdf0,0xe30,0xe70,0xea8,0xee8,0xf28,0xf68,0xfa8,0xfe8,0x1028,0x1068, 0x10a8,0x10e8,0x1128,0x1168,0x1178,0x11ac,0x11e8,0x1228,0x1268,0x12a8,0xd18,0x12dc,0x1310,0x1350,0x136c,0x13a0, -0x9e1,0xa11,0xa51,0xa8c,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xab5,0x188,0x188, -0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xaf5,0x188,0x188,0xb2a,0xb69,0xba9,0xbe3,0xc1a,0x188, +0x9e1,0xa11,0xa51,0xa8c,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xab7,0x188,0x188, +0x188,0x188,0x188,0x188,0x188,0x188,0x188,0xaf7,0x188,0x188,0xb2c,0xb6b,0xbab,0xbe5,0xc1c,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, @@ -174,50 +174,50 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, 0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188,0x188, -0xc5a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x63e,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x928,0x346,0x346,0x346,0x92b,0x346,0x346,0x346, -0x346,0x933,0x939,0x93d,0x346,0x346,0x941,0x945,0x94b,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0xc5c,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x656,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x935,0x346,0x346,0x346,0x938,0x346,0x346,0x346, +0x346,0x940,0x946,0x94a,0x346,0x346,0x94e,0x952,0x958,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x953,0x957,0x346,0x346,0x346,0x346,0x346,0x95f,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x967,0x96b,0x973,0x977,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x960,0x964,0x346,0x346,0x346,0x346,0x346,0x96c,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x974,0x978,0x980,0x984,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x530,0x97c,0x983,0x985,0x68a,0x98d,0x346,0x346,0x995,0x99c,0x346,0x988,0x68a,0x9a2,0x9aa, -0x346,0x346,0x9af,0x346,0x346,0x346,0x346,0x329,0x9b7,0x68a,0x531,0x9bf,0x9c6,0x346,0x346,0x346, -0x346,0x346,0x97c,0x9ce,0x346,0x346,0x9d2,0x9da,0x346,0x346,0x346,0x346,0x346,0x346,0x9de,0x9e6, -0x346,0x346,0x9ee,0x4a1,0x346,0x346,0x9f6,0x346,0x346,0x9fc,0xa04,0x346,0x346,0x346,0x346,0x346, -0x346,0xa0c,0xa14,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa1c,0x346,0x346, -0x8f0,0xa24,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa2a,0x346,0xa30,0x671, +0x346,0x530,0x989,0x990,0x59b,0x59a,0x994,0x346,0x346,0x99c,0x9a3,0x346,0x9a9,0x59a,0x9ae,0x9b6, +0x346,0x346,0x9bb,0x346,0x346,0x346,0x346,0x329,0x9c3,0x59a,0x531,0x9cb,0x9d2,0x346,0x346,0x346, +0x346,0x346,0x989,0x9da,0x346,0x346,0x9de,0x9e6,0x346,0x346,0x346,0x346,0x346,0x346,0x9ea,0x9f2, +0x346,0x346,0x9fa,0x4a1,0x346,0x346,0xa02,0x346,0x346,0xa08,0xa10,0x346,0x346,0x346,0x346,0x346, +0x346,0xa18,0xa20,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa28,0xa2c,0xa34,0x346, +0xa3b,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa42,0x346,0x346, +0x8fd,0xa4a,0x346,0x346,0x346,0xa50,0xa58,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa5c,0x346, +0xa62,0x56d,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0xa68,0x346,0x346,0x59a,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0xa36,0x346,0x346,0x4a1,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa70,0x56d,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa3e,0x671,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa78,0xa80,0xa86,0x346,0x346,0x346,0x346,0xa8e,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa96,0xa9e,0xaa3,0xaa9, +0xab1,0xab9,0xac1,0xa9a,0xac9,0xad1,0xad9,0xae0,0xa9b,0xa96,0xa9e,0xa99,0xaa9,0xa9c,0xa97,0xae8, +0xa9a,0xaf0,0xaf8,0xb00,0xb07,0xaf3,0xafb,0xb03,0xb0a,0xaf6,0xb12,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x846,0xb1a,0x846,0xb21,0xb28, +0xb30,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0xa46,0xa4e,0xa54,0x346,0x346,0x346,0x346,0xa5c,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xa64,0xa6c,0xa71,0xa77,0xa7f,0xa87, -0xa8f,0xa68,0xa97,0xa9f,0xaa7,0xaae,0xa69,0xa64,0xa6c,0xa67,0xa77,0xa6a,0xa65,0xab6,0xa68,0xabe, -0xac6,0xace,0xad5,0xac1,0xac9,0xad1,0xad8,0xac4,0xae0,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x839,0xae8,0x839,0xaef,0xaf6,0xafe,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb38,0xb40,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb06,0xb0e,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb44,0x346,0xb4c,0xb54,0xb5b, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0xb12,0x346,0xb1a,0xb22,0xb29,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0xa92,0xb63,0xb63,0xb69,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x99e,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x530,0x846,0x846,0x846, +0x346,0x346,0x346,0x346,0x846,0x846,0x846,0x846,0x846,0x846,0x846,0xa6c,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0xa60,0xb31,0xb31,0xb37,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x997,0x346,0x346,0x346,0x346,0x346,0x346, 0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x530,0x839,0x839,0x839,0x346,0x346, -0x346,0x346,0x839,0x839,0x839,0x839,0x839,0x839,0x839,0xa3a,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346, -0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x326,0x326,0,0,0,0, +0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0x346,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,4,0,0,0,0,0,0,4,0,0,0,0,0, @@ -361,6 +361,9 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0,0,0,0,0,0,0,0,4,4,0,0,0,4,0,0, 0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,4, 4,0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0x64,0,0,4,0,4,4,4,4,0,0,0, 0,0,0,0,0,0x64,0,0,0,0,0,0,0,0,4,0, @@ -371,6 +374,9 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0,0,4,4,4,0,4,4,4,0x64,0,0,0,0,0,0, 0,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,4,0, 0,0,0,0,4,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x64,0x64,0,0,0, 0,0,0,0,0,0,0,0,0,0,0x64,0,0,0,0,0, 0,0,4,4,4,0,4,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,4,0,0,4,4,4,4, @@ -428,211 +434,208 @@ static const uint16_t ucase_props_trieIndex[11520]={ 4,0,0,0,0,0,0,4,4,0x44,0x44,0x44,0x44,0x44,0x44,0x44, 0x44,0,0,0x64,0,0,0,0,0,0,0,4,0,0,0,0, 0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44, -0x44,0x64,4,0,4,4,4,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x64,0,4,4,4,4,4,0,4,0,0,0, -0,0,4,0,0x60,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,4,4,4,4,0,0, -4,4,0x60,0x64,4,4,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x64,0,4,4,0,0, -0,4,0,4,4,4,0x60,0x60,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,4,0,0,4,0x64, +0x44,0x64,4,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x64,0,4,4,4,4,4,0, +4,0,0,0,0,0,4,0,0x60,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,4,0,0, -0x5cd9,0x5d39,0x5d99,0x5df9,0x5e59,0x5ef9,0x5f99,0x5ff9,0x6059,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0x64,0x64,0x64,0x64, -0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0x64,0,0, -0,0,0,0,0x44,0,0,0,0x44,0x44,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0,0,0,0,0,0,0,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, +4,4,0,0,4,4,0x60,0x64,4,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64,0, +4,4,0,0,0,4,0,4,4,4,0x60,0x60,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, +0,0,4,0x64,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,0,0,0x5cd9,0x5d39,0x5d99,0x5df9,0x5e59,0x5ef9,0x5f99,0x5ff9,0x6059,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x44,0x44,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44, +0x64,0x64,0x64,0x64,0x44,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0, +0,0x64,0,0,0,0,0,0,0x44,0,0,0,0x44,0x44,0,0, +0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0x25,5,5,5,5,5,5,5,5,1, +1,1,1,1,1,1,1,1,1,1,1,1,5,0x60b9,1,1, +1,0x60f9,1,1,5,5,5,5,0x25,5,5,5,0x25,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x25,5,5,5,5,5,5,5,5,1,1,1,1,1, -1,1,1,1,1,1,1,1,5,0x60b9,1,1,1,0x60f9,1,1, -5,5,5,5,0x25,5,5,5,0x25,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0x21,1,1,1,1,5,5,5,5,5, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x44,0x64,0x64,0x44,0x64, -0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44,0x44,0x64,0x64,0x64, -0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89, +5,5,5,5,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,0x21,1,1,1,1,5, +5,5,5,5,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0,0x44, +0x64,0x64,0x44,0x64,0x44,0x44,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x44, +0x44,0x64,0x64,0x64,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x613a,0x61b9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x613a,0x61b9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x6239,0x6339,0x6439,0x6539,0x6639,0x6739,1,1,0x679a,1, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x6239,0x6339,0x6439,0x6539,0x6639,0x6739,1,1,0x679a,1,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xffa9,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0,0x6839,0x409,0x6939,0x409, -0x6a99,0x409,0x6bf9,0x409,0,0xfc0a,0,0xfc0a,0,0xfc0a,0,0xfc0a,0x409,0x409,0x409,0x409, -0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0x2509,0x2509,0x2b09,0x2b09, -0x2b09,0x2b09,0x3209,0x3209,0x4009,0x4009,0x3809,0x3809,0x3f09,0x3f09,0,0,0x6d59,0x6e39,0x6f19,0x6ff9, -0x70d9,0x71b9,0x7299,0x7379,0x745b,0x753b,0x761b,0x76fb,0x77db,0x78bb,0x799b,0x7a7b,0x7b59,0x7c39,0x7d19,0x7df9, -0x7ed9,0x7fb9,0x8099,0x8179,0x825b,0x833b,0x841b,0x84fb,0x85db,0x86bb,0x879b,0x887b,0x8959,0x8a39,0x8b19,0x8bf9, -0x8cd9,0x8db9,0x8e99,0x8f79,0x905b,0x913b,0x921b,0x92fb,0x93db,0x94bb,0x959b,0x967b,0x409,0x409,0x9759,0x9859, -0x9939,0,0x9a39,0x9b39,0xfc0a,0xfc0a,0xdb0a,0xdb0a,0x9c9b,4,0x9d79,4,4,4,0x9e19,0x9f19, -0x9ff9,0,0xa0f9,0xa1f9,0xd50a,0xd50a,0xd50a,0xd50a,0xa35b,4,4,4,0x409,0x409,0xa439,0xa599, -0,0,0xa739,0xa839,0xfc0a,0xfc0a,0xce0a,0xce0a,0,4,4,4,0x409,0x409,0xa999,0xaaf9, -0xac99,0x389,0xad99,0xae99,0xfc0a,0xfc0a,0xc80a,0xc80a,0xfc8a,4,4,4,0,0,0xaff9,0xb0f9, -0xb1d9,0,0xb2d9,0xb3d9,0xc00a,0xc00a,0xc10a,0xc10a,0xb53b,4,4,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,0,0,0,0, -0,0,0,0,4,4,0,0,0,0,0,0,4,0,0,4, -0,0,4,4,4,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,0,4,4, -4,4,4,4,4,4,4,4,0,0x25,0,0,0,0,0,0, -0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x44,0x64,0x64,0x44,0x44,0x44,0x44, -0x64,0x64,0x64,0x44,0x44,4,4,4,4,0x44,4,4,4,0x64,0x64,0x44, -0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,1,2,2,2,1,1,2,2,2,1,0,2,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0xb61a,0, -2,0,0xb69a,0xb71a,2,2,0,1,2,2,0xe0a,2,1,0,0,0, -0,1,0,0,1,1,2,2,0,0,0,0,0,2,1,1, -0x21,0x21,0,0,0,0,0xf209,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, -0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809, -0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0,0,0,0x8a,0xff89,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a, -0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xf309,0xf309,0xf309,0xf309, -0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0,0,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0,0, +0x6839,0x409,0x6939,0x409,0x6a99,0x409,0x6bf9,0x409,0,0xfc0a,0,0xfc0a,0,0xfc0a,0,0xfc0a, +0x409,0x409,0x409,0x409,0x409,0x409,0x409,0x409,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a,0xfc0a, +0x2509,0x2509,0x2b09,0x2b09,0x2b09,0x2b09,0x3209,0x3209,0x4009,0x4009,0x3809,0x3809,0x3f09,0x3f09,0,0, +0x6d59,0x6e39,0x6f19,0x6ff9,0x70d9,0x71b9,0x7299,0x7379,0x745b,0x753b,0x761b,0x76fb,0x77db,0x78bb,0x799b,0x7a7b, +0x7b59,0x7c39,0x7d19,0x7df9,0x7ed9,0x7fb9,0x8099,0x8179,0x825b,0x833b,0x841b,0x84fb,0x85db,0x86bb,0x879b,0x887b, +0x8959,0x8a39,0x8b19,0x8bf9,0x8cd9,0x8db9,0x8e99,0x8f79,0x905b,0x913b,0x921b,0x92fb,0x93db,0x94bb,0x959b,0x967b, +0x409,0x409,0x9759,0x9859,0x9939,0,0x9a39,0x9b39,0xfc0a,0xfc0a,0xdb0a,0xdb0a,0x9c9b,4,0x9d79,4, +4,4,0x9e19,0x9f19,0x9ff9,0,0xa0f9,0xa1f9,0xd50a,0xd50a,0xd50a,0xd50a,0xa35b,4,4,4, +0x409,0x409,0xa439,0xa599,0,0,0xa739,0xa839,0xfc0a,0xfc0a,0xce0a,0xce0a,0,4,4,4, +0x409,0x409,0xa999,0xaaf9,0xac99,0x389,0xad99,0xae99,0xfc0a,0xfc0a,0xc80a,0xc80a,0xfc8a,4,4,4, +0,0,0xaff9,0xb0f9,0xb1d9,0,0xb2d9,0xb3d9,0xc00a,0xc00a,0xc10a,0xc10a,0xb53b,4,4,0, +0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, +0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0, +4,0,0,4,0,0,4,4,4,4,4,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,0,4,4,4,4,4,4,4,4,4,4,0,0x25,0,0, +0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x64,0x64, +0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x44,0x44,4,4,4,4,0x44,4,4, +4,0x64,0x64,0x44,0x64,0x44,0x64,0x64,0x64,0x64,0x64,0x64,0x44,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,0,2,0,0,1,2,2,2,1,1,2,2,2,1, +0,2,0,0,0,2,2,2,2,2,0,0,0,0,0,0, +2,0,0xb61a,0,2,0,0xb69a,0xb71a,2,2,0,1,2,2,0xe0a,2, +1,0,0,0,0,1,0,0,1,1,2,2,0,0,0,0, +0,2,1,1,0x21,0x21,0,0,0,0,0xf209,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x80a,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0xf809,0xf809,0xf809,0xf809, +0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0xf809,0,0,0,0x8a, +0xff89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xd0a,0xd0a, +0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a,0xd0a, +0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309,0xf309, +0xf309,0xf309,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, 0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a, -0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, +0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0x180a,0,0xe809,0xe809,0xe809,0xe809, 0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809, -0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0,0x8a,0xff89,0xb79a,0xb7da,0xb81a,0xb859,0xb899,0x8a, -0xff89,0x8a,0xff89,0x8a,0xff89,0xb8da,0xb91a,0xb95a,0xb99a,1,0x8a,0xff89,1,0x8a,0xff89,1, -1,1,1,1,0x25,5,0xb9da,0xba1a,0x8a,0xff89,0x8a,0xff89,1,0,0,0, -0,0,0,0x8a,0xff89,0x8a,0xff89,0x44,0x44,0x44,0x8a,0xff89,0,0,0,0, -0,0,0,0,0,0,0,0,0xba59,0xba99,0xbad9,0xbb19,0xbb59,0xbb99,0xbbd9,0xbc19, -0xbc59,0xbc99,0xbcd9,0xbd19,0xbd59,0xbd99,0xbdd9,0xbe19,0xbe59,0xbe99,0xbed9,0xbf19,0xbf59,0xbf99,0xbfd9,0xc019, -0xc059,0xc099,0xc0d9,0xc119,0xc159,0xc199,0xc1d9,0xc219,0xc259,0xc299,0xc2d9,0xc319,0xc359,0xc399,0,0xc3d9, -0,0,0,0,0,0xc419,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0x64,0x44,0x44,0x44,0x44, +0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0xe809,0,0x8a,0xff89,0xb79a,0xb7da, +0xb81a,0xb859,0xb899,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xb8da,0xb91a,0xb95a,0xb99a,1,0x8a,0xff89, +1,0x8a,0xff89,1,1,1,1,1,0x25,5,0xb9da,0xba1a,0x8a,0xff89,0x8a,0xff89, +1,0,0,0,0,0,0,0x8a,0xff89,0x8a,0xff89,0x44,0x44,0x44,0x8a,0xff89, +0,0,0,0,0,0,0,0,0,0,0,0,0xba59,0xba99,0xbad9,0xbb19, +0xbb59,0xbb99,0xbbd9,0xbc19,0xbc59,0xbc99,0xbcd9,0xbd19,0xbd59,0xbd99,0xbdd9,0xbe19,0xbe59,0xbe99,0xbed9,0xbf19, +0xbf59,0xbf99,0xbfd9,0xc019,0xc059,0xc099,0xc0d9,0xc119,0xc159,0xc199,0xc1d9,0xc219,0xc259,0xc299,0xc2d9,0xc319, +0xc359,0xc399,0,0xc3d9,0,0,0,0,0,0xc419,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x64, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0, -0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x60,0x60,0,4,4,4, -4,4,0,0,0,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x60,0x60, +0,4,4,4,4,4,0,0,0,0,0,4,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x64,0x64,4,4,4,4,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x64,0x64,4,4,4,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc45a,0xc4d9,0x8a,0xff89,0x8a,0xff89, +0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc45a,0xc4d9, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0,0x44,4,4,4,0,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, 0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -5,5,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x44,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4, +0x8a,0xff89,0x8a,0xff89,5,5,0x44,0x44,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,5,1,1,1,1,1,1,1, -1,0x8a,0xff89,0x8a,0xff89,0xc55a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, -4,4,4,0x8a,0xff89,0xc59a,1,0,0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89, -0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc5da,0xc61a,0xc65a,0xc69a,0xc6da,0, -0xc71a,0xc75a,0xc79a,0xc7da,0x8a,0xff89,0x8a,0xff89,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,1,0,0,0,0,0,0,0,4,0,0,0,0x64,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,4,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,4,4,4,4,0x64,0x64,0x64,0,0, +4,4,4,4,4,4,4,4,4,4,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,1,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,5,1,1,1, +1,1,1,1,1,0x8a,0xff89,0x8a,0xff89,0xc55a,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89, +0x8a,0xff89,0x8a,0xff89,4,4,4,0x8a,0xff89,0xc59a,1,0,0x8a,0xff89,0x8a,0xff89, +1,1,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0x8a,0xff89,0xc5da,0xc61a, +0xc65a,0xc69a,0xc6da,0,0xc71a,0xc75a,0xc79a,0xc7da,0x8a,0xff89,0x8a,0xff89,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,1,0,0,0,0,0,0,0,4,0, +0,0,0x64,0,0,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x64,4,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,4,4,4,4,4,4,4,4,4,4,0,0x60, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x64,0,0,4,4,4,4,0,0,4,0,0,0, -0x60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,4,4,4,4,4,4,0,0,4,4,0,0,4,4,0, -0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0, -0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,0x64, +0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4, +4,4,0,0x60,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x64,0,0,4,4,4,4,0,0, +4,0,0,0,0x60,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,4,4,4,4,4,4,0,0,4,4,0, +0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,4, +0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, 0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x44,0,0x44,0x44, +0x64,0,0,0x44,0x44,0,0,0,0,0,0x44,0x44,0,0x44,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,4, +4,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0xc819,1,1,1,1,1,1,1,4, +5,5,5,5,1,1,1,1,1,1,0,0,0,0,0,0, +0,0,0,0,0xc859,0xc8b9,0xc919,0xc979,0xc9d9,0xca39,0xca99,0xcaf9,0xcb59,0xcbb9,0xcc19,0xcc79, +0xccd9,0xcd39,0xcd99,0xcdf9,0xda59,0xdab9,0xdb19,0xdb79,0xdbd9,0xdc39,0xdc99,0xdcf9,0xdd59,0xddb9,0xde19,0xde79, +0xded9,0xdf39,0xdf99,0xdff9,0xe059,0xe0b9,0xe119,0xe179,0xe1d9,0xe239,0xe299,0xe2f9,0xe359,0xe3b9,0xe419,0xe479, +0xe4d9,0xe539,0xe599,0xe5f9,0xce59,0xceb9,0xcf19,0xcf79,0xcfd9,0xd039,0xd099,0xd0f9,0xd159,0xd1b9,0xd219,0xd279, +0xd2d9,0xd339,0xd399,0xd3f9,0xd459,0xd4b9,0xd519,0xd579,0xd5d9,0xd639,0xd699,0xd6f9,0xd759,0xd7b9,0xd819,0xd879, +0xd8d9,0xd939,0xd999,0xd9f9,0,0,0,0,0,4,0,0,4,0,0,0, +0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xe659,0xe759,0xe859,0xe959,0xeab9,0xec19,0xed59,0,0,0,0,0, +0,0,0,0,0,0,0,0xee99,0xef99,0xf099,0xf199,0xf299,0,0,0,0, +0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,0,0,0,4,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x44,0x44,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,4,0,0,4,0,0, +0,0,0,0,0,0,0,0,0,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, +0x100a,0x100a,0x100a,0,0,0,4,0,4,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0xf009,0xf009,0xf009,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0,0x44,0x44,0x64,0,0,0x44, -0x44,0,0,0,0,0,0x44,0x44,0,0x44,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,0,0,0,0,0,4,4,0,0x64,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0xc819,1,1,1,1,1,1,1,4,5,5,5,5, -1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0xc859,0xc8b9,0xc919,0xc979,0xc9d9,0xca39,0xca99,0xcaf9,0xcb59,0xcbb9,0xcc19,0xcc79,0xccd9,0xcd39,0xcd99,0xcdf9, -0xda59,0xdab9,0xdb19,0xdb79,0xdbd9,0xdc39,0xdc99,0xdcf9,0xdd59,0xddb9,0xde19,0xde79,0xded9,0xdf39,0xdf99,0xdff9, -0xe059,0xe0b9,0xe119,0xe179,0xe1d9,0xe239,0xe299,0xe2f9,0xe359,0xe3b9,0xe419,0xe479,0xe4d9,0xe539,0xe599,0xe5f9, -0xce59,0xceb9,0xcf19,0xcf79,0xcfd9,0xd039,0xd099,0xd0f9,0xd159,0xd1b9,0xd219,0xd279,0xd2d9,0xd339,0xd399,0xd3f9, -0xd459,0xd4b9,0xd519,0xd579,0xd5d9,0xd639,0xd699,0xd6f9,0xd759,0xd7b9,0xd819,0xd879,0xd8d9,0xd939,0xd999,0xd9f9, -0,0,0,0,0,4,0,0,4,0,0,0,0,0x64,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0xe659,0xe759,0xe859,0xe959,0xeab9,0xec19,0xed59,0,0,0,0,0,0,0,0,0, -0,0,0,0xee99,0xef99,0xf099,0xf199,0xf299,0,0,0,0,0,0,0x64,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,0,0,0,4,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0x64,0x64,0x64, -0x64,0x64,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,0,0,4,0,0,0,0,0,0, -0,0,0,0,0,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, -0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0, -0,0,4,0,4,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, -0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,4,4,4,0,0,0,0, -0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4, +0,0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0x140a,0x140a,0x140a,0x140a, +0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, 0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, -0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0xec09,0xec09,0xec09,0xec09, 0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09, -0xec09,0xec09,0xec09,0xec09,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, -0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0,0,0,0,0xec09,0xec09,0xec09,0xec09, +0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0,0,0,0, 0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09, -0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0,0,0,0,0,4,4,4, -0,4,4,0,0,0,0,0,4,0x64,4,0x44,0,0,0,0, +0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0xec09,0,0,0,0, +0,4,4,4,0,4,4,0,0,0,0,0,4,0x64,4,0x44, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64, +0,0,0,0,0,0x44,0x64,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x44,0x64,0x64,0,0,0,0,0x64,0,0,0,0, -0,0x44,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x200a,0x200a,0x200a,0x200a, 0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a, -0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xe009,0xe009,0xe009,0xe009, +0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a,0x200a, +0x200a,0x200a,0x200a,0,0,0,0,0,0,0,0,0,0,0,0,0, 0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009, -0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, -4,4,0x64,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009,0xe009, +0xe009,0xe009,0xe009,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4, +4,4,4,4,4,4,0x64,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,0,0,0x64,0x64,0, -0,4,0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0, +0,0,0,4,4,4,4,0,0,0x64,0x64,0,0,4,0,0, +0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,0,4,4,4, -4,4,4,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,4,4,4,4,4,0,4,4,4,4,4,4,0x64, +0x64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, 4,4,4,4,4,4,4,0,0x60,0,0,0,0,0,0,0, 0,0,0x64,4,4,0,0,0,0,0,0,0,0,0,0,0, @@ -663,79 +666,89 @@ static const uint16_t ucase_props_trieIndex[11520]={ 0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a,0x100a, 0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, 0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009,0xf009, +0,4,4,4,4,4,4,0,0,4,4,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,0,4,4,4,4,4,4,0,0x64, -4,4,4,4,4,4,4,4,0,0,4,4,4,4,4,4, -4,0,4,4,0,4,4,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0,0,0, +0,0,0,4,0x64,4,4,4,4,0,0,4,4,4,4,0, +0,0,0,0,0,0,0,0x64,0,0,0,0,0,0,0,0, +0,4,4,4,4,4,4,0,0,4,4,4,0,0,0,0, +0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4, +4,4,4,0,4,0x64,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,0, +4,4,4,4,4,4,0,0x64,4,4,4,4,4,4,4,4, +0,0,4,4,4,4,4,4,4,0,4,4,0,4,4,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0, +0,4,4,4,4,4,4,0,0,0,4,0,4,4,0,4, +4,4,0x64,4,0x64,0x64,0,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x64,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,4,0x64,0,0,0,0,0,0,0x60,0x60,0x64, -0x64,0x64,0,0,0,0x60,0x60,0x60,0x60,0x60,0x60,4,4,4,4,4, -4,4,4,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0x44,0x44,0x44, -0x44,0x44,0x64,0x64,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,4,0x64,0, +0,0,0,0,0,0x60,0x60,0x64,0x64,0x64,0,0,0,0x60,0x60,0x60, +0x60,0x60,0x60,4,4,4,4,4,4,4,4,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0,0,0x44,0x44,0x44,0x44,0x44,0x64,0x64,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x44,0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x44,0x44,0x44,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1, -1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,1,1,1,1,1,1,1,0,0x21,0x21,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1, -1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,0,2,2,0,0,2,0, -0,2,2,0,0,2,2,2,2,0,2,2,2,2,2,2, -2,2,1,1,1,1,0,1,0,1,0x21,0x21,1,1,1,1, -0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -2,2,0,2,2,2,2,0,0,2,2,2,2,2,2,2, -2,0,2,2,2,2,2,2,2,0,1,1,1,1,1,1, -1,1,0x21,0x21,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,0,2,2,2,2,0,2,2,2,2, -2,0,2,0,0,0,2,2,2,2,2,2,2,0,1,1, -1,1,1,1,1,1,0x21,0x21,1,1,1,1,1,1,1,1, +1,0,0x21,0x21,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,1,1,1,1,1,1,1,1,0x21,0x21, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +2,0,2,2,0,0,2,0,0,2,2,0,0,2,2,2, +2,0,2,2,2,2,2,2,2,2,1,1,1,1,0,1, +0,1,0x21,0x21,1,1,1,1,0,1,1,1,1,1,1,1, 1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0, +2,2,2,2,1,1,1,1,2,2,0,2,2,2,2,0, +0,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2, +2,0,1,1,1,1,1,1,1,1,0x21,0x21,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,0,2, +2,2,2,0,2,2,2,2,2,0,2,0,0,0,2,2, +2,2,2,2,2,0,1,1,1,1,1,1,1,1,0x21,0x21, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0,1,1,1,1,1,1,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, +1,1,1,1,1,1,0,0,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,1,1,0,1,1,1,1,1,1,2,1,0,0,0,0, +2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1, +1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,1,1,1,0,1,1,1,1, +1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0, +0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4, +4,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, +0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4, +0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,0,0,0,0,4,4,4,4,4, -4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0, -0,4,0,0,0,0,0,0,0,0,0,0,4,0,0,0, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0,0x44,0x44,0x44,0x44,0x44, +0x44,0x44,0,0x44,0x44,0,0x44,0x44,0x44,0x44,0x44,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,4,4,4,4,0,4,4,4,4,4,4,4, -4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0, -0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, -0x44,0,0,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0,0x44,0x44,0,0x44,0x44, -0x44,0x44,0x44,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0, -0,0,0,0,0,0,0,0,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0,0,0,0,0,0,0,0,0, +0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, 0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, -0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, +0x110a,0x110a,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, 0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09, -0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0xef09,0x44,0x44,0x44,0x44,0x44,0x44,0x64,0, +0x44,0x44,0x44,0x44,0x44,0x44,0x64,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0, -0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0 }; static const uint16_t ucase_props_exceptions[1948]={ @@ -900,13 +913,13 @@ static const UCaseProps ucase_props_singleton={ ucase_props_trieIndex+3228, NULL, 3228, - 8292, + 8492, 0x188, 0xd18, 0x0, 0x0, 0xe0800, - 0x2cfc, + 0x2dc4, NULL, 0, FALSE, FALSE, 0, NULL }, { 3,0,0,0 } diff --git a/deps/icu-small/source/common/ucasemap.cpp b/deps/icu-small/source/common/ucasemap.cpp index 391140d6c5e2b9..8eec93c6e3ea3b 100644 --- a/deps/icu-small/source/common/ucasemap.cpp +++ b/deps/icu-small/source/common/ucasemap.cpp @@ -20,8 +20,11 @@ #include "unicode/utypes.h" #include "unicode/brkiter.h" +#include "unicode/bytestream.h" #include "unicode/casemap.h" #include "unicode/edits.h" +#include "unicode/stringoptions.h" +#include "unicode/stringpiece.h" #include "unicode/ubrk.h" #include "unicode/uloc.h" #include "unicode/ustring.h" @@ -32,6 +35,7 @@ #include "unicode/utf.h" #include "unicode/utf8.h" #include "unicode/utf16.h" +#include "bytesinkutil.h" #include "cmemory.h" #include "cstring.h" #include "uassert.h" @@ -39,27 +43,6 @@ #include "ucasemap_imp.h" #include "ustr_imp.h" -U_NAMESPACE_BEGIN - -namespace { - -// TODO: share with UTF-16? inline in ucasemap_imp.h? -int32_t checkOverflowAndEditsError(int32_t destIndex, int32_t destCapacity, - Edits *edits, UErrorCode &errorCode) { - if (U_SUCCESS(errorCode)) { - if (destIndex > destCapacity) { - errorCode = U_BUFFER_OVERFLOW_ERROR; - } else if (edits != NULL) { - edits->copyErrorTo(errorCode); - } - } - return destIndex; -} - -} // namespace - -U_NAMESPACE_END - U_NAMESPACE_USE /* UCaseMap service object -------------------------------------------------- */ @@ -150,148 +133,39 @@ ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode) { /* TODO(markus): Move to a new, separate utf8case.cpp file. */ +namespace { + /* append a full case mapping result, see UCASE_MAX_STRING_LENGTH */ -static inline int32_t -appendResult(uint8_t *dest, int32_t destIndex, int32_t destCapacity, - int32_t result, const UChar *s, - int32_t cpLength, uint32_t options, icu::Edits *edits) { - UChar32 c; - int32_t length; - UErrorCode errorCode; +inline UBool +appendResult(int32_t cpLength, int32_t result, const UChar *s, + ByteSink &sink, uint32_t options, icu::Edits *edits, UErrorCode &errorCode) { + U_ASSERT(U_SUCCESS(errorCode)); /* decode the result */ if(result<0) { /* (not) original code point */ if(edits!=NULL) { edits->addUnchanged(cpLength); - if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { - return destIndex; - } } - c=~result; - if(destIndex(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - if(edits!=NULL) { - edits->addReplace(cpLength, length); - } - // We might have an overflow, but we know the actual length. - return destIndex+length; - } else if(destIndexaddReplace(cpLength, 1); - } - return destIndex; + return ByteSinkUtil::appendChange(cpLength, s, result, sink, edits, errorCode); } else { - c=result; - length=U8_LENGTH(c); - if(edits!=NULL) { - edits->addReplace(cpLength, length); - } + ByteSinkUtil::appendCodePoint(cpLength, result, sink, edits); } } - // c>=0 single code point - if(length>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - - if(destIndex> 6) | 0xc0); } -static inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } - -static inline int32_t -appendTwoBytes(uint8_t *dest, int32_t destIndex, int32_t destCapacity, UChar32 c) { - U_ASSERT(0x370 <= c && c <= 0x3ff); // 2-byte UTF-8, main Greek block - if(2>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - int32_t limit=destIndex+2; - if(limit<=destCapacity) { - dest+=destIndex; - dest[0]=getTwoByteLead(c); - dest[1]=getTwoByteTrail(c); - } - return limit; -} +inline uint8_t getTwoByteLead(UChar32 c) { return (uint8_t)((c >> 6) | 0xc0); } +inline uint8_t getTwoByteTrail(UChar32 c) { return (uint8_t)((c & 0x3f) | 0x80); } -static inline int32_t -appendTwoBytes(uint8_t *dest, int32_t destIndex, int32_t destCapacity, const char *s) { - if(2>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - int32_t limit=destIndex+2; - if(limit<=destCapacity) { - dest+=destIndex; - dest[0]=(uint8_t)s[0]; - dest[1]=(uint8_t)s[1]; - } - return limit; -} - -static inline int32_t -appendUnchanged(uint8_t *dest, int32_t destIndex, int32_t destCapacity, - const uint8_t *s, int32_t length, uint32_t options, icu::Edits *edits) { - if(length>0) { - if(edits!=NULL) { - edits->addUnchanged(length); - if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { - return destIndex; - } - } - if(length>(INT32_MAX-destIndex)) { - return -1; // integer overflow - } - if((destIndex+length)<=destCapacity) { - uprv_memcpy(dest+destIndex, s, length); - } - destIndex+=length; - } - return destIndex; -} +} // namespace static UChar32 U_CALLCONV utf8_caseContextIterator(void *context, int8_t dir) { @@ -329,17 +203,15 @@ utf8_caseContextIterator(void *context, int8_t dir) { * Case-maps [srcStart..srcLimit[ but takes * context [0..srcLength[ into account. */ -static int32_t +static void _caseMap(int32_t caseLocale, uint32_t options, UCaseMapFull *map, - uint8_t *dest, int32_t destCapacity, const uint8_t *src, UCaseContext *csc, int32_t srcStart, int32_t srcLimit, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) { /* case mapping loop */ int32_t srcIndex=srcStart; - int32_t destIndex=0; - while(srcIndexcpStart=cpStart=srcIndex; UChar32 c; @@ -347,45 +219,32 @@ _caseMap(int32_t caseLocale, uint32_t options, UCaseMapFull *map, csc->cpLimit=srcIndex; if(c<0) { // Malformed UTF-8. - destIndex=appendUnchanged(dest, destIndex, destCapacity, - src+cpStart, srcIndex-cpStart, options, edits); - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } - continue; - } - const UChar *s; - c=map(c, utf8_caseContextIterator, csc, &s, caseLocale); - destIndex = appendResult(dest, destIndex, destCapacity, c, s, - srcIndex - cpStart, options, edits); - if (destIndex < 0) { - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + ByteSinkUtil::appendUnchanged(src+cpStart, srcIndex-cpStart, + sink, options, edits, errorCode); + } else { + const UChar *s; + c=map(c, utf8_caseContextIterator, csc, &s, caseLocale); + appendResult(srcIndex - cpStart, c, s, sink, options, edits, errorCode); } } - - return destIndex; } #if !UCONFIG_NO_BREAK_ITERATION -U_CFUNC int32_t U_CALLCONV +U_CFUNC void U_CALLCONV ucasemap_internalUTF8ToTitle( int32_t caseLocale, uint32_t options, BreakIterator *iter, - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) { - if(U_FAILURE(errorCode)) { - return 0; + if (!ustrcase_checkTitleAdjustmentOptions(options, errorCode)) { + return; } /* set up local variables */ UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - int32_t destIndex=0; int32_t prev=0; UBool isFirstIndex=TRUE; @@ -404,45 +263,36 @@ ucasemap_internalUTF8ToTitle( } /* - * Unicode 4 & 5 section 3.13 Default Case Operations: - * - * R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex - * #29, "Text Boundaries." Between each pair of word boundaries, find the first - * cased character F. If F exists, map F to default_title(F); then map each - * subsequent character C to default_lower(C). - * - * In this implementation, segment [prev..index[ into 3 parts: - * a) uncased characters (copy as-is) [prev..titleStart[ - * b) first case letter (titlecase) [titleStart..titleLimit[ + * Segment [prev..index[ into 3 parts: + * a) skipped characters (copy as-is) [prev..titleStart[ + * b) first letter (titlecase) [titleStart..titleLimit[ * c) subsequent characters (lowercase) [titleLimit..index[ */ if(prevaddReplace(1, 1); - } + ByteSinkUtil::appendCodePoint(1, 0x004A, sink, edits); titleLimit++; } else if (src[titleStart+1] == 0x004A) { // Keep the capital J from getting lowercased. - destIndex=appendUnchanged(dest, destIndex, destCapacity, - src+titleStart+1, 1, options, edits); - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (!ByteSinkUtil::appendUnchanged(src+titleStart+1, 1, + sink, options, edits, errorCode)) { + return; } titleLimit++; } @@ -495,26 +335,18 @@ ucasemap_internalUTF8ToTitle( if(titleLimit nextIndex || @@ -662,148 +492,146 @@ int32_t toUpper(uint32_t options, edits->addUnchanged(oldLength); } // Write unchanged text? - change = (options & UCASEMAP_OMIT_UNCHANGED_TEXT) == 0; + change = (options & U_OMIT_UNCHANGED_TEXT) == 0; } } if (change) { - destIndex=appendTwoBytes(dest, destIndex, destCapacity, upper); - if (destIndex >= 0 && (data & HAS_EITHER_DIALYTIKA) != 0) { - destIndex=appendTwoBytes(dest, destIndex, destCapacity, u8"\u0308"); // restore or add a dialytika + ByteSinkUtil::appendTwoBytes(upper, sink); + if ((data & HAS_EITHER_DIALYTIKA) != 0) { + sink.Append(u8"\u0308", 2); // restore or add a dialytika } - if (destIndex >= 0 && addTonos) { - destIndex=appendTwoBytes(dest, destIndex, destCapacity, u8"\u0301"); + if (addTonos) { + sink.Append(u8"\u0301", 2); } - while (destIndex >= 0 && numYpogegrammeni > 0) { - destIndex=appendTwoBytes(dest, destIndex, destCapacity, u8"\u0399"); + while (numYpogegrammeni > 0) { + sink.Append(u8"\u0399", 2); --numYpogegrammeni; } - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } } } else if(c>=0) { const UChar *s; c=ucase_toFullUpper(c, NULL, NULL, &s, UCASE_LOC_GREEK); - destIndex = appendResult(dest, destIndex, destCapacity, c, s, - nextIndex - i, options, edits); - if (destIndex < 0) { - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (!appendResult(nextIndex - i, c, s, sink, options, edits, errorCode)) { + return; } } else { // Malformed UTF-8. - destIndex=appendUnchanged(dest, destIndex, destCapacity, - src+i, nextIndex-i, options, edits); - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + if (!ByteSinkUtil::appendUnchanged(src+i, nextIndex-i, + sink, options, edits, errorCode)) { + return; } } i = nextIndex; state = nextState; } - - return destIndex; } } // namespace GreekUpper U_NAMESPACE_END -static int32_t U_CALLCONV +static void U_CALLCONV ucasemap_internalUTF8ToLower(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) { UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - int32_t destIndex = _caseMap( + _caseMap( caseLocale, options, ucase_toFullLower, - dest, destCapacity, src, &csc, 0, srcLength, - edits, errorCode); - return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); + sink, edits, errorCode); } -static int32_t U_CALLCONV +static void U_CALLCONV ucasemap_internalUTF8ToUpper(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) { - int32_t destIndex; if (caseLocale == UCASE_LOC_GREEK) { - destIndex = GreekUpper::toUpper(options, dest, destCapacity, - src, srcLength, edits, errorCode); + GreekUpper::toUpper(options, src, srcLength, sink, edits, errorCode); } else { UCaseContext csc=UCASECONTEXT_INITIALIZER; csc.p=(void *)src; csc.limit=srcLength; - destIndex = _caseMap( + _caseMap( caseLocale, options, ucase_toFullUpper, - dest, destCapacity, src, &csc, 0, srcLength, - edits, errorCode); + sink, edits, errorCode); } - return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); } -static int32_t U_CALLCONV +static void U_CALLCONV ucasemap_internalUTF8Fold(int32_t /* caseLocale */, uint32_t options, UCASEMAP_BREAK_ITERATOR_UNUSED - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode) { /* case mapping loop */ int32_t srcIndex = 0; - int32_t destIndex = 0; - while (srcIndex < srcLength) { + while (U_SUCCESS(errorCode) && srcIndex < srcLength) { int32_t cpStart = srcIndex; UChar32 c; U8_NEXT(src, srcIndex, srcLength, c); if(c<0) { // Malformed UTF-8. - destIndex=appendUnchanged(dest, destIndex, destCapacity, - src+cpStart, srcIndex-cpStart, options, edits); - if(destIndex<0) { - errorCode=U_INDEX_OUTOFBOUNDS_ERROR; - return 0; - } - continue; - } - const UChar *s; - c = ucase_toFullFolding(c, &s, options); - destIndex = appendResult(dest, destIndex, destCapacity, c, s, - srcIndex - cpStart, options, edits); - if (destIndex < 0) { - errorCode = U_INDEX_OUTOFBOUNDS_ERROR; - return 0; + ByteSinkUtil::appendUnchanged(src+cpStart, srcIndex-cpStart, + sink, options, edits, errorCode); + } else { + const UChar *s; + c = ucase_toFullFolding(c, &s, options); + appendResult(srcIndex - cpStart, c, s, sink, options, edits, errorCode); } } +} - return checkOverflowAndEditsError(destIndex, destCapacity, edits, errorCode); +void +ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + const char *src, int32_t srcLength, + UTF8CaseMapper *stringCaseMapper, + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode) { + /* check argument values */ + if (U_FAILURE(errorCode)) { + return; + } + if ((src == nullptr && srcLength != 0) || srcLength < -1) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + // Get the string length. + if (srcLength == -1) { + srcLength = (int32_t)uprv_strlen((const char *)src); + } + + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { + edits->reset(); + } + stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + (const uint8_t *)src, srcLength, sink, edits, errorCode); + sink.Flush(); + if (U_SUCCESS(errorCode)) { + if (edits != nullptr) { + edits->copyErrorTo(errorCode); + } + } } -U_CFUNC int32_t +int32_t ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, + char *dest, int32_t destCapacity, + const char *src, int32_t srcLength, UTF8CaseMapper *stringCaseMapper, icu::Edits *edits, UErrorCode &errorCode) { - int32_t destLength; - /* check argument values */ if(U_FAILURE(errorCode)) { return 0; } if( destCapacity<0 || (dest==NULL && destCapacity>0) || - src==NULL || - srcLength<-1 + (src==NULL && srcLength!=0) || srcLength<-1 ) { errorCode=U_ILLEGAL_ARGUMENT_ERROR; return 0; @@ -823,12 +651,21 @@ ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_P return 0; } - if(edits!=NULL) { + CheckedArrayByteSink sink(dest, destCapacity); + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { edits->reset(); } - destLength=stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR - dest, destCapacity, src, srcLength, edits, errorCode); - return u_terminateChars((char *)dest, destCapacity, destLength, &errorCode); + stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR + (const uint8_t *)src, srcLength, sink, edits, errorCode); + sink.Flush(); + if (U_SUCCESS(errorCode)) { + if (sink.Overflowed()) { + errorCode = U_BUFFER_OVERFLOW_ERROR; + } else if (edits != nullptr) { + edits->copyErrorTo(errorCode); + } + } + return u_terminateChars(dest, destCapacity, sink.NumberOfBytesAppended(), &errorCode); } /* public API functions */ @@ -840,8 +677,8 @@ ucasemap_utf8ToLower(const UCaseMap *csm, UErrorCode *pErrorCode) { return ucasemap_mapUTF8( csm->caseLocale, csm->options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToLower, NULL, *pErrorCode); } @@ -852,8 +689,8 @@ ucasemap_utf8ToUpper(const UCaseMap *csm, UErrorCode *pErrorCode) { return ucasemap_mapUTF8( csm->caseLocale, csm->options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToUpper, NULL, *pErrorCode); } @@ -864,13 +701,43 @@ ucasemap_utf8FoldCase(const UCaseMap *csm, UErrorCode *pErrorCode) { return ucasemap_mapUTF8( UCASE_LOC_ROOT, csm->options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8Fold, NULL, *pErrorCode); } U_NAMESPACE_BEGIN +void CaseMap::utf8ToLower( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + src.data(), src.length(), + ucasemap_internalUTF8ToLower, sink, edits, errorCode); +} + +void CaseMap::utf8ToUpper( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL + src.data(), src.length(), + ucasemap_internalUTF8ToUpper, sink, edits, errorCode); +} + +void CaseMap::utf8Fold( + uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + ucasemap_mapUTF8( + UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL + src.data(), src.length(), + ucasemap_internalUTF8Fold, sink, edits, errorCode); +} + int32_t CaseMap::utf8ToLower( const char *locale, uint32_t options, const char *src, int32_t srcLength, @@ -878,8 +745,8 @@ int32_t CaseMap::utf8ToLower( UErrorCode &errorCode) { return ucasemap_mapUTF8( ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToLower, edits, errorCode); } @@ -890,8 +757,8 @@ int32_t CaseMap::utf8ToUpper( UErrorCode &errorCode) { return ucasemap_mapUTF8( ustrcase_getCaseLocale(locale), options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToUpper, edits, errorCode); } @@ -902,8 +769,8 @@ int32_t CaseMap::utf8Fold( UErrorCode &errorCode) { return ucasemap_mapUTF8( UCASE_LOC_ROOT, options, UCASEMAP_BREAK_ITERATOR_NULL - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8Fold, edits, errorCode); } diff --git a/deps/icu-small/source/common/ucasemap_imp.h b/deps/icu-small/source/common/ucasemap_imp.h index 79204226b00900..99a64902794e7d 100644 --- a/deps/icu-small/source/common/ucasemap_imp.h +++ b/deps/icu-small/source/common/ucasemap_imp.h @@ -9,16 +9,26 @@ #include "unicode/utypes.h" #include "unicode/ucasemap.h" +#include "unicode/uchar.h" #include "ucase.h" -#ifndef U_COMPARE_IGNORE_CASE -/* see also unorm.h */ /** - * Option bit for unorm_compare: - * Perform case-insensitive comparison. + * Bit mask for the titlecasing iterator options bit field. + * Currently only 3 out of 8 values are used: + * 0 (words), U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. + * See stringoptions.h. + * @internal */ -#define U_COMPARE_IGNORE_CASE 0x10000 -#endif +#define U_TITLECASE_ITERATOR_MASK 0xe0 + +/** + * Bit mask for the titlecasing index adjustment options bit set. + * Currently two bits are defined: + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED. + * See stringoptions.h. + * @internal + */ +#define U_TITLECASE_ADJUSTMENT_MASK 0x600 /** * Internal API, used by u_strcasecmp() etc. @@ -32,7 +42,7 @@ u_strcmpFold(const UChar *s1, int32_t length1, UErrorCode *pErrorCode); /** - * Interanl API, used for detecting length of + * Internal API, used for detecting length of * shared prefix case-insensitively. * @param s1 input string 1 * @param length1 length of string 1, or -1 (NULL terminated) @@ -61,6 +71,44 @@ uprv_haveProperties(UErrorCode *pErrorCode); #ifdef __cplusplus +U_NAMESPACE_BEGIN + +class BreakIterator; // unicode/brkiter.h +class ByteSink; +class Locale; // unicode/locid.h + +/** Returns TRUE if the options are valid. Otherwise FALSE, and sets an error. */ +inline UBool ustrcase_checkTitleAdjustmentOptions(uint32_t options, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return FALSE; } + if ((options & U_TITLECASE_ADJUSTMENT_MASK) == U_TITLECASE_ADJUSTMENT_MASK) { + // Both options together. + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return FALSE; + } + return TRUE; +} + +inline UBool ustrcase_isLNS(UChar32 c) { + // Letter, number, symbol, + // or a private use code point because those are typically used as letters or numbers. + // Consider modifier letters only if they are cased. + const uint32_t LNS = (U_GC_L_MASK|U_GC_N_MASK|U_GC_S_MASK|U_GC_CO_MASK) & ~U_GC_LM_MASK; + int gc = u_charType(c); + return (U_MASK(gc) & LNS) != 0 || (gc == U_MODIFIER_LETTER && ucase_getType(c) != UCASE_NONE); +} + +#if !UCONFIG_NO_BREAK_ITERATION + +/** Returns nullptr if error. Pass in either locale or locID, not both. */ +U_CFUNC +BreakIterator *ustrcase_getTitleBreakIterator( + const Locale *locale, const char *locID, uint32_t options, BreakIterator *iter, + LocalPointer &ownedIter, UErrorCode &errorCode); + +#endif + +U_NAMESPACE_END + #include "unicode/unistr.h" // for UStringCaseMapper /* @@ -163,39 +211,43 @@ ustrcase_mapWithOverlap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITE * UTF-8 version of UStringCaseMapper. * All error checking must be done. * The UCaseMap must be fully initialized, with locale and/or iter set as needed. - * src and dest must not overlap. */ -typedef int32_t U_CALLCONV +typedef void U_CALLCONV UTF8CaseMapper(int32_t caseLocale, uint32_t options, #if !UCONFIG_NO_BREAK_ITERATION icu::BreakIterator *iter, #endif - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode); #if !UCONFIG_NO_BREAK_ITERATION /** Implements UTF8CaseMapper. */ -U_CFUNC int32_t U_CALLCONV +U_CFUNC void U_CALLCONV ucasemap_internalUTF8ToTitle(int32_t caseLocale, uint32_t options, icu::BreakIterator *iter, - uint8_t *dest, int32_t destCapacity, const uint8_t *src, int32_t srcLength, - icu::Edits *edits, + icu::ByteSink &sink, icu::Edits *edits, UErrorCode &errorCode); #endif +void +ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM + const char *src, int32_t srcLength, + UTF8CaseMapper *stringCaseMapper, + icu::ByteSink &sink, icu::Edits *edits, + UErrorCode &errorCode); + /** * Implements argument checking and buffer handling * for UTF-8 string case mapping as a common function. */ -U_CFUNC int32_t +int32_t ucasemap_mapUTF8(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM - uint8_t *dest, int32_t destCapacity, - const uint8_t *src, int32_t srcLength, + char *dest, int32_t destCapacity, + const char *src, int32_t srcLength, UTF8CaseMapper *stringCaseMapper, icu::Edits *edits, UErrorCode &errorCode); diff --git a/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp b/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp index a253850fa290cf..c21dfb7698a8ad 100644 --- a/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ucasemap_titlecase_brkiter.cpp @@ -31,6 +31,29 @@ U_NAMESPACE_BEGIN +void CaseMap::utf8ToTitle( + const char *locale, uint32_t options, BreakIterator *iter, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { + return; + } + UText utext = UTEXT_INITIALIZER; + utext_openUTF8(&utext, src.data(), src.length(), &errorCode); + LocalPointer ownedIter; + iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode); + if (iter == nullptr) { + utext_close(&utext); + return; + } + iter->setText(&utext, errorCode); + ucasemap_mapUTF8( + ustrcase_getCaseLocale(locale), options, iter, + src.data(), src.length(), + ucasemap_internalUTF8ToTitle, sink, edits, errorCode); + utext_close(&utext); +} + int32_t CaseMap::utf8ToTitle( const char *locale, uint32_t options, BreakIterator *iter, const char *src, int32_t srcLength, @@ -42,19 +65,16 @@ int32_t CaseMap::utf8ToTitle( UText utext=UTEXT_INITIALIZER; utext_openUTF8(&utext, src, srcLength, &errorCode); LocalPointer ownedIter; + iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode); if(iter==NULL) { - iter=BreakIterator::createWordInstance(Locale(locale), errorCode); - ownedIter.adoptInstead(iter); - } - if(U_FAILURE(errorCode)) { utext_close(&utext); return 0; } iter->setText(&utext, errorCode); int32_t length=ucasemap_mapUTF8( ustrcase_getCaseLocale(locale), options, iter, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToTitle, edits, errorCode); utext_close(&utext); return length; @@ -88,17 +108,24 @@ ucasemap_utf8ToTitle(UCaseMap *csm, } UText utext=UTEXT_INITIALIZER; utext_openUTF8(&utext, (const char *)src, srcLength, pErrorCode); - if(csm->iter==NULL) { - csm->iter=BreakIterator::createWordInstance(Locale(csm->locale), *pErrorCode); - } if (U_FAILURE(*pErrorCode)) { return 0; } + if(csm->iter==NULL) { + LocalPointer ownedIter; + BreakIterator *iter = ustrcase_getTitleBreakIterator( + nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode); + if (iter == nullptr) { + utext_close(&utext); + return 0; + } + csm->iter = ownedIter.orphan(); + } csm->iter->setText(&utext, *pErrorCode); int32_t length=ucasemap_mapUTF8( csm->caseLocale, csm->options, csm->iter, - (uint8_t *)dest, destCapacity, - (const uint8_t *)src, srcLength, + dest, destCapacity, + src, srcLength, ucasemap_internalUTF8ToTitle, NULL, *pErrorCode); utext_close(&utext); return length; diff --git a/deps/icu-small/source/common/uchar.cpp b/deps/icu-small/source/common/uchar.cpp index 03592fe036a61b..c3f037d73eeda9 100644 --- a/deps/icu-small/source/common/uchar.cpp +++ b/deps/icu-small/source/common/uchar.cpp @@ -729,8 +729,5 @@ upropsvec_addPropertyStarts(const USetAdder *sa, UErrorCode *pErrorCode) { } /* add the start code point of each same-value range of the properties vectors trie */ - if(propsVectorsColumns>0) { - /* if propsVectorsColumns==0 then the properties vectors trie may not be there at all */ - utrie2_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa); - } + utrie2_enum(&propsVectorsTrie, NULL, _enumPropertyStartsRange, sa); } diff --git a/deps/icu-small/source/common/uchar_props_data.h b/deps/icu-small/source/common/uchar_props_data.h index fd74402e2d8cfb..94de36673d72e3 100644 --- a/deps/icu-small/source/common/uchar_props_data.h +++ b/deps/icu-small/source/common/uchar_props_data.h @@ -11,145 +11,145 @@ #ifdef INCLUDED_FROM_UCHAR_C -static const UVersionInfo dataVersion={9,0,0,0}; +static const UVersionInfo dataVersion={0xa,0,0,0}; -static const uint16_t propsTrie_index[20780]={ -0x44e,0x456,0x45e,0x466,0x47e,0x486,0x48e,0x496,0x49e,0x4a6,0x4ac,0x4b4,0x4bc,0x4c4,0x4cc,0x4d4, -0x4da,0x4e2,0x4ea,0x4f2,0x4f5,0x4fd,0x505,0x50d,0x515,0x51d,0x519,0x521,0x529,0x531,0x536,0x53e, -0x546,0x54e,0x552,0x55a,0x562,0x56a,0x572,0x57a,0x576,0x57e,0x583,0x58b,0x591,0x599,0x5a1,0x5a9, -0x5b1,0x5b9,0x5c1,0x5c9,0x5ce,0x5d6,0x5d9,0x5e1,0x5e9,0x5f1,0x5f7,0x5ff,0x5fe,0x606,0x60e,0x616, -0x626,0x61e,0x62e,0x46e,0x46e,0x63e,0x646,0x636,0x656,0x658,0x660,0x64e,0x670,0x676,0x67e,0x668, -0x68e,0x694,0x69c,0x686,0x6ac,0x6b2,0x6ba,0x6a4,0x6ca,0x6d0,0x6d8,0x6c2,0x6e8,0x6f0,0x6f8,0x6e0, -0x708,0x70e,0x716,0x700,0x726,0x72c,0x734,0x71e,0x744,0x749,0x751,0x73c,0x761,0x768,0x770,0x759, -0x5fa,0x778,0x780,0x46e,0x788,0x790,0x798,0x46e,0x7a0,0x7a8,0x7b0,0x7b5,0x7bd,0x7c4,0x7cc,0x46e, -0x5b9,0x7d4,0x7dc,0x7e4,0x7ec,0x546,0x7fc,0x7f4,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x802,0x5b9,0x80a,0x800,0x812,0x5b9,0x80e,0x5b9,0x818,0x820,0x828,0x546,0x546,0x830, -0x838,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x83d,0x845,0x5b9,0x5b9,0x84d,0x855,0x85d,0x865,0x86d,0x5b9,0x875,0x87d,0x885, -0x895,0x5b9,0x89d,0x89f,0x8a7,0x88d,0x5b9,0x8aa,0x8be,0x8b2,0x8ba,0x8c6,0x5b9,0x8ce,0x8d4,0x8dc, -0x8e4,0x5b9,0x8f4,0x8fc,0x904,0x8ec,0x46e,0x46e,0x914,0x917,0x91f,0x90c,0x92f,0x927,0x5b9,0x936, -0x5b9,0x945,0x93e,0x94d,0x955,0x46e,0x95d,0x965,0x4ee,0x96d,0x970,0x976,0x97d,0x970,0x515,0x985, -0x49e,0x49e,0x49e,0x49e,0x98d,0x49e,0x49e,0x49e,0x99d,0x9a5,0x9ad,0x9b5,0x9bd,0x9c1,0x9c9,0x995, -0x9e1,0x9e9,0x9d1,0x9d9,0x9f1,0x9f9,0xa01,0xa09,0xa21,0xa11,0xa19,0xa29,0xa31,0xa40,0xa45,0xa38, -0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa55,0xa5d,0x8dc,0xa60,0xa68,0xa6f,0xa74,0xa7c, -0x8dc,0xa82,0xa81,0xa92,0xa95,0x8dc,0x8dc,0xa8a,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xaa4,0xaac,0xa9c, -0x8dc,0x8dc,0x8dc,0xab1,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xab7,0xabf,0x8dc,0xac7,0xace, -0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xa4d,0xa4d,0xa4d,0xa4d,0xad6,0xa4d,0xadd,0xae4, -0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0xa4d,0x8dc,0xaec,0xaf3,0xaf7,0xafd,0xb03,0xb0b,0xb10, -0x546,0xb20,0xb18,0xb28,0x49e,0x49e,0x49e,0xb30,0x4ee,0xb38,0x5b9,0xb3e,0xb4e,0xb46,0xb46,0x515, -0xb56,0xb5e,0xb66,0x46e,0xb6e,0x8dc,0x8dc,0xb75,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0xb7d,0xb83, -0xb93,0xb8b,0x5fa,0x5b9,0xb9b,0x838,0x5b9,0xba3,0xbab,0xbb0,0x5b9,0x5b9,0xbb5,0x5a5,0x8dc,0xbbc, -0xbc4,0xbcc,0xbd2,0x8dc,0xbcc,0xbda,0x8dc,0xbc4,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc, -0xbe2,0x5b9,0x5b9,0x5b9,0xbea,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0xbf0,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xbf5,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8aa,0x8dc,0x8dc, -0xbfd,0x5b9,0xc00,0x5b9,0xc08,0xc0e,0xc16,0xc1e,0xc23,0x5b9,0x5b9,0xc27,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc2e,0x5b9,0xc35,0xc3b,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc43,0x5b9,0x5b9,0x5b9,0xc4b,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc4d,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc54,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0xc5b,0x5b9,0x5b9,0x5b9,0xc62,0xc6a,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc6f,0x5b9,0x5b9,0xc77,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc7b,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc7e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc81,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0xc87,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0xc8f,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0xc94,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc99,0x5b9,0x5b9,0x5b9,0xc9e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0xca6,0xcad,0xcb1,0x5b9,0x5b9,0x5b9,0xcb8,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8aa,0x46e, -0xcc6,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0xcbe,0x8dc,0xcce,0x94d,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0xcd3,0xcdb,0x49e,0xceb,0xce3,0x5b9,0x5b9,0xcf3,0xcfb,0xd0b,0x49e,0xd10,0xd18,0xd1e,0x46e,0xd03, -0xd26,0xd2e,0x5b9,0xd36,0xd46,0xd49,0xd3e,0xd51,0x60e,0xd59,0xd60,0xd68,0x656,0xd78,0xd70,0xd80, -0x5b9,0xd88,0xd90,0xd98,0x5b9,0xda0,0xda8,0xdb0,0xdb8,0xdc0,0xdc4,0xdcc,0x4ee,0x4ee,0x5b9,0xdd4, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xddc,0xde3,0x89e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0x5b9,0x5b9,0x5b9,0xdfb,0x5b9,0xcb9,0xe02,0xe07, -0x5b9,0x5b9,0x5b9,0xe0f,0x5b9,0x5b9,0x8a9,0x46e,0xe25,0xe15,0xe1d,0x5b9,0x5b9,0xe2d,0xe35,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xe3a,0xe42,0x5b9,0xe46,0x5b9,0xe4c,0xe50, -0xe58,0xe60,0xe67,0xe6f,0x5b9,0x5b9,0x5b9,0xe75,0xe8d,0x45e,0xe95,0xe9d,0xea2,0x8be,0xe7d,0xe85, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb,0xdeb, -0x11b8,0x11b8,0x11f8,0x1238,0x1278,0x12b0,0x12f0,0x1330,0x1368,0x13a8,0x13d4,0x1414,0x1454,0x1464,0x14a4,0x14d8, -0x1518,0x1548,0x1588,0x15c8,0x15d8,0x160c,0x1644,0x1684,0x16c4,0x1704,0x1738,0x1764,0x17a4,0x17dc,0x17f8,0x1838, +static const uint16_t propsTrie_index[21148]={ +0x45c,0x464,0x46c,0x474,0x48c,0x494,0x49c,0x4a4,0x4ac,0x4b4,0x4ba,0x4c2,0x4ca,0x4d2,0x4da,0x4e2, +0x4e8,0x4f0,0x4f8,0x500,0x503,0x50b,0x513,0x51b,0x523,0x52b,0x527,0x52f,0x537,0x53f,0x544,0x54c, +0x554,0x55c,0x560,0x568,0x570,0x578,0x580,0x588,0x584,0x58c,0x591,0x599,0x59f,0x5a7,0x5af,0x5b7, +0x5bf,0x5c7,0x5cf,0x5d7,0x5dc,0x5e4,0x5e7,0x5ef,0x5f7,0x5ff,0x605,0x60d,0x60c,0x614,0x61c,0x624, +0x634,0x62c,0x63c,0x644,0x47c,0x654,0x65c,0x64c,0x66c,0x66e,0x676,0x664,0x686,0x68c,0x694,0x67e, +0x6a4,0x6aa,0x6b2,0x69c,0x6c2,0x6c8,0x6d0,0x6ba,0x6e0,0x6e6,0x6ee,0x6d8,0x6fe,0x706,0x70e,0x6f6, +0x71e,0x724,0x72c,0x716,0x73c,0x742,0x74a,0x734,0x75a,0x75f,0x767,0x752,0x777,0x77e,0x786,0x76f, +0x608,0x78e,0x796,0x47c,0x79e,0x7a6,0x7ae,0x47c,0x7b6,0x7be,0x7c6,0x7cb,0x7d3,0x7da,0x7e2,0x47c, +0x5c7,0x7ea,0x7f2,0x7fa,0x802,0x554,0x812,0x80a,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x818,0x5c7,0x820,0x816,0x828,0x5c7,0x824,0x5c7,0x82e,0x836,0x83e,0x554,0x554,0x846, +0x84e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x853,0x85b,0x5c7,0x5c7,0x863,0x86b,0x873,0x87b,0x883,0x5c7,0x88b,0x893,0x89b, +0x8ab,0x5c7,0x8b3,0x8b5,0x8bd,0x8a3,0x5c7,0x8c0,0x8d4,0x8c8,0x8d0,0x8dc,0x5c7,0x8e4,0x8ea,0x8f2, +0x8fa,0x5c7,0x90a,0x912,0x91a,0x902,0x47c,0x47c,0x92a,0x92d,0x935,0x922,0x945,0x93d,0x5c7,0x94c, +0x5c7,0x95b,0x954,0x963,0x96b,0x47c,0x973,0x97b,0x4fc,0x983,0x986,0x98c,0x993,0x986,0x523,0x99b, +0x4ac,0x4ac,0x4ac,0x4ac,0x9a3,0x4ac,0x4ac,0x4ac,0x9b3,0x9bb,0x9c3,0x9cb,0x9d3,0x9d7,0x9df,0x9ab, +0x9f7,0x9ff,0x9e7,0x9ef,0xa07,0xa0f,0xa17,0xa1f,0xa37,0xa27,0xa2f,0xa3f,0xa47,0xa56,0xa5b,0xa4e, +0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa6b,0xa73,0x8f2,0xa76,0xa7e,0xa85,0xa8a,0xa92, +0x8f2,0xa99,0xa98,0xaa9,0xaac,0x8f2,0x8f2,0xaa1,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xabb,0xac3,0xab3, +0x8f2,0x8f2,0x8f2,0xac8,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xace,0xad6,0x8f2,0xade,0xae5, +0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xa63,0xa63,0xa63,0xa63,0xaed,0xa63,0xaf4,0xafb, +0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0xa63,0x8f2,0xb03,0xb0a,0xb0e,0xb14,0xb1a,0xb22,0xb27, +0x554,0xb37,0xb2f,0xb3f,0x4ac,0x4ac,0x4ac,0xb47,0x4fc,0xb4f,0x5c7,0xb55,0xb65,0xb5d,0xb5d,0x523, +0xb6d,0xb75,0xb7d,0x47c,0xb85,0x8f2,0x8f2,0xb8c,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0xb94,0xb9a, +0xbaa,0xba2,0x608,0x5c7,0xbb2,0x84e,0x5c7,0xbba,0xbc2,0xbc7,0x5c7,0x5c7,0xbcc,0x5b3,0x8f2,0xbd3, +0xa93,0xbdb,0xbe1,0x8f2,0xbdb,0xbe9,0x8f2,0xa93,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2, +0xbf1,0x5c7,0x5c7,0x5c7,0xbf9,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0xbff,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc04,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x8c0,0x8f2,0x8f2, +0xc0c,0x5c7,0xc0f,0x5c7,0xc17,0xc1d,0xc25,0xc2d,0xc32,0x5c7,0x5c7,0xc36,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc3d,0x5c7,0xc44,0xc4a,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc52,0x5c7,0x5c7,0x5c7,0xc5a,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc5c,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc63,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0xc6a,0x5c7,0x5c7,0x5c7,0xc71,0xc79,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc7e,0x5c7,0x5c7,0xc86,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc8a,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc8d,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc90,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0xc96,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0xc9e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0xca3,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xca8,0x5c7,0x5c7,0x5c7,0xcad,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0xcb5,0xcbc,0xcc0,0x5c7,0x5c7,0x5c7,0xcc7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x644, +0xcd5,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0xccd,0x8f2,0xcdd,0x963,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0xce2,0xcea,0x4ac,0xcfa,0xcf2,0x5c7,0x5c7,0xd02,0xd0a,0xd1a,0x4ac,0xd1f,0xd27,0xd2d,0x47c,0xd12, +0xd35,0xd3d,0x5c7,0xd45,0xd55,0xd58,0xd4d,0xd60,0x61c,0xd68,0xd6f,0xd77,0x66c,0xd87,0xd7f,0xd8f, +0x5c7,0xd97,0xd9f,0xda7,0x5c7,0xdaf,0xdb7,0xdbf,0xdc7,0xdcf,0xdd3,0xddb,0x4fc,0x4fc,0x5c7,0xde3, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xdeb,0xdf2,0x8b4, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0x5c7,0x5c7,0x5c7,0xe0a,0x5c7,0xcc8,0xe11,0xe16, +0x5c7,0x5c7,0x5c7,0xe1e,0x5c7,0x5c7,0x8bf,0x47c,0xe34,0xe24,0xe2c,0x5c7,0x5c7,0xe3c,0xe44,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xe49,0xe51,0x5c7,0xe55,0x5c7,0xe5b,0xe5f, +0xe67,0xe6f,0xe76,0xe7e,0x5c7,0x5c7,0x5c7,0xe84,0xe9c,0x46c,0xea4,0xeac,0xeb1,0x8d4,0xe8c,0xe94, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa,0xdfa, +0x11f0,0x11f0,0x1230,0x1270,0x12b0,0x12e8,0x1328,0x1368,0x13a0,0x13e0,0x140c,0x144c,0x148c,0x149c,0x14dc,0x1510, +0x1550,0x1580,0x15c0,0x1600,0x1610,0x1644,0x167c,0x16bc,0x16fc,0x173c,0x1770,0x179c,0x17dc,0x1814,0x1830,0x1870, 0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xbdd,0xa40,0xa40,0xa40,0xa40,0xc1d,0x1db,0x1db, 0xc5d,0xc9d,0xa40,0xa40,0xa40,0xa40,0xcdd,0xcfd,0xa40,0xa40,0xd3d,0xd7d,0xdbd,0xdfd,0xe3d,0xe7d, 0xebd,0xef4,0x1db,0x1db,0xf18,0xf4c,0x1db,0xf74,0x1db,0x1db,0x1db,0x1db,0xfa1,0x1db,0x1db,0x1db, -0x1db,0x1db,0x1db,0x1db,0xfb5,0x1db,0xfed,0x102d,0x1db,0x1038,0xa40,0xa40,0xa40,0xa40,0xa40,0x1078, +0x1db,0x1db,0x1db,0x1db,0xfb5,0x1db,0xfed,0x102d,0x1db,0x1038,0x1db,0x1db,0x1db,0x106e,0xa40,0x10ae, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, @@ -172,1117 +172,1136 @@ static const uint16_t propsTrie_index[20780]={ 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, -0x10b8,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, +0x10ee,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x10f8, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x112e, 0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700, -0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x10f8, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0xeaa,0xeb1,0xeb9,0x46e,0x5b9,0x5b9,0x5b9,0x5a5,0xec9,0xec1,0xee0,0xed1,0xed8,0xee8,0xb6a,0xef0, -0x46e,0x46e,0x46e,0x46e,0xd68,0x5b9,0xef8,0xf00,0x5b9,0xf08,0xf10,0xf14,0xf1c,0x5b9,0xf24,0x46e, -0x546,0x550,0xf2c,0x5b9,0xf30,0xf38,0xf48,0xf40,0x5b9,0xf50,0x5b9,0xf57,0x46e,0x46e,0x46e,0x46e, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xb4e,0x8aa,0xe4c,0x46e,0x46e,0x46e,0x46e, -0xf67,0xf5f,0xf6a,0xf72,0x8be,0xf7a,0x46e,0xf82,0xf8a,0xf92,0x46e,0x46e,0x5b9,0xfa2,0xfaa,0xf9a, -0xfba,0xfc1,0xfb2,0xfc9,0xfd1,0x46e,0xfe1,0xfd9,0x5b9,0xfe4,0xfec,0xff4,0xffc,0x1004,0x46e,0x46e, -0x5b9,0x5b9,0x100c,0x46e,0x546,0x1014,0x4ee,0x101c,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x1024,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x1034,0x5ef,0x103c,0x102c,0x92f,0x1044,0x104c,0x1052,0x106a,0x105a,0x1062,0x106e,0x92f,0x107e,0x1076,0x1086, -0x1096,0x108e,0x46e,0x46e,0x109d,0x10a5,0x611,0x10ad,0x10bd,0x6b2,0x10c5,0x10b5,0x46e,0x46e,0x46e,0x46e, -0x5b9,0x10cd,0x10d5,0x46e,0x5b9,0x10dd,0x10e5,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x10ed,0x10f5,0x46e, -0x5b9,0x10fd,0x1105,0x110d,0x5b9,0x111d,0x1115,0x46e,0x112d,0x1125,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x546,0x4ee,0x1135,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x5b9,0x113d,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1153,0x1158,0x1145,0x114d,0x1168, -0x1160,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x8a9,0x46e,0x46e,0x46e,0x1178,0x1180,0x1188,0x1170,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1190,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1198,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x119a, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x113d,0x8be, -0x11a2,0x46e,0x46e,0xe42,0x11aa,0x5b9,0x11ba,0x11c2,0x11ca,0x11b2,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x11d2,0x11d7,0x11df,0x46e,0x46e,0x11e7,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x11ef,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x11f7,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x11ff,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x1207,0x120c,0x1214,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0x8dc,0xb7d,0x8dc,0x121c,0x8dc,0x1223,0x122b,0x1231,0x8dc,0x1237,0x8dc,0x8dc,0x123f, -0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0xa7e,0x1247,0x46e,0x46e,0x46e,0x46e,0x1257,0x125e,0x1263, -0x1269,0x1271,0x1279,0x1281,0x125b,0x1289,0x1291,0x1299,0x129e,0x1270,0x1257,0x125e,0x125a,0x1269,0x12a6,0x1258, -0x12a9,0x125b,0x12b1,0x12b9,0x12c1,0x12c8,0x12b4,0x12bc,0x12c4,0x12cb,0x12b7,0x12d3,0x124f,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x515,0x12e3,0x515, -0x12ea,0x12f1,0x12db,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x12f8,0x1300,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x1308,0x46e,0x546,0x1318,0x1310,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1328,0x1330,0x1338, -0x1340,0x1348,0x1350,0x46e,0x1320,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x1358,0x8dc, -0x8dc,0xb75,0x135d,0x1361,0xb7d,0x1369,0x136e,0x8dc,0x1358,0x8dc,0x1236,0x46e,0x1376,0x137e,0x1382,0x138a, -0x46e,0x46e,0x46e,0x46e,0x46e,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x1392,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc,0x8dc, -0x8dc,0x8dc,0x8dc,0xa7f,0x139a,0x8dc,0x8dc,0x8dc,0xb75,0x8dc,0x8dc,0x13a2,0x46e,0x1358,0x8dc,0x13aa, -0x8dc,0x13b2,0xb7f,0x46e,0x46e,0x13ba,0x13c2,0x13ca,0x46e,0xb7e,0x46e,0xee8,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x13d2,0x5b9,0x5b9, -0x13d9,0x5b9,0x5b9,0x5b9,0x13e1,0x5b9,0x13e9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xc5f,0x5b9,0x5b9, -0x13f1,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x13f9,0x1401,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0xc9e,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x1408,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x140f,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x1416,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xb4e,0x46e,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x141a,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xf30,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x11ff,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x5b9,0x5b9,0x5b9,0x5b9,0x1422,0x5b9,0x5b9,0x5b9, -0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0x5b9,0xf30,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x1432,0x142a,0x142a,0x142a,0x46e,0x46e,0x46e,0x46e, -0x515,0x515,0x515,0x515,0x515,0x515,0x515,0x143a,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, -0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3, -0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0xdf3,0x1442,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x700,0x112e, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0xeb9,0xec0,0xec8,0x47c,0x5c7,0x5c7,0x5c7,0x5b3,0xed8,0xed0,0xeef,0xee0,0xee7,0xef7,0xb81,0xeff, +0x47c,0x47c,0x47c,0x47c,0xd77,0x5c7,0xf07,0xf0f,0x5c7,0xf17,0xf1f,0xf23,0xf2b,0x5c7,0xf33,0x47c, +0x554,0x55e,0xf3b,0x5c7,0xf3f,0xf47,0xf57,0xf4f,0x5c7,0xf5f,0x5c7,0xf66,0x47c,0x47c,0x47c,0x47c, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xb65,0x8c0,0xe5b,0x47c,0x47c,0x47c,0x47c, +0xf76,0xf6e,0xf79,0xf81,0x8d4,0xf89,0x47c,0xf91,0xf99,0xfa1,0x47c,0x47c,0x5c7,0xfb1,0xfb9,0xfa9, +0xfc9,0xfd0,0xfc1,0xfd8,0xfe0,0x47c,0xff0,0xfe8,0x5c7,0xff3,0xffb,0x1003,0x100b,0x1013,0x47c,0x47c, +0x5c7,0x5c7,0x101b,0x47c,0x554,0x1023,0x4fc,0x102b,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x1033,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x1043,0x5fd,0x104b,0x103b,0x945,0x1053,0x105b,0x1061,0x1079,0x1069,0x1071,0x107d,0x945,0x108d,0x1085,0x1095, +0x10a5,0x109d,0x47c,0x47c,0x10ac,0x10b4,0x61f,0x10bc,0x10cc,0x6c8,0x10d4,0x10c4,0x47c,0x47c,0x47c,0x47c, +0x5c7,0x10dc,0x10e4,0x47c,0x5c7,0x10ec,0x10f4,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x10fc,0x1104,0x47c, +0x5c7,0x110c,0x1114,0x111c,0x5c7,0x112c,0x1124,0x47c,0x113c,0x1134,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x554,0x4fc,0x1144,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x115c,0x114c,0x1154,0x5c7,0x116c, +0x1164,0x5c7,0x1174,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x118a,0x118f,0x117c,0x1184,0x119f, +0x1197,0x47c,0x47c,0x11ae,0x11b2,0x11a6,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x8bf,0x47c,0x47c,0x47c,0x11c2,0x11ca,0x11d2,0x11ba,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x11da,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x11e2,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x11e4, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1174,0x8d4, +0x11ec,0x47c,0x47c,0xe51,0x11f4,0x5c7,0x1204,0x120c,0x1214,0x11fc,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x121c,0x1221,0x1229,0x47c,0x47c,0x1231,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1239,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x1241,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x8d4,0x47c,0x47c,0xe51,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x8b4,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x1249,0x124e,0x1256,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x8f2,0xb94,0x8f2,0x125e,0x8f2,0x1265,0x126d,0x1273,0x8f2,0x1279,0x8f2,0x8f2,0x1281, +0x47c,0x47c,0x47c,0x47c,0x47c,0x8f2,0x8f2,0xa95,0x1289,0x47c,0x47c,0x47c,0x47c,0x1299,0x12a0,0x12a5, +0x12ab,0x12b3,0x12bb,0x12c3,0x129d,0x12cb,0x12d3,0x12db,0x12e0,0x12b2,0x1299,0x12a0,0x129c,0x12ab,0x12e8,0x129a, +0x12eb,0x129d,0x12f3,0x12fb,0x1303,0x130a,0x12f6,0x12fe,0x1306,0x130d,0x12f9,0x1315,0x1291,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x523,0x1325,0x523, +0x132c,0x1333,0x131d,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x133a,0x1342,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x134a,0x47c,0x554,0x135a,0x1352,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x136a,0x1372,0x137a, +0x1382,0x138a,0x1392,0x47c,0x1362,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x8f2,0x139a,0x8f2, +0x8f2,0xb8c,0x139f,0x13a3,0xb94,0x13ab,0x13b0,0x8f2,0x139a,0x8f2,0x1278,0x47c,0x13b8,0x13c0,0x13c4,0x13cc, +0x13d4,0x47c,0x47c,0x47c,0x47c,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x13dc,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2,0x8f2, +0x8f2,0x8f2,0x8f2,0x13e4,0x13ec,0x8f2,0x8f2,0x8f2,0xb8c,0x8f2,0x8f2,0x13e4,0x47c,0x139a,0x8f2,0x13f4, +0x8f2,0x13fc,0xb96,0x47c,0x47c,0x139a,0xa93,0x1401,0x1406,0x140e,0x47c,0x1416,0xa99,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x141e,0x5c7,0x5c7, +0x1425,0x5c7,0x5c7,0x5c7,0x142d,0x5c7,0x1435,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xc6e,0x5c7,0x5c7, +0x143d,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1445,0x144d,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0xcad,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1454,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x145b,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x1462,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xb65,0x47c,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1466,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xf3f,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x146e,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7, +0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x1476,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x5c7,0x5c7, +0x5c7,0x5c7,0x147e,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0x5c7,0xf3f,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x148e,0x1486, +0x1486,0x1486,0x47c,0x47c,0x47c,0x47c,0x523,0x523,0x523,0x523,0x523,0x523,0x523,0x1496,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c, +0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0x47c,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02, +0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0xe02,0x149e,0x45b,0x45b, 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17, -0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17,0x17,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0x14,0x17,0x15,0x1a,0x16,0x1a,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0x14,0x18,0x15,0x18,0xf,0,0,0,0,0,0,0,0, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xc,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17, +0x17,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0x14,0x17,0x15,0x1a,0x16, +0x1a,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,0x14,0x18,0x15,0x18,0xf, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, -0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xc,0x17,0x19,0x19,0x19,0x19,0x1b,0x17, -0x1a,0x1b,5,0x1c,0x18,0x10,0x1b,0x1a,0x1b,0x18,0x34b,0x38b,0x1a,2,0x17,0x17, -0x1a,0x30b,5,0x1d,0x34cb,0x344b,0x3ccb,0x17,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18, -1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x18, -2,2,2,2,2,2,2,2,1,2,1,2,1,2,1,2, +0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xc,0x17,0x19,0x19,0x19,0x19,0x1b,0x17,0x1a,0x1b,5,0x1c,0x18,0x10,0x1b,0x1a, +0x1b,0x18,0x34b,0x38b,0x1a,2,0x17,0x17,0x1a,0x30b,5,0x1d,0x34cb,0x344b,0x3ccb,0x17, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0x18,1,1,1,1,1,1,1,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,0x18,2,2,2,2,2,2,2,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -2,1,2,1,2,1,2,1,2,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,2,1,2,1,2,1,2,1, +2,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,1,2,1,2,1,2,2, -2,1,1,2,1,2,1,1,2,1,1,1,2,2,1,1, -1,1,2,1,1,2,1,1,1,2,2,2,1,1,2,1, -1,2,1,2,1,2,1,1,2,1,2,2,1,2,1,1, -2,1,1,1,2,1,2,1,1,2,2,5,1,2,2,2, -5,5,5,5,1,3,2,1,3,2,1,3,2,1,2,1, -2,1,2,1,2,1,2,1,2,1,2,1,2,2,1,2, +1,1,2,1,2,1,2,2,2,1,1,2,1,2,1,1, +2,1,1,1,2,2,1,1,1,1,2,1,1,2,1,1, +1,2,2,2,1,1,2,1,1,2,1,2,1,2,1,1, +2,1,2,2,1,2,1,1,2,1,1,1,2,1,2,1, +1,2,2,5,1,2,2,2,5,5,5,5,1,3,2,1, +3,2,1,3,2,1,2,1,2,1,2,1,2,1,2,1, +2,1,2,1,2,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,2,1,3,2,1,2,1,1, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -2,1,3,2,1,2,1,1,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,2,2,2,2, -2,2,1,1,2,1,1,2,2,1,2,1,1,1,1,2, -1,2,1,2,1,2,1,2,2,2,2,2,2,2,2,2, +1,2,1,2,2,2,2,2,2,2,1,1,2,1,1,2, +2,1,2,1,1,1,1,2,1,2,1,2,1,2,1,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,5,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,4, -4,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,4,4,4,4,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -4,0x1a,4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,6,6,6,6,6,6,6,6,6,6,6,6, +5,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,0x1a,0x1a, +0x1a,0x1a,4,4,4,4,4,4,4,4,4,4,4,4,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4,4,4,4, +4,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4,0x1a,4,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,1,2,1,2,4,0x1a,1,2,0,0,4,2, -2,2,0x17,1,0,0,0,0,0x1a,0x1a,1,0x17,1,1,1,0, -1,0,1,1,2,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,1,2,2,1,1,1,2,2,2, +6,6,6,6,6,6,6,6,6,6,6,6,1,2,1,2, +4,0x1a,1,2,0,0,4,2,2,2,0x17,1,0,0,0,0, +0x1a,0x1a,1,0x17,1,1,1,0,1,0,1,1,2,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1, +1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1, +2,2,1,1,1,2,2,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,2,2,2,2,1,2,0x18,1, -2,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1, +2,2,2,2,1,2,0x18,1,2,1,1,2,2,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,1,2,1,2,1,2,1,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,0x1b,6,6,6,6,6, -7,7,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,0x1b,6,6,6,6,6,7,7,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,1,2,1,2,1,2,1, -2,1,2,1,2,1,2,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,0,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0,0,4,0x17,0x17,0x17,0x17,0x17,0x17,0,2,2,2, +1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0,0,4,0x17,0x17, +0x17,0x17,0x17,0x17,0,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0,0x17,0x13,0, -0,0x1b,0x1b,0x19,0,6,6,6,6,6,6,6,6,6,6,6, +2,2,2,2,0,0x17,0x13,0,0,0x1b,0x1b,0x19,0,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,0x13,6,0x17,6,6,0x17,6,6,0x17,6,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,0,0,0,5,5,5,0x17,0x17,0,0,0,0,0,0,0, -0,0,0,0,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x18,0x18,0x17,0x17,0x19, -0x17,0x17,0x1b,0x1b,6,6,6,6,6,6,6,6,6,6,6,0x17, -0x10,0,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,6,6,6,6,6,6,6,0x13,6,0x17,6,6,0x17, +6,6,0x17,6,0,0,0,0,0,0,0,0,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,4,5,5,5,5,5,5,5,5,5,5,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, -0x17,0x17,5,5,6,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,0,0,0,0,5,5,5,0x17, +0x17,0,0,0,0,0,0,0,0,0,0,0,0x10,0x10,0x10,0x10, +0x10,0x10,0x18,0x18,0x18,0x17,0x17,0x19,0x17,0x17,0x1b,0x1b,6,6,6,6, +6,6,6,6,6,6,6,0x17,0x10,0,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,4,5,5,5, +5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,5,5,6,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x17,5,6,6,6,6,6,6, -6,0x10,0x1b,6,6,6,6,6,6,4,4,6,6,0x1b,6,6, -6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5, -5,0x1b,0x1b,5,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0,0x10,5,6,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,0,0,5,5,5,5,5,5,5, +0x17,5,6,6,6,6,6,6,6,0x10,0x1b,6,6,6,6,6, +6,4,4,6,6,0x1b,6,6,6,6,5,5,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,0x1b,0x1b,5,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0x10,5,6,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, -6,6,6,6,6,6,6,6,6,5,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,6,6,6,6,6,6,6,6,6,4,4,0x1b,0x17, -0x17,0x17,4,0,0,0,0,0,6,6,6,6,4,6,6,6, -4,6,6,6,6,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, -6,6,4,6,6,6,6,6,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6, +6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,6,6,6,0,0,0x17,0,6,6,0x10,6,6,6,6,6, +5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6, +6,6,6,6,4,4,0x1b,0x17,0x17,0x17,4,0,0,0,0,0, +6,6,6,6,4,6,6,6,4,6,6,6,6,6,0,0, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,6,6,6,6,4,6,6,6,6,6, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,0,0,0x17,0, +5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +6,6,0x10,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5, -5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6, -6,6,6,6,6,6,6,6,5,5,6,6,0x17,0x17,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,4,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,6,8,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,6,8,6,5,8,8, -8,6,6,6,6,6,6,6,6,8,8,8,8,6,8,8, -5,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5, -5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -5,5,0x19,0x19,0x37cb,0x35cb,0x3fcb,0x34cb,0x3ccb,0x94b,0x1b,0x19,0,0,0,0, -5,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, +5,5,5,5,5,0,5,5,5,5,5,5,5,5,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, +5,5,6,6,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x17,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +6,6,6,8,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,6,8,6,5,8,8,8,6,6,6,6,6,6,6, +6,8,8,8,8,6,8,8,5,6,6,6,6,6,6,6, +5,5,5,5,5,5,5,5,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,0x19,0x19,0x37cb,0x35cb,0x3fcb,0x34cb, +0x3ccb,0x94b,0x1b,0x19,5,0x17,0,0,5,6,8,8,0,5,5,5, +5,5,5,5,5,0,0,5,5,0,0,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, +5,0,5,0,0,0,5,5,5,5,0,0,6,5,8,8, +8,6,6,6,6,0,0,8,8,0,0,8,8,6,5,0, +0,0,0,0,0,0,0,8,0,0,0,0,5,5,0,5, +0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +6,6,5,5,5,6,0,0,0,0,0,0,0,0,0,0, +0,6,6,8,0,5,5,5,5,5,5,0,0,0,0,5, 5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,5,5,5,0,5,0,0,0,5,5, -5,5,0,0,6,5,8,8,8,6,6,6,6,0,0,8, -8,0,0,8,8,6,5,0,0,0,0,0,0,0,0,8, -0,0,0,0,5,5,0,5,0,0,0,0,0,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,6,6,5,5,5,6,0,0, -0,0,0,0,0,0,0,0,0,6,6,8,0,5,5,5, -5,5,5,0,0,0,0,5,5,0,0,5,5,5,5,5, +5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,0, +5,5,0,0,6,0,8,8,8,6,6,0,0,0,0,6, +6,0,0,6,6,6,0,0,0,6,0,0,0,0,0,0, +0,5,5,5,5,0,5,0,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x19,0,0,0,0,0,0, +0,5,6,6,6,6,6,6,0,6,6,8,0,5,5,5, +5,5,5,5,5,5,0,5,5,5,0,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, -5,0,5,5,0,5,5,0,5,5,0,0,6,0,8,8, -8,6,6,0,0,0,0,6,6,0,0,6,6,6,0,0, -0,6,0,0,0,0,0,0,0,5,5,5,5,0,5,0, +5,0,5,5,0,5,5,5,5,5,0,0,6,5,8,8, +8,6,6,6,6,6,0,6,6,8,0,8,8,6,0,0, +5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x17,0x19,0,0,0,0,0,0,0,5,0,0,0,0,0,0, -0,6,6,8,0,5,5,5,5,5,5,5,5,5,0,5, -5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x1b,5,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0,0,0,0,0,0,0,0, +0,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, +5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,0,5,5,5,5,5,5,5,0,5,5,0,5,5,5, -5,5,0,0,6,5,8,8,8,6,6,6,6,6,0,6, -6,8,0,8,8,6,0,0,5,0,0,0,0,0,0,0, +5,5,0,0,6,5,8,6,8,6,6,6,6,0,0,8, +8,0,0,8,8,6,0,0,0,0,0,0,0,0,6,8, +0,0,0,0,5,5,0,5,0,0,0,0,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x19,0x1b,0,0,0,0,0,0,0,6,5,0,5,5,5, +5,5,5,0,0,0,5,5,5,0,5,5,5,5,0,0, +0,5,5,0,5,0,5,5,0,0,0,5,5,0,0,0, +5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,0,0,8,8,6,8,8,0,0,0,8,8, +8,0,8,8,8,6,0,0,5,0,0,0,0,0,0,8, 0,0,0,0,0,0,0,0,5,5,6,6,0,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x1b,5,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb, -0,0,0,0,0,0,0,0,0,6,8,8,0,5,5,5, -5,5,5,5,5,0,0,5,5,0,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, -5,0,5,5,0,5,5,5,5,5,0,0,6,5,8,6, -8,6,6,6,6,0,0,8,8,0,0,8,8,6,0,0, -0,0,0,0,0,0,6,8,0,0,0,0,5,5,0,5, -0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x7cb,0x1e4b,0x784b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x19,0x1b,0,0,0,0,0, -0,0,6,5,0,5,5,5,5,5,5,0,0,0,5,5, -5,0,5,5,5,5,0,0,0,5,5,0,5,0,5,5, -0,0,0,5,5,0,0,0,5,5,5,0,0,0,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,0,0,8,8, -6,8,8,0,0,0,8,8,8,0,8,8,8,6,0,0, -5,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0, -5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0,0,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b, -6,8,8,8,0,5,5,5,5,5,5,5,5,0,5,5, -5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,5,6,6,6,8,8,8,8,0,6,6, -6,0,6,6,6,6,0,0,0,0,0,0,0,6,6,0, -5,5,5,0,0,0,0,0,5,5,6,6,0,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,5,5,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,6,8,8,0,5,5,5, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0,0, +0x54b,0x58b,0x5cb,0x60b,0x58b,0x5cb,0x60b,0x1b,6,8,8,8,0,5,5,5, 5,5,5,5,5,0,5,5,5,0,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5, -5,5,5,5,0,5,5,5,5,5,0,0,6,5,8,6, -8,8,8,8,8,0,6,8,8,0,8,8,6,6,0,0, -0,0,0,0,0,8,8,0,0,0,0,0,0,0,5,0, +5,5,5,5,5,5,5,5,5,5,0,0,0,5,6,6, +6,8,8,8,8,0,6,6,6,0,6,6,6,6,0,0, +0,0,0,0,0,6,6,0,5,5,5,0,0,0,0,0, 5,5,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,5,5,5,5,5,5, -0,6,8,8,0,5,5,5,5,5,5,5,5,0,5,5, +0,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,6,8,8,0,5,5,5,5,5,5,5,5,0,5,5, 5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,5,8,8,8,6,6,6,6,0,8,8,8,0,8,8, -8,6,5,0x1b,0,0,0,0,5,5,5,8,0xcc0b,0xca0b,0xcb4b,0xc90b, -0x364b,0xc94b,0x350b,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0,0,8,8,0x17,0,0,0,0,0,0,0, -0,0,0,0,0,0,8,8,0,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0,0,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,5,5,5,5,5,5,5,5,5,0,5,0,0, -5,5,5,5,5,5,5,0,0,0,6,0,0,0,0,8, -8,8,6,6,6,0,6,0,8,8,8,8,8,8,8,8, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,6,5,5,6,6,6,6,6,6,6,0,0,0,0,0x19, -5,5,5,5,5,5,4,6,6,6,6,6,6,6,6,0x17, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0,0,0,0, -0,5,5,0,5,0,0,5,5,0,5,0,0,5,0,0, -0,0,0,0,5,5,5,5,0,5,5,5,5,5,5,5, -0,5,5,5,0,5,0,5,0,0,5,5,0,5,5,5, -5,6,5,5,6,6,6,6,6,6,0,6,6,5,0,0, -5,5,5,5,5,0,4,0,6,6,6,6,6,6,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,5,5,5,5, -5,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x1b,0x17,0x1b,0x1b,0x1b,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x344b,0x3c4b,0x444b,0x4c4b,0x544b,0x5c4b, -0x644b,0x6c4b,0x744b,0x2c4b,0x1b,6,0x1b,6,0x1b,6,0x14,0x15,0x14,0x15,8,8, -5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,8,6,6,6,6,6,0x17,6,6,5,5,5,5, -5,6,6,6,6,6,6,6,6,6,6,6,0,6,6,6, +5,0,5,5,5,5,5,5,5,5,5,5,0,5,5,5, +5,5,0,0,6,5,8,6,8,8,8,8,8,0,6,8, +8,0,8,8,6,6,0,0,0,0,0,0,0,8,8,0, +0,0,0,0,0,0,5,0,5,5,6,6,0,0,0x49,0x89, +0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0x1e4b,0x784b,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb, +0x3fcb,0x1b,5,5,5,5,5,5,6,6,8,8,0,5,5,5, +5,5,5,5,5,0,5,5,5,0,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,6,6,5,8,8,8,6,6,6, +6,0,8,8,8,0,8,8,8,6,5,0x1b,0,0,0,0, +5,5,5,8,0xcc0b,0xca0b,0xcb4b,0xc90b,0x364b,0xc94b,0x350b,5,0,0,0,0, +0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,8,8, +0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, +5,5,5,5,0,5,0,0,5,5,5,5,5,5,5,0, +0,0,6,0,0,0,0,8,8,8,6,6,6,0,6,0, +8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,6,5,5,6,6,6,6, +6,6,6,0,0,0,0,0x19,5,5,5,5,5,5,4,6, +6,6,6,6,6,6,6,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x17,0x17,0,0,0,0,0,5,5,0,5,0,0,5, +5,0,5,0,0,5,0,0,0,0,0,0,5,5,5,5, +0,5,5,5,5,5,5,5,0,5,5,5,0,5,0,5, +0,0,5,5,0,5,5,5,5,6,5,5,6,6,6,6, +6,6,0,6,6,5,0,0,5,5,5,5,5,0,4,0, +6,6,6,6,6,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,5,5,5,5,5,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1b,0x17,0x1b,0x1b,0x1b, +6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x344b,0x3c4b,0x444b,0x4c4b,0x544b,0x5c4b,0x644b,0x6c4b,0x744b,0x2c4b,0x1b,6,0x1b,6, +0x1b,6,0x14,0x15,0x14,0x15,8,8,5,5,5,5,5,5,5,5, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,0,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,8,6,6,6,6, +6,0x17,6,6,5,5,5,5,5,6,6,6,6,6,6,6, +6,6,6,6,0,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,6,0,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b, -0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,8,8,6,6,6, -6,8,6,6,6,6,6,6,8,6,6,8,8,6,6,5, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17, -5,5,5,5,5,5,8,8,6,6,5,5,5,5,6,6, -6,5,8,8,8,5,5,8,8,8,8,8,8,8,5,5, -5,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5, -5,5,6,8,8,6,6,8,8,8,8,8,8,6,5,8, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,8,8,8,6,0x1b,0x1b, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0x17,4,5,5,5, -1,1,1,1,1,1,0,1,0,0,0,0,0,1,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,0, -5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +6,6,6,6,6,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b, +0x1b,0x17,0x17,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,8,8,6,6,6,6,8,6,6,6,6,6,6, +8,6,6,8,8,6,6,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5,5,5,8,8, +6,6,5,5,5,5,6,6,6,5,8,8,8,5,5,8, +8,8,8,8,8,8,5,5,5,6,6,6,6,5,5,5, +5,5,5,5,5,5,5,5,5,5,6,8,8,6,6,8, +8,8,8,8,8,6,5,8,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,8,8,8,6,0x1b,0x1b,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,0x17,4,5,5,5,1,1,1,1,1,1,0,1, +0,0,0,0,0,1,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,0,0, +5,5,5,5,5,5,5,0,5,0,5,5,5,5,0,0, 5,5,5,5,5,5,5,5,5,0,5,5,5,5,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,0,6,6,6, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b, -0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x788b,0,0,0, +5,0,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,0,0,2,2,2,2,2,2,0,0, -0x13,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0xc,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x14, -0x15,0,0,0,5,5,5,5,5,5,5,5,5,5,5,0x17, -0x17,0x17,0x98a,0x9ca,0xa0a,5,5,5,5,5,5,5,5,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,5,6,6,6,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,6,0x17,0x17,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,5,5,5,0,6,6,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,8,6,6,6,6,6, -6,6,8,8,8,8,8,8,8,8,6,8,8,6,6,6, -6,6,6,6,6,6,6,6,0x17,0x17,0x17,4,0x17,0x17,0x17,0x19, -5,6,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,0x54b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,6,5,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x17,0x17,6, -6,6,0x10,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,5,4,5,5,5,5,5,5,5,5, +5,5,5,0,0,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, +0x16cb,0x194b,0x1bcb,0x1e4b,0x788b,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0,0,0,0,0,0,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, +2,2,2,2,2,2,0,0,0x13,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x17,0x17,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0xc,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0x14,0x15,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,0x17,0x17,0x17,0x98a,0x9ca,0xa0a,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,5,6,6, +6,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, +6,0x17,0x17,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,5,5,5,0,6,6, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0,0,0,0,0,0,0,0,5,5,5,5, -5,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,0,0,0,0,0,0,0,6,6,6,8,8,8,8,6, -6,8,8,8,0,0,0,0,8,8,6,8,8,8,8,8, -8,6,6,6,0,0,0,0,0x1b,0,0,0,0x17,0x17,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5,5,5, +6,6,8,6,6,6,6,6,6,6,8,8,8,8,8,8, +8,8,6,8,8,6,6,6,6,6,6,6,6,6,6,6, +0x17,0x17,0x17,4,0x17,0x17,0x17,0x19,5,6,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,0x54b,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,6,5,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17, +0x17,0x17,0x13,0x17,0x17,0x17,0x17,6,6,6,0x10,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,4, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,5,5,5,5,5,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x30b,0,0,0,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,0,5,5,5,5,5,6,6,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,6,6,8,8,6,0,0,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0, +5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0, +6,6,6,8,8,8,8,6,6,8,8,8,0,0,0,0, +8,8,6,8,8,8,8,8,8,6,6,6,0,0,0,0, +0x1b,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,8,6,8,6,6,6,6,6,6,6,0, -6,8,6,8,8,6,6,6,6,6,6,6,6,8,8,8, -8,8,8,6,6,6,6,6,6,6,6,6,6,0,0,6, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6, -6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0, -6,6,6,6,8,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -6,8,6,6,6,6,6,8,6,8,8,8,8,8,6,8, -8,5,5,5,5,5,5,5,0,0,0,0,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0x17,0x17,5,8,6,6, -6,6,8,8,6,6,8,6,6,6,5,5,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5,6,6,8,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,8, -6,6,8,8,8,6,8,6,6,6,8,8,0,0,0,0, -0,0,0,0,0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,5,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,5,5,5,5,5,8,8,8,8,8,8,8,8, -6,6,6,6,6,6,6,6,8,8,6,6,0,0,0,0x17, -0x17,0x17,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4, -4,4,0x17,0x17,2,2,2,2,2,2,2,2,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0, -0,0,0,0,6,6,6,0x17,6,6,6,6,6,6,6,6, -6,6,6,6,6,8,6,6,6,6,6,6,6,5,5,5, -5,6,5,5,5,5,8,8,6,5,5,0,6,6,0,0, -0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2, -4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0x30b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, +6,8,8,6,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,4, +0x17,0x17,0x17,0x17,0x17,0x17,0,0,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,7,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,8,6,8, +6,6,6,6,6,6,6,0,6,8,6,8,8,6,6,6, +6,6,6,6,6,8,8,8,8,8,8,6,6,6,6,6, +6,6,6,6,6,0,0,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,6,6,6,6,8,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,6,8,6,6,6,6,6,8, +6,8,8,8,8,8,6,8,8,5,5,5,5,5,5,5, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, +0x17,0x17,0x17,0x17,5,8,6,6,6,6,8,8,6,6,8,6, +6,6,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5, +5,5,5,5,6,6,8,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,6,8,6,6,8,8,8,6,8,6, +6,6,8,8,0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,5,5,5, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,5, +8,8,8,8,8,8,8,8,6,6,6,6,6,6,6,6, +8,8,6,6,0,0,0,0x17,0x17,0x17,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,4,4,4,4,4,4,0x17,0x17,2,2,2,2, +2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,6,6,6,0x17, +6,6,6,6,6,6,6,6,6,6,6,6,6,8,6,6, +6,6,6,6,6,5,5,5,5,6,5,5,5,5,8,8, +6,5,5,8,6,6,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, -4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2, -4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4, -4,4,4,4,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,0,0,0,0,0,6, -6,6,6,6,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,2,2,2,2,2,2, -2,2,1,2,2,2,2,2,2,2,2,2,1,1,1,1, -1,0x1a,0x1a,0x1a,0,0,2,2,2,0,2,2,1,1,1,1, -3,0x1a,0x1a,0,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1, -1,1,0,0,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1, -1,1,0,0,2,2,2,2,2,2,2,2,0,1,0,1, -0,1,0,1,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,0,0,2,2,2,2,2,2,2,2,3,3,3,3, -3,3,3,3,2,2,2,2,2,2,2,2,3,3,3,3, -3,3,3,3,2,2,2,2,2,0,2,2,1,1,1,1, -3,0x1a,2,0x1a,0x1a,0x1a,2,2,2,0,2,2,1,1,1,1, -3,0x1a,0x1a,0x1a,2,2,2,2,0,0,2,2,1,1,1,1, -0,0x1a,0x1a,0x1a,0x16,0x17,0x17,0x17,0x18,0x14,0x15,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0xc,0x10,0x10,0x10,0x10,0x10,0,0x10,0x10,0x10,0x10,0x10,0x10, -0x10,0x10,0x10,0x10,0x2cb,4,0,0,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18, -0x18,0x14,0x15,4,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x10, -0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17,0x1c,0x1d,0x14,0x1c, -0x1c,0x1d,0x14,0x1c,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xd,0xe,0x10,0x10, -0x10,0x10,0x10,0xc,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x1d,0x17, -0x17,0x17,0x17,0x16,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18, -0x18,0x14,0x15,0,4,4,4,4,4,4,4,4,4,4,4,4, -4,0,0,0,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, +4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2, +2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,4,4,4,4,4,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,0,6,6,6,6,6,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2, +2,2,2,2,1,1,1,1,1,0x1a,0x1a,0x1a,0,0,2,2, +2,0,2,2,1,1,1,1,3,0x1a,0x1a,0,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,0,0,1,1,1,1,1,1,0,0,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,0,0,1,1,1,1,1,1,0,0,2,2,2,2, +2,2,2,2,0,1,0,1,0,1,0,1,2,2,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,0,0,2,2,2,2, +2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,2, +2,2,2,2,3,3,3,3,3,3,3,3,2,2,2,2, +2,0,2,2,1,1,1,1,3,0x1a,2,0x1a,0x1a,0x1a,2,2, +2,0,2,2,1,1,1,1,3,0x1a,0x1a,0x1a,2,2,2,2, +0,0,2,2,1,1,1,1,0,0x1a,0x1a,0x1a,0x16,0x17,0x17,0x17, +0x18,0x14,0x15,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x17, +0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0xc,0x10,0x10,0x10,0x10, +0x10,0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x2cb,4,0,0, +0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,4,0xc,0xc,0xc,0xc, +0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x10,0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13, +0x13,0x13,0x17,0x17,0x1c,0x1d,0x14,0x1c,0x1c,0x1d,0x14,0x1c,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0xd,0xe,0x10,0x10,0x10,0x10,0x10,0xc,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x16,0x2cb,0x30b,0x34b,0x38b, +0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x18,0x18,0x18,0x14,0x15,0,4,4,4,4, +4,4,4,4,4,4,4,4,4,0,0,0,0x19,0x19,0x19,0x19, 0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, -0x19,0x19,0x19,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, -6,7,7,7,7,6,7,7,7,6,6,6,6,6,6,6, -6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x1b,0x1b,0x1b,0x1b,1,0x1b,1,0x1b,1,0x1b,1,1, -1,1,0x1b,2,1,1,1,1,2,5,5,5,5,2,0x1b,0x1b, -2,2,1,1,0x18,0x18,0x18,0x18,0x18,1,2,2,2,2,0x1b,0x18, -0x1b,0x1b,2,0x1b,0x358b,0x360b,0x364b,0x348b,0x388b,0x350b,0x390b,0x3d0b,0x410b,0x354b,0x454b,0x35cb, -0x3dcb,0x45cb,0x4dcb,0x58b,0x1b,0x1b,1,0x1b,0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1, -1,1,2,2,1,1,1,2,0x1b,1,0x1b,0x1b,0x18,1,1,1, -1,1,0x1b,0x1b,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a, -0x11ca,0x1e4a,0x980a,0x784a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a, -0x11ca,0x1e4a,0x980a,0x784a,0x784a,0x984a,0x788a,1,2,0x6ca,0x11ca,0x988a,0x78ca,0x54b,0x1b,0x1b, -0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x18,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6, +6,6,6,6,6,6,6,6,6,7,7,7,7,6,7,7, +7,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, +1,0x1b,1,0x1b,1,0x1b,1,1,1,1,0x1b,2,1,1,1,1, +2,5,5,5,5,2,0x1b,0x1b,2,2,1,1,0x18,0x18,0x18,0x18, +0x18,1,2,2,2,2,0x1b,0x18,0x1b,0x1b,2,0x1b,0x358b,0x360b,0x364b,0x348b, +0x388b,0x350b,0x390b,0x3d0b,0x410b,0x354b,0x454b,0x35cb,0x3dcb,0x45cb,0x4dcb,0x58b,0x1b,0x1b,1,0x1b, +0x1b,0x1b,0x1b,1,0x1b,0x1b,2,1,1,1,2,2,1,1,1,2, +0x1b,1,0x1b,0x1b,0x18,1,1,1,1,1,0x1b,0x1b,0x58a,0x5ca,0x60a,0x64a, +0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,0x58a,0x5ca,0x60a,0x64a, +0x68a,0x6ca,0x70a,0x74a,0x78a,0x7ca,0x80a,0x84a,0x11ca,0x1e4a,0x980a,0x784a,0x784a,0x984a,0x788a,1, +2,0x6ca,0x11ca,0x988a,0x78ca,0x54b,0x1b,0x1b,0,0,0,0,0x18,0x18,0x18,0x18, +0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18,0x1b,0x1b,0x18,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x18,0x1b, +0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x1b, +0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, -0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x2cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b, -0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, -0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb, -0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b, +0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2cb,0x80b, +0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b, +0x4cb,0x50b,0x7cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x80b,0x84b, +0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, +0x50b,0x7cb,0x80b,0x84b,0x88b,0x8cb,0x90b,0x94b,0x98b,0x9cb,0xa0b,0xa4b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15, -0x14,0x15,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb, -0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, -0x18,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15, -0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14, -0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, -0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x30b,0x34b, +0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb, +0x50b,0x7cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15, +0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, +0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x14,0x15,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, -0x18,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x14,0x15,0x18,0x18,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x18, +0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, +0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,2,1,1,1,2,2,1,2,1,2,1,2,1,1,1, -1,2,1,2,2,1,2,2,2,2,2,2,4,4,1,1, -1,2,1,2,2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6, -6,6,1,2,0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17, -2,2,2,2,2,2,0,2,0,0,0,0,0,2,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0,0,0,4,0x17,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,6,5,5,5,5,5,5,5,0, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,0,0,0,0,0,0,0,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17, -0x17,0x1c,0x1d,0x17,0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13, -0x17,0x17,0x13,0x17,0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15, -0x14,0x15,0x17,0x17,0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x13,0x13,0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,1, +1,2,2,1,2,1,2,1,2,1,1,1,1,2,1,2, +2,1,2,2,2,2,2,2,4,4,1,1,1,2,1,2, +2,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,1,2,1,2,6,6,6,1,2, +0,0,0,0,0,0x17,0x17,0x17,0x17,0x344b,0x17,0x17,2,2,2,2, +2,2,0,2,0,0,0,0,0,2,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,4,0x17,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,5,5,5,5,5,5,5,0,5,5,5,5, +5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5, +5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0, +0,0,0,0,0x17,0x17,0x1c,0x1d,0x1c,0x1d,0x17,0x17,0x17,0x1c,0x1d,0x17, +0x1c,0x1d,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x17,0x17,0x13,0x17, +0x1c,0x1d,0x17,0x17,0x1c,0x1d,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17, +0x17,0x17,0x17,4,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x13,0x13, +0x17,0x17,0x17,0x17,0x13,0x17,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, 0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x58a,0x5ca,0x60a, -0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,6,6,6,6,8,8,0x13,4,4,4, -4,4,0x1b,0x1b,0x7ca,0xa4a,0xcca,4,5,0x17,0x1b,0x1b,0xc,0x17,0x17,0x17, -0x1b,4,5,0x54a,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b, -0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15,5,5,5,5, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a, +0x74a,0x78a,6,6,6,6,8,8,0x13,4,4,4,4,4,0x1b,0x1b, +0x7ca,0xa4a,0xcca,4,5,0x17,0x1b,0x1b,0xc,0x17,0x17,0x17,0x1b,4,5,0x54a, +0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x1b,0x1b,0x14,0x15,0x14,0x15, +0x14,0x15,0x14,0x15,0x13,0x14,0x15,0x15,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,6,6,0x1a,0x1a,4,4,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,6,6,0x1a,0x1a,4,4,5,5,5,5,5, +5,5,5,0x17,4,4,4,5,0,0,0,0,0,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x17,4,4,4,5,0,0,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,0,0,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0x1b,0x1b,0x58b,0x5cb,0x60b,0x64b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x5cb,0x60b,0x64b, +0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x7cb,0xa4b,0xccb,0xf4b, +0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b,0xb4b,0xb8b,0xbcb,0xc0b,0xc4b,0xc8b,0xccb,0xd0b, +0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0xe4b,0xe8b,0xecb,0xf0b,0xf4b,0xf8b,0xfcb,0x100b,0x104b,0x108b,0x10cb, +0x110b,0x114b,0x118b,0x11cb,5,5,5,5,5,0x685,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, -0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1b,0xa8b,0xacb,0xb0b,0xb4b,0xb8b,0xbcb,0xc0b, -0xc4b,0xc8b,0xccb,0xd0b,0xd4b,0xd8b,0xdcb,0xe0b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0xe4b,0xe8b,0xecb,0xf0b,0xf4b,0xf8b,0xfcb, -0x100b,0x104b,0x108b,0x10cb,0x110b,0x114b,0x118b,0x11cb,5,5,5,5,5,0x685,5,5, +5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,5,5,5, +5,5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x705,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5, +0x585,5,5,0x705,5,5,5,0x7885,5,0x605,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x705,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,0x585,5,5,0x705,5,5,5,0x7885,5,0x605,5,5, +5,5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5, +0x685,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x785,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x5c5,5,5,5, -5,5,5,5,0x685,5,0x645,5,5,5,5,5,5,5,5,5, +5,5,5,0x7985,0x7c5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x7985,0x7c5,5,5,5,5,5,5,5, +5,5,5,0x7845,5,5,5,5,5,5,5,5,0x605,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,0x7845,5,5,5,5,5,5,5,5, -0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x685,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x1e45,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x7985,5,5,5, +5,5,5,5,5,0x685,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x1e45,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x7985,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x7a85,5,5,5,5,5, +5,5,5,5,5,5,0x7a85,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845, -0xa45,0xcc5,5,5,5,5,5,5,0xf45,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x605,0x605,0x605, -0x605,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x645, +5,0x5c5,5,0x745,5,0x6c5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x7c5,5,0x7845,0xa45,0xcc5,5,5, +5,5,5,5,0xf45,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x605,0x605,0x605,0x605,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x585,5,5,5,5,5,5,5,0x585,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0x645,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x585,5,5, +5,5,5,5,5,0x585,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x585,5,5,5,5,5,5,5,5,5, +5,5,0x585,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x785,0xa45,5,5,5,5,5,5,5,5, -5,5,5,5,0x585,0x5c5,0x605,5,0x5c5,5,5,5,5,5,5,5, +5,5,0x785,0xa45,5,5,5,5,5,5,5,5,5,5,5,5, +0x585,0x5c5,0x605,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x7c5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x745,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x705,5, +5,5,5,5,5,5,0x7c5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x745,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x705,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x785,5,5,5,5,5, +5,5,5,5,5,5,0x785,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x1e45,5,5,5,5,5, -5,5,0x645,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x7885,5,5,5, +5,5,5,5,5,5,0x1e45,5,5,5,5,5,5,5,0x645,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0x5c5,5,5,5,5,0x5c5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0x5c5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x7845,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x7885,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x5c5,5, +5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x7845,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5, -0x1e45,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x6c5,5,5,5, +5,5,5,5,5,5,0x6c5,5,5,5,5,5,0x1e45,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x545,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,4,5,5, -5,5,5,5,5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,4,0x17,0x17,0x17,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109, -0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,2,1,2,1,2,4,4,6,6,1,2,1,2, -1,2,1,2,1,2,1,2,1,2,5,6,7,7,7,0x17, -6,6,6,6,6,6,6,6,6,6,0x17,4,5,5,5,5, -5,5,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x54a,6,6,0x17,0x17, -0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,4,4,4,4,4,4,4,4,4,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,5,4,4,2,5,5,5,5,5,0x1a,0x1a,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,2,2,1,2, -1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, -4,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2, -1,2,1,2,1,2,1,2,4,0x1a,0x1a,1,2,1,2,5, -1,2,1,2,2,2,1,2,1,2,1,2,1,2,1,2, -1,2,1,1,1,1,1,0,1,1,1,1,1,2,1,2, -0,0,0,0,0,0,0,0,5,5,6,5,5,5,6,5, -5,5,5,6,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,8,8,6,6,8, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b, -0x19,0x1b,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17, -0,0,0,0,0,0,0,0,8,8,8,8,6,6,0,0, -0,0,0,0,0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,8,8,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,8,8,8,8,8,8,8,8, -8,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,5,5,5,5,5,5,0x17,0x17,0x17,5, -0x17,5,0,0,5,5,5,5,5,5,6,6,6,6,6,6, -6,6,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6, -6,6,8,8,0,0,0,0,0,0,0,0,0,0,0,0x17, +5,5,5,5,5,5,5,5,0x6c5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, -8,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,4, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, +5,5,0x545,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,4,5,5,5,5,5,5, +5,5,5,5,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,4,0x17,0x17,0x17,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +1,2,1,2,4,4,6,6,1,2,1,2,1,2,1,2, +1,2,1,2,1,2,5,6,7,7,7,0x17,6,6,6,6, +6,6,6,6,6,6,0x17,4,5,5,5,5,5,5,0x58a,0x5ca, +0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x54a,6,6,0x17,0x17,0x17,0x17,0x17,0x17, +0,0,0,0,0,0,0,0,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,4, +4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, +4,4,2,5,5,5,5,5,0x1a,0x1a,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,2,2,1,2,1,2,1,2, +1,2,1,2,1,2,1,2,1,2,1,2,4,2,2,2, +2,2,2,2,2,1,2,1,2,1,1,2,1,2,1,2, +1,2,1,2,4,0x1a,0x1a,1,2,1,2,5,1,2,1,2, +2,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1, +1,1,1,0,1,1,1,1,1,2,1,2,0,0,0,0, +0,0,0,0,5,5,6,5,5,5,6,5,5,5,5,6, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,8,8,6,6,8,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0x34cb,0x344b,0x3ccb,0x37cb,0x35cb,0x3fcb,0x1b,0x1b,0x19,0x1b,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x17,0x17,0x17,0x17,0,0,0,0, +0,0,0,0,8,8,8,8,6,6,0,0,0,0,0,0, +0,0,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,8,8,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,6,8,8,6,6,6,6,8,8,6,8,8,8, -5,5,5,5,5,6,4,5,5,5,5,5,5,5,5,5, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,0, -5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,8, -8,6,6,8,8,6,6,0,0,0,0,0,0,0,0,0, -5,5,5,6,5,5,5,5,5,5,5,5,6,8,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0x17,0x17,0x17,0x17, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -4,5,5,5,5,5,5,0x1b,0x1b,0x1b,5,8,6,8,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -6,5,6,6,6,5,5,6,6,5,5,5,5,5,6,6, -5,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,5,5,4,0x17,0x17, -5,5,5,5,5,5,5,5,5,5,5,8,6,6,8,8, -0x17,0x17,5,4,4,8,6,0,0,0,0,0,0,0,0,0, -0,5,5,5,5,5,5,0,0,5,5,5,5,5,5,0, -0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,0x1a,4,4,4,4, -2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,8,8,8,8,8,8,8,8,8,8,8,8, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,5,5,5,5,5,5,0x17,0x17,0x17,5,0x17,5,0,0, +5,5,5,5,5,5,6,6,6,6,6,6,6,6,0x17,0x17, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,6,6,6,6,6,6,6,6,6,6,6,8,8, +0,0,0,0,0,0,0,0,0,0,0,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,8,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,4,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6, +8,8,6,6,6,6,8,8,6,8,8,8,5,5,5,5, +5,6,4,5,5,5,5,5,5,5,5,5,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,5,5,5,5,5,0,5,5,5,5, +5,5,5,5,5,6,6,6,6,6,6,8,8,6,6,8, +8,6,6,0,0,0,0,0,0,0,0,0,5,5,5,6, +5,5,5,5,5,5,5,5,6,8,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0x17,0x17,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,4,5,5,5, +5,5,5,0x1b,0x1b,0x1b,5,8,6,8,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,6,5,6,6, +6,5,5,6,6,5,5,5,5,5,6,6,5,6,5,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,5,5,4,0x17,0x17,5,5,5,5, +5,5,5,5,5,5,5,8,6,6,8,8,0x17,0x17,5,4, +4,8,6,0,0,0,0,0,0,0,0,0,0,5,5,5, +5,5,5,0,0,5,5,5,5,5,5,0,0,5,5,5, +5,5,5,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,0,5,5,5,5,5,5,5,0,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -5,5,5,8,8,6,8,8,6,8,8,0x17,8,6,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0x12,0x12,0x12,0x12, +2,2,2,2,2,2,2,0x1a,4,4,4,4,2,2,2,2, +2,2,0,0,0,0,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,8, +8,6,8,8,6,8,8,0x17,8,6,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,5,5,5,5, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, -0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11, +0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, -0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,5,5,5,5, -5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,5,0x7c5, -5,5,5,5,0x5c5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x6c5,5,0x6c5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,0x7c5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0x18,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, -5,0,5,0,5,5,0,5,5,0,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,2,2,2,2,2,2,2,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0, -0,5,6,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, -0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0x15,0x14,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,0x19,0x1b,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x15,0x17,0,0,0,0,0,0, -6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x17,0x13,0x13,0x16,0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14, -0x15,0x17,0x17,0x14,0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x17,0x17,0x17,0, -0x17,0x17,0x17,0x17,0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x17,0x18,0x13, -0x18,0x18,0x18,0,0x17,0x19,0x17,0x17,0,0,0,0,5,5,5,5, -5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,5,5,5,5,5,5,5,5, +5,5,5,0x605,5,5,5,5,5,5,5,0x7c5,5,5,5,5, +0x5c5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x6c5,5,0x6c5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,0x7c5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0x18,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,5,5,5,5,0,5,0, +5,5,0,5,5,0,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,2,2,2,0,0,0,0,0,5,6,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1a,0x1a,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0x10,0,0,5,5,5,5,5,5,0,0,5,5, -5,5,5,5,0,0,5,5,5,5,5,5,0,0,5,5, -5,0,0,0,0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0,0x1b,0x18,0x18,0x18, -0x18,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0x10,0x10,0x10, -0x1b,0x1b,0,0,0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18, -0x17,0x13,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17, -0x18,0x18,0x18,0x17,0x1a,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x14, -0x18,0x15,0x18,0x14,0x15,0x17,0x14,0x15,0x17,0x17,5,5,5,5,5,5, -5,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,4,4,5,5,5,5,5,5,5,5, -5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b, -0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b, -0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b, -0x900b,0x980b,0xa00b,0xa80b,0x7ca,0x7ca,0x7ca,0x7ca,0x7ca,0xcca,0x11ca,0x11ca,0x11ca,0x11ca,0x1e4a,0x880a, -0x980a,0x980a,0x980a,0x980a,0x980a,0x784a,0x984a,0x68a,0x11ca,0x344b,0x344b,0x388b,0x3ccb,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x54b,0x34cb,0x1b,0x1b,0x1b,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, -0x34ca,0x344a,0x58a,0x68a,0x11ca,0x980a,0x984a,0x988a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x984a,0x68a, -0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x788a,0x988a,0x7ca,0x58a,0x58a,0x58a,0x5ca,0x5ca,0x5ca,0x5ca,0x68a, -0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,0x15,0x14,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,0x19,0x1b,0,0,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x14,0x15,0x17,0,0,0,0,0,0,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,0x17,0x13,0x13,0x16, +0x16,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x14, +0x15,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x17,0x17,0x17,0,0x17,0x17,0x17,0x17, +0x13,0x14,0x15,0x14,0x15,0x14,0x15,0x17,0x17,0x17,0x18,0x13,0x18,0x18,0x18,0, +0x17,0x19,0x17,0x17,0,0,0,0,5,5,5,5,5,0,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0x10, +0,0,5,5,5,5,5,5,0,0,5,5,5,5,5,5, +0,0,5,5,5,5,5,5,0,0,5,5,5,0,0,0, +0x19,0x19,0x18,0x1a,0x1b,0x19,0x19,0,0x1b,0x18,0x18,0x18,0x18,0x1b,0x1b,0, +0,0,0,0,0,0,0,0,0,0x10,0x10,0x10,0x1b,0x1b,0,0, +0,0x17,0x17,0x17,0x19,0x17,0x17,0x17,0x14,0x15,0x17,0x18,0x17,0x13,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x18,0x18,0x18,0x17, +0x1a,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,0x14,0x18,0x15,0x18,0x14, +0x15,0x17,0x14,0x15,0x17,0x17,5,5,5,5,5,5,5,5,5,5, +4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,4,4,5,5,5,5,5,5,5,5,5,5,5,5, +0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0,5,5,0,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b, +0xa08b,0xa88b,0xb08b,0xb88b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x17,0x17,0x17,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b, +0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b, +0x7ca,0x7ca,0x7ca,0x7ca,0x7ca,0xcca,0x11ca,0x11ca,0x11ca,0x11ca,0x1e4a,0x880a,0x980a,0x980a,0x980a,0x980a, +0x980a,0x784a,0x984a,0x68a,0x11ca,0x344b,0x344b,0x388b,0x3ccb,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x54b,0x34cb,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x34ca,0x344a,0x58a,0x68a, +0x11ca,0x980a,0x984a,0x988a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a,0x784a,0x984a,0x68a,0x7ca,0x11ca,0x1e4a,0x980a, +0x784a,0x788a,0x988a,0x7ca,0x58a,0x58a,0x58a,0x5ca,0x5ca,0x5ca,0x5ca,0x68a,0x1b,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,6,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b, +0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb, +0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x1bca,5,5, +5,5,5,5,5,5,0xb80a,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,6,6,6,6,6,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,0x17,5,5,5,5, +0,0,0,0,5,5,5,5,5,5,5,5,0x17,0x58a,0x5ca,0x7ca, +0xa4a,0x1e4a,0,0,0,0,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,0,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,0,0,0,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +0,0,0,0,2,2,2,2,2,2,2,2,5,5,5,5, +5,5,5,5,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0,0,0,0,0,0,0,0x17,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5, +5,0,0,0,5,0,0,5,5,5,5,5,5,5,0,0, +5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0,0x17,0x58b,0x5cb,0x60b,0x7cb, +0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,0x1b,0x1b,0x58b,0x5cb,0x60b, +0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x64b, +0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,5,0,0,0,0,0,0x58b, +0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb,0xa4b,0x1e4b,0x5cb,0x60b, +0,0,0,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b,0x988b,0xa08b,0xa88b,0xb08b, +0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b,0x34cb,0x348b,0x46cb,0x344b, +0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, +0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb, +0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x784b, +0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b,0,0,0,0, +0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0, +0,0,0,0,5,6,6,6,0,6,6,0,0,0,0,0, +6,6,6,6,5,5,5,5,0,5,5,5,0,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -6,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, -0x16cb,0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0,0,0,0, -0x58b,0x68b,0x7cb,0x11cb,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,0,0,0,0,6,6,6,0,0,0,0,6, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x1bca,5,5,5,5,5,5,5,5,0xb80a,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x11cb,0x17, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,6,6,6,6,6,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb,0xa4b, +5,5,5,5,5,6,6,0,0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,0x1b,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17, -5,5,5,5,0,0,0,0,5,5,5,5,5,5,5,5, -0x17,0x58a,0x5ca,0x7ca,0xa4a,0x1e4a,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +5,5,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,0,0,0,0,2,2,2,2,2,2,2,2, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0,0,0,0,0,0,0,0x17,0,0,0,0, +0,0,0,0,0,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0, +0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0, +0,0,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0x1e4b,0x784b,0x30b,0x34b,0x38b,0x3cb, +0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x800b, +0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b,0x34cb,0x348b,0x388b,0,0x144b,0x16cb,0x194b,0x1bcb, +0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,6,8,6,8,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6, +6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0x30b,0x34b, +0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,8,8,8,6, +6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +0,0,0,0,5,5,5,5,5,5,5,6,6,6,6,6, +8,6,6,6,6,6,6,6,6,0,0x49,0x89,0xc9,0x109,0x149,0x189, +0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,6,6,6,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,6,0x17,0x17,5,0,0,0,0,0, +0,0,0,0,8,5,5,5,5,0x17,0x17,0x17,0x17,0x17,6,6, +6,0x17,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,5,0x17, +5,0x17,0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,8,8,8,6,6,6,6,6,6, +6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b, +0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +8,8,8,6,6,6,8,8,6,8,6,6,0x17,0x17,0x17,0x17, +0x17,0x17,6,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,5,0,5,5,5,5,0,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5, +5,5,5,5,5,5,5,5,5,0x17,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +8,8,8,6,6,6,6,6,6,6,6,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +5,5,8,8,0,0,6,6,6,6,6,6,6,0,0,0, +6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0, +6,6,8,8,0,5,5,5,5,5,5,5,5,0,0,5, +5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +6,8,8,8,8,0,0,8,8,0,0,8,8,8,0,0, +5,0,0,0,0,0,0,8,0,0,0,0,0,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,5,5,0,0,0,5,0,0,5,5,5,5,5, -5,5,0,0,5,0,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0x17, -0x58b,0x5cb,0x60b,0x7cb,0xa4b,0x1e4b,0x784b,0x788b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x1b, -0x1b,0x58b,0x5cb,0x60b,0x64b,0x68b,0x7cb,0xa4b,0,0,0,0,0,0,0,0x58b, -0x5cb,0x60b,0x64b,0x64b,0x68b,0x7cb,0xa4b,0x1e4b,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,5,0,0, -0,0,0,0x58b,0x68b,0x7cb,0xa4b,0x1e4b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x58b,0x7cb, -0xa4b,0x1e4b,0x5cb,0x60b,0,0,0,0x17,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,0,0,0x17,0xa04b,0xa84b,0xb04b,0xb84b,0x788b,0x808b,0x888b,0x908b, -0x988b,0xa08b,0xa88b,0xb08b,0xb88b,0x78cb,0x80cb,0x88cb,0x90cb,0x98cb,0xa0cb,0xa8cb,0xb0cb,0xb8cb,0x36cb,0x354b, -0x34cb,0x348b,0x46cb,0x344b,0x4ecb,0x388b,0x3ccb,0x454b,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0x5ecb,0x344b,5,5,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b, -0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0,0,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b, -0xa80b,0xb00b,0xb80b,0x784b,0x804b,0x884b,0x904b,0x984b,0x30b,0x34b,0x38b,0x3cb,0x7cb,0xa4b,0x1e4b,0x784b, -0,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0,0,0,0,0,0,0,5,6,6,6,0,6,6,0, -0,0,0,0,6,6,6,6,5,5,5,5,0,5,5,5, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,6,6,6,0, -0,0,0,6,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x11cb,0x17,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,8,8,8,6,6,6,6,6,6,6,6, +8,8,6,6,6,8,6,5,5,5,5,0x17,0x17,0x17,0x17,0x17, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x17,0,0x17,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0x58b,0x7cb,0xa4b,5,5,5,5,5,6,6,0,0,0,0,0x58b, -0x68b,0x7cb,0xa4b,0x1e4b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,0x1b,5,5,5, +8,8,8,6,6,6,6,6,6,8,6,8,8,8,8,6, +6,8,6,6,5,5,0x17,5,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,8, +8,8,6,6,6,6,0,0,8,8,8,8,6,6,8,6, +6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5,6,6,0,0, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17, +8,8,8,6,6,6,6,6,6,6,6,8,8,6,8,6, +6,0x17,0x17,0x17,5,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,6,8,6,8,8, +6,6,6,6,6,6,8,6,0,0,0,0,0,0,0,0, +8,8,6,6,6,6,8,6,6,6,6,6,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0x17,0x17,0x17,0x1b, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +5,5,5,5,5,5,5,5,5,5,0,0,0,6,6,6, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b, +0x16cb,0x194b,0x1bcb,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b,0x784b, +5,5,5,6,6,6,6,6,6,8,5,6,6,6,6,0x17, +0x17,0x17,0x17,0x17,0x17,0x17,0x17,6,0,0,0,0,0,0,0,0, +5,6,6,6,6,6,6,8,8,6,6,6,5,5,5,5, +5,6,6,6,6,6,6,8,8,6,6,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,0,0,0,0,0,0,0x17,0x17,0x17,0x17,0,0,0, -0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x7cb,0xa4b,0x1e4b, +0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,0,0,5,5,5,5,6,6,6,6,6,6, +6,6,6,6,6,6,6,8,6,6,0x17,0x17,0x17,0,0x17,0x17, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, +5,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb, +0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0,0,0, +0x17,0x17,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,8,6,6,6,6, +6,6,6,0,6,6,6,6,6,6,8,6,6,6,6,6, +6,6,6,6,0,8,6,6,6,6,6,6,6,8,6,6, +8,6,6,0,0,0,0,0,0,0,0,0,5,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,0,0,6,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,6, +0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,0, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,0, +0,0,6,0,6,6,0,6,0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a, +0x11ca,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0,0x17,0x17,0x17,0x17,0x17,0,0,0, +0,0,0,0,0,0,0,0,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a, +0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a, +0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x5ca,0x60a,0x60a,0x64a,0x68a, +0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0xc08a,0xc18a,0x58a,0x5ca,0x60a,0x60a, +0x64a,0x68a,0x60a,0x60a,0x64a,0x64a,0x64a,0x64a,0x6ca,0x70a,0x70a,0x70a,0x74a,0x74a,0x78a,0x78a, +0x78a,0x78a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x58a,0x5ca,0x60a,0x64a,0x64a,0x68a,0x68a,0x5ca,0x60a, +0x58a,0x5ca,0x348a,0x388a,0x454a,0x348a,0x388a,0x35ca,5,5,5,5,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,0,0,0,0,0,0,0,0x58b,0x68b,0x7cb,0x11cb,0x1e4b,0x784b, -0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb, -0x194b,0x1bcb,0x1e4b,0x800b,0x880b,0x900b,0x980b,0xa00b,0xa80b,0xb00b,0xb80b,0x344b,0x34cb,0x348b,0x388b,0, -0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -8,6,8,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0,0, -0,0,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -8,8,8,6,6,6,6,8,8,6,6,0x17,0x17,0x10,0x17,0x17, -0x17,0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0,0,5,5,5,5,5,5,5,6, -6,6,6,6,8,6,6,6,6,6,6,6,6,0,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x17,0x17,0x17,0x17,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,6,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,6,0x17,0x17,5,0, -0,0,0,0,0,0,0,0,8,5,5,5,5,0x17,0x17,0x17, -0x17,0x17,6,6,6,0x17,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,5,0x17,5,0x17,0x17,0x17,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,8,8,8,6,6, -6,6,6,6,6,6,6,8,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b, -0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0x1e4b,0x784b,0,0,0, 0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,8,8,6,8,6,6, -0x17,0x17,0x17,0x17,0x17,0x17,6,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,0,5,0,5,5, -5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,0,5,5,5,5,5,5,5,5,5,5,0x17,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,8,8,0,0,6,6,6,6,6,6, -6,0,0,0,6,6,6,6,6,0,0,0,0,0,0,0, -0,0,0,0,6,6,8,8,0,5,5,5,5,5,5,5, -5,0,0,5,5,0,0,5,5,5,5,5,5,5,5,5, -5,5,5,5,6,8,8,8,8,0,0,8,8,0,0,8, -8,8,0,0,5,0,0,0,0,0,0,8,0,0,0,0, -0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,8,8,8,6,6,6,6, -6,6,6,6,8,8,6,6,6,8,6,5,5,5,5,0x17, -0x17,0x17,0x17,0x17,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x17, -0,0x17,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,8,6,8, -8,8,8,6,6,8,6,6,5,5,0x17,5,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,8,8,8,6,6,6,6,0,0,8,8,8,8, -6,6,8,6,6,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,5,5,5,5, -6,6,0,0,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,8,8,8,6,6,6,6,6,6,6,6,8, -8,6,8,6,6,0x17,0x17,0x17,5,0,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, -0,0,0,0,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17, -0x17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0, +5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,6, -8,6,8,8,6,6,6,6,6,6,8,6,0,0,0,0, -0,0,0,0,8,8,6,6,6,6,8,6,6,6,6,6, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b, -0x17,0x17,0x17,0x1b,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, -0,6,6,6,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x7cb,0xa4b, -0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0,0,0,0,0,0,0,0, -0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, -0,0,0,0,5,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0, -0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x58b,0x5cb, -0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb, -0x1e4b,0,0,0,0x17,0x17,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,8, -6,6,6,6,6,6,6,0,6,6,6,6,6,6,8,6, -6,6,6,6,6,6,6,6,0,8,6,6,6,6,6,6, -6,8,6,6,8,6,6,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -0x34ca,0x354a,0x34ca,0x34ca,0x344a,0x348a,0x388a,0xf4a,0x11ca,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0, -0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0,0,0,0, -0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x64a, -0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca, -0x60a,0x64a,0x68a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x6ca,0x70a,0x74a,0x78a,0x58a,0x5ca,0x60a,0x60a, -0x64a,0x68a,0xc08a,0xc18a,0x58a,0x5ca,0x60a,0x60a,0x64a,0x68a,0x60a,0x60a,0x64a,0x64a,0x64a,0x64a, -0x6ca,0x70a,0x70a,0x70a,0x74a,0x74a,0x78a,0x78a,0x78a,0x78a,0x5ca,0x60a,0x64a,0x68a,0x6ca,0x58a, -0x5ca,0x60a,0x64a,0x64a,0x68a,0x68a,0x5ca,0x60a,0x58a,0x5ca,0x348a,0x388a,0x454a,0x348a,0x388a,0x35ca, -5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0, +6,6,6,6,6,0x17,0,0,0,0,0,0,0,0,0,0, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0,0,0,0x17,0x17,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,0,0,6,6,6,6,6,0x17,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,0x17, -0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,4,4,4,4,0x17,0x1b,0,0, -0,0,0,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0,0x7cb,0x1e4b,0x788b,0x790b,0x798b,0x7a0b,0x7a8b,0,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,0,0,0,0,5,5,5,5,5,5,5,5,0,0,0, -0,0,0,0,0,0,0,0,5,8,8,8,8,8,8,8, +6,6,6,6,6,6,6,0x17,0x17,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b, +4,4,4,4,0x17,0x1b,0,0,0,0,0,0,0,0,0,0, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0x7cb,0x1e4b,0x788b,0x790b,0x798b, +0x7a0b,0x7a8b,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,0,0,0,0,5,5,5, +5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, +5,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, -8,8,8,8,8,8,8,8,8,8,8,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,4, -4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,0,0, +8,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,6,6,6,4,4,4,4,4,4,4,4,4, +4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,0,0,0,0,0,5,5,5,5, -5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, -5,5,5,5,5,5,5,5,5,5,0,0,0x1b,6,6,0x17, -0x10,0x10,0x10,0x10,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,0, +0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5, +5,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,0,0,0x1b,6,6,0x17,0x10,0x10,0x10,0x10,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, +0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,8,8,6,6,6,0x1b,0x1b, +0x1b,8,8,8,8,8,8,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,6, +6,6,6,6,6,6,6,0x1b,0x1b,6,6,6,6,6,6,6, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,8,8,6,6,6,0x1b,0x1b,0x1b,8,8,8,8,8,8,0x10, -0x10,0x10,0x10,0x10,0x10,0x10,0x10,6,6,6,6,6,6,6,6,0x1b, -0x1b,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6, -6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1b,0x1b,6,6, -6,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x58b,0x5cb,0x60b,0x64b, -0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb,0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x249,0x289,0x49,0x89, -0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, -0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, -2,0,2,2,2,2,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x1b,0x1b,6,6,6,0x1b,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,0x7cb,0xa4b,0xccb, +0xf4b,0x11cb,0x144b,0x16cb,0x194b,0x1bcb,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289, +0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189, +0x1c9,0x209,0x249,0x289,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1, -1,0,1,1,1,1,1,1,1,1,2,2,2,2,0,2, -0,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2, 2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,1,1,0,1,1,1,1,0, -0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, -1,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,1,1,0,1, -1,1,1,0,1,1,1,1,1,0,1,0,0,0,1,1, -1,1,1,1,1,0,2,2,2,2,2,2,2,2,2,2, +1,1,2,2,2,2,2,2,2,0,2,2,2,2,2,2, 2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,2,2,2,2,2,2,0,0,1,1,1,1, +2,2,2,2,2,2,2,2,1,0,1,1,0,0,1,0, +0,1,1,0,0,1,1,1,1,0,1,1,1,1,1,1, +1,1,2,2,2,2,0,2,0,2,2,2,2,2,2,2, +0,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1, +1,0,1,1,1,1,1,1,1,0,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,1,1,0,1,1,1,1,0,1,1,1,1, +1,0,1,0,0,0,1,1,1,1,1,1,1,0,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,0x18,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0x18, -2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0x18, +1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2, +2,2,0,0,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,0x18,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -2,2,2,2,2,0x18,2,2,2,2,2,2,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0x18, -2,2,2,2,2,2,1,2,0,0,0x49,0x89,0xc9,0x109,0x149,0x189, -0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6, +2,2,2,2,2,2,2,0x18,2,2,2,2,2,2,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,0x18,2,2,2,2,2,2,2,2, +2,2,2,2,2,2,2,2,2,2,2,2,2,0x18,2,2, +2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,2,2,2,0x18,2,2,2,2,2,2,1,2, +0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0x49,0x89,0xc9,0x109, +0x149,0x189,0x1c9,0x209,0,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,6, +6,6,6,6,6,6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,0, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,0x1b,0x1b,0x1b,0x1b,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,6,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, -6,6,6,6,6,6,6,0,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,0,0,6,6,6,6,6, -6,6,0,6,6,0,6,6,6,6,6,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,5,0,0,0x58b,0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b, -6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0, -2,2,2,2,6,6,6,6,6,6,6,0,0,0,0,0, -0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209,0x249,0x289,0,0,0,0,0x17,0x17, -1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +6,0,0,6,6,6,6,6,6,6,0,6,6,0,6,6, +6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,0,0,0x58b, +0x5cb,0x60b,0x64b,0x68b,0x6cb,0x70b,0x74b,0x78b,6,6,6,6,6,6,6,0, +0,0,0,0,0,0,0,0,2,2,2,2,6,6,6,6, +6,6,6,0,0,0,0,0,0x49,0x89,0xc9,0x109,0x149,0x189,0x1c9,0x209, +0x249,0x289,0,0,0,0,0x17,0x17,1,1,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, -0,5,5,0,5,0,0,5,0,5,5,5,5,5,5,5, -5,5,5,0,5,5,5,5,0,5,0,5,0,0,0,0, -0,0,5,0,0,0,0,5,0,5,0,5,0,5,5,5, -0,5,5,0,5,0,0,5,0,5,0,5,0,5,0,5, -0,5,5,0,5,0,0,5,5,5,5,0,5,5,5,5, -5,5,5,0,5,5,5,5,0,5,5,5,5,0,5,0, -5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, -0,5,5,5,0,5,5,5,5,5,0,5,5,5,5,5, -5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x18,0x18,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,0,5,5,5, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,0,5,5,0,5,0,0,5, +0,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5, +0,5,0,5,0,0,0,0,0,0,5,0,0,0,0,5, +0,5,0,5,0,5,5,5,0,5,5,0,5,0,0,5, +0,5,0,5,0,5,0,5,0,5,5,0,5,0,0,5, +5,5,5,0,5,5,5,5,5,5,5,0,5,5,5,5, +0,5,5,5,5,0,5,0,5,5,5,5,5,5,5,5, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,0,0,0,5,5,5,0,5,5,5, +5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5, +5,5,5,5,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x2cb,0x2cb,0x30b,0x34b, +0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b,0x54b,0,0,0,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x2cb,0x2cb,0x30b,0x34b,0x38b,0x3cb,0x40b,0x44b,0x48b,0x4cb,0x50b,0x54b, -0x54b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0x1b,0x1b, +0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0,0,0,0,0,0,0,0x1b,0x1b,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0, +0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0, 0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0,0,0,0,0,0,0,0,0x1b,0,0,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0,5,0x705,5,5,5,5,5,5, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0,0,0,0,0,0,0,0,0x1b,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,5,0x705,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,0x645,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, @@ -1302,6 +1321,10 @@ static const uint16_t propsTrie_index[20780]={ 5,5,5,5,5,5,5,0x605,5,5,5,5,5,5,5,5, 5,5,5,5,5,0x645,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0, +0,0,0,0,0,0,0,0,5,5,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, +5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,0x785,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, @@ -1317,156 +1340,156 @@ static const uint16_t propsTrie_index[20780]={ static const UTrie2 propsTrie={ propsTrie_index, - propsTrie_index+4408, + propsTrie_index+4464, NULL, - 4408, - 16372, + 4464, + 16684, 0xa40, - 0x11b8, + 0x11f0, 0x0, 0x0, 0x110000, - 0x5128, + 0x5298, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint16_t propsVectorsTrie_index[29136]={ -0x4cf,0x4d7,0x4df,0x4e7,0x4ff,0x507,0x50f,0x517,0x51f,0x527,0x52f,0x537,0x53f,0x547,0x54f,0x557, -0x55e,0x566,0x56e,0x576,0x579,0x581,0x589,0x591,0x599,0x5a1,0x5a9,0x5b1,0x5b9,0x5c1,0x5c9,0x5d1, -0x5d9,0x5e1,0x5e8,0x5f0,0x5f8,0x600,0x608,0x610,0x618,0x620,0x625,0x62d,0x634,0x63c,0x644,0x64c, -0x654,0x65c,0x664,0x66c,0x673,0x67b,0x683,0x68b,0x693,0x69b,0x6a3,0x6ab,0x6b3,0x6bb,0x6c3,0x6cb, -0x195d,0xda7,0xe8f,0x6d3,0x4ef,0xeff,0xf07,0x1aeb,0x124c,0x1264,0x1254,0x125c,0x7cf,0x7d5,0x7dd,0x7e5, -0x7ed,0x7f3,0x7fb,0x803,0x80b,0x811,0x819,0x821,0x829,0x82f,0x837,0x83f,0x847,0x84f,0x857,0x85e, -0x866,0x86c,0x874,0x87c,0x884,0x88a,0x892,0x89a,0x8a2,0x8ba,0x8aa,0x8b2,0x8c2,0x8c9,0x8d1,0x8d9, -0x8e1,0x8e5,0x8ed,0x8f4,0x8fc,0x904,0x90c,0x914,0x156c,0x1574,0x91c,0x924,0x92c,0x934,0x93c,0x943, -0x15d2,0x15c2,0x15ca,0x18a0,0x18a8,0x1274,0x94b,0x126c,0x14b6,0x14b6,0x14b8,0x1288,0x1289,0x127c,0x127e,0x1280, -0x15da,0x15dc,0x953,0x15dc,0x95b,0x960,0x968,0x15e1,0x96e,0x15dc,0x974,0x97c,0xc7e,0x15e9,0x15e9,0x984, -0x15f9,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa,0x15fa, -0x15fa,0x15fa,0x15fa,0x15f1,0x98c,0x1602,0x1602,0x994,0xb8b,0xb93,0xb9b,0xba3,0x1612,0x160a,0x99c,0x9a4, -0x9ac,0x161c,0x1624,0x9b4,0x161a,0x9bc,0x1965,0xdaf,0xbab,0xbb3,0xbbb,0xbc0,0x1816,0xcb1,0xcb8,0x177e, -0xc4e,0x196d,0xdb7,0xdbf,0xdc7,0xdcf,0xfb7,0xfb7,0x1866,0x186b,0xceb,0xcf3,0x18dc,0x18e4,0x1a0e,0xe97, -0x18ec,0xd3b,0xd43,0x18f4,0x6db,0x4ef,0xf97,0xdd7,0x179e,0x1786,0x1796,0x178e,0x182e,0x1826,0x17ee,0xc5e, -0x1291,0x1291,0x1291,0x1291,0x1294,0x1291,0x1291,0x129c,0x9c4,0x12a4,0x9c8,0x9d0,0x12a4,0x9d8,0x9e0,0x9e8, -0x12b4,0x12ac,0x12bc,0x9f0,0x9f8,0xa00,0xa08,0xa10,0x12c4,0x12cc,0x12d4,0x12dc,0xa18,0x12e4,0x12eb,0x12f3, -0x12fb,0x1303,0x130b,0x1313,0x131b,0x1322,0x132a,0x1332,0x133a,0x1342,0x1345,0x1347,0x162c,0x1711,0x1717,0xa20, -0x134f,0xa28,0xa30,0x1469,0x146e,0x1471,0x1479,0x1357,0x1481,0x1481,0x1367,0x135f,0x136f,0x1377,0x137f,0x1387, -0x138f,0x1397,0x139f,0x13a7,0x171f,0x1776,0x18b0,0x19ee,0x13b7,0x13be,0x13c6,0x13ce,0x13af,0x13d6,0x1727,0x172e, -0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1634,0x1736,0x1739,0x1736,0x1736,0x1741,0x1748,0x174a,0x1751, -0x1759,0x175d,0x175d,0x1760,0x175d,0x175d,0x1766,0x175d,0x17a6,0x185e,0x18b8,0xbc8,0xbce,0xbd4,0xbdc,0xbe1, -0x1806,0xc8e,0xc92,0x1873,0x17f6,0x17f6,0x17f6,0xc66,0x17fe,0xc86,0x1846,0xcdb,0xc6e,0xc76,0xc76,0x18fc, -0x1836,0x18c0,0xcc8,0xccb,0xa38,0x163c,0x163c,0xa40,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0xa48,0x6df, -0x149e,0x14c0,0xa50,0x14c8,0xa58,0x14d0,0x14d8,0x14e0,0xa60,0xa65,0x14e8,0x14ef,0xa6a,0xa72,0x1856,0xc56, -0xa7a,0x1546,0x154d,0x14f7,0x1555,0x155c,0x14ff,0xa82,0x1518,0x1518,0x151a,0x1507,0x150f,0x150f,0x1510,0x1564, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c, -0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x164c,0x1201,0x17ae,0x17ae, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522, -0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1522,0x1529,0x1211,0x1209, -0x1654,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a, -0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a,0x165a, -0x165a,0x165a,0x165a,0x165a,0xa8a,0x1662,0xa92,0x1975,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908,0x1908, -0x1904,0xd4b,0x1918,0x1910,0x191a,0x197d,0x197d,0xddf,0x180e,0x187b,0x18d0,0x18d4,0x18c8,0xcfb,0xd01,0xd04, -0x183e,0xcd3,0x1883,0xd0c,0x1922,0x1925,0xd53,0xde7,0x1935,0x192d,0xd5b,0xdef,0x1985,0x1989,0xdf7,0x105d, -0x193d,0xd63,0xd6b,0x1991,0x19a1,0x1999,0xdff,0xf5a,0xe9f,0xea7,0x1b5e,0x1015,0x1c03,0x1c03,0x19a9,0xe07, -0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5, -0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7, -0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9, -0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4, -0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6, -0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8, -0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba, -0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5, -0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7, -0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9, -0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4, -0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6, -0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8, -0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba, -0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5, -0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7, -0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9, -0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4, -0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6, -0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8, -0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba, -0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0x15ba,0x15b4,0x15b5,0x15b6,0x15b7,0x15b8,0x15b9,0xa9a,0xe0f,0xe12, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c, -0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c,0x158c, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489, -0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1489,0x1531,0x1531,0x1531,0x1531,0x1531,0x1531,0x1531,0x1531, -0x1536,0x153e,0x176e,0x1219,0x184e,0x184e,0x121d,0x1224,0xaa2,0xaaa,0xab2,0x13f6,0x13fd,0x1405,0xaba,0x140d, -0x143e,0x143e,0x13e6,0x13ee,0x1415,0x1435,0x1436,0x1446,0x141d,0x13de,0xac2,0x1425,0xaca,0x142d,0xad2,0xad6, -0xce3,0x144e,0xade,0xae6,0x1456,0x145c,0x1461,0xaee,0xafe,0x14a6,0x14ae,0x1491,0x1496,0xb06,0xb0e,0xaf6, -0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c, -0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x157c,0x1584,0x1584,0x1584,0x1584, -0x13bc,0x13bc,0x13fc,0x143c,0x147c,0x14bc,0x14fc,0x153c,0x1578,0x15b8,0x15e4,0x1624,0x1664,0x16a4,0x16e4,0x1724, -0x1764,0x17a0,0x17e0,0x1820,0x1860,0x1894,0x18d0,0x1910,0x1950,0x1990,0x19cc,0x1a0c,0x1a4c,0x1a8c,0x1acc,0x1b0c, -0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xe65,0xa40,0xa40,0xa40,0xa40,0xbfb,0x12fb,0x12fb, +static const uint16_t propsVectorsTrie_index[29236]={ +0x4c4,0x4cc,0x4d4,0x4dc,0x4f4,0x4fc,0x504,0x50c,0x514,0x51c,0x524,0x52c,0x534,0x53c,0x544,0x54c, +0x553,0x55b,0x563,0x56b,0x56e,0x576,0x57e,0x586,0x58e,0x596,0x59e,0x5a6,0x5ae,0x5b6,0x5be,0x5c6, +0x5ce,0x5d6,0x5dd,0x5e5,0x5ed,0x5f5,0x5fd,0x605,0x60d,0x615,0x61a,0x622,0x629,0x631,0x639,0x641, +0x649,0x651,0x659,0x661,0x668,0x670,0x678,0x680,0x688,0x690,0x698,0x6a0,0x6a8,0x6b0,0x6b8,0x6c0, +0x193e,0xd41,0xe2e,0x6c8,0x4e4,0xe95,0xe9d,0x1ad4,0x120d,0x1225,0x1215,0x121d,0x781,0x787,0x78f,0x797, +0x79f,0x7a5,0x7ad,0x7b5,0x7bd,0x7c3,0x7cb,0x7d3,0x7db,0x7e1,0x7e9,0x7f1,0x7f9,0x801,0x809,0x810, +0x818,0x81e,0x826,0x82e,0x836,0x83c,0x844,0x84c,0x854,0x122d,0x85c,0x864,0x86c,0x873,0x87b,0x883, +0x88b,0x88f,0x897,0x89e,0x8a6,0x8ae,0x8b6,0x8be,0x153d,0x1545,0x8c6,0x8ce,0x8d6,0x8de,0x8e6,0x8ed, +0x15a3,0x1593,0x159b,0x1879,0x1881,0x123d,0x8f5,0x1235,0x147f,0x147f,0x1481,0x1251,0x1252,0x1245,0x1247,0x1249, +0x15ab,0x15ad,0x8fd,0x15ad,0x905,0x90a,0x912,0x15b2,0x918,0x15ad,0x91e,0x926,0xc18,0x15ba,0x15ba,0x92e, +0x15ca,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb,0x15cb, +0x15cb,0x15cb,0x15cb,0x15c2,0x936,0x15d3,0x15d3,0x93e,0xb25,0xb2d,0xb35,0xb3d,0x15e3,0x15db,0x946,0x94e, +0x956,0x15ed,0x15f5,0x95e,0x15eb,0x966,0x1946,0xd49,0xb45,0xb4d,0xb55,0xb5a,0x17e7,0xc4b,0xc52,0x174f, +0xbe8,0x194e,0xd51,0xd59,0xd61,0xd69,0xf4d,0xf4d,0x183f,0x1844,0xc85,0xc8d,0x18b5,0x18bd,0x19ef,0xe36, +0x18c5,0xcd5,0xcdd,0x18cd,0x6d0,0x4e4,0xf2d,0xd71,0x176f,0x1757,0x1767,0x175f,0x17ff,0x17f7,0x17bf,0xbf8, +0x125a,0x125a,0x125a,0x125a,0x125d,0x125a,0x125a,0x1265,0x96e,0x126d,0x972,0x97a,0x126d,0x982,0x98a,0x992, +0x127d,0x1275,0x1285,0x99a,0x9a2,0x128d,0x9aa,0x9b2,0x1295,0x129d,0x12a5,0x12ad,0x9ba,0x12b5,0x12bc,0x12c4, +0x12cc,0x12d4,0x12dc,0x12e4,0x12ec,0x12f3,0x12fb,0x1303,0x130b,0x1313,0x1316,0x1318,0x15fd,0x16e2,0x16e8,0x182f, +0x1320,0x9c2,0x9ca,0x143a,0x143f,0x1442,0x144a,0x1328,0x1452,0x1452,0x1338,0x1330,0x1340,0x1348,0x1350,0x1358, +0x1360,0x1368,0x1370,0x1378,0x16f0,0x1747,0x1889,0x19cf,0x1388,0x138f,0x1397,0x139f,0x1380,0x13a7,0x16f8,0x16ff, +0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1605,0x1707,0x170a,0x1707,0x1707,0x1712,0x1719,0x171b,0x1722, +0x172a,0x172e,0x172e,0x1731,0x172e,0x172e,0x1737,0x172e,0x1777,0x1837,0x1891,0xb62,0xb68,0xb6e,0xb76,0xb7b, +0x17d7,0xc28,0xc2c,0x184c,0x17c7,0x17c7,0x17c7,0xc00,0x17cf,0xc20,0x1817,0xc75,0xc08,0xc10,0xc10,0x18d5, +0x1807,0x1899,0xc62,0xc65,0x9d2,0x160d,0x160d,0x9da,0x1615,0x1615,0x1615,0x1615,0x1615,0x1615,0x9e2,0x6d4, +0x1489,0x1491,0x9ea,0x1499,0x9f2,0x14a1,0x14a9,0x14b1,0x9fa,0x9ff,0x14b9,0x14c0,0xa04,0xa0c,0x1827,0xbf0, +0xa14,0x1517,0x151e,0x14c8,0x1526,0x152d,0x14d0,0xa1c,0x14e9,0x14e9,0x14eb,0x14d8,0x14e0,0x14e0,0x14e1,0x1535, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, +0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x11c2,0x177f,0x177f, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3, +0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14f3,0x14fa,0x1936,0x11ca, +0x1625,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b, +0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b,0x162b, +0x162b,0x162b,0x162b,0x162b,0xa24,0x1633,0xa2c,0x1956,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18dd,0xce5,0x18f1,0x18e9,0x18f3,0x195e,0x195e,0xd79,0x17df,0x1854,0x18a9,0x18ad,0x18a1,0xc95,0xc9b,0xc9e, +0x180f,0xc6d,0x185c,0xca6,0x18fb,0x18fe,0xced,0xd81,0x190e,0x1906,0xcf5,0xd89,0x1966,0x196a,0xd91,0xff3, +0x1916,0xcfd,0xd05,0x1972,0x1982,0x197a,0xd99,0xef0,0xe3e,0xe46,0x1b47,0xfab,0x1bec,0x1bec,0x198a,0xda1, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586, +0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588, +0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a, +0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585, +0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587, +0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589, +0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586, +0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588, +0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a, +0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585, +0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587, +0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589, +0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586, +0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588, +0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a, +0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585, +0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587, +0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589, +0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b, +0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0x158b,0x1585,0x1586,0x1587,0x1588,0x1589,0x158a,0xa34,0xda9,0xdac, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, +0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d,0x155d, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a, +0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x145a,0x1502,0x1502,0x1502,0x1502,0x1502,0x1502,0x1502,0x1502, +0x1507,0x150f,0x173f,0x11d2,0x181f,0x181f,0x11d6,0x11dd,0xa3c,0xa44,0xa4c,0x13c7,0x13ce,0x13d6,0xa54,0x13de, +0x140f,0x140f,0x13b7,0x13bf,0x13e6,0x1406,0x1407,0x1417,0x13ee,0x13af,0xa5c,0x13f6,0xa64,0x13fe,0xa6c,0xa70, +0xc7d,0x141f,0xa78,0xa80,0x1427,0x142d,0x1432,0xa88,0xa98,0x146f,0x1477,0x1462,0x1467,0xaa0,0xaa8,0xa90, +0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d, +0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x154d,0x1555,0x1555,0x1555,0x1555, +0x1390,0x1390,0x13d0,0x1410,0x1450,0x1490,0x14d0,0x1510,0x154c,0x158c,0x15b8,0x15f8,0x1638,0x1678,0x16b8,0x16f8, +0x1738,0x1774,0x17b4,0x17f4,0x1834,0x1868,0x18a4,0x18e4,0x1924,0x1964,0x19a0,0x19e0,0x1a20,0x1a60,0x1aa0,0x1ae0, +0xa80,0xac0,0xb00,0xb3b,0xb7b,0xa40,0xbbb,0xa40,0xe65,0xa40,0xa40,0xa40,0xa40,0xbfb,0x1290,0x1290, 0xea5,0xee5,0xa40,0xa40,0xa40,0xa40,0xc3b,0xc5b,0xa40,0xa40,0xc9b,0xcdb,0xd1b,0xe2d,0xded,0xd5d, -0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b,0x123b, -0x123b,0x123b,0x123b,0x123b,0xf25,0x127b,0x10bb,0x10fb,0x12bb,0x1045,0x107b,0x107b,0x107b,0xf65,0xf85,0xfc5, +0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0,0x11d0, +0x11d0,0x11d0,0x11d0,0x11d0,0xf25,0x1210,0x1045,0x1085,0x1250,0x1090,0x12d0,0x12d0,0x12d0,0xf65,0xf85,0xfc5, 0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85, 0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0xf85,0x1005, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, @@ -1491,2096 +1514,2109 @@ static const uint16_t propsVectorsTrie_index[29136]={ 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, 0xd9d,0xdad,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40, 0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xa40,0xd1d, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, -0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x113b, -0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb, -0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x11fb,0x117b, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0xbe9,0xbf0,0xbf8,0xc00,0x17b6,0x17b6,0x17b6,0xc08,0xc10,0xc13,0x17e6,0x17de,0xc46,0xd73,0xd77,0xd7b, -0x4ef,0x4ef,0x4ef,0x4ef,0xd83,0x1945,0xd8b,0xfaf,0x166a,0xb16,0xb1c,0x106d,0xc1b,0x181e,0xcc0,0x4ef, -0x167f,0x1672,0x1677,0x17be,0xc23,0xc2b,0x11c6,0x11cc,0x1b46,0xfcc,0x1b36,0x6e7,0x4ef,0x4ef,0x4ef,0x4ef, -0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x1b66,0x101d,0x1025,0x102d,0x4ef,0x4ef,0x4ef,0x4ef, -0xc33,0xc36,0xe1a,0x1bae,0x1065,0x6ef,0x4ef,0x10fe,0xd14,0xd93,0x4ef,0x4ef,0x1afb,0xf62,0xf6a,0x1bee, -0xc9a,0xca1,0xca9,0x19b1,0x1b8e,0x4ef,0x1b6e,0x103d,0x19b9,0xe22,0xe2a,0xe32,0x108d,0x6f7,0x4ef,0x4ef, -0x19c1,0x19c1,0x6ff,0x4ef,0x1c1b,0x1116,0x1c13,0x111e,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0xe3a,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x1a16,0x1a18,0xeaf,0xeb6,0x19d1,0x19c9,0xe42,0xf8f,0x1af3,0xf4a,0xf52,0x1035,0x1b0b,0x1b0f,0xf87,0x10ad, -0x1000,0x1005,0x707,0x4ef,0x1106,0x110e,0x1b56,0x100d,0xfe2,0xfe8,0xff0,0xff8,0x4ef,0x4ef,0x4ef,0x4ef, -0x1c5b,0x1c53,0x11b6,0x11be,0x1bd6,0x1bce,0x10d4,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1bbe,0x1095,0x109d,0x10a5, -0x1b86,0x1b7e,0x104d,0x11ae,0x1b17,0xf9f,0x70f,0x4ef,0x10e4,0x10ec,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x1be6,0x1bde,0x10dc,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x79a,0x79e,0x717,0x7a6,0x71e, -0x726,0x1bb6,0x1085,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1174,0x1179,0x1181,0x1188,0x11a0, -0x11a6,0x4ef,0x4ef,0x72e,0x732,0x73a,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x188b,0x188b,0x188b,0x188b,0x188b, -0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x188b, -0x188b,0x188b,0x188b,0x188b,0x188b,0x188b,0x1890,0xd1c,0xd23,0xd23,0xd23,0x1898,0x1898,0x1898,0xd2b,0x1c0b, -0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x1c0b,0x742,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9, -0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19db,0x19d9,0x19e3, -0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x19e6,0x19d9,0x19d9,0x19d9,0x19d9,0x19d9,0x74a,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20, -0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0x1a20,0xebe,0x1055,0x752,0x4ef, -0x4ef,0x756,0xfa7,0x1ba6,0x1b9e,0x1075,0x107d,0x75e,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x1b03,0x1b03,0xf72,0xf77,0xf7f,0x4ef,0x4ef,0x1198,0xec6,0xec7,0xec7,0xec7,0xec7, -0xec7,0xec7,0xec7,0x766,0x4ef,0x4ef,0x762,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7,0x7b7, -0x7b7,0x7b7,0x76e,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1b3e,0x1b3e,0x1b3e,0xfbf,0xfc4, -0x776,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1687,0x1687,0x1687,0x1687,0x1687, -0x1687,0x1687,0xb24,0x1697,0xb2c,0x1698,0x168f,0x16a0,0x16a6,0x16ae,0xb34,0x17d6,0x17d6,0x77e,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x17c6,0x17c6,0xc3e,0xd33,0x4ef,0x4ef,0x4ef,0x4ef,0x16df,0x16e6,0xb3c,0x16e9,0xb44, -0xb4c,0xb54,0x16e3,0xb5c,0xb64,0xb6c,0x16e8,0x16f0,0x16df,0x16e6,0x16e2,0x16e9,0x16f1,0x16e0,0x16e7,0x16e3, -0xb73,0x16b6,0x16be,0x16c5,0x16cc,0x16b9,0x16c1,0x16c8,0x16cf,0xb7b,0x16d7,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33, -0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c33,0x1c23,0x1c26,0x1c23,0x1c2d,0x1164, -0x786,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1190,0x78e,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x792,0x10b5,0x1bc6,0x10bb, -0x1bc6,0x10c3,0x10c8,0x10cc,0x10cc,0x1126,0x112e,0x1136,0x113e,0x1146,0x114c,0x1154,0x115c,0x7ae,0x7ae,0x7ae, -0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae, -0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae, -0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7ae,0x7af,0xb83,0x16f9,0x16f9, -0x16f9,0x7bf,0x7bf,0x7bf,0x7bf,0x17ce,0x17ce,0x17ce,0x17ce,0x17ce,0x17ce,0x17ce,0x7c7,0x7bf,0x7bf,0x7bf, -0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, -0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, -0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf, -0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x7bf,0x194d,0xd9b,0x1955, -0x1955,0xd9f,0xecf,0xed7,0xedf,0xe4a,0xe50,0x19fe,0xe58,0x19f6,0xe60,0xe64,0xe6b,0xe73,0xe7a,0xe82, -0xe87,0xe87,0xe87,0xe87,0xe87,0x1a4f,0x1a57,0x1a5f,0x1a63,0x1a6b,0x1a30,0x1a73,0x1a7b,0x1a5f,0x1a83,0x1a8b, -0x1a92,0x1a9a,0x1a38,0x1a5f,0x1a9d,0x1a40,0x1a47,0x1aa5,0x1aab,0x1b27,0x1b2e,0x1b1f,0x1ab3,0x1abb,0x1ac3,0x1acb, -0x1b96,0x1ad3,0x1adb,0xee7,0xeef,0x1a28,0x1a28,0x1a28,0xef7,0x1b4e,0x1b4e,0xfd4,0xfda,0x1b76,0x1b76,0x1b76, -0x1b76,0x1b76,0x1b76,0x1045,0x4ef,0x1c4b,0x1c43,0x116c,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0xf0f,0xf17,0xf1f, -0xf27,0xf2f,0xf37,0xf3e,0xf42,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6,0x1bf6, -0x1bf6,0x1bf6,0x1bf6,0x1bfb,0x1bf6,0x1bf6,0x1bf6,0x10f4,0x10f6,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x11d4,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b, -0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x1c6b,0x11dc,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x4ef, -0x4ef,0x4ef,0x4ef,0x4ef,0x4ef,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x122c,0x11e4,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11ec,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709,0x1709, -0x1709,0x1709,0x1709,0x1709,0x1709,0x1234,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11ed,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4,0x11e4, -0x11e4,0x11e4,0x11e4,0x11e4,0x11ed,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x11f5,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9, -0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x11f9,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x123c,0x1ae3,0x1ae3,0x1ae3,0x1ae3,0x1ae3,0x1ae3,0x1244,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x1594,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x159c,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4, -0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15a4,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac, -0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x15ac,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701, -0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1701,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06, -0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1a06,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b, -0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c3b,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63, -0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x1c63,0x4ce,0x2c4,0x2c4,0x2c4,0x2c4, -0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c7,0x2d0,0x2ca,0x2ca,0x2cd,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4, -0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x2c4,0x7f5,0x7ef,0x7d4,0x7cb, -0x7c2,0x7bf,0x7b6,0x7d1,0x7bc,0x7c8,0x7cb,0x7e6,0x7dd,0x7ce,0x7f2,0x7c5,0x7b3,0x7b3,0x7b3,0x7b3, -0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7da,0x7d7,0x7e0,0x7e0,0x7e0,0x7ef,0x7b6,0x801,0x801,0x801, -0x801,0x801,0x801,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb, -0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7fb,0x7bc,0x7c2,0x7c8,0x7ec,0x7b0,0x7e9,0x7fe,0x7fe,0x7fe, -0x7fe,0x7fe,0x7fe,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8, -0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7bc,0x7e3,0x7b9,0x7e0,0x2c4,0,0,0,0, +0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150, +0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x1150,0x10d0, +0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190, +0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1190,0x1110, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0xb83,0xb8a,0xb92,0xb9a,0x1787,0x1787,0x1787,0xba2,0xbaa,0xbad,0x17b7,0x17af,0xbe0,0xd0d,0xd11,0xd15, +0x4e4,0x4e4,0x4e4,0x4e4,0xd1d,0x191e,0xd25,0xf45,0x163b,0xab0,0xab6,0x1003,0xbb5,0x17ef,0xc5a,0x4e4, +0x1650,0x1643,0x1648,0x178f,0xbbd,0xbc5,0x115c,0x1162,0x1b2f,0xf62,0x1b1f,0x6dc,0x4e4,0x4e4,0x4e4,0x4e4, +0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0x1b4f,0xfb3,0xfbb,0xfc3,0x4e4,0x4e4,0x4e4,0x4e4, +0xbcd,0xbd0,0xdb4,0x1b97,0xffb,0x6e4,0x4e4,0x1094,0xcae,0xd2d,0x4e4,0x4e4,0x1ae4,0xef8,0xf00,0x1bd7, +0xc34,0xc3b,0xc43,0x1992,0x1b77,0x4e4,0x1b57,0xfd3,0x199a,0xdbc,0xdc4,0xdcc,0x1023,0x6ec,0x4e4,0x4e4, +0x19a2,0x19a2,0x6f4,0x4e4,0x1c04,0x10ac,0x1bfc,0x10b4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0xdd4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x19f7,0x19f9,0xe4e,0xe55,0x19aa,0x19b2,0xddc,0xf25,0x1adc,0xee0,0xee8,0xfcb,0x1af4,0x1af8,0xf1d,0x1043, +0xf96,0xf9b,0x6fc,0x4e4,0x109c,0x10a4,0x1b3f,0xfa3,0xf78,0xf7e,0xf86,0xf8e,0x4e4,0x4e4,0x4e4,0x4e4, +0x1c44,0x1c3c,0x114c,0x1154,0x1bbf,0x1bb7,0x106a,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1ba7,0x102b,0x1033,0x103b, +0x1b6f,0x1b67,0xfe3,0x1144,0x1b00,0xf35,0x704,0x4e4,0x107a,0x1082,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x1bcf,0x1bc7,0x1072,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1c6c,0x1c64,0x11a6,0x1c5c,0x119e, +0x70c,0x1b9f,0x101b,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x110a,0x110f,0x1117,0x111e,0x1136, +0x113c,0x4e4,0x4e4,0x1182,0x1186,0x118e,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1864,0x1864,0x1864,0x1864,0x1864, +0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1864, +0x1864,0x1864,0x1864,0x1864,0x1864,0x1864,0x1869,0xcb6,0xcbd,0xcbd,0xcbd,0x1871,0x1871,0x1871,0xcc5,0x1bf4, +0x1bf4,0x1bf4,0x1bf4,0x1bf4,0x1bf4,0x714,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba, +0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19bc,0x19ba,0x19c4, +0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x19c7,0x19ba,0x19ba,0x19ba,0x19ba,0x19ba,0x71c,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01, +0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0x1a01,0xe5d,0xfeb,0x724,0x4e4, +0x4e4,0x728,0xf3d,0x1b8f,0x1b87,0x100b,0x1013,0x730,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x1aec,0x1aec,0xf08,0xf0d,0xf15,0x4e4,0x4e4,0x112e,0x1a11,0x1c74,0x1c74,0x1c74,0x1c74, +0x1c74,0x1c74,0x1c74,0x117a,0x738,0x4e4,0x73c,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84,0x1c84, +0x1c84,0x1c84,0x1196,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1b27,0x1b27,0x1b27,0xf55,0xf5a, +0x744,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1658,0x1658,0x1658,0x1658,0x1658, +0x1658,0x1658,0xabe,0x1668,0xac6,0x1669,0x1660,0x1671,0x1677,0x167f,0xace,0x17a7,0x17a7,0x74c,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x1797,0x1797,0xbd8,0xccd,0x4e4,0x4e4,0x4e4,0x4e4,0x16b0,0x16b7,0xad6,0x16ba,0xade, +0xae6,0xaee,0x16b4,0xaf6,0xafe,0xb06,0x16b9,0x16c1,0x16b0,0x16b7,0x16b3,0x16ba,0x16c2,0x16b1,0x16b8,0x16b4, +0xb0d,0x1687,0x168f,0x1696,0x169d,0x168a,0x1692,0x1699,0x16a0,0xb15,0x16a8,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c, +0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c1c,0x1c0c,0x1c0f,0x1c0c,0x1c16,0x10fa, +0x754,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1126,0x75c,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x760,0x104b,0x1baf,0x1051, +0x1baf,0x1059,0x105e,0x1062,0x1062,0x10bc,0x10c4,0x10cc,0x10d4,0x10dc,0x10e2,0x10ea,0x10f2,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768, +0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x768,0x769,0xb1d,0x16ca,0x16ca, +0x16ca,0x771,0x771,0x771,0x771,0x179f,0x179f,0x179f,0x179f,0x179f,0x179f,0x179f,0x779,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771, +0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x771,0x1926,0xd35,0x192e, +0x192e,0xd39,0xe65,0xe6d,0xe75,0xde4,0xdea,0x19df,0xdf2,0x19d7,0xdfa,0xdfe,0xe05,0xe0d,0xe14,0xe1c, +0xe24,0xe26,0xe26,0xe26,0xe26,0x1a38,0x1a40,0x1a48,0x1a4c,0x1a54,0x1a19,0x1a5c,0x1a64,0x1a48,0x1a6c,0x1a74, +0x1a7b,0x1a83,0x1a21,0x1a48,0x1a86,0x1a29,0x1a30,0x1a8e,0x1a94,0x1b10,0x1b17,0x1b08,0x1a9c,0x1aa4,0x1aac,0x1ab4, +0x1b7f,0x1abc,0x1ac4,0xe7d,0xe85,0x1a09,0x1a09,0x1a09,0xe8d,0x1b37,0x1b37,0xf6a,0xf70,0x1b5f,0x1b5f,0x1b5f, +0x1b5f,0x1b5f,0x1b5f,0xfdb,0x4e4,0x1c34,0x1c2c,0x1102,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0xea5,0xead,0xeb5, +0xebd,0xec5,0xecd,0xed4,0xed8,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf,0x1bdf, +0x1bdf,0x1bdf,0x1bdf,0x1be4,0x1bdf,0x1bdf,0x1bdf,0x108a,0x108c,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x116a,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54, +0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1c54,0x1172,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x4e4, +0x4e4,0x4e4,0x4e4,0x4e4,0x4e4,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x11e5,0x11ae,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x11b6,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, +0x16da,0x16da,0x16da,0x16da,0x16da,0x11ed,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ba,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae,0x11ae, +0x11ae,0x11ae,0x11ae,0x11ae,0x11ba,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x11f5,0x1acc, +0x1acc,0x1acc,0x1acc,0x1acc,0x1acc,0x11fd,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1205,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1565, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x156d, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d,0x157d, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2,0x16d2, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7,0x19e7, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24,0x1c24, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c,0x1c4c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c,0x1c7c, +0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x285,0x28e,0x288,0x288,0x28b,0x282,0x282, +0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282,0x282, +0x7b0,0x7aa,0x78f,0x786,0x77d,0x77a,0x771,0x78c,0x777,0x783,0x786,0x7a1,0x798,0x789,0x7ad,0x780, +0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x76e,0x795,0x792,0x79b,0x79b,0x79b,0x7aa, +0x771,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7bc,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6, +0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x7b6,0x777,0x77d,0x783,0x7a7,0x76b, +0x7a4,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b9,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3, +0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x7b3,0x777,0x79e,0x774,0x79b,0x282, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x2d3,0x2d3,0x2d3,0x2d3, -0x2d3,0x2e2,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3, -0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d3,0x2d6,0x64b,0x80a,0x80d, -0x651,0x80d,0x807,0x648,0x63f,0x2dc,0x65d,0x2df,0x810,0x636,0x654,0x804,0x64e,0x65a,0x63c,0x63c, -0x642,0x2d9,0x648,0x645,0x63f,0x63c,0x65d,0x2df,0x639,0x639,0x639,0x64b,0x2e8,0x2e8,0x2e8,0x2e8, -0x2e8,0x2e8,0x666,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x666,0x2e8,0x2e8,0x2e8, -0x2e8,0x2e8,0x2e8,0x657,0x666,0x2e8,0x2e8,0x2e8,0x2e8,0x2e8,0x666,0x660,0x663,0x663,0x2e5,0x2e5, -0x2e5,0x2e5,0x660,0x2e5,0x663,0x663,0x663,0x2e5,0x663,0x663,0x2e5,0x2e5,0x660,0x2e5,0x663,0x663, -0x2e5,0x2e5,0x2e5,0x657,0x660,0x663,0x663,0x2e5,0x663,0x2e5,0x660,0x2e5,0x2f4,0x66c,0x2f4,0x2eb, -0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f1,0x669,0x2f4,0x66c, -0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb, -0x2f4,0x2eb,0x672,0x669,0x2f4,0x2eb,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x669,0x675,0x66f, -0x2f4,0x2eb,0x2f4,0x2eb,0x669,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x675,0x66f,0x672,0x669,0x2f4, -0x66c,0x2f4,0x2eb,0x2f4,0x66c,0x678,0x672,0x669,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x672,0x669, -0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb, -0x2f4,0x2eb,0x672,0x669,0x2f4,0x2eb,0x2f4,0x66c,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb, -0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2f4,0x2eb,0x2f4,0x2eb,0x2f4,0x2eb,0x2ee,0x2f7,0x303,0x303,0x2f7, -0x303,0x2f7,0x303,0x303,0x2f7,0x303,0x303,0x303,0x2f7,0x2f7,0x303,0x303,0x303,0x303,0x2f7,0x303, -0x303,0x2f7,0x303,0x303,0x303,0x2f7,0x2f7,0x2f7,0x303,0x303,0x2f7,0x303,0x306,0x2fa,0x303,0x2f7, -0x303,0x2f7,0x303,0x303,0x2f7,0x303,0x2f7,0x2f7,0x303,0x2f7,0x303,0x306,0x2fa,0x303,0x303,0x303, -0x2f7,0x303,0x2f7,0x303,0x303,0x2f7,0x2f7,0x300,0x303,0x2f7,0x2f7,0x2f7,0x300,0x300,0x300,0x300, -0x309,0x309,0x2fd,0x309,0x309,0x2fd,0x309,0x309,0x2fd,0x306,0x67b,0x306,0x67b,0x306,0x67b,0x306, -0x67b,0x306,0x67b,0x306,0x67b,0x306,0x67b,0x306,0x67b,0x2f7,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa, -0x303,0x2f7,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x2fa,0x309,0x309,0x2fd, -0x306,0x2fa,0x9e4,0x9e4,0x9e7,0x9e1,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa, -0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa,0x306,0x2fa, -0x9e7,0x9e1,0x9e7,0x9e1,0x9e4,0x9de,0x9e7,0x9e1,0xba3,0xca5,0x9e4,0x9de,0x9e4,0x9de,0x9e7,0x9e1, -0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0x9e7,0x9e1,0xca5,0xca5,0xca5,0xd9e, -0xd9e,0xd9e,0xda1,0xda1,0xd9e,0xda1,0xda1,0xd9e,0xd9e,0xda1,0xee5,0xee8,0xee8,0xee8,0xee8,0xee5, -0xee8,0xee5,0xee8,0xee5,0xee8,0xee5,0xee8,0xee5,0x30c,0x67e,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, -0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x67e,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, -0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, -0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30f,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c, -0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x30c,0x9ea,0x9ea,0x9ea, -0x9ea,0x9ea,0xca8,0xca8,0x327,0x327,0x327,0x327,0x327,0x327,0x327,0x327,0x327,0x31e,0x31e,0x31e, -0x31e,0x31e,0x31e,0x31e,0x31b,0x31b,0x318,0x318,0x684,0x318,0x31e,0x687,0x321,0x687,0x687,0x687, -0x321,0x687,0x31e,0x31e,0x68a,0x324,0x318,0x318,0x318,0x318,0x318,0x318,0x681,0x681,0x681,0x681, -0x315,0x681,0x318,0xb1c,0x327,0x327,0x327,0x327,0x327,0x312,0x312,0x312,0x312,0x312,0x9f3,0x9f3, -0x9f0,0x9ed,0x9f0,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab,0xcab, -0xcab,0xcab,0xcab,0xcab,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, -0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, -0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, -0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d,0x68d, -0x68d,0x68d,0x68d,0x68d,0x690,0x690,0x948,0x690,0x690,0x94b,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f,0xb1f, -0xb1f,0xb1f,0xb1f,0xc5d,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xd6e,0xeac,0xeac,0xeac,0xeac, -0xeaf,0xd71,0xd71,0xd71,0x693,0x693,0xb22,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2,0xca2, -0xca2,0xca2,0xca2,0xca2,0xf93,0xf90,0xf93,0xf90,0x333,0x33c,0xf93,0xf90,0x27,0x27,0x342,0xeeb, -0xeeb,0xeeb,0x32a,0x14e8,0x27,0x27,0x27,0x27,0x33f,0x32d,0x351,0x330,0x351,0x351,0x351,0x27, -0x351,0x27,0x351,0x351,0x348,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x699, -0x699,0x699,0x699,0x699,0x699,0x699,0x27,0x699,0x699,0x699,0x699,0x699,0x699,0x699,0x351,0x351, -0x348,0x348,0x348,0x348,0x348,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x696, -0x696,0x696,0x696,0x696,0x696,0x696,0x345,0x696,0x696,0x696,0x696,0x696,0x696,0x696,0x348,0x348, -0x348,0x348,0x348,0xf93,0x354,0x354,0x357,0x351,0x351,0x354,0x34b,0x9f6,0xbac,0xba9,0x34e,0x9f6, -0x34e,0x9f6,0x34e,0x9f6,0x34e,0x9f6,0x339,0x336,0x339,0x336,0x339,0x336,0x339,0x336,0x339,0x336, -0x339,0x336,0x339,0x336,0x354,0x354,0x34b,0x345,0xb5b,0xb58,0xba6,0xcb1,0xcae,0xcb4,0xcb1,0xcae, -0xda4,0xda7,0xda7,0xda7,0xa05,0x6a5,0x363,0x366,0x363,0x363,0x363,0x366,0x363,0x363,0x363,0x363, -0x366,0xa05,0x366,0x363,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a5,0x6a2,0x6a2, -0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2,0x6a2, -0x6a2,0x6a2,0x6a2,0x6a2,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69f,0x69c,0x69c, -0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c,0x69c, -0x9ff,0x69f,0x35d,0x360,0x35d,0x35d,0x35d,0x360,0x35d,0x35d,0x35d,0x35d,0x360,0x9ff,0x360,0x35d, -0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, -0x363,0x35d,0x363,0x35d,0x363,0x35d,0x366,0x360,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, -0x363,0x35d,0x35a,0x954,0x957,0x939,0x939,0x113d,0x9f9,0x9f9,0xbb2,0xbaf,0xa02,0x9fc,0xa02,0x9fc, -0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, -0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, -0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d,0x363,0x35d, -0x363,0x366,0x360,0x363,0x35d,0xbb2,0xbaf,0x363,0x35d,0xbb2,0xbaf,0x363,0x35d,0xbb2,0xbaf,0xeee, -0x366,0x360,0x366,0x360,0x363,0x35d,0x366,0x360,0x363,0x35d,0x366,0x360,0x366,0x360,0x366,0x360, -0x363,0x35d,0x366,0x360,0x366,0x360,0x366,0x360,0x363,0x35d,0x366,0x360,0xa05,0x9ff,0x366,0x360, -0x366,0x360,0x366,0x360,0x366,0x360,0xdad,0xdaa,0x366,0x360,0xef1,0xeee,0xef1,0xeee,0xef1,0xeee, -0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b,0xc1e,0xc1b, -0xf1e,0xf1b,0xf1e,0xf1b,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e,0x1011,0x100e, -0x1011,0x100e,0x1011,0x100e,0x1176,0x1173,0x1350,0x134d,0x1521,0x151e,0x1521,0x151e,0x1521,0x151e,0x1521,0x151e, -0x2a,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375, -0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x375,0x2a,0x2a,0x378,0x369,0x369, -0x369,0x36c,0x369,0x369,0x2a,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f, -0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x36f,0x372,0x2a,0x8be,0xa08,0x2a,0x2a,0x14eb,0x14eb,0x1404, -0x2d,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x978,0x978,0xdb0,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978,0x978, -0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0x37b,0xef4,0x37b,0x37b,0x37b,0x387,0x37b, -0x37e,0x37b,0x37b,0x38a,0x97b,0xdb3,0xdb6,0xdb3,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, -0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d, -0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x38d,0x2d,0x2d,0x2d,0x2d,0x2d, -0x38d,0x38d,0x38d,0x384,0x381,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, -0xcb7,0xcb7,0xcb7,0xcb7,0x1407,0x14ee,0xf9c,0xf9c,0xf9c,0xf99,0xf99,0xdbf,0x8c4,0xcc6,0xcc3,0xcc3, -0xcba,0xcba,0xcba,0xcba,0xcba,0xcba,0xf96,0xf96,0xf96,0xf96,0xf96,0x8c1,0x14e2,0x30,0xdbc,0x8c7, -0x1317,0x3a8,0x3ab,0x3ab,0x3ab,0x3ab,0x3ab,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0xf9f,0xf9f,0xf9f,0xf9f,0xf9f, -0x8ca,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x93f,0x93f,0x93f,0x93f,0x93f, -0x93f,0x93f,0x93f,0xb52,0xb52,0xb52,0xcba,0xcc0,0xcbd,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0xdb9,0x1314, -0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x95a,0x3a2,0x39f,0x39c,0x399,0xbb5,0xbb5, -0x93c,0x3a8,0x3a8,0x3b4,0x3a8,0x3ae,0x3ae,0x3ae,0x3ae,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0xa0e,0xa0e,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0xa0e,0x3ab,0x3a8,0x3ab,0x3a8, -0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0x3a8,0xa0e,0x3a8,0x3a8,0x3a8,0x3ab, -0x3b7,0x3a8,0x393,0x393,0x393,0x393,0x393,0x393,0x393,0x390,0x399,0x396,0x396,0x393,0x393,0x393, -0x393,0x3b1,0x3b1,0x393,0x393,0x399,0x396,0x396,0x396,0x393,0xcc9,0xcc9,0x3a5,0x3a5,0x3a5,0x3a5, -0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0x3a5,0xa0e,0xa0e,0xa0e,0xa0b,0xa0b,0xcc9,0xa26,0xa26,0xa26,0xa20, -0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa1d,0xa20,0xa1d,0x33,0xa11,0xa23,0xa14,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23, -0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xa23,0xccc,0xccc,0xccc,0xa1a,0xa1a,0xa1a,0xa1a, -0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa1a,0xa17,0xa17,0xa17,0xa17, -0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0xa17,0x33,0x33,0xccc,0xccc,0xccc,0xe22,0xe22,0xe22,0xe22, -0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22, -0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023, -0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0x1023,0xa2c,0xa2c,0xa2c,0xa2c, -0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c, -0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c,0xa2c, -0xa2c,0xa2c,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29,0xbb8,0x36,0x36, -0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xf36,0xf36,0xf36,0xf36, -0xf36,0xf36,0xf36,0xf36,0xf36,0xf36,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39, -0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39, -0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf39,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d,0xf2d, -0xf3c,0xf3c,0xf30,0xf30,0xf33,0xf42,0xf3f,0x14a,0x14a,0x14a,0x14a,0x14a,6,6,6,6, -6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1827,0x1827,0x1827,0x1827, -0x1827,0x1827,0x1827,0x1827,0x1827,0x285,0x285,0x285,0x285,0x285,0x285,0x285,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0xb2e,0xb2e,0xb31,0xb31, -0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0x9f,0x9f,0x9f,0x9f,0x15a5,0x15a5,0x15a5,0x15a5, -0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x15a2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x23d,0x23d,0x23d,0x23d, -0x23d,0x23d,0x23d,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0x165f,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x249,0x249,0x249,0x249, -0x249,0x249,0x249,0x249,0x249,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0x1b9,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x21f,0x21f,0x21f,0x21f, -0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0x14be,0x14be,0x14be,0x14be, -0x14be,0x14be,0x14be,0x14be,0x14be,0x14be,0x204,0x204,0x204,0x204,0x204,0x204,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,3,0xc,0xf,0xf, -0xc,0x12,3,0x15,0,0,0,0,0,0,0,0,6,0x15,0x15,0x15, -0x15,0x15,0x15,0x18,0x18,0x15,0x15,0x15,6,6,6,6,0,0,9,9, -9,9,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x18, -0x15,0x15,0xc,0xf,0xf,0,0x12,0x12,0x12,0xc,0xc,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,0, -6,6,0,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,0x15,0x15,0x15,0x15,0x15,0x15,0, -0,0,0x15,0,0x15,0x15,0,0x15,0x15,0x15,0x15,0x15,0x15,0x15,9,0x15, -0,0,0,0,0,0,0,0,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21, -0x21,0x21,0,0,0,0,0,0,0x1791,0x1791,0x1791,0x1791,0x264,0x264,0x264,0x264, -0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x1c2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a,0x164a, -0x164a,0x164a,0x237,0x237,0x237,0x237,0x1650,0x1650,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c, -0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0,0,0,0,0x16fe,0x16fe,0x16fe,0x16fe,0x24c,0x24c,0x24c,0x24c, -0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0xe19,0xe19,0xe16,0xe16,0xe16,0xe19,0x111,0x111, -0x111,0x111,0x111,0x111,0x111,0x111,0x111,0x111,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x27c,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, -0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x182a,0x182a,0x288,0x182a,0x182a,0x288,0x182a,0x182a, -0x182a,0x182a,0x182a,0x288,0x288,0x288,0x288,0x288,0,0,0,0,0,0,0,0, +0x291,0x291,0x291,0x291,0x291,0x2a0,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291, +0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291, +0x294,0x609,0x7c5,0x7c8,0x60f,0x7c8,0x7c2,0x606,0x5fd,0x29a,0x61b,0x29d,0x7cb,0x5f4,0x612,0x7bf, +0x60c,0x618,0x5fa,0x5fa,0x600,0x297,0x606,0x603,0x5fd,0x5fa,0x61b,0x29d,0x5f7,0x5f7,0x5f7,0x609, +0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x624,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, +0x624,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x615,0x624,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x624,0x61e, +0x621,0x621,0x2a3,0x2a3,0x2a3,0x2a3,0x61e,0x2a3,0x621,0x621,0x621,0x2a3,0x621,0x621,0x2a3,0x2a3, +0x61e,0x2a3,0x621,0x621,0x2a3,0x2a3,0x2a3,0x615,0x61e,0x621,0x621,0x2a3,0x621,0x2a3,0x61e,0x2a3, +0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9, +0x2af,0x627,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x630,0x627,0x2b2,0x2a9,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x627,0x633,0x62d,0x2b2,0x2a9,0x2b2,0x2a9,0x627,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x633, +0x62d,0x630,0x627,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x62a,0x636,0x630,0x627,0x2b2,0x62a,0x2b2,0x2a9, +0x2b2,0x2a9,0x630,0x627,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x630,0x627,0x2b2,0x2a9,0x2b2,0x62a,0x2b2,0x2a9,0x2b2,0x2a9, +0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2b2,0x2a9,0x2b2,0x2a9,0x2b2,0x2a9,0x2ac, +0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2c1,0x2c1,0x2b5,0x2b5,0x2c1,0x2c1, +0x2c1,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2c1,0x2c1,0x2b5,0x2b5,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1, +0x2c4,0x2b8,0x2c1,0x2b5,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2c1,0x2b5,0x2b5,0x2c1,0x2b5,0x2c1,0x2c4, +0x2b8,0x2c1,0x2c1,0x2c1,0x2b5,0x2c1,0x2b5,0x2c1,0x2c1,0x2b5,0x2b5,0x2be,0x2c1,0x2b5,0x2b5,0x2b5, +0x2be,0x2be,0x2be,0x2be,0x2c7,0x2c7,0x2bb,0x2c7,0x2c7,0x2bb,0x2c7,0x2c7,0x2bb,0x2c4,0x639,0x2c4, +0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2c4,0x639,0x2b5,0x2c4,0x2b8, +0x2c4,0x2b8,0x2c4,0x2b8,0x2c1,0x2b5,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8, +0x2b8,0x2c7,0x2c7,0x2bb,0x2c4,0x2b8,0x9a2,0x9a2,0x9a5,0x99f,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8, +0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8,0x2c4,0x2b8, +0x2c4,0x2b8,0x2c4,0x2b8,0x9a5,0x99f,0x9a5,0x99f,0x9a2,0x99c,0x9a5,0x99f,0xb61,0xc63,0x9a2,0x99c, +0x9a2,0x99c,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f,0x9a5,0x99f, +0xc63,0xc63,0xc63,0xd5c,0xd5c,0xd5c,0xd5f,0xd5f,0xd5c,0xd5f,0xd5f,0xd5c,0xd5c,0xd5f,0xea3,0xea6, +0xea6,0xea6,0xea6,0xea3,0xea6,0xea3,0xea6,0xea3,0xea6,0xea3,0xea6,0xea3,0x2ca,0x63c,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x63c,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2cd,0x2ca,0x2ca,0x2ca, +0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca,0x2ca, +0x2ca,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0xc66,0xc66,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5, +0x2e5,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2dc,0x2d9,0x2d9,0x2d6,0x2d6,0x642,0x2d6,0x2dc,0x645, +0x2df,0x645,0x645,0x645,0x2df,0x645,0x2dc,0x2dc,0x648,0x2e2,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6,0x2d6, +0x63f,0x63f,0x63f,0x63f,0x2d3,0x63f,0x2d6,0xada,0x2e5,0x2e5,0x2e5,0x2e5,0x2e5,0x2d0,0x2d0,0x2d0, +0x2d0,0x2d0,0x9b1,0x9b1,0x9ae,0x9ab,0x9ae,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69, +0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0xc69,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b, +0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64b,0x64e,0x64e,0x906,0x64e,0x64e,0x909,0xadd,0xadd, +0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xc1b,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c, +0xe6a,0xe6a,0xe6a,0xe6a,0xe6d,0xd2f,0xd2f,0xd2f,0x651,0x651,0xae0,0xc60,0xc60,0xc60,0xc60,0xc60, +0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xf51,0xf4e,0xf51,0xf4e,0x2f1,0x2fa,0xf51,0xf4e, +9,9,0x300,0xea9,0xea9,0xea9,0x2e8,0x14a6,9,9,9,9,0x2fd,0x2eb,0x30f,0x2ee, +0x30f,0x30f,0x30f,9,0x30f,9,0x30f,0x30f,0x306,0x657,0x657,0x657,0x657,0x657,0x657,0x657, +0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,0x657,9,0x657,0x657,0x657,0x657,0x657, +0x657,0x657,0x30f,0x30f,0x306,0x306,0x306,0x306,0x306,0x654,0x654,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x654,0x303,0x654,0x654,0x654,0x654,0x654, +0x654,0x654,0x306,0x306,0x306,0x306,0x306,0xf51,0x312,0x312,0x315,0x30f,0x30f,0x312,0x309,0x9b4, +0xb6a,0xb67,0x30c,0x9b4,0x30c,0x9b4,0x30c,0x9b4,0x30c,0x9b4,0x2f7,0x2f4,0x2f7,0x2f4,0x2f7,0x2f4, +0x2f7,0x2f4,0x2f7,0x2f4,0x2f7,0x2f4,0x2f7,0x2f4,0x312,0x312,0x309,0x303,0xb19,0xb16,0xb64,0xc6f, +0xc6c,0xc72,0xc6f,0xc6c,0xd62,0xd65,0xd65,0xd65,0x9c3,0x663,0x321,0x324,0x321,0x321,0x321,0x324, +0x321,0x321,0x321,0x321,0x324,0x9c3,0x324,0x321,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660, +0x660,0x663,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660, +0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x660,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65d,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a,0x65a, +0x65a,0x65a,0x65a,0x65a,0x9bd,0x65d,0x31b,0x31e,0x31b,0x31b,0x31b,0x31e,0x31b,0x31b,0x31b,0x31b, +0x31e,0x9bd,0x31e,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x324,0x31e,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x318,0x912,0x915,0x8f7,0x8f7,0x10fb,0x9b7,0x9b7,0xb70,0xb6d, +0x9c0,0x9ba,0x9c0,0x9ba,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b,0x321,0x31b, +0x321,0x31b,0x321,0x31b,0x321,0x324,0x31e,0x321,0x31b,0xb70,0xb6d,0x321,0x31b,0xb70,0xb6d,0x321, +0x31b,0xb70,0xb6d,0xeac,0x324,0x31e,0x324,0x31e,0x321,0x31b,0x324,0x31e,0x321,0x31b,0x324,0x31e, +0x324,0x31e,0x324,0x31e,0x321,0x31b,0x324,0x31e,0x324,0x31e,0x324,0x31e,0x321,0x31b,0x324,0x31e, +0x9c3,0x9bd,0x324,0x31e,0x324,0x31e,0x324,0x31e,0x324,0x31e,0xd6b,0xd68,0x324,0x31e,0xeaf,0xeac, +0xeaf,0xeac,0xeaf,0xeac,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9,0xbdc,0xbd9, +0xbdc,0xbd9,0xbdc,0xbd9,0xedc,0xed9,0xedc,0xed9,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc, +0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc,0xfcf,0xfcc,0x1134,0x1131,0x130e,0x130b,0x14df,0x14dc,0x14df,0x14dc, +0x14df,0x14dc,0x14df,0x14dc,0xc,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333, +0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0x333,0xc, +0xc,0x336,0x327,0x327,0x327,0x32a,0x327,0x327,0xc,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d, +0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d, +0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x32d,0x330,0xc,0x870,0x9c6,0xc, +0xc,0x14a9,0x14a9,0x13c2,0xf,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, +0x936,0x936,0x936,0x936,0x936,0x936,0xd6e,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936,0x936, +0x936,0x936,0x936,0x936,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0x339,0xeb2,0x339, +0x339,0x339,0x345,0x339,0x33c,0x339,0x339,0x348,0x939,0xd71,0xd74,0xd71,0xf,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b, +0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0x34b,0xf, +0xf,0xf,0xf,0xf,0x34b,0x34b,0x34b,0x342,0x33f,0xf,0xf,0xf,0xf,0xf,0xf,0xf, +0xf,0xf,0xf,0xf,0xc87,0xc87,0xc87,0xc87,0x13c5,0x14ac,0xf5a,0xf5a,0xf5a,0xf57,0xf57,0xd7d, +0x876,0xc81,0xc7e,0xc7e,0xc75,0xc75,0xc75,0xc75,0xc75,0xc75,0xf54,0xf54,0xf54,0xf54,0xf54,0x873, +0x14a3,0x12,0xd7a,0x879,0x12d5,0x366,0x369,0x369,0x369,0x369,0x369,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0xf5d, +0xf5d,0xf5d,0xf5d,0xf5d,0x87c,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x8fd, +0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0x8fd,0xb10,0xb10,0xb10,0xc75,0xc7b,0xc78,0xd77,0xd77,0xd77, +0xd77,0xd77,0xd77,0x12d2,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x918,0x360,0x35d, +0x35a,0x357,0xb73,0xb73,0x8fa,0x366,0x366,0x372,0x366,0x36c,0x36c,0x36c,0x36c,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366, +0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x9cc,0x9cc,0x366,0x366,0x366,0x366,0x366,0x9cc, +0x369,0x366,0x369,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x366,0x9cc, +0x366,0x366,0x366,0x369,0x375,0x366,0x351,0x351,0x351,0x351,0x351,0x351,0x351,0x34e,0x357,0x354, +0x354,0x351,0x351,0x351,0x351,0x36f,0x36f,0x351,0x351,0x357,0x354,0x354,0x354,0x351,0xc84,0xc84, +0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x363,0x9cc,0x9cc,0x9cc,0x9c9,0x9c9,0xc84, +0x9e1,0x9e1,0x9e1,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9db,0x9d8,0x9db,0x9d8,0x15,0x9e4, +0x9de,0x9cf,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de, +0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0x9de,0xc8a,0xc8a,0xc8a, +0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, +0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x9d2,0x15,0x15,0xc8a,0xc8a,0xc8a, +0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0, +0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xde0,0xfe1,0xfe1, +0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea, +0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9ea,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7,0x9e7, +0x9e7,0xb76,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef4,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7, +0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7, +0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xef7,0xeeb,0xeeb,0xeeb,0xeeb,0xeeb, +0xeeb,0xeeb,0xeeb,0xeeb,0xefa,0xefa,0xeee,0xeee,0xef1,0xf00,0xefd,0x10e,0x10e,0x10e,0x10e,0x10e, +0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x18a2,0x25e,0x25e,0x25e,0x25e,0x25e, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x17e8,0x237,0x237,0x237,0x237,0x237,0x237,0x237, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xaec,0xaec,0xaef,0xaef,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0xaec,0x72,0x72,0x72,0x72, +0x1563,0x1563,0x1563,0x1563,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1560, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d,0x161d, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x975,0x975,6,0x15,0x15,0x15,0x15,0x15,0x15,0x18, -0x18,0x15,0x15,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,6,6,6,0x15,0x15,0x15,0x15,0x15, -0x15,0x18,9,0x15,0x15,0x15,0x15,0x12,6,6,6,6,6,6,6,6, +0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x147c,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1890,0x1893,0x1893,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1752,0x1752,0x1752,0x1752,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f,0x21f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x183, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1f2,0x1f2,0x1f2,0x1f2,0x160e,0x160e, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252,0x252, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x16bc,0x16bc,0x16bc,0x16bc,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xdd7,0xdd7,0xdd4,0xdd4,0xdd4,0xdd7,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x22e,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x17eb,0x17eb,0x23a,0x17eb,0x17eb,0x23a,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x23a,0x23a,0x23a,0x23a,0x23a, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x933,0x933, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,0x933,0x933,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, -6,6,6,6,6,6,6,6,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b, -0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x975,0x975,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, -0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x24,0x24,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xd77,0xd77,0xd77,0xd77, -0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0x24,0x24,0x24,0x24, -0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x14f4,0x3cf,0x3de,0x3de, -0x39,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x39,0x3e4,0x3e4,0x39,0x39,0x3e4, -0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x3e4,0x3e4, -0x3e4,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x3e4,0x39,0x39,0x39,0x3e4,0x3e4,0x3e4,0x3e4,0x39,0x39, -0x3d2,0xcd2,0x3cf,0x3de,0x3de,0x3cf,0x3cf,0x3cf,0x3cf,0x39,0x39,0x3de,0x3de,0x39,0x39,0x3e1, -0x3e1,0x3d5,0xdc5,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x3cf,0x39,0x39,0x39,0x39, -0x3e7,0x3e7,0x39,0x3e7,0x3e4,0x3e4,0x3cf,0x3cf,0x39,0x39,0x960,0x960,0x960,0x960,0x960,0x960, -0x960,0x960,0x960,0x960,0x3e4,0x3e4,0x3db,0x3db,0x3d8,0x3d8,0x3d8,0x3d8,0x3d8,0x3db,0x3d8,0x114c, -0x3f,0x3c,0x39,0x39,0x42,0xcd5,0x3ea,0xcd8,0x42,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x42, -0x42,0x42,0x42,0x3f6,0x3f6,0x42,0x42,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6, -0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x42,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x3f6,0x42,0x3f6,0x3f9, -0x42,0x3f6,0x3f9,0x42,0x3f6,0x3f6,0x42,0x42,0x3ed,0x42,0x3f3,0x3f3,0x3f3,0x3ea,0x3ea,0x42, -0x42,0x42,0x42,0x3ea,0x3ea,0x42,0x42,0x3ea,0x3ea,0x3f0,0x42,0x42,0x42,0xfa8,0x42,0x42, -0x42,0x42,0x42,0x42,0x42,0x3f9,0x3f9,0x3f9,0x3f6,0x42,0x3f9,0x42,0x42,0x42,0x42,0x42, -0x42,0x42,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x963,0x3ea,0x3ea,0x3f6,0x3f6, -0x3f6,0xfa8,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x45,0x3fc,0x3fc,0x405, -0x45,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0xce1,0x408,0x45,0x408,0x408,0x408,0x45,0x408, -0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x408,0x45,0x408,0x408, -0x408,0x408,0x408,0x408,0x408,0x45,0x408,0x408,0x45,0x408,0x408,0x408,0x408,0x408,0x45,0x45, -0x3ff,0x408,0x405,0x405,0x405,0x3fc,0x3fc,0x3fc,0x3fc,0x3fc,0x45,0x3fc,0x3fc,0x405,0x45,0x405, -0x405,0x402,0x45,0x45,0x408,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45, -0x45,0x45,0x45,0x45,0x408,0xce1,0xcdb,0xcdb,0x45,0x45,0x966,0x966,0x966,0x966,0x966,0x966, -0x966,0x966,0x966,0x966,0x140a,0xcde,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x170d,0x48,0x48, -0x48,0x48,0x48,0x48,0x4b,0x40b,0x41a,0x41a,0x4b,0x420,0x420,0x420,0x420,0x420,0x420,0x420, -0x420,0x4b,0x4b,0x420,0x420,0x4b,0x4b,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420, -0x420,0x420,0x420,0x420,0x420,0x4b,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x4b,0x420,0x420, -0x4b,0xce4,0x420,0x420,0x420,0x420,0x4b,0x4b,0x40e,0x420,0x40b,0x40b,0x41a,0x40b,0x40b,0x40b, -0xfab,0x4b,0x4b,0x41a,0x41d,0x4b,0x4b,0x41d,0x41d,0x411,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b, -0x4b,0x4b,0x40b,0x40b,0x4b,0x4b,0x4b,0x4b,0x423,0x423,0x4b,0x420,0x420,0x420,0xfab,0xfab, -0x4b,0x4b,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x414,0xce4,0x1323,0x1323, -0x1323,0x1323,0x1323,0x1323,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4e,0x4e,0x426,0x432, -0x4e,0x432,0x432,0x432,0x432,0x432,0x432,0x4e,0x4e,0x4e,0x432,0x432,0x432,0x4e,0x432,0x432, -0x435,0x432,0x4e,0x4e,0x4e,0x432,0x432,0x4e,0x432,0x4e,0x432,0x432,0x4e,0x4e,0x4e,0x432, -0x432,0x4e,0x4e,0x4e,0x432,0x432,0x96f,0x4e,0x4e,0x4e,0x432,0x432,0x432,0x432,0x432,0x432, -0x432,0x96f,0xdc8,0x432,0x432,0x432,0x4e,0x4e,0x4e,0x4e,0x426,0x42c,0x426,0x42c,0x42c,0x4e, -0x4e,0x4e,0x42c,0x42c,0x42c,0x4e,0x42f,0x42f,0x42f,0x429,0x4e,0x4e,0xfae,0x4e,0x4e,0x4e, -0x4e,0x4e,0x4e,0x426,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xee2,0x96c, -0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x96c,0x969,0x969,0x969,0xce7,0xce7,0xce7,0xce7,0xce7, -0xce7,0xcea,0xce7,0x4e,0x4e,0x4e,0x4e,0x4e,0x14f7,0x444,0x444,0x444,0x51,0x447,0x447,0x447, -0x447,0x447,0x447,0x447,0x447,0x51,0x447,0x447,0x447,0x51,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x447,0x51,0x447,0x447,0x447,0x447,0x447,0x447, -0x447,0x447,0x447,0x447,0x14fa,0x447,0x447,0x447,0x447,0x447,0x51,0x51,0x51,0xfb7,0x438,0x438, -0x438,0x444,0x444,0x444,0x444,0x51,0x438,0x438,0x43b,0x51,0x438,0x438,0x438,0x43e,0x51,0x51, -0x51,0x51,0x51,0x51,0x51,0x438,0x438,0x51,0xfb7,0xfb7,0x1710,0x51,0x51,0x51,0x51,0x51, -0x447,0x447,0xfb1,0xfb1,0x51,0x51,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441,0x441, -0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4,0xfb4, -0x17cd,0x14fd,0x453,0x453,0x54,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x54,0x459,0x459, -0x459,0x54,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459, -0x459,0x54,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x54,0x459,0x459,0x459, -0x459,0x459,0x54,0x54,0xced,0xcf0,0x453,0x44a,0x456,0x453,0x44a,0x453,0x453,0x54,0x44a,0x456, -0x456,0x54,0x456,0x456,0x44a,0x44d,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x44a,0x44a,0x54, -0x54,0x54,0x54,0x54,0x54,0x54,0x459,0x54,0x459,0x459,0xefa,0xefa,0x54,0x54,0x450,0x450, -0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x450,0x54,0xefd,0xefd,0x54,0x54,0x54,0x54,0x54, -0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x5a,0x1500,0x465,0x465,0x57,0x46b,0x46b,0x46b, -0x46b,0x46b,0x46b,0x46b,0x46b,0x57,0x46b,0x46b,0x46b,0x57,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, -0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x465,0x45c,0x45c,0x45c,0xfba,0x57,0x465,0x465, -0x465,0x57,0x468,0x468,0x468,0x45f,0x1329,0x17d0,0x57,0x57,0x57,0x57,0x17d3,0x17d3,0x17d3,0x45c, -0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x17d0,0x1713,0x46b,0x46b,0xfba,0xfba,0x57,0x57,0x462,0x462, -0x462,0x462,0x462,0x462,0x462,0x462,0x462,0x462,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0xfbd,0x17d0,0x17d0, -0x17d0,0xfc0,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0xfc3,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, -0x46b,0x1326,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, -0x46b,0x46b,0x1326,0x5a,0x5a,0xfc3,0x45c,0x465,0x5d,0x5d,0xa38,0xa38,0x5d,0xa3e,0xa3e,0xa3e, -0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0x5d, -0x5d,0x5d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, -0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0x5d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e, -0x5d,0xa3e,0x5d,0x5d,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0xa3e,0x5d,0x5d,0x5d,0xa32,0x5d, -0x5d,0x5d,0x5d,0xa2f,0xa38,0xa38,0xa2f,0xa2f,0xa2f,0x5d,0xa2f,0x5d,0xa38,0xa38,0xa3b,0xa38, -0xa3b,0xa3b,0xa3b,0xa2f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x1503,0x1503,0x1503,0x1503,0x1503,0x1503, -0x1503,0x1503,0x1503,0x1503,0x5d,0x5d,0xa38,0xa38,0xa35,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, -0x5d,0x5d,0x5d,0x5d,0x60,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, -0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, -0x486,0x486,0x486,0x486,0x486,0x471,0x486,0x483,0x471,0x471,0x471,0x471,0x471,0x471,0x477,0x60, -0x60,0x60,0x60,0x46e,0x48c,0x48c,0x48c,0x48c,0x48c,0x486,0x489,0x474,0x474,0x474,0x474,0x474, -0x474,0x471,0x474,0x47a,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x480,0x47d,0x47d, -0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, -0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, -0x63,0x49b,0x49b,0x63,0x49b,0x63,0x63,0x49b,0x49b,0x63,0x49b,0x63,0x63,0x49b,0x63,0x63, -0x63,0x63,0x63,0x63,0x49b,0x49b,0x49b,0x49b,0x63,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b,0x49b, -0x63,0x49b,0x49b,0x49b,0x63,0x49b,0x63,0x49b,0x63,0x63,0x49b,0x49b,0x63,0x49b,0x49b,0x49b, -0x49b,0x48f,0x49b,0x498,0x48f,0x48f,0x48f,0x48f,0x48f,0x48f,0x63,0x48f,0x48f,0x49b,0x63,0x63, -0x4a4,0x4a4,0x4a4,0x4a4,0x4a4,0x63,0x4a1,0x63,0x492,0x492,0x492,0x492,0x492,0x48f,0x63,0x63, -0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x495,0x63,0x63,0x49e,0x49e,0x140d,0x140d, -0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, -0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63, -0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x66,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1, -0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0x9b1,0x9b1,0x9b1, -0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b1,0x9b4,0xa4d,0xfcf,0xfcf,0x66,0x66,0x66, -0x66,0x97e,0x97e,0x981,0x97e,0x981,0x981,0x98a,0x981,0x98a,0x97e,0x97e,0x97e,0x97e,0x97e,0x9ab, -0x97e,0x981,0x984,0x984,0x987,0x990,0x984,0x984,0x9b1,0x9b1,0x9b1,0x9b1,0x1332,0x132c,0x132c,0x132c, -0x97e,0x97e,0x97e,0x981,0x97e,0x97e,0xa41,0x97e,0x66,0x97e,0x97e,0x97e,0x97e,0x981,0x97e,0x97e, -0x97e,0x97e,0x981,0x97e,0x97e,0x97e,0x97e,0x981,0x97e,0x97e,0x97e,0x97e,0x981,0x97e,0xa41,0xa41, -0xa41,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0xa41,0x981,0xa41,0xa41,0xa41,0x66,0xa4a,0xa4a, -0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0xa44,0xa47,0xa47,0xa47,0xa47,0xa47,0xa47,0x66,0xfc6,0xa47, -0xdcb,0xdcb,0xfc9,0xfcc,0xfc6,0x114f,0x114f,0x114f,0x114f,0x132f,0x132f,0x66,0x66,0x66,0x66,0x66, +6,6,6,6,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35, +0xd35,0xd35,0xd35,0xd35,6,6,6,6,6,6,6,6,6,6,6,6, +6,6,6,6,0x14b2,0x38d,0x39c,0x39c,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x1b,0x1b,0x3a2,0x3a2,0x1b,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2, +0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x3a2,0x1b,0x3a2,0x1b, +0x1b,0x1b,0x3a2,0x3a2,0x3a2,0x3a2,0x1b,0x1b,0x390,0xc90,0x38d,0x39c,0x39c,0x38d,0x38d,0x38d, +0x38d,0x1b,0x1b,0x39c,0x39c,0x1b,0x1b,0x39f,0x39f,0x393,0xd83,0x1b,0x1b,0x1b,0x1b,0x1b, +0x1b,0x1b,0x1b,0x38d,0x1b,0x1b,0x1b,0x1b,0x3a5,0x3a5,0x1b,0x3a5,0x3a2,0x3a2,0x38d,0x38d, +0x1b,0x1b,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x91e,0x3a2,0x3a2,0x399,0x399, +0x396,0x396,0x396,0x396,0x396,0x399,0x396,0x110a,0x184b,0x1848,0x1b,0x1b,0x1e,0xc93,0x3a8,0xc96, +0x1e,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x1e,0x1e,0x1e,0x3b4,0x3b4,0x1e,0x1e,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x3b4,0x3b4, +0x3b4,0x3b4,0x3b4,0x3b4,0x3b4,0x1e,0x3b4,0x3b7,0x1e,0x3b4,0x3b7,0x1e,0x3b4,0x3b4,0x1e,0x1e, +0x3ab,0x1e,0x3b1,0x3b1,0x3b1,0x3a8,0x3a8,0x1e,0x1e,0x1e,0x1e,0x3a8,0x3a8,0x1e,0x1e,0x3a8, +0x3a8,0x3ae,0x1e,0x1e,0x1e,0xf66,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3b7,0x3b7,0x3b7, +0x3b4,0x1e,0x3b7,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x921,0x921,0x921,0x921,0x921,0x921, +0x921,0x921,0x921,0x921,0x3a8,0x3a8,0x3b4,0x3b4,0x3b4,0xf66,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x21,0x3ba,0x3ba,0x3c3,0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, +0xc9f,0x3c6,0x21,0x3c6,0x3c6,0x3c6,0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6, +0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x21,0x3c6,0x3c6, +0x21,0x3c6,0x3c6,0x3c6,0x3c6,0x3c6,0x21,0x21,0x3bd,0x3c6,0x3c3,0x3c3,0x3c3,0x3ba,0x3ba,0x3ba, +0x3ba,0x3ba,0x21,0x3ba,0x3ba,0x3c3,0x21,0x3c3,0x3c3,0x3c0,0x21,0x21,0x3c6,0x21,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x3c6,0xc9f,0xc99,0xc99, +0x21,0x21,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x924,0x13c8,0xc9c,0x21,0x21, +0x21,0x21,0x21,0x21,0x21,0x16ce,0x184e,0x184e,0x184e,0x1851,0x1851,0x1851,0x24,0x3c9,0x3d8,0x3d8, +0x24,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x24,0x3de,0x3de,0x24,0x24,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x3de,0x3de, +0x3de,0x3de,0x3de,0x3de,0x3de,0x24,0x3de,0x3de,0x24,0xca2,0x3de,0x3de,0x3de,0x3de,0x24,0x24, +0x3cc,0x3de,0x3c9,0x3c9,0x3d8,0x3c9,0x3c9,0x3c9,0xf69,0x24,0x24,0x3d8,0x3db,0x24,0x24,0x3db, +0x3db,0x3cf,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3c9,0x3c9,0x24,0x24,0x24,0x24, +0x3e1,0x3e1,0x24,0x3de,0x3de,0x3de,0xf69,0xf69,0x24,0x24,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5,0x3d5, +0x3d5,0x3d5,0x3d5,0x3d5,0x3d2,0xca2,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x12e1,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x27,0x27,0x3e4,0x3f0,0x27,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x27, +0x27,0x27,0x3f0,0x3f0,0x3f0,0x27,0x3f0,0x3f0,0x3f3,0x3f0,0x27,0x27,0x27,0x3f0,0x3f0,0x27, +0x3f0,0x27,0x3f0,0x3f0,0x27,0x27,0x27,0x3f0,0x3f0,0x27,0x27,0x27,0x3f0,0x3f0,0x92d,0x27, +0x27,0x27,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x3f0,0x92d,0xd86,0x3f0,0x3f0,0x3f0,0x27,0x27, +0x27,0x27,0x3e4,0x3ea,0x3e4,0x3ea,0x3ea,0x27,0x27,0x27,0x3ea,0x3ea,0x3ea,0x27,0x3ed,0x3ed, +0x3ed,0x3e7,0x27,0x27,0xf6c,0x27,0x27,0x27,0x27,0x27,0x27,0x3e4,0x27,0x27,0x27,0x27, +0x27,0x27,0x27,0x27,0x27,0x27,0xea0,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a, +0x927,0x927,0x927,0xca5,0xca5,0xca5,0xca5,0xca5,0xca5,0xca8,0xca5,0x27,0x27,0x27,0x27,0x27, +0x14b5,0x402,0x402,0x402,0x2a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x2a,0x405,0x405, +0x405,0x2a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405, +0x405,0x2a,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x405,0x14b8,0x405,0x405,0x405, +0x405,0x405,0x2a,0x2a,0x2a,0xf75,0x3f6,0x3f6,0x3f6,0x402,0x402,0x402,0x402,0x2a,0x3f6,0x3f6, +0x3f9,0x2a,0x3f6,0x3f6,0x3f6,0x3fc,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x3f6,0x3f6,0x2a, +0xf75,0xf75,0x16d1,0x2a,0x2a,0x2a,0x2a,0x2a,0x405,0x405,0xf6f,0xf6f,0x2a,0x2a,0x3ff,0x3ff, +0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x3ff,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a, +0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0xf72,0x178e,0x14bb,0x411,0x411,0x2d,0x417,0x417,0x417, +0x417,0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x417, +0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x417, +0x417,0x417,0x417,0x417,0x2d,0x417,0x417,0x417,0x417,0x417,0x2d,0x2d,0xcab,0xcae,0x411,0x408, +0x414,0x411,0x408,0x411,0x411,0x2d,0x408,0x414,0x414,0x2d,0x414,0x414,0x408,0x40b,0x2d,0x2d, +0x2d,0x2d,0x2d,0x2d,0x2d,0x408,0x408,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x417,0x2d, +0x417,0x417,0xeb8,0xeb8,0x2d,0x2d,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e,0x40e, +0x2d,0xebb,0xebb,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d, +0x1854,0x14be,0x423,0x423,0x30,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x30,0x429,0x429, +0x429,0x30,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429, +0x423,0x41a,0x41a,0x41a,0xf78,0x30,0x423,0x423,0x423,0x30,0x426,0x426,0x426,0x41d,0x12e7,0x1791, +0x30,0x30,0x30,0x30,0x1794,0x1794,0x1794,0x41a,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x16d4, +0x429,0x429,0xf78,0xf78,0x30,0x30,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420,0x420, +0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0xf7b,0x1791,0x1791,0x1791,0xf7e,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81, +0x33,0x33,0x9f6,0x9f6,0x33,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, +0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x33,0x33,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc, +0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x9fc, +0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x9fc,0x33,0x9fc,0x33,0x33,0x9fc,0x9fc,0x9fc,0x9fc, +0x9fc,0x9fc,0x9fc,0x33,0x33,0x33,0x9f0,0x33,0x33,0x33,0x33,0x9ed,0x9f6,0x9f6,0x9ed,0x9ed, +0x9ed,0x33,0x9ed,0x33,0x9f6,0x9f6,0x9f9,0x9f6,0x9f9,0x9f9,0x9f9,0x9ed,0x33,0x33,0x33,0x33, +0x33,0x33,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x14c1,0x33,0x33,0x9f6,0x9f6, +0x9f3,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x444,0x444,0x444, +0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444, +0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x444,0x42f,0x444,0x441, +0x42f,0x42f,0x42f,0x42f,0x42f,0x42f,0x435,0x36,0x36,0x36,0x36,0x42c,0x44a,0x44a,0x44a,0x44a, +0x44a,0x444,0x447,0x432,0x432,0x432,0x432,0x432,0x432,0x42f,0x432,0x438,0x43e,0x43e,0x43e,0x43e, +0x43e,0x43e,0x43e,0x43e,0x43e,0x43e,0x43b,0x43b,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x39,0x459,0x459,0x39,0x459,0x39,0x39,0x459, +0x459,0x39,0x459,0x39,0x39,0x459,0x39,0x39,0x39,0x39,0x39,0x39,0x459,0x459,0x459,0x459, +0x39,0x459,0x459,0x459,0x459,0x459,0x459,0x459,0x39,0x459,0x459,0x459,0x39,0x459,0x39,0x459, +0x39,0x39,0x459,0x459,0x39,0x459,0x459,0x459,0x459,0x44d,0x459,0x456,0x44d,0x44d,0x44d,0x44d, +0x44d,0x44d,0x39,0x44d,0x44d,0x459,0x39,0x39,0x462,0x462,0x462,0x462,0x462,0x39,0x45f,0x39, +0x450,0x450,0x450,0x450,0x450,0x44d,0x39,0x39,0x453,0x453,0x453,0x453,0x453,0x453,0x453,0x453, +0x453,0x453,0x39,0x39,0x45c,0x45c,0x13cb,0x13cb,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, +0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, +0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f, +0x3c,0x96f,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f,0x972, +0x96f,0x96f,0x96f,0x96f,0x972,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f,0x96f, +0x96f,0x972,0xa0b,0xf8d,0xf8d,0x3c,0x3c,0x3c,0x3c,0x93c,0x93c,0x93f,0x93c,0x93f,0x93f,0x948, +0x93f,0x948,0x93c,0x93c,0x93c,0x93c,0x93c,0x969,0x93c,0x93f,0x942,0x942,0x945,0x94e,0x942,0x942, +0x96f,0x96f,0x96f,0x96f,0x12f0,0x12ea,0x12ea,0x12ea,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x9ff,0x93c, +0x3c,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x93c,0x93c,0x93c,0x93f, +0x93c,0x93c,0x93c,0x93c,0x93f,0x93c,0x9ff,0x9ff,0x9ff,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c,0x93c, +0x9ff,0x93f,0x9ff,0x9ff,0x9ff,0x3c,0xa08,0xa08,0xa05,0xa05,0xa05,0xa05,0xa05,0xa05,0xa02,0xa05, +0xa05,0xa05,0xa05,0xa05,0xa05,0x3c,0xf84,0xa05,0xd89,0xd89,0xf87,0xf8a,0xf84,0x110d,0x110d,0x110d, +0x110d,0x12ed,0x12ed,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3c,0x468,0x468,0x468,0x468,0x468,0x468,0x3f,0x13d1,0x3f,0x3f,0x3f,0x3f, +0x3f,0x13d1,0x3f,0x3f,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465, +0x465,0x465,0x465,0x465,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0x42,0xa35,0xa35, +0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0x42,0xa35,0x42,0xa35,0xa35, +0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0x42,0xa35,0xa35, +0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0x42,0xa35,0xa35,0xa35,0xa35,0x42,0x42, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0x42,0xa35,0x42,0xa35,0xa35,0xa35,0xa35,0x42,0x42, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0x42, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98, +0xa35,0x42,0xa35,0xa35,0xa35,0xa35,0x42,0x42,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0x42,0x42,0x12f3,0x12f3,0xd92,0xd95,0xa2f,0xa38,0xa2c,0xa2c,0xa2c,0xa2c,0xa38, +0xa38,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa32,0xa29,0xa29,0xa29,0xa29,0xa29,0xa29, +0xa29,0xa29,0xa29,0xa29,0xa29,0x42,0x42,0x42,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0x16da,0x45,0x45, +0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x16d7,0x45,0x45,0xa4d,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50, +0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50,0xa50, +0xa50,0xa50,0xa50,0xa4a,0xa47,0x48,0x48,0x48,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, +0xa56,0xa56,0xa56,0xa53,0xa53,0xa53,0xa56,0xa56,0xa56,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4,0x14c4, +0x14c4,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa59,0xa77, +0xa77,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5c,0xa5f,0xa5c,0xa6e,0xa6e,0xa71,0xa7a, +0xa68,0xa65,0xa6e,0xa6b,0xa7a,0xcb1,0x4e,0x4e,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, +0xa74,0xa74,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4,0xcb4, +0xcb4,0xcb4,0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0xa89,0xa89,0xb07,0xb0a,0xa8f,0xb04,0xa8c,0xa89, +0xa92,0xaa1,0xa95,0xaa4,0xaa4,0xaa4,0xa80,0x51,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, +0xa98,0xa98,0x51,0x51,0x51,0x51,0x51,0x51,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa83,0xfae,0x51,0x51,0x51,0x51,0x51,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x54,0x54, +0x489,0x489,0x489,0x489,0x489,0x489,0x54,0x54,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x54,0x489,0x54,0x489,0x54,0x489,0x54,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x486,0x486,0x486,0x486,0x486,0x486,0x54,0x54,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x480,0x486,0x480,0x480,0x47d,0x486,0x486,0x486,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x47d,0x47d,0x47d,0x486,0x486,0x486,0x486,0x54,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x54,0x47d,0x47d,0x47d,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x47d,0x47d,0x47d,0x54,0x54,0x486,0x486,0x486,0x54,0x486,0x486, +0x489,0x489,0x489,0x489,0x489,0x483,0x480,0x54,0xb7c,0xb7f,0xb7f,0xb7f,0xfb7,0x57,0x14a0,0x14a0, +0x14a0,0x14a0,0x492,0x492,0x492,0x492,0x492,0x492,0x4dd,0xb91,0x5a,0x5a,0x699,0x4dd,0x4dd,0x4dd, +0x4dd,0x4dd,0x4e3,0x4f5,0x4e3,0x4ef,0x4e9,0x69c,0x4da,0x696,0x696,0x696,0x696,0x4da,0x4da,0x4da, +0x4da,0x4da,0x4e0,0x4f2,0x4e0,0x4ec,0x4e6,0x5a,0xda1,0xda1,0xda1,0xda1,0xda1,0x12f6,0x12f6,0x12f6, +0x12f6,0x12f6,0x12f6,0x12f6,0x12f6,0x5a,0x5a,0x5a,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d, +0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x504,0x504,0x504,0x504,0x504,0x504,0x504,0x504, +0x504,0x504,0x504,0x504,0x504,0x501,0x501,0x501,0x501,0x504,0xab6,0xab6,0xb97,0xb9d,0xb9d,0xb9a, +0xb9a,0xb9a,0xb9a,0xda7,0xebe,0xebe,0xebe,0xebe,0x10f8,0x60,0x60,0x60,0x60,0x60,0x60,0x60, +0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x534,0x534,0x534,0xabf,0xec7,0xfbd,0xfbd,0xfbd, +0xfbd,0x1254,0x16e0,0x16e0,0x63,0x63,0x63,0x63,0x6c3,0x6c3,0x6c3,0x6c3,0x6c6,0x6c6,0x6c6,0x6c6, +0x6c6,0x6c6,0x540,0x540,0x53d,0x53d,0x53d,0x53d,0x567,0x567,0x567,0x567,0x567,0xac8,0xac8,0x66, 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, -0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x4aa,0x4aa,0x4aa,0x4aa, -0x4aa,0x4aa,0x69,0x1413,0x69,0x69,0x69,0x69,0x69,0x1413,0x69,0x69,0x4a7,0x4a7,0x4a7,0x4a7, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xdda,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0x6c,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xdda,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda, -0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0x6c, -0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda,0xa77,0x6c,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0x6c,0x6c,0x1335,0x1335,0xdd4, -0xdd7,0xa71,0xa7a,0xa6e,0xa6e,0xa6e,0xa6e,0xa7a,0xa7a,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74,0xa74, -0xa74,0xa74,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0xa6b,0x6c,0x6c,0x6c, -0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, -0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0x1719,0x6f,0x6f,0x1716,0x1716,0x1716,0x1716,0x1716,0x1716,0x6f,0x6f, -0xa8f,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92, -0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa92,0xa8c,0xa89,0x72,0x72,0x72, -0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa95,0xa95,0xa95,0xa98,0xa98, -0xa98,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x1506,0x75,0x75,0x75,0x75,0x75,0x75,0x75, -0xab9,0xab9,0xab9,0xab9,0xab9,0xab9,0xa9b,0xab9,0xab9,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e,0xa9e, -0xa9e,0xa9e,0xaa1,0xa9e,0xab0,0xab0,0xab3,0xabc,0xaaa,0xaa7,0xab0,0xaad,0xabc,0xcf3,0x78,0x78, -0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0xab6,0x78,0x78,0x78,0x78,0x78,0x78, -0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0x78,0x78,0x78,0x78,0x78,0x78, -0xacb,0xacb,0xb49,0xb4c,0xad1,0xb46,0xace,0xacb,0xad4,0xae3,0xad7,0xae6,0xae6,0xae6,0xac2,0x7b, -0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0xada,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xac5,0xff0,0x7b,0x7b,0x7b,0x7b,0x7b, -0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x7e,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x7e,0x7e, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x4cb,0x7e,0x4cb,0x7e,0x4cb,0x7e,0x4cb, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x7e, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4c2,0x4c8,0x4c2, -0x4c2,0x4bf,0x4c8,0x4c8,0x4c8,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4bf,0x4bf,0x4bf, -0x4c8,0x4c8,0x4c8,0x4c8,0x7e,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x7e,0x4bf,0x4bf,0x4bf, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4bf,0x4bf,0x4bf, -0x7e,0x7e,0x4c8,0x4c8,0x4c8,0x7e,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4c5,0x4c2,0x7e, -0xbbe,0xbc1,0xbc1,0xbc1,0xff9,0x81,0x14e5,0x14e5,0x14e5,0x14e5,0x4d4,0x4d4,0x4d4,0x4d4,0x4d4,0x4d4, -0x51f,0xbd3,0x84,0x84,0x6db,0x51f,0x51f,0x51f,0x51f,0x51f,0x525,0x537,0x525,0x531,0x52b,0x6de, -0x51c,0x6d8,0x6d8,0x6d8,0x6d8,0x51c,0x51c,0x51c,0x51c,0x51c,0x522,0x534,0x522,0x52e,0x528,0x84, -0xde3,0xde3,0xde3,0xde3,0xde3,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x1338,0x84,0x84,0x84, -0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x540,0x756,0x53d,0x9ba,0x9db,0xaf5,0xaf5,0xaf5, -0xbd6,0xbd6,0xde6,0xde6,0xde6,0xde6,0x1167,0x116a,0x116a,0x133b,0x14df,0x1509,0x150c,0x150c,0x171c,0x87, -0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, -0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x543,0x543,0x543, -0x543,0x546,0xaf8,0xaf8,0xbd9,0xbdf,0xbdf,0xbdc,0xbdc,0xbdc,0xbdc,0xde9,0xf00,0xf00,0xf00,0xf00, -0x113a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a, -0x576,0x576,0x576,0xb01,0xf09,0xfff,0xfff,0xfff,0xfff,0x1296,0x171f,0x171f,0x8d,0x8d,0x8d,0x8d, -0x705,0x705,0x705,0x705,0x708,0x708,0x708,0x708,0x708,0x708,0x582,0x582,0x57f,0x57f,0x57f,0x57f, -0xf0f,0xf0f,0xf0f,0xf0c,0xf0c,0xf0c,0xf0c,0xf0c,0x1170,0x13bc,0x13bc,0x13bc,0x13bc,0x133e,0x133e,0x133e, -0x13bf,0x1341,0x1341,0x13bf,0x150f,0x150f,0x150f,0x150f,0x1512,0x1512,0x1512,0x17d6,0x17d6,0x17d6,0x17d6,0x90, -0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0xb0a,0xb0a,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, -0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93, -0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x5ac,0x96,0x96,0x96,0x96,0x96, -0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96,0x96, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0x99,0xb25,0xb25,0xb25,0xb25,0xb28, +0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a,0x56a, +0x56a,0x56a,0x56a,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69, +0x69,0x69,0x69,0x69,0x69,0x69,0x69,0x69,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0x6c,0xae3,0xae3,0xae3,0xae3,0xae6,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae6,0x6c,0x6c,0x6c,0x6c, +0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, +0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0x6f,0x6f, +0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x75,0x7ef,0x7e9,0x7ef,0x7e9,0x7ef,0x7e9,0x7ef, +0x7e9,0x7ef,0x7e9,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9, +0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7e9,0x7e9,0x7e9,0x7ef,0x7e9,0x7ef,0x7e9,0x7ef, +0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7ef,0x7e9,0x7e9,0x7e9,0x7e9,0x7e9,0x7ec,0xc3f,0xc3f,0x75, +0x75,0x90f,0x90f,0x8d9,0x8d9,0x7f2,0x7f5,0xc3c,0x78,0x78,0x78,0x78,0x78,0x807,0x807,0x807, +0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807, +0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x807,0x10e6,0x18c3,0x78,0x7b,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x7b, +0x8e2,0x8e2,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5,0x8e5, +0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5, +0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0xaf5,0x1389,0x1389,0x1389,0x7e,0x7e,0x7e,0x7e,0x7e, +0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, +0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0xd41,0xd41,0x81, +0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, +0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x81, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0x84,0x84,0x84, +0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01, +0xb01,0xc48,0xb01,0xb01,0xb01,0xc48,0xb01,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, +0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x993,0x993,0x993,0x993,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a,0x8a, +0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, +0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8d,0x8d,0x5b2,0x5b2,0x5b2,0x5b2,0x5b2,0x8d,0x8d,0x8d,0x8d,0x8d,0xad4,0x5b5,0x5bb, +0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5b8,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb, +0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x8d,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x8d,0x5bb,0x8d, +0x5bb,0x5bb,0x8d,0x5bb,0x5bb,0x8d,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5be, +0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x1308,0x1308,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d6,0x5d0, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0x5d3,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d0,0x5d3,0x5d0,0x5d0,0x5d3,0x5d3,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d3,0x5d3,0x5d3,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3, +0x90,0x90,0x5d3,0x5d3,0x5d3,0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d3,0x5d0,0x5d0,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c,0xb1c, +0x5d6,0x5d6,0x930,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5cd,0x5cd,0xbd3,0xd59,0x90,0x90, +0x82b,0x83d,0x83a,0x83d,0x83a,0xc5d,0xc5d,0xd4d,0xd4a,0x82e,0x82e,0x82e,0x82e,0x840,0x840,0x840, +0x858,0x85b,0x86a,0x93,0x85e,0x861,0x86d,0x86d,0x855,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x849, +0x849,0x864,0x864,0x867,0x864,0x864,0x864,0x93,0x864,0x852,0x84f,0x849,0x93,0x93,0x93,0x93, +0x5e2,0x5ee,0x5e2,0xbd6,0x5e2,0x96,0x5e2,0x5ee,0x5e2,0x5ee,0x5e2,0x5ee,0x5e2,0x5ee,0x5e2,0x5ee, +0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb, +0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x96,0x96,0x5df, +0x732,0x735,0x74a,0x74d,0x72c,0x735,0x735,0x9c,0x717,0x71a,0x71a,0x71a,0x71a,0x717,0x717,0x9c, +0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xad7,0xad7,0xad7,0x996,0x711,0x5f1,0x5f1, +0x9c,0x75c,0x73b,0x72c,0x735,0x732,0x72c,0x73e,0x72f,0x729,0x72c,0x74a,0x741,0x738,0x759,0x72c, +0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x756,0x747,0x744,0x74a,0x74a,0x74a,0x75c, +0x720,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, +0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c, +0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, +0x9c,0x9c,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x9c,0x9c,0x71d,0x71d,0x71d,0x9c,0x9c,0x9c, +0xb1f,0xb1f,0xb1f,0xb1f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x9f,0x1860,0x1860,0x1860, 0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb28,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, -0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, -0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c,0x9c, -0xa2,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x837,0x83a,0x837,0x83a,0x837, -0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837, -0x837,0x837,0x837,0x83d,0x837,0x83d,0x837,0x83d,0x837,0x837,0x837,0x837,0x837,0x837,0x83d,0x837, -0x837,0x837,0x837,0x837,0x83a,0xc81,0xc81,0xa2,0xa2,0x951,0x951,0x91b,0x91b,0x840,0x843,0xc7e, -0xa5,0xa5,0xa5,0xa5,0xa5,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, -0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855,0x855, -0x855,0x1128,0xa8,0xa5,0xab,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0xab,0x924,0x924,0x927,0x927,0x927,0x927,0x927,0x927, -0x927,0x927,0x927,0x927,0x927,0x927,0x927,0x927,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37, -0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37,0xb37, -0x13cb,0x13cb,0x13cb,0xae,0xae,0xae,0xae,0xae,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861, -0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861,0x861, -0x861,0x861,0x861,0x861,0x861,0xd83,0xd83,0xb1,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867, -0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867, -0x867,0x867,0x867,0x867,0x867,0x867,0x867,0xb1,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb4,0xb4,0xb4,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc8a,0xb43,0xb43,0xb43,0xc8a,0xb43,0xb7, -0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, -0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x9d5,0x9d5,0x9d5,0x9d5,0xba,0xba,0xba,0xba, -0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f, -0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x123f,0x606,0x606,0x606,0x606,0x606,0x606,0x606,0xbd, -0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0x5f4,0x5f4,0x5f4,0x5f4,0x5f4, -0xbd,0xbd,0xbd,0xbd,0xbd,0xb16,0x5f7,0x5fd,0x603,0x603,0x603,0x603,0x603,0x603,0x603,0x603, -0x603,0x5fa,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0xbd, -0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0xbd,0x5fd,0xbd,0x5fd,0x5fd,0xbd,0x5fd,0x5fd,0xbd,0x5fd,0x5fd, -0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x5fd,0x600,0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612, -0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x134a,0x134a,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, -0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x618,0x612,0x615,0x61b,0x618, -0x612,0x618,0x612,0x618,0x612,0x618,0x618,0x612,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, -0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x615,0x612,0x615,0x615,0x615,0x615,0x615,0x615, -0x612,0x615,0x612,0x612,0x615,0x615,0x612,0x612,0x612,0x612,0x612,0x615,0x612,0x612,0x615,0x612, -0x615,0x615,0x615,0x612,0x615,0x615,0x615,0x615,0xc0,0xc0,0x615,0x615,0x615,0x615,0x612,0x612, -0x615,0x612,0x612,0x612,0x612,0x615,0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x612,0x612, -0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, -0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0x618,0x618,0x972,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x60f,0x60f,0xc15,0xd9b,0xc0,0xc0,0x879,0x88b,0x888,0x88b,0x888,0xc9f,0xc9f,0xd8f, -0xd8c,0x87c,0x87c,0x87c,0x87c,0x88e,0x88e,0x88e,0x8a6,0x8a9,0x8b8,0xc3,0x8ac,0x8af,0x8bb,0x8bb, -0x8a3,0x89a,0x894,0x89a,0x894,0x89a,0x894,0x897,0x897,0x8b2,0x8b2,0x8b5,0x8b2,0x8b2,0x8b2,0xc3, -0x8b2,0x8a0,0x89d,0x897,0xc3,0xc3,0xc3,0xc3,0x624,0x630,0x624,0xc18,0x624,0xc6,0x624,0x630, -0x624,0x630,0x624,0x630,0x624,0x630,0x624,0x630,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a, -0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d, -0x627,0x62d,0x627,0x62d,0x627,0xc6,0xc6,0x621,0x777,0x77a,0x78f,0x792,0x771,0x77a,0x77a,0xcc, -0x759,0x75c,0x75c,0x75c,0x75c,0x759,0x759,0xcc,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9,0xc9, -0xc9,0xb19,0xb19,0xb19,0x9d8,0x753,0x633,0x633,0xcc,0x7a1,0x780,0x771,0x77a,0x777,0x771,0x783, -0x774,0x76e,0x771,0x78f,0x786,0x77d,0x79e,0x771,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b,0x79b, -0x79b,0x79b,0x78c,0x789,0x78f,0x78f,0x78f,0x7a1,0x762,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, -0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, -0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0xcc,0xcc,0xcc,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, -0xcc,0xcc,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0xcc,0xcc,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, -0xcc,0xcc,0x75f,0x75f,0x75f,0xcc,0xcc,0xcc,0xb61,0xb61,0xb61,0xb61,0xcf,0xcf,0xcf,0xcf, -0xcf,0xcf,0xcf,0xcf,0xcf,0xd2,0xd2,0xd2,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67, -0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xb67,0xd5,0xd5,0xd5,0xd5,0xd5, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, -0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70, -0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xdb,0xdb,0x100b,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0x1725,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, -0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb,0xdb, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xde,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb94,0xde,0xb94,0xb94, -0xde,0xde,0xb94,0xde,0xde,0xb94,0xb94,0xde,0xde,0xb94,0xb94,0xb94,0xb94,0xde,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xde,0xb91,0xde,0xb91,0xb91,0xb91, -0xb91,0xd14,0xb91,0xb91,0xde,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xde,0xb94,0xb94,0xb94,0xb94,0xde,0xde,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xde,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xde,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xde,0xb94,0xb94,0xb94,0xb94,0xde, -0xb94,0xb94,0xb94,0xb94,0xb94,0xde,0xb94,0xde,0xde,0xde,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xde,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xe01,0xe01,0xde,0xde,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb8b, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xf18,0xf15,0xde,0xde,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e, -0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xe1,0xb9a,0xe1,0xe1, -0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1, -0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xe1,0xc27,0xc27,0xc27,0xc27, -0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xc27,0xe4,0xc27,0xc27,0xc27,0xc27,0xc21,0xc21, -0xc24,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xc30,0xc30,0xc30,0xc30, -0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc30,0xc2a,0xc2a, -0xc2d,0xc93,0xc93,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xe7,0xc36,0xc36,0xc36,0xc36, -0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc36,0xc33,0xc33, -0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xc3c,0xc3c,0xc3c,0xc3c, -0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xc3c,0xed,0xc3c,0xc3c,0xc3c,0xed,0xc39,0xc39, -0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xd26,0xd26,0xd26,0xd26, +0xb25,0xb25,0xb25,0xa2,0xa2,0xa2,0xa2,0xa2,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xa8, +0xa8,0xfc9,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6,0x16e6, +0x16e6,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8, +0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xab,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xab,0xb52,0xb52,0xab,0xab,0xb52,0xab,0xab,0xb52,0xb52,0xab, +0xab,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f, +0xb4f,0xb4f,0xab,0xb4f,0xab,0xb4f,0xb4f,0xb4f,0xb4f,0xcd2,0xb4f,0xb4f,0xab,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xab,0xb52, +0xb52,0xb52,0xb52,0xab,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb52,0xb52,0xab,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb52,0xab, +0xab,0xab,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xab,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xdbf,0xdbf,0xab,0xab,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xed6,0xed3, +0xab,0xab,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb4c,0xb4c,0xb4c,0xb4c,0xae,0xb58,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae, +0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae,0xae, +0xae,0xae,0xae,0xae,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5,0xbe5, +0xbe5,0xb1,0xbe5,0xbe5,0xbe5,0xbe5,0xbdf,0xbdf,0xbe2,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1, +0xb1,0xb1,0xb1,0xb1,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbee, +0xbee,0xbee,0xbee,0xbee,0xbee,0xbee,0xbe8,0xbe8,0xbeb,0xc51,0xc51,0xb4,0xb4,0xb4,0xb4,0xb4, +0xb4,0xb4,0xb4,0xb4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4, +0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf1,0xbf1,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7,0xb7, +0xb7,0xb7,0xb7,0xb7,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, +0xbfa,0xba,0xbfa,0xbfa,0xbfa,0xba,0xbf7,0xbf7,0xba,0xba,0xba,0xba,0xba,0xba,0xba,0xba, +0xba,0xba,0xba,0xba,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4, +0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4,0xce4, +0xce4,0x14e2,0x14e2,0xbd,0xcd5,0xcd5,0xcd5,0xce1,0xce1,0xce1,0xce1,0xcd5,0xcd5,0xce1,0xce1,0xce1, +0xbd,0xbd,0xbd,0xbd,0xce1,0xce1,0xcd5,0xce1,0xce1,0xce1,0xce1,0xce1,0xce1,0xcd8,0xcd8,0xcd8, +0xbd,0xbd,0xbd,0xbd,0xcdb,0xbd,0xbd,0xbd,0xce7,0xce7,0xcde,0xcde,0xcde,0xcde,0xcde,0xcde, +0xcde,0xcde,0xcde,0xcde,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xcea, +0xcea,0xcea,0xcea,0xcea,0xcea,0xcea,0xc0,0xc0,0xcea,0xcea,0xcea,0xcea,0xcea,0xc0,0xc0,0xc0, +0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0xc3,0xc3,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0xc3,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0x14e5,0xc3,0xc3,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5, +0x14e5,0xc3,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x14e5,0x1863,0xc3,0xc3,0xc3,0xc3,0xc3, +0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x16e9,0x16e9,0x16e9,0x16e9,0xc3,0xc3,0xc3,0xc3, +0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xc6,0xd11,0xd11,0xc6,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,0xc6,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xd11, +0xd11,0xd11,0xd11,0xd11,0xd11,0xd11,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, +0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6, +0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xc9,0xc9,0xc9,0xc9,0xc9,0xd56,0xd56,0xd56,0xcc,0xcc,0xcc,0xcc,0xd50, +0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, +0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xcc,0xcc,0xcc,0xd53,0xd53,0xd53,0xd53,0xd53, +0xd53,0xd53,0xd53,0xd53,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a, +0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a,0xd1a, +0xd1a,0xd1a,0xcf,0xd17,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, +0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23,0xd23, +0xd23,0xd23,0xd2,0xd2,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd2,0xd2, +0xd2,0xd2,0xd2,0xd2,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, +0x1821,0x1821,0x1821,0x1821,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd5,0xd5,0xd26,0xd5,0xd26,0xd26, 0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26, -0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0x1524,0x1524,0xf0,0xd17,0xd17,0xd17,0xd23, -0xd23,0xd23,0xd23,0xd17,0xd17,0xd23,0xd23,0xd23,0xf0,0xf0,0xf0,0xf0,0xd23,0xd23,0xd17,0xd23, -0xd23,0xd23,0xd23,0xd23,0xd23,0xd1a,0xd1a,0xd1a,0xf0,0xf0,0xf0,0xf0,0xd1d,0xf0,0xf0,0xf0, -0xd29,0xd29,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd20,0xd2c,0xd2c,0xd2c,0xd2c, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xf3,0xf3, -0xd2c,0xd2c,0xd2c,0xd2c,0xd2c,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3,0xf3, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, -0x1527,0x1527,0x1527,0x1527,0xf6,0xf6,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0xf6,0xf6, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0xf6,0xf6,0xf6,0x1527,0x1527,0x1527, -0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527,0xf6,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, -0x1527,0x1527,0xf9,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, -0x1728,0x1728,0x1728,0x1728,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, -0xf6,0xf6,0xf6,0xf6,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xfc,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xd53,0xd53,0xfc,0xd53, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xfc, -0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xd53,0xfc,0xfc, -0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, -0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, -0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xff,0xff,0xff,0xff,0xff, -0xd98,0xd98,0xd98,0x102,0x102,0x102,0x102,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92, -0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92,0xd92, -0x102,0x102,0x102,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd95,0xd5c,0xd5c,0xd5c,0xd5c, -0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c, -0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0xd5c,0x105,0xd59,0xd65,0xd65,0xd65,0xd65, -0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65, -0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0xd65,0x108,0x108,0xd62,0xd62,0xd62,0xd62, -0xd62,0xd62,0xd62,0xd62,0xd62,0xd62,0x108,0x108,0x108,0x108,0x108,0x108,0x1860,0x1860,0x1860,0x1860, -0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0xd68,0xd68,0xd68,0xd68, -0xd68,0xd68,0x10b,0x10b,0xd68,0x10b,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68, -0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0xd68,0x10b,0xd68, -0xd68,0x10b,0x10b,0x10b,0xd68,0x10b,0x10b,0xd68,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, -0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0x10e, -0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0x10e,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0x152a,0x152a,0x17d9,0x17d9,0x114,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107,0x1107, -0x1107,0x1107,0x1107,0x1107,0x171,0x171,0x171,0x171,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, -0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe25, -0xe25,0xe2b,0xe2b,0xe25,0x117,0x117,0xe28,0xe28,0x1137,0x1137,0x1137,0x1137,0x11a,0x11a,0x11a,0x11a, -0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0x11a,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90, -0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0xc90,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x152d, -0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x152d,0x1530,0x120,0x120, -0x120,0x120,0x11d,0x17dc,0x1356,0x1179,0xf27,0xf27,0xe40,0xe3d,0xe40,0xe3d,0xe3d,0xe34,0xe34,0xe34, -0xe34,0xe34,0xe34,0x1182,0x117f,0x1182,0x117f,0x117c,0x117c,0x117c,0x141c,0x1419,0x123,0x123,0x123,0x123, -0x123,0xe3a,0xe37,0xe37,0xe37,0xe34,0xe3a,0xe37,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43, -0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126, -0x126,0x126,0x126,0x126,0x126,0x126,0x126,0x126,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126, -0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126, -0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0x126,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49, -0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46,0xe46, -0xe46,0xe46,0x129,0x129,0x129,0x129,0x129,0x129,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0x12c,0x141f, -0x12c,0x12c,0x12c,0x12c,0x12c,0x141f,0x12c,0x12c,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6, -0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, -0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0x12f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f, -0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0xe4f,0x12f,0xe64,0xe58,0xe58,0xe58,0x132,0xe58,0xe58,0x132, -0x132,0x132,0x132,0x132,0xe58,0xe58,0xe58,0xe58,0xe64,0xe64,0xe64,0xe64,0x132,0xe64,0xe64,0xe64, -0x132,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, -0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0x132,0x132,0x132,0x132,0xe55,0xe55,0xe55,0x132, -0x132,0x132,0x132,0xe5b,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0xe5e,0x132,0x132,0x132,0x132, -0x132,0x132,0x132,0x132,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe67,0xe67,0xe5e,0x132,0x132,0x132, -0x132,0x132,0x132,0x132,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0x1188,0x1188, -0x135,0x135,0x135,0x135,0xe73,0xe73,0xe73,0xe73,0xe73,0xe76,0xe76,0xe76,0xe73,0xe73,0xe76,0xe73, -0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0x135,0x135,0x135,0x135,0x135,0x135, -0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0xe70,0x1185,0x135,0x135,0x135,0xe6d,0xe6d, -0xe7c,0xe7c,0xe7c,0xe7c,0x138,0x138,0x138,0x138,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, -0xe79,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138,0x138, -0x1539,0x153f,0x153c,0x1884,0x17df,0x13e,0x13e,0x13e,0x13e,0x13e,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b, -0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b, -0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0x13b,0xea3,0xea3,0xea3,0xea0, -0xea0,0xe97,0xe97,0xea0,0xe9d,0xe9d,0xe9d,0xe9d,0x141,0x141,0x141,0x141,0x12f3,0x12f3,0x12f3,0x12f3, -0x12f3,0x12f3,0x12f6,0x12f6,0x12f9,0x12f6,0x198,0x198,0x198,0x198,0x198,0x198,0xea6,0xea6,0xea6,0xea6, -0xea6,0xea6,0x142b,0x142b,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0xea9,0x135c,0x144,0x144,0x144, -0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x144,0x1359,0xc63,0xc63,0xc63,0xc63, -0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xc63,0xed6,0xec7,0xec1,0xed3, -0xed0,0xeca,0xeca,0xed9,0xec4,0xecd,0x147,0x147,0x147,0x147,0x147,0x147,0xf5a,0xf5a,0xf45,0xf5a, -0xf5d,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0x14d,0x14d,0x14d,0x14d,0xf54,0xf54,0xf54,0xf54, -0xf54,0xf54,0xf54,0xf54,0xf54,0xf54,0xf66,0xf66,0xf4b,0xf51,0xf66,0xf66,0xf4e,0xf4b,0xf4b,0xf4b, -0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, -0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0x14d,0x14d,0x14d,0x1362,0x135f,0x1362,0x135f, -0x1362,0x135f,0x1362,0x135f,0x1362,0x135f,0x1431,0x154b,0x154b,0x154b,0x17e2,0x150,0x154b,0x154b,0x1731,0x1731, -0x1731,0x172b,0x1731,0x172b,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, -0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x150, -0x150,0x150,0x150,0x150,0x150,0x150,0x150,0x1548,0x1434,0x1434,0x135f,0x1062,0x1062,0x1062,0x1062,0x1062, -0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75, -0xf75,0xf75,0xf75,0xf75,0xf72,0xf72,0xf78,0xf78,0x153,0x153,0x153,0x153,0x153,0x153,0x153,0x153, -0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf81, -0xf81,0xf81,0xf81,0xf81,0xf81,0xf81,0xf7b,0xf7b,0xf7b,0xf7b,0x1191,0x1191,0x156,0x156,0x156,0xf7e, -0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e, -0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x1734,0x159,0x159,0x159,0x159,0x159,0x159, -0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159, -0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0x159,0xf8a,0xf8a,0xf8a,0x1554, -0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x1554,0x15c,0xf87,0xf87,0xf87,0xf87, -0x1551,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0x15c,0xf8d,0xf8d,0xf8d,0xf8d, -0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0xf8d,0x15f,0x15f, -0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x15f,0x1089,0x1089,0x1089,0x1089, -0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1086,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077,0x1077, -0x1086,0x1086,0x107d,0x107a,0x162,0x162,0x162,0x108c,0x108c,0x1080,0x1080,0x1080,0x1083,0x1083,0x1083,0x1083, -0x1083,0x1083,0x1083,0x1083,0x1083,0x1083,0x162,0x162,0x162,0x1089,0x1089,0x1089,0x108f,0x108f,0x108f,0x108f, -0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x10a4,0x10a4,0x10a4,0x10a4, -0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a7,0x10a7,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165, -0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x10ce,0x10ce,0x10ce,0x10ce, -0x10c8,0x17e5,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x168,0x10d4,0x10d4,0x10cb,0x10cb,0x10cb,0x10cb, -0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x10cb,0x168,0x168,0x168,0x168,0x168,0x168,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10e6,0x10ec,0x10ef, -0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x16b,0x10e9,0x1101,0x1101,0x1101,0x1101, -0x1101,0x1101,0x1101,0x1101,0x1101,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10fe,0x10fe,0x10f5,0x10f5,0x10fe, -0x10fe,0x10f5,0x10f5,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x16e,0x1101,0x1101,0x1101,0x10f5, -0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x10f5,0x10fe,0x16e,0x16e,0x10fb,0x10fb,0x10fb,0x10fb, -0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x10fb,0x16e,0x16e,0x10f8,0x1104,0x1104,0x1104,0x1560,0x171,0x171,0x171, -0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171, -0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x171,0x110a,0x110a,0x110a,0x110a, -0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a, -0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110a,0x110d,0x174,0x174,0x1110,0x1110,0x1110,0x1110, -0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110, -0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x1110,0x177,0x177,0x177,0x1113,0x1113,0x1113,0x1113, -0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x17a,0x17a,0x17a, -0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x17a,0x1119,0x1119,0x1119,0x1119, -0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x1119, -0x1119,0x1119,0x1119,0x1119,0x1119,0x1119,0x17d,0x17d,0x17d,0x17d,0x17d,0x1116,0x111c,0x111c,0x111c,0x111c, -0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x180,0x180,0x180,0x180,0x111f,0x111f,0x111f,0x111f, -0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, -0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x183,0x1197,0x1197,0x1197,0x1197, -0x11a0,0x1197,0x1197,0x1197,0x11a0,0x1197,0x1197,0x1197,0x1197,0x1194,0x186,0x186,0x119d,0x119d,0x119d,0x119d, -0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x186,0x11a3,0x11a3,0x11a3,0x11a3, -0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, -0x11a3,0x11a3,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11bb,0x11a6,0x11bb,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x18c,0x11af,0x11b8,0x11a6,0x11b8, -0x11b8,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11a6,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11a6, -0x11a6,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x18c,0x18c,0x11a9,0x11b5,0x11b5,0x11b5,0x11b5, -0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x11b5,0x11b5,0x11b5,0x11b5, -0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x11b5,0x18c,0x18c,0x18c,0x18c,0x18c,0x18c,0x11b2,0x11b2,0x11b2,0x11b2, -0x11b2,0x11b2,0x11b2,0x11c1,0x11c4,0x11c4,0x11c4,0x11c4,0x11b2,0x11b2,0x18c,0x18c,0x15ab,0x15ab,0x15ab,0x15ab, -0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15ab,0x15a8,0x210,0x1308,0x12e7,0x1302,0x1302, -0x1302,0x1302,0x1302,0x1302,0x1302,0x12ea,0x12ea,0x12ea,0x12ea,0x1302,0x12ea,0x12ea,0x12ea,0x12ea,0x12f0,0x14d6, -0x14dc,0x14d9,0x14d3,0x192,0x1701,0x1701,0x18f,0x18f,0x18f,0x18f,0x18f,0x18f,0x11d9,0x11d9,0x11d9,0x11d9, -0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d0,0x11d0,0x11d3,0x11dc, -0x11d6,0x11d6,0x11d6,0x11dc,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x11df,0x11df,0x11df,0x11df, -0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x11df,0x130e,0x11e5,0x1311, -0x11e5,0x11e5,0x11e5,0x11e5,0x11e2,0x11e2,0x11e2,0x11e5,0x173a,0x173d,0x19b,0x19b,0x12d5,0x12d5,0x12d5,0x12d5, -0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5, -0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x12d5,0x19e,0x19e,0x19e,0x11fa,0x11ee,0x11ee,0x11ee, -0x11ee,0x11ee,0x11ee,0x11f1,0x1200,0x1200,0x11ee,0x11ee,0x11ee,0x11ee,0x1a1,0x12fc,0x11f4,0x11f4,0x11f4,0x11f4, -0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x1a1,0x1a1,0x1a1,0x1a1,0x11ee,0x11ee,0x121e,0x1212,0x121e,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, -0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x121b,0x121b,0x1221,0x1215,0x1218,0x1236,0x1236,0x1236,0x1230, -0x1230,0x1227,0x1230,0x1230,0x1227,0x1230,0x1230,0x1239,0x1233,0x122a,0x1a7,0x1a7,0x122d,0x122d,0x122d,0x122d, -0x122d,0x122d,0x122d,0x122d,0x122d,0x122d,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x123f,0x123f,0x123f,0x123f, -0x123f,0x123f,0x123f,0x1aa,0x1aa,0x1aa,0x1aa,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, -0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, -0x123c,0x123c,0x123c,0x123c,0x1aa,0x1aa,0x1aa,0x1aa,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, -0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1ad,0x1245, -0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1242,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257, -0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1b0,0x1b0, -0x1b0,0x1251,0x1254,0x1254,0x1254,0x1254,0x1254,0x1254,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d, -0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x125d,0x1b3,0x1b3, -0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x125a,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263, -0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1263,0x1b6,0x1b6,0x1b6,0x1b6,0x1b6, -0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1260,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269, -0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1269,0x1bc,0x1287,0x1287,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf, -0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x1bf,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2, -0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1, -0x12b1,0x12b1,0x12b1,0x156c,0x156c,0x1c5,0x1c5,0x1c5,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1, -0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b4,0x12b4,0x12b4,0x1293,0x1c5, -0x13b6,0x12bd,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x13b6,0x12bd,0x13b6,0x12bd, -0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x1443,0x1443,0x1c5,0x1c5,0x1c5,0x1c5, -0x13b9,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x12ba,0x13b3,0x12ba,0x12ba,0x13b3,0x13b9,0x12c0, -0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1863,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5,0x1c5, -0x1c5,0x1c5,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b, -0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x136b,0x12e1,0x13d4,0x13d1,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x12db,0x12db,0x12db,0x12db, -0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12de,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db, -0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12db,0x12de,0x12db,0x12db,0x13d4,0x13d4,0x13d4,0x13d4,0x13d4,0x13d1, -0x13d4,0x13d4,0x13d4,0x1866,0x1c8,0x1c8,0x1c8,0x1c8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8,0x12d8, -0x12d8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1401,0x1401,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8, -0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1c8,0x1374,0x1374,0x1374,0x1374, -0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374, -0x1374,0x1374,0x1374,0x1374,0x1374,0x136e,0x136e,0x136e,0x1cb,0x1cb,0x1371,0x1cb,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1377,0x1380,0x137a,0x137a,0x1380,0x1380,0x1380,0x137a,0x1380,0x137a,0x137a,0x137a,0x1383,0x1383, -0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x137d,0x137d,0x137d,0x137d,0x1d1,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1d1,0x1d1,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1d1,0x1d1,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1389,0x1389,0x1389,0x1389, -0x1389,0x1389,0x1389,0x1d1,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1389,0x1d1,0x1608,0x1608,0x1608,0x1608, -0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x138c,0x138c,0x138c,0x138c, -0x138c,0x138c,0x138f,0x13a1,0x13a1,0x1395,0x1395,0x1395,0x1395,0x1395,0x1d4,0x1d4,0x1d4,0x1d4,0x1392,0x1392, -0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1392,0x1398,0x1398, -0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1398,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, -0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x156f,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13a4,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x13da,0x13d7,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, -0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da, -0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x1da,0x13a7,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1dd,0x1dd,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1572,0x1dd,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13dd,0x1dd,0x13a7,0x13a7,0x13a7, -0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x1572,0x1572,0x1572,0x1572, -0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572,0x1572, -0x1572,0x1572,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x13fb,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x1587,0x1587,0x1587,0x1587,0x1587,0x158a,0x16f8,0x158a,0x158a,0x158a,0x17c1,0x186f,0x186f,0x1e0, -0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x158a,0x158a,0x158a,0x158a, -0x158a,0x158a,0x1587,0x1587,0x1587,0x158a,0x1587,0x16f5,0x16f5,0x1e0,0x1e0,0x1e0,0x158a,0x1587,0x1587,0x158a, -0x186f,0x186f,0x186f,0x1e3,0x1e3,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x13aa,0x13aa,0x13aa,0x13aa, -0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa, -0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x144f,0x1590,0x144f,0x144f, -0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1746, -0x1746,0x1e9,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x17f1,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9, -0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x1455,0x1455,0x1455,0x1455, -0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1ec, -0x1455,0x1ec,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec, -0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1455,0x1ec, -0x1ec,0x1ec,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1ec, -0x1455,0x1ec,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1ec, -0x1455,0x1ec,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec, -0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1455,0x1455,0x1455, -0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455, -0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1455,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1452,0x1452,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec, -0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x1458, -0x1458,0x1458,0x1458,0x1458,0x1467,0x1458,0x145b,0x145b,0x1458,0x1458,0x1458,0x145e,0x145e,0x1ef,0x1464,0x1464, -0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1461,0x146d,0x146d,0x146d,0x1ef,0x1ef,0x1ef,0x1ef, -0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479,0x1479, -0x1479,0x1479,0x1479,0x1476,0x1470,0x1470,0x1476,0x1476,0x147f,0x147f,0x1479,0x147c,0x147c,0x1476,0x1473,0x1f2, -0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1f2,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482, -0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482,0x1482, -0x1f5,0x1f5,0x1f5,0x1f5,0x1749,0x1749,0x1482,0x1482,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, -0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1f5,0x1f5,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, -0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x148e,0x148e,0x148e,0x148e,0x148e,0x1f8,0x1f8,0x1f8, -0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x148e,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, -0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b, -0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x148b,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8, -0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1f8,0x1488,0x1488,0x1488,0x1488,0x1491, -0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x1491,0x14a3,0x14a6,0x14a9,0x14a9, -0x14a6,0x14ac,0x14ac,0x1497,0x149a,0x174f,0x174c,0x174c,0x174c,0x1596,0x1fb,0x1fb,0x149d,0x149d,0x149d,0x149d, -0x149d,0x149d,0x149d,0x149d,0x149d,0x149d,0x1593,0x1755,0x1758,0x1752,0x175b,0x175b,0x14b2,0x14b2,0x14b2,0x14b2, -0x14b2,0x14b2,0x14b2,0x14b2,0x14b2,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x14af,0x14af,0x14af,0x14af, -0x14af,0x14af,0x14af,0x14af,0x14af,0x14af,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x14b5,0x14b5,0x14b5,0x14b5, -0x14b5,0x14b5,0x14b5,0x14b5,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x1305,0x1302,0x1305,0x12ed, -0x1302,0x1302,0x1302,0x1308,0x1302,0x1308,0x130b,0x1302,0x1308,0x1308,0x1302,0x1302,0x14c7,0x14c7,0x14c7,0x14c7, -0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14b8,0x14c1,0x14b8,0x14c1,0x14c1,0x14b8,0x14b8,0x14b8,0x14b8, -0x14b8,0x14b8,0x14c4,0x14bb,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x204,0x159c,0x159c,0x159c,0x159c, -0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x159c,0x207,0x207,0x1599,0x1599,0x1599,0x1599, -0x1599,0x159f,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x207,0x1704,0x16fb,0x16fb,0x16fb, -0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb, -0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x16fb,0x20d,0x20d,0x20d,0x20d,0x210,0x210,0x210,0x210, +0xd26,0xd26,0xd26,0xd26,0xd26,0xd26,0xd5,0xd26,0xd26,0xd5,0xd5,0xd5,0xd26,0xd5,0xd5,0xd26, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8, +0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0x14e8,0x14e8,0x179a,0x179a,0xde, +0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x10c5,0x135,0x135,0x135,0x135, +0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec, +0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xdec,0xde3,0xde3,0xde9,0xde9,0xde3,0xe1,0xe1,0xde6,0xde6, +0x10f5,0x10f5,0x10f5,0x10f5,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4,0xe4, +0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e,0xc4e, +0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14eb, +0x14eb,0x14eb,0x14eb,0x14eb,0x14eb,0x14ee,0x1866,0x1866,0x1866,0x1866,0xe7,0x179d,0x1314,0x1137,0xee5,0xee5, +0xdfe,0xdfb,0xdfe,0xdfb,0xdfb,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0x1140,0x113d,0x1140,0x113d,0x113a, +0x113a,0x113a,0x13da,0x13d7,0xea,0xea,0xea,0xea,0xea,0xdf8,0xdf5,0xdf5,0xdf5,0xdf2,0xdf8,0xdf5, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed,0xed, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed, +0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xe01,0xed, +0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07,0xe07, +0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xe04,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xf3,0x13dd,0xf3,0xf3,0xf3,0xf3,0xf3,0x13dd,0xf3,0xf3, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, +0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xf6, +0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d, +0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xe0d,0xf6, +0xe22,0xe16,0xe16,0xe16,0xf9,0xe16,0xe16,0xf9,0xf9,0xf9,0xf9,0xf9,0xe16,0xe16,0xe16,0xe16, +0xe22,0xe22,0xe22,0xe22,0xf9,0xe22,0xe22,0xe22,0xf9,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22, +0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22,0xe22, +0xf9,0xf9,0xf9,0xf9,0xe13,0xe13,0xe13,0xf9,0xf9,0xf9,0xf9,0xe19,0xe1c,0xe1c,0xe1c,0xe1c, +0xe1c,0xe1c,0xe1c,0xe1c,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe1f,0xe1f,0xe1f,0xe1f, +0xe1f,0xe1f,0xe25,0xe25,0xe1c,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0x1146,0x1146,0xfc,0xfc,0xfc,0xfc,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe34,0xe34,0xe34,0xe31,0xe31,0xe34,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e,0xe2e, +0xe2e,0xe2e,0x1143,0xfc,0xfc,0xfc,0xe2b,0xe2b,0xe3a,0xe3a,0xe3a,0xe3a,0xff,0xff,0xff,0xff, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe37,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x14f7,0x14fd,0x14fa,0x1845,0x17a0,0x1869,0x1869,0x1869, +0x1869,0x1869,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102, +0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102,0x102, +0x102,0x102,0x102,0x102,0xe61,0xe61,0xe61,0xe5e,0xe5e,0xe55,0xe55,0xe5e,0xe5b,0xe5b,0xe5b,0xe5b, +0x105,0x105,0x105,0x105,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b1,0x12b4,0x12b4,0x12b7,0x12b4,0x159,0x159, +0x159,0x159,0x159,0x159,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0x13e9,0x13e9,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0xe67,0x131a,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108,0x108, +0x108,0x108,0x108,0x1317,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21,0xc21, +0xc21,0xc21,0xc21,0xc21,0xe94,0xe85,0xe7f,0xe91,0xe8e,0xe88,0xe88,0xe97,0xe82,0xe8b,0x10b,0x10b, +0x10b,0x10b,0x10b,0x10b,0xf18,0xf18,0xf03,0xf18,0xf1b,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, +0x111,0x111,0x111,0x111,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf12,0xf24,0xf24, +0xf09,0xf0f,0xf24,0xf24,0xf0c,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf06, +0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf06,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09,0xf09, +0xf09,0x111,0x111,0x111,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x1320,0x131d,0x13ef,0x1509, +0x1509,0x1509,0x17a3,0x114,0x1509,0x1509,0x16f2,0x16f2,0x16f2,0x16ec,0x16f2,0x16ec,0x114,0x114,0x114,0x114, +0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114, +0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x114,0x1506, +0x13f2,0x13f2,0x131d,0x1020,0x1020,0x1020,0x1020,0x1020,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf30,0xf30,0xf36,0xf36, +0x117,0x117,0x117,0x117,0x117,0x117,0x117,0x117,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f, +0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf3f,0xf39,0xf39, +0xf39,0xf39,0x114f,0x114f,0x11a,0x11a,0x11a,0xf3c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x16f5,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, +0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d,0x11d, +0x11d,0x11d,0x11d,0x11d,0xf48,0xf48,0xf48,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512,0x1512, +0x1512,0x1512,0x1512,0x120,0xf45,0xf45,0xf45,0xf45,0x150f,0x120,0x120,0x120,0x120,0x120,0x120,0x120, +0x120,0x120,0x120,0x120,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b, +0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0xf4b,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123,0x123, +0x123,0x123,0x123,0x123,0x1047,0x1047,0x1047,0x1047,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044,0x1044, +0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1035,0x1044,0x1044,0x103b,0x1038,0x126,0x126,0x126,0x104a, +0x104a,0x103e,0x103e,0x103e,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x1041,0x126,0x126, +0x126,0x1047,0x1047,0x1047,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x104d,0x1050,0x1050, +0x1050,0x1050,0x1050,0x1050,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1062,0x1065,0x1065, +0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129,0x129, +0x129,0x129,0x129,0x129,0x108c,0x108c,0x108c,0x108c,0x1086,0x17a6,0x12c,0x12c,0x12c,0x12c,0x12c,0x12c, +0x12c,0x12c,0x1092,0x1092,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x12c,0x12c, +0x12c,0x12c,0x12c,0x12c,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4, +0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10a4,0x10aa,0x10ad,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f,0x12f, +0x12f,0x12f,0x12f,0x10a7,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10b3,0x10b3,0x10b3, +0x10b3,0x10b3,0x10b3,0x10bc,0x10bc,0x10b3,0x10b3,0x10bc,0x10bc,0x10b3,0x10b3,0x132,0x132,0x132,0x132,0x132, +0x132,0x132,0x132,0x132,0x10bf,0x10bf,0x10bf,0x10b3,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, +0x10b3,0x10bc,0x132,0x132,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x10b9,0x132,0x132, +0x10b6,0x10c2,0x10c2,0x10c2,0x151e,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, +0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135,0x135, +0x135,0x135,0x135,0x135,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, +0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8,0x10c8, +0x10c8,0x10cb,0x138,0x138,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, +0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, +0x10ce,0x13b,0x13b,0x13b,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e,0x13e, +0x13e,0x13e,0x13e,0x13e,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7, +0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x141,0x141, +0x141,0x141,0x141,0x10d4,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da, +0x144,0x144,0x144,0x144,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd, +0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x147,0x147,0x147,0x147,0x147,0x147,0x147,0x147, +0x147,0x147,0x147,0x147,0x1155,0x1155,0x1155,0x1155,0x115e,0x1155,0x1155,0x1155,0x115e,0x1155,0x1155,0x1155, +0x1155,0x1152,0x14a,0x14a,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b, +0x115b,0x115b,0x115b,0x14a,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x14d,0x14d,0x14d,0x14d,0x14d,0x14d, +0x14d,0x14d,0x14d,0x14d,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, +0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x1179,0x1164,0x1179,0x1164,0x1164,0x1164,0x1164, +0x1164,0x1164,0x1164,0x150,0x116d,0x1176,0x1164,0x1176,0x1176,0x1164,0x1164,0x1164,0x1164,0x1164,0x1164,0x1164, +0x1164,0x1179,0x1179,0x1179,0x1179,0x1179,0x1179,0x1164,0x1164,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a,0x116a, +0x116a,0x150,0x150,0x1167,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x150,0x150, +0x150,0x150,0x150,0x150,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x1173,0x150,0x150, +0x150,0x150,0x150,0x150,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x1170,0x117f,0x1182,0x1182,0x1182,0x1182, +0x1170,0x1170,0x150,0x150,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569,0x1569, +0x1569,0x1569,0x1566,0x1cb,0x12c6,0x12a5,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12c0,0x12a8,0x12a8,0x12a8, +0x12a8,0x12c0,0x12a8,0x12a8,0x12a8,0x12a8,0x12ae,0x1494,0x149a,0x1497,0x1491,0x18e4,0x16bf,0x16bf,0x153,0x153, +0x153,0x153,0x153,0x153,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197, +0x1197,0x1197,0x1197,0x1197,0x118e,0x118e,0x1191,0x119a,0x1194,0x1194,0x1194,0x119a,0x156,0x156,0x156,0x156, +0x156,0x156,0x156,0x156,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d,0x119d, +0x119d,0x119d,0x119d,0x119d,0x119d,0x12cc,0x11a3,0x12cf,0x11a3,0x11a3,0x11a3,0x11a3,0x11a0,0x11a0,0x11a0,0x11a3, +0x16fb,0x16fe,0x15c,0x15c,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293,0x1293, +0x1293,0x15f,0x15f,0x15f,0x11b8,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11ac,0x11af,0x11be,0x11be,0x11ac,0x11ac, +0x11ac,0x11ac,0x162,0x12ba,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x11b2,0x162,0x162, +0x162,0x162,0x11ac,0x11ac,0x11dc,0x11d0,0x11dc,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165, +0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x165,0x11d9, +0x11d9,0x11df,0x11d3,0x11d6,0x11f4,0x11f4,0x11f4,0x11ee,0x11ee,0x11e5,0x11ee,0x11ee,0x11e5,0x11ee,0x11ee,0x11f7, +0x11f1,0x11e8,0x168,0x168,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x11eb,0x168,0x168, +0x168,0x168,0x168,0x168,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x16b,0x16b,0x16b,0x16b,0x11fa, +0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa, +0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x11fa,0x16b,0x16b,0x16b,0x16b, +0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x1206, +0x1206,0x1206,0x1206,0x1206,0x1206,0x1206,0x16e,0x1203,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200,0x1200, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x171,0x171,0x171,0x120f,0x1212,0x1212,0x1212,0x1212,0x1212,0x1212, +0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, +0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x174,0x174,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218,0x1218, +0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221,0x1221, +0x1221,0x1221,0x1221,0x177,0x177,0x177,0x177,0x177,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e,0x121e, +0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227, +0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x1227,0x17d, +0x1242,0x1242,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180,0x180, +0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470, +0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x152a,0x152a,0x186,0x186,0x186, +0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f,0x126f, +0x126f,0x126f,0x126f,0x1272,0x1272,0x1272,0x1251,0x186,0x1374,0x127b,0x1374,0x1374,0x1374,0x1374,0x1374,0x1374, +0x1374,0x1374,0x1374,0x1374,0x1374,0x127b,0x1374,0x127b,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1401,0x1401,0x186,0x186,0x186,0x186,0x1377,0x1377,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1278,0x1371,0x1278,0x1278,0x1371,0x1377,0x127e,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824,0x1824, +0x1824,0x1824,0x1824,0x1824,0x1824,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186, +0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x186,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, +0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329,0x1329, +0x1329,0x1329,0x1329,0x1329,0x129f,0x1392,0x138f,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x189,0x189,0x189,0x189,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x129c,0x1299, +0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x1299,0x129c, +0x1299,0x1299,0x1392,0x1392,0x1392,0x1392,0x1392,0x138f,0x1392,0x1392,0x1392,0x1827,0x189,0x189,0x189,0x189, +0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x1296,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x13bf,0x13bf,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x18c9,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189, +0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x189,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, +0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332,0x1332, +0x1332,0x132c,0x132c,0x132c,0x18c,0x18c,0x132f,0x18c,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1335,0x133e, +0x1338,0x1338,0x133e,0x133e,0x133e,0x1338,0x133e,0x1338,0x1338,0x1338,0x1341,0x1341,0x18f,0x18f,0x18f,0x18f, +0x18f,0x18f,0x18f,0x18f,0x133b,0x133b,0x133b,0x133b,0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192, +0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192,0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192, +0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x192,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192, +0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x1347,0x192,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134d,0x135f, +0x135f,0x1353,0x1353,0x1353,0x1353,0x1353,0x195,0x195,0x195,0x195,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350, +0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1350,0x1356,0x1356,0x1356,0x1356,0x1356,0x1356, +0x1356,0x1356,0x1356,0x1356,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195,0x195, +0x195,0x195,0x195,0x152d,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362, +0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x198,0x198,0x198, +0x198,0x198,0x198,0x198,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x19b,0x19b,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x1530,0x19b,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x139b,0x19b,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365,0x1365, +0x1365,0x1365,0x1365,0x1365,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530, +0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x1530,0x19b,0x19b,0x19b,0x19b,0x19b,0x19b, +0x19b,0x19b,0x19b,0x19b,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x1545,0x1545,0x1545,0x1545,0x1545,0x1548, +0x16b6,0x1548,0x1548,0x1548,0x1782,0x1830,0x1830,0x186c,0x186c,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e,0x19e, +0x19e,0x19e,0x19e,0x19e,0x1548,0x1548,0x1548,0x1548,0x1548,0x1548,0x1545,0x1545,0x1545,0x1548,0x1545,0x16b3, +0x16b3,0x19e,0x19e,0x19e,0x1548,0x1545,0x1545,0x1548,0x1830,0x1830,0x1830,0x18cf,0x18cf,0x19e,0x19e,0x19e, +0x19e,0x19e,0x19e,0x19e,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1,0x1a1, +0x1a1,0x1a1,0x1a1,0x1a1,0x140d,0x154e,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d,0x140d, +0x140d,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x1707,0x1707,0x1a4,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2,0x17b2, +0x17b2,0x17b2,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4, +0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x1a4,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af,0x17af, +0x17af,0x17af,0x17af,0x17af,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1a7,0x1413,0x1a7,0x1413,0x1413,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1413, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1413,0x1a7,0x1a7,0x1a7,0x1a7,0x1413,0x1a7,0x1413,0x1a7,0x1413, +0x1a7,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1a7,0x1413,0x1a7,0x1413,0x1a7,0x1413, +0x1a7,0x1413,0x1a7,0x1413,0x1a7,0x1413,0x1413,0x1a7,0x1413,0x1a7,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1a7, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413, +0x1413,0x1a7,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1413,0x1413,0x1413,0x1a7,0x1413,0x1413,0x1413,0x1413,0x1413,0x1a7,0x1413, +0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413,0x1413, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1410,0x1410,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7,0x1a7, +0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1416,0x1416,0x1416,0x1416,0x1416,0x1425,0x1416,0x1419,0x1419, +0x1416,0x1416,0x1416,0x141c,0x141c,0x1aa,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422,0x1422, +0x141f,0x142b,0x142b,0x142b,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa,0x1aa, +0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8, +0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1437,0x1434,0x142e,0x142e,0x1434,0x1434, +0x143d,0x143d,0x1437,0x143a,0x143a,0x1434,0x1431,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad,0x1ad, +0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440, +0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1b0,0x1b0,0x1b0,0x1b0,0x170a,0x170a,0x1440,0x1440, +0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a, +0x1b0,0x1b0,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a, +0x144c,0x144c,0x144c,0x144c,0x144c,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3, +0x144c,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449, +0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449, +0x1449,0x1449,0x1449,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3,0x1b3, +0x1b3,0x1b3,0x1b3,0x1446,0x1446,0x1446,0x1446,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f,0x144f, +0x144f,0x144f,0x144f,0x144f,0x1461,0x1464,0x1467,0x1467,0x1464,0x146a,0x146a,0x1455,0x1458,0x1710,0x170d,0x170d, +0x170d,0x1554,0x1b6,0x1b6,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x145b,0x1551,0x1716, +0x1719,0x1713,0x171c,0x171c,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1470,0x1b9,0x1b9,0x1b9, +0x1b9,0x1b9,0x1b9,0x1b9,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x146d,0x1b9,0x1b9, +0x1b9,0x1b9,0x1b9,0x1b9,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1473,0x1bc,0x1bc,0x1bc,0x1bc, +0x1bc,0x1bc,0x1bc,0x1bc,0x12c3,0x12c0,0x12c3,0x12ab,0x12c0,0x12c0,0x12c0,0x12c6,0x12c0,0x12c6,0x12c9,0x12c0, +0x12c6,0x12c6,0x12c0,0x12c0,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1476, +0x147f,0x1476,0x147f,0x147f,0x1476,0x1476,0x1476,0x1476,0x1476,0x1476,0x1482,0x1479,0x1bf,0x1bf,0x1bf,0x1bf, +0x1bf,0x1bf,0x1bf,0x1bf,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a,0x155a, +0x155a,0x155a,0x1c2,0x1c2,0x1557,0x1557,0x1557,0x1557,0x1557,0x155d,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2,0x1c2, +0x1c2,0x1c2,0x1c2,0x1c2,0x16c2,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, +0x1c8,0x1c8,0x1c8,0x1c8,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, +0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb,0x1cb, +0x1cb,0x1cb,0x1cb,0x1cb,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1ce, +0x1ce,0x1ce,0x1ce,0x1ce,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1ce,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1ce,0x1ce,0x1572,0x156c,0x156f,0x1578,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, +0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1d1,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, +0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4,0x1d4, +0x171f,0x16c5,0x1587,0x16cb,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1d7,0x1d7,0x1590, +0x1590,0x1d7,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590, +0x1590,0x1d7,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1590,0x1d7,0x1590,0x1590,0x1d7,0x1590,0x1590,0x1590, +0x1590,0x1590,0x1d7,0x1d7,0x16c8,0x1590,0x1581,0x1587,0x1581,0x1587,0x1587,0x1587,0x1587,0x1d7,0x1d7,0x1587, +0x1587,0x1d7,0x1d7,0x158a,0x158a,0x158d,0x1d7,0x1d7,0x1722,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1581, +0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1593,0x1590,0x1590,0x1590,0x1590,0x1587,0x1587,0x1d7,0x1d7,0x1584,0x1584, +0x1584,0x1584,0x1584,0x1584,0x1584,0x1d7,0x1d7,0x1d7,0x1584,0x1584,0x1584,0x1584,0x1584,0x1d7,0x1d7,0x1d7, +0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x1d7,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8, +0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x1da,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8, +0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a8,0x15a2,0x15a2,0x15a2,0x1596,0x1596,0x1596,0x15a2,0x15a2, +0x1596,0x15a5,0x1599,0x1596,0x15ab,0x15ab,0x159f,0x15ab,0x15ab,0x159c,0x17b5,0x1da,0x15ba,0x15ba,0x15ba,0x15ae, +0x15ae,0x15ae,0x15ae,0x15ae,0x15ae,0x15b1,0x15b4,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x15b7,0x15b7,0x15b7,0x15b7, +0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1dd,0x1725,0x1725,0x1725,0x1725, +0x15c6,0x15c3,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x1e0,0x174f,0x174f,0x174f,0x174f, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3, +0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x1e3,0x15d8,0x15d8,0x15d8,0x15d8, +0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15d8,0x15cf, +0x15d2,0x15d5,0x15d8,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x1e6,0x15e7,0x15e7,0x15e7,0x15e7, +0x15e7,0x15db,0x15db,0x1e9,0x1e9,0x1e9,0x1e9,0x15de,0x15de,0x15de,0x15de,0x15de,0x15e4,0x15e4,0x15e4,0x15e4, +0x15e4,0x15e4,0x15e1,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x1e9,0x15f0,0x15f0,0x15f0,0x15f0, +0x15f0,0x1ec,0x1ec,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ed,0x15ea,0x15ea,0x15ea,0x15ea, +0x15ea,0x15ea,0x15ea,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x1ec,0x15f3,0x1605,0x1605,0x15f9, +0x1602,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x15fc,0x15fc,0x15fc,0x15fc, +0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x15fc,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x1ef,0x160b,0x160b,0x160b,0x160b, +0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b, +0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x160b,0x1f2,0x1617,0x1617,0x1617,0x1617, +0x1617,0x1611,0x161a,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1617,0x1614,0x1614,0x1614,0x1614, +0x1614,0x1614,0x1614,0x1614,0x1614,0x1614,0x1617,0x1617,0x1617,0x1617,0x1617,0x1f5,0x1620,0x1620,0x1620,0x1620, +0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620, +0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1620,0x1f8,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c, +0x162c,0x162c,0x1629,0x1629,0x1629,0x1629,0x1629,0x1fb,0x1fb,0x1fb,0x1fb,0x1fb,0x1644,0x1644,0x1647,0x1647, +0x164a,0x163b,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1641,0x1641,0x1641,0x1641, +0x1641,0x1641,0x1641,0x1641,0x1641,0x1641,0x1fe,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x1fe,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1fe,0x1fe,0x1fe,0x1fe,0x1fe,0x1644,0x1644,0x1644,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x201,0x201,0x201,0x201,0x201,0x201,0x201,0x165c,0x165c,0x165c,0x165c, +0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x165c,0x204,0x204, +0x204,0x204,0x204,0x204,0x204,0x1659,0x1659,0x1659,0x1659,0x204,0x204,0x204,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x165f,0x1671,0x1671,0x165f,0x165f, +0x165f,0x165f,0x20a,0x20a,0x1671,0x1671,0x1674,0x1674,0x165f,0x165f,0x1671,0x1665,0x1662,0x1668,0x167a,0x167a, +0x166b,0x166b,0x166e,0x166e,0x166e,0x167a,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e,0x172e, +0x172e,0x172e,0x172e,0x172e,0x172b,0x172b,0x172b,0x172b,0x1728,0x1728,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, +0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a, +0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20a,0x20d,0x167d,0x167d,0x167d, +0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d, +0x167d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x20d,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210, +0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210, +0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210, +0x210,0x210,0x210,0x210,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, 0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210, -0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x213,0x213,0x213,0x213,0x213,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x213,0x213,0x213,0x213,0x213,0x213,0x213, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x213,0x213,0x15b4,0x15ae,0x15b1,0x15ba, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x216, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219, -0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219, -0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x219,0x175e,0x15c3,0x15c9,0x170a,0x21c,0x15d2,0x15d2,0x15d2, -0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x21c,0x21c,0x15d2,0x15d2,0x21c,0x21c,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2, -0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x21c,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2, -0x15d2,0x21c,0x15d2,0x15d2,0x21c,0x15d2,0x15d2,0x15d2,0x15d2,0x15d2,0x21c,0x21c,0x1707,0x15d2,0x15c3,0x15c9, -0x15c3,0x15c9,0x15c9,0x15c9,0x15c9,0x21c,0x21c,0x15c9,0x15c9,0x21c,0x21c,0x15cc,0x15cc,0x15cf,0x21c,0x21c, -0x1761,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x15c3,0x21c,0x21c,0x21c,0x21c,0x21c,0x15d5,0x15d2,0x15d2, -0x15d2,0x15d2,0x15c9,0x15c9,0x21c,0x21c,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x21c,0x21c,0x21c, -0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, -0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea, -0x15ea,0x15ea,0x21f,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea,0x15ea, -0x15e4,0x15e4,0x15e4,0x15d8,0x15d8,0x15d8,0x15e4,0x15e4,0x15d8,0x15e7,0x15db,0x15d8,0x15ed,0x15ed,0x15e1,0x15ed, -0x15ed,0x15de,0x17f4,0x21f,0x15fc,0x15fc,0x15fc,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f3,0x15f6,0x222, -0x222,0x222,0x222,0x222,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x15f9,0x222,0x222, -0x222,0x222,0x222,0x222,0x1764,0x1764,0x1764,0x1764,0x1608,0x1605,0x225,0x225,0x225,0x225,0x225,0x225, -0x225,0x225,0x225,0x225,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e, -0x178e,0x178e,0x178e,0x178e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, -0x228,0x228,0x228,0x228,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a, -0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x161a,0x1611,0x1614,0x1617,0x161a,0x22b,0x22b,0x22b,0x22b,0x22b, -0x22b,0x22b,0x22b,0x22b,0x1629,0x1629,0x1629,0x1629,0x1629,0x161d,0x161d,0x22e,0x22e,0x22e,0x22e,0x1620, -0x1620,0x1620,0x1620,0x1620,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1623,0x22e,0x22e,0x22e,0x22e,0x22e, -0x22e,0x22e,0x22e,0x22e,0x1632,0x1632,0x1632,0x1632,0x1632,0x231,0x231,0x162f,0x162f,0x162f,0x162f,0x162f, -0x162f,0x162f,0x162f,0x162f,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x162c,0x231,0x231,0x231,0x231,0x231, -0x231,0x231,0x231,0x231,0x1635,0x1647,0x1647,0x163b,0x1644,0x234,0x234,0x234,0x234,0x234,0x234,0x234, -0x234,0x234,0x234,0x234,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x163e,0x234,0x234, -0x234,0x234,0x234,0x234,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d, -0x164d,0x164d,0x164d,0x237,0x1659,0x1659,0x1659,0x1659,0x1659,0x1653,0x165c,0x1659,0x1659,0x1659,0x1659,0x1659, -0x1659,0x1659,0x1659,0x1659,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1656,0x1659,0x1659, -0x1659,0x1659,0x1659,0x23a,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662, -0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662,0x1662, -0x1662,0x1662,0x1662,0x23d,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e, -0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166e,0x166b,0x166b,0x166b,0x166b,0x166b,0x240, -0x240,0x240,0x240,0x240,0x1686,0x1686,0x1689,0x1689,0x168c,0x167d,0x243,0x243,0x243,0x243,0x243,0x243, -0x243,0x243,0x243,0x243,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x1683,0x243,0x167d, -0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x243,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x243,0x243,0x243,0x243, -0x243,0x1686,0x1686,0x1686,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, -0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x246,0x246,0x246, -0x246,0x246,0x246,0x246,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, -0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x249,0x249,0x249,0x249,0x249,0x249,0x249,0x169b,0x169b,0x169b, -0x169b,0x249,0x249,0x249,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, -0x16b9,0x16b9,0x16b9,0x16a1,0x16b3,0x16b3,0x16a1,0x16a1,0x16a1,0x16a1,0x24f,0x24f,0x16b3,0x16b3,0x16b6,0x16b6, -0x16a1,0x16a1,0x16b3,0x16a7,0x16a4,0x16aa,0x16bc,0x16bc,0x16ad,0x16ad,0x16b0,0x16b0,0x16b0,0x16bc,0x176d,0x176d, -0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176a,0x176a,0x176a,0x176a, -0x1767,0x1767,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, -0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f, -0x24f,0x24f,0x24f,0x24f,0x252,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf, -0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x16bf,0x252,0x252,0x252,0x252,0x252,0x252,0x252, -0x252,0x252,0x252,0x252,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255,0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x255,0x255, -0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255, -0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255, -0x16c5,0x16d4,0x16cb,0x16c8,0x16da,0x16da,0x16ce,0x16da,0x258,0x258,0x258,0x258,0x258,0x258,0x258,0x258, -0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x16d1,0x258,0x258,0x258,0x258,0x258,0x258, -0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16e0,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd,0x16dd, -0x16dd,0x16dd,0x16dd,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x25b,0x16e6, -0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f, -0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x177f,0x25e,0x25e,0x25e,0x1770,0x1770,0x1770, -0x177c,0x177c,0x1770,0x1770,0x1770,0x1770,0x177c,0x1770,0x1770,0x1770,0x1770,0x1773,0x25e,0x25e,0x25e,0x25e, -0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1779,0x1776,0x1776,0x1782,0x1782,0x1782,0x1776, -0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261, -0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797, -0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x1797,0x267,0x1797,0x1797,0x267,0x267, -0x267,0x267,0x267,0x1794,0x1794,0x1794,0x1794,0x1794,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x26a, -0x179a,0x26a,0x179a,0x179a,0x179a,0x179a,0x26a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, -0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x26a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a,0x179a, -0x179a,0x179d,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff, -0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6, -0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x26d,0x26d,0x26d,0x26d,0x26d, -0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3, -0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x26d,0x26d,0x26d,0x26d,0x26d, -0x26d,0x26d,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x17a0,0x270,0x270,0x270,0x270,0x270,0x270,0x270,0x270, -0x270,0x270,0x270,0x270,0x273,0x273,0x273,0x273,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, -0x17ca,0x1878,0x1878,0x1878,0x1878,0x1875,0x1878,0x279,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1878,0x1875, -0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x1878,0x279,0x279,0x1878,0x1878,0x1878,0x1878,0x1878, -0x1878,0x1878,0x1875,0x1872,0x1875,0x1878,0x1878,0x273,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1872,0x1875, -0x1875,0x1875,0x1875,0x1875,0x276,0x273,0x273,0x273,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875, -0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x276, -0x276,0x276,0x276,0x276,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x1875,0x1875,0x1875, -0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x1875,0x276,0x276,0x276,0x276,0x276,0x276, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x17c7,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x276,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x279,0x276,0x276, -0x276,0x276,0x276,0x276,0x276,0x276,0x276,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273,0x273, -0x17ac,0x17ac,0x17ac,0x17ac,0x17a9,0x17ac,0x17ac,0x17af,0x17b2,0x17af,0x17af,0x17ac,0x27c,0x27c,0x27c,0x27c, -0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, -0x1806,0x1806,0x1806,0x1806,0x17fd,0x17fd,0x17fd,0x17f7,0x17fa,0x17fa,0x17fa,0x27f,0x27f,0x27f,0x27f,0x27f, -0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x1803,0x27f,0x27f,0x27f,0x27f,0x1800,0x1800, -0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x282,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, +0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x210,0x1683,0x1692,0x1689,0x1686,0x1698,0x1698,0x168c,0x1698, +0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x213,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f, +0x168f,0x168f,0x213,0x213,0x213,0x213,0x213,0x213,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e,0x169e, +0x169e,0x169e,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x169b,0x216,0x216,0x216,0x216,0x216, +0x216,0x216,0x216,0x216,0x216,0x216,0x216,0x16a4,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740, +0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740,0x1740, +0x1740,0x1740,0x219,0x219,0x219,0x1731,0x1731,0x1731,0x173d,0x173d,0x1731,0x1731,0x1731,0x1731,0x173d,0x1731, +0x1731,0x1731,0x1731,0x1734,0x219,0x219,0x219,0x219,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a,0x173a, +0x173a,0x173a,0x1737,0x1737,0x1743,0x1743,0x1743,0x1737,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x21c, +0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, +0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c,0x21c, +0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758,0x1758, +0x1758,0x1758,0x1758,0x222,0x1758,0x1758,0x222,0x222,0x222,0x222,0x222,0x1755,0x1755,0x1755,0x1755,0x1755, +0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x225,0x175b,0x225,0x175b,0x175b,0x175b,0x175b,0x225,0x175b, +0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x225,0x175b, +0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175b,0x175e,0x225,0x225,0x225,0x225,0x225,0x225, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x228, +0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764, +0x1764,0x1764,0x1764,0x228,0x228,0x228,0x228,0x228,0x228,0x228,0x1761,0x1761,0x1761,0x1761,0x1761,0x1761, +0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x186f,0x22b,0x22b,0x22b,0x22b, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x1788,0x178b,0x1839,0x1839,0x1839,0x1839,0x1836,0x1839,0x18d5, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1839,0x1836,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2, +0x1839,0x18d5,0x18d5,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1836,0x1833,0x1836,0x1839,0x1839,0x22b, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1833,0x1836,0x1836,0x1836,0x1836,0x1836,0x18d2,0x22b,0x22b,0x22b, +0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x18d2, +0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x1788,0x1788,0x1788,0x1788,0x1788,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836,0x1836, +0x1836,0x1836,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x1788,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x18d2,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5, +0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d5,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x18d2,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b, +0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x22b,0x176d,0x176d,0x176d,0x176d,0x176a,0x176d,0x176d,0x1770, +0x1773,0x1770,0x1770,0x176d,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e,0x22e, +0x22e,0x22e,0x22e,0x176a,0x176a,0x176a,0x176a,0x176a,0x17c7,0x17c7,0x17c7,0x17c7,0x17be,0x17be,0x17be,0x17b8, +0x17bb,0x17bb,0x17bb,0x231,0x231,0x231,0x231,0x231,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4, +0x17c4,0x17c4,0x231,0x231,0x231,0x231,0x17c1,0x17c1,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2, +0x17e2,0x234,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2, +0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17e2,0x17df,0x17cd,0x17cd,0x17cd,0x17cd, +0x17cd,0x17cd,0x17cd,0x234,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17cd,0x17df,0x17d0,0x17e2,0x17e5,0x17e5,0x17d9, +0x17d6,0x17d6,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x234,0x17dc,0x17dc,0x17dc,0x17dc, +0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17dc,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x17d3, +0x17d3,0x17d3,0x17d3,0x17d3,0x17d3,0x234,0x234,0x234,0x17f1,0x17f4,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, +0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x23a, +0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb, +0x17eb,0x23a,0x23a,0x17eb,0x17eb,0x17eb,0x17eb,0x17eb,0x183c,0x18d8,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d, +0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d, +0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x23d,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa, +0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x17fa,0x240,0x240,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee, +0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x240,0x17f7,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee,0x17ee, +0x17ee,0x17f7,0x17ee,0x17ee,0x17f7,0x17ee,0x17ee,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240,0x240, +0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x17fd,0x243,0x243,0x243, +0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243,0x243, +0x1815,0x1815,0x1806,0x1800,0x1800,0x1815,0x1803,0x1818,0x1818,0x1818,0x1818,0x181b,0x181b,0x180f,0x180c,0x1809, +0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x246,0x180f,0x246,0x1809,0x246,0x246, +0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246, +0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246,0x246, 0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821,0x1821, -0x1821,0x1821,0x1821,0x181e,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x180c,0x282,0x180c,0x180c,0x180c,0x180c, -0x180c,0x180c,0x181e,0x180f,0x1821,0x1824,0x1824,0x1818,0x1815,0x1815,0x282,0x282,0x282,0x282,0x282,0x282, -0x282,0x282,0x282,0x282,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x181b,0x1812,0x1812, -0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x1812,0x282,0x282,0x282, -0x1830,0x1833,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x288,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a, -0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x182a,0x288,0x288,0x182a,0x182a,0x182a,0x182a,0x182a, -0x187b,0x28e,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, -0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b,0x28b, -0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839,0x1839, -0x291,0x291,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d, -0x291,0x1836,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x182d,0x1836,0x182d,0x182d,0x1836,0x182d,0x182d,0x291, -0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x291,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c,0x183c, -0x183c,0x183c,0x183c,0x183c,0x183c,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294, -0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x294,0x1854,0x1854,0x1845,0x183f,0x183f,0x1854,0x1842,0x1857, -0x1857,0x1857,0x1857,0x185a,0x185a,0x184e,0x184b,0x1848,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851,0x1851, -0x1851,0x1851,0x297,0x184e,0x297,0x1848,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297, -0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297, -0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x297,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860, -0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x1860,0x29a,0x29a,0x29a,0x29a, -0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d, -0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x185d,0x29a,0x29a,0x29a,0x29a, -0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x29d,0x29d,0x29d, -0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d,0x29d, -0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, -0x1881,0x1881,0x1881,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0,0x2a0, -0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a6,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3,0x2a3, -0x2a3,0x2a3,0x975,0x975,0x17c4,0x17c4,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1,0x2c1, -0x2c1,0x2c1,0x2c1,0x2c1,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, -0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6,0x2a6, -0x2a6,0x2a6,0x2a6,0x2a6,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, -0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9,0x2a9, -0x2a9,0x2a9,0x2a9,0x2a9,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac,0x2ac, -0x2ac,0x2ac,0x2ac,0x2ac,0x112b,0x112b,0x112b,0x112b,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc,0x12cc, -0x14ca,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x17b5,0x2af,0x2af,0x2af,0x2af,0x2af,0x2af, -0x2af,0x2af,0x2af,0x2af,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0x12cf, -0x12cf,0x12cf,0x2b2,0x2b2,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe, -0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0x2b2,0x2b2, -0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2, -0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2,0x2b2, -0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, -0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5,0x2b5, -0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, -0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0x2b8,0x2b8, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb,0x2bb, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x2be,0x2be, -0x1143,0x3ba,0x3ba,0x3c6,0xccf,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c6,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3ba,0x3c6,0x3c6,0x3c6,0x3c6,0x3c0,0x1146,0x131d, -0x3c9,0x942,0x945,0x3bd,0x3bd,0x1143,0x131a,0x131a,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc,0x3cc, -0x3c9,0x3c9,0x3ba,0x3ba,0x8cd,0x8d0,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d,0x95d, -0x3c3,0xfa5,0xfa2,0x1320,0x1320,0x1320,0x1320,0x1320,0x14f1,0x1149,0x1149,0xef7,0xef7,0xdc2,0xef7,0xef7, -0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9, -0x3c9,0x3cc,0x3c9,0x3c9,0x3cc,0x3c9,0x3c9,0x3c9,0x3c9,0x3c9,0x131a,0x131d,0x3bd,0x3c9,0x3c6,0x3c6, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7, -0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0x4a7,0xbbb,0xbbb,0xdce,0xdce,0x8d3,0xdd1,0x1410,0x1410,0x1410, -0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa, -0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa,0x4aa, -0x4b0,0x4b0,0x4b0,0x115e,0x115e,0x115e,0x115e,0x115e,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad, -0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad, -0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x4ad,0x115b,0x115b,0x115b,0x115b,0x115b,0x115b, -0x4b3,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0, -0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0,0x4b0, -0x4b0,0x4b0,0x4b0,0x4b0,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6, -0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6, -0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4b6,0x4b6,0x4b6,0x4b6,0x4b9,0x9b7,0xff3,0xff3,0xff6,0xff3, -0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6, -0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0x4bc,0x4b6,0xff6,0xff3,0xff6,0xff3,0xff6,0xff3, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4c8,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb,0x4cb, -0x6a8,0x6a8,0x6ab,0x4e6,0x6b7,0x6b4,0x6b4,0x6b1,0x510,0x510,0x4ce,0x4ce,0x4ce,0x4ce,0x4ce,0xae9, -0x6ba,0x4f2,0x6d2,0x6d5,0x507,0x6ba,0x4f5,0x4f5,0x4e6,0x501,0x501,0x6a8,0x50d,0x50a,0x6ae,0x4e0, -0x4d7,0x4d7,0x4da,0x4da,0x4da,0x4da,0x4da,0x4dd,0x4da,0x4da,0x4da,0x4d1,0x519,0x516,0x513,0x513, -0x6c6,0x4fb,0x4f8,0x6c3,0x6c0,0x6bd,0x6cf,0x4e9,0x6cc,0x6cc,0x4fe,0x501,0x6c9,0x6c9,0x4fe,0x501, -0x4e3,0x4e6,0x4e6,0x4e6,0x504,0x4ef,0x4ec,0xbd0,0xaef,0xaf2,0xaec,0xaec,0xaec,0xaec,0xbc7,0xbc7, -0xbc7,0xbc7,0xbcd,0xcfc,0xcf9,0xddd,0xde0,0xbca,0xde0,0xde0,0xde0,0xde0,0xddd,0xde0,0xde0,0xbc4, -0x54c,0x54c,0x564,0x6e4,0x549,0x6e1,0x54c,0x561,0x549,0x6e4,0x55b,0x564,0x564,0x564,0x55b,0x55b, -0x564,0x564,0x564,0x6ed,0x549,0x564,0x6e7,0x549,0x558,0x564,0x564,0x564,0x564,0x564,0x549,0x549, -0x54f,0x6e1,0x6ea,0x549,0x564,0x549,0x6f0,0x549,0x564,0x552,0x56a,0x6f3,0x564,0x564,0x555,0x55b, -0x564,0x564,0x567,0x564,0x55b,0x55e,0x55e,0x55e,0x55e,0xafe,0xafb,0xcff,0xdef,0xbeb,0xbee,0xbee, -0xbe8,0xbe5,0xbe5,0xbe5,0xbe5,0xbee,0xbeb,0xbeb,0xbeb,0xbeb,0xbe2,0xbe5,0xdec,0xf03,0xf06,0xffc, -0x116d,0x116d,0x116d,0x6f9,0x6f6,0x56d,0x570,0x570,0x570,0x570,0x570,0x6f6,0x6f9,0x6f9,0x6f6,0x570, -0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x6ff,0x579,0x579,0x579,0x579, -0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x6fc,0x573,0x573,0x573,0x573,0x573,0x573, -0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57c,0x585,0x585,0x57f,0x57f,0x57f,0x582,0x57c, -0x57f,0x57f,0x57c,0x57c,0x57c,0x57c,0x57f,0x57f,0x702,0x702,0x57c,0x57c,0x57f,0x57f,0x57f,0x57f, -0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x582,0x582,0x582,0x57f,0x57f,0x705,0x57f, -0x705,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x57c,0x57f,0x57c,0x57c,0x57c,0x57c,0x57c,0x57c, -0x57f,0x57f,0x57c,0x702,0x57c,0x57c,0x57c,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04,0xb04, -0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0xbf1,0x70b,0x588,0x70b,0x70b, -0x58b,0x588,0x588,0x70b,0x70b,0x58b,0x588,0x70b,0x58b,0x588,0x588,0x70b,0x588,0x70b,0x597,0x594, -0x588,0x70b,0x588,0x588,0x588,0x588,0x70b,0x588,0x588,0x70b,0x70b,0x70b,0x70b,0x588,0x588,0x70b, -0x58b,0x70b,0x58b,0x70b,0x70b,0x70b,0x70b,0x70b,0x711,0x58e,0x70b,0x58e,0x58e,0x588,0x588,0x588, -0x70b,0x70b,0x70b,0x70b,0x588,0x588,0x588,0x588,0x70b,0x70b,0x588,0x588,0x588,0x58b,0x588,0x588, -0x58b,0x588,0x588,0x58b,0x70b,0x58b,0x588,0x588,0x70b,0x588,0x588,0x588,0x588,0x588,0x70b,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x70e,0x70b,0x58b,0x588, -0x70b,0x70b,0x70b,0x70b,0x588,0x588,0x70b,0x70b,0x588,0x58b,0x70e,0x70e,0x58b,0x58b,0x588,0x588, -0x58b,0x58b,0x588,0x588,0x58b,0x58b,0x588,0x588,0x588,0x588,0x588,0x588,0x58b,0x58b,0x70b,0x70b, -0x58b,0x58b,0x70b,0x70b,0x58b,0x58b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x588,0x70b,0x588,0x588,0x588,0x70b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x70b,0x588,0x588, -0x588,0x588,0x588,0x588,0x58b,0x58b,0x58b,0x58b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x70b,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588, -0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x588,0x58b,0x58b,0x58b,0x58b,0x588,0x588,0x588,0x588, -0x588,0x588,0x58b,0x58b,0x58b,0x58b,0x588,0x591,0x588,0x588,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4, -0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0xbf4,0x59a,0xb07,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0x5a6,0x5a3,0x5a6,0x5a3,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x714,0x59a,0x59a,0x59a,0x59a,0x59a, -0x59a,0x59a,0x819,0x819,0x59a,0x59a,0x59a,0x59a,0x5a0,0x5a0,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0x59d,0x81f,0x81c,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a, -0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0x59a,0xb07,0xbfa,0xb07,0xb07,0xb07,0x5a9,0x5a9,0x5a9,0x5a9, -0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9, -0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x5a9,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x5af,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60, -0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xc60,0xd74,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, -0x5b2,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x5b5,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x5b5,0x5b5,0x5b5,0x5b5,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x729,0x729,0x729,0x729, -0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x729,0x5b8,0x5b8,0x729,0x729, -0x729,0x729,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0x72f,0x72f,0x5bb,0x72c, -0x72c,0x72c,0x72c,0x72c,0x72c,0x72c,0x5be,0x5be,0x5bb,0x5bb,0x5c1,0x5c1,0x5c1,0x5c1,0x72f,0x72f, -0x5c1,0x5c1,0x732,0x72f,0x5bb,0x5bb,0x5bb,0x5bb,0x72f,0x72f,0x5c1,0x5c1,0x732,0x72f,0x5bb,0x5bb, -0x5bb,0x5bb,0x72f,0x72f,0x72c,0x5bb,0x5c1,0x72f,0x5bb,0x5bb,0x72c,0x72f,0x72f,0x72f,0x5c1,0x5c1, -0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x5bb,0x72f,0x72c, -0x72f,0x72c,0x5bb,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5c1,0x5bb,0x5bb,0x72c,0xb0d,0xb0d,0xb0d,0xb0d, -0xb0d,0xb0d,0xb0d,0xb0d,0xc00,0xc00,0xc00,0xc03,0xc03,0xc78,0xc78,0xc00,0x5cd,0x5cd,0x5cd,0x5cd, -0x5ca,0x741,0x741,0x5c4,0x5c4,0x735,0x5c4,0x5c4,0x5c4,0x5c4,0x73b,0x735,0x5c4,0x5ca,0x5c4,0x5c4, -0xd7d,0xd7d,0xc06,0xc06,0xdfe,0xb10,0x5c7,0x5c7,0x738,0x5d0,0x738,0x5c7,0x5ca,0x5c4,0x5ca,0x5ca, -0x5c4,0x5c4,0x5ca,0x5c4,0x5c4,0x5c4,0x5ca,0x5c4,0x5c4,0x5c4,0x5ca,0x5ca,0x5c4,0x5c4,0x5c4,0x5c4, -0x5c4,0x5c4,0x5c4,0x5c4,0x5ca,0x5cd,0x5cd,0x5c7,0x5c4,0x5c4,0x5c4,0x5c4,0x747,0x5c4,0x747,0x5c4, -0x5c4,0x5c4,0x5c4,0x5c4,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822, -0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x5c4,0x744,0x741,0x5d3,0x744, -0x735,0x73b,0x5ca,0x735,0x73e,0x735,0x735,0x5c4,0x735,0x741,0x5d3,0x741,0xb10,0xb10,0xc09,0xc09, -0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc0c,0xc09,0xc09,0xdf5,0xeb5,0x5d6,0x5d6,0x5d6,0x5d6, +0x1821,0x1821,0x1821,0x1821,0x249,0x249,0x249,0x249,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, +0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e,0x181e, +0x181e,0x181e,0x181e,0x181e,0x249,0x249,0x249,0x249,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f, +0x183f,0x183f,0x183f,0x183f,0x183f,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c, +0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x24c,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842, +0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x24f,0x24f,0x24f,0x24f,0x24f, +0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x24f,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de, +0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de, +0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x18de,0x252,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x255, +0x187e,0x187e,0x255,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e, +0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x1872,0x1872,0x1872,0x1872,0x1872,0x1872,0x255, +0x255,0x255,0x1872,0x255,0x1872,0x1872,0x255,0x1872,0x1872,0x1872,0x1875,0x1872,0x1878,0x1878,0x1881,0x1872, +0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x255,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b,0x187b, +0x187b,0x187b,0x255,0x255,0x255,0x255,0x255,0x255,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18e1,0x18e1,0x18e1,0x18e1,0x258,0x258,0x258,0x258,0x1899,0x1899,0x1899,0x1899,0x25b,0x25b,0x189c,0x189c, +0x189c,0x189c,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1896, +0x1887,0x188a,0x188d,0x189f,0x189f,0x25b,0x1890,0x1890,0x18ae,0x18b1,0x18c0,0x18c0,0x18b1,0x18b4,0x18ae,0x18ab, +0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x261,0x1899,0x1884,0x1884,0x1884,0x1884,0x1884,0x1884,0x1896, +0x1896,0x1884,0x1884,0x1884,0x1899,0x1899,0x1899,0x1899,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x18db,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f, +0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x27f,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264,0x264, +0x264,0x264,0x264,0x264,0x264,0x264,0x933,0x933,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, +0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0x267,0x267, +0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x267,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6, +0x18c6,0x18c6,0x18c6,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a, +0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0x26a,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0x128d,0x128d,0x128d,0x26d,0x26d,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xe7c,0xe7c,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d, +0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d,0x26d, +0x26d,0x26d,0x26d,0x26d,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, +0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0x270,0x270,0x270,0x270,0x270, +0x270,0x270,0x270,0x270,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0x273,0x273,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x276,0x276,0x276,0x276,0x276,0x276,0x276, +0x276,0x276,0x276,0x276,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x279,0x279,0x1785,0x1785,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c,0x27c, +0x27c,0x27c,0x27c,0x27c,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18db,0x18db,0x18db,0x18db,0x1101,0x378,0x378,0x384,0xc8d,0x387,0x387,0x387,0x387,0x387,0x387,0x387, +0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387, +0x387,0x387,0x387,0x387,0x384,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x378,0x384,0x384,0x384, +0x384,0x37e,0x1104,0x12db,0x387,0x900,0x903,0x37b,0x37b,0x1101,0x12d8,0x12d8,0x38a,0x38a,0x38a,0x38a, +0x38a,0x38a,0x38a,0x38a,0x387,0x387,0x378,0x378,0x87f,0x882,0x91b,0x91b,0x91b,0x91b,0x91b,0x91b, +0x91b,0x91b,0x91b,0x91b,0x381,0xf63,0xf60,0x12de,0x12de,0x12de,0x12de,0x12de,0x14af,0x1107,0x1107,0xeb5, +0xeb5,0xd80,0xeb5,0xeb5,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x387,0x38a,0x387,0x387, +0x387,0x387,0x387,0x387,0x387,0x38a,0x387,0x387,0x38a,0x387,0x387,0x387,0x387,0x387,0x12d8,0x12db, +0x37b,0x387,0x384,0x384,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x12e4,0x429,0x429, +0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x429,0x12e4,0x1857, +0x1857,0xf81,0x41a,0x423,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465, +0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0x465,0xb79,0xb79,0xd8c,0xd8c,0x885, +0xd8f,0x13ce,0x13ce,0x13ce,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468, +0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468,0x468, +0x468,0x468,0x468,0x468,0x46e,0x46e,0x46e,0x111c,0x111c,0x111c,0x111c,0x111c,0x46b,0x46b,0x46b,0x46b, +0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b, +0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x46b,0x1119,0x1119, +0x1119,0x1119,0x1119,0x1119,0x471,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e, +0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x46e,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474, +0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474, +0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x474,0x474,0x474,0x474,0x477,0x975, +0xfb1,0xfb1,0xfb4,0xfb1,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474, +0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0x47a,0x474,0xfb4,0xfb1, +0xfb4,0xfb1,0xfb4,0xfb1,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x486,0x489,0x489,0x489,0x489, +0x489,0x489,0x489,0x489,0x666,0x666,0x669,0x4a4,0x675,0x672,0x672,0x66f,0x4ce,0x4ce,0x48c,0x48c, +0x48c,0x48c,0x48c,0xaa7,0x678,0x4b0,0x690,0x693,0x4c5,0x678,0x4b3,0x4b3,0x4a4,0x4bf,0x4bf,0x666, +0x4cb,0x4c8,0x66c,0x49e,0x495,0x495,0x498,0x498,0x498,0x498,0x498,0x49b,0x498,0x498,0x498,0x48f, +0x4d7,0x4d4,0x4d1,0x4d1,0x684,0x4b9,0x4b6,0x681,0x67e,0x67b,0x68d,0x4a7,0x68a,0x68a,0x4bc,0x4bf, +0x687,0x687,0x4bc,0x4bf,0x4a1,0x4a4,0x4a4,0x4a4,0x4c2,0x4ad,0x4aa,0xb8e,0xaad,0xab0,0xaaa,0xaaa, +0xaaa,0xaaa,0xb85,0xb85,0xb85,0xb85,0xb8b,0xcba,0xcb7,0xd9b,0xd9e,0xb88,0xd9e,0xd9e,0xd9e,0xd9e, +0xd9b,0xd9e,0xd9e,0xb82,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4fb,0x4f8,0x4fe,0x714,0x4fb,0x978, +0x999,0xab3,0xab3,0xab3,0xb94,0xb94,0xda4,0xda4,0xda4,0xda4,0x1125,0x1128,0x1128,0x12f9,0x149d,0x14c7, +0x14ca,0x14ca,0x16dd,0x185a,0x50a,0x50a,0x522,0x6a2,0x507,0x69f,0x50a,0x51f,0x507,0x6a2,0x519,0x522, +0x522,0x522,0x519,0x519,0x522,0x522,0x522,0x6ab,0x507,0x522,0x6a5,0x507,0x516,0x522,0x522,0x522, +0x522,0x522,0x507,0x507,0x50d,0x69f,0x6a8,0x507,0x522,0x507,0x6ae,0x507,0x522,0x510,0x528,0x6b1, +0x522,0x522,0x513,0x519,0x522,0x522,0x525,0x522,0x519,0x51c,0x51c,0x51c,0x51c,0xabc,0xab9,0xcbd, +0xdad,0xba9,0xbac,0xbac,0xba6,0xba3,0xba3,0xba3,0xba3,0xbac,0xba9,0xba9,0xba9,0xba9,0xba0,0xba3, +0xdaa,0xec1,0xec4,0xfba,0x112b,0x112b,0x112b,0x6b7,0x6b4,0x52b,0x52e,0x52e,0x52e,0x52e,0x52e,0x6b4, +0x6b7,0x6b7,0x6b4,0x52e,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd,0x6bd, +0x537,0x537,0x537,0x537,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x6ba,0x531,0x531, +0x531,0x531,0x531,0x531,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x543,0x543,0x53d, +0x53d,0x53d,0x540,0x53a,0x53d,0x53d,0x53a,0x53a,0x53a,0x53a,0x53d,0x53d,0x6c0,0x6c0,0x53a,0x53a, +0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x540,0x540,0x540, +0x53d,0x53d,0x6c3,0x53d,0x6c3,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53d,0x53a,0x53d,0x53a,0x53a, +0x53a,0x53a,0x53a,0x53a,0x53d,0x53d,0x53a,0x6c0,0x53a,0x53a,0x53a,0xac2,0xac2,0xac2,0xac2,0xac2, +0xac2,0xac2,0xac2,0xac2,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf,0xbaf, +0x6c9,0x546,0x6c9,0x6c9,0x549,0x546,0x546,0x6c9,0x6c9,0x549,0x546,0x6c9,0x549,0x546,0x546,0x6c9, +0x546,0x6c9,0x555,0x552,0x546,0x6c9,0x546,0x546,0x546,0x546,0x6c9,0x546,0x546,0x6c9,0x6c9,0x6c9, +0x6c9,0x546,0x546,0x6c9,0x549,0x6c9,0x549,0x6c9,0x6c9,0x6c9,0x6c9,0x6c9,0x6cf,0x54c,0x6c9,0x54c, +0x54c,0x546,0x546,0x546,0x6c9,0x6c9,0x6c9,0x6c9,0x546,0x546,0x546,0x546,0x6c9,0x6c9,0x546,0x546, +0x546,0x549,0x546,0x546,0x549,0x546,0x546,0x549,0x6c9,0x549,0x546,0x546,0x6c9,0x546,0x546,0x546, +0x546,0x546,0x6c9,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546, +0x6cc,0x6c9,0x549,0x546,0x6c9,0x6c9,0x6c9,0x6c9,0x546,0x546,0x6c9,0x6c9,0x546,0x549,0x6cc,0x6cc, +0x549,0x549,0x546,0x546,0x549,0x549,0x546,0x546,0x549,0x549,0x546,0x546,0x546,0x546,0x546,0x546, +0x549,0x549,0x6c9,0x6c9,0x549,0x549,0x6c9,0x6c9,0x549,0x549,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x6c9,0x546,0x546,0x546,0x6c9,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x6c9,0x546,0x546,0x546,0x546,0x546,0x546,0x549,0x549,0x549,0x549,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x6c9,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546, +0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x546,0x549,0x549,0x549,0x549, +0x546,0x546,0x546,0x546,0x546,0x546,0x549,0x549,0x549,0x549,0x546,0x54f,0x546,0x546,0xbb2,0xbb2, +0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0xbb2,0x558,0xac5,0x558,0x558, +0x558,0x558,0x558,0x558,0x564,0x561,0x564,0x561,0x558,0x558,0x558,0x558,0x558,0x558,0x6d2,0x558, +0x558,0x558,0x558,0x558,0x558,0x558,0x7d4,0x7d4,0x558,0x558,0x558,0x558,0x55e,0x55e,0x558,0x558, +0x558,0x558,0x558,0x558,0x55b,0x7da,0x7d7,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, +0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558, +0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0x558,0xac5,0xbb8,0xac5,0xac5,0xac5, +0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567, +0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567,0x567, +0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x56d,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e, +0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xc1e,0xd32, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e4,0x6e4,0x6e4,0x6e4,0x570,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573,0x573, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x573,0x573,0x573,0x573, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7,0x6e7, +0x576,0x576,0x6e7,0x6e7,0x6e7,0x6e7,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb,0xbbb, +0x6ed,0x6ed,0x579,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x6ea,0x57c,0x57c,0x579,0x579,0x57f,0x57f, +0x57f,0x57f,0x6ed,0x6ed,0x57f,0x57f,0x6f0,0x6ed,0x579,0x579,0x579,0x579,0x6ed,0x6ed,0x57f,0x57f, +0x6f0,0x6ed,0x579,0x579,0x579,0x579,0x6ed,0x6ed,0x6ea,0x579,0x57f,0x6ed,0x579,0x579,0x6ea,0x6ed, +0x6ed,0x6ed,0x57f,0x57f,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579,0x579, +0x579,0x579,0x6ed,0x6ea,0x6ed,0x6ea,0x579,0x57f,0x57f,0x57f,0x57f,0x57f,0x57f,0x579,0x579,0x6ea, +0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xacb,0xbbe,0xbbe,0xbbe,0xbc1,0xbc1,0xc36,0xc36,0xbbe, +0x58b,0x58b,0x58b,0x58b,0x588,0x6ff,0x6ff,0x582,0x582,0x6f3,0x582,0x582,0x582,0x582,0x6f9,0x6f3, +0x582,0x588,0x582,0x582,0xd3b,0xd3b,0xbc4,0xbc4,0xdbc,0xace,0x585,0x585,0x6f6,0x58e,0x6f6,0x585, +0x588,0x582,0x588,0x588,0x582,0x582,0x588,0x582,0x582,0x582,0x588,0x582,0x582,0x582,0x588,0x588, +0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x588,0x58b,0x58b,0x585,0x582,0x582,0x582,0x582, +0x705,0x582,0x705,0x582,0x582,0x582,0x582,0x582,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd,0x7dd, +0x7dd,0x7dd,0x7dd,0x7dd,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582,0x582, +0x702,0x6ff,0x591,0x702,0x6f3,0x6f9,0x588,0x6f3,0x6fc,0x6f3,0x6f3,0x582,0x6f3,0x6ff,0x591,0x6ff, +0xace,0xace,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbca,0xbc7,0xbc7,0xdb3,0xe73, +0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594,0x594, +0x594,0x594,0x594,0x594,0x597,0x1383,0x1383,0x1383,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597, +0x14d3,0x59d,0x5a9,0x59d,0x59d,0x1383,0x597,0x597,0x5ac,0x5a9,0x1386,0x1386,0x5af,0x5af,0x597,0x5a3, +0x597,0x597,0x5a3,0x597,0x5a3,0x597,0x5a3,0x597,0x597,0x597,0x597,0x597,0x597,0x5a3,0x597,0x597, +0x597,0x597,0x597,0x597,0x1383,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x5a3, +0x5a3,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x70b,0x597,0x597,0x597,0x597,0x597,0x597, +0x5a3,0x597,0x597,0x5a3,0x597,0x597,0x597,0x597,0x1383,0x597,0x1383,0x597,0x597,0x597,0x597,0x1383, +0x1383,0x1383,0x597,0x1287,0x597,0x597,0x597,0x5a0,0x5a0,0x5a0,0x5a0,0x1305,0x1305,0x597,0x59a,0x5a6, +0x5ac,0x597,0x597,0x597,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd,0xbd0,0xbcd, +0xbd0,0xbcd,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x708,0x597,0x5a3,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x1383,0x597,0x597,0x597, +0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x597,0x1383,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d0,0x5d6,0x5c7,0x5ca,0x5d6,0x5d6,0x5d6,0x5d6, 0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, -0x5d9,0x13c5,0x13c5,0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x1515,0x5df,0x5eb,0x5df, -0x5df,0x13c5,0x5d9,0x5d9,0x5ee,0x5eb,0x13c8,0x13c8,0x5f1,0x5f1,0x5d9,0x5e5,0x5d9,0x5d9,0x5e5,0x5d9, -0x5e5,0x5d9,0x5e5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5e5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, -0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5e5,0x5e5,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x74d,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5e5,0x5d9,0x5d9,0x5e5, -0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x5d9,0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x13c5,0x13c5,0x5d9,0x12c9, -0x5d9,0x5d9,0x5d9,0x5e2,0x5e2,0x5e2,0x5e2,0x1347,0x1347,0x5d9,0x5dc,0x5e8,0x5ee,0x5d9,0x5d9,0x5d9, -0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0xc12,0xc0f,0x74a,0x74a, -0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x74a,0x5d9,0x5e5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, -0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x13c5,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x61b,0x61b,0x61b,0x61b, -0x61b,0x61b,0x61b,0x61b,0x612,0x618,0x609,0x60c,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x60f,0x60f,0x60f,0x60f,0x60f,0x60f,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612, -0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612, -0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612, -0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612,0x615,0x61b,0x618,0x612, -0x615,0x61b,0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612,0x618,0x612,0x615,0x61b,0x618,0x612, -0x615,0x61b,0x618,0x612,0x618,0x612,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a,0x134a, -0x134a,0x134a,0x134a,0x134a,0x618,0x612,0x618,0x612,0x618,0x612,0x615,0x61b,0x615,0x61b,0x618,0x612, -0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x618,0x612,0x615,0x618,0x612,0x615, -0x618,0x612,0x615,0x61b,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x615,0x615,0x612,0x615,0x612,0x615,0x612,0x612,0x615,0x612,0x612,0x615, -0x612,0x615,0x612,0x612,0x615,0x612,0x615,0x615,0x612,0x612,0x612,0x615,0x612,0x612,0x612,0x612, -0x612,0x615,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612, -0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x612,0x615,0x615,0x612,0x612,0x615,0x612,0x615,0x612, -0x612,0x612,0x612,0x612,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x615, -0x615,0x615,0x615,0x615,0x615,0x615,0x615,0x61b,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b, -0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x61b,0x618,0x618,0x618, -0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x618,0x61e,0x61e,0x61e,0x61e,0x1008,0x1008,0x1008,0x1518, -0x1518,0x1518,0x1518,0x1518,0x1518,0x1518,0x1722,0x1722,0x87f,0x885,0x885,0x891,0x891,0x882,0x879,0x882, -0x879,0x882,0x879,0x882,0x879,0x882,0x879,0x882,0x62d,0x62d,0x627,0x62d,0x627,0x62d,0x627,0x62d, -0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62a, -0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62d,0x627,0x62d,0x627,0x62d, -0x627,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a, -0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a,0x630,0x62d,0x627,0x62a, -0x630,0x62d,0x627,0x62a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a, -0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x71a,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717, -0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717, -0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x717,0x720,0x720,0x720,0x720,0x720,0x720, -0x720,0x720,0x720,0x720,0x720,0x720,0x723,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720,0x720, -0x720,0x720,0x720,0x720,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d,0x71d, -0x71d,0x71d,0x71d,0x71d,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726, -0x726,0x726,0x726,0x726,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750, -0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750,0x750, -0x750,0x750,0x750,0x750,0xc66,0x8e5,0x8df,0x8dc,0x8e2,0x8d9,0x765,0x768,0x768,0x768,0x768,0x768, -0x768,0x768,0x768,0x768,0x8eb,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765, -0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765,0x765, -0x765,0x765,0x765,0x765,0x765,0x765,0x8e8,0x8e8,0x76b,0x8fa,0x8fd,0x903,0x825,0x831,0x918,0x82e, -0x8f1,0x8ee,0x8f1,0x8ee,0x8f7,0x8f4,0x8f7,0x8f4,0x8f1,0x8ee,0x82b,0x903,0x8f1,0x8ee,0x8f1,0x8ee, -0x8f1,0x8ee,0x8f1,0x8ee,0x906,0x90f,0x90c,0x90c,0x771,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7ad,0x7a7, -0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7,0x7a7, -0x7a7,0x7a7,0x7a7,0x774,0x78f,0x76e,0x795,0x798,0x792,0x7aa,0x7aa,0x7aa,0x7aa,0x7aa,0x7aa,0x7a4, -0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4,0x7a4, -0x7a4,0x7a4,0x7a4,0x774,0x78f,0x76e,0x78f,0xc69,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, -0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813, -0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x813,0x12c3,0x12c3,0x12c3,0x12c3,0x12c3,0x816, -0x82b,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x82e,0x94e,0x94e,0x94e,0x94e,0x834,0x834, -0x909,0x915,0x915,0x915,0x915,0x912,0x828,0x900,0xb34,0xb34,0xb34,0xc7b,0xc99,0xc96,0xb4f,0x8d6, -0x83a,0x837,0x83a,0x83d,0x837,0x83a,0x837,0x83a,0x837,0x83a,0x837,0x837,0x837,0x837,0x837,0x837, -0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x83a,0x83a,0x837,0x837, -0xc9c,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x846,0x849,0x846,0x849,0x846, -0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x849,0x846, -0x849,0x846,0x849,0x84c,0x846,0x849,0x846,0x849,0x846,0x849,0x846,0x846,0x846,0x846,0x846,0x846, -0x849,0x849,0x846,0x849,0x849,0x846,0x849,0x849,0x846,0x849,0x849,0x846,0x849,0x849,0x846,0x846, -0x846,0x846,0x846,0x84c,0x846,0x84c,0x846,0x84c,0x846,0x846,0x846,0x846,0x846,0x846,0x84c,0x846, -0x846,0x846,0x846,0x846,0x849,0x84c,0x84c,0x849,0x849,0x849,0x849,0x91e,0x921,0x84f,0x852,0xc84, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, -0x85b,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858, -0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x858,0x864,0x864,0x864,0x864, -0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864, -0x864,0x864,0x864,0x864,0x864,0x864,0x864,0x864,0xd86,0xd86,0xeb8,0x85e,0x92a,0x92a,0x92a,0x92a, -0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0xd80,0xd80,0xd80,0xd80,0x867,0x867,0x867,0x867, -0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x867,0x933,0x933,0x933,0x933, -0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x86a,0x86a,0x86a, -0x86a,0x86a,0x86a,0xd89,0xd89,0xd89,0xd89,0x936,0x936,0x936,0x936,0x936,0x86a,0x86a,0x86a,0x86a, -0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a, -0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0x86a,0xd89,0xd89, -0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d, -0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d,0x86d, -0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870, -0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870, -0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0x870,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb, -0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb,0xebb, -0x112b,0x112b,0x112b,0x112b,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873, -0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x873, -0x873,0x873,0x873,0x873,0x873,0x873,0x876,0x876,0x873,0x876,0x873,0x876,0x876,0x873,0x873,0x873, -0x873,0x873,0x873,0x873,0x873,0x873,0x873,0x876,0x873,0x876,0x873,0x876,0x876,0x873,0x873,0x876, -0x876,0x876,0x873,0x873,0x873,0x873,0x14cd,0x14cd,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, -0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a, -0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a, -0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x92a,0x12ff,0x12ff,0x12ff,0x12ff,0x12a8,0x12a8,0x12a8,0x12a8, -0x12a8,0x12a8,0x12a8,0x12a8,0xd80,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87, -0xc87,0xc87,0xc87,0xc87,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, -0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x930,0x92d,0x930,0x92d,0x92d, -0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d,0x92d, -0x92d,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87,0xc87, -0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933, -0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0x933,0xd89, -0x9b1,0x993,0x993,0x993,0x993,0x98d,0x993,0x993,0x9a5,0x993,0x993,0x990,0x99c,0x9a2,0x9a2,0x9a2, -0x9a2,0x9a2,0x9a5,0x98d,0x999,0x98d,0x98d,0x98d,0x984,0x984,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, -0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x9a8,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, -0x98d,0x98d,0x98d,0x98d,0x990,0x984,0x98d,0x984,0x98d,0x984,0x99f,0x996,0x99f,0x996,0x9ae,0x9ae, -0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd, -0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd,0x9bd, -0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, -0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0,0x9c0, -0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3, -0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3,0x9c3, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9c6,0x9c6, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9c9,0x9c9, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, -0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc,0x9cc, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, -0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf,0x9cf, -0x9d2,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, -0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d2,0x9d5,0x9d5,0x9d5, -0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5, -0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0x9d5,0xa62,0xa62,0xfed,0xa62,0xa62,0xa62,0xa65,0xa62, -0xfed,0xa62,0xa62,0xfe4,0xa5c,0xa50,0xa50,0xa50,0xa50,0xa5f,0xa50,0xfd2,0xfd2,0xfd2,0xa50,0xa53, -0xa5c,0xa56,0xfd8,0xfe7,0xfe7,0xfd2,0xfd2,0xfed,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, -0xb55,0xb55,0xa68,0xa68,0xa59,0xa59,0xa59,0xa59,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa5f,0xa5f, -0xa50,0xa50,0xfed,0xfed,0xfed,0xfed,0xfd2,0xfd2,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62, -0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa62,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xdda, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xdda,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77,0xa77, -0xa77,0xa77,0xa77,0xa77,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, -0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d,0xa7d, -0xa7d,0xa7d,0xa7d,0xa7d,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, -0xa83,0xa80,0xa86,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0x1164,0x1164,0x1164,0x1164,0x1164, -0x1164,0x1164,0x1164,0x1164,0x1161,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, -0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83, -0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa83,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, -0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98, -0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xa98,0xabc,0xabc,0xabc,0xabf,0xabf,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xaa4,0xaa4,0xab9,0xa9b, -0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xab9,0xab9,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc, -0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xabc,0xadd,0xadd,0xadd,0xadd,0xadd,0xac8,0xac8,0xadd, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, -0xadd,0xadd,0xadd,0xae0,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, -0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd,0xadd, -0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07, -0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xb07,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xb13, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, -0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25,0xb25, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd,0x5cd, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0, +0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308, +0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x1308,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d3,0x5d9, +0x5d3,0x5d9,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0,0x5d6,0x5d0, +0x5d3,0x5d6,0x5d0,0x5d3,0x5d6,0x5d0,0x5d3,0x5d9,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d0,0x5d3,0x5d0,0x5d3,0x5d0,0x5d0, +0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d3,0x5d0,0x5d0,0x5d3,0x5d0,0x5d3,0x5d3,0x5d0,0x5d0,0x5d0,0x5d3, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0, +0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d0,0x5d0, +0x5d3,0x5d0,0x5d3,0x5d0,0x5d0,0x5d0,0x5d0,0x5d0,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3, +0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d3,0x5d9,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6, +0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d9,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9,0x5d9, +0x5d9,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5d6,0x5dc,0x5dc,0x5dc,0x5dc, +0xfc6,0xfc6,0xfc6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x14d6,0x16e3,0x16e3,0x831,0x837,0x837,0x843, +0x843,0x834,0x82b,0x834,0x82b,0x834,0x82b,0x834,0x82b,0x834,0x82b,0x834,0x5eb,0x5eb,0x5e5,0x5eb, +0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb, +0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5eb, +0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8, +0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8, +0x5ee,0x5eb,0x5e5,0x5e8,0x5ee,0x5eb,0x5e5,0x5e8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8, +0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d8,0x6d5,0x6d5,0x6d5,0x6d5, +0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5, +0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6d5,0x6de,0x6de, +0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6e1,0x6de,0x6de,0x6de,0x6de,0x6de, +0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6de,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db, +0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6db,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4, +0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x6e4,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e, +0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e, +0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0x70e,0xc24,0x897,0x891,0x88e,0x894,0x88b,0x723,0x726, +0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x726,0x89d,0x723,0x723,0x723,0x723,0x723,0x723,0x723, +0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723, +0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x723,0x89a,0x89a,0x72c,0x768,0x768,0x768, +0x768,0x768,0x768,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x762, +0x762,0x762,0x762,0x762,0x762,0x762,0x762,0x72f,0x74a,0x729,0x750,0x753,0x74d,0x765,0x765,0x765, +0x765,0x765,0x765,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f, +0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x75f,0x72f,0x74a,0x729,0x74a,0xc27,0x7ce,0x7ce,0x7ce,0x7ce, +0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce, +0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x7ce,0x1281,0x1281, +0x1281,0x1281,0x1281,0x7d1,0x8a0,0x8b8,0x8bb,0x8c1,0x8a3,0x7e3,0x8d6,0x7e0,0x8af,0x8a9,0x8af,0x8a9, +0x8b5,0x8b2,0x8b5,0x8b2,0x8af,0x8a9,0x8ac,0x8c1,0x8af,0x8a9,0x8af,0x8a9,0x8af,0x8a9,0x8af,0x8a9, +0x8c4,0x8cd,0x8ca,0x8ca,0x8ac,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x7e0,0x90c,0x90c, +0x90c,0x90c,0x7e6,0x7e6,0x8c7,0x8d3,0x8d3,0x8d3,0x8d3,0x8d0,0x8a6,0x8be,0xaf2,0xaf2,0xaf2,0xc39, +0xc57,0xc54,0xb0d,0x888,0x7ec,0x7e9,0x7ec,0x7ef,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7ec,0x7e9,0x7e9, +0x7e9,0x7e9,0x7e9,0x7e9,0x7ec,0x7ec,0x7e9,0x7ec,0x7ec,0x7e9,0x7ec,0x7ec,0x7e9,0x7ec,0x7ec,0x7e9, +0x7ec,0x7ec,0x7e9,0x7e9,0xc5a,0x7fe,0x7f8,0x7fe,0x7f8,0x7fe,0x7f8,0x7fe,0x7f8,0x7fe,0x7f8,0x7f8, +0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8, +0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7fe,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7fb,0x7f8,0x7f8, +0x7f8,0x7f8,0x7f8,0x7f8,0x7fb,0x7fb,0x7f8,0x7fb,0x7fb,0x7f8,0x7fb,0x7fb,0x7f8,0x7fb,0x7fb,0x7f8, +0x7fb,0x7fb,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7fe,0x7f8,0x7fe,0x7f8,0x7fe,0x7f8,0x7f8,0x7f8,0x7f8, +0x7f8,0x7f8,0x7fe,0x7f8,0x7f8,0x7f8,0x7f8,0x7f8,0x7fb,0x7fe,0x7fe,0x7fb,0x7fb,0x7fb,0x7fb,0x8dc, +0x8df,0x801,0x804,0xc42,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80d,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, +0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a,0x80a, +0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816, +0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0x816,0xd44,0xd44,0xe76,0x810, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0xd3e,0xd3e,0xd3e,0xd3e, +0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819,0x819, +0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1, +0x8f1,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0xd47,0xd47,0xd47,0xd47,0x8f4,0x8f4,0x8f4,0x8f4,0x8f4, +0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, +0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c,0x81c, +0x81c,0x81c,0xd47,0xd47,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, +0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f,0x81f, +0x81f,0x81f,0x81f,0x81f,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x822,0x822,0x822,0x822, +0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822, +0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0x822,0xe79,0xe79, +0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79,0xe79, +0xe79,0xe79,0xe79,0xe79,0x10e9,0x10e9,0x10e9,0x10e9,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825, +0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x828,0x828,0x825,0x828,0x825,0x828, +0x828,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x825,0x828,0x825,0x828,0x825,0x828, +0x828,0x825,0x825,0x828,0x828,0x828,0x825,0x825,0x825,0x825,0x148b,0x148b,0xc4b,0xc4b,0xc4b,0xc4b, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0x8e8,0x8e8,0x8e8,0x8e8, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8, +0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x8e8,0x12bd,0x12bd,0x12bd,0x12bd, +0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0xd3e,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8ee, +0x8eb,0x8ee,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0x8eb, +0x8eb,0x8eb,0x8eb,0x8eb,0x8eb,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, +0xc45,0xc45,0xc45,0xc45,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1, +0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1,0x8f1, +0x8f1,0x8f1,0x8f1,0xd47,0x96f,0x951,0x951,0x951,0x951,0x94b,0x951,0x951,0x963,0x951,0x951,0x94e, +0x95a,0x960,0x960,0x960,0x960,0x960,0x963,0x94b,0x957,0x94b,0x94b,0x94b,0x942,0x942,0x94b,0x94b, +0x94b,0x94b,0x94b,0x94b,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x966,0x94b,0x94b, +0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94b,0x94e,0x942,0x94b,0x942,0x94b,0x942,0x95d,0x954, +0x95d,0x954,0x96c,0x96c,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, +0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b,0x97b, +0x97b,0x97b,0x97b,0x97b,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e, +0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e,0x97e, +0x97e,0x97e,0x97e,0x97e,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981,0x981, +0x981,0x981,0x981,0x981,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x984,0x984,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x987,0x987,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a,0x98a, +0x98a,0x98a,0x98a,0x98a,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d,0x98d, +0x98d,0x98d,0x98d,0x98d,0x990,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993, +0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993, +0x990,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993, +0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0x993,0xa20,0xa20,0xfab,0xa20, +0xa20,0xa20,0xa23,0xa20,0xfab,0xa20,0xa20,0xfa2,0xa1a,0xa0e,0xa0e,0xa0e,0xa0e,0xa1d,0xa0e,0xf90, +0xf90,0xf90,0xa0e,0xa11,0xa1a,0xa14,0xf96,0xfa5,0xfa5,0xf90,0xf90,0xfab,0xb13,0xb13,0xb13,0xb13, +0xb13,0xb13,0xb13,0xb13,0xb13,0xb13,0xa26,0xa26,0xa17,0xa17,0xa17,0xa17,0xa20,0xa20,0xa20,0xa20, +0xa20,0xa20,0xa1d,0xa1d,0xa0e,0xa0e,0xfab,0xfab,0xfab,0xfab,0xf90,0xf90,0xa20,0xa20,0xa20,0xa20, +0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20, +0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa20,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xd98,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xd98,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35, +0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa35,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b, +0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa3b,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, +0xa41,0xa41,0xa41,0xa41,0xa41,0xa3e,0xa44,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0x1122, +0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x1122,0x111f,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, +0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41, +0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa41,0xa56,0xa56,0xa56,0xa56, +0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56, +0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa56,0xa7a,0xa7a,0xa7a,0xa7d, +0xa7d,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a, +0xa62,0xa62,0xa77,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa59,0xa77,0xa77,0xa7a,0xa7a,0xa7a,0xa7a, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a, +0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa7a,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa86,0xa86,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9e,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b,0xa9b, +0xa9b,0xa9b,0xa9b,0xa9b,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5, +0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xac5,0xbb8, +0xbb8,0xbb8,0xbb8,0xbb8,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1,0xad1, +0xad1,0xad1,0xad1,0xad1,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3,0xae3, +0xae3,0xae3,0xae3,0xae3,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, +0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9,0xae9, +0xae9,0xae9,0xae9,0xae9,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, +0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8,0xaf8, +0xaf8,0xaf8,0xaf8,0xaf8,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafe,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb, +0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xafb,0xb01,0xb01,0xc48,0xc48, +0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01, +0xc48,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb01,0xb22,0xb22,0xb22,0xb22, +0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22, +0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0xb22,0x14d9,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2b,0xb2b,0xccf,0xccf,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28, +0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xb28,0xccc,0xccc, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, 0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, 0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b,0xb2b, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e, +0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e,0xb2e, +0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb34,0xb40,0xb46,0xb46,0xb46,0xb3a,0xb3a,0xb3a,0xb43,0xb37,0xb37, +0xb37,0xb37,0xb37,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb31,0xb46,0xb46,0xb46,0xb46,0xb46, 0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, 0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb40,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d, -0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb43,0xb43,0xc8a,0xc8a,0xb43,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xc8a,0xb43,0xb43,0xb43, -0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb43,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64, -0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64, -0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0xb64,0x151b,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xd11,0xd11, -0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a, -0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xb6a,0xd0e,0xd0e,0xd5f,0xd5f,0xd5f,0xd5f, -0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xb6d,0xb6d,0xb6d,0xb6d, -0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d, -0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb6d,0xb70,0xb70,0xb70,0xb70, -0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70, -0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb70,0xb7f,0xb7f,0xb7f,0xb7f, -0xb7f,0xb76,0xb82,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb85,0xb79,0xb79,0xb79,0xb79,0xb79,0xb73, -0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb73,0xb88,0xb88,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7f,0xb7f, -0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb88,0xb88,0xb88,0xb88,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7f,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c, -0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0xb7c,0x1725,0x1725,0xb94,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb8b,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb8e,0xb8e,0xb8e,0xb8e, -0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e, -0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb8e,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb94, -0xb94,0xb94,0xb94,0xb94,0xb94,0xb94,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91,0xb91, -0xb94,0xb94,0xb94,0xb94,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, -0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97,0xb97, -0xb97,0xb97,0xb97,0xb97,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, -0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d,0xb9d, -0xb9d,0xb9d,0xb9d,0xb9d,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, -0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0,0xba0, -0xba0,0xba0,0xba0,0xba0,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa, -0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbfa,0xbf7,0xbfa,0xbf7,0xbf7,0xbf7,0xbf7, -0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xbf7,0xd02,0xd05,0xdf2,0xdf2,0xdf2, -0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xdf2,0xf0f,0xf0f,0xf0f,0xf0f,0xc09,0xc09,0xc09,0xc09, -0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xdf8,0xeb2, -0xdf8,0xdfb,0xdfb,0xdf8,0xdf5,0xdf8,0xdf5,0xdf8,0xdf8,0x1002,0x1299,0x1299,0xe04,0xe04,0xe04,0xe04, -0xe04,0xe0a,0xe07,0xf21,0xf21,0xf21,0xf21,0x1416,0x1014,0x1416,0x1353,0x1353,0xc3f,0xc3f,0xc3f,0xc3f, -0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc3f,0xc6f,0xc6c, -0xc6f,0xc6c,0xc6f,0xc6c,0x1125,0x1122,0x101a,0x1017,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42, -0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc42,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, -0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, -0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45,0xc48,0xc48,0xc45,0xc45,0xc45,0xc45,0xc45,0xc45, -0xc45,0xc45,0xc45,0xc45,0xc4b,0xc4b,0xc4b,0xc51,0xc4e,0xc75,0xc72,0xc51,0xc4e,0xc51,0xc4e,0xc51, -0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc51,0xc4e,0xc4b,0xc4b,0xc4b, -0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, -0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, -0xc51,0xc4e,0xc51,0xc4e,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, +0xb3a,0xb3a,0xb3d,0xb3d,0xb46,0xb46,0xb46,0xb3a,0xb3a,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46,0xb46, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb46,0xb46,0xb46,0xb46,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3d,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a, +0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0xb3a,0x16e6,0x16e6,0xb52,0xb49,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb49,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb49,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c,0xb4c, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52, +0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb52,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f,0xb4f, +0xb4f,0xb4f,0xb4f,0xb4f,0xb52,0xb52,0xb52,0xb52,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, +0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55, +0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb55,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, +0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b, +0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5b,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e, +0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xb5e,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8, +0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb8,0xbb5,0xbb8, +0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xbb5,0xcc0, +0xcc3,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xdb0,0xecd,0xecd,0xecd,0xecd, +0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xbc7,0xcc6,0xcc6,0xcc6,0xcc6,0xcc6,0xcc6, +0xcc6,0xcc6,0xdb6,0xe70,0xdb6,0xdb9,0xdb9,0xdb6,0xdb3,0xdb6,0xdb3,0xdb6,0xdb6,0xfc0,0x1257,0x1257, +0xdc2,0xdc2,0xdc2,0xdc2,0xdc2,0xdc8,0xdc5,0xedf,0xedf,0xedf,0xedf,0x13d4,0xfd2,0x13d4,0x1311,0x1311, +0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd,0xbfd, +0xbfd,0xbfd,0xc2d,0xc2a,0xc2d,0xc2a,0xc2d,0xc2a,0x10e3,0x10e0,0xfd8,0xfd5,0xc00,0xc00,0xc00,0xc00, +0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc00,0xc03,0xc03,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc06,0xc06,0xc03,0xc03, +0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc03,0xc09,0xc09,0xc09,0xc0f,0xc0c,0xc33,0xc30,0xc0f, +0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f,0xc0c,0xc0f, +0xc0c,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc0f,0xc0c,0xc0f,0xc0c,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09,0xc09, +0xc09,0xc09,0xc09,0xc09,0xc0f,0xc0c,0xc09,0xc09,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc18,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc18,0xc18,0xc18,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12, +0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc12,0xc15,0xc12,0xc12,0xc12,0xc4b,0xc4b,0xc4b,0xc4b, 0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b, -0xc51,0xc4e,0xc4b,0xc4b,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, -0xc5a,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, -0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, -0xc54,0xc54,0xc54,0xc54,0xc5a,0xc5a,0xc5a,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, -0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54,0xc54, -0xc54,0xc54,0xc54,0xc54,0xc57,0xc54,0xc54,0xc54,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, -0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d, -0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xc8d,0xd0b,0xd7a,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5,0xdf5, -0xdf5,0xdf5,0xeb2,0xeb2,0xdf5,0xdf5,0xdf5,0xdf5,0xdf8,0xdf8,0xf12,0x1002,0x1002,0x1002,0x1002,0x1002, -0x1002,0x1002,0x1002,0x1002,0x1002,0x12c6,0x12c6,0x129c,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f, -0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd2f,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd35,0xd35, -0xd35,0xd35,0xd35,0xd32,0xd47,0xd47,0xd47,0xd41,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xd41,0xd47,0xd47,0xd47,0xd47,0xd3b,0xd3b,0xd44,0xd44,0xd44,0xd44,0xd38,0xd38, -0xd38,0xd38,0xd38,0xd3e,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, -0xe0d,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd41,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47,0xd47, -0xd47,0xd47,0xd47,0xd47,0xd47,0xd3b,0xd3b,0xd3b,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e, -0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e, -0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd3e,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4d,0xd4d,0xd4d, -0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xd4a,0xe13,0xe13,0xe13,0xe13,0xe13,0xe13,0xf24,0xf24,0xf24,0xf24, -0xf24,0xf24,0xf24,0x112e,0x112e,0x101d,0x101d,0x101d,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, -0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50, -0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd50,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, -0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56, -0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd56,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, -0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f, -0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd5f,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, -0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b, -0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd6b,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77, -0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77, -0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xd77,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19, -0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19, -0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe19,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1c,0xe1c,0xe1c, -0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1c,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f, -0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xe1f,0xedf,0xedf,0xe31,0xe31,0xf27,0xf27,0xf27,0xf27, -0xf27,0xf27,0xf27,0x1029,0x1029,0x1029,0x1029,0x1029,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026, -0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0x1026,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d, -0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d, -0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe40,0xe3d,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c, -0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c, -0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, -0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52, -0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe52,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a, -0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xe6a,0xf2a, -0xf2a,0xf2a,0xf2a,0x102c,0x102c,0x102c,0x102c,0x102c,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73, -0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73, -0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe73,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, +0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xc4b,0xcc9,0xd38,0xdb3,0xdb3, +0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xdb3,0xe70,0xe70,0xdb3,0xdb3,0xdb3,0xdb3,0xdb6,0xdb6,0xed0,0xfc0, +0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0xfc0,0x1284,0x1284,0x125a,0xced,0xced,0xced,0xced, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced, +0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xced,0xcfc,0xcfc,0xcfc,0xcfc, +0xcfc,0xcfc,0xcf3,0xcf3,0xcf3,0xcf3,0xcf3,0xcf0,0xd05,0xd05,0xd05,0xcff,0xd05,0xd05,0xd05,0xd05, +0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xcff,0xd05,0xd05,0xd05,0xd05,0xcf9,0xcf9,0xd02,0xd02, +0xd02,0xd02,0xcf6,0xcf6,0xcf6,0xcf6,0xcf6,0xcfc,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce, +0xdce,0xdce,0xdce,0xdce,0xdcb,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xdce,0xd05,0xd05,0xd05,0xd05, +0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xcff,0xd05,0xd05,0xd05,0xd05,0xd05, +0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xd05,0xcf9,0xcf9,0xcf9,0xcfc,0xcfc,0xcfc,0xcfc, +0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc, +0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xcfc,0xd08,0xd08,0xd08,0xd08, +0xd08,0xd0b,0xd0b,0xd0b,0xd08,0xd08,0xd08,0xd08,0xd08,0xd08,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1,0xdd1, +0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0xee2,0x10ec,0x10ec,0xfdb,0xfdb,0xfdb,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e, +0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd0e,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14, +0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd14,0xd1d,0xd1d,0xd1d,0xd1d, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d, +0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd1d,0xd29,0xd29,0xd29,0xd29, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29, +0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd29,0xd35,0xd35,0xd35,0xd35, +0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35, +0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xd35,0xdd7,0xdd7,0xdd7,0xdd7, +0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7, +0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xdd7,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd, +0xddd,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xdda,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd, +0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xddd,0xe9d,0xe9d,0xdef,0xdef, +0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xee5,0xfe7,0xfe7,0xfe7,0xfe7,0xfe7,0xfe4,0xfe4,0xfe4,0xfe4, +0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xfe4,0xdfe,0xdfb,0xdfe,0xdfb, +0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb, +0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xdfe,0xdfb,0xe0a,0xe0a,0xe0a,0xe0a, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a, +0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe0a,0xe10,0xe10,0xe10,0xe10, +0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10, +0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe10,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28,0xe28, +0xe28,0xe28,0xe28,0xee8,0xee8,0xee8,0xee8,0xfea,0xfea,0xfea,0xfea,0xfea,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31, +0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe31,0xe3a,0xe3a,0xe3a,0xe3a, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a, +0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe3a,0xe43,0xe43,0xe43,0xe43, +0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43, +0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe43,0xe3d,0xe40,0xe40,0xe40,0xe40, +0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40, +0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe40,0xe43,0xe43,0xe43,0xe43,0xe43,0xe4c,0xe4c,0xe4c,0xe4c, +0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe4c,0xe49,0xe49,0xe49,0xe49,0xe49,0xe49, +0xe49,0xe49,0xe46,0xe4f,0xff6,0xff0,0xfff,0xfed,0xe4c,0xe4c,0xfed,0xfed,0xe61,0xe61,0xe52,0xe61, +0xe61,0xe61,0xe58,0xe61,0xe61,0xe61,0xe61,0xe52,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61, +0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe61,0xe64,0xe64,0xe64,0xe64, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64, +0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe64,0xe7c,0xe7c,0xe7c,0xe7c, 0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c, -0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85, -0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85, -0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe85,0xe7f,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82, -0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82,0xe82, -0xe82,0xe82,0xe82,0xe85,0xe85,0xe85,0xe85,0xe85,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e, -0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8e,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe8b,0xe88,0xe91, -0x1038,0x1032,0x1041,0x102f,0xe8e,0xe8e,0x102f,0x102f,0xea3,0xea3,0xe94,0xea3,0xea3,0xea3,0xe9a,0xea3, -0xea3,0xea3,0xea3,0xe94,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3, -0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea3,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6, -0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6, -0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xea6,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe, -0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe, -0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xebe,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc, -0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0xedc,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137, -0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0x1137,0xf24,0xf24,0xf24,0xf24,0x101d,0x101d,0x101d,0x101d, -0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x101d,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020, -0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0xf45,0xf45,0xf45,0xf45,0xf57,0xf60,0xf63,0xf60, -0xf63,0xf60,0xf63,0xf60,0xf63,0xf60,0xf63,0xf60,0xf60,0xf60,0xf63,0xf60,0xf60,0xf60,0xf60,0xf60, -0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60,0xf60, -0xf48,0xf57,0xf45,0xf45,0xf45,0xf45,0xf45,0xf5a,0xf45,0xf5a,0xf57,0xf57,0xf6c,0xf69,0xf6c,0xf6c, -0xf6c,0xf69,0xf69,0xf6c,0xf69,0xf6c,0xf69,0xf6c,0xf69,0x1053,0x1053,0x1053,0x118e,0x104a,0x1053,0x104a, -0xf69,0xf6c,0xf69,0xf69,0x104a,0x104a,0x104a,0x104a,0x104d,0x1050,0x118e,0x118e,0xf6f,0xf6f,0x1065,0x105c, -0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x105c,0x105c,0x1065,0x105c, -0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0xf75,0xf75,0xf75,0xf75, -0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75, -0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf75,0xf84,0xf84,0xf84,0xf84, -0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84, -0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0xf84,0x154e, -0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e,0x154e, -0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a, -0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a,0xf8a, -0xfd2,0xfed,0xfe4,0xfe1,0xfe1,0xfed,0xfed,0xfe4,0xfe4,0xfe1,0xfe1,0xfe1,0xfe1,0xfe1,0xfed,0xfed, -0xfed,0xfd2,0xfd2,0xfd2,0xfd2,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed,0xfed, -0xfed,0xfed,0xfd2,0xfe4,0xfe7,0xfd2,0xfd2,0xfea,0xfea,0xfea,0xfea,0xfea,0xfea,0xfd5,0xfed,0xfea, -0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0x1158,0x1158,0x1155,0x1152,0xfdb,0xfdb, -0x1005,0x1005,0x1005,0x1005,0x12c6,0x12c6,0x129c,0x129c,0x12a2,0x1299,0x1299,0x1299,0x1299,0x129c,0x13c2,0x12a2, -0x129c,0x12a2,0x1299,0x12a2,0x12c6,0x1299,0x1299,0x1299,0x129c,0x129c,0x1299,0x1299,0x129c,0x1299,0x1299,0x129c, -0x1020,0x1020,0x1020,0x1020,0x1020,0x101d,0x101d,0x1020,0x1020,0x1020,0x1020,0x1020,0x1020,0x1527,0x1527,0x1527, -0x112e,0x101d,0x101d,0x101d,0x101d,0x12d2,0x12ab,0x12ab,0x12ab,0x12ab,0x1527,0x1527,0x1527,0x1527,0x1527,0x1527, -0x103e,0x103e,0x103b,0x1035,0x103b,0x1035,0x103b,0x1035,0x103b,0x1035,0x1032,0x1032,0x1032,0x1032,0x1047,0x1044, -0x1032,0x118b,0x1422,0x1425,0x1425,0x1422,0x1422,0x1422,0x1422,0x1422,0x1428,0x1428,0x1542,0x1536,0x1536,0x1533, -0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1059,0x1056,0x1056,0x1065,0x105c,0x1362,0x135f,0x172e, -0x1362,0x135f,0x1431,0x142e,0x1545,0x1545,0x154b,0x1545,0x154b,0x1545,0x154b,0x1545,0x154b,0x1545,0x154b,0x1545, -0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c, -0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x105c, -0x105f,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x1065,0x105c,0x1065,0x105c,0x1065,0x1065,0x105c, -0x1068,0x1068,0x106e,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074, -0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074,0x1074, -0x1074,0x106e,0x1068,0x1068,0x1068,0x1068,0x106e,0x106e,0x1068,0x1068,0x1071,0x143a,0x1437,0x1437,0x1074,0x1074, -0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x106b,0x143d,0x143d,0x143d,0x143d,0x143d,0x143d, -0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089, -0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089,0x1089, -0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092, -0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1092,0x1095,0x1095,0x1095,0x1098,0x1095,0x1095,0x109b,0x109b, -0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e, -0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e, -0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10aa,0x10a1,0x10b0,0x10ad, -0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7, -0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7,0x10a7, -0x1368,0x1365,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10bf,0x1140, -0x10b3,0x10b3,0x10b3,0x10b9,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x1440,0x10b6,0x10b6,0x10b9,0x10c5, -0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc, -0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc,0x10c2,0x10bc, -0x155a,0x1557,0x155a,0x1557,0x155d,0x155d,0x1737,0x1440,0x10ce,0x10ce,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, +0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe7c,0xe9a,0xe9a,0xe9a,0xe9a, +0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0xe9a,0x10f5,0x10f5,0x10f5,0x10f5, +0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0x10f5,0xecd,0xecd,0xecd,0xeca, +0xeca,0xeca,0xeca,0xeca,0x112e,0x137a,0x137a,0x137a,0x137a,0x12fc,0x12fc,0x12fc,0x137d,0x12ff,0x12ff,0x137d, +0x14cd,0x14cd,0x14cd,0x14cd,0x14d0,0x14d0,0x14d0,0x1797,0x1797,0x1797,0x1797,0x185d,0xee2,0xee2,0xee2,0xee2, +0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfdb,0xfde,0xfde,0xfde,0xfde, +0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xfde,0xf03,0xf03,0xf03,0xf03, +0xf15,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf21,0xf1e,0xf1e,0xf1e,0xf21,0xf1e, +0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e,0xf1e, +0xf1e,0xf1e,0xf1e,0xf1e,0xf06,0xf15,0xf03,0xf03,0xf03,0xf03,0xf03,0xf18,0xf03,0xf18,0xf15,0xf15, +0xf2a,0xf27,0xf2a,0xf2a,0xf2a,0xf27,0xf27,0xf2a,0xf27,0xf2a,0xf27,0xf2a,0xf27,0x1011,0x1011,0x1011, +0x114c,0x1008,0x1011,0x1008,0xf27,0xf2a,0xf27,0xf27,0x1008,0x1008,0x1008,0x1008,0x100b,0x100e,0x114c,0x114c, +0xf2d,0xf2d,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0x101a,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33,0xf33, +0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42, +0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42,0xf42, +0xf42,0xf42,0xf42,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c,0x150c, +0x150c,0x150c,0x150c,0x150c,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, +0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48,0xf48, +0xf48,0xf48,0xf48,0xf48,0xf90,0xfab,0xfa2,0xf9f,0xf9f,0xfab,0xfab,0xfa2,0xfa2,0xf9f,0xf9f,0xf9f, +0xf9f,0xf9f,0xfab,0xfab,0xfab,0xf90,0xf90,0xf90,0xf90,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xfab, +0xfab,0xfab,0xfab,0xfab,0xfab,0xfab,0xf90,0xfa2,0xfa5,0xf90,0xf90,0xfa8,0xfa8,0xfa8,0xfa8,0xfa8, +0xfa8,0xf93,0xfab,0xfa8,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0xf9c,0x1116,0x1116, +0x1113,0x1110,0xf99,0xf99,0xfc3,0xfc3,0xfc3,0xfc3,0x1284,0x1284,0x125a,0x125a,0x1260,0x1257,0x1257,0x1257, +0x1257,0x125a,0x1380,0x1260,0x125a,0x1260,0x1257,0x1260,0x1284,0x1257,0x1257,0x1257,0x125a,0x125a,0x1257,0x1257, +0x125a,0x1257,0x1257,0x125a,0xfde,0xfde,0xfde,0xfde,0xfde,0xfdb,0xfdb,0xfde,0xfde,0xfde,0xfde,0xfde, +0xfde,0x14e5,0x14e5,0x14e5,0x10ec,0xfdb,0xfdb,0xfdb,0xfdb,0x1290,0x1269,0x1269,0x1269,0x1269,0x14e5,0x14e5, +0x14e5,0x14e5,0x14e5,0x14e5,0xffc,0xffc,0xff9,0xff3,0xff9,0xff3,0xff9,0xff3,0xff9,0xff3,0xff0,0xff0, +0xff0,0xff0,0x1005,0x1002,0xff0,0x1149,0x13e0,0x13e3,0x13e3,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e6,0x13e6, +0x1500,0x14f4,0x14f4,0x14f1,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1017,0x1014,0x1014,0x1023, +0x101a,0x1320,0x131d,0x16ef,0x1320,0x131d,0x13ef,0x13ec,0x1503,0x1503,0x1509,0x1503,0x1509,0x1503,0x1509,0x1503, +0x1509,0x1503,0x1509,0x1503,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a,0x1023,0x101a, +0x1023,0x101a,0x1023,0x101a,0x101d,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x101a,0x1023,0x101a,0x1023, +0x101a,0x1023,0x1023,0x101a,0x1026,0x1026,0x102c,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032,0x1032, +0x1032,0x1032,0x1032,0x1032,0x1032,0x102c,0x1026,0x1026,0x1026,0x1026,0x102c,0x102c,0x1026,0x1026,0x102f,0x13f8, +0x13f5,0x13f5,0x1032,0x1032,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x1029,0x13fb,0x13fb, +0x13fb,0x13fb,0x13fb,0x13fb,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, +0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047,0x1047, +0x1047,0x1047,0x1047,0x1047,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050, +0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1050,0x1053,0x1053,0x1053,0x1056, +0x1053,0x1053,0x1059,0x1059,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c, +0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c,0x105c, +0x105c,0x105c,0x105c,0x105c,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, +0x1068,0x105f,0x106e,0x106b,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, +0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065,0x1065, +0x1065,0x1065,0x1065,0x1065,0x1326,0x1323,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a, +0x1080,0x107a,0x107d,0x10fe,0x1071,0x1071,0x1071,0x1077,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, +0x1074,0x1074,0x1077,0x1083,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a, +0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a,0x1080,0x107a, +0x1080,0x107a,0x1080,0x107a,0x1518,0x1515,0x1518,0x1515,0x151b,0x151b,0x16f8,0x13fe,0x108c,0x108c,0x108f,0x108f, +0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f, +0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108f,0x108c,0x108c,0x108c,0x108c, +0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x108c,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x1095,0x1095, +0x1095,0x1095,0x1095,0x1098,0x1098,0x1098,0x10f2,0x10a1,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0, +0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x10b0,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b,0x109b, +0x109b,0x109b,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e, +0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x109e,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, +0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf, +0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10bf,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, 0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1, -0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce,0x10ce, -0x10ce,0x10ce,0x10ce,0x10ce,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10d7,0x10d7,0x10d7,0x10d7,0x10d7,0x10da, -0x10da,0x10da,0x1134,0x10e3,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2,0x10f2, -0x10f2,0x10f2,0x10f2,0x10f2,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0,0x10e0, -0x10e0,0x10e0,0x10e0,0x10e0,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101, -0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101,0x1101, -0x1101,0x1101,0x1101,0x1101,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113, -0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113,0x1113, -0x1113,0x1113,0x1113,0x1113,0x111c,0x111c,0x111c,0x111c,0x1131,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c, -0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c,0x111c, -0x111c,0x111c,0x111c,0x111c,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, -0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f,0x111f, -0x111f,0x111f,0x111f,0x111f,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0, -0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x11a0,0x1197,0x1197,0x119a,0x119a,0x11a0,0x1197, -0x1197,0x1197,0x1197,0x1197,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, -0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3,0x11a3, -0x11a3,0x11a3,0x11a3,0x11a3,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be,0x11be, -0x11be,0x11be,0x11be,0x11be,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, -0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca,0x11ca, -0x11ca,0x11ca,0x11c7,0x11cd,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, +0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10d1,0x10da,0x10da,0x10da,0x10da,0x10ef,0x10da,0x10da,0x10da, +0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da, +0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10da,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd, +0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd, +0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10dd,0x10e9,0x10e9,0x10e9,0x10e9,0x128a,0x128a,0x128a,0x128a, +0x128a,0x128a,0x128a,0x128a,0x1488,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x1776,0x18c6,0x18c6, +0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x18c6,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e, +0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x115e,0x1155,0x1155, +0x1158,0x1158,0x115e,0x1155,0x1155,0x1155,0x1155,0x1155,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161, +0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x1161,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, +0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c, +0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x117c,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1188, +0x1188,0x1188,0x1188,0x1188,0x1188,0x1188,0x1185,0x118b,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197, +0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197, +0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x1197,0x11a6,0x11a6,0x11a6,0x11b5,0x11bb,0x11bb,0x11bb,0x11bb, +0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb, +0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11bb,0x11a9,0x11b5,0x11b5,0x11a6,0x11a6, +0x11a6,0x11a6,0x11b5,0x11b5,0x11a6,0x11b5,0x11b5,0x11b5,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7, +0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11ca,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c7,0x11c1, +0x11c1,0x11c1,0x11c7,0x11c4,0x1521,0x1524,0x1527,0x1527,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, +0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11cd,0x11d9,0x11cd,0x11cd,0x11cd,0x11e2,0x11e2,0x11cd, +0x11cd,0x11e2,0x11d9,0x11e2,0x11e2,0x11d9,0x11cd,0x11d0,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, 0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9, -0x11d9,0x11d9,0x11d9,0x11d9,0x11e8,0x11e8,0x11e8,0x11f7,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, -0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd, -0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11fd,0x11eb,0x11f7,0x11f7,0x11e8,0x11e8,0x11e8,0x11e8,0x11f7,0x11f7, -0x11e8,0x11f7,0x11f7,0x11f7,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209, -0x1209,0x1209,0x1209,0x1209,0x120c,0x1209,0x1209,0x1209,0x1209,0x1209,0x1209,0x1203,0x1203,0x1203,0x1209,0x1206, -0x1563,0x1566,0x1569,0x1569,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, -0x121b,0x121b,0x121b,0x121b,0x120f,0x121b,0x120f,0x120f,0x120f,0x1224,0x1224,0x120f,0x120f,0x1224,0x121b,0x1224, -0x1224,0x121b,0x120f,0x1212,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, -0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b,0x121b, -0x121b,0x121b,0x121b,0x121b,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236, -0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236,0x1236, -0x1236,0x1236,0x1236,0x1236,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, -0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e,0x124e, -0x124e,0x124b,0x124b,0x124b,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257, -0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257,0x1257, -0x1257,0x1257,0x1257,0x1257,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266,0x1266, -0x1266,0x1266,0x1266,0x1266,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1284, -0x1281,0x1281,0x1281,0x1281,0x127e,0x127e,0x127e,0x1272,0x1272,0x1272,0x1272,0x127e,0x127e,0x1278,0x1275,0x127b, -0x127b,0x126c,0x1287,0x1287,0x126f,0x126f,0x127e,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281, -0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1281,0x1284,0x1281, -0x1284,0x1281,0x1281,0x1281,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x1290,0x1290,0x1290,0x128d,0x128d,0x128d,0x128a,0x128a,0x128a,0x128a,0x128d,0x128a, -0x128a,0x128a,0x1290,0x128d,0x1290,0x128d,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, -0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a,0x128a, -0x128a,0x1290,0x128d,0x128d,0x128a,0x128a,0x128a,0x128a,0x129c,0x129c,0x1344,0x1299,0x1344,0x1344,0x1344,0x1344, -0x1299,0x129f,0x12c6,0x1299,0x1299,0x1299,0x1299,0x1299,0x129f,0x12a2,0x12c6,0x12c6,0x12a2,0x12c6,0x1299,0x12a2, -0x12a2,0x12a5,0x12c6,0x1299,0x1299,0x12c6,0x129c,0x129c,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, -0x13b3,0x13b3,0x12ae,0x12ae,0x12ae,0x12ae,0x13ce,0x13ad,0x12b7,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce,0x13ce, -0x13ce,0x13ce,0x13ce,0x1863,0x1863,0x1863,0x1863,0x1863,0x13b6,0x13b6,0x12bd,0x13b6,0x13b6,0x13b6,0x12bd,0x13b6, -0x13b6,0x13b6,0x12b7,0x12b7,0x12b7,0x12b7,0x12b7,0x13b0,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x12ba, -0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x12ba,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4, -0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x12e4,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386, -0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x1386,0x139b,0x138c,0x139b,0x139e,0x139e,0x139e,0x139e,0x139e, -0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e, -0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c, -0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4,0x13a4, -0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa, -0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa,0x13aa, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e3,0x13e3,0x13e3, -0x13e0,0x13e3,0x13e0,0x13e3,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0, -0x13e3,0x13e0,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e6,0x13e3,0x13e3,0x13e3, -0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0, -0x13e0,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e0,0x13e0, -0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x13e0,0x1575,0x1575,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x157e,0x1578,0x1578, -0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x17b8,0x17b8,0x17b8,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x157e,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x157e,0x17b8,0x17b8,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e9,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6, -0x1578,0x1578,0x157e,0x157e,0x1578,0x157e,0x157e,0x157e,0x1575,0x1575,0x157e,0x157e,0x13e3,0x13e3,0x13e9,0x13e9, -0x13e9,0x16ec,0x13e3,0x13e9,0x13e3,0x13e3,0x13e9,0x1584,0x1584,0x157e,0x157e,0x17b8,0x17b8,0x17b8,0x17b8,0x17b8, -0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x1578,0x1578,0x157e, -0x16ec,0x157e,0x1578,0x157e,0x17b8,0x17b8,0x17b8,0x17bb,0x17bb,0x17bb,0x17bb,0x17bb,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x157e,0x13e3,0x157e,0x13e9,0x13e9, -0x13e3,0x13e3,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13ec,0x13ec, -0x13ec,0x13ec,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x13e3,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9,0x13e9, -0x13e9,0x13e3,0x13e3,0x13e3,0x13e9,0x13e3,0x13e3,0x13e3,0x13e3,0x13e9,0x13e9,0x13e9,0x13e3,0x13e9,0x13e9,0x13e9, -0x13e3,0x13e3,0x13e3,0x13e6,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x16ec,0x13e3,0x13e3,0x13e3, -0x13e3,0x157e,0x1578,0x17b8,0x1446,0x1446,0x1446,0x1446,0x1575,0x1575,0x1575,0x1575,0x1575,0x157b,0x157e,0x17b8, -0x17b8,0x17b8,0x17b8,0x1740,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3, -0x13e3,0x13e3,0x13e3,0x13e3,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x1578,0x1578,0x157e, -0x1584,0x1584,0x157e,0x157e,0x157e,0x157e,0x186c,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x1578,0x157e, -0x1578,0x1578,0x1578,0x1578,0x1581,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x1578,0x1578,0x1578,0x157e, -0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x157e,0x13e3,0x13e3,0x13e3,0x13e3,0x13e3,0x14d0,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x14d0,0x13ef,0x13ef, -0x13ef,0x14d0,0x13ef,0x14d0,0x13ef,0x14d0,0x13ef,0x14d0,0x13ef,0x13ef,0x13ef,0x14d0,0x13ef,0x13ef,0x13ef,0x13ef, -0x13ef,0x13ef,0x14d0,0x14d0,0x13ef,0x13ef,0x13ef,0x13ef,0x14d0,0x13ef,0x14d0,0x14d0,0x13ef,0x13ef,0x13ef,0x13ef, -0x14d0,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x13ef,0x16f2,0x16f2,0x17be, -0x17be,0x13f2,0x13f2,0x13f2,0x13ef,0x13ef,0x13ef,0x13f2,0x13f2,0x13f2,0x13f2,0x13f2,0x1671,0x1671,0x1671,0x1671, -0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x13f8,0x13f5,0x13f5,0x13f5, -0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f8,0x13f5, -0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13fb, -0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5, -0x13fb,0x13fb,0x13fb,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13f5,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe, -0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x13fe,0x17eb,0x17eb,0x17e8,0x1743, -0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x1449,0x1449,0x1449,0x1449,0x1449,0x1449,0x144c,0x144c,0x144c,0x144c, -0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x158d,0x1458,0x1458,0x1458,0x146a, -0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a, -0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x146a,0x1485,0x1485,0x1485,0x1485, +0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11d9,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4, +0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4, +0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x11f4,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c, +0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c,0x120c, +0x120c,0x120c,0x120c,0x120c,0x120c,0x1209,0x1209,0x1209,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215, +0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1215,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224, +0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x1224,0x122a,0x122a,0x1239,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123f,0x123c,0x123f,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c,0x123c, +0x123c,0x123c,0x123c,0x123f,0x123c,0x123c,0x123c,0x123c,0x1239,0x1239,0x1239,0x122d,0x122d,0x122d,0x122d,0x1239, +0x1239,0x1233,0x1230,0x1236,0x1236,0x1245,0x1242,0x1242,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x124e,0x124e,0x124e,0x124b,0x124b,0x124b,0x1248,0x1248, +0x1248,0x1248,0x124b,0x1248,0x1248,0x1248,0x124e,0x124b,0x124e,0x124b,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248,0x1248, +0x1248,0x1248,0x1248,0x1248,0x1248,0x124e,0x124b,0x124b,0x1248,0x1248,0x1248,0x1248,0x125a,0x125a,0x1302,0x1257, +0x1302,0x1302,0x1302,0x1302,0x1257,0x125d,0x1284,0x1257,0x1257,0x1257,0x1257,0x1257,0x125d,0x1260,0x1284,0x1284, +0x1260,0x1284,0x1257,0x1260,0x1260,0x1263,0x1284,0x1257,0x1257,0x1284,0x125a,0x125a,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x126c,0x126c,0x126c,0x126c,0x138c,0x136b,0x1275,0x138c,0x138c,0x138c, +0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x138c,0x1824,0x1824,0x1824,0x1824,0x1824,0x1374,0x1374,0x127b,0x1374, +0x1374,0x1374,0x127b,0x1374,0x1374,0x1374,0x1275,0x1275,0x1275,0x1275,0x1275,0x136e,0x1371,0x1371,0x1371,0x1371, +0x1371,0x1371,0x1371,0x1278,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1371,0x1278,0x12a2,0x12a2,0x12a2,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2, +0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x12a2,0x1344,0x1344,0x1344,0x1344, +0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344, +0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1344,0x1359,0x134a,0x1359,0x135c, +0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c, +0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x135c,0x134a,0x134a,0x134a,0x134a, +0x134a,0x134a,0x134a,0x134a,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362, +0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362,0x1362, +0x1362,0x1362,0x1362,0x1362,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368,0x1368, +0x1368,0x1368,0x1368,0x1368,0x1398,0x1395,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18cc,0x18cc,0x18cc,0x18cc,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x139e,0x13a1,0x13a1,0x13a1,0x139e,0x13a1,0x139e,0x13a1,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1, +0x13a1,0x13a1,0x13a1,0x139e,0x13a1,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4, +0x13a4,0x13a1,0x13a1,0x13a1,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x139e,0x139e,0x139e,0x139e,0x139e, +0x139e,0x139e,0x139e,0x139e,0x139e,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x139e,0x1533,0x1533, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x153c,0x1536,0x1536,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x1779,0x1779,0x1779, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x1779,0x1779, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a4,0x1536,0x1536,0x153c,0x153c,0x1536,0x153c,0x153c,0x153c,0x1533,0x1533,0x153c,0x153c, +0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x16aa,0x13a1,0x13a7,0x13a1,0x13a1,0x13a7,0x1542,0x1542,0x153c,0x153c,0x1779, +0x1779,0x1779,0x1779,0x1779,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c,0x153c, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a4,0x13a1,0x13a1, +0x13a1,0x1536,0x1536,0x153c,0x16aa,0x153c,0x1536,0x153c,0x1779,0x1779,0x1779,0x177c,0x177c,0x177c,0x177c,0x177c, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x153c, +0x13a1,0x153c,0x13a7,0x13a7,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13aa,0x13aa,0x13aa,0x13aa,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a7,0x13a7,0x13a7,0x13a7, +0x13a7,0x13a7,0x13a7,0x13a7,0x13a7,0x13a1,0x13a1,0x13a1,0x13a7,0x13a1,0x13a1,0x13a1,0x13a1,0x13a7,0x13a7,0x13a7, +0x13a1,0x13a7,0x13a7,0x13a7,0x13a1,0x13a1,0x13a1,0x13a4,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x16aa,0x13a1,0x13a1,0x13a1,0x13a1,0x153c,0x1536,0x1779,0x1404,0x1404,0x1404,0x1404,0x1533,0x1533,0x1533,0x1533, +0x1533,0x1539,0x153c,0x1779,0x1779,0x1779,0x1779,0x1701,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c, +0x153c,0x1536,0x1536,0x153c,0x1542,0x1542,0x153c,0x153c,0x153c,0x153c,0x182d,0x1536,0x1536,0x1536,0x1536,0x1536, +0x1536,0x153c,0x1536,0x153c,0x1536,0x1536,0x1536,0x1536,0x153f,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c, +0x1536,0x1536,0x1536,0x153c,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x153c,0x13a1,0x13a1,0x13a1,0x13a1,0x13a1, +0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad, +0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x148e, +0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x148e,0x148e, +0x13ad,0x13ad,0x13ad,0x13ad,0x148e,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad,0x13ad, +0x13ad,0x16b0,0x16b0,0x177f,0x177f,0x13b0,0x13b0,0x13b0,0x13ad,0x13ad,0x13ad,0x13b0,0x13b0,0x13b0,0x13b0,0x13b0, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, +0x13b6,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b6,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b3,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13b3,0x13b3,0x13b3,0x13b3,0x13b9,0x13b9,0x13b9,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3,0x13b3, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc,0x13bc, +0x17ac,0x17ac,0x17a9,0x1704,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x1407,0x1407,0x1407,0x1407,0x1407,0x1407, +0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x140a,0x154b, +0x1416,0x1416,0x1416,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, +0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428,0x1428, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443,0x1443, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c, +0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c,0x144c, +0x1452,0x1452,0x145e,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464, +0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464,0x1464, +0x1464,0x1464,0x1464,0x145e,0x145e,0x145e,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x1452,0x145e, 0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485, -0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x148e,0x148e,0x148e,0x148e, -0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e, -0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x148e,0x1494,0x1494,0x14a0,0x14a6, -0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6, -0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a6,0x14a0, -0x14a0,0x14a0,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x1494,0x14a0,0x14c7,0x14c7,0x14c7,0x14c7, -0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7, -0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x14c7,0x1578,0x1578,0x157e,0x157e, -0x157e,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x157e, -0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x157e,0x157e,0x157e,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1578,0x157e,0x1578,0x1578,0x157e,0x157e,0x157e,0x157e,0x1578,0x1578,0x1584,0x1578,0x1578,0x1578, -0x1578,0x16ef,0x16ef,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1869,0x157e,0x1578,0x1578, -0x157e,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x1578,0x157e,0x157e,0x1578,0x1578,0x1578,0x1578,0x1578, -0x1578,0x1578,0x1578,0x1578,0x157e,0x1578,0x1578,0x1578,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5, -0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15a5,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7, -0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15b7,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, +0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485,0x1485, +0x1536,0x1536,0x153c,0x153c,0x153c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536, +0x1536,0x153c,0x153c,0x153c,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x1533,0x153c,0x153c,0x153c,0x1536, +0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x1536,0x1536,0x153c,0x153c,0x153c,0x153c,0x1536,0x1536, +0x1542,0x1536,0x1536,0x1536,0x1536,0x16ad,0x16ad,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536, +0x182a,0x153c,0x1536,0x1536,0x153c,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x153c,0x1536, +0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x1536,0x153c,0x1536,0x1536,0x1536,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563, +0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1563,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575, +0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x1575,0x157b,0x157b,0x157b,0x157b, +0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b, +0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157b,0x157e,0x157e,0x157e,0x157e, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e, +0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x157e,0x15bd,0x15bd,0x15bd,0x15bd, 0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd, -0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0, -0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15c0,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff, -0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff, -0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15ff,0x15f0,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, -0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608,0x1608, -0x1608,0x1608,0x1608,0x1602,0x160b,0x160b,0x160b,0x160b,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e, -0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x160e,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629, -0x1620,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629, -0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1629,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632, -0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1632,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, -0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1641,0x1641,0x1641,0x1635,0x1635,0x1635,0x1635,0x1635, -0x1635,0x1635,0x1635,0x1641,0x1641,0x1635,0x1641,0x1638,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, +0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15bd,0x15ae,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6, +0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c6,0x15c0,0x15c9,0x15c9,0x15c9,0x15c9,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc, +0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15cc,0x15e7,0x15e7,0x15e7,0x15e7, +0x15e7,0x15e7,0x15e7,0x15e7,0x15de,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7, +0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15e7,0x15f0,0x15f0,0x15f0,0x15f0, +0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0, +0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x15f0,0x1602,0x1602,0x1602,0x1602, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x15ff,0x15ff,0x15ff,0x15f3, +0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15f3,0x15ff,0x15ff,0x15f3,0x15ff,0x15f6,0x1602,0x1602,0x1602,0x1602, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602, +0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1602,0x1626,0x1626,0x1626,0x1626, +0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626, +0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1626,0x1623,0x1623,0x1623,0x162f,0x162f,0x162f,0x162f, +0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f,0x162f, +0x162f,0x162f,0x1635,0x1635,0x1635,0x1632,0x1632,0x1632,0x162f,0x162f,0x162f,0x162f,0x1644,0x1644,0x1644,0x1644, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1638,0x1638,0x1638,0x1638, +0x1638,0x1638,0x1638,0x164a,0x164a,0x163e,0x163b,0x163b,0x163b,0x163b,0x163b,0x163b,0x1644,0x1644,0x1644,0x1644, 0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644, -0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668, -0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668,0x1668, -0x1668,0x1668,0x1668,0x1668,0x1668,0x1665,0x1665,0x1665,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671, -0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1671,0x1677,0x1677, -0x1677,0x1674,0x1674,0x1674,0x1671,0x1671,0x1671,0x1671,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x167a,0x168c, -0x168c,0x1680,0x167d,0x167d,0x167d,0x167d,0x167d,0x167d,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686, -0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1686,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692, -0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x1692,0x168f, -0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x168f,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, -0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695, -0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x1695,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, -0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9, -0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16b9,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2, -0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16c2,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, -0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16c5,0x16d4,0x16d4,0x16c5,0x16c5,0x16c5,0x16c5,0x16c5, -0x16c5,0x16d4,0x16c5,0x16d7,0x16d7,0x16c5,0x16d7,0x16c5,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, -0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da, -0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16da,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, -0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3, -0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e3,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9, -0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9, -0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x16e9,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, -0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749, -0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1749,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, +0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1644,0x1650,0x1650,0x1650,0x1650, +0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650,0x1650, +0x1650,0x1650,0x1650,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x164d,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653, +0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1653,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677, +0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1677,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680, +0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1680,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1683,0x1692,0x1692,0x1683, +0x1683,0x1683,0x1683,0x1683,0x1683,0x1692,0x1683,0x1695,0x1695,0x1683,0x1695,0x1683,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698, +0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x1698,0x16a1,0x16a1,0x16a1,0x16a1, +0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1, +0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a1,0x16a7,0x16a7,0x16a7,0x16a7, +0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7, +0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x16a7,0x170a,0x170a,0x170a,0x170a, +0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a, +0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x170a,0x1746,0x1746,0x1746,0x1746, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x174c,0x1749, +0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746,0x1746, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, +0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f,0x174f, +0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, +0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752,0x1752, +0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764, +0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764,0x1764, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767,0x1767, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x176a,0x176a,0x176d,0x176d,0x176d,0x176d,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a,0x176a, +0x176a,0x176a,0x176a,0x176a,0x176a,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176a,0x176d,0x176d, +0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d, +0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d,0x176d, +0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, 0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785, -0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x178b,0x1788,0x1785,0x1785,0x1785,0x1785, -0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x1785,0x178e,0x178e,0x178e,0x178e, -0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e, -0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x178e,0x1791,0x1791,0x1791,0x1791, -0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791, -0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x1791,0x17a3,0x17a3,0x17a3,0x17a3, -0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3, -0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a3,0x17a6,0x17a6,0x17a6,0x17a6, -0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6, -0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a6,0x17a9,0x17a9,0x17a9,0x17a9, -0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, -0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17ac, -0x17ac,0x17ac,0x17ac,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9,0x17a9, -0x17a9,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17a9,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac, -0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac, -0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17ac,0x17c4,0x17c4,0x17c4,0x17c4, -0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4, -0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x17c4,0x1809,0x1809,0x1806,0x1806, -0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806, -0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1806,0x1809,0x1809,0x1809,0x1809, -0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809, -0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1809,0x1857,0x1857,0x1857,0x1857, -0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857, -0x1857,0x1854,0x1854,0x1854,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x1857,0x1857,0x1857,0x1857, -0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857, -0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x1857,0x187e,0x187e,0x187e,0x187e, -0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e, -0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x187e,0x1881,0x1881,0x1881,0x1881, -0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881, -0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0x1881,0,0,0,0 +0x17ca,0x17ca,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, +0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7,0x17c7, +0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca, +0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca,0x17ca, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1815,0x1815,0x1815,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800,0x1800, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, +0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818,0x1818, +0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f, +0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f,0x183f, +0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842, +0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842,0x1842, +0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899, +0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899,0x1899, +0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x18ba,0x18ba,0x18ba,0x18a5,0x18ab,0x18a8,0x18a8,0x18a8,0x18a8,0x18b7,0x18bd,0x18a8,0x18a8,0x18a8,0x18a8,0x18b4, +0x18ba,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18a8,0x18b7,0x18b7,0x18a8,0x18a8,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba,0x18ba, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc,0x18cc, +0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db,0x18db, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1,0x18e1, +0,0,0,0 }; static const UTrie2 propsVectorsTrie={ propsVectorsTrie_index, - propsVectorsTrie_index+4924, + propsVectorsTrie_index+4880, NULL, - 4924, - 24212, + 4880, + 24356, 0xa40, - 0x13bc, + 0x1390, 0x0, 0x0, 0x110000, - 0x71cc, + 0x7230, NULL, 0, FALSE, FALSE, 0, NULL }; -static const uint32_t propsVectors[6279]={ -0x67,0,0,0x67,0,0x200000,0x67,0,0x230400,0x67,0,0x230560,0x67,0,0x400000,0x67, -0,0x448000,0x67,0,0x500000,0x67,0,0x962460,0x67,0,0x962540,0x67,0,0xe00000,0x67,0, -0xe30000,0x67,0,0x1329800,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67,0,0, -0xc67,0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1067,0,0x200000,0x1067, -0,0x230400,0x1167,0,0,0x1267,0,0,0x1267,0,0x962460,0x1367,0,0,0x1467,0, -0,0x1567,0,0,0x1667,0,0,0x1767,0,0,0x1767,0,0x962460,0x1867,0,0, -0x1967,0,0,0x1a67,0,0,0x1b67,0,0,0x1d67,0,0,0x1f67,0,0,0x2067, -0,0,0x2267,0,0,0x2367,0,0,0x2467,0,0,0x2567,0,0,0x2767,0, -0,0x2867,0x80000,0x20,0x2967,0,0,0x2a67,0,0x1600000,0x2b67,0,0,0x2d67,0,0, -0x3067,0x20000000,0x200000,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67,0,0,0x3b67,0,0,0x3c67, -0,0,0x3e67,0,0,0x4067,0,0,0x4067,0,0xe30400,0x4167,0,0,0x4367,0, +static const uint32_t propsVectors[6375]={ +0x67,0,0,0x67,0,0xe00000,0x67,0x80000,0x20,0x867,0,0,0xa67,0,0,0xb67, +0,0,0xc67,0,0,0xd67,0,0,0xe67,0,0,0x1067,0,0,0x1167,0, +0,0x1267,0,0,0x1367,0,0,0x1467,0,0,0x1567,0,0,0x1667,0,0, +0x1767,0,0,0x1867,0,0,0x1967,0,0,0x1a67,0,0,0x1b67,0,0,0x1d67, +0,0,0x1f67,0,0,0x2067,0,0,0x2267,0,0,0x2367,0,0,0x2467,0, +0,0x2567,0,0,0x2767,0,0,0x2867,0x80000,0x20,0x2967,0,0,0x2a67,0,0x1600000, +0x2b67,0,0,0x2d67,0,0,0x3167,0x20000000,0,0x3267,0x20000000,0,0x3a67,0,0,0x3b67, +0,0,0x3c67,0,0,0x3e67,0,0,0x4067,0,0,0x4167,0,0,0x4367,0, 0,0x4467,0,0,0x4867,0,0,0x4967,0,0,0x4a67,0,0,0x5067,0,0, 0x5167,0,0,0x5467,0,0,0x5567,0,0,0x5667,0x80000,0x20,0x5767,0,0,0x5867, -0,0,0x5867,0,0x230400,0x5967,0,0,0x5b67,0,0,0x5c67,0,0,0x5d67,0, -0,0x6067,0x80000,0x20,0x6267,0,0,0x6367,0,0,0x6467,0,0,0x6567,0,0, -0x6f67,0,0,0x7067,0,0,0x7367,0x20000000,0,0x7367,0x20000000,0x200000,0x7567,0,0,0x7667, -0,0,0x7767,0,0,0x7867,0,0,0x7a67,0,0,0x7b67,0,0,0x7c67,0, -0,0x7e67,0,0,0x7f67,0,0,0x8167,0,0,0x8267,0,0,0x8367,0,0, -0x8367,0,0x962460,0x8467,0,0,0x8567,0,0,0x8667,0,0,0x8767,0,0,0x8867, -0,0,0x8967,0,0,0x8b67,0,0,0x8c67,0,0,0x8e67,0x20000000,0,0x8e67,0x20000000, -0x400000,0x8f67,0,0,0x9067,0,0,0x9167,0,0,0x9267,0,0,0x9367,0,0, -0x9567,0,0,0x9667,0,0,0x9767,0,0,0x9867,0,0,0x9967,0,0,0x9a67, -0,0,0x9c67,0,0,0x9f67,0,0,0xa167,0,0,0xa367,0,0,0xa467,0, -0,0xa567,0,0,0xa667,0,0,0xa767,0,0,0xa867,0,0,0xa967,0,0, -0xaa67,0,0xe00000,0xab67,0,0xe00000,0xac67,0,0,0xad67,0,0,0xae67,0,0,0xaf67, -0,0,0xaf67,0,0x962540,0xb167,0,0,0xb267,0,0,0xb367,0,0,0xb467,0, -0,0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0,0,0xba67,0,0, -0xbc67,0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0,0xc067,0,0,0xc167, -0,0,0xc267,0,0,0xc367,0,0xe00000,0xc467,0,0xe00000,0xc667,0,0,0xc767,0, -0,0xc867,0,0,0xc967,0,0,0xca67,0,0,0xcb67,0,0xe30000,0xcc67,0,0xe00000, -0xcf67,0,0xe00000,0xcf67,0,0x30e00000,0xd067,0,0xe00000,0xd267,0,0,0xd367,0,0,0xd467, -0,0,0xd567,0,0,0xd667,0,0,0xd867,0,0,0xd967,0,0,0xda67,0, -0,0xdb67,0,0,0xdc67,0,0,0xdd67,0,0,0xde67,0,0,0xdf67,0,0, -0xe067,0,0,0xe167,0,0,0xe267,0,0,0xe367,0,0xe00000,0xe467,0,0,0xe567, -0,0,0xe667,0,0,0xe767,0,0,0xe867,0,0,0xe967,0,0,0xea67,0, -0,0xeb67,0,0,0xec67,0,0,0xed67,0,0,0xee67,0,0,0xef67,0,0, -0xf167,0,0,0xf367,0,0,0xf567,0,0,0xf667,0,0,0xf767,0,0,0xf867, -0,0,0xf967,0,0,0xfa67,0,0xe00000,0xfb67,0,0,0xfc67,0,0,0xfd67,0, -0,0xfe67,0,0,0x10167,0,0,0x10267,0,0,0x10367,0,0,0x10467,0,0, -0x10567,0,0x200000,0x10567,0,0xe00000,0x10567,0,0x30e00000,0x10567,0,0xb28045a0,0x10667,0,0,0x10767, -0,0,0x10867,0,0,0x10967,0,0,0x10a67,0,0,0x10b67,0,0,0x10b67,0, -0x1230400,0x10c67,0,0,0x10d67,0,0,0x10e67,0,0,0x10f67,0,0,0x11067,0,0, -0x11167,0,0,0xa0067,0,0xe00000,0xa0067,0,0xe30000,0xa4667,0,0xe00000,0xa4767,0,0xe00000,0xa4767, -0,0xe30000,0xa4f67,0,0xe00000,0xa5e67,0,0xe00000,0xa5f67,0,0xe00000,0xac567,0,0xe00000,0xad167,0, -0xe00000,0xb0067,0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040, -0x11000100,0x40000001,0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x10200000,0x11000200, -0x24000008,0x1710000,0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100, -0x220402,0x11000319,0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402, -0x11000419,0x7c00100,0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519, -0x7c00100,0x230400,0x11000600,0x4000400,0x200000,0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500, -0x230400,0x11000600,0x7c00500,0x530400,0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001, -0x11000800,0x6800010,0x201001,0x11000800,0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e, -0x4000400,0x200002,0x1100080e,0x7000500,0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100, -0x250400,0x1100080e,0x7c00100,0x250401,0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400, -0x11000908,0x7c00100,0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x270000,0x11000a03, -0x7c00100,0x220400,0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000, -0x200000,0x11000b13,0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800, -0x11000c00,0,0x218960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02, -0x4000000,0x1329800,0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100, -0x230402,0x11000c02,0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000c02,0xc000010,0xb48000,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460, -0x11000f0a,0x2806400,0x962460,0x11000f0a,0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004, -0x2802100,0x962460,0x11001004,0x2802400,0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100, -0x962540,0x11001004,0x6800100,0x962541,0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460, -0x11001110,0x2806400,0x962460,0x11001110,0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f, -0x2802400,0x962460,0x1100120f,0x2806400,0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400, -0x962460,0x1100131f,0x2806400,0x962460,0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541, -0x1100131f,0x7c00100,0x230400,0x1100131f,0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423, -0x6800100,0x962541,0x11001423,0x7c00100,0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400, -0x962460,0x11001524,0x6800000,0x1329800,0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460, -0x11001615,0x6800000,0x1329800,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a, -0x2806400,0x962460,0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000, -0x1600000,0x11001926,0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000, -0x11001926,0x6800000,0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18, -0x2802100,0x1862460,0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100, -0x1830002,0x11001a18,0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500, -0x11001e12,0x7c00100,0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e, -0x4000400,0x200001,0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000, -0x918820,0x11002800,0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x440001,0x11002800,0x4000001,0x440002,0x11002800,0x4000001,0xc4000b, -0x11002800,0x6800000,0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800, -0x24000000,0x1410000,0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008, -0x1410000,0x11002800,0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x11248002, -0x11002800,0x40000001,0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0x2a65620,0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900, -0x4000000,0x20000f,0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020, -0x141000e,0x11002900,0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000, -0x11002a00,0x4000000,0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00, -0x4000000,0x20000f,0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120, -0x230402,0x11002c00,0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006, -0x11002d00,0x4000000,0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00, -0x24000020,0x200000,0x11002e00,0x24000020,0x200001,0x11002e00,0x24000020,0x10200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020, -0x200002,0x11002f00,0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x10200000, -0x11003000,0x24000020,0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020,0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300, -0x4000000,0x100003,0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000,0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000, -0x10200000,0x11003600,0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700,0x24000000,0x10200000,0x11003700,0x24000000,0x10e00000, -0x11003700,0x24000000,0x928045a0,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800, -0x24000000,0xe00000,0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x10200000,0x11003800,0x24000000,0x10b00000,0x11003800,0x24000000,0x10e00000,0x11003800,0x24000000, -0x10e05200,0x11003800,0x24000000,0x928045a0,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801, -0x11005013,0x7c00100,0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102, -0x7000100,0x230408,0x11005102,0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400, -0x962460,0x11005500,0x80000,0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408, -0x11005502,0x7c00100,0x230409,0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200, -0x4000400,0x100002,0x11020200,0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000, -0x1500000,0x11020200,0x24000000,0x1600000,0x11020200,0x24000000,0x10200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f, -0x11020219,0x7c00100,0x220400,0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319, -0x7c00100,0x220402,0x11020319,0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100, -0x220400,0x11020600,0x4000400,0x100002,0x11020600,0x4000400,0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460, -0x11020701,0x2802400,0x962461,0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908, -0x7c00100,0x220401,0x11020908,0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000, -0x200002,0x11022800,0x24000000,0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000, -0x11022800,0x24000002,0x370000,0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800, -0x24000020,0x100000,0x11022800,0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100, -0x12040f,0x11022c00,0x4000000,0x100002,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1010000f,0x11022c00,0x7c00120,0x120405, -0x11022c0e,0x7c00100,0x250401,0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19, -0x7c00100,0x150402,0x11022e00,0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022e00,0x24000020,0x10100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020, -0x100001,0x11022f00,0x24000020,0x100002,0x11023000,0x24000000,0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403, -0x11023300,0x4000100,0x150403,0x11023300,0x4000100,0x10150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600, -0x24000020,0x100000,0x11023600,0x24000020,0x10100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700,0x24000000,0x10100000,0x11023700,0x24000000, -0x10e00000,0x11023700,0x24000020,0x100000,0x11023700,0x24000020,0x10100000,0x11023700,0x24000020,0x10105200,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000, -0x11024e67,0,0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712, -0x7c00100,0xe3040a,0x11045712,0x7c80100,0xe3040a,0x11045716,0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11063d00,0x4000001,0x440011,0x11065700,0x4000000, -0x810011,0x11065700,0x4000000,0xe00011,0x11065700,0x4000000,0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011, -0x11065700,0x4000008,0xe00011,0x11065700,0x4000008,0xe02c11,0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700, -0x4000020,0xe00011,0x11065700,0x4000400,0xe00011,0x11065700,0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe00011,0x11065700,0xc000010, -0x80ac11,0x11065700,0xc000010,0xb48011,0x11065719,0x7c00100,0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411, -0x11080100,0x6800000,0x201c00,0x11080100,0x68000c0,0x11329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100, -0x24000000,0x1500000,0x11080100,0x24000000,0x1600000,0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x10200000,0x11080100,0x24000006, -0xd70000,0x11080100,0x24000008,0x1713c00,0x11080100,0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400, -0x11080100,0x24000020,0x200000,0x11080100,0x24000020,0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100, -0x2c000010,0xb48000,0x11080100,0x2c000010,0x100ac00,0x11080100,0x44000001,0x1a40000,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0, -0x220400,0x11080119,0x7c001c0,0x250400,0x11080200,0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000, -0x11080200,0x24000020,0x200000,0x110a1e12,0x7c00100,0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x30e00000,0x110a3000,0x24100000,0x810001,0x110a3000, -0x24100000,0x1410001,0x110a3700,0x24000000,0x30200000,0x110a3d00,0x4000000,0xe00000,0x110a3d00,0x4000000,0xe00002,0x110a3d00,0x24000000,0xe00000,0x110a3d11,0x7c00300, -0xe30000,0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14,0x7c00100,0x2530000, -0x110a3e14,0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100,0x2530c00,0x110a3f16, -0x7c00900,0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402,0x110a4400,0x4000000, -0xe00000,0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516,0x4000000,0xe00c0d, -0x110a4711,0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000,0xe00002,0x110a5300, -0x4000000,0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010,0x110a5300,0x6800000, -0xe01c02,0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400,0x4000000,0x150000c, -0x110a5400,0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010,0x120140c,0x110a5400, -0x4000010,0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c,0x11400a0c,0xc000010, -0x1049400,0x11400c0e,0x4000010,0xb00000,0x11400c0e,0x4000010,0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c11,0x7c00900,0x230400,0x11400f34,0xc000010,0x448000, -0x11400f44,0xc000010,0x448000,0x11401d70,0x4000000,0x200000,0x11403d92,0x4000000,0xe00000,0x11445787,0x4000004,0x120000a,0x11445787,0x4000008,0x81000a,0x11445787, -0x4000008,0x141000a,0x11445787,0x4000010,0x87000a,0x11445787,0xc000010,0x84800a,0x11445790,0x3802500,0x126246a,0x11445790,0x7c00d00,0x2530c0a,0x114a3d87,0x24000000, -0x810000,0x114a3d87,0x24000000,0x1410000,0x114a3d87,0x24000008,0x810000,0x114a3d87,0x24000008,0x1410000,0x114a3d87,0x24000010,0x870000,0x114a3d87,0x2c000010,0x848000, -0x114a3d8d,0x4000000,0xe00000,0x114a3d8d,0x24000000,0xe00000,0x114a3d8d,0x24000002,0x1200000,0x114a3d8d,0x24000002,0x10e00000,0x114a3d8d,0x24000008,0x810000,0x114a3d8d, -0x24000008,0x1410000,0x114a3d90,0x7c00900,0x930c00,0x114a3d90,0x7c00900,0xe30c00,0x114a3d92,0x7c00300,0xe30000,0x114a3e90,0x7000400,0x1200c02,0x114a3f87,0x4000004, -0x1200000,0x114a3f90,0x7c00d00,0x2530c00,0x114a4292,0x4000000,0xe00000,0x114a4292,0x4000000,0xe0000f,0x114a4492,0x4000000,0xe00002,0x114a4492,0x4000000,0xe00003, -0x114a4492,0x4000000,0x10e00003,0x114a4592,0x4000000,0xe00002,0x114a4592,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c17,0x2802100,0x962460,0x11800c17, -0x2802500,0x962460,0x11800f1d,0x2802400,0x962460,0x11800f29,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3d93,0x2802400, -0x962460,0x118a3e90,0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c1b,0x6800000,0x1329800,0x11c00f58,0x6800000,0x1329800, -0x11c0105d,0x6800000,0x1329800,0x11c01161,0x6800000,0x1329800,0x11c01265,0x6800000,0x1329800,0x11c01469,0x4000000,0x200000,0x11c01469,0x6800000,0x1329800,0x11c01469, -0x7c00100,0x230400,0x11c0511b,0x7c00100,0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100, -0x962460,0x20001b27,0x2802100,0x962461,0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000, -0x20001b27,0x4000000,0x400000,0x20001b27,0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27, -0x4000000,0x1410000,0x20001b27,0x4000010,0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400, -0x962540,0x20001b27,0x7c00100,0x230400,0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900020, -0x20004c67,0,0x1900020,0x20004d67,0,0x1900020,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67, -0,0,0x200a4a12,0x7c00100,0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100, -0x220400,0x30000419,0x7c00100,0x220401,0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400, -0x30000600,0x7c00500,0x230400,0x30000605,0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908, -0x7c00100,0x220401,0x30000908,0x7c00100,0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100, -0x230400,0x30000d22,0,0x218960,0x30000d22,0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000, -0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100,0x230400,0x30000d22,0xc000010,0x248000,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821, -0x2802100,0x962460,0x30001821,0x2806400,0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100, -0x230400,0x30001b27,0x2802100,0x962460,0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400, -0x30001c1c,0x2802100,0x1862460,0x30001c1c,0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c, -0x6800100,0x1862540,0x30001c1c,0x7c00100,0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010, -0x200000,0x30001f0b,0x4000010,0x400000,0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400, -0x30002128,0x4000010,0x200000,0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d, -0x4000001,0x440000,0x3000221d,0x7c00100,0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400, -0x1862460,0x30002417,0x2806400,0x1862460,0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000, -0x30002417,0x4000010,0x400000,0x30002417,0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417, -0x7d00100,0x1830000,0x3000251b,0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006, -0x500000,0x3000251b,0x4000010,0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400, -0x3000251b,0x7c00900,0x230400,0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x4000001,0xc41c0b,0x30002800,0x24000000,0x200000,0x30002800, -0x2c000010,0x1248002,0x30002800,0x2c000010,0x11248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100, -0x10220405,0x30002d19,0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000, -0x30003700,0x24000000,0x200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500400,0x30020701, -0x2802400,0x962460,0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000, -0xe00000,0x300a3c00,0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400, -0x300a4829,0x7c00900,0x1230400,0x300a4929,0x4000000,0xe00000,0x30402576,0x4000010,0x400000,0x30402576,0x4000010,0xb70000,0x30402576,0xc000010,0xb48000,0x304a3d92, -0x4000000,0xe00000,0x30800c17,0x2802100,0x962460,0x30c01c6e,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,0x250402,0x31005167,0x1000, -0,0x3100581e,0x4000000,0x200000,0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400, -0x31005b00,0x4000000,0x200000,0x31005c00,0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,0x4000000,0x200000,0x31005c00, -0x4000000,0x200001,0x31005c00,0x6800000,0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020, -0x1329805,0x31005d00,0x7c00120,0x220405,0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x962460,0x31006000,0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000, -0x310a5f11,0x7c00300,0xe30001,0x32000419,0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,0x7c00100,0x250400,0x32000908, -0x7c00100,0x220400,0x32000908,0x7c00100,0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,0x230400,0x32002800,0x80000, -0x1e18820,0x32002800,0x80020,0x218820,0x32002800,0x4000001,0x440002,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x200002,0x32002800,0x24000020,0x200000, -0x32002800,0x2c000010,0x1248002,0x32002919,0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,0x2802000,0x962460,0x32002b01, -0x2802020,0x962460,0x32002c00,0x4000000,0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120, -0x250405,0x32002e00,0x24000020,0x200000,0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,0x32003500,0x24000000,0x200000, -0x32003600,0x24000020,0x200000,0x32003600,0x24000020,0x10200000,0x32003700,0x24000000,0x100000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x10200000,0x32003800, -0x24000000,0x810000,0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100, -0x250400,0x3200622a,0x2802100,0x962460,0x3200622a,0x2806000,0x962460,0x3200622a,0x7c00100,0x230400,0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460, -0x3200632b,0x7c00100,0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600, -0x24000020,0x200000,0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,0x32006800,0x24000020,0x10200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020, -0x810000,0x32006900,0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460, -0x32023300,0x4000000,0x100000,0x32026c01,0x12882000,0x962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600, -0x24000020,0x1410000,0x32086900,0x24000020,0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x30200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100, -0xe30010,0x320a3e14,0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001, -0x320a6b16,0x7c00100,0x2530c00,0x32406372,0xc000010,0x448000,0x324a3d95,0x4000000,0x10e00000,0x324a3d95,0x7c00100,0x1230400,0x324a3f90,0x4000002,0x1200c00,0x324a538d, -0x24000000,0xe00000,0x32820701,0x2802000,0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400,0x4000080e,0x7c00100, -0x220400,0x4000080e,0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402,0x40000c02,0,0x218960,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460, -0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000,0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,0x40000d22,0x7c00100,0x230400,0x40000f0a, -0x7c00100,0x230400,0x40001004,0x7c00100,0x230400,0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000, -0x1600000,0x4000120f,0x7c00100,0x230400,0x4000131f,0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460, -0x40001615,0x7c00100,0x230400,0x40002417,0x2802400,0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00, -0x4000000,0x200002,0x40003000,0x24000000,0x10200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x10200000,0x40005a09,0x7c00100, -0x220400,0x40005a09,0x7c00100,0x250400,0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000, -0x40006f30,0x6800000,0x1329800,0x40006f30,0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117, -0x4000000,0x200000,0x40007208,0x7c00100,0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100, -0x220400,0x40007219,0x7c00500,0x220400,0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x10200000, -0x40007400,0x4000000,0x200000,0x40007531,0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933, -0x7c00100,0x230400,0x40007a32,0x6800000,0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400, -0x962460,0x40020701,0x2802400,0xc62460,0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x30200000,0x400a3700,0x24000000,0x30e00000, -0x400a4400,0x4000000,0xe0000d,0x400a4412,0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300, -0x4000000,0x1410010,0x404077b8,0x4000000,0x200000,0x404077bb,0x4000000,0x200000,0x404077bb,0x4000000,0x400000,0x40c0511b,0x4000000,0x200000,0x41000419,0x7c00100, -0x220400,0x41000419,0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,0x250400, -0x41000b13,0x2802000,0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0xb00000,0x41000c02, -0x4000000,0x1500000,0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100, -0x230400,0x41001d0c,0x7c00100,0x23040f,0x41001f0b,0x2802100,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,0x200000, -0x41002800,0x24000000,0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,0x41002c00, -0x7c00120,0x220405,0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x200000,0x41003700,0x24000000,0x10200000,0x41003700,0x24000000,0x10205200,0x41003700,0x24000000, -0x10e00000,0x41005d00,0x7c00120,0x220405,0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f, -0x41007219,0x7c00100,0x220400,0x41007300,0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e, -0x7c00100,0x230400,0x41008002,0x7c00100,0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100, -0x230400,0x41008301,0x2802000,0x962460,0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400, -0x41008407,0x7c00100,0x250400,0x4100850b,0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838, -0x7c00100,0x220400,0x41008838,0x7c00100,0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000, -0x200000,0x41008939,0x4000000,0x400000,0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000000,0x200000,0x41008b3b,0x4000000,0x1800000, -0x41008b3b,0x6800000,0x1329800,0x41008b3b,0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e, -0x7c00100,0x22040f,0x41008d19,0x7c00100,0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000, -0x1710000,0x41008e00,0x24000006,0x400000,0x41008f3a,0x2802000,0x962460,0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000, -0x41008f3a,0x6800100,0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c,0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701, -0x2802000,0xc62460,0x410a3700,0x24000000,0x30200000,0x410a3700,0x24000000,0x30e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300, -0xe30001,0x410a9100,0x4000000,0x800010,0x410a9100,0x4000000,0x810010,0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010, -0x410a9100,0x4000000,0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100,0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a8292,0x4000000,0xe00000,0x41808300, -0x2802000,0x962460,0x41c01469,0x6800000,0x1329800,0x50000419,0x7c00100,0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100, -0x220400,0x50000908,0x7c00100,0x250400,0x50000b13,0x2802500,0x962460,0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400, -0x50002b01,0x2802020,0x962460,0x50002c00,0x4000000,0x200000,0x50002c19,0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000, -0x24000020,0x200000,0x50003700,0x24000000,0x200000,0x50005d00,0x7c00120,0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100, -0x250400,0x50006600,0x24000020,0x200000,0x50007300,0x24000000,0x200000,0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460, -0x50009257,0x4000000,0x200000,0x50009257,0x4000010,0x1071400,0x50009257,0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257, -0x7c00900,0x230400,0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100,0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000, -0x400000,0x5000933e,0x4000010,0x400000,0x5000933e,0x6800000,0x1329800,0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540, -0x5000933e,0x7c00100,0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e,0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500, -0x4000400,0x200400,0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100,0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010, -0x400000,0x5000975b,0x7c00100,0x230400,0x50009865,0x7c00100,0x230400,0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409a92,0x4000000,0x200000, -0x5100080e,0x7c00100,0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02,0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02, -0x7c00100,0x230400,0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500,0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100, -0x230400,0x51001524,0x2802100,0x962460,0x51001524,0x4000000,0x200000,0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000, -0x5100171a,0x4000000,0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27,0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27, -0x7c00100,0x230400,0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802400,0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000, -0x1329800,0x51001c1c,0x6800000,0x1862400,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800400,0x1862400,0x51001c1c,0x7c00100,0x1830000, -0x5100251b,0x7c00100,0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19, -0x7c00100,0x230400,0x51003700,0x24000000,0x200000,0x51003700,0x24000000,0xe00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100, -0x220400,0x51006108,0x7c00100,0x250400,0x51006600,0x24000020,0x200000,0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000, -0x51007300,0x24000020,0x200000,0x51008002,0x7c00100,0x230400,0x51008301,0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00, -0x24000000,0x200000,0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000, -0x1710000,0x51008e00,0x24000002,0x200000,0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e, -0x51009419,0x7c00100,0x22040f,0x51009419,0x7c00100,0x250400,0x51009500,0x4000000,0x200400,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519, -0x7c00100,0x22040f,0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100, -0x962540,0x51009b71,0x6804400,0x962540,0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802c00,0x962460, -0x51009c52,0x4000010,0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d, -0x6800000,0x1329800,0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100, -0x962460,0x51009f63,0x4000010,0x400000,0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000, -0x51009f63,0xc000010,0xb48000,0x5100a008,0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008, -0x7c00100,0x230400,0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100, -0x962540,0x5100a16f,0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800, -0x5100a24f,0x7c00100,0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e, -0x6804400,0x962540,0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100, -0x962540,0x5100a442,0x7c00100,0x230400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460, -0x5100a76b,0x7c00100,0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0xe00000,0x5100ab00, -0x4000000,0xe00000,0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000, -0x30200000,0x510aaa00,0x4000000,0x30e00000,0x5140a2b3,0x4000400,0x400000,0x514a8292,0x4000000,0xe00000,0x51802b84,0x2802000,0x962460,0x51c00908,0x2802400,0x962460, -0x51c0a008,0x2802400,0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00, -0x4000000,0x200000,0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800400,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100, -0x2330520,0x52002128,0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006, -0x52003000,0x24000000,0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407, -0x7c00100,0x220400,0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100, -0x250400,0x5200975b,0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000, -0x5200ac7e,0x7c00100,0x230400,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,0x5200ae6a, -0x2806000,0x1862460,0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,0x7c00100, -0x1830000,0x5200ae6a,0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,0x448000, -0x5200b182,0x2802400,0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,0x5200b30a, -0x2802400,0x962460,0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,0x4000000, -0x200000,0x5200b54e,0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800,0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,0x230400, -0x5200b54e,0xc000010,0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,0x6800400,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,0x5200b77f, -0x2802100,0x1862460,0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,0x7c00500, -0x1830000,0x5200b77f,0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,0x1329800, -0x5200b873,0x6800100,0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,0x5200b912, -0x7c00100,0x2330520,0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,0x7c00100, -0x230400,0x5200bc75,0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,0x230400, -0x5200be7a,0x4000000,0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0,0x218960,0x5200c178, -0x2802000,0x962460,0x5200c178,0x2802100,0x962460,0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100, -0x962540,0x5200c178,0x7c00100,0x230400,0x5200c178,0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400, -0x5200c247,0x7c00100,0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700, -0x24000000,0x10100000,0x52023700,0x24000000,0x10e00000,0x52023700,0x24000000,0x928045a0,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000, -0x100000,0x5202c300,0x4000000,0x100002,0x5202c300,0x4000000,0x100003,0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d, -0x5202c300,0x4000100,0x10150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0x30e00000,0x520a3800,0x24000000,0x30100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11, -0x7c00300,0xe30001,0x520a7300,0x24000000,0x30100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000, -0x30e0000d,0x520ac414,0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af78,0x6800400,0x962540,0x5240af78,0x7c00100,0x230400,0x5240af79,0x4000400,0x200000, -0x5240af79,0x6800100,0x962540,0x5240b298,0x4000000,0x200000,0x5240b2a2,0x4000000,0x200000,0x5240b2a2,0x4000000,0x1500000,0x5240b5b6,0x7c00900,0x230400,0x524a4492, -0x4000000,0xe00003,0x5280af78,0x2802400,0x962460,0x5280af79,0x2802400,0x962460,0x5280af7b,0x2802400,0x962460,0x5280af7d,0x2802400,0x962460,0x52c0b3ad,0x2802400, -0x962460,0x52c0b3b1,0x7c00100,0x230400,0x60000c02,0x2802100,0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540, -0x60000f0a,0x7c00100,0x230400,0x6000131f,0x4000000,0x200000,0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27, -0x4000000,0xc00000,0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802000,0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000, -0x10200000,0x60003000,0x24000000,0x10e00000,0x60003700,0x24000000,0x200000,0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400, -0x60006108,0x7c00100,0x250400,0x60006600,0x24000020,0x200000,0x60008301,0x2802000,0x962460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519, -0x7c00100,0x220400,0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x32703580,0x6000c654,0x2802000, -0x962460,0x6000c654,0x4000010,0x200000,0x6000c654,0x7c00100,0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000, -0x6000c73f,0x6800100,0x962540,0x6000c73f,0x6804000,0x962540,0x6000c73f,0x7c00100,0x230400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941, -0x2806000,0x962460,0x6000c941,0x4000000,0x200000,0x6000c941,0x4000010,0x200000,0x6000c941,0x6800000,0x1329800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100, -0x230400,0x6000c941,0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400,0x6000cc00,0x4000000,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000, -0x6002c300,0x4000000,0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,0x10150400,0x600a3000,0x24000000,0x30200000,0x600a3000, -0x24000000,0x30e00000,0x600a3700,0x24000000,0x30200000,0x600a3800,0x24000000,0x30200000,0x600a3800,0x24000000,0xb28045a0,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000, -0x30100000,0x600ac400,0x4000000,0x10e0000d,0x600ac400,0x4000000,0x30e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x30e00000, -0x600acd00,0x4000000,0x30200000,0x600acd00,0x4000000,0x30e00000,0x600acd00,0x4000000,0x30e05200,0x600acd00,0x4000000,0xb28045a0,0x600acd00,0x4000000,0xb28049c0,0x600ace00, -0x4000000,0x30e00000,0x600ace00,0x4000000,0xb28045a0,0x600acf00,0x4000000,0x30e00000,0x600acf00,0x4000000,0x30e05200,0x600acf00,0x4000000,0xb28045a0,0x600ad111,0x7c40300, -0xe30000,0x604ac492,0x4000000,0x30e00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,0x1830000, -0x61001d0c,0x7c00100,0x230400,0x61001d0c,0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,0x6100870c, -0x7c00100,0x220400,0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,0x7c00100, -0x220400,0x61009519,0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,0x230400, -0x6100a008,0x2802100,0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,0x6100d202, -0x7c00100,0x230400,0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,0x2806400, -0x962460,0x6100d476,0x4000000,0x400000,0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,0x448000, -0x6100d573,0x2802100,0x962460,0x6100d573,0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,0x6100d573, -0xc000010,0x448000,0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802400,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,0x7c00100, -0x230400,0x6100d85c,0x7c00500,0x230400,0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,0x1329800, -0x6100d997,0x6800100,0x962540,0x6100d997,0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,0x6100da98, -0x6800000,0x1329800,0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,0x6800000, -0x1329800,0x6100dc99,0x6800100,0x962540,0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,0xe30001, -0x610ace00,0x4000000,0x30e00000,0x6140af78,0x7c00100,0x230400,0x6140af79,0x6800100,0x962540,0x6140af82,0x7c00100,0x230400,0x6180af79,0x2802400,0x962460,0x62002a00, -0x4000000,0x1600000,0x63000c00,0x80000,0x918820,0x63002800,0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0, -0x218960,0x70000f0a,0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460, -0x7000171a,0x2802100,0x962460,0x70001821,0x6800000,0x1329800,0x70002320,0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000, -0x24000000,0x200000,0x70003000,0x24000000,0x10200000,0x70003800,0x24000000,0xe00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100, -0x220400,0x70006108,0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400,0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460, -0x70008301,0x2802400,0x962460,0x70008e00,0x24000000,0x200000,0x70008e00,0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00, -0x24000010,0x400000,0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100,0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100, -0x230400,0x70009965,0x4000010,0x400000,0x70009965,0x7c00100,0x230400,0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f, -0x7000a50e,0x4000000,0x200000,0x7000b61c,0x2802400,0x1862460,0x7000b61c,0x6800400,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941, -0x2806000,0x962460,0x7000cc00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x10200000,0x7000cd00,0x4000000, -0x10e00000,0x7000cd00,0x4000000,0x10e05200,0x7000cd00,0x4000000,0x928045a0,0x7000cf00,0x4000000,0xe00000,0x7000cf00,0x4000000,0x10e00000,0x7000d202,0x2802100,0x962460, -0x7000d202,0x7c00100,0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86, -0xc000010,0x448000,0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000, -0x962460,0x7000e187,0x2802100,0x962460,0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400, -0x7000e300,0x4000000,0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489, -0x6804400,0x962540,0x7000e489,0x7c00100,0x230400,0x7000e489,0x7c00900,0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000, -0x200000,0x7000e59d,0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000, -0x7000e691,0x2802100,0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691, -0x7c00100,0x230400,0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100, -0x230400,0x7000e9a0,0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460, -0x7000ea79,0x4000000,0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c, -0x4000000,0x200000,0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000, -0x1329800,0x7000eca3,0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400, -0x7000ed95,0xc000010,0x448000,0x7000ee1c,0x2802400,0x1862460,0x7000ee1c,0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f, -0x4000000,0x200000,0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100, -0x230400,0x7000f200,0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802100,0x962460,0x7000f34b,0x4000000,0x200000, -0x7000f34b,0x4000010,0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490, -0x4000000,0x200000,0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100, -0x230400,0x7000f8a6,0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000, -0x7000f8a6,0x4000800,0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921, -0x4000000,0x200000,0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000, -0x200000,0x7000fb9e,0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000, -0x7000fc92,0x6800000,0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x30e00000,0x700acd00, -0x4000000,0xb28045a0,0x700ace00,0x4000000,0x30e00000,0x700acf00,0x4000000,0x30e00000,0x700acf00,0x4000000,0xb28045a0,0x7040dfbd,0x4000000,0x200000,0x7040f7c1,0x80000, -0x918820,0x7080af79,0x2802400,0x962460,0x7080dfbd,0x2802400,0x962460,0x70c0e4bf,0x2802400,0x962460,0x70c0e4bf,0x6800100,0x962540,0x8000120f,0x7c00100,0x230400, -0x80001524,0x7c00100,0x230400,0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000,0x80002d00, -0x4000000,0x200000,0x80005208,0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519,0x7c00100, -0x230400,0x80009519,0x7c00100,0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100,0x230400, -0x8000cd00,0x4000000,0xe00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460,0x8000d997, -0x4000000,0x200000,0x8000d997,0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489,0x2802100, -0x962460,0x8000e489,0x7c00100,0x230400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010,0x448000, -0x8000fda1,0x2802100,0x1862460,0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540,0x8000fda1, -0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06,0x7c00100, -0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010,0x448000, -0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000,0x80010670, -0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x30e00000,0x800acd00,0x4000000,0x72904de0,0x800ace00,0x4000000, -0x30e00000,0x800acf00,0x4000000,0x30e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,0x90001615,0x7c00100,0x230400, -0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460,0x90008e00, -0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202,0x2802100, -0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00,0x962460, -0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460,0x900108a8, -0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8,0x6800100, -0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100,0x962460, -0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000,0x90010eaa, -0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa,0x4000010, -0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100,0x220400, -0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x30e00000,0x900acd00,0x4000000,0xb28045a0,0x900acf00, -0x4000000,0x30e00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a,0x7c00300, -0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000}; +0,0,0x5967,0,0,0x5b67,0,0,0x5c67,0,0,0x5d67,0,0,0x6067,0x80000, +0x20,0x6267,0,0,0x6367,0,0,0x6467,0,0,0x6567,0,0,0x6f67,0,0, +0x7067,0,0,0x7367,0x20000000,0,0x7567,0,0,0x7667,0,0,0x7767,0,0,0x7867, +0,0,0x7a67,0,0,0x7b67,0,0,0x7c67,0,0,0x7e67,0,0,0x7f67,0, +0,0x8167,0,0,0x8267,0,0,0x8367,0,0,0x8467,0,0,0x8567,0,0, +0x8667,0,0,0x8767,0,0,0x8867,0,0,0x8967,0,0,0x8b67,0,0,0x8c67, +0,0,0x8e67,0x20000000,0,0x8f67,0,0,0x9067,0,0,0x9167,0,0,0x9267,0, +0,0x9367,0,0,0x9567,0,0,0x9667,0,0,0x9767,0,0,0x9867,0,0, +0x9967,0,0,0x9a67,0,0,0x9c67,0,0,0x9f67,0,0,0xa167,0,0,0xa367, +0,0,0xa467,0,0,0xa567,0,0,0xa667,0,0,0xa767,0,0,0xa867,0, +0,0xa967,0,0,0xaa67,0,0xe00000,0xab67,0,0xe00000,0xac67,0,0,0xad67,0,0, +0xae67,0,0,0xaf67,0,0,0xb167,0,0,0xb267,0,0,0xb367,0,0,0xb467, +0,0,0xb567,0,0,0xb767,0,0,0xb867,0,0,0xb967,0,0,0xba67,0, +0,0xbc67,0,0,0xbd67,0,0,0xbe67,0,0,0xbf67,0,0,0xc067,0,0, +0xc167,0,0,0xc267,0,0,0xc367,0,0xe00000,0xc467,0,0xe00000,0xc667,0,0,0xc767, +0,0,0xc867,0,0,0xc967,0,0,0xca67,0,0,0xcc67,0,0xe00000,0xcf67,0, +0xe00000,0xd067,0,0xe00000,0xd267,0,0,0xd367,0,0,0xd467,0,0,0xd567,0,0, +0xd667,0,0,0xd867,0,0,0xd967,0,0,0xda67,0,0,0xdb67,0,0,0xdc67, +0,0,0xdd67,0,0,0xde67,0,0,0xdf67,0,0,0xe067,0,0,0xe167,0, +0,0xe267,0,0,0xe367,0,0xe00000,0xe467,0,0,0xe567,0,0,0xe667,0,0, +0xe767,0,0,0xe867,0,0,0xe967,0,0,0xea67,0,0,0xeb67,0,0,0xec67, +0,0,0xed67,0,0,0xee67,0,0,0xef67,0,0,0xf167,0,0,0xf367,0, +0,0xf567,0,0,0xf667,0,0,0xf767,0,0,0xf867,0,0,0xf967,0,0, +0xfa67,0,0xe00000,0xfb67,0,0,0xfc67,0,0,0xfd67,0,0,0xfe67,0,0,0x10167, +0,0,0x10267,0,0,0x10367,0,0,0x10467,0,0,0x10567,0,0xe00000,0x10667,0, +0,0x10767,0,0,0x10867,0,0,0x10967,0,0,0x10a67,0,0,0x10b67,0,0, +0x10c67,0,0,0x10d67,0,0,0x10e67,0,0,0x10f67,0,0,0x11067,0,0,0x11167, +0,0,0x11367,0,0,0x11467,0,0,0x11567,0,0,0x11667,0,0,0x11767,0, +0,0x11867,0,0,0xa0067,0,0xe00000,0xa4667,0,0xe00000,0xa4767,0,0xe00000,0xa4f67,0,0xe00000, +0xa5e67,0,0xe00000,0xa5f67,0,0xe00000,0xac567,0,0xe00000,0xad167,0,0xe00000,0xb0067,0,0xe00000,0xb1267, +0,0xe00000,0x11000100,0,0x900020,0x11000100,0x40000001,0x440020,0x11000100,0x40000001,0x643020,0x11000100,0x40000001,0xa5a040,0x11000100,0x40000001, +0x116a8a0,0x11000200,0,0x900020,0x11000200,0x4000001,0xc4000b,0x11000200,0x7c00100,0x220402,0x11000200,0x24000000,0x10200000,0x11000200,0x24000008,0x1710000, +0x11000200,0x40000001,0x1d3b020,0x11000219,0x7c00100,0x220401,0x11000219,0x7c00100,0x250401,0x11000319,0x7c00100,0x220401,0x11000319,0x7c00100,0x220402,0x11000319, +0x7c00100,0x250400,0x11000319,0x7c00100,0x250401,0x11000419,0x7c00100,0x220400,0x11000419,0x7c00100,0x220401,0x11000419,0x7c00100,0x220402,0x11000419,0x7c00100, +0x230400,0x11000419,0x7c00100,0x250400,0x11000419,0x7c00100,0x250401,0x11000419,0x7c00100,0x250402,0x11000519,0x7c00100,0x220400,0x11000519,0x7c00100,0x230400, +0x11000600,0x4000400,0x200000,0x11000600,0x4000400,0x200002,0x11000600,0x4000400,0x200400,0x11000600,0x7c00500,0x220400,0x11000600,0x7c00500,0x230400,0x11000600, +0x7c00500,0x530400,0x11000600,0x7c00d00,0x230400,0x11000619,0x7c00500,0x22040f,0x11000800,0x4000010,0x1001401,0x11000800,0x4000400,0x200001,0x11000800,0x6800010, +0x201001,0x11000800,0x7c00500,0x230401,0x11000807,0x7c00100,0x220400,0x11000807,0x7c00100,0x250400,0x1100080e,0x4000400,0x200000,0x1100080e,0x4000400,0x200002, +0x1100080e,0x7000500,0x220402,0x1100080e,0x7c00100,0x220400,0x1100080e,0x7c00100,0x220401,0x1100080e,0x7c00100,0x220402,0x1100080e,0x7c00100,0x250400,0x1100080e, +0x7c00100,0x250401,0x1100080e,0x7c00120,0x220402,0x1100080e,0x7c00120,0x250402,0x11000908,0x4000000,0x200000,0x11000908,0x7c00100,0x220400,0x11000908,0x7c00100, +0x220401,0x11000908,0x7c00100,0x250400,0x11000908,0x7c00100,0x250401,0x11000a03,0x4000000,0x200000,0x11000a03,0x4000000,0x270000,0x11000a03,0x7c00100,0x220400, +0x11000a03,0x7c00100,0x220402,0x11000a03,0x7c00100,0x250400,0x11000a03,0x7c00500,0x230400,0x11000b13,0x2802500,0x962460,0x11000b13,0x4000000,0x200000,0x11000b13, +0x4000000,0x201000,0x11000b13,0x4000000,0x230400,0x11000b13,0x4000002,0x400000,0x11000b13,0x4000010,0x200000,0x11000b13,0x7c00100,0x2633800,0x11000c00,0x80000000, +0x218960,0x11000c02,0x2802100,0x962460,0x11000c02,0x2802400,0x962460,0x11000c02,0x4000000,0x200000,0x11000c02,0x4000000,0x1329400,0x11000c02,0x4000000,0x1329800, +0x11000c02,0x4000000,0x1500000,0x11000c02,0x6800000,0x1329800,0x11000c02,0x7c00100,0x230400,0x11000c02,0x7c00100,0x230401,0x11000c02,0x7c00100,0x230402,0x11000c02, +0x7c00500,0x230400,0x11000c02,0x7d00100,0x230400,0x11000c02,0xc000010,0xb48000,0x11000f0a,0x2802100,0x962460,0x11000f0a,0x2802400,0x962460,0x11000f0a,0x2806400, +0x962460,0x11000f0a,0x4000000,0x200000,0x11000f0a,0x6800100,0x962540,0x11000f0a,0x7c00100,0x230400,0x11000f0a,0x7c00100,0x230401,0x11001004,0x2802100,0x962460, +0x11001004,0x2802400,0x962460,0x11001004,0x2806400,0x962460,0x11001004,0x4000000,0x200000,0x11001004,0x4000000,0x1500000,0x11001004,0x6800100,0x962540,0x11001004, +0x6800100,0x962541,0x11001004,0x7c00100,0x230400,0x11001004,0x7c00100,0x230401,0x11001110,0x2802100,0x962460,0x11001110,0x2802400,0x962460,0x11001110,0x2806400, +0x962460,0x11001110,0x6800100,0x962540,0x11001110,0x7c00100,0x230400,0x11001110,0x7c00100,0x230401,0x1100120f,0x2802100,0x962460,0x1100120f,0x2802400,0x962460, +0x1100120f,0x2806400,0x962460,0x1100120f,0x6800100,0x962540,0x1100120f,0x7c00100,0x230400,0x1100131f,0x2802100,0x962460,0x1100131f,0x2802400,0x962460,0x1100131f, +0x2806400,0x962460,0x1100131f,0x4000000,0x200000,0x1100131f,0x6800000,0x1329800,0x1100131f,0x6800100,0x962540,0x1100131f,0x6800100,0x962541,0x1100131f,0x7c00100, +0x230400,0x1100131f,0x7c00100,0x230401,0x11001423,0x2802100,0x962460,0x11001423,0x2806400,0x962460,0x11001423,0x6800100,0x962540,0x11001423,0x6800100,0x962541, +0x11001423,0x7c00100,0x230400,0x11001423,0x7c00100,0x230401,0x11001524,0x2802100,0x962460,0x11001524,0x2802100,0x962461,0x11001524,0x2806400,0x962460,0x11001524, +0x6800000,0x1329800,0x11001524,0x6800100,0x962540,0x11001524,0x7c00100,0x230400,0x11001615,0x2802100,0x962460,0x11001615,0x2806400,0x962460,0x11001615,0x6800000, +0x1329800,0x11001615,0x6800100,0x962540,0x11001615,0x6800100,0x962541,0x11001615,0x7c00100,0x230400,0x1100171a,0x2802100,0x962460,0x1100171a,0x2806400,0x962460, +0x1100171a,0x6800000,0x1329800,0x1100171a,0x6800100,0x962540,0x1100171a,0x6800100,0x962541,0x1100171a,0x7c00100,0x230400,0x11001900,0x4000000,0x1600000,0x11001926, +0x2802100,0x1862460,0x11001926,0x2802400,0x1862460,0x11001926,0x2806100,0x1862460,0x11001926,0x4000000,0x200000,0x11001926,0x4000010,0x400000,0x11001926,0x6800000, +0x1329800,0x11001926,0x7800100,0x1830142,0x11001926,0x7c00100,0x1830000,0x11001926,0x7c00900,0x1830000,0x11001926,0x7e00100,0x1830000,0x11001a18,0x2802100,0x1862460, +0x11001a18,0x2802400,0x1862460,0x11001a18,0x6800000,0x1329800,0x11001a18,0x7800100,0x1830142,0x11001a18,0x7c00100,0x1830000,0x11001a18,0x7c00100,0x1830002,0x11001a18, +0x7c00900,0x1830000,0x11001a18,0x7e00100,0x1830000,0x11001d0c,0x7c00100,0x230400,0x11001d0c,0x7c00100,0x250400,0x11001e12,0x7c00100,0x2230500,0x11001e12,0x7c00100, +0x2330520,0x11001e12,0x7c80100,0x2330520,0x11002619,0x7c00100,0x220401,0x11002619,0x7c00100,0x220402,0x11002619,0x7c00100,0x250401,0x1100270e,0x4000400,0x200001, +0x1100270e,0x4000400,0x200002,0x1100270e,0x4000400,0x500001,0x1100270e,0x7c00100,0x220401,0x1100270e,0x7c00100,0x250401,0x11002800,0x80000,0x918820,0x11002800, +0x80000,0x1c18020,0x11002800,0x180000,0x918820,0x11002800,0x4000001,0x440001,0x11002800,0x4000001,0x440002,0x11002800,0x4000001,0xc4000b,0x11002800,0x6800000, +0x201c00,0x11002800,0x6800020,0x201c00,0x11002800,0x24000000,0x200000,0x11002800,0x24000000,0x200002,0x11002800,0x24000000,0x810000,0x11002800,0x24000000,0x1410000, +0x11002800,0x24000000,0x1500000,0x11002800,0x24000000,0x1500002,0x11002800,0x24000002,0x400000,0x11002800,0x24000006,0xc0000b,0x11002800,0x24000008,0x1410000,0x11002800, +0x24000008,0x1710000,0x11002800,0x24000020,0x1001400,0x11002800,0x24000020,0x1500002,0x11002800,0x2c000010,0x1248000,0x11002800,0x2c000010,0x11248002,0x11002800,0x40000001, +0x63b020,0x11002800,0x40080000,0x918820,0x11002801,0x80000,0x2a65620,0x11002801,0x82000,0x962460,0x11002900,0x4000000,0x20000e,0x11002900,0x4000000,0x20000f, +0x11002900,0x4000020,0x20000e,0x11002900,0x4000020,0x20000f,0x11002900,0x4000020,0x81000e,0x11002900,0x4000020,0x81000f,0x11002900,0x4000020,0x141000e,0x11002900, +0x4000020,0x141000f,0x11002900,0x4000022,0x20000e,0x11002900,0x4000022,0x20000f,0x11002a00,0x4000000,0x1500000,0x11002a00,0x4000000,0x1600000,0x11002a00,0x4000000, +0x1600002,0x11002b01,0x2000,0x962460,0x11002b01,0x2802020,0x962460,0x11002c00,0x4000000,0x200000,0x11002c00,0x4000000,0x200002,0x11002c00,0x4000000,0x20000f, +0x11002c00,0x4000020,0x200000,0x11002c00,0x7c00000,0x200000,0x11002c00,0x7c00020,0x200000,0x11002c00,0x7c00120,0x220405,0x11002c00,0x7c00120,0x230402,0x11002c00, +0x7c00120,0x250402,0x11002c00,0x7c00120,0x250405,0x11002c19,0x7c00100,0x250400,0x11002c19,0x7c00100,0x250401,0x11002d00,0x4000000,0x100006,0x11002d00,0x4000000, +0x200006,0x11002d19,0x7c00100,0x220402,0x11002d19,0x7c00100,0x230400,0x11002d19,0x7c00100,0x250402,0x11002e00,0x24000000,0x200000,0x11002e00,0x24000020,0x200000, +0x11002e00,0x24000020,0x200001,0x11002e00,0x24000020,0x10200000,0x11002f00,0x24000020,0x200000,0x11002f00,0x24000020,0x200001,0x11002f00,0x24000020,0x200002,0x11002f00, +0x24000020,0xf00000,0x11002f00,0x24000020,0x1600000,0x11002f00,0x24000022,0x1600000,0x11003000,0x24000000,0x200000,0x11003000,0x24000000,0x10200000,0x11003000,0x24000020, +0x200000,0x11003000,0x24000020,0x810000,0x11003000,0x24000020,0x1410000,0x11003100,0x24000000,0x200000,0x11003200,0x24000000,0x200000,0x11003300,0x4000000,0x100003, +0x11003400,0x24000000,0x100000,0x11003400,0x24000000,0x200000,0x11003500,0x24000000,0x200000,0x11003600,0x24000000,0x200000,0x11003600,0x24000000,0x10200000,0x11003600, +0x24000020,0x200000,0x11003700,0x24000000,0x200000,0x11003700,0x24000000,0xe00000,0x11003700,0x24000000,0x10200000,0x11003700,0x24000000,0x10e00000,0x11003700,0x24000000, +0x928045a0,0x11003700,0x24000020,0x200000,0x11003800,0x4000000,0x100000,0x11003800,0x24000000,0x200000,0x11003800,0x24000000,0xb00000,0x11003800,0x24000000,0xe00000, +0x11003800,0x24000000,0x1710000,0x11003800,0x24000000,0x10200000,0x11003800,0x24000000,0x10b00000,0x11003800,0x24000000,0x10e00000,0x11003800,0x24000000,0x10e05200,0x11003800, +0x24000000,0x928045a0,0x11005003,0x7c00100,0x220402,0x11005013,0x2802500,0x962460,0x11005013,0x4000020,0x200005,0x11005013,0x7c00100,0x2633801,0x11005013,0x7c00100, +0x2633802,0x11005013,0x7c00100,0x2633805,0x11005019,0x7c00100,0x220402,0x11005100,0x24000000,0x810000,0x11005100,0x24000000,0x1410000,0x11005102,0x7000100,0x230408, +0x11005102,0x7c00100,0x230404,0x11005102,0x7c00100,0x230407,0x11005102,0x7c00100,0x230408,0x11005102,0x7c00100,0x230409,0x11005201,0x2802400,0x962460,0x11005500, +0x80000,0x1e18820,0x11005502,0x7000100,0x230408,0x11005502,0x7c00100,0x230404,0x11005502,0x7c00100,0x230407,0x11005502,0x7c00100,0x230408,0x11005502,0x7c00100, +0x230409,0x11005667,0x1000,0,0x11020200,0x80004,0x418820,0x11020200,0x4000000,0x100006,0x11020200,0x4000000,0x10000f,0x11020200,0x4000400,0x100002, +0x11020200,0x4000400,0x500002,0x11020200,0x6800c00,0x101000,0x11020200,0x24000000,0x100000,0x11020200,0x24000000,0x1400000,0x11020200,0x24000000,0x1500000,0x11020200, +0x24000000,0x1600000,0x11020200,0x24000000,0x10200000,0x11020200,0x24000020,0x100000,0x11020200,0x24000020,0x1600000,0x11020219,0x7c00100,0x12040f,0x11020219,0x7c00100, +0x220400,0x11020219,0x7c00100,0x220401,0x11020219,0x7c00100,0x250400,0x11020319,0x7c00100,0x220400,0x11020319,0x7c00100,0x220401,0x11020319,0x7c00100,0x220402, +0x11020319,0x7c00100,0x250400,0x11020319,0x7c00100,0x250402,0x11020319,0x7d00100,0x220402,0x11020419,0x7c00100,0x220401,0x11020519,0x7c00100,0x220400,0x11020600, +0x4000400,0x100002,0x11020600,0x4000400,0x200400,0x11020600,0x7c00500,0x130400,0x11020600,0x7c00d00,0x130400,0x11020701,0x2802400,0x962460,0x11020701,0x2802400, +0x962461,0x11020701,0x2802400,0xc62460,0x1102080e,0x7c00100,0x220400,0x1102080e,0x7c00100,0x250400,0x11020908,0x7c00100,0x220400,0x11020908,0x7c00100,0x220401, +0x11020908,0x7c00100,0x250400,0x11020908,0x7c00100,0x250401,0x11022800,0x24000000,0x100000,0x11022800,0x24000000,0x200000,0x11022800,0x24000000,0x200002,0x11022800, +0x24000000,0x401000,0x11022800,0x24000000,0xf00002,0x11022800,0x24000000,0xf0ac02,0x11022800,0x24000000,0x1500000,0x11022800,0x24000002,0x100000,0x11022800,0x24000002, +0x370000,0x11022800,0x24000002,0x470000,0x11022800,0x24000006,0x400000,0x11022800,0x24000008,0x1710000,0x11022800,0x24000008,0x1712c00,0x11022800,0x24000020,0x100000, +0x11022800,0x24000020,0x1500000,0x11022800,0x24000020,0x1500002,0x11022900,0x4000000,0x10000e,0x11022900,0x4000000,0x10000f,0x11022919,0x7c00100,0x12040f,0x11022c00, +0x4000000,0x100002,0x11022c00,0x4000000,0x1500002,0x11022c00,0x4000000,0x1600002,0x11022c00,0x4000000,0x1010000f,0x11022c00,0x7c00120,0x120405,0x11022c0e,0x7c00100, +0x250401,0x11022c19,0x7c00100,0x150401,0x11022d00,0x4000000,0x100006,0x11022d00,0x4000000,0x200006,0x11022d19,0x7c00100,0x120402,0x11022d19,0x7c00100,0x150402, +0x11022e00,0x24000000,0x200000,0x11022e00,0x24000020,0x100000,0x11022e00,0x24000020,0x10100000,0x11022f00,0x24000020,0x100000,0x11022f00,0x24000020,0x100001,0x11022f00, +0x24000020,0x100002,0x11023000,0x24000000,0x100000,0x11023300,0x4000000,0x100002,0x11023300,0x4000000,0x100003,0x11023300,0x4000100,0x120403,0x11023300,0x4000100, +0x150403,0x11023300,0x4000100,0x10150403,0x11023400,0x24000000,0x100000,0x11023500,0x24000000,0x100000,0x11023600,0x24000000,0x100000,0x11023600,0x24000020,0x100000, +0x11023600,0x24000020,0x10100000,0x11023700,0x24000000,0x100000,0x11023700,0x24000000,0xe00000,0x11023700,0x24000000,0x10100000,0x11023700,0x24000000,0x10e00000,0x11023700, +0x24000020,0x100000,0x11023700,0x24000020,0x10100000,0x11023700,0x24000020,0x10105200,0x11023800,0x4000000,0x100000,0x11023800,0x24000000,0x200000,0x11024e67,0, +0,0x11025600,0x4000000,0x100000,0x11042a00,0x4000000,0x1600000,0x11045700,0x4000000,0x20000a,0x11045700,0x4000020,0x20000a,0x11045712,0x7c00100,0xe3040a, +0x11045712,0x7c80100,0xe3040a,0x11045716,0x7c00100,0xe30c0a,0x11045716,0x7c00100,0x2530c0a,0x11065700,0x4000000,0x810011,0x11065700,0x4000000,0xe00011,0x11065700, +0x4000000,0x1410011,0x11065700,0x4000000,0x1500011,0x11065700,0x4000000,0x1600011,0x11065700,0x4000006,0xe70011,0x11065700,0x4000008,0xe00011,0x11065700,0x4000008, +0xe02c11,0x11065700,0x4000010,0x871411,0x11065700,0x4000010,0x1201411,0x11065700,0x4000010,0x1271011,0x11065700,0x4000020,0xe00011,0x11065700,0x4000400,0xe00011, +0x11065700,0x4000420,0xe00011,0x11065700,0x6800000,0xe01c11,0x11065700,0x6800040,0xe00011,0x11065700,0xc000010,0x80ac11,0x11065700,0xc000010,0xb48011,0x11065719, +0x7c00100,0xe20411,0x11065719,0x7c00100,0xe50411,0x11065719,0x7c00140,0xe20411,0x11065719,0x7c00140,0xe50411,0x11080100,0x6800000,0x201c00,0x11080100,0x68000c0, +0x19329800,0x11080100,0x24000000,0x200000,0x11080100,0x24000000,0x810000,0x11080100,0x24000000,0x1410000,0x11080100,0x24000000,0x1500000,0x11080100,0x24000000,0x1600000, +0x11080100,0x24000000,0x1b00000,0x11080100,0x24000000,0x2410000,0x11080100,0x24000000,0x18200000,0x11080100,0x24000006,0xd70000,0x11080100,0x24000008,0x1713c00,0x11080100, +0x24000008,0x1714000,0x11080100,0x24000010,0x1001400,0x11080100,0x24000010,0x1071000,0x11080100,0x24000010,0x1071400,0x11080100,0x24000020,0x200000,0x11080100,0x24000020, +0x400000,0x11080100,0x24000020,0x1600000,0x11080100,0x24000400,0x200000,0x11080100,0x24000420,0x200000,0x11080100,0x2c000010,0xb48000,0x11080100,0x2c000010,0x100ac00, +0x11080100,0x44000001,0x1a40000,0x11080119,0x7c00100,0x220400,0x11080119,0x7c00100,0x250400,0x11080119,0x7c001c0,0x220400,0x11080119,0x7c001c0,0x250400,0x11080200, +0x4000400,0x200002,0x11080200,0x24000000,0x200000,0x11080200,0x24000000,0x1500000,0x11080200,0x24000000,0x1600000,0x11080200,0x24000020,0x200000,0x110a1e12,0x7c00100, +0x2130480,0x110a1e12,0x7c80100,0x2130480,0x110a3000,0x24000000,0x30e00000,0x110a3000,0x24100000,0x810001,0x110a3000,0x24100000,0x1410001,0x110a3700,0x24000000,0x30200000, +0x110a3d11,0x7c00300,0xe30000,0x110a3d11,0x7c00900,0x1230400,0x110a3d12,0x2802400,0x962460,0x110a3e14,0x7c00100,0xe30000,0x110a3e14,0x7c00100,0xe30001,0x110a3e14, +0x7c00100,0x2530000,0x110a3e14,0x7c00900,0x1230000,0x110a3e14,0x7c00900,0x1230001,0x110a3f16,0x7c00100,0xe30c00,0x110a3f16,0x7c00100,0xe30c01,0x110a3f16,0x7c00100, +0x2530c00,0x110a3f16,0x7c00900,0x1230c00,0x110a3f16,0x7c00900,0x1230c01,0x110a4005,0x7c00100,0xe30400,0x110a4112,0x7c00100,0xe30402,0x110a4112,0x7c80100,0xe30402, +0x110a4400,0x4000000,0xe00000,0x110a4412,0x4000000,0xe00002,0x110a4412,0x4000000,0xe00003,0x110a4416,0x4000000,0xe00c03,0x110a4500,0x4000000,0xe0000d,0x110a4516, +0x4000000,0xe00c0d,0x110a4711,0x7c40300,0xe30000,0x110a4f11,0x7c00300,0xe30001,0x110a4f11,0x7c40300,0xe30000,0x110a5300,0x4000000,0x810010,0x110a5300,0x4000000, +0xe00002,0x110a5300,0x4000000,0xe00010,0x110a5300,0x4000000,0x1410010,0x110a5300,0x4000002,0xe70010,0x110a5300,0x4000008,0x810010,0x110a5300,0x4000008,0x1410010, +0x110a5300,0x6800000,0xe01c02,0x110a5300,0x6800000,0xe01c10,0x110a5400,0x4000000,0x81000c,0x110a5400,0x4000000,0xe0000c,0x110a5400,0x4000000,0x141000c,0x110a5400, +0x4000000,0x150000c,0x110a5400,0x4000000,0x160000c,0x110a5400,0x4000002,0xe7000c,0x110a5400,0x4000010,0x87140c,0x110a5400,0x4000010,0xe7000c,0x110a5400,0x4000010, +0x120140c,0x110a5400,0x4000010,0x127100c,0x110a5400,0x4000020,0xe0000c,0x110a5400,0x4000026,0xe7000c,0x110a5400,0xc000010,0x80ac0c,0x110a5400,0xc000010,0xb4800c, +0x11400a0c,0xc000010,0x1049400,0x11400c0e,0x4000010,0xb00000,0x11400c0e,0x4000010,0x1071400,0x11400c0e,0xc000010,0xb48000,0x11400c13,0x7c00900,0x230400,0x11400f36, +0xc000010,0x448000,0x11400f46,0xc000010,0x448000,0x11401d72,0x4000000,0x200000,0x11403d95,0x4000000,0xe00000,0x1144578a,0x4000004,0x120000a,0x1144578a,0x4000008, +0x81000a,0x1144578a,0x4000008,0x141000a,0x1144578a,0x4000010,0x87000a,0x1144578a,0xc000010,0x84800a,0x11445793,0x3802500,0x126246a,0x11445793,0x7c00d00,0x2530c0a, +0x11463d8a,0x4000001,0x440011,0x114a3d8a,0x4000000,0xe00000,0x114a3d8a,0x4000000,0xe00002,0x114a3d8a,0x24000000,0x810000,0x114a3d8a,0x24000000,0xe00000,0x114a3d8a, +0x24000000,0x1410000,0x114a3d8a,0x24000008,0x810000,0x114a3d8a,0x24000008,0x1410000,0x114a3d8a,0x24000010,0x870000,0x114a3d8a,0x2c000010,0x848000,0x114a3d90,0x4000000, +0xe00000,0x114a3d90,0x24000000,0xe00000,0x114a3d90,0x24000002,0x1200000,0x114a3d90,0x24000002,0x10e00000,0x114a3d90,0x24000008,0x810000,0x114a3d90,0x24000008,0x1410000, +0x114a3d93,0x7c00900,0x930c00,0x114a3d93,0x7c00900,0xe30c00,0x114a3d95,0x7c00300,0xe30000,0x114a3e93,0x7000400,0x1200c02,0x114a3f8a,0x4000004,0x1200000,0x114a3f93, +0x7c00d00,0x2530c00,0x114a4295,0x4000000,0xe00000,0x114a4295,0x4000000,0xe0000f,0x114a4495,0x4000000,0xe00002,0x114a4495,0x4000000,0xe00003,0x114a4495,0x4000000, +0x10e00003,0x114a4595,0x4000000,0xe00002,0x114a4595,0x4000000,0xe0000d,0x1180090a,0x2802400,0x962460,0x11800c19,0x2802100,0x962460,0x11800c19,0x2802500,0x962460, +0x11800f1f,0x2802400,0x962460,0x11800f2b,0x2802400,0x962460,0x11820700,0x2802400,0x962460,0x11820700,0x2802500,0x962460,0x118a3d96,0x2802400,0x962460,0x118a3e93, +0x2802400,0x962460,0x11c00904,0x2802400,0x962460,0x11c00908,0x2802400,0x962460,0x11c00c1d,0x6800000,0x1329800,0x11c00f5a,0x6800000,0x1329800,0x11c0105f,0x6800000, +0x1329800,0x11c01163,0x6800000,0x1329800,0x11c01267,0x6800000,0x1329800,0x11c0146b,0x4000000,0x200000,0x11c0146b,0x6800000,0x1329800,0x11c0146b,0x7c00100,0x230400, +0x11c0511d,0x7c00100,0x230408,0x20000067,0x1000,0,0x20000b13,0x2802400,0x962460,0x20000b13,0x2802500,0x962460,0x20001b27,0x2802100,0x962460,0x20001b27, +0x2802100,0x962461,0x20001b27,0x2802400,0x962460,0x20001b27,0x2806400,0x962460,0x20001b27,0x2902100,0x962462,0x20001b27,0x4000000,0x200000,0x20001b27,0x4000000, +0x400000,0x20001b27,0x4000000,0x500000,0x20001b27,0x4000000,0x810000,0x20001b27,0x4000000,0xb00000,0x20001b27,0x4000000,0xc0000b,0x20001b27,0x4000000,0x1410000, +0x20001b27,0x4000010,0xb00000,0x20001b27,0x4000010,0xc00000,0x20001b27,0x6800000,0x1329800,0x20001b27,0x6800100,0x462540,0x20001b27,0x6800400,0x962540,0x20001b27, +0x7c00100,0x230400,0x20001b27,0x7c00100,0x230401,0x20002619,0x7c00100,0x220401,0x20002a00,0x4000000,0x1600000,0x20004b67,0,0x1900020,0x20004c67,0, +0x1900020,0x20004d67,0,0x1900020,0x20006d67,0x1000,0,0x20006e67,0x1000,0,0x20026d67,0,0,0x20026e67,0,0, +0x200a4a12,0x7c00100,0x1f304c1,0x200a4a12,0x7c00100,0x20304e1,0x21005600,0x4000000,0x700000,0x21022a00,0x4000000,0x1600000,0x30000419,0x7c00100,0x220400,0x30000419, +0x7c00100,0x220401,0x30000419,0x7c00100,0x250400,0x30000419,0x7c00100,0x250401,0x30000519,0x7c00100,0x220400,0x30000600,0x4000400,0x200400,0x30000600,0x7c00500, +0x230400,0x30000605,0x4000400,0x200000,0x3000080e,0x7c00100,0x220400,0x30000908,0x2000,0x962460,0x30000908,0x7c00100,0x220400,0x30000908,0x7c00100,0x220401, +0x30000908,0x7c00100,0x250400,0x30000908,0x7c00100,0x250401,0x30000a03,0x4000006,0x400000,0x30000c02,0x4000000,0x200000,0x30000c02,0x7c00100,0x230400,0x30000d22, +0x2802100,0x962460,0x30000d22,0x2802400,0x962460,0x30000d22,0x2802500,0x962460,0x30000d22,0x4000000,0x200000,0x30000d22,0x4000010,0x200000,0x30000d22,0x7c00100, +0x230400,0x30000d22,0xc000010,0x248000,0x30000d22,0x80000000,0x218960,0x30000e25,0x2802500,0x962460,0x30000e25,0x7c00100,0x230400,0x30001821,0x2802100,0x962460, +0x30001821,0x2806400,0x962460,0x30001821,0x4000000,0x200000,0x30001821,0x6800100,0x962540,0x30001821,0x6800100,0x962541,0x30001821,0x7c00100,0x230400,0x30001b27, +0x2802100,0x962460,0x30001b27,0x2802400,0x962460,0x30001b27,0x4000000,0x200000,0x30001b27,0x4000000,0x400000,0x30001b27,0x7c00100,0x230400,0x30001c1c,0x2802100, +0x1862460,0x30001c1c,0x2802400,0x1862460,0x30001c1c,0x2806400,0x1862460,0x30001c1c,0x4000000,0x200000,0x30001c1c,0x6800100,0x1862400,0x30001c1c,0x6800100,0x1862540, +0x30001c1c,0x7c00100,0x1830000,0x30001c1c,0x7c00100,0x1830001,0x30001c1c,0xc000010,0x448000,0x30001f0b,0x4000000,0x200000,0x30001f0b,0x4000010,0x200000,0x30001f0b, +0x4000010,0x400000,0x30001f0b,0x6800000,0x200000,0x30001f0b,0x7c00100,0x230400,0x30001f0b,0xc000010,0x248000,0x30002006,0x7c00100,0x250400,0x30002128,0x4000010, +0x200000,0x30002128,0x7c00100,0x230400,0x30002128,0xc000010,0x248000,0x3000221d,0x4000000,0x810000,0x3000221d,0x4000000,0x1410000,0x3000221d,0x4000001,0x440000, +0x3000221d,0x7c00100,0x230400,0x30002300,0x4000010,0x400000,0x30002320,0x7c00100,0x230400,0x30002417,0x2802100,0x1862460,0x30002417,0x2802400,0x1862460,0x30002417, +0x2806400,0x1862460,0x30002417,0x2882000,0x1862460,0x30002417,0x4000000,0x200000,0x30002417,0x4000000,0x400000,0x30002417,0x4000000,0x1600000,0x30002417,0x4000010, +0x400000,0x30002417,0x4000010,0x1200000,0x30002417,0x6800000,0x1329800,0x30002417,0x6800100,0x1862540,0x30002417,0x7c00100,0x1830000,0x30002417,0x7d00100,0x1830000, +0x3000251b,0x80000,0xc18820,0x3000251b,0x2802100,0x962460,0x3000251b,0x3c02100,0x962460,0x3000251b,0x4000000,0x200000,0x3000251b,0x4000006,0x500000,0x3000251b, +0x4000010,0x400000,0x3000251b,0x4000010,0xb70000,0x3000251b,0x4000800,0x200000,0x3000251b,0x6800000,0x1329800,0x3000251b,0x7c00100,0x230400,0x3000251b,0x7c00900, +0x230400,0x3000251b,0xc000010,0xb48000,0x3000251b,0x12882000,0x962460,0x30002800,0x4000001,0xc41c0b,0x30002800,0x24000000,0x200000,0x30002800,0x2c000010,0x1248002, +0x30002800,0x2c000010,0x11248002,0x30002a00,0x4000000,0x1600000,0x30002b01,0x2000,0x962460,0x30002c00,0x4000000,0x200000,0x30002c00,0x7c00100,0x10220405,0x30002d19, +0x7c00100,0x250400,0x30002e00,0x24000000,0x200000,0x30003000,0x24000000,0x200000,0x30003100,0x24000000,0x200000,0x30003600,0x24000000,0x200000,0x30003700,0x24000000, +0x200000,0x3000392e,0x24000000,0x200000,0x30005013,0x7c00100,0x2633801,0x30005600,0,0x918820,0x30020600,0x4000400,0x500400,0x30020701,0x2802400,0x962460, +0x30020701,0x2802400,0xc62460,0x300a3a11,0x4020000,0xe00000,0x300a3a11,0x4020000,0xe00002,0x300a3b11,0x4020000,0xe00002,0x300a3c00,0x4008000,0xe00000,0x300a3c00, +0x4010000,0xe00000,0x300a3d11,0x7c00300,0xe30002,0x300a4305,0x7c00100,0xe30400,0x300a4611,0x7c40300,0xe30000,0x300a4829,0x7c00100,0xe30400,0x300a4829,0x7c00900, +0x1230400,0x300a4929,0x4000000,0xe00000,0x30402578,0x4000010,0x400000,0x30402578,0x4000010,0xb70000,0x30402578,0xc000010,0xb48000,0x304a3d95,0x4000000,0xe00000, +0x30800c19,0x2802100,0x962460,0x30c01c70,0x6800000,0x1329800,0x3100080e,0x7c00120,0x220402,0x3100080e,0x7c00120,0x250402,0x31005167,0x1000,0,0x3100581e, +0x4000000,0x200000,0x3100581e,0x7c00100,0x230400,0x3100590d,0x7c00100,0x230400,0x31005a09,0x7c00100,0x220400,0x31005a09,0x7c00100,0x250400,0x31005b00,0x4000000, +0x200000,0x31005c00,0x80000,0x918820,0x31005c00,0x2802000,0x962460,0x31005c00,0x2802400,0x962460,0x31005c00,0x4000000,0x200000,0x31005c00,0x4000000,0x200001, +0x31005c00,0x6800000,0x962540,0x31005c00,0x6800400,0x962540,0x31005c01,0x2802400,0x962460,0x31005d00,0x4000020,0x200005,0x31005d00,0x6800020,0x1329805,0x31005d00, +0x7c00120,0x220405,0x31005d00,0x7c00120,0x250405,0x31006000,0x82000,0x962460,0x31006000,0x180000,0x918820,0x310a5e11,0x7c40300,0xe30000,0x310a5f11,0x7c00300, +0xe30001,0x32000419,0x7c00100,0x250400,0x3200080e,0x4000020,0x200000,0x3200080e,0x7c00100,0x220400,0x3200080e,0x7c00100,0x250400,0x32000908,0x7c00100,0x220400, +0x32000908,0x7c00100,0x250400,0x32000c02,0x7c00100,0x230400,0x32000e25,0x7c00100,0x230400,0x32001d0c,0x7c00100,0x230400,0x32002800,0x80000,0x1e18820,0x32002800, +0x80020,0x218820,0x32002800,0x4000001,0x440002,0x32002800,0x24000000,0x200000,0x32002800,0x24000000,0x200002,0x32002800,0x24000020,0x200000,0x32002800,0x2c000010, +0x1248002,0x32002919,0x7c00100,0x22040f,0x32002a00,0x4000000,0x1600000,0x32002b01,0x2000,0x962460,0x32002b01,0x2802000,0x962460,0x32002b01,0x2802020,0x962460, +0x32002c00,0x4000000,0x200000,0x32002c00,0x4000020,0x200000,0x32002c00,0x4000020,0x200005,0x32002c00,0x7c00120,0x220405,0x32002c00,0x7c00120,0x250405,0x32002e00, +0x24000020,0x200000,0x32002f00,0x24000020,0x200000,0x32003000,0x24000000,0x200000,0x32003000,0x24000020,0x200000,0x32003500,0x24000000,0x200000,0x32003600,0x24000020, +0x200000,0x32003600,0x24000020,0x10200000,0x32003700,0x24000000,0x100000,0x32003700,0x24000000,0x200000,0x32003700,0x24000000,0x10200000,0x32003800,0x24000000,0x810000, +0x32003800,0x24000000,0x1410000,0x32005102,0x4000000,0x1500008,0x32005502,0x7c00100,0x230400,0x32006108,0x7c00100,0x220400,0x32006108,0x7c00100,0x250400,0x3200622a, +0x2802100,0x962460,0x3200622a,0x2806000,0x962460,0x3200622a,0x7c00100,0x230400,0x3200632b,0x2802100,0x962460,0x3200632b,0x2806000,0x962460,0x3200632b,0x7c00100, +0x230400,0x3200642c,0x2802100,0x962460,0x3200642c,0x7c00100,0x230400,0x3200652d,0x2802100,0x962460,0x3200652d,0x7c00100,0x230400,0x32006600,0x24000020,0x200000, +0x32006700,0x24000020,0x200000,0x32006800,0x24000020,0x200000,0x32006800,0x24000020,0x10200000,0x32006900,0x24000020,0x200000,0x32006900,0x24000020,0x810000,0x32006900, +0x24000020,0x1410000,0x32006a00,0x24000020,0x200000,0x32006a00,0x24000020,0x200001,0x32006a00,0x24000020,0x200002,0x32020701,0x2882000,0xc62460,0x32023300,0x4000000, +0x100000,0x32026c01,0x12882000,0x962460,0x32065700,0x4000000,0x810011,0x32065700,0x4000000,0x1410011,0x32086600,0x24000020,0x810000,0x32086600,0x24000020,0x1410000, +0x32086900,0x24000020,0x810000,0x32086900,0x24000020,0x1410000,0x320a3600,0x24000020,0x30200000,0x320a3d11,0x7c00100,0x1230400,0x320a3e14,0x7c00100,0xe30010,0x320a3e14, +0x7c00100,0x2530000,0x320a3f16,0x7c00100,0xe30c10,0x320a4400,0x4000000,0xe00003,0x320a4929,0x4000000,0xe00000,0x320a4f11,0x7c00300,0xe30001,0x320a6b16,0x7c00100, +0x2530c00,0x32406374,0xc000010,0x448000,0x324a3d98,0x4000000,0x10e00000,0x324a3d98,0x7c00100,0x1230400,0x324a3f93,0x4000002,0x1200c00,0x324a5390,0x24000000,0xe00000, +0x32820701,0x2802000,0x962460,0x40000419,0x7c00100,0x220400,0x40000519,0x7c00100,0x220400,0x40000600,0x4000400,0x200400,0x4000080e,0x7c00100,0x220400,0x4000080e, +0x7c00100,0x250400,0x4000080e,0x7c00100,0x250402,0x40000c02,0x2802100,0x962460,0x40000c02,0x2802400,0x962460,0x40000c02,0x2802500,0x962460,0x40000c02,0x4000000, +0x200000,0x40000c02,0x4000000,0x1071400,0x40000c02,0x7c00100,0x230400,0x40000c02,0x80000000,0x218960,0x40000d22,0x7c00100,0x230400,0x40000f0a,0x7c00100,0x230400, +0x40001004,0x7c00100,0x230400,0x40001110,0x2802100,0x962460,0x40001110,0x6800100,0x962540,0x4000120f,0x2802100,0x962460,0x4000120f,0x4000000,0x1600000,0x4000120f, +0x7c00100,0x230400,0x4000131f,0x7c00100,0x230400,0x40001423,0x4000000,0x200000,0x40001423,0x4000000,0x1600000,0x40001615,0x2802400,0x962460,0x40001615,0x7c00100, +0x230400,0x40002417,0x2802400,0x1862460,0x40002417,0x4000000,0x200000,0x40002800,0x6800000,0x201c00,0x40002800,0x24000002,0x200000,0x40002c00,0x4000000,0x200002, +0x40003000,0x24000000,0x10200000,0x40003000,0x24000020,0x200000,0x40003700,0x24000000,0x200000,0x40003700,0x24000000,0x10200000,0x40005a09,0x7c00100,0x220400,0x40005a09, +0x7c00100,0x250400,0x40005d00,0x7c00120,0x220405,0x40006f30,0x2802100,0x962460,0x40006f30,0x2802400,0x962460,0x40006f30,0x4000000,0x200000,0x40006f30,0x6800000, +0x1329800,0x40006f30,0x6800100,0x962540,0x40006f30,0x7c00100,0x230400,0x40006f30,0xc000010,0xb48000,0x40007034,0x7c00100,0x1830000,0x40007117,0x4000000,0x200000, +0x40007208,0x7c00100,0x220400,0x4000720e,0x7c00100,0x220400,0x4000720e,0x7c00500,0x22040e,0x4000720e,0x7c00500,0x22040f,0x40007219,0x7c00100,0x220400,0x40007219, +0x7c00500,0x220400,0x40007219,0x7c00500,0x22040e,0x40007219,0x7c00500,0x22040f,0x40007300,0x24000000,0x200000,0x40007300,0x24000000,0x10200000,0x40007400,0x4000000, +0x200000,0x40007531,0x7c00100,0x230400,0x40007631,0x7c00100,0x230400,0x40007835,0x4000010,0x400000,0x40007835,0x7c00100,0x230400,0x40007933,0x7c00100,0x230400, +0x40007a32,0x6800000,0x1329800,0x40007a32,0x7c00100,0x230400,0x40007b2f,0x7c00100,0x230400,0x40007c00,0x4000000,0x200000,0x40020701,0x2802400,0x962460,0x40020701, +0x2802400,0xc62460,0x40023300,0x4000000,0x200000,0x40027d01,0x12882000,0x962460,0x400a3700,0x24000000,0x30200000,0x400a3700,0x24000000,0x30e00000,0x400a4400,0x4000000, +0xe0000d,0x400a4412,0x4000000,0xe00002,0x400a4412,0x4000000,0xe00003,0x400a4500,0x4000000,0xe0000d,0x400a5300,0x4000000,0x810010,0x400a5300,0x4000000,0x1410010, +0x404077bb,0x4000000,0x200000,0x404077be,0x4000000,0x200000,0x404077be,0x4000000,0x400000,0x40c0511d,0x4000000,0x200000,0x41000419,0x7c00100,0x220400,0x41000419, +0x7c00100,0x250400,0x4100080e,0x7c00100,0x220400,0x4100080e,0x7c00100,0x250400,0x41000908,0x7c00100,0x220400,0x41000908,0x7c00100,0x250400,0x41000b13,0x2802000, +0x962460,0x41000b13,0x2802100,0x962460,0x41000b13,0x4000000,0xb00000,0x41000c02,0x2802100,0x962460,0x41000c02,0x4000000,0xb00000,0x41000c02,0x4000000,0x1500000, +0x41000f0a,0x7c00100,0x230400,0x41001004,0x7c00100,0x230400,0x41001423,0x7c00100,0x230400,0x41001b27,0x4000000,0x500000,0x41001d0c,0x7c00100,0x230400,0x41001d0c, +0x7c00100,0x23040f,0x41001f0b,0x2802100,0x962460,0x41001f0b,0x4000000,0x200000,0x41001f0b,0x7c00100,0x230400,0x41002800,0x24000000,0x200000,0x41002800,0x24000000, +0x400000,0x41002919,0x7c00100,0x22040e,0x41002a00,0x4000000,0x1600000,0x41002b01,0x2802020,0x962460,0x41002c00,0x4000000,0x200000,0x41002c00,0x7c00120,0x220405, +0x41003000,0x24000000,0x200000,0x41003700,0x24000000,0x200000,0x41003700,0x24000000,0x10200000,0x41003700,0x24000000,0x10205200,0x41003700,0x24000000,0x10e00000,0x41005d00, +0x7c00120,0x220405,0x41006600,0x24000020,0x200000,0x41006600,0x24000020,0x810000,0x41006600,0x24000020,0x1410000,0x41007208,0x7c00100,0x22040f,0x41007219,0x7c00100, +0x220400,0x41007300,0x24000000,0x200000,0x41007e0e,0x2802000,0x962460,0x41007e0e,0x4000000,0x200000,0x41007f0e,0x4000000,0x200000,0x41007f0e,0x7c00100,0x230400, +0x41008002,0x7c00100,0x230400,0x41008137,0x2802100,0x962460,0x41008137,0x4000000,0x200000,0x41008137,0x6800100,0x962540,0x41008137,0x7c00100,0x230400,0x41008301, +0x2802000,0x962460,0x41008407,0x4000000,0x200000,0x41008407,0x4000000,0x400000,0x41008407,0x4000000,0xb00000,0x41008407,0x7c00100,0x220400,0x41008407,0x7c00100, +0x250400,0x4100850b,0x7c00100,0x230400,0x4100860b,0x4000000,0x200000,0x4100860b,0x7c00100,0x230400,0x4100870c,0x7c00100,0x220400,0x41008838,0x7c00100,0x220400, +0x41008838,0x7c00100,0x250400,0x41008939,0x2802000,0x962460,0x41008939,0x2802100,0x962460,0x41008939,0x2806000,0x962460,0x41008939,0x4000000,0x200000,0x41008939, +0x4000000,0x400000,0x41008939,0x7c00100,0x230400,0x41008939,0xc000010,0x448000,0x41008a00,0x4000000,0x200000,0x41008b3b,0x4000000,0x1800000,0x41008b3b,0x6800000, +0x1329800,0x41008b3b,0x7c00100,0x1830000,0x41008b3b,0x7e00100,0x1830000,0x41008c3d,0x4000010,0x400000,0x41008c3d,0x7c00100,0x230400,0x41008d0e,0x7c00100,0x22040f, +0x41008d19,0x7c00100,0x220400,0x41008d19,0x7c00100,0x22040f,0x41008e00,0x24000000,0x200000,0x41008e00,0x24000000,0x400000,0x41008e00,0x24000000,0x1710000,0x41008e00, +0x24000006,0x400000,0x41008f3a,0x2802000,0x962460,0x41008f3a,0x2802100,0x962460,0x41008f3a,0x2806000,0x962460,0x41008f3a,0x4000000,0x200000,0x41008f3a,0x6800100, +0x962540,0x41008f3a,0x7c00100,0x230400,0x4100903c,0x7c00100,0x230400,0x4100903c,0x7c00100,0x23040f,0x41020701,0x2802000,0x962460,0x41020701,0x2802000,0xc62460, +0x410a3700,0x24000000,0x30200000,0x410a3700,0x24000000,0x30e00000,0x410a4412,0x4000000,0xe00003,0x410a4711,0x7c40300,0xe30000,0x410a4f11,0x7c00300,0xe30001,0x410a9100, +0x4000000,0x800010,0x410a9100,0x4000000,0x810010,0x410a9100,0x4000000,0x870010,0x410a9100,0x4000000,0xb00010,0x410a9100,0x4000000,0xf00010,0x410a9100,0x4000000, +0x1001410,0x410a9100,0x4000000,0x1071010,0x410a9100,0x4000000,0x1071410,0x410a9100,0x4000000,0x1410010,0x414a8295,0x4000000,0xe00000,0x41808300,0x2802000,0x962460, +0x41c0146b,0x6800000,0x1329800,0x50000419,0x7c00100,0x220400,0x50000419,0x7c00100,0x250400,0x5000080e,0x7c00100,0x220400,0x50000908,0x7c00100,0x220400,0x50000908, +0x7c00100,0x250400,0x50000b13,0x2802500,0x962460,0x50000f0a,0x7c00100,0x230400,0x50001615,0x2802100,0x962460,0x50001615,0x7c00100,0x230400,0x50002b01,0x2802020, +0x962460,0x50002c00,0x4000000,0x200000,0x50002c19,0x7c00100,0x220400,0x50002d19,0x7c00100,0x220400,0x50003000,0x24000000,0x200000,0x50003000,0x24000020,0x200000, +0x50003700,0x24000000,0x200000,0x50005d00,0x7c00120,0x220405,0x50005d00,0x7c00120,0x250405,0x50006108,0x7c00100,0x220400,0x50006108,0x7c00100,0x250400,0x50006600, +0x24000020,0x200000,0x50007300,0x24000000,0x200000,0x50008301,0x2802400,0x962460,0x50008a00,0x7c00500,0x230400,0x50009257,0x2802400,0x962460,0x50009257,0x4000000, +0x200000,0x50009257,0x4000010,0x1071400,0x50009257,0x6800000,0x1329800,0x50009257,0x7c00100,0x230400,0x50009257,0x7c00500,0x230400,0x50009257,0x7c00900,0x230400, +0x50009257,0xc000010,0xb48000,0x5000933e,0x2802100,0x962460,0x5000933e,0x2802400,0x962460,0x5000933e,0x4000000,0x200000,0x5000933e,0x4000000,0x400000,0x5000933e, +0x4000010,0x400000,0x5000933e,0x6800000,0x1329800,0x5000933e,0x6800100,0x962540,0x5000933e,0x6800100,0x962541,0x5000933e,0x6804400,0x962540,0x5000933e,0x7c00100, +0x230400,0x5000933e,0x7c00100,0x230401,0x5000933e,0xc000010,0x448000,0x50009419,0x7c00100,0x220400,0x50009419,0x7c00100,0x250400,0x50009500,0x4000400,0x200400, +0x5000965a,0x4000000,0x500000,0x5000965a,0x7c00100,0x230400,0x5000965a,0xc000010,0xb48000,0x5000975b,0x4000000,0x200000,0x5000975b,0x4000010,0x400000,0x5000975b, +0x7c00100,0x230400,0x50009865,0x7c00100,0x230400,0x50009965,0x4000010,0x400000,0x50009965,0x7c00100,0x230400,0x50409a95,0x4000000,0x200000,0x5100080e,0x7c00100, +0x220400,0x5100080e,0x7c00100,0x250400,0x51000c02,0x2802100,0x962460,0x51000c02,0x4000000,0x1500000,0x51000c02,0x4000020,0x200000,0x51000c02,0x7c00100,0x230400, +0x51000f0a,0x7c00100,0x230400,0x51000f0a,0x7c00500,0x230400,0x51001110,0x2802100,0x962460,0x5100131f,0x2802100,0x962460,0x51001423,0x7c00100,0x230400,0x51001524, +0x2802100,0x962460,0x51001524,0x4000000,0x200000,0x51001524,0x7c00100,0x230400,0x5100171a,0x2802100,0x962460,0x5100171a,0x4000000,0x200000,0x5100171a,0x4000000, +0x1500000,0x5100171a,0x7c00100,0x230400,0x51001b27,0x4000000,0x200000,0x51001b27,0x4000000,0x400000,0x51001b27,0x4000000,0x500000,0x51001b27,0x7c00100,0x230400, +0x51001c1c,0x2802100,0x1862460,0x51001c1c,0x2802400,0x1862460,0x51001c1c,0x2806400,0x1862460,0x51001c1c,0x4000000,0x1800000,0x51001c1c,0x6800000,0x1329800,0x51001c1c, +0x6800000,0x1862400,0x51001c1c,0x6800100,0x1862400,0x51001c1c,0x6800100,0x1862540,0x51001c1c,0x6800400,0x1862400,0x51001c1c,0x7c00100,0x1830000,0x5100251b,0x7c00100, +0x230400,0x51002619,0x7c00100,0x220400,0x51002619,0x7c00100,0x250400,0x51002800,0x80020,0x218820,0x51002c00,0x4000000,0x200000,0x51002d19,0x7c00100,0x230400, +0x51003700,0x24000000,0x200000,0x51003700,0x24000000,0xe00000,0x51005201,0x2802400,0x962460,0x51005c00,0x4000000,0x200000,0x51006108,0x7c00100,0x220400,0x51006108, +0x7c00100,0x250400,0x51006600,0x24000020,0x200000,0x51006600,0x24000020,0x810000,0x51006600,0x24000020,0x1410000,0x51007300,0x24000000,0x200000,0x51007300,0x24000020, +0x200000,0x51008002,0x7c00100,0x230400,0x51008301,0x2802000,0x962460,0x51008301,0x2802400,0x962460,0x51008a00,0x7c00500,0x230400,0x51008e00,0x24000000,0x200000, +0x51008e00,0x24000000,0x400000,0x51008e00,0x24000000,0x810000,0x51008e00,0x24000000,0x1400000,0x51008e00,0x24000000,0x1410000,0x51008e00,0x24000000,0x1710000,0x51008e00, +0x24000002,0x200000,0x51008e00,0x24000500,0x230400,0x51008e00,0x2c000010,0xb48000,0x51009419,0x7c00100,0x220400,0x51009419,0x7c00100,0x22040e,0x51009419,0x7c00100, +0x22040f,0x51009419,0x7c00100,0x250400,0x51009500,0x4000000,0x200400,0x51009500,0x7c00500,0x230400,0x51009519,0x7c00100,0x220400,0x51009519,0x7c00100,0x22040f, +0x51009519,0x7c00100,0x230400,0x51009519,0x7c00100,0x250400,0x51009b71,0x2802100,0x962460,0x51009b71,0x6800000,0x1329800,0x51009b71,0x6800100,0x962540,0x51009b71, +0x6804400,0x962540,0x51009b71,0x7c00100,0x230400,0x51009c52,0x2802100,0x962460,0x51009c52,0x2802400,0x962460,0x51009c52,0x2802c00,0x962460,0x51009c52,0x4000010, +0x400000,0x51009c52,0x6800000,0x1329800,0x51009c52,0x6800100,0x962540,0x51009c52,0x7c00100,0x230400,0x51009c52,0xc000010,0x448000,0x51009d6d,0x6800000,0x1329800, +0x51009d6d,0x7c00100,0x230400,0x51009d6d,0x7c00500,0x230400,0x51009d6d,0x7c00d00,0x230400,0x51009d6d,0xc000010,0x448000,0x51009e08,0x2802100,0x962460,0x51009f63, +0x4000010,0x400000,0x51009f63,0x6800000,0x1329800,0x51009f63,0x7c00100,0x230400,0x51009f63,0x7c00900,0x230400,0x51009f63,0xc000010,0x448000,0x51009f63,0xc000010, +0xb48000,0x5100a008,0x2000,0x962460,0x5100a008,0x2802400,0x962460,0x5100a008,0x4000000,0x200000,0x5100a008,0x7c00100,0x220400,0x5100a008,0x7c00100,0x230400, +0x5100a008,0x7c00100,0x250400,0x5100a008,0x7c00500,0x230400,0x5100a16f,0x2806400,0x962460,0x5100a16f,0x6800000,0x1329800,0x5100a16f,0x6800100,0x962540,0x5100a16f, +0x7c00100,0x230400,0x5100a16f,0xc000010,0x448000,0x5100a24f,0x2802100,0x962460,0x5100a24f,0x2802400,0x962460,0x5100a24f,0x6800000,0x1329800,0x5100a24f,0x7c00100, +0x230400,0x5100a24f,0xc000010,0x448000,0x5100a36e,0x2802100,0x962460,0x5100a36e,0x4000000,0x200000,0x5100a36e,0x6800100,0x962540,0x5100a36e,0x6804400,0x962540, +0x5100a36e,0x7c00100,0x230400,0x5100a442,0x2802100,0x962460,0x5100a442,0x4000000,0x200000,0x5100a442,0x6800000,0x1329800,0x5100a442,0x6800100,0x962540,0x5100a442, +0x7c00100,0x230400,0x5100a442,0xc000010,0x448000,0x5100a500,0x4000000,0x200000,0x5100a600,0x4000000,0x200000,0x5100a601,0x2802000,0x962460,0x5100a76b,0x7c00100, +0x230400,0x5100a868,0x7c00100,0x230400,0x5100a96c,0x4000000,0x200000,0x5100a96c,0x7c00100,0x230400,0x5100aa00,0x4000000,0xe00000,0x5100ab00,0x4000000,0xe00000, +0x51086600,0x24000020,0x810000,0x51086600,0x24000020,0x1410000,0x510a4005,0x7c00100,0xe30400,0x510a4711,0x7c40300,0xe30000,0x510a7300,0x24000000,0x30200000,0x510aaa00, +0x4000000,0x30e00000,0x5140a2b6,0x4000400,0x400000,0x514a8295,0x4000000,0xe00000,0x51802b87,0x2802000,0x962460,0x51c00908,0x2802400,0x962460,0x51c0a008,0x2802400, +0x962460,0x52000f0a,0x2802100,0x962460,0x52000f0a,0x6800100,0x962540,0x52000f0a,0x7c00100,0x230400,0x52001004,0x4000000,0x1600000,0x52001b00,0x4000000,0x200000, +0x52001c1c,0x2802100,0x1862460,0x52001c1c,0x6800100,0x1862400,0x52001c1c,0x6800400,0x1862400,0x52001e12,0x7c00100,0x2230500,0x52001e12,0x7c00100,0x2330520,0x52002128, +0x4000002,0x400000,0x52002128,0x7c00100,0x230400,0x52002a00,0x4000000,0x1500000,0x52002a00,0x4000000,0x1600000,0x52002d00,0x4000000,0x200006,0x52003000,0x24000000, +0x200000,0x52006108,0x7c00100,0x220400,0x52006108,0x7c00100,0x250400,0x52008301,0x2802400,0x962460,0x52008407,0x2802400,0x962460,0x52008407,0x7c00100,0x220400, +0x52008407,0x7c00100,0x250400,0x52008b3b,0x6800000,0x1800000,0x52008b3b,0x7c00100,0x1830000,0x52008e00,0x24000000,0x400000,0x52009419,0x7c00100,0x250400,0x5200975b, +0x4000000,0x200000,0x5200ac7e,0x2802000,0x962460,0x5200ac7e,0x2802100,0x962460,0x5200ac7e,0x2802400,0x962460,0x5200ac7e,0x4000010,0x200000,0x5200ac7e,0x7c00100, +0x230400,0x5200ad28,0x7c00100,0x230400,0x5200ae6a,0x2802100,0x1862460,0x5200ae6a,0x2802400,0x962460,0x5200ae6a,0x2802400,0x1862460,0x5200ae6a,0x2806000,0x1862460, +0x5200ae6a,0x4000000,0x1800000,0x5200ae6a,0x6800000,0x1329800,0x5200ae6a,0x6800100,0x1862400,0x5200ae6a,0x6800100,0x1862540,0x5200ae6a,0x7c00100,0x1830000,0x5200ae6a, +0x7c00900,0x1830000,0x5200ae6a,0xc000010,0x1848000,0x5200b083,0x4000010,0x400000,0x5200b083,0x7c00100,0x230400,0x5200b083,0xc000010,0x448000,0x5200b182,0x2802400, +0x962460,0x5200b182,0x4000000,0x200000,0x5200b182,0x4000010,0x400000,0x5200b182,0x7c00100,0x230400,0x5200b182,0xc000010,0x448000,0x5200b30a,0x2802400,0x962460, +0x5200b30a,0x4000000,0x200000,0x5200b30a,0x7c00100,0x230400,0x5200b54e,0x2802100,0x962460,0x5200b54e,0x2802400,0x962460,0x5200b54e,0x4000000,0x200000,0x5200b54e, +0x4000010,0x400000,0x5200b54e,0x6800000,0x1329800,0x5200b54e,0x6800100,0x962540,0x5200b54e,0x6804400,0x962540,0x5200b54e,0x7c00100,0x230400,0x5200b54e,0xc000010, +0x448000,0x5200b61c,0x4000000,0x1800000,0x5200b61c,0x6800400,0x1862400,0x5200b61c,0x7c00100,0x1830000,0x5200b61c,0x7c00900,0x1830000,0x5200b77f,0x2802100,0x1862460, +0x5200b77f,0x2802400,0x1862460,0x5200b77f,0x4000000,0x1800000,0x5200b77f,0x4000010,0x1800000,0x5200b77f,0x7c00100,0x1830000,0x5200b77f,0x7c00500,0x1830000,0x5200b77f, +0x7c00900,0x1830000,0x5200b77f,0x7e00100,0x1830000,0x5200b873,0x2802100,0x962460,0x5200b873,0x2806400,0x962460,0x5200b873,0x6800000,0x1329800,0x5200b873,0x6800100, +0x962540,0x5200b873,0x6800400,0x962540,0x5200b873,0x7c00100,0x230400,0x5200b873,0xc000010,0x448000,0x5200b912,0x7c00100,0x2230500,0x5200b912,0x7c00100,0x2330520, +0x5200ba74,0x4000000,0x200000,0x5200ba74,0x4000010,0x400000,0x5200ba74,0x7c00100,0x230400,0x5200bb85,0x4000000,0x200000,0x5200bb85,0x7c00100,0x230400,0x5200bc75, +0x4000000,0x400000,0x5200bc75,0x4000010,0x400000,0x5200bc75,0x7c00100,0x230400,0x5200bd7d,0x4000000,0x200000,0x5200bd7d,0x7c00100,0x230400,0x5200be7a,0x4000000, +0x200000,0x5200be7a,0x7c00100,0x230400,0x5200bf58,0x7c00100,0x230400,0x5200c002,0x4000000,0x200000,0x5200c178,0x2802000,0x962460,0x5200c178,0x2802100,0x962460, +0x5200c178,0x2802400,0x962460,0x5200c178,0x2806400,0x962460,0x5200c178,0x4000000,0x200000,0x5200c178,0x6800100,0x962540,0x5200c178,0x7c00100,0x230400,0x5200c178, +0x7c00100,0x230401,0x5200c178,0xc000010,0x448000,0x5200c178,0x80000000,0x218960,0x5200c247,0x7c00100,0x230400,0x5200c247,0x7c00100,0x830400,0x5200c247,0x7c00100, +0x1430400,0x5200c300,0x4000000,0x200003,0x52022d00,0x4000000,0x100006,0x52023700,0x24000000,0x100000,0x52023700,0x24000000,0xe00000,0x52023700,0x24000000,0x10100000, +0x52023700,0x24000000,0x10e00000,0x52023700,0x24000000,0x928045a0,0x52024400,0x4000000,0x100000,0x52027300,0x24000000,0x100000,0x5202c300,0x4000000,0x100000,0x5202c300, +0x4000000,0x100002,0x5202c300,0x4000000,0x100003,0x5202c300,0x4000000,0x10000d,0x5202c300,0x4000100,0x150400,0x5202c300,0x4000100,0x15040d,0x5202c300,0x4000100, +0x10150400,0x520a1e12,0x7c00100,0x2130480,0x520a3700,0x24000000,0x30e00000,0x520a3800,0x24000000,0x30100000,0x520a4711,0x7c40300,0xe30000,0x520a4f11,0x7c00300,0xe30001, +0x520a7300,0x24000000,0x30100000,0x520ab412,0x7c00100,0x2130480,0x520ac400,0x4000000,0xe00002,0x520ac400,0x4000000,0xe0000d,0x520ac400,0x4000000,0x30e0000d,0x520ac414, +0x4000000,0xe0000d,0x520ac511,0x7c40300,0xe30000,0x5240af7a,0x6800400,0x962540,0x5240af7a,0x7c00100,0x230400,0x5240af7b,0x4000400,0x200000,0x5240af7b,0x6800100, +0x962540,0x5240b29b,0x4000000,0x200000,0x5240b2a5,0x4000000,0x200000,0x5240b2a5,0x4000000,0x1500000,0x5240b5b9,0x7c00900,0x230400,0x524a4495,0x4000000,0xe00003, +0x5280af7a,0x2802400,0x962460,0x5280af7b,0x2802400,0x962460,0x5280af7d,0x2802400,0x962460,0x5280af7f,0x2802400,0x962460,0x52c0b3b0,0x2802400,0x962460,0x52c0b3b4, +0x7c00100,0x230400,0x60000c02,0x2802100,0x962460,0x60000c02,0x7c00100,0x230400,0x60000f0a,0x2802100,0x962460,0x60000f0a,0x6800100,0x962540,0x60000f0a,0x7c00100, +0x230400,0x6000131f,0x4000000,0x200000,0x6000171a,0x7c00100,0x230400,0x6000171a,0x7c00100,0x230560,0x60001b27,0x2802100,0x962460,0x60001b27,0x4000000,0xc00000, +0x60001b27,0x7c00100,0x230400,0x60001f0b,0x2802000,0x962460,0x60002919,0x7c00100,0x22040e,0x60002a00,0x4000000,0x1600000,0x60003000,0x24000000,0x10200000,0x60003000, +0x24000000,0x10e00000,0x60003700,0x24000000,0x200000,0x60003800,0x24000000,0x1710000,0x60005102,0x4000000,0x200000,0x60006108,0x7c00100,0x220400,0x60006108,0x7c00100, +0x250400,0x60006600,0x24000020,0x200000,0x60008301,0x2802000,0x962460,0x6000903c,0x2806000,0x962460,0x6000903c,0x4000000,0x400000,0x60009519,0x7c00100,0x220400, +0x60009519,0x7c00100,0x250400,0x6000a008,0x7c00100,0x220400,0x6000a008,0x7c00100,0x250400,0x6000c300,0x4000000,0x3a703580,0x6000c654,0x2802000,0x962460,0x6000c654, +0x4000010,0x200000,0x6000c654,0x7c00100,0x230400,0x6000c73f,0x2802000,0x962460,0x6000c73f,0x2802100,0x962460,0x6000c73f,0x4000000,0x200000,0x6000c73f,0x6800100, +0x962540,0x6000c73f,0x6804000,0x962540,0x6000c73f,0x7c00100,0x230400,0x6000c80b,0x7c00100,0x230400,0x6000c941,0x2802100,0x962460,0x6000c941,0x2806000,0x962460, +0x6000c941,0x4000000,0x200000,0x6000c941,0x4000010,0x200000,0x6000c941,0x6800000,0x1329800,0x6000c941,0x6800100,0x962540,0x6000c941,0x7c00100,0x230400,0x6000c941, +0xc000010,0x448000,0x6000ca82,0x7c00100,0x230400,0x6000cc00,0x4000000,0xe00000,0x6000d000,0x4000000,0x200000,0x6002c300,0x4000000,0x100000,0x6002c300,0x4000000, +0x10000d,0x6002c300,0x4000100,0x150400,0x6002c300,0x4000100,0x15040d,0x6002c300,0x4000100,0x10150400,0x600a3000,0x24000000,0x30200000,0x600a3000,0x24000000,0x30e00000, +0x600a3700,0x24000000,0x30200000,0x600a3800,0x24000000,0x30200000,0x600a3800,0x24000000,0xb28045a0,0x600a4305,0x7c00100,0xe30400,0x600ac300,0x4000000,0x30100000,0x600ac400, +0x4000000,0x10e0000d,0x600ac400,0x4000000,0x30e0000d,0x600acb14,0x7c00100,0xe30000,0x600acb16,0x7c00100,0xe30c00,0x600acc00,0x4000000,0x30e00000,0x600acd00,0x4000000, +0x30200000,0x600acd00,0x4000000,0x30e00000,0x600acd00,0x4000000,0x30e05200,0x600acd00,0x4000000,0xb28045a0,0x600acd00,0x4000000,0xb28049c0,0x600ace00,0x4000000,0x30e00000, +0x600ace00,0x4000000,0xb28045a0,0x600acf00,0x4000000,0x30e00000,0x600acf00,0x4000000,0x30e05200,0x600acf00,0x4000000,0xb28045a0,0x600ad111,0x7c40300,0xe30000,0x604ac495, +0x4000000,0x30e00003,0x61000a03,0x4000000,0x1600000,0x61000c02,0x80000000,0x218960,0x6100120f,0x4000000,0x200000,0x61001a18,0x7c00100,0x1830000,0x61001d0c,0x7c00100, +0x230400,0x61001d0c,0x7c00100,0x250400,0x61006600,0x24000020,0x200000,0x61008407,0x7c00100,0x220400,0x61008407,0x7c00100,0x250400,0x6100870c,0x7c00100,0x220400, +0x61008e00,0x24000000,0x200000,0x61008e00,0x24000000,0x400000,0x61008e00,0x24000002,0x300000,0x6100903c,0x7c00100,0x230400,0x61009519,0x7c00100,0x220400,0x61009519, +0x7c00100,0x250400,0x61009519,0x7c00500,0x22040f,0x61009b71,0x2802100,0x962460,0x61009b71,0x2806400,0x962460,0x61009b71,0x7c00100,0x230400,0x6100a008,0x2802100, +0x962460,0x6100c300,0x4000000,0x20000f,0x6100cd00,0x4000000,0x200000,0x6100d202,0x2802400,0x962460,0x6100d202,0x2802500,0x962460,0x6100d202,0x7c00100,0x230400, +0x6100d302,0x4000020,0x200000,0x6100d302,0x7c00120,0x230405,0x6100d476,0x2802100,0x962460,0x6100d476,0x2802100,0x962461,0x6100d476,0x2806400,0x962460,0x6100d476, +0x4000000,0x400000,0x6100d476,0x6800000,0x1329800,0x6100d476,0x6800100,0x962540,0x6100d476,0x7c00100,0x230400,0x6100d476,0xc000010,0x448000,0x6100d573,0x2802100, +0x962460,0x6100d573,0x2806400,0x962460,0x6100d573,0x6800100,0x962540,0x6100d573,0x7c00100,0x230400,0x6100d573,0x7c00900,0x230400,0x6100d573,0xc000010,0x448000, +0x6100d68d,0x7c00100,0x230400,0x6100d756,0x7c00100,0x230400,0x6100d85c,0x2802400,0x962460,0x6100d85c,0x6800100,0x962540,0x6100d85c,0x7c00100,0x230400,0x6100d85c, +0x7c00500,0x230400,0x6100d997,0x2802100,0x962460,0x6100d997,0x4000000,0x200000,0x6100d997,0x4000000,0x400000,0x6100d997,0x6800000,0x1329800,0x6100d997,0x6800100, +0x962540,0x6100d997,0x6804400,0x962540,0x6100d997,0x7c00100,0x230400,0x6100d997,0x7c00100,0x230560,0x6100d997,0xc000010,0x448000,0x6100da98,0x6800000,0x1329800, +0x6100da98,0x7c00100,0x230400,0x6100db71,0x4000000,0x200000,0x6100dc99,0x2802100,0x962460,0x6100dc99,0x2802400,0x962460,0x6100dc99,0x6800000,0x1329800,0x6100dc99, +0x6800100,0x962540,0x6100dc99,0x6804400,0x962540,0x6100dc99,0x7c00100,0x230400,0x610a4711,0x7c40300,0xe30000,0x610a4f11,0x7c00300,0xe30001,0x610ace00,0x4000000, +0x30e00000,0x6140af7a,0x7c00100,0x230400,0x6140af7b,0x6800100,0x962540,0x6140af84,0x7c00100,0x230400,0x6180af7b,0x2802400,0x962460,0x62002a00,0x4000000,0x1600000, +0x63002800,0x80000,0x918820,0x63c00c11,0x80000,0x918820,0x7000080e,0x7c00100,0x250400,0x70000a03,0x4000000,0x200000,0x70000c00,0x80000000,0x218960,0x70000f0a, +0x7c00100,0x230400,0x70001004,0x7c00100,0x230400,0x70001524,0x2802100,0x962460,0x70001524,0x7c00100,0x230400,0x70001615,0x2802100,0x962460,0x7000171a,0x2802100, +0x962460,0x70001821,0x6800000,0x1329800,0x70002320,0x7c00100,0x230400,0x70002a00,0x4000000,0x1500000,0x70002a00,0x4000000,0x1600000,0x70003000,0x24000000,0x200000, +0x70003000,0x24000000,0x10200000,0x70003800,0x24000000,0xe00000,0x70005201,0x2802400,0x962460,0x7000581e,0x7c00100,0x230400,0x70006108,0x7c00100,0x220400,0x70006108, +0x7c00100,0x250400,0x70006f30,0x7c00100,0x230400,0x70007300,0x24000000,0x200000,0x70007f0e,0x4000000,0x200000,0x70008301,0x2802100,0x962460,0x70008301,0x2802400, +0x962460,0x70008e00,0x24000000,0x200000,0x70008e00,0x24000000,0x400000,0x70008e00,0x24000002,0x400000,0x70008e00,0x24000008,0x1410000,0x70008e00,0x24000010,0x400000, +0x70008e00,0x2c000010,0x448000,0x70009519,0x7c00100,0x220400,0x70009519,0x7c00100,0x230400,0x70009519,0x7c00100,0x250400,0x70009865,0x7c00100,0x230400,0x70009965, +0x4000010,0x400000,0x70009965,0x7c00100,0x230400,0x7000a008,0x7c00100,0x220400,0x7000a008,0x7c00100,0x250400,0x7000a008,0x7c00500,0x22040f,0x7000a50e,0x4000000, +0x200000,0x7000b61c,0x2802400,0x1862460,0x7000b61c,0x6800400,0x1862400,0x7000b61c,0x7c00100,0x1830000,0x7000c300,0x4000000,0x100000,0x7000c941,0x2806000,0x962460, +0x7000cc00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x200000,0x7000cd00,0x4000000,0xe00000,0x7000cd00,0x4000000,0x10200000,0x7000cd00,0x4000000,0x10e00000,0x7000cd00, +0x4000000,0x10e05200,0x7000cd00,0x4000000,0x928045a0,0x7000cf00,0x4000000,0xe00000,0x7000cf00,0x4000000,0x10e00000,0x7000d202,0x2802100,0x962460,0x7000d202,0x7c00100, +0x230400,0x7000d997,0x7c00100,0x230400,0x7000d997,0xc000010,0x248000,0x7000dd86,0x2802400,0x962460,0x7000dd86,0x7c00100,0x230400,0x7000dd86,0xc000010,0x448000, +0x7000de9f,0x4000000,0x200000,0x7000de9f,0x7c00100,0x230400,0x7000e001,0x2000,0x962460,0x7000e001,0x2802400,0x962460,0x7000e187,0x2802000,0x962460,0x7000e187, +0x2802100,0x962460,0x7000e187,0x4000000,0x200000,0x7000e187,0x7c00100,0x230400,0x7000e187,0xc000010,0x448000,0x7000e288,0x7c00100,0x230400,0x7000e300,0x4000000, +0x200000,0x7000e489,0x2802100,0x962460,0x7000e489,0x2802400,0x962460,0x7000e489,0x6800100,0x962540,0x7000e489,0x6800100,0x962541,0x7000e489,0x6804400,0x962540, +0x7000e489,0x7c00100,0x230400,0x7000e489,0x7c00900,0x230400,0x7000e59d,0x2802100,0x962460,0x7000e59d,0x2802400,0x962460,0x7000e59d,0x4000000,0x200000,0x7000e59d, +0x4000010,0x200000,0x7000e59d,0x6800100,0x962540,0x7000e59d,0x6804400,0x962540,0x7000e59d,0x7c00100,0x230400,0x7000e59d,0xc000010,0x448000,0x7000e691,0x2802100, +0x962460,0x7000e691,0x2802400,0x962460,0x7000e691,0x2806400,0x962460,0x7000e691,0x6800000,0x1329800,0x7000e691,0x6800100,0x962540,0x7000e691,0x7c00100,0x230400, +0x7000e700,0x4000400,0x200400,0x7000e70e,0x7c00100,0x220400,0x7000e719,0x7c00100,0x220400,0x7000e719,0x7c00500,0x22040f,0x7000e853,0x7c00100,0x230400,0x7000e9a0, +0x2802400,0x962460,0x7000e9a0,0x4000000,0x200000,0x7000e9a0,0x4000000,0x500000,0x7000e9a0,0x7c00100,0x230400,0x7000ea79,0x2802400,0x962460,0x7000ea79,0x4000000, +0x200000,0x7000ea79,0x4000000,0xf00000,0x7000ea79,0x4000010,0x400000,0x7000ea79,0x7c00100,0x230400,0x7000eb8c,0x2802400,0x962460,0x7000eb8c,0x4000000,0x200000, +0x7000eb8c,0x7c00100,0x230400,0x7000eca3,0x2802100,0x962460,0x7000eca3,0x2806400,0x962460,0x7000eca3,0x4000000,0x200000,0x7000eca3,0x6800000,0x1329800,0x7000eca3, +0x6800100,0x962540,0x7000eca3,0x7c00100,0x230400,0x7000eca3,0xc000010,0x448000,0x7000ed95,0x6800000,0x1329800,0x7000ed95,0x7c00100,0x230400,0x7000ed95,0xc000010, +0x448000,0x7000ee1c,0x2802400,0x1862460,0x7000ee1c,0x6800000,0x1329800,0x7000ee1c,0x7c00100,0x1830000,0x7000ee1c,0x7c00900,0x1830000,0x7000ef8f,0x4000000,0x200000, +0x7000ef8f,0x7c00100,0x230400,0x7000f08e,0x4000000,0x200000,0x7000f08e,0x7c00100,0x230400,0x7000f159,0x2802100,0x962460,0x7000f159,0x7c00100,0x230400,0x7000f200, +0x4000000,0x200000,0x7000f200,0x4000000,0x1200000,0x7000f200,0x4000000,0x1710000,0x7000f34b,0x2802100,0x962460,0x7000f34b,0x4000000,0x200000,0x7000f34b,0x4000010, +0x400000,0x7000f34b,0x6800000,0x1329800,0x7000f34b,0x7c00100,0x230400,0x7000f34b,0x7c00900,0x230400,0x7000f34b,0xc000010,0x448000,0x7000f490,0x4000000,0x200000, +0x7000f490,0x7c00100,0x230400,0x7000f5a5,0x7c00100,0x230400,0x7000f67b,0x4000000,0x200000,0x7000f67b,0x4000010,0x200000,0x7000f67b,0x7c00100,0x230400,0x7000f8a6, +0x2802100,0x962460,0x7000f8a6,0x2802400,0x962460,0x7000f8a6,0x2806400,0x962460,0x7000f8a6,0x4000000,0x500000,0x7000f8a6,0x4000010,0xb00000,0x7000f8a6,0x4000800, +0x200000,0x7000f8a6,0x6800100,0x962540,0x7000f8a6,0x6800100,0x962541,0x7000f8a6,0x7c00100,0x230400,0x7000f8a6,0xc000010,0x448000,0x7000f921,0x4000000,0x200000, +0x7000fa00,0x4000000,0x200000,0x7000fb9e,0x2802100,0x962460,0x7000fb9e,0x2802400,0x962460,0x7000fb9e,0x2806400,0x962460,0x7000fb9e,0x4000000,0x200000,0x7000fb9e, +0x6800000,0x1329800,0x7000fb9e,0x6800100,0x962540,0x7000fb9e,0x6800100,0x962541,0x7000fb9e,0x7c00100,0x230400,0x7000fc92,0x4000000,0x200000,0x7000fc92,0x6800000, +0x1329800,0x7000fc92,0x7c00100,0x220400,0x7000fc92,0x7c00100,0x230400,0x7000fc92,0x7c00100,0x250400,0x700acd00,0x4000000,0x30e00000,0x700acd00,0x4000000,0xb28045a0, +0x700ace00,0x4000000,0x30e00000,0x700acf00,0x4000000,0x30e00000,0x700acf00,0x4000000,0xb28045a0,0x7040dfc0,0x4000000,0x200000,0x7040f7c4,0x80000,0x918820,0x7080af7b, +0x2802400,0x962460,0x7080dfc0,0x2802400,0x962460,0x70c0e4c2,0x2802100,0x962460,0x70c0e4c2,0x2802400,0x962460,0x70c0e4c2,0x6800100,0x962540,0x8000120f,0x7c00100, +0x230400,0x80001524,0x7c00100,0x230400,0x8000171a,0x7c00100,0x230400,0x80002006,0x7c00100,0x220400,0x80002006,0x7c00100,0x250400,0x80002a00,0x4000000,0x1500000, +0x80002d00,0x4000000,0x200000,0x80005208,0x2802400,0x962460,0x80005c00,0x4000000,0x200000,0x80007300,0x24000000,0x200000,0x80009519,0x7c00100,0x220400,0x80009519, +0x7c00100,0x230400,0x80009519,0x7c00100,0x250400,0x80009865,0x7c00100,0x230400,0x8000a008,0x2802100,0x962460,0x8000b30a,0x4000000,0x500000,0x8000b30a,0x7c00100, +0x230400,0x8000cd00,0x4000000,0xe00000,0x8000d202,0x2802500,0x962460,0x8000d202,0x7c00100,0x230400,0x8000d68d,0x4000000,0x200000,0x8000d997,0x2802400,0x962460, +0x8000d997,0x4000000,0x200000,0x8000d997,0x4000000,0x400000,0x8000d997,0x4000000,0x500000,0x8000d997,0x7c00100,0x230400,0x8000d997,0xc000010,0x448000,0x8000e489, +0x2802100,0x962460,0x8000e489,0x7c00100,0x230400,0x8000e719,0x7c00100,0x220400,0x8000f8a6,0x2802100,0x962460,0x8000f8a6,0x7c00100,0x230400,0x8000f8a6,0xc000010, +0x448000,0x8000fda1,0x2802100,0x1862460,0x8000fda1,0x2806400,0x1862460,0x8000fda1,0x4000000,0x1800000,0x8000fda1,0x6800000,0x1329800,0x8000fda1,0x6800100,0x1862540, +0x8000fda1,0x7c00100,0x1830000,0x8000fda1,0xc000010,0x448000,0x8000fe9c,0x7c00100,0x230400,0x8000fe9c,0x7c00100,0x830400,0x8000fe9c,0x7c00100,0x1430400,0x8000ff06, +0x7c00100,0x220400,0x80010165,0x7c00100,0x230400,0x800102a2,0x4000000,0x200000,0x800102a2,0x7c00100,0x230400,0x800103a4,0x7c00100,0x230400,0x800103a4,0xc000010, +0x448000,0x8001044c,0x4000000,0x200000,0x8001044c,0x7c00100,0x220400,0x8001044c,0x7c00100,0x250400,0x80010670,0x2802000,0x962460,0x80010670,0x4000000,0x200000, +0x80010670,0x4000010,0x400000,0x80010670,0xc000010,0x448000,0x800a4711,0x7c40300,0xe30000,0x800acd00,0x4000000,0x30e00000,0x800acd00,0x4000000,0x7a904de0,0x800ace00, +0x4000000,0x30e00000,0x800acf00,0x4000000,0x30e00000,0x800b0011,0x7c40300,0xe30000,0x800b0500,0x4000000,0x30e00000,0x800b0500,0x4000000,0xb28045a0,0x90001615,0x7c00100, +0x230400,0x9000171a,0x4000000,0x200000,0x9000171a,0x7c00100,0x230400,0x90003000,0x24000000,0x200000,0x90007f0e,0x4000000,0x200000,0x90008301,0x2802000,0x962460, +0x90008e00,0x24000000,0x400000,0x90009519,0x7c00100,0x250400,0x9000a16f,0x2802100,0x962460,0x9000d200,0x80000000,0x218960,0x9000d202,0x2802000,0x962460,0x9000d202, +0x2802100,0x962460,0x9000d202,0x7c00100,0x230400,0x9000e59d,0x2802100,0x962460,0x900107a7,0x2802100,0x962460,0x900107a7,0x2802400,0x962460,0x900107a7,0x2802c00, +0x962460,0x900107a7,0x4000000,0x1400000,0x900107a7,0x6800000,0x1329800,0x900107a7,0x7c00100,0x220400,0x900107a7,0x7c00100,0x250400,0x900108a8,0x2802100,0x962460, +0x900108a8,0x2806400,0x962460,0x900108a8,0x4000000,0x200000,0x900108a8,0x4000000,0x400000,0x900108a8,0x4000010,0x400000,0x900108a8,0x6800000,0x1329800,0x900108a8, +0x6800100,0x962540,0x900108a8,0x7c00100,0x230400,0x900108a8,0xc000010,0x448000,0x90010908,0x7c00100,0x220400,0x90010a38,0x2802100,0x962460,0x90010ca9,0x2802100, +0x962460,0x90010ca9,0x4000000,0x500000,0x90010ca9,0x4000010,0xb00000,0x90010ca9,0x6800100,0x962540,0x90010ca9,0x7c00100,0x230400,0x90010d1b,0x4000000,0x500000, +0x90010eaa,0x2802100,0x962460,0x90010eaa,0x2802400,0x962460,0x90010eaa,0x2806400,0x962460,0x90010eaa,0x4000000,0x200000,0x90010eaa,0x4000000,0x400000,0x90010eaa, +0x4000010,0x400000,0x90010eaa,0x6800000,0x1329800,0x90010eaa,0x6800100,0x962540,0x90010eaa,0x7c00100,0x230400,0x90010eaa,0xc000010,0x448000,0x90010fab,0x7c00100, +0x220400,0x90010fab,0x7c00100,0x250400,0x9002c300,0x4000000,0x100000,0x900ac400,0x4000000,0xe0000d,0x900acd00,0x4000000,0x30e00000,0x900acd00,0x4000000,0xb28045a0, +0x900acf00,0x4000000,0x30e00000,0x900b0500,0x4000000,0xe00000,0x900b0500,0x4000000,0x30e00000,0x900b0500,0x4000000,0xb28045a0,0x900b0b9a,0x7c00900,0x1230400,0x900b109a, +0x7c00300,0xe30000,0x900b119a,0x7c00300,0xe30000,0x90408e06,0x24000000,0x400000,0xa0001004,0x4000000,0x200000,0xa0001004,0x7c00100,0x230400,0xa000120f,0x2802100, +0x962460,0xa000120f,0x2802400,0x962460,0xa000171a,0x2802100,0x962460,0xa000171a,0x2806400,0x962460,0xa0002a00,0x4000000,0x1600000,0xa0003000,0x24000000,0x200000, +0xa000581e,0x7c00100,0x230400,0xa0007300,0x24000000,0x200000,0xa0008301,0x2802400,0x962460,0xa0008e00,0x24000000,0x400000,0xa000cf00,0x4000000,0xe00000,0xa0010500, +0x4000000,0x200000,0xa00114af,0x2802100,0x962460,0xa00114af,0x2802400,0x962460,0xa00114af,0x2806400,0x962460,0xa00114af,0x6800000,0x1329800,0xa00114af,0x7c00100, +0x230400,0xa00114af,0x7c00100,0x230560,0xa00116b0,0x2802100,0x962460,0xa00116b0,0x2802800,0x962460,0xa00116b0,0x2806400,0x962460,0xa00116b0,0x4000000,0x400000, +0xa00116b0,0x4000000,0x500000,0xa00116b0,0x4000010,0x400000,0xa00116b0,0x6800100,0x962540,0xa00116b0,0x7c00100,0x230400,0xa00116b0,0x7c00100,0x230560,0xa00116b0, +0xc000010,0x448000,0xa0011722,0x7c00100,0x230400,0xa00118b1,0x2802000,0x962460,0xa00118b1,0x2802100,0x962460,0xa00118b1,0x2806400,0x962460,0xa00118b1,0x4000000, +0x200000,0xa00118b1,0x4000000,0x400000,0xa00118b1,0x4000000,0x500000,0xa00118b1,0x6800100,0x962540,0xa00118b1,0x7c00100,0x230400,0xa00118b1,0x7c00100,0x230560, +0xa00118b1,0xc000010,0x448000,0xa00a4005,0x7c00100,0xe30400,0xa00a4711,0x7c40300,0xe30000,0xa00ac400,0x4000000,0xe00000,0xa00acb14,0x7c00100,0xe30000,0xa00acf00, +0x4000000,0x30e00000,0xa00b0500,0x4000000,0x30e00000,0xa00b0500,0x4000000,0xb28045a0,0xa00b0b96,0x7c00900,0x1230400,0xa00b1211,0x7c40300,0xe30000,0xa00b1314,0x7c00100, +0xe30000,0xa00b1596,0x7c00300,0xe30000,0xa040af86,0x6800400,0x962540}; -static const int32_t countPropsVectors=6279; -static const int32_t propsVectorsColumns=3; -static const uint16_t scriptExtensions[194]={ +static const int32_t countPropsVectors=6375; +static const int32_t propsVectorsColumns=3; /* The code assumes that this value is > 0*/ +static const uint16_t scriptExtensions[198]={ 0x800e,0x8019,8,0x8059,8,2,8,0x8038,8,6,8,0x8019,3,0x800c,2,0x22, -0x8025,2,0x22,0x54,0x79,0x7b,0x80a7,2,0x8022,2,0x8025,2,0x19,4,0xa,0xf, -0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x8097,4,0xa,0xf,0x10,0x15,0x19,0x1a, -0x1f,0x23,0x24,0x8089,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x3a,0x89, -0x91,0x99,0x9e,0x80a0,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24,0x30,0x3a, -0x89,0x91,0x99,0x9e,0x80a0,0xa,0x78,0x80a0,0xa,0x55,4,0x3a,0x8076,4,0x5a,0x10, -0x80a4,0x10,0x5f,0xf,0x809d,0xf,0x63,0x23,0x8089,0x23,0x67,0x1c,0x34,0x8076,0x1c,0x6b, -0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,0xa,0x8089,0xa,0x8097,0xa,0x15,0x1a, -0x23,0x8024,0xa,0x8015,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029,5,0x11,0x12, -0x14,0x8016,0x8011,5,0x8011,0x11,0x14,0x8016,0xa,0xf,0x10,0x15,0x78,0x91,0x99,0x9e, -0xa0,0x80a3,0xa,0xf,0x10,0x78,0x91,0x99,0x9e,0xa0,0x80a3,4,0x800a,0xa,0xab,0xa, -0x8023,0xa,0xaf,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031,2,0x8007,0x89, -0x67,0x8087}; +0x8025,2,0xe,2,0x22,0x54,0x79,0x7b,0x80a7,2,0x8022,2,0x8025,2,0x1b,4, +0xa,0xf,0x10,0x15,0x19,0x1a,0x1f,0x23,0x24,0x89,0x8097,4,0xa,0xf,0x10,0x15, +0x19,0x1a,0x1f,0x23,0x24,0x8089,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24, +0x3a,0x89,0x91,0x99,0x9e,0x80a0,4,0xa,0xf,0x10,0x15,0x1a,0x1f,0x21,0x23,0x24, +0x30,0x3a,0x89,0x91,0x99,0x9e,0x80a0,0xa,0x78,0x80a0,0xa,0x57,4,0x3a,0x8076,4, +0x5c,0x10,0x80a4,0x10,0x61,0xf,0x809d,0xf,0x65,0x23,0x8089,0x23,0x69,0x1c,0x34,0x8076, +0x1c,0x6d,0xc,0x8019,0x2a,0x2b,0x2c,0x802d,0x1b,0x805a,0x800a,0xa,0x8089,0xa,0x8097,0xa, +0x15,0x1a,0x23,0x8024,0xa,0x8015,0x8004,0xa,0x19,0x8089,5,0x11,0x12,0x14,0x16,0x8029, +5,0x11,0x12,0x14,0x8016,0x8011,5,0x8011,0x11,0x14,0x8016,0xa,0xf,0x10,0x15,0x78, +0x91,0x99,0x9e,0xa0,0x80a3,0xa,0xf,0x10,0x78,0x91,0x99,0x9e,0xa0,0x80a3,4,0x800a, +0xa,0xae,0xa,0x8023,0xa,0xb2,0x19,0x1c,0x804f,0x37,0x804e,0x2f,0x31,0x8053,0x2f,0x8031, +2,0x8007,0x89,0x69,0x8087,0}; -static const int32_t indexes[UPROPS_INDEX_COUNT]={0x28aa,0x28aa,0x28aa,0x28aa,0x6196,3,0x7a1d,0x7a7e,0x7a7e,0x7a7e,0xb11ae,0x2a75631,0,0,0,0}; +static const int32_t indexes[UPROPS_INDEX_COUNT]={0x2962,0x2962,0x2962,0x2962,0x6280,3,0x7b67,0x7bca,0x7bca,0x7bca,0xb18b1,0x2a75631,0,0,0,0}; #endif // INCLUDED_FROM_UCHAR_C diff --git a/deps/icu-small/source/common/ucharstriebuilder.cpp b/deps/icu-small/source/common/ucharstriebuilder.cpp index 694648d0c811f7..049997a27545ed 100644 --- a/deps/icu-small/source/common/ucharstriebuilder.cpp +++ b/deps/icu-small/source/common/ucharstriebuilder.cpp @@ -287,7 +287,7 @@ UCharsTrieBuilder::indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, UCha UCharsTrieBuilder::UCTLinearMatchNode::UCTLinearMatchNode(const UChar *units, int32_t len, Node *nextNode) : LinearMatchNode(len, nextNode), s(units) { - hash=hash*37+ustr_hashUCharsN(units, len); + hash=hash*37u+ustr_hashUCharsN(units, len); } UBool diff --git a/deps/icu-small/source/common/ucln_cmn.h b/deps/icu-small/source/common/ucln_cmn.h index a6ecfd54bb55e4..5db94945172c3d 100644 --- a/deps/icu-small/source/common/ucln_cmn.h +++ b/deps/icu-small/source/common/ucln_cmn.h @@ -35,7 +35,7 @@ typedef enum ECleanupCommonType { UCLN_COMMON_START = -1, UCLN_COMMON_USPREP, UCLN_COMMON_BREAKITERATOR, - UCLN_COMMON_BREAKITERATOR_DICT, + UCLN_COMMON_RBBI, UCLN_COMMON_SERVICE, UCLN_COMMON_LOCALE_KEY_TYPE, UCLN_COMMON_LOCALE, diff --git a/deps/icu-small/source/common/ucnv_ct.cpp b/deps/icu-small/source/common/ucnv_ct.cpp index c9a0ce36930ec9..51e31aa4116bd3 100644 --- a/deps/icu-small/source/common/ucnv_ct.cpp +++ b/deps/icu-small/source/common/ucnv_ct.cpp @@ -315,6 +315,7 @@ _CompoundTextClose(UConverter *converter) { } uprv_free(converter->extraInfo); + converter->extraInfo = NULL; } } @@ -519,7 +520,7 @@ UConverter_toUnicode_CompoundText_OFFSETS(UConverterToUnicodeArgs *args, currentState = tmpState; } - sourceOffset = uprv_strlen((char*)escSeqCompoundText[currentState]) - args->converter->toULength; + sourceOffset = static_cast(uprv_strlen((char*)escSeqCompoundText[currentState]) - args->converter->toULength); mySource += sourceOffset; diff --git a/deps/icu-small/source/common/ucnv_lmb.cpp b/deps/icu-small/source/common/ucnv_lmb.cpp index 4a5befde6145a2..6dd8e83428a0af 100644 --- a/deps/icu-small/source/common/ucnv_lmb.cpp +++ b/deps/icu-small/source/common/ucnv_lmb.cpp @@ -966,26 +966,26 @@ _LMBCSFromUnicode(UConverterFromUnicodeArgs* args, if(extraInfo->localeConverterIndex < ULMBCS_DOUBLEOPTGROUP_START) { - bytes_written = LMBCSConversionWorker (extraInfo, + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, ULMBCS_GRP_L1, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); if(!bytes_written) { - bytes_written = LMBCSConversionWorker (extraInfo, + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, ULMBCS_GRP_EXCEPT, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); } if(!bytes_written) { - bytes_written = LMBCSConversionWorker (extraInfo, + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, extraInfo->localeConverterIndex, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); } } else { - bytes_written = LMBCSConversionWorker (extraInfo, + bytes_written = (int32_t)LMBCSConversionWorker (extraInfo, extraInfo->localeConverterIndex, pLMBCS, &uniChar, &lastConverterIndex, groups_tried); } diff --git a/deps/icu-small/source/common/ucnv_u16.cpp b/deps/icu-small/source/common/ucnv_u16.cpp index 674d0323efddef..a289fd4acfac1a 100644 --- a/deps/icu-small/source/common/ucnv_u16.cpp +++ b/deps/icu-small/source/common/ucnv_u16.cpp @@ -1323,9 +1323,17 @@ _UTF16GetName(const UConverter *cnv) { U_CDECL_END extern const UConverterSharedData _UTF16Data; -#define IS_UTF16BE(cnv) ((cnv)->sharedData==&_UTF16BEData) -#define IS_UTF16LE(cnv) ((cnv)->sharedData==&_UTF16LEData) -#define IS_UTF16(cnv) ((cnv)->sharedData==&_UTF16Data || (cnv)->sharedData==&_UTF16v2Data) +static inline bool IS_UTF16BE(const UConverter *cnv) { + return ((cnv)->sharedData == &_UTF16BEData); +} + +static inline bool IS_UTF16LE(const UConverter *cnv) { + return ((cnv)->sharedData == &_UTF16LEData); +} + +static inline bool IS_UTF16(const UConverter *cnv) { + return ((cnv)->sharedData==&_UTF16Data) || ((cnv)->sharedData == &_UTF16v2Data); +} U_CDECL_BEGIN static void U_CALLCONV diff --git a/deps/icu-small/source/common/ucnv_u8.cpp b/deps/icu-small/source/common/ucnv_u8.cpp index b2d26f9c3b7f8e..866cf81659486b 100644 --- a/deps/icu-small/source/common/ucnv_u8.cpp +++ b/deps/icu-small/source/common/ucnv_u8.cpp @@ -31,6 +31,7 @@ #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "cmemory.h" +#include "ustr_imp.h" /* Prototypes --------------------------------------------------------------- */ @@ -44,51 +45,13 @@ U_CFUNC void ucnv_fromUnicode_UTF8_OFFSETS_LOGIC(UConverterFromUnicodeArgs *args /* UTF-8 -------------------------------------------------------------------- */ -/* UTF-8 Conversion DATA - * for more information see Unicode Standard 2.0, Transformation Formats Appendix A-9 - */ -/*static const uint32_t REPLACEMENT_CHARACTER = 0x0000FFFD;*/ #define MAXIMUM_UCS2 0x0000FFFF -#define MAXIMUM_UTF 0x0010FFFF -#define MAXIMUM_UCS4 0x7FFFFFFF -#define HALF_SHIFT 10 -#define HALF_BASE 0x0010000 -#define HALF_MASK 0x3FF -#define SURROGATE_HIGH_START 0xD800 -#define SURROGATE_HIGH_END 0xDBFF -#define SURROGATE_LOW_START 0xDC00 -#define SURROGATE_LOW_END 0xDFFF - -/* -SURROGATE_LOW_START + HALF_BASE */ -#define SURROGATE_LOW_BASE 9216 - -static const uint32_t offsetsFromUTF8[7] = {0, - (uint32_t) 0x00000000, (uint32_t) 0x00003080, (uint32_t) 0x000E2080, - (uint32_t) 0x03C82080, (uint32_t) 0xFA082080, (uint32_t) 0x82082080 -}; -/* END OF UTF-8 Conversion DATA */ - -static const int8_t bytesFromUTF8[256] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 0, 0 +static const uint32_t offsetsFromUTF8[5] = {0, + (uint32_t) 0x00000000, (uint32_t) 0x00003080, (uint32_t) 0x000E2080, + (uint32_t) 0x03C82080 }; -/* - * Starting with Unicode 3.0.1: - * UTF-8 byte sequences of length N _must_ encode code points of or above utf8_minChar32[N]; - * byte sequences with more than 4 bytes are illegal in UTF-8, - * which is tested with impossible values for them - */ -static const uint32_t -utf8_minChar32[7]={ 0, 0, 0x80, 0x800, 0x10000, 0xffffffff, 0xffffffff }; - static UBool hasCESU8Data(const UConverter *cnv) { #if UCONFIG_ONLY_HTML_CONVERSION @@ -127,7 +90,7 @@ static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, while (mySource < sourceLimit && myTarget < targetLimit) { ch = *(mySource++); - if (ch < 0x80) /* Simple case */ + if (U8_IS_SINGLE(ch)) /* Simple case */ { *(myTarget++) = (UChar) ch; } @@ -135,7 +98,7 @@ static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, { /* store the first char */ toUBytes[0] = (char)ch; - inBytes = bytesFromUTF8[ch]; /* lookup current sequence length */ + inBytes = U8_COUNT_BYTES_NON_ASCII(ch); /* lookup current sequence length */ i = 1; morebytes: @@ -144,7 +107,8 @@ static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, if (mySource < sourceLimit) { toUBytes[i] = (char) (ch2 = *mySource); - if (!U8_IS_TRAIL(ch2)) + if (!icu::UTF8::isValidTrail(ch, ch2, i, inBytes) && + !(isCESU8 && i == 1 && ch == 0xed && U8_IS_TRAIL(ch2))) { break; /* i < inBytes */ } @@ -162,24 +126,12 @@ static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, } } - /* Remove the accumulated high bits */ - ch -= offsetsFromUTF8[inBytes]; - - /* - * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: - * - use only trail bytes after a lead byte (checked above) - * - use the right number of trail bytes for a given lead byte - * - encode a code point <= U+10ffff - * - use the fewest possible number of bytes for their code points - * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[i] && - (isCESU8 ? i <= 3 : !U_IS_SURROGATE(ch))) + // In CESU-8, only surrogates, not supplementary code points, are encoded directly. + if (i == inBytes && (!isCESU8 || i <= 3)) { + /* Remove the accumulated high bits */ + ch -= offsetsFromUTF8[inBytes]; + /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ if (ch <= MAXIMUM_UCS2) { @@ -189,9 +141,8 @@ static void U_CALLCONV ucnv_toUnicode_UTF8 (UConverterToUnicodeArgs * args, else { /* write out the surrogates */ - ch -= HALF_BASE; - *(myTarget++) = (UChar) ((ch >> HALF_SHIFT) + SURROGATE_HIGH_START); - ch = (ch & HALF_MASK) + SURROGATE_LOW_START; + *(myTarget++) = U16_LEAD(ch); + ch = U16_TRAIL(ch); if (myTarget < targetLimit) { *(myTarget++) = (UChar)ch; @@ -256,7 +207,7 @@ static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeAr while (mySource < sourceLimit && myTarget < targetLimit) { ch = *(mySource++); - if (ch < 0x80) /* Simple case */ + if (U8_IS_SINGLE(ch)) /* Simple case */ { *(myTarget++) = (UChar) ch; *(myOffsets++) = offsetNum++; @@ -264,7 +215,7 @@ static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeAr else { toUBytes[0] = (char)ch; - inBytes = bytesFromUTF8[ch]; + inBytes = U8_COUNT_BYTES_NON_ASCII(ch); i = 1; morebytes: @@ -273,7 +224,8 @@ static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeAr if (mySource < sourceLimit) { toUBytes[i] = (char) (ch2 = *mySource); - if (!U8_IS_TRAIL(ch2)) + if (!icu::UTF8::isValidTrail(ch, ch2, i, inBytes) && + !(isCESU8 && i == 1 && ch == 0xed && U8_IS_TRAIL(ch2))) { break; /* i < inBytes */ } @@ -290,24 +242,12 @@ static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeAr } } - /* Remove the accumulated high bits */ - ch -= offsetsFromUTF8[inBytes]; - - /* - * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: - * - use only trail bytes after a lead byte (checked above) - * - use the right number of trail bytes for a given lead byte - * - encode a code point <= U+10ffff - * - use the fewest possible number of bytes for their code points - * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[i] && - (isCESU8 ? i <= 3 : !U_IS_SURROGATE(ch))) + // In CESU-8, only surrogates, not supplementary code points, are encoded directly. + if (i == inBytes && (!isCESU8 || i <= 3)) { + /* Remove the accumulated high bits */ + ch -= offsetsFromUTF8[inBytes]; + /* Normal valid byte when the loop has not prematurely terminated (i < inBytes) */ if (ch <= MAXIMUM_UCS2) { @@ -318,10 +258,9 @@ static void U_CALLCONV ucnv_toUnicode_UTF8_OFFSETS_LOGIC (UConverterToUnicodeAr else { /* write out the surrogates */ - ch -= HALF_BASE; - *(myTarget++) = (UChar) ((ch >> HALF_SHIFT) + SURROGATE_HIGH_START); + *(myTarget++) = U16_LEAD(ch); *(myOffsets++) = offsetNum; - ch = (ch & HALF_MASK) + SURROGATE_LOW_START; + ch = U16_TRAIL(ch); if (myTarget < targetLimit) { *(myTarget++) = (UChar)ch; @@ -616,10 +555,9 @@ static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, UConverter *cnv; const uint8_t *sourceInitial; const uint8_t *source; - uint16_t extraBytesToWrite; uint8_t myByte; UChar32 ch; - int8_t i, isLegalSequence; + int8_t i; /* UTF-8 only here, the framework handles CESU-8 to combine surrogate pairs */ @@ -633,14 +571,14 @@ static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, } myByte = (uint8_t)*(source++); - if (myByte < 0x80) + if (U8_IS_SINGLE(myByte)) { args->source = (const char *)source; return (UChar32)myByte; } - extraBytesToWrite = (uint16_t)bytesFromUTF8[myByte]; - if (extraBytesToWrite == 0) { + uint16_t countTrailBytes = U8_COUNT_TRAIL_BYTES(myByte); + if (countTrailBytes == 0) { cnv->toUBytes[0] = myByte; cnv->toULength = 1; *err = U_ILLEGAL_CHAR_FOUND; @@ -649,15 +587,17 @@ static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, } /*The byte sequence is longer than the buffer area passed*/ - if (((const char *)source + extraBytesToWrite - 1) > args->sourceLimit) + if (((const char *)source + countTrailBytes) > args->sourceLimit) { /* check if all of the remaining bytes are trail bytes */ + uint16_t extraBytesToWrite = countTrailBytes + 1; cnv->toUBytes[0] = myByte; i = 1; *err = U_TRUNCATED_CHAR_FOUND; while(source < (const uint8_t *)args->sourceLimit) { - if(U8_IS_TRAIL(myByte = *source)) { - cnv->toUBytes[i++] = myByte; + uint8_t b = *source; + if(icu::UTF8::isValidTrail(myByte, b, i, extraBytesToWrite)) { + cnv->toUBytes[i++] = b; ++source; } else { /* error even before we run out of input */ @@ -670,81 +610,28 @@ static UChar32 U_CALLCONV ucnv_getNextUChar_UTF8(UConverterToUnicodeArgs *args, return 0xffff; } - isLegalSequence = 1; ch = myByte << 6; - switch(extraBytesToWrite) - { - /* note: code falls through cases! (sic)*/ - case 6: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; + if(countTrailBytes == 2) { + uint8_t t1 = *source, t2; + if(U8_IS_VALID_LEAD3_AND_T1(myByte, t1) && U8_IS_TRAIL(t2 = *++source)) { + args->source = (const char *)(source + 1); + return (((ch + t1) << 6) + t2) - offsetsFromUTF8[3]; } - ++source; - U_FALLTHROUGH; - case 5: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; + } else if(countTrailBytes == 1) { + uint8_t t1 = *source; + if(U8_IS_TRAIL(t1)) { + args->source = (const char *)(source + 1); + return (ch + t1) - offsetsFromUTF8[2]; } - ++source; - U_FALLTHROUGH; - case 4: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - ++source; - U_FALLTHROUGH; - case 3: - ch += (myByte = *source); - ch <<= 6; - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; - } - ++source; - U_FALLTHROUGH; - case 2: - ch += (myByte = *source); - if (!U8_IS_TRAIL(myByte)) - { - isLegalSequence = 0; - break; + } else { // countTrailBytes == 3 + uint8_t t1 = *source, t2, t3; + if(U8_IS_VALID_LEAD4_AND_T1(myByte, t1) && U8_IS_TRAIL(t2 = *++source) && + U8_IS_TRAIL(t3 = *++source)) { + args->source = (const char *)(source + 1); + return (((((ch + t1) << 6) + t2) << 6) + t3) - offsetsFromUTF8[4]; } - ++source; - }; - ch -= offsetsFromUTF8[extraBytesToWrite]; - args->source = (const char *)source; - - /* - * Legal UTF-8 byte sequences in Unicode 3.0.1 and up: - * - use only trail bytes after a lead byte (checked above) - * - use the right number of trail bytes for a given lead byte - * - encode a code point <= U+10ffff - * - use the fewest possible number of bytes for their code points - * - use at most 4 bytes (for i>=5 it is 0x10ffff= utf8_minChar32[extraBytesToWrite] && - !U_IS_SURROGATE(ch) - ) { - return ch; /* return the code point */ } + args->source = (const char *)source; for(i = 0; sourceInitial < source; ++i) { cnv->toUBytes[i] = *sourceInitial++; @@ -757,14 +644,6 @@ U_CDECL_END /* UTF-8-from-UTF-8 conversion functions ------------------------------------ */ -/* minimum code point values for n-byte UTF-8 sequences, n=0..4 */ -static const UChar32 -utf8_minLegal[5]={ 0, 0, 0x80, 0x800, 0x10000 }; - -/* offsets for n-byte UTF-8 sequences that were calculated with ((lead<<6)+trail)<<6+trail... */ -static const UChar32 -utf8_offsets[7]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; - U_CDECL_BEGIN /* "Convert" UTF-8 to UTF-8: Validate and copy. Modified from ucnv_DBCSFromUTF8(). */ static void U_CALLCONV @@ -812,39 +691,35 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, *pErrorCode=U_USING_DEFAULT_WARNING; return; } else { - /* - * Use a single counter for source and target, counting the minimum of - * the source length and the target capacity. - * As a result, the source length is checked only once per multi-byte - * character instead of twice. - * - * Make sure that the last byte sequence is complete, or else - * stop just before it. - * (The longest legal byte sequence has 3 trail bytes.) - * Count oldToULength (number of source bytes from a previous buffer) - * into the source length but reduce the source index by toULimit - * while going back over trail bytes in order to not go back into - * the bytes that will be read for finishing a partial - * sequence from the previous buffer. - * Let the standard converter handle edge cases. - */ - int32_t i; - + // Use a single counter for source and target, counting the minimum of + // the source length and the target capacity. + // Let the standard converter handle edge cases. if(count>targetCapacity) { count=targetCapacity; } - i=0; - while(i<3 && i<(count-toULimit)) { - b=source[count-oldToULength-i-1]; - if(U8_IS_TRAIL(b)) { - ++i; - } else { - if(i0 only once per 1/2/3-byte character. + // If the buffer ends with a truncated 2- or 3-byte sequence, + // then we reduce the count to stop before that, + // and collect the remaining bytes after the conversion loop. + { + // Do not go back into the bytes that will be read for finishing a partial + // sequence from the previous buffer. + int32_t length=count-toULimit; + if(length>0) { + uint8_t b1=*(sourceLimit-1); + if(U8_IS_SINGLE(b1)) { + // common ASCII character + } else if(U8_IS_TRAIL(b1) && length>=2) { + uint8_t b2=*(sourceLimit-2); + if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + // truncated 3-byte sequence + count-=2; + } + } else if(0xc2<=b1 && b1<0xf0) { + // truncated 2- or 3-byte sequence + --count; } - break; } } } @@ -859,17 +734,17 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* conversion loop */ while(count>0) { b=*source++; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { /* convert ASCII */ *target++=b; --count; continue; } else { - if(b>0xe0) { - if( /* handle U+1000..U+D7FF inline */ - (t1=source[0]) >= 0x80 && ((b<0xed && (t1 <= 0xbf)) || - (b==0xed && (t1 <= 0x9f))) && - (t2=source[1]) >= 0x80 && t2 <= 0xbf + if(b>=0xe0) { + if( /* handle U+0800..U+FFFF inline */ + b<0xf0 && + U8_IS_VALID_LEAD3_AND_T1(b, t1=source[0]) && + U8_IS_TRAIL(t2=source[1]) ) { source+=2; *target++=b; @@ -878,10 +753,10 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, count-=3; continue; } - } else if(b<0xe0) { + } else { if( /* handle U+0080..U+07FF inline */ b>=0xc2 && - (t1=*source) >= 0x80 && t1 <= 0xbf + U8_IS_TRAIL(t1=*source) ) { ++source; *target++=b; @@ -889,30 +764,18 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, count-=2; continue; } - } else if(b==0xe0) { - if( /* handle U+0800..U+0FFF inline */ - (t1=source[0]) >= 0xa0 && t1 <= 0xbf && - (t2=source[1]) >= 0x80 && t2 <= 0xbf - ) { - source+=2; - *target++=b; - *target++=t1; - *target++=t2; - count-=3; - continue; - } } /* handle "complicated" and error cases, and continuing partial characters */ oldToULength=0; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES_NON_ASCII(b); c=b; moreBytes: while(toULength=utf8_minLegal[toULength] && - (c<=0xd7ff || 0xe000<=c) /* not a surrogate */ - ) { - /* legal byte sequence for BMP code point */ - } else if( - toULength==toULimit && toULength==4 && - (0x10000<=(c-=utf8_offsets[4]) && c<=0x10ffff) - ) { - /* legal byte sequence for supplementary code point */ - } else { + if(toULength!=toULimit) { /* error handling: illegal UTF-8 byte sequence */ source-=(toULength-oldToULength); while(oldToULength(sourceLimit-source)) { /* collect a truncated byte sequence */ toULength=0; diff --git a/deps/icu-small/source/common/ucnvlat1.cpp b/deps/icu-small/source/common/ucnvlat1.cpp index 7a0dccd4469771..9855ebe6e774d7 100644 --- a/deps/icu-small/source/common/ucnvlat1.cpp +++ b/deps/icu-small/source/common/ucnvlat1.cpp @@ -23,6 +23,7 @@ #include "unicode/utf8.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" +#include "ustr_imp.h" /* control optimizations according to the platform */ #define LATIN1_UNROLL_FROM_UNICODE 1 @@ -374,7 +375,7 @@ ucnv_Latin1FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, while(source0) { b=*source++; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { /* convert ASCII */ *target++=(uint8_t)b; --targetCapacity; @@ -409,7 +410,7 @@ ucnv_Latin1FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, if(U_SUCCESS(*pErrorCode) && source<(sourceLimit=(uint8_t *)pToUArgs->sourceLimit)) { utf8->toUnicodeStatus=utf8->toUBytes[0]=b=*source++; utf8->toULength=1; - utf8->mode=U8_COUNT_TRAIL_BYTES(b)+1; + utf8->mode=U8_COUNT_BYTES(b); } /* write back the updated pointers */ diff --git a/deps/icu-small/source/common/ucnvmbcs.cpp b/deps/icu-small/source/common/ucnvmbcs.cpp index 4412be6739e934..e5efa7fc1b2ad3 100644 --- a/deps/icu-small/source/common/ucnvmbcs.cpp +++ b/deps/icu-small/source/common/ucnvmbcs.cpp @@ -59,6 +59,7 @@ #include "cmemory.h" #include "cstring.h" #include "umutex.h" +#include "ustr_imp.h" /* control optimizations according to the platform */ #define MBCS_UNROLL_SINGLE_TO_BMP 1 @@ -5011,13 +5012,9 @@ ucnv_MBCSSingleFromUChar32(UConverterSharedData *sharedData, /* MBCS-from-UTF-8 conversion functions ------------------------------------- */ -/* minimum code point values for n-byte UTF-8 sequences, n=0..4 */ -static const UChar32 -utf8_minLegal[5]={ 0, 0, 0x80, 0x800, 0x10000 }; - /* offsets for n-byte UTF-8 sequences that were calculated with ((lead<<6)+trail)<<6+trail... */ static const UChar32 -utf8_offsets[7]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; +utf8_offsets[5]={ 0, 0, 0x3080, 0xE2080, 0x3C82080 }; static void U_CALLCONV ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, @@ -5037,7 +5034,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, uint8_t b, t1, t2; uint32_t asciiRoundtrips; - uint16_t value, minValue; + uint16_t value, minValue = 0; UBool hasSupplementary; /* set up the local pointers */ @@ -5075,28 +5072,27 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, toULength=oldToULength=toULimit=0; } - /* - * Make sure that the last byte sequence before sourceLimit is complete - * or runs into a lead byte. - * Do not go back into the bytes that will be read for finishing a partial - * sequence from the previous buffer. - * In the conversion loop compare source with sourceLimit only once - * per multi-byte character. - */ + // The conversion loop checks source0) { + uint8_t b1=*(sourceLimit-1); + if(U8_IS_SINGLE(b1)) { + // common ASCII character + } else if(U8_IS_TRAIL(b1) && length>=2) { + uint8_t b2=*(sourceLimit-2); + if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + // truncated 3-byte sequence + sourceLimit-=2; } - break; + } else if(0xc2<=b1 && b1<0xf0) { + // truncated 2- or 3-byte sequence + --sourceLimit; } } } @@ -5130,7 +5126,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, while(source0) { b=*source++; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { /* convert ASCII */ if(IS_ASCII_ROUNDTRIP(b, asciiRoundtrips)) { *target++=(uint8_t)b; @@ -5185,7 +5181,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, /* handle "complicated" and error cases, and continuing partial characters */ oldToULength=0; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES_NON_ASCII(b); c=b; moreBytes: while(toULengthsourceLimit) { b=*source; - if(U8_IS_TRAIL(b)) { + if(icu::UTF8::isValidTrail(c, b, toULength, toULimit)) { ++source; ++toULength; c=(c<<6)+b; @@ -5220,22 +5216,18 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } } - if( toULength==toULimit && /* consumed all trail bytes */ - (toULength==3 || toULength==2) && /* BMP */ - (c-=utf8_offsets[toULength])>=utf8_minLegal[toULength] && - (c<=0xd7ff || 0xe000<=c) /* not a surrogate */ - ) { - value=MBCS_SINGLE_RESULT_FROM_U(table, results, c); - } else if( - toULength==toULimit && toULength==4 && - (0x10000<=(c-=utf8_offsets[4]) && c<=0x10ffff) - ) { - /* supplementary code point */ - if(!hasSupplementary) { - /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ - value=0; - } else { + if(toULength==toULimit) { + c-=utf8_offsets[toULength]; + if(toULength<=3) { /* BMP */ value=MBCS_SINGLE_RESULT_FROM_U(table, results, c); + } else { + /* supplementary code point */ + if(!hasSupplementary) { + /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ + value=0; + } else { + value=MBCS_SINGLE_RESULT_FROM_U(table, results, c); + } } } else { /* error handling: illegal UTF-8 byte sequence */ @@ -5310,7 +5302,7 @@ ucnv_SBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, source<(sourceLimit=(uint8_t *)pToUArgs->sourceLimit)) { c=utf8->toUBytes[0]=b=*source++; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES(b); while(sourcetoUBytes[toULength++]=b=*source++; c=(c<<6)+b; @@ -5344,7 +5336,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, uint32_t stage2Entry; uint32_t asciiRoundtrips; - uint16_t value; + uint16_t value = 0; UBool hasSupplementary; /* set up the local pointers */ @@ -5375,28 +5367,27 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, toULength=oldToULength=toULimit=0; } - /* - * Make sure that the last byte sequence before sourceLimit is complete - * or runs into a lead byte. - * Do not go back into the bytes that will be read for finishing a partial - * sequence from the previous buffer. - * In the conversion loop compare source with sourceLimit only once - * per multi-byte character. - */ + // The conversion loop checks source0) { + uint8_t b1=*(sourceLimit-1); + if(U8_IS_SINGLE(b1)) { + // common ASCII character + } else if(U8_IS_TRAIL(b1) && length>=2) { + uint8_t b2=*(sourceLimit-2); + if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + // truncated 3-byte sequence + sourceLimit-=2; } - break; + } else if(0xc2<=b1 && b1<0xf0) { + // truncated 2- or 3-byte sequence + --sourceLimit; } } } @@ -5412,7 +5403,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, while(source0) { b=*source++; - if((int8_t)b>=0) { + if(U8_IS_SINGLE(b)) { /* convert ASCII */ if(IS_ASCII_ROUNDTRIP(b, asciiRoundtrips)) { *target++=b; @@ -5426,13 +5417,13 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } } } else { - if(b>0xe0) { - if( /* handle U+1000..U+D7FF inline */ - (((t1=(uint8_t)(source[0]-0x80), b<0xed) && (t1 <= 0x3f)) || - (b==0xed && (t1 <= 0x1f))) && + if(b>=0xe0) { + if( /* handle U+0800..U+D7FF inline */ + b<=0xed && // do not assume maxFastUChar>0xd7ff + U8_IS_VALID_LEAD3_AND_T1(b, t1=source[0]) && (t2=(uint8_t)(source[1]-0x80)) <= 0x3f ) { - c=((b&0xf)<<6)|t1; + c=((b&0xf)<<6)|(t1&0x3f); source+=2; value=DBCS_RESULT_FROM_UTF8(mbcsIndex, results, c, t2); if(value==0) { @@ -5442,7 +5433,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } else { c=-1; } - } else if(b<0xe0) { + } else { if( /* handle U+0080..U+07FF inline */ b>=0xc2 && (t1=(uint8_t)(*source-0x80)) <= 0x3f @@ -5457,15 +5448,13 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } else { c=-1; } - } else { - c=-1; } if(c<0) { /* handle "complicated" and error cases, and continuing partial characters */ oldToULength=0; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES_NON_ASCII(b); c=b; moreBytes: while(toULengthsourceLimit) { b=*source; - if(U8_IS_TRAIL(b)) { + if(icu::UTF8::isValidTrail(c, b, toULength, toULimit)) { ++source; ++toULength; c=(c<<6)+b; @@ -5500,22 +5489,18 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } } - if( toULength==toULimit && /* consumed all trail bytes */ - (toULength==3 || toULength==2) && /* BMP */ - (c-=utf8_offsets[toULength])>=utf8_minLegal[toULength] && - (c<=0xd7ff || 0xe000<=c) /* not a surrogate */ - ) { - stage2Entry=MBCS_STAGE_2_FROM_U(table, c); - } else if( - toULength==toULimit && toULength==4 && - (0x10000<=(c-=utf8_offsets[4]) && c<=0x10ffff) - ) { - /* supplementary code point */ - if(!hasSupplementary) { - /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ - stage2Entry=0; - } else { + if(toULength==toULimit) { + c-=utf8_offsets[toULength]; + if(toULength<=3) { /* BMP */ stage2Entry=MBCS_STAGE_2_FROM_U(table, c); + } else { + /* supplementary code point */ + if(!hasSupplementary) { + /* BMP-only codepages are stored without stage 1 entries for supplementary code points */ + stage2Entry=0; + } else { + stage2Entry=MBCS_STAGE_2_FROM_U(table, c); + } } } else { /* error handling: illegal UTF-8 byte sequence */ @@ -5620,7 +5605,7 @@ ucnv_DBCSFromUTF8(UConverterFromUnicodeArgs *pFromUArgs, source<(sourceLimit=(uint8_t *)pToUArgs->sourceLimit)) { c=utf8->toUBytes[0]=b=*source++; toULength=1; - toULimit=U8_COUNT_TRAIL_BYTES(b)+1; + toULimit=U8_COUNT_BYTES(b); while(sourcetoUBytes[toULength++]=b=*source++; c=(c<<6)+b; diff --git a/deps/icu-small/source/common/ucurr.cpp b/deps/icu-small/source/common/ucurr.cpp index 085f994858136d..aa9d855f5022e7 100644 --- a/deps/icu-small/source/common/ucurr.cpp +++ b/deps/icu-small/source/common/ucurr.cpp @@ -25,6 +25,7 @@ #include "uenumimp.h" #include "uhash.h" #include "hash.h" +#include "uinvchar.h" #include "uresimp.h" #include "ulist.h" #include "ureslocs.h" @@ -545,93 +546,97 @@ U_CAPI int32_t U_EXPORT2 ucurr_forLocale(const char* locale, UChar* buff, int32_t buffCapacity, - UErrorCode* ec) -{ - int32_t resLen = 0; - const UChar* s = NULL; - if (ec != NULL && U_SUCCESS(*ec)) { - if ((buff && buffCapacity) || !buffCapacity) { - UErrorCode localStatus = U_ZERO_ERROR; - char id[ULOC_FULLNAME_CAPACITY]; - if ((resLen = uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus))) { - // there is a currency keyword. Try to see if it's valid - if(buffCapacity > resLen) { - /* Normalize the currency keyword value to upper case. */ - T_CString_toUpperCase(id); - u_charsToUChars(id, buff, resLen); - } - } else { - // get country or country_variant in `id' - uint32_t variantType = idForLocale(locale, id, sizeof(id), ec); + UErrorCode* ec) { + if (U_FAILURE(*ec)) { return 0; } + if (buffCapacity < 0 || (buff == nullptr && buffCapacity > 0)) { + *ec = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } - if (U_FAILURE(*ec)) { - return 0; - } + char currency[4]; // ISO currency codes are alpha3 codes. + UErrorCode localStatus = U_ZERO_ERROR; + int32_t resLen = uloc_getKeywordValue(locale, "currency", + currency, UPRV_LENGTHOF(currency), &localStatus); + if (U_SUCCESS(localStatus) && resLen == 3 && uprv_isInvariantString(currency, resLen)) { + if (resLen < buffCapacity) { + T_CString_toUpperCase(currency); + u_charsToUChars(currency, buff, resLen); + } + return u_terminateUChars(buff, buffCapacity, resLen, ec); + } + + // get country or country_variant in `id' + char id[ULOC_FULLNAME_CAPACITY]; + uint32_t variantType = idForLocale(locale, id, UPRV_LENGTHOF(id), ec); + if (U_FAILURE(*ec)) { + return 0; + } #if !UCONFIG_NO_SERVICE - const UChar* result = CReg::get(id); - if (result) { - if(buffCapacity > u_strlen(result)) { - u_strcpy(buff, result); - } - return u_strlen(result); - } + const UChar* result = CReg::get(id); + if (result) { + if(buffCapacity > u_strlen(result)) { + u_strcpy(buff, result); + } + resLen = u_strlen(result); + return u_terminateUChars(buff, buffCapacity, resLen, ec); + } #endif - // Remove variants, which is only needed for registration. - char *idDelim = strchr(id, VAR_DELIM); - if (idDelim) { - idDelim[0] = 0; - } + // Remove variants, which is only needed for registration. + char *idDelim = uprv_strchr(id, VAR_DELIM); + if (idDelim) { + idDelim[0] = 0; + } - // Look up the CurrencyMap element in the root bundle. - UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus); - UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); - UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); - UResourceBundle *currencyReq = ures_getByIndex(countryArray, 0, NULL, &localStatus); + const UChar* s = NULL; // Currency code from data file. + if (id[0] == 0) { + // No point looking in the data for an empty string. + // This is what we would get. + localStatus = U_MISSING_RESOURCE_ERROR; + } else { + // Look up the CurrencyMap element in the root bundle. + localStatus = U_ZERO_ERROR; + UResourceBundle *rb = ures_openDirect(U_ICUDATA_CURR, CURRENCY_DATA, &localStatus); + UResourceBundle *cm = ures_getByKey(rb, CURRENCY_MAP, rb, &localStatus); + UResourceBundle *countryArray = ures_getByKey(rb, id, cm, &localStatus); + UResourceBundle *currencyReq = ures_getByIndex(countryArray, 0, NULL, &localStatus); + s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); + + // Get the second item when PREEURO is requested, and this is a known Euro country. + // If the requested variant is PREEURO, and this isn't a Euro country, + // assume that the country changed over to the Euro in the future. + // This is probably an old version of ICU that hasn't been updated yet. + // The latest currency is probably correct. + if (U_SUCCESS(localStatus)) { + if ((variantType & VARIANT_IS_PREEURO) && u_strcmp(s, EUR_STR) == 0) { + currencyReq = ures_getByIndex(countryArray, 1, currencyReq, &localStatus); s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); - - /* - Get the second item when PREEURO is requested, and this is a known Euro country. - If the requested variant is PREEURO, and this isn't a Euro country, assume - that the country changed over to the Euro in the future. This is probably - an old version of ICU that hasn't been updated yet. The latest currency is - probably correct. - */ - if (U_SUCCESS(localStatus)) { - if ((variantType & VARIANT_IS_PREEURO) && u_strcmp(s, EUR_STR) == 0) { - currencyReq = ures_getByIndex(countryArray, 1, currencyReq, &localStatus); - s = ures_getStringByKey(currencyReq, "id", &resLen, &localStatus); - } - else if ((variantType & VARIANT_IS_EURO)) { - s = EUR_STR; - } - } - ures_close(countryArray); - ures_close(currencyReq); - - if ((U_FAILURE(localStatus)) && strchr(id, '_') != 0) - { - // We don't know about it. Check to see if we support the variant. - uloc_getParent(locale, id, sizeof(id), ec); - *ec = U_USING_FALLBACK_WARNING; - return ucurr_forLocale(id, buff, buffCapacity, ec); - } - else if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) { - // There is nothing to fallback to. Report the failure/warning if possible. - *ec = localStatus; - } - if (U_SUCCESS(*ec)) { - if(buffCapacity > resLen) { - u_strcpy(buff, s); - } - } + } else if ((variantType & VARIANT_IS_EURO)) { + s = EUR_STR; } - return u_terminateUChars(buff, buffCapacity, resLen, ec); - } else { - *ec = U_ILLEGAL_ARGUMENT_ERROR; } + ures_close(currencyReq); + ures_close(countryArray); } - return resLen; + + if ((U_FAILURE(localStatus)) && strchr(id, '_') != 0) { + // We don't know about it. Check to see if we support the variant. + uloc_getParent(locale, id, UPRV_LENGTHOF(id), ec); + *ec = U_USING_FALLBACK_WARNING; + // TODO: Loop over the shortened id rather than recursing and + // looking again for a currency keyword. + return ucurr_forLocale(id, buff, buffCapacity, ec); + } + if (*ec == U_ZERO_ERROR || localStatus != U_ZERO_ERROR) { + // There is nothing to fallback to. Report the failure/warning if possible. + *ec = localStatus; + } + if (U_SUCCESS(*ec)) { + if(buffCapacity > resLen) { + u_strcpy(buff, s); + } + } + return u_terminateUChars(buff, buffCapacity, resLen, ec); } // end registration @@ -648,7 +653,16 @@ static UBool fallback(char *loc) { return FALSE; } UErrorCode status = U_ZERO_ERROR; - uloc_getParent(loc, loc, (int32_t)uprv_strlen(loc), &status); + if (uprv_strcmp(loc, "en_GB") == 0) { + // HACK: See #13368. We need "en_GB" to fall back to "en_001" instead of "en" + // in order to consume the correct data strings. This hack will be removed + // when proper data sink loading is implemented here. + // NOTE: "001" adds 1 char over "GB". However, both call sites allocate + // arrays with length ULOC_FULLNAME_CAPACITY (plenty of room for en_001). + uprv_strcpy(loc + 3, "001"); + } else { + uloc_getParent(loc, loc, (int32_t)uprv_strlen(loc), &status); + } /* char *i = uprv_strrchr(loc, '_'); if (i == NULL) { @@ -2216,6 +2230,7 @@ ucurr_countCurrencies(const char* locale, UErrorCode localStatus = U_ZERO_ERROR; char id[ULOC_FULLNAME_CAPACITY]; uloc_getKeywordValue(locale, "currency", id, ULOC_FULLNAME_CAPACITY, &localStatus); + // get country or country_variant in `id' /*uint32_t variantType =*/ idForLocale(locale, id, sizeof(id), ec); diff --git a/deps/icu-small/source/common/udata.cpp b/deps/icu-small/source/common/udata.cpp index aa23ab719ab6c0..c15cb78a74ad7a 100644 --- a/deps/icu-small/source/common/udata.cpp +++ b/deps/icu-small/source/common/udata.cpp @@ -206,6 +206,8 @@ setCommonICUData(UDataMemory *pData, /* The new common data. Belongs to ca return didUpdate; } +#if U_PLATFORM_HAS_WINUWP_API == 0 + static UBool setCommonICUDataPointer(const void *pData, UBool /*warn*/, UErrorCode *pErrorCode) { UDataMemory tData; @@ -215,6 +217,8 @@ setCommonICUDataPointer(const void *pData, UBool /*warn*/, UErrorCode *pErrorCod return setCommonICUData(&tData, FALSE, pErrorCode); } +#endif + static const char * findBasename(const char *path) { const char *basename=uprv_strrchr(path, U_FILE_SEP_CHAR); @@ -982,7 +986,7 @@ static UDataMemory *doLoadFromIndividualFiles(const char *pkgName, /* init path iterator for individual files */ UDataPathIterator iter(dataPath, pkgName, path, tocEntryPathSuffix, FALSE, pErrorCode); - while((pathBuffer = iter.next(pErrorCode))) + while((pathBuffer = iter.next(pErrorCode)) != NULL) { #ifdef UDATA_DEBUG fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer); @@ -1165,7 +1169,7 @@ doOpenChoice(const char *path, const char *type, const char *name, if(uprv_strchr(path,U_FILE_ALT_SEP_CHAR) != NULL) { altSepPath.append(path, *pErrorCode); char *p; - while((p=uprv_strchr(altSepPath.data(), U_FILE_ALT_SEP_CHAR))) { + while ((p = uprv_strchr(altSepPath.data(), U_FILE_ALT_SEP_CHAR)) != NULL) { *p = U_FILE_SEP_CHAR; } #if defined (UDATA_DEBUG) diff --git a/deps/icu-small/source/common/uhash.cpp b/deps/icu-small/source/common/uhash.cpp index 0e2a3c03c62f50..a80e7b8ff27b42 100644 --- a/deps/icu-small/source/common/uhash.cpp +++ b/deps/icu-small/source/common/uhash.cpp @@ -79,14 +79,14 @@ * prime number while being less than a power of two. */ static const int32_t PRIMES[] = { - 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, + 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647 /*, 4294967291 */ }; #define PRIMES_LENGTH UPRV_LENGTHOF(PRIMES) -#define DEFAULT_PRIME_INDEX 3 +#define DEFAULT_PRIME_INDEX 4 /* These ratios are tuned to the PRIMES array such that a resize * places the table back into the zone of non-resizing. That is, @@ -570,6 +570,22 @@ uhash_init(UHashtable *fillinResult, return _uhash_init(fillinResult, keyHash, keyComp, valueComp, DEFAULT_PRIME_INDEX, status); } +U_CAPI UHashtable* U_EXPORT2 +uhash_initSize(UHashtable *fillinResult, + UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + int32_t size, + UErrorCode *status) { + + // Find the smallest index i for which PRIMES[i] >= size. + int32_t i = 0; + while (i<(PRIMES_LENGTH-1) && PRIMES[i](ustr_hashCharsN(s, uprv_strlen(s))); } U_CAPI int32_t U_EXPORT2 diff --git a/deps/icu-small/source/common/uhash.h b/deps/icu-small/source/common/uhash.h index 2e7cf6a394c912..b59d2711bb29d0 100644 --- a/deps/icu-small/source/common/uhash.h +++ b/deps/icu-small/source/common/uhash.h @@ -231,6 +231,25 @@ uhash_init(UHashtable *hash, UValueComparator *valueComp, UErrorCode *status); +/** + * Initialize an existing UHashtable. + * @param keyHash A pointer to the key hashing function. Must not be + * NULL. + * @param keyComp A pointer to the function that compares keys. Must + * not be NULL. + * @param size The initial capacity of this hash table. + * @param status A pointer to an UErrorCode to receive any errors. + * @return A pointer to a UHashtable, or 0 if an error occurred. + * @see uhash_openSize + */ +U_CAPI UHashtable* U_EXPORT2 +uhash_initSize(UHashtable *hash, + UHashFunction *keyHash, + UKeyComparator *keyComp, + UValueComparator *valueComp, + int32_t size, + UErrorCode *status); + /** * Close a UHashtable, releasing the memory used. * @param hash The UHashtable to close. If hash is NULL no operation is performed. diff --git a/deps/icu-small/source/common/uinvchar.cpp b/deps/icu-small/source/common/uinvchar.cpp index ed1ab8e761eef6..eafb951e38a67c 100644 --- a/deps/icu-small/source/common/uinvchar.cpp +++ b/deps/icu-small/source/common/uinvchar.cpp @@ -573,7 +573,7 @@ uprv_aestrncpy(uint8_t *dst, const uint8_t *src, int32_t n) uint8_t *orig_dst = dst; if(n==-1) { - n = uprv_strlen((const char*)src)+1; /* copy NUL */ + n = static_cast(uprv_strlen((const char*)src)+1); /* copy NUL */ } /* copy non-null */ while(*src && n>0) { @@ -594,7 +594,7 @@ uprv_eastrncpy(uint8_t *dst, const uint8_t *src, int32_t n) uint8_t *orig_dst = dst; if(n==-1) { - n = uprv_strlen((const char*)src)+1; /* copy NUL */ + n = static_cast(uprv_strlen((const char*)src)+1); /* copy NUL */ } /* copy non-null */ while(*src && n>0) { diff --git a/deps/icu-small/source/common/ulist.cpp b/deps/icu-small/source/common/ulist.cpp index d4549328ea55fb..07cbcc8303ac91 100644 --- a/deps/icu-small/source/common/ulist.cpp +++ b/deps/icu-small/source/common/ulist.cpp @@ -252,7 +252,7 @@ U_CAPI const char * U_EXPORT2 ulist_next_keyword_value(UEnumeration *en, int32_t s = (const char *)ulist_getNext((UList *)(en->context)); if (s != NULL && resultLength != NULL) { - *resultLength = uprv_strlen(s); + *resultLength = static_cast(uprv_strlen(s)); } return s; } diff --git a/deps/icu-small/source/common/uloc.cpp b/deps/icu-small/source/common/uloc.cpp index 4d854bbcca320e..7a1dc723cff619 100644 --- a/deps/icu-small/source/common/uloc.cpp +++ b/deps/icu-small/source/common/uloc.cpp @@ -98,6 +98,7 @@ locale_getKeywords(const char *localeID, */ /* Generated using org.unicode.cldr.icu.GenerateISO639LanguageTables */ /* ISO639 table version is 20150505 */ +/* Subsequent hand addition of selected languages */ static const char * const LANGUAGES[] = { "aa", "ab", "ace", "ach", "ada", "ady", "ae", "aeb", "af", "afh", "agq", "ain", "ak", "akk", "akz", "ale", @@ -109,7 +110,7 @@ static const char * const LANGUAGES[] = { "bgn", "bho", "bi", "bik", "bin", "bjn", "bkm", "bla", "bm", "bn", "bo", "bpy", "bqi", "br", "bra", "brh", "brx", "bs", "bss", "bua", "bug", "bum", "byn", "byv", - "ca", "cad", "car", "cay", "cch", "ce", "ceb", "cgg", + "ca", "cad", "car", "cay", "cch", "ccp", "ce", "ceb", "cgg", "ch", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "ckb", "co", "cop", "cps", "cr", "crh", "cs", "csb", "cu", "cv", "cy", @@ -213,6 +214,7 @@ static const char* const REPLACEMENT_LANGUAGES[]={ */ /* Generated using org.unicode.cldr.icu.GenerateISO639LanguageTables */ /* ISO639 table version is 20150505 */ +/* Subsequent hand addition of selected languages */ static const char * const LANGUAGES_3[] = { "aar", "abk", "ace", "ach", "ada", "ady", "ave", "aeb", "afr", "afh", "agq", "ain", "aka", "akk", "akz", "ale", @@ -224,7 +226,7 @@ static const char * const LANGUAGES_3[] = { "bgn", "bho", "bis", "bik", "bin", "bjn", "bkm", "bla", "bam", "ben", "bod", "bpy", "bqi", "bre", "bra", "brh", "brx", "bos", "bss", "bua", "bug", "bum", "byn", "byv", - "cat", "cad", "car", "cay", "cch", "che", "ceb", "cgg", + "cat", "cad", "car", "cay", "cch", "ccp", "che", "ceb", "cgg", "cha", "chb", "chg", "chk", "chm", "chn", "cho", "chp", "chr", "chy", "ckb", "cos", "cop", "cps", "cre", "crh", "ces", "csb", "chu", "chv", "cym", @@ -529,14 +531,16 @@ static const VariantMap VARIANT_MAP[] = { #define _hasBCP47Extension(id) (id && uprv_strstr(id, "@") == NULL && getShortestSubtagLength(localeID) == 1) /* Converts the BCP47 id to Unicode id. Does nothing to id if conversion fails */ #define _ConvertBCP47(finalID, id, buffer, length,err) \ - if (uloc_forLanguageTag(id, buffer, length, NULL, err) <= 0 || U_FAILURE(*err)) { \ + if (uloc_forLanguageTag(id, buffer, length, NULL, err) <= 0 || \ + U_FAILURE(*err) || *err == U_STRING_NOT_TERMINATED_WARNING) { \ finalID=id; \ + if (*err == U_STRING_NOT_TERMINATED_WARNING) { *err = U_BUFFER_OVERFLOW_ERROR; } \ } else { \ finalID=buffer; \ } /* Gets the size of the shortest subtag in the given localeID. */ static int32_t getShortestSubtagLength(const char *localeID) { - int32_t localeIDLength = uprv_strlen(localeID); + int32_t localeIDLength = static_cast(uprv_strlen(localeID)); int32_t length = localeIDLength; int32_t tmpLength = 0; int32_t i; @@ -2486,7 +2490,7 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable, #if defined(ULOC_DEBUG) fprintf(stderr,"%02d: %s\n", i, acceptList[i]); #endif - while((l=uenum_next(availableLocales, NULL, status))) { + while((l=uenum_next(availableLocales, NULL, status)) != NULL) { #if defined(ULOC_DEBUG) fprintf(stderr," %s\n", l); #endif @@ -2526,7 +2530,7 @@ uloc_acceptLanguage(char *result, int32_t resultAvailable, #if defined(ULOC_DEBUG) fprintf(stderr,"Try: [%s]", fallbackList[i]); #endif - while((l=uenum_next(availableLocales, NULL, status))) { + while((l=uenum_next(availableLocales, NULL, status)) != NULL) { #if defined(ULOC_DEBUG) fprintf(stderr," %s\n", l); #endif diff --git a/deps/icu-small/source/common/uloc_tag.cpp b/deps/icu-small/source/common/uloc_tag.cpp index 856407defe1ea1..f8337ec02476c4 100644 --- a/deps/icu-small/source/common/uloc_tag.cpp +++ b/deps/icu-small/source/common/uloc_tag.cpp @@ -1022,7 +1022,7 @@ _appendKeywordsToLanguageTag(const char* localeID, char* appendAt, int32_t capac no known mapping. This implementation normalizes the the value to lower case */ - int32_t bcpValueLen = uprv_strlen(bcpValue); + int32_t bcpValueLen = static_cast(uprv_strlen(bcpValue)); if (bcpValueLen < extBufCapacity) { uprv_strcpy(pExtBuf, bcpValue); T_CString_toLowerCase(pExtBuf); @@ -1288,7 +1288,7 @@ _appendLDMLExtensionAsKeywords(const char* ldmlext, ExtensionListEntry** appendT bufIdx++; } - len = uprv_strlen(attr->attribute); + len = static_cast(uprv_strlen(attr->attribute)); uprv_memcpy(buf + bufIdx, attr->attribute, len); bufIdx += len; @@ -1841,7 +1841,7 @@ ultag_parse(const char* tag, int32_t tagLen, int32_t* parsedLen, UErrorCode* sta int32_t newTagLength; grandfatheredLen = tagLen; /* back up for output parsedLen */ - newTagLength = uprv_strlen(GRANDFATHERED[i+1]); + newTagLength = static_cast(uprv_strlen(GRANDFATHERED[i+1])); if (tagLen < newTagLength) { uprv_free(tagBuf); tagBuf = (char*)uprv_malloc(newTagLength + 1); diff --git a/deps/icu-small/source/common/umapfile.cpp b/deps/icu-small/source/common/umapfile.cpp index 749a84321886d0..5084913cbf742a 100644 --- a/deps/icu-small/source/common/umapfile.cpp +++ b/deps/icu-small/source/common/umapfile.cpp @@ -102,9 +102,6 @@ { HANDLE map; HANDLE file; - SECURITY_ATTRIBUTES mappingAttributes; - SECURITY_ATTRIBUTES *mappingAttributesPtr = NULL; - SECURITY_DESCRIPTOR securityDesc; UDataMemory_init(pData); /* Clear the output struct. */ @@ -143,6 +140,11 @@ This is required for multiuser systems on Windows 2000 SP4 and beyond */ // TODO: UWP does not have this function and I do not think it is required? #if U_PLATFORM_HAS_WINUWP_API == 0 + + SECURITY_ATTRIBUTES mappingAttributes; + SECURITY_ATTRIBUTES *mappingAttributesPtr = NULL; + SECURITY_DESCRIPTOR securityDesc; + if (InitializeSecurityDescriptor(&securityDesc, SECURITY_DESCRIPTOR_REVISION)) { /* give the security descriptor a Null Dacl done using the "TRUE, (PACL)NULL" here */ if (SetSecurityDescriptorDacl(&securityDesc, TRUE, (PACL)NULL, FALSE)) { diff --git a/deps/icu-small/source/common/umutex.cpp b/deps/icu-small/source/common/umutex.cpp index 12bd7575d66b44..cbbd66cb5a8a65 100644 --- a/deps/icu-small/source/common/umutex.cpp +++ b/deps/icu-small/source/common/umutex.cpp @@ -132,7 +132,7 @@ umtx_condBroadcast(UConditionVar *condition) { } U_CAPI void U_EXPORT2 -umtx_condSignal(UConditionVar *condition) { +umtx_condSignal(UConditionVar * /* condition */) { // Function not implemented. There is no immediate requirement from ICU to have it. // Once ICU drops support for Windows XP and Server 2003, ICU Condition Variables will be // changed to be thin wrappers on native Windows CONDITION_VARIABLEs, and this function diff --git a/deps/icu-small/source/common/unicode/brkiter.h b/deps/icu-small/source/common/unicode/brkiter.h index b1e4cc68c6dbef..9c1ac7531bc60d 100644 --- a/deps/icu-small/source/common/unicode/brkiter.h +++ b/deps/icu-small/source/common/unicode/brkiter.h @@ -250,7 +250,7 @@ class U_COMMON_API BreakIterator : public UObject { virtual int32_t next(void) = 0; /** - * Return character index of the current interator position within the text. + * Return character index of the current iterator position within the text. * @return The boundary most recently returned. * @stable ICU 2.0 */ @@ -277,7 +277,7 @@ class U_COMMON_API BreakIterator : public UObject { virtual int32_t preceding(int32_t offset) = 0; /** - * Return true if the specfied position is a boundary position. + * Return true if the specified position is a boundary position. * As a side effect, the current position of the iterator is set * to the first boundary position at or following the specified offset. * @param offset the offset to check. @@ -331,7 +331,7 @@ class U_COMMON_API BreakIterator : public UObject { * @param fillInVec an array to be filled in with the status values. * @param capacity the length of the supplied vector. A length of zero causes * the function to return the number of status values, in the - * normal way, without attemtping to store any values. + * normal way, without attempting to store any values. * @param status receives error codes. * @return The number of rule status values from rules that determined * the most recent boundary returned by the break iterator. @@ -469,7 +469,7 @@ class U_COMMON_API BreakIterator : public UObject { static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); /** - * Get name of the object for the desired Locale, in the desired langauge. + * Get name of the object for the desired Locale, in the desired language. * @param objectLocale must be from getAvailableLocales. * @param displayLocale specifies the desired locale for output. * @param name the fill-in parameter of the return value @@ -482,7 +482,7 @@ class U_COMMON_API BreakIterator : public UObject { UnicodeString& name); /** - * Get name of the object for the desired Locale, in the langauge of the + * Get name of the object for the desired Locale, in the language of the * default locale. * @param objectLocale must be from getMatchingLocales * @param name the fill-in parameter of the return value @@ -629,10 +629,12 @@ class U_COMMON_API BreakIterator : public UObject { /** @internal */ BreakIterator(); /** @internal */ - BreakIterator (const BreakIterator &other) : UObject(other) {} + BreakIterator (const BreakIterator &other); #ifndef U_HIDE_INTERNAL_API /** @internal */ - BreakIterator (const Locale& valid, const Locale& actual); + BreakIterator (const Locale& valid, const Locale &actual); + /** @internal. Assignment Operator, used by RuleBasedBreakIterator. */ + BreakIterator &operator = (const BreakIterator &other); #endif /* U_HIDE_INTERNAL_API */ private: @@ -640,12 +642,6 @@ class U_COMMON_API BreakIterator : public UObject { /** @internal */ char actualLocale[ULOC_FULLNAME_CAPACITY]; char validLocale[ULOC_FULLNAME_CAPACITY]; - - /** - * The assignment operator has no real implementation. - * It's provided to make the compiler happy. Do not call. - */ - BreakIterator& operator=(const BreakIterator&); }; #ifndef U_HIDE_DEPRECATED_API @@ -661,5 +657,5 @@ U_NAMESPACE_END #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ -#endif // _BRKITER +#endif // BRKITER_H //eof diff --git a/deps/icu-small/source/common/unicode/bytestream.h b/deps/icu-small/source/common/unicode/bytestream.h index 477892b2759768..9df23f79c54c0c 100644 --- a/deps/icu-small/source/common/unicode/bytestream.h +++ b/deps/icu-small/source/common/unicode/bytestream.h @@ -126,8 +126,8 @@ class U_COMMON_API ByteSink : public UMemory { virtual void Flush(); private: - ByteSink(const ByteSink &); // copy constructor not implemented - ByteSink &operator=(const ByteSink &); // assignment operator not implemented + ByteSink(const ByteSink &) = delete; + ByteSink &operator=(const ByteSink &) = delete; }; // ------------------------------------------------------------- @@ -217,9 +217,10 @@ class U_COMMON_API CheckedArrayByteSink : public ByteSink { int32_t size_; int32_t appended_; UBool overflowed_; - CheckedArrayByteSink(); ///< default constructor not implemented - CheckedArrayByteSink(const CheckedArrayByteSink &); ///< copy constructor not implemented - CheckedArrayByteSink &operator=(const CheckedArrayByteSink &); ///< assignment operator not implemented + + CheckedArrayByteSink() = delete; + CheckedArrayByteSink(const CheckedArrayByteSink &) = delete; + CheckedArrayByteSink &operator=(const CheckedArrayByteSink &) = delete; }; /** @@ -236,6 +237,21 @@ class StringByteSink : public ByteSink { * @stable ICU 4.2 */ StringByteSink(StringClass* dest) : dest_(dest) { } +#ifndef U_HIDE_DRAFT_API + /** + * Constructs a ByteSink that reserves append capacity and will append bytes to the dest string. + * + * @param dest pointer to string object to append to + * @param initialAppendCapacity capacity beyond dest->length() to be reserve()d + * @draft ICU 60 + */ + StringByteSink(StringClass* dest, int32_t initialAppendCapacity) : dest_(dest) { + if (initialAppendCapacity > 0 && + (uint32_t)initialAppendCapacity > (dest->capacity() - dest->length())) { + dest->reserve(dest->length() + initialAppendCapacity); + } + } +#endif // U_HIDE_DRAFT_API /** * Append "bytes[0,n-1]" to this. * @param data the pointer to the bytes @@ -245,9 +261,10 @@ class StringByteSink : public ByteSink { virtual void Append(const char* data, int32_t n) { dest_->append(data, n); } private: StringClass* dest_; - StringByteSink(); ///< default constructor not implemented - StringByteSink(const StringByteSink &); ///< copy constructor not implemented - StringByteSink &operator=(const StringByteSink &); ///< assignment operator not implemented + + StringByteSink() = delete; + StringByteSink(const StringByteSink &) = delete; + StringByteSink &operator=(const StringByteSink &) = delete; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/casemap.h b/deps/icu-small/source/common/unicode/casemap.h index 98184820d53457..4a4917bdcaf1b7 100644 --- a/deps/icu-small/source/common/unicode/casemap.h +++ b/deps/icu-small/source/common/unicode/casemap.h @@ -8,6 +8,7 @@ #define __CASEMAP_H__ #include "unicode/utypes.h" +#include "unicode/stringpiece.h" #include "unicode/uobject.h" /** @@ -20,6 +21,7 @@ U_NAMESPACE_BEGIN #ifndef U_HIDE_DRAFT_API class BreakIterator; +class ByteSink; class Edits; /** @@ -36,7 +38,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The source string and the destination buffer must not overlap. * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. * @param dest A buffer for the result string. The result will be NUL-terminated if @@ -48,7 +50,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -71,7 +74,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The source string and the destination buffer must not overlap. * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. * @param dest A buffer for the result string. The result will be NUL-terminated if @@ -83,7 +86,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -112,8 +116,10 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * all others. (This can be modified with options bits.) * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, - * U_TITLECASE_NO_LOWERCASE, U_TITLECASE_NO_BREAK_ADJUSTMENT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. * @param iter A break iterator to find the first characters of words that are to be titlecased. * It is set to the source string (setText()) * and used one or more times for iteration (first() and next()). @@ -130,7 +136,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -159,7 +166,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The result may be longer or shorter than the original. * The source string and the destination buffer must not overlap. * - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, * U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. @@ -172,7 +179,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -188,6 +196,129 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { char16_t *dest, int32_t destCapacity, Edits *edits, UErrorCode &errorCode); + /** + * Lowercases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8ToLower + * @draft ICU 60 + */ + static void utf8ToLower( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + + /** + * Uppercases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8ToUpper + * @draft ICU 60 + */ + static void utf8ToUpper( + const char *locale, uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + +#if !UCONFIG_NO_BREAK_ITERATION + + /** + * Titlecases a UTF-8 string and optionally records edits. + * Casing is locale-dependent and context-sensitive. + * The result may be longer or shorter than the original. + * + * Titlecasing uses a break iterator to find the first characters of words + * that are to be titlecased. It titlecases those characters and lowercases + * all others. (This can be modified with options bits.) + * + * @param locale The locale ID. ("" = root locale, NULL = default locale.) + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. + * @param iter A break iterator to find the first characters of words that are to be titlecased. + * It is set to the source string (setUText()) + * and used one or more times for iteration (first() and next()). + * If NULL, then a word break iterator for the locale is used + * (or something equivalent). + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8ToTitle + * @draft ICU 60 + */ + static void utf8ToTitle( + const char *locale, uint32_t options, BreakIterator *iter, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + +#endif // UCONFIG_NO_BREAK_ITERATION + + /** + * Case-folds a UTF-8 string and optionally records edits. + * + * Case folding is locale-independent and not context-sensitive, + * but there is an option for whether to include or exclude mappings for dotted I + * and dotless i that are marked with 'T' in CaseFolding.txt. + * + * The result may be longer or shorter than the original. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src The original string. + * @param sink A ByteSink to which the result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. + * @param errorCode Reference to an in/out error code value + * which must not indicate a failure before the function call. + * + * @see ucasemap_utf8FoldCase + * @draft ICU 60 + */ + static void utf8Fold( + uint32_t options, + StringPiece src, ByteSink &sink, Edits *edits, + UErrorCode &errorCode); + /** * Lowercases a UTF-8 string and optionally records edits. * Casing is locale-dependent and context-sensitive. @@ -195,7 +326,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The source string and the destination buffer must not overlap. * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. * @param dest A buffer for the result string. The result will be NUL-terminated if @@ -207,7 +338,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -217,7 +349,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @see ucasemap_utf8ToLower * @draft ICU 59 */ - static int32_t utf8ToLower( + static int32_t utf8ToLower( const char *locale, uint32_t options, const char *src, int32_t srcLength, char *dest, int32_t destCapacity, Edits *edits, @@ -230,7 +362,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The source string and the destination buffer must not overlap. * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. * @param dest A buffer for the result string. The result will be NUL-terminated if @@ -242,7 +374,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -271,10 +404,12 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * all others. (This can be modified with options bits.) * * @param locale The locale ID. ("" = root locale, NULL = default locale.) - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, - * U_TITLECASE_NO_LOWERCASE, U_TITLECASE_NO_BREAK_ADJUSTMENT. + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, + * U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. * @param iter A break iterator to find the first characters of words that are to be titlecased. - * It is set to the source string (setText()) + * It is set to the source string (setUText()) * and used one or more times for iteration (first() and next()). * If NULL, then a word break iterator for the locale is used * (or something equivalent). @@ -289,7 +424,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. @@ -317,7 +453,7 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * The result may be longer or shorter than the original. * The source string and the destination buffer must not overlap. * - * @param options Options bit set, usually 0. See UCASEMAP_OMIT_UNCHANGED_TEXT, + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT, U_EDITS_NO_RESET, * U_FOLD_CASE_DEFAULT, U_FOLD_CASE_EXCLUDE_SPECIAL_I. * @param src The original string. * @param srcLength The length of the original string. If -1, then src must be NUL-terminated. @@ -330,7 +466,8 @@ class U_COMMON_API CaseMap U_FINAL : public UMemory { * @param edits Records edits for index mapping, working with styled text, * and getting only changes (if any). * The Edits contents is undefined if any error occurs. - * This function calls edits->reset() first. edits can be NULL. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be NULL. * @param errorCode Reference to an in/out error code value * which must not indicate a failure before the function call. * @return The length of the result string, if successful. diff --git a/deps/icu-small/source/common/unicode/char16ptr.h b/deps/icu-small/source/common/unicode/char16ptr.h index fa17c62446cfb0..fbce1775911518 100644 --- a/deps/icu-small/source/common/unicode/char16ptr.h +++ b/deps/icu-small/source/common/unicode/char16ptr.h @@ -95,45 +95,45 @@ class U_COMMON_API Char16Ptr U_FINAL { return reinterpret_cast(t); } - char16_t *p; + char16_t *p_; #else union { char16_t *cp; uint16_t *up; wchar_t *wp; - } u; + } u_; #endif }; #ifdef U_ALIASING_BARRIER -Char16Ptr::Char16Ptr(char16_t *p) : p(p) {} +Char16Ptr::Char16Ptr(char16_t *p) : p_(p) {} #if !U_CHAR16_IS_TYPEDEF -Char16Ptr::Char16Ptr(uint16_t *p) : p(cast(p)) {} +Char16Ptr::Char16Ptr(uint16_t *p) : p_(cast(p)) {} #endif #if U_SIZEOF_WCHAR_T==2 -Char16Ptr::Char16Ptr(wchar_t *p) : p(cast(p)) {} +Char16Ptr::Char16Ptr(wchar_t *p) : p_(cast(p)) {} #endif -Char16Ptr::Char16Ptr(std::nullptr_t p) : p(p) {} +Char16Ptr::Char16Ptr(std::nullptr_t p) : p_(p) {} Char16Ptr::~Char16Ptr() { - U_ALIASING_BARRIER(p); + U_ALIASING_BARRIER(p_); } -char16_t *Char16Ptr::get() const { return p; } +char16_t *Char16Ptr::get() const { return p_; } #else -Char16Ptr::Char16Ptr(char16_t *p) { u.cp = p; } +Char16Ptr::Char16Ptr(char16_t *p) { u_.cp = p; } #if !U_CHAR16_IS_TYPEDEF -Char16Ptr::Char16Ptr(uint16_t *p) { u.up = p; } +Char16Ptr::Char16Ptr(uint16_t *p) { u_.up = p; } #endif #if U_SIZEOF_WCHAR_T==2 -Char16Ptr::Char16Ptr(wchar_t *p) { u.wp = p; } +Char16Ptr::Char16Ptr(wchar_t *p) { u_.wp = p; } #endif -Char16Ptr::Char16Ptr(std::nullptr_t p) { u.cp = p; } +Char16Ptr::Char16Ptr(std::nullptr_t p) { u_.cp = p; } Char16Ptr::~Char16Ptr() {} -char16_t *Char16Ptr::get() const { return u.cp; } +char16_t *Char16Ptr::get() const { return u_.cp; } #endif @@ -203,45 +203,45 @@ class U_COMMON_API ConstChar16Ptr U_FINAL { return reinterpret_cast(t); } - const char16_t *p; + const char16_t *p_; #else union { const char16_t *cp; const uint16_t *up; const wchar_t *wp; - } u; + } u_; #endif }; #ifdef U_ALIASING_BARRIER -ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p(p) {} +ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p_(p) {} #if !U_CHAR16_IS_TYPEDEF -ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) : p(cast(p)) {} +ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) : p_(cast(p)) {} #endif #if U_SIZEOF_WCHAR_T==2 -ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) : p(cast(p)) {} +ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) : p_(cast(p)) {} #endif -ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) : p(p) {} +ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) : p_(p) {} ConstChar16Ptr::~ConstChar16Ptr() { - U_ALIASING_BARRIER(p); + U_ALIASING_BARRIER(p_); } -const char16_t *ConstChar16Ptr::get() const { return p; } +const char16_t *ConstChar16Ptr::get() const { return p_; } #else -ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) { u.cp = p; } +ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) { u_.cp = p; } #if !U_CHAR16_IS_TYPEDEF -ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) { u.up = p; } +ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) { u_.up = p; } #endif #if U_SIZEOF_WCHAR_T==2 -ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) { u.wp = p; } +ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) { u_.wp = p; } #endif -ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) { u.cp = p; } +ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) { u_.cp = p; } ConstChar16Ptr::~ConstChar16Ptr() {} -const char16_t *ConstChar16Ptr::get() const { return u.cp; } +const char16_t *ConstChar16Ptr::get() const { return u_.cp; } #endif diff --git a/deps/icu-small/source/common/unicode/docmain.h b/deps/icu-small/source/common/unicode/docmain.h index 6e59f3e3887e6d..3e645aee4a87fb 100644 --- a/deps/icu-small/source/common/unicode/docmain.h +++ b/deps/icu-small/source/common/unicode/docmain.h @@ -140,7 +140,7 @@ * * Number Formatting * unum.h - * icu::NumberFormat + * icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions) * * * Number Spellout
    (Rule Based Number Formatting) diff --git a/deps/icu-small/source/common/unicode/edits.h b/deps/icu-small/source/common/unicode/edits.h index 8d3becb7a2a580..082c3733a88bda 100644 --- a/deps/icu-small/source/common/unicode/edits.h +++ b/deps/icu-small/source/common/unicode/edits.h @@ -36,19 +36,61 @@ class U_COMMON_API Edits U_FINAL : public UMemory { * @draft ICU 59 */ Edits() : - array(stackArray), capacity(STACK_CAPACITY), length(0), delta(0), - errorCode(U_ZERO_ERROR) {} + array(stackArray), capacity(STACK_CAPACITY), length(0), delta(0), numChanges(0), + errorCode_(U_ZERO_ERROR) {} + /** + * Copy constructor. + * @param other source edits + * @draft ICU 60 + */ + Edits(const Edits &other) : + array(stackArray), capacity(STACK_CAPACITY), length(other.length), + delta(other.delta), numChanges(other.numChanges), + errorCode_(other.errorCode_) { + copyArray(other); + } + /** + * Move constructor, might leave src empty. + * This object will have the same contents that the source object had. + * @param src source edits + * @draft ICU 60 + */ + Edits(Edits &&src) U_NOEXCEPT : + array(stackArray), capacity(STACK_CAPACITY), length(src.length), + delta(src.delta), numChanges(src.numChanges), + errorCode_(src.errorCode_) { + moveArray(src); + } + /** * Destructor. * @draft ICU 59 */ ~Edits(); + /** + * Assignment operator. + * @param other source edits + * @return *this + * @draft ICU 60 + */ + Edits &operator=(const Edits &other); + + /** + * Move assignment operator, might leave src empty. + * This object will have the same contents that the source object had. + * The behavior is undefined if *this and src are the same object. + * @param src source edits + * @return *this + * @draft ICU 60 + */ + Edits &operator=(Edits &&src) U_NOEXCEPT; + /** * Resets the data but may not release memory. * @draft ICU 59 */ - void reset(); + void reset() U_NOEXCEPT; /** * Adds a record for an unchanged segment of text. @@ -66,6 +108,9 @@ class U_COMMON_API Edits U_FINAL : public UMemory { * Sets the UErrorCode if an error occurred while recording edits. * Preserves older error codes in the outErrorCode. * Normally called from inside ICU string transformation functions, not user code. + * @param outErrorCode Set to an error code if it does not contain one already + * and an error occurred while recording edits. + * Otherwise unchanged. * @return TRUE if U_FAILURE(outErrorCode) * @draft ICU 59 */ @@ -81,7 +126,13 @@ class U_COMMON_API Edits U_FINAL : public UMemory { * @return TRUE if there are any change edits * @draft ICU 59 */ - UBool hasChanges() const; + UBool hasChanges() const { return numChanges != 0; } + + /** + * @return the number of change edits + * @draft ICU 60 + */ + int32_t numberOfChanges() const { return numChanges; } /** * Access to the list of edits. @@ -90,6 +141,15 @@ class U_COMMON_API Edits U_FINAL : public UMemory { * @draft ICU 59 */ struct U_COMMON_API Iterator U_FINAL : public UMemory { + /** + * Default constructor, empty iterator. + * @draft ICU 60 + */ + Iterator() : + array(nullptr), index(0), length(0), + remaining(0), onlyChanges_(FALSE), coarse(FALSE), + dir(0), changed(FALSE), oldLength_(0), newLength_(0), + srcIndex(0), replIndex(0), destIndex(0) {} /** * Copy constructor. * @draft ICU 59 @@ -103,6 +163,9 @@ class U_COMMON_API Edits U_FINAL : public UMemory { /** * Advances to the next edit. + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) * @return TRUE if there is another edit * @draft ICU 59 */ @@ -121,10 +184,86 @@ class U_COMMON_API Edits U_FINAL : public UMemory { * if the source index is out of bounds for the source string. * * @param i source index + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) * @return TRUE if the edit for the source index was found * @draft ICU 59 */ - UBool findSourceIndex(int32_t i, UErrorCode &errorCode); + UBool findSourceIndex(int32_t i, UErrorCode &errorCode) { + return findIndex(i, TRUE, errorCode) == 0; + } + + /** + * Finds the edit that contains the destination index. + * The destination index may be found in a non-change + * even if normal iteration would skip non-changes. + * Normal iteration can continue from a found edit. + * + * The iterator state before this search logically does not matter. + * (It may affect the performance of the search.) + * + * The iterator state after this search is undefined + * if the source index is out of bounds for the source string. + * + * @param i destination index + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) + * @return TRUE if the edit for the destination index was found + * @draft ICU 60 + */ + UBool findDestinationIndex(int32_t i, UErrorCode &errorCode) { + return findIndex(i, FALSE, errorCode) == 0; + } + + /** + * Returns the destination index corresponding to the given source index. + * If the source index is inside a change edit (not at its start), + * then the destination index at the end of that edit is returned, + * since there is no information about index mapping inside a change edit. + * + * (This means that indexes to the start and middle of an edit, + * for example around a grapheme cluster, are mapped to indexes + * encompassing the entire edit. + * The alternative, mapping an interior index to the start, + * would map such an interval to an empty one.) + * + * This operation will usually but not always modify this object. + * The iterator state after this search is undefined. + * + * @param i source index + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) + * @return destination index; undefined if i is not 0..string length + * @draft ICU 60 + */ + int32_t destinationIndexFromSourceIndex(int32_t i, UErrorCode &errorCode); + + /** + * Returns the source index corresponding to the given destination index. + * If the destination index is inside a change edit (not at its start), + * then the source index at the end of that edit is returned, + * since there is no information about index mapping inside a change edit. + * + * (This means that indexes to the start and middle of an edit, + * for example around a grapheme cluster, are mapped to indexes + * encompassing the entire edit. + * The alternative, mapping an interior index to the start, + * would map such an interval to an empty one.) + * + * This operation will usually but not always modify this object. + * The iterator state after this search is undefined. + * + * @param i destination index + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) + * @return source index; undefined if i is not 0..string length + * @draft ICU 60 + */ + int32_t sourceIndexFromDestinationIndex(int32_t i, UErrorCode &errorCode); /** * @return TRUE if this edit replaces oldLength() units with newLength() different ones. @@ -167,15 +306,22 @@ class U_COMMON_API Edits U_FINAL : public UMemory { Iterator(const uint16_t *a, int32_t len, UBool oc, UBool crs); int32_t readLength(int32_t head); - void updateIndexes(); + void updateNextIndexes(); + void updatePreviousIndexes(); UBool noNext(); UBool next(UBool onlyChanges, UErrorCode &errorCode); + UBool previous(UErrorCode &errorCode); + /** @return -1: error or i<0; 0: found; 1: i>=string length */ + int32_t findIndex(int32_t i, UBool findSource, UErrorCode &errorCode); const uint16_t *array; int32_t index, length; + // 0 if we are not within compressed equal-length changes. + // Otherwise the number of remaining changes, including the current one. int32_t remaining; UBool onlyChanges_, coarse; + int8_t dir; // iteration direction: back(<0), initial(0), forward(>0) UBool changed; int32_t oldLength_, newLength_; int32_t srcIndex, replIndex, destIndex; @@ -219,9 +365,39 @@ class U_COMMON_API Edits U_FINAL : public UMemory { return Iterator(array, length, FALSE, FALSE); } + /** + * Merges the two input Edits and appends the result to this object. + * + * Consider two string transformations (for example, normalization and case mapping) + * where each records Edits in addition to writing an output string.
    + * Edits ab reflect how substrings of input string a + * map to substrings of intermediate string b.
    + * Edits bc reflect how substrings of intermediate string b + * map to substrings of output string c.
    + * This function merges ab and bc such that the additional edits + * recorded in this object reflect how substrings of input string a + * map to substrings of output string c. + * + * If unrelated Edits are passed in where the output string of the first + * has a different length than the input string of the second, + * then a U_ILLEGAL_ARGUMENT_ERROR is reported. + * + * @param ab reflects how substrings of input string a + * map to substrings of intermediate string b. + * @param bc reflects how substrings of intermediate string b + * map to substrings of output string c. + * @param errorCode ICU error code. Its input value must pass the U_SUCCESS() test, + * or else the function returns immediately. Check for U_FAILURE() + * on output or use with function chaining. (See User Guide for details.) + * @return *this, with the merged edits appended + * @draft ICU 60 + */ + Edits &mergeAndAppend(const Edits &ab, const Edits &bc, UErrorCode &errorCode); + private: - Edits(const Edits &) = delete; - Edits &operator=(const Edits &) = delete; + void releaseArray() U_NOEXCEPT; + Edits ©Array(const Edits &other); + Edits &moveArray(Edits &src) U_NOEXCEPT; void setLastUnit(int32_t last) { array[length - 1] = (uint16_t)last; } int32_t lastUnit() const { return length > 0 ? array[length - 1] : 0xffff; } @@ -234,7 +410,8 @@ class U_COMMON_API Edits U_FINAL : public UMemory { int32_t capacity; int32_t length; int32_t delta; - UErrorCode errorCode; + int32_t numChanges; + UErrorCode errorCode_; uint16_t stackArray[STACK_CAPACITY]; }; diff --git a/deps/icu-small/source/common/unicode/filteredbrk.h b/deps/icu-small/source/common/unicode/filteredbrk.h index 51bb651fbac366..a0319bf0a76af5 100644 --- a/deps/icu-small/source/common/unicode/filteredbrk.h +++ b/deps/icu-small/source/common/unicode/filteredbrk.h @@ -55,14 +55,30 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { */ static FilteredBreakIteratorBuilder *createInstance(const Locale& where, UErrorCode& status); +#ifndef U_HIDE_DEPRECATED_API + /** + * This function has been deprecated in favor of createEmptyInstance, which has + * identical behavior. + * @param status The error code. + * @return the new builder + * @deprecated ICU 60 use createEmptyInstance instead + * @see createEmptyInstance() + */ + static inline FilteredBreakIteratorBuilder *createInstance(UErrorCode &status) { + return createEmptyInstance(status); + } +#endif /* U_HIDE_DEPRECATED_API */ + +#ifndef U_HIDE_DRAFT_API /** * Construct an empty FilteredBreakIteratorBuilder. * In this state, it will not suppress any segment boundaries. * @param status The error code. * @return the new builder - * @stable ICU 56 + * @draft ICU 60 */ - static FilteredBreakIteratorBuilder *createInstance(UErrorCode &status); + static FilteredBreakIteratorBuilder *createEmptyInstance(UErrorCode &status); +#endif /* U_HIDE_DRAFT_API */ /** * Suppress a certain string from being the end of a segment. @@ -89,6 +105,20 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { */ virtual UBool unsuppressBreakAfter(const UnicodeString& string, UErrorCode& status) = 0; +#ifndef U_HIDE_DEPRECATED_API + /** + * This function has been deprecated in favor of wrapIteratorWithFilter() + * The behavior is identical. + * @param adoptBreakIterator the break iterator to adopt + * @param status error code + * @return the new BreakIterator, owned by the caller. + * @deprecated ICU 60 use wrapIteratorWithFilter() instead + * @see wrapBreakIteratorWithFilter() + */ + virtual BreakIterator *build(BreakIterator* adoptBreakIterator, UErrorCode& status) = 0; +#endif /* U_HIDE_DEPRECATED_API */ + +#ifndef U_HIDE_DRAFT_API /** * Wrap (adopt) an existing break iterator in a new filtered instance. * The resulting BreakIterator is owned by the caller. @@ -96,12 +126,16 @@ class U_COMMON_API FilteredBreakIteratorBuilder : public UObject { * Note that the adoptBreakIterator is adopted by the new BreakIterator * and should no longer be used by the caller. * The FilteredBreakIteratorBuilder may be reused. + * This function is an alias for build() * @param adoptBreakIterator the break iterator to adopt * @param status error code * @return the new BreakIterator, owned by the caller. - * @stable ICU 56 + * @draft ICU 60 */ - virtual BreakIterator *build(BreakIterator* adoptBreakIterator, UErrorCode& status) = 0; + inline BreakIterator *wrapIteratorWithFilter(BreakIterator* adoptBreakIterator, UErrorCode& status) { + return build(adoptBreakIterator, status); + } +#endif /* U_HIDE_DRAFT_API */ protected: /** diff --git a/deps/icu-small/source/common/unicode/localpointer.h b/deps/icu-small/source/common/unicode/localpointer.h index 3ab820188f7f23..e17ee3d886ef34 100644 --- a/deps/icu-small/source/common/unicode/localpointer.h +++ b/deps/icu-small/source/common/unicode/localpointer.h @@ -213,7 +213,6 @@ class LocalPointer : public LocalPointerBase { errorCode=U_MEMORY_ALLOCATION_ERROR; } } -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, leaves src with isNull(). * @param src source smart pointer @@ -222,7 +221,6 @@ class LocalPointer : public LocalPointerBase { LocalPointer(LocalPointer &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } -#endif /** * Destructor deletes the object it owns. * @stable ICU 4.4 @@ -230,7 +228,6 @@ class LocalPointer : public LocalPointerBase { ~LocalPointer() { delete LocalPointerBase::ptr; } -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -241,7 +238,6 @@ class LocalPointer : public LocalPointerBase { LocalPointer &operator=(LocalPointer &&src) U_NOEXCEPT { return moveFrom(src); } -#endif // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, leaves src with isNull(). @@ -362,7 +358,6 @@ class LocalArray : public LocalPointerBase { errorCode=U_MEMORY_ALLOCATION_ERROR; } } -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, leaves src with isNull(). * @param src source smart pointer @@ -371,7 +366,6 @@ class LocalArray : public LocalPointerBase { LocalArray(LocalArray &&src) U_NOEXCEPT : LocalPointerBase(src.ptr) { src.ptr=NULL; } -#endif /** * Destructor deletes the array it owns. * @stable ICU 4.4 @@ -379,7 +373,6 @@ class LocalArray : public LocalPointerBase { ~LocalArray() { delete[] LocalPointerBase::ptr; } -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, leaves src with isNull(). * The behavior is undefined if *this and src are the same object. @@ -390,7 +383,6 @@ class LocalArray : public LocalPointerBase { LocalArray &operator=(LocalArray &&src) U_NOEXCEPT { return moveFrom(src); } -#endif // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, leaves src with isNull(). @@ -492,7 +484,6 @@ class LocalArray : public LocalPointerBase { * @see LocalPointer * @stable ICU 4.4 */ -#if U_HAVE_RVALUE_REFERENCES #define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ class LocalPointerClassName : public LocalPointerBase { \ public: \ @@ -526,34 +517,6 @@ class LocalArray : public LocalPointerBase { ptr=p; \ } \ } -#else -#define U_DEFINE_LOCAL_OPEN_POINTER(LocalPointerClassName, Type, closeFunction) \ - class LocalPointerClassName : public LocalPointerBase { \ - public: \ - using LocalPointerBase::operator*; \ - using LocalPointerBase::operator->; \ - explicit LocalPointerClassName(Type *p=NULL) : LocalPointerBase(p) {} \ - ~LocalPointerClassName() { closeFunction(ptr); } \ - LocalPointerClassName &moveFrom(LocalPointerClassName &src) U_NOEXCEPT { \ - if (ptr != NULL) { closeFunction(ptr); } \ - LocalPointerBase::ptr=src.ptr; \ - src.ptr=NULL; \ - return *this; \ - } \ - void swap(LocalPointerClassName &other) U_NOEXCEPT { \ - Type *temp=LocalPointerBase::ptr; \ - LocalPointerBase::ptr=other.ptr; \ - other.ptr=temp; \ - } \ - friend inline void swap(LocalPointerClassName &p1, LocalPointerClassName &p2) U_NOEXCEPT { \ - p1.swap(p2); \ - } \ - void adoptInstead(Type *p) { \ - if (ptr != NULL) { closeFunction(ptr); } \ - ptr=p; \ - } \ - } -#endif U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/locid.h b/deps/icu-small/source/common/unicode/locid.h index 37a34f71403f24..c752344f339db1 100644 --- a/deps/icu-small/source/common/unicode/locid.h +++ b/deps/icu-small/source/common/unicode/locid.h @@ -88,7 +88,7 @@ class UnicodeString; *

    * The third constructor requires a third argument--the Variant. * The Variant codes are vendor and browser-specific. - * For example, use REVISED for a langauge's revised script orthography, and POSIX for POSIX. + * For example, use REVISED for a language's revised script orthography, and POSIX for POSIX. * Where there are two variants, separate them with an underscore, and * put the most important one first. For * example, a Traditional Spanish collation might be referenced, with diff --git a/deps/icu-small/source/common/unicode/normalizer2.h b/deps/icu-small/source/common/unicode/normalizer2.h index d326da948a3573..8a6d7138021b56 100644 --- a/deps/icu-small/source/common/unicode/normalizer2.h +++ b/deps/icu-small/source/common/unicode/normalizer2.h @@ -28,12 +28,15 @@ #if !UCONFIG_NO_NORMALIZATION +#include "unicode/stringpiece.h" #include "unicode/uniset.h" #include "unicode/unistr.h" #include "unicode/unorm2.h" U_NAMESPACE_BEGIN +class ByteSink; + /** * Unicode normalization functionality for standard Unicode normalization or * for using custom mapping tables. @@ -215,6 +218,35 @@ class U_COMMON_API Normalizer2 : public UObject { normalize(const UnicodeString &src, UnicodeString &dest, UErrorCode &errorCode) const = 0; + + /** + * Normalizes a UTF-8 string and optionally records how source substrings + * relate to changed and unchanged result substrings. + * + * Currently implemented completely only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * Otherwise currently converts to & from UTF-16 and does not support edits. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src Source UTF-8 string. + * @param sink A ByteSink to which the normalized UTF-8 result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be nullptr. + * @param errorCode Standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @draft ICU 60 + */ + virtual void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const; + /** * Appends the normalized form of the second string to the first string * (merging them at the boundary) and returns the first string. @@ -340,6 +372,30 @@ class U_COMMON_API Normalizer2 : public UObject { */ virtual UBool isNormalized(const UnicodeString &s, UErrorCode &errorCode) const = 0; + /** + * Tests if the UTF-8 string is normalized. + * Internally, in cases where the quickCheck() method would return "maybe" + * (which is only possible for the two COMPOSE modes) this method + * resolves to "yes" or "no" to provide a definitive result, + * at the cost of doing more work in those cases. + * + * This works for all normalization modes, + * but it is currently optimized for UTF-8 only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * For other modes it currently converts to UTF-16 and calls isNormalized(). + * + * @param s UTF-8 input string + * @param errorCode Standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return TRUE if s is normalized + * @draft ICU 60 + */ + virtual UBool + isNormalizedUTF8(StringPiece s, UErrorCode &errorCode) const; + /** * Tests if the string is normalized. @@ -479,7 +535,36 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { virtual UnicodeString & normalize(const UnicodeString &src, UnicodeString &dest, - UErrorCode &errorCode) const; + UErrorCode &errorCode) const U_OVERRIDE; + + /** + * Normalizes a UTF-8 string and optionally records how source substrings + * relate to changed and unchanged result substrings. + * + * Currently implemented completely only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * Otherwise currently converts to & from UTF-16 and does not support edits. + * + * @param options Options bit set, usually 0. See U_OMIT_UNCHANGED_TEXT and U_EDITS_NO_RESET. + * @param src Source UTF-8 string. + * @param sink A ByteSink to which the normalized UTF-8 result string is written. + * sink.Flush() is called at the end. + * @param edits Records edits for index mapping, working with styled text, + * and getting only changes (if any). + * The Edits contents is undefined if any error occurs. + * This function calls edits->reset() first unless + * options includes U_EDITS_NO_RESET. edits can be nullptr. + * @param errorCode Standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @draft ICU 60 + */ + virtual void + normalizeUTF8(uint32_t options, StringPiece src, ByteSink &sink, + Edits *edits, UErrorCode &errorCode) const U_OVERRIDE; + /** * Appends the normalized form of the second string to the first string * (merging them at the boundary) and returns the first string. @@ -497,7 +582,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { virtual UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const; + UErrorCode &errorCode) const U_OVERRIDE; /** * Appends the second string to the first string * (merging them at the boundary) and returns the first string. @@ -515,7 +600,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { virtual UnicodeString & append(UnicodeString &first, const UnicodeString &second, - UErrorCode &errorCode) const; + UErrorCode &errorCode) const U_OVERRIDE; /** * Gets the decomposition mapping of c. @@ -529,7 +614,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 4.6 */ virtual UBool - getDecomposition(UChar32 c, UnicodeString &decomposition) const; + getDecomposition(UChar32 c, UnicodeString &decomposition) const U_OVERRIDE; /** * Gets the raw decomposition mapping of c. @@ -543,7 +628,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 49 */ virtual UBool - getRawDecomposition(UChar32 c, UnicodeString &decomposition) const; + getRawDecomposition(UChar32 c, UnicodeString &decomposition) const U_OVERRIDE; /** * Performs pairwise composition of a & b and returns the composite if there is one. @@ -556,7 +641,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 49 */ virtual UChar32 - composePair(UChar32 a, UChar32 b) const; + composePair(UChar32 a, UChar32 b) const U_OVERRIDE; /** * Gets the combining class of c. @@ -567,7 +652,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 49 */ virtual uint8_t - getCombiningClass(UChar32 c) const; + getCombiningClass(UChar32 c) const U_OVERRIDE; /** * Tests if the string is normalized. @@ -581,7 +666,30 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 4.4 */ virtual UBool - isNormalized(const UnicodeString &s, UErrorCode &errorCode) const; + isNormalized(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE; + /** + * Tests if the UTF-8 string is normalized. + * Internally, in cases where the quickCheck() method would return "maybe" + * (which is only possible for the two COMPOSE modes) this method + * resolves to "yes" or "no" to provide a definitive result, + * at the cost of doing more work in those cases. + * + * This works for all normalization modes, + * but it is currently optimized for UTF-8 only for "compose" modes, + * such as for NFC, NFKC, and NFKC_Casefold + * (UNORM2_COMPOSE and UNORM2_COMPOSE_CONTIGUOUS). + * For other modes it currently converts to UTF-16 and calls isNormalized(). + * + * @param s UTF-8 input string + * @param errorCode Standard ICU error code. Its input value must + * pass the U_SUCCESS() test, or else the function returns + * immediately. Check for U_FAILURE() on output or use with + * function chaining. (See User Guide for details.) + * @return TRUE if s is normalized + * @draft ICU 60 + */ + virtual UBool + isNormalizedUTF8(StringPiece s, UErrorCode &errorCode) const U_OVERRIDE; /** * Tests if the string is normalized. * For details see the Normalizer2 base class documentation. @@ -594,7 +702,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 4.4 */ virtual UNormalizationCheckResult - quickCheck(const UnicodeString &s, UErrorCode &errorCode) const; + quickCheck(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE; /** * Returns the end of the normalized substring of the input string. * For details see the Normalizer2 base class documentation. @@ -607,7 +715,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @stable ICU 4.4 */ virtual int32_t - spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const; + spanQuickCheckYes(const UnicodeString &s, UErrorCode &errorCode) const U_OVERRIDE; /** * Tests if the character always has a normalization boundary before it, @@ -617,7 +725,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @return TRUE if c has a normalization boundary before it * @stable ICU 4.4 */ - virtual UBool hasBoundaryBefore(UChar32 c) const; + virtual UBool hasBoundaryBefore(UChar32 c) const U_OVERRIDE; /** * Tests if the character always has a normalization boundary after it, @@ -627,7 +735,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @return TRUE if c has a normalization boundary after it * @stable ICU 4.4 */ - virtual UBool hasBoundaryAfter(UChar32 c) const; + virtual UBool hasBoundaryAfter(UChar32 c) const U_OVERRIDE; /** * Tests if the character is normalization-inert. @@ -636,7 +744,7 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { * @return TRUE if c is normalization-inert * @stable ICU 4.4 */ - virtual UBool isInert(UChar32 c) const; + virtual UBool isInert(UChar32 c) const U_OVERRIDE; private: UnicodeString & normalize(const UnicodeString &src, @@ -644,6 +752,12 @@ class U_COMMON_API FilteredNormalizer2 : public Normalizer2 { USetSpanCondition spanCondition, UErrorCode &errorCode) const; + void + normalizeUTF8(uint32_t options, const char *src, int32_t length, + ByteSink &sink, Edits *edits, + USetSpanCondition spanCondition, + UErrorCode &errorCode) const; + UnicodeString & normalizeSecondAndAppend(UnicodeString &first, const UnicodeString &second, diff --git a/deps/icu-small/source/common/unicode/platform.h b/deps/icu-small/source/common/unicode/platform.h index 23b9464c6507d2..12e2929d240d45 100644 --- a/deps/icu-small/source/common/unicode/platform.h +++ b/deps/icu-small/source/common/unicode/platform.h @@ -132,6 +132,8 @@ #define U_PF_BROWSER_NATIVE_CLIENT 4020 /** Android is based on Linux. @internal */ #define U_PF_ANDROID 4050 +/** Fuchsia is a POSIX-ish platform. @internal */ +#define U_PF_FUCHSIA 4100 /* Maximum value for Linux-based platform is 4499 */ /** z/OS is the successor to OS/390 which was the successor to MVS. @internal */ #define U_PF_OS390 9000 @@ -152,6 +154,8 @@ # include #elif defined(__pnacl__) || defined(__native_client__) # define U_PLATFORM U_PF_BROWSER_NATIVE_CLIENT +#elif defined(__Fuchsia__) +# define U_PLATFORM U_PF_FUCHSIA #elif defined(linux) || defined(__linux__) || defined(__linux) # define U_PLATFORM U_PF_LINUX #elif defined(__APPLE__) && defined(__MACH__) @@ -192,6 +196,20 @@ # define U_PLATFORM U_PF_UNKNOWN #endif +/** + * \def UPRV_INCOMPLETE_CPP11_SUPPORT + * This switch turns off ICU 60 NumberFormatter code. + * By default, this switch is enabled on AIX and z/OS, + * which have poor C++11 support. + * + * NOTE: This switch is intended to be temporary; see #13393. + * + * @internal + */ +#ifndef UPRV_INCOMPLETE_CPP11_SUPPORT +# define UPRV_INCOMPLETE_CPP11_SUPPORT (U_PLATFORM == U_PF_AIX || U_PLATFORM == U_PF_OS390 || U_PLATFORM == U_PF_SOLARIS ) +#endif + /** * \def CYGWINMSVC * Defined if this is Windows with Cygwin, but using MSVC rather than gcc. @@ -330,31 +348,6 @@ # define U_HAVE_INTTYPES_H U_HAVE_STDINT_H #endif -/** - * \def U_IOSTREAM_SOURCE - * Defines what support for C++ streams is available. - * - * If U_IOSTREAM_SOURCE is set to 199711, then <iostream> is available - * (the ISO/IEC C++ FDIS was published in November 1997), and then - * one should qualify streams using the std namespace in ICU header - * files. - * Starting with ICU 49, this is the only supported version. - * - * If U_IOSTREAM_SOURCE is set to 198506, then <iostream.h> is - * available instead (in June 1985 Stroustrup published - * "An Extensible I/O Facility for C++" at the summer USENIX conference). - * Starting with ICU 49, this version is not supported any more. - * - * If U_IOSTREAM_SOURCE is 0 (or any value less than 199711), - * then C++ streams are not available and - * support for them will be silently suppressed in ICU. - * - * @internal - */ -#ifndef U_IOSTREAM_SOURCE -#define U_IOSTREAM_SOURCE 199711 -#endif - /*===========================================================================*/ /** @{ Compiler and environment features */ /*===========================================================================*/ @@ -505,22 +498,6 @@ namespace std { }; #endif -/** - * \def U_HAVE_RVALUE_REFERENCES - * Set to 1 if the compiler supports rvalue references. - * C++11 feature, necessary for move constructor & move assignment. - * @internal - */ -#ifdef U_HAVE_RVALUE_REFERENCES - /* Use the predefined value. */ -#elif U_CPLUSPLUS_VERSION >= 11 || __has_feature(cxx_rvalue_references) \ - || defined(__GXX_EXPERIMENTAL_CXX0X__) \ - || (defined(_MSC_VER) && _MSC_VER >= 1600) /* Visual Studio 2010 */ -# define U_HAVE_RVALUE_REFERENCES 1 -#else -# define U_HAVE_RVALUE_REFERENCES 0 -#endif - /** * \def U_NOEXCEPT * "noexcept" if supported, otherwise empty. @@ -871,6 +848,16 @@ namespace std { # define U_CALLCONV U_EXPORT2 #endif +/** + * \def U_CALLCONV_FPTR + * Similar to U_CALLCONV, but only used on function pointers. + * @internal + */ +#if U_PLATFORM == U_PF_OS390 && defined(__cplusplus) +# define U_CALLCONV_FPTR U_CALLCONV +#else +# define U_CALLCONV_FPTR +#endif /* @} */ #endif diff --git a/deps/icu-small/source/common/unicode/rbbi.h b/deps/icu-small/source/common/unicode/rbbi.h index d654154008bc7f..c3c201dd35d333 100644 --- a/deps/icu-small/source/common/unicode/rbbi.h +++ b/deps/icu-small/source/common/unicode/rbbi.h @@ -31,23 +31,14 @@ #include "unicode/schriter.h" #include "unicode/uchriter.h" - -struct UTrie; - U_NAMESPACE_BEGIN /** @internal */ +class LanguageBreakEngine; struct RBBIDataHeader; -class RuleBasedBreakIteratorTables; -class BreakIterator; class RBBIDataWrapper; -class UStack; -class LanguageBreakEngine; class UnhandledEngine; -struct RBBIStateTable; - - - +class UStack; /** * @@ -96,47 +87,49 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { */ RBBIDataWrapper *fData; - /** Index of the Rule {tag} values for the most recent match. + /** + * The iteration state - current position, rule status for the current position, + * and whether the iterator ran off the end, yielding UBRK_DONE. + * Current position is pinned to be 0 < position <= text.length. + * Current position is always set to a boundary. * @internal */ - int32_t fLastRuleStatusIndex; + /** + * The current position of the iterator. Pinned, 0 < fPosition <= text.length. + * Never has the value UBRK_DONE (-1). + */ + int32_t fPosition; /** - * Rule tag value valid flag. - * Some iterator operations don't intrinsically set the correct tag value. - * This flag lets us lazily compute the value if we are ever asked for it. - * @internal - */ - UBool fLastStatusIndexValid; + * TODO: + */ + int32_t fRuleStatusIndex; /** - * Counter for the number of characters encountered with the "dictionary" - * flag set. - * @internal - */ - uint32_t fDictionaryCharCount; + * True when iteration has run off the end, and iterator functions should return UBRK_DONE. + */ + UBool fDone; /** - * When a range of characters is divided up using the dictionary, the break - * positions that are discovered are stored here, preventing us from having - * to use either the dictionary or the state table again until the iterator - * leaves this range of text. Has the most impact for line breaking. - * @internal + * Cache of previously determined boundary positions. */ - int32_t* fCachedBreakPositions; - + public: // TODO: debug, return to private. + class BreakCache; + BreakCache *fBreakCache; + private: /** - * The number of elements in fCachedBreakPositions + * Counter for the number of characters encountered with the "dictionary" + * flag set. * @internal */ - int32_t fNumCachedBreakPositions; + uint32_t fDictionaryCharCount; /** - * if fCachedBreakPositions is not null, this indicates which item in the - * cache the current iteration position refers to - * @internal + * Cache of boundary positions within a region of text that has been + * sub-divided by dictionary based breaking. */ - int32_t fPositionInCache; + class DictionaryCache; + DictionaryCache *fDictionaryCache; /** * @@ -179,13 +172,11 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { */ RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status); - + /** @internal */ friend class RBBIRuleBuilder; /** @internal */ friend class BreakIterator; - - public: /** Default constructor. Creates an empty shell of an iterator, with no @@ -469,7 +460,10 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { virtual UBool isBoundary(int32_t offset); /** - * Returns the current iteration position. + * Returns the current iteration position. Note that UBRK_DONE is never + * returned from this function; if iteration has run to the end of a + * string, current() will return the length of the string while + * next() will return UBRK_DONE). * @return The current iteration position. * @stable ICU 2.0 */ @@ -501,6 +495,7 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { * Note: this function is not thread safe. It should not have been * declared const, and the const remains only for compatibility * reasons. (The function is logically const, but not bit-wise const). + * TODO: check this. Probably thread safe now. *

    * @return the status from the break rule that determined the most recently * returned break position. @@ -660,46 +655,31 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { * Common initialization function, used by constructors and bufferClone. * @internal */ - void init(); - - /** - * This method backs the iterator back up to a "safe position" in the text. - * This is a position that we know, without any context, must be a break position. - * The various calling methods then iterate forward from this safe position to - * the appropriate position to return. (For more information, see the description - * of buildBackwardsStateTable() in RuleBasedBreakIterator.Builder.) - * @param statetable state table used of moving backwards - * @internal - */ - int32_t handlePrevious(const RBBIStateTable *statetable); + void init(UErrorCode &status); /** - * This method is the actual implementation of the next() method. All iteration - * vectors through here. This method initializes the state machine to state 1 - * and advances through the text character by character until we reach the end - * of the text or the state machine transitions to state 0. We update our return - * value every time the state machine passes through a possible end state. - * @param statetable state table used of moving forwards + * Iterate backwards from an arbitrary position in the input text using the Safe Reverse rules. + * This locates a "Safe Position" from which the forward break rules + * will operate correctly. A Safe Position is not necessarily a boundary itself. + * + * @param fromPosition the position in the input text to begin the iteration. * @internal */ - int32_t handleNext(const RBBIStateTable *statetable); - + int32_t handlePrevious(int32_t fromPosition); /** - * This is the function that actually implements dictionary-based - * breaking. Covering at least the range from startPos to endPos, - * it checks for dictionary characters, and if it finds them determines - * the appropriate object to deal with them. It may cache found breaks in - * fCachedBreakPositions as it goes. It may well also look at text outside - * the range startPos to endPos. - * If going forward, endPos is the normal Unicode break result, and - * if goind in reverse, startPos is the normal Unicode break result - * @param startPos The start position of a range of text - * @param endPos The end position of a range of text - * @param reverse The call is for the reverse direction + * Find a rule-based boundary by running the state machine. + * Input + * fPosition, the position in the text to begin from. + * Output + * fPosition: the boundary following the starting position. + * fDictionaryCharCount the number of dictionary characters encountered. + * If > 0, the segment will be further subdivided + * fRuleStatusIndex Info from the state table indicating which rules caused the boundary. + * * @internal */ - int32_t checkDictionary(int32_t startPos, int32_t endPos, UBool reverse); + int32_t handleNext(); /** @@ -710,11 +690,14 @@ class U_COMMON_API RuleBasedBreakIterator /*U_FINAL*/ : public BreakIterator { */ const LanguageBreakEngine *getLanguageBreakEngine(UChar32 c); + public: +#ifndef U_HIDE_INTERNAL_API /** - * @internal + * Debugging function only. + * @internal */ - void makeRuleStatusValid(); - + void dumpCache(); +#endif /* U_HIDE_INTERNAL_API */ }; //------------------------------------------------------------------------------ diff --git a/deps/icu-small/source/common/unicode/simpleformatter.h b/deps/icu-small/source/common/unicode/simpleformatter.h index 26eae01525292c..850949caaf5cda 100644 --- a/deps/icu-small/source/common/unicode/simpleformatter.h +++ b/deps/icu-small/source/common/unicode/simpleformatter.h @@ -21,6 +21,13 @@ U_NAMESPACE_BEGIN +// Forward declaration: +namespace number { +namespace impl { +class SimpleModifier; +} +} + /** * Formats simple patterns like "{1} was born in {0}". * Minimal subset of MessageFormat; fast, simple, minimal dependencies. @@ -286,6 +293,9 @@ class U_COMMON_API SimpleFormatter U_FINAL : public UMemory { UnicodeString &result, const UnicodeString *resultCopy, UBool forbidResultAsValue, int32_t *offsets, int32_t offsetsLength, UErrorCode &errorCode); + + // Give access to internals to SimpleModifier for number formatting + friend class number::impl::SimpleModifier; }; U_NAMESPACE_END diff --git a/deps/icu-small/source/common/unicode/stringoptions.h b/deps/icu-small/source/common/unicode/stringoptions.h new file mode 100644 index 00000000000000..f2de96e9634a02 --- /dev/null +++ b/deps/icu-small/source/common/unicode/stringoptions.h @@ -0,0 +1,198 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +// stringoptions.h +// created: 2017jun08 Markus W. Scherer + +#ifndef __STRINGOPTIONS_H__ +#define __STRINGOPTIONS_H__ + +#include "unicode/utypes.h" + +/** + * \file + * \brief C API: Bit set option bit constants for various string and character processing functions. + */ + +/** + * Option value for case folding: Use default mappings defined in CaseFolding.txt. + * + * @stable ICU 2.0 + */ +#define U_FOLD_CASE_DEFAULT 0 + +/** + * Option value for case folding: + * + * Use the modified set of mappings provided in CaseFolding.txt to handle dotted I + * and dotless i appropriately for Turkic languages (tr, az). + * + * Before Unicode 3.2, CaseFolding.txt contains mappings marked with 'I' that + * are to be included for default mappings and + * excluded for the Turkic-specific mappings. + * + * Unicode 3.2 CaseFolding.txt instead contains mappings marked with 'T' that + * are to be excluded for default mappings and + * included for the Turkic-specific mappings. + * + * @stable ICU 2.0 + */ +#define U_FOLD_CASE_EXCLUDE_SPECIAL_I 1 + +#ifndef U_HIDE_DRAFT_API + +/** + * Titlecase the string as a whole rather than each word. + * (Titlecase only the character at index 0, possibly adjusted.) + * Option bits value for titlecasing APIs that take an options bit set. + * + * It is an error to specify multiple titlecasing iterator options together, + * including both an options bit and an explicit BreakIterator. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @draft ICU 60 + */ +#define U_TITLECASE_WHOLE_STRING 0x20 + +/** + * Titlecase sentences rather than words. + * (Titlecase only the first character of each sentence, possibly adjusted.) + * Option bits value for titlecasing APIs that take an options bit set. + * + * It is an error to specify multiple titlecasing iterator options together, + * including both an options bit and an explicit BreakIterator. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @draft ICU 60 + */ +#define U_TITLECASE_SENTENCES 0x40 + +#endif // U_HIDE_DRAFT_API + +/** + * Do not lowercase non-initial parts of words when titlecasing. + * Option bit for titlecasing APIs that take an options bit set. + * + * By default, titlecasing will titlecase the character at each + * (possibly adjusted) BreakIterator index and + * lowercase all other characters up to the next iterator index. + * With this option, the other characters will not be modified. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @see UnicodeString::toTitle + * @see CaseMap::toTitle + * @see ucasemap_setOptions + * @see ucasemap_toTitle + * @see ucasemap_utf8ToTitle + * @stable ICU 3.8 + */ +#define U_TITLECASE_NO_LOWERCASE 0x100 + +/** + * Do not adjust the titlecasing BreakIterator indexes; + * titlecase exactly the characters at breaks from the iterator. + * Option bit for titlecasing APIs that take an options bit set. + * + * By default, titlecasing will take each break iterator index, + * adjust it to the next relevant character (see U_TITLECASE_ADJUST_TO_CASED), + * and titlecase that one. + * + * Other characters are lowercased. + * + * It is an error to specify multiple titlecasing adjustment options together. + * + * @see U_TITLECASE_ADJUST_TO_CASED + * @see U_TITLECASE_NO_LOWERCASE + * @see UnicodeString::toTitle + * @see CaseMap::toTitle + * @see ucasemap_setOptions + * @see ucasemap_toTitle + * @see ucasemap_utf8ToTitle + * @stable ICU 3.8 + */ +#define U_TITLECASE_NO_BREAK_ADJUSTMENT 0x200 + +#ifndef U_HIDE_DRAFT_API + +/** + * Adjust each titlecasing BreakIterator index to the next cased character. + * (See the Unicode Standard, chapter 3, Default Case Conversion, R3 toTitlecase(X).) + * Option bit for titlecasing APIs that take an options bit set. + * + * This used to be the default index adjustment in ICU. + * Since ICU 60, the default index adjustment is to the next character that is + * a letter, number, symbol, or private use code point. + * (Uncased modifier letters are skipped.) + * The difference in behavior is small for word titlecasing, + * but the new adjustment is much better for whole-string and sentence titlecasing: + * It yields "49ers" and "«丰(abc)»" instead of "49Ers" and "«丰(Abc)»". + * + * It is an error to specify multiple titlecasing adjustment options together. + * + * @see U_TITLECASE_NO_BREAK_ADJUSTMENT + * @draft ICU 60 + */ +#define U_TITLECASE_ADJUST_TO_CASED 0x400 + +/** + * Option for string transformation functions to not first reset the Edits object. + * Used for example in some case-mapping and normalization functions. + * + * @see CaseMap + * @see Edits + * @see Normalizer2 + * @draft ICU 60 + */ +#define U_EDITS_NO_RESET 0x2000 + +/** + * Omit unchanged text when recording how source substrings + * relate to changed and unchanged result substrings. + * Used for example in some case-mapping and normalization functions. + * + * @see CaseMap + * @see Edits + * @see Normalizer2 + * @draft ICU 60 + */ +#define U_OMIT_UNCHANGED_TEXT 0x4000 + +#endif // U_HIDE_DRAFT_API + +/** + * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: + * Compare strings in code point order instead of code unit order. + * @stable ICU 2.2 + */ +#define U_COMPARE_CODE_POINT_ORDER 0x8000 + +/** + * Option bit for unorm_compare: + * Perform case-insensitive comparison. + * @stable ICU 2.2 + */ +#define U_COMPARE_IGNORE_CASE 0x10000 + +/** + * Option bit for unorm_compare: + * Both input strings are assumed to fulfill FCD conditions. + * @stable ICU 2.2 + */ +#define UNORM_INPUT_IS_FCD 0x20000 + +// Related definitions elsewhere. +// Options that are not meaningful in the same functions +// can share the same bits. +// +// Public: +// unicode/unorm.h #define UNORM_COMPARE_NORM_OPTIONS_SHIFT 20 +// +// Internal: (may change or be removed) +// ucase.h #define _STRCASECMP_OPTIONS_MASK 0xffff +// ucase.h #define _FOLD_CASE_OPTIONS_MASK 7 +// ucasemap_imp.h #define U_TITLECASE_ITERATOR_MASK 0xe0 +// ucasemap_imp.h #define U_TITLECASE_ADJUSTMENT_MASK 0x600 +// ustr_imp.h #define _STRNCMP_STYLE 0x1000 +// unormcmp.cpp #define _COMPARE_EQUIV 0x80000 + +#endif // __STRINGOPTIONS_H__ diff --git a/deps/icu-small/source/common/unicode/stringtriebuilder.h b/deps/icu-small/source/common/unicode/stringtriebuilder.h index d1ac003c48a643..8d2b229413cd6d 100644 --- a/deps/icu-small/source/common/unicode/stringtriebuilder.h +++ b/deps/icu-small/source/common/unicode/stringtriebuilder.h @@ -256,7 +256,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { /** @internal */ class FinalValueNode : public Node { public: - FinalValueNode(int32_t v) : Node(0x111111*37+v), value(v) {} + FinalValueNode(int32_t v) : Node(0x111111u*37u+v), value(v) {} virtual UBool operator==(const Node &other) const; virtual void write(StringTrieBuilder &builder); protected: @@ -276,7 +276,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { void setValue(int32_t v) { hasValue=TRUE; value=v; - hash=hash*37+v; + hash=hash*37u+v; } protected: UBool hasValue; @@ -290,7 +290,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { class IntermediateValueNode : public ValueNode { public: IntermediateValueNode(int32_t v, Node *nextNode) - : ValueNode(0x222222*37+hashCode(nextNode)), next(nextNode) { setValue(v); } + : ValueNode(0x222222u*37u+hashCode(nextNode)), next(nextNode) { setValue(v); } virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); virtual void write(StringTrieBuilder &builder); @@ -307,7 +307,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { class LinearMatchNode : public ValueNode { public: LinearMatchNode(int32_t len, Node *nextNode) - : ValueNode((0x333333*37+len)*37+hashCode(nextNode)), + : ValueNode((0x333333u*37u+len)*37u+hashCode(nextNode)), length(len), next(nextNode) {} virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); @@ -342,7 +342,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { equal[length]=NULL; values[length]=value; ++length; - hash=(hash*37+c)*37+value; + hash=(hash*37u+c)*37u+value; } // Adds a unit which leads to another match node. void add(int32_t c, Node *node) { @@ -350,7 +350,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { equal[length]=node; values[length]=0; ++length; - hash=(hash*37+c)*37+hashCode(node); + hash=(hash*37u+c)*37u+hashCode(node); } protected: Node *equal[kMaxBranchLinearSubNodeLength]; // NULL means "has final value". @@ -365,8 +365,8 @@ class U_COMMON_API StringTrieBuilder : public UObject { class SplitBranchNode : public BranchNode { public: SplitBranchNode(char16_t middleUnit, Node *lessThanNode, Node *greaterOrEqualNode) - : BranchNode(((0x555555*37+middleUnit)*37+ - hashCode(lessThanNode))*37+hashCode(greaterOrEqualNode)), + : BranchNode(((0x555555u*37u+middleUnit)*37u+ + hashCode(lessThanNode))*37u+hashCode(greaterOrEqualNode)), unit(middleUnit), lessThan(lessThanNode), greaterOrEqual(greaterOrEqualNode) {} virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); @@ -382,7 +382,7 @@ class U_COMMON_API StringTrieBuilder : public UObject { class BranchHeadNode : public ValueNode { public: BranchHeadNode(int32_t len, Node *subNode) - : ValueNode((0x666666*37+len)*37+hashCode(subNode)), + : ValueNode((0x666666u*37u+len)*37u+hashCode(subNode)), length(len), next(subNode) {} virtual UBool operator==(const Node &other) const; virtual int32_t markRightEdgesFirst(int32_t edgeNumber); diff --git a/deps/icu-small/source/common/unicode/ubiditransform.h b/deps/icu-small/source/common/unicode/ubiditransform.h index 724587dddc8c49..627b005ed45f8d 100644 --- a/deps/icu-small/source/common/unicode/ubiditransform.h +++ b/deps/icu-small/source/common/unicode/ubiditransform.h @@ -23,8 +23,6 @@ #include "unicode/uchar.h" #include "unicode/localpointer.h" -#ifndef U_HIDE_DRAFT_API - /** * \file * \brief Bidi Transformations @@ -60,17 +58,17 @@ * @see UBIDI_REORDER_DEFAULT * @see UBIDI_REORDER_INVERSE_LIKE_DIRECT * @see UBIDI_REORDER_RUNS_ONLY - * @draft ICU 58 + * @stable ICU 58 */ typedef enum { /** 0: Constant indicating a logical order. * This is the default for input text. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_LOGICAL = 0, /** 1: Constant indicating a visual order. * This is a default for output text. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_VISUAL } UBiDiOrder; @@ -83,20 +81,20 @@ typedef enum { * @see ubidi_setReorderingOptions * @see ubidi_writeReordered * @see ubidi_writeReverse - * @draft ICU 58 + * @stable ICU 58 */ typedef enum { /** 0: Constant indicating that character mirroring should not be * performed. * This is the default. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_MIRRORING_OFF = 0, /** 1: Constant indicating that character mirroring should be performed. * This corresponds to calling ubidi_writeReordered or * ubidi_writeReverse with the * UBIDI_DO_MIRRORING option bit set. - * @draft ICU 58 + * @stable ICU 58 */ UBIDI_MIRRORING_ON } UBiDiMirroring; @@ -104,7 +102,7 @@ typedef enum { /** * Forward declaration of the UBiDiTransform structure that stores * information used by the layout transformation engine. - * @draft ICU 58 + * @stable ICU 58 */ typedef struct UBiDiTransform UBiDiTransform; @@ -240,9 +238,9 @@ typedef struct UBiDiTransform UBiDiTransform; * @see UBiDiMirroring * @see ubidi_setPara * @see u_shapeArabic - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT uint32_t U_EXPORT2 +U_STABLE uint32_t U_EXPORT2 ubiditransform_transform(UBiDiTransform *pBiDiTransform, const UChar *src, int32_t srcLength, UChar *dest, int32_t destSize, @@ -286,16 +284,16 @@ ubiditransform_transform(UBiDiTransform *pBiDiTransform, * ubiditransform_close(). * * @return An empty UBiDiTransform object. - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT UBiDiTransform* U_EXPORT2 +U_STABLE UBiDiTransform* U_EXPORT2 ubiditransform_open(UErrorCode *pErrorCode); /** * Deallocates the given UBiDiTransform object. - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 ubiditransform_close(UBiDiTransform *pBidiTransform); #if U_SHOW_CPLUSPLUS_API @@ -309,7 +307,7 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 58 + * @stable ICU 58 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUBiDiTransformPointer, UBiDiTransform, ubiditransform_close); @@ -317,5 +315,4 @@ U_NAMESPACE_END #endif -#endif /* U_HIDE_DRAFT_API */ #endif diff --git a/deps/icu-small/source/common/unicode/ubrk.h b/deps/icu-small/source/common/unicode/ubrk.h index 22a4b99cd6dd2b..600328c49c66bc 100644 --- a/deps/icu-small/source/common/unicode/ubrk.h +++ b/deps/icu-small/source/common/unicode/ubrk.h @@ -230,7 +230,8 @@ typedef enum USentenceBreakTag { * @param locale The locale specifying the text-breaking conventions. Note that * locale keys such as "lb" and "ss" may be used to modify text break behavior, * see general discussion of BreakIterator C API. - * @param text The text to be iterated over. + * @param text The text to be iterated over. May be null, in which case ubrk_setText() is + * used to specify the text to be iterated. * @param textLength The number of characters in text, or -1 if null-terminated. * @param status A UErrorCode to receive any errors. * @return A UBreakIterator for the specified locale. diff --git a/deps/icu-small/source/common/unicode/ucasemap.h b/deps/icu-small/source/common/unicode/ucasemap.h index 18e6c2ba0b9e0b..6b253e3d638475 100644 --- a/deps/icu-small/source/common/unicode/ucasemap.h +++ b/deps/icu-small/source/common/unicode/ucasemap.h @@ -23,6 +23,7 @@ #include "unicode/utypes.h" #include "unicode/localpointer.h" +#include "unicode/stringoptions.h" #include "unicode/ustring.h" /** @@ -144,56 +145,6 @@ ucasemap_setLocale(UCaseMap *csm, const char *locale, UErrorCode *pErrorCode); U_STABLE void U_EXPORT2 ucasemap_setOptions(UCaseMap *csm, uint32_t options, UErrorCode *pErrorCode); -/** - * Do not lowercase non-initial parts of words when titlecasing. - * Option bit for titlecasing APIs that take an options bit set. - * - * By default, titlecasing will titlecase the first cased character - * of a word and lowercase all other characters. - * With this option, the other characters will not be modified. - * - * @see ucasemap_setOptions - * @see ucasemap_toTitle - * @see ucasemap_utf8ToTitle - * @see UnicodeString::toTitle - * @stable ICU 3.8 - */ -#define U_TITLECASE_NO_LOWERCASE 0x100 - -/** - * Do not adjust the titlecasing indexes from BreakIterator::next() indexes; - * titlecase exactly the characters at breaks from the iterator. - * Option bit for titlecasing APIs that take an options bit set. - * - * By default, titlecasing will take each break iterator index, - * adjust it by looking for the next cased character, and titlecase that one. - * Other characters are lowercased. - * - * This follows Unicode 4 & 5 section 3.13 Default Case Operations: - * - * R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex - * #29, "Text Boundaries." Between each pair of word boundaries, find the first - * cased character F. If F exists, map F to default_title(F); then map each - * subsequent character C to default_lower(C). - * - * @see ucasemap_setOptions - * @see ucasemap_toTitle - * @see ucasemap_utf8ToTitle - * @see UnicodeString::toTitle - * @see U_TITLECASE_NO_LOWERCASE - * @stable ICU 3.8 - */ -#define U_TITLECASE_NO_BREAK_ADJUSTMENT 0x200 - -/** - * Omit unchanged text when case-mapping with Edits. - * - * @see CaseMap - * @see Edits - * @draft ICU 59 - */ -#define UCASEMAP_OMIT_UNCHANGED_TEXT 0x4000 - #if !UCONFIG_NO_BREAK_ITERATION /** @@ -251,7 +202,7 @@ ucasemap_setBreakIterator(UCaseMap *csm, UBreakIterator *iterToAdopt, UErrorCode * The standard titlecase iterator for the root locale implements the * algorithm of Unicode TR 21. * - * This function uses only the setUText(), first(), next() and close() methods of the + * This function uses only the setText(), first() and next() methods of the * provided break iterator. * * The result may be longer or shorter than the original. diff --git a/deps/icu-small/source/common/unicode/uchar.h b/deps/icu-small/source/common/unicode/uchar.h index 8174ca23e6f6ff..3613374d9a43a5 100644 --- a/deps/icu-small/source/common/unicode/uchar.h +++ b/deps/icu-small/source/common/unicode/uchar.h @@ -26,6 +26,7 @@ #define UCHAR_H #include "unicode/utypes.h" +#include "unicode/stringoptions.h" U_CDECL_BEGIN @@ -41,7 +42,7 @@ U_CDECL_BEGIN * @see u_getUnicodeVersion * @stable ICU 2.0 */ -#define U_UNICODE_VERSION "9.0" +#define U_UNICODE_VERSION "10.0" /** * \file @@ -148,8 +149,9 @@ U_CDECL_BEGIN * * The properties APIs are intended to reflect Unicode properties as defined * in the Unicode Character Database (UCD) and Unicode Technical Reports (UTR). - * For details about the properties see http://www.unicode.org/ucd/ . - * For names of Unicode properties see the UCD file PropertyAliases.txt. + * + * For details about the properties see + * UAX #44: Unicode Character Database (http://www.unicode.org/reports/tr44/). * * Important: If ICU is built with UCD files from Unicode versions below, e.g., 3.2, * then properties marked with "new in Unicode 3.2" are not or not fully available. @@ -427,12 +429,29 @@ typedef enum UProperty { * @stable ICU 57 */ UCHAR_EMOJI_MODIFIER_BASE=60, + /** + * Binary property Emoji_Component. + * See http://www.unicode.org/reports/tr51/#Emoji_Properties + * + * @stable ICU 60 + */ + UCHAR_EMOJI_COMPONENT=61, + /** + * Binary property Regional_Indicator. + * @stable ICU 60 + */ + UCHAR_REGIONAL_INDICATOR=62, + /** + * Binary property Prepended_Concatenation_Mark. + * @stable ICU 60 + */ + UCHAR_PREPENDED_CONCATENATION_MARK=63, #ifndef U_HIDE_DEPRECATED_API /** * One more than the last constant for binary Unicode properties. * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UCHAR_BINARY_LIMIT=61, + UCHAR_BINARY_LIMIT, #endif // U_HIDE_DEPRECATED_API /** Enumerated property Bidi_Class. @@ -1647,6 +1666,23 @@ enum UBlockCode { /** @stable ICU 58 */ UBLOCK_TANGUT_COMPONENTS = 273, /*[18800]*/ + // New blocks in Unicode 10.0 + + /** @stable ICU 60 */ + UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F = 274, /*[2CEB0]*/ + /** @stable ICU 60 */ + UBLOCK_KANA_EXTENDED_A = 275, /*[1B100]*/ + /** @stable ICU 60 */ + UBLOCK_MASARAM_GONDI = 276, /*[11D00]*/ + /** @stable ICU 60 */ + UBLOCK_NUSHU = 277, /*[1B170]*/ + /** @stable ICU 60 */ + UBLOCK_SOYOMBO = 278, /*[11A50]*/ + /** @stable ICU 60 */ + UBLOCK_SYRIAC_SUPPLEMENT = 279, /*[0860]*/ + /** @stable ICU 60 */ + UBLOCK_ZANABAZAR_SQUARE = 280, /*[11A00]*/ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UBlockCode value. @@ -1654,7 +1690,7 @@ enum UBlockCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - UBLOCK_COUNT = 274, + UBLOCK_COUNT = 281, #endif // U_HIDE_DEPRECATED_API /** @stable ICU 2.0 */ @@ -1930,6 +1966,19 @@ typedef enum UJoiningGroup { U_JG_AFRICAN_FEH, /**< @stable ICU 58 */ U_JG_AFRICAN_NOON, /**< @stable ICU 58 */ U_JG_AFRICAN_QAF, /**< @stable ICU 58 */ + + U_JG_MALAYALAM_BHA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_JA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_LLA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_LLLA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NGA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NNA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NNNA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_NYA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_RA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_SSA, /**< @stable ICU 60 */ + U_JG_MALAYALAM_TTA, /**< @stable ICU 60 */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UJoiningGroup value. @@ -3521,27 +3570,6 @@ u_toupper(UChar32 c); U_STABLE UChar32 U_EXPORT2 u_totitle(UChar32 c); -/** Option value for case folding: use default mappings defined in CaseFolding.txt. @stable ICU 2.0 */ -#define U_FOLD_CASE_DEFAULT 0 - -/** - * Option value for case folding: - * - * Use the modified set of mappings provided in CaseFolding.txt to handle dotted I - * and dotless i appropriately for Turkic languages (tr, az). - * - * Before Unicode 3.2, CaseFolding.txt contains mappings marked with 'I' that - * are to be included for default mappings and - * excluded for the Turkic-specific mappings. - * - * Unicode 3.2 CaseFolding.txt instead contains mappings marked with 'T' that - * are to be excluded for default mappings and - * included for the Turkic-specific mappings. - * - * @stable ICU 2.0 - */ -#define U_FOLD_CASE_EXCLUDE_SPECIAL_I 1 - /** * The given character is mapped to its case folding equivalent according to * UnicodeData.txt and CaseFolding.txt; diff --git a/deps/icu-small/source/common/unicode/uclean.h b/deps/icu-small/source/common/unicode/uclean.h index d0bfcb13a644e2..3f73af37b83e81 100644 --- a/deps/icu-small/source/common/unicode/uclean.h +++ b/deps/icu-small/source/common/unicode/uclean.h @@ -149,7 +149,7 @@ typedef void U_CALLCONV UMemFreeFn (const void *context, void *mem); * @system */ U_STABLE void U_EXPORT2 -u_setMemoryFunctions(const void *context, UMemAllocFn * U_CALLCONV a, UMemReallocFn * U_CALLCONV r, UMemFreeFn * U_CALLCONV f, +u_setMemoryFunctions(const void *context, UMemAllocFn * U_CALLCONV_FPTR a, UMemReallocFn * U_CALLCONV_FPTR r, UMemFreeFn * U_CALLCONV_FPTR f, UErrorCode *status); U_CDECL_END diff --git a/deps/icu-small/source/common/unicode/uconfig.h b/deps/icu-small/source/common/unicode/uconfig.h index 25f19a1a61d475..5e28a146de3fff 100644 --- a/deps/icu-small/source/common/unicode/uconfig.h +++ b/deps/icu-small/source/common/unicode/uconfig.h @@ -76,7 +76,7 @@ #endif /** - * Determines wheter to enable auto cleanup of libraries. + * Determines whether to enable auto cleanup of libraries. * @internal */ #ifndef UCLN_NO_AUTO_CLEANUP @@ -262,7 +262,8 @@ /** * \def UCONFIG_NO_CONVERSION - * ICU will not completely build with this switch turned on. + * ICU will not completely build (compiling the tools fails) with this + * switch turned on. * This switch turns off all converters. * * You may want to use this together with U_CHARSET_IS_UTF8 defined to 1 @@ -320,7 +321,9 @@ */ #ifndef UCONFIG_NO_NORMALIZATION # define UCONFIG_NO_NORMALIZATION 0 -#elif UCONFIG_NO_NORMALIZATION +#endif + +#if UCONFIG_NO_NORMALIZATION /* common library */ /* ICU 50 CJK dictionary BreakIterator uses normalization */ # define UCONFIG_NO_BREAK_ITERATION 1 diff --git a/deps/icu-small/source/common/unicode/udisplaycontext.h b/deps/icu-small/source/common/unicode/udisplaycontext.h index c4f6c957e90bd3..398481c6812247 100644 --- a/deps/icu-small/source/common/unicode/udisplaycontext.h +++ b/deps/icu-small/source/common/unicode/udisplaycontext.h @@ -44,14 +44,12 @@ enum UDisplayContextType { * @stable ICU 54 */ UDISPCTX_TYPE_DISPLAY_LENGTH = 2, -#ifndef U_HIDE_DRAFT_API /** * Type to retrieve the substitute handling setting, e.g. * UDISPCTX_SUBSTITUTE, UDISPCTX_NO_SUBSTITUTE. - * @draft ICU 58 + * @stable ICU 58 */ UDISPCTX_TYPE_SUBSTITUTE_HANDLING = 3 -#endif /* U_HIDE_DRAFT_API */ }; /** * @stable ICU 51 @@ -143,7 +141,6 @@ enum UDisplayContext { * @stable ICU 54 */ UDISPCTX_LENGTH_SHORT = (UDISPCTX_TYPE_DISPLAY_LENGTH<<8) + 1, -#ifndef U_HIDE_DRAFT_API /** * ================================ * SUBSTITUTE_HANDLING can be set to one of UDISPCTX_SUBSTITUTE or @@ -154,16 +151,15 @@ enum UDisplayContext { * A possible setting for SUBSTITUTE_HANDLING: * Returns a fallback value (e.g., the input code) when no data is available. * This is the default value. - * @draft ICU 58 + * @stable ICU 58 */ UDISPCTX_SUBSTITUTE = (UDISPCTX_TYPE_SUBSTITUTE_HANDLING<<8) + 0, /** * A possible setting for SUBSTITUTE_HANDLING: * Returns a null value when no data is available. - * @draft ICU 58 + * @stable ICU 58 */ UDISPCTX_NO_SUBSTITUTE = (UDISPCTX_TYPE_SUBSTITUTE_HANDLING<<8) + 1 -#endif /* U_HIDE_DRAFT_API */ }; /** diff --git a/deps/icu-small/source/common/unicode/unistr.h b/deps/icu-small/source/common/unicode/unistr.h index e0ab0b9eb7c633..b99a686126c4e1 100644 --- a/deps/icu-small/source/common/unicode/unistr.h +++ b/deps/icu-small/source/common/unicode/unistr.h @@ -38,16 +38,6 @@ struct UConverter; // unicode/ucnv.h -#ifndef U_COMPARE_CODE_POINT_ORDER -/* see also ustring.h and unorm.h */ -/** - * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: - * Compare strings in code point order instead of code unit order. - * @stable ICU 2.2 - */ -#define U_COMPARE_CODE_POINT_ORDER 0x8000 -#endif - #ifndef USTRING_H /** * \ingroup ustring_ustrlen @@ -1730,7 +1720,7 @@ class U_COMMON_API UnicodeString : public Replaceable */ template StringClass &toUTF8String(StringClass &result) const { - StringByteSink sbs(&result); + StringByteSink sbs(&result, length()); toUTF8(sbs); return result; } @@ -1901,7 +1891,6 @@ class U_COMMON_API UnicodeString : public Replaceable */ UnicodeString &fastCopyFrom(const UnicodeString &src); -#if U_HAVE_RVALUE_REFERENCES /** * Move assignment operator, might leave src in bogus state. * This string will have the same contents and state that the source string had. @@ -1913,7 +1902,7 @@ class U_COMMON_API UnicodeString : public Replaceable UnicodeString &operator=(UnicodeString &&src) U_NOEXCEPT { return moveFrom(src); } -#endif + // do not use #ifndef U_HIDE_DRAFT_API for moveFrom, needed by non-draft API /** * Move assignment, might leave src in bogus state. @@ -2786,11 +2775,11 @@ class U_COMMON_API UnicodeString : public Replaceable * break iterator is opened. * Otherwise the provided iterator is set to the string's text. * @param locale The locale to consider. + * @param options Options bit set, usually 0. See U_TITLECASE_NO_LOWERCASE, + * U_TITLECASE_NO_BREAK_ADJUSTMENT, U_TITLECASE_ADJUST_TO_CASED, + * U_TITLECASE_WHOLE_STRING, U_TITLECASE_SENTENCES. * @param options Options bit set, see ucasemap_open(). * @return A reference to this. - * @see U_TITLECASE_NO_LOWERCASE - * @see U_TITLECASE_NO_BREAK_ADJUSTMENT - * @see ucasemap_open * @stable ICU 3.8 */ UnicodeString &toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options); @@ -3360,7 +3349,6 @@ class U_COMMON_API UnicodeString : public Replaceable */ UnicodeString(const UnicodeString& that); -#if U_HAVE_RVALUE_REFERENCES /** * Move constructor, might leave src in bogus state. * This string will have the same contents and state that the source string had. @@ -3368,7 +3356,6 @@ class U_COMMON_API UnicodeString : public Replaceable * @stable ICU 56 */ UnicodeString(UnicodeString &&src) U_NOEXCEPT; -#endif /** * 'Substring' constructor from tail of source string. diff --git a/deps/icu-small/source/common/unicode/unorm.h b/deps/icu-small/source/common/unicode/unorm.h index 1b5af16700fb9f..3839de129573c1 100644 --- a/deps/icu-small/source/common/unicode/unorm.h +++ b/deps/icu-small/source/common/unicode/unorm.h @@ -210,7 +210,7 @@ enum { * the output was truncated, and the error code is set to U_BUFFER_OVERFLOW_ERROR. * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_normalize(const UChar *source, int32_t sourceLength, UNormalizationMode mode, int32_t options, UChar *result, int32_t resultLength, @@ -236,7 +236,7 @@ unorm_normalize(const UChar *source, int32_t sourceLength, * @see unorm_isNormalized * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UNormalizationCheckResult U_EXPORT2 +U_DEPRECATED UNormalizationCheckResult U_EXPORT2 unorm_quickCheck(const UChar *source, int32_t sourcelength, UNormalizationMode mode, UErrorCode *status); @@ -257,7 +257,7 @@ unorm_quickCheck(const UChar *source, int32_t sourcelength, * @see unorm_isNormalized * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UNormalizationCheckResult U_EXPORT2 +U_DEPRECATED UNormalizationCheckResult U_EXPORT2 unorm_quickCheckWithOptions(const UChar *src, int32_t srcLength, UNormalizationMode mode, int32_t options, UErrorCode *pErrorCode); @@ -283,7 +283,7 @@ unorm_quickCheckWithOptions(const UChar *src, int32_t srcLength, * @see unorm_quickCheck * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UBool U_EXPORT2 +U_DEPRECATED UBool U_EXPORT2 unorm_isNormalized(const UChar *src, int32_t srcLength, UNormalizationMode mode, UErrorCode *pErrorCode); @@ -305,7 +305,7 @@ unorm_isNormalized(const UChar *src, int32_t srcLength, * @see unorm_isNormalized * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE UBool U_EXPORT2 +U_DEPRECATED UBool U_EXPORT2 unorm_isNormalizedWithOptions(const UChar *src, int32_t srcLength, UNormalizationMode mode, int32_t options, UErrorCode *pErrorCode); @@ -383,7 +383,7 @@ unorm_isNormalizedWithOptions(const UChar *src, int32_t srcLength, * * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_next(UCharIterator *src, UChar *dest, int32_t destCapacity, UNormalizationMode mode, int32_t options, @@ -416,7 +416,7 @@ unorm_next(UCharIterator *src, * * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_previous(UCharIterator *src, UChar *dest, int32_t destCapacity, UNormalizationMode mode, int32_t options, @@ -460,7 +460,7 @@ unorm_previous(UCharIterator *src, * * @deprecated ICU 56 Use unorm2.h instead. */ -U_STABLE int32_t U_EXPORT2 +U_DEPRECATED int32_t U_EXPORT2 unorm_concatenate(const UChar *left, int32_t leftLength, const UChar *right, int32_t rightLength, UChar *dest, int32_t destCapacity, diff --git a/deps/icu-small/source/common/unicode/unorm2.h b/deps/icu-small/source/common/unicode/unorm2.h index c6d3494d7057f5..a9bd02f256361f 100644 --- a/deps/icu-small/source/common/unicode/unorm2.h +++ b/deps/icu-small/source/common/unicode/unorm2.h @@ -32,6 +32,7 @@ #include "unicode/utypes.h" #include "unicode/localpointer.h" +#include "unicode/stringoptions.h" #include "unicode/uset.h" /** @@ -526,30 +527,6 @@ unorm2_hasBoundaryAfter(const UNormalizer2 *norm2, UChar32 c); U_STABLE UBool U_EXPORT2 unorm2_isInert(const UNormalizer2 *norm2, UChar32 c); -/** - * Option bit for unorm_compare: - * Both input strings are assumed to fulfill FCD conditions. - * @stable ICU 2.2 - */ -#define UNORM_INPUT_IS_FCD 0x20000 - -/** - * Option bit for unorm_compare: - * Perform case-insensitive comparison. - * @stable ICU 2.2 - */ -#define U_COMPARE_IGNORE_CASE 0x10000 - -#ifndef U_COMPARE_CODE_POINT_ORDER -/* see also unistr.h and ustring.h */ -/** - * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: - * Compare strings in code point order instead of code unit order. - * @stable ICU 2.2 - */ -#define U_COMPARE_CODE_POINT_ORDER 0x8000 -#endif - /** * Compares two strings for canonical equivalence. * Further options include case-insensitive comparison and diff --git a/deps/icu-small/source/common/unicode/urename.h b/deps/icu-small/source/common/unicode/urename.h index 21c839abbf908d..982655c4425e0b 100644 --- a/deps/icu-small/source/common/unicode/urename.h +++ b/deps/icu-small/source/common/unicode/urename.h @@ -107,6 +107,7 @@ #define _UTF7Data U_ICU_ENTRY_POINT_RENAME(_UTF7Data) #define _UTF8Data U_ICU_ENTRY_POINT_RENAME(_UTF8Data) #define allowedHourFormatsCleanup U_ICU_ENTRY_POINT_RENAME(allowedHourFormatsCleanup) +#define checkImpl U_ICU_ENTRY_POINT_RENAME(checkImpl) #define cmemory_cleanup U_ICU_ENTRY_POINT_RENAME(cmemory_cleanup) #define dayPeriodRulesCleanup U_ICU_ENTRY_POINT_RENAME(dayPeriodRulesCleanup) #define deleteAllowedHourFormats U_ICU_ENTRY_POINT_RENAME(deleteAllowedHourFormats) @@ -944,6 +945,7 @@ #define uhash_iget U_ICU_ENTRY_POINT_RENAME(uhash_iget) #define uhash_igeti U_ICU_ENTRY_POINT_RENAME(uhash_igeti) #define uhash_init U_ICU_ENTRY_POINT_RENAME(uhash_init) +#define uhash_initSize U_ICU_ENTRY_POINT_RENAME(uhash_initSize) #define uhash_iput U_ICU_ENTRY_POINT_RENAME(uhash_iput) #define uhash_iputi U_ICU_ENTRY_POINT_RENAME(uhash_iputi) #define uhash_iremove U_ICU_ENTRY_POINT_RENAME(uhash_iremove) @@ -1654,6 +1656,7 @@ #define ustr_hashICharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashICharsN) #define ustr_hashUCharsN U_ICU_ENTRY_POINT_RENAME(ustr_hashUCharsN) #define ustrcase_getCaseLocale U_ICU_ENTRY_POINT_RENAME(ustrcase_getCaseLocale) +#define ustrcase_getTitleBreakIterator U_ICU_ENTRY_POINT_RENAME(ustrcase_getTitleBreakIterator) #define ustrcase_internalFold U_ICU_ENTRY_POINT_RENAME(ustrcase_internalFold) #define ustrcase_internalToLower U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToLower) #define ustrcase_internalToTitle U_ICU_ENTRY_POINT_RENAME(ustrcase_internalToTitle) diff --git a/deps/icu-small/source/common/unicode/uscript.h b/deps/icu-small/source/common/unicode/uscript.h index 1420578f02b7ae..3ec235d50ce2c2 100644 --- a/deps/icu-small/source/common/unicode/uscript.h +++ b/deps/icu-small/source/common/unicode/uscript.h @@ -444,6 +444,13 @@ typedef enum UScriptCode { /** @stable ICU 58 */ USCRIPT_SYMBOLS_EMOJI = 174,/* Zsye */ + /** @stable ICU 60 */ + USCRIPT_MASARAM_GONDI = 175,/* Gonm */ + /** @stable ICU 60 */ + USCRIPT_SOYOMBO = 176,/* Soyo */ + /** @stable ICU 60 */ + USCRIPT_ZANABAZAR_SQUARE = 177,/* Zanb */ + #ifndef U_HIDE_DEPRECATED_API /** * One more than the highest normal UScriptCode value. @@ -451,7 +458,7 @@ typedef enum UScriptCode { * * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420. */ - USCRIPT_CODE_LIMIT = 175 + USCRIPT_CODE_LIMIT = 178 #endif // U_HIDE_DEPRECATED_API } UScriptCode; diff --git a/deps/icu-small/source/common/unicode/ustring.h b/deps/icu-small/source/common/unicode/ustring.h index 2099ab591300e3..1ea27126cc4de9 100644 --- a/deps/icu-small/source/common/unicode/ustring.h +++ b/deps/icu-small/source/common/unicode/ustring.h @@ -497,16 +497,6 @@ u_strCompare(const UChar *s1, int32_t length1, U_STABLE int32_t U_EXPORT2 u_strCompareIter(UCharIterator *iter1, UCharIterator *iter2, UBool codePointOrder); -#ifndef U_COMPARE_CODE_POINT_ORDER -/* see also unistr.h and unorm.h */ -/** - * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc: - * Compare strings in code point order instead of code unit order. - * @stable ICU 2.2 - */ -#define U_COMPARE_CODE_POINT_ORDER 0x8000 -#endif - /** * Compare two strings case-insensitively using full case folding. * This is equivalent to diff --git a/deps/icu-small/source/common/unicode/utext.h b/deps/icu-small/source/common/unicode/utext.h index edcb267597b92f..55709d403a6d02 100644 --- a/deps/icu-small/source/common/unicode/utext.h +++ b/deps/icu-small/source/common/unicode/utext.h @@ -768,7 +768,7 @@ utext_extract(UText *ut, */ #define UTEXT_SETNATIVEINDEX(ut, ix) \ { int64_t __offset = (ix) - (ut)->chunkNativeStart; \ - if (__offset>=0 && __offset<=(int64_t)(ut)->nativeIndexingLimit) { \ + if (__offset>=0 && __offset<(int64_t)(ut)->nativeIndexingLimit && (ut)->chunkContents[__offset]<0xdc00) { \ (ut)->chunkOffset=(int32_t)__offset; \ } else { \ utext_setNativeIndex((ut), (ix)); } } diff --git a/deps/icu-small/source/common/unicode/utf.h b/deps/icu-small/source/common/unicode/utf.h index ab7e9ac96aa77f..aa5698069154cc 100644 --- a/deps/icu-small/source/common/unicode/utf.h +++ b/deps/icu-small/source/common/unicode/utf.h @@ -23,9 +23,6 @@ * This file defines macros for checking whether a code point is * a surrogate or a non-character etc. * - * The UChar and UChar32 data types for Unicode code units and code points - * are defined in umachine.h because they can be machine-dependent. - * * If U_NO_DEFAULT_INCLUDE_UTF_HEADERS is 0 then utf.h is included by utypes.h * and itself includes utf8.h and utf16.h after some * common definitions. @@ -50,11 +47,11 @@ * but are optimized for the much more frequently occurring BMP code points. * * umachine.h defines UChar to be an unsigned 16-bit integer. - * Where available, UChar is defined to be a char16_t - * or a wchar_t (if that is an unsigned 16-bit type), otherwise uint16_t. + * Since ICU 59, ICU uses char16_t in C++, UChar only in C, + * and defines UChar=char16_t by default. See the UChar API docs for details. * * UChar32 is defined to be a signed 32-bit integer (int32_t), large enough for a 21-bit - * Unicode code point (Unicode scalar value, 0..0x10ffff). + * Unicode code point (Unicode scalar value, 0..0x10ffff) and U_SENTINEL (-1). * Before ICU 2.4, the definition of UChar32 was similarly platform-dependent as * the definition of UChar. For details see the documentation for UChar32 itself. * @@ -63,11 +60,20 @@ * For actual Unicode character properties see uchar.h. * * By default, string operations must be done with error checking in case - * a string is not well-formed UTF-16. - * The macros will detect if a surrogate code unit is unpaired + * a string is not well-formed UTF-16 or UTF-8. + * + * The U16_ macros detect if a surrogate code unit is unpaired * (lead unit without trail unit or vice versa) and just return the unit itself * as the code point. * + * The U8_ macros detect illegal byte sequences and return a negative value. + * Starting with ICU 60, the observable length of a single illegal byte sequence + * skipped by one of these macros follows the Unicode 6+ recommendation + * which is consistent with the W3C Encoding Standard. + * + * There are ..._OR_FFFD versions of both U16_ and U8_ macros + * that return U+FFFD for illegal code unit sequences. + * * The regular "safe" macros require that the initial, passed-in string index * is within bounds. They only check the index when they read more than one * code unit. This is usually done with code similar to the following loop: @@ -91,10 +97,7 @@ * The performance differences are much larger here because UTF-8 provides so * many opportunities for malformed sequences. * The unsafe UTF-8 macros are entirely implemented inside the macro definitions - * and are fast, while the safe UTF-8 macros call functions for all but the - * trivial (ASCII) cases. - * (ICU 3.6 optimizes U8_NEXT() and U8_APPEND() to handle most other common - * characters inline as well.) + * and are fast, while the safe UTF-8 macros call functions for some complicated cases. * * Unlike with UTF-16, malformed sequences cannot be expressed with distinct * code point values (0..U+10ffff). They are indicated with negative values instead. @@ -126,8 +129,7 @@ */ #define U_IS_UNICODE_NONCHAR(c) \ ((c)>=0xfdd0 && \ - ((uint32_t)(c)<=0xfdef || ((c)&0xfffe)==0xfffe) && \ - (uint32_t)(c)<=0x10ffff) + ((c)<=0xfdef || ((c)&0xfffe)==0xfffe) && (c)<=0x10ffff) /** * Is c a Unicode code point value (0..U+10ffff) @@ -148,9 +150,7 @@ */ #define U_IS_UNICODE_CHAR(c) \ ((uint32_t)(c)<0xd800 || \ - ((uint32_t)(c)>0xdfff && \ - (uint32_t)(c)<=0x10ffff && \ - !U_IS_UNICODE_NONCHAR(c))) + (0xdfff<(c) && (c)<=0x10ffff && !U_IS_UNICODE_NONCHAR(c))) /** * Is this code point a BMP code point (U+0000..U+ffff)? diff --git a/deps/icu-small/source/common/unicode/utf16.h b/deps/icu-small/source/common/unicode/utf16.h index 06653816123089..b9b9c59d3cb21f 100644 --- a/deps/icu-small/source/common/unicode/utf16.h +++ b/deps/icu-small/source/common/unicode/utf16.h @@ -185,8 +185,8 @@ * * The length can be negative for a NUL-terminated string. * - * If the offset points to a single, unpaired surrogate, then that itself - * will be returned as the code point. + * If the offset points to a single, unpaired surrogate, then + * c is set to that unpaired surrogate. * Iteration through a string is more efficient with U16_NEXT_UNSAFE or U16_NEXT. * * @param s const UChar * string @@ -213,6 +213,53 @@ } \ } +#ifndef U_HIDE_DRAFT_API + +/** + * Get a code point from a string at a random-access offset, + * without changing the offset. + * "Safe" macro, handles unpaired surrogates and checks for string boundaries. + * + * The offset may point to either the lead or trail surrogate unit + * for a supplementary code point, in which case the macro will read + * the adjacent matching surrogate as well. + * + * The length can be negative for a NUL-terminated string. + * + * If the offset points to a single, unpaired surrogate, then + * c is set to U+FFFD. + * Iteration through a string is more efficient with U16_NEXT_UNSAFE or U16_NEXT_OR_FFFD. + * + * @param s const UChar * string + * @param start starting string offset (usually 0) + * @param i string offset, must be start<=i(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \ + (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \ + } else { \ + (c)=0xfffd; \ + } \ + } \ + } \ +} + +#endif // U_HIDE_DRAFT_API + /* definitions with forward iteration --------------------------------------- */ /** @@ -253,8 +300,7 @@ * for a supplementary code point, in which case the macro will read * the following trail surrogate as well. * If the offset points to a trail surrogate or - * to a single, unpaired lead surrogate, then that itself - * will be returned as the code point. + * to a single, unpaired lead surrogate, then c is set to that unpaired surrogate. * * @param s const UChar * string * @param i string offset, must be i(start) && U16_IS_LEAD(__c2=(s)[(i)-1])) { \ + --(i); \ + (c)=U16_GET_SUPPLEMENTARY(__c2, (c)); \ + } else { \ + (c)=0xfffd; \ + } \ + } \ +} + +#endif // U_HIDE_DRAFT_API + /** * Move the string offset from one code point boundary to the previous one. * (Pre-decrementing backward iteration.) diff --git a/deps/icu-small/source/common/unicode/utf8.h b/deps/icu-small/source/common/unicode/utf8.h index 9e56b50474f404..59b4b2557021f0 100644 --- a/deps/icu-small/source/common/unicode/utf8.h +++ b/deps/icu-small/source/common/unicode/utf8.h @@ -41,34 +41,24 @@ /* internal definitions ----------------------------------------------------- */ - - /** * Counts the trail bytes for a UTF-8 lead byte. - * Returns 0 for 0..0xbf as well as for 0xfe and 0xff. + * Returns 0 for 0..0xc1 as well as for 0xf5..0xff. + * leadByte might be evaluated multiple times. * * This is internal since it is not meant to be called directly by external clients; * however it is called by public macros in this file and thus must remain stable. * - * Note: Beginning with ICU 50, the implementation uses a multi-condition expression - * which was shown in 2012 (on x86-64) to compile to fast, branch-free code. - * leadByte is evaluated multiple times. - * - * The pre-ICU 50 implementation used the exported array utf8_countTrailBytes: - * #define U8_COUNT_TRAIL_BYTES(leadByte) (utf8_countTrailBytes[leadByte]) - * leadByte was evaluated exactly once. - * * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. * @internal */ #define U8_COUNT_TRAIL_BYTES(leadByte) \ - ((uint8_t)(leadByte)<0xf0 ? \ - ((uint8_t)(leadByte)>=0xc0)+((uint8_t)(leadByte)>=0xe0) : \ - (uint8_t)(leadByte)<0xfe ? 3+((uint8_t)(leadByte)>=0xf8)+((uint8_t)(leadByte)>=0xfc) : 0) + (U8_IS_LEAD(leadByte) ? \ + ((uint8_t)(leadByte)>=0xe0)+((uint8_t)(leadByte)>=0xf0)+1 : 0) /** * Counts the trail bytes for a UTF-8 lead byte of a valid UTF-8 sequence. - * The maximum supported lead byte is 0xf4 corresponding to U+10FFFF. + * Returns 0 for 0..0xc1. Undefined for 0xf5..0xff. * leadByte might be evaluated multiple times. * * This is internal since it is not meant to be called directly by external clients; @@ -78,7 +68,7 @@ * @internal */ #define U8_COUNT_TRAIL_BYTES_UNSAFE(leadByte) \ - (((leadByte)>=0xc0)+((leadByte)>=0xe0)+((leadByte)>=0xf0)) + (((uint8_t)(leadByte)>=0xc2)+((uint8_t)(leadByte)>=0xe0)+((uint8_t)(leadByte)>=0xf0)) /** * Mask a UTF-8 lead byte, leave only the lower bits that form part of the code point value. @@ -89,6 +79,40 @@ */ #define U8_MASK_LEAD_BYTE(leadByte, countTrailBytes) ((leadByte)&=(1<<(6-(countTrailBytes)))-1) +/** + * Internal bit vector for 3-byte UTF-8 validity check, for use in U8_IS_VALID_LEAD3_AND_T1. + * Each bit indicates whether one lead byte + first trail byte pair starts a valid sequence. + * Lead byte E0..EF bits 3..0 are used as byte index, + * first trail byte bits 7..5 are used as bit index into that byte. + * @see U8_IS_VALID_LEAD3_AND_T1 + * @internal + */ +#define U8_LEAD3_T1_BITS "\x20\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x10\x30\x30" + +/** + * Internal 3-byte UTF-8 validity check. + * Non-zero if lead byte E0..EF and first trail byte 00..FF start a valid sequence. + * @internal + */ +#define U8_IS_VALID_LEAD3_AND_T1(lead, t1) (U8_LEAD3_T1_BITS[(lead)&0xf]&(1<<((uint8_t)(t1)>>5))) + +/** + * Internal bit vector for 4-byte UTF-8 validity check, for use in U8_IS_VALID_LEAD4_AND_T1. + * Each bit indicates whether one lead byte + first trail byte pair starts a valid sequence. + * First trail byte bits 7..4 are used as byte index, + * lead byte F0..F4 bits 2..0 are used as bit index into that byte. + * @see U8_IS_VALID_LEAD4_AND_T1 + * @internal + */ +#define U8_LEAD4_T1_BITS "\x00\x00\x00\x00\x00\x00\x00\x00\x1E\x0F\x0F\x0F\x00\x00\x00\x00" + +/** + * Internal 4-byte UTF-8 validity check. + * Non-zero if lead byte F0..F4 and first trail byte 00..FF start a valid sequence. + * @internal + */ +#define U8_IS_VALID_LEAD4_AND_T1(lead, t1) (U8_LEAD4_T1_BITS[(uint8_t)(t1)>>4]&(1<<((lead)&7))) + /** * Function for handling "next code point" with error-checking. * @@ -148,20 +172,21 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); #define U8_IS_SINGLE(c) (((c)&0x80)==0) /** - * Is this code unit (byte) a UTF-8 lead byte? + * Is this code unit (byte) a UTF-8 lead byte? (0xC2..0xF4) * @param c 8-bit code unit (byte) * @return TRUE or FALSE * @stable ICU 2.4 */ -#define U8_IS_LEAD(c) ((uint8_t)((c)-0xc0)<0x3e) +#define U8_IS_LEAD(c) ((uint8_t)((c)-0xc2)<=0x32) +// 0x32=0xf4-0xc2 /** - * Is this code unit (byte) a UTF-8 trail byte? + * Is this code unit (byte) a UTF-8 trail byte? (0x80..0xBF) * @param c 8-bit code unit (byte) * @return TRUE or FALSE * @stable ICU 2.4 */ -#define U8_IS_TRAIL(c) (((c)&0xc0)==0x80) +#define U8_IS_TRAIL(c) ((int8_t)(c)<-0x40) /** * How many code units (bytes) are used for the UTF-8 encoding @@ -289,7 +314,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_NEXT_UNSAFE(s, i, c) { \ (c)=(uint8_t)(s)[(i)++]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ if((c)<0xe0) { \ (c)=(((c)&0x1f)<<6)|((s)[(i)++]&0x3f); \ } else if((c)<0xf0) { \ @@ -325,22 +350,19 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_NEXT(s, i, length, c) { \ (c)=(uint8_t)(s)[(i)++]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ uint8_t __t1, __t2; \ - if( /* handle U+1000..U+CFFF inline */ \ - (0xe0<(c) && (c)<=0xec) && \ - (((i)+1)<(length) || (length)<0) && \ - (__t1=(uint8_t)((s)[i]-0x80))<=0x3f && \ - (__t2=(uint8_t)((s)[(i)+1]-0x80))<= 0x3f \ - ) { \ - /* no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ \ - (c)=(UChar)(((c)<<12)|(__t1<<6)|__t2); \ + if( /* handle U+0800..U+FFFF inline */ \ + (0xe0<=(c) && (c)<0xf0) && \ + (((i)+1)<(length) || (length)<0) && \ + U8_IS_VALID_LEAD3_AND_T1((c), __t1=(s)[i]) && \ + (__t2=(s)[(i)+1]-0x80)<=0x3f) { \ + (c)=(((c)&0xf)<<12)|((__t1&0x3f)<<6)|__t2; \ (i)+=2; \ } else if( /* handle U+0080..U+07FF inline */ \ - ((c)<0xe0 && (c)>=0xc2) && \ - ((i)!=(length)) && \ - (__t1=(uint8_t)((s)[i]-0x80))<=0x3f \ - ) { \ + ((c)<0xe0 && (c)>=0xc2) && \ + ((i)!=(length)) && \ + (__t1=(s)[i]-0x80)<=0x3f) { \ (c)=(((c)&0x1f)<<6)|__t1; \ ++(i); \ } else { \ @@ -376,22 +398,19 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_NEXT_OR_FFFD(s, i, length, c) { \ (c)=(uint8_t)(s)[(i)++]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ uint8_t __t1, __t2; \ - if( /* handle U+1000..U+CFFF inline */ \ - (0xe0<(c) && (c)<=0xec) && \ - (((i)+1)<(length) || (length)<0) && \ - (__t1=(uint8_t)((s)[i]-0x80))<=0x3f && \ - (__t2=(uint8_t)((s)[(i)+1]-0x80))<= 0x3f \ - ) { \ - /* no need for (c&0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ \ - (c)=(UChar)(((c)<<12)|(__t1<<6)|__t2); \ + if( /* handle U+0800..U+FFFF inline */ \ + (0xe0<=(c) && (c)<0xf0) && \ + (((i)+1)<(length) || (length)<0) && \ + U8_IS_VALID_LEAD3_AND_T1((c), __t1=(s)[i]) && \ + (__t2=(s)[(i)+1]-0x80)<=0x3f) { \ + (c)=(((c)&0xf)<<12)|((__t1&0x3f)<<6)|__t2; \ (i)+=2; \ } else if( /* handle U+0080..U+07FF inline */ \ - ((c)<0xe0 && (c)>=0xc2) && \ - ((i)!=(length)) && \ - (__t1=(uint8_t)((s)[i]-0x80))<=0x3f \ - ) { \ + ((c)<0xe0 && (c)>=0xc2) && \ + ((i)!=(length)) && \ + (__t1=(s)[i]-0x80)<=0x3f) { \ (c)=(((c)&0x1f)<<6)|__t1; \ ++(i); \ } else { \ @@ -476,7 +495,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @stable ICU 2.4 */ #define U8_FWD_1_UNSAFE(s, i) { \ - (i)+=1+U8_COUNT_TRAIL_BYTES_UNSAFE((uint8_t)(s)[i]); \ + (i)+=1+U8_COUNT_TRAIL_BYTES_UNSAFE((s)[i]); \ } /** @@ -493,15 +512,24 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); * @stable ICU 2.4 */ #define U8_FWD_1(s, i, length) { \ - uint8_t __b=(uint8_t)(s)[(i)++]; \ - if(U8_IS_LEAD(__b)) { \ - uint8_t __count=U8_COUNT_TRAIL_BYTES(__b); \ - if((i)+__count>(length) && (length)>=0) { \ - __count=(uint8_t)((length)-(i)); \ - } \ - while(__count>0 && U8_IS_TRAIL((s)[i])) { \ - ++(i); \ - --__count; \ + uint8_t __b=(s)[(i)++]; \ + if(U8_IS_LEAD(__b) && (i)!=(length)) { \ + uint8_t __t1=(s)[i]; \ + if((0xe0<=__b && __b<0xf0)) { \ + if(U8_IS_VALID_LEAD3_AND_T1(__b, __t1) && \ + ++(i)!=(length) && U8_IS_TRAIL((s)[i])) { \ + ++(i); \ + } \ + } else if(__b<0xe0) { \ + if(U8_IS_TRAIL(__t1)) { \ + ++(i); \ + } \ + } else /* c>=0xf0 */ { \ + if(U8_IS_VALID_LEAD4_AND_T1(__b, __t1) && \ + ++(i)!=(length) && U8_IS_TRAIL((s)[i]) && \ + ++(i)!=(length) && U8_IS_TRAIL((s)[i])) { \ + ++(i); \ + } \ } \ } \ } @@ -615,7 +643,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); /* c is a trail byte */ \ (c)&=0x3f; \ for(;;) { \ - __b=(uint8_t)(s)[--(i)]; \ + __b=(s)[--(i)]; \ if(__b>=0xc0) { \ U8_MASK_LEAD_BYTE(__b, __count); \ (c)|=(UChar32)__b<<__shift; \ @@ -651,7 +679,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_PREV(s, start, i, c) { \ (c)=(uint8_t)(s)[--(i)]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ (c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -1); \ } \ } @@ -682,7 +710,7 @@ utf8_back1SafeBody(const uint8_t *s, int32_t start, int32_t i); */ #define U8_PREV_OR_FFFD(s, start, i, c) { \ (c)=(uint8_t)(s)[--(i)]; \ - if((c)>=0x80) { \ + if(!U8_IS_SINGLE(c)) { \ (c)=utf8_prevCharSafeBody((const uint8_t *)s, start, &(i), c, -3); \ } \ } diff --git a/deps/icu-small/source/common/unicode/utf_old.h b/deps/icu-small/source/common/unicode/utf_old.h index cb229cb301583e..55c17c01df6db3 100644 --- a/deps/icu-small/source/common/unicode/utf_old.h +++ b/deps/icu-small/source/common/unicode/utf_old.h @@ -145,7 +145,22 @@ #ifndef __UTF_OLD_H__ #define __UTF_OLD_H__ -#ifndef U_HIDE_DEPRECATED_API +/** + * \def U_HIDE_OBSOLETE_UTF_OLD_H + * + * Hides the obsolete definitions in unicode/utf_old.h. + * Recommended to be set to 1 at compile time to make sure + * the long-deprecated macros are no longer used. + * + * For reasons for the deprecation see the utf_old.h file comments. + * + * @internal + */ +#ifndef U_HIDE_OBSOLETE_UTF_OLD_H +# define U_HIDE_OBSOLETE_UTF_OLD_H 0 +#endif + +#if !defined(U_HIDE_DEPRECATED_API) && !U_HIDE_OBSOLETE_UTF_OLD_H #include "unicode/utf.h" #include "unicode/utf8.h" @@ -1184,6 +1199,6 @@ U_CFUNC U_IMPORT const uint8_t utf8_countTrailBytes[]; /* U_IMPORT2? */ /*U_I */ #define UTF_SET_CHAR_LIMIT(s, start, i, length) U16_SET_CP_LIMIT(s, start, i, length) -#endif /* U_HIDE_DEPRECATED_API */ +#endif // !U_HIDE_DEPRECATED_API && !U_HIDE_OBSOLETE_UTF_OLD_H #endif diff --git a/deps/icu-small/source/common/unicode/uvernum.h b/deps/icu-small/source/common/unicode/uvernum.h index cae59ad880c411..ce7dec15535c7e 100644 --- a/deps/icu-small/source/common/unicode/uvernum.h +++ b/deps/icu-small/source/common/unicode/uvernum.h @@ -58,7 +58,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION_MAJOR_NUM 59 +#define U_ICU_VERSION_MAJOR_NUM 60 /** The current ICU minor version as an integer. * This value will change in the subsequent releases of ICU @@ -84,7 +84,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_SUFFIX _59 +#define U_ICU_VERSION_SUFFIX _60 /** * \def U_DEF2_ICU_ENTRY_POINT_RENAME @@ -119,24 +119,19 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "59.1" +#define U_ICU_VERSION "60.1" /** The current ICU library major/minor version as a string without dots, for library name suffixes. * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#if U_PLATFORM_HAS_WINUWP_API == 0 -#define U_ICU_VERSION_SHORT "59" -#else -// U_DISABLE_RENAMING does not impact dat file name -#define U_ICU_VERSION_SHORT -#endif /* U_PLATFORM_HAS_WINUWP_API == 0 */ +#define U_ICU_VERSION_SHORT "60" #ifndef U_HIDE_INTERNAL_API /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "59.1" +#define U_ICU_DATA_VERSION "60.1" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/deps/icu-small/source/common/unifiedcache.cpp b/deps/icu-small/source/common/unifiedcache.cpp index da1c88e84cba7d..fd0be593d786f2 100644 --- a/deps/icu-small/source/common/unifiedcache.cpp +++ b/deps/icu-small/source/common/unifiedcache.cpp @@ -24,8 +24,8 @@ static UConditionVar gInProgressValueAddedCond = U_CONDITION_INITIALIZER; static icu::UInitOnce gCacheInitOnce = U_INITONCE_INITIALIZER; static const int32_t MAX_EVICT_ITERATIONS = 10; -static int32_t DEFAULT_MAX_UNUSED = 1000; -static int32_t DEFAULT_PERCENTAGE_OF_IN_USE = 100; +static const int32_t DEFAULT_MAX_UNUSED = 1000; +static const int32_t DEFAULT_PERCENTAGE_OF_IN_USE = 100; U_CDECL_BEGIN diff --git a/deps/icu-small/source/common/unifiedcache.h b/deps/icu-small/source/common/unifiedcache.h index 5606e03bc99c70..947ebbdc78cf85 100644 --- a/deps/icu-small/source/common/unifiedcache.h +++ b/deps/icu-small/source/common/unifiedcache.h @@ -107,7 +107,7 @@ class CacheKey : public CacheKeyBase { */ virtual int32_t hashCode() const { const char *s = typeid(T).name(); - return ustr_hashCharsN(s, uprv_strlen(s)); + return ustr_hashCharsN(s, static_cast(uprv_strlen(s))); } /** diff --git a/deps/icu-small/source/common/uniset_props.cpp b/deps/icu-small/source/common/uniset_props.cpp index ea69d4161a2664..d0ed074a9be387 100644 --- a/deps/icu-small/source/common/uniset_props.cpp +++ b/deps/icu-small/source/common/uniset_props.cpp @@ -987,7 +987,7 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, UProperty p; int32_t v; - UBool mustNotBeEmpty = FALSE, invert = FALSE; + UBool invert = FALSE; if (value.length() > 0) { p = u_getPropertyEnum(pname.data()); @@ -1009,14 +1009,15 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, p == UCHAR_LEAD_CANONICAL_COMBINING_CLASS) { char* end; double value = uprv_strtod(vname.data(), &end); - v = (int32_t) value; - if (v != value || v < 0 || *end != 0) { - // non-integral or negative value, or trailing junk + // Anything between 0 and 255 is valid even if unused. + // Cast double->int only after range check. + // We catch NaN here because comparing it with both 0 and 255 will be false + // (as are all comparisons with NaN). + if (*end != 0 || !(0 <= value && value <= 255) || + (v = (int32_t)value) != value) { + // non-integral value or outside 0..255, or trailing junk FAIL(ec); } - // If the resultant set is empty then the numeric value - // was invalid. - mustNotBeEmpty = TRUE; } else { FAIL(ec); } @@ -1115,12 +1116,6 @@ UnicodeSet::applyPropertyAlias(const UnicodeString& prop, complement(); } - if (U_SUCCESS(ec) && (mustNotBeEmpty && isEmpty())) { - // mustNotBeEmpty is set to true if an empty set indicates - // invalid input. - ec = U_ILLEGAL_ARGUMENT_ERROR; - } - if (isBogus() && U_SUCCESS(ec)) { // We likely ran out of memory. AHHH! ec = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/common/unisetspan.cpp b/deps/icu-small/source/common/unisetspan.cpp index 09fb5b474c7e68..0a8893472f958b 100644 --- a/deps/icu-small/source/common/unisetspan.cpp +++ b/deps/icu-small/source/common/unisetspan.cpp @@ -502,7 +502,7 @@ spanOneBack(const UnicodeSet &set, const UChar *s, int32_t length) { static inline int32_t spanOneUTF8(const UnicodeSet &set, const uint8_t *s, int32_t length) { UChar32 c=*s; - if((int8_t)c>=0) { + if(U8_IS_SINGLE(c)) { return set.contains(c) ? 1 : -1; } // Take advantage of non-ASCII fastpaths in U8_NEXT_OR_FFFD(). @@ -514,7 +514,7 @@ spanOneUTF8(const UnicodeSet &set, const uint8_t *s, int32_t length) { static inline int32_t spanOneBackUTF8(const UnicodeSet &set, const uint8_t *s, int32_t length) { UChar32 c=s[length-1]; - if((int8_t)c>=0) { + if(U8_IS_SINGLE(c)) { return set.contains(c) ? 1 : -1; } int32_t i=length-1; @@ -1006,11 +1006,9 @@ int32_t UnicodeSetStringSpan::spanUTF8(const uint8_t *s, int32_t length, USetSpa // Try to match if the increment is not listed already. // Match at code point boundaries. (The UTF-8 strings were converted // from UTF-16 and are guaranteed to be well-formed.) - if( !U8_IS_TRAIL(s[pos-overlap]) && - !offsets.containsOffset(inc) && - matches8(s+pos-overlap, s8, length8) - - ) { + if(!U8_IS_TRAIL(s[pos-overlap]) && + !offsets.containsOffset(inc) && + matches8(s+pos-overlap, s8, length8)) { if(inc==rest) { return length; // Reached the end of the string. } @@ -1052,11 +1050,10 @@ int32_t UnicodeSetStringSpan::spanUTF8(const uint8_t *s, int32_t length, USetSpa // Try to match if the string is longer or starts earlier. // Match at code point boundaries. (The UTF-8 strings were converted // from UTF-16 and are guaranteed to be well-formed.) - if( !U8_IS_TRAIL(s[pos-overlap]) && - (overlap>maxOverlap || /* redundant overlap==maxOverlap && */ inc>maxInc) && - matches8(s+pos-overlap, s8, length8) - - ) { + if(!U8_IS_TRAIL(s[pos-overlap]) && + (overlap>maxOverlap || + /* redundant overlap==maxOverlap && */ inc>maxInc) && + matches8(s+pos-overlap, s8, length8)) { maxInc=inc; // Longest match from earliest start. maxOverlap=overlap; break; diff --git a/deps/icu-small/source/common/unistr.cpp b/deps/icu-small/source/common/unistr.cpp index 2db2856f0bb46f..48ad929e85a729 100644 --- a/deps/icu-small/source/common/unistr.cpp +++ b/deps/icu-small/source/common/unistr.cpp @@ -308,12 +308,10 @@ UnicodeString::UnicodeString(const UnicodeString& that) { copyFrom(that); } -#if U_HAVE_RVALUE_REFERENCES UnicodeString::UnicodeString(UnicodeString &&src) U_NOEXCEPT { fUnion.fFields.fLengthAndFlags = kShortString; moveFrom(src); } -#endif UnicodeString::UnicodeString(const UnicodeString& that, int32_t srcStart) { diff --git a/deps/icu-small/source/common/unistr_case.cpp b/deps/icu-small/source/common/unistr_case.cpp index 1c62ce5e974e23..2138d60c01c2d1 100644 --- a/deps/icu-small/source/common/unistr_case.cpp +++ b/deps/icu-small/source/common/unistr_case.cpp @@ -19,6 +19,7 @@ */ #include "unicode/utypes.h" +#include "unicode/brkiter.h" #include "unicode/casemap.h" #include "unicode/edits.h" #include "unicode/putil.h" @@ -104,6 +105,12 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER UBool writable = isBufferWritable(); UErrorCode errorCode = U_ZERO_ERROR; +#if !UCONFIG_NO_BREAK_ITERATION + // Read-only alias to the original string contents for the titlecasing BreakIterator. + // We cannot set the iterator simply to *this because *this is being modified. + UnicodeString oldString; +#endif + // Try to avoid heap-allocating a new character array for this string. if (writable ? oldLength <= UPRV_LENGTHOF(oldBuffer) : oldLength < US_STACKBUF_SIZE) { // Short string: Copy the contents into a temporary buffer and @@ -123,6 +130,12 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER buffer = fUnion.fStackFields.fBuffer; capacity = US_STACKBUF_SIZE; } +#if !UCONFIG_NO_BREAK_ITERATION + if (iter != nullptr) { + oldString.setTo(FALSE, oldArray, oldLength); + iter->setText(oldString); + } +#endif newLength = stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR buffer, capacity, oldArray, oldLength, NULL, errorCode); @@ -143,7 +156,13 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER oldArray = getArrayStart(); Edits edits; UChar replacementChars[200]; - stringCaseMapper(caseLocale, options | UCASEMAP_OMIT_UNCHANGED_TEXT, UCASEMAP_BREAK_ITERATOR +#if !UCONFIG_NO_BREAK_ITERATION + if (iter != nullptr) { + oldString.setTo(FALSE, oldArray, oldLength); + iter->setText(oldString); + } +#endif + stringCaseMapper(caseLocale, options | U_OMIT_UNCHANGED_TEXT, UCASEMAP_BREAK_ITERATOR replacementChars, UPRV_LENGTHOF(replacementChars), oldArray, oldLength, &edits, errorCode); if (U_SUCCESS(errorCode)) { @@ -179,6 +198,7 @@ UnicodeString::caseMap(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITER return *this; } errorCode = U_ZERO_ERROR; + // No need to iter->setText() again: The case mapper restarts via iter->first(). newLength = stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR getArrayStart(), getCapacity(), oldArray, oldLength, NULL, errorCode); diff --git a/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp b/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp index 3156fdfc5754af..4969884b0dc9b9 100644 --- a/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/unistr_titlecase_brkiter.cpp @@ -30,36 +30,26 @@ U_NAMESPACE_BEGIN UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter) { - return toTitle(titleIter, Locale::getDefault(), 0); +UnicodeString::toTitle(BreakIterator *iter) { + return toTitle(iter, Locale::getDefault(), 0); } UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale) { - return toTitle(titleIter, locale, 0); +UnicodeString::toTitle(BreakIterator *iter, const Locale &locale) { + return toTitle(iter, locale, 0); } UnicodeString & -UnicodeString::toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options) { - BreakIterator *bi=titleIter; - if(bi==NULL) { - UErrorCode errorCode=U_ZERO_ERROR; - bi=BreakIterator::createWordInstance(locale, errorCode); - if(U_FAILURE(errorCode)) { - setToBogus(); - return *this; +UnicodeString::toTitle(BreakIterator *iter, const Locale &locale, uint32_t options) { + LocalPointer ownedIter; + UErrorCode errorCode = U_ZERO_ERROR; + iter = ustrcase_getTitleBreakIterator(&locale, "", options, iter, ownedIter, errorCode); + if (iter == nullptr) { + setToBogus(); + return *this; } - } - // Because the "this" string is both the source and the destination, - // make a copy of the original source for use by the break iterator. - // See tickets #13127 and #13128 - UnicodeString copyOfInput(*this); - bi->setText(copyOfInput); - caseMap(ustrcase_getCaseLocale(locale.getBaseName()), options, bi, ustrcase_internalToTitle); - if(titleIter==NULL) { - delete bi; - } - return *this; + caseMap(ustrcase_getCaseLocale(locale.getBaseName()), options, iter, ustrcase_internalToTitle); + return *this; } U_NAMESPACE_END diff --git a/deps/icu-small/source/common/uprops.cpp b/deps/icu-small/source/common/uprops.cpp index fc91c8903d80ea..ace3c4d6d04652 100644 --- a/deps/icu-small/source/common/uprops.cpp +++ b/deps/icu-small/source/common/uprops.cpp @@ -206,6 +206,11 @@ static UBool isPOSIX_xdigit(const BinaryProperty &/*prop*/, UChar32 c, UProperty return u_isxdigit(c); } +static UBool isRegionalIndicator(const BinaryProperty &/*prop*/, UChar32 c, UProperty /*which*/) { + // Property starts are a subset of lb=RI etc. + return 0x1F1E6<=c && c<=0x1F1FF; +} + static const BinaryProperty binProps[UCHAR_BINARY_LIMIT]={ /* * column and mask values for binary properties from u_getUnicodeProperties(). @@ -276,6 +281,9 @@ static const BinaryProperty binProps[UCHAR_BINARY_LIMIT]={ { 2, U_MASK(UPROPS_2_EMOJI_PRESENTATION), defaultContains }, { 2, U_MASK(UPROPS_2_EMOJI_MODIFIER), defaultContains }, { 2, U_MASK(UPROPS_2_EMOJI_MODIFIER_BASE), defaultContains }, + { 2, U_MASK(UPROPS_2_EMOJI_COMPONENT), defaultContains }, + { 2, 0, isRegionalIndicator }, + { 1, U_MASK(UPROPS_PREPENDED_CONCATENATION_MARK), defaultContains }, }; U_CAPI UBool U_EXPORT2 diff --git a/deps/icu-small/source/common/uprops.h b/deps/icu-small/source/common/uprops.h index f5d69fe79cf42a..6f67756cd91033 100644 --- a/deps/icu-small/source/common/uprops.h +++ b/deps/icu-small/source/common/uprops.h @@ -189,15 +189,15 @@ enum { UPROPS_VARIATION_SELECTOR, UPROPS_PATTERN_SYNTAX, /* new in ICU 3.4 and Unicode 4.1 */ UPROPS_PATTERN_WHITE_SPACE, - UPROPS_RESERVED, /* reserved & unused */ + UPROPS_PREPENDED_CONCATENATION_MARK, // new in ICU 60 and Unicode 10 UPROPS_BINARY_1_TOP /* ==32 - full! */ }; /* * Properties in vector word 2 * Bits - * 31..28 http://www.unicode.org/reports/tr51/#Emoji_Properties - * 27..26 reserved + * 31..27 http://www.unicode.org/reports/tr51/#Emoji_Properties + * 26 reserved * 25..20 Line Break * 19..15 Sentence Break * 14..10 Word Break @@ -205,7 +205,8 @@ enum { * 4.. 0 Decomposition Type */ enum { - UPROPS_2_EMOJI=28, + UPROPS_2_EMOJI_COMPONENT=27, + UPROPS_2_EMOJI, UPROPS_2_EMOJI_PRESENTATION, UPROPS_2_EMOJI_MODIFIER, UPROPS_2_EMOJI_MODIFIER_BASE diff --git a/deps/icu-small/source/common/uresbund.cpp b/deps/icu-small/source/common/uresbund.cpp index 0dcbcaaf90d6bd..c88d9014ec23b7 100644 --- a/deps/icu-small/source/common/uresbund.cpp +++ b/deps/icu-small/source/common/uresbund.cpp @@ -1083,6 +1083,7 @@ static UResourceBundle *init_resb_result(const ResourceData *rdata, Resource r, pathBuf = (char *)uprv_malloc((uprv_strlen(keyPath)+1)*sizeof(char)); if(pathBuf == NULL) { *status = U_MEMORY_ALLOCATION_ERROR; + ures_close(mainRes); return NULL; } } diff --git a/deps/icu-small/source/common/uscript_props.cpp b/deps/icu-small/source/common/uscript_props.cpp index f8ec5e361d222b..7998c52c7f02c5 100644 --- a/deps/icu-small/source/common/uscript_props.cpp +++ b/deps/icu-small/source/common/uscript_props.cpp @@ -33,7 +33,7 @@ namespace { const int32_t UNKNOWN = 1 << 21; const int32_t EXCLUSION = 2 << 21; const int32_t LIMITED_USE = 3 << 21; -const int32_t ASPIRATIONAL = 4 << 21; +// st int32_t ASPIRATIONAL = 4 << 21; -- not used any more since Unicode 10 const int32_t RECOMMENDED = 5 << 21; // Bits 31..24: Single-bit flags @@ -71,7 +71,7 @@ const int32_t SCRIPT_PROPS[] = { 0x0EA5 | RECOMMENDED | LB_LETTERS, // Laoo 0x004C | RECOMMENDED | CASED, // Latn 0x0D15 | RECOMMENDED, // Mlym - 0x1826 | ASPIRATIONAL, // Mong + 0x1826 | LIMITED_USE, // Mong 0x1000 | RECOMMENDED | LB_LETTERS, // Mymr 0x168F | EXCLUSION, // Ogam 0x10300 | EXCLUSION, // Ital @@ -84,8 +84,8 @@ const int32_t SCRIPT_PROPS[] = { 0x078C | RECOMMENDED | RTL, // Thaa 0x0E17 | RECOMMENDED | LB_LETTERS, // Thai 0x0F40 | RECOMMENDED, // Tibt - 0x14C0 | ASPIRATIONAL, // Cans - 0xA288 | ASPIRATIONAL | LB_LETTERS, // Yiii + 0x14C0 | LIMITED_USE, // Cans + 0xA288 | LIMITED_USE | LB_LETTERS, // Yiii 0x1703 | EXCLUSION, // Tglg 0x1723 | EXCLUSION, // Hano 0x1743 | EXCLUSION, // Buhd @@ -104,7 +104,7 @@ const int32_t SCRIPT_PROPS[] = { 0x10A00 | EXCLUSION | RTL, // Khar 0xA800 | LIMITED_USE, // Sylo 0x1980 | LIMITED_USE | LB_LETTERS, // Talu - 0x2D30 | ASPIRATIONAL, // Tfng + 0x2D30 | LIMITED_USE, // Tfng 0x103A0 | EXCLUSION, // Xpeo 0x1B05 | LIMITED_USE, // Bali 0x1BC0 | LIMITED_USE, // Batk @@ -136,7 +136,7 @@ const int32_t SCRIPT_PROPS[] = { 0x1036B | EXCLUSION, // Perm 0xA840 | EXCLUSION, // Phag 0x10900 | EXCLUSION | RTL, // Phnx - 0x16F00 | ASPIRATIONAL, // Plrd + 0x16F00 | LIMITED_USE, // Plrd 0, 0, 0, @@ -194,7 +194,7 @@ const int32_t SCRIPT_PROPS[] = { 0, 0, 0x16A4F | EXCLUSION, // Mroo - 0, + 0x1B1C4 | EXCLUSION | LB_LETTERS, // Nshu 0x11183 | EXCLUSION, // Shrd 0x110D0 | EXCLUSION, // Sora 0x11680 | EXCLUSION, // Takr @@ -219,6 +219,9 @@ const int32_t SCRIPT_PROPS[] = { 0x5B57 | RECOMMENDED | LB_LETTERS, // Hanb 0x1112 | RECOMMENDED, // Jamo 0, + 0x11D10 | EXCLUSION, // Gonm + 0x11A5C | EXCLUSION, // Soyo + 0x11A0B | EXCLUSION, // Zanb // End copy-paste from parsescriptmetadata.py }; diff --git a/deps/icu-small/source/common/ustr_imp.h b/deps/icu-small/source/common/ustr_imp.h index eb5d0722585e4c..943824fa197645 100644 --- a/deps/icu-small/source/common/ustr_imp.h +++ b/deps/icu-small/source/common/ustr_imp.h @@ -18,6 +18,7 @@ #define __USTR_IMP_H__ #include "unicode/utypes.h" +#include "unicode/utf8.h" /** * Internal option for unorm_cmpEquivFold() for strncmp style. @@ -81,4 +82,62 @@ u_terminateUChar32s(UChar32 *dest, int32_t destCapacity, int32_t length, UErrorC U_CAPI int32_t U_EXPORT2 u_terminateWChars(wchar_t *dest, int32_t destCapacity, int32_t length, UErrorCode *pErrorCode); +/** + * Counts the bytes of any whole valid sequence for a UTF-8 lead byte. + * Returns 1 for ASCII 0..0x7f. + * Returns 0 for 0x80..0xc1 as well as for 0xf5..0xff. + * leadByte might be evaluated multiple times. + * + * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. + * @return 0..4 + */ +#define U8_COUNT_BYTES(leadByte) \ + (U8_IS_SINGLE(leadByte) ? 1 : U8_COUNT_BYTES_NON_ASCII(leadByte)) + +/** + * Counts the bytes of any whole valid sequence for a UTF-8 lead byte. + * Returns 0 for 0x00..0xc1 as well as for 0xf5..0xff. + * leadByte might be evaluated multiple times. + * + * @param leadByte The first byte of a UTF-8 sequence. Must be 0..0xff. + * @return 0 or 2..4 + */ +#define U8_COUNT_BYTES_NON_ASCII(leadByte) \ + (U8_IS_LEAD(leadByte) ? ((uint8_t)(leadByte)>=0xe0)+((uint8_t)(leadByte)>=0xf0)+2 : 0) + +#ifdef __cplusplus + +U_NAMESPACE_BEGIN + +class UTF8 { +public: + UTF8() = delete; // all static + + /** + * Is t a valid UTF-8 trail byte? + * + * @param prev Must be the preceding lead byte if i==1 and length>=3; + * otherwise ignored. + * @param t The i-th byte following the lead byte. + * @param i The index (1..3) of byte t in the byte sequence. 0 1) { + return U8_IS_TRAIL(t); + } else if (length == 3) { + return U8_IS_VALID_LEAD3_AND_T1(prev, t); + } else { // length == 4 + return U8_IS_VALID_LEAD4_AND_T1(prev, t); + } + } +}; + +U_NAMESPACE_END + +#endif // __cplusplus + #endif diff --git a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp index 0b2ba02064b324..89888cf336b0e9 100644 --- a/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp +++ b/deps/icu-small/source/common/ustr_titlecase_brkiter.cpp @@ -23,46 +23,153 @@ #include "unicode/brkiter.h" #include "unicode/casemap.h" +#include "unicode/chariter.h" #include "unicode/localpointer.h" #include "unicode/ubrk.h" #include "unicode/ucasemap.h" +#include "unicode/utext.h" #include "cmemory.h" +#include "uassert.h" #include "ucase.h" #include "ucasemap_imp.h" -U_NAMESPACE_USE +U_NAMESPACE_BEGIN -/* functions available in the common library (for unistr_case.cpp) */ +/** + * Whole-string BreakIterator. + * Titlecasing only calls setText(), first(), and next(). + * We implement the rest only to satisfy the abstract interface. + */ +class WholeStringBreakIterator : public BreakIterator { +public: + WholeStringBreakIterator() : BreakIterator(), length(0) {} + ~WholeStringBreakIterator() U_OVERRIDE; + UBool operator==(const BreakIterator&) const U_OVERRIDE; + BreakIterator *clone() const U_OVERRIDE; + static UClassID U_EXPORT2 getStaticClassID(); + UClassID getDynamicClassID() const U_OVERRIDE; + CharacterIterator &getText() const U_OVERRIDE; + UText *getUText(UText *fillIn, UErrorCode &errorCode) const U_OVERRIDE; + void setText(const UnicodeString &text) U_OVERRIDE; + void setText(UText *text, UErrorCode &errorCode) U_OVERRIDE; + void adoptText(CharacterIterator* it) U_OVERRIDE; + int32_t first() U_OVERRIDE; + int32_t last() U_OVERRIDE; + int32_t previous() U_OVERRIDE; + int32_t next() U_OVERRIDE; + int32_t current() const U_OVERRIDE; + int32_t following(int32_t offset) U_OVERRIDE; + int32_t preceding(int32_t offset) U_OVERRIDE; + UBool isBoundary(int32_t offset) U_OVERRIDE; + int32_t next(int32_t n) U_OVERRIDE; + BreakIterator *createBufferClone(void *stackBuffer, int32_t &BufferSize, + UErrorCode &errorCode) U_OVERRIDE; + BreakIterator &refreshInputText(UText *input, UErrorCode &errorCode) U_OVERRIDE; -/* public API functions */ +private: + int32_t length; +}; -U_CAPI int32_t U_EXPORT2 -u_strToTitle(UChar *dest, int32_t destCapacity, - const UChar *src, int32_t srcLength, - UBreakIterator *titleIter, - const char *locale, - UErrorCode *pErrorCode) { - LocalPointer ownedIter; - BreakIterator *iter; - if(titleIter!=NULL) { - iter=reinterpret_cast(titleIter); - } else { - iter=BreakIterator::createWordInstance(Locale(locale), *pErrorCode); - ownedIter.adoptInstead(iter); +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(WholeStringBreakIterator) + +WholeStringBreakIterator::~WholeStringBreakIterator() {} +UBool WholeStringBreakIterator::operator==(const BreakIterator&) const { return FALSE; } +BreakIterator *WholeStringBreakIterator::clone() const { return nullptr; } + +CharacterIterator &WholeStringBreakIterator::getText() const { + U_ASSERT(FALSE); // really should not be called + // Returns a null reference. + // Otherwise we would have to define a dummy CharacterIterator, + // and either have it as a field and const_cast it to a non-const reference, + // or have it via a pointer and return a reference to that. + CharacterIterator *none = nullptr; + return *none; +} +UText *WholeStringBreakIterator::getUText(UText * /*fillIn*/, UErrorCode &errorCode) const { + if (U_SUCCESS(errorCode)) { + errorCode = U_UNSUPPORTED_ERROR; } - if(U_FAILURE(*pErrorCode)) { - return 0; + return nullptr; +} + +void WholeStringBreakIterator::setText(const UnicodeString &text) { + length = text.length(); +} +void WholeStringBreakIterator::setText(UText *text, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + int64_t length64 = utext_nativeLength(text); + if (length64 <= INT32_MAX) { + length = (int32_t)length64; + } else { + errorCode = U_INDEX_OUTOFBOUNDS_ERROR; + } } - UnicodeString s(srcLength<0, src, srcLength); - iter->setText(s); - return ustrcase_mapWithOverlap( - ustrcase_getCaseLocale(locale), 0, iter, - dest, destCapacity, - src, srcLength, - ustrcase_internalToTitle, *pErrorCode); +} +void WholeStringBreakIterator::adoptText(CharacterIterator* it) { + U_ASSERT(FALSE); // should not be called + length = it->getLength(); + delete it; } -U_NAMESPACE_BEGIN +int32_t WholeStringBreakIterator::first() { return 0; } +int32_t WholeStringBreakIterator::last() { return length; } +int32_t WholeStringBreakIterator::previous() { return 0; } +int32_t WholeStringBreakIterator::next() { return length; } +int32_t WholeStringBreakIterator::current() const { return 0; } +int32_t WholeStringBreakIterator::following(int32_t /*offset*/) { return length; } +int32_t WholeStringBreakIterator::preceding(int32_t /*offset*/) { return 0; } +UBool WholeStringBreakIterator::isBoundary(int32_t /*offset*/) { return FALSE; } +int32_t WholeStringBreakIterator::next(int32_t /*n*/) { return length; } + +BreakIterator *WholeStringBreakIterator::createBufferClone( + void * /*stackBuffer*/, int32_t & /*BufferSize*/, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + errorCode = U_UNSUPPORTED_ERROR; + } + return nullptr; +} +BreakIterator &WholeStringBreakIterator::refreshInputText( + UText * /*input*/, UErrorCode &errorCode) { + if (U_SUCCESS(errorCode)) { + errorCode = U_UNSUPPORTED_ERROR; + } + return *this; +} + +U_CFUNC +BreakIterator *ustrcase_getTitleBreakIterator( + const Locale *locale, const char *locID, uint32_t options, BreakIterator *iter, + LocalPointer &ownedIter, UErrorCode &errorCode) { + if (U_FAILURE(errorCode)) { return nullptr; } + options &= U_TITLECASE_ITERATOR_MASK; + if (options != 0 && iter != nullptr) { + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + return nullptr; + } + if (iter == nullptr) { + switch (options) { + case 0: + iter = BreakIterator::createWordInstance( + locale != nullptr ? *locale : Locale(locID), errorCode); + break; + case U_TITLECASE_WHOLE_STRING: + iter = new WholeStringBreakIterator(); + if (iter == nullptr) { + errorCode = U_MEMORY_ALLOCATION_ERROR; + } + break; + case U_TITLECASE_SENTENCES: + iter = BreakIterator::createSentenceInstance( + locale != nullptr ? *locale : Locale(locID), errorCode); + break; + default: + errorCode = U_ILLEGAL_ARGUMENT_ERROR; + break; + } + ownedIter.adoptInstead(iter); + } + return iter; +} int32_t CaseMap::toTitle( const char *locale, uint32_t options, BreakIterator *iter, @@ -70,11 +177,8 @@ int32_t CaseMap::toTitle( UChar *dest, int32_t destCapacity, Edits *edits, UErrorCode &errorCode) { LocalPointer ownedIter; + iter = ustrcase_getTitleBreakIterator(nullptr, locale, options, iter, ownedIter, errorCode); if(iter==NULL) { - iter=BreakIterator::createWordInstance(Locale(locale), errorCode); - ownedIter.adoptInstead(iter); - } - if(U_FAILURE(errorCode)) { return 0; } UnicodeString s(srcLength<0, src, srcLength); @@ -88,6 +192,30 @@ int32_t CaseMap::toTitle( U_NAMESPACE_END +U_NAMESPACE_USE + +U_CAPI int32_t U_EXPORT2 +u_strToTitle(UChar *dest, int32_t destCapacity, + const UChar *src, int32_t srcLength, + UBreakIterator *titleIter, + const char *locale, + UErrorCode *pErrorCode) { + LocalPointer ownedIter; + BreakIterator *iter = ustrcase_getTitleBreakIterator( + nullptr, locale, 0, reinterpret_cast(titleIter), + ownedIter, *pErrorCode); + if (iter == nullptr) { + return 0; + } + UnicodeString s(srcLength<0, src, srcLength); + iter->setText(s); + return ustrcase_mapWithOverlap( + ustrcase_getCaseLocale(locale), 0, iter, + dest, destCapacity, + src, srcLength, + ustrcase_internalToTitle, *pErrorCode); +} + U_CAPI int32_t U_EXPORT2 ucasemap_toTitle(UCaseMap *csm, UChar *dest, int32_t destCapacity, @@ -97,10 +225,13 @@ ucasemap_toTitle(UCaseMap *csm, return 0; } if (csm->iter == NULL) { - csm->iter = BreakIterator::createWordInstance(Locale(csm->locale), *pErrorCode); - } - if (U_FAILURE(*pErrorCode)) { - return 0; + LocalPointer ownedIter; + BreakIterator *iter = ustrcase_getTitleBreakIterator( + nullptr, csm->locale, csm->options, nullptr, ownedIter, *pErrorCode); + if (iter == nullptr) { + return 0; + } + csm->iter = ownedIter.orphan(); } UnicodeString s(srcLength<0, src, srcLength); csm->iter->setText(s); diff --git a/deps/icu-small/source/common/ustrcase.cpp b/deps/icu-small/source/common/ustrcase.cpp index b12e7a7c0b3a10..b1beb34277896c 100644 --- a/deps/icu-small/source/common/ustrcase.cpp +++ b/deps/icu-small/source/common/ustrcase.cpp @@ -24,6 +24,7 @@ #include "unicode/brkiter.h" #include "unicode/casemap.h" #include "unicode/edits.h" +#include "unicode/stringoptions.h" #include "unicode/ustring.h" #include "unicode/ucasemap.h" #include "unicode/ubrk.h" @@ -72,9 +73,9 @@ appendResult(UChar *dest, int32_t destIndex, int32_t destCapacity, /* (not) original code point */ if(edits!=NULL) { edits->addUnchanged(cpLength); - if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { - return destIndex; - } + } + if(options & U_OMIT_UNCHANGED_TEXT) { + return destIndex; } c=~result; if(destIndex0) { if(edits!=NULL) { edits->addUnchanged(length); - if(options & UCASEMAP_OMIT_UNCHANGED_TEXT) { - return destIndex; - } + } + if(options & U_OMIT_UNCHANGED_TEXT) { + return destIndex; } if(length>(INT32_MAX-destIndex)) { return -1; // integer overflow @@ -237,7 +238,7 @@ ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *it const UChar *src, int32_t srcLength, icu::Edits *edits, UErrorCode &errorCode) { - if(U_FAILURE(errorCode)) { + if (!ustrcase_checkTitleAdjustmentOptions(options, errorCode)) { return 0; } @@ -264,45 +265,38 @@ ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *it } /* - * Unicode 4 & 5 section 3.13 Default Case Operations: - * - * R3 toTitlecase(X): Find the word boundaries based on Unicode Standard Annex - * #29, "Text Boundaries." Between each pair of word boundaries, find the first - * cased character F. If F exists, map F to default_title(F); then map each - * subsequent character C to default_lower(C). - * - * In this implementation, segment [prev..index[ into 3 parts: - * a) uncased characters (copy as-is) [prev..titleStart[ - * b) first case letter (titlecase) [titleStart..titleLimit[ + * Segment [prev..index[ into 3 parts: + * a) skipped characters (copy as-is) [prev..titleStart[ + * b) first letter (titlecase) [titleStart..titleLimit[ * c) subsequent characters (lowercase) [titleLimit..index[ */ if(prev 0; int32_t i2 = i + 1; @@ -965,7 +961,7 @@ int32_t toUpper(uint32_t options, edits->addUnchanged(oldLength); } // Write unchanged text? - change = (options & UCASEMAP_OMIT_UNCHANGED_TEXT) == 0; + change = (options & U_OMIT_UNCHANGED_TEXT) == 0; } } @@ -1110,7 +1106,7 @@ ustrcase_map(int32_t caseLocale, uint32_t options, UCASEMAP_BREAK_ITERATOR_PARAM return 0; } - if(edits!=NULL) { + if (edits != nullptr && (options & U_EDITS_NO_RESET) == 0) { edits->reset(); } destLength=stringCaseMapper(caseLocale, options, UCASEMAP_BREAK_ITERATOR diff --git a/deps/icu-small/source/common/ustrtrns.cpp b/deps/icu-small/source/common/ustrtrns.cpp index 98d92fc4ab693b..583ec63c323aee 100644 --- a/deps/icu-small/source/common/ustrtrns.cpp +++ b/deps/icu-small/source/common/ustrtrns.cpp @@ -256,152 +256,6 @@ u_strToUTF32(UChar32 *dest, pErrorCode); } -/* for utf8_nextCharSafeBodyTerminated() */ -static const UChar32 -utf8_minLegal[4]={ 0, 0x80, 0x800, 0x10000 }; - -/* - * Version of utf8_nextCharSafeBody() with the following differences: - * - checks for NUL termination instead of length - * - works with pointers instead of indexes - * - always strict (strict==-1) - * - * *ps points to after the lead byte and will be moved to after the last trail byte. - * c is the lead byte. - * @return the code point, or U_SENTINEL - */ -static UChar32 -utf8_nextCharSafeBodyTerminated(const uint8_t **ps, UChar32 c) { - const uint8_t *s=*ps; - uint8_t trail, illegal=0; - uint8_t count=U8_COUNT_TRAIL_BYTES(c); - U_ASSERT(count<6); - U8_MASK_LEAD_BYTE((c), count); - /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and 0xff */ - switch(count) { - /* each branch falls through to the next one */ - case 5: - case 4: - /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */ - illegal=1; - break; - case 3: - trail=(uint8_t)(*s++ - 0x80); - c=(c<<6)|trail; - if(trail>0x3f || c>=0x110) { - /* not a trail byte, or code point>0x10ffff (outside Unicode) */ - illegal=1; - break; - } - U_FALLTHROUGH; - case 2: - trail=(uint8_t)(*s++ - 0x80); - if(trail>0x3f) { - /* not a trail byte */ - illegal=1; - break; - } - c=(c<<6)|trail; - U_FALLTHROUGH; - case 1: - trail=(uint8_t)(*s++ - 0x80); - if(trail>0x3f) { - /* not a trail byte */ - illegal=1; - } - c=(c<<6)|trail; - break; - case 0: - return U_SENTINEL; - /* no default branch to optimize switch() - all values are covered */ - } - - /* correct sequence - all trail bytes have (b7..b6)==(10)? */ - /* illegal is also set if count>=4 */ - if(illegal || c0 && U8_IS_TRAIL(*s)) { - ++s; - --count; - } - c=U_SENTINEL; - } - *ps=s; - return c; -} - -/* - * Version of utf8_nextCharSafeBody() with the following differences: - * - works with pointers instead of indexes - * - always strict (strict==-1) - * - * *ps points to after the lead byte and will be moved to after the last trail byte. - * c is the lead byte. - * @return the code point, or U_SENTINEL - */ -static UChar32 -utf8_nextCharSafeBodyPointer(const uint8_t **ps, const uint8_t *limit, UChar32 c) { - const uint8_t *s=*ps; - uint8_t trail, illegal=0; - uint8_t count=U8_COUNT_TRAIL_BYTES(c); - if((limit-s)>=count) { - U8_MASK_LEAD_BYTE((c), count); - /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and 0xff */ - switch(count) { - /* each branch falls through to the next one */ - case 5: - case 4: - /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */ - illegal=1; - break; - case 3: - trail=*s++; - c=(c<<6)|(trail&0x3f); - if(c<0x110) { - illegal|=(trail&0xc0)^0x80; - } else { - /* code point>0x10ffff, outside Unicode */ - illegal=1; - break; - } - U_FALLTHROUGH; - case 2: - trail=*s++; - c=(c<<6)|(trail&0x3f); - illegal|=(trail&0xc0)^0x80; - U_FALLTHROUGH; - case 1: - trail=*s++; - c=(c<<6)|(trail&0x3f); - illegal|=(trail&0xc0)^0x80; - break; - case 0: - return U_SENTINEL; - /* no default branch to optimize switch() - all values are covered */ - } - } else { - illegal=1; /* too few bytes left */ - } - - /* correct sequence - all trail bytes have (b7..b6)==(10)? */ - /* illegal is also set if count>=4 */ - U_ASSERT(illegal || count0 && s 0) || subchar > 0x10ffff || U_IS_SURROGATE(subchar) @@ -434,7 +279,10 @@ u_strFromUTF8WithSub(UChar *dest, if(pNumSubstitutions!=NULL) { *pNumSubstitutions=0; } - numSubstitutions=0; + UChar *pDest = dest; + UChar *pDestLimit = dest+destCapacity; + int32_t reqLength = 0; + int32_t numSubstitutions=0; /* * Inline processing of UTF-8 byte sequences: @@ -455,95 +303,81 @@ u_strFromUTF8WithSub(UChar *dest, * The code explicitly checks for NULs only in the lead byte position. * A NUL byte in the trail byte position fails the trail byte range check anyway. */ - while(((ch = *pSrc) != 0) && (pDest < pDestLimit)) { - if(ch <= 0x7f){ - *pDest++=(UChar)ch; - ++pSrc; + int32_t i; + UChar32 c; + for(i = 0; (c = (uint8_t)src[i]) != 0 && (pDest < pDestLimit);) { + // modified copy of U8_NEXT() + ++i; + if(U8_IS_SINGLE(c)) { + *pDest++=(UChar)c; } else { - if(ch > 0xe0) { - if( /* handle U+1000..U+CFFF inline */ - ch <= 0xec && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f - ) { - /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ - *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); - pSrc += 3; - continue; - } - } else if(ch < 0xe0) { - if( /* handle U+0080..U+07FF inline */ - ch >= 0xc2 && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f - ) { - *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; - continue; - } - } - - /* function call for "complicated" and error cases */ - ++pSrc; /* continue after the lead byte */ - ch=utf8_nextCharSafeBodyTerminated(&pSrc, ch); - if(ch<0 && (++numSubstitutions, ch = subchar) < 0) { - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - } else if(ch<=0xFFFF) { - *(pDest++)=(UChar)ch; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + U8_IS_VALID_LEAD3_AND_T1((c), src[i]) && + (__t2=src[(i)+1]-0x80)<=0x3f) { + *pDest++ = (((c)&0xf)<<12)|((src[i]&0x3f)<<6)|__t2; + i+=2; + } else if( /* handle U+0080..U+07FF inline */ + ((c)<0xe0 && (c)>=0xc2) && + (__t1=src[i]-0x80)<=0x3f) { + *pDest++ = (((c)&0x1f)<<6)|__t1; + ++(i); } else { - *(pDest++)=U16_LEAD(ch); - if(pDest 0xe0) { - if( /* handle U+1000..U+CFFF inline */ - ch <= 0xec && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f && - (uint8_t)(pSrc[2] - 0x80) <= 0x3f - ) { - ++reqLength; - pSrc += 3; - continue; - } - } else if(ch < 0xe0) { - if( /* handle U+0080..U+07FF inline */ - ch >= 0xc2 && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f - ) { - ++reqLength; - pSrc += 2; - continue; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + U8_IS_VALID_LEAD3_AND_T1((c), src[i]) && + (__t2=src[(i)+1]-0x80)<=0x3f) { + ++reqLength; + i+=2; + } else if( /* handle U+0080..U+07FF inline */ + ((c)<0xe0 && (c)>=0xc2) && + (__t1=src[i]-0x80)<=0x3f) { + ++reqLength; + ++(i); + } else { + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), -1, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; } + reqLength += U16_LENGTH(c); } - - /* function call for "complicated" and error cases */ - ++pSrc; /* continue after the lead byte */ - ch=utf8_nextCharSafeBodyTerminated(&pSrc, ch); - if(ch<0 && (++numSubstitutions, ch = subchar) < 0) { - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - } - reqLength += U16_LENGTH(ch); } } } else /* srcLength >= 0 */ { - const uint8_t *pSrcLimit = pSrc + srcLength; - int32_t count; - - /* Faster loop without ongoing checking for pSrcLimit and pDestLimit. */ + /* Faster loop without ongoing checking for srcLength and pDestLimit. */ + int32_t i = 0; + UChar32 c; for(;;) { /* * Each iteration of the inner loop progresses by at most 3 UTF-8 @@ -551,10 +385,10 @@ u_strFromUTF8WithSub(UChar *dest, * For supplementary code points (4 & 2), which are rare, * there is an additional adjustment. */ - count = (int32_t)(pDestLimit - pDest); - srcLength = (int32_t)((pSrcLimit - pSrc) / 3); - if(count > srcLength) { - count = srcLength; /* min(remaining dest, remaining src/3) */ + int32_t count = (int32_t)(pDestLimit - pDest); + int32_t count2 = (srcLength - i) / 3; + if(count > count2) { + count = count2; /* min(remaining dest, remaining src/3) */ } if(count < 3) { /* @@ -565,147 +399,123 @@ u_strFromUTF8WithSub(UChar *dest, } do { - ch = *pSrc; - if(ch <= 0x7f){ - *pDest++=(UChar)ch; - ++pSrc; + // modified copy of U8_NEXT() + c = (uint8_t)src[i++]; + if(U8_IS_SINGLE(c)) { + *pDest++=(UChar)c; } else { - if(ch > 0xe0) { - if( /* handle U+1000..U+CFFF inline */ - ch <= 0xec && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f - ) { - /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ - *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); - pSrc += 3; - continue; - } - } else if(ch < 0xe0) { - if( /* handle U+0080..U+07FF inline */ - ch >= 0xc2 && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f - ) { - *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; - continue; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + ((i)+1)=0xc2) && + ((i)!=srcLength) && + (__t1=src[i]-0x80)<=0x3f) { + *pDest++ = (((c)&0x1f)<<6)|__t1; + ++(i); + } else { + if(c >= 0xf0 || subchar > 0xffff) { + // We may read up to four bytes and write up to two UChars, + // which we didn't account for with computing count, + // so we adjust it here. + if(--count == 0) { + --i; // back out byte c + break; + } } - } - if(ch >= 0xf0 || subchar > 0xffff) { - /* - * We may read up to six bytes and write up to two UChars, - * which we didn't account for with computing count, - * so we adjust it here. - */ - if(--count == 0) { - break; + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + } else if(c<=0xFFFF) { + *(pDest++)=(UChar)c; + } else { + *(pDest++)=U16_LEAD(c); + *(pDest++)=U16_TRAIL(c); } } - - /* function call for "complicated" and error cases */ - ++pSrc; /* continue after the lead byte */ - ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); - if(ch<0 && (++numSubstitutions, ch = subchar) < 0){ - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - }else if(ch<=0xFFFF){ - *(pDest++)=(UChar)ch; - }else{ - *(pDest++)=U16_LEAD(ch); - *(pDest++)=U16_TRAIL(ch); - } } } while(--count > 0); } - while((pSrc 0xe0) { - if( /* handle U+1000..U+CFFF inline */ - ch <= 0xec && - ((pSrcLimit - pSrc) >= 3) && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f - ) { - /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ - *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); - pSrc += 3; - continue; - } - } else if(ch < 0xe0) { - if( /* handle U+0080..U+07FF inline */ - ch >= 0xc2 && - ((pSrcLimit - pSrc) >= 2) && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f - ) { - *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; - continue; - } - } - - /* function call for "complicated" and error cases */ - ++pSrc; /* continue after the lead byte */ - ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); - if(ch<0 && (++numSubstitutions, ch = subchar) < 0){ - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - }else if(ch<=0xFFFF){ - *(pDest++)=(UChar)ch; - }else{ - *(pDest++)=U16_LEAD(ch); - if(pDest=0xc2) && + ((i)!=srcLength) && + (__t1=src[i]-0x80)<=0x3f) { + *pDest++ = (((c)&0x1f)<<6)|__t1; + ++(i); + } else { + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; + } else if(c<=0xFFFF) { + *(pDest++)=(UChar)c; + } else { + *(pDest++)=U16_LEAD(c); + if(pDest 0xe0) { - if( /* handle U+1000..U+CFFF inline */ - ch <= 0xec && - ((pSrcLimit - pSrc) >= 3) && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f && - (uint8_t)(pSrc[2] - 0x80) <= 0x3f - ) { - reqLength++; - pSrc += 3; - continue; - } - } else if(ch < 0xe0) { - if( /* handle U+0080..U+07FF inline */ - ch >= 0xc2 && - ((pSrcLimit - pSrc) >= 2) && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f - ) { - reqLength++; - pSrc += 2; - continue; + uint8_t __t1, __t2; + if( /* handle U+0800..U+FFFF inline */ + (0xe0<=(c) && (c)<0xf0) && + ((i)+1)=0xc2) && + ((i)!=srcLength) && + (__t1=src[i]-0x80)<=0x3f) { + ++reqLength; + ++(i); + } else { + /* function call for "complicated" and error cases */ + (c)=utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, c, -1); + if(c<0 && (++numSubstitutions, c = subchar) < 0) { + *pErrorCode = U_INVALID_CHAR_FOUND; + return NULL; } + reqLength += U16_LENGTH(c); } - - /* function call for "complicated" and error cases */ - ++pSrc; /* continue after the lead byte */ - ch=utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); - if(ch<0 && (++numSubstitutions, ch = subchar) < 0){ - *pErrorCode = U_INVALID_CHAR_FOUND; - return NULL; - } - reqLength+=U16_LENGTH(ch); } } } @@ -753,7 +563,7 @@ u_strFromUTF8Lenient(UChar *dest, uint8_t* pSrc = (uint8_t*) src; /* args check */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ + if(U_FAILURE(*pErrorCode)){ return NULL; } @@ -994,7 +804,7 @@ u_strToUTF8WithSub(char *dest, int32_t numSubstitutions; /* args check */ - if(pErrorCode==NULL || U_FAILURE(*pErrorCode)){ + if(U_FAILURE(*pErrorCode)){ return NULL; } @@ -1266,18 +1076,8 @@ u_strFromJavaModifiedUTF8WithSub( int32_t srcLength, UChar32 subchar, int32_t *pNumSubstitutions, UErrorCode *pErrorCode) { - UChar *pDest = dest; - UChar *pDestLimit = dest+destCapacity; - UChar32 ch; - int32_t reqLength = 0; - const uint8_t* pSrc = (const uint8_t*) src; - const uint8_t *pSrcLimit; - int32_t count; - uint8_t t1, t2; /* trail bytes */ - int32_t numSubstitutions; - /* args check */ - if(U_FAILURE(*pErrorCode)){ + if(U_FAILURE(*pErrorCode)) { return NULL; } if( (src==NULL && srcLength!=0) || srcLength < -1 || @@ -1291,18 +1091,22 @@ u_strFromJavaModifiedUTF8WithSub( if(pNumSubstitutions!=NULL) { *pNumSubstitutions=0; } - numSubstitutions=0; + UChar *pDest = dest; + UChar *pDestLimit = dest+destCapacity; + int32_t reqLength = 0; + int32_t numSubstitutions=0; if(srcLength < 0) { /* * Transform a NUL-terminated ASCII string. * Handle non-ASCII strings with slower code. */ - while(((ch = *pSrc) != 0) && ch <= 0x7f && (pDest < pDestLimit)) { - *pDest++=(UChar)ch; - ++pSrc; + UChar32 c; + while(((c = (uint8_t)*src) != 0) && c <= 0x7f && (pDest < pDestLimit)) { + *pDest++=(UChar)c; + ++src; } - if(ch == 0) { + if(c == 0) { reqLength=(int32_t)(pDest - dest); if(pDestLength) { *pDestLength = reqLength; @@ -1312,33 +1116,38 @@ u_strFromJavaModifiedUTF8WithSub( u_terminateUChars(dest, destCapacity, reqLength, pErrorCode); return dest; } - srcLength = uprv_strlen((const char *)pSrc); + srcLength = static_cast(uprv_strlen(src)); } - /* Faster loop without ongoing checking for pSrcLimit and pDestLimit. */ - pSrcLimit = (pSrc == NULL) ? NULL : pSrc + srcLength; + /* Faster loop without ongoing checking for srcLength and pDestLimit. */ + UChar32 ch; + uint8_t t1, t2; + int32_t i = 0; for(;;) { - count = (int32_t)(pDestLimit - pDest); - srcLength = (int32_t)(pSrcLimit - pSrc); - if(count >= srcLength && srcLength > 0 && *pSrc <= 0x7f) { + int32_t count = (int32_t)(pDestLimit - pDest); + int32_t count2 = srcLength - i; + if(count >= count2 && srcLength > 0 && U8_IS_SINGLE(*src)) { /* fast ASCII loop */ - const uint8_t *prevSrc = pSrc; - int32_t delta; - while(pSrc < pSrcLimit && (ch = *pSrc) <= 0x7f) { - *pDest++=(UChar)ch; - ++pSrc; + int32_t start = i; + uint8_t b; + while(i < srcLength && U8_IS_SINGLE(b = src[i])) { + *pDest++=b; + ++i; } - delta = (int32_t)(pSrc - prevSrc); + int32_t delta = i - start; count -= delta; - srcLength -= delta; + count2 -= delta; } /* * Each iteration of the inner loop progresses by at most 3 UTF-8 * bytes and one UChar. */ - srcLength /= 3; - if(count > srcLength) { - count = srcLength; /* min(remaining dest, remaining src/3) */ + if(subchar > 0xFFFF) { + break; + } + count2 /= 3; + if(count > count2) { + count = count2; /* min(remaining dest, remaining src/3) */ } if(count < 3) { /* @@ -1348,29 +1157,28 @@ u_strFromJavaModifiedUTF8WithSub( break; } do { - ch = *pSrc; - if(ch <= 0x7f){ + ch = (uint8_t)src[i++]; + if(U8_IS_SINGLE(ch)) { *pDest++=(UChar)ch; - ++pSrc; } else { if(ch >= 0xe0) { if( /* handle U+0000..U+FFFF inline */ ch <= 0xef && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(src[i+1] - 0x80)) <= 0x3f ) { /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); - pSrc += 3; + i += 2; continue; } } else { if( /* handle U+0000..U+07FF inline */ ch >= 0xc0 && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f ) { *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; + ++i; continue; } } @@ -1383,49 +1191,43 @@ u_strFromJavaModifiedUTF8WithSub( * We need to write two UChars, adjusted count for that, * and ran out of space. */ + --i; // back out byte ch break; } else { /* function call for error cases */ - ++pSrc; /* continue after the lead byte */ - utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, ch, -1); ++numSubstitutions; - if(subchar<=0xFFFF) { - *(pDest++)=(UChar)subchar; - } else { - *(pDest++)=U16_LEAD(subchar); - *(pDest++)=U16_TRAIL(subchar); - } + *(pDest++)=(UChar)subchar; } } } while(--count > 0); } - while((pSrc= 0xe0) { if( /* handle U+0000..U+FFFF inline */ ch <= 0xef && - ((pSrcLimit - pSrc) >= 3) && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f && - (t2 = (uint8_t)(pSrc[2] - 0x80)) <= 0x3f + (i+1) < srcLength && + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f && + (t2 = (uint8_t)(src[i+1] - 0x80)) <= 0x3f ) { /* no need for (ch & 0xf) because the upper bits are truncated after <<12 in the cast to (UChar) */ *pDest++ = (UChar)((ch << 12) | (t1 << 6) | t2); - pSrc += 3; + i += 2; continue; } } else { if( /* handle U+0000..U+07FF inline */ ch >= 0xc0 && - ((pSrcLimit - pSrc) >= 2) && - (t1 = (uint8_t)(pSrc[1] - 0x80)) <= 0x3f + i < srcLength && + (t1 = (uint8_t)(src[i] - 0x80)) <= 0x3f ) { *pDest++ = (UChar)(((ch & 0x1f) << 6) | t1); - pSrc += 2; + ++i; continue; } } @@ -1435,8 +1237,7 @@ u_strFromJavaModifiedUTF8WithSub( return NULL; } else { /* function call for error cases */ - ++pSrc; /* continue after the lead byte */ - utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, ch, -1); ++numSubstitutions; if(subchar<=0xFFFF) { *(pDest++)=(UChar)subchar; @@ -1453,32 +1254,31 @@ u_strFromJavaModifiedUTF8WithSub( } } - /* do not fill the dest buffer just count the UChars needed */ - while(pSrc < pSrcLimit){ - ch = *pSrc; - if(ch <= 0x7f) { + /* Pre-flight the rest of the string. */ + while(i < srcLength) { + ch = (uint8_t)src[i++]; + if(U8_IS_SINGLE(ch)) { reqLength++; - ++pSrc; } else { if(ch >= 0xe0) { if( /* handle U+0000..U+FFFF inline */ ch <= 0xef && - ((pSrcLimit - pSrc) >= 3) && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f && - (uint8_t)(pSrc[2] - 0x80) <= 0x3f + (i+1) < srcLength && + (uint8_t)(src[i] - 0x80) <= 0x3f && + (uint8_t)(src[i+1] - 0x80) <= 0x3f ) { reqLength++; - pSrc += 3; + i += 2; continue; } } else { if( /* handle U+0000..U+07FF inline */ ch >= 0xc0 && - ((pSrcLimit - pSrc) >= 2) && - (uint8_t)(pSrc[1] - 0x80) <= 0x3f + i < srcLength && + (uint8_t)(src[i] - 0x80) <= 0x3f ) { reqLength++; - pSrc += 2; + ++i; continue; } } @@ -1488,8 +1288,7 @@ u_strFromJavaModifiedUTF8WithSub( return NULL; } else { /* function call for error cases */ - ++pSrc; /* continue after the lead byte */ - utf8_nextCharSafeBodyPointer(&pSrc, pSrcLimit, ch); + utf8_nextCharSafeBody((const uint8_t *)src, &(i), srcLength, ch, -1); ++numSubstitutions; reqLength+=U16_LENGTH(ch); } diff --git a/deps/icu-small/source/common/utext.cpp b/deps/icu-small/source/common/utext.cpp index eb163530fbee22..6f3806f27db3f0 100644 --- a/deps/icu-small/source/common/utext.cpp +++ b/deps/icu-small/source/common/utext.cpp @@ -847,15 +847,11 @@ U_CDECL_END //------------------------------------------------------------------------------ // Chunk size. -// Must be less than 42 (256/6), because of byte mapping from UChar indexes to native indexes. -// Worst case there are six UTF-8 bytes per UChar. -// obsolete 6 byte form fd + 5 trails maps to fffd -// obsolete 5 byte form fc + 4 trails maps to fffd -// non-shortest 4 byte forms maps to fffd -// normal supplementaries map to a pair of utf-16, two utf8 bytes per utf-16 unit -// mapToUChars array size must allow for the worst case, 6. -// This could be brought down to 4, by treating fd and fc as pure illegal, -// rather than obsolete lead bytes. But that is not compatible with the utf-8 access macros. +// Must be less than 85 (256/3), because of byte mapping from UChar indexes to native indexes. +// Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes +// to two UChars.) +// The longest illegal byte sequence treated as a single error (and converted to U+FFFD) +// is a three-byte sequence (truncated four-byte sequence). // enum { UTF8_TEXT_CHUNK_SIZE=32 }; @@ -895,7 +891,7 @@ struct UTF8Buf { // Requires two extra slots, // one for a supplementary starting in the last normal position, // and one for an entry for the buffer limit position. - uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*6+6]; // Map native offset from bufNativeStart to + uint8_t mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to // correspoding offset in filled part of buf. int32_t align; }; diff --git a/deps/icu-small/source/common/utf_impl.cpp b/deps/icu-small/source/common/utf_impl.cpp index 293e6f181f3a3f..f78c566e098884 100644 --- a/deps/icu-small/source/common/utf_impl.cpp +++ b/deps/icu-small/source/common/utf_impl.cpp @@ -7,7 +7,7 @@ * Corporation and others. All Rights Reserved. * ****************************************************************************** -* file name: utf_impl.c +* file name: utf_impl.cpp * encoding: UTF-8 * tab size: 8 (not used) * indentation:4 @@ -27,7 +27,6 @@ #include "unicode/utypes.h" #include "unicode/utf.h" #include "unicode/utf8.h" -#include "unicode/utf_old.h" #include "uassert.h" /* @@ -55,10 +54,6 @@ * - SUB AX, BX (result) * -finish: * (BSR: Bit Scan Reverse, scans for a 1-bit, starting from the MSB) - * - * In Unicode, all UTF-8 byte sequences with more than 4 bytes are illegal; - * lead bytes above 0xf4 are illegal. - * We keep them in this table for skipping long ISO 10646-UTF-8 sequences. */ extern "C" U_EXPORT const uint8_t utf8_countTrailBytes[256]={ @@ -77,24 +72,24 @@ utf8_countTrailBytes[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // illegal C0 & C1 + // 2-byte lead bytes C2..DF + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + // 3-byte lead bytes E0..EF 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, - 3, 3, 3, /* illegal in Unicode */ - 4, 4, 4, 4, /* illegal in Unicode */ - 5, 5, /* illegal in Unicode */ - 0, 0 /* illegal bytes 0xfe and 0xff */ + // 4-byte lead bytes F0..F4 + // illegal F5..FF + 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static const UChar32 -utf8_minLegal[4]={ 0, 0x80, 0x800, 0x10000 }; - static const UChar32 utf8_errorValue[6]={ - UTF8_ERROR_VALUE_1, UTF8_ERROR_VALUE_2, UTF_ERROR_VALUE, 0x10ffff, - 0x3ffffff, 0x7fffffff + // Same values as UTF8_ERROR_VALUE_1, UTF8_ERROR_VALUE_2, UTF_ERROR_VALUE, + // but without relying on the obsolete unicode/utf_old.h. + 0x15, 0x9f, 0xffff, + 0x10ffff }; static UChar32 @@ -134,61 +129,59 @@ errorValue(int32_t count, int8_t strict) { */ U_CAPI UChar32 U_EXPORT2 utf8_nextCharSafeBody(const uint8_t *s, int32_t *pi, int32_t length, UChar32 c, UBool strict) { + // *pi is one after byte c. int32_t i=*pi; - uint8_t count=U8_COUNT_TRAIL_BYTES(c); - U_ASSERT(count <= 5); /* U8_COUNT_TRAIL_BYTES returns value 0...5 */ - if(i+count<=length || length<0) { - uint8_t trail; - - U8_MASK_LEAD_BYTE(c, count); - /* support NUL-terminated strings: do not read beyond the first non-trail byte */ - switch(count) { - /* each branch falls through to the next one */ - case 0: - /* count==0 for illegally leading trail bytes and the illegal bytes 0xfe and 0xff */ - case 5: - case 4: - /* count>=4 is always illegal: no more than 3 trail bytes in Unicode's UTF-8 */ - break; - case 3: - trail=s[i++]-0x80; - c=(c<<6)|trail; - /* c>=0x110 would result in code point>0x10ffff, outside Unicode */ - if(c>=0x110 || trail>0x3f) { break; } - U_FALLTHROUGH; - case 2: - trail=s[i++]-0x80; - c=(c<<6)|trail; - /* - * test for a surrogate d800..dfff unless we are lenient: - * before the last (c<<6), a surrogate is c=360..37f - */ - if(((c&0xffe0)==0x360 && strict!=-2) || trail>0x3f) { break; } - U_FALLTHROUGH; - case 1: - trail=s[i++]-0x80; - c=(c<<6)|trail; - if(trail>0x3f) { break; } - /* correct sequence - all trail bytes have (b7..b6)==(10) */ - if(c>=utf8_minLegal[count] && - /* strict: forbid non-characters like U+fffe */ - (strict<=0 || !U_IS_UNICODE_NONCHAR(c))) { + // length can be negative for NUL-terminated strings: Read and validate one byte at a time. + if(i==length || c>0xf4) { + // end of string, or not a lead byte + } else if(c>=0xf0) { + // Test for 4-byte sequences first because + // U8_NEXT() handles shorter valid sequences inline. + uint8_t t1=s[i], t2, t3; + c&=7; + if(U8_IS_VALID_LEAD4_AND_T1(c, t1) && + ++i!=length && (t2=s[i]-0x80)<=0x3f && + ++i!=length && (t3=s[i]-0x80)<=0x3f) { + ++i; + c=(c<<18)|((t1&0x3f)<<12)|(t2<<6)|t3; + // strict: forbid non-characters like U+fffe + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { *pi=i; return c; } - /* no default branch to optimize switch() - all values are covered */ } - } else { - /* too few bytes left */ - count=length-i; - } + } else if(c>=0xe0) { + c&=0xf; + if(strict!=-2) { + uint8_t t1=s[i], t2; + if(U8_IS_VALID_LEAD3_AND_T1(c, t1) && + ++i!=length && (t2=s[i]-0x80)<=0x3f) { + ++i; + c=(c<<12)|((t1&0x3f)<<6)|t2; + // strict: forbid non-characters like U+fffe + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { + *pi=i; + return c; + } + } + } else { + // strict=-2 -> lenient: allow surrogates + uint8_t t1=s[i]-0x80, t2; + if(t1<=0x3f && (c>0 || t1>=0x20) && + ++i!=length && (t2=s[i]-0x80)<=0x3f) { + *pi=i+1; + return (c<<12)|(t1<<6)|t2; + } + } + } else if(c>=0xc2) { + uint8_t t1=s[i]-0x80; + if(t1<=0x3f) { + *pi=i+1; + return ((c-0xc0)<<6)|t1; + } + } // else 0x80<=c<0xc2 is not a lead byte /* error handling */ - i=*pi; - while(count>0 && U8_IS_TRAIL(s[i])) { - ++i; - --count; - } c=errorValue(i-*pi, strict); *pi=i; return c; @@ -232,7 +225,7 @@ utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool s+=i; offset=0; c=utf8_errorValue[length-1]; - UTF8_APPEND_CHAR_UNSAFE(s, offset, c); + U8_APPEND_UNSAFE(s, offset, c); i=i+offset; } } @@ -241,99 +234,99 @@ utf8_appendCharSafeBody(uint8_t *s, int32_t i, int32_t length, UChar32 c, UBool U_CAPI UChar32 U_EXPORT2 utf8_prevCharSafeBody(const uint8_t *s, int32_t start, int32_t *pi, UChar32 c, UBool strict) { + // *pi is the index of byte c. int32_t i=*pi; - uint8_t b, count=1, shift=6; - - if(!U8_IS_TRAIL(c)) { return errorValue(0, strict); } - - /* extract value bits from the last trail byte */ - c&=0x3f; - - for(;;) { - if(i<=start) { - /* no lead byte at all */ - return errorValue(0, strict); - } - - /* read another previous byte */ - b=s[--i]; - if((uint8_t)(b-0x80)<0x7e) { /* 0x80<=b<0xfe */ - if(b&0x40) { - /* lead byte, this will always end the loop */ - uint8_t shouldCount=U8_COUNT_TRAIL_BYTES(b); - - if(count==shouldCount) { - /* set the new position */ - *pi=i; - U8_MASK_LEAD_BYTE(b, count); - c|=(UChar32)b<=4 || c>0x10ffff || c0 && U_IS_UNICODE_NONCHAR(c))) { - /* illegal sequence or (strict and non-character) */ - if(count>=4) { - count=3; + if(U8_IS_TRAIL(c) && i>start) { + uint8_t b1=s[--i]; + if(0xc2<=b1 && b1<0xe0) { + *pi=i; + return ((b1-0xc0)<<6)|(c&0x3f); + } else if(U8_IS_TRAIL(b1) && i>start) { + // Extract the value bits from the last trail byte. + c&=0x3f; + uint8_t b2=s[--i]; + if(0xe0<=b2 && b2<0xf0) { + b2&=0xf; + if(strict!=-2) { + if(U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + *pi=i; + c=(b2<<12)|((b1&0x3f)<<6)|c; + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { + return c; + } else { + // strict: forbid non-characters like U+fffe + return errorValue(2, strict); } - c=errorValue(count, strict); - } else { - /* exit with correct c */ } } else { - /* the lead byte does not match the number of trail bytes */ - /* only set the position to the lead byte if it would - include the trail byte that we started with */ - if(count lenient: allow surrogates + b1-=0x80; + if((b2>0 || b1>=0x20)) { + *pi=i; + return (b2<<12)|(b1<<6)|c; + } + } + } else if(U8_IS_TRAIL(b2) && i>start) { + uint8_t b3=s[--i]; + if(0xf0<=b3 && b3<=0xf4) { + b3&=7; + if(U8_IS_VALID_LEAD4_AND_T1(b3, b2)) { *pi=i; - c=errorValue(count, strict); - } else { - c=errorValue(0, strict); + c=(b3<<18)|((b2&0x3f)<<12)|((b1&0x3f)<<6)|c; + if(strict<=0 || !U_IS_UNICODE_NONCHAR(c)) { + return c; + } else { + // strict: forbid non-characters like U+fffe + return errorValue(3, strict); + } } } - break; - } else if(count<5) { - /* trail byte */ - c|=(UChar32)(b&0x3f)<start) { - Z=I-5; - } else { - Z=start; - } - - /* return I if the sequence starting there is long enough to include i */ - do { - b=s[I]; - if((uint8_t)(b-0x80)>=0x7e) { /* not 0x80<=b<0xfe */ - break; - } else if(b>=0xc0) { - if(U8_COUNT_TRAIL_BYTES(b)>=(i-I)) { - return I; - } else { - break; + // Same as utf8_prevCharSafeBody(..., strict=-1) minus assembling code points. + int32_t orig_i=i; + uint8_t c=s[i]; + if(U8_IS_TRAIL(c) && i>start) { + uint8_t b1=s[--i]; + if(0xc2<=b1 && b1<0xe0) { + return i; + } else if(U8_IS_TRAIL(b1) && i>start) { + uint8_t b2=s[--i]; + if(0xe0<=b2 && b2<0xf0) { + if(U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { + return i; + } + } else if(U8_IS_TRAIL(b2) && i>start) { + uint8_t b3=s[--i]; + if(0xf0<=b3 && b3<=0xf4) { + if(U8_IS_VALID_LEAD4_AND_T1(b3, b2)) { + return i; + } + } + } else if(0xf0<=b2 && b2<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b2, b1)) { + // Truncated 4-byte sequence. + return i; } + } else if((0xe0<=b1 && b1<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b1, c)) || + (0xf0<=b1 && b1<=0xf4 && U8_IS_VALID_LEAD4_AND_T1(b1, c))) { + // Truncated 3- or 4-byte sequence. + return i; } - } while(Z<=--I); - - /* return i itself to be consistent with the FWD_1 macro */ - return i; + } + return orig_i; } diff --git a/deps/icu-small/source/common/utrie2.cpp b/deps/icu-small/source/common/utrie2.cpp index cec7224d90f5de..8f9183bafad71f 100644 --- a/deps/icu-small/source/common/utrie2.cpp +++ b/deps/icu-small/source/common/utrie2.cpp @@ -746,7 +746,7 @@ uint16_t BackwardUTrie2StringIterator::previous16() { codePointLimit=codePointStart; if(start>=codePointStart) { codePoint=U_SENTINEL; - return 0; + return trie->errorValue; } uint16_t result; UTRIE2_U16_PREV16(trie, start, codePointStart, codePoint, result); @@ -757,7 +757,7 @@ uint16_t ForwardUTrie2StringIterator::next16() { codePointStart=codePointLimit; if(codePointLimit==limit) { codePoint=U_SENTINEL; - return 0; + return trie->errorValue; } uint16_t result; UTRIE2_U16_NEXT16(trie, codePointLimit, limit, codePoint, result); diff --git a/deps/icu-small/source/common/utrie2.h b/deps/icu-small/source/common/utrie2.h index 8e87bf8fbd3ea7..8e1caa5e90bde2 100644 --- a/deps/icu-small/source/common/utrie2.h +++ b/deps/icu-small/source/common/utrie2.h @@ -20,6 +20,7 @@ #define __UTRIE2_H__ #include "unicode/utypes.h" +#include "unicode/utf8.h" #include "putilimp.h" #include "udataswp.h" @@ -54,6 +55,8 @@ typedef struct UTrie UTrie; * is truncated, omitting both the BMP portion and the high range. * - There is a special small index for 2-byte UTF-8, and the initial data * entries are designed for fast 1/2-byte UTF-8 lookup. + * Starting with ICU 60, C0 and C1 are not recognized as UTF-8 lead bytes any more at all, + * and the associated 2-byte indexes are unused. */ /** @@ -933,29 +936,29 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c, /** Internal UTF-8 next-post-increment: get the next code point's data. */ #define _UTRIE2_U8_NEXT(trie, ascii, data, src, limit, result) { \ uint8_t __lead=(uint8_t)*(src)++; \ - if(__lead<0xc0) { \ + if(U8_IS_SINGLE(__lead)) { \ (result)=(trie)->ascii[__lead]; \ } else { \ uint8_t __t1, __t2; \ - if( /* handle U+0000..U+07FF inline */ \ - __lead<0xe0 && (src)<(limit) && \ - (__t1=(uint8_t)(*(src)-0x80))<=0x3f \ - ) { \ - ++(src); \ - (result)=(trie)->data[ \ - (trie)->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET-0xc0)+__lead]+ \ - __t1]; \ - } else if( /* handle U+0000..U+CFFF inline */ \ - __lead<0xed && ((src)+1)<(limit) && \ - (__t1=(uint8_t)(*(src)-0x80))<=0x3f && (__lead>0xe0 || __t1>=0x20) && \ + if( /* handle U+0800..U+FFFF inline */ \ + 0xe0<=__lead && __lead<0xf0 && ((src)+1)<(limit) && \ + U8_IS_VALID_LEAD3_AND_T1(__lead, __t1=(uint8_t)*(src)) && \ (__t2=(uint8_t)(*((src)+1)-0x80))<= 0x3f \ ) { \ (src)+=2; \ (result)=(trie)->data[ \ ((int32_t)((trie)->index[((__lead-0xe0)<<(12-UTRIE2_SHIFT_2))+ \ - (__t1<<(6-UTRIE2_SHIFT_2))+(__t2>>UTRIE2_SHIFT_2)]) \ + ((__t1&0x3f)<<(6-UTRIE2_SHIFT_2))+(__t2>>UTRIE2_SHIFT_2)]) \ <=0xc2 && (src)<(limit) && \ + (__t1=(uint8_t)(*(src)-0x80))<=0x3f \ + ) { \ + ++(src); \ + (result)=(trie)->data[ \ + (trie)->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET-0xc0)+__lead]+ \ + __t1]; \ } else { \ int32_t __index=utrie2_internalU8NextIndex((trie), __lead, (const uint8_t *)(src), \ (const uint8_t *)(limit)); \ @@ -968,7 +971,7 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c, /** Internal UTF-8 pre-decrement-previous: get the previous code point's data. */ #define _UTRIE2_U8_PREV(trie, ascii, data, start, src, result) { \ uint8_t __b=(uint8_t)*--(src); \ - if(__b<0x80) { \ + if(U8_IS_SINGLE(__b)) { \ (result)=(trie)->ascii[__b]; \ } else { \ int32_t __index=utrie2_internalU8PrevIndex((trie), __b, (const uint8_t *)(start), \ @@ -980,11 +983,4 @@ utrie2_internalU8PrevIndex(const UTrie2 *trie, UChar32 c, U_CDECL_END -/** - * Work around MSVC 2003 optimization bugs. - */ -#if defined (U_HAVE_MSVC_2003_OR_EARLIER) -#pragma optimize("", off) -#endif - #endif diff --git a/deps/icu-small/source/common/uts46.cpp b/deps/icu-small/source/common/uts46.cpp index f2cff2d5ea33a1..9b8d3ded2fddd1 100644 --- a/deps/icu-small/source/common/uts46.cpp +++ b/deps/icu-small/source/common/uts46.cpp @@ -1015,8 +1015,8 @@ UTS46::checkLabelBiDi(const UChar *label, int32_t labelLength, IDNAInfo &info) c ) { info.isOkBiDi=FALSE; } - // Get the directionalities of the intervening characters. - uint32_t mask=0; + // Add the directionalities of the intervening characters. + uint32_t mask=firstMask|lastMask; while(i(uprv_strlen(label)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->labelToASCII_UTF8(src, sink, info, *pErrorCode); @@ -1431,7 +1431,7 @@ uidna_labelToUnicodeUTF8(const UIDNA *idna, if(!checkArgs(label, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - StringPiece src(label, length<0 ? uprv_strlen(label) : length); + StringPiece src(label, length<0 ? static_cast(uprv_strlen(label)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->labelToUnicodeUTF8(src, sink, info, *pErrorCode); @@ -1447,7 +1447,7 @@ uidna_nameToASCII_UTF8(const UIDNA *idna, if(!checkArgs(name, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - StringPiece src(name, length<0 ? uprv_strlen(name) : length); + StringPiece src(name, length<0 ? static_cast(uprv_strlen(name)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->nameToASCII_UTF8(src, sink, info, *pErrorCode); @@ -1463,7 +1463,7 @@ uidna_nameToUnicodeUTF8(const UIDNA *idna, if(!checkArgs(name, length, dest, capacity, pInfo, pErrorCode)) { return 0; } - StringPiece src(name, length<0 ? uprv_strlen(name) : length); + StringPiece src(name, length<0 ? static_cast(uprv_strlen(name)) : length); CheckedArrayByteSink sink(dest, capacity); IDNAInfo info; reinterpret_cast(idna)->nameToUnicodeUTF8(src, sink, info, *pErrorCode); diff --git a/deps/icu-small/source/data/in/icudt59l.dat b/deps/icu-small/source/data/in/icudt60l.dat similarity index 50% rename from deps/icu-small/source/data/in/icudt59l.dat rename to deps/icu-small/source/data/in/icudt60l.dat index e7fb9b2598da5b1e305b826e9e7ab19ce6b1a913..2e04376ae8bc7dfe3fc03814a3d21ca3c060cc49 100644 GIT binary patch delta 688754 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�H=9>u=%3;^57!SjCG= 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

    X^U(%#xeL@p)lUv;84tJ^V)?GBw%tcyg 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 V5sQ5VMPLpSzps~w>F%WS{{RxmzDocA diff --git a/deps/icu-small/source/i18n/affixpatternparser.cpp b/deps/icu-small/source/i18n/affixpatternparser.cpp index 0d65d13057ec8e..d9e122953af53e 100644 --- a/deps/icu-small/source/i18n/affixpatternparser.cpp +++ b/deps/icu-small/source/i18n/affixpatternparser.cpp @@ -22,12 +22,12 @@ #include "uassert.h" #include "unistrappender.h" - static UChar gDefaultSymbols[] = {0xa4, 0xa4, 0xa4}; +static const UChar gDefaultSymbols[] = {0xa4, 0xa4, 0xa4}; -static UChar gPercent = 0x25; -static UChar gPerMill = 0x2030; -static UChar gNegative = 0x2D; -static UChar gPositive = 0x2B; +static const UChar gPercent = 0x25; +static const UChar gPerMill = 0x2030; +static const UChar gNegative = 0x2D; +static const UChar gPositive = 0x2B; #define PACK_TOKEN_AND_LENGTH(t, l) ((UChar) (((t) << 8) | (l & 0xFF))) @@ -226,7 +226,7 @@ AffixPattern::append(const AffixPattern &other) { addLiteral(literal.getBuffer(), 0, literal.length()); break; case kCurrency: - addCurrency(iter.getTokenLength()); + addCurrency(static_cast(iter.getTokenLength())); break; default: add(iter.getTokenType()); @@ -481,7 +481,7 @@ AffixPattern::parseUserAffixString( break; case 0xA4: appender.flush(); - appendTo.add(kCurrency, tokenSize); + appendTo.add(kCurrency, static_cast(tokenSize)); break; default: appender.append(token); diff --git a/deps/icu-small/source/i18n/anytrans.cpp b/deps/icu-small/source/i18n/anytrans.cpp index e7d5375d693b14..d06469e2ae2746 100644 --- a/deps/icu-small/source/i18n/anytrans.cpp +++ b/deps/icu-small/source/i18n/anytrans.cpp @@ -31,9 +31,13 @@ static const UChar TARGET_SEP = 45; // '-' static const UChar VARIANT_SEP = 47; // '/' -static const UChar ANY[] = {65,110,121,0}; // "Any" +static const UChar ANY[] = {0x41,0x6E,0x79,0}; // "Any" static const UChar NULL_ID[] = {78,117,108,108,0}; // "Null" -static const UChar LATIN_PIVOT[] = {45,76,97,116,105,110,59,76,97,116,105,110,45,0}; // "-Latin;Latin-" +static const UChar LATIN_PIVOT[] = {0x2D,0x4C,0x61,0x74,0x6E,0x3B,0x4C,0x61,0x74,0x6E,0x2D,0}; // "-Latn;Latn-" + +// initial size for an Any-XXXX transform's cache of script-XXXX transforms +// (will grow as necessary, but we don't expect to have source text with more than 7 scripts) +#define ANY_TRANS_CACHE_INIT_SIZE 7 //------------------------------------------------------------ @@ -186,7 +190,7 @@ AnyTransliterator::AnyTransliterator(const UnicodeString& id, Transliterator(id, NULL), targetScript(theTargetScript) { - cache = uhash_open(uhash_hashLong, uhash_compareLong, NULL, &ec); + cache = uhash_openSize(uhash_hashLong, uhash_compareLong, NULL, ANY_TRANS_CACHE_INIT_SIZE, &ec); if (U_FAILURE(ec)) { return; } @@ -212,7 +216,7 @@ AnyTransliterator::AnyTransliterator(const AnyTransliterator& o) : { // Don't copy the cache contents UErrorCode ec = U_ZERO_ERROR; - cache = uhash_open(uhash_hashLong, uhash_compareLong, NULL, &ec); + cache = uhash_openSize(uhash_hashLong, uhash_compareLong, NULL, ANY_TRANS_CACHE_INIT_SIZE, &ec); if (U_FAILURE(ec)) { return; } @@ -286,7 +290,7 @@ Transliterator* AnyTransliterator::getTransliterator(UScriptCode source) const { } if (t == NULL) { UErrorCode ec = U_ZERO_ERROR; - UnicodeString sourceName(uscript_getName(source), -1, US_INV); + UnicodeString sourceName(uscript_getShortName(source), -1, US_INV); UnicodeString id(sourceName); id.append(TARGET_SEP).append(target); diff --git a/deps/icu-small/source/i18n/calendar.cpp b/deps/icu-small/source/i18n/calendar.cpp index 5b7d64d20d0d63..426bd7904cbd84 100644 --- a/deps/icu-small/source/i18n/calendar.cpp +++ b/deps/icu-small/source/i18n/calendar.cpp @@ -66,10 +66,8 @@ #if !UCONFIG_NO_SERVICE static icu::ICULocaleService* gService = NULL; static icu::UInitOnce gServiceInitOnce = U_INITONCE_INITIALIZER; -#endif // INTERNAL - for cleanup - U_CDECL_BEGIN static UBool calendar_cleanup(void) { #if !UCONFIG_NO_SERVICE @@ -82,6 +80,7 @@ static UBool calendar_cleanup(void) { return TRUE; } U_CDECL_END +#endif // ------------------------------------------ // @@ -234,6 +233,8 @@ static ECalType getCalendarType(const char *s) { return CALTYPE_UNKNOWN; } +#if !UCONFIG_NO_SERVICE +// Only used with service registration. static UBool isStandardSupportedKeyword(const char *keyword, UErrorCode& status) { if(U_FAILURE(status)) { return FALSE; @@ -242,6 +243,7 @@ static UBool isStandardSupportedKeyword(const char *keyword, UErrorCode& status) return (calType != CALTYPE_UNKNOWN); } +// only used with service registration. static void getCalendarKeyword(const UnicodeString &id, char *targetBuffer, int32_t targetBufferSize) { UnicodeString calendarKeyword = UNICODE_STRING_SIMPLE("calendar="); int32_t calKeyLen = calendarKeyword.length(); @@ -255,6 +257,7 @@ static void getCalendarKeyword(const UnicodeString &id, char *targetBuffer, int3 } targetBuffer[keyLen] = 0; } +#endif static ECalType getCalendarTypeForLocale(const char *locid) { UErrorCode status = U_ZERO_ERROR; @@ -2966,7 +2969,7 @@ void Calendar::computeTime(UErrorCode& status) { // } #endif - int32_t millisInDay; + double millisInDay; // We only use MILLISECONDS_IN_DAY if it has been set by the user. // This makes it possible for the caller to set the calendar to a @@ -3086,10 +3089,10 @@ UBool Calendar::getImmediatePreviousZoneTransition(UDate base, UDate *transition * reflects local zone wall time. * @stable ICU 2.0 */ -int32_t Calendar::computeMillisInDay() { +double Calendar::computeMillisInDay() { // Do the time portion of the conversion. - int32_t millisInDay = 0; + double millisInDay = 0; // Find the best set of fields specifying the time of day. There // are only two possibilities here; the HOUR_OF_DAY or the @@ -3131,7 +3134,7 @@ int32_t Calendar::computeMillisInDay() { * or range. * @stable ICU 2.0 */ -int32_t Calendar::computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec) { +int32_t Calendar::computeZoneOffset(double millis, double millisInDay, UErrorCode &ec) { int32_t rawOffset, dstOffset; UDate wall = millis + millisInDay; BasicTimeZone* btz = getBasicTimeZone(); diff --git a/deps/icu-small/source/i18n/coll.cpp b/deps/icu-small/source/i18n/coll.cpp index 7766187b934d4a..b7348a1d16f1e1 100644 --- a/deps/icu-small/source/i18n/coll.cpp +++ b/deps/icu-small/source/i18n/coll.cpp @@ -63,8 +63,10 @@ static icu::Locale* availableLocaleList = NULL; static int32_t availableLocaleListCount; +#if !UCONFIG_NO_SERVICE static icu::ICULocaleService* gService = NULL; static icu::UInitOnce gServiceInitOnce = U_INITONCE_INITIALIZER; +#endif static icu::UInitOnce gAvailableLocaleListInitOnce; /** diff --git a/deps/icu-small/source/i18n/collationdatareader.cpp b/deps/icu-small/source/i18n/collationdatareader.cpp index 636eb14b7c70cb..0eb1861343cdfd 100644 --- a/deps/icu-small/source/i18n/collationdatareader.cpp +++ b/deps/icu-small/source/i18n/collationdatareader.cpp @@ -419,7 +419,8 @@ CollationDataReader::read(const CollationTailoring *base, const uint8_t *inBytes tailoring.data, ts, fastLatinPrimaries, UPRV_LENGTHOF(fastLatinPrimaries)); if(options == ts.options && ts.variableTop != 0 && reorderCodesLength == ts.reorderCodesLength && - uprv_memcmp(reorderCodes, ts.reorderCodes, reorderCodesLength * 4) == 0 && + (reorderCodesLength == 0 || + uprv_memcmp(reorderCodes, ts.reorderCodes, reorderCodesLength * 4) == 0) && fastLatinOptions == ts.fastLatinOptions && (fastLatinOptions < 0 || uprv_memcmp(fastLatinPrimaries, ts.fastLatinPrimaries, diff --git a/deps/icu-small/source/i18n/collationdatawriter.cpp b/deps/icu-small/source/i18n/collationdatawriter.cpp index a91119d8dfa4c9..823c8eb0111d31 100644 --- a/deps/icu-small/source/i18n/collationdatawriter.cpp +++ b/deps/icu-small/source/i18n/collationdatawriter.cpp @@ -224,7 +224,7 @@ CollationDataWriter::write(UBool isBase, const UVersionInfo dataVersion, int32_t totalSize = indexesLength * 4; if(hasMappings && (isBase || data.jamoCE32s != baseData->jamoCE32s)) { - indexes[CollationDataReader::IX_JAMO_CE32S_START] = data.jamoCE32s - data.ce32s; + indexes[CollationDataReader::IX_JAMO_CE32S_START] = static_cast(data.jamoCE32s - data.ce32s); } else { indexes[CollationDataReader::IX_JAMO_CE32S_START] = -1; } diff --git a/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp b/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp index e889697d8a5007..e5ba2f0e21dd82 100644 --- a/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp +++ b/deps/icu-small/source/i18n/collationfastlatinbuilder.cpp @@ -607,7 +607,7 @@ CollationFastLatinBuilder::encodeContractions(UErrorCode &errorCode) { } UBool firstTriple = TRUE; for(int32_t index = (int32_t)ce & 0x7fffffff;; index += 3) { - int32_t x = contractionCEs.elementAti(index); + int32_t x = static_cast(contractionCEs.elementAti(index)); if((uint32_t)x == CollationFastLatin::CONTR_CHAR_MASK && !firstTriple) { break; } int64_t cce0 = contractionCEs.elementAti(index + 1); int64_t cce1 = contractionCEs.elementAti(index + 2); diff --git a/deps/icu-small/source/i18n/collationfcd.cpp b/deps/icu-small/source/i18n/collationfcd.cpp index 86b12b917cb797..19841ee6487ad2 100644 --- a/deps/icu-small/source/i18n/collationfcd.cpp +++ b/deps/icu-small/source/i18n/collationfcd.cpp @@ -1,13 +1,13 @@ // © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html -/* - * Copyright (C) 1999-2016, International Business Machines - * Corporation and others. All Rights Reserved. - * - * file name: collationfcd.cpp - * - * machine-generated by: icu/tools/unicode/c/genuca/genuca.cpp - */ +// +// Copyright (C) 1999-2016, International Business Machines +// Corporation and others. All Rights Reserved. +// +// file name: collationfcd.cpp +// +// machine-generated by: icu/tools/unicode/c/genuca/genuca.cpp + #include "unicode/utypes.h" @@ -24,25 +24,25 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 8,0,9,0xa,0,0,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0x10, 0x11,0x12,0x13,0,0,0,0x14,0x15,0,0x16,0x17,0,0,0x16,0x18,0, 0,0x16,0x18,0,0,0x16,0x18,0,0,0x16,0x18,0,0,0,0x18,0, -0,0,0x19,0,0,0x16,0x18,0,0,0,0x18,0,0,0,0x1a,0, -0,0x1b,0x1c,0,0,0x1d,0x1c,0,0x1d,0x1e,0,0x1f,0x20,0,0x21,0, -0,0x22,0,0,0x18,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x23,0,0,0,0,0, +0,0,0x19,0,0,0x16,0x18,0,0,0x1a,0x18,0,0,0,0x1b,0, +0,0x1c,0x1d,0,0,0x1e,0x1d,0,0x1e,0x1f,0,0x20,0x21,0,0x22,0, +0,0x23,0,0,0x18,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x24,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x24,0x24,0,0,0,0,0x25,0, -0,0,0,0,0,0x26,0,0,0,0x13,0,0,0,0,0,0, -0x27,0,0,0x28,0,0x29,0,0,0,0x24,0x2a,0x10,0,0x2b,0,0x2c, -0,0x2d,0,0,0,0,0x2e,0x2f,0,0,0,0,0,0,1,0x30, +0,0,0,0,0,0,0,0,0x25,0x25,0,0,0,0,0x26,0, +0,0,0,0,0,0x27,0,0,0,0x13,0,0,0,0,0,0, +0x28,0,0,0x29,0,0x2a,0,0,0,0x25,0x2b,0x10,0,0x2c,0,0x2d, +0,0x2e,0,0,0,0,0x2f,0x30,0,0,0,0,0,0,1,0x31, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x31,0x32,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x32,0x33,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x33,0,0,0,0x34,0,0,0,1, +0,0,0,0,0,0,0,0x34,0,0,0,0x35,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x35,0,0,0x36,0,0,0,0,0,0,0,0,0,0,0, +0,0x36,0,0,0x37,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -101,9 +101,9 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x37,0x38,0,0,0x39,0,0,0,0,0,0,0,0, -0x21,0,0,0,0,0,0x2a,0x3a,0,0x3b,0x3c,0,0,0x3c,0x3d,0, -0,0,0,0,0,0x3e,0x3f,0x40,0,0,0,0,0,0,0,0x18, +0,0,0,0x38,0x39,0,0,0x3a,0,0,0,0,0,0,0,0, +0x22,0,0,0,0,0,0x2b,0x3b,0,0x3c,0x3d,0,0,0x3d,0x3e,0, +0,0,0,0,0,0x3f,0x40,0x41,0,0,0,0,0,0,0,0x18, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -126,7 +126,7 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x41,0x42,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x42,0x43,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -143,17 +143,17 @@ const uint8_t CollationFCD::lcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x43,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x44,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; -const uint32_t CollationFCD::lcccBits[68]={ +const uint32_t CollationFCD::lcccBits[69]={ 0,0xffffffff,0xffff7fff,0xffff,0xf8,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0xfffff800,0x10000,0x9fc00000,0x3d9f,0x20000,0xffff0000,0x7ff, -0xff800,0xfbc00000,0x3eef,0xe000000,0xfff00000,0xfffffffb,0x10000000,0x1e2000,0x2000,0x602000,0x400,0x7000000,0xf00,0x3000000,0x2a00000,0x3c3e0000, -0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd, -0xf83fffff,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2, -0x400000,0x40000b5,0x5108000,0x40000000 +0xff800,0xfbc00000,0x3eef,0xe000000,0xfff00000,0xfffffffb,0x10000000,0x1e2000,0x2000,0x602000,0x18000000,0x400,0x7000000,0xf00,0x3000000,0x2a00000, +0x3c3e0000,0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000, +0x31021fd,0xfbffffff,0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000, +2,0x400000,0x40000f5,0x5108000,0x40000000 }; const uint8_t CollationFCD::tcccIndex[2048]={ @@ -163,25 +163,25 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0x1c,0x1d,0x1e,0x1f,0,0,0x20,0x21,0x22,0x23,0x24,0,0,0,0,0x25, 0x26,0x27,0x28,0,0,0,0x29,0x2a,0,0x2b,0x2c,0,0,0x2d,0x2e,0, 0,0x2f,0x30,0,0,0x2d,0x31,0,0,0x2d,0x32,0,0,0,0x31,0, -0,0,0x33,0,0,0x2d,0x31,0,0,0,0x31,0,0,0,0x34,0, -0,0x35,0x36,0,0,0x37,0x36,0,0x37,0x38,0,0x39,0x3a,0,0x3b,0, -0,0x3c,0,0,0x31,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0x3d,0,0,0,0,0, +0,0,0x33,0,0,0x2d,0x31,0,0,0x34,0x31,0,0,0,0x35,0, +0,0x36,0x37,0,0,0x38,0x37,0,0x38,0x39,0,0x3a,0x3b,0,0x3c,0, +0,0x3d,0,0,0x31,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x3e,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x3e,0x3e,0,0,0,0,0x3f,0, -0,0,0,0,0,0x40,0,0,0,0x28,0,0,0,0,0,0, -0x41,0,0,0x42,0,0x43,0,0,0,0x3e,0x44,0x25,0,0x45,0,0x46, -0,0x47,0,0,0,0,0x48,0x49,0,0,0,0,0,0,1,0x4a, -1,1,1,1,0x4b,1,1,0x4c,0x4d,1,0x4e,0x4f,1,0x50,0x51,0x52, -0,0,0,0,0,0,0x53,0x54,0,0x55,0,0,0x56,0x57,0x58,0, -0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0,0x5f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x3f,0x3f,0,0,0,0,0x40,0, +0,0,0,0,0,0x41,0,0,0,0x28,0,0,0,0,0,0, +0x42,0,0,0x43,0,0x44,0,0,0,0x3f,0x45,0x25,0,0x46,0,0x47, +0,0x48,0,0,0,0,0x49,0x4a,0,0,0,0,0,0,1,0x4b, +1,1,1,1,0x4c,1,1,0x4d,0x4e,1,0x4f,0x50,1,0x51,0x52,0x53, +0,0,0,0,0,0,0x54,0x55,0,0x56,0,0,0x57,0x58,0x59,0, +0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0,0x60,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0x2d,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0x60,0,0,0,0x61,0,0,0,1, +0,0,0,0,0,0,0,0x61,0,0,0,0x62,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0x62,0x63,0x64,0x65,0x63,0x64,0x66,0,0,0,0,0,0,0,0, +0,0x63,0x64,0x65,0x66,0x64,0x65,0x67,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -240,9 +240,9 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0x67,0x68,0,0,0x69,0,0,0,0,0,0,0,0, -0x3b,0,0,0,0,0,0x44,0x6a,0,0x6b,0x6c,0,0,0x6c,0x6d,0, -0,0,0,0,0,0x6e,0x6f,0x70,0,0,0,0,0,0,0,0x31, +0,0,0,0x68,0x69,0,0,0x6a,0,0,0,0,0,0,0,0, +0x3c,0,0,0,0,0,0x45,0x6b,0,0x6c,0x6d,0,0,0x6d,0x6e,0, +0,0,0,0,0,0x6f,0x70,0x71,0,0,0,0,0,0,0,0x31, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -265,7 +265,7 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0x71,0x72,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x72,0x73,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -282,20 +282,20 @@ const uint8_t CollationFCD::tcccIndex[2048]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0x3d,0x73,0x74,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x3e,0x74,0x75,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xe,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; -const uint32_t CollationFCD::tcccBits[117]={ +const uint32_t CollationFCD::tcccBits[118]={ 0,0xffffffff,0x3e7effbf,0xbe7effbf,0xfffcffff,0x7ef1ff3f,0xfff3f1f8,0x7fffff3f,0x18003,0xdfffe000,0xff31ffcf,0xcfffffff,0xfffc0,0xffff7fff,0xffff,0x1d760, 0x1fc00,0x187c00,0x200708b,0x2000000,0x708b0000,0xc00000,0xf8,0xfccf0006,0x33ffcfc,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0x7c,0xfffff800,0x10000, 0x9fc80005,0x3d9f,0x20000,0xffff0000,0x7ff,0xff800,0xfbc00000,0x3eef,0xe000000,0xfff00000,0xfffffffb,0x10120200,0xff1e2000,0x10000000,0xb0002000,0x10480000, -0x4e002000,0x2000,0x30002000,0x602100,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000, -0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0xf83fffff,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x3fffffff, -0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50,0x292,0x333e005,0x333,0xf000,0x3c0f, -0x38000,0x80000000,0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2, -0x400000,0x40000b5,0x5108000,0x5f7ffc00,0x7fdb +0x4e002000,0x2000,0x30002000,0x602100,0x18000000,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000,0xe0000000,0x100000, +0x20040000,0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0xfbffffff,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f, +0x3fffffff,0x1fdfffff,0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50,0x292,0x333e005,0x333,0xf000, +0x3c0f,0x38000,0x80000000,0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0xc0000000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000, +2,0x400000,0x40000f5,0x5108000,0x5f7ffc00,0x7fdb }; U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/collationiterator.h b/deps/icu-small/source/i18n/collationiterator.h index 2666b248fa094e..d0910ea57b40a2 100644 --- a/deps/icu-small/source/i18n/collationiterator.h +++ b/deps/icu-small/source/i18n/collationiterator.h @@ -28,6 +28,21 @@ class SkippedState; class UCharsTrie; class UVector32; +/* Large enough for CEs of most short strings. */ +#define CEBUFFER_INITIAL_CAPACITY 40 + +// Export an explicit template instantiation of the MaybeStackArray that +// is used as a data member of CEBuffer. +// +// MSVC requires this, even though it should not be necessary. +// No direct access to the MaybeStackArray leaks out of the i18n library. +// +// See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples. +// +#if defined (_MSC_VER) +template class U_I18N_API MaybeStackArray; +#endif + /** * Collation element iterator and abstract character iterator. * @@ -36,10 +51,10 @@ class UVector32; */ class U_I18N_API CollationIterator : public UObject { private: - class CEBuffer { + class U_I18N_API CEBuffer { private: /** Large enough for CEs of most short strings. */ - static const int32_t INITIAL_CAPACITY = 40; + static const int32_t INITIAL_CAPACITY = CEBUFFER_INITIAL_CAPACITY; public: CEBuffer() : length(0) {} ~CEBuffer(); diff --git a/deps/icu-small/source/i18n/collationweights.cpp b/deps/icu-small/source/i18n/collationweights.cpp index eb238df9423e93..aec0037861a36f 100644 --- a/deps/icu-small/source/i18n/collationweights.cpp +++ b/deps/icu-small/source/i18n/collationweights.cpp @@ -527,7 +527,7 @@ CollationWeights::allocWeights(uint32_t lowerLimit, uint32_t upperLimit, int32_t #ifdef UCOL_DEBUG printf("lengthen the short ranges from %ld bytes to %ld and iterate\n", minLength, minLength+1); #endif - for(int32_t i=0; ranges[i].length==minLength; ++i) { + for(int32_t i=0; isetParseIntegerOnly(TRUE); + newNumberFormat->setGroupingUsed(FALSE); } //---------------------------------------------------------------------- @@ -738,7 +739,7 @@ DateFormat::setBooleanAttribute(UDateFormatBooleanAttribute attr, UBool DateFormat::getBooleanAttribute(UDateFormatBooleanAttribute attr, UErrorCode &/*status*/) const { - return fBoolFlags.get(attr); + return static_cast(fBoolFlags.get(attr)); } U_NAMESPACE_END diff --git a/deps/icu-small/source/i18n/dayperiodrules.cpp b/deps/icu-small/source/i18n/dayperiodrules.cpp index f7ec1e6dc2dded..e364ecb708cf66 100644 --- a/deps/icu-small/source/i18n/dayperiodrules.cpp +++ b/deps/icu-small/source/i18n/dayperiodrules.cpp @@ -340,7 +340,7 @@ const DayPeriodRules *DayPeriodRules::getInstance(const Locale &locale, UErrorCo // does), return NULL. if(U_FAILURE(errorCode)) { return NULL; } - const char *localeCode = locale.getName(); + const char *localeCode = locale.getBaseName(); char name[ULOC_FULLNAME_CAPACITY]; char parentName[ULOC_FULLNAME_CAPACITY]; diff --git a/deps/icu-small/source/i18n/dcfmtsym.cpp b/deps/icu-small/source/i18n/dcfmtsym.cpp index c702c2e7d0e8cb..f840fde2abaca3 100644 --- a/deps/icu-small/source/i18n/dcfmtsym.cpp +++ b/deps/icu-small/source/i18n/dcfmtsym.cpp @@ -97,9 +97,7 @@ static const char *gNumberElementKeys[DecimalFormatSymbols::kFormatSymbolCount] // Initializes this with the decimal format symbols in the default locale. DecimalFormatSymbols::DecimalFormatSymbols(UErrorCode& status) - : UObject(), - locale() -{ + : UObject(), locale() { initialize(locale, status, TRUE); } @@ -107,16 +105,17 @@ DecimalFormatSymbols::DecimalFormatSymbols(UErrorCode& status) // Initializes this with the decimal format symbols in the desired locale. DecimalFormatSymbols::DecimalFormatSymbols(const Locale& loc, UErrorCode& status) - : UObject(), - locale(loc) -{ + : UObject(), locale(loc) { initialize(locale, status); } +DecimalFormatSymbols::DecimalFormatSymbols(const Locale& loc, const NumberingSystem& ns, UErrorCode& status) + : UObject(), locale(loc) { + initialize(locale, status, FALSE, &ns); +} + DecimalFormatSymbols::DecimalFormatSymbols() - : UObject(), - locale(Locale::getRoot()), - currPattern(NULL) { + : UObject(), locale(Locale::getRoot()), currPattern(NULL) { *validLocale = *actualLocale = 0; initialize(); } @@ -342,7 +341,8 @@ CurrencySpacingSink::~CurrencySpacingSink() {} } // namespace void -DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool useLastResortData) +DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, + UBool useLastResortData, const NumberingSystem* ns) { if (U_FAILURE(status)) { return; } *validLocale = *actualLocale = 0; @@ -355,7 +355,13 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool us // Next get the numbering system for this locale and set zero digit // and the digit string based on the numbering system for the locale // - LocalPointer ns(NumberingSystem::createInstance(loc, status)); + LocalPointer nsLocal; + if (ns == nullptr) { + // Use the numbering system according to the locale. + // Save it into a LocalPointer so it gets cleaned up. + nsLocal.adoptInstead(NumberingSystem::createInstance(loc, status)); + ns = nsLocal.getAlias(); + } const char *nsName; if (U_SUCCESS(status) && ns->getRadix() == 10 && !ns->isAlgorithmic()) { nsName = ns->getName(); @@ -433,12 +439,13 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool us UErrorCode internalStatus = U_ZERO_ERROR; // don't propagate failures out UChar curriso[4]; UnicodeString tempStr; - ucurr_forLocale(locStr, curriso, 4, &internalStatus); - - uprv_getStaticCurrencyName(curriso, locStr, tempStr, internalStatus); - if (U_SUCCESS(internalStatus)) { - fSymbols[kIntlCurrencySymbol].setTo(curriso, -1); - fSymbols[kCurrencySymbol] = tempStr; + int32_t currisoLength = ucurr_forLocale(locStr, curriso, UPRV_LENGTHOF(curriso), &internalStatus); + if (U_SUCCESS(internalStatus) && currisoLength == 3) { + uprv_getStaticCurrencyName(curriso, locStr, tempStr, internalStatus); + if (U_SUCCESS(internalStatus)) { + fSymbols[kIntlCurrencySymbol].setTo(curriso, currisoLength); + fSymbols[kCurrencySymbol] = tempStr; + } } /* else use the default values. */ diff --git a/deps/icu-small/source/i18n/decNumber.cpp b/deps/icu-small/source/i18n/decNumber.cpp index 3ae22b1b42f472..363f93ea72de40 100644 --- a/deps/icu-small/source/i18n/decNumber.cpp +++ b/deps/icu-small/source/i18n/decNumber.cpp @@ -386,7 +386,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromUInt32(decNumber *dn, uInt uin) { *up=(Unit)(uin%(DECDPUNMAX+1)); uin=uin/(DECDPUNMAX+1); } - dn->digits=decGetDigits(dn->lsu, up-dn->lsu); + dn->digits=decGetDigits(dn->lsu, static_cast(up - dn->lsu)); return dn; } /* decNumberFromUInt32 */ @@ -666,7 +666,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromString(decNumber *dn, const char /* Handle decimal point... */ if (dotchar!=NULL && dotchar(last-dotchar); /* adjust exponent */ /* [we can now ignore the .] */ /* OK, the digits string is good. Assemble in the decNumber, or in */ @@ -866,7 +866,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberAnd(decNumber *res, const decNumber * } /* both OK */ } /* each unit */ /* [here uc-1 is the msu of the result] */ - res->digits=decGetDigits(res->lsu, uc-res->lsu); + res->digits=decGetDigits(res->lsu, static_cast(uc - res->lsu)); res->exponent=0; /* integer */ res->bits=0; /* sign=0 */ return res; /* [no status to set] */ @@ -1253,7 +1253,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberInvert(decNumber *res, const decNumbe } /* each digit */ } /* each unit */ /* [here uc-1 is the msu of the result] */ - res->digits=decGetDigits(res->lsu, uc-res->lsu); + res->digits=decGetDigits(res->lsu, static_cast(uc - res->lsu)); res->exponent=0; /* integer */ res->bits=0; /* sign=0 */ return res; /* [no status to set] */ @@ -1880,7 +1880,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberOr(decNumber *res, const decNumber *l } /* non-zero */ } /* each unit */ /* [here uc-1 is the msu of the result] */ - res->digits=decGetDigits(res->lsu, uc-res->lsu); + res->digits=decGetDigits(res->lsu, static_cast(uc-res->lsu)); res->exponent=0; /* integer */ res->bits=0; /* sign=0 */ return res; /* [no status to set] */ @@ -2586,7 +2586,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberRotate(decNumber *res, const decNumbe } /* whole units to rotate */ /* the rotation may have left an undetermined number of zeros */ /* on the left, so true length needs to be calculated */ - res->digits=decGetDigits(res->lsu, msumax-res->lsu+1); + res->digits=decGetDigits(res->lsu, static_cast(msumax-res->lsu+1)); } /* rotate needed */ } /* rhs OK */ } /* numerics */ @@ -3310,7 +3310,7 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberXor(decNumber *res, const decNumber * } /* non-zero */ } /* each unit */ /* [here uc-1 is the msu of the result] */ - res->digits=decGetDigits(res->lsu, uc-res->lsu); + res->digits=decGetDigits(res->lsu, static_cast(uc-res->lsu)); res->exponent=0; /* integer */ res->bits=0; /* sign=0 */ return res; /* [no status to set] */ @@ -5101,7 +5101,7 @@ static decNumber * decMultiplyOp(decNumber *res, const decNumber *lhs, } /* p */ *up=(Unit)item; up++; /* [final needs no division] */ } /* lp */ - accunits=up-acc; /* count of units */ + accunits = static_cast(up-acc); /* count of units */ } else { /* here to use units directly, without chunking ['old code'] */ #endif @@ -6587,11 +6587,11 @@ static Int decUnitAddSub(const Unit *a, Int alength, /* OK, all A and B processed; might still have carry or borrow */ /* return number of Units in the result, negated if a borrow */ - if (carry==0) return c-clsu; /* no carry, so no more to do */ + if (carry==0) return static_cast(c-clsu); /* no carry, so no more to do */ if (carry>0) { /* positive carry */ *c=(Unit)carry; /* place as new unit */ c++; /* .. */ - return c-clsu; + return static_cast(c-clsu); } /* -ve carry: it's a borrow; complement needed */ add=1; /* temporary carry... */ @@ -6614,7 +6614,7 @@ static Int decUnitAddSub(const Unit *a, Int alength, *c=(Unit)(add-carry-1); c++; /* interesting, include it */ } - return clsu-c; /* -ve result indicates borrowed */ + return static_cast(clsu-c); /* -ve result indicates borrowed */ } /* decUnitAddSub */ /* ------------------------------------------------------------------ */ @@ -6798,7 +6798,7 @@ static Int decShiftToLeast(Unit *uar, Int units, Int shift) { if (cut==DECDPUN) { /* unit-boundary case; easy */ up=uar+D2U(shift); for (; up(target-uar); } /* messier */ @@ -6826,7 +6826,7 @@ static Int decShiftToLeast(Unit *uar, Int units, Int shift) { count-=cut; if (count<=0) break; } - return target-uar+1; + return static_cast(target-uar+1); } /* decShiftToLeast */ #if DECSUBSET @@ -7690,7 +7690,7 @@ static decNumber *decDecap(decNumber *dn, Int drop) { cut=MSUDIGITS(dn->digits-drop); /* digits to be in use in msu */ if (cut!=DECDPUN) *msu%=powers[cut]; /* clear left digits */ /* that may have left leading zero digits, so do a proper count... */ - dn->digits=decGetDigits(dn->lsu, msu-dn->lsu+1); + dn->digits=decGetDigits(dn->lsu, static_cast(msu-dn->lsu+1)); return dn; } /* decDecap */ diff --git a/deps/icu-small/source/i18n/decfmtst.cpp b/deps/icu-small/source/i18n/decfmtst.cpp index 5dff3c164509e5..5943affad4eb06 100644 --- a/deps/icu-small/source/i18n/decfmtst.cpp +++ b/deps/icu-small/source/i18n/decfmtst.cpp @@ -71,7 +71,7 @@ static const UChar gStrictDashEquivalentsPattern[] = { // [ \ - MINUS ] 0x005B, 0x005C, 0x002D, 0x2212, 0x005D, 0x0000}; -static UChar32 gMinusSigns[] = { +static const UChar32 gMinusSigns[] = { 0x002D, 0x207B, 0x208B, @@ -80,7 +80,7 @@ static UChar32 gMinusSigns[] = { 0xFE63, 0xFF0D}; -static UChar32 gPlusSigns[] = { +static const UChar32 gPlusSigns[] = { 0x002B, 0x207A, 0x208A, diff --git a/deps/icu-small/source/i18n/decimfmt.cpp b/deps/icu-small/source/i18n/decimfmt.cpp index 116c0c90bb198f..80a9446e146f6c 100644 --- a/deps/icu-small/source/i18n/decimfmt.cpp +++ b/deps/icu-small/source/i18n/decimfmt.cpp @@ -1423,8 +1423,8 @@ UBool DecimalFormat::subparse(const UnicodeString& text, UBool strictFail = FALSE; // did we exit with a strict parse failure? - int32_t lastGroup = -1; // where did we last see a grouping separator? - int32_t digitStart = position; + int32_t lastGroup = -1; // after which digit index did we last see a grouping separator? + int32_t currGroup = -1; // for temporary storage the digit index of the current grouping separator int32_t gs2 = fImpl->fEffGrouping.fGrouping2 == 0 ? fImpl->fEffGrouping.fGrouping : fImpl->fEffGrouping.fGrouping2; const UnicodeString *decimalString; @@ -1513,16 +1513,17 @@ UBool DecimalFormat::subparse(const UnicodeString& text, // before that, the group must == the secondary group // length, else it can be <= the the secondary group // length. - if ((lastGroup != -1 && backup - lastGroup - 1 != gs2) || - (lastGroup == -1 && position - digitStart - 1 > gs2)) { + if ((lastGroup != -1 && currGroup - lastGroup != gs2) || + (lastGroup == -1 && digitCount - 1 > gs2)) { strictFail = TRUE; break; } - lastGroup = backup; + lastGroup = currGroup; } // Cancel out backup setting (see grouping handler below) + currGroup = -1; backup = -1; sawDigit = TRUE; @@ -1561,6 +1562,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, // Ignore grouping characters, if we are using them, but require // that they be followed by a digit. Otherwise we backup and // reprocess them. + currGroup = digitCount; backup = position; position += groupingStringLength; sawGrouping=TRUE; @@ -1571,7 +1573,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, { if (strictParse) { if (backup != -1 || - (lastGroup != -1 && position - lastGroup != fImpl->fEffGrouping.fGrouping + 1)) { + (lastGroup != -1 && digitCount - lastGroup != fImpl->fEffGrouping.fGrouping)) { strictFail = TRUE; break; } @@ -1622,7 +1624,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, UBool sawExponentDigit = FALSE; while (pos < textLength) { - ch = text[(int32_t)pos]; + ch = text.char32At(pos); digit = ch - zero; if (digit < 0 || digit > 9) { @@ -1634,7 +1636,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, parsedNum.append(exponentSign, err); sawExponentDigit = TRUE; } - ++pos; + pos += U16_LENGTH(ch); parsedNum.append((char)(digit + '0'), err); } else { break; @@ -1673,7 +1675,7 @@ UBool DecimalFormat::subparse(const UnicodeString& text, } if (strictParse && !sawDecimal) { - if (lastGroup != -1 && position - lastGroup != fImpl->fEffGrouping.fGrouping + 1) { + if (lastGroup != -1 && digitCount - lastGroup != fImpl->fEffGrouping.fGrouping) { strictFail = TRUE; } } @@ -2543,7 +2545,7 @@ UnicodeString DecimalFormat::getPadCharacterString() const { } void DecimalFormat::setPadCharacter(const UnicodeString &padChar) { - UChar pad; + UChar32 pad; if (padChar.length() > 0) { pad = padChar.char32At(0); } @@ -2792,7 +2794,7 @@ DecimalFormat::setDecimalSeparatorAlwaysShown(UBool newValue) UBool DecimalFormat::isDecimalPatternMatchRequired(void) const { - return fBoolFlags.contains(UNUM_PARSE_DECIMAL_MARK_REQUIRED); + return static_cast(fBoolFlags.contains(UNUM_PARSE_DECIMAL_MARK_REQUIRED)); } //------------------------------------------------------------------------------ diff --git a/deps/icu-small/source/i18n/decimfmtimpl.cpp b/deps/icu-small/source/i18n/decimfmtimpl.cpp index dc7c8adf67d0dc..ef44eab0101453 100644 --- a/deps/icu-small/source/i18n/decimfmtimpl.cpp +++ b/deps/icu-small/source/i18n/decimfmtimpl.cpp @@ -521,7 +521,8 @@ static FixedDecimal &initFixedDecimal( const VisibleDigits &digits, FixedDecimal &result) { result.source = 0.0; result.isNegative = digits.isNegative(); - result.isNanOrInfinity = digits.isNaNOrInfinity(); + result._isNaN = digits.isNaN(); + result._isInfinite = digits.isInfinite(); digits.getFixedDecimal( result.source, result.intValue, result.decimalDigits, result.decimalDigitsWithoutTrailingZeros, @@ -1382,8 +1383,8 @@ DecimalFormatImpl::toNumberPattern( DigitInterval maxInterval; // Only for significant digits - int32_t sigMin; - int32_t sigMax; + int32_t sigMin = 0; /* initialize to avoid compiler warning */ + int32_t sigMax = 0; /* initialize to avoid compiler warning */ // These are all the digits to be displayed. For significant digits, // this interval always starts at the 1's place an extends left. diff --git a/deps/icu-small/source/i18n/digitformatter.cpp b/deps/icu-small/source/i18n/digitformatter.cpp index abb571dc5fa9f2..0d857f8f6873c6 100644 --- a/deps/icu-small/source/i18n/digitformatter.cpp +++ b/deps/icu-small/source/i18n/digitformatter.cpp @@ -177,7 +177,7 @@ UnicodeString &DigitFormatter::format( int32_t digitsLeftOfDecimal = interval.getMostSignificantExclusive(); int32_t lastDigitPos = interval.getLeastSignificantInclusive(); int32_t intBegin = appendTo.length(); - int32_t fracBegin; + int32_t fracBegin = 0; /* initialize to avoid compiler warning */ // Emit "0" instead of empty string. if (digitsLeftOfDecimal == 0 && lastDigitPos == 0) { diff --git a/deps/icu-small/source/i18n/digitlst.cpp b/deps/icu-small/source/i18n/digitlst.cpp index fd96a07d71da23..10a3a5dca1a404 100644 --- a/deps/icu-small/source/i18n/digitlst.cpp +++ b/deps/icu-small/source/i18n/digitlst.cpp @@ -53,6 +53,7 @@ #if !defined(U_USE_STRTOD_L) # if U_PLATFORM_USES_ONLY_WIN32_API # define U_USE_STRTOD_L 1 +# define U_HAVE_XLOCALE_H 0 # elif defined(U_HAVE_STRTOD_L) # define U_USE_STRTOD_L U_HAVE_STRTOD_L # else @@ -61,10 +62,10 @@ #endif #if U_USE_STRTOD_L -# if U_PLATFORM_USES_ONLY_WIN32_API || U_PLATFORM == U_PF_CYGWIN -# include -# else +# if U_HAVE_XLOCALE_H # include +# else +# include # endif #endif diff --git a/deps/icu-small/source/i18n/dtfmtsym.cpp b/deps/icu-small/source/i18n/dtfmtsym.cpp index e465fe1762ba3e..af421d41c72e61 100644 --- a/deps/icu-small/source/i18n/dtfmtsym.cpp +++ b/deps/icu-small/source/i18n/dtfmtsym.cpp @@ -1630,20 +1630,24 @@ struct CalendarDataSink : public ResourceSink { UnicodeString *aliasArray; Hashtable *aliasMap; if ((aliasArray = (UnicodeString*)arrays.get(*alias)) != NULL) { - // Clone the array - int32_t aliasArraySize = arraySizes.geti(*alias); - LocalArray aliasArrayCopy(new UnicodeString[aliasArraySize], errorCode); - if (U_FAILURE(errorCode)) { return; } - uprv_arrayCopy(aliasArray, aliasArrayCopy.getAlias(), aliasArraySize); - // Put the array on the 'arrays' map UnicodeString *path = (UnicodeString*)aliasPathPairs[i + 1]; - arrays.put(*path, aliasArrayCopy.orphan(), errorCode); - arraySizes.puti(*path, aliasArraySize, errorCode); + if (arrays.get(*path) == NULL) { + // Clone the array + int32_t aliasArraySize = arraySizes.geti(*alias); + LocalArray aliasArrayCopy(new UnicodeString[aliasArraySize], errorCode); + if (U_FAILURE(errorCode)) { return; } + uprv_arrayCopy(aliasArray, aliasArrayCopy.getAlias(), aliasArraySize); + // Put the array on the 'arrays' map + arrays.put(*path, aliasArrayCopy.orphan(), errorCode); + arraySizes.puti(*path, aliasArraySize, errorCode); + } if (U_FAILURE(errorCode)) { return; } mod = true; } else if ((aliasMap = (Hashtable*)maps.get(*alias)) != NULL) { UnicodeString *path = (UnicodeString*)aliasPathPairs[i + 1]; - maps.put(*path, aliasMap, errorCode); + if (maps.get(*path) == NULL) { + maps.put(*path, aliasMap, errorCode); + } if (U_FAILURE(errorCode)) { return; } mod = true; } diff --git a/deps/icu-small/source/i18n/dtptngen.cpp b/deps/icu-small/source/i18n/dtptngen.cpp index 5ce3630d98f987..187342e4af2efc 100644 --- a/deps/icu-small/source/i18n/dtptngen.cpp +++ b/deps/icu-small/source/i18n/dtptngen.cpp @@ -134,15 +134,18 @@ U_NAMESPACE_BEGIN // class DateTimePatternGenerator // ***************************************************************************** static const UChar Canonical_Items[] = { - // GyQMwWEdDFHmsSv - CAP_G, LOW_Y, CAP_Q, CAP_M, LOW_W, CAP_W, CAP_E, LOW_D, CAP_D, CAP_F, + // GyQMwWEDFdaHmsSv + CAP_G, LOW_Y, CAP_Q, CAP_M, LOW_W, CAP_W, CAP_E, + CAP_D, CAP_F, LOW_D, LOW_A, // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J CAP_H, LOW_M, LOW_S, CAP_S, LOW_V, 0 }; static const dtTypeElem dtTypes[] = { // patternChar, field, type, minLen, weight {CAP_G, UDATPG_ERA_FIELD, DT_SHORT, 1, 3,}, - {CAP_G, UDATPG_ERA_FIELD, DT_LONG, 4, 0}, + {CAP_G, UDATPG_ERA_FIELD, DT_LONG, 4, 0}, + {CAP_G, UDATPG_ERA_FIELD, DT_NARROW, 5, 0}, + {LOW_Y, UDATPG_YEAR_FIELD, DT_NUMERIC, 1, 20}, {CAP_Y, UDATPG_YEAR_FIELD, DT_NUMERIC + DT_DELTA, 1, 20}, {LOW_U, UDATPG_YEAR_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 20}, @@ -150,12 +153,16 @@ static const dtTypeElem dtTypes[] = { {CAP_U, UDATPG_YEAR_FIELD, DT_SHORT, 1, 3}, {CAP_U, UDATPG_YEAR_FIELD, DT_LONG, 4, 0}, {CAP_U, UDATPG_YEAR_FIELD, DT_NARROW, 5, 0}, + {CAP_Q, UDATPG_QUARTER_FIELD, DT_NUMERIC, 1, 2}, {CAP_Q, UDATPG_QUARTER_FIELD, DT_SHORT, 3, 0}, {CAP_Q, UDATPG_QUARTER_FIELD, DT_LONG, 4, 0}, + {CAP_Q, UDATPG_QUARTER_FIELD, DT_NARROW, 5, 0}, {LOW_Q, UDATPG_QUARTER_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, - {LOW_Q, UDATPG_QUARTER_FIELD, DT_SHORT + DT_DELTA, 3, 0}, - {LOW_Q, UDATPG_QUARTER_FIELD, DT_LONG + DT_DELTA, 4, 0}, + {LOW_Q, UDATPG_QUARTER_FIELD, DT_SHORT - DT_DELTA, 3, 0}, + {LOW_Q, UDATPG_QUARTER_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {LOW_Q, UDATPG_QUARTER_FIELD, DT_NARROW - DT_DELTA, 5, 0}, + {CAP_M, UDATPG_MONTH_FIELD, DT_NUMERIC, 1, 2}, {CAP_M, UDATPG_MONTH_FIELD, DT_SHORT, 3, 0}, {CAP_M, UDATPG_MONTH_FIELD, DT_LONG, 4, 0}, @@ -165,32 +172,66 @@ static const dtTypeElem dtTypes[] = { {CAP_L, UDATPG_MONTH_FIELD, DT_LONG - DT_DELTA, 4, 0}, {CAP_L, UDATPG_MONTH_FIELD, DT_NARROW - DT_DELTA, 5, 0}, {LOW_L, UDATPG_MONTH_FIELD, DT_NUMERIC + DT_DELTA, 1, 1}, + {LOW_W, UDATPG_WEEK_OF_YEAR_FIELD, DT_NUMERIC, 1, 2}, - {CAP_W, UDATPG_WEEK_OF_MONTH_FIELD, DT_NUMERIC + DT_DELTA, 1, 0}, + + {CAP_W, UDATPG_WEEK_OF_MONTH_FIELD, DT_NUMERIC, 1, 0}, + {CAP_E, UDATPG_WEEKDAY_FIELD, DT_SHORT, 1, 3}, {CAP_E, UDATPG_WEEKDAY_FIELD, DT_LONG, 4, 0}, {CAP_E, UDATPG_WEEKDAY_FIELD, DT_NARROW, 5, 0}, + {CAP_E, UDATPG_WEEKDAY_FIELD, DT_SHORTER, 6, 0}, {LOW_C, UDATPG_WEEKDAY_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 2}, {LOW_C, UDATPG_WEEKDAY_FIELD, DT_SHORT - 2*DT_DELTA, 3, 0}, {LOW_C, UDATPG_WEEKDAY_FIELD, DT_LONG - 2*DT_DELTA, 4, 0}, {LOW_C, UDATPG_WEEKDAY_FIELD, DT_NARROW - 2*DT_DELTA, 5, 0}, + {LOW_C, UDATPG_WEEKDAY_FIELD, DT_SHORTER - 2*DT_DELTA, 6, 0}, {LOW_E, UDATPG_WEEKDAY_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, // LOW_E is currently not used in CLDR data, should not be canonical {LOW_E, UDATPG_WEEKDAY_FIELD, DT_SHORT - DT_DELTA, 3, 0}, {LOW_E, UDATPG_WEEKDAY_FIELD, DT_LONG - DT_DELTA, 4, 0}, {LOW_E, UDATPG_WEEKDAY_FIELD, DT_NARROW - DT_DELTA, 5, 0}, + {LOW_E, UDATPG_WEEKDAY_FIELD, DT_SHORTER - DT_DELTA, 6, 0}, + {LOW_D, UDATPG_DAY_FIELD, DT_NUMERIC, 1, 2}, - {CAP_D, UDATPG_DAY_OF_YEAR_FIELD, DT_NUMERIC + DT_DELTA, 1, 3}, - {CAP_F, UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 0}, - {LOW_G, UDATPG_DAY_FIELD, DT_NUMERIC + 3*DT_DELTA, 1, 20}, // really internal use, so we don't care - {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_SHORT, 1, 0}, + {LOW_G, UDATPG_DAY_FIELD, DT_NUMERIC + DT_DELTA, 1, 20}, // really internal use, so we don't care + + {CAP_D, UDATPG_DAY_OF_YEAR_FIELD, DT_NUMERIC, 1, 3}, + + {CAP_F, UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, DT_NUMERIC, 1, 0}, + + {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_SHORT, 1, 3}, + {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_LONG, 4, 0}, + {LOW_A, UDATPG_DAYPERIOD_FIELD, DT_NARROW, 5, 0}, + {LOW_B, UDATPG_DAYPERIOD_FIELD, DT_SHORT - DT_DELTA, 1, 3}, + {LOW_B, UDATPG_DAYPERIOD_FIELD, DT_LONG - DT_DELTA, 4, 0}, + {LOW_B, UDATPG_DAYPERIOD_FIELD, DT_NARROW - DT_DELTA, 5, 0}, + // b needs to be closer to a than to B, so we make this 3*DT_DELTA + {CAP_B, UDATPG_DAYPERIOD_FIELD, DT_SHORT - 3*DT_DELTA, 1, 3}, + {CAP_B, UDATPG_DAYPERIOD_FIELD, DT_LONG - 3*DT_DELTA, 4, 0}, + {CAP_B, UDATPG_DAYPERIOD_FIELD, DT_NARROW - 3*DT_DELTA, 5, 0}, + {CAP_H, UDATPG_HOUR_FIELD, DT_NUMERIC + 10*DT_DELTA, 1, 2}, // 24 hour {LOW_K, UDATPG_HOUR_FIELD, DT_NUMERIC + 11*DT_DELTA, 1, 2}, // 24 hour {LOW_H, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12 hour {CAP_K, UDATPG_HOUR_FIELD, DT_NUMERIC + DT_DELTA, 1, 2}, // 12 hour + // The C code has had versions of the following 3, keep & update. Should not need these, but... + // Without these, certain tests using e.g. staticGetSkeleton fail because j/J in patterns + // get skipped instead of mapped to the right hour chars, for example in + // DateFormatTest::TestPatternFromSkeleton + // IntlTestDateTimePatternGeneratorAPI:: testStaticGetSkeleton + // DateIntervalFormatTest::testTicket11985 + // Need to investigate better handling of jJC replacement e.g. in staticGetSkeleton. + {CAP_J, UDATPG_HOUR_FIELD, DT_NUMERIC + 5*DT_DELTA, 1, 2}, // 12/24 hour no AM/PM + {LOW_J, UDATPG_HOUR_FIELD, DT_NUMERIC + 6*DT_DELTA, 1, 6}, // 12/24 hour + {CAP_C, UDATPG_HOUR_FIELD, DT_NUMERIC + 7*DT_DELTA, 1, 6}, // 12/24 hour with preferred dayPeriods for 12 + {LOW_M, UDATPG_MINUTE_FIELD, DT_NUMERIC, 1, 2}, + {LOW_S, UDATPG_SECOND_FIELD, DT_NUMERIC, 1, 2}, - {CAP_S, UDATPG_FRACTIONAL_SECOND_FIELD, DT_NUMERIC + DT_DELTA, 1, 1000}, - {CAP_A, UDATPG_SECOND_FIELD, DT_NUMERIC + 2*DT_DELTA, 1, 1000}, + {CAP_A, UDATPG_SECOND_FIELD, DT_NUMERIC + DT_DELTA, 1, 1000}, + + {CAP_S, UDATPG_FRACTIONAL_SECOND_FIELD, DT_NUMERIC, 1, 1000}, + {LOW_V, UDATPG_ZONE_FIELD, DT_SHORT - 2*DT_DELTA, 1, 0}, {LOW_V, UDATPG_ZONE_FIELD, DT_LONG - 2*DT_DELTA, 4, 0}, {LOW_Z, UDATPG_ZONE_FIELD, DT_SHORT, 1, 3}, @@ -202,24 +243,27 @@ static const dtTypeElem dtTypes[] = { {CAP_O, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0}, {CAP_V, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 1, 0}, {CAP_V, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 2, 0}, + {CAP_V, UDATPG_ZONE_FIELD, DT_LONG-1 - DT_DELTA, 3, 0}, + {CAP_V, UDATPG_ZONE_FIELD, DT_LONG-2 - DT_DELTA, 4, 0}, {CAP_X, UDATPG_ZONE_FIELD, DT_NARROW - DT_DELTA, 1, 0}, {CAP_X, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 2, 0}, {CAP_X, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0}, {LOW_X, UDATPG_ZONE_FIELD, DT_NARROW - DT_DELTA, 1, 0}, {LOW_X, UDATPG_ZONE_FIELD, DT_SHORT - DT_DELTA, 2, 0}, {LOW_X, UDATPG_ZONE_FIELD, DT_LONG - DT_DELTA, 4, 0}, - {LOW_J, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12/24 hour - {CAP_J, UDATPG_HOUR_FIELD, DT_NUMERIC, 1, 2}, // 12/24 hour no AM/PM + {0, UDATPG_FIELD_COUNT, 0, 0, 0} , // last row of dtTypes[] }; static const char* const CLDR_FIELD_APPEND[] = { - "Era", "Year", "Quarter", "Month", "Week", "*", "Day-Of-Week", "Day", "*", "*", "*", + "Era", "Year", "Quarter", "Month", "Week", "*", "Day-Of-Week", + "*", "*", "Day", "*", // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J "Hour", "Minute", "Second", "*", "Timezone" }; static const char* const CLDR_FIELD_NAME[] = { - "era", "year", "quarter", "month", "week", "*", "weekday", "*", "*", "day", "dayperiod", + "era", "year", "quarter", "month", "week", "weekOfMonth", "weekday", + "dayOfYear", "weekdayOfMonth", "day", "dayperiod", // The UDATPG_x_FIELD constants and these fields have a different order than in ICU4J "hour", "minute", "second", "*", "zone" }; @@ -963,47 +1007,13 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate int32_t timeMask=(1<set(patternFormCopy, fp); + dtMatcher->set(patternFormMapped, fp); const PtnSkeleton* specifiedSkeleton=NULL; bestPattern=getBestRaw(*dtMatcher, -1, distanceInfo, &specifiedSkeleton); if ( distanceInfo->missingFieldMask==0 && distanceInfo->extraFieldMask==0 ) { @@ -1032,6 +1042,82 @@ DateTimePatternGenerator::getBestPattern(const UnicodeString& patternForm, UDate return resultPattern; } +/* + * Map a skeleton that may have metacharacters jJC to one without, by replacing + * the metacharacters with locale-appropriate fields of of h/H/k/K and of a/b/B + * (depends on fDefaultHourFormatChar and fAllowedHourFormats being set, which in + * turn depends on initData having been run). This method also updates the flags + * as necessary. Returns the updated skeleton. + */ +UnicodeString +DateTimePatternGenerator::mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status) { + UnicodeString patternFormMapped; + patternFormMapped.remove(); + UBool inQuoted = FALSE; + int32_t patPos, patLen = patternForm.length(); + for (patPos = 0; patPos < patLen; patPos++) { + UChar patChr = patternForm.charAt(patPos); + if (patChr == SINGLE_QUOTE) { + inQuoted = !inQuoted; + } else if (!inQuoted) { + // Handle special mappings for 'j' and 'C' in which fields lengths + // 1,3,5 => hour field length 1 + // 2,4,6 => hour field length 2 + // 1,2 => abbreviated dayPeriod (field length 1..3) + // 3,4 => long dayPeriod (field length 4) + // 5,6 => narrow dayPeriod (field length 5) + if (patChr == LOW_J || patChr == CAP_C) { + int32_t extraLen = 0; // 1 less than total field length + while (patPos+1 < patLen && patternForm.charAt(patPos+1)==patChr) { + extraLen++; + patPos++; + } + int32_t hourLen = 1 + (extraLen & 1); + int32_t dayPeriodLen = (extraLen < 2)? 1: 3 + (extraLen >> 1); + UChar hourChar = LOW_H; + UChar dayPeriodChar = LOW_A; + if (patChr == LOW_J) { + hourChar = fDefaultHourFormatChar; + } else { + AllowedHourFormat preferred; + if (fAllowedHourFormats[0] != ALLOWED_HOUR_FORMAT_UNKNOWN) { + preferred = (AllowedHourFormat)fAllowedHourFormats[0]; + } else { + status = U_INVALID_FORMAT_ERROR; + return UnicodeString(); + } + if (preferred == ALLOWED_HOUR_FORMAT_H || preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_Hb) { + hourChar = CAP_H; + } + // in #13183 just add b/B to skeleton, no longer need to set special flags + if (preferred == ALLOWED_HOUR_FORMAT_HB || preferred == ALLOWED_HOUR_FORMAT_hB) { + dayPeriodChar = CAP_B; + } else if (preferred == ALLOWED_HOUR_FORMAT_Hb || preferred == ALLOWED_HOUR_FORMAT_hb) { + dayPeriodChar = LOW_B; + } + } + if (hourChar==CAP_H || hourChar==LOW_K) { + dayPeriodLen = 0; + } + while (dayPeriodLen-- > 0) { + patternFormMapped.append(dayPeriodChar); + } + while (hourLen-- > 0) { + patternFormMapped.append(hourChar); + } + } else if (patChr == CAP_J) { + // Get pattern for skeleton with H, then replace H or k + // with fDefaultHourFormatChar (if different) + patternFormMapped.append(CAP_H); + *flags |= kDTPGSkeletonUsesCapJ; + } else { + patternFormMapped.append(patChr); + } + } + } + return patternFormMapped; +} + UnicodeString DateTimePatternGenerator::replaceFieldTypes(const UnicodeString& pattern, const UnicodeString& skeleton, @@ -1299,17 +1385,7 @@ DateTimePatternGenerator::adjustFieldTypes(const UnicodeString& pattern, const dtTypeElem *row = &dtTypes[canonicalIndex]; int32_t typeValue = row->field; - // Handle special day periods. - if (typeValue == UDATPG_DAYPERIOD_FIELD && flags != 0) { - UChar c = NONE; // '0' - if (flags & kDTPGSkeletonUsesCapB) { c = CAP_B; } - if (flags & kDTPGSkeletonUsesLowB) { c = LOW_B; } - - if (c != NONE) { - for (int32_t i = 0; i < field.length(); ++i) - field.setCharAt(i, c); - } - } + // handle day periods - with #13183, no longer need special handling here, integrated with normal types if ((flags & kDTPGFixFractionalSeconds) != 0 && typeValue == UDATPG_SECOND_FIELD) { field += decimal; @@ -1841,12 +1917,14 @@ DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton for (i=0; iset(pattern); for (i=0; i < fp->itemNumber; i++) { const UnicodeString& value = fp->items[i]; - if ( value.charAt(0) == LOW_A ) { - continue; // skip 'a' - } + // don't skip 'a' anymore, dayPeriod handled specially below if ( fp->isQuoteLiteral(value) ) { UnicodeString quoteLiteral; @@ -1861,7 +1939,7 @@ DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton int32_t field = row->field; skeletonResult.original.populate(field, value); UChar repeatChar = row->patternChar; - int32_t repeatCount = row->minLen; // #7930 removes cap at 3 + int32_t repeatCount = row->minLen; skeletonResult.baseOriginal.populate(field, repeatChar, repeatCount); int16_t subField = row->type; if ( row->type > 0) { @@ -1869,6 +1947,30 @@ DateTimeMatcher::set(const UnicodeString& pattern, FormatParser* fp, PtnSkeleton } skeletonResult.type[field] = subField; } + // #13183, handle special behavior for day period characters (a, b, B) + if (!skeletonResult.original.isFieldEmpty(UDATPG_HOUR_FIELD)) { + if (skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==LOW_H || skeletonResult.original.getFieldChar(UDATPG_HOUR_FIELD)==CAP_K) { + // We have a skeleton with 12-hour-cycle format + if (skeletonResult.original.isFieldEmpty(UDATPG_DAYPERIOD_FIELD)) { + // But we do not have a day period in the skeleton; add the default DAYPERIOD (currently "a") + for (i = 0; dtTypes[i].patternChar != 0; i++) { + if ( dtTypes[i].field == UDATPG_DAYPERIOD_FIELD ) { + // first entry for UDATPG_DAYPERIOD_FIELD + skeletonResult.original.populate(UDATPG_DAYPERIOD_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen); + skeletonResult.baseOriginal.populate(UDATPG_DAYPERIOD_FIELD, dtTypes[i].patternChar, dtTypes[i].minLen); + skeletonResult.type[UDATPG_DAYPERIOD_FIELD] = dtTypes[i].type; + skeletonResult.addedDefaultDayPeriod = TRUE; + break; + } + } + } + } else { + // Skeleton has 24-hour-cycle hour format and has dayPeriod, delete dayPeriod (i.e. ignore it) + skeletonResult.original.clearField(UDATPG_DAYPERIOD_FIELD); + skeletonResult.baseOriginal.clearField(UDATPG_DAYPERIOD_FIELD); + skeletonResult.type[UDATPG_DAYPERIOD_FIELD] = NONE; + } + } copyFrom(skeletonResult); } @@ -2290,13 +2392,27 @@ PtnSkeleton::equals(const PtnSkeleton& other) const { UnicodeString PtnSkeleton::getSkeleton() const { UnicodeString result; - return original.appendTo(result); + result = original.appendTo(result); + int32_t pos; + if (addedDefaultDayPeriod && (pos = result.indexOf(LOW_A)) >= 0) { + // for backward compatibility: if DateTimeMatcher.set added a single 'a' that + // was not in the provided skeleton, remove it here before returning skeleton. + result.remove(pos, 1); + } + return result; } UnicodeString PtnSkeleton::getBaseSkeleton() const { UnicodeString result; - return baseOriginal.appendTo(result); + result = baseOriginal.appendTo(result); + int32_t pos; + if (addedDefaultDayPeriod && (pos = result.indexOf(LOW_A)) >= 0) { + // for backward compatibility: if DateTimeMatcher.set added a single 'a' that + // was not in the provided skeleton, remove it here before returning skeleton. + result.remove(pos, 1); + } + return result; } UChar diff --git a/deps/icu-small/source/i18n/dtptngen_impl.h b/deps/icu-small/source/i18n/dtptngen_impl.h index 38afd5ff5a8d7f..2ea31a75c488fa 100644 --- a/deps/icu-small/source/i18n/dtptngen_impl.h +++ b/deps/icu-small/source/i18n/dtptngen_impl.h @@ -92,10 +92,11 @@ #define LOW_X ((UChar)0x0078) #define LOW_Y ((UChar)0x0079) #define LOW_Z ((UChar)0x007A) -#define DT_SHORT -0x102 -#define DT_LONG -0x103 -#define DT_NUMERIC 0x100 #define DT_NARROW -0x101 +#define DT_SHORTER -0x102 +#define DT_SHORT -0x103 +#define DT_LONG -0x104 +#define DT_NUMERIC 0x100 #define DT_DELTA 0x10 U_NAMESPACE_BEGIN @@ -155,6 +156,7 @@ class PtnSkeleton : public UMemory { int32_t type[UDATPG_FIELD_COUNT]; SkeletonFields original; SkeletonFields baseOriginal; + UBool addedDefaultDayPeriod; PtnSkeleton(); PtnSkeleton(const PtnSkeleton& other); diff --git a/deps/icu-small/source/i18n/gregoimp.cpp b/deps/icu-small/source/i18n/gregoimp.cpp index 01465973d63b1d..cc31e274131906 100644 --- a/deps/icu-small/source/i18n/gregoimp.cpp +++ b/deps/icu-small/source/i18n/gregoimp.cpp @@ -27,6 +27,11 @@ int32_t ClockMath::floorDivide(int32_t numerator, int32_t denominator) { numerator / denominator : ((numerator + 1) / denominator) - 1; } +int64_t ClockMath::floorDivide(int64_t numerator, int64_t denominator) { + return (numerator >= 0) ? + numerator / denominator : ((numerator + 1) / denominator) - 1; +} + int32_t ClockMath::floorDivide(double numerator, int32_t denominator, int32_t& remainder) { double quotient; diff --git a/deps/icu-small/source/i18n/gregoimp.h b/deps/icu-small/source/i18n/gregoimp.h index a7834c4ee52654..55922a6b40aa52 100644 --- a/deps/icu-small/source/i18n/gregoimp.h +++ b/deps/icu-small/source/i18n/gregoimp.h @@ -40,6 +40,17 @@ class ClockMath { */ static int32_t floorDivide(int32_t numerator, int32_t denominator); + /** + * Divide two integers, returning the floor of the quotient. + * Unlike the built-in division, this is mathematically + * well-behaved. E.g., -1/4 => 0 but + * floorDivide(-1,4) => -1. + * @param numerator the numerator + * @param denominator a divisor which must be != 0 + * @return the floor of the quotient + */ + static int64_t floorDivide(int64_t numerator, int64_t denominator); + /** * Divide two numbers, returning the floor of the quotient. * Unlike the built-in division, this is mathematically diff --git a/deps/icu-small/source/i18n/measfmt.cpp b/deps/icu-small/source/i18n/measfmt.cpp index 4e9d4a56f2b397..628c8f8992d7a2 100644 --- a/deps/icu-small/source/i18n/measfmt.cpp +++ b/deps/icu-small/source/i18n/measfmt.cpp @@ -42,11 +42,14 @@ #include "standardplural.h" #include "unifiedcache.h" -#define MEAS_UNIT_COUNT 135 -#define WIDTH_INDEX_COUNT (UMEASFMT_WIDTH_NARROW + 1) U_NAMESPACE_BEGIN +static constexpr int32_t PER_UNIT_INDEX = StandardPlural::COUNT; +static constexpr int32_t PATTERN_COUNT = PER_UNIT_INDEX + 1; +static constexpr int32_t MEAS_UNIT_COUNT = 138; // see assertion in MeasureFormatCacheData constructor +static constexpr int32_t WIDTH_INDEX_COUNT = UMEASFMT_WIDTH_NARROW + 1; + UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MeasureFormat) // Used to format durations like 5:47 or 21:35:42. @@ -100,8 +103,6 @@ static UMeasureFormatWidth getRegularWidth(UMeasureFormatWidth width) { */ class MeasureFormatCacheData : public SharedObject { public: - static const int32_t PER_UNIT_INDEX = StandardPlural::COUNT; - static const int32_t PATTERN_COUNT = PER_UNIT_INDEX + 1; /** * Redirection data from root-bundle, top-level sideways aliases. @@ -110,7 +111,7 @@ class MeasureFormatCacheData : public SharedObject { */ UMeasureFormatWidth widthFallback[WIDTH_INDEX_COUNT]; /** Measure unit -> format width -> array of patterns ("{0} meters") (plurals + PER_UNIT_INDEX) */ - SimpleFormatter *patterns[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT][PATTERN_COUNT]; + SimpleFormatter* patterns[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT][PATTERN_COUNT]; const UChar* dnams[MEAS_UNIT_COUNT][WIDTH_INDEX_COUNT]; SimpleFormatter perFormatters[WIDTH_INDEX_COUNT]; @@ -146,24 +147,25 @@ class MeasureFormatCacheData : public SharedObject { } private: - NumberFormat *currencyFormats[WIDTH_INDEX_COUNT]; - NumberFormat *integerFormat; - NumericDateFormatters *numericDateFormatters; + NumberFormat* currencyFormats[WIDTH_INDEX_COUNT]; + NumberFormat* integerFormat; + NumericDateFormatters* numericDateFormatters; + MeasureFormatCacheData(const MeasureFormatCacheData &other); MeasureFormatCacheData &operator=(const MeasureFormatCacheData &other); }; -MeasureFormatCacheData::MeasureFormatCacheData() { +MeasureFormatCacheData::MeasureFormatCacheData() + : integerFormat(nullptr), numericDateFormatters(nullptr) { + // Please update MEAS_UNIT_COUNT if it gets out of sync with the true count! + U_ASSERT(MEAS_UNIT_COUNT == MeasureUnit::getIndexCount()); + for (int32_t i = 0; i < WIDTH_INDEX_COUNT; ++i) { widthFallback[i] = UMEASFMT_WIDTH_COUNT; } - for (int32_t i = 0; i < UPRV_LENGTHOF(currencyFormats); ++i) { - currencyFormats[i] = NULL; - } - uprv_memset(patterns, 0, sizeof(patterns)); - uprv_memset(dnams, 0, sizeof(dnams)); - integerFormat = NULL; - numericDateFormatters = NULL; + memset(&patterns[0][0][0], 0, sizeof(patterns)); + memset(&dnams[0][0], 0, sizeof(dnams)); + memset(currencyFormats, 0, sizeof(currencyFormats)); } MeasureFormatCacheData::~MeasureFormatCacheData() { @@ -236,6 +238,9 @@ struct UnitDataSink : public ResourceSink { void setFormatterIfAbsent(int32_t index, const ResourceValue &value, int32_t minPlaceholders, UErrorCode &errorCode) { + U_ASSERT(unitIndex < MEAS_UNIT_COUNT); + U_ASSERT(width < WIDTH_INDEX_COUNT); + U_ASSERT(index < PATTERN_COUNT); SimpleFormatter **patterns = &cacheData.patterns[unitIndex][width][0]; if (U_SUCCESS(errorCode) && patterns[index] == NULL) { if (minPlaceholders >= 0) { @@ -249,6 +254,8 @@ struct UnitDataSink : public ResourceSink { } void setDnamIfAbsent(const ResourceValue &value, UErrorCode& errorCode) { + U_ASSERT(unitIndex < MEAS_UNIT_COUNT); + U_ASSERT(width < WIDTH_INDEX_COUNT); if (cacheData.dnams[unitIndex][width] == NULL) { int32_t length; cacheData.dnams[unitIndex][width] = value.getString(length, errorCode); @@ -266,7 +273,7 @@ struct UnitDataSink : public ResourceSink { setDnamIfAbsent(value, errorCode); } else if (uprv_strcmp(key, "per") == 0) { // For example, "{0}/h". - setFormatterIfAbsent(MeasureFormatCacheData::PER_UNIT_INDEX, value, 1, errorCode); + setFormatterIfAbsent(PER_UNIT_INDEX, value, 1, errorCode); } else { // The key must be one of the plural form strings. For example: // one{"{0} hr"} @@ -1093,8 +1100,7 @@ UnicodeString &MeasureFormat::formatNumeric( const SimpleFormatter *MeasureFormat::getFormatterOrNull( const MeasureUnit &unit, UMeasureFormatWidth width, int32_t index) const { width = getRegularWidth(width); - SimpleFormatter *const (*unitPatterns)[MeasureFormatCacheData::PATTERN_COUNT] = - &cache->patterns[unit.getIndex()][0]; + SimpleFormatter *const (*unitPatterns)[PATTERN_COUNT] = &cache->patterns[unit.getIndex()][0]; if (unitPatterns[width][index] != NULL) { return unitPatterns[width][index]; } @@ -1162,8 +1168,7 @@ int32_t MeasureFormat::withPerUnitAndAppend( if (U_FAILURE(status)) { return offset; } - const SimpleFormatter *perUnitFormatter = - getFormatterOrNull(perUnit, width, MeasureFormatCacheData::PER_UNIT_INDEX); + const SimpleFormatter *perUnitFormatter = getFormatterOrNull(perUnit, width, PER_UNIT_INDEX); if (perUnitFormatter != NULL) { const UnicodeString *params[] = {&formatted}; perUnitFormatter->formatAndAppend( diff --git a/deps/icu-small/source/i18n/measunit.cpp b/deps/icu-small/source/i18n/measunit.cpp index 43c8fd4bab8076..580afc0df5d2bc 100644 --- a/deps/icu-small/source/i18n/measunit.cpp +++ b/deps/icu-small/source/i18n/measunit.cpp @@ -33,6 +33,7 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MeasureUnit) // // Start generated code + static const int32_t gOffsets[] = { 0, 2, @@ -49,11 +50,12 @@ static const int32_t gOffsets[] = { 340, 341, 352, - 358, - 363, - 367, - 371, - 396 + 355, + 361, + 366, + 370, + 374, + 399 }; static const int32_t gIndexes[] = { @@ -72,11 +74,12 @@ static const int32_t gIndexes[] = { 79, 80, 91, - 97, - 102, - 106, - 110, - 135 + 94, + 100, + 105, + 109, + 113, + 138 }; // Must be sorted alphabetically. @@ -95,6 +98,7 @@ static const char * const gTypes[] = { "length", "light", "mass", + "none", "power", "pressure", "speed", @@ -456,6 +460,9 @@ static const char * const gSubTypes[] = { "pound", "stone", "ton", + "base", + "percent", + "permille", "gigawatt", "horsepower", "kilowatt", @@ -504,14 +511,14 @@ static const char * const gSubTypes[] = { // Must be sorted by first value and then second value. static int32_t unitPerUnitToSingleUnit[][4] = { - {327, 297, 16, 0}, - {329, 303, 16, 2}, - {331, 297, 16, 3}, - {331, 385, 4, 2}, - {331, 386, 4, 3}, - {346, 383, 3, 1}, - {349, 11, 15, 4}, - {388, 327, 4, 1} + {327, 297, 17, 0}, + {329, 303, 17, 2}, + {331, 297, 17, 3}, + {331, 388, 4, 2}, + {331, 389, 4, 3}, + {346, 386, 3, 1}, + {349, 11, 16, 4}, + {391, 327, 4, 1} }; MeasureUnit *MeasureUnit::createGForce(UErrorCode &status) { @@ -610,14 +617,6 @@ MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) { return MeasureUnit::create(4, 3, status); } -// MeasureUnit *MeasureUnit::createEast(UErrorCode &status) {...} - -// MeasureUnit *MeasureUnit::createNorth(UErrorCode &status) {...} - -// MeasureUnit *MeasureUnit::createSouth(UErrorCode &status) {...} - -// MeasureUnit *MeasureUnit::createWest(UErrorCode &status) {...} - MeasureUnit *MeasureUnit::createBit(UErrorCode &status) { return MeasureUnit::create(6, 0, status); } @@ -887,179 +886,179 @@ MeasureUnit *MeasureUnit::createTon(UErrorCode &status) { } MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) { - return MeasureUnit::create(14, 0, status); + return MeasureUnit::create(15, 0, status); } MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) { - return MeasureUnit::create(14, 1, status); + return MeasureUnit::create(15, 1, status); } MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) { - return MeasureUnit::create(14, 2, status); + return MeasureUnit::create(15, 2, status); } MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) { - return MeasureUnit::create(14, 3, status); + return MeasureUnit::create(15, 3, status); } MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) { - return MeasureUnit::create(14, 4, status); + return MeasureUnit::create(15, 4, status); } MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) { - return MeasureUnit::create(14, 5, status); + return MeasureUnit::create(15, 5, status); } MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) { - return MeasureUnit::create(15, 0, status); + return MeasureUnit::create(16, 0, status); } MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) { - return MeasureUnit::create(15, 1, status); + return MeasureUnit::create(16, 1, status); } MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) { - return MeasureUnit::create(15, 2, status); + return MeasureUnit::create(16, 2, status); } MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) { - return MeasureUnit::create(15, 3, status); + return MeasureUnit::create(16, 3, status); } MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) { - return MeasureUnit::create(15, 4, status); + return MeasureUnit::create(16, 4, status); } MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) { - return MeasureUnit::create(16, 0, status); + return MeasureUnit::create(17, 0, status); } MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) { - return MeasureUnit::create(16, 1, status); + return MeasureUnit::create(17, 1, status); } MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) { - return MeasureUnit::create(16, 2, status); + return MeasureUnit::create(17, 2, status); } MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) { - return MeasureUnit::create(16, 3, status); + return MeasureUnit::create(17, 3, status); } MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) { - return MeasureUnit::create(17, 0, status); + return MeasureUnit::create(18, 0, status); } MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) { - return MeasureUnit::create(17, 1, status); + return MeasureUnit::create(18, 1, status); } MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) { - return MeasureUnit::create(17, 2, status); + return MeasureUnit::create(18, 2, status); } MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) { - return MeasureUnit::create(17, 3, status); + return MeasureUnit::create(18, 3, status); } MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) { - return MeasureUnit::create(18, 0, status); + return MeasureUnit::create(19, 0, status); } MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) { - return MeasureUnit::create(18, 1, status); + return MeasureUnit::create(19, 1, status); } MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) { - return MeasureUnit::create(18, 2, status); + return MeasureUnit::create(19, 2, status); } MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) { - return MeasureUnit::create(18, 3, status); + return MeasureUnit::create(19, 3, status); } MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) { - return MeasureUnit::create(18, 4, status); + return MeasureUnit::create(19, 4, status); } MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) { - return MeasureUnit::create(18, 5, status); + return MeasureUnit::create(19, 5, status); } MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) { - return MeasureUnit::create(18, 6, status); + return MeasureUnit::create(19, 6, status); } MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) { - return MeasureUnit::create(18, 7, status); + return MeasureUnit::create(19, 7, status); } MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) { - return MeasureUnit::create(18, 8, status); + return MeasureUnit::create(19, 8, status); } MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) { - return MeasureUnit::create(18, 9, status); + return MeasureUnit::create(19, 9, status); } MeasureUnit *MeasureUnit::createCup(UErrorCode &status) { - return MeasureUnit::create(18, 10, status); + return MeasureUnit::create(19, 10, status); } MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) { - return MeasureUnit::create(18, 11, status); + return MeasureUnit::create(19, 11, status); } MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) { - return MeasureUnit::create(18, 12, status); + return MeasureUnit::create(19, 12, status); } MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) { - return MeasureUnit::create(18, 13, status); + return MeasureUnit::create(19, 13, status); } MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) { - return MeasureUnit::create(18, 14, status); + return MeasureUnit::create(19, 14, status); } MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) { - return MeasureUnit::create(18, 15, status); + return MeasureUnit::create(19, 15, status); } MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) { - return MeasureUnit::create(18, 16, status); + return MeasureUnit::create(19, 16, status); } MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) { - return MeasureUnit::create(18, 17, status); + return MeasureUnit::create(19, 17, status); } MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) { - return MeasureUnit::create(18, 18, status); + return MeasureUnit::create(19, 18, status); } MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) { - return MeasureUnit::create(18, 19, status); + return MeasureUnit::create(19, 19, status); } MeasureUnit *MeasureUnit::createPint(UErrorCode &status) { - return MeasureUnit::create(18, 20, status); + return MeasureUnit::create(19, 20, status); } MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) { - return MeasureUnit::create(18, 21, status); + return MeasureUnit::create(19, 21, status); } MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) { - return MeasureUnit::create(18, 22, status); + return MeasureUnit::create(19, 22, status); } MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) { - return MeasureUnit::create(18, 23, status); + return MeasureUnit::create(19, 23, status); } MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) { - return MeasureUnit::create(18, 24, status); + return MeasureUnit::create(19, 24, status); } // End generated code @@ -1081,6 +1080,11 @@ static int32_t binarySearch( return -1; } +MeasureUnit::MeasureUnit() { + fCurrency[0] = 0; + initNoUnit("base"); +} + MeasureUnit::MeasureUnit(const MeasureUnit &other) : fTypeId(other.fTypeId), fSubTypeId(other.fSubTypeId) { uprv_strcpy(fCurrency, other.fCurrency); @@ -1269,6 +1273,15 @@ void MeasureUnit::initCurrency(const char *isoCurrency) { } } +void MeasureUnit::initNoUnit(const char *subtype) { + int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "none"); + U_ASSERT(result != -1); + fTypeId = result; + result = binarySearch(gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], subtype); + U_ASSERT(result != -1); + fSubTypeId = result - gOffsets[fTypeId]; +} + void MeasureUnit::setTo(int32_t typeId, int32_t subTypeId) { fTypeId = typeId; fSubTypeId = subTypeId; diff --git a/deps/icu-small/source/i18n/msgfmt.cpp b/deps/icu-small/source/i18n/msgfmt.cpp index 94a0286196a92b..064585665ae5e6 100644 --- a/deps/icu-small/source/i18n/msgfmt.cpp +++ b/deps/icu-small/source/i18n/msgfmt.cpp @@ -1954,7 +1954,10 @@ UnicodeString MessageFormat::PluralSelectorProvider::select(void *ctx, double nu context.formatter = msgFormat.getDefaultNumberFormat(ec); context.forReplaceNumber = TRUE; } - U_ASSERT(context.number.getDouble(ec) == number); // argument number minus the offset + if (context.number.getDouble(ec) != number) { + ec = U_INTERNAL_PROGRAM_ERROR; + return UnicodeString(FALSE, OTHER_STRING, 5); + } context.formatter->format(context.number, context.numberString, ec); const DecimalFormat *decFmt = dynamic_cast(context.formatter); if(decFmt != NULL) { diff --git a/deps/icu-small/source/i18n/nfrs.cpp b/deps/icu-small/source/i18n/nfrs.cpp index 8119aefd5eccb1..b2d08889e6bce5 100644 --- a/deps/icu-small/source/i18n/nfrs.cpp +++ b/deps/icu-small/source/i18n/nfrs.cpp @@ -830,18 +830,21 @@ int64_t util64_fromDouble(double d) { return result; } -int64_t util64_pow(int32_t base, uint16_t exponent) { +uint64_t util64_pow(uint32_t base, uint16_t exponent) { if (base == 0) { return 0; } - int64_t result = 1; - int64_t pow = base; - while (exponent > 0) { + uint64_t result = 1; + uint64_t pow = base; + while (true) { if ((exponent & 1) == 1) { result *= pow; } - pow *= pow; exponent >>= 1; + if (exponent == 0) { + break; + } + pow *= pow; } return result; } diff --git a/deps/icu-small/source/i18n/nfrs.h b/deps/icu-small/source/i18n/nfrs.h index eafb1ca4413337..34846ed297b77d 100644 --- a/deps/icu-small/source/i18n/nfrs.h +++ b/deps/icu-small/source/i18n/nfrs.h @@ -88,7 +88,9 @@ class NFRuleSet : public UMemory { int64_t util64_fromDouble(double d); // raise radix to the power exponent, only non-negative exponents -int64_t util64_pow(int32_t radix, uint16_t exponent); +// Arithmetic is performed in unsigned space since overflow in +// signed space is undefined behavior. +uint64_t util64_pow(uint32_t radix, uint16_t exponent); // convert n to digit string in buffer, return length of string uint32_t util64_tou(int64_t n, UChar* buffer, uint32_t buflen, uint32_t radix = 10, UBool raw = FALSE); diff --git a/deps/icu-small/source/i18n/nfsubs.cpp b/deps/icu-small/source/i18n/nfsubs.cpp index 6e7eabe350a60e..1a0914152deaa4 100644 --- a/deps/icu-small/source/i18n/nfsubs.cpp +++ b/deps/icu-small/source/i18n/nfsubs.cpp @@ -111,7 +111,7 @@ class MultiplierSubstitution : public NFSubstitution { return newRuleValue * divisor; } - virtual double calcUpperBound(double /*oldUpperBound*/) const { return divisor; } + virtual double calcUpperBound(double /*oldUpperBound*/) const { return static_cast(divisor); } virtual UChar tokenChar() const { return (UChar)0x003c; } // '<' @@ -148,7 +148,7 @@ class ModulusSubstitution : public NFSubstitution { virtual void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos, int32_t recursionCount, UErrorCode& status) const; virtual int64_t transformNumber(int64_t number) const { return number % divisor; } - virtual double transformNumber(double number) const { return uprv_fmod(number, divisor); } + virtual double transformNumber(double number) const { return uprv_fmod(number, static_cast(divisor)); } virtual UBool doParse(const UnicodeString& text, ParsePosition& parsePosition, @@ -158,10 +158,10 @@ class ModulusSubstitution : public NFSubstitution { Formattable& result) const; virtual double composeRuleValue(double newRuleValue, double oldRuleValue) const { - return oldRuleValue - uprv_fmod(oldRuleValue, divisor) + newRuleValue; + return oldRuleValue - uprv_fmod(oldRuleValue, static_cast(divisor)) + newRuleValue; } - virtual double calcUpperBound(double /*oldUpperBound*/) const { return divisor; } + virtual double calcUpperBound(double /*oldUpperBound*/) const { return static_cast(divisor); } virtual UBool isModulusSubstitution() const { return TRUE; } diff --git a/deps/icu-small/source/i18n/nounit.cpp b/deps/icu-small/source/i18n/nounit.cpp new file mode 100644 index 00000000000000..db07387c590af8 --- /dev/null +++ b/deps/icu-small/source/i18n/nounit.cpp @@ -0,0 +1,42 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/nounit.h" +#include "uassert.h" + +#if !UCONFIG_NO_FORMATTING + +U_NAMESPACE_BEGIN + +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(NoUnit) + +NoUnit U_EXPORT2 NoUnit::base() { + return NoUnit("base"); +} + +NoUnit U_EXPORT2 NoUnit::percent() { + return NoUnit("percent"); +} + +NoUnit U_EXPORT2 NoUnit::permille() { + return NoUnit("permille"); +} + +NoUnit::NoUnit(const char* subtype) { + initNoUnit(subtype); +} + +NoUnit::NoUnit(const NoUnit& other) : MeasureUnit(other) { +} + +UObject* NoUnit::clone() const { + return new NoUnit(*this); +} + +NoUnit::~NoUnit() { +} + + +U_NAMESPACE_END + +#endif diff --git a/deps/icu-small/source/i18n/number_affixutils.cpp b/deps/icu-small/source/i18n/number_affixutils.cpp new file mode 100644 index 00000000000000..4dfdbc7ab708fc --- /dev/null +++ b/deps/icu-small/source/i18n/number_affixutils.cpp @@ -0,0 +1,403 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "number_affixutils.h" +#include "unicode/utf16.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +int32_t AffixUtils::estimateLength(const CharSequence &patternString, UErrorCode &status) { + AffixPatternState state = STATE_BASE; + int32_t offset = 0; + int32_t length = 0; + for (; offset < patternString.length();) { + UChar32 cp = patternString.codePointAt(offset); + + switch (state) { + case STATE_BASE: + if (cp == u'\'') { + // First quote + state = STATE_FIRST_QUOTE; + } else { + // Unquoted symbol + length++; + } + break; + case STATE_FIRST_QUOTE: + if (cp == u'\'') { + // Repeated quote + length++; + state = STATE_BASE; + } else { + // Quoted code point + length++; + state = STATE_INSIDE_QUOTE; + } + break; + case STATE_INSIDE_QUOTE: + if (cp == u'\'') { + // End of quoted sequence + state = STATE_AFTER_QUOTE; + } else { + // Quoted code point + length++; + } + break; + case STATE_AFTER_QUOTE: + if (cp == u'\'') { + // Double quote inside of quoted sequence + length++; + state = STATE_INSIDE_QUOTE; + } else { + // Unquoted symbol + length++; + } + break; + default: + U_ASSERT(false); + } + + offset += U16_LENGTH(cp); + } + + switch (state) { + case STATE_FIRST_QUOTE: + case STATE_INSIDE_QUOTE: + status = U_ILLEGAL_ARGUMENT_ERROR; + default: + break; + } + + return length; +} + +UnicodeString AffixUtils::escape(const CharSequence &input) { + AffixPatternState state = STATE_BASE; + int32_t offset = 0; + UnicodeString output; + for (; offset < input.length();) { + UChar32 cp = input.codePointAt(offset); + + switch (cp) { + case u'\'': + output.append(u"''", -1); + break; + + case u'-': + case u'+': + case u'%': + case u'‰': + case u'¤': + if (state == STATE_BASE) { + output.append(u'\''); + output.append(cp); + state = STATE_INSIDE_QUOTE; + } else { + output.append(cp); + } + break; + + default: + if (state == STATE_INSIDE_QUOTE) { + output.append(u'\''); + output.append(cp); + state = STATE_BASE; + } else { + output.append(cp); + } + break; + } + offset += U16_LENGTH(cp); + } + + if (state == STATE_INSIDE_QUOTE) { + output.append(u'\''); + } + + return output; +} + +Field AffixUtils::getFieldForType(AffixPatternType type) { + switch (type) { + case TYPE_MINUS_SIGN: + return Field::UNUM_SIGN_FIELD; + case TYPE_PLUS_SIGN: + return Field::UNUM_SIGN_FIELD; + case TYPE_PERCENT: + return Field::UNUM_PERCENT_FIELD; + case TYPE_PERMILLE: + return Field::UNUM_PERMILL_FIELD; + case TYPE_CURRENCY_SINGLE: + return Field::UNUM_CURRENCY_FIELD; + case TYPE_CURRENCY_DOUBLE: + return Field::UNUM_CURRENCY_FIELD; + case TYPE_CURRENCY_TRIPLE: + return Field::UNUM_CURRENCY_FIELD; + case TYPE_CURRENCY_QUAD: + return Field::UNUM_CURRENCY_FIELD; + case TYPE_CURRENCY_QUINT: + return Field::UNUM_CURRENCY_FIELD; + case TYPE_CURRENCY_OVERFLOW: + return Field::UNUM_CURRENCY_FIELD; + default: + U_ASSERT(false); + return Field::UNUM_FIELD_COUNT; // suppress "control reaches end of non-void function" + } +} + +int32_t +AffixUtils::unescape(const CharSequence &affixPattern, NumberStringBuilder &output, int32_t position, + const SymbolProvider &provider, UErrorCode &status) { + int32_t length = 0; + AffixTag tag; + while (hasNext(tag, affixPattern)) { + tag = nextToken(tag, affixPattern, status); + if (U_FAILURE(status)) { return length; } + if (tag.type == TYPE_CURRENCY_OVERFLOW) { + // Don't go to the provider for this special case + length += output.insertCodePoint(position + length, 0xFFFD, UNUM_CURRENCY_FIELD, status); + } else if (tag.type < 0) { + length += output.insert( + position + length, provider.getSymbol(tag.type), getFieldForType(tag.type), status); + } else { + length += output.insertCodePoint(position + length, tag.codePoint, UNUM_FIELD_COUNT, status); + } + } + return length; +} + +int32_t AffixUtils::unescapedCodePointCount(const CharSequence &affixPattern, + const SymbolProvider &provider, UErrorCode &status) { + int32_t length = 0; + AffixTag tag; + while (hasNext(tag, affixPattern)) { + tag = nextToken(tag, affixPattern, status); + if (U_FAILURE(status)) { return length; } + if (tag.type == TYPE_CURRENCY_OVERFLOW) { + length += 1; + } else if (tag.type < 0) { + length += provider.getSymbol(tag.type).length(); + } else { + length += U16_LENGTH(tag.codePoint); + } + } + return length; +} + +bool +AffixUtils::containsType(const CharSequence &affixPattern, AffixPatternType type, UErrorCode &status) { + if (affixPattern.length() == 0) { + return false; + } + AffixTag tag; + while (hasNext(tag, affixPattern)) { + tag = nextToken(tag, affixPattern, status); + if (U_FAILURE(status)) { return false; } + if (tag.type == type) { + return true; + } + } + return false; +} + +bool AffixUtils::hasCurrencySymbols(const CharSequence &affixPattern, UErrorCode &status) { + if (affixPattern.length() == 0) { + return false; + } + AffixTag tag; + while (hasNext(tag, affixPattern)) { + tag = nextToken(tag, affixPattern, status); + if (U_FAILURE(status)) { return false; } + if (tag.type < 0 && getFieldForType(tag.type) == UNUM_CURRENCY_FIELD) { + return true; + } + } + return false; +} + +UnicodeString AffixUtils::replaceType(const CharSequence &affixPattern, AffixPatternType type, + char16_t replacementChar, UErrorCode &status) { + UnicodeString output = affixPattern.toUnicodeString(); + if (affixPattern.length() == 0) { + return output; + }; + AffixTag tag; + while (hasNext(tag, affixPattern)) { + tag = nextToken(tag, affixPattern, status); + if (U_FAILURE(status)) { return output; } + if (tag.type == type) { + output.replace(tag.offset - 1, 1, replacementChar); + } + } + return output; +} + +AffixTag AffixUtils::nextToken(AffixTag tag, const CharSequence &patternString, UErrorCode &status) { + int32_t offset = tag.offset; + int32_t state = tag.state; + for (; offset < patternString.length();) { + UChar32 cp = patternString.codePointAt(offset); + int32_t count = U16_LENGTH(cp); + + switch (state) { + case STATE_BASE: + switch (cp) { + case u'\'': + state = STATE_FIRST_QUOTE; + offset += count; + // continue to the next code point + break; + case u'-': + return makeTag(offset + count, TYPE_MINUS_SIGN, STATE_BASE, 0); + case u'+': + return makeTag(offset + count, TYPE_PLUS_SIGN, STATE_BASE, 0); + case u'%': + return makeTag(offset + count, TYPE_PERCENT, STATE_BASE, 0); + case u'‰': + return makeTag(offset + count, TYPE_PERMILLE, STATE_BASE, 0); + case u'¤': + state = STATE_FIRST_CURR; + offset += count; + // continue to the next code point + break; + default: + return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp); + } + break; + case STATE_FIRST_QUOTE: + if (cp == u'\'') { + return makeTag(offset + count, TYPE_CODEPOINT, STATE_BASE, cp); + } else { + return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp); + } + case STATE_INSIDE_QUOTE: + if (cp == u'\'') { + state = STATE_AFTER_QUOTE; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp); + } + case STATE_AFTER_QUOTE: + if (cp == u'\'') { + return makeTag(offset + count, TYPE_CODEPOINT, STATE_INSIDE_QUOTE, cp); + } else { + state = STATE_BASE; + // re-evaluate this code point + break; + } + case STATE_FIRST_CURR: + if (cp == u'¤') { + state = STATE_SECOND_CURR; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0); + } + case STATE_SECOND_CURR: + if (cp == u'¤') { + state = STATE_THIRD_CURR; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0); + } + case STATE_THIRD_CURR: + if (cp == u'¤') { + state = STATE_FOURTH_CURR; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0); + } + case STATE_FOURTH_CURR: + if (cp == u'¤') { + state = STATE_FIFTH_CURR; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0); + } + case STATE_FIFTH_CURR: + if (cp == u'¤') { + state = STATE_OVERFLOW_CURR; + offset += count; + // continue to the next code point + break; + } else { + return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0); + } + case STATE_OVERFLOW_CURR: + if (cp == u'¤') { + offset += count; + // continue to the next code point and loop back to this state + break; + } else { + return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0); + } + default: + U_ASSERT(false); + } + } + // End of string + switch (state) { + case STATE_BASE: + // No more tokens in string. + return {-1}; + case STATE_FIRST_QUOTE: + case STATE_INSIDE_QUOTE: + // For consistent behavior with the JDK and ICU 58, set an error here. + status = U_ILLEGAL_ARGUMENT_ERROR; + return {-1}; + case STATE_AFTER_QUOTE: + // No more tokens in string. + return {-1}; + case STATE_FIRST_CURR: + return makeTag(offset, TYPE_CURRENCY_SINGLE, STATE_BASE, 0); + case STATE_SECOND_CURR: + return makeTag(offset, TYPE_CURRENCY_DOUBLE, STATE_BASE, 0); + case STATE_THIRD_CURR: + return makeTag(offset, TYPE_CURRENCY_TRIPLE, STATE_BASE, 0); + case STATE_FOURTH_CURR: + return makeTag(offset, TYPE_CURRENCY_QUAD, STATE_BASE, 0); + case STATE_FIFTH_CURR: + return makeTag(offset, TYPE_CURRENCY_QUINT, STATE_BASE, 0); + case STATE_OVERFLOW_CURR: + return makeTag(offset, TYPE_CURRENCY_OVERFLOW, STATE_BASE, 0); + default: + U_ASSERT(false); + return {-1}; // suppress "control reaches end of non-void function" + } +} + +bool AffixUtils::hasNext(const AffixTag &tag, const CharSequence &string) { + // First check for the {-1} and default initializer syntax. + if (tag.offset < 0) { + return false; + } else if (tag.offset == 0) { + return string.length() > 0; + } + // The rest of the fields are safe to use now. + // Special case: the last character in string is an end quote. + if (tag.state == STATE_INSIDE_QUOTE && tag.offset == string.length() - 1 && + string.charAt(tag.offset) == u'\'') { + return false; + } else if (tag.state != STATE_BASE) { + return true; + } else { + return tag.offset < string.length(); + } +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_affixutils.h b/deps/icu-small/source/i18n/number_affixutils.h new file mode 100644 index 00000000000000..fd76c99b975566 --- /dev/null +++ b/deps/icu-small/source/i18n/number_affixutils.h @@ -0,0 +1,224 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_AFFIXUTILS_H__ +#define __NUMBER_AFFIXUTILS_H__ + +#include +#include "number_types.h" +#include "unicode/stringpiece.h" +#include "unicode/unistr.h" +#include "number_stringbuilder.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +enum AffixPatternState { + STATE_BASE = 0, + STATE_FIRST_QUOTE = 1, + STATE_INSIDE_QUOTE = 2, + STATE_AFTER_QUOTE = 3, + STATE_FIRST_CURR = 4, + STATE_SECOND_CURR = 5, + STATE_THIRD_CURR = 6, + STATE_FOURTH_CURR = 7, + STATE_FIFTH_CURR = 8, + STATE_OVERFLOW_CURR = 9 +}; + +// enum AffixPatternType defined in internals.h + +struct AffixTag { + int32_t offset; + UChar32 codePoint; + AffixPatternState state; + AffixPatternType type; + + AffixTag() : offset(0), state(STATE_BASE) {} + + AffixTag(int32_t offset) : offset(offset) {} + + AffixTag(int32_t offset, UChar32 codePoint, AffixPatternState state, AffixPatternType type) + : offset(offset), codePoint(codePoint), state(state), type(type) + {} +}; + +// Exported as U_I18N_API because it is a base class for other exported types +class U_I18N_API SymbolProvider { + public: + virtual ~SymbolProvider() = default; + + // TODO: Could this be more efficient if it returned by reference? + virtual UnicodeString getSymbol(AffixPatternType type) const = 0; +}; + +/** + * Performs manipulations on affix patterns: the prefix and suffix strings associated with a decimal + * format pattern. For example: + * + * + * + * + * + * + * + *
    Affix PatternExample Unescaped (Formatted) String
    abcabc
    ab-ab−
    ab'-'ab-
    ab''ab'
    + * + * To manually iterate over tokens in a literal string, use the following pattern, which is designed + * to be efficient. + * + *

    + * long tag = 0L;
    + * while (AffixPatternUtils.hasNext(tag, patternString)) {
    + *   tag = AffixPatternUtils.nextToken(tag, patternString);
    + *   int typeOrCp = AffixPatternUtils.getTypeOrCp(tag);
    + *   switch (typeOrCp) {
    + *     case AffixPatternUtils.TYPE_MINUS_SIGN:
    + *       // Current token is a minus sign.
    + *       break;
    + *     case AffixPatternUtils.TYPE_PLUS_SIGN:
    + *       // Current token is a plus sign.
    + *       break;
    + *     case AffixPatternUtils.TYPE_PERCENT:
    + *       // Current token is a percent sign.
    + *       break;
    + *     // ... other types ...
    + *     default:
    + *       // Current token is an arbitrary code point.
    + *       // The variable typeOrCp is the code point.
    + *       break;
    + *   }
    + * }
    + * 
    + */ +class U_I18N_API AffixUtils { + + public: + + /** + * Estimates the number of code points present in an unescaped version of the affix pattern string + * (one that would be returned by {@link #unescape}), assuming that all interpolated symbols + * consume one code point and that currencies consume as many code points as their symbol width. + * Used for computing padding width. + * + * @param patternString The original string whose width will be estimated. + * @return The length of the unescaped string. + */ + static int32_t estimateLength(const CharSequence &patternString, UErrorCode &status); + + /** + * Takes a string and escapes (quotes) characters that have special meaning in the affix pattern + * syntax. This function does not reverse-lookup symbols. + * + *

    Example input: "-$x"; example output: "'-'$x" + * + * @param input The string to be escaped. + * @return The resulting UnicodeString. + */ + static UnicodeString escape(const CharSequence &input); + + static Field getFieldForType(AffixPatternType type); + + /** + * Executes the unescape state machine. Replaces the unquoted characters "-", "+", "%", "‰", and + * "¤" with the corresponding symbols provided by the {@link SymbolProvider}, and inserts the + * result into the NumberStringBuilder at the requested location. + * + *

    Example input: "'-'¤x"; example output: "-$x" + * + * @param affixPattern The original string to be unescaped. + * @param output The NumberStringBuilder to mutate with the result. + * @param position The index into the NumberStringBuilder to insert the string. + * @param provider An object to generate locale symbols. + */ + static int32_t + unescape(const CharSequence &affixPattern, NumberStringBuilder &output, int32_t position, + const SymbolProvider &provider, UErrorCode &status); + + /** + * Sames as {@link #unescape}, but only calculates the code point count. More efficient than {@link #unescape} + * if you only need the length but not the string itself. + * + * @param affixPattern The original string to be unescaped. + * @param provider An object to generate locale symbols. + * @return The same return value as if you called {@link #unescape}. + */ + static int32_t unescapedCodePointCount(const CharSequence &affixPattern, + const SymbolProvider &provider, UErrorCode &status); + + /** + * Checks whether the given affix pattern contains at least one token of the given type, which is + * one of the constants "TYPE_" in {@link AffixPatternUtils}. + * + * @param affixPattern The affix pattern to check. + * @param type The token type. + * @return true if the affix pattern contains the given token type; false otherwise. + */ + static bool + containsType(const CharSequence &affixPattern, AffixPatternType type, UErrorCode &status); + + /** + * Checks whether the specified affix pattern has any unquoted currency symbols ("¤"). + * + * @param affixPattern The string to check for currency symbols. + * @return true if the literal has at least one unquoted currency symbol; false otherwise. + */ + static bool hasCurrencySymbols(const CharSequence &affixPattern, UErrorCode &status); + + /** + * Replaces all occurrences of tokens with the given type with the given replacement char. + * + * @param affixPattern The source affix pattern (does not get modified). + * @param type The token type. + * @param replacementChar The char to substitute in place of chars of the given token type. + * @return A string containing the new affix pattern. + */ + static UnicodeString + replaceType(const CharSequence &affixPattern, AffixPatternType type, char16_t replacementChar, + UErrorCode &status); + + /** + * Returns the next token from the affix pattern. + * + * @param tag A bitmask used for keeping track of state from token to token. The initial value + * should be 0L. + * @param patternString The affix pattern. + * @return The bitmask tag to pass to the next call of this method to retrieve the following token + * (never negative), or -1 if there were no more tokens in the affix pattern. + * @see #hasNext + */ + static AffixTag nextToken(AffixTag tag, const CharSequence &patternString, UErrorCode &status); + + /** + * Returns whether the affix pattern string has any more tokens to be retrieved from a call to + * {@link #nextToken}. + * + * @param tag The bitmask tag of the previous token, as returned by {@link #nextToken}. + * @param string The affix pattern. + * @return true if there are more tokens to consume; false otherwise. + */ + static bool hasNext(const AffixTag &tag, const CharSequence &string); + + private: + /** + * Encodes the given values into a tag struct. + * The order of the arguments is consistent with Java, but the order of the stored + * fields is not necessarily the same. + */ + static inline AffixTag + makeTag(int32_t offset, AffixPatternType type, AffixPatternState state, UChar32 cp) { + return {offset, cp, state, type}; + } +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_AFFIXUTILS_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_compact.cpp b/deps/icu-small/source/i18n/number_compact.cpp new file mode 100644 index 00000000000000..8ceee1378b24cb --- /dev/null +++ b/deps/icu-small/source/i18n/number_compact.cpp @@ -0,0 +1,326 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "resource.h" +#include "number_compact.h" +#include "unicode/ustring.h" +#include "unicode/ures.h" +#include "cstring.h" +#include "charstr.h" +#include "uresimp.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +// A dummy object used when a "0" compact decimal entry is encountered. This is necessary +// in order to prevent falling back to root. Object equality ("==") is intended. +const UChar *USE_FALLBACK = u""; + +/** Produces a string like "NumberElements/latn/patternsShort/decimalFormat". */ +void getResourceBundleKey(const char *nsName, CompactStyle compactStyle, CompactType compactType, + CharString &sb, UErrorCode &status) { + sb.clear(); + sb.append("NumberElements/", status); + sb.append(nsName, status); + sb.append(compactStyle == CompactStyle::UNUM_SHORT ? "/patternsShort" : "/patternsLong", status); + sb.append(compactType == CompactType::TYPE_DECIMAL ? "/decimalFormat" : "/currencyFormat", status); +} + +int32_t getIndex(int32_t magnitude, StandardPlural::Form plural) { + return magnitude * StandardPlural::COUNT + plural; +} + +int32_t countZeros(const UChar *patternString, int32_t patternLength) { + // NOTE: This strategy for computing the number of zeros is a hack for efficiency. + // It could break if there are any 0s that aren't part of the main pattern. + int32_t numZeros = 0; + for (int32_t i = 0; i < patternLength; i++) { + if (patternString[i] == u'0') { + numZeros++; + } else if (numZeros > 0) { + break; // zeros should always be contiguous + } + } + return numZeros; +} + +} // namespace + +// NOTE: patterns and multipliers both get zero-initialized. +CompactData::CompactData() : patterns(), multipliers(), largestMagnitude(0), isEmpty(TRUE) { +} + +void CompactData::populate(const Locale &locale, const char *nsName, CompactStyle compactStyle, + CompactType compactType, UErrorCode &status) { + CompactDataSink sink(*this); + LocalUResourceBundlePointer rb(ures_open(nullptr, locale.getName(), &status)); + if (U_FAILURE(status)) { return; } + + bool nsIsLatn = strcmp(nsName, "latn") == 0; + bool compactIsShort = compactStyle == CompactStyle::UNUM_SHORT; + + // Fall back to latn numbering system and/or short compact style. + CharString resourceKey; + getResourceBundleKey(nsName, compactStyle, compactType, resourceKey, status); + UErrorCode localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus); + if (isEmpty && !nsIsLatn) { + getResourceBundleKey("latn", compactStyle, compactType, resourceKey, status); + localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus); + } + if (isEmpty && !compactIsShort) { + getResourceBundleKey(nsName, CompactStyle::UNUM_SHORT, compactType, resourceKey, status); + localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus); + } + if (isEmpty && !nsIsLatn && !compactIsShort) { + getResourceBundleKey("latn", CompactStyle::UNUM_SHORT, compactType, resourceKey, status); + localStatus = U_ZERO_ERROR; + ures_getAllItemsWithFallback(rb.getAlias(), resourceKey.data(), sink, localStatus); + } + + // The last fallback should be guaranteed to return data. + if (isEmpty) { + status = U_INTERNAL_PROGRAM_ERROR; + } +} + +int32_t CompactData::getMultiplier(int32_t magnitude) const { + if (magnitude < 0) { + return 0; + } + if (magnitude > largestMagnitude) { + magnitude = largestMagnitude; + } + return multipliers[magnitude]; +} + +const UChar *CompactData::getPattern(int32_t magnitude, StandardPlural::Form plural) const { + if (magnitude < 0) { + return nullptr; + } + if (magnitude > largestMagnitude) { + magnitude = largestMagnitude; + } + const UChar *patternString = patterns[getIndex(magnitude, plural)]; + if (patternString == nullptr && plural != StandardPlural::OTHER) { + // Fall back to "other" plural variant + patternString = patterns[getIndex(magnitude, StandardPlural::OTHER)]; + } + if (patternString == USE_FALLBACK) { // == is intended + // Return null if USE_FALLBACK is present + patternString = nullptr; + } + return patternString; +} + +void CompactData::getUniquePatterns(UVector &output, UErrorCode &status) const { + U_ASSERT(output.isEmpty()); + // NOTE: In C++, this is done more manually with a UVector. + // In Java, we can take advantage of JDK HashSet. + for (auto pattern : patterns) { + if (pattern == nullptr || pattern == USE_FALLBACK) { + continue; + } + + // Insert pattern into the UVector if the UVector does not already contain the pattern. + // Search the UVector from the end since identical patterns are likely to be adjacent. + for (int32_t i = output.size() - 1; i >= 0; i--) { + if (u_strcmp(pattern, static_cast(output[i])) == 0) { + goto continue_outer; + } + } + + // The string was not found; add it to the UVector. + // ANDY: This requires a const_cast. Why? + output.addElement(const_cast(pattern), status); + + continue_outer: + continue; + } +} + +void CompactData::CompactDataSink::put(const char *key, ResourceValue &value, UBool /*noFallback*/, + UErrorCode &status) { + // traverse into the table of powers of ten + ResourceTable powersOfTenTable = value.getTable(status); + if (U_FAILURE(status)) { return; } + for (int i3 = 0; powersOfTenTable.getKeyAndValue(i3, key, value); ++i3) { + + // Assumes that the keys are always of the form "10000" where the magnitude is the + // length of the key minus one. We expect magnitudes to be less than MAX_DIGITS. + auto magnitude = static_cast (strlen(key) - 1); + int8_t multiplier = data.multipliers[magnitude]; + U_ASSERT(magnitude < COMPACT_MAX_DIGITS); + + // Iterate over the plural variants ("one", "other", etc) + ResourceTable pluralVariantsTable = value.getTable(status); + if (U_FAILURE(status)) { return; } + for (int i4 = 0; pluralVariantsTable.getKeyAndValue(i4, key, value); ++i4) { + + // Skip this magnitude/plural if we already have it from a child locale. + // Note: This also skips USE_FALLBACK entries. + StandardPlural::Form plural = StandardPlural::fromString(key, status); + if (U_FAILURE(status)) { return; } + if (data.patterns[getIndex(magnitude, plural)] != nullptr) { + continue; + } + + // The value "0" means that we need to use the default pattern and not fall back + // to parent locales. Example locale where this is relevant: 'it'. + int32_t patternLength; + const UChar *patternString = value.getString(patternLength, status); + if (U_FAILURE(status)) { return; } + if (u_strcmp(patternString, u"0") == 0) { + patternString = USE_FALLBACK; + patternLength = 0; + } + + // Save the pattern string. We will parse it lazily. + data.patterns[getIndex(magnitude, plural)] = patternString; + + // If necessary, compute the multiplier: the difference between the magnitude + // and the number of zeros in the pattern. + if (multiplier == 0) { + int32_t numZeros = countZeros(patternString, patternLength); + if (numZeros > 0) { // numZeros==0 in certain cases, like Somali "Kun" + multiplier = static_cast (numZeros - magnitude - 1); + } + } + } + + // Save the multiplier. + if (data.multipliers[magnitude] == 0) { + data.multipliers[magnitude] = multiplier; + if (magnitude > data.largestMagnitude) { + data.largestMagnitude = magnitude; + } + data.isEmpty = false; + } else { + U_ASSERT(data.multipliers[magnitude] == multiplier); + } + } +} + +/////////////////////////////////////////////////////////// +/// END OF CompactData.java; BEGIN CompactNotation.java /// +/////////////////////////////////////////////////////////// + +CompactHandler::CompactHandler(CompactStyle compactStyle, const Locale &locale, const char *nsName, + CompactType compactType, const PluralRules *rules, + MutablePatternModifier *buildReference, const MicroPropsGenerator *parent, + UErrorCode &status) + : rules(rules), parent(parent) { + data.populate(locale, nsName, compactStyle, compactType, status); + if (buildReference != nullptr) { + // Safe code path + precomputeAllModifiers(*buildReference, status); + safe = TRUE; + } else { + // Unsafe code path + safe = FALSE; + } +} + +CompactHandler::~CompactHandler() { + for (int32_t i = 0; i < precomputedModsLength; i++) { + delete precomputedMods[i].mod; + } +} + +void CompactHandler::precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + + // Initial capacity of 12 for 0K, 00K, 000K, ...M, ...B, and ...T + UVector allPatterns(12, status); + if (U_FAILURE(status)) { return; } + data.getUniquePatterns(allPatterns, status); + if (U_FAILURE(status)) { return; } + + // C++ only: ensure that precomputedMods has room. + precomputedModsLength = allPatterns.size(); + if (precomputedMods.getCapacity() < precomputedModsLength) { + precomputedMods.resize(allPatterns.size(), status); + if (U_FAILURE(status)) { return; } + } + + for (int32_t i = 0; i < precomputedModsLength; i++) { + auto patternString = static_cast(allPatterns[i]); + UnicodeString hello(patternString); + CompactModInfo &info = precomputedMods[i]; + ParsedPatternInfo patternInfo; + PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status); + if (U_FAILURE(status)) { return; } + buildReference.setPatternInfo(&patternInfo); + info.mod = buildReference.createImmutable(status); + if (U_FAILURE(status)) { return; } + info.numDigits = patternInfo.positive.integerTotal; + info.patternString = patternString; + } +} + +void CompactHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs, + UErrorCode &status) const { + parent->processQuantity(quantity, micros, status); + if (U_FAILURE(status)) { return; } + + // Treat zero as if it had magnitude 0 + int magnitude; + if (quantity.isZero()) { + magnitude = 0; + micros.rounding.apply(quantity, status); + } else { + // TODO: Revisit chooseMultiplierAndApply + int multiplier = micros.rounding.chooseMultiplierAndApply(quantity, data, status); + magnitude = quantity.isZero() ? 0 : quantity.getMagnitude(); + magnitude -= multiplier; + } + + StandardPlural::Form plural = quantity.getStandardPlural(rules); + const UChar *patternString = data.getPattern(magnitude, plural); + int numDigits = -1; + if (patternString == nullptr) { + // Use the default (non-compact) modifier. + // No need to take any action. + } else if (safe) { + // Safe code path. + // Java uses a hash set here for O(1) lookup. C++ uses a linear search. + // TODO: Benchmark this and maybe change to a binary search or hash table. + int32_t i = 0; + for (; i < precomputedModsLength; i++) { + const CompactModInfo &info = precomputedMods[i]; + if (u_strcmp(patternString, info.patternString) == 0) { + info.mod->applyToMicros(micros, quantity); + numDigits = info.numDigits; + break; + } + } + // It should be guaranteed that we found the entry. + U_ASSERT(i < precomputedModsLength); + } else { + // Unsafe code path. + // Overwrite the PatternInfo in the existing modMiddle. + // C++ Note: Use unsafePatternInfo for proper lifecycle. + ParsedPatternInfo &patternInfo = const_cast(this)->unsafePatternInfo; + PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status); + static_cast(const_cast(micros.modMiddle)) + ->setPatternInfo(&patternInfo); + numDigits = patternInfo.positive.integerTotal; + } + + // FIXME: Deal with numDigits == 0 (Awaiting a test case) + (void)numDigits; + + // We already performed rounding. Do not perform it again. + micros.rounding = Rounder::constructPassThrough(); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_compact.h b/deps/icu-small/source/i18n/number_compact.h new file mode 100644 index 00000000000000..2344abf535a962 --- /dev/null +++ b/deps/icu-small/source/i18n/number_compact.h @@ -0,0 +1,91 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_COMPACT_H__ +#define __NUMBER_COMPACT_H__ + +#include "standardplural.h" +#include "number_types.h" +#include "unicode/unum.h" +#include "uvector.h" +#include "resource.h" +#include "number_patternmodifier.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +static const int32_t COMPACT_MAX_DIGITS = 15; + +class CompactData : public MultiplierProducer { + public: + CompactData(); + + void populate(const Locale &locale, const char *nsName, CompactStyle compactStyle, + CompactType compactType, UErrorCode &status); + + int32_t getMultiplier(int32_t magnitude) const U_OVERRIDE; + + const UChar *getPattern(int32_t magnitude, StandardPlural::Form plural) const; + + void getUniquePatterns(UVector &output, UErrorCode &status) const; + + private: + const UChar *patterns[(COMPACT_MAX_DIGITS + 1) * StandardPlural::COUNT]; + int8_t multipliers[COMPACT_MAX_DIGITS + 1]; + int8_t largestMagnitude; + UBool isEmpty; + + class CompactDataSink : public ResourceSink { + public: + explicit CompactDataSink(CompactData &data) : data(data) {} + + void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) U_OVERRIDE; + + private: + CompactData &data; + }; +}; + +struct CompactModInfo { + const ImmutablePatternModifier *mod; + const UChar* patternString; + int32_t numDigits; +}; + +class CompactHandler : public MicroPropsGenerator, public UMemory { + public: + CompactHandler(CompactStyle compactStyle, const Locale &locale, const char *nsName, + CompactType compactType, const PluralRules *rules, + MutablePatternModifier *buildReference, const MicroPropsGenerator *parent, + UErrorCode &status); + + ~CompactHandler() U_OVERRIDE; + + void + processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const U_OVERRIDE; + + private: + const PluralRules *rules; + const MicroPropsGenerator *parent; + // Initial capacity of 12 for 0K, 00K, 000K, ...M, ...B, and ...T + MaybeStackArray precomputedMods; + int32_t precomputedModsLength = 0; + CompactData data; + ParsedPatternInfo unsafePatternInfo; + UBool safe; + + /** Used by the safe code path */ + void precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status); +}; + + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_COMPACT_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_decimalquantity.cpp b/deps/icu-small/source/i18n/number_decimalquantity.cpp new file mode 100644 index 00000000000000..72463576666bb1 --- /dev/null +++ b/deps/icu-small/source/i18n/number_decimalquantity.cpp @@ -0,0 +1,1011 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "uassert.h" +#include +#include "cmemory.h" +#include "decNumber.h" +#include +#include "number_decimalquantity.h" +#include "decContext.h" +#include "decNumber.h" +#include "number_roundingutils.h" +#include "unicode/plurrule.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +int8_t NEGATIVE_FLAG = 1; +int8_t INFINITY_FLAG = 2; +int8_t NAN_FLAG = 4; + +static constexpr int32_t DEFAULT_DIGITS = 34; +typedef MaybeStackHeaderAndArray DecNumberWithStorage; + +/** Helper function to convert a decNumber-compatible string into a decNumber. */ +void stringToDecNumber(StringPiece n, DecNumberWithStorage &dn) { + decContext set; + uprv_decContextDefault(&set, DEC_INIT_BASE); + uprv_decContextSetRounding(&set, DEC_ROUND_HALF_EVEN); + set.traps = 0; // no traps, thank you + if (n.length() > DEFAULT_DIGITS) { + dn.resize(n.length(), 0); + set.digits = n.length(); + } else { + set.digits = DEFAULT_DIGITS; + } + uprv_decNumberFromString(dn.getAlias(), n.data(), &set); + U_ASSERT(DECDPUN == 1); +} + +/** Helper function for safe subtraction (no overflow). */ +inline int32_t safeSubtract(int32_t a, int32_t b) { + // Note: In C++, signed integer subtraction is undefined behavior. + int32_t diff = static_cast(static_cast(a) - static_cast(b)); + if (b < 0 && diff < a) { return INT32_MAX; } + if (b > 0 && diff > a) { return INT32_MIN; } + return diff; +} + +static double DOUBLE_MULTIPLIERS[] = { + 1e0, + 1e1, + 1e2, + 1e3, + 1e4, + 1e5, + 1e6, + 1e7, + 1e8, + 1e9, + 1e10, + 1e11, + 1e12, + 1e13, + 1e14, + 1e15, + 1e16, + 1e17, + 1e18, + 1e19, + 1e20, + 1e21}; + +} // namespace + + +DecimalQuantity::DecimalQuantity() { + setBcdToZero(); + flags = 0; +} + +DecimalQuantity::~DecimalQuantity() { + if (usingBytes) { + uprv_free(fBCD.bcdBytes.ptr); + fBCD.bcdBytes.ptr = nullptr; + usingBytes = false; + } +} + +DecimalQuantity::DecimalQuantity(const DecimalQuantity &other) { + *this = other; +} + +DecimalQuantity &DecimalQuantity::operator=(const DecimalQuantity &other) { + if (this == &other) { + return *this; + } + copyBcdFrom(other); + lOptPos = other.lOptPos; + lReqPos = other.lReqPos; + rReqPos = other.rReqPos; + rOptPos = other.rOptPos; + scale = other.scale; + precision = other.precision; + flags = other.flags; + origDouble = other.origDouble; + origDelta = other.origDelta; + isApproximate = other.isApproximate; + return *this; +} + +void DecimalQuantity::clear() { + lOptPos = INT32_MAX; + lReqPos = 0; + rReqPos = 0; + rOptPos = INT32_MIN; + flags = 0; + setBcdToZero(); // sets scale, precision, hasDouble, origDouble, origDelta, and BCD data +} + +void DecimalQuantity::setIntegerLength(int32_t minInt, int32_t maxInt) { + // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class. + U_ASSERT(minInt >= 0); + U_ASSERT(maxInt >= minInt); + + // Save values into internal state + // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE + lOptPos = maxInt; + lReqPos = minInt; +} + +void DecimalQuantity::setFractionLength(int32_t minFrac, int32_t maxFrac) { + // Validation should happen outside of DecimalQuantity, e.g., in the Rounder class. + U_ASSERT(minFrac >= 0); + U_ASSERT(maxFrac >= minFrac); + + // Save values into internal state + // Negation is safe for minFrac/maxFrac because -Integer.MAX_VALUE > Integer.MIN_VALUE + rReqPos = -minFrac; + rOptPos = -maxFrac; +} + +uint64_t DecimalQuantity::getPositionFingerprint() const { + uint64_t fingerprint = 0; + fingerprint ^= lOptPos; + fingerprint ^= (lReqPos << 16); + fingerprint ^= (static_cast(rReqPos) << 32); + fingerprint ^= (static_cast(rOptPos) << 48); + return fingerprint; +} + +void DecimalQuantity::roundToIncrement(double roundingIncrement, RoundingMode roundingMode, + int32_t minMaxFrac, UErrorCode& status) { + // TODO: This is innefficient. Improve? + // TODO: Should we convert to decNumber instead? + double temp = toDouble(); + temp /= roundingIncrement; + setToDouble(temp); + roundToMagnitude(0, roundingMode, status); + temp = toDouble(); + temp *= roundingIncrement; + setToDouble(temp); + // Since we reset the value to a double, we need to specify the rounding boundary + // in order to get the DecimalQuantity out of approximation mode. + roundToMagnitude(-minMaxFrac, roundingMode, status); +} + +void DecimalQuantity::multiplyBy(int32_t multiplicand) { + if (isInfinite() || isZero() || isNaN()) { + return; + } + // TODO: Should we convert to decNumber instead? + double temp = toDouble(); + temp *= multiplicand; + setToDouble(temp); +} + +int32_t DecimalQuantity::getMagnitude() const { + U_ASSERT(precision != 0); + return scale + precision - 1; +} + +void DecimalQuantity::adjustMagnitude(int32_t delta) { + if (precision != 0) { + scale += delta; + origDelta += delta; + } +} + +StandardPlural::Form DecimalQuantity::getStandardPlural(const PluralRules *rules) const { + if (rules == nullptr) { + // Fail gracefully if the user didn't provide a PluralRules + return StandardPlural::Form::OTHER; + } else { + UnicodeString ruleString = rules->select(*this); + return StandardPlural::orOtherFromString(ruleString); + } +} + +double DecimalQuantity::getPluralOperand(PluralOperand operand) const { + // If this assertion fails, you need to call roundToInfinity() or some other rounding method. + // See the comment at the top of this file explaining the "isApproximate" field. + U_ASSERT(!isApproximate); + + switch (operand) { + case PLURAL_OPERAND_I: + return static_cast(toLong()); + case PLURAL_OPERAND_F: + return static_cast(toFractionLong(true)); + case PLURAL_OPERAND_T: + return static_cast(toFractionLong(false)); + case PLURAL_OPERAND_V: + return fractionCount(); + case PLURAL_OPERAND_W: + return fractionCountWithoutTrailingZeros(); + default: + return std::abs(toDouble()); + } +} + +int32_t DecimalQuantity::getUpperDisplayMagnitude() const { + // If this assertion fails, you need to call roundToInfinity() or some other rounding method. + // See the comment in the header file explaining the "isApproximate" field. + U_ASSERT(!isApproximate); + + int32_t magnitude = scale + precision; + int32_t result = (lReqPos > magnitude) ? lReqPos : (lOptPos < magnitude) ? lOptPos : magnitude; + return result - 1; +} + +int32_t DecimalQuantity::getLowerDisplayMagnitude() const { + // If this assertion fails, you need to call roundToInfinity() or some other rounding method. + // See the comment in the header file explaining the "isApproximate" field. + U_ASSERT(!isApproximate); + + int32_t magnitude = scale; + int32_t result = (rReqPos < magnitude) ? rReqPos : (rOptPos > magnitude) ? rOptPos : magnitude; + return result; +} + +int8_t DecimalQuantity::getDigit(int32_t magnitude) const { + // If this assertion fails, you need to call roundToInfinity() or some other rounding method. + // See the comment at the top of this file explaining the "isApproximate" field. + U_ASSERT(!isApproximate); + + return getDigitPos(magnitude - scale); +} + +int32_t DecimalQuantity::fractionCount() const { + return -getLowerDisplayMagnitude(); +} + +int32_t DecimalQuantity::fractionCountWithoutTrailingZeros() const { + return -scale > 0 ? -scale : 0; // max(-scale, 0) +} + +bool DecimalQuantity::isNegative() const { + return (flags & NEGATIVE_FLAG) != 0; +} + +bool DecimalQuantity::isInfinite() const { + return (flags & INFINITY_FLAG) != 0; +} + +bool DecimalQuantity::isNaN() const { + return (flags & NAN_FLAG) != 0; +} + +bool DecimalQuantity::isZero() const { + return precision == 0; +} + +DecimalQuantity &DecimalQuantity::setToInt(int32_t n) { + setBcdToZero(); + flags = 0; + if (n < 0) { + flags |= NEGATIVE_FLAG; + n = -n; + } + if (n != 0) { + _setToInt(n); + compact(); + } + return *this; +} + +void DecimalQuantity::_setToInt(int32_t n) { + if (n == INT32_MIN) { + readLongToBcd(-static_cast(n)); + } else { + readIntToBcd(n); + } +} + +DecimalQuantity &DecimalQuantity::setToLong(int64_t n) { + setBcdToZero(); + flags = 0; + if (n < 0) { + flags |= NEGATIVE_FLAG; + n = -n; + } + if (n != 0) { + _setToLong(n); + compact(); + } + return *this; +} + +void DecimalQuantity::_setToLong(int64_t n) { + if (n == INT64_MIN) { + static const char *int64minStr = "9.223372036854775808E+18"; + DecNumberWithStorage dn; + stringToDecNumber(int64minStr, dn); + readDecNumberToBcd(dn.getAlias()); + } else if (n <= INT32_MAX) { + readIntToBcd(static_cast(n)); + } else { + readLongToBcd(n); + } +} + +DecimalQuantity &DecimalQuantity::setToDouble(double n) { + setBcdToZero(); + flags = 0; + // signbit() from handles +0.0 vs -0.0 + if (std::signbit(n) != 0) { + flags |= NEGATIVE_FLAG; + n = -n; + } + if (std::isnan(n) != 0) { + flags |= NAN_FLAG; + } else if (std::isfinite(n) == 0) { + flags |= INFINITY_FLAG; + } else if (n != 0) { + _setToDoubleFast(n); + compact(); + } + return *this; +} + +void DecimalQuantity::_setToDoubleFast(double n) { + isApproximate = true; + origDouble = n; + origDelta = 0; + + // Make sure the double is an IEEE 754 double. If not, fall back to the slow path right now. + // TODO: Make a fast path for other types of doubles. + if (!std::numeric_limits::is_iec559) { + convertToAccurateDouble(); + // Turn off the approximate double flag, since the value is now exact. + isApproximate = false; + origDouble = 0.0; + return; + } + + // To get the bits from the double, use memcpy, which takes care of endianness. + uint64_t ieeeBits; + uprv_memcpy(&ieeeBits, &n, sizeof(n)); + int32_t exponent = static_cast((ieeeBits & 0x7ff0000000000000L) >> 52) - 0x3ff; + + // Not all integers can be represented exactly for exponent > 52 + if (exponent <= 52 && static_cast(n) == n) { + _setToLong(static_cast(n)); + return; + } + + // 3.3219... is log2(10) + auto fracLength = static_cast ((52 - exponent) / 3.32192809489); + if (fracLength >= 0) { + int32_t i = fracLength; + // 1e22 is the largest exact double. + for (; i >= 22; i -= 22) n *= 1e22; + n *= DOUBLE_MULTIPLIERS[i]; + } else { + int32_t i = fracLength; + // 1e22 is the largest exact double. + for (; i <= -22; i += 22) n /= 1e22; + n /= DOUBLE_MULTIPLIERS[-i]; + } + auto result = static_cast(std::round(n)); + if (result != 0) { + _setToLong(result); + scale -= fracLength; + } +} + +void DecimalQuantity::convertToAccurateDouble() { + double n = origDouble; + U_ASSERT(n != 0); + int32_t delta = origDelta; + setBcdToZero(); + + // Call the slow oracle function (Double.toString in Java, sprintf in C++). + // The constant DBL_DIG defines a platform-specific number of digits in a double. + // However, this tends to be too low (see #11318). Instead, we always use 14 decimal places. + static constexpr size_t CAP = 1 + 14 + 8; // Extra space for '+', '.', e+NNN, and '\0' + char dstr[CAP]; + snprintf(dstr, CAP, "%+1.14e", n); + + // uprv_decNumberFromString() will parse the string expecting '.' as a + // decimal separator, however sprintf() can use ',' in certain locales. + // Overwrite a ',' with '.' here before proceeding. + char *decimalSeparator = strchr(dstr, ','); + if (decimalSeparator != nullptr) { + *decimalSeparator = '.'; + } + + StringPiece sp(dstr); + DecNumberWithStorage dn; + stringToDecNumber(dstr, dn); + _setToDecNumber(dn.getAlias()); + + scale += delta; + explicitExactDouble = true; +} + +DecimalQuantity &DecimalQuantity::setToDecNumber(StringPiece n) { + setBcdToZero(); + flags = 0; + + DecNumberWithStorage dn; + stringToDecNumber(n, dn); + + // The code path for decNumber is modeled after BigDecimal in Java. + if (decNumberIsNegative(dn.getAlias())) { + flags |= NEGATIVE_FLAG; + } + if (!decNumberIsZero(dn.getAlias())) { + _setToDecNumber(dn.getAlias()); + } + return *this; +} + +void DecimalQuantity::_setToDecNumber(decNumber *n) { + // Java fastpaths for ints here. In C++, just always read directly from the decNumber. + readDecNumberToBcd(n); + compact(); +} + +int64_t DecimalQuantity::toLong() const { + int64_t result = 0L; + for (int32_t magnitude = scale + precision - 1; magnitude >= 0; magnitude--) { + result = result * 10 + getDigitPos(magnitude - scale); + } + return result; +} + +int64_t DecimalQuantity::toFractionLong(bool includeTrailingZeros) const { + int64_t result = 0L; + int32_t magnitude = -1; + for (; (magnitude >= scale || (includeTrailingZeros && magnitude >= rReqPos)) && + magnitude >= rOptPos; magnitude--) { + result = result * 10 + getDigitPos(magnitude - scale); + } + return result; +} + +double DecimalQuantity::toDouble() const { + if (isApproximate) { + return toDoubleFromOriginal(); + } + + if (isNaN()) { + return NAN; + } else if (isInfinite()) { + return isNegative() ? -INFINITY : INFINITY; + } + + int64_t tempLong = 0L; + int32_t lostDigits = precision - (precision < 17 ? precision : 17); + for (int shift = precision - 1; shift >= lostDigits; shift--) { + tempLong = tempLong * 10 + getDigitPos(shift); + } + double result = static_cast(tempLong); + int32_t _scale = scale + lostDigits; + if (_scale >= 0) { + // 1e22 is the largest exact double. + int32_t i = _scale; + for (; i >= 22; i -= 22) result *= 1e22; + result *= DOUBLE_MULTIPLIERS[i]; + } else { + // 1e22 is the largest exact double. + int32_t i = _scale; + for (; i <= -22; i += 22) result /= 1e22; + result /= DOUBLE_MULTIPLIERS[-i]; + } + if (isNegative()) { result = -result; } + return result; +} + +double DecimalQuantity::toDoubleFromOriginal() const { + double result = origDouble; + int32_t delta = origDelta; + if (delta >= 0) { + // 1e22 is the largest exact double. + for (; delta >= 22; delta -= 22) result *= 1e22; + result *= DOUBLE_MULTIPLIERS[delta]; + } else { + // 1e22 is the largest exact double. + for (; delta <= -22; delta += 22) result /= 1e22; + result /= DOUBLE_MULTIPLIERS[-delta]; + } + if (isNegative()) { result *= -1; } + return result; +} + +void DecimalQuantity::roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status) { + // The position in the BCD at which rounding will be performed; digits to the right of position + // will be rounded away. + // TODO: Andy: There was a test failure because of integer overflow here. Should I do + // "safe subtraction" everywhere in the code? What's the nicest way to do it? + int position = safeSubtract(magnitude, scale); + + if (position <= 0 && !isApproximate) { + // All digits are to the left of the rounding magnitude. + } else if (precision == 0) { + // No rounding for zero. + } else { + // Perform rounding logic. + // "leading" = most significant digit to the right of rounding + // "trailing" = least significant digit to the left of rounding + int8_t leadingDigit = getDigitPos(safeSubtract(position, 1)); + int8_t trailingDigit = getDigitPos(position); + + // Compute which section of the number we are in. + // EDGE means we are at the bottom or top edge, like 1.000 or 1.999 (used by doubles) + // LOWER means we are between the bottom edge and the midpoint, like 1.391 + // MIDPOINT means we are exactly in the middle, like 1.500 + // UPPER means we are between the midpoint and the top edge, like 1.916 + roundingutils::Section section = roundingutils::SECTION_MIDPOINT; + if (!isApproximate) { + if (leadingDigit < 5) { + section = roundingutils::SECTION_LOWER; + } else if (leadingDigit > 5) { + section = roundingutils::SECTION_UPPER; + } else { + for (int p = safeSubtract(position, 2); p >= 0; p--) { + if (getDigitPos(p) != 0) { + section = roundingutils::SECTION_UPPER; + break; + } + } + } + } else { + int32_t p = safeSubtract(position, 2); + int32_t minP = uprv_max(0, precision - 14); + if (leadingDigit == 0) { + section = roundingutils::SECTION_LOWER_EDGE; + for (; p >= minP; p--) { + if (getDigitPos(p) != 0) { + section = roundingutils::SECTION_LOWER; + break; + } + } + } else if (leadingDigit == 4) { + for (; p >= minP; p--) { + if (getDigitPos(p) != 9) { + section = roundingutils::SECTION_LOWER; + break; + } + } + } else if (leadingDigit == 5) { + for (; p >= minP; p--) { + if (getDigitPos(p) != 0) { + section = roundingutils::SECTION_UPPER; + break; + } + } + } else if (leadingDigit == 9) { + section = roundingutils::SECTION_UPPER_EDGE; + for (; p >= minP; p--) { + if (getDigitPos(p) != 9) { + section = roundingutils::SECTION_UPPER; + break; + } + } + } else if (leadingDigit < 5) { + section = roundingutils::SECTION_LOWER; + } else { + section = roundingutils::SECTION_UPPER; + } + + bool roundsAtMidpoint = roundingutils::roundsAtMidpoint(roundingMode); + if (safeSubtract(position, 1) < precision - 14 || + (roundsAtMidpoint && section == roundingutils::SECTION_MIDPOINT) || + (!roundsAtMidpoint && section < 0 /* i.e. at upper or lower edge */)) { + // Oops! This means that we have to get the exact representation of the double, because + // the zone of uncertainty is along the rounding boundary. + convertToAccurateDouble(); + roundToMagnitude(magnitude, roundingMode, status); // start over + return; + } + + // Turn off the approximate double flag, since the value is now confirmed to be exact. + isApproximate = false; + origDouble = 0.0; + origDelta = 0; + + if (position <= 0) { + // All digits are to the left of the rounding magnitude. + return; + } + + // Good to continue rounding. + if (section == -1) { section = roundingutils::SECTION_LOWER; } + if (section == -2) { section = roundingutils::SECTION_UPPER; } + } + + bool roundDown = roundingutils::getRoundingDirection((trailingDigit % 2) == 0, + isNegative(), + section, + roundingMode, + status); + if (U_FAILURE(status)) { + return; + } + + // Perform truncation + if (position >= precision) { + setBcdToZero(); + scale = magnitude; + } else { + shiftRight(position); + } + + // Bubble the result to the higher digits + if (!roundDown) { + if (trailingDigit == 9) { + int bubblePos = 0; + // Note: in the long implementation, the most digits BCD can have at this point is 15, + // so bubblePos <= 15 and getDigitPos(bubblePos) is safe. + for (; getDigitPos(bubblePos) == 9; bubblePos++) {} + shiftRight(bubblePos); // shift off the trailing 9s + } + int8_t digit0 = getDigitPos(0); + U_ASSERT(digit0 != 9); + setDigitPos(0, static_cast(digit0 + 1)); + precision += 1; // in case an extra digit got added + } + + compact(); + } +} + +void DecimalQuantity::roundToInfinity() { + if (isApproximate) { + convertToAccurateDouble(); + } +} + +void DecimalQuantity::appendDigit(int8_t value, int32_t leadingZeros, bool appendAsInteger) { + U_ASSERT(leadingZeros >= 0); + + // Zero requires special handling to maintain the invariant that the least-significant digit + // in the BCD is nonzero. + if (value == 0) { + if (appendAsInteger && precision != 0) { + scale += leadingZeros + 1; + } + return; + } + + // Deal with trailing zeros + if (scale > 0) { + leadingZeros += scale; + if (appendAsInteger) { + scale = 0; + } + } + + // Append digit + shiftLeft(leadingZeros + 1); + setDigitPos(0, value); + + // Fix scale if in integer mode + if (appendAsInteger) { + scale += leadingZeros + 1; + } +} + +UnicodeString DecimalQuantity::toPlainString() const { + UnicodeString sb; + if (isNegative()) { + sb.append(u'-'); + } + for (int m = getUpperDisplayMagnitude(); m >= getLowerDisplayMagnitude(); m--) { + sb.append(getDigit(m) + u'0'); + if (m == 0) { sb.append(u'.'); } + } + return sb; +} + +//////////////////////////////////////////////////// +/// End of DecimalQuantity_AbstractBCD.java /// +/// Start of DecimalQuantity_DualStorageBCD.java /// +//////////////////////////////////////////////////// + +int8_t DecimalQuantity::getDigitPos(int32_t position) const { + if (usingBytes) { + if (position < 0 || position > precision) { return 0; } + return fBCD.bcdBytes.ptr[position]; + } else { + if (position < 0 || position >= 16) { return 0; } + return (int8_t) ((fBCD.bcdLong >> (position * 4)) & 0xf); + } +} + +void DecimalQuantity::setDigitPos(int32_t position, int8_t value) { + U_ASSERT(position >= 0); + if (usingBytes) { + ensureCapacity(position + 1); + fBCD.bcdBytes.ptr[position] = value; + } else if (position >= 16) { + switchStorage(); + ensureCapacity(position + 1); + fBCD.bcdBytes.ptr[position] = value; + } else { + int shift = position * 4; + fBCD.bcdLong = (fBCD.bcdLong & ~(0xfL << shift)) | ((long) value << shift); + } +} + +void DecimalQuantity::shiftLeft(int32_t numDigits) { + if (!usingBytes && precision + numDigits > 16) { + switchStorage(); + } + if (usingBytes) { + ensureCapacity(precision + numDigits); + int i = precision + numDigits - 1; + for (; i >= numDigits; i--) { + fBCD.bcdBytes.ptr[i] = fBCD.bcdBytes.ptr[i - numDigits]; + } + for (; i >= 0; i--) { + fBCD.bcdBytes.ptr[i] = 0; + } + } else { + fBCD.bcdLong <<= (numDigits * 4); + } + scale -= numDigits; + precision += numDigits; +} + +void DecimalQuantity::shiftRight(int32_t numDigits) { + if (usingBytes) { + int i = 0; + for (; i < precision - numDigits; i++) { + fBCD.bcdBytes.ptr[i] = fBCD.bcdBytes.ptr[i + numDigits]; + } + for (; i < precision; i++) { + fBCD.bcdBytes.ptr[i] = 0; + } + } else { + fBCD.bcdLong >>= (numDigits * 4); + } + scale += numDigits; + precision -= numDigits; +} + +void DecimalQuantity::setBcdToZero() { + if (usingBytes) { + uprv_free(fBCD.bcdBytes.ptr); + fBCD.bcdBytes.ptr = nullptr; + usingBytes = false; + } + fBCD.bcdLong = 0L; + scale = 0; + precision = 0; + isApproximate = false; + origDouble = 0; + origDelta = 0; +} + +void DecimalQuantity::readIntToBcd(int32_t n) { + U_ASSERT(n != 0); + // ints always fit inside the long implementation. + uint64_t result = 0L; + int i = 16; + for (; n != 0; n /= 10, i--) { + result = (result >> 4) + ((static_cast(n) % 10) << 60); + } + U_ASSERT(!usingBytes); + fBCD.bcdLong = result >> (i * 4); + scale = 0; + precision = 16 - i; +} + +void DecimalQuantity::readLongToBcd(int64_t n) { + U_ASSERT(n != 0); + if (n >= 10000000000000000L) { + ensureCapacity(); + int i = 0; + for (; n != 0L; n /= 10L, i++) { + fBCD.bcdBytes.ptr[i] = static_cast(n % 10); + } + U_ASSERT(usingBytes); + scale = 0; + precision = i; + } else { + uint64_t result = 0L; + int i = 16; + for (; n != 0L; n /= 10L, i--) { + result = (result >> 4) + ((n % 10) << 60); + } + U_ASSERT(i >= 0); + U_ASSERT(!usingBytes); + fBCD.bcdLong = result >> (i * 4); + scale = 0; + precision = 16 - i; + } +} + +void DecimalQuantity::readDecNumberToBcd(decNumber *dn) { + if (dn->digits > 16) { + ensureCapacity(dn->digits); + for (int32_t i = 0; i < dn->digits; i++) { + fBCD.bcdBytes.ptr[i] = dn->lsu[i]; + } + } else { + uint64_t result = 0L; + for (int32_t i = 0; i < dn->digits; i++) { + result |= static_cast(dn->lsu[i]) << (4 * i); + } + fBCD.bcdLong = result; + } + scale = dn->exponent; + precision = dn->digits; +} + +void DecimalQuantity::compact() { + if (usingBytes) { + int32_t delta = 0; + for (; delta < precision && fBCD.bcdBytes.ptr[delta] == 0; delta++); + if (delta == precision) { + // Number is zero + setBcdToZero(); + return; + } else { + // Remove trailing zeros + shiftRight(delta); + } + + // Compute precision + int32_t leading = precision - 1; + for (; leading >= 0 && fBCD.bcdBytes.ptr[leading] == 0; leading--); + precision = leading + 1; + + // Switch storage mechanism if possible + if (precision <= 16) { + switchStorage(); + } + + } else { + if (fBCD.bcdLong == 0L) { + // Number is zero + setBcdToZero(); + return; + } + + // Compact the number (remove trailing zeros) + // TODO: Use a more efficient algorithm here and below. There is a logarithmic one. + int32_t delta = 0; + for (; delta < precision && getDigitPos(delta) == 0; delta++); + fBCD.bcdLong >>= delta * 4; + scale += delta; + + // Compute precision + int32_t leading = precision - 1; + for (; leading >= 0 && getDigitPos(leading) == 0; leading--); + precision = leading + 1; + } +} + +void DecimalQuantity::ensureCapacity() { + ensureCapacity(40); +} + +void DecimalQuantity::ensureCapacity(int32_t capacity) { + if (capacity == 0) { return; } + int32_t oldCapacity = usingBytes ? fBCD.bcdBytes.len : 0; + if (!usingBytes) { + // TODO: There is nothing being done to check for memory allocation failures. + // TODO: Consider indexing by nybbles instead of bytes in C++, so that we can + // make these arrays half the size. + fBCD.bcdBytes.ptr = static_cast(uprv_malloc(capacity * sizeof(int8_t))); + fBCD.bcdBytes.len = capacity; + // Initialize the byte array to zeros (this is done automatically in Java) + uprv_memset(fBCD.bcdBytes.ptr, 0, capacity * sizeof(int8_t)); + } else if (oldCapacity < capacity) { + auto bcd1 = static_cast(uprv_malloc(capacity * 2 * sizeof(int8_t))); + uprv_memcpy(bcd1, fBCD.bcdBytes.ptr, oldCapacity * sizeof(int8_t)); + // Initialize the rest of the byte array to zeros (this is done automatically in Java) + uprv_memset(fBCD.bcdBytes.ptr + oldCapacity, 0, (capacity - oldCapacity) * sizeof(int8_t)); + uprv_free(fBCD.bcdBytes.ptr); + fBCD.bcdBytes.ptr = bcd1; + fBCD.bcdBytes.len = capacity * 2; + } + usingBytes = true; +} + +void DecimalQuantity::switchStorage() { + if (usingBytes) { + // Change from bytes to long + uint64_t bcdLong = 0L; + for (int i = precision - 1; i >= 0; i--) { + bcdLong <<= 4; + bcdLong |= fBCD.bcdBytes.ptr[i]; + } + uprv_free(fBCD.bcdBytes.ptr); + fBCD.bcdBytes.ptr = nullptr; + fBCD.bcdLong = bcdLong; + usingBytes = false; + } else { + // Change from long to bytes + // Copy the long into a local variable since it will get munged when we allocate the bytes + uint64_t bcdLong = fBCD.bcdLong; + ensureCapacity(); + for (int i = 0; i < precision; i++) { + fBCD.bcdBytes.ptr[i] = static_cast(bcdLong & 0xf); + bcdLong >>= 4; + } + U_ASSERT(usingBytes); + } +} + +void DecimalQuantity::copyBcdFrom(const DecimalQuantity &other) { + setBcdToZero(); + if (other.usingBytes) { + ensureCapacity(other.precision); + uprv_memcpy(fBCD.bcdBytes.ptr, other.fBCD.bcdBytes.ptr, other.precision * sizeof(int8_t)); + } else { + fBCD.bcdLong = other.fBCD.bcdLong; + } +} + +const char16_t* DecimalQuantity::checkHealth() const { + if (usingBytes) { + if (precision == 0) { return u"Zero precision but we are in byte mode"; } + int32_t capacity = fBCD.bcdBytes.len; + if (precision > capacity) { return u"Precision exceeds length of byte array"; } + if (getDigitPos(precision - 1) == 0) { return u"Most significant digit is zero in byte mode"; } + if (getDigitPos(0) == 0) { return u"Least significant digit is zero in long mode"; } + for (int i = 0; i < precision; i++) { + if (getDigitPos(i) >= 10) { return u"Digit exceeding 10 in byte array"; } + if (getDigitPos(i) < 0) { return u"Digit below 0 in byte array"; } + } + for (int i = precision; i < capacity; i++) { + if (getDigitPos(i) != 0) { return u"Nonzero digits outside of range in byte array"; } + } + } else { + if (precision == 0 && fBCD.bcdLong != 0) { + return u"Value in bcdLong even though precision is zero"; + } + if (precision > 16) { return u"Precision exceeds length of long"; } + if (precision != 0 && getDigitPos(precision - 1) == 0) { + return u"Most significant digit is zero in long mode"; + } + if (precision != 0 && getDigitPos(0) == 0) { + return u"Least significant digit is zero in long mode"; + } + for (int i = 0; i < precision; i++) { + if (getDigitPos(i) >= 10) { return u"Digit exceeding 10 in long"; } + if (getDigitPos(i) < 0) { return u"Digit below 0 in long (?!)"; } + } + for (int i = precision; i < 16; i++) { + if (getDigitPos(i) != 0) { return u"Nonzero digits outside of range in long"; } + } + } + + // No error + return nullptr; +} + +UnicodeString DecimalQuantity::toString() const { + MaybeStackArray digits(precision + 1); + for (int32_t i = 0; i < precision; i++) { + digits[i] = getDigitPos(precision - i - 1) + '0'; + } + digits[precision] = 0; // terminate buffer + char buffer8[100]; + snprintf( + buffer8, + sizeof(buffer8), + "", + (lOptPos > 999 ? 999 : lOptPos), + lReqPos, + rReqPos, + (rOptPos < -999 ? -999 : rOptPos), + (usingBytes ? "bytes" : "long"), + (precision == 0 ? "0" : digits.getAlias()), + "E", + scale); + return UnicodeString(buffer8, -1, US_INV); +} + +UnicodeString DecimalQuantity::toNumberString() const { + MaybeStackArray digits(precision + 11); + for (int32_t i = 0; i < precision; i++) { + digits[i] = getDigitPos(precision - i - 1) + '0'; + } + snprintf(digits.getAlias() + precision, 11, "E%d", scale); + return UnicodeString(digits.getAlias(), -1, US_INV); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_decimalquantity.h b/deps/icu-small/source/i18n/number_decimalquantity.h new file mode 100644 index 00000000000000..ccb832623cb7bb --- /dev/null +++ b/deps/icu-small/source/i18n/number_decimalquantity.h @@ -0,0 +1,438 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_DECIMALQUANTITY_H__ +#define __NUMBER_DECIMALQUANTITY_H__ + +#include +#include "unicode/umachine.h" +#include "decNumber.h" +#include "standardplural.h" +#include "plurrule_impl.h" +#include "number_types.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +/** + * An class for representing a number to be processed by the decimal formatting pipeline. Includes + * methods for rounding, plural rules, and decimal digit extraction. + * + *

    By design, this is NOT IMMUTABLE and NOT THREAD SAFE. It is intended to be an intermediate + * object holding state during a pass through the decimal formatting pipeline. + * + *

    Represents numbers and digit display properties using Binary Coded Decimal (BCD). + * + *

    Java has multiple implementations for testing, but C++ has only one implementation. + */ +class U_I18N_API DecimalQuantity : public IFixedDecimal, public UMemory { + public: + /** Copy constructor. */ + DecimalQuantity(const DecimalQuantity &other); + + DecimalQuantity(); + + ~DecimalQuantity(); + + /** + * Sets this instance to be equal to another instance. + * + * @param other The instance to copy from. + */ + DecimalQuantity &operator=(const DecimalQuantity &other); + + /** + * Sets the minimum and maximum integer digits that this {@link DecimalQuantity} should generate. + * This method does not perform rounding. + * + * @param minInt The minimum number of integer digits. + * @param maxInt The maximum number of integer digits. + */ + void setIntegerLength(int32_t minInt, int32_t maxInt); + + /** + * Sets the minimum and maximum fraction digits that this {@link DecimalQuantity} should generate. + * This method does not perform rounding. + * + * @param minFrac The minimum number of fraction digits. + * @param maxFrac The maximum number of fraction digits. + */ + void setFractionLength(int32_t minFrac, int32_t maxFrac); + + /** + * Rounds the number to a specified interval, such as 0.05. + * + *

    If rounding to a power of ten, use the more efficient {@link #roundToMagnitude} instead. + * + * @param roundingIncrement The increment to which to round. + * @param mathContext The {@link RoundingMode} to use if rounding is necessary. + */ + void roundToIncrement(double roundingIncrement, RoundingMode roundingMode, + int32_t minMaxFrac, UErrorCode& status); + + /** + * Rounds the number to a specified magnitude (power of ten). + * + * @param roundingMagnitude The power of ten to which to round. For example, a value of -2 will + * round to 2 decimal places. + * @param mathContext The {@link RoundingMode} to use if rounding is necessary. + */ + void roundToMagnitude(int32_t magnitude, RoundingMode roundingMode, UErrorCode& status); + + /** + * Rounds the number to an infinite number of decimal points. This has no effect except for + * forcing the double in {@link DecimalQuantity_AbstractBCD} to adopt its exact representation. + */ + void roundToInfinity(); + + /** + * Multiply the internal value. + * + * @param multiplicand The value by which to multiply. + */ + void multiplyBy(int32_t multiplicand); + + /** + * Scales the number by a power of ten. For example, if the value is currently "1234.56", calling + * this method with delta=-3 will change the value to "1.23456". + * + * @param delta The number of magnitudes of ten to change by. + */ + void adjustMagnitude(int32_t delta); + + /** + * @return The power of ten corresponding to the most significant nonzero digit. + * The number must not be zero. + */ + int32_t getMagnitude() const; + + /** @return Whether the value represented by this {@link DecimalQuantity} is zero. */ + bool isZero() const; + + /** @return Whether the value represented by this {@link DecimalQuantity} is less than zero. */ + bool isNegative() const; + + /** @return Whether the value represented by this {@link DecimalQuantity} is infinite. */ + bool isInfinite() const U_OVERRIDE; + + /** @return Whether the value represented by this {@link DecimalQuantity} is not a number. */ + bool isNaN() const U_OVERRIDE; + + int64_t toLong() const; + + int64_t toFractionLong(bool includeTrailingZeros) const; + + /** @return The value contained in this {@link DecimalQuantity} approximated as a double. */ + double toDouble() const; + + DecimalQuantity &setToInt(int32_t n); + + DecimalQuantity &setToLong(int64_t n); + + DecimalQuantity &setToDouble(double n); + + /** decNumber is similar to BigDecimal in Java. */ + + DecimalQuantity &setToDecNumber(StringPiece n); + + /** + * Appends a digit, optionally with one or more leading zeros, to the end of the value represented + * by this DecimalQuantity. + * + *

    The primary use of this method is to construct numbers during a parsing loop. It allows + * parsing to take advantage of the digit list infrastructure primarily designed for formatting. + * + * @param value The digit to append. + * @param leadingZeros The number of zeros to append before the digit. For example, if the value + * in this instance starts as 12.3, and you append a 4 with 1 leading zero, the value becomes + * 12.304. + * @param appendAsInteger If true, increase the magnitude of existing digits to make room for the + * new digit. If false, append to the end like a fraction digit. If true, there must not be + * any fraction digits already in the number. + * @internal + * @deprecated This API is ICU internal only. + */ + void appendDigit(int8_t value, int32_t leadingZeros, bool appendAsInteger); + + /** + * Computes the plural form for this number based on the specified set of rules. + * + * @param rules A {@link PluralRules} object representing the set of rules. + * @return The {@link StandardPlural} according to the PluralRules. If the plural form is not in + * the set of standard plurals, {@link StandardPlural#OTHER} is returned instead. + */ + StandardPlural::Form getStandardPlural(const PluralRules *rules) const; + + double getPluralOperand(PluralOperand operand) const U_OVERRIDE; + + /** + * Gets the digit at the specified magnitude. For example, if the represented number is 12.3, + * getDigit(-1) returns 3, since 3 is the digit corresponding to 10^-1. + * + * @param magnitude The magnitude of the digit. + * @return The digit at the specified magnitude. + */ + int8_t getDigit(int32_t magnitude) const; + + /** + * Gets the largest power of ten that needs to be displayed. The value returned by this function + * will be bounded between minInt and maxInt. + * + * @return The highest-magnitude digit to be displayed. + */ + int32_t getUpperDisplayMagnitude() const; + + /** + * Gets the smallest power of ten that needs to be displayed. The value returned by this function + * will be bounded between -minFrac and -maxFrac. + * + * @return The lowest-magnitude digit to be displayed. + */ + int32_t getLowerDisplayMagnitude() const; + + int32_t fractionCount() const; + + int32_t fractionCountWithoutTrailingZeros() const; + + void clear(); + + /** This method is for internal testing only. */ + uint64_t getPositionFingerprint() const; + +// /** +// * If the given {@link FieldPosition} is a {@link UFieldPosition}, populates it with the fraction +// * length and fraction long value. If the argument is not a {@link UFieldPosition}, nothing +// * happens. +// * +// * @param fp The {@link UFieldPosition} to populate. +// */ +// void populateUFieldPosition(FieldPosition fp); + + /** + * Checks whether the bytes stored in this instance are all valid. For internal unit testing only. + * + * @return An error message if this instance is invalid, or null if this instance is healthy. + */ + const char16_t* checkHealth() const; + + UnicodeString toString() const; + + /* Returns the string in exponential notation. */ + UnicodeString toNumberString() const; + + /* Returns the string without exponential notation. Slightly slower than toNumberString(). */ + UnicodeString toPlainString() const; + + /** Visible for testing */ + inline bool isUsingBytes() { return usingBytes; } + + /** Visible for testing */ + inline bool isExplicitExactDouble() { return explicitExactDouble; }; + + private: + /** + * The power of ten corresponding to the least significant digit in the BCD. For example, if this + * object represents the number "3.14", the BCD will be "0x314" and the scale will be -2. + * + *

    Note that in {@link java.math.BigDecimal}, the scale is defined differently: the number of + * digits after the decimal place, which is the negative of our definition of scale. + */ + int32_t scale; + + /** + * The number of digits in the BCD. For example, "1007" has BCD "0x1007" and precision 4. The + * maximum precision is 16 since a long can hold only 16 digits. + * + *

    This value must be re-calculated whenever the value in bcd changes by using {@link + * #computePrecisionAndCompact()}. + */ + int32_t precision; + + /** + * A bitmask of properties relating to the number represented by this object. + * + * @see #NEGATIVE_FLAG + * @see #INFINITY_FLAG + * @see #NAN_FLAG + */ + int8_t flags; + + // The following three fields relate to the double-to-ascii fast path algorithm. + // When a double is given to DecimalQuantityBCD, it is converted to using a fast algorithm. The + // fast algorithm guarantees correctness to only the first ~12 digits of the double. The process + // of rounding the number ensures that the converted digits are correct, falling back to a slow- + // path algorithm if required. Therefore, if a DecimalQuantity is constructed from a double, it + // is *required* that roundToMagnitude(), roundToIncrement(), or roundToInfinity() is called. If + // you don't round, assertions will fail in certain other methods if you try calling them. + + /** + * Whether the value in the BCD comes from the double fast path without having been rounded to + * ensure correctness + */ + UBool isApproximate; + + /** + * The original number provided by the user and which is represented in BCD. Used when we need to + * re-compute the BCD for an exact double representation. + */ + double origDouble; + + /** + * The change in magnitude relative to the original double. Used when we need to re-compute the + * BCD for an exact double representation. + */ + int32_t origDelta; + + // Four positions: left optional '(', left required '[', right required ']', right optional ')'. + // These four positions determine which digits are displayed in the output string. They do NOT + // affect rounding. These positions are internal-only and can be specified only by the public + // endpoints like setFractionLength, setIntegerLength, and setSignificantDigits, among others. + // + // * Digits between lReqPos and rReqPos are in the "required zone" and are always displayed. + // * Digits between lOptPos and rOptPos but outside the required zone are in the "optional zone" + // and are displayed unless they are trailing off the left or right edge of the number and + // have a numerical value of zero. In order to be "trailing", the digits need to be beyond + // the decimal point in their respective directions. + // * Digits outside of the "optional zone" are never displayed. + // + // See the table below for illustrative examples. + // + // +---------+---------+---------+---------+------------+------------------------+--------------+ + // | lOptPos | lReqPos | rReqPos | rOptPos | number | positions | en-US string | + // +---------+---------+---------+---------+------------+------------------------+--------------+ + // | 5 | 2 | -1 | -5 | 1234.567 | ( 12[34.5]67 ) | 1,234.567 | + // | 3 | 2 | -1 | -5 | 1234.567 | 1(2[34.5]67 ) | 234.567 | + // | 3 | 2 | -1 | -2 | 1234.567 | 1(2[34.5]6)7 | 234.56 | + // | 6 | 4 | 2 | -5 | 123456789. | 123(45[67]89. ) | 456,789. | + // | 6 | 4 | 2 | 1 | 123456789. | 123(45[67]8)9. | 456,780. | + // | -1 | -1 | -3 | -4 | 0.123456 | 0.1([23]4)56 | .0234 | + // | 6 | 4 | -2 | -2 | 12.3 | ( [ 12.3 ]) | 0012.30 | + // +---------+---------+---------+---------+------------+------------------------+--------------+ + // + int32_t lOptPos = INT32_MAX; + int32_t lReqPos = 0; + int32_t rReqPos = 0; + int32_t rOptPos = INT32_MIN; + + /** + * The BCD of the 16 digits of the number represented by this object. Every 4 bits of the long map + * to one digit. For example, the number "12345" in BCD is "0x12345". + * + *

    Whenever bcd changes internally, {@link #compact()} must be called, except in special cases + * like setting the digit to zero. + */ + union { + struct { + int8_t *ptr; + int32_t len; + } bcdBytes; + uint64_t bcdLong; + } fBCD; + + bool usingBytes = false; + + /** + * Whether this {@link DecimalQuantity} has been explicitly converted to an exact double. true if + * backed by a double that was explicitly converted via convertToAccurateDouble; false otherwise. + * Used for testing. + */ + bool explicitExactDouble = false; + + /** + * Returns a single digit from the BCD list. No internal state is changed by calling this method. + * + * @param position The position of the digit to pop, counted in BCD units from the least + * significant digit. If outside the range supported by the implementation, zero is returned. + * @return The digit at the specified location. + */ + int8_t getDigitPos(int32_t position) const; + + /** + * Sets the digit in the BCD list. This method only sets the digit; it is the caller's + * responsibility to call {@link #compact} after setting the digit. + * + * @param position The position of the digit to pop, counted in BCD units from the least + * significant digit. If outside the range supported by the implementation, an AssertionError + * is thrown. + * @param value The digit to set at the specified location. + */ + void setDigitPos(int32_t position, int8_t value); + + /** + * Adds zeros to the end of the BCD list. This will result in an invalid BCD representation; it is + * the caller's responsibility to do further manipulation and then call {@link #compact}. + * + * @param numDigits The number of zeros to add. + */ + void shiftLeft(int32_t numDigits); + + void shiftRight(int32_t numDigits); + + /** + * Sets the internal representation to zero. Clears any values stored in scale, precision, + * hasDouble, origDouble, origDelta, and BCD data. + */ + void setBcdToZero(); + + /** + * Sets the internal BCD state to represent the value in the given int. The int is guaranteed to + * be either positive. The internal state is guaranteed to be empty when this method is called. + * + * @param n The value to consume. + */ + void readIntToBcd(int32_t n); + + /** + * Sets the internal BCD state to represent the value in the given long. The long is guaranteed to + * be either positive. The internal state is guaranteed to be empty when this method is called. + * + * @param n The value to consume. + */ + void readLongToBcd(int64_t n); + + void readDecNumberToBcd(decNumber *dn); + + void copyBcdFrom(const DecimalQuantity &other); + + /** + * Removes trailing zeros from the BCD (adjusting the scale as required) and then computes the + * precision. The precision is the number of digits in the number up through the greatest nonzero + * digit. + * + *

    This method must always be called when bcd changes in order for assumptions to be correct in + * methods like {@link #fractionCount()}. + */ + void compact(); + + void _setToInt(int32_t n); + + void _setToLong(int64_t n); + + void _setToDoubleFast(double n); + + void _setToDecNumber(decNumber *n); + + void convertToAccurateDouble(); + + double toDoubleFromOriginal() const; + + /** Ensure that a byte array of at least 40 digits is allocated. */ + void ensureCapacity(); + + void ensureCapacity(int32_t capacity); + + /** Switches the internal storage mechanism between the 64-bit long and the byte array. */ + void switchStorage(); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_DECIMALQUANTITY_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_decimfmtprops.cpp b/deps/icu-small/source/i18n/number_decimfmtprops.cpp new file mode 100644 index 00000000000000..cc57cfce6ac1fa --- /dev/null +++ b/deps/icu-small/source/i18n/number_decimfmtprops.cpp @@ -0,0 +1,102 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "number_decimfmtprops.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +DecimalFormatProperties::DecimalFormatProperties() { + clear(); +} + +void DecimalFormatProperties::clear() { + compactStyle.nullify(); + currency.nullify(); + currencyPluralInfo.fPtr.adoptInstead(nullptr); + currencyUsage.nullify(); + decimalPatternMatchRequired = false; + decimalSeparatorAlwaysShown = false; + exponentSignAlwaysShown = false; + formatWidth = -1; + groupingSize = -1; + magnitudeMultiplier = 0; + maximumFractionDigits = -1; + maximumIntegerDigits = -1; + maximumSignificantDigits = -1; + minimumExponentDigits = -1; + minimumFractionDigits = -1; + minimumGroupingDigits = -1; + minimumIntegerDigits = -1; + minimumSignificantDigits = -1; + multiplier = 0; + negativePrefix.setToBogus(); + negativePrefixPattern.setToBogus(); + negativeSuffix.setToBogus(); + negativeSuffixPattern.setToBogus(); + padPosition.nullify(); + padString.setToBogus(); + parseCaseSensitive = false; + parseIntegerOnly = false; + parseLenient = false; + parseNoExponent = false; + parseToBigDecimal = false; + positivePrefix.setToBogus(); + positivePrefixPattern.setToBogus(); + positiveSuffix.setToBogus(); + positiveSuffixPattern.setToBogus(); + roundingIncrement = 0.0; + roundingMode.nullify(); + secondaryGroupingSize = -1; + signAlwaysShown = false; +} + +bool DecimalFormatProperties::operator==(const DecimalFormatProperties &other) const { + bool eq = true; + eq = eq && compactStyle == other.compactStyle; + eq = eq && currency == other.currency; + eq = eq && currencyPluralInfo.fPtr.getAlias() == other.currencyPluralInfo.fPtr.getAlias(); + eq = eq && currencyUsage == other.currencyUsage; + eq = eq && decimalPatternMatchRequired == other.decimalPatternMatchRequired; + eq = eq && decimalSeparatorAlwaysShown == other.decimalSeparatorAlwaysShown; + eq = eq && exponentSignAlwaysShown == other.exponentSignAlwaysShown; + eq = eq && formatWidth == other.formatWidth; + eq = eq && groupingSize == other.groupingSize; + eq = eq && magnitudeMultiplier == other.magnitudeMultiplier; + eq = eq && maximumFractionDigits == other.maximumFractionDigits; + eq = eq && maximumIntegerDigits == other.maximumIntegerDigits; + eq = eq && maximumSignificantDigits == other.maximumSignificantDigits; + eq = eq && minimumExponentDigits == other.minimumExponentDigits; + eq = eq && minimumFractionDigits == other.minimumFractionDigits; + eq = eq && minimumGroupingDigits == other.minimumGroupingDigits; + eq = eq && minimumIntegerDigits == other.minimumIntegerDigits; + eq = eq && minimumSignificantDigits == other.minimumSignificantDigits; + eq = eq && multiplier == other.multiplier; + eq = eq && negativePrefix == other.negativePrefix; + eq = eq && negativePrefixPattern == other.negativePrefixPattern; + eq = eq && negativeSuffix == other.negativeSuffix; + eq = eq && negativeSuffixPattern == other.negativeSuffixPattern; + eq = eq && padPosition == other.padPosition; + eq = eq && padString == other.padString; + eq = eq && parseCaseSensitive == other.parseCaseSensitive; + eq = eq && parseIntegerOnly == other.parseIntegerOnly; + eq = eq && parseLenient == other.parseLenient; + eq = eq && parseNoExponent == other.parseNoExponent; + eq = eq && parseToBigDecimal == other.parseToBigDecimal; + eq = eq && positivePrefix == other.positivePrefix; + eq = eq && positivePrefixPattern == other.positivePrefixPattern; + eq = eq && positiveSuffix == other.positiveSuffix; + eq = eq && positiveSuffixPattern == other.positiveSuffixPattern; + eq = eq && roundingIncrement == other.roundingIncrement; + eq = eq && roundingMode == other.roundingMode; + eq = eq && secondaryGroupingSize == other.secondaryGroupingSize; + eq = eq && signAlwaysShown == other.signAlwaysShown; + return eq; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_decimfmtprops.h b/deps/icu-small/source/i18n/number_decimfmtprops.h new file mode 100644 index 00000000000000..3e25966b6f5612 --- /dev/null +++ b/deps/icu-small/source/i18n/number_decimfmtprops.h @@ -0,0 +1,108 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_DECIMFMTPROPS_H__ +#define __NUMBER_DECIMFMTPROPS_H__ + +#include "unicode/unistr.h" +#include +#include "unicode/plurrule.h" +#include "unicode/currpinf.h" +#include "unicode/unum.h" +#include "unicode/localpointer.h" +#include "number_types.h" + +U_NAMESPACE_BEGIN + +// Export an explicit template instantiation of the LocalPointer that is used as a +// data member of CurrencyPluralInfoWrapper. +// (MSVC requires this, even though it should not be necessary.) +#if defined (_MSC_VER) +// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= +#pragma warning(suppress: 4661) +template class U_I18N_API LocalPointerBase; +template class U_I18N_API LocalPointer; +#endif + +namespace number { +namespace impl { + +// TODO: Figure out a nicer way to deal with CurrencyPluralInfo. +// Exported as U_I18N_API because it is a public member field of exported DecimalFormatProperties +struct U_I18N_API CurrencyPluralInfoWrapper { + LocalPointer fPtr; + + CurrencyPluralInfoWrapper() {} + CurrencyPluralInfoWrapper(const CurrencyPluralInfoWrapper& other) { + if (!other.fPtr.isNull()) { + fPtr.adoptInstead(new CurrencyPluralInfo(*other.fPtr)); + } + } +}; + +// Exported as U_I18N_API because it is needed for the unit test PatternStringTest +struct U_I18N_API DecimalFormatProperties { + + public: + NullableValue compactStyle; + NullableValue currency; + CurrencyPluralInfoWrapper currencyPluralInfo; + NullableValue currencyUsage; + bool decimalPatternMatchRequired; + bool decimalSeparatorAlwaysShown; + bool exponentSignAlwaysShown; + int32_t formatWidth; + int32_t groupingSize; + int32_t magnitudeMultiplier; + int32_t maximumFractionDigits; + int32_t maximumIntegerDigits; + int32_t maximumSignificantDigits; + int32_t minimumExponentDigits; + int32_t minimumFractionDigits; + int32_t minimumGroupingDigits; + int32_t minimumIntegerDigits; + int32_t minimumSignificantDigits; + int32_t multiplier; + UnicodeString negativePrefix; + UnicodeString negativePrefixPattern; + UnicodeString negativeSuffix; + UnicodeString negativeSuffixPattern; + NullableValue padPosition; + UnicodeString padString; + bool parseCaseSensitive; + bool parseIntegerOnly; + bool parseLenient; + bool parseNoExponent; + bool parseToBigDecimal; + //PluralRules pluralRules; + UnicodeString positivePrefix; + UnicodeString positivePrefixPattern; + UnicodeString positiveSuffix; + UnicodeString positiveSuffixPattern; + double roundingIncrement; + NullableValue roundingMode; + int32_t secondaryGroupingSize; + bool signAlwaysShown; + + DecimalFormatProperties(); + + //DecimalFormatProperties(const DecimalFormatProperties &other) = default; + + DecimalFormatProperties &operator=(const DecimalFormatProperties &other) = default; + + bool operator==(const DecimalFormatProperties &other) const; + + void clear(); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_DECIMFMTPROPS_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_fluent.cpp b/deps/icu-small/source/i18n/number_fluent.cpp new file mode 100644 index 00000000000000..76c3a7ce5c5d16 --- /dev/null +++ b/deps/icu-small/source/i18n/number_fluent.cpp @@ -0,0 +1,369 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "uassert.h" +#include "unicode/numberformatter.h" +#include "number_decimalquantity.h" +#include "number_formatimpl.h" +#include "umutex.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +template +Derived NumberFormatterSettings::notation(const Notation ¬ation) const { + Derived copy(*this); + // NOTE: Slicing is OK. + copy.fMacros.notation = notation; + return copy; +} + +template +Derived NumberFormatterSettings::unit(const icu::MeasureUnit &unit) const { + Derived copy(*this); + // NOTE: Slicing occurs here. However, CurrencyUnit can be restored from MeasureUnit. + // TimeUnit may be affected, but TimeUnit is not as relevant to number formatting. + copy.fMacros.unit = unit; + return copy; +} + +template +Derived NumberFormatterSettings::adoptUnit(const icu::MeasureUnit *unit) const { + Derived copy(*this); + // Just copy the unit into the MacroProps by value, and delete it since we have ownership. + // NOTE: Slicing occurs here. However, CurrencyUnit can be restored from MeasureUnit. + // TimeUnit may be affected, but TimeUnit is not as relevant to number formatting. + if (unit != nullptr) { + copy.fMacros.unit = *unit; + delete unit; + } + return copy; +} + +template +Derived NumberFormatterSettings::rounding(const Rounder &rounder) const { + Derived copy(*this); + // NOTE: Slicing is OK. + copy.fMacros.rounder = rounder; + return copy; +} + +template +Derived NumberFormatterSettings::grouping(const Grouper &grouper) const { + Derived copy(*this); + copy.fMacros.grouper = grouper; + return copy; +} + +template +Derived NumberFormatterSettings::integerWidth(const IntegerWidth &style) const { + Derived copy(*this); + copy.fMacros.integerWidth = style; + return copy; +} + +template +Derived NumberFormatterSettings::symbols(const DecimalFormatSymbols &symbols) const { + Derived copy(*this); + copy.fMacros.symbols.setTo(symbols); + return copy; +} + +template +Derived NumberFormatterSettings::adoptSymbols(const NumberingSystem *ns) const { + Derived copy(*this); + copy.fMacros.symbols.setTo(ns); + return copy; +} + +template +Derived NumberFormatterSettings::unitWidth(const UNumberUnitWidth &width) const { + Derived copy(*this); + copy.fMacros.unitWidth = width; + return copy; +} + +template +Derived NumberFormatterSettings::sign(const UNumberSignDisplay &style) const { + Derived copy(*this); + copy.fMacros.sign = style; + return copy; +} + +template +Derived NumberFormatterSettings::decimal(const UNumberDecimalSeparatorDisplay &style) const { + Derived copy(*this); + copy.fMacros.decimal = style; + return copy; +} + +template +Derived NumberFormatterSettings::padding(const Padder &padder) const { + Derived copy(*this); + copy.fMacros.padder = padder; + return copy; +} + +template +Derived NumberFormatterSettings::threshold(int32_t threshold) const { + Derived copy(*this); + copy.fMacros.threshold = threshold; + return copy; +} + +// Declare all classes that implement NumberFormatterSettings +// See https://stackoverflow.com/a/495056/1407170 +template +class icu::number::NumberFormatterSettings; +template +class icu::number::NumberFormatterSettings; + + +UnlocalizedNumberFormatter NumberFormatter::with() { + UnlocalizedNumberFormatter result; + return result; +} + +LocalizedNumberFormatter NumberFormatter::withLocale(const Locale &locale) { + return with().locale(locale); +} + +// Make the child class constructor that takes the parent class call the parent class's copy constructor +UnlocalizedNumberFormatter::UnlocalizedNumberFormatter( + const NumberFormatterSettings &other) + : NumberFormatterSettings(other) { +} + +// Make the child class constructor that takes the parent class call the parent class's copy constructor +// For LocalizedNumberFormatter, also copy over the extra fields +LocalizedNumberFormatter::LocalizedNumberFormatter( + const NumberFormatterSettings &other) + : NumberFormatterSettings(other) { + // No additional copies required +} + +LocalizedNumberFormatter::LocalizedNumberFormatter(const MacroProps ¯os, const Locale &locale) { + fMacros = macros; + fMacros.locale = locale; +} + +LocalizedNumberFormatter UnlocalizedNumberFormatter::locale(const Locale &locale) const { + return LocalizedNumberFormatter(fMacros, locale); +} + +SymbolsWrapper::SymbolsWrapper(const SymbolsWrapper &other) { + doCopyFrom(other); +} + +SymbolsWrapper &SymbolsWrapper::operator=(const SymbolsWrapper &other) { + if (this == &other) { + return *this; + } + doCleanup(); + doCopyFrom(other); + return *this; +} + +SymbolsWrapper::~SymbolsWrapper() { + doCleanup(); +} + +void SymbolsWrapper::setTo(const DecimalFormatSymbols &dfs) { + doCleanup(); + fType = SYMPTR_DFS; + fPtr.dfs = new DecimalFormatSymbols(dfs); +} + +void SymbolsWrapper::setTo(const NumberingSystem *ns) { + doCleanup(); + fType = SYMPTR_NS; + fPtr.ns = ns; +} + +void SymbolsWrapper::doCopyFrom(const SymbolsWrapper &other) { + fType = other.fType; + switch (fType) { + case SYMPTR_NONE: + // No action necessary + break; + case SYMPTR_DFS: + // Memory allocation failures are exposed in copyErrorTo() + if (other.fPtr.dfs != nullptr) { + fPtr.dfs = new DecimalFormatSymbols(*other.fPtr.dfs); + } else { + fPtr.dfs = nullptr; + } + break; + case SYMPTR_NS: + // Memory allocation failures are exposed in copyErrorTo() + if (other.fPtr.ns != nullptr) { + fPtr.ns = new NumberingSystem(*other.fPtr.ns); + } else { + fPtr.ns = nullptr; + } + break; + } +} + +void SymbolsWrapper::doCleanup() { + switch (fType) { + case SYMPTR_NONE: + // No action necessary + break; + case SYMPTR_DFS: + delete fPtr.dfs; + break; + case SYMPTR_NS: + delete fPtr.ns; + break; + } +} + +bool SymbolsWrapper::isDecimalFormatSymbols() const { + return fType == SYMPTR_DFS; +} + +bool SymbolsWrapper::isNumberingSystem() const { + return fType == SYMPTR_NS; +} + +const DecimalFormatSymbols* SymbolsWrapper::getDecimalFormatSymbols() const { + U_ASSERT(fType == SYMPTR_DFS); + return fPtr.dfs; +} + +const NumberingSystem* SymbolsWrapper::getNumberingSystem() const { + U_ASSERT(fType == SYMPTR_NS); + return fPtr.ns; +} + +LocalizedNumberFormatter::~LocalizedNumberFormatter() { + delete fCompiled; +} + +FormattedNumber LocalizedNumberFormatter::formatInt(int64_t value, UErrorCode &status) const { + if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); } + auto results = new NumberFormatterResults(); + if (results == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return FormattedNumber(status); + } + results->quantity.setToLong(value); + return formatImpl(results, status); +} + +FormattedNumber LocalizedNumberFormatter::formatDouble(double value, UErrorCode &status) const { + if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); } + auto results = new NumberFormatterResults(); + if (results == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return FormattedNumber(status); + } + results->quantity.setToDouble(value); + return formatImpl(results, status); +} + +FormattedNumber LocalizedNumberFormatter::formatDecimal(StringPiece value, UErrorCode &status) const { + if (U_FAILURE(status)) { return FormattedNumber(U_ILLEGAL_ARGUMENT_ERROR); } + auto results = new NumberFormatterResults(); + if (results == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return FormattedNumber(status); + } + results->quantity.setToDecNumber(value); + return formatImpl(results, status); +} + +FormattedNumber +LocalizedNumberFormatter::formatImpl(impl::NumberFormatterResults *results, UErrorCode &status) const { + // fUnsafeCallCount contains memory to be interpreted as an atomic int, most commonly + // std::atomic. Since the type of atomic int is platform-dependent, we cast the + // bytes in fUnsafeCallCount to u_atomic_int32_t, a typedef for the platform-dependent + // atomic int type defined in umutex.h. + static_assert(sizeof(u_atomic_int32_t) <= sizeof(fUnsafeCallCount), + "Atomic integer size on this platform exceeds the size allocated by fUnsafeCallCount"); + u_atomic_int32_t* callCount = reinterpret_cast( + const_cast(this)->fUnsafeCallCount); + + // A positive value in the atomic int indicates that the data structure is not yet ready; + // a negative value indicates that it is ready. If, after the increment, the atomic int + // is exactly threshold, then it is the current thread's job to build the data structure. + // Note: We set the callCount to INT32_MIN so that if another thread proceeds to increment + // the atomic int, the value remains below zero. + int32_t currentCount = umtx_loadAcquire(*callCount); + if (0 <= currentCount && currentCount <= fMacros.threshold && fMacros.threshold > 0) { + currentCount = umtx_atomic_inc(callCount); + } + + if (currentCount == fMacros.threshold && fMacros.threshold > 0) { + // Build the data structure and then use it (slow to fast path). + const NumberFormatterImpl* compiled = + NumberFormatterImpl::fromMacros(fMacros, status); + U_ASSERT(fCompiled == nullptr); + const_cast(this)->fCompiled = compiled; + umtx_storeRelease(*callCount, INT32_MIN); + compiled->apply(results->quantity, results->string, status); + } else if (currentCount < 0) { + // The data structure is already built; use it (fast path). + U_ASSERT(fCompiled != nullptr); + fCompiled->apply(results->quantity, results->string, status); + } else { + // Format the number without building the data structure (slow path). + NumberFormatterImpl::applyStatic(fMacros, results->quantity, results->string, status); + } + + // Do not save the results object if we encountered a failure. + if (U_SUCCESS(status)) { + return FormattedNumber(results); + } else { + delete results; + return FormattedNumber(status); + } +} + +UnicodeString FormattedNumber::toString() const { + if (fResults == nullptr) { + // TODO: http://bugs.icu-project.org/trac/ticket/13437 + return {}; + } + return fResults->string.toUnicodeString(); +} + +Appendable &FormattedNumber::appendTo(Appendable &appendable) { + if (fResults == nullptr) { + // TODO: http://bugs.icu-project.org/trac/ticket/13437 + return appendable; + } + appendable.appendString(fResults->string.chars(), fResults->string.length()); + return appendable; +} + +void FormattedNumber::populateFieldPosition(FieldPosition &fieldPosition, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + if (fResults == nullptr) { + status = fErrorCode; + return; + } + fResults->string.populateFieldPosition(fieldPosition, 0, status); +} + +void +FormattedNumber::populateFieldPositionIterator(FieldPositionIterator &iterator, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + if (fResults == nullptr) { + status = fErrorCode; + return; + } + fResults->string.populateFieldPositionIterator(iterator, status); +} + +FormattedNumber::~FormattedNumber() { + delete fResults; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_formatimpl.cpp b/deps/icu-small/source/i18n/number_formatimpl.cpp new file mode 100644 index 00000000000000..9986ce6d8c606b --- /dev/null +++ b/deps/icu-small/source/i18n/number_formatimpl.cpp @@ -0,0 +1,464 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "cstring.h" +#include "unicode/ures.h" +#include "uresimp.h" +#include "charstr.h" +#include "number_formatimpl.h" +#include "unicode/numfmt.h" +#include "number_patternstring.h" +#include "number_utils.h" +#include "unicode/numberformatter.h" +#include "unicode/dcfmtsym.h" +#include "number_scientific.h" +#include "number_compact.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +// NOTE: In Java, the method to get a pattern from the resource bundle exists in NumberFormat. +// In C++, we have to implement that logic here. +// TODO: Make Java and C++ consistent? + +enum CldrPatternStyle { + CLDR_PATTERN_STYLE_DECIMAL, + CLDR_PATTERN_STYLE_CURRENCY, + CLDR_PATTERN_STYLE_ACCOUNTING, + CLDR_PATTERN_STYLE_PERCENT + // TODO: Consider scientific format. +}; + +const char16_t * +doGetPattern(UResourceBundle *res, const char *nsName, const char *patternKey, UErrorCode &publicStatus, + UErrorCode &localStatus) { + // Construct the path into the resource bundle + CharString key; + key.append("NumberElements/", publicStatus); + key.append(nsName, publicStatus); + key.append("/patterns/", publicStatus); + key.append(patternKey, publicStatus); + if (U_FAILURE(publicStatus)) { + return u""; + } + return ures_getStringByKeyWithFallback(res, key.data(), nullptr, &localStatus); +} + +const char16_t *getPatternForStyle(const Locale &locale, const char *nsName, CldrPatternStyle style, + UErrorCode &status) { + const char *patternKey; + switch (style) { + case CLDR_PATTERN_STYLE_DECIMAL: + patternKey = "decimalFormat"; + break; + case CLDR_PATTERN_STYLE_CURRENCY: + patternKey = "currencyFormat"; + break; + case CLDR_PATTERN_STYLE_ACCOUNTING: + patternKey = "accountingFormat"; + break; + case CLDR_PATTERN_STYLE_PERCENT: + default: + patternKey = "percentFormat"; + break; + } + LocalUResourceBundlePointer res(ures_open(nullptr, locale.getName(), &status)); + if (U_FAILURE(status)) { return u""; } + + // Attempt to get the pattern with the native numbering system. + UErrorCode localStatus = U_ZERO_ERROR; + const char16_t *pattern; + pattern = doGetPattern(res.getAlias(), nsName, patternKey, status, localStatus); + if (U_FAILURE(status)) { return u""; } + + // Fall back to latn if native numbering system does not have the right pattern + if (U_FAILURE(localStatus) && uprv_strcmp("latn", nsName) != 0) { + localStatus = U_ZERO_ERROR; + pattern = doGetPattern(res.getAlias(), "latn", patternKey, status, localStatus); + if (U_FAILURE(status)) { return u""; } + } + + return pattern; +} + +inline bool unitIsCurrency(const MeasureUnit &unit) { + return uprv_strcmp("currency", unit.getType()) == 0; +} + +inline bool unitIsNoUnit(const MeasureUnit &unit) { + return uprv_strcmp("none", unit.getType()) == 0; +} + +inline bool unitIsPercent(const MeasureUnit &unit) { + return uprv_strcmp("percent", unit.getSubtype()) == 0; +} + +inline bool unitIsPermille(const MeasureUnit &unit) { + return uprv_strcmp("permille", unit.getSubtype()) == 0; +} + +} // namespace + +NumberFormatterImpl *NumberFormatterImpl::fromMacros(const MacroProps ¯os, UErrorCode &status) { + return new NumberFormatterImpl(macros, true, status); +} + +void NumberFormatterImpl::applyStatic(const MacroProps ¯os, DecimalQuantity &inValue, + NumberStringBuilder &outString, UErrorCode &status) { + NumberFormatterImpl impl(macros, false, status); + impl.applyUnsafe(inValue, outString, status); +} + +// NOTE: C++ SPECIFIC DIFFERENCE FROM JAVA: +// The "safe" apply method uses a new MicroProps. In the MicroPropsGenerator, fMicros is copied into the new instance. +// The "unsafe" method simply re-uses fMicros, eliminating the extra copy operation. +// See MicroProps::processQuantity() for details. + +void NumberFormatterImpl::apply(DecimalQuantity &inValue, NumberStringBuilder &outString, + UErrorCode &status) const { + if (U_FAILURE(status)) { return; } + MicroProps micros; + fMicroPropsGenerator->processQuantity(inValue, micros, status); + if (U_FAILURE(status)) { return; } + microsToString(micros, inValue, outString, status); +} + +void NumberFormatterImpl::applyUnsafe(DecimalQuantity &inValue, NumberStringBuilder &outString, + UErrorCode &status) { + if (U_FAILURE(status)) { return; } + fMicroPropsGenerator->processQuantity(inValue, fMicros, status); + if (U_FAILURE(status)) { return; } + microsToString(fMicros, inValue, outString, status); +} + +NumberFormatterImpl::NumberFormatterImpl(const MacroProps ¯os, bool safe, UErrorCode &status) { + fMicroPropsGenerator = macrosToMicroGenerator(macros, safe, status); +} + +////////// + +const MicroPropsGenerator * +NumberFormatterImpl::macrosToMicroGenerator(const MacroProps ¯os, bool safe, UErrorCode &status) { + const MicroPropsGenerator *chain = &fMicros; + + // Check that macros is error-free before continuing. + if (macros.copyErrorTo(status)) { + return nullptr; + } + + // TODO: Accept currency symbols from DecimalFormatSymbols? + + // Pre-compute a few values for efficiency. + bool isCurrency = unitIsCurrency(macros.unit); + bool isNoUnit = unitIsNoUnit(macros.unit); + bool isPercent = isNoUnit && unitIsPercent(macros.unit); + bool isPermille = isNoUnit && unitIsPermille(macros.unit); + bool isCldrUnit = !isCurrency && !isNoUnit; + bool isAccounting = + macros.sign == UNUM_SIGN_ACCOUNTING || macros.sign == UNUM_SIGN_ACCOUNTING_ALWAYS; + CurrencyUnit currency(kDefaultCurrency, status); + if (isCurrency) { + currency = CurrencyUnit(macros.unit, status); // Restore CurrencyUnit from MeasureUnit + } + UNumberUnitWidth unitWidth = UNUM_UNIT_WIDTH_SHORT; + if (macros.unitWidth != UNUM_UNIT_WIDTH_COUNT) { + unitWidth = macros.unitWidth; + } + + // Select the numbering system. + LocalPointer nsLocal; + const NumberingSystem *ns; + if (macros.symbols.isNumberingSystem()) { + ns = macros.symbols.getNumberingSystem(); + } else { + // TODO: Is there a way to avoid creating the NumberingSystem object? + ns = NumberingSystem::createInstance(macros.locale, status); + // Give ownership to the function scope. + nsLocal.adoptInstead(ns); + } + const char *nsName = U_SUCCESS(status) ? ns->getName() : "latn"; + + // Load and parse the pattern string. It is used for grouping sizes and affixes only. + CldrPatternStyle patternStyle; + if (isPercent || isPermille) { + patternStyle = CLDR_PATTERN_STYLE_PERCENT; + } else if (!isCurrency || unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) { + patternStyle = CLDR_PATTERN_STYLE_DECIMAL; + } else if (isAccounting) { + // NOTE: Although ACCOUNTING and ACCOUNTING_ALWAYS are only supported in currencies right now, + // the API contract allows us to add support to other units in the future. + patternStyle = CLDR_PATTERN_STYLE_ACCOUNTING; + } else { + patternStyle = CLDR_PATTERN_STYLE_CURRENCY; + } + const char16_t *pattern = getPatternForStyle(macros.locale, nsName, patternStyle, status); + auto patternInfo = new ParsedPatternInfo(); + fPatternInfo.adoptInstead(patternInfo); + PatternParser::parseToPatternInfo(UnicodeString(pattern), *patternInfo, status); + + ///////////////////////////////////////////////////////////////////////////////////// + /// START POPULATING THE DEFAULT MICROPROPS AND BUILDING THE MICROPROPS GENERATOR /// + ///////////////////////////////////////////////////////////////////////////////////// + + // Symbols + if (macros.symbols.isDecimalFormatSymbols()) { + fMicros.symbols = macros.symbols.getDecimalFormatSymbols(); + } else { + fMicros.symbols = new DecimalFormatSymbols(macros.locale, *ns, status); + // Give ownership to the NumberFormatterImpl. + fSymbols.adoptInstead(fMicros.symbols); + } + + // Rounding strategy + if (!macros.rounder.isBogus()) { + fMicros.rounding = macros.rounder; + } else if (macros.notation.fType == Notation::NTN_COMPACT) { + fMicros.rounding = Rounder::integer().withMinDigits(2); + } else if (isCurrency) { + fMicros.rounding = Rounder::currency(UCURR_USAGE_STANDARD); + } else { + fMicros.rounding = Rounder::maxFraction(6); + } + fMicros.rounding.setLocaleData(currency, status); + + // Grouping strategy + if (!macros.grouper.isBogus()) { + fMicros.grouping = macros.grouper; + } else if (macros.notation.fType == Notation::NTN_COMPACT) { + // Compact notation uses minGrouping by default since ICU 59 + fMicros.grouping = Grouper::minTwoDigits(); + } else { + fMicros.grouping = Grouper::defaults(); + } + fMicros.grouping.setLocaleData(*fPatternInfo); + + // Padding strategy + if (!macros.padder.isBogus()) { + fMicros.padding = macros.padder; + } else { + fMicros.padding = Padder::none(); + } + + // Integer width + if (!macros.integerWidth.isBogus()) { + fMicros.integerWidth = macros.integerWidth; + } else { + fMicros.integerWidth = IntegerWidth::zeroFillTo(1); + } + + // Sign display + if (macros.sign != UNUM_SIGN_COUNT) { + fMicros.sign = macros.sign; + } else { + fMicros.sign = UNUM_SIGN_AUTO; + } + + // Decimal mark display + if (macros.decimal != UNUM_DECIMAL_SEPARATOR_COUNT) { + fMicros.decimal = macros.decimal; + } else { + fMicros.decimal = UNUM_DECIMAL_SEPARATOR_AUTO; + } + + // Use monetary separator symbols + fMicros.useCurrency = isCurrency; + + // Inner modifier (scientific notation) + if (macros.notation.fType == Notation::NTN_SCIENTIFIC) { + fScientificHandler.adoptInstead(new ScientificHandler(¯os.notation, fMicros.symbols, chain)); + chain = fScientificHandler.getAlias(); + } else { + // No inner modifier required + fMicros.modInner = &fMicros.helpers.emptyStrongModifier; + } + + // Middle modifier (patterns, positive/negative, currency symbols, percent) + auto patternModifier = new MutablePatternModifier(false); + fPatternModifier.adoptInstead(patternModifier); + patternModifier->setPatternInfo(fPatternInfo.getAlias()); + patternModifier->setPatternAttributes(fMicros.sign, isPermille); + if (patternModifier->needsPlurals()) { + patternModifier->setSymbols( + fMicros.symbols, + currency, + unitWidth, + resolvePluralRules(macros.rules, macros.locale, status)); + } else { + patternModifier->setSymbols(fMicros.symbols, currency, unitWidth, nullptr); + } + if (safe) { + fImmutablePatternModifier.adoptInstead(patternModifier->createImmutableAndChain(chain, status)); + chain = fImmutablePatternModifier.getAlias(); + } else { + patternModifier->addToChain(chain); + chain = patternModifier; + } + + // Outer modifier (CLDR units and currency long names) + if (isCldrUnit) { + fLongNameHandler.adoptInstead( + new LongNameHandler( + LongNameHandler::forMeasureUnit( + macros.locale, + macros.unit, + unitWidth, + resolvePluralRules(macros.rules, macros.locale, status), + chain, + status))); + chain = fLongNameHandler.getAlias(); + } else if (isCurrency && unitWidth == UNUM_UNIT_WIDTH_FULL_NAME) { + fLongNameHandler.adoptInstead( + new LongNameHandler( + LongNameHandler::forCurrencyLongNames( + macros.locale, + currency, + resolvePluralRules(macros.rules, macros.locale, status), + chain, + status))); + chain = fLongNameHandler.getAlias(); + } else { + // No outer modifier required + fMicros.modOuter = &fMicros.helpers.emptyWeakModifier; + } + + // Compact notation + // NOTE: Compact notation can (but might not) override the middle modifier and rounding. + // It therefore needs to go at the end of the chain. + if (macros.notation.fType == Notation::NTN_COMPACT) { + CompactType compactType = (isCurrency && unitWidth != UNUM_UNIT_WIDTH_FULL_NAME) + ? CompactType::TYPE_CURRENCY : CompactType::TYPE_DECIMAL; + fCompactHandler.adoptInstead( + new CompactHandler( + macros.notation.fUnion.compactStyle, + macros.locale, + nsName, + compactType, + resolvePluralRules(macros.rules, macros.locale, status), + safe ? patternModifier : nullptr, + chain, + status)); + chain = fCompactHandler.getAlias(); + } + + return chain; +} + +const PluralRules * +NumberFormatterImpl::resolvePluralRules(const PluralRules *rulesPtr, const Locale &locale, + UErrorCode &status) { + if (rulesPtr != nullptr) { + return rulesPtr; + } + // Lazily create PluralRules + if (fRules.isNull()) { + fRules.adoptInstead(PluralRules::forLocale(locale, status)); + } + return fRules.getAlias(); +} + +int32_t NumberFormatterImpl::microsToString(const MicroProps µs, DecimalQuantity &quantity, + NumberStringBuilder &string, UErrorCode &status) { + micros.rounding.apply(quantity, status); + micros.integerWidth.apply(quantity, status); + int32_t length = writeNumber(micros, quantity, string, status); + // NOTE: When range formatting is added, these modifiers can bubble up. + // For now, apply them all here at once. + // Always apply the inner modifier (which is "strong"). + length += micros.modInner->apply(string, 0, length, status); + if (micros.padding.isValid()) { + length += micros.padding + .padAndApply(*micros.modMiddle, *micros.modOuter, string, 0, length, status); + } else { + length += micros.modMiddle->apply(string, 0, length, status); + length += micros.modOuter->apply(string, 0, length, status); + } + return length; +} + +int32_t NumberFormatterImpl::writeNumber(const MicroProps µs, DecimalQuantity &quantity, + NumberStringBuilder &string, UErrorCode &status) { + int32_t length = 0; + if (quantity.isInfinite()) { + length += string.insert( + length, + micros.symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kInfinitySymbol), + UNUM_INTEGER_FIELD, + status); + + } else if (quantity.isNaN()) { + length += string.insert( + length, + micros.symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kNaNSymbol), + UNUM_INTEGER_FIELD, + status); + + } else { + // Add the integer digits + length += writeIntegerDigits(micros, quantity, string, status); + + // Add the decimal point + if (quantity.getLowerDisplayMagnitude() < 0 || micros.decimal == UNUM_DECIMAL_SEPARATOR_ALWAYS) { + length += string.insert( + length, + micros.useCurrency ? micros.symbols->getSymbol( + DecimalFormatSymbols::ENumberFormatSymbol::kMonetarySeparatorSymbol) : micros + .symbols + ->getSymbol( + DecimalFormatSymbols::ENumberFormatSymbol::kDecimalSeparatorSymbol), + UNUM_DECIMAL_SEPARATOR_FIELD, + status); + } + + // Add the fraction digits + length += writeFractionDigits(micros, quantity, string, status); + } + + return length; +} + +int32_t NumberFormatterImpl::writeIntegerDigits(const MicroProps µs, DecimalQuantity &quantity, + NumberStringBuilder &string, UErrorCode &status) { + int length = 0; + int integerCount = quantity.getUpperDisplayMagnitude() + 1; + for (int i = 0; i < integerCount; i++) { + // Add grouping separator + if (micros.grouping.groupAtPosition(i, quantity)) { + length += string.insert( + 0, + micros.useCurrency ? micros.symbols->getSymbol( + DecimalFormatSymbols::ENumberFormatSymbol::kMonetaryGroupingSeparatorSymbol) + : micros.symbols->getSymbol( + DecimalFormatSymbols::ENumberFormatSymbol::kGroupingSeparatorSymbol), + UNUM_GROUPING_SEPARATOR_FIELD, + status); + } + + // Get and append the next digit value + int8_t nextDigit = quantity.getDigit(i); + length += string.insert( + 0, getDigitFromSymbols(nextDigit, *micros.symbols), UNUM_INTEGER_FIELD, status); + } + return length; +} + +int32_t NumberFormatterImpl::writeFractionDigits(const MicroProps µs, DecimalQuantity &quantity, + NumberStringBuilder &string, UErrorCode &status) { + int length = 0; + int fractionCount = -quantity.getLowerDisplayMagnitude(); + for (int i = 0; i < fractionCount; i++) { + // Get and append the next digit value + int8_t nextDigit = quantity.getDigit(-i - 1); + length += string.append( + getDigitFromSymbols(nextDigit, *micros.symbols), UNUM_FRACTION_FIELD, status); + } + return length; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_formatimpl.h b/deps/icu-small/source/i18n/number_formatimpl.h new file mode 100644 index 00000000000000..cbc04ba30df4c4 --- /dev/null +++ b/deps/icu-small/source/i18n/number_formatimpl.h @@ -0,0 +1,125 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_FORMATIMPL_H__ +#define __NUMBER_FORMATIMPL_H__ + +#include "number_types.h" +#include "number_stringbuilder.h" +#include "number_patternstring.h" +#include "number_utils.h" +#include "number_patternmodifier.h" +#include "number_longnames.h" +#include "number_compact.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +/** + * This is the "brain" of the number formatting pipeline. It ties all the pieces together, taking in a MacroProps and a + * DecimalQuantity and outputting a properly formatted number string. + */ +class NumberFormatterImpl : public UMemory { + public: + /** + * Builds a "safe" MicroPropsGenerator, which is thread-safe and can be used repeatedly. + * The caller owns the returned NumberFormatterImpl. + */ + static NumberFormatterImpl *fromMacros(const MacroProps ¯os, UErrorCode &status); + + /** + * Builds and evaluates an "unsafe" MicroPropsGenerator, which is cheaper but can be used only once. + */ + static void + applyStatic(const MacroProps ¯os, DecimalQuantity &inValue, NumberStringBuilder &outString, + UErrorCode &status); + + /** + * Evaluates the "safe" MicroPropsGenerator created by "fromMacros". + */ + void apply(DecimalQuantity &inValue, NumberStringBuilder &outString, UErrorCode &status) const; + + private: + // Head of the MicroPropsGenerator linked list: + const MicroPropsGenerator *fMicroPropsGenerator = nullptr; + + // Tail of the list: + MicroProps fMicros; + + // Other fields possibly used by the number formatting pipeline: + // TODO: Convert some of these LocalPointers to value objects to reduce the number of news? + LocalPointer fSymbols; + LocalPointer fRules; + LocalPointer fPatternInfo; + LocalPointer fScientificHandler; + LocalPointer fPatternModifier; + LocalPointer fImmutablePatternModifier; + LocalPointer fLongNameHandler; + LocalPointer fCompactHandler; + + + NumberFormatterImpl(const MacroProps ¯os, bool safe, UErrorCode &status); + + void applyUnsafe(DecimalQuantity &inValue, NumberStringBuilder &outString, UErrorCode &status); + + /** + * If rulesPtr is non-null, return it. Otherwise, return a PluralRules owned by this object for the + * specified locale, creating it if necessary. + */ + const PluralRules * + resolvePluralRules(const PluralRules *rulesPtr, const Locale &locale, UErrorCode &status); + + /** + * Synthesizes the MacroProps into a MicroPropsGenerator. All information, including the locale, is encoded into the + * MicroPropsGenerator, except for the quantity itself, which is left abstract and must be provided to the returned + * MicroPropsGenerator instance. + * + * @see MicroPropsGenerator + * @param macros + * The {@link MacroProps} to consume. This method does not mutate the MacroProps instance. + * @param safe + * If true, the returned MicroPropsGenerator will be thread-safe. If false, the returned value will + * not be thread-safe, intended for a single "one-shot" use only. Building the thread-safe + * object is more expensive. + */ + const MicroPropsGenerator * + macrosToMicroGenerator(const MacroProps ¯os, bool safe, UErrorCode &status); + + /** + * Synthesizes the output string from a MicroProps and DecimalQuantity. + * + * @param micros + * The MicroProps after the quantity has been consumed. Will not be mutated. + * @param quantity + * The DecimalQuantity to be rendered. May be mutated. + * @param string + * The output string. Will be mutated. + */ + static int32_t + microsToString(const MicroProps µs, DecimalQuantity &quantity, NumberStringBuilder &string, + UErrorCode &status); + + static int32_t + writeNumber(const MicroProps µs, DecimalQuantity &quantity, NumberStringBuilder &string, + UErrorCode &status); + + static int32_t + writeIntegerDigits(const MicroProps µs, DecimalQuantity &quantity, NumberStringBuilder &string, + UErrorCode &status); + + static int32_t + writeFractionDigits(const MicroProps µs, DecimalQuantity &quantity, NumberStringBuilder &string, + UErrorCode &status); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_FORMATIMPL_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_grouping.cpp b/deps/icu-small/source/i18n/number_grouping.cpp new file mode 100644 index 00000000000000..15362825cc68ce --- /dev/null +++ b/deps/icu-small/source/i18n/number_grouping.cpp @@ -0,0 +1,55 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "unicode/numberformatter.h" +#include "number_patternstring.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +Grouper Grouper::defaults() { + return {-2, -2, false}; +} + +Grouper Grouper::minTwoDigits() { + return {-2, -2, true}; +} + +Grouper Grouper::none() { + return {-1, -1, false}; +} + +void Grouper::setLocaleData(const impl::ParsedPatternInfo &patternInfo) { + if (fGrouping1 != -2) { + return; + } + auto grouping1 = static_cast (patternInfo.positive.groupingSizes & 0xffff); + auto grouping2 = static_cast ((patternInfo.positive.groupingSizes >> 16) & 0xffff); + auto grouping3 = static_cast ((patternInfo.positive.groupingSizes >> 32) & 0xffff); + if (grouping2 == -1) { + grouping1 = -1; + } + if (grouping3 == -1) { + grouping2 = grouping1; + } + fGrouping1 = grouping1; + fGrouping2 = grouping2; +} + +bool Grouper::groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const { + U_ASSERT(fGrouping1 > -2); + if (fGrouping1 == -1 || fGrouping1 == 0) { + // Either -1 or 0 means "no grouping" + return false; + } + position -= fGrouping1; + return position >= 0 && (position % fGrouping2) == 0 + && value.getUpperDisplayMagnitude() - fGrouping1 + 1 >= (fMin2 ? 2 : 1); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_integerwidth.cpp b/deps/icu-small/source/i18n/number_integerwidth.cpp new file mode 100644 index 00000000000000..10dacfc4acb96f --- /dev/null +++ b/deps/icu-small/source/i18n/number_integerwidth.cpp @@ -0,0 +1,48 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "unicode/numberformatter.h" +#include "number_types.h" +#include "number_decimalquantity.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +IntegerWidth::IntegerWidth(int8_t minInt, int8_t maxInt) { + fUnion.minMaxInt.fMinInt = minInt; + fUnion.minMaxInt.fMaxInt = maxInt; +} + +IntegerWidth IntegerWidth::zeroFillTo(int32_t minInt) { + if (minInt >= 0 && minInt <= kMaxIntFracSig) { + return {static_cast(minInt), -1}; + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +IntegerWidth IntegerWidth::truncateAt(int32_t maxInt) { + if (fHasError) { return *this; } // No-op on error + if (maxInt >= 0 && maxInt <= kMaxIntFracSig) { + return {fUnion.minMaxInt.fMinInt, static_cast(maxInt)}; + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +void IntegerWidth::apply(impl::DecimalQuantity &quantity, UErrorCode &status) const { + if (fHasError) { + status = U_ILLEGAL_ARGUMENT_ERROR; + } else if (fUnion.minMaxInt.fMaxInt == -1) { + quantity.setIntegerLength(fUnion.minMaxInt.fMinInt, INT32_MAX); + } else { + quantity.setIntegerLength(fUnion.minMaxInt.fMinInt, fUnion.minMaxInt.fMaxInt); + } +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_longnames.cpp b/deps/icu-small/source/i18n/number_longnames.cpp new file mode 100644 index 00000000000000..88b3413585a0f7 --- /dev/null +++ b/deps/icu-small/source/i18n/number_longnames.cpp @@ -0,0 +1,165 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "unicode/ures.h" +#include "ureslocs.h" +#include "charstr.h" +#include "uresimp.h" +#include "number_longnames.h" +#include +#include "cstring.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + + +////////////////////////// +/// BEGIN DATA LOADING /// +////////////////////////// + +class PluralTableSink : public ResourceSink { + public: + explicit PluralTableSink(UnicodeString *outArray) : outArray(outArray) { + // Initialize the array to bogus strings. + for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) { + outArray[i].setToBogus(); + } + } + + void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) U_OVERRIDE { + ResourceTable pluralsTable = value.getTable(status); + if (U_FAILURE(status)) { return; } + for (int i = 0; pluralsTable.getKeyAndValue(i, key, value); ++i) { + // In MeasureUnit data, ignore dnam and per units for now. + if (uprv_strcmp(key, "dnam") == 0 || uprv_strcmp(key, "per") == 0) { + continue; + } + StandardPlural::Form plural = StandardPlural::fromString(key, status); + if (U_FAILURE(status)) { return; } + if (!outArray[plural].isBogus()) { + continue; + } + outArray[plural] = value.getUnicodeString(status); + if (U_FAILURE(status)) { return; } + } + } + + private: + UnicodeString *outArray; +}; + +// NOTE: outArray MUST have room for all StandardPlural values. No bounds checking is performed. + +void getMeasureData(const Locale &locale, const MeasureUnit &unit, const UNumberUnitWidth &width, + UnicodeString *outArray, UErrorCode &status) { + PluralTableSink sink(outArray); + LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_UNIT, locale.getName(), &status)); + if (U_FAILURE(status)) { return; } + CharString key; + key.append("units", status); + if (width == UNUM_UNIT_WIDTH_NARROW) { + key.append("Narrow", status); + } else if (width == UNUM_UNIT_WIDTH_SHORT) { + key.append("Short", status); + } + key.append("/", status); + key.append(unit.getType(), status); + key.append("/", status); + key.append(unit.getSubtype(), status); + ures_getAllItemsWithFallback(unitsBundle.getAlias(), key.data(), sink, status); +} + +void getCurrencyLongNameData(const Locale &locale, const CurrencyUnit ¤cy, UnicodeString *outArray, + UErrorCode &status) { + // In ICU4J, this method gets a CurrencyData from CurrencyData.provider. + // TODO(ICU4J): Implement this without going through CurrencyData, like in ICU4C? + PluralTableSink sink(outArray); + LocalUResourceBundlePointer unitsBundle(ures_open(U_ICUDATA_CURR, locale.getName(), &status)); + if (U_FAILURE(status)) { return; } + ures_getAllItemsWithFallback(unitsBundle.getAlias(), "CurrencyUnitPatterns", sink, status); + if (U_FAILURE(status)) { return; } + for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) { + UnicodeString &pattern = outArray[i]; + if (pattern.isBogus()) { + continue; + } + UBool isChoiceFormat = FALSE; + int32_t longNameLen = 0; + const char16_t *longName = ucurr_getPluralName( + currency.getISOCurrency(), + locale.getName(), + &isChoiceFormat, + StandardPlural::getKeyword(static_cast(i)), + &longNameLen, + &status); + // Example pattern from data: "{0} {1}" + // Example output after find-and-replace: "{0} US dollars" + pattern.findAndReplace(UnicodeString(u"{1}"), UnicodeString(longName, longNameLen)); + } +} + +//////////////////////// +/// END DATA LOADING /// +//////////////////////// + +} // namespace + +LongNameHandler +LongNameHandler::forMeasureUnit(const Locale &loc, const MeasureUnit &unit, const UNumberUnitWidth &width, + const PluralRules *rules, const MicroPropsGenerator *parent, + UErrorCode &status) { + LongNameHandler result(rules, parent); + UnicodeString simpleFormats[StandardPlural::Form::COUNT]; + getMeasureData(loc, unit, width, simpleFormats, status); + if (U_FAILURE(status)) { return result; } + // TODO: What field to use for units? + simpleFormatsToModifiers(simpleFormats, UNUM_FIELD_COUNT, result.fModifiers, status); + return result; +} + +LongNameHandler LongNameHandler::forCurrencyLongNames(const Locale &loc, const CurrencyUnit ¤cy, + const PluralRules *rules, + const MicroPropsGenerator *parent, + UErrorCode &status) { + LongNameHandler result(rules, parent); + UnicodeString simpleFormats[StandardPlural::Form::COUNT]; + getCurrencyLongNameData(loc, currency, simpleFormats, status); + if (U_FAILURE(status)) { return result; } + simpleFormatsToModifiers(simpleFormats, UNUM_CURRENCY_FIELD, result.fModifiers, status); + return result; +} + +void LongNameHandler::simpleFormatsToModifiers(const UnicodeString *simpleFormats, Field field, + SimpleModifier *output, UErrorCode &status) { + for (int32_t i = 0; i < StandardPlural::Form::COUNT; i++) { + UnicodeString simpleFormat = simpleFormats[i]; + if (simpleFormat.isBogus()) { + simpleFormat = simpleFormats[StandardPlural::Form::OTHER]; + } + if (simpleFormat.isBogus()) { + // There should always be data in the "other" plural variant. + status = U_INTERNAL_PROGRAM_ERROR; + return; + } + SimpleFormatter compiledFormatter(simpleFormat, 1, 1, status); + output[i] = SimpleModifier(compiledFormatter, field, false); + } +} + +void LongNameHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs, + UErrorCode &status) const { + parent->processQuantity(quantity, micros, status); + // TODO: Avoid the copy here? + DecimalQuantity copy(quantity); + micros.rounding.apply(copy, status); + micros.modOuter = &fModifiers[copy.getStandardPlural(rules)]; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_longnames.h b/deps/icu-small/source/i18n/number_longnames.h new file mode 100644 index 00000000000000..22ecbac30e1ebc --- /dev/null +++ b/deps/icu-small/source/i18n/number_longnames.h @@ -0,0 +1,48 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_LONGNAMES_H__ +#define __NUMBER_LONGNAMES_H__ + +#include "unicode/uversion.h" +#include "number_utils.h" +#include "number_modifiers.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +class LongNameHandler : public MicroPropsGenerator, public UMemory { + public: + static LongNameHandler + forCurrencyLongNames(const Locale &loc, const CurrencyUnit ¤cy, const PluralRules *rules, + const MicroPropsGenerator *parent, UErrorCode &status); + + static LongNameHandler + forMeasureUnit(const Locale &loc, const MeasureUnit &unit, const UNumberUnitWidth &width, + const PluralRules *rules, const MicroPropsGenerator *parent, UErrorCode &status); + + void + processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const U_OVERRIDE; + + private: + SimpleModifier fModifiers[StandardPlural::Form::COUNT]; + const PluralRules *rules; + const MicroPropsGenerator *parent; + + LongNameHandler(const PluralRules *rules, const MicroPropsGenerator *parent) + : rules(rules), parent(parent) {} + + static void simpleFormatsToModifiers(const UnicodeString *simpleFormats, Field field, + SimpleModifier *output, UErrorCode &status); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_LONGNAMES_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_modifiers.cpp b/deps/icu-small/source/i18n/number_modifiers.cpp new file mode 100644 index 00000000000000..a19b12d11ed7a2 --- /dev/null +++ b/deps/icu-small/source/i18n/number_modifiers.cpp @@ -0,0 +1,303 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "umutex.h" +#include "ucln_cmn.h" +#include "ucln_in.h" +#include "number_modifiers.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +// TODO: This is copied from simpleformatter.cpp +const int32_t ARG_NUM_LIMIT = 0x100; + +// These are the default currency spacing UnicodeSets in CLDR. +// Pre-compute them for performance. +// The Java unit test testCurrencySpacingPatternStability() will start failing if these change in CLDR. +icu::UInitOnce gDefaultCurrencySpacingInitOnce = U_INITONCE_INITIALIZER; + +UnicodeSet *UNISET_DIGIT = nullptr; +UnicodeSet *UNISET_NOTS = nullptr; + +UBool U_CALLCONV cleanupDefaultCurrencySpacing() { + delete UNISET_DIGIT; + UNISET_DIGIT = nullptr; + delete UNISET_NOTS; + UNISET_NOTS = nullptr; + return TRUE; +} + +void U_CALLCONV initDefaultCurrencySpacing(UErrorCode &status) { + ucln_i18n_registerCleanup(UCLN_I18N_CURRENCY_SPACING, cleanupDefaultCurrencySpacing); + UNISET_DIGIT = new UnicodeSet(UnicodeString(u"[:digit:]"), status); + UNISET_NOTS = new UnicodeSet(UnicodeString(u"[:^S:]"), status); + if (UNISET_DIGIT == nullptr || UNISET_NOTS == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return; + } + UNISET_DIGIT->freeze(); + UNISET_NOTS->freeze(); +} + +} // namespace + + +int32_t ConstantAffixModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, + UErrorCode &status) const { + // Insert the suffix first since inserting the prefix will change the rightIndex + int length = output.insert(rightIndex, fSuffix, fField, status); + length += output.insert(leftIndex, fPrefix, fField, status); + return length; +} + +int32_t ConstantAffixModifier::getPrefixLength(UErrorCode &status) const { + (void)status; + return fPrefix.length(); +} + +int32_t ConstantAffixModifier::getCodePointCount(UErrorCode &status) const { + (void)status; + return fPrefix.countChar32() + fSuffix.countChar32(); +} + +bool ConstantAffixModifier::isStrong() const { + return fStrong; +} + +SimpleModifier::SimpleModifier(const SimpleFormatter &simpleFormatter, Field field, bool strong) + : fCompiledPattern(simpleFormatter.compiledPattern), fField(field), fStrong(strong) { + U_ASSERT(1 == + SimpleFormatter::getArgumentLimit(fCompiledPattern.getBuffer(), fCompiledPattern.length())); + if (fCompiledPattern.charAt(1) != 0) { + fPrefixLength = fCompiledPattern.charAt(1) - ARG_NUM_LIMIT; + fSuffixOffset = 3 + fPrefixLength; + } else { + fPrefixLength = 0; + fSuffixOffset = 2; + } + if (3 + fPrefixLength < fCompiledPattern.length()) { + fSuffixLength = fCompiledPattern.charAt(fSuffixOffset) - ARG_NUM_LIMIT; + } else { + fSuffixLength = 0; + } +} + +SimpleModifier::SimpleModifier() + : fField(UNUM_FIELD_COUNT), fStrong(false), fPrefixLength(0), fSuffixLength(0) { +} + +int32_t SimpleModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, + UErrorCode &status) const { + return formatAsPrefixSuffix(output, leftIndex, rightIndex, fField, status); +} + +int32_t SimpleModifier::getPrefixLength(UErrorCode &status) const { + (void)status; + return fPrefixLength; +} + +int32_t SimpleModifier::getCodePointCount(UErrorCode &status) const { + (void)status; + int32_t count = 0; + if (fPrefixLength > 0) { + count += fCompiledPattern.countChar32(2, fPrefixLength); + } + if (fSuffixLength > 0) { + count += fCompiledPattern.countChar32(1 + fSuffixOffset, fSuffixLength); + } + return count; +} + +bool SimpleModifier::isStrong() const { + return fStrong; +} + +int32_t +SimpleModifier::formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startIndex, int32_t endIndex, + Field field, UErrorCode &status) const { + if (fPrefixLength > 0) { + result.insert(startIndex, fCompiledPattern, 2, 2 + fPrefixLength, field, status); + } + if (fSuffixLength > 0) { + result.insert( + endIndex + fPrefixLength, + fCompiledPattern, + 1 + fSuffixOffset, + 1 + fSuffixOffset + fSuffixLength, + field, + status); + } + return fPrefixLength + fSuffixLength; +} + +int32_t ConstantMultiFieldModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, + UErrorCode &status) const { + // Insert the suffix first since inserting the prefix will change the rightIndex + int32_t length = output.insert(rightIndex, fSuffix, status); + length += output.insert(leftIndex, fPrefix, status); + return length; +} + +int32_t ConstantMultiFieldModifier::getPrefixLength(UErrorCode &status) const { + (void)status; + return fPrefix.length(); +} + +int32_t ConstantMultiFieldModifier::getCodePointCount(UErrorCode &status) const { + (void)status; + return fPrefix.codePointCount() + fSuffix.codePointCount(); +} + +bool ConstantMultiFieldModifier::isStrong() const { + return fStrong; +} + +CurrencySpacingEnabledModifier::CurrencySpacingEnabledModifier(const NumberStringBuilder &prefix, + const NumberStringBuilder &suffix, + bool strong, + const DecimalFormatSymbols &symbols, + UErrorCode &status) + : ConstantMultiFieldModifier(prefix, suffix, strong) { + // Check for currency spacing. Do not build the UnicodeSets unless there is + // a currency code point at a boundary. + if (prefix.length() > 0 && prefix.fieldAt(prefix.length() - 1) == UNUM_CURRENCY_FIELD) { + int prefixCp = prefix.getLastCodePoint(); + UnicodeSet prefixUnicodeSet = getUnicodeSet(symbols, IN_CURRENCY, PREFIX, status); + if (prefixUnicodeSet.contains(prefixCp)) { + fAfterPrefixUnicodeSet = getUnicodeSet(symbols, IN_NUMBER, PREFIX, status); + fAfterPrefixUnicodeSet.freeze(); + fAfterPrefixInsert = getInsertString(symbols, PREFIX, status); + } else { + fAfterPrefixUnicodeSet.setToBogus(); + fAfterPrefixInsert.setToBogus(); + } + } else { + fAfterPrefixUnicodeSet.setToBogus(); + fAfterPrefixInsert.setToBogus(); + } + if (suffix.length() > 0 && suffix.fieldAt(0) == UNUM_CURRENCY_FIELD) { + int suffixCp = suffix.getLastCodePoint(); + UnicodeSet suffixUnicodeSet = getUnicodeSet(symbols, IN_CURRENCY, SUFFIX, status); + if (suffixUnicodeSet.contains(suffixCp)) { + fBeforeSuffixUnicodeSet = getUnicodeSet(symbols, IN_NUMBER, SUFFIX, status); + fBeforeSuffixUnicodeSet.freeze(); + fBeforeSuffixInsert = getInsertString(symbols, SUFFIX, status); + } else { + fBeforeSuffixUnicodeSet.setToBogus(); + fBeforeSuffixInsert.setToBogus(); + } + } else { + fBeforeSuffixUnicodeSet.setToBogus(); + fBeforeSuffixInsert.setToBogus(); + } +} + +int32_t CurrencySpacingEnabledModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, + UErrorCode &status) const { + // Currency spacing logic + int length = 0; + if (rightIndex - leftIndex > 0 && !fAfterPrefixUnicodeSet.isBogus() && + fAfterPrefixUnicodeSet.contains(output.codePointAt(leftIndex))) { + // TODO: Should we use the CURRENCY field here? + length += output.insert(leftIndex, fAfterPrefixInsert, UNUM_FIELD_COUNT, status); + } + if (rightIndex - leftIndex > 0 && !fBeforeSuffixUnicodeSet.isBogus() && + fBeforeSuffixUnicodeSet.contains(output.codePointBefore(rightIndex))) { + // TODO: Should we use the CURRENCY field here? + length += output.insert(rightIndex + length, fBeforeSuffixInsert, UNUM_FIELD_COUNT, status); + } + + // Call super for the remaining logic + length += ConstantMultiFieldModifier::apply(output, leftIndex, rightIndex + length, status); + return length; +} + +int32_t +CurrencySpacingEnabledModifier::applyCurrencySpacing(NumberStringBuilder &output, int32_t prefixStart, + int32_t prefixLen, int32_t suffixStart, + int32_t suffixLen, + const DecimalFormatSymbols &symbols, + UErrorCode &status) { + int length = 0; + bool hasPrefix = (prefixLen > 0); + bool hasSuffix = (suffixLen > 0); + bool hasNumber = (suffixStart - prefixStart - prefixLen > 0); // could be empty string + if (hasPrefix && hasNumber) { + length += applyCurrencySpacingAffix(output, prefixStart + prefixLen, PREFIX, symbols, status); + } + if (hasSuffix && hasNumber) { + length += applyCurrencySpacingAffix(output, suffixStart + length, SUFFIX, symbols, status); + } + return length; +} + +int32_t +CurrencySpacingEnabledModifier::applyCurrencySpacingAffix(NumberStringBuilder &output, int32_t index, + EAffix affix, + const DecimalFormatSymbols &symbols, + UErrorCode &status) { + // NOTE: For prefix, output.fieldAt(index-1) gets the last field type in the prefix. + // This works even if the last code point in the prefix is 2 code units because the + // field value gets populated to both indices in the field array. + Field affixField = (affix == PREFIX) ? output.fieldAt(index - 1) : output.fieldAt(index); + if (affixField != UNUM_CURRENCY_FIELD) { + return 0; + } + int affixCp = (affix == PREFIX) ? output.codePointBefore(index) : output.codePointAt(index); + UnicodeSet affixUniset = getUnicodeSet(symbols, IN_CURRENCY, affix, status); + if (!affixUniset.contains(affixCp)) { + return 0; + } + int numberCp = (affix == PREFIX) ? output.codePointAt(index) : output.codePointBefore(index); + UnicodeSet numberUniset = getUnicodeSet(symbols, IN_NUMBER, affix, status); + if (!numberUniset.contains(numberCp)) { + return 0; + } + UnicodeString spacingString = getInsertString(symbols, affix, status); + + // NOTE: This next line *inserts* the spacing string, triggering an arraycopy. + // It would be more efficient if this could be done before affixes were attached, + // so that it could be prepended/appended instead of inserted. + // However, the build code path is more efficient, and this is the most natural + // place to put currency spacing in the non-build code path. + // TODO: Should we use the CURRENCY field here? + return output.insert(index, spacingString, UNUM_FIELD_COUNT, status); +} + +UnicodeSet +CurrencySpacingEnabledModifier::getUnicodeSet(const DecimalFormatSymbols &symbols, EPosition position, + EAffix affix, UErrorCode &status) { + // Ensure the static defaults are initialized: + umtx_initOnce(gDefaultCurrencySpacingInitOnce, &initDefaultCurrencySpacing, status); + if (U_FAILURE(status)) { + return UnicodeSet(); + } + + const UnicodeString& pattern = symbols.getPatternForCurrencySpacing( + position == IN_CURRENCY ? UNUM_CURRENCY_MATCH : UNUM_CURRENCY_SURROUNDING_MATCH, + affix == SUFFIX, + status); + if (pattern.compare(u"[:digit:]", -1) == 0) { + return *UNISET_DIGIT; + } else if (pattern.compare(u"[:^S:]", -1) == 0) { + return *UNISET_NOTS; + } else { + return UnicodeSet(pattern, status); + } +} + +UnicodeString +CurrencySpacingEnabledModifier::getInsertString(const DecimalFormatSymbols &symbols, EAffix affix, + UErrorCode &status) { + return symbols.getPatternForCurrencySpacing(UNUM_CURRENCY_INSERT, affix == SUFFIX, status); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_modifiers.h b/deps/icu-small/source/i18n/number_modifiers.h new file mode 100644 index 00000000000000..6a88828a44dd71 --- /dev/null +++ b/deps/icu-small/source/i18n/number_modifiers.h @@ -0,0 +1,254 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_MODIFIERS_H__ +#define __NUMBER_MODIFIERS_H__ + +#include +#include +#include "unicode/uniset.h" +#include "unicode/simpleformatter.h" +#include "standardplural.h" +#include "number_stringbuilder.h" +#include "number_types.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +/** + * The canonical implementation of {@link Modifier}, containing a prefix and suffix string. + * TODO: This is not currently being used by real code and could be removed. + */ +class U_I18N_API ConstantAffixModifier : public Modifier, public UObject { + public: + ConstantAffixModifier(const UnicodeString &prefix, const UnicodeString &suffix, Field field, + bool strong) + : fPrefix(prefix), fSuffix(suffix), fField(field), fStrong(strong) {} + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE; + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE; + + bool isStrong() const U_OVERRIDE; + + private: + UnicodeString fPrefix; + UnicodeString fSuffix; + Field fField; + bool fStrong; +}; + +/** + * The second primary implementation of {@link Modifier}, this one consuming a {@link SimpleFormatter} + * pattern. + */ +class U_I18N_API SimpleModifier : public Modifier, public UMemory { + public: + SimpleModifier(const SimpleFormatter &simpleFormatter, Field field, bool strong); + + // Default constructor for LongNameHandler.h + SimpleModifier(); + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE; + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE; + + bool isStrong() const U_OVERRIDE; + + /** + * TODO: This belongs in SimpleFormatterImpl. The only reason I haven't moved it there yet is because + * DoubleSidedStringBuilder is an internal class and SimpleFormatterImpl feels like it should not depend on it. + * + *

    + * Formats a value that is already stored inside the StringBuilder result between the indices + * startIndex and endIndex by inserting characters before the start index and after the + * end index. + * + *

    + * This is well-defined only for patterns with exactly one argument. + * + * @param result + * The StringBuilder containing the value argument. + * @param startIndex + * The left index of the value within the string builder. + * @param endIndex + * The right index of the value within the string builder. + * @return The number of characters (UTF-16 code points) that were added to the StringBuilder. + */ + int32_t + formatAsPrefixSuffix(NumberStringBuilder &result, int32_t startIndex, int32_t endIndex, Field field, + UErrorCode &status) const; + + private: + UnicodeString fCompiledPattern; + Field fField; + bool fStrong; + int32_t fPrefixLength; + int32_t fSuffixOffset; + int32_t fSuffixLength; +}; + +/** + * An implementation of {@link Modifier} that allows for multiple types of fields in the same modifier. Constructed + * based on the contents of two {@link NumberStringBuilder} instances (one for the prefix, one for the suffix). + */ +class U_I18N_API ConstantMultiFieldModifier : public Modifier, public UMemory { + public: + ConstantMultiFieldModifier(const NumberStringBuilder &prefix, const NumberStringBuilder &suffix, + bool strong) : fPrefix(prefix), fSuffix(suffix), fStrong(strong) {} + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE; + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE; + + bool isStrong() const U_OVERRIDE; + + protected: + // NOTE: In Java, these are stored as array pointers. In C++, the NumberStringBuilder is stored by + // value and is treated internally as immutable. + NumberStringBuilder fPrefix; + NumberStringBuilder fSuffix; + bool fStrong; +}; + +/** Identical to {@link ConstantMultiFieldModifier}, but supports currency spacing. */ +class U_I18N_API CurrencySpacingEnabledModifier : public ConstantMultiFieldModifier { + public: + /** Safe code path */ + CurrencySpacingEnabledModifier(const NumberStringBuilder &prefix, const NumberStringBuilder &suffix, + bool strong, const DecimalFormatSymbols &symbols, UErrorCode &status); + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + /** Unsafe code path */ + static int32_t + applyCurrencySpacing(NumberStringBuilder &output, int32_t prefixStart, int32_t prefixLen, + int32_t suffixStart, int32_t suffixLen, const DecimalFormatSymbols &symbols, + UErrorCode &status); + + private: + UnicodeSet fAfterPrefixUnicodeSet; + UnicodeString fAfterPrefixInsert; + UnicodeSet fBeforeSuffixUnicodeSet; + UnicodeString fBeforeSuffixInsert; + + enum EAffix { + PREFIX, SUFFIX + }; + + enum EPosition { + IN_CURRENCY, IN_NUMBER + }; + + /** Unsafe code path */ + static int32_t applyCurrencySpacingAffix(NumberStringBuilder &output, int32_t index, EAffix affix, + const DecimalFormatSymbols &symbols, UErrorCode &status); + + static UnicodeSet + getUnicodeSet(const DecimalFormatSymbols &symbols, EPosition position, EAffix affix, + UErrorCode &status); + + static UnicodeString + getInsertString(const DecimalFormatSymbols &symbols, EAffix affix, UErrorCode &status); +}; + +/** A Modifier that does not do anything. */ +class U_I18N_API EmptyModifier : public Modifier, public UMemory { + public: + explicit EmptyModifier(bool isStrong) : fStrong(isStrong) {} + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE { + (void)output; + (void)leftIndex; + (void)rightIndex; + (void)status; + return 0; + } + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE { + (void)status; + return 0; + } + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE { + (void)status; + return 0; + } + + bool isStrong() const U_OVERRIDE { + return fStrong; + } + + private: + bool fStrong; +}; + +/** + * A ParameterizedModifier by itself is NOT a Modifier. Rather, it wraps a data structure containing two or more + * Modifiers and returns the modifier appropriate for the current situation. + */ +class U_I18N_API ParameterizedModifier : public UMemory { + public: + // NOTE: mods is zero-initialized (to nullptr) + ParameterizedModifier() : mods() { + } + + // No copying! + ParameterizedModifier(const ParameterizedModifier &other) = delete; + + ~ParameterizedModifier() { + for (const Modifier *mod : mods) { + delete mod; + } + } + + void adoptPositiveNegativeModifiers(const Modifier *positive, const Modifier *negative) { + mods[0] = positive; + mods[1] = negative; + } + + /** The modifier is ADOPTED. */ + void adoptSignPluralModifier(bool isNegative, StandardPlural::Form plural, const Modifier *mod) { + mods[getModIndex(isNegative, plural)] = mod; + } + + /** Returns a reference to the modifier; no ownership change. */ + const Modifier *getModifier(bool isNegative) const { + return mods[isNegative ? 1 : 0]; + } + + /** Returns a reference to the modifier; no ownership change. */ + const Modifier *getModifier(bool isNegative, StandardPlural::Form plural) const { + return mods[getModIndex(isNegative, plural)]; + } + + private: + const Modifier *mods[2 * StandardPlural::COUNT]; + + inline static int32_t getModIndex(bool isNegative, StandardPlural::Form plural) { + return static_cast(plural) * 2 + (isNegative ? 1 : 0); + } +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_MODIFIERS_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_notation.cpp b/deps/icu-small/source/i18n/number_notation.cpp new file mode 100644 index 00000000000000..ff0cd9505de299 --- /dev/null +++ b/deps/icu-small/source/i18n/number_notation.cpp @@ -0,0 +1,75 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "unicode/numberformatter.h" +#include "number_types.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + + +ScientificNotation Notation::scientific() { + // NOTE: ISO C++ does not allow C99 designated initializers. + ScientificSettings settings; + settings.fEngineeringInterval = 1; + settings.fRequireMinInt = false; + settings.fMinExponentDigits = 1; + settings.fExponentSignDisplay = UNUM_SIGN_AUTO; + NotationUnion union_; + union_.scientific = settings; + return {NTN_SCIENTIFIC, union_}; +} + +ScientificNotation Notation::engineering() { + ScientificSettings settings; + settings.fEngineeringInterval = 3; + settings.fRequireMinInt = false; + settings.fMinExponentDigits = 1; + settings.fExponentSignDisplay = UNUM_SIGN_AUTO; + NotationUnion union_; + union_.scientific = settings; + return {NTN_SCIENTIFIC, union_}; +} + +Notation Notation::compactShort() { + NotationUnion union_; + union_.compactStyle = CompactStyle::UNUM_SHORT; + return {NTN_COMPACT, union_}; +} + +Notation Notation::compactLong() { + NotationUnion union_; + union_.compactStyle = CompactStyle::UNUM_LONG; + return {NTN_COMPACT, union_}; +} + +Notation Notation::simple() { + return {}; +} + +ScientificNotation +ScientificNotation::withMinExponentDigits(int32_t minExponentDigits) const { + if (minExponentDigits >= 0 && minExponentDigits < kMaxIntFracSig) { + ScientificSettings settings = fUnion.scientific; + settings.fMinExponentDigits = (int8_t) minExponentDigits; + NotationUnion union_ = {settings}; + return {NTN_SCIENTIFIC, union_}; + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +ScientificNotation +ScientificNotation::withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const { + ScientificSettings settings = fUnion.scientific; + settings.fExponentSignDisplay = exponentSignDisplay; + NotationUnion union_ = {settings}; + return {NTN_SCIENTIFIC, union_}; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_padding.cpp b/deps/icu-small/source/i18n/number_padding.cpp new file mode 100644 index 00000000000000..a478af60541dde --- /dev/null +++ b/deps/icu-small/source/i18n/number_padding.cpp @@ -0,0 +1,84 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "unicode/numberformatter.h" +#include "number_types.h" +#include "number_stringbuilder.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +int32_t +addPaddingHelper(UChar32 paddingCp, int32_t requiredPadding, NumberStringBuilder &string, int32_t index, + UErrorCode &status) { + for (int32_t i = 0; i < requiredPadding; i++) { + // TODO: If appending to the end, this will cause actual insertion operations. Improve. + string.insertCodePoint(index, paddingCp, UNUM_FIELD_COUNT, status); + } + return U16_LENGTH(paddingCp) * requiredPadding; +} + +} + +Padder::Padder(UChar32 cp, int32_t width, UNumberFormatPadPosition position) : fWidth(width) { + fUnion.padding.fCp = cp; + fUnion.padding.fPosition = position; +} + +Padder::Padder(int32_t width) : fWidth(width) {} + +Padder Padder::none() { + return {-1}; +} + +Padder Padder::codePoints(UChar32 cp, int32_t targetWidth, UNumberFormatPadPosition position) { + // TODO: Validate the code point? + if (targetWidth >= 0) { + return {cp, targetWidth, position}; + } else { + return {U_NUMBER_PADDING_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +int32_t Padder::padAndApply(const Modifier &mod1, const Modifier &mod2, + NumberStringBuilder &string, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const { + int32_t modLength = mod1.getCodePointCount(status) + mod2.getCodePointCount(status); + int32_t requiredPadding = fWidth - modLength - string.codePointCount(); + U_ASSERT(leftIndex == 0 && + rightIndex == string.length()); // fix the previous line to remove this assertion + + int length = 0; + if (requiredPadding <= 0) { + // Padding is not required. + length += mod1.apply(string, leftIndex, rightIndex, status); + length += mod2.apply(string, leftIndex, rightIndex + length, status); + return length; + } + + PadPosition position = fUnion.padding.fPosition; + UChar32 paddingCp = fUnion.padding.fCp; + if (position == UNUM_PAD_AFTER_PREFIX) { + length += addPaddingHelper(paddingCp, requiredPadding, string, leftIndex, status); + } else if (position == UNUM_PAD_BEFORE_SUFFIX) { + length += addPaddingHelper(paddingCp, requiredPadding, string, rightIndex + length, status); + } + length += mod1.apply(string, leftIndex, rightIndex + length, status); + length += mod2.apply(string, leftIndex, rightIndex + length, status); + if (position == UNUM_PAD_BEFORE_PREFIX) { + length += addPaddingHelper(paddingCp, requiredPadding, string, leftIndex, status); + } else if (position == UNUM_PAD_AFTER_SUFFIX) { + length += addPaddingHelper(paddingCp, requiredPadding, string, rightIndex + length, status); + } + + return length; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_patternmodifier.cpp b/deps/icu-small/source/i18n/number_patternmodifier.cpp new file mode 100644 index 00000000000000..0599f92a4f343b --- /dev/null +++ b/deps/icu-small/source/i18n/number_patternmodifier.cpp @@ -0,0 +1,351 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "cstring.h" +#include "number_patternmodifier.h" +#include "unicode/dcfmtsym.h" +#include "unicode/ucurr.h" +#include "unicode/unistr.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +MutablePatternModifier::MutablePatternModifier(bool isStrong) : fStrong(isStrong) {} + +void MutablePatternModifier::setPatternInfo(const AffixPatternProvider *patternInfo) { + this->patternInfo = patternInfo; +} + +void MutablePatternModifier::setPatternAttributes(UNumberSignDisplay signDisplay, bool perMille) { + this->signDisplay = signDisplay; + this->perMilleReplacesPercent = perMille; +} + +void +MutablePatternModifier::setSymbols(const DecimalFormatSymbols *symbols, const CurrencyUnit ¤cy, + const UNumberUnitWidth unitWidth, const PluralRules *rules) { + U_ASSERT((rules != nullptr) == needsPlurals()); + this->symbols = symbols; + uprv_memcpy(static_cast(this->currencyCode), + currency.getISOCurrency(), + sizeof(char16_t) * 4); + this->unitWidth = unitWidth; + this->rules = rules; +} + +void MutablePatternModifier::setNumberProperties(bool isNegative, StandardPlural::Form plural) { + this->isNegative = isNegative; + this->plural = plural; +} + +bool MutablePatternModifier::needsPlurals() const { + UErrorCode statusLocal = U_ZERO_ERROR; + return patternInfo->containsSymbolType(AffixPatternType::TYPE_CURRENCY_TRIPLE, statusLocal); + // Silently ignore any error codes. +} + +ImmutablePatternModifier *MutablePatternModifier::createImmutable(UErrorCode &status) { + return createImmutableAndChain(nullptr, status); +} + +ImmutablePatternModifier * +MutablePatternModifier::createImmutableAndChain(const MicroPropsGenerator *parent, UErrorCode &status) { + + // TODO: Move StandardPlural VALUES to standardplural.h + static const StandardPlural::Form STANDARD_PLURAL_VALUES[] = { + StandardPlural::Form::ZERO, + StandardPlural::Form::ONE, + StandardPlural::Form::TWO, + StandardPlural::Form::FEW, + StandardPlural::Form::MANY, + StandardPlural::Form::OTHER}; + + auto pm = new ParameterizedModifier(); + if (pm == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return nullptr; + } + + if (needsPlurals()) { + // Slower path when we require the plural keyword. + for (StandardPlural::Form plural : STANDARD_PLURAL_VALUES) { + setNumberProperties(false, plural); + pm->adoptSignPluralModifier(false, plural, createConstantModifier(status)); + setNumberProperties(true, plural); + pm->adoptSignPluralModifier(true, plural, createConstantModifier(status)); + } + if (U_FAILURE(status)) { + delete pm; + return nullptr; + } + return new ImmutablePatternModifier(pm, rules, parent); // adopts pm + } else { + // Faster path when plural keyword is not needed. + setNumberProperties(false, StandardPlural::Form::COUNT); + Modifier *positive = createConstantModifier(status); + setNumberProperties(true, StandardPlural::Form::COUNT); + Modifier *negative = createConstantModifier(status); + pm->adoptPositiveNegativeModifiers(positive, negative); + if (U_FAILURE(status)) { + delete pm; + return nullptr; + } + return new ImmutablePatternModifier(pm, nullptr, parent); // adopts pm + } +} + +ConstantMultiFieldModifier *MutablePatternModifier::createConstantModifier(UErrorCode &status) { + NumberStringBuilder a; + NumberStringBuilder b; + insertPrefix(a, 0, status); + insertSuffix(b, 0, status); + if (patternInfo->hasCurrencySign()) { + return new CurrencySpacingEnabledModifier(a, b, fStrong, *symbols, status); + } else { + return new ConstantMultiFieldModifier(a, b, fStrong); + } +} + +ImmutablePatternModifier::ImmutablePatternModifier(ParameterizedModifier *pm, const PluralRules *rules, + const MicroPropsGenerator *parent) + : pm(pm), rules(rules), parent(parent) {} + +void ImmutablePatternModifier::processQuantity(DecimalQuantity &quantity, MicroProps µs, + UErrorCode &status) const { + parent->processQuantity(quantity, micros, status); + applyToMicros(micros, quantity); +} + +void ImmutablePatternModifier::applyToMicros(MicroProps µs, DecimalQuantity &quantity) const { + if (rules == nullptr) { + micros.modMiddle = pm->getModifier(quantity.isNegative()); + } else { + // TODO: Fix this. Avoid the copy. + DecimalQuantity copy(quantity); + copy.roundToInfinity(); + StandardPlural::Form plural = copy.getStandardPlural(rules); + micros.modMiddle = pm->getModifier(quantity.isNegative(), plural); + } +} + +/** Used by the unsafe code path. */ +MicroPropsGenerator &MutablePatternModifier::addToChain(const MicroPropsGenerator *parent) { + this->parent = parent; + return *this; +} + +void MutablePatternModifier::processQuantity(DecimalQuantity &fq, MicroProps µs, + UErrorCode &status) const { + parent->processQuantity(fq, micros, status); + // The unsafe code path performs self-mutation, so we need a const_cast. + // This method needs to be const because it overrides a const method in the parent class. + auto nonConstThis = const_cast(this); + if (needsPlurals()) { + // TODO: Fix this. Avoid the copy. + DecimalQuantity copy(fq); + micros.rounding.apply(copy, status); + nonConstThis->setNumberProperties(fq.isNegative(), copy.getStandardPlural(rules)); + } else { + nonConstThis->setNumberProperties(fq.isNegative(), StandardPlural::Form::COUNT); + } + micros.modMiddle = this; +} + +int32_t MutablePatternModifier::apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const { + // The unsafe code path performs self-mutation, so we need a const_cast. + // This method needs to be const because it overrides a const method in the parent class. + auto nonConstThis = const_cast(this); + int32_t prefixLen = nonConstThis->insertPrefix(output, leftIndex, status); + int32_t suffixLen = nonConstThis->insertSuffix(output, rightIndex + prefixLen, status); + CurrencySpacingEnabledModifier::applyCurrencySpacing( + output, leftIndex, prefixLen, rightIndex + prefixLen, suffixLen, *symbols, status); + return prefixLen + suffixLen; +} + +int32_t MutablePatternModifier::getPrefixLength(UErrorCode &status) const { + // The unsafe code path performs self-mutation, so we need a const_cast. + // This method needs to be const because it overrides a const method in the parent class. + auto nonConstThis = const_cast(this); + + // Enter and exit CharSequence Mode to get the length. + nonConstThis->enterCharSequenceMode(true); + int result = AffixUtils::unescapedCodePointCount(*this, *this, status); // prefix length + nonConstThis->exitCharSequenceMode(); + return result; +} + +int32_t MutablePatternModifier::getCodePointCount(UErrorCode &status) const { + // The unsafe code path performs self-mutation, so we need a const_cast. + // This method needs to be const because it overrides a const method in the parent class. + auto nonConstThis = const_cast(this); + + // Enter and exit CharSequence Mode to get the length. + nonConstThis->enterCharSequenceMode(true); + int result = AffixUtils::unescapedCodePointCount(*this, *this, status); // prefix length + nonConstThis->exitCharSequenceMode(); + nonConstThis->enterCharSequenceMode(false); + result += AffixUtils::unescapedCodePointCount(*this, *this, status); // suffix length + nonConstThis->exitCharSequenceMode(); + return result; +} + +bool MutablePatternModifier::isStrong() const { + return fStrong; +} + +int32_t MutablePatternModifier::insertPrefix(NumberStringBuilder &sb, int position, UErrorCode &status) { + enterCharSequenceMode(true); + int length = AffixUtils::unescape(*this, sb, position, *this, status); + exitCharSequenceMode(); + return length; +} + +int32_t MutablePatternModifier::insertSuffix(NumberStringBuilder &sb, int position, UErrorCode &status) { + enterCharSequenceMode(false); + int length = AffixUtils::unescape(*this, sb, position, *this, status); + exitCharSequenceMode(); + return length; +} + +UnicodeString MutablePatternModifier::getSymbol(AffixPatternType type) const { + switch (type) { + case AffixPatternType::TYPE_MINUS_SIGN: + return symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kMinusSignSymbol); + case AffixPatternType::TYPE_PLUS_SIGN: + return symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPlusSignSymbol); + case AffixPatternType::TYPE_PERCENT: + return symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPercentSymbol); + case AffixPatternType::TYPE_PERMILLE: + return symbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPerMillSymbol); + case AffixPatternType::TYPE_CURRENCY_SINGLE: { + // UnitWidth ISO and HIDDEN overrides the singular currency symbol. + if (unitWidth == UNumberUnitWidth::UNUM_UNIT_WIDTH_ISO_CODE) { + return UnicodeString(currencyCode, 3); + } else if (unitWidth == UNumberUnitWidth::UNUM_UNIT_WIDTH_HIDDEN) { + return UnicodeString(); + } else { + UErrorCode status = U_ZERO_ERROR; + UBool isChoiceFormat = FALSE; + int32_t symbolLen = 0; + const char16_t *symbol = ucurr_getName( + currencyCode, + symbols->getLocale().getName(), + UCurrNameStyle::UCURR_SYMBOL_NAME, + &isChoiceFormat, + &symbolLen, + &status); + return UnicodeString(symbol, symbolLen); + } + } + case AffixPatternType::TYPE_CURRENCY_DOUBLE: + return UnicodeString(currencyCode, 3); + case AffixPatternType::TYPE_CURRENCY_TRIPLE: { + // NOTE: This is the code path only for patterns containing "¤¤¤". + // Plural currencies set via the API are formatted in LongNameHandler. + // This code path is used by DecimalFormat via CurrencyPluralInfo. + U_ASSERT(plural != StandardPlural::Form::COUNT); + UErrorCode status = U_ZERO_ERROR; + UBool isChoiceFormat = FALSE; + int32_t symbolLen = 0; + const char16_t *symbol = ucurr_getPluralName( + currencyCode, + symbols->getLocale().getName(), + &isChoiceFormat, + StandardPlural::getKeyword(plural), + &symbolLen, + &status); + return UnicodeString(symbol, symbolLen); + } + case AffixPatternType::TYPE_CURRENCY_QUAD: + return UnicodeString(u"\uFFFD"); + case AffixPatternType::TYPE_CURRENCY_QUINT: + return UnicodeString(u"\uFFFD"); + default: + U_ASSERT(false); + return UnicodeString(); + } +} + +/** This method contains the heart of the logic for rendering LDML affix strings. */ +void MutablePatternModifier::enterCharSequenceMode(bool isPrefix) { + U_ASSERT(!inCharSequenceMode); + inCharSequenceMode = true; + + // Should the output render '+' where '-' would normally appear in the pattern? + plusReplacesMinusSign = !isNegative && ( + signDisplay == UNUM_SIGN_ALWAYS || + signDisplay == UNUM_SIGN_ACCOUNTING_ALWAYS) && + patternInfo->positiveHasPlusSign() == false; + + // Should we use the affix from the negative subpattern? (If not, we will use the positive subpattern.) + bool useNegativeAffixPattern = patternInfo->hasNegativeSubpattern() && ( + isNegative || (patternInfo->negativeHasMinusSign() && plusReplacesMinusSign)); + + // Resolve the flags for the affix pattern. + fFlags = 0; + if (useNegativeAffixPattern) { + fFlags |= AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN; + } + if (isPrefix) { + fFlags |= AffixPatternProvider::AFFIX_PREFIX; + } + if (plural != StandardPlural::Form::COUNT) { + U_ASSERT(plural == (AffixPatternProvider::AFFIX_PLURAL_MASK & plural)); + fFlags |= plural; + } + + // Should we prepend a sign to the pattern? + if (!isPrefix || useNegativeAffixPattern) { + prependSign = false; + } else if (isNegative) { + prependSign = signDisplay != UNUM_SIGN_NEVER; + } else { + prependSign = plusReplacesMinusSign; + } + + // Finally, compute the length of the affix pattern. + fLength = patternInfo->length(fFlags) + (prependSign ? 1 : 0); +} + +void MutablePatternModifier::exitCharSequenceMode() { + U_ASSERT(inCharSequenceMode); + inCharSequenceMode = false; +} + +int32_t MutablePatternModifier::length() const { + U_ASSERT(inCharSequenceMode); + return fLength; +} + +char16_t MutablePatternModifier::charAt(int32_t index) const { + U_ASSERT(inCharSequenceMode); + char16_t candidate; + if (prependSign && index == 0) { + candidate = u'-'; + } else if (prependSign) { + candidate = patternInfo->charAt(fFlags, index - 1); + } else { + candidate = patternInfo->charAt(fFlags, index); + } + if (plusReplacesMinusSign && candidate == u'-') { + return u'+'; + } + if (perMilleReplacesPercent && candidate == u'%') { + return u'‰'; + } + return candidate; +} + +UnicodeString MutablePatternModifier::toUnicodeString() const { + // Never called by AffixUtils + U_ASSERT(false); + return UnicodeString(); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_patternmodifier.h b/deps/icu-small/source/i18n/number_patternmodifier.h new file mode 100644 index 00000000000000..705037f0ba7173 --- /dev/null +++ b/deps/icu-small/source/i18n/number_patternmodifier.h @@ -0,0 +1,259 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_PATTERNMODIFIER_H__ +#define __NUMBER_PATTERNMODIFIER_H__ + +#include "standardplural.h" +#include "unicode/numberformatter.h" +#include "number_patternstring.h" +#include "number_types.h" +#include "number_modifiers.h" +#include "number_utils.h" + +U_NAMESPACE_BEGIN + +// Export an explicit template instantiation of the LocalPointer that is used as a +// data member of ParameterizedModifier. +// (MSVC requires this, even though it should not be necessary.) +#if defined (_MSC_VER) +// Ignore warning 4661 as LocalPointerBase does not use operator== or operator!= +#pragma warning(suppress: 4661) +template class U_I18N_API LocalPointerBase; +template class U_I18N_API LocalPointer; +#endif + +namespace number { +namespace impl { + +// Forward declaration +class MutablePatternModifier; + +// Exported as U_I18N_API because it is needed for the unit test PatternModifierTest +class U_I18N_API ImmutablePatternModifier : public MicroPropsGenerator, public UMemory { + public: + ~ImmutablePatternModifier() U_OVERRIDE = default; + + void processQuantity(DecimalQuantity &, MicroProps µs, UErrorCode &status) const U_OVERRIDE; + + void applyToMicros(MicroProps µs, DecimalQuantity &quantity) const; + + private: + ImmutablePatternModifier(ParameterizedModifier *pm, const PluralRules *rules, const MicroPropsGenerator *parent); + + const LocalPointer pm; + const PluralRules *rules; + const MicroPropsGenerator *parent; + + friend class MutablePatternModifier; +}; + +/** + * This class is a {@link Modifier} that wraps a decimal format pattern. It applies the pattern's affixes in + * {@link Modifier#apply}. + * + *

    + * In addition to being a Modifier, this class contains the business logic for substituting the correct locale symbols + * into the affixes of the decimal format pattern. + * + *

    + * In order to use this class, create a new instance and call the following four setters: {@link #setPatternInfo}, + * {@link #setPatternAttributes}, {@link #setSymbols}, and {@link #setNumberProperties}. After calling these four + * setters, the instance will be ready for use as a Modifier. + * + *

    + * This is a MUTABLE, NON-THREAD-SAFE class designed for performance. Do NOT save references to this or attempt to use + * it from multiple threads! Instead, you can obtain a safe, immutable decimal format pattern modifier by calling + * {@link MutablePatternModifier#createImmutable}, in effect treating this instance as a builder for the immutable + * variant. + */ +class U_I18N_API MutablePatternModifier + : public MicroPropsGenerator, + public Modifier, + public SymbolProvider, + public CharSequence, + public UMemory { + public: + + ~MutablePatternModifier() U_OVERRIDE = default; + + /** + * @param isStrong + * Whether the modifier should be considered strong. For more information, see + * {@link Modifier#isStrong()}. Most of the time, decimal format pattern modifiers should be considered + * as non-strong. + */ + explicit MutablePatternModifier(bool isStrong); + + /** + * Sets a reference to the parsed decimal format pattern, usually obtained from + * {@link PatternStringParser#parseToPatternInfo(String)}, but any implementation of {@link AffixPatternProvider} is + * accepted. + */ + void setPatternInfo(const AffixPatternProvider *patternInfo); + + /** + * Sets attributes that imply changes to the literal interpretation of the pattern string affixes. + * + * @param signDisplay + * Whether to force a plus sign on positive numbers. + * @param perMille + * Whether to substitute the percent sign in the pattern with a permille sign. + */ + void setPatternAttributes(UNumberSignDisplay signDisplay, bool perMille); + + /** + * Sets locale-specific details that affect the symbols substituted into the pattern string affixes. + * + * @param symbols + * The desired instance of DecimalFormatSymbols. + * @param currency + * The currency to be used when substituting currency values into the affixes. + * @param unitWidth + * The width used to render currencies. + * @param rules + * Required if the triple currency sign, "¤¤¤", appears in the pattern, which can be determined from the + * convenience method {@link #needsPlurals()}. + */ + void + setSymbols(const DecimalFormatSymbols *symbols, const CurrencyUnit ¤cy, UNumberUnitWidth unitWidth, + const PluralRules *rules); + + /** + * Sets attributes of the current number being processed. + * + * @param isNegative + * Whether the number is negative. + * @param plural + * The plural form of the number, required only if the pattern contains the triple currency sign, "¤¤¤" + * (and as indicated by {@link #needsPlurals()}). + */ + void setNumberProperties(bool isNegative, StandardPlural::Form plural); + + /** + * Returns true if the pattern represented by this MurkyModifier requires a plural keyword in order to localize. + * This is currently true only if there is a currency long name placeholder in the pattern ("¤¤¤"). + */ + bool needsPlurals() const; + + /** + * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable + * and can be saved for future use. The number properties in the current instance are mutated; all other properties + * are left untouched. + * + *

    + * The resulting modifier cannot be used in a QuantityChain. + * + *

    + * CREATES A NEW HEAP OBJECT; THE CALLER GETS OWNERSHIP. + * + * @return An immutable that supports both positive and negative numbers. + */ + ImmutablePatternModifier *createImmutable(UErrorCode &status); + + /** + * Creates a new quantity-dependent Modifier that behaves the same as the current instance, but which is immutable + * and can be saved for future use. The number properties in the current instance are mutated; all other properties + * are left untouched. + * + *

    + * CREATES A NEW HEAP OBJECT; THE CALLER GETS OWNERSHIP. + * + * @param parent + * The QuantityChain to which to chain this immutable. + * @return An immutable that supports both positive and negative numbers. + */ + ImmutablePatternModifier * + createImmutableAndChain(const MicroPropsGenerator *parent, UErrorCode &status); + + MicroPropsGenerator &addToChain(const MicroPropsGenerator *parent); + + void processQuantity(DecimalQuantity &, MicroProps µs, UErrorCode &status) const U_OVERRIDE; + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE; + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE; + + bool isStrong() const U_OVERRIDE; + + /** + * Returns the string that substitutes a given symbol type in a pattern. + */ + UnicodeString getSymbol(AffixPatternType type) const U_OVERRIDE; + + int32_t length() const U_OVERRIDE; + + char16_t charAt(int32_t index) const U_OVERRIDE; + + // Use default implementation of codePointAt + + UnicodeString toUnicodeString() const U_OVERRIDE; + + private: + // Modifier details (initialized in constructor) + const bool fStrong; + + // Pattern details (initialized in setPatternInfo and setPatternAttributes) + const AffixPatternProvider *patternInfo; + UNumberSignDisplay signDisplay; + bool perMilleReplacesPercent; + + // Symbol details (initialized in setSymbols) + const DecimalFormatSymbols *symbols; + UNumberUnitWidth unitWidth; + char16_t currencyCode[4]; + const PluralRules *rules; + + // Number details (initialized in setNumberProperties) + bool isNegative; + StandardPlural::Form plural; + + // QuantityChain details (initialized in addToChain) + const MicroPropsGenerator *parent; + + // Transient CharSequence fields (initialized in enterCharSequenceMode) + bool inCharSequenceMode = false; + int32_t fFlags; + int32_t fLength; + bool prependSign; + bool plusReplacesMinusSign; + + /** + * Uses the current properties to create a single {@link ConstantMultiFieldModifier} with currency spacing support + * if required. + * + *

    + * CREATES A NEW HEAP OBJECT; THE CALLER GETS OWNERSHIP. + * + * @param a + * A working NumberStringBuilder object; passed from the outside to prevent the need to create many new + * instances if this method is called in a loop. + * @param b + * Another working NumberStringBuilder object. + * @return The constant modifier object. + */ + ConstantMultiFieldModifier *createConstantModifier(UErrorCode &status); + + int32_t insertPrefix(NumberStringBuilder &sb, int position, UErrorCode &status); + + int32_t insertSuffix(NumberStringBuilder &sb, int position, UErrorCode &status); + + void enterCharSequenceMode(bool isPrefix); + + void exitCharSequenceMode(); +}; + + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_PATTERNMODIFIER_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_patternstring.cpp b/deps/icu-small/source/i18n/number_patternstring.cpp new file mode 100644 index 00000000000000..c67e3541816547 --- /dev/null +++ b/deps/icu-small/source/i18n/number_patternstring.cpp @@ -0,0 +1,839 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "uassert.h" +#include "number_patternstring.h" +#include "unicode/utf16.h" +#include "number_utils.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +void PatternParser::parseToPatternInfo(const UnicodeString& patternString, ParsedPatternInfo& patternInfo, UErrorCode &status) { + patternInfo.consumePattern(patternString, status); +} + +DecimalFormatProperties +PatternParser::parseToProperties(const UnicodeString& pattern, IgnoreRounding ignoreRounding, + UErrorCode &status) { + DecimalFormatProperties properties; + parseToExistingPropertiesImpl(pattern, properties, ignoreRounding, status); + return properties; +} + +void PatternParser::parseToExistingProperties(const UnicodeString& pattern, DecimalFormatProperties& properties, + IgnoreRounding ignoreRounding, UErrorCode &status) { + parseToExistingPropertiesImpl(pattern, properties, ignoreRounding, status); +} + +char16_t ParsedPatternInfo::charAt(int32_t flags, int32_t index) const { + const Endpoints &endpoints = getEndpoints(flags); + if (index < 0 || index >= endpoints.end - endpoints.start) { + U_ASSERT(false); + } + return pattern.charAt(endpoints.start + index); +} + +int32_t ParsedPatternInfo::length(int32_t flags) const { + return getLengthFromEndpoints(getEndpoints(flags)); +} + +int32_t ParsedPatternInfo::getLengthFromEndpoints(const Endpoints &endpoints) { + return endpoints.end - endpoints.start; +} + +UnicodeString ParsedPatternInfo::getString(int32_t flags) const { + const Endpoints &endpoints = getEndpoints(flags); + if (endpoints.start == endpoints.end) { + return UnicodeString(); + } + // Create a new UnicodeString + return UnicodeString(pattern, endpoints.start, endpoints.end - endpoints.start); +} + +const Endpoints &ParsedPatternInfo::getEndpoints(int32_t flags) const { + bool prefix = (flags & AFFIX_PREFIX) != 0; + bool isNegative = (flags & AFFIX_NEGATIVE_SUBPATTERN) != 0; + bool padding = (flags & AFFIX_PADDING) != 0; + if (isNegative && padding) { + return negative.paddingEndpoints; + } else if (padding) { + return positive.paddingEndpoints; + } else if (prefix && isNegative) { + return negative.prefixEndpoints; + } else if (prefix) { + return positive.prefixEndpoints; + } else if (isNegative) { + return negative.suffixEndpoints; + } else { + return positive.suffixEndpoints; + } +} + +bool ParsedPatternInfo::positiveHasPlusSign() const { + return positive.hasPlusSign; +} + +bool ParsedPatternInfo::hasNegativeSubpattern() const { + return fHasNegativeSubpattern; +} + +bool ParsedPatternInfo::negativeHasMinusSign() const { + return negative.hasMinusSign; +} + +bool ParsedPatternInfo::hasCurrencySign() const { + return positive.hasCurrencySign || (fHasNegativeSubpattern && negative.hasCurrencySign); +} + +bool ParsedPatternInfo::containsSymbolType(AffixPatternType type, UErrorCode &status) const { + return AffixUtils::containsType(UnicodeStringCharSequence(pattern), type, status); +} + +///////////////////////////////////////////////////// +/// BEGIN RECURSIVE DESCENT PARSER IMPLEMENTATION /// +///////////////////////////////////////////////////// + +UChar32 ParsedPatternInfo::ParserState::peek() { + if (offset == pattern.length()) { + return -1; + } else { + return pattern.char32At(offset); + } +} + +UChar32 ParsedPatternInfo::ParserState::next() { + int codePoint = peek(); + offset += U16_LENGTH(codePoint); + return codePoint; +} + +void ParsedPatternInfo::consumePattern(const UnicodeString& patternString, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + this->pattern = patternString; + + // pattern := subpattern (';' subpattern)? + currentSubpattern = &positive; + consumeSubpattern(status); + if (U_FAILURE(status)) { return; } + if (state.peek() == u';') { + state.next(); // consume the ';' + // Don't consume the negative subpattern if it is empty (trailing ';') + if (state.peek() != -1) { + fHasNegativeSubpattern = true; + currentSubpattern = &negative; + consumeSubpattern(status); + if (U_FAILURE(status)) { return; } + } + } + if (state.peek() != -1) { + state.toParseException(u"Found unquoted special character"); + status = U_UNQUOTED_SPECIAL; + } +} + +void ParsedPatternInfo::consumeSubpattern(UErrorCode &status) { + // subpattern := literals? number exponent? literals? + consumePadding(PadPosition::UNUM_PAD_BEFORE_PREFIX, status); + if (U_FAILURE(status)) { return; } + consumeAffix(currentSubpattern->prefixEndpoints, status); + if (U_FAILURE(status)) { return; } + consumePadding(PadPosition::UNUM_PAD_AFTER_PREFIX, status); + if (U_FAILURE(status)) { return; } + consumeFormat(status); + if (U_FAILURE(status)) { return; } + consumeExponent(status); + if (U_FAILURE(status)) { return; } + consumePadding(PadPosition::UNUM_PAD_BEFORE_SUFFIX, status); + if (U_FAILURE(status)) { return; } + consumeAffix(currentSubpattern->suffixEndpoints, status); + if (U_FAILURE(status)) { return; } + consumePadding(PadPosition::UNUM_PAD_AFTER_SUFFIX, status); + if (U_FAILURE(status)) { return; } +} + +void ParsedPatternInfo::consumePadding(PadPosition paddingLocation, UErrorCode &status) { + if (state.peek() != u'*') { + return; + } + if (!currentSubpattern->paddingLocation.isNull()) { + state.toParseException(u"Cannot have multiple pad specifiers"); + status = U_MULTIPLE_PAD_SPECIFIERS; + return; + } + currentSubpattern->paddingLocation = paddingLocation; + state.next(); // consume the '*' + currentSubpattern->paddingEndpoints.start = state.offset; + consumeLiteral(status); + currentSubpattern->paddingEndpoints.end = state.offset; +} + +void ParsedPatternInfo::consumeAffix(Endpoints &endpoints, UErrorCode &status) { + // literals := { literal } + endpoints.start = state.offset; + while (true) { + switch (state.peek()) { + case u'#': + case u'@': + case u';': + case u'*': + case u'.': + case u',': + case u'0': + case u'1': + case u'2': + case u'3': + case u'4': + case u'5': + case u'6': + case u'7': + case u'8': + case u'9': + case -1: + // Characters that cannot appear unquoted in a literal + // break outer; + goto after_outer; + + case u'%': + currentSubpattern->hasPercentSign = true; + break; + + case u'‰': + currentSubpattern->hasPerMilleSign = true; + break; + + case u'¤': + currentSubpattern->hasCurrencySign = true; + break; + + case u'-': + currentSubpattern->hasMinusSign = true; + break; + + case u'+': + currentSubpattern->hasPlusSign = true; + break; + + default: + break; + } + consumeLiteral(status); + if (U_FAILURE(status)) { return; } + } + after_outer: + endpoints.end = state.offset; +} + +void ParsedPatternInfo::consumeLiteral(UErrorCode &status) { + if (state.peek() == -1) { + state.toParseException(u"Expected unquoted literal but found EOL"); + status = U_PATTERN_SYNTAX_ERROR; + return; + } else if (state.peek() == u'\'') { + state.next(); // consume the starting quote + while (state.peek() != u'\'') { + if (state.peek() == -1) { + state.toParseException(u"Expected quoted literal but found EOL"); + status = U_PATTERN_SYNTAX_ERROR; + return; + } else { + state.next(); // consume a quoted character + } + } + state.next(); // consume the ending quote + } else { + // consume a non-quoted literal character + state.next(); + } +} + +void ParsedPatternInfo::consumeFormat(UErrorCode &status) { + consumeIntegerFormat(status); + if (U_FAILURE(status)) { return; } + if (state.peek() == u'.') { + state.next(); // consume the decimal point + currentSubpattern->hasDecimal = true; + currentSubpattern->widthExceptAffixes += 1; + consumeFractionFormat(status); + if (U_FAILURE(status)) { return; } + } +} + +void ParsedPatternInfo::consumeIntegerFormat(UErrorCode &status) { + // Convenience reference: + ParsedSubpatternInfo &result = *currentSubpattern; + + while (true) { + switch (state.peek()) { + case u',': + result.widthExceptAffixes += 1; + result.groupingSizes <<= 16; + break; + + case u'#': + if (result.integerNumerals > 0) { + state.toParseException(u"# cannot follow 0 before decimal point"); + status = U_UNEXPECTED_TOKEN; + return; + } + result.widthExceptAffixes += 1; + result.groupingSizes += 1; + if (result.integerAtSigns > 0) { + result.integerTrailingHashSigns += 1; + } else { + result.integerLeadingHashSigns += 1; + } + result.integerTotal += 1; + break; + + case u'@': + if (result.integerNumerals > 0) { + state.toParseException(u"Cannot mix 0 and @"); + status = U_UNEXPECTED_TOKEN; + return; + } + if (result.integerTrailingHashSigns > 0) { + state.toParseException(u"Cannot nest # inside of a run of @"); + status = U_UNEXPECTED_TOKEN; + return; + } + result.widthExceptAffixes += 1; + result.groupingSizes += 1; + result.integerAtSigns += 1; + result.integerTotal += 1; + break; + + case u'0': + case u'1': + case u'2': + case u'3': + case u'4': + case u'5': + case u'6': + case u'7': + case u'8': + case u'9': + if (result.integerAtSigns > 0) { + state.toParseException(u"Cannot mix @ and 0"); + status = U_UNEXPECTED_TOKEN; + return; + } + result.widthExceptAffixes += 1; + result.groupingSizes += 1; + result.integerNumerals += 1; + result.integerTotal += 1; + if (!result.rounding.isZero() || state.peek() != u'0') { + result.rounding.appendDigit(static_cast(state.peek() - u'0'), 0, true); + } + break; + + default: + goto after_outer; + } + state.next(); // consume the symbol + } + + after_outer: + // Disallow patterns with a trailing ',' or with two ',' next to each other + auto grouping1 = static_cast (result.groupingSizes & 0xffff); + auto grouping2 = static_cast ((result.groupingSizes >> 16) & 0xffff); + auto grouping3 = static_cast ((result.groupingSizes >> 32) & 0xffff); + if (grouping1 == 0 && grouping2 != -1) { + state.toParseException(u"Trailing grouping separator is invalid"); + status = U_UNEXPECTED_TOKEN; + return; + } + if (grouping2 == 0 && grouping3 != -1) { + state.toParseException(u"Grouping width of zero is invalid"); + status = U_PATTERN_SYNTAX_ERROR; + return; + } +} + +void ParsedPatternInfo::consumeFractionFormat(UErrorCode &status) { + // Convenience reference: + ParsedSubpatternInfo &result = *currentSubpattern; + + int32_t zeroCounter = 0; + while (true) { + switch (state.peek()) { + case u'#': + result.widthExceptAffixes += 1; + result.fractionHashSigns += 1; + result.fractionTotal += 1; + zeroCounter++; + break; + + case u'0': + case u'1': + case u'2': + case u'3': + case u'4': + case u'5': + case u'6': + case u'7': + case u'8': + case u'9': + if (result.fractionHashSigns > 0) { + state.toParseException(u"0 cannot follow # after decimal point"); + status = U_UNEXPECTED_TOKEN; + return; + } + result.widthExceptAffixes += 1; + result.fractionNumerals += 1; + result.fractionTotal += 1; + if (state.peek() == u'0') { + zeroCounter++; + } else { + result.rounding + .appendDigit(static_cast(state.peek() - u'0'), zeroCounter, false); + zeroCounter = 0; + } + break; + + default: + return; + } + state.next(); // consume the symbol + } +} + +void ParsedPatternInfo::consumeExponent(UErrorCode &status) { + // Convenience reference: + ParsedSubpatternInfo &result = *currentSubpattern; + + if (state.peek() != u'E') { + return; + } + if ((result.groupingSizes & 0xffff0000L) != 0xffff0000L) { + state.toParseException(u"Cannot have grouping separator in scientific notation"); + status = U_MALFORMED_EXPONENTIAL_PATTERN; + return; + } + state.next(); // consume the E + result.widthExceptAffixes++; + if (state.peek() == u'+') { + state.next(); // consume the + + result.exponentHasPlusSign = true; + result.widthExceptAffixes++; + } + while (state.peek() == u'0') { + state.next(); // consume the 0 + result.exponentZeros += 1; + result.widthExceptAffixes++; + } +} + +/////////////////////////////////////////////////// +/// END RECURSIVE DESCENT PARSER IMPLEMENTATION /// +/////////////////////////////////////////////////// + +void +PatternParser::parseToExistingPropertiesImpl(const UnicodeString& pattern, DecimalFormatProperties &properties, + IgnoreRounding ignoreRounding, UErrorCode &status) { + if (pattern.length() == 0) { + // Backwards compatibility requires that we reset to the default values. + // TODO: Only overwrite the properties that "saveToProperties" normally touches? + properties.clear(); + return; + } + + ParsedPatternInfo patternInfo; + parseToPatternInfo(pattern, patternInfo, status); + if (U_FAILURE(status)) { return; } + patternInfoToProperties(properties, patternInfo, ignoreRounding, status); +} + +void PatternParser::patternInfoToProperties(DecimalFormatProperties &properties, + ParsedPatternInfo& patternInfo, + IgnoreRounding _ignoreRounding, UErrorCode &status) { + // Translate from PatternParseResult to Properties. + // Note that most data from "negative" is ignored per the specification of DecimalFormat. + + const ParsedSubpatternInfo &positive = patternInfo.positive; + + bool ignoreRounding; + if (_ignoreRounding == IGNORE_ROUNDING_NEVER) { + ignoreRounding = false; + } else if (_ignoreRounding == IGNORE_ROUNDING_IF_CURRENCY) { + ignoreRounding = positive.hasCurrencySign; + } else { + U_ASSERT(_ignoreRounding == IGNORE_ROUNDING_ALWAYS); + ignoreRounding = true; + } + + // Grouping settings + auto grouping1 = static_cast (positive.groupingSizes & 0xffff); + auto grouping2 = static_cast ((positive.groupingSizes >> 16) & 0xffff); + auto grouping3 = static_cast ((positive.groupingSizes >> 32) & 0xffff); + if (grouping2 != -1) { + properties.groupingSize = grouping1; + } else { + properties.groupingSize = -1; + } + if (grouping3 != -1) { + properties.secondaryGroupingSize = grouping2; + } else { + properties.secondaryGroupingSize = -1; + } + + // For backwards compatibility, require that the pattern emit at least one min digit. + int minInt, minFrac; + if (positive.integerTotal == 0 && positive.fractionTotal > 0) { + // patterns like ".##" + minInt = 0; + minFrac = uprv_max(1, positive.fractionNumerals); + } else if (positive.integerNumerals == 0 && positive.fractionNumerals == 0) { + // patterns like "#.##" + minInt = 1; + minFrac = 0; + } else { + minInt = positive.integerNumerals; + minFrac = positive.fractionNumerals; + } + + // Rounding settings + // Don't set basic rounding when there is a currency sign; defer to CurrencyUsage + if (positive.integerAtSigns > 0) { + properties.minimumFractionDigits = -1; + properties.maximumFractionDigits = -1; + properties.roundingIncrement = 0.0; + properties.minimumSignificantDigits = positive.integerAtSigns; + properties.maximumSignificantDigits = + positive.integerAtSigns + positive.integerTrailingHashSigns; + } else if (!positive.rounding.isZero()) { + if (!ignoreRounding) { + properties.minimumFractionDigits = minFrac; + properties.maximumFractionDigits = positive.fractionTotal; + properties.roundingIncrement = positive.rounding.toDouble(); + } else { + properties.minimumFractionDigits = -1; + properties.maximumFractionDigits = -1; + properties.roundingIncrement = 0.0; + } + properties.minimumSignificantDigits = -1; + properties.maximumSignificantDigits = -1; + } else { + if (!ignoreRounding) { + properties.minimumFractionDigits = minFrac; + properties.maximumFractionDigits = positive.fractionTotal; + properties.roundingIncrement = 0.0; + } else { + properties.minimumFractionDigits = -1; + properties.maximumFractionDigits = -1; + properties.roundingIncrement = 0.0; + } + properties.minimumSignificantDigits = -1; + properties.maximumSignificantDigits = -1; + } + + // If the pattern ends with a '.' then force the decimal point. + if (positive.hasDecimal && positive.fractionTotal == 0) { + properties.decimalSeparatorAlwaysShown = true; + } else { + properties.decimalSeparatorAlwaysShown = false; + } + + // Scientific notation settings + if (positive.exponentZeros > 0) { + properties.exponentSignAlwaysShown = positive.exponentHasPlusSign; + properties.minimumExponentDigits = positive.exponentZeros; + if (positive.integerAtSigns == 0) { + // patterns without '@' can define max integer digits, used for engineering notation + properties.minimumIntegerDigits = positive.integerNumerals; + properties.maximumIntegerDigits = positive.integerTotal; + } else { + // patterns with '@' cannot define max integer digits + properties.minimumIntegerDigits = 1; + properties.maximumIntegerDigits = -1; + } + } else { + properties.exponentSignAlwaysShown = false; + properties.minimumExponentDigits = -1; + properties.minimumIntegerDigits = minInt; + properties.maximumIntegerDigits = -1; + } + + // Compute the affix patterns (required for both padding and affixes) + UnicodeString posPrefix = patternInfo.getString(AffixPatternProvider::AFFIX_PREFIX); + UnicodeString posSuffix = patternInfo.getString(0); + + // Padding settings + if (!positive.paddingLocation.isNull()) { + // The width of the positive prefix and suffix templates are included in the padding + int paddingWidth = + positive.widthExceptAffixes + AffixUtils::estimateLength(UnicodeStringCharSequence(posPrefix), status) + + AffixUtils::estimateLength(UnicodeStringCharSequence(posSuffix), status); + properties.formatWidth = paddingWidth; + UnicodeString rawPaddingString = patternInfo.getString(AffixPatternProvider::AFFIX_PADDING); + if (rawPaddingString.length() == 1) { + properties.padString = rawPaddingString; + } else if (rawPaddingString.length() == 2) { + if (rawPaddingString.charAt(0) == u'\'') { + properties.padString.setTo(u"'", -1); + } else { + properties.padString = rawPaddingString; + } + } else { + properties.padString = UnicodeString(rawPaddingString, 1, rawPaddingString.length() - 2); + } + properties.padPosition = positive.paddingLocation; + } else { + properties.formatWidth = -1; + properties.padString.setToBogus(); + properties.padPosition.nullify(); + } + + // Set the affixes + // Always call the setter, even if the prefixes are empty, especially in the case of the + // negative prefix pattern, to prevent default values from overriding the pattern. + properties.positivePrefixPattern = posPrefix; + properties.positiveSuffixPattern = posSuffix; + if (patternInfo.fHasNegativeSubpattern) { + properties.negativePrefixPattern = patternInfo.getString( + AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN | AffixPatternProvider::AFFIX_PREFIX); + properties.negativeSuffixPattern = patternInfo.getString( + AffixPatternProvider::AFFIX_NEGATIVE_SUBPATTERN); + } else { + properties.negativePrefixPattern.setToBogus(); + properties.negativeSuffixPattern.setToBogus(); + } + + // Set the magnitude multiplier + if (positive.hasPercentSign) { + properties.magnitudeMultiplier = 2; + } else if (positive.hasPerMilleSign) { + properties.magnitudeMultiplier = 3; + } else { + properties.magnitudeMultiplier = 0; + } +} + +/////////////////////////////////////////////////////////////////// +/// End PatternStringParser.java; begin PatternStringUtils.java /// +/////////////////////////////////////////////////////////////////// + +UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatProperties &properties, + UErrorCode &status) { + UnicodeString sb; + + // Convenience references + // The uprv_min() calls prevent DoS + int dosMax = 100; + int groupingSize = uprv_min(properties.secondaryGroupingSize, dosMax); + int firstGroupingSize = uprv_min(properties.groupingSize, dosMax); + int paddingWidth = uprv_min(properties.formatWidth, dosMax); + NullableValue paddingLocation = properties.padPosition; + UnicodeString paddingString = properties.padString; + int minInt = uprv_max(uprv_min(properties.minimumIntegerDigits, dosMax), 0); + int maxInt = uprv_min(properties.maximumIntegerDigits, dosMax); + int minFrac = uprv_max(uprv_min(properties.minimumFractionDigits, dosMax), 0); + int maxFrac = uprv_min(properties.maximumFractionDigits, dosMax); + int minSig = uprv_min(properties.minimumSignificantDigits, dosMax); + int maxSig = uprv_min(properties.maximumSignificantDigits, dosMax); + bool alwaysShowDecimal = properties.decimalSeparatorAlwaysShown; + int exponentDigits = uprv_min(properties.minimumExponentDigits, dosMax); + bool exponentShowPlusSign = properties.exponentSignAlwaysShown; + UnicodeString pp = properties.positivePrefix; + UnicodeString ppp = properties.positivePrefixPattern; + UnicodeString ps = properties.positiveSuffix; + UnicodeString psp = properties.positiveSuffixPattern; + UnicodeString np = properties.negativePrefix; + UnicodeString npp = properties.negativePrefixPattern; + UnicodeString ns = properties.negativeSuffix; + UnicodeString nsp = properties.negativeSuffixPattern; + + // Prefixes + if (!ppp.isBogus()) { + sb.append(ppp); + } + sb.append(AffixUtils::escape(UnicodeStringCharSequence(pp))); + int afterPrefixPos = sb.length(); + + // Figure out the grouping sizes. + int grouping1, grouping2, grouping; + if (groupingSize != uprv_min(dosMax, -1) && firstGroupingSize != uprv_min(dosMax, -1) && + groupingSize != firstGroupingSize) { + grouping = groupingSize; + grouping1 = groupingSize; + grouping2 = firstGroupingSize; + } else if (groupingSize != uprv_min(dosMax, -1)) { + grouping = groupingSize; + grouping1 = 0; + grouping2 = groupingSize; + } else if (firstGroupingSize != uprv_min(dosMax, -1)) { + grouping = groupingSize; + grouping1 = 0; + grouping2 = firstGroupingSize; + } else { + grouping = 0; + grouping1 = 0; + grouping2 = 0; + } + int groupingLength = grouping1 + grouping2 + 1; + + // Figure out the digits we need to put in the pattern. + double roundingInterval = properties.roundingIncrement; + UnicodeString digitsString; + int digitsStringScale = 0; + if (maxSig != uprv_min(dosMax, -1)) { + // Significant Digits. + while (digitsString.length() < minSig) { + digitsString.append(u'@'); + } + while (digitsString.length() < maxSig) { + digitsString.append(u'#'); + } + } else if (roundingInterval != 0.0) { + // Rounding Interval. + digitsStringScale = minFrac; + // TODO: Check for DoS here? + DecimalQuantity incrementQuantity; + incrementQuantity.setToDouble(roundingInterval); + incrementQuantity.adjustMagnitude(minFrac); + incrementQuantity.roundToMagnitude(0, kDefaultMode, status); + UnicodeString str = incrementQuantity.toPlainString(); + if (str.charAt(0) == u'-') { + // TODO: Unsupported operation exception or fail silently? + digitsString.append(str, 1, str.length() - 1); + } else { + digitsString.append(str); + } + } + while (digitsString.length() + digitsStringScale < minInt) { + digitsString.insert(0, u'0'); + } + while (-digitsStringScale < minFrac) { + digitsString.append(u'0'); + digitsStringScale--; + } + + // Write the digits to the string builder + int m0 = uprv_max(groupingLength, digitsString.length() + digitsStringScale); + m0 = (maxInt != dosMax) ? uprv_max(maxInt, m0) - 1 : m0 - 1; + int mN = (maxFrac != dosMax) ? uprv_min(-maxFrac, digitsStringScale) : digitsStringScale; + for (int magnitude = m0; magnitude >= mN; magnitude--) { + int di = digitsString.length() + digitsStringScale - magnitude - 1; + if (di < 0 || di >= digitsString.length()) { + sb.append(u'#'); + } else { + sb.append(digitsString.charAt(di)); + } + if (magnitude > grouping2 && grouping > 0 && (magnitude - grouping2) % grouping == 0) { + sb.append(u','); + } else if (magnitude > 0 && magnitude == grouping2) { + sb.append(u','); + } else if (magnitude == 0 && (alwaysShowDecimal || mN < 0)) { + sb.append(u'.'); + } + } + + // Exponential notation + if (exponentDigits != uprv_min(dosMax, -1)) { + sb.append(u'E'); + if (exponentShowPlusSign) { + sb.append(u'+'); + } + for (int i = 0; i < exponentDigits; i++) { + sb.append(u'0'); + } + } + + // Suffixes + int beforeSuffixPos = sb.length(); + if (!psp.isBogus()) { + sb.append(psp); + } + sb.append(AffixUtils::escape(UnicodeStringCharSequence(ps))); + + // Resolve Padding + if (paddingWidth != -1 && !paddingLocation.isNull()) { + while (paddingWidth - sb.length() > 0) { + sb.insert(afterPrefixPos, u'#'); + beforeSuffixPos++; + } + int addedLength; + switch (paddingLocation.get(status)) { + case PadPosition::UNUM_PAD_BEFORE_PREFIX: + addedLength = escapePaddingString(paddingString, sb, 0, status); + sb.insert(0, u'*'); + afterPrefixPos += addedLength + 1; + beforeSuffixPos += addedLength + 1; + break; + case PadPosition::UNUM_PAD_AFTER_PREFIX: + addedLength = escapePaddingString(paddingString, sb, afterPrefixPos, status); + sb.insert(afterPrefixPos, u'*'); + afterPrefixPos += addedLength + 1; + beforeSuffixPos += addedLength + 1; + break; + case PadPosition::UNUM_PAD_BEFORE_SUFFIX: + escapePaddingString(paddingString, sb, beforeSuffixPos, status); + sb.insert(beforeSuffixPos, u'*'); + break; + case PadPosition::UNUM_PAD_AFTER_SUFFIX: + sb.append(u'*'); + escapePaddingString(paddingString, sb, sb.length(), status); + break; + } + if (U_FAILURE(status)) { return sb; } + } + + // Negative affixes + // Ignore if the negative prefix pattern is "-" and the negative suffix is empty + if (!np.isBogus() || !ns.isBogus() || (npp.isBogus() && !nsp.isBogus()) || + (!npp.isBogus() && (npp.length() != 1 || npp.charAt(0) != u'-' || nsp.length() != 0))) { + sb.append(u';'); + if (!npp.isBogus()) { + sb.append(npp); + } + sb.append(AffixUtils::escape(UnicodeStringCharSequence(np))); + // Copy the positive digit format into the negative. + // This is optional; the pattern is the same as if '#' were appended here instead. + sb.append(sb, afterPrefixPos, beforeSuffixPos); + if (!nsp.isBogus()) { + sb.append(nsp); + } + sb.append(AffixUtils::escape(UnicodeStringCharSequence(ns))); + } + + return sb; +} + +int PatternStringUtils::escapePaddingString(UnicodeString input, UnicodeString& output, int startIndex, + UErrorCode &status) { + (void)status; + if (input.length() == 0) { + input.setTo(kFallbackPaddingString, -1); + } + int startLength = output.length(); + if (input.length() == 1) { + if (input.compare(u"'", -1) == 0) { + output.insert(startIndex, u"''", -1); + } else { + output.insert(startIndex, input); + } + } else { + output.insert(startIndex, u'\''); + int offset = 1; + for (int i = 0; i < input.length(); i++) { + // it's okay to deal in chars here because the quote mark is the only interesting thing. + char16_t ch = input.charAt(i); + if (ch == u'\'') { + output.insert(startIndex + offset, u"''", -1); + offset += 2; + } else { + output.insert(startIndex + offset, ch); + offset += 1; + } + } + output.insert(startIndex + offset, u'\''); + } + return output.length() - startLength; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_patternstring.h b/deps/icu-small/source/i18n/number_patternstring.h new file mode 100644 index 00000000000000..6e1bb7f44ddc02 --- /dev/null +++ b/deps/icu-small/source/i18n/number_patternstring.h @@ -0,0 +1,266 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_PATTERNSTRING_H__ +#define __NUMBER_PATTERNSTRING_H__ + + +#include +#include "unicode/unum.h" +#include "unicode/unistr.h" +#include "number_types.h" +#include "number_decimalquantity.h" +#include "number_decimfmtprops.h" +#include "number_affixutils.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +// Forward declaration +class PatternParser; + +// Exported as U_I18N_API because it is a public member field of exported ParsedSubpatternInfo +struct U_I18N_API Endpoints { + int32_t start = 0; + int32_t end = 0; +}; + +// Exported as U_I18N_API because it is a public member field of exported ParsedPatternInfo +struct U_I18N_API ParsedSubpatternInfo { + int64_t groupingSizes = 0x0000ffffffff0000L; + int32_t integerLeadingHashSigns = 0; + int32_t integerTrailingHashSigns = 0; + int32_t integerNumerals = 0; + int32_t integerAtSigns = 0; + int32_t integerTotal = 0; // for convenience + int32_t fractionNumerals = 0; + int32_t fractionHashSigns = 0; + int32_t fractionTotal = 0; // for convenience + bool hasDecimal = false; + int32_t widthExceptAffixes = 0; + NullableValue paddingLocation; + DecimalQuantity rounding; + bool exponentHasPlusSign = false; + int32_t exponentZeros = 0; + bool hasPercentSign = false; + bool hasPerMilleSign = false; + bool hasCurrencySign = false; + bool hasMinusSign = false; + bool hasPlusSign = false; + + Endpoints prefixEndpoints; + Endpoints suffixEndpoints; + Endpoints paddingEndpoints; +}; + +// Exported as U_I18N_API because it is needed for the unit test PatternStringTest +struct U_I18N_API ParsedPatternInfo : public AffixPatternProvider, public UMemory { + UnicodeString pattern; + ParsedSubpatternInfo positive; + ParsedSubpatternInfo negative; + + ParsedPatternInfo() : state(this->pattern), currentSubpattern(nullptr) {} + + ~ParsedPatternInfo() U_OVERRIDE = default; + + static int32_t getLengthFromEndpoints(const Endpoints &endpoints); + + char16_t charAt(int32_t flags, int32_t index) const U_OVERRIDE; + + int32_t length(int32_t flags) const U_OVERRIDE; + + UnicodeString getString(int32_t flags) const; + + bool positiveHasPlusSign() const U_OVERRIDE; + + bool hasNegativeSubpattern() const U_OVERRIDE; + + bool negativeHasMinusSign() const U_OVERRIDE; + + bool hasCurrencySign() const U_OVERRIDE; + + bool containsSymbolType(AffixPatternType type, UErrorCode &status) const U_OVERRIDE; + + private: + struct U_I18N_API ParserState { + const UnicodeString &pattern; // reference to the parent + int32_t offset = 0; + + explicit ParserState(const UnicodeString &_pattern) : pattern(_pattern) {}; + + UChar32 peek(); + + UChar32 next(); + + // TODO: We don't currently do anything with the message string. + // This method is here as a shell for Java compatibility. + inline void toParseException(const char16_t *message) { (void)message; } + } + state; + + // NOTE: In Java, these are written as pure functions. + // In C++, they're written as methods. + // The behavior is the same. + + // Mutable transient pointer: + ParsedSubpatternInfo *currentSubpattern; + + // In Java, "negative == null" tells us whether or not we had a negative subpattern. + // In C++, we need to remember in another boolean. + bool fHasNegativeSubpattern = false; + + const Endpoints &getEndpoints(int32_t flags) const; + + /** Run the recursive descent parser. */ + void consumePattern(const UnicodeString &patternString, UErrorCode &status); + + void consumeSubpattern(UErrorCode &status); + + void consumePadding(PadPosition paddingLocation, UErrorCode &status); + + void consumeAffix(Endpoints &endpoints, UErrorCode &status); + + void consumeLiteral(UErrorCode &status); + + void consumeFormat(UErrorCode &status); + + void consumeIntegerFormat(UErrorCode &status); + + void consumeFractionFormat(UErrorCode &status); + + void consumeExponent(UErrorCode &status); + + friend class PatternParser; +}; + +class U_I18N_API PatternParser { + public: + /** + * Runs the recursive descent parser on the given pattern string, returning a data structure with raw information + * about the pattern string. + * + *

    + * To obtain a more useful form of the data, consider using {@link #parseToProperties} instead. + * + * TODO: Change argument type to const char16_t* instead of UnicodeString? + * + * @param patternString + * The LDML decimal format pattern (Excel-style pattern) to parse. + * @return The results of the parse. + */ + static void + parseToPatternInfo(const UnicodeString& patternString, ParsedPatternInfo &patternInfo, UErrorCode &status); + + enum IgnoreRounding { + IGNORE_ROUNDING_NEVER = 0, IGNORE_ROUNDING_IF_CURRENCY = 1, IGNORE_ROUNDING_ALWAYS = 2 + }; + + /** + * Parses a pattern string into a new property bag. + * + * @param pattern + * The pattern string, like "#,##0.00" + * @param ignoreRounding + * Whether to leave out rounding information (minFrac, maxFrac, and rounding increment) when parsing the + * pattern. This may be desirable if a custom rounding mode, such as CurrencyUsage, is to be used + * instead. + * @return A property bag object. + * @throws IllegalArgumentException + * If there is a syntax error in the pattern string. + */ + static DecimalFormatProperties + parseToProperties(const UnicodeString& pattern, IgnoreRounding ignoreRounding, UErrorCode &status); + + /** + * Parses a pattern string into an existing property bag. All properties that can be encoded into a pattern string + * will be overwritten with either their default value or with the value coming from the pattern string. Properties + * that cannot be encoded into a pattern string, such as rounding mode, are not modified. + * + * @param pattern + * The pattern string, like "#,##0.00" + * @param properties + * The property bag object to overwrite. + * @param ignoreRounding + * See {@link #parseToProperties(String pattern, int ignoreRounding)}. + * @throws IllegalArgumentException + * If there was a syntax error in the pattern string. + */ + static void parseToExistingProperties(const UnicodeString& pattern, DecimalFormatProperties& properties, + IgnoreRounding ignoreRounding, UErrorCode &status); + + private: + static void + parseToExistingPropertiesImpl(const UnicodeString& pattern, DecimalFormatProperties &properties, + IgnoreRounding ignoreRounding, UErrorCode &status); + + /** Finalizes the temporary data stored in the ParsedPatternInfo to the Properties. */ + static void + patternInfoToProperties(DecimalFormatProperties &properties, ParsedPatternInfo& patternInfo, + IgnoreRounding _ignoreRounding, UErrorCode &status); +}; + +class U_I18N_API PatternStringUtils { + public: + /** + * Creates a pattern string from a property bag. + * + *

    + * Since pattern strings support only a subset of the functionality available in a property bag, a new property bag + * created from the string returned by this function may not be the same as the original property bag. + * + * @param properties + * The property bag to serialize. + * @return A pattern string approximately serializing the property bag. + */ + static UnicodeString + propertiesToPatternString(const DecimalFormatProperties &properties, UErrorCode &status); + + + /** + * Converts a pattern between standard notation and localized notation. Localized notation means that instead of + * using generic placeholders in the pattern, you use the corresponding locale-specific characters instead. For + * example, in locale fr-FR, the period in the pattern "0.000" means "decimal" in standard notation (as it + * does in every other locale), but it means "grouping" in localized notation. + * + *

    + * A greedy string-substitution strategy is used to substitute locale symbols. If two symbols are ambiguous or have + * the same prefix, the result is not well-defined. + * + *

    + * Locale symbols are not allowed to contain the ASCII quote character. + * + *

    + * This method is provided for backwards compatibility and should not be used in any new code. + * + * TODO(C++): This method is not yet implemented. + * + * @param input + * The pattern to convert. + * @param symbols + * The symbols corresponding to the localized pattern. + * @param toLocalized + * true to convert from standard to localized notation; false to convert from localized to standard + * notation. + * @return The pattern expressed in the other notation. + */ + static UnicodeString + convertLocalized(UnicodeString input, DecimalFormatSymbols symbols, bool toLocalized, + UErrorCode &status); + + private: + /** @return The number of chars inserted. */ + static int + escapePaddingString(UnicodeString input, UnicodeString &output, int startIndex, UErrorCode &status); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_PATTERNSTRING_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_rounding.cpp b/deps/icu-small/source/i18n/number_rounding.cpp new file mode 100644 index 00000000000000..5c494f09544425 --- /dev/null +++ b/deps/icu-small/source/i18n/number_rounding.cpp @@ -0,0 +1,347 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "uassert.h" +#include "unicode/numberformatter.h" +#include "number_types.h" +#include "number_decimalquantity.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +int32_t getRoundingMagnitudeFraction(int maxFrac) { + if (maxFrac == -1) { + return INT32_MIN; + } + return -maxFrac; +} + +int32_t getRoundingMagnitudeSignificant(const DecimalQuantity &value, int maxSig) { + if (maxSig == -1) { + return INT32_MIN; + } + int magnitude = value.isZero() ? 0 : value.getMagnitude(); + return magnitude - maxSig + 1; +} + +int32_t getDisplayMagnitudeFraction(int minFrac) { + if (minFrac == 0) { + return INT32_MAX; + } + return -minFrac; +} + +int32_t getDisplayMagnitudeSignificant(const DecimalQuantity &value, int minSig) { + int magnitude = value.isZero() ? 0 : value.getMagnitude(); + return magnitude - minSig + 1; +} + +} + + +Rounder Rounder::unlimited() { + return Rounder(RND_NONE, {}, kDefaultMode); +} + +FractionRounder Rounder::integer() { + return constructFraction(0, 0); +} + +FractionRounder Rounder::fixedFraction(int32_t minMaxFractionPlaces) { + if (minMaxFractionPlaces >= 0 && minMaxFractionPlaces <= kMaxIntFracSig) { + return constructFraction(minMaxFractionPlaces, minMaxFractionPlaces); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +FractionRounder Rounder::minFraction(int32_t minFractionPlaces) { + if (minFractionPlaces >= 0 && minFractionPlaces <= kMaxIntFracSig) { + return constructFraction(minFractionPlaces, -1); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +FractionRounder Rounder::maxFraction(int32_t maxFractionPlaces) { + if (maxFractionPlaces >= 0 && maxFractionPlaces <= kMaxIntFracSig) { + return constructFraction(0, maxFractionPlaces); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +FractionRounder Rounder::minMaxFraction(int32_t minFractionPlaces, int32_t maxFractionPlaces) { + if (minFractionPlaces >= 0 && maxFractionPlaces <= kMaxIntFracSig && + minFractionPlaces <= maxFractionPlaces) { + return constructFraction(minFractionPlaces, maxFractionPlaces); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +Rounder Rounder::fixedDigits(int32_t minMaxSignificantDigits) { + if (minMaxSignificantDigits >= 0 && minMaxSignificantDigits <= kMaxIntFracSig) { + return constructSignificant(minMaxSignificantDigits, minMaxSignificantDigits); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +Rounder Rounder::minDigits(int32_t minSignificantDigits) { + if (minSignificantDigits >= 0 && minSignificantDigits <= kMaxIntFracSig) { + return constructSignificant(minSignificantDigits, -1); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +Rounder Rounder::maxDigits(int32_t maxSignificantDigits) { + if (maxSignificantDigits >= 0 && maxSignificantDigits <= kMaxIntFracSig) { + return constructSignificant(0, maxSignificantDigits); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +Rounder Rounder::minMaxDigits(int32_t minSignificantDigits, int32_t maxSignificantDigits) { + if (minSignificantDigits >= 0 && maxSignificantDigits <= kMaxIntFracSig && + minSignificantDigits <= maxSignificantDigits) { + return constructSignificant(minSignificantDigits, maxSignificantDigits); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +IncrementRounder Rounder::increment(double roundingIncrement) { + if (roundingIncrement > 0.0) { + return constructIncrement(roundingIncrement, 0); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +CurrencyRounder Rounder::currency(UCurrencyUsage currencyUsage) { + return constructCurrency(currencyUsage); +} + +Rounder Rounder::withMode(RoundingMode roundingMode) const { + if (fType == RND_ERROR) { return *this; } // no-op in error state + return {fType, fUnion, roundingMode}; +} + +Rounder FractionRounder::withMinDigits(int32_t minSignificantDigits) const { + if (fType == RND_ERROR) { return *this; } // no-op in error state + if (minSignificantDigits >= 0 && minSignificantDigits <= kMaxIntFracSig) { + return constructFractionSignificant(*this, minSignificantDigits, -1); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +Rounder FractionRounder::withMaxDigits(int32_t maxSignificantDigits) const { + if (fType == RND_ERROR) { return *this; } // no-op in error state + if (maxSignificantDigits >= 0 && maxSignificantDigits <= kMaxIntFracSig) { + return constructFractionSignificant(*this, -1, maxSignificantDigits); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +// Private method on base class +Rounder Rounder::withCurrency(const CurrencyUnit ¤cy, UErrorCode &status) const { + if (fType == RND_ERROR) { return *this; } // no-op in error state + U_ASSERT(fType == RND_CURRENCY); + const char16_t *isoCode = currency.getISOCurrency(); + double increment = ucurr_getRoundingIncrementForUsage(isoCode, fUnion.currencyUsage, &status); + int32_t minMaxFrac = ucurr_getDefaultFractionDigitsForUsage( + isoCode, fUnion.currencyUsage, &status); + if (increment != 0.0) { + return constructIncrement(increment, minMaxFrac); + } else { + return constructFraction(minMaxFrac, minMaxFrac); + } +} + +// Public method on CurrencyRounder subclass +Rounder CurrencyRounder::withCurrency(const CurrencyUnit ¤cy) const { + UErrorCode localStatus = U_ZERO_ERROR; + Rounder result = Rounder::withCurrency(currency, localStatus); + if (U_FAILURE(localStatus)) { + return {localStatus}; + } + return result; +} + +Rounder IncrementRounder::withMinFraction(int32_t minFrac) const { + if (fType == RND_ERROR) { return *this; } // no-op in error state + if (minFrac >= 0 && minFrac <= kMaxIntFracSig) { + return constructIncrement(fUnion.increment.fIncrement, minFrac); + } else { + return {U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR}; + } +} + +FractionRounder Rounder::constructFraction(int32_t minFrac, int32_t maxFrac) { + FractionSignificantSettings settings; + settings.fMinFrac = static_cast (minFrac); + settings.fMaxFrac = static_cast (maxFrac); + settings.fMinSig = -1; + settings.fMaxSig = -1; + RounderUnion union_; + union_.fracSig = settings; + return {RND_FRACTION, union_, kDefaultMode}; +} + +Rounder Rounder::constructSignificant(int32_t minSig, int32_t maxSig) { + FractionSignificantSettings settings; + settings.fMinFrac = -1; + settings.fMaxFrac = -1; + settings.fMinSig = static_cast(minSig); + settings.fMaxSig = static_cast(maxSig); + RounderUnion union_; + union_.fracSig = settings; + return {RND_SIGNIFICANT, union_, kDefaultMode}; +} + +Rounder +Rounder::constructFractionSignificant(const FractionRounder &base, int32_t minSig, int32_t maxSig) { + FractionSignificantSettings settings = base.fUnion.fracSig; + settings.fMinSig = static_cast(minSig); + settings.fMaxSig = static_cast(maxSig); + RounderUnion union_; + union_.fracSig = settings; + return {RND_FRACTION_SIGNIFICANT, union_, kDefaultMode}; +} + +IncrementRounder Rounder::constructIncrement(double increment, int32_t minFrac) { + IncrementSettings settings; + settings.fIncrement = increment; + settings.fMinFrac = minFrac; + RounderUnion union_; + union_.increment = settings; + return {RND_INCREMENT, union_, kDefaultMode}; +} + +CurrencyRounder Rounder::constructCurrency(UCurrencyUsage usage) { + RounderUnion union_; + union_.currencyUsage = usage; + return {RND_CURRENCY, union_, kDefaultMode}; +} + +Rounder Rounder::constructPassThrough() { + RounderUnion union_; + union_.errorCode = U_ZERO_ERROR; // initialize the variable + return {RND_PASS_THROUGH, union_, kDefaultMode}; +} + +void Rounder::setLocaleData(const CurrencyUnit ¤cy, UErrorCode &status) { + if (fType == RND_CURRENCY) { + *this = withCurrency(currency, status); + } +} + +int32_t +Rounder::chooseMultiplierAndApply(impl::DecimalQuantity &input, const impl::MultiplierProducer &producer, + UErrorCode &status) { + // TODO: Make a better and more efficient implementation. + // TODO: Avoid the object creation here. + DecimalQuantity copy(input); + + U_ASSERT(!input.isZero()); + int32_t magnitude = input.getMagnitude(); + int32_t multiplier = producer.getMultiplier(magnitude); + input.adjustMagnitude(multiplier); + apply(input, status); + + // If the number turned to zero when rounding, do not re-attempt the rounding. + if (!input.isZero() && input.getMagnitude() == magnitude + multiplier + 1) { + magnitude += 1; + input = copy; + multiplier = producer.getMultiplier(magnitude); + input.adjustMagnitude(multiplier); + U_ASSERT(input.getMagnitude() == magnitude + multiplier - 1); + apply(input, status); + U_ASSERT(input.getMagnitude() == magnitude + multiplier); + } + + return multiplier; +} + +/** This is the method that contains the actual rounding logic. */ +void Rounder::apply(impl::DecimalQuantity &value, UErrorCode& status) const { + switch (fType) { + case RND_BOGUS: + case RND_ERROR: + // Errors should be caught before the apply() method is called + status = U_INTERNAL_PROGRAM_ERROR; + break; + + case RND_NONE: + value.roundToInfinity(); + break; + + case RND_FRACTION: + value.roundToMagnitude( + getRoundingMagnitudeFraction(fUnion.fracSig.fMaxFrac), fRoundingMode, status); + value.setFractionLength( + uprv_max(0, -getDisplayMagnitudeFraction(fUnion.fracSig.fMinFrac)), INT32_MAX); + break; + + case RND_SIGNIFICANT: + value.roundToMagnitude( + getRoundingMagnitudeSignificant(value, fUnion.fracSig.fMaxSig), + fRoundingMode, + status); + value.setFractionLength( + uprv_max(0, -getDisplayMagnitudeSignificant(value, fUnion.fracSig.fMinSig)), + INT32_MAX); + break; + + case RND_FRACTION_SIGNIFICANT: { + int32_t displayMag = getDisplayMagnitudeFraction(fUnion.fracSig.fMinFrac); + int32_t roundingMag = getRoundingMagnitudeFraction(fUnion.fracSig.fMaxFrac); + if (fUnion.fracSig.fMinSig == -1) { + // Max Sig override + int32_t candidate = getRoundingMagnitudeSignificant(value, fUnion.fracSig.fMaxSig); + roundingMag = uprv_max(roundingMag, candidate); + } else { + // Min Sig override + int32_t candidate = getDisplayMagnitudeSignificant(value, fUnion.fracSig.fMinSig); + roundingMag = uprv_min(roundingMag, candidate); + } + value.roundToMagnitude(roundingMag, fRoundingMode, status); + value.setFractionLength(uprv_max(0, -displayMag), INT32_MAX); + break; + } + + case RND_INCREMENT: + value.roundToIncrement( + fUnion.increment.fIncrement, fRoundingMode, fUnion.increment.fMinFrac, status); + value.setFractionLength(fUnion.increment.fMinFrac, fUnion.increment.fMinFrac); + break; + + case RND_CURRENCY: + // Call .withCurrency() before .apply()! + U_ASSERT(false); + + case RND_PASS_THROUGH: + break; + } +} + +void Rounder::apply(impl::DecimalQuantity &value, int32_t minInt, UErrorCode /*status*/) { + // This method is intended for the one specific purpose of helping print "00.000E0". + U_ASSERT(fType == RND_SIGNIFICANT); + U_ASSERT(value.isZero()); + value.setFractionLength(fUnion.fracSig.fMinSig - minInt, INT32_MAX); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_roundingutils.h b/deps/icu-small/source/i18n/number_roundingutils.h new file mode 100644 index 00000000000000..6868ee0b86817e --- /dev/null +++ b/deps/icu-small/source/i18n/number_roundingutils.h @@ -0,0 +1,141 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_ROUNDINGUTILS_H__ +#define __NUMBER_ROUNDINGUTILS_H__ + +#include "number_types.h" + +U_NAMESPACE_BEGIN +namespace number { +namespace impl { +namespace roundingutils { + +enum Section { + SECTION_LOWER_EDGE = -1, + SECTION_UPPER_EDGE = -2, + SECTION_LOWER = 1, + SECTION_MIDPOINT = 2, + SECTION_UPPER = 3 +}; + +/** + * Converts a rounding mode and metadata about the quantity being rounded to a boolean determining + * whether the value should be rounded toward infinity or toward zero. + * + *

    The parameters are of type int because benchmarks on an x86-64 processor against OpenJDK + * showed that ints were demonstrably faster than enums in switch statements. + * + * @param isEven Whether the digit immediately before the rounding magnitude is even. + * @param isNegative Whether the quantity is negative. + * @param section Whether the part of the quantity to the right of the rounding magnitude is + * exactly halfway between two digits, whether it is in the lower part (closer to zero), or + * whether it is in the upper part (closer to infinity). See {@link #SECTION_LOWER}, {@link + * #SECTION_MIDPOINT}, and {@link #SECTION_UPPER}. + * @param roundingMode The integer version of the {@link RoundingMode}, which you can get via + * {@link RoundingMode#ordinal}. + * @param status Error code, set to U_FORMAT_INEXACT_ERROR if the rounding mode is kRoundUnnecessary. + * @return true if the number should be rounded toward zero; false if it should be rounded toward + * infinity. + */ +inline bool +getRoundingDirection(bool isEven, bool isNegative, Section section, RoundingMode roundingMode, + UErrorCode &status) { + switch (roundingMode) { + case RoundingMode::UNUM_ROUND_UP: + // round away from zero + return false; + + case RoundingMode::UNUM_ROUND_DOWN: + // round toward zero + return true; + + case RoundingMode::UNUM_ROUND_CEILING: + // round toward positive infinity + return isNegative; + + case RoundingMode::UNUM_ROUND_FLOOR: + // round toward negative infinity + return !isNegative; + + case RoundingMode::UNUM_ROUND_HALFUP: + switch (section) { + case SECTION_MIDPOINT: + return false; + case SECTION_LOWER: + return true; + case SECTION_UPPER: + return false; + default: + break; + } + break; + + case RoundingMode::UNUM_ROUND_HALFDOWN: + switch (section) { + case SECTION_MIDPOINT: + return true; + case SECTION_LOWER: + return true; + case SECTION_UPPER: + return false; + default: + break; + } + break; + + case RoundingMode::UNUM_ROUND_HALFEVEN: + switch (section) { + case SECTION_MIDPOINT: + return isEven; + case SECTION_LOWER: + return true; + case SECTION_UPPER: + return false; + default: + break; + } + break; + + default: + break; + } + + status = U_FORMAT_INEXACT_ERROR; + return false; +} + +/** + * Gets whether the given rounding mode's rounding boundary is at the midpoint. The rounding + * boundary is the point at which a number switches from being rounded down to being rounded up. + * For example, with rounding mode HALF_EVEN, HALF_UP, or HALF_DOWN, the rounding boundary is at + * the midpoint, and this function would return true. However, for UP, DOWN, CEILING, and FLOOR, + * the rounding boundary is at the "edge", and this function would return false. + * + * @param roundingMode The integer version of the {@link RoundingMode}. + * @return true if rounding mode is HALF_EVEN, HALF_UP, or HALF_DOWN; false otherwise. + */ +inline bool roundsAtMidpoint(int roundingMode) { + switch (roundingMode) { + case RoundingMode::UNUM_ROUND_UP: + case RoundingMode::UNUM_ROUND_DOWN: + case RoundingMode::UNUM_ROUND_CEILING: + case RoundingMode::UNUM_ROUND_FLOOR: + return false; + + default: + return true; + } +} + +} // namespace roundingutils +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_ROUNDINGUTILS_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_scientific.cpp b/deps/icu-small/source/i18n/number_scientific.cpp new file mode 100644 index 00000000000000..a2f2bf85a1fc9d --- /dev/null +++ b/deps/icu-small/source/i18n/number_scientific.cpp @@ -0,0 +1,138 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include +#include "number_scientific.h" +#include "number_utils.h" +#include "number_stringbuilder.h" +#include "unicode/unum.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +// NOTE: The object lifecycle of ScientificModifier and ScientificHandler differ greatly in Java and C++. +// +// During formatting, we need to provide an object with state (the exponent) as the inner modifier. +// +// In Java, where the priority is put on reducing object creations, the unsafe code path re-uses the +// ScientificHandler as a ScientificModifier, and the safe code path pre-computes 25 ScientificModifier +// instances. This scheme reduces the number of object creations by 1 in both safe and unsafe. +// +// In C++, MicroProps provides a pre-allocated ScientificModifier, and ScientificHandler simply populates +// the state (the exponent) into that ScientificModifier. There is no difference between safe and unsafe. + +ScientificModifier::ScientificModifier() : fExponent(0), fHandler(nullptr) {} + +void ScientificModifier::set(int32_t exponent, const ScientificHandler *handler) { + // ScientificModifier should be set only once. + U_ASSERT(fHandler == nullptr); + fExponent = exponent; + fHandler = handler; +} + +int32_t ScientificModifier::apply(NumberStringBuilder &output, int32_t /*leftIndex*/, int32_t rightIndex, + UErrorCode &status) const { + // FIXME: Localized exponent separator location. + int i = rightIndex; + // Append the exponent separator and sign + i += output.insert( + i, + fHandler->fSymbols->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kExponentialSymbol), + UNUM_EXPONENT_SYMBOL_FIELD, + status); + if (fExponent < 0 && fHandler->fSettings.fExponentSignDisplay != UNUM_SIGN_NEVER) { + i += output.insert( + i, + fHandler->fSymbols + ->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kMinusSignSymbol), + UNUM_EXPONENT_SIGN_FIELD, + status); + } else if (fExponent >= 0 && fHandler->fSettings.fExponentSignDisplay == UNUM_SIGN_ALWAYS) { + i += output.insert( + i, + fHandler->fSymbols + ->getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kPlusSignSymbol), + UNUM_EXPONENT_SIGN_FIELD, + status); + } + // Append the exponent digits (using a simple inline algorithm) + int32_t disp = std::abs(fExponent); + for (int j = 0; j < fHandler->fSettings.fMinExponentDigits || disp > 0; j++, disp /= 10) { + auto d = static_cast(disp % 10); + const UnicodeString &digitString = getDigitFromSymbols(d, *fHandler->fSymbols); + i += output.insert(i - j, digitString, UNUM_EXPONENT_FIELD, status); + } + return i - rightIndex; +} + +int32_t ScientificModifier::getPrefixLength(UErrorCode &status) const { + (void)status; + // TODO: Localized exponent separator location. + return 0; +} + +int32_t ScientificModifier::getCodePointCount(UErrorCode &status) const { + (void)status; + // This method is not used for strong modifiers. + U_ASSERT(false); + return 0; +} + +bool ScientificModifier::isStrong() const { + // Scientific is always strong + return true; +} + +// Note: Visual Studio does not compile this function without full name space. Why? +icu::number::impl::ScientificHandler::ScientificHandler(const Notation *notation, const DecimalFormatSymbols *symbols, + const MicroPropsGenerator *parent) : + fSettings(notation->fUnion.scientific), fSymbols(symbols), fParent(parent) {} + +void ScientificHandler::processQuantity(DecimalQuantity &quantity, MicroProps µs, + UErrorCode &status) const { + fParent->processQuantity(quantity, micros, status); + if (U_FAILURE(status)) { return; } + + // Treat zero as if it had magnitude 0 + int32_t exponent; + if (quantity.isZero()) { + if (fSettings.fRequireMinInt && micros.rounding.fType == Rounder::RND_SIGNIFICANT) { + // Show "00.000E0" on pattern "00.000E0" + micros.rounding.apply(quantity, fSettings.fEngineeringInterval, status); + exponent = 0; + } else { + micros.rounding.apply(quantity, status); + exponent = 0; + } + } else { + exponent = -micros.rounding.chooseMultiplierAndApply(quantity, *this, status); + } + + // Use MicroProps's helper ScientificModifier and save it as the modInner. + ScientificModifier &mod = micros.helpers.scientificModifier; + mod.set(exponent, this); + micros.modInner = &mod; +} + +int32_t ScientificHandler::getMultiplier(int32_t magnitude) const { + int32_t interval = fSettings.fEngineeringInterval; + int32_t digitsShown; + if (fSettings.fRequireMinInt) { + // For patterns like "000.00E0" and ".00E0" + digitsShown = interval; + } else if (interval <= 1) { + // For patterns like "0.00E0" and "@@@E0" + digitsShown = 1; + } else { + // For patterns like "##0.00" + digitsShown = ((magnitude % interval + interval) % interval) + 1; + } + return digitsShown - magnitude - 1; +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_scientific.h b/deps/icu-small/source/i18n/number_scientific.h new file mode 100644 index 00000000000000..f5e4d30e6a9737 --- /dev/null +++ b/deps/icu-small/source/i18n/number_scientific.h @@ -0,0 +1,62 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_SCIENTIFIC_H__ +#define __NUMBER_SCIENTIFIC_H__ + +#include "number_types.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +// Forward-declare +class ScientificHandler; + +class U_I18N_API ScientificModifier : public UMemory, public Modifier { + public: + ScientificModifier(); + + void set(int32_t exponent, const ScientificHandler *handler); + + int32_t apply(NumberStringBuilder &output, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const U_OVERRIDE; + + int32_t getPrefixLength(UErrorCode &status) const U_OVERRIDE; + + int32_t getCodePointCount(UErrorCode &status) const U_OVERRIDE; + + bool isStrong() const U_OVERRIDE; + + private: + int32_t fExponent; + const ScientificHandler *fHandler; +}; + +class ScientificHandler : public UMemory, public MicroPropsGenerator, public MultiplierProducer { + public: + ScientificHandler(const Notation *notation, const DecimalFormatSymbols *symbols, + const MicroPropsGenerator *parent); + + void + processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const U_OVERRIDE; + + int32_t getMultiplier(int32_t magnitude) const U_OVERRIDE; + + private: + const Notation::ScientificSettings& fSettings; + const DecimalFormatSymbols *fSymbols; + const MicroPropsGenerator *fParent; + + friend class ScientificModifier; +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_SCIENTIFIC_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_stringbuilder.cpp b/deps/icu-small/source/i18n/number_stringbuilder.cpp new file mode 100644 index 00000000000000..e6e86bd4291d6e --- /dev/null +++ b/deps/icu-small/source/i18n/number_stringbuilder.cpp @@ -0,0 +1,460 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT + +#include "number_stringbuilder.h" +#include "unicode/utf16.h" +#include "uvectr32.h" + +using namespace icu; +using namespace icu::number; +using namespace icu::number::impl; + +namespace { + +// A version of uprv_memcpy that checks for length 0. +// By default, uprv_memcpy requires a length of at least 1. +inline void uprv_memcpy2(void* dest, const void* src, size_t len) { + if (len > 0) { + uprv_memcpy(dest, src, len); + } +} + +// A version of uprv_memmove that checks for length 0. +// By default, uprv_memmove requires a length of at least 1. +inline void uprv_memmove2(void* dest, const void* src, size_t len) { + if (len > 0) { + uprv_memmove(dest, src, len); + } +} + +} // namespace + +NumberStringBuilder::NumberStringBuilder() = default; + +NumberStringBuilder::~NumberStringBuilder() { + if (fUsingHeap) { + uprv_free(fChars.heap.ptr); + uprv_free(fFields.heap.ptr); + } +} + +NumberStringBuilder::NumberStringBuilder(const NumberStringBuilder &other) { + *this = other; +} + +NumberStringBuilder &NumberStringBuilder::operator=(const NumberStringBuilder &other) { + // Check for self-assignment + if (this == &other) { + return *this; + } + + // Continue with deallocation and copying + if (fUsingHeap) { + uprv_free(fChars.heap.ptr); + uprv_free(fFields.heap.ptr); + fUsingHeap = false; + } + + int32_t capacity = other.getCapacity(); + if (capacity > DEFAULT_CAPACITY) { + // FIXME: uprv_malloc + // C++ note: malloc appears in two places: here and in prepareForInsertHelper. + auto newChars = static_cast (uprv_malloc(sizeof(char16_t) * capacity)); + auto newFields = static_cast(uprv_malloc(sizeof(Field) * capacity)); + if (newChars == nullptr || newFields == nullptr) { + // UErrorCode is not available; fail silently. + uprv_free(newChars); + uprv_free(newFields); + *this = NumberStringBuilder(); // can't fail + return *this; + } + + fUsingHeap = true; + fChars.heap.capacity = capacity; + fChars.heap.ptr = newChars; + fFields.heap.capacity = capacity; + fFields.heap.ptr = newFields; + } + + uprv_memcpy2(getCharPtr(), other.getCharPtr(), sizeof(char16_t) * capacity); + uprv_memcpy2(getFieldPtr(), other.getFieldPtr(), sizeof(Field) * capacity); + + fZero = other.fZero; + fLength = other.fLength; + return *this; +} + +int32_t NumberStringBuilder::length() const { + return fLength; +} + +int32_t NumberStringBuilder::codePointCount() const { + return u_countChar32(getCharPtr() + fZero, fLength); +} + +UChar32 NumberStringBuilder::getFirstCodePoint() const { + if (fLength == 0) { + return -1; + } + UChar32 cp; + U16_GET(getCharPtr() + fZero, 0, 0, fLength, cp); + return cp; +} + +UChar32 NumberStringBuilder::getLastCodePoint() const { + if (fLength == 0) { + return -1; + } + int32_t offset = fLength; + U16_BACK_1(getCharPtr() + fZero, 0, offset); + UChar32 cp; + U16_GET(getCharPtr() + fZero, 0, offset, fLength, cp); + return cp; +} + +UChar32 NumberStringBuilder::codePointAt(int32_t index) const { + UChar32 cp; + U16_GET(getCharPtr() + fZero, 0, index, fLength, cp); + return cp; +} + +UChar32 NumberStringBuilder::codePointBefore(int32_t index) const { + int32_t offset = index; + U16_BACK_1(getCharPtr() + fZero, 0, offset); + UChar32 cp; + U16_GET(getCharPtr() + fZero, 0, offset, fLength, cp); + return cp; +} + +NumberStringBuilder &NumberStringBuilder::clear() { + // TODO: Reset the heap here? + fZero = getCapacity() / 2; + fLength = 0; + return *this; +} + +int32_t NumberStringBuilder::appendCodePoint(UChar32 codePoint, Field field, UErrorCode &status) { + return insertCodePoint(fLength, codePoint, field, status); +} + +int32_t +NumberStringBuilder::insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status) { + int32_t count = U16_LENGTH(codePoint); + int32_t position = prepareForInsert(index, count, status); + if (U_FAILURE(status)) { + return count; + } + if (count == 1) { + getCharPtr()[position] = (char16_t) codePoint; + getFieldPtr()[position] = field; + } else { + getCharPtr()[position] = U16_LEAD(codePoint); + getCharPtr()[position + 1] = U16_TRAIL(codePoint); + getFieldPtr()[position] = getFieldPtr()[position + 1] = field; + } + return count; +} + +int32_t NumberStringBuilder::append(const UnicodeString &unistr, Field field, UErrorCode &status) { + return insert(fLength, unistr, field, status); +} + +int32_t NumberStringBuilder::insert(int32_t index, const UnicodeString &unistr, Field field, + UErrorCode &status) { + if (unistr.length() == 0) { + // Nothing to insert. + return 0; + } else if (unistr.length() == 1) { + // Fast path: insert using insertCodePoint. + return insertCodePoint(index, unistr.charAt(0), field, status); + } else { + return insert(index, unistr, 0, unistr.length(), field, status); + } +} + +int32_t +NumberStringBuilder::insert(int32_t index, const UnicodeString &unistr, int32_t start, int32_t end, + Field field, UErrorCode &status) { + int32_t count = end - start; + int32_t position = prepareForInsert(index, count, status); + if (U_FAILURE(status)) { + return count; + } + for (int32_t i = 0; i < count; i++) { + getCharPtr()[position + i] = unistr.charAt(start + i); + getFieldPtr()[position + i] = field; + } + return count; +} + +int32_t NumberStringBuilder::append(const NumberStringBuilder &other, UErrorCode &status) { + return insert(fLength, other, status); +} + +int32_t +NumberStringBuilder::insert(int32_t index, const NumberStringBuilder &other, UErrorCode &status) { + if (this == &other) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return 0; + } + int32_t count = other.fLength; + if (count == 0) { + // Nothing to insert. + return 0; + } + int32_t position = prepareForInsert(index, count, status); + if (U_FAILURE(status)) { + return count; + } + for (int32_t i = 0; i < count; i++) { + getCharPtr()[position + i] = other.charAt(i); + getFieldPtr()[position + i] = other.fieldAt(i); + } + return count; +} + +int32_t NumberStringBuilder::prepareForInsert(int32_t index, int32_t count, UErrorCode &status) { + if (index == 0 && fZero - count >= 0) { + // Append to start + fZero -= count; + fLength += count; + return fZero; + } else if (index == fLength && fZero + fLength + count < getCapacity()) { + // Append to end + fLength += count; + return fZero + fLength - count; + } else { + // Move chars around and/or allocate more space + return prepareForInsertHelper(index, count, status); + } +} + +int32_t NumberStringBuilder::prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status) { + int32_t oldCapacity = getCapacity(); + int32_t oldZero = fZero; + char16_t *oldChars = getCharPtr(); + Field *oldFields = getFieldPtr(); + if (fLength + count > oldCapacity) { + int32_t newCapacity = (fLength + count) * 2; + int32_t newZero = newCapacity / 2 - (fLength + count) / 2; + + // C++ note: malloc appears in two places: here and in the assignment operator. + auto newChars = static_cast (uprv_malloc(sizeof(char16_t) * newCapacity)); + auto newFields = static_cast(uprv_malloc(sizeof(Field) * newCapacity)); + if (newChars == nullptr || newFields == nullptr) { + uprv_free(newChars); + uprv_free(newFields); + status = U_MEMORY_ALLOCATION_ERROR; + return -1; + } + + // First copy the prefix and then the suffix, leaving room for the new chars that the + // caller wants to insert. + // C++ note: memcpy is OK because the src and dest do not overlap. + uprv_memcpy2(newChars + newZero, oldChars + oldZero, sizeof(char16_t) * index); + uprv_memcpy2(newChars + newZero + index + count, + oldChars + oldZero + index, + sizeof(char16_t) * (fLength - index)); + uprv_memcpy2(newFields + newZero, oldFields + oldZero, sizeof(Field) * index); + uprv_memcpy2(newFields + newZero + index + count, + oldFields + oldZero + index, + sizeof(Field) * (fLength - index)); + + if (fUsingHeap) { + uprv_free(oldChars); + uprv_free(oldFields); + } + fUsingHeap = true; + fChars.heap.ptr = newChars; + fChars.heap.capacity = newCapacity; + fFields.heap.ptr = newFields; + fFields.heap.capacity = newCapacity; + fZero = newZero; + fLength += count; + } else { + int32_t newZero = oldCapacity / 2 - (fLength + count) / 2; + + // C++ note: memmove is required because src and dest may overlap. + // First copy the entire string to the location of the prefix, and then move the suffix + // to make room for the new chars that the caller wants to insert. + uprv_memmove2(oldChars + newZero, oldChars + oldZero, sizeof(char16_t) * fLength); + uprv_memmove2(oldChars + newZero + index + count, + oldChars + newZero + index, + sizeof(char16_t) * (fLength - index)); + uprv_memmove2(oldFields + newZero, oldFields + oldZero, sizeof(Field) * fLength); + uprv_memmove2(oldFields + newZero + index + count, + oldFields + newZero + index, + sizeof(Field) * (fLength - index)); + + fZero = newZero; + fLength += count; + } + return fZero + index; +} + +UnicodeString NumberStringBuilder::toUnicodeString() const { + return UnicodeString(getCharPtr() + fZero, fLength); +} + +UnicodeString NumberStringBuilder::toDebugString() const { + UnicodeString sb; + sb.append(u"", -1); + return sb; +} + +const char16_t *NumberStringBuilder::chars() const { + return getCharPtr() + fZero; +} + +bool NumberStringBuilder::contentEquals(const NumberStringBuilder &other) const { + if (fLength != other.fLength) { + return false; + } + for (int32_t i = 0; i < fLength; i++) { + if (charAt(i) != other.charAt(i) || fieldAt(i) != other.fieldAt(i)) { + return false; + } + } + return true; +} + +void NumberStringBuilder::populateFieldPosition(FieldPosition &fp, int32_t offset, UErrorCode &status) const { + int32_t rawField = fp.getField(); + + if (rawField == FieldPosition::DONT_CARE) { + return; + } + + if (rawField < 0 || rawField >= UNUM_FIELD_COUNT) { + status = U_ILLEGAL_ARGUMENT_ERROR; + return; + } + + auto field = static_cast(rawField); + + bool seenStart = false; + int32_t fractionStart = -1; + for (int i = fZero; i <= fZero + fLength; i++) { + Field _field = UNUM_FIELD_COUNT; + if (i < fZero + fLength) { + _field = getFieldPtr()[i]; + } + if (seenStart && field != _field) { + // Special case: GROUPING_SEPARATOR counts as an INTEGER. + if (field == UNUM_INTEGER_FIELD && _field == UNUM_GROUPING_SEPARATOR_FIELD) { + continue; + } + fp.setEndIndex(i - fZero + offset); + break; + } else if (!seenStart && field == _field) { + fp.setBeginIndex(i - fZero + offset); + seenStart = true; + } + if (_field == UNUM_INTEGER_FIELD || _field == UNUM_DECIMAL_SEPARATOR_FIELD) { + fractionStart = i - fZero + 1; + } + } + + // Backwards compatibility: FRACTION needs to start after INTEGER if empty + if (field == UNUM_FRACTION_FIELD && !seenStart) { + fp.setBeginIndex(fractionStart + offset); + fp.setEndIndex(fractionStart + offset); + } +} + +void NumberStringBuilder::populateFieldPositionIterator(FieldPositionIterator &fpi, UErrorCode &status) const { + // TODO: Set an initial capacity on uvec? + LocalPointer uvec(new UVector32(status)); + if (U_FAILURE(status)) { + return; + } + + Field current = UNUM_FIELD_COUNT; + int32_t currentStart = -1; + for (int32_t i = 0; i < fLength; i++) { + Field field = fieldAt(i); + if (current == UNUM_INTEGER_FIELD && field == UNUM_GROUPING_SEPARATOR_FIELD) { + // Special case: GROUPING_SEPARATOR counts as an INTEGER. + // Add the field, followed by the start index, followed by the end index to uvec. + uvec->addElement(UNUM_GROUPING_SEPARATOR_FIELD, status); + uvec->addElement(i, status); + uvec->addElement(i + 1, status); + } else if (current != field) { + if (current != UNUM_FIELD_COUNT) { + // Add the field, followed by the start index, followed by the end index to uvec. + uvec->addElement(current, status); + uvec->addElement(currentStart, status); + uvec->addElement(i, status); + } + current = field; + currentStart = i; + } + if (U_FAILURE(status)) { + return; + } + } + if (current != UNUM_FIELD_COUNT) { + // Add the field, followed by the start index, followed by the end index to uvec. + uvec->addElement(current, status); + uvec->addElement(currentStart, status); + uvec->addElement(fLength, status); + } + + // Give uvec to the FieldPositionIterator, which adopts it. + fpi.setData(uvec.orphan(), status); +} + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_stringbuilder.h b/deps/icu-small/source/i18n/number_stringbuilder.h new file mode 100644 index 00000000000000..f08dcb1d1bed6a --- /dev/null +++ b/deps/icu-small/source/i18n/number_stringbuilder.h @@ -0,0 +1,135 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_STRINGBUILDER_H__ +#define __NUMBER_STRINGBUILDER_H__ + + +#include +#include "unicode/numfmt.h" +#include "unicode/ustring.h" +#include "cstring.h" +#include "uassert.h" +#include "number_types.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +class U_I18N_API NumberStringBuilder : public UMemory { + private: + static const int32_t DEFAULT_CAPACITY = 40; + + template + union ValueOrHeapArray { + T value[DEFAULT_CAPACITY]; + struct { + T *ptr; + int32_t capacity; + } heap; + }; + + public: + NumberStringBuilder(); + + ~NumberStringBuilder(); + + NumberStringBuilder(const NumberStringBuilder &other); + + NumberStringBuilder &operator=(const NumberStringBuilder &other); + + int32_t length() const; + + int32_t codePointCount() const; + + inline char16_t charAt(int32_t index) const { + U_ASSERT(index >= 0); + U_ASSERT(index < fLength); + return getCharPtr()[fZero + index]; + } + + inline Field fieldAt(int32_t index) const { + U_ASSERT(index >= 0); + U_ASSERT(index < fLength); + return getFieldPtr()[fZero + index]; + } + + UChar32 getFirstCodePoint() const; + + UChar32 getLastCodePoint() const; + + UChar32 codePointAt(int32_t index) const; + + UChar32 codePointBefore(int32_t index) const; + + NumberStringBuilder &clear(); + + int32_t appendCodePoint(UChar32 codePoint, Field field, UErrorCode &status); + + int32_t insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status); + + int32_t append(const UnicodeString &unistr, Field field, UErrorCode &status); + + int32_t insert(int32_t index, const UnicodeString &unistr, Field field, UErrorCode &status); + + int32_t insert(int32_t index, const UnicodeString &unistr, int32_t start, int32_t end, Field field, + UErrorCode &status); + + int32_t append(const NumberStringBuilder &other, UErrorCode &status); + + int32_t insert(int32_t index, const NumberStringBuilder &other, UErrorCode &status); + + UnicodeString toUnicodeString() const; + + UnicodeString toDebugString() const; + + const char16_t *chars() const; + + bool contentEquals(const NumberStringBuilder &other) const; + + void populateFieldPosition(FieldPosition &fp, int32_t offset, UErrorCode &status) const; + + void populateFieldPositionIterator(FieldPositionIterator &fpi, UErrorCode &status) const; + + private: + bool fUsingHeap = false; + ValueOrHeapArray fChars; + ValueOrHeapArray fFields; + int32_t fZero = DEFAULT_CAPACITY / 2; + int32_t fLength = 0; + + inline char16_t *getCharPtr() { + return fUsingHeap ? fChars.heap.ptr : fChars.value; + } + + inline const char16_t *getCharPtr() const { + return fUsingHeap ? fChars.heap.ptr : fChars.value; + } + + inline Field *getFieldPtr() { + return fUsingHeap ? fFields.heap.ptr : fFields.value; + } + + inline const Field *getFieldPtr() const { + return fUsingHeap ? fFields.heap.ptr : fFields.value; + } + + inline int32_t getCapacity() const { + return fUsingHeap ? fChars.heap.capacity : DEFAULT_CAPACITY; + } + + int32_t prepareForInsert(int32_t index, int32_t count, UErrorCode &status); + + int32_t prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status); +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + + +#endif //__NUMBER_STRINGBUILDER_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_types.h b/deps/icu-small/source/i18n/number_types.h new file mode 100644 index 00000000000000..2bc21bd40dcb18 --- /dev/null +++ b/deps/icu-small/source/i18n/number_types.h @@ -0,0 +1,293 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_TYPES_H__ +#define __NUMBER_TYPES_H__ + +#include +#include "unicode/decimfmt.h" +#include "unicode/unum.h" +#include "unicode/numsys.h" +#include "unicode/numberformatter.h" +#include "unicode/utf16.h" +#include "uassert.h" +#include "unicode/platform.h" + +U_NAMESPACE_BEGIN +namespace number { +namespace impl { + +// Typedef several enums for brevity and for easier comparison to Java. + +typedef UNumberFormatFields Field; + +typedef UNumberFormatRoundingMode RoundingMode; + +typedef UNumberFormatPadPosition PadPosition; + +typedef UNumberCompactStyle CompactStyle; + +// ICU4J Equivalent: RoundingUtils.MAX_INT_FRAC_SIG +static constexpr int32_t kMaxIntFracSig = 100; + +// ICU4J Equivalent: RoundingUtils.DEFAULT_ROUNDING_MODE +static constexpr RoundingMode kDefaultMode = RoundingMode::UNUM_FOUND_HALFEVEN; + +// ICU4J Equivalent: Padder.FALLBACK_PADDING_STRING +static constexpr char16_t kFallbackPaddingString[] = u" "; + +// ICU4J Equivalent: NumberFormatterImpl.DEFAULT_CURRENCY +static constexpr char16_t kDefaultCurrency[] = u"XXX"; + +// FIXME: New error codes: +static constexpr UErrorCode U_NUMBER_DIGIT_WIDTH_OUTOFBOUNDS_ERROR = U_ILLEGAL_ARGUMENT_ERROR; +static constexpr UErrorCode U_NUMBER_PADDING_WIDTH_OUTOFBOUNDS_ERROR = U_ILLEGAL_ARGUMENT_ERROR; + +// Forward declarations: + +class Modifier; +class MutablePatternModifier; +class DecimalQuantity; +class NumberStringBuilder; +struct MicroProps; + + +enum AffixPatternType { + // Represents a literal character; the value is stored in the code point field. + TYPE_CODEPOINT = 0, + + // Represents a minus sign symbol '-'. + TYPE_MINUS_SIGN = -1, + + // Represents a plus sign symbol '+'. + TYPE_PLUS_SIGN = -2, + + // Represents a percent sign symbol '%'. + TYPE_PERCENT = -3, + + // Represents a permille sign symbol '‰'. + TYPE_PERMILLE = -4, + + // Represents a single currency symbol '¤'. + TYPE_CURRENCY_SINGLE = -5, + + // Represents a double currency symbol '¤¤'. + TYPE_CURRENCY_DOUBLE = -6, + + // Represents a triple currency symbol '¤¤¤'. + TYPE_CURRENCY_TRIPLE = -7, + + // Represents a quadruple currency symbol '¤¤¤¤'. + TYPE_CURRENCY_QUAD = -8, + + // Represents a quintuple currency symbol '¤¤¤¤¤'. + TYPE_CURRENCY_QUINT = -9, + + // Represents a sequence of six or more currency symbols. + TYPE_CURRENCY_OVERFLOW = -15 +}; + +enum CompactType { + TYPE_DECIMAL, + TYPE_CURRENCY +}; + + +// TODO: Should this be moved somewhere else, maybe where other ICU classes can use it? +// Exported as U_I18N_API because it is a base class for other exported types +class U_I18N_API CharSequence { +public: + virtual ~CharSequence() = default; + + virtual int32_t length() const = 0; + + virtual char16_t charAt(int32_t index) const = 0; + + virtual UChar32 codePointAt(int32_t index) const { + // Default implementation; can be overridden with a more efficient version + char16_t leading = charAt(index); + if (U16_IS_LEAD(leading) && length() > index + 1) { + char16_t trailing = charAt(index + 1); + return U16_GET_SUPPLEMENTARY(leading, trailing); + } else { + return leading; + } + } + + virtual UnicodeString toUnicodeString() const = 0; +}; + +class U_I18N_API AffixPatternProvider { + public: + static const int32_t AFFIX_PLURAL_MASK = 0xff; + static const int32_t AFFIX_PREFIX = 0x100; + static const int32_t AFFIX_NEGATIVE_SUBPATTERN = 0x200; + static const int32_t AFFIX_PADDING = 0x400; + + virtual ~AffixPatternProvider() = default; + + virtual char16_t charAt(int flags, int i) const = 0; + + virtual int length(int flags) const = 0; + + virtual bool hasCurrencySign() const = 0; + + virtual bool positiveHasPlusSign() const = 0; + + virtual bool hasNegativeSubpattern() const = 0; + + virtual bool negativeHasMinusSign() const = 0; + + virtual bool containsSymbolType(AffixPatternType, UErrorCode &) const = 0; +}; + +/** + * A Modifier is an object that can be passed through the formatting pipeline until it is finally applied to the string + * builder. A Modifier usually contains a prefix and a suffix that are applied, but it could contain something else, + * like a {@link com.ibm.icu.text.SimpleFormatter} pattern. + * + * A Modifier is usually immutable, except in cases such as {@link MurkyModifier}, which are mutable for performance + * reasons. + * + * Exported as U_I18N_API because it is a base class for other exported types + */ +class U_I18N_API Modifier { + public: + virtual ~Modifier() = default; + + /** + * Apply this Modifier to the string builder. + * + * @param output + * The string builder to which to apply this modifier. + * @param leftIndex + * The left index of the string within the builder. Equal to 0 when only one number is being formatted. + * @param rightIndex + * The right index of the string within the string builder. Equal to length when only one number is being + * formatted. + * @return The number of characters (UTF-16 code units) that were added to the string builder. + */ + virtual int32_t + apply(NumberStringBuilder &output, int leftIndex, int rightIndex, UErrorCode &status) const = 0; + + /** + * Gets the length of the prefix. This information can be used in combination with {@link #apply} to extract the + * prefix and suffix strings. + * + * @return The number of characters (UTF-16 code units) in the prefix. + */ + virtual int32_t getPrefixLength(UErrorCode& status) const = 0; + + /** + * Returns the number of code points in the modifier, prefix plus suffix. + */ + virtual int32_t getCodePointCount(UErrorCode &status) const = 0; + + /** + * Whether this modifier is strong. If a modifier is strong, it should always be applied immediately and not allowed + * to bubble up. With regard to padding, strong modifiers are considered to be on the inside of the prefix and + * suffix. + * + * @return Whether the modifier is strong. + */ + virtual bool isStrong() const = 0; +}; + +/** + * This interface is used when all number formatting settings, including the locale, are known, except for the quantity + * itself. The {@link #processQuantity} method performs the final step in the number processing pipeline: it uses the + * quantity to generate a finalized {@link MicroProps}, which can be used to render the number to output. + * + *

    + * In other words, this interface is used for the parts of number processing that are quantity-dependent. + * + *

    + * In order to allow for multiple different objects to all mutate the same MicroProps, a "chain" of MicroPropsGenerators + * are linked together, and each one is responsible for manipulating a certain quantity-dependent part of the + * MicroProps. At the tail of the linked list is a base instance of {@link MicroProps} with properties that are not + * quantity-dependent. Each element in the linked list calls {@link #processQuantity} on its "parent", then does its + * work, and then returns the result. + * + * Exported as U_I18N_API because it is a base class for other exported types + * + */ +class U_I18N_API MicroPropsGenerator { + public: + virtual ~MicroPropsGenerator() = default; + + /** + * Considers the given {@link DecimalQuantity}, optionally mutates it, and returns a {@link MicroProps}. + * + * @param quantity + * The quantity for consideration and optional mutation. + * @param micros + * The MicroProps instance to populate. + * @return A MicroProps instance resolved for the quantity. + */ + virtual void processQuantity(DecimalQuantity& quantity, MicroProps& micros, UErrorCode& status) const = 0; +}; + +class MultiplierProducer { + public: + virtual ~MultiplierProducer() = default; + + virtual int32_t getMultiplier(int32_t magnitude) const = 0; +}; + +// Exported as U_I18N_API because it is a public member field of exported DecimalFormatProperties +template +class U_I18N_API NullableValue { + public: + NullableValue() : fNull(true) {} + + NullableValue(const NullableValue &other) = default; + + explicit NullableValue(const T &other) { + fValue = other; + fNull = false; + } + + NullableValue &operator=(const NullableValue &other) = default; + + NullableValue &operator=(const T &other) { + fValue = other; + fNull = false; + return *this; + } + + bool operator==(const NullableValue &other) const { + // "fValue == other.fValue" returns UBool, not bool (causes compiler warnings) + return fNull ? other.fNull : (other.fNull ? false : static_cast(fValue == other.fValue)); + } + + void nullify() { + // TODO: It might be nice to call the destructor here. + fNull = true; + } + + bool isNull() const { + return fNull; + } + + T get(UErrorCode &status) const { + if (fNull) { + status = U_UNDEFINED_VARIABLE; + } + return fValue; + } + + private: + bool fNull; + T fValue; +}; + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_TYPES_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/number_utils.h b/deps/icu-small/source/i18n/number_utils.h new file mode 100644 index 00000000000000..3a408d6007a2cd --- /dev/null +++ b/deps/icu-small/source/i18n/number_utils.h @@ -0,0 +1,130 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT +#ifndef __NUMBER_UTILS_H__ +#define __NUMBER_UTILS_H__ + +#include "unicode/numberformatter.h" +#include "number_types.h" +#include "number_decimalquantity.h" +#include "number_scientific.h" +#include "number_patternstring.h" +#include "number_modifiers.h" + +U_NAMESPACE_BEGIN namespace number { +namespace impl { + +class UnicodeStringCharSequence : public CharSequence { + public: + explicit UnicodeStringCharSequence(const UnicodeString &other) { + fStr = other; + } + + ~UnicodeStringCharSequence() U_OVERRIDE = default; + + int32_t length() const U_OVERRIDE { + return fStr.length(); + } + + char16_t charAt(int32_t index) const U_OVERRIDE { + return fStr.charAt(index); + } + + UChar32 codePointAt(int32_t index) const U_OVERRIDE { + return fStr.char32At(index); + } + + UnicodeString toUnicodeString() const U_OVERRIDE { + // Allocate a UnicodeString of the correct length + UnicodeString output(length(), 0, -1); + for (int32_t i = 0; i < length(); i++) { + output.append(charAt(i)); + } + return output; + } + + private: + UnicodeString fStr; +}; + +struct MicroProps : public MicroPropsGenerator { + + // NOTE: All of these fields are properly initialized in NumberFormatterImpl. + Rounder rounding; + Grouper grouping; + Padder padding; + IntegerWidth integerWidth; + UNumberSignDisplay sign; + UNumberDecimalSeparatorDisplay decimal; + bool useCurrency; + + // Note: This struct has no direct ownership of the following pointers. + const DecimalFormatSymbols *symbols; + const Modifier *modOuter; + const Modifier *modMiddle; + const Modifier *modInner; + + // The following "helper" fields may optionally be used during the MicroPropsGenerator. + // They live here to retain memory. + struct { + ScientificModifier scientificModifier; + EmptyModifier emptyWeakModifier{false}; + EmptyModifier emptyStrongModifier{true}; + } helpers; + + + MicroProps() = default; + + MicroProps(const MicroProps &other) = default; + + MicroProps &operator=(const MicroProps &other) = default; + + void processQuantity(DecimalQuantity &, MicroProps µs, UErrorCode &status) const U_OVERRIDE { + (void)status; + if (this == µs) { + // Unsafe path: no need to perform a copy. + U_ASSERT(!exhausted); + micros.exhausted = true; + U_ASSERT(exhausted); + } else { + // Safe path: copy self into the output micros. + micros = *this; + } + } + + private: + // Internal fields: + bool exhausted = false; +}; + +/** + * This struct provides the result of the number formatting pipeline to FormattedNumber. + * + * The DecimalQuantity is not currently being used by FormattedNumber, but at some point it could be used + * to add a toDecNumber() or similar method. + */ +struct NumberFormatterResults : public UMemory { + DecimalQuantity quantity; + NumberStringBuilder string; +}; + +inline const UnicodeString getDigitFromSymbols(int8_t digit, const DecimalFormatSymbols &symbols) { + // TODO: Implement DecimalFormatSymbols.getCodePointZero()? + if (digit == 0) { + return symbols.getSymbol(DecimalFormatSymbols::ENumberFormatSymbol::kZeroDigitSymbol); + } else { + return symbols.getSymbol(static_cast( + DecimalFormatSymbols::ENumberFormatSymbol::kOneDigitSymbol + digit - 1)); + } +} + +} // namespace impl +} // namespace number +U_NAMESPACE_END + +#endif //__NUMBER_UTILS_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/numfmt.cpp b/deps/icu-small/source/i18n/numfmt.cpp index 90c53ce390674b..fee3bed8bfb352 100644 --- a/deps/icu-small/source/i18n/numfmt.cpp +++ b/deps/icu-small/source/i18n/numfmt.cpp @@ -1509,6 +1509,24 @@ NumberFormat::makeInstance(const Locale& desiredLocale, return f; } +/** + * Get the rounding mode. + * @return A rounding mode + */ +NumberFormat::ERoundingMode NumberFormat::getRoundingMode() const { + // Default value. ICU4J throws an exception and we can't change this API. + return NumberFormat::ERoundingMode::kRoundUnnecessary; +} + +/** + * Set the rounding mode. This has no effect unless the rounding + * increment is greater than zero. + * @param roundingMode A rounding mode + */ +void NumberFormat::setRoundingMode(NumberFormat::ERoundingMode /*roundingMode*/) { + // No-op ICU4J throws an exception, and we can't change this API. +} + U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/numsys.cpp b/deps/icu-small/source/i18n/numsys.cpp index b24340f0d2e2c9..087dd277eb4dd8 100644 --- a/deps/icu-small/source/i18n/numsys.cpp +++ b/deps/icu-small/source/i18n/numsys.cpp @@ -25,6 +25,7 @@ #include "unicode/schriter.h" #include "unicode/numsys.h" #include "cstring.h" +#include "uassert.h" #include "uresimp.h" #include "numsys_impl.h" @@ -115,7 +116,13 @@ NumberingSystem::createInstance(const Locale & inLocale, UErrorCode& status) { UBool usingFallback = FALSE; char buffer[ULOC_KEYWORDS_CAPACITY]; int32_t count = inLocale.getKeywordValue("numbers",buffer, sizeof(buffer),status); + if (U_FAILURE(status) || status == U_STRING_NOT_TERMINATED_WARNING) { + // the "numbers" keyword exceeds ULOC_KEYWORDS_CAPACITY; ignore and use default. + count = 0; + status = U_ZERO_ERROR; + } if ( count > 0 ) { // @numbers keyword was specified in the locale + U_ASSERT(count < ULOC_KEYWORDS_CAPACITY); buffer[count] = '\0'; // Make sure it is null terminated. if ( !uprv_strcmp(buffer,gDefault) || !uprv_strcmp(buffer,gNative) || !uprv_strcmp(buffer,gTraditional) || !uprv_strcmp(buffer,gFinance)) { diff --git a/deps/icu-small/source/i18n/persncal.cpp b/deps/icu-small/source/i18n/persncal.cpp index 0ccff4d2bdc0d3..3d391f4e3fbe8e 100644 --- a/deps/icu-small/source/i18n/persncal.cpp +++ b/deps/icu-small/source/i18n/persncal.cpp @@ -213,7 +213,7 @@ void PersianCalendar::handleComputeFields(int32_t julianDay, UErrorCode &/*statu int32_t year, month, dayOfMonth, dayOfYear; int32_t daysSinceEpoch = julianDay - PERSIAN_EPOCH; - year = 1 + ClockMath::floorDivide(33 * daysSinceEpoch + 3, 12053); + year = 1 + (int32_t)ClockMath::floorDivide(33 * (int64_t)daysSinceEpoch + 3, (int64_t)12053); int32_t farvardin1 = 365 * (year - 1) + ClockMath::floorDivide(8 * year + 21, 33); dayOfYear = (daysSinceEpoch - farvardin1); // 0-based diff --git a/deps/icu-small/source/i18n/plurrule.cpp b/deps/icu-small/source/i18n/plurrule.cpp index 08ea969b5ae6fb..6733a23e00362f 100644 --- a/deps/icu-small/source/i18n/plurrule.cpp +++ b/deps/icu-small/source/i18n/plurrule.cpp @@ -268,7 +268,7 @@ PluralRules::select(const Formattable& obj, const NumberFormat& fmt, UErrorCode& } UnicodeString -PluralRules::select(const FixedDecimal &number) const { +PluralRules::select(const IFixedDecimal &number) const { if (mRules == NULL) { return UnicodeString(TRUE, PLURAL_DEFAULT_RULE, -1); } @@ -783,15 +783,17 @@ AndConstraint::~AndConstraint() { UBool -AndConstraint::isFulfilled(const FixedDecimal &number) { +AndConstraint::isFulfilled(const IFixedDecimal &number) { UBool result = TRUE; if (digitsType == none) { // An empty AndConstraint, created by a rule with a keyword but no following expression. return TRUE; } - double n = number.get(digitsType); // pulls n | i | v | f value for the number. - // Will always be positive. - // May be non-integer (n option only) + + PluralOperand operand = tokenTypeToPluralOperand(digitsType); + double n = number.getPluralOperand(operand); // pulls n | i | v | f value for the number. + // Will always be positive. + // May be non-integer (n option only) do { if (integerOnly && n != uprv_floor(n)) { result = FALSE; @@ -873,7 +875,7 @@ OrConstraint::add() } UBool -OrConstraint::isFulfilled(const FixedDecimal &number) { +OrConstraint::isFulfilled(const IFixedDecimal &number) { OrConstraint* orRule=this; UBool result=FALSE; @@ -914,8 +916,8 @@ RuleChain::~RuleChain() { UnicodeString -RuleChain::select(const FixedDecimal &number) const { - if (!number.isNanOrInfinity) { +RuleChain::select(const IFixedDecimal &number) const { + if (!number.isNaN() && !number.isInfinite()) { for (const RuleChain *rules = this; rules != NULL; rules = rules->fNext) { if (rules->ruleHeader->isFulfilled(number)) { return rules->fKeyword; @@ -1405,13 +1407,34 @@ PluralKeywordEnumeration::count(UErrorCode& /*status*/) const { PluralKeywordEnumeration::~PluralKeywordEnumeration() { } +PluralOperand tokenTypeToPluralOperand(tokenType tt) { + switch(tt) { + case tVariableN: + return PLURAL_OPERAND_N; + case tVariableI: + return PLURAL_OPERAND_I; + case tVariableF: + return PLURAL_OPERAND_F; + case tVariableV: + return PLURAL_OPERAND_V; + case tVariableT: + return PLURAL_OPERAND_T; + default: + U_ASSERT(FALSE); // unexpected. + return PLURAL_OPERAND_N; + } +} + +IFixedDecimal::~IFixedDecimal() = default; + FixedDecimal::FixedDecimal(const VisibleDigits &digits) { digits.getFixedDecimal( source, intValue, decimalDigits, decimalDigitsWithoutTrailingZeros, visibleDecimalDigitCount, hasIntegerValue); isNegative = digits.isNegative(); - isNanOrInfinity = digits.isNaNOrInfinity(); + _isNaN = digits.isNaN(); + _isInfinite = digits.isInfinite(); } FixedDecimal::FixedDecimal(double n, int32_t v, int64_t f) { @@ -1476,9 +1499,12 @@ FixedDecimal::FixedDecimal(const FixedDecimal &other) { intValue = other.intValue; hasIntegerValue = other.hasIntegerValue; isNegative = other.isNegative; - isNanOrInfinity = other.isNanOrInfinity; + _isNaN = other._isNaN; + _isInfinite = other._isInfinite; } +FixedDecimal::~FixedDecimal() = default; + void FixedDecimal::init(double n) { int32_t numFractionDigits = decimals(n); @@ -1489,8 +1515,9 @@ void FixedDecimal::init(double n) { void FixedDecimal::init(double n, int32_t v, int64_t f) { isNegative = n < 0.0; source = fabs(n); - isNanOrInfinity = uprv_isNaN(source) || uprv_isPositiveInfinity(source); - if (isNanOrInfinity) { + _isNaN = uprv_isNaN(source); + _isInfinite = uprv_isInfinite(source); + if (_isNaN || _isInfinite) { v = 0; f = 0; intValue = 0; @@ -1610,19 +1637,31 @@ void FixedDecimal::adjustForMinFractionDigits(int32_t minFractionDigits) { } -double FixedDecimal::get(tokenType operand) const { +double FixedDecimal::getPluralOperand(PluralOperand operand) const { switch(operand) { - case tVariableN: return source; - case tVariableI: return (double)intValue; - case tVariableF: return (double)decimalDigits; - case tVariableT: return (double)decimalDigitsWithoutTrailingZeros; - case tVariableV: return visibleDecimalDigitCount; + case PLURAL_OPERAND_N: return source; + case PLURAL_OPERAND_I: return static_cast(intValue); + case PLURAL_OPERAND_F: return static_cast(decimalDigits); + case PLURAL_OPERAND_T: return static_cast(decimalDigitsWithoutTrailingZeros); + case PLURAL_OPERAND_V: return visibleDecimalDigitCount; default: U_ASSERT(FALSE); // unexpected. return source; } } +bool FixedDecimal::isNaN() const { + return _isNaN; +} + +bool FixedDecimal::isInfinite() const { + return _isInfinite; +} + +bool FixedDecimal::isNanOrInfinity() const { + return _isNaN || _isInfinite; +} + int32_t FixedDecimal::getVisibleFractionDigitCount() const { return visibleDecimalDigitCount; } @@ -1665,7 +1704,7 @@ const char *PluralAvailableLocalesEnumeration::next(int32_t *resultLength, UErro } const char *result = ures_getKey(fRes); if (resultLength != NULL) { - *resultLength = uprv_strlen(result); + *resultLength = static_cast(uprv_strlen(result)); } return result; } diff --git a/deps/icu-small/source/i18n/plurrule_impl.h b/deps/icu-small/source/i18n/plurrule_impl.h index 9f5f66c1b74122..b93fc501baced2 100644 --- a/deps/icu-small/source/i18n/plurrule_impl.h +++ b/deps/icu-small/source/i18n/plurrule_impl.h @@ -28,6 +28,7 @@ #include "unicode/ures.h" #include "uvector.h" #include "hash.h" +#include "uassert.h" class PluralRulesTest; @@ -177,6 +178,74 @@ class PluralRuleParser: public UMemory { }; +enum PluralOperand { + /** + * The double value of the entire number. + */ + PLURAL_OPERAND_N, + + /** + * The integer value, with the fraction digits truncated off. + */ + PLURAL_OPERAND_I, + + /** + * All visible fraction digits as an integer, including trailing zeros. + */ + PLURAL_OPERAND_F, + + /** + * Visible fraction digits as an integer, not including trailing zeros. + */ + PLURAL_OPERAND_T, + + /** + * Number of visible fraction digits. + */ + PLURAL_OPERAND_V, + + /** + * Number of visible fraction digits, not including trailing zeros. + */ + PLURAL_OPERAND_W, + + /** + * THIS OPERAND IS DEPRECATED AND HAS BEEN REMOVED FROM THE SPEC. + * + *

    Returns the integer value, but will fail if the number has fraction digits. + * That is, using "j" instead of "i" is like implicitly adding "v is 0". + * + *

    For example, "j is 3" is equivalent to "i is 3 and v is 0": it matches + * "3" but not "3.1" or "3.0". + */ + PLURAL_OPERAND_J +}; + +/** + * Converts from the tokenType enum to PluralOperand. Asserts that the given + * tokenType can be mapped to a PluralOperand. + */ +PluralOperand tokenTypeToPluralOperand(tokenType tt); + +/** + * An interface to FixedDecimal, allowing for other implementations. + * @internal + */ +class U_I18N_API IFixedDecimal { + public: + virtual ~IFixedDecimal(); + + /** + * Returns the value corresponding to the specified operand (n, i, f, t, v, or w). + * If the operand is 'n', returns a double; otherwise, returns an integer. + */ + virtual double getPluralOperand(PluralOperand operand) const = 0; + + virtual bool isNaN() const = 0; + + virtual bool isInfinite() const = 0; +}; + /** * class FixedDecimal serves to communicate the properties * of a formatted number from a decimal formatter to PluralRules::select() @@ -184,7 +253,7 @@ class PluralRuleParser: public UMemory { * see DecimalFormat::getFixedDecimal() * @internal */ -class U_I18N_API FixedDecimal: public UMemory { +class U_I18N_API FixedDecimal: public IFixedDecimal, public UObject { public: /** * @param n the number, e.g. 12.345 @@ -196,10 +265,16 @@ class U_I18N_API FixedDecimal: public UMemory { explicit FixedDecimal(double n); explicit FixedDecimal(const VisibleDigits &n); FixedDecimal(); + ~FixedDecimal() U_OVERRIDE; FixedDecimal(const UnicodeString &s, UErrorCode &ec); FixedDecimal(const FixedDecimal &other); - double get(tokenType operand) const; + double getPluralOperand(PluralOperand operand) const U_OVERRIDE; + bool isNaN() const U_OVERRIDE; + bool isInfinite() const U_OVERRIDE; + + bool isNanOrInfinity() const; // used in decimfmtimpl.cpp + int32_t getVisibleFractionDigitCount() const; void init(double n, int32_t v, int64_t f); @@ -217,7 +292,8 @@ class U_I18N_API FixedDecimal: public UMemory { int64_t intValue; UBool hasIntegerValue; UBool isNegative; - UBool isNanOrInfinity; + UBool _isNaN; + UBool _isInfinite; }; class AndConstraint : public UMemory { @@ -240,7 +316,7 @@ class AndConstraint : public UMemory { virtual ~AndConstraint(); AndConstraint* add(); // UBool isFulfilled(double number); - UBool isFulfilled(const FixedDecimal &number); + UBool isFulfilled(const IFixedDecimal &number); }; class OrConstraint : public UMemory { @@ -253,7 +329,7 @@ class OrConstraint : public UMemory { virtual ~OrConstraint(); AndConstraint* add(); // UBool isFulfilled(double number); - UBool isFulfilled(const FixedDecimal &number); + UBool isFulfilled(const IFixedDecimal &number); }; class RuleChain : public UMemory { @@ -271,7 +347,7 @@ class RuleChain : public UMemory { RuleChain(const RuleChain& other); virtual ~RuleChain(); - UnicodeString select(const FixedDecimal &number) const; + UnicodeString select(const IFixedDecimal &number) const; void dumpRules(UnicodeString& result); UErrorCode getKeywords(int32_t maxArraySize, UnicodeString *keywords, int32_t& arraySize) const; UBool isKeyword(const UnicodeString& keyword) const; diff --git a/deps/icu-small/source/i18n/precision.cpp b/deps/icu-small/source/i18n/precision.cpp index 4a68b0d8867053..97dc13dc385651 100644 --- a/deps/icu-small/source/i18n/precision.cpp +++ b/deps/icu-small/source/i18n/precision.cpp @@ -239,10 +239,10 @@ FixedPrecision::initVisibleDigits( } } // Try fast path - if (n >= 0 && initVisibleDigits(scaled, -n, digits, status)) { + if (n >= 0 && initVisibleDigits(static_cast(scaled), -n, digits, status)) { digits.fAbsDoubleValue = fabs(value); digits.fAbsDoubleValueSet = U_SUCCESS(status) && !digits.isOverMaxDigits(); - // Adjust for negative 0 becuase when we cast to an int64, + // Adjust for negative 0 because when we cast to an int64, // negative 0 becomes positive 0. if (scaled == 0.0 && uprv_isNegative(scaled)) { digits.setNegative(); diff --git a/deps/icu-small/source/i18n/rbnf.cpp b/deps/icu-small/source/i18n/rbnf.cpp index d4fd57499825cc..5b54e303f3ab20 100644 --- a/deps/icu-small/source/i18n/rbnf.cpp +++ b/deps/icu-small/source/i18n/rbnf.cpp @@ -316,13 +316,33 @@ class LocDataParser { private: - void inc(void) { ++p; ch = 0xffff; } - UBool checkInc(UChar c) { if (p < e && (ch == c || *p == c)) { inc(); return TRUE; } return FALSE; } - UBool check(UChar c) { return p < e && (ch == c || *p == c); } - void skipWhitespace(void) { while (p < e && PatternProps::isWhiteSpace(ch != 0xffff ? ch : *p)) inc();} - UBool inList(UChar c, const UChar* list) const { - if (*list == SPACE && PatternProps::isWhiteSpace(c)) return TRUE; - while (*list && *list != c) ++list; return *list == c; + inline void inc(void) { + ++p; + ch = 0xffff; + } + inline UBool checkInc(UChar c) { + if (p < e && (ch == c || *p == c)) { + inc(); + return TRUE; + } + return FALSE; + } + inline UBool check(UChar c) { + return p < e && (ch == c || *p == c); + } + inline void skipWhitespace(void) { + while (p < e && PatternProps::isWhiteSpace(ch != 0xffff ? ch : *p)) { + inc(); + } + } + inline UBool inList(UChar c, const UChar* list) const { + if (*list == SPACE && PatternProps::isWhiteSpace(c)) { + return TRUE; + } + while (*list && *list != c) { + ++list; + } + return *list == c; } void parseError(const char* msg); @@ -667,6 +687,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -691,6 +712,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -715,6 +737,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -738,6 +761,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -762,6 +786,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const UnicodeString& description, , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -783,6 +808,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(URBNFRuleSetTag tag, const Locale& , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -849,6 +875,7 @@ RuleBasedNumberFormat::RuleBasedNumberFormat(const RuleBasedNumberFormat& rhs) , decimalFormatSymbols(NULL) , defaultInfinityRule(NULL) , defaultNaNRule(NULL) + , roundingMode(DecimalFormat::ERoundingMode::kRoundUnnecessary) , lenient(FALSE) , lenientParseRules(NULL) , localizations(NULL) @@ -878,6 +905,7 @@ RuleBasedNumberFormat::operator=(const RuleBasedNumberFormat& rhs) setDecimalFormatSymbols(*rhs.getDecimalFormatSymbols()); init(rhs.originalDescription, rhs.localizations ? rhs.localizations->ref() : NULL, perror, status); setDefaultRuleSet(rhs.getDefaultRuleSetName(), status); + setRoundingMode(rhs.getRoundingMode()); capitalizationInfoSet = rhs.capitalizationInfoSet; capitalizationForUIListMenu = rhs.capitalizationForUIListMenu; @@ -1172,12 +1200,11 @@ RuleBasedNumberFormat::format(double number, UnicodeString& toAppendTo, FieldPosition& /* pos */) const { - int32_t startPos = toAppendTo.length(); UErrorCode status = U_ZERO_ERROR; if (defaultRuleSet) { - defaultRuleSet->format(number, toAppendTo, toAppendTo.length(), 0, status); + format(number, *defaultRuleSet, toAppendTo, status); } - return adjustForCapitalizationContext(startPos, toAppendTo, status); + return toAppendTo; } @@ -1228,15 +1255,31 @@ RuleBasedNumberFormat::format(double number, } else { NFRuleSet *rs = findRuleSet(ruleSetName, status); if (rs) { - int32_t startPos = toAppendTo.length(); - rs->format(number, toAppendTo, toAppendTo.length(), 0, status); - adjustForCapitalizationContext(startPos, toAppendTo, status); + format(number, *rs, toAppendTo, status); } } } return toAppendTo; } +void +RuleBasedNumberFormat::format(double number, + NFRuleSet& rs, + UnicodeString& toAppendTo, + UErrorCode& status) const +{ + int32_t startPos = toAppendTo.length(); + if (getRoundingMode() != DecimalFormat::ERoundingMode::kRoundUnnecessary && !uprv_isNaN(number) && !uprv_isInfinite(number)) { + DigitList digitList; + digitList.set(number); + digitList.setRoundingMode(getRoundingMode()); + digitList.roundFixedPoint(getMaximumFractionDigits()); + number = digitList.getDouble(); + } + rs.format(number, toAppendTo, toAppendTo.length(), 0, status); + adjustForCapitalizationContext(startPos, toAppendTo, status); +} + /** * Bottleneck through which all the public format() methods * that take a long pass. By the time we get here, we know @@ -1939,6 +1982,23 @@ RuleBasedNumberFormat::createPluralFormat(UPluralType pluralType, return new PluralFormat(locale, pluralType, pattern, status); } +/** + * Get the rounding mode. + * @return A rounding mode + */ +DecimalFormat::ERoundingMode RuleBasedNumberFormat::getRoundingMode() const { + return roundingMode; +} + +/** + * Set the rounding mode. This has no effect unless the rounding + * increment is greater than zero. + * @param roundingMode A rounding mode + */ +void RuleBasedNumberFormat::setRoundingMode(DecimalFormat::ERoundingMode roundingMode) { + this->roundingMode = roundingMode; +} + U_NAMESPACE_END /* U_HAVE_RBNF */ diff --git a/deps/icu-small/source/i18n/regexcst.pl b/deps/icu-small/source/i18n/regexcst.pl old mode 100755 new mode 100644 diff --git a/deps/icu-small/source/i18n/reldatefmt.cpp b/deps/icu-small/source/i18n/reldatefmt.cpp index 18c073b9eee1df..5cf053db9a98fb 100644 --- a/deps/icu-small/source/i18n/reldatefmt.cpp +++ b/deps/icu-small/source/i18n/reldatefmt.cpp @@ -560,7 +560,7 @@ struct RelDateTimeFmtDataSink : public ResourceSink { RelDateTimeFmtDataSink::~RelDateTimeFmtDataSink() {} } // namespace -DateFormatSymbols::DtWidthType styleToDateFormatSymbolWidth[UDAT_STYLE_COUNT] = { +static const DateFormatSymbols::DtWidthType styleToDateFormatSymbolWidth[UDAT_STYLE_COUNT] = { DateFormatSymbols::WIDE, DateFormatSymbols::SHORT, DateFormatSymbols::NARROW }; diff --git a/deps/icu-small/source/i18n/rematch.cpp b/deps/icu-small/source/i18n/rematch.cpp index e3fdff7484506f..1bdad187762a25 100644 --- a/deps/icu-small/source/i18n/rematch.cpp +++ b/deps/icu-small/source/i18n/rematch.cpp @@ -2200,7 +2200,7 @@ int32_t RegexMatcher::split(UText *input, if (dest[i] == NULL) { dest[i] = utext_openUChars(NULL, NULL, 0, &status); } else { - static UChar emptyString[] = {(UChar)0}; + static const UChar emptyString[] = {(UChar)0}; utext_replace(dest[i], 0, utext_nativeLength(dest[i]), emptyString, 0, &status); } } diff --git a/deps/icu-small/source/i18n/smpdtfmt.cpp b/deps/icu-small/source/i18n/smpdtfmt.cpp index 3c0670446b3876..27fbbd8f7a9ef5 100644 --- a/deps/icu-small/source/i18n/smpdtfmt.cpp +++ b/deps/icu-small/source/i18n/smpdtfmt.cpp @@ -71,6 +71,7 @@ #include "uvector.h" #include "cstr.h" #include "dayperiodrules.h" +#include "tznames_impl.h" // ZONE_NAME_U16_MAX #if defined( U_DEBUG_CALSVC ) || defined (U_DEBUG_CAL) #include @@ -1690,7 +1691,7 @@ SimpleDateFormat::subFormat(UnicodeString &appendTo, case UDAT_TIMEZONE_ISO_FIELD: // 'X' case UDAT_TIMEZONE_ISO_LOCAL_FIELD: // 'x' { - UChar zsbuf[64]; + UChar zsbuf[ZONE_NAME_U16_MAX]; UnicodeString zoneString(zsbuf, 0, UPRV_LENGTHOF(zsbuf)); const TimeZone& tz = cal.getTimeZone(); UDate date = cal.getTime(status); @@ -3053,9 +3054,9 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC // is treated literally: "2250", "-1", "1", "002". if (fDateOverride.compare(hebr)==0 && value < 1000) { value += HEBREW_CAL_CUR_MILLENIUM_START_YEAR; - } else if ((pos.getIndex() - start) == 2 && !isChineseCalendar - && u_isdigit(text.charAt(start)) - && u_isdigit(text.charAt(start+1))) + } else if (text.moveIndex32(start, 2) == pos.getIndex() && !isChineseCalendar + && u_isdigit(text.char32At(start)) + && u_isdigit(text.char32At(text.moveIndex32(start, 1)))) { // only adjust year for patterns less than 3. if(count < 3) { @@ -3093,9 +3094,9 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC // Comment is the same as for UDAT_Year_FIELDs - look above if (fDateOverride.compare(hebr)==0 && value < 1000) { value += HEBREW_CAL_CUR_MILLENIUM_START_YEAR; - } else if ((pos.getIndex() - start) == 2 - && u_isdigit(text.charAt(start)) - && u_isdigit(text.charAt(start+1)) + } else if (text.moveIndex32(start, 2) == pos.getIndex() + && u_isdigit(text.char32At(start)) + && u_isdigit(text.char32At(text.moveIndex32(start, 1))) && fHaveDefaultCentury ) { int32_t ambiguousTwoDigitYear = fDefaultCenturyStartYear % 100; @@ -3201,7 +3202,7 @@ int32_t SimpleDateFormat::subParse(const UnicodeString& text, int32_t& start, UC case UDAT_FRACTIONAL_SECOND_FIELD: // Fractional seconds left-justify - i = pos.getIndex() - start; + i = countDigits(text, start, pos.getIndex()); if (i < 3) { while (i < 3) { value *= 10; @@ -3727,6 +3728,19 @@ void SimpleDateFormat::parseInt(const UnicodeString& text, } } +int32_t SimpleDateFormat::countDigits(const UnicodeString& text, int32_t start, int32_t end) const { + int32_t numDigits = 0; + int32_t idx = start; + while (idx < end) { + UChar32 cp = text.char32At(idx); + if (u_isdigit(cp)) { + numDigits++; + } + idx += U16_LENGTH(cp); + } + return numDigits; +} + //---------------------------------------------------------------------- void SimpleDateFormat::translatePattern(const UnicodeString& originalPattern, diff --git a/deps/icu-small/source/i18n/transreg.cpp b/deps/icu-small/source/i18n/transreg.cpp index d864ad34636178..331f4efdeb339a 100644 --- a/deps/icu-small/source/i18n/transreg.cpp +++ b/deps/icu-small/source/i18n/transreg.cpp @@ -46,11 +46,29 @@ static const UChar LOCALE_SEP = 95; // '_' //static const UChar VARIANT_SEP = 0x002F; // '/' // String constants -static const UChar ANY[] = { 65, 110, 121, 0 }; // Any +static const UChar ANY[] = { 0x41, 0x6E, 0x79, 0 }; // Any +static const UChar LAT[] = { 0x4C, 0x61, 0x74, 0 }; // Lat // empty string #define NO_VARIANT UnicodeString() +// initial estimate for specDAG size +// ICU 60 Transliterator::countAvailableSources() +#define SPECDAG_INIT_SIZE 149 + +// initial estimate for number of variant names +#define VARIANT_LIST_INIT_SIZE 11 +#define VARIANT_LIST_MAX_SIZE 31 + +// initial estimate for availableIDs count (default estimate is 8 => multiple reallocs) +// ICU 60 Transliterator::countAvailableIDs() +#define AVAILABLE_IDS_INIT_SIZE 641 + +// initial estimate for number of targets for source "Any", "Lat" +// ICU 60 Transliterator::countAvailableTargets("Any")/("Latn") +#define ANY_TARGETS_INIT_SIZE 125 +#define LAT_TARGETS_INIT_SIZE 23 + /** * Resource bundle key for the RuleBasedTransliterator rule. */ @@ -517,10 +535,17 @@ U_CDECL_END TransliteratorRegistry::TransliteratorRegistry(UErrorCode& status) : registry(TRUE, status), - specDAG(TRUE, status), - availableIDs(status) + specDAG(TRUE, SPECDAG_INIT_SIZE, status), + variantList(VARIANT_LIST_INIT_SIZE, status), + availableIDs(AVAILABLE_IDS_INIT_SIZE, status) { registry.setValueDeleter(deleteEntry); + variantList.setDeleter(uprv_deleteUObject); + variantList.setComparer(uhash_compareCaselessUnicodeString); + UnicodeString *emptyString = new UnicodeString(); + if (emptyString != NULL) { + variantList.addElement(emptyString, status); + } availableIDs.setDeleter(uprv_deleteUObject); availableIDs.setComparer(uhash_compareCaselessUnicodeString); specDAG.setValueDeleter(uhash_deleteHashtable); @@ -781,9 +806,15 @@ int32_t TransliteratorRegistry::countAvailableVariants(const UnicodeString& sour if (targets == 0) { return 0; } - UVector *variants = (UVector*) targets->get(target); - // variants may be 0 if the source/target are invalid - return (variants == 0) ? 0 : variants->size(); + uint32_t varMask = targets->geti(target); + int32_t varCount = 0; + while (varMask > 0) { + if (varMask & 1) { + varCount++; + } + varMask >>= 1; + } + return varCount; } UnicodeString& TransliteratorRegistry::getAvailableVariant(int32_t index, @@ -795,17 +826,25 @@ UnicodeString& TransliteratorRegistry::getAvailableVariant(int32_t index, result.truncate(0); // invalid source return result; } - UVector *variants = (UVector*) targets->get(target); - if (variants == 0) { - result.truncate(0); // invalid target - return result; - } - UnicodeString *v = (UnicodeString*) variants->elementAt(index); - if (v == 0) { - result.truncate(0); // invalid index - } else { - result = *v; + uint32_t varMask = targets->geti(target); + int32_t varCount = 0; + int32_t varListIndex = 0; + while (varMask > 0) { + if (varMask & 1) { + if (varCount == index) { + UnicodeString *v = (UnicodeString*) variantList.elementAt(varListIndex); + if (v != NULL) { + result = *v; + return result; + } + break; + } + varCount++; + } + varMask >>= 1; + varListIndex++; } + result.truncate(0); // invalid target or index return result; } @@ -911,9 +950,9 @@ void TransliteratorRegistry::registerEntry(const UnicodeString& ID, UnicodeString *newID = (UnicodeString *)ID.clone(); // Check to make sure newID was created. if (newID != NULL) { - // NUL-terminate the ID string - newID->getTerminatedBuffer(); - availableIDs.addElement(newID, status); + // NUL-terminate the ID string + newID->getTerminatedBuffer(); + availableIDs.addElement(newID, status); } } } else { @@ -924,9 +963,7 @@ void TransliteratorRegistry::registerEntry(const UnicodeString& ID, /** * Register a source-target/variant in the specDAG. Variant may be - * empty, but source and target must not be. If variant is empty then - * the special variant NO_VARIANT is stored in slot zero of the - * UVector of variants. + * empty, but source and target must not be. */ void TransliteratorRegistry::registerSTV(const UnicodeString& source, const UnicodeString& target, @@ -936,39 +973,38 @@ void TransliteratorRegistry::registerSTV(const UnicodeString& source, UErrorCode status = U_ZERO_ERROR; Hashtable *targets = (Hashtable*) specDAG.get(source); if (targets == 0) { - targets = new Hashtable(TRUE, status); - if (U_FAILURE(status) || targets == 0) { + int32_t size = 3; + if (source.compare(ANY,3) == 0) { + size = ANY_TARGETS_INIT_SIZE; + } else if (source.compare(LAT,3) == 0) { + size = LAT_TARGETS_INIT_SIZE; + } + targets = new Hashtable(TRUE, size, status); + if (U_FAILURE(status) || targets == NULL) { return; } - targets->setValueDeleter(uprv_deleteUObject); specDAG.put(source, targets, status); } - UVector *variants = (UVector*) targets->get(target); - if (variants == 0) { - variants = new UVector(uprv_deleteUObject, - uhash_compareCaselessUnicodeString, status); - if (variants == 0) { + int32_t variantListIndex = variantList.indexOf((void*) &variant, 0); + if (variantListIndex < 0) { + if (variantList.size() >= VARIANT_LIST_MAX_SIZE) { + // can't handle any more variants return; } - targets->put(target, variants, status); - } - // assert(NO_VARIANT == ""); - // We add the variant string. If it is the special "no variant" - // string, that is, the empty string, we add it at position zero. - if (!variants->contains((void*) &variant)) { - UnicodeString *tempus; // Used for null pointer check. - if (variant.length() > 0) { - tempus = new UnicodeString(variant); - if (tempus != NULL) { - variants->addElement(tempus, status); - } - } else { - tempus = new UnicodeString(); // = NO_VARIANT - if (tempus != NULL) { - variants->insertElementAt(tempus, 0, status); - } + UnicodeString *variantEntry = new UnicodeString(variant); + if (variantEntry != NULL) { + variantList.addElement(variantEntry, status); + if (U_SUCCESS(status)) { + variantListIndex = variantList.size() - 1; + } + } + if (variantListIndex < 0) { + return; } } + uint32_t addMask = 1 << variantListIndex; + uint32_t varMask = targets->geti(target); + targets->puti(target, varMask | addMask, status); } /** @@ -979,17 +1015,24 @@ void TransliteratorRegistry::removeSTV(const UnicodeString& source, const UnicodeString& variant) { // assert(source.length() > 0); // assert(target.length() > 0); -// UErrorCode status = U_ZERO_ERROR; + UErrorCode status = U_ZERO_ERROR; Hashtable *targets = (Hashtable*) specDAG.get(source); - if (targets == 0) { + if (targets == NULL) { return; // should never happen for valid s-t/v } - UVector *variants = (UVector*) targets->get(target); - if (variants == 0) { + uint32_t varMask = targets->geti(target); + if (varMask == 0) { return; // should never happen for valid s-t/v } - variants->removeElement((void*) &variant); - if (variants->size() == 0) { + int32_t variantListIndex = variantList.indexOf((void*) &variant, 0); + if (variantListIndex < 0) { + return; // should never happen for valid s-t/v + } + int32_t remMask = 1 << variantListIndex; + varMask &= (~remMask); + if (varMask != 0) { + targets->puti(target, varMask, status); + } else { targets->remove(target); // should delete variants if (targets->count() == 0) { specDAG.remove(source); // should delete targets @@ -1281,8 +1324,8 @@ Transliterator* TransliteratorRegistry::instantiateEntry(const UnicodeString& ID UVector* rbts = new UVector(entry->u.dataVector->size(), status); // Check for null pointer if (rbts == NULL) { - status = U_MEMORY_ALLOCATION_ERROR; - return NULL; + status = U_MEMORY_ALLOCATION_ERROR; + return NULL; } int32_t passNumber = 1; for (int32_t i = 0; U_SUCCESS(status) && i < entry->u.dataVector->size(); i++) { diff --git a/deps/icu-small/source/i18n/transreg.h b/deps/icu-small/source/i18n/transreg.h index 6fc35c8247b341..041244e1b02d77 100644 --- a/deps/icu-small/source/i18n/transreg.h +++ b/deps/icu-small/source/i18n/transreg.h @@ -440,13 +440,15 @@ class TransliteratorRegistry : public UMemory { /** * DAG of visible IDs by spec. Hashtable: source => (Hashtable: - * target => (UVector: variant)) The UVector of variants is never - * empty. For a source-target with no variant, the special - * variant NO_VARIANT (the empty string) is stored in slot zero of - * the UVector. + * target => variant bitmask) */ Hashtable specDAG; + /** + * Vector of all variant names + */ + UVector variantList; + /** * Vector of public full IDs. */ diff --git a/deps/icu-small/source/i18n/tzfmt.cpp b/deps/icu-small/source/i18n/tzfmt.cpp index 45eda6ffb61043..69da4667bc89ac 100644 --- a/deps/icu-small/source/i18n/tzfmt.cpp +++ b/deps/icu-small/source/i18n/tzfmt.cpp @@ -18,6 +18,7 @@ #include "unicode/uchar.h" #include "unicode/udat.h" #include "unicode/ustring.h" +#include "unicode/utf16.h" #include "tzgnames.h" #include "cmemory.h" #include "cstring.h" @@ -30,6 +31,7 @@ #include "uvector.h" #include "zonemeta.h" #include "tznames_impl.h" // TextTrieMap +#include "patternprops.h" U_NAMESPACE_BEGIN @@ -320,7 +322,7 @@ TimeZoneFormat::TimeZoneFormat(const Locale& locale, UErrorCode& status) } const char* region = fLocale.getCountry(); - int32_t regionLen = uprv_strlen(region); + int32_t regionLen = static_cast(uprv_strlen(region)); if (regionLen == 0) { char loc[ULOC_FULLNAME_CAPACITY]; uloc_addLikelySubtags(fLocale.getName(), loc, sizeof(loc), &status); @@ -788,7 +790,7 @@ TimeZoneFormat::format(const Formattable& obj, UnicodeString& appendTo, if (tz != NULL) { int32_t rawOffset, dstOffset; tz->getOffset(date, FALSE, rawOffset, dstOffset, status); - UChar buf[32]; + UChar buf[ZONE_NAME_U16_MAX]; UnicodeString result(buf, 0, UPRV_LENGTHOF(buf)); formatOffsetLocalizedGMT(rawOffset + dstOffset, result, status); if (U_SUCCESS(status)) { @@ -1414,7 +1416,7 @@ TimeZoneFormat::getTZDBTimeZoneNames(UErrorCode& status) const { UnicodeString& TimeZoneFormat::formatExemplarLocation(const TimeZone& tz, UnicodeString& name) const { - UChar locationBuf[64]; + UChar locationBuf[ZONE_NAME_U16_MAX]; UnicodeString location(locationBuf, 0, UPRV_LENGTHOF(locationBuf)); const UChar* canonicalID = ZoneMeta::getCanonicalCLDRID(tz); @@ -1812,7 +1814,9 @@ TimeZoneFormat::parseOffsetFields(const UnicodeString& text, int32_t start, UBoo // but it should be parsed as 00:10:20. int32_t tmpLen = 0; int32_t tmpSign = 1; - int32_t tmpH, tmpM, tmpS; + int32_t tmpH = 0; + int32_t tmpM = 0; + int32_t tmpS = 0; for (int32_t patidx = 0; PARSE_GMT_OFFSET_TYPES[patidx] >= 0; patidx++) { int32_t gmtPatType = PARSE_GMT_OFFSET_TYPES[patidx]; @@ -1860,6 +1864,27 @@ TimeZoneFormat::parseOffsetFieldsWithPattern(const UnicodeString& text, int32_t if (fieldType == GMTOffsetField::TEXT) { const UChar* patStr = field->getPatternText(); len = u_strlen(patStr); + if (i == 0) { + // When TimeZoneFormat parse() is called from SimpleDateFormat, + // leading space characters might be truncated. If the first pattern text + // starts with such character (e.g. Bidi control), then we need to + // skip the leading space charcters. + if (idx < text.length() && !PatternProps::isWhiteSpace(text.char32At(idx))) { + while (len > 0) { + UChar32 ch; + int32_t chLen; + U16_GET(patStr, 0, 0, len, ch) + if (PatternProps::isWhiteSpace(ch)) { + chLen = U16_LENGTH(ch); + len -= chLen; + patStr += chLen; + } + else { + break; + } + } + } + } if (text.caseCompare(idx, len, patStr, 0) != 0) { failed = TRUE; break; @@ -2428,7 +2453,7 @@ TimeZoneFormat::parseOffsetPattern(const UnicodeString& pattern, OffsetFields re isPrevQuote = TRUE; if (itemType != GMTOffsetField::TEXT) { if (GMTOffsetField::isValid(itemType, itemLength)) { - GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, (uint8_t)itemLength, status); + GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast(itemLength), status); result->addElement(fld, status); if (U_FAILURE(status)) { break; @@ -2463,7 +2488,7 @@ TimeZoneFormat::parseOffsetPattern(const UnicodeString& pattern, OffsetFields re } } else { if (GMTOffsetField::isValid(itemType, itemLength)) { - GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, itemLength, status); + GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast(itemLength), status); result->addElement(fld, status); if (U_FAILURE(status)) { break; @@ -2481,7 +2506,7 @@ TimeZoneFormat::parseOffsetPattern(const UnicodeString& pattern, OffsetFields re // a string literal if (itemType != GMTOffsetField::TEXT) { if (GMTOffsetField::isValid(itemType, itemLength)) { - GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, itemLength, status); + GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast(itemLength), status); result->addElement(fld, status); if (U_FAILURE(status)) { break; @@ -2506,7 +2531,7 @@ TimeZoneFormat::parseOffsetPattern(const UnicodeString& pattern, OffsetFields re } } else { if (GMTOffsetField::isValid(itemType, itemLength)) { - GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, itemLength, status); + GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast(itemLength), status); result->addElement(fld, status); } else { status = U_ILLEGAL_ARGUMENT_ERROR; @@ -2752,7 +2777,7 @@ static void U_CALLCONV initZoneIdTrie(UErrorCode &status) { } StringEnumeration *tzenum = TimeZone::createEnumeration(); const UnicodeString *id; - while ((id = tzenum->snext(status))) { + while ((id = tzenum->snext(status)) != NULL) { const UChar* uid = ZoneMeta::findTimeZoneID(*id); if (uid) { gZoneIdTrie->put(uid, const_cast(uid), status); @@ -2799,7 +2824,7 @@ static void U_CALLCONV initShortZoneIdTrie(UErrorCode &status) { status = U_MEMORY_ALLOCATION_ERROR; } else { const UnicodeString *id; - while ((id = tzenum->snext(status))) { + while ((id = tzenum->snext(status)) != NULL) { const UChar* uID = ZoneMeta::findTimeZoneID(*id); const UChar* shortID = ZoneMeta::getShortID(*id); if (shortID && uID) { diff --git a/deps/icu-small/source/i18n/tzgnames.cpp b/deps/icu-small/source/i18n/tzgnames.cpp index b14e9835d9ab97..c2e685272e9b36 100644 --- a/deps/icu-small/source/i18n/tzgnames.cpp +++ b/deps/icu-small/source/i18n/tzgnames.cpp @@ -615,7 +615,7 @@ TZGNCore::formatGenericNonLocationName(const TimeZone& tz, UTimeZoneGenericNameT UErrorCode status = U_ZERO_ERROR; UBool useStandard = FALSE; int32_t raw, sav; - UChar tmpNameBuf[64]; + UChar tmpNameBuf[ZONE_NAME_U16_MAX]; tz.getOffset(date, FALSE, raw, sav, status); if (U_FAILURE(status)) { @@ -683,7 +683,7 @@ TZGNCore::formatGenericNonLocationName(const TimeZone& tz, UTimeZoneGenericNameT // for some meta zones in some locales. This looks like a data bugs. // For now, we check if the standard name is different from its generic // name below. - UChar genNameBuf[64]; + UChar genNameBuf[ZONE_NAME_U16_MAX]; UnicodeString mzGenericName(genNameBuf, 0, UPRV_LENGTHOF(genNameBuf)); fTimeZoneNames->getMetaZoneDisplayName(mzID, nameType, mzGenericName); if (stdName.caseCompare(mzGenericName, 0) == 0) { @@ -856,7 +856,7 @@ TZGNCore::loadStrings(const UnicodeString& tzCanonicalID) { }; StringEnumeration *mzIDs = fTimeZoneNames->getAvailableMetaZoneIDs(tzCanonicalID, status); - while ((mzID = mzIDs->snext(status))) { + while ((mzID = mzIDs->snext(status)) != NULL) { if (U_FAILURE(status)) { break; } @@ -1044,7 +1044,7 @@ TZGNCore::findLocal(const UnicodeString& text, int32_t start, uint32_t types, UE StringEnumeration *tzIDs = TimeZone::createTimeZoneIDEnumeration(UCAL_ZONE_TYPE_CANONICAL, NULL, NULL, status); if (U_SUCCESS(status)) { const UnicodeString *tzID; - while ((tzID = tzIDs->snext(status))) { + while ((tzID = tzIDs->snext(status)) != NULL) { if (U_FAILURE(status)) { break; } @@ -1164,7 +1164,7 @@ static void sweepCache() { const UHashElement* elem; double now = (double)uprv_getUTCtime(); - while ((elem = uhash_nextElement(gTZGNCoreCache, &pos))) { + while ((elem = uhash_nextElement(gTZGNCoreCache, &pos)) != NULL) { TZGNCoreRef *entry = (TZGNCoreRef *)elem->value.pointer; if (entry->refCount <= 0 && (now - entry->lastAccess) > CACHE_EXPIRATION) { // delete this entry diff --git a/deps/icu-small/source/i18n/tznames_impl.cpp b/deps/icu-small/source/i18n/tznames_impl.cpp index d00d7e114543bf..ef04b31c1357f4 100644 --- a/deps/icu-small/source/i18n/tznames_impl.cpp +++ b/deps/icu-small/source/i18n/tznames_impl.cpp @@ -18,6 +18,7 @@ #include "unicode/strenum.h" #include "unicode/ustring.h" #include "unicode/timezone.h" +#include "unicode/utf16.h" #include "tznames_impl.h" #include "cmemory.h" @@ -69,7 +70,7 @@ enum UTimeZoneNameTypeIndex { UTZNM_INDEX_SHORT_DAYLIGHT, UTZNM_INDEX_COUNT }; -static const UChar* EMPTY_NAMES[UTZNM_INDEX_COUNT] = {0,0,0,0,0,0,0}; +static const UChar* const EMPTY_NAMES[UTZNM_INDEX_COUNT] = {0,0,0,0,0,0,0}; U_CDECL_BEGIN static UBool U_CALLCONV tzdbTimeZoneNames_cleanup(void) { @@ -411,25 +412,29 @@ TextTrieMap::search(CharacterNode *node, const UnicodeString &text, int32_t star return; } } - UChar32 c = text.char32At(index); if (fIgnoreCase) { - // size of character may grow after fold operation - UnicodeString tmp(c); + // for folding we need to get a complete code point. + // size of character may grow after fold operation; + // then we need to get result as UTF16 code units. + UChar32 c32 = text.char32At(index); + index += U16_LENGTH(c32); + UnicodeString tmp(c32); tmp.foldCase(); int32_t tmpidx = 0; while (tmpidx < tmp.length()) { - c = tmp.char32At(tmpidx); + UChar c = tmp.charAt(tmpidx++); node = getChildNode(node, c); if (node == NULL) { break; } - tmpidx = tmp.moveIndex32(tmpidx, 1); } } else { + // here we just get the next UTF16 code unit + UChar c = text.charAt(index++); node = getChildNode(node, c); } if (node != NULL) { - search(node, text, start, index+1, handler, status); + search(node, text, start, index, handler, status); } } @@ -1070,7 +1075,7 @@ TimeZoneNamesImpl::loadStrings(const UnicodeString& tzCanonicalID, UErrorCode& s U_ASSERT(!mzIDs.isNull()); const UnicodeString *mzID; - while ((mzID = mzIDs->snext(status)) && U_SUCCESS(status)) { + while (((mzID = mzIDs->snext(status)) != NULL) && U_SUCCESS(status)) { loadMetaZoneNames(*mzID, status); } } @@ -1651,7 +1656,7 @@ void TimeZoneNamesImpl::internalLoadAllDisplayNames(UErrorCode& status) { StringEnumeration *tzIDs = TimeZone::createTimeZoneIDEnumeration( UCAL_ZONE_TYPE_CANONICAL, NULL, NULL, status); if (U_SUCCESS(status)) { - while ((id = tzIDs->snext(status))) { + while ((id = tzIDs->snext(status)) != NULL) { if (U_FAILURE(status)) { break; } @@ -2056,6 +2061,9 @@ static void U_CALLCONV prepareFind(UErrorCode &status) { if (U_SUCCESS(status)) { while ((mzID = mzIDs->snext(status)) && U_SUCCESS(status)) { const TZDBNames *names = TZDBTimeZoneNames::getMetaZoneNames(*mzID, status); + if (U_FAILURE(status)) { + break; + } if (names == NULL) { continue; } @@ -2187,9 +2195,11 @@ TZDBTimeZoneNames::getMetaZoneDisplayName(const UnicodeString& mzID, UErrorCode status = U_ZERO_ERROR; const TZDBNames *tzdbNames = TZDBTimeZoneNames::getMetaZoneNames(mzID, status); if (U_SUCCESS(status)) { - const UChar *s = tzdbNames->getName(type); - if (s != NULL) { - name.setTo(TRUE, s, -1); + if (tzdbNames != NULL) { + const UChar *s = tzdbNames->getName(type); + if (s != NULL) { + name.setTo(TRUE, s, -1); + } } } diff --git a/deps/icu-small/source/i18n/tznames_impl.h b/deps/icu-small/source/i18n/tznames_impl.h index 9251f9ef470f6e..4db036e7475e35 100644 --- a/deps/icu-small/source/i18n/tznames_impl.h +++ b/deps/icu-small/source/i18n/tznames_impl.h @@ -27,6 +27,9 @@ #include "uvector.h" #include "umutex.h" +// Some zone display names involving supplementary characters can be over 50 chars, 100 UTF-16 code units, 200 UTF-8 bytes +#define ZONE_NAME_U16_MAX 128 + U_NAMESPACE_BEGIN /* @@ -246,6 +249,8 @@ class TZDBTimeZoneNames : public TimeZoneNames { TimeZoneNames::MatchInfoCollection* find(const UnicodeString& text, int32_t start, uint32_t types, UErrorCode& status) const; + // When TZDBNames for the metazone is not available, this method returns NULL, + // but does NOT set U_MISSING_RESOURCE_ERROR to status. static const TZDBNames* getMetaZoneNames(const UnicodeString& mzId, UErrorCode& status); private: diff --git a/deps/icu-small/source/i18n/ucln_in.h b/deps/icu-small/source/i18n/ucln_in.h index 35a8a23e90c22a..40a5c36d87a9f7 100644 --- a/deps/icu-small/source/i18n/ucln_in.h +++ b/deps/icu-small/source/i18n/ucln_in.h @@ -26,6 +26,7 @@ as the functions are suppose to be called. It's usually best to have child dependencies called first. */ typedef enum ECleanupI18NType { UCLN_I18N_START = -1, + UCLN_I18N_CURRENCY_SPACING, UCLN_I18N_SPOOF, UCLN_I18N_SPOOFDATA, UCLN_I18N_TRANSLITERATOR, diff --git a/deps/icu-small/source/i18n/ucol_res.cpp b/deps/icu-small/source/i18n/ucol_res.cpp index d1597021c3ee47..0f1d6d23b132ae 100644 --- a/deps/icu-small/source/i18n/ucol_res.cpp +++ b/deps/icu-small/source/i18n/ucol_res.cpp @@ -62,7 +62,7 @@ namespace { static const UChar *rootRules = NULL; static int32_t rootRulesLength = 0; static UResourceBundle *rootBundle = NULL; -static UInitOnce gInitOnce = U_INITONCE_INITIALIZER; +static UInitOnce gInitOnceUcolRes = U_INITONCE_INITIALIZER; } // namespace @@ -74,7 +74,7 @@ ucol_res_cleanup() { rootRulesLength = 0; ures_close(rootBundle); rootBundle = NULL; - gInitOnce.reset(); + gInitOnceUcolRes.reset(); return TRUE; } @@ -97,7 +97,7 @@ U_CDECL_END void CollationLoader::appendRootRules(UnicodeString &s) { UErrorCode errorCode = U_ZERO_ERROR; - umtx_initOnce(gInitOnce, CollationLoader::loadRootRules, errorCode); + umtx_initOnce(gInitOnceUcolRes, CollationLoader::loadRootRules, errorCode); if(U_SUCCESS(errorCode)) { s.append(rootRules, rootRulesLength); } @@ -110,7 +110,7 @@ CollationLoader::loadRules(const char *localeID, const char *collationType, U_ASSERT(collationType != NULL && *collationType != 0); // Copy the type for lowercasing. char type[16]; - int32_t typeLength = uprv_strlen(collationType); + int32_t typeLength = static_cast(uprv_strlen(collationType)); if(typeLength >= UPRV_LENGTHOF(type)) { errorCode = U_ILLEGAL_ARGUMENT_ERROR; return; @@ -318,7 +318,7 @@ CollationLoader::loadFromCollations(UErrorCode &errorCode) { // Load the collations/type tailoring, with type fallback. LocalUResourceBundlePointer localData( ures_getByKeyWithFallback(collations, type, NULL, &errorCode)); - int32_t typeLength = uprv_strlen(type); + int32_t typeLength = static_cast(uprv_strlen(type)); if(errorCode == U_MISSING_RESOURCE_ERROR) { errorCode = U_USING_DEFAULT_WARNING; typeFallback = TRUE; diff --git a/deps/icu-small/source/i18n/ucol_sit.cpp b/deps/icu-small/source/i18n/ucol_sit.cpp index cf507f61ed3521..765613084f84e1 100644 --- a/deps/icu-small/source/i18n/ucol_sit.cpp +++ b/deps/icu-small/source/i18n/ucol_sit.cpp @@ -465,8 +465,15 @@ ucol_prepareShortStringOpen( const char *definition, UResourceBundle *collElem = NULL; char keyBuffer[256]; // if there is a keyword, we pick it up and try to get elements - if(!uloc_getKeywordValue(buffer, "collation", keyBuffer, 256, status)) { - // no keyword. we try to find the default setting, which will give us the keyword value + int32_t keyLen = uloc_getKeywordValue(buffer, "collation", keyBuffer, sizeof(keyBuffer), status); + // Treat too long a value as no keyword. + if(keyLen >= (int32_t)sizeof(keyBuffer)) { + keyLen = 0; + *status = U_ZERO_ERROR; + } + if(keyLen == 0) { + // no keyword + // we try to find the default setting, which will give us the keyword value UResourceBundle *defaultColl = ures_getByKeyWithFallback(collations, "default", NULL, status); if(U_SUCCESS(*status)) { int32_t defaultKeyLen = 0; diff --git a/deps/icu-small/source/i18n/umsg.cpp b/deps/icu-small/source/i18n/umsg.cpp index a385eb487d55d3..7f6ba9532feebe 100644 --- a/deps/icu-small/source/i18n/umsg.cpp +++ b/deps/icu-small/source/i18n/umsg.cpp @@ -321,7 +321,7 @@ umsg_applyPattern(UMessageFormat *fmt, if(status ==NULL||U_FAILURE(*status)){ return ; } - if(fmt==NULL||pattern==NULL||patternLength<-1){ + if(fmt==NULL || (pattern==NULL && patternLength!=0) || patternLength<-1) { *status=U_ILLEGAL_ARGUMENT_ERROR; return ; } @@ -329,10 +329,8 @@ umsg_applyPattern(UMessageFormat *fmt, if(parseError==NULL){ parseError = &tErr; } - if(patternLength<-1){ - patternLength=u_strlen(pattern); - } + // UnicodeString(pattern, -1) calls u_strlen(). ((MessageFormat*)fmt)->applyPattern(UnicodeString(pattern,patternLength),*parseError,*status); } diff --git a/deps/icu-small/source/i18n/unicode/calendar.h b/deps/icu-small/source/i18n/unicode/calendar.h index e43c181c8a3368..48021534b422f6 100644 --- a/deps/icu-small/source/i18n/unicode/calendar.h +++ b/deps/icu-small/source/i18n/unicode/calendar.h @@ -1741,7 +1741,7 @@ class U_I18N_API Calendar : public UObject { * reflects local zone wall time. * @internal */ - int32_t computeMillisInDay(); + double computeMillisInDay(); /** * This method can assume EXTENDED_YEAR has been set. @@ -1752,7 +1752,7 @@ class U_I18N_API Calendar : public UObject { * when this function fails. * @internal */ - int32_t computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec); + int32_t computeZoneOffset(double millis, double millisInDay, UErrorCode &ec); /** diff --git a/deps/icu-small/source/i18n/unicode/coll.h b/deps/icu-small/source/i18n/unicode/coll.h index 7e467df80e0409..d03570509ecebb 100644 --- a/deps/icu-small/source/i18n/unicode/coll.h +++ b/deps/icu-small/source/i18n/unicode/coll.h @@ -672,7 +672,7 @@ class U_I18N_API Collator : public UObject { UErrorCode& status); /** - * Get name of the object for the desired Locale, in the desired langauge + * Get name of the object for the desired Locale, in the desired language * @param objectLocale must be from getAvailableLocales * @param displayLocale specifies the desired locale for output * @param name the fill-in parameter of the return value @@ -685,7 +685,7 @@ class U_I18N_API Collator : public UObject { UnicodeString& name); /** - * Get name of the object for the desired Locale, in the langauge of the + * Get name of the object for the desired Locale, in the language of the * default locale. * @param objectLocale must be from getAvailableLocales * @param name the fill-in parameter of the return value diff --git a/deps/icu-small/source/i18n/unicode/currunit.h b/deps/icu-small/source/i18n/unicode/currunit.h index b72dc5e68dd645..e7e0dc72da8292 100644 --- a/deps/icu-small/source/i18n/unicode/currunit.h +++ b/deps/icu-small/source/i18n/unicode/currunit.h @@ -36,6 +36,12 @@ U_NAMESPACE_BEGIN */ class U_I18N_API CurrencyUnit: public MeasureUnit { public: + /** + * Default constructor. Initializes currency code to "XXX" (no currency). + * @draft ICU 60 + */ + CurrencyUnit(); + /** * Construct an object with the given ISO currency code. * @param isoCode the 3-letter ISO 4217 currency code; must not be @@ -52,6 +58,18 @@ class U_I18N_API CurrencyUnit: public MeasureUnit { */ CurrencyUnit(const CurrencyUnit& other); +#ifndef U_HIDE_DRAFT_API + /** + * Copy constructor from MeasureUnit. This constructor allows you to + * restore a CurrencyUnit that was sliced to MeasureUnit. + * + * @param measureUnit The MeasureUnit to copy from. + * @param ec Set to a failing value if the MeasureUnit is not a currency. + * @draft ICU 60 + */ + CurrencyUnit(const MeasureUnit& measureUnit, UErrorCode &ec); +#endif /* U_HIDE_DRAFT_API */ + /** * Assignment operator * @stable ICU 3.0 diff --git a/deps/icu-small/source/i18n/unicode/dcfmtsym.h b/deps/icu-small/source/i18n/unicode/dcfmtsym.h index 3a502d0ec03d1c..4dc6f950f294ca 100644 --- a/deps/icu-small/source/i18n/unicode/dcfmtsym.h +++ b/deps/icu-small/source/i18n/unicode/dcfmtsym.h @@ -34,6 +34,7 @@ #include "unicode/uobject.h" #include "unicode/locid.h" +#include "unicode/numsys.h" #include "unicode/unum.h" #include "unicode/unistr.h" @@ -184,6 +185,26 @@ class U_I18N_API DecimalFormatSymbols : public UObject { */ DecimalFormatSymbols(const Locale& locale, UErrorCode& status); +#ifndef U_HIDE_DRAFT_API + /** + * Creates a DecimalFormatSymbols instance for the given locale with digits and symbols + * corresponding to the given NumberingSystem. + * + * This constructor behaves equivalently to the normal constructor called with a locale having a + * "numbers=xxxx" keyword specifying the numbering system by name. + * + * In this constructor, the NumberingSystem argument will be used even if the locale has its own + * "numbers=xxxx" keyword. + * + * @param locale The locale to get symbols for. + * @param ns The numbering system. + * @param status Input/output parameter, set to success or + * failure code upon return. + * @draft ICU 60 + */ + DecimalFormatSymbols(const Locale& locale, const NumberingSystem& ns, UErrorCode& status); +#endif /* U_HIDE_DRAFT_API */ + /** * Create a DecimalFormatSymbols object for the default locale. * This constructor will not fail. If the resource file data is @@ -346,8 +367,11 @@ class U_I18N_API DecimalFormatSymbols : public UObject { * @param success Input/output parameter, set to success or * failure code upon return. * @param useLastResortData determine if use last resort data + * @param ns The NumberingSystem to use; otherwise, fall + * back to the locale. */ - void initialize(const Locale& locale, UErrorCode& success, UBool useLastResortData = FALSE); + void initialize(const Locale& locale, UErrorCode& success, + UBool useLastResortData = FALSE, const NumberingSystem* ns = nullptr); /** * Initialize the symbols with default values. diff --git a/deps/icu-small/source/i18n/unicode/decimfmt.h b/deps/icu-small/source/i18n/unicode/decimfmt.h index 1deff5bf921c87..790053636d5957 100644 --- a/deps/icu-small/source/i18n/unicode/decimfmt.h +++ b/deps/icu-small/source/i18n/unicode/decimfmt.h @@ -668,28 +668,6 @@ template class U_I18N_API EnumSet - *

    Sample code

    - * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp addPatternExample - *

    + *

    + *

    Sample code

    + * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 + * \snippet samples/dtptngsample/dtptngsample.cpp addPatternExample + *

    */ UDateTimePatternConflict addPattern(const UnicodeString& pattern, UBool override, @@ -312,11 +313,11 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * @return bestPattern * The best pattern found from the given skeleton. * @stable ICU 3.8 - *

    - *

    Sample code

    - * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample - *

    + *

    + *

    Sample code

    + * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 + * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample + *

    */ UnicodeString getBestPattern(const UnicodeString& skeleton, UErrorCode& status); @@ -360,11 +361,11 @@ class U_I18N_API DateTimePatternGenerator : public UObject { * which must not indicate a failure before the function call. * @return pattern adjusted to match the skeleton fields widths and subtypes. * @stable ICU 3.8 - *

    - *

    Sample code

    - * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 - * \snippet samples/dtptngsample/dtptngsample.cpp replaceFieldTypesExample - *

    + *

    + *

    Sample code

    + * \snippet samples/dtptngsample/dtptngsample.cpp getBestPatternExample1 + * \snippet samples/dtptngsample/dtptngsample.cpp replaceFieldTypesExample + *

    */ UnicodeString replaceFieldTypes(const UnicodeString& pattern, const UnicodeString& skeleton, @@ -526,9 +527,8 @@ class U_I18N_API DateTimePatternGenerator : public UObject { enum { kDTPGNoFlags = 0, kDTPGFixFractionalSeconds = 1, - kDTPGSkeletonUsesCapJ = 2, - kDTPGSkeletonUsesLowB = 3, - kDTPGSkeletonUsesCapB = 4 + kDTPGSkeletonUsesCapJ = 2 + // with #13183, no longer need flags for b, B }; void initData(const Locale &locale, UErrorCode &status); @@ -546,6 +546,7 @@ class U_I18N_API DateTimePatternGenerator : public UObject { UDateTimePatternField getAppendNameNumber(const char* field) const; UnicodeString& getMutableAppendItemName(UDateTimePatternField field); void getAppendName(UDateTimePatternField field, UnicodeString& value); + UnicodeString mapSkeletonMetacharacters(const UnicodeString& patternForm, int32_t* flags, UErrorCode& status); int32_t getCanonicalIndex(const UnicodeString& field); const UnicodeString* getBestRaw(DateTimeMatcher& source, int32_t includeMask, DistanceInfo* missingFields, const PtnSkeleton** specifiedSkeletonPtr = 0); UnicodeString adjustFieldTypes(const UnicodeString& pattern, const PtnSkeleton* specifiedSkeleton, int32_t flags, UDateTimePatternMatchOptions options = UDATPG_MATCH_NO_OPTIONS); diff --git a/deps/icu-small/source/i18n/unicode/fpositer.h b/deps/icu-small/source/i18n/unicode/fpositer.h index 898b66ceea50a8..8e9d69c547f849 100644 --- a/deps/icu-small/source/i18n/unicode/fpositer.h +++ b/deps/icu-small/source/i18n/unicode/fpositer.h @@ -47,6 +47,13 @@ U_NAMESPACE_BEGIN class UVector32; +// Forward declaration for number formatting: +namespace number { +namespace impl { +class NumberStringBuilder; +} +} + /** * FieldPositionIterator returns the field ids and their start/limit positions generated * by a call to Format::format. See Format, NumberFormat, DecimalFormat. @@ -99,8 +106,6 @@ class U_I18N_API FieldPositionIterator : public UObject { UBool next(FieldPosition& fp); private: - friend class FieldPositionIteratorHandler; - /** * Sets the data used by the iterator, and resets the position. * Returns U_ILLEGAL_ARGUMENT_ERROR in status if the data is not valid @@ -108,6 +113,9 @@ class U_I18N_API FieldPositionIterator : public UObject { */ void setData(UVector32 *adopt, UErrorCode& status); + friend class FieldPositionIteratorHandler; + friend class number::impl::NumberStringBuilder; + UVector32 *data; int32_t pos; }; diff --git a/deps/icu-small/source/i18n/unicode/measfmt.h b/deps/icu-small/source/i18n/unicode/measfmt.h index dcd4f423430a05..251fd213b50da7 100644 --- a/deps/icu-small/source/i18n/unicode/measfmt.h +++ b/deps/icu-small/source/i18n/unicode/measfmt.h @@ -210,7 +210,6 @@ class U_I18N_API MeasureFormat : public Format { FieldPosition &pos, UErrorCode &status) const; -#ifndef U_HIDE_DRAFT_API /** * Gets the display name of the specified {@link MeasureUnit} corresponding to the current * locale and format width. @@ -220,10 +219,9 @@ class U_I18N_API MeasureFormat : public Format { * {@link MeasureFormat#getInstance}, or null if there is no display name available * for the specified unit. * - * @draft ICU 58 + * @stable ICU 58 */ UnicodeString getUnitDisplayName(const MeasureUnit& unit, UErrorCode &status) const; -#endif /* U_HIDE_DRAFT_API */ /** diff --git a/deps/icu-small/source/i18n/unicode/measunit.h b/deps/icu-small/source/i18n/unicode/measunit.h index 1cb97ed549a121..08c8d6f588dac7 100644 --- a/deps/icu-small/source/i18n/unicode/measunit.h +++ b/deps/icu-small/source/i18n/unicode/measunit.h @@ -40,11 +40,10 @@ class U_I18N_API MeasureUnit: public UObject { /** * Default constructor. + * Populates the instance with the base dimensionless unit. * @stable ICU 3.0 */ - MeasureUnit() : fTypeId(0), fSubTypeId(0) { - fCurrency[0] = 0; - } + MeasureUnit(); /** * Copy constructor. @@ -149,7 +148,7 @@ class U_I18N_API MeasureUnit: public UObject { *

          * .   Base* polymorphic_pointer = createPolymorphicObject();
          * .   if (polymorphic_pointer->getDynamicClassID() ==
    -     * .       erived::getStaticClassID()) ...
    +     * .       Derived::getStaticClassID()) ...
          * 
    * @return The class ID for all objects of this class. * @stable ICU 53 @@ -1317,6 +1316,12 @@ class U_I18N_API MeasureUnit: public UObject { */ void initCurrency(const char *isoCurrency); + /** + * For ICU use only. + * @internal + */ + void initNoUnit(const char *subtype); + #endif /* U_HIDE_INTERNAL_API */ private: diff --git a/deps/icu-small/source/i18n/unicode/nounit.h b/deps/icu-small/source/i18n/unicode/nounit.h new file mode 100644 index 00000000000000..04fc84b33aa338 --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/nounit.h @@ -0,0 +1,111 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* + ******************************************************************************* + * Copyright (C) 2009-2017, International Business Machines Corporation, * + * Google, and others. All Rights Reserved. * + ******************************************************************************* + */ + +#ifndef __NOUNIT_H__ +#define __NOUNIT_H__ + + +/** + * \file + * \brief C++ API: units for percent and permille + */ + + +#include "unicode/measunit.h" + +#if !UCONFIG_NO_FORMATTING + +U_NAMESPACE_BEGIN + +#ifndef U_HIDE_DRAFT_API +/** + * Dimensionless unit for percent and permille. + * @see NumberFormatter + * @draft ICU 60 + */ +class U_I18N_API NoUnit: public MeasureUnit { +public: + /** + * Returns an instance for the base unit (dimensionless and no scaling). + * + * @return a NoUnit instance + * @draft ICU 60 + */ + static NoUnit U_EXPORT2 base(); + + /** + * Returns an instance for percent, or 1/100 of a base unit. + * + * @return a NoUnit instance + * @draft ICU 60 + */ + static NoUnit U_EXPORT2 percent(); + + /** + * Returns an instance for permille, or 1/1000 of a base unit. + * + * @return a NoUnit instance + * @draft ICU 60 + */ + static NoUnit U_EXPORT2 permille(); + + /** + * Copy operator. + * @draft ICU 60 + */ + NoUnit(const NoUnit& other); + + /** + * Return a polymorphic clone of this object. The result will + * have the same class as returned by getDynamicClassID(). + * @draft ICU 60 + */ + virtual UObject* clone() const; + + /** + * Returns a unique class ID for this object POLYMORPHICALLY. + * This method implements a simple form of RTTI used by ICU. + * @return The class ID for this object. All objects of a given + * class have the same class ID. Objects of other classes have + * different class IDs. + * @draft ICU 60 + */ + virtual UClassID getDynamicClassID() const; + + /** + * Returns the class ID for this class. This is used to compare to + * the return value of getDynamicClassID(). + * @return The class ID for all objects of this class. + * @draft ICU 60 + */ + static UClassID U_EXPORT2 getStaticClassID(); + + /** + * Destructor. + * @draft ICU 60 + */ + virtual ~NoUnit(); + +private: + /** + * Constructor + * @internal (private) + */ + NoUnit(const char* subtype); + +}; +#endif /* U_HIDE_DRAFT_API */ + +U_NAMESPACE_END + +#endif /* #if !UCONFIG_NO_FORMATTING */ + +#endif // __NOUNIT_H__ +//eof +// diff --git a/deps/icu-small/source/i18n/unicode/numberformatter.h b/deps/icu-small/source/i18n/unicode/numberformatter.h new file mode 100644 index 00000000000000..4a11c2f9157e61 --- /dev/null +++ b/deps/icu-small/source/i18n/unicode/numberformatter.h @@ -0,0 +1,1998 @@ +// © 2017 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING +#ifndef __NUMBERFORMATTER_H__ +#define __NUMBERFORMATTER_H__ + +#include "unicode/appendable.h" +#include "unicode/dcfmtsym.h" +#include "unicode/currunit.h" +#include "unicode/fieldpos.h" +#include "unicode/fpositer.h" +#include "unicode/measunit.h" +#include "unicode/nounit.h" +#include "unicode/plurrule.h" +#include "unicode/ucurr.h" +#include "unicode/unum.h" + +#ifndef U_HIDE_DRAFT_API + +/** + * \file + * \brief C++ API: Library for localized number formatting introduced in ICU 60. + * + * This library was introduced in ICU 60 to simplify the process of formatting localized number strings. + * Basic usage examples: + * + *
    + * // Most basic usage:
    + * NumberFormatter::withLocale(...).format(123).toString();  // 1,234 in en-US
    + *
    + * // Custom notation, unit, and rounding strategy:
    + * NumberFormatter::with()
    + *     .notation(Notation::compactShort())
    + *     .unit(CurrencyUnit("EUR", status))
    + *     .rounding(Rounder::maxDigits(2))
    + *     .locale(...)
    + *     .format(1234)
    + *     .toString();  // €1.2K in en-US
    + *
    + * // Create a formatter in a singleton for use later:
    + * static const LocalizedNumberFormatter formatter = NumberFormatter::withLocale(...)
    + *     .unit(NoUnit::percent())
    + *     .rounding(Rounder::fixedFraction(3));
    + * formatter.format(5.9831).toString();  // 5.983% in en-US
    + *
    + * // Create a "template" in a singleton but without setting a locale until the call site:
    + * static const UnlocalizedNumberFormatter template = NumberFormatter::with()
    + *     .sign(UNumberSignDisplay::UNUM_SIGN_ALWAYS)
    + *     .adoptUnit(MeasureUnit::createMeter(status))
    + *     .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME);
    + * template.locale(...).format(1234).toString();  // +1,234 meters in en-US
    + * 
    + * + *

    + * This API offers more features than DecimalFormat and is geared toward new users of ICU. + * + *

    + * NumberFormatter instances are immutable and thread safe. This means that invoking a configuration method has no + * effect on the receiving instance; you must store and use the new number formatter instance it returns instead. + * + *

    + * UnlocalizedNumberFormatter formatter = UnlocalizedNumberFormatter::with().notation(Notation::scientific());
    + * formatter.rounding(Rounder.maxFraction(2)); // does nothing!
    + * formatter.locale(Locale.getEnglish()).format(9.8765).toString(); // prints "9.8765E0", not "9.88E0"
    + * 
    + * + *

    + * This API is based on the fluent design pattern popularized by libraries such as Google's Guava. For + * extensive details on the design of this API, read the design doc. + * + * @author Shane Carr + */ + +/** + * An enum declaring how to render units, including currencies. Example outputs when formatting 123 USD and 123 + * meters in en-CA: + * + *

    + *

      + *
    • NARROW*: "$123.00" and "123 m" + *
    • SHORT: "US$ 123.00" and "123 m" + *
    • FULL_NAME: "123.00 US dollars" and "123 meters" + *
    • ISO_CODE: "USD 123.00" and undefined behavior + *
    • HIDDEN: "123.00" and "123" + *
    + * + *

    + * * The narrow format for currencies is not currently supported; this is a known issue that will be fixed in a + * future version. See #11666 for more information. + * + *

    + * This enum is similar to {@link com.ibm.icu.text.MeasureFormat.FormatWidth}. + * + * @draft ICU 60 + */ +typedef enum UNumberUnitWidth { + /** + * Print an abbreviated version of the unit name. Similar to SHORT, but always use the shortest available + * abbreviation or symbol. This option can be used when the context hints at the identity of the unit. For more + * information on the difference between NARROW and SHORT, see SHORT. + * + *

    + * In CLDR, this option corresponds to the "Narrow" format for measure units and the "¤¤¤¤¤" placeholder for + * currencies. + * + * @draft ICU 60 + */ + UNUM_UNIT_WIDTH_NARROW, + + /** + * Print an abbreviated version of the unit name. Similar to NARROW, but use a slightly wider abbreviation or + * symbol when there may be ambiguity. This is the default behavior. + * + *

    + * For example, in es-US, the SHORT form for Fahrenheit is "{0} °F", but the NARROW form is "{0}°", + * since Fahrenheit is the customary unit for temperature in that locale. + * + *

    + * In CLDR, this option corresponds to the "Short" format for measure units and the "¤" placeholder for + * currencies. + * + * @draft ICU 60 + */ + UNUM_UNIT_WIDTH_SHORT, + + /** + * Print the full name of the unit, without any abbreviations. + * + *

    + * In CLDR, this option corresponds to the default format for measure units and the "¤¤¤" placeholder for + * currencies. + * + * @draft ICU 60 + */ + UNUM_UNIT_WIDTH_FULL_NAME, + + /** + * Use the three-digit ISO XXX code in place of the symbol for displaying currencies. The behavior of this + * option is currently undefined for use with measure units. + * + *

    + * In CLDR, this option corresponds to the "¤¤" placeholder for currencies. + * + * @draft ICU 60 + */ + UNUM_UNIT_WIDTH_ISO_CODE, + + /** + * Format the number according to the specified unit, but do not display the unit. For currencies, apply + * monetary symbols and formats as with SHORT, but omit the currency symbol. For measure units, the behavior is + * equivalent to not specifying the unit at all. + * + * @draft ICU 60 + */ + UNUM_UNIT_WIDTH_HIDDEN, + + /** + * One more than the highest UNumberUnitWidth value. + * + * @internal ICU 60: The numeric value may change over time; see ICU ticket #12420. + */ + UNUM_UNIT_WIDTH_COUNT +} UNumberUnitWidth; + +/** + * An enum declaring how to denote positive and negative numbers. Example outputs when formatting 123 and -123 in + * en-US: + * + *

    + *

      + *
    • AUTO: "123", "-123" + *
    • ALWAYS: "+123", "-123" + *
    • NEVER: "123", "123" + *
    • ACCOUNTING: "$123", "($123)" + *
    • ACCOUNTING_ALWAYS: "+$123", "($123)" + *
    + * + *

    + * The exact format, including the position and the code point of the sign, differ by locale. + * + * @draft ICU 60 + */ +typedef enum UNumberSignDisplay { + /** + * Show the minus sign on negative numbers, and do not show the sign on positive numbers. This is the default + * behavior. + * + * @draft ICU 60 + */ + UNUM_SIGN_AUTO, + + /** + * Show the minus sign on negative numbers and the plus sign on positive numbers. + * + * @draft ICU 60 + */ + UNUM_SIGN_ALWAYS, + + /** + * Do not show the sign on positive or negative numbers. + * + * @draft ICU 60 + */ + UNUM_SIGN_NEVER, + + /** + * Use the locale-dependent accounting format on negative numbers, and do not show the sign on positive numbers. + * + *

    + * The accounting format is defined in CLDR and varies by locale; in many Western locales, the format is a pair + * of parentheses around the number. + * + *

    + * Note: Since CLDR defines the accounting format in the monetary context only, this option falls back to the + * AUTO sign display strategy when formatting without a currency unit. This limitation may be lifted in the + * future. + * + * @draft ICU 60 + */ + UNUM_SIGN_ACCOUNTING, + + /** + * Use the locale-dependent accounting format on negative numbers, and show the plus sign on positive numbers. + * For more information on the accounting format, see the ACCOUNTING sign display strategy. + * + * @draft ICU 60 + */ + UNUM_SIGN_ACCOUNTING_ALWAYS, + + /** + * One more than the highest UNumberSignDisplay value. + * + * @internal ICU 60: The numeric value may change over time; see ICU ticket #12420. + */ + UNUM_SIGN_COUNT +} UNumberSignDisplay; + +/** + * An enum declaring how to render the decimal separator. + * + *

    + *

      + *
    • UNUM_DECIMAL_SEPARATOR_AUTO: "1", "1.1" + *
    • UNUM_DECIMAL_SEPARATOR_ALWAYS: "1.", "1.1" + *
    + */ +typedef enum UNumberDecimalSeparatorDisplay { + /** + * Show the decimal separator when there are one or more digits to display after the separator, and do not show + * it otherwise. This is the default behavior. + * + * @draft ICU 60 + */ + UNUM_DECIMAL_SEPARATOR_AUTO, + + /** + * Always show the decimal separator, even if there are no digits to display after the separator. + * + * @draft ICU 60 + */ + UNUM_DECIMAL_SEPARATOR_ALWAYS, + + /** + * One more than the highest UNumberDecimalSeparatorDisplay value. + * + * @internal ICU 60: The numeric value may change over time; see ICU ticket #12420. + */ + UNUM_DECIMAL_SEPARATOR_COUNT +} UNumberDecimalMarkDisplay; + +U_NAMESPACE_BEGIN namespace number { // icu::number + +// Forward declarations: +class UnlocalizedNumberFormatter; +class LocalizedNumberFormatter; +class FormattedNumber; +class Notation; +class ScientificNotation; +class Rounder; +class FractionRounder; +class CurrencyRounder; +class IncrementRounder; +class Grouper; +class IntegerWidth; + +namespace impl { + +// Forward declarations: +class Padder; +struct MacroProps; +struct MicroProps; +class DecimalQuantity; +struct NumberFormatterResults; +class NumberFormatterImpl; +struct ParsedPatternInfo; +class ScientificModifier; +class MultiplierProducer; +class MutablePatternModifier; +class LongNameHandler; +class ScientificHandler; +class CompactHandler; +class Modifier; +class NumberStringBuilder; + +} // namespace impl + +// Reserve extra names in case they are added as classes in the future: +typedef Notation CompactNotation; +typedef Notation SimpleNotation; + +/** + * A class that defines the notation style to be used when formatting numbers in NumberFormatter. + * + * @draft ICU 60 + */ +class U_I18N_API Notation : public UMemory { + public: + /** + * Print the number using scientific notation (also known as scientific form, standard index form, or standard form + * in the UK). The format for scientific notation varies by locale; for example, many Western locales display the + * number in the form "#E0", where the number is displayed with one digit before the decimal separator, zero or more + * digits after the decimal separator, and the corresponding power of 10 displayed after the "E". + * + *

    + * Example outputs in en-US when printing 8.765E4 through 8.765E-3: + * + *

    +     * 8.765E4
    +     * 8.765E3
    +     * 8.765E2
    +     * 8.765E1
    +     * 8.765E0
    +     * 8.765E-1
    +     * 8.765E-2
    +     * 8.765E-3
    +     * 0E0
    +     * 
    + * + * @return A ScientificNotation for chaining or passing to the NumberFormatter notation() setter. + * @draft ICU 60 + */ + static ScientificNotation scientific(); + + /** + * Print the number using engineering notation, a variant of scientific notation in which the exponent must be + * divisible by 3. + * + *

    + * Example outputs in en-US when printing 8.765E4 through 8.765E-3: + * + *

    +     * 87.65E3
    +     * 8.765E3
    +     * 876.5E0
    +     * 87.65E0
    +     * 8.765E0
    +     * 876.5E-3
    +     * 87.65E-3
    +     * 8.765E-3
    +     * 0E0
    +     * 
    + * + * @return A ScientificNotation for chaining or passing to the NumberFormatter notation() setter. + * @draft ICU 60 + */ + static ScientificNotation engineering(); + + /** + * Print the number using short-form compact notation. + * + *

    + * Compact notation, defined in Unicode Technical Standard #35 Part 3 Section 2.4.1, prints numbers with + * localized prefixes or suffixes corresponding to different powers of ten. Compact notation is similar to + * engineering notation in how it scales numbers. + * + *

    + * Compact notation is ideal for displaying large numbers (over ~1000) to humans while at the same time minimizing + * screen real estate. + * + *

    + * In short form, the powers of ten are abbreviated. In en-US, the abbreviations are "K" for thousands, "M" + * for millions, "B" for billions, and "T" for trillions. Example outputs in en-US when printing 8.765E7 + * through 8.765E0: + * + *

    +     * 88M
    +     * 8.8M
    +     * 876K
    +     * 88K
    +     * 8.8K
    +     * 876
    +     * 88
    +     * 8.8
    +     * 
    + * + *

    + * When compact notation is specified without an explicit rounding strategy, numbers are rounded off to the closest + * integer after scaling the number by the corresponding power of 10, but with a digit shown after the decimal + * separator if there is only one digit before the decimal separator. The default compact notation rounding strategy + * is equivalent to: + * + *

    +     * Rounder.integer().withMinDigits(2)
    +     * 
    + * + * @return A CompactNotation for passing to the NumberFormatter notation() setter. + * @draft ICU 60 + */ + static CompactNotation compactShort(); + + /** + * Print the number using long-form compact notation. For more information on compact notation, see + * {@link #compactShort}. + * + *

    + * In long form, the powers of ten are spelled out fully. Example outputs in en-US when printing 8.765E7 + * through 8.765E0: + * + *

    +     * 88 million
    +     * 8.8 million
    +     * 876 thousand
    +     * 88 thousand
    +     * 8.8 thousand
    +     * 876
    +     * 88
    +     * 8.8
    +     * 
    + * + * @return A CompactNotation for passing to the NumberFormatter notation() setter. + * @draft ICU 60 + */ + static CompactNotation compactLong(); + + /** + * Print the number using simple notation without any scaling by powers of ten. This is the default behavior. + * + *

    + * Since this is the default behavior, this method needs to be called only when it is necessary to override a + * previous setting. + * + *

    + * Example outputs in en-US when printing 8.765E7 through 8.765E0: + * + *

    +     * 87,650,000
    +     * 8,765,000
    +     * 876,500
    +     * 87,650
    +     * 8,765
    +     * 876.5
    +     * 87.65
    +     * 8.765
    +     * 
    + * + * @return A SimpleNotation for passing to the NumberFormatter notation() setter. + * @draft ICU 60 + */ + static SimpleNotation simple(); + + private: + enum NotationType { + NTN_SCIENTIFIC, NTN_COMPACT, NTN_SIMPLE, NTN_ERROR + } fType; + + union NotationUnion { + // For NTN_SCIENTIFIC + struct ScientificSettings { + int8_t fEngineeringInterval; + bool fRequireMinInt; + int8_t fMinExponentDigits; + UNumberSignDisplay fExponentSignDisplay; + } scientific; + + // For NTN_COMPACT + UNumberCompactStyle compactStyle; + + // For NTN_ERROR + UErrorCode errorCode; + } fUnion; + + typedef NotationUnion::ScientificSettings ScientificSettings; + + Notation(const NotationType &type, const NotationUnion &union_) : fType(type), fUnion(union_) {} + + Notation(UErrorCode errorCode) : fType(NTN_ERROR) { + fUnion.errorCode = errorCode; + } + + Notation() : fType(NTN_SIMPLE), fUnion() {} + + UBool copyErrorTo(UErrorCode &status) const { + if (fType == NTN_ERROR) { + status = fUnion.errorCode; + return TRUE; + } + return FALSE; + } + + // To allow MacroProps to initialize empty instances: + friend struct impl::MacroProps; + friend class ScientificNotation; + + // To allow implementation to access internal types: + friend class impl::NumberFormatterImpl; + friend class impl::ScientificModifier; + friend class impl::ScientificHandler; +}; + +/** + * A class that defines the scientific notation style to be used when formatting numbers in NumberFormatter. + * + *

    + * To create a ScientificNotation, use one of the factory methods in {@link Notation}. + * + * @draft ICU 60 + */ +class U_I18N_API ScientificNotation : public Notation { + public: + /** + * Sets the minimum number of digits to show in the exponent of scientific notation, padding with zeros if + * necessary. Useful for fixed-width display. + * + *

    + * For example, with minExponentDigits=2, the number 123 will be printed as "1.23E02" in en-US instead of + * the default "1.23E2". + * + * @param minExponentDigits + * The minimum number of digits to show in the exponent. + * @return A ScientificNotation, for chaining. + * @draft ICU 60 + */ + ScientificNotation withMinExponentDigits(int32_t minExponentDigits) const; + + /** + * Sets whether to show the sign on positive and negative exponents in scientific notation. The default is AUTO, + * showing the minus sign but not the plus sign. + * + *

    + * For example, with exponentSignDisplay=ALWAYS, the number 123 will be printed as "1.23E+2" in en-US + * instead of the default "1.23E2". + * + * @param exponentSignDisplay + * The strategy for displaying the sign in the exponent. + * @return A ScientificNotation, for chaining. + * @draft ICU 60 + */ + ScientificNotation withExponentSignDisplay(UNumberSignDisplay exponentSignDisplay) const; + + private: + // Inherit constructor + using Notation::Notation; + + friend class Notation; +}; + +// Reserve extra names in case they are added as classes in the future: +typedef Rounder DigitRounder; + +/** + * A class that defines the rounding strategy to be used when formatting numbers in NumberFormatter. + * + *

    + * To create a Rounder, use one of the factory methods. + * + * @draft ICU 60 + */ +class U_I18N_API Rounder : public UMemory { + + public: + /** + * Show all available digits to full precision. + * + *

    + * NOTE: When formatting a double, this method, along with {@link #minFraction} and + * {@link #minDigits}, will trigger complex algorithm similar to Dragon4 to determine the low-order digits + * and the number of digits to display based on the value of the double. If the number of fraction places or + * significant digits can be bounded, consider using {@link #maxFraction} or {@link #maxDigits} instead to maximize + * performance. For more information, read the following blog post. + * + *

    + * http://www.serpentine.com/blog/2011/06/29/here-be-dragons-advances-in-problems-you-didnt-even-know-you-had/ + * + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static Rounder unlimited(); + + /** + * Show numbers rounded if necessary to the nearest integer. + * + * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static FractionRounder integer(); + + /** + * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator). + * Additionally, pad with zeros to ensure that this number of places are always shown. + * + *

    + * Example output with minMaxFractionPlaces = 3: + * + *

    + * 87,650.000
    + * 8,765.000
    + * 876.500
    + * 87.650
    + * 8.765
    + * 0.876
    + * 0.088
    + * 0.009
    + * 0.000 (zero) + * + *

    + * This method is equivalent to {@link #minMaxFraction} with both arguments equal. + * + * @param minMaxFractionPlaces + * The minimum and maximum number of numerals to display after the decimal separator (rounding if too + * long or padding with zeros if too short). + * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static FractionRounder fixedFraction(int32_t minMaxFractionPlaces); + + /** + * Always show at least a certain number of fraction places after the decimal separator, padding with zeros if + * necessary. Do not perform rounding (display numbers to their full precision). + * + *

    + * NOTE: If you are formatting doubles, see the performance note in {@link #unlimited}. + * + * @param minFractionPlaces + * The minimum number of numerals to display after the decimal separator (padding with zeros if + * necessary). + * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static FractionRounder minFraction(int32_t minFractionPlaces); + + /** + * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator). + * Unlike the other fraction rounding strategies, this strategy does not pad zeros to the end of the + * number. + * + * @param maxFractionPlaces + * The maximum number of numerals to display after the decimal mark (rounding if necessary). + * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static FractionRounder maxFraction(int32_t maxFractionPlaces); + + /** + * Show numbers rounded if necessary to a certain number of fraction places (numerals after the decimal separator); + * in addition, always show at least a certain number of places after the decimal separator, padding with zeros if + * necessary. + * + * @param minFractionPlaces + * The minimum number of numerals to display after the decimal separator (padding with zeros if + * necessary). + * @param maxFractionPlaces + * The maximum number of numerals to display after the decimal separator (rounding if necessary). + * @return A FractionRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static FractionRounder minMaxFraction(int32_t minFractionPlaces, int32_t maxFractionPlaces); + + /** + * Show numbers rounded if necessary to a certain number of significant digits or significant figures. Additionally, + * pad with zeros to ensure that this number of significant digits/figures are always shown. + * + *

    + * This method is equivalent to {@link #minMaxDigits} with both arguments equal. + * + * @param minMaxSignificantDigits + * The minimum and maximum number of significant digits to display (rounding if too long or padding with + * zeros if too short). + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static DigitRounder fixedDigits(int32_t minMaxSignificantDigits); + + /** + * Always show at least a certain number of significant digits/figures, padding with zeros if necessary. Do not + * perform rounding (display numbers to their full precision). + * + *

    + * NOTE: If you are formatting doubles, see the performance note in {@link #unlimited}. + * + * @param minSignificantDigits + * The minimum number of significant digits to display (padding with zeros if too short). + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static DigitRounder minDigits(int32_t minSignificantDigits); + + /** + * Show numbers rounded if necessary to a certain number of significant digits/figures. + * + * @param maxSignificantDigits + * The maximum number of significant digits to display (rounding if too long). + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static DigitRounder maxDigits(int32_t maxSignificantDigits); + + /** + * Show numbers rounded if necessary to a certain number of significant digits/figures; in addition, always show at + * least a certain number of significant digits, padding with zeros if necessary. + * + * @param minSignificantDigits + * The minimum number of significant digits to display (padding with zeros if necessary). + * @param maxSignificantDigits + * The maximum number of significant digits to display (rounding if necessary). + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static DigitRounder minMaxDigits(int32_t minSignificantDigits, int32_t maxSignificantDigits); + + /** + * Show numbers rounded if necessary to the closest multiple of a certain rounding increment. For example, if the + * rounding increment is 0.5, then round 1.2 to 1 and round 1.3 to 1.5. + * + *

    + * In order to ensure that numbers are padded to the appropriate number of fraction places, call + * withMinFraction() on the return value of this method. + * For example, to round to the nearest 0.5 and always display 2 numerals after the + * decimal separator (to display 1.2 as "1.00" and 1.3 as "1.50"), you can run: + * + *

    +     * Rounder::increment(0.5).withMinFraction(2)
    +     * 
    + * + * @param roundingIncrement + * The increment to which to round numbers. + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static IncrementRounder increment(double roundingIncrement); + + /** + * Show numbers rounded and padded according to the rules for the currency unit. The most common rounding settings + * for currencies include Rounder.fixedFraction(2), Rounder.integer(), and + * Rounder.increment(0.05) for cash transactions ("nickel rounding"). + * + *

    + * The exact rounding details will be resolved at runtime based on the currency unit specified in the + * NumberFormatter chain. To round according to the rules for one currency while displaying the symbol for another + * currency, the withCurrency() method can be called on the return value of this method. + * + * @param currencyUsage + * Either STANDARD (for digital transactions) or CASH (for transactions where the rounding increment may + * be limited by the available denominations of cash or coins). + * @return A CurrencyRounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + static CurrencyRounder currency(UCurrencyUsage currencyUsage); + + /** + * Sets the rounding mode to use when picking the direction to round (up or down). Common values + * include HALF_EVEN, HALF_UP, and FLOOR. The default is HALF_EVEN. + * + * @param roundingMode + * The RoundingMode to use. + * @return A Rounder for passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + Rounder withMode(UNumberFormatRoundingMode roundingMode) const; + + private: + enum RounderType { + RND_BOGUS, + RND_NONE, + RND_FRACTION, + RND_SIGNIFICANT, + RND_FRACTION_SIGNIFICANT, + RND_INCREMENT, + RND_CURRENCY, + RND_PASS_THROUGH, + RND_ERROR + } fType; + + union RounderUnion { + struct FractionSignificantSettings { + // For RND_FRACTION, RND_SIGNIFICANT, and RND_FRACTION_SIGNIFICANT + int8_t fMinFrac; + int8_t fMaxFrac; + int8_t fMinSig; + int8_t fMaxSig; + } fracSig; + struct IncrementSettings { + double fIncrement; + int32_t fMinFrac; + } increment; // For RND_INCREMENT + UCurrencyUsage currencyUsage; // For RND_CURRENCY + UErrorCode errorCode; // For RND_ERROR + } fUnion; + + typedef RounderUnion::FractionSignificantSettings FractionSignificantSettings; + typedef RounderUnion::IncrementSettings IncrementSettings; + + UNumberFormatRoundingMode fRoundingMode; + + Rounder(const RounderType &type, const RounderUnion &union_, UNumberFormatRoundingMode roundingMode) + : fType(type), fUnion(union_), fRoundingMode(roundingMode) {} + + Rounder(UErrorCode errorCode) : fType(RND_ERROR) { + fUnion.errorCode = errorCode; + } + + Rounder() : fType(RND_BOGUS) {} + + bool isBogus() const { + return fType == RND_BOGUS; + } + + UBool copyErrorTo(UErrorCode &status) const { + if (fType == RND_ERROR) { + status = fUnion.errorCode; + return TRUE; + } + return FALSE; + } + + // On the parent type so that this method can be called internally on Rounder instances. + Rounder withCurrency(const CurrencyUnit ¤cy, UErrorCode &status) const; + + /** NON-CONST: mutates the current instance. */ + void setLocaleData(const CurrencyUnit ¤cy, UErrorCode &status); + + void apply(impl::DecimalQuantity &value, UErrorCode &status) const; + + /** Version of {@link #apply} that obeys minInt constraints. Used for scientific notation compatibility mode. */ + void apply(impl::DecimalQuantity &value, int32_t minInt, UErrorCode status); + + int32_t + chooseMultiplierAndApply(impl::DecimalQuantity &input, const impl::MultiplierProducer &producer, + UErrorCode &status); + + static FractionRounder constructFraction(int32_t minFrac, int32_t maxFrac); + + static Rounder constructSignificant(int32_t minSig, int32_t maxSig); + + static Rounder + constructFractionSignificant(const FractionRounder &base, int32_t minSig, int32_t maxSig); + + static IncrementRounder constructIncrement(double increment, int32_t minFrac); + + static CurrencyRounder constructCurrency(UCurrencyUsage usage); + + static Rounder constructPassThrough(); + + // To allow MacroProps/MicroProps to initialize bogus instances: + friend struct impl::MacroProps; + friend struct impl::MicroProps; + + // To allow NumberFormatterImpl to access isBogus() and other internal methods: + friend class impl::NumberFormatterImpl; + + // To give access to apply() and chooseMultiplierAndApply(): + friend class impl::MutablePatternModifier; + friend class impl::LongNameHandler; + friend class impl::ScientificHandler; + friend class impl::CompactHandler; + + // To allow child classes to call private methods: + friend class FractionRounder; + friend class CurrencyRounder; + friend class IncrementRounder; +}; + +/** + * A class that defines a rounding strategy based on a number of fraction places and optionally significant digits to be + * used when formatting numbers in NumberFormatter. + * + *

    + * To create a FractionRounder, use one of the factory methods on Rounder. + * + * @draft ICU 60 + */ +class U_I18N_API FractionRounder : public Rounder { + public: + /** + * Ensure that no less than this number of significant digits are retained when rounding according to fraction + * rules. + * + *

    + * For example, with integer rounding, the number 3.141 becomes "3". However, with minimum figures set to 2, 3.141 + * becomes "3.1" instead. + * + *

    + * This setting does not affect the number of trailing zeros. For example, 3.01 would print as "3", not "3.0". + * + * @param minSignificantDigits + * The number of significant figures to guarantee. + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + Rounder withMinDigits(int32_t minSignificantDigits) const; + + /** + * Ensure that no more than this number of significant digits are retained when rounding according to fraction + * rules. + * + *

    + * For example, with integer rounding, the number 123.4 becomes "123". However, with maximum figures set to 2, 123.4 + * becomes "120" instead. + * + *

    + * This setting does not affect the number of trailing zeros. For example, with fixed fraction of 2, 123.4 would + * become "120.00". + * + * @param maxSignificantDigits + * Round the number to no more than this number of significant figures. + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + Rounder withMaxDigits(int32_t maxSignificantDigits) const; + + private: + // Inherit constructor + using Rounder::Rounder; + + // To allow parent class to call this class's constructor: + friend class Rounder; +}; + +/** + * A class that defines a rounding strategy parameterized by a currency to be used when formatting numbers in + * NumberFormatter. + * + *

    + * To create a CurrencyRounder, use one of the factory methods on Rounder. + * + * @draft ICU 60 + */ +class U_I18N_API CurrencyRounder : public Rounder { + public: + /** + * Associates a currency with this rounding strategy. + * + *

    + * Calling this method is not required, because the currency specified in unit() + * is automatically applied to currency rounding strategies. However, + * this method enables you to override that automatic association. + * + *

    + * This method also enables numbers to be formatted using currency rounding rules without explicitly using a + * currency format. + * + * @param currency + * The currency to associate with this rounding strategy. + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + Rounder withCurrency(const CurrencyUnit ¤cy) const; + + private: + // Inherit constructor + using Rounder::Rounder; + + // To allow parent class to call this class's constructor: + friend class Rounder; +}; + +/** + * A class that defines a rounding strategy parameterized by a rounding increment to be used when formatting numbers in + * NumberFormatter. + * + *

    + * To create an IncrementRounder, use one of the factory methods on Rounder. + * + * @draft ICU 60 + */ +class U_I18N_API IncrementRounder : public Rounder { + public: + /** + * Specifies the minimum number of fraction digits to render after the decimal separator, padding with zeros if + * necessary. By default, no trailing zeros are added. + * + *

    + * For example, if the rounding increment is 0.5 and minFrac is 2, then the resulting strings include "0.00", + * "0.50", "1.00", and "1.50". + * + *

    + * Note: In ICU4J, this functionality is accomplished via the scale of the BigDecimal rounding increment. + * + * @param minFrac The minimum number of digits after the decimal separator. + * @return A Rounder for chaining or passing to the NumberFormatter rounding() setter. + * @draft ICU 60 + */ + Rounder withMinFraction(int32_t minFrac) const; + + private: + // Inherit constructor + using Rounder::Rounder; + + // To allow parent class to call this class's constructor: + friend class Rounder; +}; + +/** + * @internal This API is a technical preview. It is likely to change in an upcoming release. + */ +class U_I18N_API Grouper : public UMemory { + public: + /** + * @internal This API is a technical preview. It is likely to change in an upcoming release. + */ + static Grouper defaults(); + + /** + * @internal This API is a technical preview. It is likely to change in an upcoming release. + */ + static Grouper minTwoDigits(); + + /** + * @internal This API is a technical preview. It is likely to change in an upcoming release. + */ + static Grouper none(); + + private: + int8_t fGrouping1; // -3 means "bogus"; -2 means "needs locale data"; -1 means "no grouping" + int8_t fGrouping2; + bool fMin2; + + Grouper(int8_t grouping1, int8_t grouping2, bool min2) + : fGrouping1(grouping1), fGrouping2(grouping2), fMin2(min2) {} + + Grouper() : fGrouping1(-3) {}; + + bool isBogus() const { + return fGrouping1 == -3; + } + + /** NON-CONST: mutates the current instance. */ + void setLocaleData(const impl::ParsedPatternInfo &patternInfo); + + bool groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const; + + // To allow MacroProps/MicroProps to initialize empty instances: + friend struct impl::MacroProps; + friend struct impl::MicroProps; + + // To allow NumberFormatterImpl to access isBogus() and perform other operations: + friend class impl::NumberFormatterImpl; +}; + +/** + * A class that defines the strategy for padding and truncating integers before the decimal separator. + * + *

    + * To create an IntegerWidth, use one of the factory methods. + * + * @draft ICU 60 + * @see NumberFormatter + */ +class U_I18N_API IntegerWidth : public UMemory { + public: + /** + * Pad numbers at the beginning with zeros to guarantee a certain number of numerals before the decimal separator. + * + *

    + * For example, with minInt=3, the number 55 will get printed as "055". + * + * @param minInt + * The minimum number of places before the decimal separator. + * @return An IntegerWidth for chaining or passing to the NumberFormatter integerWidth() setter. + * @draft ICU 60 + * @see NumberFormatter + */ + static IntegerWidth zeroFillTo(int32_t minInt); + + /** + * Truncate numbers exceeding a certain number of numerals before the decimal separator. + * + * For example, with maxInt=3, the number 1234 will get printed as "234". + * + * @param maxInt + * The maximum number of places before the decimal separator. + * @return An IntegerWidth for passing to the NumberFormatter integerWidth() setter. + * @draft ICU 60 + * @see NumberFormatter + */ + IntegerWidth truncateAt(int32_t maxInt); + + private: + union { + struct { + int8_t fMinInt; + int8_t fMaxInt; + } minMaxInt; + UErrorCode errorCode; + } fUnion; + bool fHasError = false; + + IntegerWidth(int8_t minInt, int8_t maxInt); + + IntegerWidth(UErrorCode errorCode) { // NOLINT + fUnion.errorCode = errorCode; + fHasError = true; + } + + IntegerWidth() { // NOLINT + fUnion.minMaxInt.fMinInt = -1; + } + + bool isBogus() const { + return !fHasError && fUnion.minMaxInt.fMinInt == -1; + } + + UBool copyErrorTo(UErrorCode &status) const { + if (fHasError) { + status = fUnion.errorCode; + return TRUE; + } + return FALSE; + } + + void apply(impl::DecimalQuantity &quantity, UErrorCode &status) const; + + // To allow MacroProps/MicroProps to initialize empty instances: + friend struct impl::MacroProps; + friend struct impl::MicroProps; + + // To allow NumberFormatterImpl to access isBogus() and perform other operations: + friend class impl::NumberFormatterImpl; +}; + +namespace impl { + +/** + * Use a default threshold of 3. This means that the third time .format() is called, the data structures get built + * using the "safe" code path. The first two calls to .format() will trigger the unsafe code path. + * + * @internal + */ +static constexpr int32_t DEFAULT_THRESHOLD = 3; + +/** @internal */ +class U_I18N_API SymbolsWrapper : public UMemory { + public: + /** @internal */ + SymbolsWrapper() : fType(SYMPTR_NONE), fPtr{nullptr} {} + + /** @internal */ + SymbolsWrapper(const SymbolsWrapper &other); + + /** @internal */ + ~SymbolsWrapper(); + + /** @internal */ + SymbolsWrapper &operator=(const SymbolsWrapper &other); + + /** + * The provided object is copied, but we do not adopt it. + * @internal + */ + void setTo(const DecimalFormatSymbols &dfs); + + /** + * Adopt the provided object. + * @internal + */ + void setTo(const NumberingSystem *ns); + + /** + * Whether the object is currently holding a DecimalFormatSymbols. + * @internal + */ + bool isDecimalFormatSymbols() const; + + /** + * Whether the object is currently holding a NumberingSystem. + * @internal + */ + bool isNumberingSystem() const; + + /** + * Get the DecimalFormatSymbols pointer. No ownership change. + * @internal + */ + const DecimalFormatSymbols *getDecimalFormatSymbols() const; + + /** + * Get the NumberingSystem pointer. No ownership change. + * @internal + */ + const NumberingSystem *getNumberingSystem() const; + + /** @internal */ + UBool copyErrorTo(UErrorCode &status) const { + if (fType == SYMPTR_DFS && fPtr.dfs == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return TRUE; + } else if (fType == SYMPTR_NS && fPtr.ns == nullptr) { + status = U_MEMORY_ALLOCATION_ERROR; + return TRUE; + } + return FALSE; + } + + private: + enum SymbolsPointerType { + SYMPTR_NONE, SYMPTR_DFS, SYMPTR_NS + } fType; + + union { + const DecimalFormatSymbols *dfs; + const NumberingSystem *ns; + } fPtr; + + void doCopyFrom(const SymbolsWrapper &other); + + void doCleanup(); +}; + +/** @internal */ +class U_I18N_API Padder : public UMemory { + public: + /** @internal */ + static Padder none(); + + /** @internal */ + static Padder codePoints(UChar32 cp, int32_t targetWidth, UNumberFormatPadPosition position); + + private: + UChar32 fWidth; // -3 = error; -2 = bogus; -1 = no padding + union { + struct { + int32_t fCp; + UNumberFormatPadPosition fPosition; + } padding; + UErrorCode errorCode; + } fUnion; + + Padder(UChar32 cp, int32_t width, UNumberFormatPadPosition position); + + Padder(int32_t width); + + Padder(UErrorCode errorCode) : fWidth(-3) { // NOLINT + fUnion.errorCode = errorCode; + } + + Padder() : fWidth(-2) {} // NOLINT + + bool isBogus() const { + return fWidth == -2; + } + + UBool copyErrorTo(UErrorCode &status) const { + if (fWidth == -3) { + status = fUnion.errorCode; + return TRUE; + } + return FALSE; + } + + bool isValid() const { + return fWidth > 0; + } + + int32_t padAndApply(const impl::Modifier &mod1, const impl::Modifier &mod2, + impl::NumberStringBuilder &string, int32_t leftIndex, int32_t rightIndex, + UErrorCode &status) const; + + // To allow MacroProps/MicroProps to initialize empty instances: + friend struct MacroProps; + friend struct MicroProps; + + // To allow NumberFormatterImpl to access isBogus() and perform other operations: + friend class impl::NumberFormatterImpl; +}; + +/** @internal */ +struct U_I18N_API MacroProps : public UMemory { + /** @internal */ + Notation notation; + + /** @internal */ + MeasureUnit unit; // = NoUnit::base(); + + /** @internal */ + Rounder rounder; // = Rounder(); (bogus) + + /** @internal */ + Grouper grouper; // = Grouper(); (bogus) + + /** @internal */ + Padder padder; // = Padder(); (bogus) + + /** @internal */ + IntegerWidth integerWidth; // = IntegerWidth(); (bogus) + + /** @internal */ + SymbolsWrapper symbols; + + // UNUM_XYZ_COUNT denotes null (bogus) values. + + /** @internal */ + UNumberUnitWidth unitWidth = UNUM_UNIT_WIDTH_COUNT; + + /** @internal */ + UNumberSignDisplay sign = UNUM_SIGN_COUNT; + + /** @internal */ + UNumberDecimalSeparatorDisplay decimal = UNUM_DECIMAL_SEPARATOR_COUNT; + + /** @internal */ + PluralRules *rules = nullptr; // no ownership + + /** @internal */ + int32_t threshold = DEFAULT_THRESHOLD; + Locale locale; + + /** + * Check all members for errors. + * @internal + */ + bool copyErrorTo(UErrorCode &status) const { + return notation.copyErrorTo(status) || rounder.copyErrorTo(status) || + padder.copyErrorTo(status) || integerWidth.copyErrorTo(status) || + symbols.copyErrorTo(status); + } +}; + +} // namespace impl + +/** + * An abstract base class for specifying settings related to number formatting. This class is implemented by + * {@link UnlocalizedNumberFormatter} and {@link LocalizedNumberFormatter}. + */ +template +class U_I18N_API NumberFormatterSettings { + public: + /** + * Specifies the notation style (simple, scientific, or compact) for rendering numbers. + * + *

      + *
    • Simple notation: "12,300" + *
    • Scientific notation: "1.23E4" + *
    • Compact notation: "12K" + *
    + * + *

    + * All notation styles will be properly localized with locale data, and all notation styles are compatible with + * units, rounding strategies, and other number formatter settings. + * + *

    + * Pass this method the return value of a {@link Notation} factory method. For example: + * + *

    +     * NumberFormatter::with().notation(Notation::compactShort())
    +     * 
    + * + * The default is to use simple notation. + * + * @param notation + * The notation strategy to use. + * @return The fluent chain. + * @see Notation + * @draft ICU 60 + */ + Derived notation(const Notation ¬ation) const; + + /** + * Specifies the unit (unit of measure, currency, or percent) to associate with rendered numbers. + * + *
      + *
    • Unit of measure: "12.3 meters" + *
    • Currency: "$12.30" + *
    • Percent: "12.3%" + *
    + * + *

    + * All units will be properly localized with locale data, and all units are compatible with notation styles, + * rounding strategies, and other number formatter settings. + * + *

    + * Pass this method any instance of {@link MeasureUnit}. For units of measure: + * + *

    +     * NumberFormatter.with().adoptUnit(MeasureUnit::createMeter(status))
    +     * 
    + * + * Currency: + * + *
    +     * NumberFormatter.with()::unit(CurrencyUnit(u"USD", status))
    +     * 
    + * + * Percent: + * + *
    +     * NumberFormatter.with()::unit(NoUnit.percent())
    +     * 
    + * + * The default is to render without units (equivalent to NoUnit.base()). + * + * @param unit + * The unit to render. + * @return The fluent chain. + * @see MeasureUnit + * @see Currency + * @see NoUnit + * @draft ICU 60 + */ + Derived unit(const icu::MeasureUnit &unit) const; + + /** + * Like unit(), but takes ownership of a pointer. Convenient for use with the MeasureFormat factory + * methods, which return pointers that need ownership. + * + * @param unit + * The unit to render. + * @return The fluent chain. + * @see #unit + * @see MeasureUnit + * @draft ICU 60 + */ + Derived adoptUnit(const icu::MeasureUnit *unit) const; + + /** + * Specifies the rounding strategy to use when formatting numbers. + * + *
      + *
    • Round to 3 decimal places: "3.142" + *
    • Round to 3 significant figures: "3.14" + *
    • Round to the closest nickel: "3.15" + *
    • Do not perform rounding: "3.1415926..." + *
    + * + *

    + * Pass this method the return value of one of the factory methods on {@link Rounder}. For example: + * + *

    +     * NumberFormatter::with().rounding(Rounder::fixedFraction(2))
    +     * 
    + * + *

    + * In most cases, the default rounding strategy is to round to 6 fraction places; i.e., + * Rounder.maxFraction(6). The exceptions are if compact notation is being used, then the compact + * notation rounding strategy is used (see {@link Notation#compactShort} for details), or if the unit is a currency, + * then standard currency rounding is used, which varies from currency to currency (see {@link Rounder#currency} for + * details). + * + * @param rounder + * The rounding strategy to use. + * @return The fluent chain. + * @see Rounder + * @provisional This API might change or be removed in a future release. + * @draft ICU 60 + */ + Derived rounding(const Rounder &rounder) const; + +#ifndef U_HIDE_INTERNAL_API + + /** + * Specifies the grouping strategy to use when formatting numbers. + * + *

      + *
    • Default grouping: "12,300" and "1,230" + *
    • Grouping with at least 2 digits: "12,300" and "1230" + *
    • No grouping: "12300" and "1230" + *
    + * + *

    + * The exact grouping widths will be chosen based on the locale. + * + *

    + * Pass this method the return value of one of the factory methods on {@link Grouper}. For example: + * + *

    +     * NumberFormatter::with().grouping(Grouper::min2())
    +     * 
    + * + * The default is to perform grouping without concern for the minimum grouping digits. + * + * @param grouper + * The grouping strategy to use. + * @return The fluent chain. + * @see Grouper + * @see Notation + * @internal + * @internal ICU 60: This API is technical preview. + */ + Derived grouping(const Grouper &grouper) const; + +#endif /* U_HIDE_INTERNAL_API */ + + /** + * Specifies the minimum and maximum number of digits to render before the decimal mark. + * + *
      + *
    • Zero minimum integer digits: ".08" + *
    • One minimum integer digit: "0.08" + *
    • Two minimum integer digits: "00.08" + *
    + * + *

    + * Pass this method the return value of {@link IntegerWidth#zeroFillTo(int)}. For example: + * + *

    +     * NumberFormatter::with().integerWidth(IntegerWidth::zeroFillTo(2))
    +     * 
    + * + * The default is to have one minimum integer digit. + * + * @param style + * The integer width to use. + * @return The fluent chain. + * @see IntegerWidth + * @draft ICU 60 + */ + Derived integerWidth(const IntegerWidth &style) const; + + /** + * Specifies the symbols (decimal separator, grouping separator, percent sign, numerals, etc.) to use when rendering + * numbers. + * + *
      + *
    • en_US symbols: "12,345.67" + *
    • fr_FR symbols: "12 345,67" + *
    • de_CH symbols: "12’345.67" + *
    • my_MY symbols: "၁၂,၃၄၅.၆၇" + *
    + * + *

    + * Pass this method an instance of {@link DecimalFormatSymbols}. For example: + * + *

    +     * NumberFormatter::with().symbols(DecimalFormatSymbols(Locale("de_CH"), status))
    +     * 
    + * + *

    + * Note: DecimalFormatSymbols automatically chooses the best numbering system based on the locale. + * In the examples above, the first three are using the Latin numbering system, and the fourth is using the Myanmar + * numbering system. + * + *

    + * Note: The instance of DecimalFormatSymbols will be copied: changes made to the symbols object + * after passing it into the fluent chain will not be seen. + * + *

    + * Note: Calling this method will override the NumberingSystem previously specified in + * {@link #symbols(NumberingSystem)}. + * + *

    + * The default is to choose the symbols based on the locale specified in the fluent chain. + * + * @param symbols + * The DecimalFormatSymbols to use. + * @return The fluent chain. + * @see DecimalFormatSymbols + * @draft ICU 60 + */ + Derived symbols(const DecimalFormatSymbols &symbols) const; + + /** + * Specifies that the given numbering system should be used when fetching symbols. + * + *

      + *
    • Latin numbering system: "12,345" + *
    • Myanmar numbering system: "၁၂,၃၄၅" + *
    • Math Sans Bold numbering system: "𝟭𝟮,𝟯𝟰𝟱" + *
    + * + *

    + * Pass this method an instance of {@link NumberingSystem}. For example, to force the locale to always use the Latin + * alphabet numbering system (ASCII digits): + * + *

    +     * NumberFormatter::with().adoptSymbols(NumberingSystem::createInstanceByName("latn", status))
    +     * 
    + * + *

    + * Note: Calling this method will override the DecimalFormatSymbols previously specified in + * {@link #symbols(DecimalFormatSymbols)}. + * + *

    + * The default is to choose the best numbering system for the locale. + * + *

    + * This method takes ownership of a pointer in order to work nicely with the NumberingSystem factory methods. + * + * @param symbols + * The NumberingSystem to use. + * @return The fluent chain. + * @see NumberingSystem + * @draft ICU 60 + */ + Derived adoptSymbols(const NumberingSystem *symbols) const; + + /** + * Sets the width of the unit (measure unit or currency). Most common values: + * + *

      + *
    • Short: "$12.00", "12 m" + *
    • ISO Code: "USD 12.00" + *
    • Full name: "12.00 US dollars", "12 meters" + *
    + * + *

    + * Pass an element from the {@link UNumberUnitWidth} enum to this setter. For example: + * + *

    +     * NumberFormatter::with().unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME)
    +     * 
    + * + *

    + * The default is the SHORT width. + * + * @param width + * The width to use when rendering numbers. + * @return The fluent chain + * @see UNumberUnitWidth + * @draft ICU 60 + */ + Derived unitWidth(const UNumberUnitWidth &width) const; + + /** + * Sets the plus/minus sign display strategy. Most common values: + * + *

      + *
    • Auto: "123", "-123" + *
    • Always: "+123", "-123" + *
    • Accounting: "$123", "($123)" + *
    + * + *

    + * Pass an element from the {@link UNumberSignDisplay} enum to this setter. For example: + * + *

    +     * NumberFormatter::with().sign(UNumberSignDisplay::UNUM_SIGN_ALWAYS)
    +     * 
    + * + *

    + * The default is AUTO sign display. + * + * @param width + * The sign display strategy to use when rendering numbers. + * @return The fluent chain + * @see UNumberSignDisplay + * @provisional This API might change or be removed in a future release. + * @draft ICU 60 + */ + Derived sign(const UNumberSignDisplay &width) const; + + /** + * Sets the decimal separator display strategy. This affects integer numbers with no fraction part. Most common + * values: + * + *

      + *
    • Auto: "1" + *
    • Always: "1." + *
    + * + *

    + * Pass an element from the {@link UNumberDecimalSeparatorDisplay} enum to this setter. For example: + * + *

    +     * NumberFormatter::with().decimal(UNumberDecimalSeparatorDisplay::UNUM_DECIMAL_SEPARATOR_ALWAYS)
    +     * 
    + * + *

    + * The default is AUTO decimal separator display. + * + * @param width + * The decimal separator display strategy to use when rendering numbers. + * @return The fluent chain + * @see UNumberDecimalSeparatorDisplay + * @provisional This API might change or be removed in a future release. + * @draft ICU 60 + */ + Derived decimal(const UNumberDecimalSeparatorDisplay &width) const; + +#ifndef U_HIDE_INTERNAL_API + + /** + * Set the padding strategy. May be added to ICU 61; see #13338. + * + * @internal ICU 60: This API is ICU internal only. + */ + Derived padding(const impl::Padder &padder) const; + + /** + * Internal fluent setter to support a custom regulation threshold. A threshold of 1 causes the data structures to + * be built right away. A threshold of 0 prevents the data structures from being built. + * + * @internal ICU 60: This API is ICU internal only. + */ + Derived threshold(int32_t threshold) const; + +#endif /* U_HIDE_INTERNAL_API */ + + /** + * Sets the UErrorCode if an error occurred in the fluent chain. + * Preserves older error codes in the outErrorCode. + * @return TRUE if U_FAILURE(outErrorCode) + * @draft ICU 60 + */ + UBool copyErrorTo(UErrorCode &outErrorCode) const { + if (U_FAILURE(outErrorCode)) { + // Do not overwrite the older error code + return TRUE; + } + fMacros.copyErrorTo(outErrorCode); + return U_FAILURE(outErrorCode); + } + + protected: + impl::MacroProps fMacros; + + private: + // Don't construct me directly! Use (Un)LocalizedNumberFormatter. + NumberFormatterSettings() = default; + + friend class LocalizedNumberFormatter; + friend class UnlocalizedNumberFormatter; +}; + +/** + * A NumberFormatter that does not yet have a locale. In order to format numbers, a locale must be specified. + * + * @see NumberFormatter + * @draft ICU 60 + */ +class U_I18N_API UnlocalizedNumberFormatter + : public NumberFormatterSettings, public UMemory { + + public: + /** + * Associate the given locale with the number formatter. The locale is used for picking the appropriate symbols, + * formats, and other data for number display. + * + *

    + * To use the Java default locale, call Locale::getDefault(): + * + *

    +     * NumberFormatter::with(). ... .locale(Locale::getDefault())
    +     * 
    + * + * @param locale + * The locale to use when loading data for number formatting. + * @return The fluent chain. + * @draft ICU 60 + */ + LocalizedNumberFormatter locale(const icu::Locale &locale) const; + + // Make default copy constructor call the NumberFormatterSettings copy constructor. + /** + * Returns a copy of this UnlocalizedNumberFormatter. + * @draft ICU 60 + */ + UnlocalizedNumberFormatter(const UnlocalizedNumberFormatter &other) : UnlocalizedNumberFormatter( + static_cast &>(other)) {} + + private: + UnlocalizedNumberFormatter() = default; + + explicit UnlocalizedNumberFormatter( + const NumberFormatterSettings &other); + + // To give the fluent setters access to this class's constructor: + friend class NumberFormatterSettings; + + // To give NumberFormatter::with() access to this class's constructor: + friend class NumberFormatter; +}; + +/** + * A NumberFormatter that has a locale associated with it; this means .format() methods are available. + * + * @see NumberFormatter + * @draft ICU 60 + */ +class U_I18N_API LocalizedNumberFormatter + : public NumberFormatterSettings, public UMemory { + public: + /** + * Format the given integer number to a string using the settings specified in the NumberFormatter fluent + * setting chain. + * + * @param value + * The number to format. + * @param status + * Set to an ErrorCode if one occurred in the setter chain or during formatting. + * @return A FormattedNumber object; call .toString() to get the string. + * @draft ICU 60 + */ + FormattedNumber formatInt(int64_t value, UErrorCode &status) const; + + /** + * Format the given float or double to a string using the settings specified in the NumberFormatter fluent setting + * chain. + * + * @param value + * The number to format. + * @param status + * Set to an ErrorCode if one occurred in the setter chain or during formatting. + * @return A FormattedNumber object; call .toString() to get the string. + * @draft ICU 60 + */ + FormattedNumber formatDouble(double value, UErrorCode &status) const; + + /** + * Format the given decimal number to a string using the settings + * specified in the NumberFormatter fluent setting chain. + * The syntax of the unformatted number is a "numeric string" + * as defined in the Decimal Arithmetic Specification, available at + * http://speleotrove.com/decimal + * + * @param value + * The number to format. + * @param status + * Set to an ErrorCode if one occurred in the setter chain or during formatting. + * @return A FormattedNumber object; call .toString() to get the string. + * @draft ICU 60 + */ + FormattedNumber formatDecimal(StringPiece value, UErrorCode &status) const; + + // Make default copy constructor call the NumberFormatterSettings copy constructor. + /** + * Returns a copy of this LocalizedNumberFormatter. + * @draft ICU 60 + */ + LocalizedNumberFormatter(const LocalizedNumberFormatter &other) : LocalizedNumberFormatter( + static_cast &>(other)) {} + + /** + * Destruct this LocalizedNumberFormatter, cleaning up any memory it might own. + * @draft ICU 60 + */ + ~LocalizedNumberFormatter(); + + private: + const impl::NumberFormatterImpl* fCompiled {nullptr}; + char fUnsafeCallCount[8] {}; // internally cast to u_atomic_int32_t + + LocalizedNumberFormatter() = default; + + explicit LocalizedNumberFormatter(const NumberFormatterSettings &other); + + LocalizedNumberFormatter(const impl::MacroProps ¯os, const Locale &locale); + + /** + * This is the core entrypoint to the number formatting pipeline. It performs self-regulation: a static code path + * for the first few calls, and compiling a more efficient data structure if called repeatedly. + * + *

    + * This function is very hot, being called in every call to the number formatting pipeline. + * + * @param results + * The results object. This method takes ownership. + * @return The formatted number result. + */ + FormattedNumber formatImpl(impl::NumberFormatterResults *results, UErrorCode &status) const; + + // To give the fluent setters access to this class's constructor: + friend class NumberFormatterSettings; + friend class NumberFormatterSettings; + + // To give UnlocalizedNumberFormatter::locale() access to this class's constructor: + friend class UnlocalizedNumberFormatter; +}; + +/** + * The result of a number formatting operation. This class allows the result to be exported in several data types, + * including a UnicodeString and a FieldPositionIterator. + * + * @draft ICU 60 + */ +class U_I18N_API FormattedNumber : public UMemory { + public: + /** + * Returns a UnicodeString representation of the formatted number. + * + * @return a UnicodeString containing the localized number. + * @draft ICU 60 + */ + UnicodeString toString() const; + + /** + * Appends the formatted number to an Appendable. + * + * @param appendable + * The Appendable to which to append the formatted number string. + * @return The same Appendable, for chaining. + * @draft ICU 60 + * @see Appendable + */ + Appendable &appendTo(Appendable &appendable); + + /** + * Determine the start and end indices of the first occurrence of the given field in the output string. + * This allows you to determine the locations of the integer part, fraction part, and sign. + * + *

    + * If multiple different field attributes are needed, this method can be called repeatedly, or if all field + * attributes are needed, consider using populateFieldPositionIterator(). + * + *

    + * If a field occurs multiple times in an output string, such as a grouping separator, this method will only ever + * return the first occurrence. Use populateFieldPositionIterator() to access all occurrences of an attribute. + * + * @param fieldPosition + * The FieldPosition to populate with the start and end indices of the desired field. + * @param status + * Set if an error occurs while populating the FieldPosition. + * @draft ICU 60 + * @see UNumberFormatFields + */ + void populateFieldPosition(FieldPosition &fieldPosition, UErrorCode &status); + + /** + * Export the formatted number to a FieldPositionIterator. This allows you to determine which characters in + * the output string correspond to which fields, such as the integer part, fraction part, and sign. + * + *

    + * If information on only one field is needed, consider using populateFieldPosition() instead. + * + * @param iterator + * The FieldPositionIterator to populate with all of the fields present in the formatted number. + * @param status + * Set if an error occurs while populating the FieldPositionIterator. + * @draft ICU 60 + * @see UNumberFormatFields + */ + void populateFieldPositionIterator(FieldPositionIterator &iterator, UErrorCode &status); + + /** + * Destruct an instance of FormattedNumber, cleaning up any memory it might own. + * @draft ICU 60 + */ + ~FormattedNumber(); + + private: + // Can't use LocalPointer because NumberFormatterResults is forward-declared + const impl::NumberFormatterResults *fResults; + + // Error code for the terminal methods + UErrorCode fErrorCode; + + explicit FormattedNumber(impl::NumberFormatterResults *results) + : fResults(results), fErrorCode(U_ZERO_ERROR) {}; + + explicit FormattedNumber(UErrorCode errorCode) + : fResults(nullptr), fErrorCode(errorCode) {}; + + // To give LocalizedNumberFormatter format methods access to this class's constructor: + friend class LocalizedNumberFormatter; +}; + +/** + * See the main description in numberformatter.h for documentation and examples. + * + * @draft ICU 60 + */ +class U_I18N_API NumberFormatter final { + public: + /** + * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is not currently known at + * the call site. + * + * @return An {@link UnlocalizedNumberFormatter}, to be used for chaining. + * @draft ICU 60 + */ + static UnlocalizedNumberFormatter with(); + + /** + * Call this method at the beginning of a NumberFormatter fluent chain in which the locale is known at the call + * site. + * + * @param locale + * The locale from which to load formats and symbols for number formatting. + * @return A {@link LocalizedNumberFormatter}, to be used for chaining. + * @draft ICU 60 + */ + static LocalizedNumberFormatter withLocale(const Locale &locale); + + /** + * Use factory methods instead of the constructor to create a NumberFormatter. + * @draft ICU 60 + */ + NumberFormatter() = delete; +}; + +} // namespace number +U_NAMESPACE_END + +#endif // U_HIDE_DRAFT_API + +#endif // __NUMBERFORMATTER_H__ + +#endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/deps/icu-small/source/i18n/unicode/numfmt.h b/deps/icu-small/source/i18n/unicode/numfmt.h index 7147204a7cbd8c..d6b2a6d53c081d 100644 --- a/deps/icu-small/source/i18n/unicode/numfmt.h +++ b/deps/icu-small/source/i18n/unicode/numfmt.h @@ -58,6 +58,11 @@ class StringEnumeration; * formatting and parsing a number. Also provides methods for * determining which locales have number formats, and what their names * are. + * + *

    NOTE: Starting in ICU 60, there is a new set of APIs for localized number + * formatting that are designed to be an improvement over DecimalFormat. New users are discouraged + * from using DecimalFormat. For more information, see numberformatter.h. + * * \headerfile unicode/numfmt.h "unicode/numfmt.h" *

    * NumberFormat helps you to format and parse numbers for any locale. @@ -168,6 +173,33 @@ class StringEnumeration; */ class U_I18N_API NumberFormat : public Format { public: + /** + * Rounding mode. + * + *

    + * For more detail on rounding modes, see: + * http://userguide.icu-project.org/formatparse/numbers/rounding-modes + * + * @stable ICU 2.4 + */ + enum ERoundingMode { + kRoundCeiling, /**< Round towards positive infinity */ + kRoundFloor, /**< Round towards negative infinity */ + kRoundDown, /**< Round towards zero */ + kRoundUp, /**< Round away from zero */ + kRoundHalfEven, /**< Round towards the nearest integer, or + towards the nearest even integer if equidistant */ + kRoundHalfDown, /**< Round towards the nearest integer, or + towards zero if equidistant */ + kRoundHalfUp, /**< Round towards the nearest integer, or + away from zero if equidistant */ + /** + * Return U_FORMAT_INEXACT_ERROR if number does not format exactly. + * @stable ICU 4.8 + */ + kRoundUnnecessary + }; + /** * Alignment Field constants used to construct a FieldPosition object. * Signifies that the position of the integer part or fraction part of @@ -814,7 +846,7 @@ class U_I18N_API NumberFormat : public Format { * Returns true if grouping is used in this format. For example, * in the English locale, with grouping on, the number 1234567 * might be formatted as "1,234,567". The grouping separator as - * well as the size of each group is locale dependant and is + * well as the size of each group is locale dependent and is * determined by sub-classes of NumberFormat. * @see setGroupingUsed * @stable ICU 2.0 @@ -965,6 +997,21 @@ class U_I18N_API NumberFormat : public Format { */ virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const; + /** + * Get the rounding mode. This will always return NumberFormat::ERoundingMode::kRoundUnnecessary + * if the subclass does not support rounding. + * @return A rounding mode + * @draft ICU 60 + */ + virtual ERoundingMode getRoundingMode(void) const; + + /** + * Set the rounding mode. If a subclass does not support rounding, this will do nothing. + * @param roundingMode A rounding mode + * @draft ICU 60 + */ + virtual void setRoundingMode(ERoundingMode roundingMode); + public: /** diff --git a/deps/icu-small/source/i18n/unicode/plurrule.h b/deps/icu-small/source/i18n/unicode/plurrule.h index a14f392b7a2e52..d372d79c845179 100644 --- a/deps/icu-small/source/i18n/unicode/plurrule.h +++ b/deps/icu-small/source/i18n/unicode/plurrule.h @@ -43,7 +43,7 @@ U_NAMESPACE_BEGIN class Hashtable; -class FixedDecimal; +class IFixedDecimal; class VisibleDigitsWithExponent; class RuleChain; class PluralRuleParser; @@ -367,7 +367,7 @@ class U_I18N_API PluralRules : public UObject { /** * @internal */ - UnicodeString select(const FixedDecimal &number) const; + UnicodeString select(const IFixedDecimal &number) const; /** * @internal */ @@ -402,7 +402,7 @@ class U_I18N_API PluralRules : public UObject { /** * Deprecated Function, does not produce useful results. * - * Orginally intended to return all the values for which select() would return the keyword. + * Originally intended to return all the values for which select() would return the keyword. * If the keyword is unknown, returns no values, but this is not an error. If * the number of values is unlimited, returns no values and -1 as the * count. diff --git a/deps/icu-small/source/i18n/unicode/rbnf.h b/deps/icu-small/source/i18n/unicode/rbnf.h index b4cbb0673249b4..d8d33420c2a015 100644 --- a/deps/icu-small/source/i18n/unicode/rbnf.h +++ b/deps/icu-small/source/i18n/unicode/rbnf.h @@ -1010,6 +1010,20 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { */ virtual void setContext(UDisplayContext value, UErrorCode& status); + /** + * Get the rounding mode. + * @return A rounding mode + * @draft ICU 60 + */ + virtual ERoundingMode getRoundingMode(void) const; + + /** + * Set the rounding mode. + * @param roundingMode A rounding mode + * @draft ICU 60 + */ + virtual void setRoundingMode(ERoundingMode roundingMode); + public: /** * ICU "poor man's RTTI", returns a UClassID for this class. @@ -1059,7 +1073,6 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { void dispose(); void stripWhitespace(UnicodeString& src); void initDefaultRuleSet(); - void format(double number, NFRuleSet& ruleSet); NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const; /* friend access */ @@ -1079,6 +1092,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { PluralFormat *createPluralFormat(UPluralType pluralType, const UnicodeString &pattern, UErrorCode& status) const; UnicodeString& adjustForCapitalizationContext(int32_t startPos, UnicodeString& currentResult, UErrorCode& status) const; UnicodeString& format(int64_t number, NFRuleSet *ruleSet, UnicodeString& toAppendTo, UErrorCode& status) const; + void format(double number, NFRuleSet& rs, UnicodeString& toAppendTo, UErrorCode& status) const; private: NFRuleSet **ruleSets; @@ -1090,6 +1104,7 @@ class U_I18N_API RuleBasedNumberFormat : public NumberFormat { DecimalFormatSymbols* decimalFormatSymbols; NFRule *defaultInfinityRule; NFRule *defaultNaNRule; + ERoundingMode roundingMode; UBool lenient; UnicodeString* lenientParseRules; LocalizationInfo* localizations; diff --git a/deps/icu-small/source/i18n/unicode/selfmt.h b/deps/icu-small/source/i18n/unicode/selfmt.h old mode 100755 new mode 100644 diff --git a/deps/icu-small/source/i18n/unicode/smpdtfmt.h b/deps/icu-small/source/i18n/unicode/smpdtfmt.h index 4733e759aa705f..9801b29bdb749b 100644 --- a/deps/icu-small/source/i18n/unicode/smpdtfmt.h +++ b/deps/icu-small/source/i18n/unicode/smpdtfmt.h @@ -1433,6 +1433,16 @@ class U_I18N_API SimpleDateFormat: public DateFormat { int32_t checkIntSuffix(const UnicodeString& text, int32_t start, int32_t patLoc, UBool isNegative) const; + /** + * Counts number of digit code points in the specified text. + * + * @param text input text + * @param start start index, inclusive + * @param end end index, exclusive + * @return number of digits found in the text in the specified range. + */ + int32_t countDigits(const UnicodeString& text, int32_t start, int32_t end) const; + /** * Translate a pattern, mapping each character in the from string to the * corresponding character in the to string. Return an error if the original diff --git a/deps/icu-small/source/i18n/unicode/tznames.h b/deps/icu-small/source/i18n/unicode/tznames.h index 60f0e5e4a1a975..399265d85ae66c 100644 --- a/deps/icu-small/source/i18n/unicode/tznames.h +++ b/deps/icu-small/source/i18n/unicode/tznames.h @@ -291,14 +291,12 @@ class U_I18N_API TimeZoneNames : public UObject { virtual UnicodeString& getDisplayName(const UnicodeString& tzID, UTimeZoneNameType type, UDate date, UnicodeString& name) const; /** - * @internal For specific users only until proposed publicly. - * @deprecated This API is ICU internal only. + * @internal ICU internal only, for specific users only until proposed publicly. */ virtual void loadAllDisplayNames(UErrorCode& status); /** - * @internal For specific users only until proposed publicly. - * @deprecated This API is ICU internal only. + * @internal ICU internal only, for specific users only until proposed publicly. */ virtual void getDisplayNames(const UnicodeString& tzID, const UTimeZoneNameType types[], int32_t numTypes, UDate date, UnicodeString dest[], UErrorCode& status) const; diff --git a/deps/icu-small/source/i18n/unicode/ucoleitr.h b/deps/icu-small/source/i18n/unicode/ucoleitr.h index 1d644fc259b429..96c67f2018a6c3 100644 --- a/deps/icu-small/source/i18n/unicode/ucoleitr.h +++ b/deps/icu-small/source/i18n/unicode/ucoleitr.h @@ -152,7 +152,7 @@ ucol_reset(UCollationElements *elems); * A single character may contain more than one collation element. * @param elems The UCollationElements containing the text. * @param status A pointer to a UErrorCode to receive any errors. - * @return The next collation elements ordering, otherwise returns NULLORDER + * @return The next collation elements ordering, otherwise returns UCOL_NULLORDER * if an error has occured or if the end of string has been reached * @stable ICU 2.0 */ @@ -168,7 +168,7 @@ ucol_next(UCollationElements *elems, UErrorCode *status); * a U_BUFFER_OVERFLOW_ERROR is returned if the internal stack * buffer has been exhausted. * @return The previous collation elements ordering, otherwise returns - * NULLORDER if an error has occured or if the start of string has + * UCOL_NULLORDER if an error has occured or if the start of string has * been reached. * @stable ICU 2.0 */ diff --git a/deps/icu-small/source/i18n/unicode/unum.h b/deps/icu-small/source/i18n/unicode/unum.h index 5fc65486fc9374..9154bce661ae03 100644 --- a/deps/icu-small/source/i18n/unicode/unum.h +++ b/deps/icu-small/source/i18n/unicode/unum.h @@ -115,7 +115,7 @@ *

    * You can also control the display of numbers with such function as * unum_getAttributes() and unum_setAttributes(), which let you set the - * miminum fraction digits, grouping, etc. + * minimum fraction digits, grouping, etc. * @see UNumberFormatAttributes for more details *

    * You can also use forms of the parse and format methods with @@ -126,7 +126,7 @@ * *

    * It is also possible to change or set the symbols used for a particular - * locale like the currency symbol, the grouping seperator , monetary seperator + * locale like the currency symbol, the grouping separator , monetary separator * etc by making use of functions unum_setSymbols() and unum_getSymbols(). */ @@ -265,7 +265,12 @@ typedef enum UNumberFormatStyle { } UNumberFormatStyle; /** The possible number format rounding modes. - * @stable ICU 2.0 + * + *

    + * For more detail on rounding modes, see: + * http://userguide.icu-project.org/formatparse/numbers/rounding-modes + * + * @stable ICU 2.0 */ typedef enum UNumberFormatRoundingMode { UNUM_ROUND_CEILING, @@ -883,7 +888,7 @@ unum_parseToUFormattable(const UNumberFormat* fmt, * @param localized TRUE if the pattern is localized, FALSE otherwise. * @param pattern The new pattern * @param patternLength The length of pattern, or -1 if null-terminated. - * @param parseError A pointer to UParseError to recieve information + * @param parseError A pointer to UParseError to receive information * about errors occurred during parsing, or NULL if no parse error * information is desired. * @param status A pointer to an input-output UErrorCode. diff --git a/deps/icu-small/source/i18n/unicode/uspoof.h b/deps/icu-small/source/i18n/unicode/uspoof.h index 6c2ac5e109fd55..9fcfcd3ede836c 100644 --- a/deps/icu-small/source/i18n/unicode/uspoof.h +++ b/deps/icu-small/source/i18n/unicode/uspoof.h @@ -368,18 +368,17 @@ */ struct USpoofChecker; -typedef struct USpoofChecker USpoofChecker; /**< typedef for C of USpoofChecker */ - -#ifndef U_HIDE_DRAFT_API /** - * @see uspoof_openCheckResult + * @stable ICU 4.2 */ +typedef struct USpoofChecker USpoofChecker; /**< typedef for C of USpoofChecker */ + struct USpoofCheckResult; /** * @see uspoof_openCheckResult + * @stable ICU 58 */ typedef struct USpoofCheckResult USpoofCheckResult; -#endif /* U_HIDE_DRAFT_API */ /** * Enum for the kinds of checks that USpoofChecker can perform. @@ -419,7 +418,6 @@ typedef enum USpoofChecks { */ USPOOF_WHOLE_SCRIPT_CONFUSABLE = 4, -#ifndef U_HIDE_DRAFT_API /** * Enable this flag in {@link uspoof_setChecks} to turn on all types of confusables. You may set * the checks to some subset of SINGLE_SCRIPT_CONFUSABLE, MIXED_SCRIPT_CONFUSABLE, or WHOLE_SCRIPT_CONFUSABLE to @@ -427,10 +425,9 @@ typedef enum USpoofChecks { * * @see uspoof_areConfusable * @see uspoof_getSkeleton - * @draft ICU 58 + * @stable ICU 58 */ USPOOF_CONFUSABLE = USPOOF_SINGLE_SCRIPT_CONFUSABLE | USPOOF_MIXED_SCRIPT_CONFUSABLE | USPOOF_WHOLE_SCRIPT_CONFUSABLE, -#endif /* U_HIDE_DRAFT_API */ #ifndef U_HIDE_DEPRECATED_API /** @@ -1058,7 +1055,6 @@ uspoof_checkUnicodeString(const USpoofChecker *sc, #endif -#ifndef U_HIDE_DRAFT_API /** * Check the specified string for possible security issues. * The text to be checked will typically be an identifier of some sort. @@ -1085,9 +1081,9 @@ uspoof_checkUnicodeString(const USpoofChecker *sc, * @see uspoof_openCheckResult * @see uspoof_check2UTF8 * @see uspoof_check2UnicodeString - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uspoof_check2(const USpoofChecker *sc, const UChar* id, int32_t length, USpoofCheckResult* checkResult, @@ -1122,9 +1118,9 @@ uspoof_check2(const USpoofChecker *sc, * @see uspoof_openCheckResult * @see uspoof_check2 * @see uspoof_check2UnicodeString - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uspoof_check2UTF8(const USpoofChecker *sc, const char *id, int32_t length, USpoofCheckResult* checkResult, @@ -1154,9 +1150,9 @@ uspoof_check2UTF8(const USpoofChecker *sc, * @see uspoof_openCheckResult * @see uspoof_check2 * @see uspoof_check2UTF8 - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uspoof_check2UnicodeString(const USpoofChecker *sc, const icu::UnicodeString &id, USpoofCheckResult* checkResult, @@ -1179,9 +1175,9 @@ uspoof_check2UnicodeString(const USpoofChecker *sc, * @see uspoof_check2 * @see uspoof_check2UTF8 * @see uspoof_check2UnicodeString - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT USpoofCheckResult* U_EXPORT2 +U_STABLE USpoofCheckResult* U_EXPORT2 uspoof_openCheckResult(UErrorCode *status); /** @@ -1189,9 +1185,9 @@ uspoof_openCheckResult(UErrorCode *status); * its implementation. * * @param checkResult The instance of USpoofCheckResult to close - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT void U_EXPORT2 +U_STABLE void U_EXPORT2 uspoof_closeCheckResult(USpoofCheckResult *checkResult); #if U_SHOW_CPLUSPLUS_API @@ -1205,7 +1201,7 @@ U_NAMESPACE_BEGIN * * @see LocalPointerBase * @see LocalPointer - * @draft ICU 58 + * @stable ICU 58 */ U_DEFINE_LOCAL_OPEN_POINTER(LocalUSpoofCheckResultPointer, USpoofCheckResult, uspoof_closeCheckResult); @@ -1225,9 +1221,9 @@ U_NAMESPACE_END * will be zero if the input string passes all of the * enabled checks. * @see uspoof_setChecks - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT int32_t U_EXPORT2 +U_STABLE int32_t U_EXPORT2 uspoof_getCheckResultChecks(const USpoofCheckResult *checkResult, UErrorCode *status); /** @@ -1238,9 +1234,9 @@ uspoof_getCheckResultChecks(const USpoofCheckResult *checkResult, UErrorCode *st * @param status The error code, set if an error occurred. * @return The restriction level contained in the USpoofCheckResult * @see uspoof_setRestrictionLevel - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT URestrictionLevel U_EXPORT2 +U_STABLE URestrictionLevel U_EXPORT2 uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult *checkResult, UErrorCode *status); /** @@ -1252,11 +1248,10 @@ uspoof_getCheckResultRestrictionLevel(const USpoofCheckResult *checkResult, UErr * @param checkResult The instance of USpoofCheckResult created by {@link uspoof_openCheckResult} * @return The set of numerics contained in the USpoofCheckResult * @param status The error code, set if an error occurred. - * @draft ICU 58 + * @stable ICU 58 */ -U_DRAFT const USet* U_EXPORT2 +U_STABLE const USet* U_EXPORT2 uspoof_getCheckResultNumerics(const USpoofCheckResult *checkResult, UErrorCode *status); -#endif /* U_HIDE_DRAFT_API */ /** diff --git a/deps/icu-small/source/i18n/unum.cpp b/deps/icu-small/source/i18n/unum.cpp index 95c744c128de78..907a1cd95e138f 100644 --- a/deps/icu-small/source/i18n/unum.cpp +++ b/deps/icu-small/source/i18n/unum.cpp @@ -298,7 +298,7 @@ unum_formatDecimal(const UNumberFormat* fmt, } if (length < 0) { - length = uprv_strlen(number); + length = static_cast(uprv_strlen(number)); } StringPiece numSP(number, length); Formattable numFmtbl(numSP, *status); @@ -507,20 +507,43 @@ U_CAPI int32_t U_EXPORT2 unum_getAttribute(const UNumberFormat* fmt, UNumberFormatAttribute attr) { - const NumberFormat* nf = reinterpret_cast(fmt); - if ( attr == UNUM_LENIENT_PARSE ) { - // Supported for all subclasses - return nf->isLenient(); - } + const NumberFormat* nf = reinterpret_cast(fmt); + if (attr == UNUM_LENIENT_PARSE) { + // Supported for all subclasses + return nf->isLenient(); + } + else if (attr == UNUM_MAX_INTEGER_DIGITS) { + return nf->getMaximumIntegerDigits(); + } + else if (attr == UNUM_MIN_INTEGER_DIGITS) { + return nf->getMinimumIntegerDigits(); + } + else if (attr == UNUM_INTEGER_DIGITS) { + // TODO: what should this return? + return nf->getMinimumIntegerDigits(); + } + else if (attr == UNUM_MAX_FRACTION_DIGITS) { + return nf->getMaximumFractionDigits(); + } + else if (attr == UNUM_MIN_FRACTION_DIGITS) { + return nf->getMinimumFractionDigits(); + } + else if (attr == UNUM_FRACTION_DIGITS) { + // TODO: what should this return? + return nf->getMinimumFractionDigits(); + } + else if (attr == UNUM_ROUNDING_MODE) { + return nf->getRoundingMode(); + } - // The remaining attributea are only supported for DecimalFormat - const DecimalFormat* df = dynamic_cast(nf); - if (df != NULL) { - UErrorCode ignoredStatus = U_ZERO_ERROR; - return df->getAttribute( attr, ignoredStatus ); - } + // The remaining attributes are only supported for DecimalFormat + const DecimalFormat* df = dynamic_cast(nf); + if (df != NULL) { + UErrorCode ignoredStatus = U_ZERO_ERROR; + return df->getAttribute(attr, ignoredStatus); + } - return -1; + return -1; } U_CAPI void U_EXPORT2 @@ -528,18 +551,42 @@ unum_setAttribute( UNumberFormat* fmt, UNumberFormatAttribute attr, int32_t newValue) { - NumberFormat* nf = reinterpret_cast(fmt); - if ( attr == UNUM_LENIENT_PARSE ) { - // Supported for all subclasses - // keep this here as the class may not be a DecimalFormat - return nf->setLenient(newValue != 0); - } - // The remaining attributea are only supported for DecimalFormat - DecimalFormat* df = dynamic_cast(nf); - if (df != NULL) { - UErrorCode ignoredStatus = U_ZERO_ERROR; - df->setAttribute(attr, newValue, ignoredStatus); - } + NumberFormat* nf = reinterpret_cast(fmt); + if (attr == UNUM_LENIENT_PARSE) { + // Supported for all subclasses + // keep this here as the class may not be a DecimalFormat + return nf->setLenient(newValue != 0); + } + else if (attr == UNUM_MAX_INTEGER_DIGITS) { + return nf->setMaximumIntegerDigits(newValue); + } + else if (attr == UNUM_MIN_INTEGER_DIGITS) { + return nf->setMinimumIntegerDigits(newValue); + } + else if (attr == UNUM_INTEGER_DIGITS) { + nf->setMinimumIntegerDigits(newValue); + return nf->setMaximumIntegerDigits(newValue); + } + else if (attr == UNUM_MAX_FRACTION_DIGITS) { + return nf->setMaximumFractionDigits(newValue); + } + else if (attr == UNUM_MIN_FRACTION_DIGITS) { + return nf->setMinimumFractionDigits(newValue); + } + else if (attr == UNUM_FRACTION_DIGITS) { + nf->setMinimumFractionDigits(newValue); + return nf->setMaximumFractionDigits(newValue); + } + else if (attr == UNUM_ROUNDING_MODE) { + return nf->setRoundingMode((NumberFormat::ERoundingMode)newValue); + } + + // The remaining attributes are only supported for DecimalFormat + DecimalFormat* df = dynamic_cast(nf); + if (df != NULL) { + UErrorCode ignoredStatus = U_ZERO_ERROR; + df->setAttribute(attr, newValue, ignoredStatus); + } } U_CAPI double U_EXPORT2 diff --git a/deps/icu-small/source/i18n/uspoof.cpp b/deps/icu-small/source/i18n/uspoof.cpp index 1cb726e0b0c60e..019819b11cdde1 100644 --- a/deps/icu-small/source/i18n/uspoof.cpp +++ b/deps/icu-small/source/i18n/uspoof.cpp @@ -374,7 +374,7 @@ uspoof_check2UTF8(const USpoofChecker *sc, if (U_FAILURE(*status)) { return 0; } - UnicodeString idStr = UnicodeString::fromUTF8(StringPiece(id, length>=0 ? length : uprv_strlen(id))); + UnicodeString idStr = UnicodeString::fromUTF8(StringPiece(id, length>=0 ? length : static_cast(uprv_strlen(id)))); int32_t result = uspoof_check2UnicodeString(sc, idStr, checkResult, status); return result; } @@ -413,8 +413,8 @@ uspoof_areConfusableUTF8(const USpoofChecker *sc, *status = U_ILLEGAL_ARGUMENT_ERROR; return 0; } - UnicodeString id1Str = UnicodeString::fromUTF8(StringPiece(id1, length1>=0? length1 : uprv_strlen(id1))); - UnicodeString id2Str = UnicodeString::fromUTF8(StringPiece(id2, length2>=0? length2 : uprv_strlen(id2))); + UnicodeString id1Str = UnicodeString::fromUTF8(StringPiece(id1, length1>=0? length1 : static_cast(uprv_strlen(id1)))); + UnicodeString id2Str = UnicodeString::fromUTF8(StringPiece(id2, length2>=0? length2 : static_cast(uprv_strlen(id2)))); int32_t results = uspoof_areConfusableUnicodeString(sc, id1Str, id2Str, status); return results; } @@ -680,7 +680,7 @@ uspoof_getSkeletonUTF8(const USpoofChecker *sc, return 0; } - UnicodeString srcStr = UnicodeString::fromUTF8(StringPiece(id, length>=0 ? length : uprv_strlen(id))); + UnicodeString srcStr = UnicodeString::fromUTF8(StringPiece(id, length>=0 ? length : static_cast(uprv_strlen(id)))); UnicodeString destStr; uspoof_getSkeletonUnicodeString(sc, type, srcStr, destStr, status); if (U_FAILURE(*status)) { diff --git a/deps/icu-small/source/i18n/uspoof_conf.cpp b/deps/icu-small/source/i18n/uspoof_conf.cpp index e5d9bb633835b2..3a061d9dfcffe1 100644 --- a/deps/icu-small/source/i18n/uspoof_conf.cpp +++ b/deps/icu-small/source/i18n/uspoof_conf.cpp @@ -396,6 +396,7 @@ void ConfusabledataBuilder::outputData(UErrorCode &status) { for (i=0; ielementAti(i); UChar32 codePoint = ConfusableDataUtils::keyToCodePoint(key); + (void)previousCodePoint; // Suppress unused variable warning. // strictly greater because there can be only one entry per code point U_ASSERT(codePoint > previousCodePoint); keys[i] = key; diff --git a/deps/icu-small/source/i18n/uspoof_conf.h b/deps/icu-small/source/i18n/uspoof_conf.h index ee8aa2678e90c5..ad040edf105271 100644 --- a/deps/icu-small/source/i18n/uspoof_conf.h +++ b/deps/icu-small/source/i18n/uspoof_conf.h @@ -21,6 +21,8 @@ #ifndef __USPOOF_BUILDCONF_H__ #define __USPOOF_BUILDCONF_H__ +#include "unicode/utypes.h" + #if !UCONFIG_NO_NORMALIZATION #if !UCONFIG_NO_REGULAR_EXPRESSIONS diff --git a/deps/icu-small/source/i18n/utf8collationiterator.cpp b/deps/icu-small/source/i18n/utf8collationiterator.cpp index 85d4b76b08e00b..345b1994ef0e77 100644 --- a/deps/icu-small/source/i18n/utf8collationiterator.cpp +++ b/deps/icu-small/source/i18n/utf8collationiterator.cpp @@ -49,26 +49,25 @@ UTF8CollationIterator::handleNextCE32(UChar32 &c, UErrorCode & /*errorCode*/) { } // Optimized combination of U8_NEXT_OR_FFFD() and UTRIE2_U8_NEXT32(). c = u8[pos++]; - if(c < 0xc0) { - // ASCII 00..7F; trail bytes 80..BF map to error values. + if(U8_IS_SINGLE(c)) { + // ASCII 00..7F return trie->data32[c]; } uint8_t t1, t2; - if(c < 0xe0 && pos != length && (t1 = (u8[pos] - 0x80)) <= 0x3f) { - // U+0080..U+07FF; 00..7F map to error values. + if(0xe0 <= c && c < 0xf0 && + ((pos + 1) < length || length < 0) && + U8_IS_VALID_LEAD3_AND_T1(c, t1 = u8[pos]) && + (t2 = (u8[pos + 1] - 0x80)) <= 0x3f) { + // U+0800..U+FFFF except surrogates + c = (((c & 0xf) << 12) | ((t1 & 0x3f) << 6) | t2); + pos += 2; + return UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie, c); + } else if(c < 0xe0 && c >= 0xc2 && pos != length && (t1 = (u8[pos] - 0x80)) <= 0x3f) { + // U+0080..U+07FF uint32_t ce32 = trie->data32[trie->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET - 0xc0) + c] + t1]; c = ((c & 0x1f) << 6) | t1; ++pos; return ce32; - } else if(c <= 0xef && - ((pos + 1) < length || length < 0) && - (t1 = (u8[pos] - 0x80)) <= 0x3f && (c != 0xe0 || t1 >= 0x20) && - (t2 = (u8[pos + 1] - 0x80)) <= 0x3f - ) { - // U+0800..U+FFFF; caller maps surrogates to error values. - c = (UChar)((c << 12) | (t1 << 6) | t2); - pos += 2; - return UTRIE2_GET32_FROM_U16_SINGLE_LEAD(trie, c); } else { // Function call for supplementary code points and error cases. // Illegal byte sequences yield U+FFFD. @@ -158,28 +157,17 @@ FCDUTF8CollationIterator::handleNextCE32(UChar32 &c, UErrorCode &errorCode) { return Collation::FALLBACK_CE32; } c = u8[pos++]; - if(c < 0xc0) { - // ASCII 00..7F; trail bytes 80..BF map to error values. + if(U8_IS_SINGLE(c)) { + // ASCII 00..7F return trie->data32[c]; } uint8_t t1, t2; - if(c < 0xe0 && pos != length && (t1 = (u8[pos] - 0x80)) <= 0x3f) { - // U+0080..U+07FF; 00..7F map to error values. - uint32_t ce32 = trie->data32[trie->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET - 0xc0) + c] + t1]; - c = ((c & 0x1f) << 6) | t1; - ++pos; - if(CollationFCD::hasTccc(c) && pos != length && nextHasLccc()) { - pos -= 2; - } else { - return ce32; - } - } else if(c <= 0xef && - ((pos + 1) < length || length < 0) && - (t1 = (u8[pos] - 0x80)) <= 0x3f && (c != 0xe0 || t1 >= 0x20) && - (t2 = (u8[pos + 1] - 0x80)) <= 0x3f - ) { - // U+0800..U+FFFF; caller maps surrogates to error values. - c = (UChar)((c << 12) | (t1 << 6) | t2); + if(0xe0 <= c && c < 0xf0 && + ((pos + 1) < length || length < 0) && + U8_IS_VALID_LEAD3_AND_T1(c, t1 = u8[pos]) && + (t2 = (u8[pos + 1] - 0x80)) <= 0x3f) { + // U+0800..U+FFFF except surrogates + c = (((c & 0xf) << 12) | ((t1 & 0x3f) << 6) | t2); pos += 2; if(CollationFCD::hasTccc(c) && (CollationFCD::maybeTibetanCompositeVowel(c) || @@ -188,6 +176,16 @@ FCDUTF8CollationIterator::handleNextCE32(UChar32 &c, UErrorCode &errorCode) { } else { break; // return CE32(BMP) } + } else if(c < 0xe0 && c >= 0xc2 && pos != length && (t1 = (u8[pos] - 0x80)) <= 0x3f) { + // U+0080..U+07FF + uint32_t ce32 = trie->data32[trie->index[(UTRIE2_UTF8_2B_INDEX_2_OFFSET - 0xc0) + c] + t1]; + c = ((c & 0x1f) << 6) | t1; + ++pos; + if(CollationFCD::hasTccc(c) && pos != length && nextHasLccc()) { + pos -= 2; + } else { + return ce32; + } } else { // Function call for supplementary code points and error cases. // Illegal byte sequences yield U+FFFD. @@ -237,7 +235,7 @@ UBool FCDUTF8CollationIterator::previousHasTccc() const { U_ASSERT(state == CHECK_BWD && pos != 0); UChar32 c = u8[pos - 1]; - if(c < 0x80) { return FALSE; } + if(U8_IS_SINGLE(c)) { return FALSE; } int32_t i = pos; U8_PREV_OR_FFFD(u8, 0, i, c); if(c > 0xffff) { c = U16_LEAD(c); } @@ -271,7 +269,7 @@ FCDUTF8CollationIterator::nextCodePoint(UErrorCode &errorCode) { if(pos == length || ((c = u8[pos]) == 0 && length < 0)) { return U_SENTINEL; } - if(c < 0x80) { + if(U8_IS_SINGLE(c)) { ++pos; return c; } @@ -309,7 +307,7 @@ FCDUTF8CollationIterator::previousCodePoint(UErrorCode &errorCode) { if(pos == 0) { return U_SENTINEL; } - if((c = u8[pos - 1]) < 0x80) { + if(U8_IS_SINGLE(c = u8[pos - 1])) { --pos; return c; } diff --git a/deps/icu-small/source/i18n/vtzone.cpp b/deps/icu-small/source/i18n/vtzone.cpp index 85b42b0e06639d..0c76c9b6c98bf2 100644 --- a/deps/icu-small/source/i18n/vtzone.cpp +++ b/deps/icu-small/source/i18n/vtzone.cpp @@ -1747,26 +1747,16 @@ VTimeZone::write(VTZWriter& writer, UErrorCode& status) const { } } } else { - UVector *customProps = NULL; + UnicodeString icutzprop; + UVector customProps(nullptr, uhash_compareUnicodeString, status); if (olsonzid.length() > 0 && icutzver.length() > 0) { - customProps = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status); - if (U_FAILURE(status)) { - return; - } - UnicodeString *icutzprop = new UnicodeString(ICU_TZINFO_PROP); - icutzprop->append(olsonzid); - icutzprop->append((UChar)0x005B/*'['*/); - icutzprop->append(icutzver); - icutzprop->append((UChar)0x005D/*']'*/); - customProps->addElement(icutzprop, status); - if (U_FAILURE(status)) { - delete icutzprop; - delete customProps; - return; - } + icutzprop.append(olsonzid); + icutzprop.append(u'['); + icutzprop.append(icutzver); + icutzprop.append(u']'); + customProps.addElement(&icutzprop, status); } - writeZone(writer, *tz, customProps, status); - delete customProps; + writeZone(writer, *tz, &customProps, status); } } diff --git a/deps/icu-small/source/i18n/windtfmt.cpp b/deps/icu-small/source/i18n/windtfmt.cpp index 70a9364a0cf3cc..e8e32abd3ff477 100644 --- a/deps/icu-small/source/i18n/windtfmt.cpp +++ b/deps/icu-small/source/i18n/windtfmt.cpp @@ -102,7 +102,7 @@ static UErrorCode GetEquivalentWindowsLocaleName(const Locale& locale, UnicodeSt char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; // Convert from names like "en_CA" and "de_DE@collation=phonebook" to "en-CA" and "de-DE-u-co-phonebk". - int32_t length = uloc_toLanguageTag(locale.getName(), asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &status); + (void)uloc_toLanguageTag(locale.getName(), asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &status); if (U_SUCCESS(status)) { @@ -219,7 +219,7 @@ Format *Win32DateFormat::clone(void) const } // TODO: Is just ignoring pos the right thing? -UnicodeString &Win32DateFormat::format(Calendar &cal, UnicodeString &appendTo, FieldPosition &pos) const +UnicodeString &Win32DateFormat::format(Calendar &cal, UnicodeString &appendTo, FieldPosition & /* pos */) const { FILETIME ft; SYSTEMTIME st_gmt; @@ -263,7 +263,7 @@ UnicodeString &Win32DateFormat::format(Calendar &cal, UnicodeString &appendTo, F return appendTo; } -void Win32DateFormat::parse(const UnicodeString& text, Calendar& cal, ParsePosition& pos) const +void Win32DateFormat::parse(const UnicodeString& /* text */, Calendar& /* cal */, ParsePosition& pos) const { pos.setErrorIndex(pos.getIndex()); } diff --git a/deps/icu-small/source/i18n/winnmfmt.cpp b/deps/icu-small/source/i18n/winnmfmt.cpp index 40b4b647763abb..b1724b62c27279 100644 --- a/deps/icu-small/source/i18n/winnmfmt.cpp +++ b/deps/icu-small/source/i18n/winnmfmt.cpp @@ -147,7 +147,7 @@ static UErrorCode GetEquivalentWindowsLocaleName(const Locale& locale, UnicodeSt char asciiBCP47Tag[LOCALE_NAME_MAX_LENGTH] = {}; // Convert from names like "en_CA" and "de_DE@collation=phonebook" to "en-CA" and "de-DE-u-co-phonebk". - int32_t length = uloc_toLanguageTag(locale.getName(), asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &status); + (void) uloc_toLanguageTag(locale.getName(), asciiBCP47Tag, UPRV_LENGTHOF(asciiBCP47Tag), FALSE, &status); if (U_SUCCESS(status)) { @@ -299,17 +299,17 @@ Format *Win32NumberFormat::clone(void) const return new Win32NumberFormat(*this); } -UnicodeString& Win32NumberFormat::format(double number, UnicodeString& appendTo, FieldPosition& pos) const +UnicodeString& Win32NumberFormat::format(double number, UnicodeString& appendTo, FieldPosition& /* pos */) const { return format(getMaximumFractionDigits(), appendTo, L"%.16f", number); } -UnicodeString& Win32NumberFormat::format(int32_t number, UnicodeString& appendTo, FieldPosition& pos) const +UnicodeString& Win32NumberFormat::format(int32_t number, UnicodeString& appendTo, FieldPosition& /* pos */) const { return format(getMinimumFractionDigits(), appendTo, L"%I32d", number); } -UnicodeString& Win32NumberFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& pos) const +UnicodeString& Win32NumberFormat::format(int64_t number, UnicodeString& appendTo, FieldPosition& /* pos */) const { return format(getMinimumFractionDigits(), appendTo, L"%I64d", number); } diff --git a/deps/icu-small/source/i18n/wintzimpl.cpp b/deps/icu-small/source/i18n/wintzimpl.cpp index 07aad2178701a7..c55ed95fa8aea2 100644 --- a/deps/icu-small/source/i18n/wintzimpl.cpp +++ b/deps/icu-small/source/i18n/wintzimpl.cpp @@ -65,12 +65,12 @@ static UBool getSystemTimeInformation(TimeZone *tz, SYSTEMTIME &daylightDate, SY // Always use DOW type rule int32_t hour, min, sec, mil; standardDate.wYear = 0; - standardDate.wMonth = std->getRule()->getRuleMonth() + 1; - standardDate.wDay = std->getRule()->getRuleWeekInMonth(); + standardDate.wMonth = static_cast(std->getRule()->getRuleMonth()) + 1; + standardDate.wDay = static_cast(std->getRule()->getRuleWeekInMonth()); if (standardDate.wDay < 0) { standardDate.wDay = 5; } - standardDate.wDayOfWeek = std->getRule()->getRuleDayOfWeek() - 1; + standardDate.wDayOfWeek = static_cast(std->getRule()->getRuleDayOfWeek()) - 1; mil = std->getRule()->getRuleMillisInDay(); hour = mil/3600000; @@ -80,18 +80,18 @@ static UBool getSystemTimeInformation(TimeZone *tz, SYSTEMTIME &daylightDate, SY sec = mil/1000; mil %= 1000; - standardDate.wHour = hour; - standardDate.wMinute = min; - standardDate.wSecond = sec; - standardDate.wMilliseconds = mil; + standardDate.wHour = static_cast(hour); + standardDate.wMinute = static_cast(min); + standardDate.wSecond = static_cast(sec); + standardDate.wMilliseconds = static_cast(mil); daylightDate.wYear = 0; - daylightDate.wMonth = dst->getRule()->getRuleMonth() + 1; - daylightDate.wDay = dst->getRule()->getRuleWeekInMonth(); + daylightDate.wMonth = static_cast(dst->getRule()->getRuleMonth()) + 1; + daylightDate.wDay = static_cast(dst->getRule()->getRuleWeekInMonth()); if (daylightDate.wDay < 0) { daylightDate.wDay = 5; } - daylightDate.wDayOfWeek = dst->getRule()->getRuleDayOfWeek() - 1; + daylightDate.wDayOfWeek = static_cast(dst->getRule()->getRuleDayOfWeek()) - 1; mil = dst->getRule()->getRuleMillisInDay(); hour = mil/3600000; @@ -101,10 +101,10 @@ static UBool getSystemTimeInformation(TimeZone *tz, SYSTEMTIME &daylightDate, SY sec = mil/1000; mil %= 1000; - daylightDate.wHour = hour; - daylightDate.wMinute = min; - daylightDate.wSecond = sec; - daylightDate.wMilliseconds = mil; + daylightDate.wHour = static_cast(hour); + daylightDate.wMinute = static_cast(min); + daylightDate.wSecond = static_cast(sec); + daylightDate.wMilliseconds = static_cast(mil); } } else { result = FALSE; diff --git a/deps/icu-small/source/i18n/zonemeta.cpp b/deps/icu-small/source/i18n/zonemeta.cpp index 84a965780291c9..c386b0cae5e2ca 100644 --- a/deps/icu-small/source/i18n/zonemeta.cpp +++ b/deps/icu-small/source/i18n/zonemeta.cpp @@ -690,7 +690,6 @@ ZoneMeta::createMetazoneMappings(const UnicodeString &tzid) { mzMappings = new UVector(deleteOlsonToMetaMappingEntry, NULL, status); if (U_FAILURE(status)) { delete mzMappings; - deleteOlsonToMetaMappingEntry(entry); uprv_free(entry); break; } @@ -792,7 +791,7 @@ static void U_CALLCONV initAvailableMetaZoneIDs () { break; } const char *mzID = ures_getKey(&res); - int32_t len = uprv_strlen(mzID); + int32_t len = static_cast(uprv_strlen(mzID)); UChar *uMzID = (UChar*)uprv_malloc(sizeof(UChar) * (len + 1)); if (uMzID == NULL) { status = U_MEMORY_ALLOCATION_ERROR; diff --git a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp index 1127cd4ffb8bec..13bfbd3789fda7 100644 --- a/deps/icu-small/source/tools/escapesrc/escapesrc.cpp +++ b/deps/icu-small/source/tools/escapesrc/escapesrc.cpp @@ -17,15 +17,10 @@ static const char kSPACE = 0x20, kTAB = 0x09, kLF = 0x0A, - kCR = 0x0D, + kCR = 0x0D; // kHASH = 0x23, // kSLASH = 0x2f, - kBKSLASH = 0x5C, // kSTAR = 0x2A, - kL_U = 0x75, - kU_U = 0x55, - kQUOT = 0x27, - kDBLQ = 0x22; # include "cptbl.h" @@ -273,7 +268,7 @@ bool fixAt(std::string &linestr, size_t pos) { U8_NEXT(s, i, length, c); } if(c<0) { - fprintf(stderr, "Illegal utf-8 sequence at Column: %d\n", old_pos); + fprintf(stderr, "Illegal utf-8 sequence at Column: %d\n", (int)old_pos); fprintf(stderr, "Line: >>%s<<\n", linestr.c_str()); return true; } diff --git a/deps/icu-small/source/tools/genrb/parse.cpp b/deps/icu-small/source/tools/genrb/parse.cpp index 88b08c21d0c72c..f003aa3abfab89 100644 --- a/deps/icu-small/source/tools/genrb/parse.cpp +++ b/deps/icu-small/source/tools/genrb/parse.cpp @@ -763,8 +763,8 @@ GenrbImporter::getRules( } /* Parse the data into an SRBRoot */ - struct SRBRoot *data = - parse(ucbuf.getAlias(), inputDir, outputDir, filename.data(), FALSE, FALSE, &errorCode); + LocalPointer data( + parse(ucbuf.getAlias(), inputDir, outputDir, filename.data(), FALSE, FALSE, &errorCode)); if (U_FAILURE(errorCode)) { return; } diff --git a/deps/icu-small/source/tools/genrb/wrtjava.cpp b/deps/icu-small/source/tools/genrb/wrtjava.cpp index a0d72f72d8fe0f..f1eb229760f12f 100644 --- a/deps/icu-small/source/tools/genrb/wrtjava.cpp +++ b/deps/icu-small/source/tools/genrb/wrtjava.cpp @@ -33,6 +33,7 @@ #include "uhash.h" #include "uresimp.h" #include "unicode/ustring.h" +#include "unicode/utf8.h" void res_write_java(struct SResource *res,UErrorCode *status); @@ -244,7 +245,8 @@ str_write_java(const UChar *src, int32_t srcLen, UBool printEndLine, UErrorCode memset(buf,0,length); bufLen = uCharsToChars(buf,length,src,srcLen,status); - + // buflen accounts for extra bytes added due to multi byte encoding of + // non ASCII characters if(printEndLine) write_tabs(out); @@ -284,10 +286,22 @@ str_write_java(const UChar *src, int32_t srcLen, UBool printEndLine, UErrorCode } } T_FileStream_write(out,"\"",1); + uint32_t byteIndex = 0; + uint32_t trailBytes = 0; if(len+addfLength; - if(srcLen>0 ) { byteArray = res->fData; diff --git a/deps/icu-small/source/tools/genrb/wrtxml.cpp b/deps/icu-small/source/tools/genrb/wrtxml.cpp index 2bfcfebf9efd70..58e055d5718c03 100644 --- a/deps/icu-small/source/tools/genrb/wrtxml.cpp +++ b/deps/icu-small/source/tools/genrb/wrtxml.cpp @@ -368,6 +368,7 @@ static char* convertAndEscape(char** pDest, int32_t destCap, int32_t* destLength #define LF 0x000D #define AT_SIGN 0x0040 +#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 static void trim(char **src, int32_t *len){ @@ -420,6 +421,8 @@ print(UChar* src, int32_t srcLen,const char *tagStart,const char *tagEnd, UErro } } +#endif + static void printNoteElements(const UString *src, UErrorCode *status){ @@ -471,6 +474,7 @@ static void printAttribute(const char *name, const char *value, int32_t /*len*/) write_utf8_file(out, UnicodeString("\"")); } +#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when no RegularExpressions are available */ static void printAttribute(const char *name, const UnicodeString value, int32_t /*len*/) { write_utf8_file(out, UnicodeString(" ")); @@ -479,6 +483,7 @@ static void printAttribute(const char *name, const UnicodeString value, int32_t write_utf8_file(out, value); write_utf8_file(out, UnicodeString("\"")); } +#endif static void printComments(struct UString *src, const char *resName, UBool printTranslate, UErrorCode *status){ diff --git a/deps/icu-small/source/tools/toolutil/package.cpp b/deps/icu-small/source/tools/toolutil/package.cpp index e3354b3524325c..d96c6dd36ddb41 100644 --- a/deps/icu-small/source/tools/toolutil/package.cpp +++ b/deps/icu-small/source/tools/toolutil/package.cpp @@ -663,7 +663,7 @@ Package::readPackage(const char *filename) { // set the last item's platform type typeEnum=getTypeEnumForInputData(items[itemCount-1].data, items[itemCount-1].length, &errorCode); if(typeEnum<0 || U_FAILURE(errorCode)) { - fprintf(stderr, "icupkg: not an ICU data file: item \"%s\" in \"%s\"\n", items[i-1].name, filename); + fprintf(stderr, "icupkg: not an ICU data file: item \"%s\" in \"%s\"\n", items[itemCount-1].name, filename); exit(U_INVALID_FORMAT_ERROR); } items[itemCount-1].type=makeTypeLetter(typeEnum); diff --git a/deps/icu-small/source/tools/toolutil/pkg_genc.cpp b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp index ec2cb2b67f0b84..5ab0d846302179 100644 --- a/deps/icu-small/source/tools/toolutil/pkg_genc.cpp +++ b/deps/icu-small/source/tools/toolutil/pkg_genc.cpp @@ -47,6 +47,7 @@ #include "unicode/uclean.h" #include "uoptions.h" #include "pkg_genc.h" +#include "filetools.h" #define MAX_COLUMN ((uint32_t)(0xFFFFFFFFU)) @@ -284,7 +285,7 @@ writeAssemblyCode(const char *filename, const char *destdir, const char *optEntr } #if defined (WINDOWS_WITH_GNUC) && U_PLATFORM != U_PF_CYGWIN - /* Need to fix the file seperator character when using MinGW. */ + /* Need to fix the file separator character when using MinGW. */ swapFileSepChar(outFilePath, U_FILE_SEP_CHAR, '/'); #endif diff --git a/deps/icu-small/source/tools/toolutil/ppucd.cpp b/deps/icu-small/source/tools/toolutil/ppucd.cpp index cccde81c7abfac..b11efa7f7c4601 100644 --- a/deps/icu-small/source/tools/toolutil/ppucd.cpp +++ b/deps/icu-small/source/tools/toolutil/ppucd.cpp @@ -98,6 +98,7 @@ static const char *lineTypeStrings[]={ "defaults", "block", "cp", + "unassigned", "algnamesrange" }; @@ -203,8 +204,17 @@ PreparsedUCD::getProps(UnicodeSet &newValues, UErrorCode &errorCode) { UChar32 start, end; if(!parseCodePointRange(field, start, end, errorCode)) { return NULL; } UniProps *props; + UBool insideBlock=FALSE; // TRUE if cp or unassigned range inside the block range. switch(lineType) { case DEFAULTS_LINE: + // Should occur before any block/cp/unassigned line. + if(blockLineIndex>=0) { + fprintf(stderr, + "error in preparsed UCD: default line %ld after one or more block lines\n", + (long)lineNumber); + errorCode=U_PARSE_ERROR; + return NULL; + } if(defaultLineIndex>=0) { fprintf(stderr, "error in preparsed UCD: second line with default properties on line %ld\n", @@ -228,9 +238,22 @@ PreparsedUCD::getProps(UnicodeSet &newValues, UErrorCode &errorCode) { blockLineIndex=lineIndex; break; case CP_LINE: + case UNASSIGNED_LINE: if(blockProps.start<=start && end<=blockProps.end) { - // Code point range fully inside the last block inherits the block properties. - cpProps=blockProps; + insideBlock=TRUE; + if(lineType==CP_LINE) { + // Code point range fully inside the last block inherits the block properties. + cpProps=blockProps; + } else { + // Unassigned line inside the block is based on default properties + // which override block properties. + cpProps=defaultProps; + newValues=blockValues; + // Except, it inherits the one blk=Block property. + int32_t blkIndex=UCHAR_BLOCK-UCHAR_INT_START; + cpProps.intProps[blkIndex]=blockProps.intProps[blkIndex]; + newValues.remove((UChar32)UCHAR_BLOCK); + } } else if(start>blockProps.end || end Date: Thu, 14 Dec 2017 11:26:30 -0800 Subject: [PATCH 30/31] deps: ICU 60.2 bump - Update to Maintainance ICU 60.2 - CLDR 32.0.1 - http://site.icu-project.org/download/60#TOC-ICU-60.2-bug-fixes - Subsumes https://github.com/nodejs/node/pull/16931 PR-URL: https://github.com/nodejs/node/pull/17687 Reviewed-By: Tiancheng "Timothy" Gu Reviewed-By: Richard Lau Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- configure | 4 ++-- deps/icu-small/source/common/rbbi_cache.h | 2 +- deps/icu-small/source/common/rbbicst.pl | 0 deps/icu-small/source/common/ucnv_u8.cpp | 18 +++++++++++++++--- .../icu-small/source/common/unicode/brkiter.h | 2 +- deps/icu-small/source/common/unicode/ucnv.h | 12 ++++++------ deps/icu-small/source/common/unicode/utext.h | 18 +++++++++--------- .../icu-small/source/common/unicode/uvernum.h | 6 +++--- deps/icu-small/source/data/in/icudt60l.dat | Bin 2710368 -> 2787232 bytes deps/icu-small/source/i18n/calendar.cpp | 12 ++++++++++-- deps/icu-small/source/i18n/regexcst.pl | 0 deps/icu-small/source/i18n/unicode/selfmt.h | 0 deps/icu-small/source/tools/genrb/genrb.cpp | 2 +- deps/icu-small/source/tools/genrb/parse.cpp | 6 +++--- 14 files changed, 51 insertions(+), 31 deletions(-) mode change 100644 => 100755 deps/icu-small/source/common/rbbicst.pl mode change 100644 => 100755 deps/icu-small/source/i18n/regexcst.pl mode change 100644 => 100755 deps/icu-small/source/i18n/unicode/selfmt.h diff --git a/configure b/configure index a6e609eed3a43f..3864f88a88fd8b 100755 --- a/configure +++ b/configure @@ -1075,8 +1075,8 @@ def glob_to_var(dir_base, dir_sub, patch_dir): def configure_intl(o): icus = [ { - 'url': 'https://ssl.icu-project.org/files/icu4c/60.1/icu4c-60_1-src.zip', - 'md5': 'e6cb990ac2a3161d31a3def8435f80cb', + 'url': 'https://ssl.icu-project.org/files/icu4c/60.2/icu4c-60_2-src.zip', + 'md5': '115908818fd0324530b2acb1b029738d', }, ] def icu_download(path): diff --git a/deps/icu-small/source/common/rbbi_cache.h b/deps/icu-small/source/common/rbbi_cache.h index b8a18d81deb1d9..8dc7320db90a9e 100644 --- a/deps/icu-small/source/common/rbbi_cache.h +++ b/deps/icu-small/source/common/rbbi_cache.h @@ -121,7 +121,7 @@ class RuleBasedBreakIterator::BreakCache: public UMemory { * If the requested position is a break boundary, leave the iteration * position on it. * If the requested position is not a boundary, leave the iteration - * position on the preceding boundary and include both the the + * position on the preceding boundary and include both the * preceding and following boundaries in the cache. * Additional boundaries, either preceding or following, may be added * to the cache as a side effect. diff --git a/deps/icu-small/source/common/rbbicst.pl b/deps/icu-small/source/common/rbbicst.pl old mode 100644 new mode 100755 diff --git a/deps/icu-small/source/common/ucnv_u8.cpp b/deps/icu-small/source/common/ucnv_u8.cpp index 866cf81659486b..c7ef87fd500c62 100644 --- a/deps/icu-small/source/common/ucnv_u8.cpp +++ b/deps/icu-small/source/common/ucnv_u8.cpp @@ -28,6 +28,7 @@ #include "unicode/utf.h" #include "unicode/utf8.h" #include "unicode/utf16.h" +#include "uassert.h" #include "ucnv_bld.h" #include "ucnv_cnv.h" #include "cmemory.h" @@ -694,7 +695,9 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, // Use a single counter for source and target, counting the minimum of // the source length and the target capacity. // Let the standard converter handle edge cases. + const uint8_t *limit=sourceLimit; if(count>targetCapacity) { + limit-=(count-targetCapacity); count=targetCapacity; } @@ -707,11 +710,11 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, // sequence from the previous buffer. int32_t length=count-toULimit; if(length>0) { - uint8_t b1=*(sourceLimit-1); + uint8_t b1=*(limit-1); if(U8_IS_SINGLE(b1)) { // common ASCII character } else if(U8_IS_TRAIL(b1) && length>=2) { - uint8_t b2=*(sourceLimit-2); + uint8_t b2=*(limit-2); if(0xe0<=b2 && b2<0xf0 && U8_IS_VALID_LEAD3_AND_T1(b2, b1)) { // truncated 3-byte sequence count-=2; @@ -811,7 +814,7 @@ ucnv_UTF8FromUTF8(UConverterFromUnicodeArgs *pFromUArgs, } /* copy the legal byte sequence to the target */ - { + if(count>=toULength) { int8_t i; for(i=0; isource=(char *)source; + pFromUArgs->target=(char *)target; + *pErrorCode=U_USING_DEFAULT_WARNING; + return; } } } + U_ASSERT(count>=0); if(U_SUCCESS(*pErrorCode) && sourcetargetLimit) { diff --git a/deps/icu-small/source/common/unicode/brkiter.h b/deps/icu-small/source/common/unicode/brkiter.h index 9c1ac7531bc60d..c64bb712222c63 100644 --- a/deps/icu-small/source/common/unicode/brkiter.h +++ b/deps/icu-small/source/common/unicode/brkiter.h @@ -292,7 +292,7 @@ class U_COMMON_API BreakIterator : public UObject { * does nothing. Negative values move to previous boundaries * and positive values move to later boundaries. * @return The new iterator position, or - * DONE if there are fewer than |n| boundaries in the specfied direction. + * DONE if there are fewer than |n| boundaries in the specified direction. * @stable ICU 2.0 */ virtual int32_t next(int32_t n) = 0; diff --git a/deps/icu-small/source/common/unicode/ucnv.h b/deps/icu-small/source/common/unicode/ucnv.h index 86e3b8447449d9..05d0050f4a2fc9 100644 --- a/deps/icu-small/source/common/unicode/ucnv.h +++ b/deps/icu-small/source/common/unicode/ucnv.h @@ -29,7 +29,7 @@ * converter, you can get its properties, set options, convert your data and * close the converter.

    * - *

    Since many software programs recogize different converter names for + *

    Since many software programs recognize different converter names for * different types of converters, there are other functions in this API to * iterate over the converter aliases. The functions {@link ucnv_getAvailableName() }, * {@link ucnv_getAlias() } and {@link ucnv_getStandardName() } are some of the @@ -184,7 +184,7 @@ typedef enum { /** * Function pointer for error callback in the codepage to unicode direction. - * Called when an error has occured in conversion to unicode, or on open/close of the callback (see reason). + * Called when an error has occurred in conversion to unicode, or on open/close of the callback (see reason). * @param context Pointer to the callback's private data * @param args Information about the conversion in progress * @param codeUnits Points to 'length' bytes of the concerned codepage sequence @@ -452,7 +452,7 @@ ucnv_openU(const UChar *name, * @param platform the platform in which the codepage number exists * @param err error status U_MEMORY_ALLOCATION_ERROR, U_FILE_ACCESS_ERROR * @return the created Unicode converter object, or NULL if an error - * occured. + * occurred. * @see ucnv_open * @see ucnv_openU * @see ucnv_close @@ -596,7 +596,7 @@ U_NAMESPACE_END * stateful, then subChars will be an empty string. * * @param converter the Unicode converter - * @param subChars the subsitution characters + * @param subChars the substitution characters * @param len on input the capacity of subChars, on output the number * of bytes copied to it * @param err the outgoing error status code. @@ -832,7 +832,7 @@ ucnv_getMinCharSize(const UConverter *converter); * name will be filled in. * * @param converter the Unicode converter. - * @param displayLocale is the specific Locale we want to localised for + * @param displayLocale is the specific Locale we want to localized for * @param displayName user provided buffer to be filled in * @param displayNameCapacity size of displayName Buffer * @param err error status code @@ -877,7 +877,7 @@ ucnv_getName(const UConverter *converter, UErrorCode *err); * * @param converter the Unicode converter * @param err the error status code. - * @return If any error occurrs, -1 will be returned otherwise, the codepage number + * @return If any error occurs, -1 will be returned otherwise, the codepage number * will be returned * @see ucnv_openCCSID * @see ucnv_getPlatform diff --git a/deps/icu-small/source/common/unicode/utext.h b/deps/icu-small/source/common/unicode/utext.h index 55709d403a6d02..7eea1da240c1d5 100644 --- a/deps/icu-small/source/common/unicode/utext.h +++ b/deps/icu-small/source/common/unicode/utext.h @@ -389,7 +389,7 @@ utext_equals(const UText *a, const UText *b); /***************************************************************************** * - * Functions to work with the text represeted by a UText wrapper + * Functions to work with the text represented by a UText wrapper * *****************************************************************************/ @@ -433,7 +433,7 @@ utext_isLengthExpensive(const UText *ut); * * The iteration position will be set to the start of the returned code point. * - * This function is roughly equivalent to the the sequence + * This function is roughly equivalent to the sequence * utext_setNativeIndex(index); * utext_current32(); * (There is a subtle difference if the index is out of bounds by being less than zero - @@ -592,7 +592,7 @@ U_STABLE void U_EXPORT2 utext_setNativeIndex(UText *ut, int64_t nativeIndex); /** - * Move the iterator postion by delta code points. The number of code points + * Move the iterator position by delta code points. The number of code points * is a signed number; a negative delta will move the iterator backwards, * towards the start of the text. *

    @@ -611,7 +611,7 @@ U_STABLE UBool U_EXPORT2 utext_moveIndex32(UText *ut, int32_t delta); /** - * Get the native index of the character preceeding the current position. + * Get the native index of the character preceding the current position. * If the iteration position is already at the start of the text, zero * is returned. * The value returned is the same as that obtained from the following sequence, @@ -628,7 +628,7 @@ utext_moveIndex32(UText *ut, int32_t delta); * native index of the character most recently returned from utext_next(). * * @param ut the text to be accessed - * @return the native index of the character preceeding the current index position, + * @return the native index of the character preceding the current index position, * or zero if the current position is at the start of the text. * @stable ICU 3.6 */ @@ -1054,7 +1054,7 @@ UTextAccess(UText *ut, int64_t nativeIndex, UBool forward); * be NUL-terminated if there is sufficient space in the destination buffer. * * @param ut the UText from which to extract data. - * @param nativeStart the native index of the first characer to extract. + * @param nativeStart the native index of the first character to extract. * @param nativeLimit the native string index of the position following the last * character to extract. * @param dest the UChar (UTF-16) buffer into which the extracted text is placed @@ -1211,7 +1211,7 @@ UTextClose(UText *ut); struct UTextFuncs { /** * (public) Function table size, sizeof(UTextFuncs) - * Intended for use should the table grow to accomodate added + * Intended for use should the table grow to accommodate added * functions in the future, to allow tests for older format * function tables that do not contain the extensions. * @@ -1345,7 +1345,7 @@ typedef struct UTextFuncs UTextFuncs; struct UText { /** * (private) Magic. Used to help detect when UText functions are handed - * invalid or unitialized UText structs. + * invalid or uninitialized UText structs. * utext_openXYZ() functions take an initialized, * but not necessarily open, UText struct as an * optional fill-in parameter. This magic field @@ -1367,7 +1367,7 @@ struct UText { /** - * Text provider properties. This set of flags is maintainted by the + * Text provider properties. This set of flags is maintained by the * text provider implementation. * @stable ICU 3.4 */ diff --git a/deps/icu-small/source/common/unicode/uvernum.h b/deps/icu-small/source/common/unicode/uvernum.h index ce7dec15535c7e..d905a0f50d1d29 100644 --- a/deps/icu-small/source/common/unicode/uvernum.h +++ b/deps/icu-small/source/common/unicode/uvernum.h @@ -64,7 +64,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.6 */ -#define U_ICU_VERSION_MINOR_NUM 1 +#define U_ICU_VERSION_MINOR_NUM 2 /** The current ICU patchlevel version as an integer. * This value will change in the subsequent releases of ICU @@ -119,7 +119,7 @@ * This value will change in the subsequent releases of ICU * @stable ICU 2.4 */ -#define U_ICU_VERSION "60.1" +#define U_ICU_VERSION "60.2" /** The current ICU library major/minor version as a string without dots, for library name suffixes. * This value will change in the subsequent releases of ICU @@ -131,7 +131,7 @@ /** Data version in ICU4C. * @internal ICU 4.4 Internal Use Only **/ -#define U_ICU_DATA_VERSION "60.1" +#define U_ICU_DATA_VERSION "60.2" #endif /* U_HIDE_INTERNAL_API */ /*=========================================================================== diff --git a/deps/icu-small/source/data/in/icudt60l.dat b/deps/icu-small/source/data/in/icudt60l.dat index 2e04376ae8bc7dfe3fc03814a3d21ca3c060cc49..c81ffccfa9ff97a6a7df66fec0a543b47defa233 100644 GIT binary patch delta 135812 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 H#HhajROZ1x diff --git a/deps/icu-small/source/i18n/calendar.cpp b/deps/icu-small/source/i18n/calendar.cpp index 426bd7904cbd84..7ccaa43b82b1e7 100644 --- a/deps/icu-small/source/i18n/calendar.cpp +++ b/deps/icu-small/source/i18n/calendar.cpp @@ -708,6 +708,8 @@ fZone(NULL), fRepeatedWallTime(UCAL_WALLTIME_LAST), fSkippedWallTime(UCAL_WALLTIME_LAST) { + validLocale[0] = 0; + actualLocale[0] = 0; clear(); if (U_FAILURE(success)) { return; @@ -734,6 +736,8 @@ fZone(NULL), fRepeatedWallTime(UCAL_WALLTIME_LAST), fSkippedWallTime(UCAL_WALLTIME_LAST) { + validLocale[0] = 0; + actualLocale[0] = 0; if (U_FAILURE(success)) { return; } @@ -766,6 +770,8 @@ fZone(NULL), fRepeatedWallTime(UCAL_WALLTIME_LAST), fSkippedWallTime(UCAL_WALLTIME_LAST) { + validLocale[0] = 0; + actualLocale[0] = 0; if (U_FAILURE(success)) { return; } @@ -822,8 +828,10 @@ Calendar::operator=(const Calendar &right) fWeekendCease = right.fWeekendCease; fWeekendCeaseMillis = right.fWeekendCeaseMillis; fNextStamp = right.fNextStamp; - uprv_strcpy(validLocale, right.validLocale); - uprv_strcpy(actualLocale, right.actualLocale); + uprv_strncpy(validLocale, right.validLocale, sizeof(validLocale)); + uprv_strncpy(actualLocale, right.actualLocale, sizeof(actualLocale)); + validLocale[sizeof(validLocale)-1] = 0; + actualLocale[sizeof(validLocale)-1] = 0; } return *this; diff --git a/deps/icu-small/source/i18n/regexcst.pl b/deps/icu-small/source/i18n/regexcst.pl old mode 100644 new mode 100755 diff --git a/deps/icu-small/source/i18n/unicode/selfmt.h b/deps/icu-small/source/i18n/unicode/selfmt.h old mode 100644 new mode 100755 diff --git a/deps/icu-small/source/tools/genrb/genrb.cpp b/deps/icu-small/source/tools/genrb/genrb.cpp index 68870bd90a175d..c4fc462066a099 100644 --- a/deps/icu-small/source/tools/genrb/genrb.cpp +++ b/deps/icu-small/source/tools/genrb/genrb.cpp @@ -652,7 +652,7 @@ processFile(const char *filename, const char *cp, goto finish; } if (ucbuf == NULL || U_FAILURE(status)) { - fprintf(stderr, "An error occured processing file %s. Error: %s\n", + fprintf(stderr, "An error occurred processing file %s. Error: %s\n", openFileName == NULL ? filename : openFileName, u_errorName(status)); goto finish; } diff --git a/deps/icu-small/source/tools/genrb/parse.cpp b/deps/icu-small/source/tools/genrb/parse.cpp index f003aa3abfab89..ddfb082afe63f4 100644 --- a/deps/icu-small/source/tools/genrb/parse.cpp +++ b/deps/icu-small/source/tools/genrb/parse.cpp @@ -362,7 +362,7 @@ parseUCARules(ParseState* state, char *tag, uint32_t startline, const struct USt ucbuf = ucbuf_open(filename, &cp, getShowWarning(),FALSE, status); if (U_FAILURE(*status)) { - error(line, "An error occured while opening the input file %s\n", filename); + error(line, "An error occurred while opening the input file %s\n", filename); return NULL; } @@ -500,7 +500,7 @@ parseTransliterator(ParseState* state, char *tag, uint32_t startline, const stru ucbuf = ucbuf_open(filename, &cp, getShowWarning(),FALSE, status); if (U_FAILURE(*status)) { - error(line, "An error occured while opening the input file %s\n", filename); + error(line, "An error occurred while opening the input file %s\n", filename); return NULL; } @@ -758,7 +758,7 @@ GenrbImporter::getRules( return; } if (ucbuf.isNull() || U_FAILURE(errorCode)) { - fprintf(stderr, "An error occured processing file %s. Error: %s\n", openFileName.data(), u_errorName(errorCode)); + fprintf(stderr, "An error occurred processing file %s. Error: %s\n", openFileName.data(), u_errorName(errorCode)); return; } From f14a715613d750d35f303ba4fc1be712549e1816 Mon Sep 17 00:00:00 2001 From: Myles Borins Date: Fri, 2 Feb 2018 10:08:42 -0800 Subject: [PATCH 31/31] fixup: potential hack for null_ptr --- deps/icu-small/source/common/unicode/char16ptr.h | 5 +++++ deps/icu-small/source/i18n/number_affixutils.h | 4 ++++ deps/icu-small/source/i18n/number_decimalquantity.h | 4 ++++ deps/icu-small/source/i18n/number_decimfmtprops.h | 4 ++++ deps/icu-small/source/i18n/number_modifiers.h | 4 ++++ deps/icu-small/source/i18n/number_patternstring.h | 4 ++++ deps/icu-small/source/i18n/number_stringbuilder.h | 4 ++++ deps/icu-small/source/i18n/number_types.h | 4 ++++ 8 files changed, 33 insertions(+) diff --git a/deps/icu-small/source/common/unicode/char16ptr.h b/deps/icu-small/source/common/unicode/char16ptr.h index fbce1775911518..5e694a14588ca0 100644 --- a/deps/icu-small/source/common/unicode/char16ptr.h +++ b/deps/icu-small/source/common/unicode/char16ptr.h @@ -10,6 +10,11 @@ #include #include "unicode/utypes.h" +#if __cplusplus > 201000 +namespace std { + typedef decltype(nullptr) nullptr_t; +} +#endif /** * \file * \brief C++ API: char16_t pointer wrappers with diff --git a/deps/icu-small/source/i18n/number_affixutils.h b/deps/icu-small/source/i18n/number_affixutils.h index fd76c99b975566..8358a6ab49dfa7 100644 --- a/deps/icu-small/source/i18n/number_affixutils.h +++ b/deps/icu-small/source/i18n/number_affixutils.h @@ -7,7 +7,11 @@ #ifndef __NUMBER_AFFIXUTILS_H__ #define __NUMBER_AFFIXUTILS_H__ +#if __cplusplus < 201000 #include +#else +#include +#endif #include "number_types.h" #include "unicode/stringpiece.h" #include "unicode/unistr.h" diff --git a/deps/icu-small/source/i18n/number_decimalquantity.h b/deps/icu-small/source/i18n/number_decimalquantity.h index ccb832623cb7bb..e9ec1fb2c20cd7 100644 --- a/deps/icu-small/source/i18n/number_decimalquantity.h +++ b/deps/icu-small/source/i18n/number_decimalquantity.h @@ -7,7 +7,11 @@ #ifndef __NUMBER_DECIMALQUANTITY_H__ #define __NUMBER_DECIMALQUANTITY_H__ +#if __cplusplus < 201000 #include +#else +#include +#endif #include "unicode/umachine.h" #include "decNumber.h" #include "standardplural.h" diff --git a/deps/icu-small/source/i18n/number_decimfmtprops.h b/deps/icu-small/source/i18n/number_decimfmtprops.h index 3e25966b6f5612..15c1f102ed56ae 100644 --- a/deps/icu-small/source/i18n/number_decimfmtprops.h +++ b/deps/icu-small/source/i18n/number_decimfmtprops.h @@ -8,7 +8,11 @@ #define __NUMBER_DECIMFMTPROPS_H__ #include "unicode/unistr.h" +#if __cplusplus < 201000 #include +#else +#include +#endif #include "unicode/plurrule.h" #include "unicode/currpinf.h" #include "unicode/unum.h" diff --git a/deps/icu-small/source/i18n/number_modifiers.h b/deps/icu-small/source/i18n/number_modifiers.h index 6a88828a44dd71..1607ed06af59cc 100644 --- a/deps/icu-small/source/i18n/number_modifiers.h +++ b/deps/icu-small/source/i18n/number_modifiers.h @@ -8,7 +8,11 @@ #define __NUMBER_MODIFIERS_H__ #include +#if __cplusplus < 201000 #include +#else +#include +#endif #include "unicode/uniset.h" #include "unicode/simpleformatter.h" #include "standardplural.h" diff --git a/deps/icu-small/source/i18n/number_patternstring.h b/deps/icu-small/source/i18n/number_patternstring.h index 6e1bb7f44ddc02..0558e66da52ddd 100644 --- a/deps/icu-small/source/i18n/number_patternstring.h +++ b/deps/icu-small/source/i18n/number_patternstring.h @@ -8,7 +8,11 @@ #define __NUMBER_PATTERNSTRING_H__ +#if __cplusplus < 201000 #include +#else +#include +#endif #include "unicode/unum.h" #include "unicode/unistr.h" #include "number_types.h" diff --git a/deps/icu-small/source/i18n/number_stringbuilder.h b/deps/icu-small/source/i18n/number_stringbuilder.h index f08dcb1d1bed6a..c94c6288e9bd2e 100644 --- a/deps/icu-small/source/i18n/number_stringbuilder.h +++ b/deps/icu-small/source/i18n/number_stringbuilder.h @@ -8,7 +8,11 @@ #define __NUMBER_STRINGBUILDER_H__ +#if __cplusplus < 201000 #include +#else +#include +#endif #include "unicode/numfmt.h" #include "unicode/ustring.h" #include "cstring.h" diff --git a/deps/icu-small/source/i18n/number_types.h b/deps/icu-small/source/i18n/number_types.h index 2bc21bd40dcb18..f1c7ba37c4ee0d 100644 --- a/deps/icu-small/source/i18n/number_types.h +++ b/deps/icu-small/source/i18n/number_types.h @@ -7,7 +7,11 @@ #ifndef __NUMBER_TYPES_H__ #define __NUMBER_TYPES_H__ +#if __cplusplus < 201000 #include +#else +#include +#endif #include "unicode/decimfmt.h" #include "unicode/unum.h" #include "unicode/numsys.h"