From 989d2cdbac477a5443e6ba8e999b47d803b502cb Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Fri, 27 Jan 2017 15:43:51 -0800 Subject: [PATCH 001/121] doc: edit CONTRIBUTING.md for clarity PR-URL: https://github.com/nodejs/node/pull/11045 Reviewed-By: Evan Lucas Reviewed-By: Anna Henningsen Reviewed-By: Joyee Cheung Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Michal Zasso Reviewed-By: Luigi Pinca Reviewed-By: Gibson Fahnestock Reviewed-By: James M Snell --- CONTRIBUTING.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 736a9542c42baf..ab3a88630285a7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,7 +16,7 @@ For general help using Node.js, please file an issue at the [Node.js help repository](https://github.com/nodejs/help/issues). Discussion of non-technical topics including subjects like intellectual -property, trademark and high level project questions should move to the +property, trademark, and high level project questions should move to the [Technical Steering Committee (TSC)](https://github.com/nodejs/TSC/issues) instead. @@ -109,8 +109,8 @@ changed and why. Follow these guidelines when writing one: lowercase with the exception of proper nouns, acronyms, and the ones that refer to code, like function/variable names. The description should be prefixed with the name of the changed subsystem and start with an - imperative verb, for example, "net: add localAddress and localPort - to Socket". + imperative verb. Example: "net: add localAddress and localPort + to Socket" 2. Keep the second line blank. 3. Wrap all other lines at 72 columns. @@ -121,11 +121,11 @@ subsystem: explain the commit in one line Body of commit message is a few lines of text, explaining things in more detail, possibly giving some background about the issue -being fixed, etc. etc. +being fixed, etc. The body of the commit message can be several paragraphs, and please do proper word-wrap and keep columns shorter than about -72 characters or so. That way `git log` will show things +72 characters or so. That way, `git log` will show things nicely even when it is indented. ``` @@ -170,19 +170,19 @@ $ ./configure && make -j4 test Windows: ```text - .\vcbuild nosign test +> vcbuild test ``` (See the [BUILDING.md](./BUILDING.md) for more details.) -Make sure the linter is happy and that all tests pass. Please, do not submit -patches that fail either check. +Make sure the linter does not report any issues and that all tests pass. Please +do not submit patches that fail either check. -Running `make test`/`.\vcbuild nosign test` will run the linter as well unless one or +Running `make test`/`vcbuild test` will run the linter as well unless one or more tests fail. If you want to run the linter without running tests, use -`make lint`/`.\vcbuild nosign jslint`. +`make lint`/`vcbuild lint`. If you are updating tests and just want to run a single test to check it, you can use this syntax to run it exactly as the test harness would: @@ -214,7 +214,7 @@ Pull requests are usually reviewed within a few days. ### Step 7: Discuss and update You will probably get feedback or requests for changes to your Pull Request. -This is a big part of the submission process, so don't be disheartened! +This is a big part of the submission process so don't be disheartened! To make changes to an existing Pull Request, make the changes to your branch. When you push that branch to your fork, GitHub will automatically update the @@ -252,7 +252,7 @@ If in doubt, you can always ask for guidance in the Pull Request or on Feel free to post a comment in the Pull Request to ping reviewers if you are awaiting an answer on something. If you encounter words or acronyms that -seem unfamiliar, check out this +seem unfamiliar, refer to this [glossary](https://sites.google.com/a/chromium.org/dev/glossary). Note that multiple commits often get squashed when they are landed (see the @@ -260,7 +260,7 @@ notes about [commit squashing](#commit-squashing)). ### Step 8: Landing -In order to get landed, a Pull Request needs to be reviewed and +In order to land, a Pull Request needs to be reviewed and [approved](#getting-approvals-for-your-pull-request) by at least one Node.js Collaborator and pass a [CI (Continuous Integration) test run](#ci-testing). @@ -280,8 +280,8 @@ your name on it. Congratulations and thanks for your contribution! ### Commit Squashing -When the commits in your Pull Request get landed, they will be squashed -into one commit per logical change, with metadata added to the commit +When the commits in your Pull Request land, they will be squashed +into one commit per logical change. Metadata will be added to the commit message (including links to the Pull Request, links to relevant issues, and the names of the reviewers). The commit history of your Pull Request, however, will stay intact on the Pull Request page. @@ -311,9 +311,9 @@ Every Pull Request needs to be tested to make sure that it works on the platforms that Node.js supports. This is done by running the code through the CI system. -Only a Collaborator can request a CI run. Usually one of them will do it +Only a Collaborator can start a CI run. Usually one of them will do it for you as approvals for the Pull Request come in. -If not, you can ask a Collaborator to request a CI run. +If not, you can ask a Collaborator to start a CI run. ### Waiting Until the Pull Request Gets Landed From 598d35c0870ac9e3d751816fd21e1c1632ad9336 Mon Sep 17 00:00:00 2001 From: Vse Mozhet Byt Date: Thu, 26 Jan 2017 18:07:54 +0200 Subject: [PATCH 002/121] doc: fix confusing example in dns.md Currently, the example throws 'Error: getHostByAddr ENOTFOUND' The previous example is edited for consistency. PR-URL: https://github.com/nodejs/node/pull/11022 Reviewed-By: Gibson Fahnestock Reviewed-By: James M Snell Reviewed-By: Rich Trott --- doc/api/dns.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/api/dns.md b/doc/api/dns.md index d3af3c3429faae..40f830a3c8e5d8 100644 --- a/doc/api/dns.md +++ b/doc/api/dns.md @@ -10,12 +10,12 @@ This category contains only one function: [`dns.lookup()`][]. **Developers looking to perform name resolution in the same way that other applications on the same operating system behave should use [`dns.lookup()`][].** -For example, looking up `nodejs.org`. +For example, looking up `iana.org`. ```js const dns = require('dns'); -dns.lookup('nodejs.org', (err, addresses, family) => { +dns.lookup('iana.org', (err, addresses, family) => { console.log('addresses:', addresses); }); ``` @@ -28,13 +28,13 @@ functions do not use the same set of configuration files used by developers who do not want to use the underlying operating system's facilities for name resolution, and instead want to _always_ perform DNS queries. -Below is an example that resolves `'nodejs.org'` then reverse resolves the IP +Below is an example that resolves `'archive.org'` then reverse resolves the IP addresses that are returned. ```js const dns = require('dns'); -dns.resolve4('nodejs.org', (err, addresses) => { +dns.resolve4('archive.org', (err, addresses) => { if (err) throw err; console.log(`addresses: ${JSON.stringify(addresses)}`); From c5210b203d3cda2495545c4e2bb5aee9875776d8 Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Sun, 29 Jan 2017 02:39:10 -0800 Subject: [PATCH 003/121] src: remove usage of V8 deprecated API in node_url.cc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also: - Avoid using 'override' as variable name - Use explicit static_cast instead of C-style cast PR-URL: https://github.com/nodejs/node/pull/11066 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Michaël Zasso --- src/node_url.cc | 61 ++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/src/node_url.cc b/src/node_url.cc index 7f21051c54e5ac..0d5e695a3c13a5 100644 --- a/src/node_url.cc +++ b/src/node_url.cc @@ -512,7 +512,7 @@ namespace url { return true; } - static inline void Copy(Isolate* isolate, + static inline void Copy(Environment* env, Local ary, std::vector* vec) { const int32_t len = ary->Length(); @@ -520,28 +520,30 @@ namespace url { return; // nothing to copy vec->reserve(len); for (int32_t n = 0; n < len; n++) { - Local val = ary->Get(n); + Local val = ary->Get(env->context(), n).ToLocalChecked(); if (val->IsString()) { - Utf8Value value(isolate, val.As()); + Utf8Value value(env->isolate(), val.As()); vec->push_back(std::string(*value, value.length())); } } } - static inline Local Copy(Isolate* isolate, + static inline Local Copy(Environment* env, 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(n, UTF8STRING(isolate, vec[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(); + base->flags = flags->Int32Value(context).FromJust(); GET_AND_SET(env, base_obj, scheme, base, URL_FLAGS_HAS_SCHEME); GET_AND_SET(env, base_obj, username, base, URL_FLAGS_HAS_USERNAME); @@ -551,11 +553,11 @@ namespace url { 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(); + base->port = port->Int32Value(context).FromJust(); Local path = GET(env, base_obj, "path"); if (path->IsArray()) { base->flags |= URL_FLAGS_HAS_PATH; - Copy(env->isolate(), path.As(), &(base->path)); + Copy(env, path.As(), &(base->path)); } } @@ -564,7 +566,7 @@ namespace url { Local context_obj) { Local flags = GET(env, context_obj, "flags"); if (flags->IsInt32()) { - int32_t _flags = flags->Int32Value(); + 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) @@ -577,7 +579,7 @@ namespace url { } Local port = GET(env, context_obj, "port"); if (port->IsInt32()) - context->port = port->Int32Value(); + context->port = port->Int32Value(env->context()).FromJust(); } // Single dot segment can be ".", "%2e", or "%2E" @@ -635,7 +637,7 @@ namespace url { Local recv, const char* input, const size_t len, - enum url_parse_state override, + enum url_parse_state state_override, Local base_obj, Local context_obj, Local cb) { @@ -669,8 +671,9 @@ namespace url { buffer.reserve(len); // Set the initial parse state. - const bool state_override = override != kUnknownState; - enum url_parse_state state = state_override ? override : kSchemeStart; + const bool has_state_override = state_override != kUnknownState; + enum url_parse_state state = has_state_override ? state_override : + kSchemeStart; const char* p = input; const char* end = input + len; @@ -702,7 +705,7 @@ namespace url { if (ASCII_ALPHA(ch)) { buffer += TO_LOWER(ch); state = kScheme; - } else if (!state_override) { + } else if (!has_state_override) { state = kNoScheme; continue; } else { @@ -714,7 +717,7 @@ namespace url { buffer += TO_LOWER(ch); p++; continue; - } else if (ch == ':' || (state_override && ch == kEOL)) { + } else if (ch == ':' || (has_state_override && ch == kEOL)) { buffer += ':'; if (buffer.size() > 0) { SET_HAVE_SCHEME() @@ -725,7 +728,7 @@ namespace url { } else { url.flags &= ~URL_FLAGS_SPECIAL; } - if (state_override) + if (has_state_override) goto done; buffer.clear(); if (url.scheme == "file:") { @@ -746,7 +749,7 @@ namespace url { url.path.push_back(""); state = kCannotBeBase; } - } else if (!state_override) { + } else if (!has_state_override) { buffer.clear(); state = kNoScheme; p = input; @@ -1000,7 +1003,7 @@ namespace url { URL_FAILED() buffer.clear(); state = kPort; - if (override == kHostname) + if (state_override == kHostname) TERMINATE() } else if (ch == kEOL || ch == '/' || @@ -1015,7 +1018,7 @@ namespace url { URL_FAILED() buffer.clear(); state = kPathStart; - if (state_override) + if (has_state_override) TERMINATE() } else { if (ch == '[') @@ -1028,7 +1031,7 @@ namespace url { case kPort: if (ASCII_DIGIT(ch)) { buffer += ch; - } else if (state_override || + } else if (has_state_override || ch == kEOL || ch == '/' || ch == '?' || @@ -1040,7 +1043,7 @@ namespace url { port = port * 10 + buffer[i] - '0'; if (port >= 0 && port <= 0xffff) { url.port = NormalizePort(url.scheme, port); - } else if (!state_override) { + } else if (!has_state_override) { URL_FAILED() } buffer.clear(); @@ -1181,7 +1184,7 @@ namespace url { if (ch == kEOL || ch == '/' || special_back_slash || - (!state_override && (ch == '?' || ch == '#'))) { + (!has_state_override && (ch == '?' || ch == '#'))) { if (IsDoubleDotSegment(buffer)) { ShortenUrlPath(&url); if (ch != '/' && !special_back_slash) { @@ -1233,7 +1236,7 @@ namespace url { } break; case kQuery: - if (ch == kEOL || (!state_override && ch == '#')) { + if (ch == kEOL || (!has_state_override && ch == '#')) { SET_HAVE_QUERY() url.query = buffer; buffer.clear(); @@ -1296,7 +1299,7 @@ namespace url { if (url.port > -1) argv[ARG_PORT] = Integer::New(isolate, url.port); if (DOES_HAVE_PATH(url)) - argv[ARG_PATH] = Copy(isolate, url.path); + argv[ARG_PATH] = Copy(env, url.path); } (void)cb->Call(context, recv, 9, argv); @@ -1314,13 +1317,15 @@ namespace url { args[3]->IsObject()); CHECK(args[4]->IsFunction()); Utf8Value input(env->isolate(), args[0]); - enum url_parse_state override = kUnknownState; - if (args[1]->IsNumber()) - override = (enum url_parse_state)(args[1]->Uint32Value()); + 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(), - override, + state_override, args[2], args[3], args[4].As()); From 8ac6a709b9a0d893a5296bf5e33f85111e093667 Mon Sep 17 00:00:00 2001 From: abouthiroppy Date: Fri, 20 Jan 2017 15:33:09 +0900 Subject: [PATCH 004/121] test: add fs-assert-encoding's test Check the error of `assertEncoding`. Confirmed in every place being used.(a place where `getoptions` is used) assetEncoding: https://github.com/nodejs/node/blob/521767c88605cb6481ea98f396924e55f9dd22f4/lib/internal/fs.js#L18 PR-URL: https://github.com/nodejs/node/pull/10913 Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Luigi Pinca --- .../parallel/test-fs-assert-encoding-error.js | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 test/parallel/test-fs-assert-encoding-error.js diff --git a/test/parallel/test-fs-assert-encoding-error.js b/test/parallel/test-fs-assert-encoding-error.js new file mode 100644 index 00000000000000..0b127d49974bb6 --- /dev/null +++ b/test/parallel/test-fs-assert-encoding-error.js @@ -0,0 +1,76 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const fs = require('fs'); + +const options = 'test'; +const noop = () => {}; +const unknownEncodingMessage = /^Error: Unknown encoding: test$/; + +assert.throws(() => { + fs.readFile('path', options, noop); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.readFileSync('path', options); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.readdir('path', options, noop); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.readdirSync('path', options); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.readlink('path', options, noop); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.readlinkSync('path', options); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.writeFile('path', 'data', options, noop); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.writeFileSync('path', 'data', options); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.appendFile('path', 'data', options, noop); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.appendFileSync('path', 'data', options); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.watch('path', options, noop); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.realpath('path', options, noop); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.realpathSync('path', options); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.mkdtemp('path', options, noop); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.mkdtempSync('path', options); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.ReadStream('path', options); +}, unknownEncodingMessage); + +assert.throws(() => { + fs.WriteStream('path', options); +}, unknownEncodingMessage); From 0d52aced0ce502a1a73b3f228029c37543498016 Mon Sep 17 00:00:00 2001 From: yorkie Date: Tue, 9 Aug 2016 23:34:23 +0800 Subject: [PATCH 005/121] stream: move legacy to lib/internal dir Improve readability of lib/stream.js by moving the legacy abstract Stream into lib/internal/streams/legacy.js. PR-URL: https://github.com/nodejs/node/pull/8197 Reviewed-By: Matteo Collina --- lib/internal/streams/legacy.js | 93 ++++++++++++++++++++++++++++++++ lib/stream.js | 99 ++-------------------------------- node.gyp | 1 + 3 files changed, 97 insertions(+), 96 deletions(-) create mode 100644 lib/internal/streams/legacy.js diff --git a/lib/internal/streams/legacy.js b/lib/internal/streams/legacy.js new file mode 100644 index 00000000000000..3242b15eabdb0d --- /dev/null +++ b/lib/internal/streams/legacy.js @@ -0,0 +1,93 @@ +'use strict'; + +const EE = require('events'); +const util = require('util'); + +function Stream() { + EE.call(this); +} +util.inherits(Stream, EE); + +Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EE.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; +}; + +module.exports = Stream; diff --git a/lib/stream.js b/lib/stream.js index 047fbceb4bdb30..a6b25a212508ab 100644 --- a/lib/stream.js +++ b/lib/stream.js @@ -1,11 +1,9 @@ 'use strict'; -module.exports = Stream; +// Note: export Stream before Readable/Writable/Duplex/... +// to avoid a cross-reference(require) issues +const Stream = module.exports = require('internal/streams/legacy'); -const EE = require('events'); -const util = require('util'); - -util.inherits(Stream, EE); Stream.Readable = require('_stream_readable'); Stream.Writable = require('_stream_writable'); Stream.Duplex = require('_stream_duplex'); @@ -14,94 +12,3 @@ Stream.PassThrough = require('_stream_passthrough'); // Backwards-compat with node 0.4.x Stream.Stream = Stream; - - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream() { - EE.call(this); -} - -Stream.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } - } - } - - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EE.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. - } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; diff --git a/node.gyp b/node.gyp index 3fa9277d859ea8..bc1a33f940f272 100644 --- a/node.gyp +++ b/node.gyp @@ -101,6 +101,7 @@ 'lib/internal/v8_prof_processor.js', 'lib/internal/streams/lazy_transform.js', 'lib/internal/streams/BufferList.js', + 'lib/internal/streams/legacy.js', 'deps/v8/tools/splaytree.js', 'deps/v8/tools/codemap.js', 'deps/v8/tools/consarray.js', From 265a59b60f83965284288dc4ce750d76fc9238eb Mon Sep 17 00:00:00 2001 From: "Sakthipriyan Vairamani (thefourtheye)" Date: Tue, 31 Jan 2017 00:14:59 +0530 Subject: [PATCH 006/121] doc: replace newlines in deprecation with space MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As it is, each line in the deprecation heading which are wrapped at 80 characters in the *.md files, are shown in different lines. For example > Stability: 0 - Deprecated: Use > `Buffer.from(arrayBuffer[, byteOffset [, length]])` > instead. is shown in three different lines. This patch replaces the newlines with space characters, so that the output will be in single line. PR-URL: https://github.com/nodejs/node/pull/11074 Reviewed-By: Anna Henningsen Reviewed-By: Jeremiah Senkpiel Reviewed-By: Colin Ihrig Reviewed-By: Timothy Gu Reviewed-By: James M Snell Reviewed-By: Luigi Pinca Reviewed-By: Michaël Zasso --- tools/doc/html.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/doc/html.js b/tools/doc/html.js index 4b1c0a0e69b2c1..3dd6f83da503df 100644 --- a/tools/doc/html.js +++ b/tools/doc/html.js @@ -208,7 +208,7 @@ function parseLists(input) { headingIndex = -1; heading = null; } - tok.text = parseAPIHeader(tok.text); + tok.text = parseAPIHeader(tok.text).replace(/\n/g, ' '); output.push({ type: 'html', text: tok.text }); return; } else if (state === 'MAYBE_STABILITY_BQ') { From 17314eb9ca55aa3ce8b37a120ea6dc24d6cd3d35 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Wed, 3 Aug 2016 10:52:05 -0700 Subject: [PATCH 007/121] meta: add explicit deprecation and semver-major policy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Formalizes deprecation policy * Introduces End-of-life deprecation phase to identify code to be removed * Outlines basics of internal vs. public API surface PR-URL: https://github.com/nodejs/node/pull/7964 Reviewed-By: Evan Lucas Reviewed-By: Sam Roberts Reviewed-By: Trevor Norris Reviewed-By: Сковорода Никита Андреевич Reviewed-By: Michaël Zasso Reviewed-By: Michael Dawson --- COLLABORATOR_GUIDE.md | 206 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 204 insertions(+), 2 deletions(-) diff --git a/COLLABORATOR_GUIDE.md b/COLLABORATOR_GUIDE.md index 7ac8f49ee09ff0..dd5bc4e8005ed2 100644 --- a/COLLABORATOR_GUIDE.md +++ b/COLLABORATOR_GUIDE.md @@ -4,6 +4,9 @@ * [Issues and Pull Requests](#issues-and-pull-requests) * [Accepting Modifications](#accepting-modifications) + - [Internal vs. Public API](#internal-vs-public-api) + - [Breaking Changes](#breaking-changes) + - [Deprecations](#deprecations) - [Involving the CTC](#involving-the-ctc) * [Landing Pull Requests](#landing-pull-requests) - [Technical HOWTO](#technical-howto) @@ -84,6 +87,205 @@ All pull requests that modify executable code should be subjected to continuous integration tests on the [project CI server](https://ci.nodejs.org/). +### Internal vs. Public API + +Due to the nature of the JavaScript language, it can often be difficult to +establish a clear distinction between which parts of the Node.js implementation +represent the "public" API Node.js users should assume to be stable and which +are considered part of the "internal" implementation detail of Node.js itself. +A general rule of thumb has been to base the determination off what +functionality is actually *documented* in the official Node.js API +documentation. However, it has been repeatedly demonstrated that either the +documentation does not completely cover implemented behavior or that Node.js +users have come to rely heavily on undocumented aspects of the Node.js +implementation. + +While there are numerous exceptions, the following general rules should be +followed to determine which aspects of the Node.js API are considered +"internal": + +- Any and all functionality exposed via `process.binding(...)` is considered to + be internal and *not* part of the Node.js Public API. +- Any and all functionality implemented in `lib/internal/**/*.js` that is not + re-exported by code in `lib/*.js`, or is not documented as part of the + Node.js Public API, is considered to be internal. +- Any object property or method whose key is a non-exported `Symbol` is + considered to be an internal property. +- Any object property or method whose key begins with the underscore `_` prefix, + and is not documented as part of the Node.js Public API, is considered to be + an internal property. +- Any object, property, method, argument, behavior, or event not documented in + the Node.js documentation is considered to be internal. +- Any native C/C++ APIs/ABIs exported by the Node.js `*.h` header files that + are hidden behind the `NODE_WANT_INTERNALS` flag are considered to be + internal. + +Exception to each of these points can be made if use or behavior of a given +internal API can be demonstrated to be sufficiently relied upon by the Node.js +ecosystem such that any changes would cause too much breakage. The threshhold +for what qualifies as "too much breakage" is to be decided on a case-by-case +basis by the CTC. + +If it is determined that a currently undocumented object, property, method, +argument, or event *should* be documented, then a pull request adding the +documentation is required in order for it to be considered part of the "public" +API. + +Making a determination about whether something *should* be documented can be +difficult and will need to be handled on a case-by-case basis. For instance, if +one documented API cannot be used successfully without the use of a second +*currently undocumented* API, then the second API *should* be documented. If +using an API in a manner currently undocumented achieves a particular useful +result, a decision will need to be made whether or not that falls within the +supported scope of that API; and if it does, it should be documented. + +Breaking changes to internal elements are permitted in semver-patch or +semver-minor commits but Collaborators should take significant care when +making and reviewing such changes. Before landing such commits, an effort +must be made to determine the potential impact of the change in the ecosystem +by analyzing current use and by validating such changes through ecosystem +testing using the [Canary in the Goldmine](https://github.com/nodejs/citgm) +tool. If a change cannot be made without ecosystem breakage, then CTC review is +required before landing the change as anything less than semver-major. + +If a determination is made that a particular internal API (for instance, an +underscore `_` prefixed property) is sufficiently relied upon by the ecosystem +such that any changes may break user code, then serious consideration should be +given to providing an alternative Public API for that functionality before any +breaking changes are made. + +### Breaking Changes + +Backwards-incompatible changes may land on the master branch at any time after +sufficient review by collaborators and approval of at least two CTC members. + +Examples of breaking changes include, but are not necessarily limited to, +removal or redefinition of existing API arguments, changing return values +(except when return values do not currently exist), removing or modifying existing properties on an options argument, adding or removing errors, +changing error messages in any way, altering expected timing of an event (e.g. +moving from sync to async responses or vice versa), and changing the +non-internal side effects of using a particular API. + +With a few notable exceptions outlined below, when backwards incompatible +changes to a *Public* API are necessary, the existing API *must* be deprecated +*first* and the new API either introduced in parallel or added after the next +major Node.js version following the deprecation as a replacement for the +deprecated API. In other words, as a general rule, existing *Public* APIs +*must not* change (in a backwards incompatible way) without a deprecation. + +Exception to this rule is given in the following cases: + +* Adding or removing errors thrown or reported by a Public API; +* Changing error messages; +* Altering the timing and non-internal side effects of the Public API. + +Such changes *must* be handled as semver-major changes but MAY be landed +without a [Deprecation cycle](#deprecation-cycle). + +From time-to-time, in particularly exceptional cases, the CTC may be asked to +consider and approve additional exceptions to this rule. + +Purely additive changes (e.g. adding new events to EventEmitter +implementations, adding new arguments to a method in a way that allows +existing code to continue working without modification, or adding new +properties to an options argument) are handled as semver-minor changes. + +Note that errors thrown, along with behaviors and APIs implemented by +dependencies of Node.js (e.g. those originating from V8) are generally not +under the control of Node.js and therefore *are not directly subject to this +policy*. However, care should still be taken when landing updates to +dependencies when it is known or expected that breaking changes to error +handling may have been made. Additional CI testing may be required. + +#### When breaking changes actually break things + +Breaking changes are difficult primarily because they change the fundamental +assumptions a user of Node.js has when writing their code and can cause +existing code to stop functioning as expected -- costing developers and users +time and energy to fix. + +Because breaking (semver-major) changes are permitted to land in master at any +time, it should be *understood and expected* that at least some subset of the +user ecosystem *may* be adversely affected *in the short term* when attempting +to build and use Node.js directly from master. This potential instability is +precisely why Node.js offers distinct Current and LTS release streams that +offer explicit stability guarantees. + +Specifically: + +* Breaking changes should *never* land in Current or LTS except when: + * Resolving critical security issues. + * Fixing a critical bug (e.g. fixing a memory leak) requires a breaking + change. + * There is CTC consensus that the change is required. +* If a breaking commit does accidentally land in a Current or LTS branch, an + attempt to fix the issue will be made before the next release; If no fix is + provided then the commit will be reverted. + +When any change is landed in master, and it is determined that the such +changes *do* break existing code, a decision may be made to revert those +changes either temporarily or permanently. However, the decision to revert or +not can often be based on many complex factors that are not easily codified. It +is also possible that the breaking commit can be labeled retroactively as a +semver-major change that will not be backported to Current or LTS branches. + +### Deprecations + +Deprecation refers to the identification of Public APIs that should no longer +be used and that may be removed or modified in non-backwards compatible ways in +a future major release of Node.js. Deprecation *may* be used with internal APIs +if there is expected impact on the user community. + +Node.js uses three fundamental Deprecation levels: + +* *Documentation-Only Deprecation* refers to elements of the Public API that are + being staged for deprecation in a future Node.js major release. An explicit + notice indicating the deprecated status is added to the API documentation + *but no functional changes are implemented in the code*. There will be no + runtime deprecation warning emitted for such deprecations. + +* *Runtime Deprecation* refers to the use of process warnings emitted at + runtime the first time that a deprecated API is used. A command-line + switch can be used to escalate such warnings into runtime errors that will + cause the Node.js process to exit. As with Documentation-Only Deprecation, + the documentation for the API must be updated to clearly indicate the + deprecated status. + +* *End-of-life* refers to APIs that have gone through Runtime Deprecation and + are ready to be removed from Node.js entirely. + +Documentation-Only Deprecations *may* be handled as semver-minor or +semver-major changes. Such deprecations have no impact on the successful +operation of running code and therefore should not be viewed as breaking +changes. + +Runtime Deprecations and End-of-life APIs (internal or public) *must* be +handled as semver-major changes unless there is CTC consensus to land the +deprecation as a semver-minor. + +All Documentation-Only and Runtime deprecations will be assigned a unique +identifier that can be used to persistently refer to the deprecation in +documentation, emitted process warnings, or errors thrown. Documentation for +these identifiers will be included in the Node.js API documentation and will +be immutable once assigned. Even if End-of-Life code is removed from Node.js, +the documentation for the assigned deprecation identifier must remain in the +Node.js API documentation. + + +A "Deprecation cycle" is one full Node.js major release during which an API +has been in one of the three Deprecation levels. (Note that Documentation-Only +Deprecations may land in a Node.js minor release but must not be upgraded to +a Runtime Deprecation until the next major release.) + +No API can be moved to End-of-life without first having gone through a +Runtime Deprecation cycle. + +A best effort will be made to communicate pending deprecations and associated +mitigations with the ecosystem as soon as possible (preferably *before* the pull +request adding the deprecation lands in master). All deprecations included in +a Node.js release should be listed prominently in the "Notable Changes" section +of the release notes. + ### Involving the CTC Collaborators may opt to elevate pull requests or issues to the CTC for @@ -291,7 +493,7 @@ You can find more information [in the full LTS plan](https://github.com/nodejs/l #### How does LTS work? -Once a stable branch enters LTS, changes in that branch are limited to bug +Once a Current branch enters LTS, changes in that branch are limited to bug fixes, security updates, possible npm updates, documentation updates, and certain performance improvements that can be demonstrated to not break existing applications. Semver-minor changes are only permitted if required for bug fixes @@ -299,7 +501,7 @@ and then only on a case-by-case basis with LTS WG and possibly Core Technical Committee (CTC) review. Semver-major changes are permitted only if required for security related fixes. -Once a stable branch moves into Maintenance mode, only **critical** bugs, +Once a Current branch moves into Maintenance mode, only **critical** bugs, **critical** security fixes, and documentation updates will be permitted. #### Landing semver-minor commits in LTS From 8d2a9138fc5f7a98ff3a2247df467a2ec945dd1c Mon Sep 17 00:00:00 2001 From: Gonen Dukas Date: Fri, 27 Jan 2017 01:02:10 +0200 Subject: [PATCH 008/121] test: improve error messages in test-npm-install PR-URL: https://github.com/nodejs/node/pull/11027 Reviewed-By: Rich Trott Reviewed-By: Gibson Fahnestock Reviewed-By: Colin Ihrig Reviewed-By: Luigi Pinca Reviewed-By: Jeremiah Senkpiel --- test/parallel/test-npm-install.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/parallel/test-npm-install.js b/test/parallel/test-npm-install.js index 00a3504fa925ae..5195dbc3ef9fbd 100644 --- a/test/parallel/test-npm-install.js +++ b/test/parallel/test-npm-install.js @@ -53,8 +53,8 @@ const proc = spawn(process.execPath, args, { }); function handleExit(code, signalCode) { - assert.strictEqual(code, 0, 'npm install should run without an error'); - assert.ok(signalCode === null, 'signalCode should be null'); + assert.strictEqual(code, 0, `npm install got error code ${code}`); + assert.strictEqual(signalCode, null, `unexpected signal: ${signalCode}`); assert.doesNotThrow(function() { fs.accessSync(installDir + '/node_modules/package-name'); }); From ea5bef5efe08d9056921c6bb2c17f1d9ce5918d4 Mon Sep 17 00:00:00 2001 From: Yuta Hiroto Date: Sun, 29 Jan 2017 12:45:17 +0900 Subject: [PATCH 009/121] test: add path.join's test Add test when the argument is empty. Adjust the position of the comment. Make use of Arrow Function, Template Literals and `Array.from`. PR-URL: https://github.com/nodejs/node/pull/11063 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Luigi Pinca --- test/parallel/test-path.js | 49 +++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/test/parallel/test-path.js b/test/parallel/test-path.js index b074e83c131a24..42a54b1707d0c2 100644 --- a/test/parallel/test-path.js +++ b/test/parallel/test-path.js @@ -59,8 +59,8 @@ assert.strictEqual(path.posix.basename('foo'), 'foo'); // POSIX filenames may include control characters // c.f. http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html -const controlCharFilename = 'Icon' + String.fromCharCode(13); -assert.strictEqual(path.posix.basename('/a/b/' + controlCharFilename), +const controlCharFilename = `Icon${String.fromCharCode(13)}`; +assert.strictEqual(path.posix.basename(`/a/b/${controlCharFilename}`), controlCharFilename); @@ -160,8 +160,8 @@ assert.strictEqual(path.win32.dirname('foo'), '.'); ['file//', ''], ['file./', '.'], ['file.//', '.'], -].forEach(function(test) { - [path.posix.extname, path.win32.extname].forEach(function(extname) { +].forEach((test) => { + [path.posix.extname, path.win32.extname].forEach((extname) => { let input = test[0]; let os; if (extname === path.win32.extname) { @@ -208,6 +208,7 @@ const joinTests = [ [ [path.posix.join, path.win32.join], // arguments result [[['.', 'x/b', '..', '/b/c.js'], 'x/b/c.js'], + [[], '.'], [['/.', 'x/b', '..', '/b/c.js'], '/x/b/c.js'], [['/foo', '../../../bar'], '/bar'], [['foo', '../../../bar'], '../../bar'], @@ -310,11 +311,11 @@ joinTests.push([ ] ) ]); -joinTests.forEach(function(test) { +joinTests.forEach((test) => { if (!Array.isArray(test[0])) test[0] = [test[0]]; - test[0].forEach(function(join) { - test[1].forEach(function(test) { + test[0].forEach((join) => { + test[1].forEach((test) => { const actual = join.apply(null, test[0]); const expected = test[1]; // For non-Windows specific tests with the Windows join(), we need to try @@ -333,7 +334,7 @@ joinTests.forEach(function(test) { '\n expect=' + JSON.stringify(expected) + '\n actual=' + JSON.stringify(actual); if (actual !== expected && actualAlt !== expected) - failures.push('\n' + message); + failures.push(`\n${message}`); }); }); }); @@ -344,15 +345,15 @@ assert.strictEqual(failures.length, 0, failures.join('')); const typeErrorTests = [true, false, 7, null, {}, undefined, [], NaN]; function fail(fn) { - const args = Array.prototype.slice.call(arguments, 1); + const args = Array.from(arguments).slice(1); - assert.throws(function() { + assert.throws(() => { fn.apply(null, args); }, TypeError); } -typeErrorTests.forEach(function(test) { - [path.posix, path.win32].forEach(function(namespace) { +typeErrorTests.forEach((test) => { + [path.posix, path.win32].forEach((namespace) => { fail(namespace.join, test); fail(namespace.resolve, test); fail(namespace.normalize, test); @@ -396,7 +397,7 @@ assert.strictEqual(path.posix.normalize('///..//./foo/.//bar'), '/foo/bar'); // path.resolve tests const resolveTests = [ [ path.win32.resolve, - // arguments result + // arguments result [[['c:/blah\\blah', 'd:/games', 'c:../a'], 'c:\\blah\\a'], [['c:/ignore', 'd:\\a/b\\c/d', '\\e.exe'], 'd:\\e.exe'], [['c:/ignore', 'c:/some/file'], 'c:\\some\\file'], @@ -413,7 +414,7 @@ const resolveTests = [ ] ], [ path.posix.resolve, - // arguments result + // arguments result [[['/var/lib', '../', 'file/'], '/var/file'], [['/var/lib', '/../', 'file/'], '/file'], [['a/b/c/', '../../..'], process.cwd()], @@ -423,9 +424,9 @@ const resolveTests = [ ] ] ]; -resolveTests.forEach(function(test) { +resolveTests.forEach((test) => { const resolve = test[0]; - test[1].forEach(function(test) { + test[1].forEach((test) => { const actual = resolve.apply(null, test[0]); let actualAlt; const os = resolve === path.win32.resolve ? 'win32' : 'posix'; @@ -514,7 +515,7 @@ const relativeTests = [ ] ], [ path.posix.relative, - // arguments result + // arguments result [['/var/lib', '/var', '..'], ['/var/lib', '/bin', '../../bin'], ['/var/lib', '/var/lib', ''], @@ -530,9 +531,9 @@ const relativeTests = [ ] ] ]; -relativeTests.forEach(function(test) { +relativeTests.forEach((test) => { const relative = test[0]; - test[1].forEach(function(test) { + test[1].forEach((test) => { const actual = relative(test[0], test[1]); const expected = test[2]; const os = relative === path.win32.relative ? 'win32' : 'posix'; @@ -543,7 +544,7 @@ relativeTests.forEach(function(test) { '\n expect=' + JSON.stringify(expected) + '\n actual=' + JSON.stringify(actual); if (actual !== expected) - failures.push('\n' + message); + failures.push(`\n${message}`); }); }); assert.strictEqual(failures.length, 0, failures.join('')); @@ -575,14 +576,14 @@ if (common.isWindows) { // These tests cause resolve() to insert the cwd, so we cannot test them from // non-Windows platforms (easily) assert.strictEqual(path.win32._makeLong('foo\\bar').toLowerCase(), - '\\\\?\\' + process.cwd().toLowerCase() + '\\foo\\bar'); + `\\\\?\\${process.cwd().toLowerCase()}\\foo\\bar`); assert.strictEqual(path.win32._makeLong('foo/bar').toLowerCase(), - '\\\\?\\' + process.cwd().toLowerCase() + '\\foo\\bar'); + `\\\\?\\${process.cwd().toLowerCase()}\\foo\\bar`); const currentDeviceLetter = path.parse(process.cwd()).root.substring(0, 2); assert.strictEqual(path.win32._makeLong(currentDeviceLetter).toLowerCase(), - '\\\\?\\' + process.cwd().toLowerCase()); + `\\\\?\\${process.cwd().toLowerCase()}`); assert.strictEqual(path.win32._makeLong('C').toLowerCase(), - '\\\\?\\' + process.cwd().toLowerCase() + '\\c'); + `\\\\?\\${process.cwd().toLowerCase()}\\c`); } assert.strictEqual(path.win32._makeLong('C:\\foo'), '\\\\?\\C:\\foo'); assert.strictEqual(path.win32._makeLong('C:/foo'), '\\\\?\\C:\\foo'); From e2d9c23e7228c91a3109a1e9fd0ad32b6fb4e08b Mon Sep 17 00:00:00 2001 From: Jackson Tian Date: Mon, 30 Jan 2017 16:57:49 +0800 Subject: [PATCH 010/121] test: use repeat() instead of new Array().join() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The usage of `new Array(length + 1).join(str)` is strange. Change to `str.repeat(length)` is more clearly. PR-URL: https://github.com/nodejs/node/pull/11071 Reviewed-By: Luigi Pinca Reviewed-By: Evan Lucas Reviewed-By: Colin Ihrig Reviewed-By: James M Snell Reviewed-By: Michaël Zasso Reviewed-By: Yuta Hiroto Reviewed-By: Italo A. Casas --- test/parallel/test-buffer-concat.js | 2 +- test/parallel/test-fs-long-path.js | 2 +- test/parallel/test-fs-readfile-pipe-large.js | 2 +- test/parallel/test-fs-readfilesync-pipe-large.js | 2 +- test/parallel/test-http-byteswritten.js | 2 +- test/parallel/test-http-pipeline-flood.js | 2 +- test/parallel/test-http-pipeline-regr-3332.js | 2 +- test/parallel/test-stream2-writable.js | 2 +- test/parallel/test-string-decoder-end.js | 2 +- test/pummel/test-tls-server-large-request.js | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/test/parallel/test-buffer-concat.js b/test/parallel/test-buffer-concat.js index 5d558835b7db83..ab47c5643b88fa 100644 --- a/test/parallel/test-buffer-concat.js +++ b/test/parallel/test-buffer-concat.js @@ -15,7 +15,7 @@ const flatLongLen = Buffer.concat(long, 40); assert.strictEqual(flatZero.length, 0); assert.strictEqual(flatOne.toString(), 'asdf'); -const check = new Array(10 + 1).join('asdf'); +const check = 'asdf'.repeat(10); // A special case where concat used to return the first item, // if the length is one. This check is to make sure that we don't do that. diff --git a/test/parallel/test-fs-long-path.js b/test/parallel/test-fs-long-path.js index 8d22159e24bd79..a85a1b5cb52fa1 100644 --- a/test/parallel/test-fs-long-path.js +++ b/test/parallel/test-fs-long-path.js @@ -11,7 +11,7 @@ if (!common.isWindows) { // make a path that will be at least 260 chars long. const fileNameLen = Math.max(260 - common.tmpDir.length - 1, 1); -const fileName = path.join(common.tmpDir, new Array(fileNameLen + 1).join('x')); +const fileName = path.join(common.tmpDir, 'x'.repeat(fileNameLen)); const fullPath = path.resolve(fileName); common.refreshTmpDir(); diff --git a/test/parallel/test-fs-readfile-pipe-large.js b/test/parallel/test-fs-readfile-pipe-large.js index 926cc318c4f63a..f0d1dd9c408610 100644 --- a/test/parallel/test-fs-readfile-pipe-large.js +++ b/test/parallel/test-fs-readfile-pipe-large.js @@ -21,7 +21,7 @@ if (process.argv[2] === 'child') { } const filename = path.join(common.tmpDir, '/readfile_pipe_large_test.txt'); -const dataExpected = new Array(1000000).join('a'); +const dataExpected = 'a'.repeat(999999); common.refreshTmpDir(); fs.writeFileSync(filename, dataExpected); diff --git a/test/parallel/test-fs-readfilesync-pipe-large.js b/test/parallel/test-fs-readfilesync-pipe-large.js index e791618b4999fe..01e41047774c9b 100644 --- a/test/parallel/test-fs-readfilesync-pipe-large.js +++ b/test/parallel/test-fs-readfilesync-pipe-large.js @@ -18,7 +18,7 @@ if (process.argv[2] === 'child') { } const filename = path.join(common.tmpDir, '/readfilesync_pipe_large_test.txt'); -const dataExpected = new Array(1000000).join('a'); +const dataExpected = 'a'.repeat(999999); common.refreshTmpDir(); fs.writeFileSync(filename, dataExpected); diff --git a/test/parallel/test-http-byteswritten.js b/test/parallel/test-http-byteswritten.js index 3b295ebdcc1c49..c92506e82717f4 100644 --- a/test/parallel/test-http-byteswritten.js +++ b/test/parallel/test-http-byteswritten.js @@ -16,7 +16,7 @@ const httpServer = http.createServer(common.mustCall(function(req, res) { // Write 1.5mb to cause some requests to buffer // Also, mix up the encodings a bit. - const chunk = new Array(1024 + 1).join('7'); + const chunk = '7'.repeat(1024); const bchunk = Buffer.from(chunk); for (let i = 0; i < 1024; i++) { res.write(chunk); diff --git a/test/parallel/test-http-pipeline-flood.js b/test/parallel/test-http-pipeline-flood.js index 99e4c3e7b5b9fe..8c14af7be9fb0a 100644 --- a/test/parallel/test-http-pipeline-flood.js +++ b/test/parallel/test-http-pipeline-flood.js @@ -70,7 +70,7 @@ function child() { let req = `GET / HTTP/1.1\r\nHost: localhost:${port}\r\nAccept: */*\r\n\r\n`; - req = new Array(10241).join(req); + req = req.repeat(10240); conn.on('connect', write); diff --git a/test/parallel/test-http-pipeline-regr-3332.js b/test/parallel/test-http-pipeline-regr-3332.js index b34ad499850b70..abac05c0bc0854 100644 --- a/test/parallel/test-http-pipeline-regr-3332.js +++ b/test/parallel/test-http-pipeline-regr-3332.js @@ -19,7 +19,7 @@ const server = http.createServer(function(req, res) { } }); }).listen(0, function() { - const req = new Array(COUNT + 1).join('GET / HTTP/1.1\r\n\r\n'); + const req = 'GET / HTTP/1.1\r\n\r\n'.repeat(COUNT); client = net.connect(this.address().port, function() { client.write(req); }); diff --git a/test/parallel/test-stream2-writable.js b/test/parallel/test-stream2-writable.js index c377ce9a510caa..0464ee96e2f795 100644 --- a/test/parallel/test-stream2-writable.js +++ b/test/parallel/test-stream2-writable.js @@ -24,7 +24,7 @@ TestWriter.prototype._write = function(chunk, encoding, cb) { const chunks = new Array(50); for (let i = 0; i < chunks.length; i++) { - chunks[i] = new Array(i + 1).join('x'); + chunks[i] = 'x'.repeat(i); } // tiny node-tap lookalike. diff --git a/test/parallel/test-string-decoder-end.js b/test/parallel/test-string-decoder-end.js index 6e9eea3193e163..399f78099268d3 100644 --- a/test/parallel/test-string-decoder-end.js +++ b/test/parallel/test-string-decoder-end.js @@ -12,7 +12,7 @@ const bufs = [ '☃💩', 'asdf' ].map((b) => Buffer.from(b)); // also test just arbitrary bytes from 0-15. for (let i = 1; i <= 16; i++) { - const bytes = new Array(i).join('.').split('.').map((_, j) => j + 0x78); + const bytes = '.'.repeat(i - 1).split('.').map((_, j) => j + 0x78); bufs.push(Buffer.from(bytes)); } diff --git a/test/pummel/test-tls-server-large-request.js b/test/pummel/test-tls-server-large-request.js index 41393120fcd1e2..36fb566fab15d2 100644 --- a/test/pummel/test-tls-server-large-request.js +++ b/test/pummel/test-tls-server-large-request.js @@ -12,7 +12,7 @@ const fs = require('fs'); const stream = require('stream'); const util = require('util'); -const request = Buffer.from(new Array(1024 * 256).join('ABCD')); // 1mb +const request = Buffer.from('ABCD'.repeat(1024 * 256 - 1)); // 1mb const options = { key: fs.readFileSync(common.fixturesDir + '/keys/agent1-key.pem'), From 3d35dcff9a9e4b1d429770bae833c9df1ff15000 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Tue, 31 Jan 2017 09:47:43 -0800 Subject: [PATCH 011/121] test: make test-fs-access stricter Change regular expression matching in `assert.throws()` to match the entire error message. In `assert.throws()` that uses a function for matching rather than a regular expression, add checks for the `message` property and the error's constructor. Also, refactored to remove unnecessary temp file handling. No need to remove temp files after the test. Each test is responsible for clearing the temp directory if it needs to use it. PR-URL: https://github.com/nodejs/node/pull/11087 Reviewed-By: James M Snell Reviewed-By: Adrian Estrada Reviewed-By: Colin Ihrig Reviewed-By: Daniel Bevenius Reviewed-By: Luigi Pinca Reviewed-By: Yuta Hiroto --- test/parallel/test-fs-access.js | 40 ++++++++++++++------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/test/parallel/test-fs-access.js b/test/parallel/test-fs-access.js index 4157f92f8b9021..34077ce1ffe132 100644 --- a/test/parallel/test-fs-access.js +++ b/test/parallel/test-fs-access.js @@ -7,16 +7,7 @@ const doesNotExist = path.join(common.tmpDir, '__this_should_not_exist'); const readOnlyFile = path.join(common.tmpDir, 'read_only_file'); const readWriteFile = path.join(common.tmpDir, 'read_write_file'); -const removeFile = function(file) { - try { - fs.unlinkSync(file); - } catch (err) { - // Ignore error - } -}; - const createFileWithPerms = function(file, mode) { - removeFile(file); fs.writeFileSync(file, ''); fs.chmodSync(file, mode); }; @@ -91,16 +82,16 @@ fs.access(readOnlyFile, fs.W_OK, common.mustCall((err) => { })); assert.throws(() => { - fs.access(100, fs.F_OK, (err) => {}); -}, /path must be a string or Buffer/); + fs.access(100, fs.F_OK, () => { common.fail('callback should not run'); }); +}, /^TypeError: path must be a string or Buffer$/); assert.throws(() => { fs.access(__filename, fs.F_OK); -}, /"callback" argument must be a function/); +}, /^TypeError: "callback" argument must be a function$/); assert.throws(() => { fs.access(__filename, fs.F_OK, {}); -}, /"callback" argument must be a function/); +}, /^TypeError: "callback" argument must be a function$/); assert.doesNotThrow(() => { fs.accessSync(__filename); @@ -112,13 +103,16 @@ assert.doesNotThrow(() => { fs.accessSync(readWriteFile, mode); }); -assert.throws(() => { - fs.accessSync(doesNotExist); -}, (err) => { - return err.code === 'ENOENT' && err.path === doesNotExist; -}); - -process.on('exit', () => { - removeFile(readOnlyFile); - removeFile(readWriteFile); -}); +assert.throws( + () => { fs.accessSync(doesNotExist); }, + (err) => { + assert.strictEqual(err.code, 'ENOENT'); + assert.strictEqual(err.path, doesNotExist); + assert.strictEqual( + err.message, + `ENOENT: no such file or directory, access '${doesNotExist}'` + ); + assert.strictEqual(err.constructor, Error); + return true; + } +); From 3ae25a0bcae1090b76e3068772a2705ec89ee790 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Tue, 31 Jan 2017 10:57:08 -0800 Subject: [PATCH 012/121] doc: add personal pronouns option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/11089 Reviewed-By: Myles Borins Reviewed-By: James M Snell Reviewed-By: Anna Henningsen Reviewed-By: Gibson Fahnestock Reviewed-By: Michaël Zasso Reviewed-By: Evan Lucas Reviewed-By: Luigi Pinca --- README.md | 50 +++++++++++++++++++++++------------------------ doc/onboarding.md | 1 + 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 0ff8e13791a96a..00e77b04fcf152 100644 --- a/README.md +++ b/README.md @@ -155,58 +155,58 @@ more information about the governance of the Node.js project, see ### CTC (Core Technical Committee) * [addaleax](https://github.com/addaleax) - -**Anna Henningsen** <anna@addaleax.net> +**Anna Henningsen** <anna@addaleax.net> (she/her) * [bnoordhuis](https://github.com/bnoordhuis) - **Ben Noordhuis** <info@bnoordhuis.nl> * [ChALkeR](https://github.com/ChALkeR) - -**Сковорода Никита Андреевич** <chalkerx@gmail.com> +**Сковорода Никита Андреевич** <chalkerx@gmail.com> (he/him) * [chrisdickinson](https://github.com/chrisdickinson) - **Chris Dickinson** <christopher.s.dickinson@gmail.com> * [cjihrig](https://github.com/cjihrig) - **Colin Ihrig** <cjihrig@gmail.com> * [evanlucas](https://github.com/evanlucas) - -**Evan Lucas** <evanlucas@me.com> +**Evan Lucas** <evanlucas@me.com> (he/him) * [fishrock123](https://github.com/fishrock123) - **Jeremiah Senkpiel** <fishrock123@rocketmail.com> * [indutny](https://github.com/indutny) - **Fedor Indutny** <fedor.indutny@gmail.com> * [jasnell](https://github.com/jasnell) - -**James M Snell** <jasnell@gmail.com> +**James M Snell** <jasnell@gmail.com> (he/him) * [mhdawson](https://github.com/mhdawson) - -**Michael Dawson** <michael_dawson@ca.ibm.com> +**Michael Dawson** <michael_dawson@ca.ibm.com> (he/him) * [misterdjules](https://github.com/misterdjules) - **Julien Gilli** <jgilli@nodejs.org> * [mscdex](https://github.com/mscdex) - **Brian White** <mscdex@mscdex.net> * [MylesBorins](https://github.com/MylesBorins) - -**Myles Borins** <myles.borins@gmail.com> +**Myles Borins** <myles.borins@gmail.com> (he/him) * [ofrobots](https://github.com/ofrobots) - **Ali Ijaz Sheikh** <ofrobots@google.com> * [rvagg](https://github.com/rvagg) - **Rod Vagg** <rod@vagg.org> * [shigeki](https://github.com/shigeki) - -**Shigeki Ohtsu** <ohtsu@iij.ad.jp> +**Shigeki Ohtsu** <ohtsu@iij.ad.jp> (he/him) * [targos](https://github.com/targos) - -**Michaël Zasso** <targos@protonmail.com> +**Michaël Zasso** <targos@protonmail.com> (he/him) * [thefourtheye](https://github.com/thefourtheye) - -**Sakthipriyan Vairamani** <thechargingvolcano@gmail.com> +**Sakthipriyan Vairamani** <thechargingvolcano@gmail.com> (he/him) * [trevnorris](https://github.com/trevnorris) - **Trevor Norris** <trev.norris@gmail.com> * [Trott](https://github.com/Trott) - -**Rich Trott** <rtrott@gmail.com> +**Rich Trott** <rtrott@gmail.com> (he/him) ### Collaborators * [abouthiroppy](https://github.com/abouthiroppy) - -**Yuta Hiroto** <hello@about-hiroppy.com> +**Yuta Hiroto** <hello@about-hiroppy.com> (he/him) * [ak239](https://github.com/ak239) - **Aleksei Koziatinskii** <ak239spb@gmail.com> * [andrasq](https://github.com/andrasq) - **Andras** <andras@kinvey.com> * [AndreasMadsen](https://github.com/AndreasMadsen) - -**Andreas Madsen** <amwebdk@gmail.com> +**Andreas Madsen** <amwebdk@gmail.com> (he/him) * [bengl](https://github.com/bengl) - -**Bryan English** <bryan@bryanenglish.com> +**Bryan English** <bryan@bryanenglish.com> (he/him) * [benjamingr](https://github.com/benjamingr) - **Benjamin Gruenbaum** <benjamingr@gmail.com> * [bmeck](https://github.com/bmeck) - @@ -222,7 +222,7 @@ more information about the governance of the Node.js project, see * [danbev](https://github.com/danbev) - **Daniel Bevenius** <daniel.bevenius@gmail.com> * [edsadr](https://github.com/edsadr) - -**Adrian Estrada** <edsadr@gmail.com> +**Adrian Estrada** <edsadr@gmail.com> (he/him) * [eljefedelrodeodeljefe](https://github.com/eljefedelrodeodeljefe) - **Robert Jefe Lindstaedt** <robert.lindstaedt@gmail.com> * [estliberitas](https://github.com/estliberitas) - @@ -236,7 +236,7 @@ more information about the governance of the Node.js project, see * [geek](https://github.com/geek) - **Wyatt Preul** <wpreul@gmail.com> * [gibfahn](https://github.com/gibfahn) - -**Gibson Fahnestock** <gibfahn@gmail.com> +**Gibson Fahnestock** <gibfahn@gmail.com> (he/him) * [iarna](https://github.com/iarna) - **Rebecca Turner** <me@re-becca.org> * [imyller](https://github.com/imyller) - @@ -244,7 +244,7 @@ more information about the governance of the Node.js project, see * [isaacs](https://github.com/isaacs) - **Isaac Z. Schlueter** <i@izs.me> * [italoacasas](https://github.com/italoacasas) - -**Italo A. Casas** <me@italoacasas.com> +**Italo A. Casas** <me@italoacasas.com> (he/him) * [iWuzHere](https://github.com/iWuzHere) - **Imran Iqbal** <imran@imraniqbal.org> * [JacksonTian](https://github.com/JacksonTian) - @@ -258,23 +258,23 @@ more information about the governance of the Node.js project, see * [joshgav](https://github.com/joshgav) - **Josh Gavant** <josh.gavant@outlook.com> * [joyeecheung](https://github.com/joyeecheung) - -**Joyee Cheung** <joyeec9h3@gmail.com> +**Joyee Cheung** <joyeec9h3@gmail.com> (she/her) * [julianduque](https://github.com/julianduque) - -**Julian Duque** <julianduquej@gmail.com> +**Julian Duque** <julianduquej@gmail.com> (he/him) * [JungMinu](https://github.com/JungMinu) - **Minwoo Jung** <jmwsoft@gmail.com> * [lance](https://github.com/lance) - **Lance Ball** <lball@redhat.com> * [lpinca](https://github.com/lpinca) - -**Luigi Pinca** <luigipinca@gmail.com> +**Luigi Pinca** <luigipinca@gmail.com> (he/him) * [lxe](https://github.com/lxe) - **Aleksey Smolenchuk** <lxe@lxe.co> * [matthewloring](https://github.com/matthewloring) - **Matthew Loring** <mattloring@google.com> * [mcollina](https://github.com/mcollina) - -**Matteo Collina** <matteo.collina@gmail.com> +**Matteo Collina** <matteo.collina@gmail.com> (he/him) * [micnic](https://github.com/micnic) - -**Nicu Micleușanu** <micnic90@gmail.com> +**Nicu Micleușanu** <micnic90@gmail.com> (he/him) * [mikeal](https://github.com/mikeal) - **Mikeal Rogers** <mikeal.rogers@gmail.com> * [monsanto](https://github.com/monsanto) - @@ -286,7 +286,7 @@ more information about the governance of the Node.js project, see * [orangemocha](https://github.com/orangemocha) - **Alexis Campailla** <orangemocha@nodejs.org> * [othiym23](https://github.com/othiym23) - -**Forrest L Norvell** <ogd@aoaioxxysz.net> +**Forrest L Norvell** <ogd@aoaioxxysz.net> (he/him) * [petkaantonov](https://github.com/petkaantonov) - **Petka Antonov** <petka_antonov@hotmail.com> * [phillipj](https://github.com/phillipj) - @@ -298,7 +298,7 @@ more information about the governance of the Node.js project, see * [princejwesley](https://github.com/princejwesley) - **Prince John Wesley** <princejohnwesley@gmail.com> * [qard](https://github.com/qard) - -**Stephen Belanger** <admin@stephenbelanger.com> +**Stephen Belanger** <admin@stephenbelanger.com> (he/him) * [rlidwka](https://github.com/rlidwka) - **Alex Kocharin** <alex@kocharin.ru> * [rmg](https://github.com/rmg) - @@ -328,11 +328,11 @@ more information about the governance of the Node.js project, see * [tellnes](https://github.com/tellnes) - **Christian Tellnes** <christian@tellnes.no> * [thekemkid](https://github.com/thekemkid) - -**Glen Keane** <glenkeane.94@gmail.com> +**Glen Keane** <glenkeane.94@gmail.com> (he/him) * [thlorenz](https://github.com/thlorenz) - **Thorsten Lorenz** <thlorenz@gmx.de> * [TimothyGu](https://github.com/TimothyGu) - -**Timothy Gu** <timothygu99@gmail.com> +**Timothy Gu** <timothygu99@gmail.com> (he/him) * [tunniclm](https://github.com/tunniclm) - **Mike Tunnicliffe** <m.j.tunnicliffe@gmail.com> * [vkurchatkin](https://github.com/vkurchatkin) - diff --git a/doc/onboarding.md b/doc/onboarding.md index 14e4572890dbbe..4fd207637b90ec 100644 --- a/doc/onboarding.md +++ b/doc/onboarding.md @@ -139,6 +139,7 @@ onboarding session. * Example: [https://github.com/nodejs/node/commit/7b09aade8468e1c930f36b9c81e6ac2ed5bc8732](https://github.com/nodejs/node/commit/7b09aade8468e1c930f36b9c81e6ac2ed5bc8732) * For raw commit message: `git log 7b09aade8468e1c930f36b9c81e6ac2ed5bc8732 -1` * Collaborators are in alphabetical order by GitHub username. + * Optionally, include your personal pronouns. * Label your pull request with the `doc` subsystem label. * Run CI on your PR. * After a `LGTM` or two, land the PR. From 9264131fb3f3efa23d3e2e5cf0836698e568accc Mon Sep 17 00:00:00 2001 From: Roee Kasher Date: Thu, 26 Jan 2017 13:58:51 +0200 Subject: [PATCH 013/121] src: unconsume stream fix in internal http impl When emitting a 'connection' event on a httpServer, the function connectionListener is called. Then, a new parser is created, and 'consume' method is called on the socket's externalStream. However, if this stream was already consumed and unconsumed, the process crashes with a cpp assert from the 'Consume' method in stream_base.h. This commit makes sure that no SIGABRT will be raised and the process will stay alive (after emitting the socket). PR-URL: https://github.com/nodejs/node/pull/11015 Reviewed-By: Fedor Indutny Reviewed-By: James M Snell --- lib/_http_server.js | 4 +++- .../test-http-server-unconsume-consume.js | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-http-server-unconsume-consume.js diff --git a/lib/_http_server.js b/lib/_http_server.js index bd726f83e3e638..1d1d7ba7c6912b 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -322,9 +322,11 @@ function connectionListener(socket) { // Override on to unconsume on `data`, `readable` listeners socket.on = socketOnWrap; + // We only consume the socket if it has never been consumed before. var external = socket._handle._externalStream; - if (external) { + if (!socket._handle._consumed && external) { parser._consumed = true; + socket._handle._consumed = true; parser.consume(external); } parser[kOnExecute] = diff --git a/test/parallel/test-http-server-unconsume-consume.js b/test/parallel/test-http-server-unconsume-consume.js new file mode 100644 index 00000000000000..77baff19fe83d8 --- /dev/null +++ b/test/parallel/test-http-server-unconsume-consume.js @@ -0,0 +1,22 @@ +'use strict'; +const common = require('../common'); +const http = require('http'); + +const testServer = http.createServer((req, res) => { + common.fail('Should not be called'); + res.end(); +}); +testServer.on('connect', common.mustCall((req, socket, head) => { + socket.write('HTTP/1.1 200 Connection Established' + '\r\n' + + 'Proxy-agent: Node-Proxy' + '\r\n' + + '\r\n'); + // This shouldn't raise an assertion in StreamBase::Consume. + testServer.emit('connection', socket); + testServer.close(); +})); +testServer.listen(0, common.mustCall(() => { + http.request({ + port: testServer.address().port, + method: 'CONNECT' + }, (res) => {}).end(); +})); From cf3700b0e8e990eb06bb5a6209587e049b012468 Mon Sep 17 00:00:00 2001 From: Ali Ijaz Sheikh Date: Wed, 25 Jan 2017 16:26:23 -0800 Subject: [PATCH 014/121] test: fix timing sensitivity in debugger test test-debugger-util-regression.js was sensitive to timing, which seems to have changed enough with V8 5.7 to cause this test to fail. Fix the test to ensure we take debugger steps only at stable states instead of erroneously taking a step on a partially complete buffer. PR-URL: https://github.com/nodejs/node/pull/11008 Reviewed-By: Anna Henningsen Reviewed-By: Ben Noordhuis Reviewed-By: Colin Ihrig Reviewed-By: James M Snell --- test/parallel/test-debugger-util-regression.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/test/parallel/test-debugger-util-regression.js b/test/parallel/test-debugger-util-regression.js index 07e52545814b14..fa5b9e8b0a0e06 100644 --- a/test/parallel/test-debugger-util-regression.js +++ b/test/parallel/test-debugger-util-regression.js @@ -4,6 +4,8 @@ const path = require('path'); const spawn = require('child_process').spawn; const assert = require('assert'); +const DELAY = common.platformTimeout(200); + const fixture = path.join( common.fixturesDir, 'debugger-util-regression-fixture.js' @@ -21,12 +23,16 @@ proc.stderr.setEncoding('utf8'); let stdout = ''; let stderr = ''; +proc.stdout.on('data', (data) => stdout += data); +proc.stderr.on('data', (data) => stderr += data); let nextCount = 0; let exit = false; -proc.stdout.on('data', (data) => { - stdout += data; +// We look at output periodically. We don't do this in the on('data') as we +// may end up processing partial output. Processing periodically ensures that +// the debugger is in a stable state before we take the next step. +const timer = setInterval(() => { if (stdout.includes('> 1') && nextCount < 1 || stdout.includes('> 2') && nextCount < 2 || stdout.includes('> 3') && nextCount < 3 || @@ -36,14 +42,14 @@ proc.stdout.on('data', (data) => { } else if (!exit && (stdout.includes('< { a: \'b\' }'))) { exit = true; proc.stdin.write('.exit\n'); + // We can cancel the timer and terminate normally. + clearInterval(timer); } else if (stdout.includes('program terminated')) { // Catch edge case present in v4.x // process will terminate after call to util.inspect common.fail('the program should not terminate'); } -}); - -proc.stderr.on('data', (data) => stderr += data); +}, DELAY); process.on('exit', (code) => { assert.strictEqual(code, 0, 'the program should exit cleanly'); From 92ed2b50013c027336b5b5a5b411e0b6e025226c Mon Sep 17 00:00:00 2001 From: nanxiongchao Date: Wed, 25 Jan 2017 16:16:13 +0800 Subject: [PATCH 015/121] build: support for mips64el Built and tested successfully on Loongson 3A2000 with Fedora25(mips64el distribution). PR-URL: https://github.com/nodejs/node/pull/10991 Reviewed-By: Ben Noordhuis Reviewed-By: James M Snell --- configure | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/configure b/configure index e12a5382a1960f..9cadfffbd060f1 100755 --- a/configure +++ b/configure @@ -711,6 +711,9 @@ def host_arch_cc(): if rtn != 's390': break + if rtn == 'mipsel' and '_LP64' in k: + rtn = 'mips64el' + return rtn @@ -792,7 +795,7 @@ def configure_node(o): if target_arch == 'arm': configure_arm(o) - elif target_arch in ('mips', 'mipsel'): + elif target_arch in ('mips', 'mipsel', 'mips64el'): configure_mips(o) if flavor == 'aix': From 322fc203336284be12a925023c408fa9f4ed0a15 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Tue, 17 Jan 2017 09:07:18 -0800 Subject: [PATCH 016/121] url: extend url.format to support WHATWG URL Removes the non-standard options on WHATWG URL toString and extends the existing url.format() API to support customizable serialization of the WHATWG URL object. This does not yet include the documentation updates because the documentation for the new WHATWG URL object has not yet landed. Example: ```js const url = require('url'); const URL = url.URL; const myURL = new URL('http://example.org/?a=b#c'); const str = url.format(myURL, {fragment: false, search: false}); console.log(str); // Prints: http://example.org/ ``` PR-URL: https://github.com/nodejs/node/pull/10857 Reviewed-By: Joyee Cheung Reviewed-By: Anna Henningsen Reviewed-By: Timothy Gu Reviewed-By: Brian White --- lib/internal/url.js | 60 +++++++------- lib/url.js | 17 ++-- test/parallel/test-url-format-whatwg.js | 102 ++++++++++++++++++++++++ 3 files changed, 142 insertions(+), 37 deletions(-) create mode 100644 test/parallel/test-url-format-whatwg.js diff --git a/lib/internal/url.js b/lib/internal/url.js index 113746a24d5edc..b5ef83ae451eaf 100644 --- a/lib/internal/url.js +++ b/lib/internal/url.js @@ -1,13 +1,5 @@ 'use strict'; -function getPunycode() { - try { - return process.binding('icu'); - } catch (err) { - return require('punycode'); - } -} -const punycode = getPunycode(); const util = require('util'); const binding = process.binding('url'); const context = Symbol('context'); @@ -20,6 +12,7 @@ const kScheme = Symbol('scheme'); const kHost = Symbol('host'); const kPort = Symbol('port'); const kDomain = Symbol('domain'); +const kFormat = Symbol('format'); // https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object const IteratorPrototype = Object.getPrototypeOf( @@ -263,18 +256,19 @@ class URL { } Object.defineProperties(URL.prototype, { - toString: { - // https://heycam.github.io/webidl/#es-stringifier - writable: true, - enumerable: true, - configurable: true, + [kFormat]: { + enumerable: false, + configurable: false, // eslint-disable-next-line func-name-matching - value: function toString(options) { - options = options || {}; - const fragment = - options.fragment !== undefined ? - !!options.fragment : true; - const unicode = !!options.unicode; + value: function format(options) { + if (options && typeof options !== 'object') + throw new TypeError('options must be an object'); + options = Object.assign({ + fragment: true, + unicode: false, + search: true, + auth: true + }, options); const ctx = this[context]; var ret; if (this.protocol) @@ -284,28 +278,23 @@ Object.defineProperties(URL.prototype, { const has_username = typeof ctx.username === 'string'; const has_password = typeof ctx.password === 'string' && ctx.password !== ''; - if (has_username || has_password) { + if (options.auth && (has_username || has_password)) { if (has_username) ret += ctx.username; if (has_password) ret += `:${ctx.password}`; ret += '@'; } - if (unicode) { - ret += punycode.toUnicode(this.hostname); - if (this.port !== undefined) - ret += `:${this.port}`; - } else { - ret += this.host; - } + ret += options.unicode ? + domainToUnicode(this.host) : this.host; } else if (ctx.scheme === 'file:') { ret += '//'; } if (this.pathname) ret += this.pathname; - if (typeof ctx.query === 'string') + if (options.search && typeof ctx.query === 'string') ret += `?${ctx.query}`; - if (fragment & typeof ctx.fragment === 'string') + if (options.fragment && typeof ctx.fragment === 'string') ret += `#${ctx.fragment}`; return ret; } @@ -314,11 +303,21 @@ Object.defineProperties(URL.prototype, { 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.toString(); + return this[kFormat]({}); }, set(input) { parse(this, input); @@ -1078,3 +1077,4 @@ exports.domainToASCII = domainToASCII; exports.domainToUnicode = domainToUnicode; exports.encodeAuth = encodeAuth; exports.urlToOptions = urlToOptions; +exports.formatSymbol = kFormat; diff --git a/lib/url.js b/lib/url.js index 2f05cc6648ab48..9164d5991b7a67 100644 --- a/lib/url.js +++ b/lib/url.js @@ -549,19 +549,22 @@ function autoEscapeStr(rest) { } // format a parsed object into a url string -function urlFormat(obj) { +function urlFormat(obj, options) { // ensure it's an object, and not a string url. // If it's an obj, this is a no-op. // this way, you can call url_format() on strings // to clean up potentially wonky urls. - if (typeof obj === 'string') obj = urlParse(obj); - - else if (typeof obj !== 'object' || obj === null) + if (typeof obj === 'string') { + obj = urlParse(obj); + } else if (typeof obj !== 'object' || obj === null) { throw new TypeError('Parameter "urlObj" must be an object, not ' + obj === null ? 'null' : typeof obj); - - else if (!(obj instanceof Url)) return Url.prototype.format.call(obj); - + } else if (!(obj instanceof Url)) { + var format = obj[internalUrl.formatSymbol]; + return format ? + format.call(obj, options) : + Url.prototype.format.call(obj); + } return obj.format(); } diff --git a/test/parallel/test-url-format-whatwg.js b/test/parallel/test-url-format-whatwg.js new file mode 100644 index 00000000000000..507d3f8419d73e --- /dev/null +++ b/test/parallel/test-url-format-whatwg.js @@ -0,0 +1,102 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const url = require('url'); +const URL = url.URL; + +const myURL = new URL('http://xn--lck1c3crb1723bpq4a.com/a?a=b#c'); + +assert.strictEqual( + url.format(myURL), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' +); + +assert.strictEqual( + url.format(myURL, {}), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' +); + +const errreg = /^TypeError: options must be an object$/; +assert.throws(() => url.format(myURL, true), errreg); +assert.throws(() => url.format(myURL, 1), errreg); +assert.throws(() => url.format(myURL, 'test'), errreg); +assert.throws(() => url.format(myURL, Infinity), errreg); + +// Any falsy value other than undefined will be treated as false. +// Any truthy value will be treated as true. + +assert.strictEqual( + url.format(myURL, {fragment: false}), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b' +); + +assert.strictEqual( + url.format(myURL, {fragment: ''}), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b' +); + +assert.strictEqual( + url.format(myURL, {fragment: 0}), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b' +); + +assert.strictEqual( + url.format(myURL, {fragment: 1}), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' +); + +assert.strictEqual( + url.format(myURL, {fragment: {}}), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' +); + +assert.strictEqual( + url.format(myURL, {search: false}), + 'http://xn--lck1c3crb1723bpq4a.com/a#c' +); + +assert.strictEqual( + url.format(myURL, {search: ''}), + 'http://xn--lck1c3crb1723bpq4a.com/a#c' +); + +assert.strictEqual( + url.format(myURL, {search: 0}), + 'http://xn--lck1c3crb1723bpq4a.com/a#c' +); + +assert.strictEqual( + url.format(myURL, {search: 1}), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' +); + +assert.strictEqual( + url.format(myURL, {search: {}}), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' +); + +assert.strictEqual( + url.format(myURL, {unicode: true}), + 'http://理容ナカムラ.com/a?a=b#c' +); + +assert.strictEqual( + url.format(myURL, {unicode: 1}), + 'http://理容ナカムラ.com/a?a=b#c' +); + +assert.strictEqual( + url.format(myURL, {unicode: {}}), + 'http://理容ナカムラ.com/a?a=b#c' +); + +assert.strictEqual( + url.format(myURL, {unicode: false}), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' +); + +assert.strictEqual( + url.format(myURL, {unicode: 0}), + 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' +); From 5e98e34648e2e1924fb0b5de0ef811a790dc8f50 Mon Sep 17 00:00:00 2001 From: Shigeki Ohtsu Date: Fri, 4 Nov 2016 18:19:20 +0900 Subject: [PATCH 017/121] crypto: add cert check issued by StartCom/WoSign When tls client connects to the server with certification issued by either StartCom or WoSign listed in StartComAndWoSignData.inc, check notBefore of the server certificate and CERT_REVOKED error returns if it is after 00:00:00 on October 21, 2016. See for details in https://blog.mozilla.org/security/2016/10/24/distrusting-new-wosign-and-startcom-certificates/, https://security.googleblog.com/2016/10/distrusting-wosign-and-startcom.html and https://support.apple.com/en-us/HT204132 Fixes: https://github.com/nodejs/node/issues/9434 PR-URL: https://github.com/nodejs/node/pull/9469 Reviewed-By: James M Snell Reviewed-By: Fedor Indutny Reviewed-By: Ben Noordhuis --- src/StartComAndWoSignData.inc | 89 ++++++++++++++++++ src/node_crypto.cc | 44 ++++++++- test/fixtures/keys/Makefile | 68 ++++++++++++++ test/fixtures/keys/agent8-cert.pem | 20 ++++ test/fixtures/keys/agent8-csr.pem | 17 ++++ test/fixtures/keys/agent8-key.pem | 27 ++++++ test/fixtures/keys/agent8.cnf | 17 ++++ test/fixtures/keys/agent9-cert.pem | 20 ++++ test/fixtures/keys/agent9-csr.pem | 17 ++++ test/fixtures/keys/agent9-key.pem | 27 ++++++ test/fixtures/keys/agent9.cnf | 17 ++++ .../fixtures/keys/fake-startcom-root-cert.pem | 22 +++++ test/fixtures/keys/fake-startcom-root-csr.pem | 18 ++++ .../keys/fake-startcom-root-database.txt | 2 + .../keys/fake-startcom-root-database.txt.attr | 1 + .../fake-startcom-root-database.txt.attr.old | 1 + .../keys/fake-startcom-root-database.txt.old | 1 + .../fake-startcom-root-issued-certs/01.pem | 20 ++++ .../fake-startcom-root-issued-certs/02.pem | 20 ++++ test/fixtures/keys/fake-startcom-root-key.pem | 27 ++++++ test/fixtures/keys/fake-startcom-root-serial | 1 + .../keys/fake-startcom-root-serial.old | 1 + test/fixtures/keys/fake-startcom-root.cnf | 46 ++++++++++ .../test-tls-startcom-wosign-whitelist.js | 91 +++++++++++++++++++ 24 files changed, 611 insertions(+), 3 deletions(-) create mode 100644 src/StartComAndWoSignData.inc create mode 100644 test/fixtures/keys/agent8-cert.pem create mode 100644 test/fixtures/keys/agent8-csr.pem create mode 100644 test/fixtures/keys/agent8-key.pem create mode 100644 test/fixtures/keys/agent8.cnf create mode 100644 test/fixtures/keys/agent9-cert.pem create mode 100644 test/fixtures/keys/agent9-csr.pem create mode 100644 test/fixtures/keys/agent9-key.pem create mode 100644 test/fixtures/keys/agent9.cnf create mode 100644 test/fixtures/keys/fake-startcom-root-cert.pem create mode 100644 test/fixtures/keys/fake-startcom-root-csr.pem create mode 100644 test/fixtures/keys/fake-startcom-root-database.txt create mode 100644 test/fixtures/keys/fake-startcom-root-database.txt.attr create mode 100644 test/fixtures/keys/fake-startcom-root-database.txt.attr.old create mode 100644 test/fixtures/keys/fake-startcom-root-database.txt.old create mode 100644 test/fixtures/keys/fake-startcom-root-issued-certs/01.pem create mode 100644 test/fixtures/keys/fake-startcom-root-issued-certs/02.pem create mode 100644 test/fixtures/keys/fake-startcom-root-key.pem create mode 100644 test/fixtures/keys/fake-startcom-root-serial create mode 100644 test/fixtures/keys/fake-startcom-root-serial.old create mode 100644 test/fixtures/keys/fake-startcom-root.cnf create mode 100644 test/parallel/test-tls-startcom-wosign-whitelist.js diff --git a/src/StartComAndWoSignData.inc b/src/StartComAndWoSignData.inc new file mode 100644 index 00000000000000..3ba643397c7ff9 --- /dev/null +++ b/src/StartComAndWoSignData.inc @@ -0,0 +1,89 @@ +// /C=CN/O=WoSign CA Limited/CN=CA \xE6\xB2\x83\xE9\x80\x9A\xE6\xA0\xB9\xE8\xAF\x81\xE4\xB9\xA6 +// Using a consistent naming convention, this would actually be called +// 'CA沃通根证书DN', but since GCC 6.2.1 apparently can't handle UTF-8 +// identifiers, this will have to do. +static const uint8_t CAWoSignRootDN[72] = { + 0x30, 0x46, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x43, 0x4E, 0x31, 0x1A, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x11, + 0x57, 0x6F, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x43, 0x41, 0x20, 0x4C, 0x69, 0x6D, + 0x69, 0x74, 0x65, 0x64, 0x31, 0x1B, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0C, 0x12, 0x43, 0x41, 0x20, 0xE6, 0xB2, 0x83, 0xE9, 0x80, 0x9A, 0xE6, 0xA0, + 0xB9, 0xE8, 0xAF, 0x81, 0xE4, 0xB9, 0xA6, +}; + +// /C=CN/O=WoSign CA Limited/CN=CA WoSign ECC Root +static const uint8_t CAWoSignECCRootDN[72] = { + 0x30, 0x46, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x43, 0x4E, 0x31, 0x1A, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x11, + 0x57, 0x6F, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x43, 0x41, 0x20, 0x4C, 0x69, 0x6D, + 0x69, 0x74, 0x65, 0x64, 0x31, 0x1B, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x12, 0x43, 0x41, 0x20, 0x57, 0x6F, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x45, + 0x43, 0x43, 0x20, 0x52, 0x6F, 0x6F, 0x74, +}; + +// /C=CN/O=WoSign CA Limited/CN=Certification Authority of WoSign +static const uint8_t CertificationAuthorityofWoSignDN[87] = { + 0x30, 0x55, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x43, 0x4E, 0x31, 0x1A, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x11, + 0x57, 0x6F, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x43, 0x41, 0x20, 0x4C, 0x69, 0x6D, + 0x69, 0x74, 0x65, 0x64, 0x31, 0x2A, 0x30, 0x28, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x21, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, + 0x6F, 0x66, 0x20, 0x57, 0x6F, 0x53, 0x69, 0x67, 0x6E, +}; + +// /C=CN/O=WoSign CA Limited/CN=Certification Authority of WoSign G2 +static const uint8_t CertificationAuthorityofWoSignG2DN[90] = { + 0x30, 0x58, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x43, 0x4E, 0x31, 0x1A, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x11, + 0x57, 0x6F, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x43, 0x41, 0x20, 0x4C, 0x69, 0x6D, + 0x69, 0x74, 0x65, 0x64, 0x31, 0x2D, 0x30, 0x2B, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x24, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, 0x20, + 0x6F, 0x66, 0x20, 0x57, 0x6F, 0x53, 0x69, 0x67, 0x6E, 0x20, 0x47, 0x32, +}; + +// /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Certification Authority +static const uint8_t StartComCertificationAuthorityDN[127] = { + 0x30, 0x7D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x49, 0x4C, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0D, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6F, 0x6D, 0x20, 0x4C, 0x74, 0x64, 0x2E, + 0x31, 0x2B, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x13, 0x22, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x20, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6C, 0x20, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, + 0x69, 0x67, 0x6E, 0x69, 0x6E, 0x67, 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x13, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6F, 0x6D, 0x20, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, + 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x74, 0x79, +}; + +// /C=IL/O=StartCom Ltd./CN=StartCom Certification Authority G2 +static const uint8_t StartComCertificationAuthorityG2DN[85] = { + 0x30, 0x53, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x49, 0x4C, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x13, 0x0D, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6F, 0x6D, 0x20, 0x4C, 0x74, 0x64, 0x2E, + 0x31, 0x2C, 0x30, 0x2A, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x23, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x43, 0x6F, 0x6D, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6F, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x47, 0x32, +}; + +struct DataAndLength { + const uint8_t* data; + uint32_t len; +}; + +static const DataAndLength StartComAndWoSignDNs[]= { + { CAWoSignRootDN, + sizeof(CAWoSignRootDN) }, + { CAWoSignECCRootDN, + sizeof(CAWoSignECCRootDN) }, + { CertificationAuthorityofWoSignDN, + sizeof(CertificationAuthorityofWoSignDN) }, + { CertificationAuthorityofWoSignG2DN, + sizeof(CertificationAuthorityofWoSignG2DN) }, + { StartComCertificationAuthorityDN, + sizeof(StartComCertificationAuthorityDN) }, + { StartComCertificationAuthorityG2DN, + sizeof(StartComCertificationAuthorityG2DN) }, +}; diff --git a/src/node_crypto.cc b/src/node_crypto.cc index fc540923e06b05..1dfc77a8cbbb5a 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -17,6 +17,10 @@ // https://hg.mozilla.org/mozilla-central/raw-file/98820360ab66/security/ // certverifier/CNNICHashWhitelist.inc #include "CNNICHashWhitelist.inc" +// StartCom and WoSign root CA list is taken from +// https://hg.mozilla.org/mozilla-central/file/tip/security/certverifier/ +// StartComAndWoSignData.inc +#include "StartComAndWoSignData.inc" #include #include // INT_MAX @@ -2761,9 +2765,40 @@ inline X509* FindRoot(STACK_OF(X509)* sk) { } -// Whitelist check for certs issued by CNNIC. See +inline bool CertIsStartComOrWoSign(X509_NAME* name) { + const unsigned char* startcom_wosign_data; + X509_NAME* startcom_wosign_name; + + for (const auto& dn : StartComAndWoSignDNs) { + startcom_wosign_data = dn.data; + startcom_wosign_name = d2i_X509_NAME(nullptr, &startcom_wosign_data, + dn.len); + if (X509_NAME_cmp(name, startcom_wosign_name) == 0) + return true; + } + + return false; +} + +// Revoke the certificates issued by StartCom or WoSign that has +// notBefore after 00:00:00 on October 21, 2016 (1477008000 in epoch). +inline bool CheckStartComOrWoSign(X509_NAME* root_name, X509* cert) { + if (!CertIsStartComOrWoSign(root_name)) + return true; + + time_t october_21_2016 = static_cast(1477008000); + if (X509_cmp_time(X509_get_notBefore(cert), &october_21_2016) < 0) + return true; + + return false; +} + + +// Whitelist check for certs issued by CNNIC, StartCom and WoSign. See // https://blog.mozilla.org/security/2015/04/02 -// /distrusting-new-cnnic-certificates/ +// /distrusting-new-cnnic-certificates/ and +// https://blog.mozilla.org/security/2016/10/24/ +// distrusting-new-wosign-and-startcom-certificates inline CheckResult CheckWhitelistedServerCert(X509_STORE_CTX* ctx) { unsigned char hash[CNNIC_WHITELIST_HASH_LEN]; unsigned int hashlen = CNNIC_WHITELIST_HASH_LEN; @@ -2782,11 +2817,14 @@ inline CheckResult CheckWhitelistedServerCert(X509_STORE_CTX* ctx) { root_name = X509_get_subject_name(root_cert); } + X509* leaf_cert = sk_X509_value(chain, 0); + if (!CheckStartComOrWoSign(root_name, leaf_cert)) + return CHECK_CERT_REVOKED; + // When the cert is issued from either CNNNIC ROOT CA or CNNNIC EV // ROOT CA, check a hash of its leaf cert if it is in the whitelist. if (X509_NAME_cmp(root_name, cnnic_name) == 0 || X509_NAME_cmp(root_name, cnnic_ev_name) == 0) { - X509* leaf_cert = sk_X509_value(chain, 0); int ret = X509_digest(leaf_cert, EVP_sha256(), hash, &hashlen); CHECK(ret); diff --git a/test/fixtures/keys/Makefile b/test/fixtures/keys/Makefile index 277734aa174562..c7390eda0eefc4 100644 --- a/test/fixtures/keys/Makefile +++ b/test/fixtures/keys/Makefile @@ -57,6 +57,20 @@ fake-cnnic-root-cert.pem: fake-cnnic-root.cnf fake-cnnic-root-key.pem -out fake-cnnic-root-cert.pem \ -config fake-cnnic-root.cnf +# +# Create Fake StartCom Root Certificate Authority: fake-startcom-root +# +fake-startcom-root-key.pem: + openssl genrsa -out fake-startcom-root-key.pem 2048 + +fake-startcom-root-cert.pem: fake-startcom-root.cnf \ + fake-startcom-root-key.pem + openssl req -new -x509 -days 9999 -config \ + fake-startcom-root.cnf -key fake-startcom-root-key.pem -out \ + fake-startcom-root-cert.pem + echo '01' > fake-startcom-root-serial + touch fake-startcom-root-database.txt + # # agent1 is signed by ca1. # @@ -254,6 +268,60 @@ agent7-cert.pem: agent7-csr.pem fake-cnnic-root-cert.pem fake-cnnic-root-key.pem agent7-verify: agent7-cert.pem fake-cnnic-root-cert.pem openssl verify -CAfile fake-cnnic-root-cert.pem agent7-cert.pem +# +# agent8 is signed by fake-startcom-root with notBefore +# of Oct 20 23:59:59 2016 GMT +# + +agent8-key.pem: + openssl genrsa -out agent8-key.pem 2048 + +agent8-csr.pem: agent8.cnf agent8-key.pem + openssl req -new -config agent8.cnf -key agent8-key.pem \ + -out agent8-csr.pem + +agent8-cert.pem: agent8-csr.pem + openssl ca \ + -config fake-startcom-root.cnf \ + -keyfile fake-startcom-root-key.pem \ + -cert fake-startcom-root-cert.pem \ + -batch \ + -days 9999 \ + -passin "pass:password" \ + -in agent8-csr.pem \ + -startdate 20161020235959Z \ + -notext -out agent8-cert.pem + + +agent8-verify: agent8-cert.pem fake-startcom-root-cert.pem + openssl verify -CAfile fake-startcom-root-cert.pem \ + agent8-cert.pem + + +# +# agent9 is signed by fake-startcom-root with notBefore +# of Oct 21 00:00:01 2016 GMT +# +agent9-key.pem: + openssl genrsa -out agent9-key.pem 2048 + +agent9-csr.pem: agent9.cnf agent9-key.pem + openssl req -new -config agent9.cnf -key agent9-key.pem \ + -out agent9-csr.pem + + +agent9-cert.pem: agent9-csr.pem + openssl ca \ + -config fake-startcom-root.cnf \ + -keyfile fake-startcom-root-key.pem \ + -cert fake-startcom-root-cert.pem \ + -batch \ + -days 9999 \ + -passin "pass:password" \ + -in agent9-csr.pem \ + -startdate 20161021000001Z \ + -notext -out agent9-cert.pem + ec-key.pem: openssl ecparam -genkey -out ec-key.pem -name prime256v1 diff --git a/test/fixtures/keys/agent8-cert.pem b/test/fixtures/keys/agent8-cert.pem new file mode 100644 index 00000000000000..86de1d44a64a98 --- /dev/null +++ b/test/fixtures/keys/agent8-cert.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDUDCCAjgCAQEwDQYJKoZIhvcNAQELBQAwfTELMAkGA1UEBhMCSUwxFjAUBgNV +BAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRp +ZmljYXRlIFNpZ25pbmcxKTAnBgNVBAMTIFN0YXJ0Q29tIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MCAYDzIwMTYxMDIwMjM1OTU5WhcNNDQwMzIxMTAwNjM5WjBdMQsw +CQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZO +T0RFSlMxDzANBgNVBAsTBmFnZW50ODESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzkVSP6XxWpBlSjqqavwOhpp36aFJ +qLK7fRpxR+f0PdQ9WJajDEicxwKWGFqQBE+d5BjqrAD59L2QGZQ2VOF9VLZyFz3F +9TIlkd4yt9Od0qE98yIouDBNWu7UZqvNynAe5caD5i1MgyIUQqIUOnZwM21hwqYN +N/OESf38A8Tfuvh3ALUn7zBEVyUPWIWTYPhFHSCWIsS2URZ/qDLk8GavphkqXdFB +ii3V8Th5niPtpIsRF6Qhwh8SK+s0zh53o0qkmCNpXLd/PJQQAwC70WRq7ncL4D+U +C1gnDL0j9SzojXQu31kXs8UZTa7RFnx5r+gDiA/gGrLs4IiwDJhVHMx0nQIDAQAB +MA0GCSqGSIb3DQEBCwUAA4IBAQA7iMlm+rgZnlps+LFsoXG4dGNPaOhKI9t/XBrO +6O64LLyx/FPIQSaYi130QNB7Zy0uw8xqrH6cGRTJ9RCfBFFP4rzgIX3wEAHnmwMr +i4dGEixBUIIjhw6fAVxAhrkzmgUpUt0qIP9otGgESEYXIg7bFkXIHit0Im1VOdvf ++LnUKZw9o7UEesKIDVkuAsjoKKkrsO0kdf0dgAj6Ix5xmAtBsDvkH0aOSdPfTZG6 +LQrnZf/quBotog3NmDzrvQaH8GNpTJcYNjKlxD2z0PvQUyp0FD8oCC+oD+EGv2zZ +65scEXU/n8kTmdJkCjx4nb39HttYzOlNlTgMxAfxgL7A/PcT +-----END CERTIFICATE----- diff --git a/test/fixtures/keys/agent8-csr.pem b/test/fixtures/keys/agent8-csr.pem new file mode 100644 index 00000000000000..af749bcd1c8287 --- /dev/null +++ b/test/fixtures/keys/agent8-csr.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICxzCCAa8CAQAwXTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQH +EwJTRjEPMA0GA1UEChMGTk9ERUpTMQ8wDQYDVQQLEwZhZ2VudDgxEjAQBgNVBAMT +CWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM5FUj+l +8VqQZUo6qmr8Doaad+mhSaiyu30acUfn9D3UPViWowxInMcClhhakARPneQY6qwA ++fS9kBmUNlThfVS2chc9xfUyJZHeMrfTndKhPfMiKLgwTVru1GarzcpwHuXGg+Yt +TIMiFEKiFDp2cDNtYcKmDTfzhEn9/APE37r4dwC1J+8wRFclD1iFk2D4RR0gliLE +tlEWf6gy5PBmr6YZKl3RQYot1fE4eZ4j7aSLERekIcIfEivrNM4ed6NKpJgjaVy3 +fzyUEAMAu9Fkau53C+A/lAtYJwy9I/Us6I10Lt9ZF7PFGU2u0RZ8ea/oA4gP4Bqy +7OCIsAyYVRzMdJ0CAwEAAaAlMCMGCSqGSIb3DQEJBzEWExRBIGNoYWxsZW5nZSBw +YXNzd29yZDANBgkqhkiG9w0BAQUFAAOCAQEAykAWr5pOZh1BMc7NZgc66J16VkjN +KM2deMQNl7r3BFB336At+zmpudnjdT/tPaH34FT/Idh/DPfiSdpuDQWDA+E7xady +S7KoKfNesPFjV4rR1WgNtoix0B5EaaNxdR8ljwL30N/LbsMDWxIK7rWyhvuw3DXr +C90PbsOTCLbW1HGItgYCQFJnpXK1O1Vx0Bo55F//oxDGVTzkUqb0lsVGHLLCg0s2 +DxX3++FqFy/NjzZ5R/k1o+WIom1PzhLXJ+cqQsqYT9kBIVHTtvTAnDM70dZ8EeSW +/O4w+gb+OSJjClz7p4DuX4idDG+0cISxBOYFPyTFlGrXQ0ZXULP4pihsUA== +-----END CERTIFICATE REQUEST----- diff --git a/test/fixtures/keys/agent8-key.pem b/test/fixtures/keys/agent8-key.pem new file mode 100644 index 00000000000000..c1773f7cff4d02 --- /dev/null +++ b/test/fixtures/keys/agent8-key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAzkVSP6XxWpBlSjqqavwOhpp36aFJqLK7fRpxR+f0PdQ9WJaj +DEicxwKWGFqQBE+d5BjqrAD59L2QGZQ2VOF9VLZyFz3F9TIlkd4yt9Od0qE98yIo +uDBNWu7UZqvNynAe5caD5i1MgyIUQqIUOnZwM21hwqYNN/OESf38A8Tfuvh3ALUn +7zBEVyUPWIWTYPhFHSCWIsS2URZ/qDLk8GavphkqXdFBii3V8Th5niPtpIsRF6Qh +wh8SK+s0zh53o0qkmCNpXLd/PJQQAwC70WRq7ncL4D+UC1gnDL0j9SzojXQu31kX +s8UZTa7RFnx5r+gDiA/gGrLs4IiwDJhVHMx0nQIDAQABAoIBAHHp5KdT3Ht4XQfm +aDEXLGp3qhtzQDuTIWnQjZj5Z3Ax4wMmhbsF6tcY/Y1LjldjJL5QaGE/VMstWQRX +Tr4HnXCIJW/iZI2p+Qean4XXr0QgWhcI2VYHDuFWHiTpYogW7WlV/YfDooqU6n12 +BxfWStaL5L5bd9dbe8ZlJqVqN2iISfqGNIz9YKM04rHycTcicNmf0J0smkHlnHJE +ROQR73IXjDDOmkwdG75qyGRBQ0j0KEDu//n1axcOKf48F+8BQk2PFMq+RhkGGqJD +zTQK3kB33HRWeNWbykLPzYGcPtSlvaecCTc/q9wbbxh5AFlvSrPz3VzdRHECocM3 +v/o2vqECgYEA/uZib1ZYczuihcvLKxo8e/IBNYUKUcyosHDqAmJ5q8Y+Vg35ACfM +mJAhT1SXXAmm2tHuTnztfLDMQAOGVItuf5U8nuJYuWrvhMCtBT40XPeUVPD8b2D1 +9y5EipiB7huH8kMb1aAPUNgQhmqT93+4qcGf6PcNTkk6uHCCXFZEc7UCgYEAzyk1 +/T+Ah3p9+c1s+AjqkWj3Qa9lOKclJOT2O88AG+4fGQhSdUvkLDAMX3L6ri3gVZzr +wH3DJIwJx1uCW4eNJFVmh8AyP4SkfzQp1FqsIzBMQuPz6Hqtclh/UPx1yOe3NseO +xVM6Z5RbOOWyDaWxxbQHZnHkqSKcTB8K1lJ/XkkCgYAaStlMcrOc70HMW0ERqRsk +DcpiIt71oQ6lZIA+zrmOJly3s6lDgtdvxS4qaKdULwqu94iFQA2fFv16fOKWReuX +7WTbXq2YMpeSMe2m5Mux6ze5q0HemznDzVn0kdaVIPHc418zodbyl9bchpHMrbf2 +iqpb9V/B+3u7Gp/Xtm5JIQKBgBFrjr2wBFfgJg3Gh35ICamWoQwl+qYL8CStGEOp +QYIXwQey2nRAoHxSwgeYvJm/A9lPK8fxC2LcX8oi2NBnkqfWgpuxvsf2mHqV4VqZ +EVaYLiGF17HZ9xHhfTtLL4Boc9CocUoImKWzJQSg1BsvrsZIQEMOGsNaRLhl99xT +7Z/5AoGBAIxgzOGLVVrIv8vRc4YouPf0OGBmUawnEZxYVD1Mo4Tt97XjxH93B1iz +hof62zDCL7WEdKuwnOs1towBmLjC7qrAbkUgNVYmI5sG9c8+1NKClTOJGsHHiMLF +n8GxnsNU5FVTmJ/PZfOU+eru7uDYZHTkii0tkaHWUzg13pkhka5E +-----END RSA PRIVATE KEY----- diff --git a/test/fixtures/keys/agent8.cnf b/test/fixtures/keys/agent8.cnf new file mode 100644 index 00000000000000..bb50a0e7199283 --- /dev/null +++ b/test/fixtures/keys/agent8.cnf @@ -0,0 +1,17 @@ +[ req ] +default_bits = 2048 +days = 999 +distinguished_name = req_distinguished_name +attributes = req_attributes +prompt = no + +[ req_distinguished_name ] +C = US +ST = CA +L = SF +O = NODEJS +OU = agent8 +CN = localhost + +[ req_attributes ] +challengePassword = A challenge password diff --git a/test/fixtures/keys/agent9-cert.pem b/test/fixtures/keys/agent9-cert.pem new file mode 100644 index 00000000000000..196922986cdb6e --- /dev/null +++ b/test/fixtures/keys/agent9-cert.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDUDCCAjgCAQIwDQYJKoZIhvcNAQELBQAwfTELMAkGA1UEBhMCSUwxFjAUBgNV +BAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRp +ZmljYXRlIFNpZ25pbmcxKTAnBgNVBAMTIFN0YXJ0Q29tIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MCAYDzIwMTYxMDIxMDAwMDAxWhcNNDQwMzIxMTAwNzAyWjBdMQsw +CQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZO +T0RFSlMxDzANBgNVBAsTBmFnZW50OTESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApT6nASSx9e2i/t0aHSd9BxMRD92o +33/iaiXWzBOKMJp7jxCWAg6SnpjrFsyjTxaAqg+e1zlm10YBT6DholstffzQqK2x +TKGVOQK4jxX23wJlrn5mDk0fagBtY49L1KFy8DxJqKgt7uxz61GGUWwKWXG7Vnga +bkqDd9o3ZF7bOq7mMQvfDzPrwYI8uTjTxR8R19uxNNOGtHMTnwvDeczTmtTox8U+ +4N2hN2scDZvRBx5aQAtnXRyZhAokAJMYojinx9iqlVFQi3ct52LIhsca6ympfDc2 +0yA4aSVfoW7NlqsnvrTOV4nt3UbrxGGpiE7Em8Hdcw2EMF+jqCTLGtsqYQIDAQAB +MA0GCSqGSIb3DQEBCwUAA4IBAQCMjKFycVQh7Puz/FpQh3NhJ99Ic3rzr+3nAKFD +4Kcl3L8szH3zjLCw46/y2jqPiAbg2zg9miYkI/2W/G+m2VQEQvp2SwjVr/Rj2Soe +iTonruUpDFF7LG01q3kpZ7nYWRGvVgn5D9BGk4/SWuzxiWRdwlzJf2e8cXLExVS0 +0CgRsb5nRoZ+RZmVIrGMfIi8CI7uTlcHtQzD7B7gpHtOSMlQoSSeqOy6F498duvl +QhhQhJBxmjSegw/lawWQSDFArJimK/rwyb6ZFbRfBgg6o/k5W9G5l0oG5abQMp+/ +u8Fd+QUNwR6OovE0AqL6wNHCnqzNnihTL6/hRVer6i5Hfxmb +-----END CERTIFICATE----- diff --git a/test/fixtures/keys/agent9-csr.pem b/test/fixtures/keys/agent9-csr.pem new file mode 100644 index 00000000000000..bba87d631f15b3 --- /dev/null +++ b/test/fixtures/keys/agent9-csr.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICxzCCAa8CAQAwXTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQH +EwJTRjEPMA0GA1UEChMGTk9ERUpTMQ8wDQYDVQQLEwZhZ2VudDkxEjAQBgNVBAMT +CWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKU+pwEk +sfXtov7dGh0nfQcTEQ/dqN9/4mol1swTijCae48QlgIOkp6Y6xbMo08WgKoPntc5 +ZtdGAU+g4aJbLX380KitsUyhlTkCuI8V9t8CZa5+Zg5NH2oAbWOPS9ShcvA8Saio +Le7sc+tRhlFsCllxu1Z4Gm5Kg3faN2Re2zqu5jEL3w8z68GCPLk408UfEdfbsTTT +hrRzE58Lw3nM05rU6MfFPuDdoTdrHA2b0QceWkALZ10cmYQKJACTGKI4p8fYqpVR +UIt3LediyIbHGuspqXw3NtMgOGklX6FuzZarJ760zleJ7d1G68RhqYhOxJvB3XMN +hDBfo6gkyxrbKmECAwEAAaAlMCMGCSqGSIb3DQEJBzEWExRBIGNoYWxsZW5nZSBw +YXNzd29yZDANBgkqhkiG9w0BAQUFAAOCAQEAKlz52i1TpqNFQQu2YCl2YlTKbu2s ++92Qq+9b8wKoTweEFxDYtfq8d6rgYtetDbJDh+CDSjG3REINHtbPB0BjFdmZq/Q6 +7JHLjmWKacmhaZJIp6xtrAX93qXYfbqH2S/DNSAO1e1sUa/gKL+wuVcrM8My7mzo +cMEgc7mHJCbSjYIcYPELas+rADoCE4mgiX8wwYQjFqxj/cdlcMzVS3ZuARAiPzA7 +60Zk3/NnbXd/OBOcf/FvbrYIQ45eV4JlMowtcdLtxP91N5/X3BBMFsXt4mPoXETC +V78wipSWtfiKTox1Ze7PSJsYm9E9TOYYPh9kSGizIFzrgnk9H15+Iy5Ixg== +-----END CERTIFICATE REQUEST----- diff --git a/test/fixtures/keys/agent9-key.pem b/test/fixtures/keys/agent9-key.pem new file mode 100644 index 00000000000000..1156fddfa68d4b --- /dev/null +++ b/test/fixtures/keys/agent9-key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEApT6nASSx9e2i/t0aHSd9BxMRD92o33/iaiXWzBOKMJp7jxCW +Ag6SnpjrFsyjTxaAqg+e1zlm10YBT6DholstffzQqK2xTKGVOQK4jxX23wJlrn5m +Dk0fagBtY49L1KFy8DxJqKgt7uxz61GGUWwKWXG7VngabkqDd9o3ZF7bOq7mMQvf +DzPrwYI8uTjTxR8R19uxNNOGtHMTnwvDeczTmtTox8U+4N2hN2scDZvRBx5aQAtn +XRyZhAokAJMYojinx9iqlVFQi3ct52LIhsca6ympfDc20yA4aSVfoW7NlqsnvrTO +V4nt3UbrxGGpiE7Em8Hdcw2EMF+jqCTLGtsqYQIDAQABAoIBAE7FXAUOggry2hVW +PuGQ9mfN7f87MgpAwyTInukvk1tx+N6NEIUwfzI9QSvgJyVHW9Q1mAmO4nhSdcOI +tKaZgkkhoDIYgoE+MY04v9Ptq35JfUE+HdZJa2UziPHB2Gsm/0yH4LEWYrcXXnbZ +qQbdUt2qepxQqoDS4nLawjcFhMom24ns24eMCsFW7yrxhyvQwFKqGOKXauCpClp2 +oPXhd2wljutuIGJjMmeqMw7CuyfZMee6BsuXNWWr/kso0NaQwxKoFnGlyaOl6oUV +ypr5ADXv0NNaSqDgyfEfJedsGQul+WWnkjz6PFbWZtbG5SIKb5PCJ2aWD7mvcHdI +85BL4jUCgYEA0yPogvmlK/hSpckk/AkRtHWwjUdkgdoZzxiJV/D01y8EtB+yL46t +Gzl23Y1VtLXxn+CZdj2putS5z1Rg1LA0oMZ+TwhxGskURBPP7mym83Qn1huRcnWw +df9flCg4IwRLqI6QfsQ2Q6j549j5u8P+tqVi/yZQY0V2SGcXTXaqIksCgYEAyFpy +24+AW33ypNxr9sOIx2YQyn0UDK2K6LQYRmjwhpCZEtBdoUqKGP/9UUycM4TN9D32 +p0le+3TJVk9tVqyvwFeGBkguO/3dXD6KTsqrCfMFNj/R6QRYFEaLWjkG8EI5TXOK +a/CbhtyGaRY5QzwLRjLdEYIph3r1d2uedVzwGoMCgYEAvPV59R2u8LcAYFavvs/v +BG3/X7DxBjVGu8zdvdJrjNkLgJiNQ3qQ+bhn5MfEWEIsyESdkvCEoiwXTrHZJv+7 +WdfK2rhXYP1sIbEJefvLPj5KGJf7h1BEaJXv2AxWkSAbBfLw5kJ7vfnQClX4yk4R ++yvweSC0+OMFhK6ecDku8hkCgYAJPRJ6yV0z2tTrgTaBRHb0KuKvU6EvDHmRTWyp +IoGk0tocIfuPSm6fxH4b15qETaVpk8nh4OI+Wh5GmpcCHihkiCSn+YAYSBaDAGdE +RtgoN0qQO9UkF40wMiiO2n5VadhWl/NUEt45E8Ym5l1xmj0y2XmUKxpbIvJatV2z +L7vqnQKBgCuV47rGYLaPz+gVgwIz0PvNFgp2fdSBYYQUf70XsaEU1bQtim6q5jxd ++ePUiT65k42Iw7oLWyGtxdyxmmKgQ18i5aDNjT2SLr3RAC2BSR5Fs1W1PLi24nV6 +QW7fepI9tOBTbwbLG8ARRzx2YXrBf9PqvmDbrMiTi0WGFGlVJatX +-----END RSA PRIVATE KEY----- diff --git a/test/fixtures/keys/agent9.cnf b/test/fixtures/keys/agent9.cnf new file mode 100644 index 00000000000000..a9f5a5f16a3a10 --- /dev/null +++ b/test/fixtures/keys/agent9.cnf @@ -0,0 +1,17 @@ +[ req ] +default_bits = 2048 +days = 999 +distinguished_name = req_distinguished_name +attributes = req_attributes +prompt = no + +[ req_distinguished_name ] +C = US +ST = CA +L = SF +O = NODEJS +OU = agent9 +CN = localhost + +[ req_attributes ] +challengePassword = A challenge password diff --git a/test/fixtures/keys/fake-startcom-root-cert.pem b/test/fixtures/keys/fake-startcom-root-cert.pem new file mode 100644 index 00000000000000..b3ebbacf753d6a --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-cert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDjTCCAnWgAwIBAgIJAKDrU4iaFPb+MA0GCSqGSIb3DQEBBQUAMH0xCzAJBgNV +BAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUg +RGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMSkwJwYDVQQDEyBTdGFydENvbSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNjExMDQwOTUwMTNaFw00NDAzMjEw +OTUwMTNaMH0xCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMSsw +KQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMSkwJwYD +VQQDEyBTdGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALvhAZtGU3u3uyB4lHn5X85XJdyPAnOY0hGc +SVMzfQ/BBEvBPkcdhJvZPLqcWTnJplsJXH+GHz9q73DbyLekdF/f6dNVcRmDjvZq +pZ6KgT8D4GmudNPMEuHs9+bqI+l5p7Mh1mEmot5JYtXvGD3UiN2ZUQ/trhf5xiJq +MEaiQHBxhJESkY+RYV2GK0njCJ2ypmtAAzyGUlNgHqxBy1PrBBqh0xbSOa2pwRyz +9u7EkYN4BCQKNCBJbOaX9rH+j836YlEHEymutjYDuYiHaOve0yJCHsQqsx7+p9aB +UxCS9mTj9q9bz9GJR9tfT04+HmQRjtSZYt7fHIixgS0vT4/6QlsCAwEAAaMQMA4w +DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAiIgJ9EGWepY/Qk6n6Kcj +YQFZXeV6ugnWz96sxYc0xmo/XNkYQFLxVneyWanlUxAbvScEdC8rJ5rUrwVMhfaS +goneP2Otjcg0XcMrsf5RaJk0H8uGUdvdgWUHO85pseMOFgqXxJgEux7wcFS41qhw +thc/obZ5keOPJf3tsOffV5OJc6owwgaviz3RNFRJUleZU5r3swjWIEDK89sz9q+S +qcwostbKRrEcjyltblhFKR9s4Qyn9FYWntPApFHq7M0/jA/4iiHRcltFfc19mslb +lhRBZZ/vds3VEtfs7uPhcodXBTv5d5xUk6pybSSFhKTTtHc8OpdvbM+5LchzTc23 +pA== +-----END CERTIFICATE----- diff --git a/test/fixtures/keys/fake-startcom-root-csr.pem b/test/fixtures/keys/fake-startcom-root-csr.pem new file mode 100644 index 00000000000000..56da4e65b4a4fe --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-csr.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIC5zCCAc8CAQAwfTELMAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0 +ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmljYXRlIFNpZ25pbmcx +KTAnBgNVBAMTIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAww1iG1Oq6uIEN5u4W0jWnDFvaKGp +R6XSYPK3D1VJTqr7XUfzbVG2Acc5B7WTmerFsxOADXe8kpC3U6QxcyLvMv90Bpju +dasttLnoBU2XqJxWTpmJyM8RfbSZEKfNIdKzG2uQQVHIJOV/bm6yhQIT2cDKNZDx +M0OPiCeeQMezD4/Y98zFDyWjTI2zW6kyBzdjPSLJ3DMJs+4EC6LJhKrp9kBbJHhU +QdIrQ1C3ycJ0lKv8uV8xWsgz/CsPkp92H/iUDxBnFgMcdFmgt/XgPDf1Q9ipfq7B +5Ef8RlQuDsqer+/UPOXLHWHtE+5QbkL4hzCjJEszkl5QbSPdiK1rcIkEvQIDAQAB +oCUwIwYJKoZIhvcNAQkHMRYTFEEgY2hhbGxlbmdlIHBhc3N3b3JkMA0GCSqGSIb3 +DQEBCwUAA4IBAQCwvK3cFAA9ShrFNhSuZ//xFgrXxqQXS4o571jDCLYh+QAgcRUU +ATPM0GQ4CKUR3gWD14Ji922PiVZCpKgvkEVrvMYq6jgydT2urki0hL/po7msdnLQ +2FWMwgpINaTmhmUNBxHBQbopW4HWDzcCfSQwGN/iCElNmawXGIN1LRcDAl08h/cW +hTP9agZXpmoZ2wHg+ZRHcJwJm4QL4Rm7JfyNN3fZWUFgn3Pfkwgiu9PMhU92KRU/ +5PJ3tcyw9qSQJsw6CPuijRI9kaKdFIj6BsOGmsSyYq9OoqtlfqXqgXXv3XfKQmmh +Hntg6KSQhReXDHCSTgtBZFa6+kwg3mgr8I7N +-----END CERTIFICATE REQUEST----- diff --git a/test/fixtures/keys/fake-startcom-root-database.txt b/test/fixtures/keys/fake-startcom-root-database.txt new file mode 100644 index 00000000000000..b1f582201ae32d --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-database.txt @@ -0,0 +1,2 @@ +V 440321100639Z 01 unknown /C=US/ST=CA/L=SF/O=NODEJS/OU=agent8/CN=localhost +V 440321100702Z 02 unknown /C=US/ST=CA/L=SF/O=NODEJS/OU=agent9/CN=localhost diff --git a/test/fixtures/keys/fake-startcom-root-database.txt.attr b/test/fixtures/keys/fake-startcom-root-database.txt.attr new file mode 100644 index 00000000000000..8f7e63a3475ce8 --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-database.txt.attr @@ -0,0 +1 @@ +unique_subject = yes diff --git a/test/fixtures/keys/fake-startcom-root-database.txt.attr.old b/test/fixtures/keys/fake-startcom-root-database.txt.attr.old new file mode 100644 index 00000000000000..8f7e63a3475ce8 --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-database.txt.attr.old @@ -0,0 +1 @@ +unique_subject = yes diff --git a/test/fixtures/keys/fake-startcom-root-database.txt.old b/test/fixtures/keys/fake-startcom-root-database.txt.old new file mode 100644 index 00000000000000..66c1d034dd47cd --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-database.txt.old @@ -0,0 +1 @@ +V 440321100639Z 01 unknown /C=US/ST=CA/L=SF/O=NODEJS/OU=agent8/CN=localhost diff --git a/test/fixtures/keys/fake-startcom-root-issued-certs/01.pem b/test/fixtures/keys/fake-startcom-root-issued-certs/01.pem new file mode 100644 index 00000000000000..86de1d44a64a98 --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-issued-certs/01.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDUDCCAjgCAQEwDQYJKoZIhvcNAQELBQAwfTELMAkGA1UEBhMCSUwxFjAUBgNV +BAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRp +ZmljYXRlIFNpZ25pbmcxKTAnBgNVBAMTIFN0YXJ0Q29tIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MCAYDzIwMTYxMDIwMjM1OTU5WhcNNDQwMzIxMTAwNjM5WjBdMQsw +CQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZO +T0RFSlMxDzANBgNVBAsTBmFnZW50ODESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzkVSP6XxWpBlSjqqavwOhpp36aFJ +qLK7fRpxR+f0PdQ9WJajDEicxwKWGFqQBE+d5BjqrAD59L2QGZQ2VOF9VLZyFz3F +9TIlkd4yt9Od0qE98yIouDBNWu7UZqvNynAe5caD5i1MgyIUQqIUOnZwM21hwqYN +N/OESf38A8Tfuvh3ALUn7zBEVyUPWIWTYPhFHSCWIsS2URZ/qDLk8GavphkqXdFB +ii3V8Th5niPtpIsRF6Qhwh8SK+s0zh53o0qkmCNpXLd/PJQQAwC70WRq7ncL4D+U +C1gnDL0j9SzojXQu31kXs8UZTa7RFnx5r+gDiA/gGrLs4IiwDJhVHMx0nQIDAQAB +MA0GCSqGSIb3DQEBCwUAA4IBAQA7iMlm+rgZnlps+LFsoXG4dGNPaOhKI9t/XBrO +6O64LLyx/FPIQSaYi130QNB7Zy0uw8xqrH6cGRTJ9RCfBFFP4rzgIX3wEAHnmwMr +i4dGEixBUIIjhw6fAVxAhrkzmgUpUt0qIP9otGgESEYXIg7bFkXIHit0Im1VOdvf ++LnUKZw9o7UEesKIDVkuAsjoKKkrsO0kdf0dgAj6Ix5xmAtBsDvkH0aOSdPfTZG6 +LQrnZf/quBotog3NmDzrvQaH8GNpTJcYNjKlxD2z0PvQUyp0FD8oCC+oD+EGv2zZ +65scEXU/n8kTmdJkCjx4nb39HttYzOlNlTgMxAfxgL7A/PcT +-----END CERTIFICATE----- diff --git a/test/fixtures/keys/fake-startcom-root-issued-certs/02.pem b/test/fixtures/keys/fake-startcom-root-issued-certs/02.pem new file mode 100644 index 00000000000000..196922986cdb6e --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-issued-certs/02.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDUDCCAjgCAQIwDQYJKoZIhvcNAQELBQAwfTELMAkGA1UEBhMCSUwxFjAUBgNV +BAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRp +ZmljYXRlIFNpZ25pbmcxKTAnBgNVBAMTIFN0YXJ0Q29tIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MCAYDzIwMTYxMDIxMDAwMDAxWhcNNDQwMzIxMTAwNzAyWjBdMQsw +CQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZO +T0RFSlMxDzANBgNVBAsTBmFnZW50OTESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApT6nASSx9e2i/t0aHSd9BxMRD92o +33/iaiXWzBOKMJp7jxCWAg6SnpjrFsyjTxaAqg+e1zlm10YBT6DholstffzQqK2x +TKGVOQK4jxX23wJlrn5mDk0fagBtY49L1KFy8DxJqKgt7uxz61GGUWwKWXG7Vnga +bkqDd9o3ZF7bOq7mMQvfDzPrwYI8uTjTxR8R19uxNNOGtHMTnwvDeczTmtTox8U+ +4N2hN2scDZvRBx5aQAtnXRyZhAokAJMYojinx9iqlVFQi3ct52LIhsca6ympfDc2 +0yA4aSVfoW7NlqsnvrTOV4nt3UbrxGGpiE7Em8Hdcw2EMF+jqCTLGtsqYQIDAQAB +MA0GCSqGSIb3DQEBCwUAA4IBAQCMjKFycVQh7Puz/FpQh3NhJ99Ic3rzr+3nAKFD +4Kcl3L8szH3zjLCw46/y2jqPiAbg2zg9miYkI/2W/G+m2VQEQvp2SwjVr/Rj2Soe +iTonruUpDFF7LG01q3kpZ7nYWRGvVgn5D9BGk4/SWuzxiWRdwlzJf2e8cXLExVS0 +0CgRsb5nRoZ+RZmVIrGMfIi8CI7uTlcHtQzD7B7gpHtOSMlQoSSeqOy6F498duvl +QhhQhJBxmjSegw/lawWQSDFArJimK/rwyb6ZFbRfBgg6o/k5W9G5l0oG5abQMp+/ +u8Fd+QUNwR6OovE0AqL6wNHCnqzNnihTL6/hRVer6i5Hfxmb +-----END CERTIFICATE----- diff --git a/test/fixtures/keys/fake-startcom-root-key.pem b/test/fixtures/keys/fake-startcom-root-key.pem new file mode 100644 index 00000000000000..d8f727d2be6780 --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAu+EBm0ZTe7e7IHiUeflfzlcl3I8Cc5jSEZxJUzN9D8EES8E+ +Rx2Em9k8upxZOcmmWwlcf4YfP2rvcNvIt6R0X9/p01VxGYOO9mqlnoqBPwPgaa50 +08wS4ez35uoj6XmnsyHWYSai3kli1e8YPdSI3ZlRD+2uF/nGImowRqJAcHGEkRKR +j5FhXYYrSeMInbKma0ADPIZSU2AerEHLU+sEGqHTFtI5ranBHLP27sSRg3gEJAo0 +IEls5pf2sf6PzfpiUQcTKa62NgO5iIdo697TIkIexCqzHv6n1oFTEJL2ZOP2r1vP +0YlH219PTj4eZBGO1Jli3t8ciLGBLS9Pj/pCWwIDAQABAoIBAFOQL2O9stH7FTrL +Btb9iJRBBLEF1oRNu1lj1uUvqHdCVUPQbn+47EtZIv6pHbJrMxeYoVCC+hD94gOj +bbHobm5aLCj3/rbnYcXOB13torDBa6X1lzbAtMFR4a0OBO0KVAGDklNhmN0fbNtU +XcbaagmN8JUSFPXK/Uo/SruP3PNldfPVtf/EnBlK4LOI5/WDyiwLQxlVf389poKp +wXwhVgL9Kh0uzxD31HH0NOL+D1KOI6j7gNrOAOZFFGTwVAtQFI28wIwftKf3qicQ +TZvV/O+Aw+oIZsOfX9Pg6dNehhEC25F6UcGrX7b7fI/Rbx6L/VxfjMHfbvsUtTxz +iwW1H5ECgYEA85U2LiBicAB4QkclUHjLPrPl7W0bDvKFKJkxXJ44y/ziFjOhksuF +J1xYXhVhP7mdXwGVlt2X9PSjkW06I+DFqi2IbGDBqJ/0hJrAr/+5J5OySCFlx2kC +TwIAYJIud0Vgk8FdToijOKq8I3KFmUsc6k0UMmCdCy4HXz0Qy3RqsekCgYEAxXTZ +3orr/ItfjVFz9bkcNUMutRVvsyewYJOemgaejdSHLYl8lTcLQDLSnA/Sd7JtXOyS +3M7GVpiBZqW15UJry5fpkRNhqOXqXz6/Hp9E3hG9RnS2EkZDR2vIrRwa3o6zKq8P +XYOOOzjdYq881khhRhafXCon0XvLdZAsOKfDQ6MCgYEAqsDw6Ej/eLB7nUqul8j2 +AZCvIE+Z5lKQkjNB7UFlY2p1O0cafwN45mzP7bRjJf8CmPVNXiMdQTS17V56oWgS +aQfeWMtDNuhayxKI/Vfw/hOFqRbweGfenHA0v336YNYbq7ijpkgW08SsetTvXtTP +AljiTaZ4sLulo1f1jAqiOPECgYA1CgJL6P0ixT1RdIO1iZeuJvGw6qUqdorGJmD/ +9q84YdI9xSSV4EdBY2V3Tji2tlLyFwoMDe7w6942eGS3xHO4KIIw2gftmnSuSOiF +jTqufA1fk5IkroL7+FPbTCVbivFNkeCKuf/GoKu3CmNJHAAlF4aO9zPi7WHlnmiC +f23QCQKBgET2u4cPsUAZJ8utCyQ+ZhKJUTcYDN/Nlpd/yVC+dS9BZAc2tH1EfRN2 +pxSzm9Qgd6Cjc7cVJ/T745b85nbPjd1MsOgvPCKr0TFARmlGpu4RtKEHrROSaahX +7vR7HiYqhbeYlVRz9lZ5N+J1BT7sq7+Rond89UtL/O7g0wEs/N3V +-----END RSA PRIVATE KEY----- diff --git a/test/fixtures/keys/fake-startcom-root-serial b/test/fixtures/keys/fake-startcom-root-serial new file mode 100644 index 00000000000000..75016ea3625245 --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-serial @@ -0,0 +1 @@ +03 diff --git a/test/fixtures/keys/fake-startcom-root-serial.old b/test/fixtures/keys/fake-startcom-root-serial.old new file mode 100644 index 00000000000000..9e22bcb8e34408 --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root-serial.old @@ -0,0 +1 @@ +02 diff --git a/test/fixtures/keys/fake-startcom-root.cnf b/test/fixtures/keys/fake-startcom-root.cnf new file mode 100644 index 00000000000000..d6a9557bc8778d --- /dev/null +++ b/test/fixtures/keys/fake-startcom-root.cnf @@ -0,0 +1,46 @@ +[ ca ] +default_ca = CA_default + +[ CA_default ] +dir = . +name_opt = CA_default +cert_opt = CA_default +default_crl_days = 999 +default_md = sha256 +database = fake-startcom-root-database.txt +serial = fake-startcom-root-serial +private_key = fake-startcom-root-key.pem +certificate = fake-startcom-root-cert.pem +new_certs_dir = fake-startcom-root-issued-certs +email_in_dn = no +policy = policy_anything + +[ policy_anything ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +[ req ] +default_bits = 2048 +days = 999 +distinguished_name = req_distinguished_name +attributes = req_attributes +prompt = no +output_password = password +x509_extensions = v3_ca + +[ req_distinguished_name ] +C = IL +O = StartCom Ltd. +OU = Secure Digital Certificate Signing +CN = StartCom Certification Authority + +[ req_attributes ] +challengePassword = A challenge password + +[ v3_ca ] +basicConstraints = CA:TRUE diff --git a/test/parallel/test-tls-startcom-wosign-whitelist.js b/test/parallel/test-tls-startcom-wosign-whitelist.js new file mode 100644 index 00000000000000..fd20e0d8e9745c --- /dev/null +++ b/test/parallel/test-tls-startcom-wosign-whitelist.js @@ -0,0 +1,91 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +if (!common.hasCrypto) { + common.skip('missing crypto'); + return; +} + +const tls = require('tls'); +const fs = require('fs'); +const path = require('path'); +let finished = 0; + +function filenamePEM(n) { + return path.join(common.fixturesDir, 'keys', n + '.pem'); +} + +function loadPEM(n) { + return fs.readFileSync(filenamePEM(n)); +} + +const testCases = [ + { // agent8 is signed by fake-startcom-root with notBefore of + // Oct 20 23:59:59 2016 GMT. It passes StartCom/WoSign check. + serverOpts: { + key: loadPEM('agent8-key'), + cert: loadPEM('agent8-cert') + }, + clientOpts: { + ca: loadPEM('fake-startcom-root-cert'), + port: undefined, + rejectUnauthorized: true + }, + errorCode: 'CERT_OK' + }, + { // agent9 is signed by fake-startcom-root with notBefore of + // Oct 21 00:00:01 2016 GMT. It fails StartCom/WoSign check. + serverOpts: { + key: loadPEM('agent9-key'), + cert: loadPEM('agent9-cert') + }, + clientOpts: { + ca: loadPEM('fake-startcom-root-cert'), + port: undefined, + rejectUnauthorized: true + }, + errorCode: 'CERT_REVOKED' + } +]; + + +function runNextTest(server, tindex) { + server.close(function() { + finished++; + runTest(tindex + 1); + }); +} + + +function runTest(tindex) { + const tcase = testCases[tindex]; + + if (!tcase) return; + + const server = tls.createServer(tcase.serverOpts, function(s) { + s.resume(); + }).listen(0, function() { + tcase.clientOpts.port = this.address().port; + const client = tls.connect(tcase.clientOpts); + client.on('error', function(e) { + assert.strictEqual(e.code, tcase.errorCode); + runNextTest(server, tindex); + }); + + client.on('secureConnect', function() { + // agent8 can pass StartCom/WoSign check so that the secureConnect + // is established. + assert.strictEqual(tcase.errorCode, 'CERT_OK'); + client.end(); + runNextTest(server, tindex); + }); + }); +} + + +runTest(0); + +process.on('exit', function() { + assert.strictEqual(finished, testCases.length); +}); From 7af03ba3f67ae2074701fe2af66ddbbf968b8d5d Mon Sep 17 00:00:00 2001 From: Shigeki Ohtsu Date: Fri, 4 Nov 2016 18:27:26 +0900 Subject: [PATCH 018/121] crypto: Remove expired certs from CNNIC whitelist CNNIC Whitelist was updated with removing expired certificates. Fixes: https://github.com/nodejs/node/pull/1895 PR-URL: https://github.com/nodejs/node/pull/9469 Reviewed-By: James M Snell Reviewed-By: Fedor Indutny Reviewed-By: Ben Noordhuis --- src/CNNICHashWhitelist.inc | 5216 ++++-------------------------------- 1 file changed, 568 insertions(+), 4648 deletions(-) diff --git a/src/CNNICHashWhitelist.inc b/src/CNNICHashWhitelist.inc index e3c6a618fd7729..ed4149f1c51346 100644 --- a/src/CNNICHashWhitelist.inc +++ b/src/CNNICHashWhitelist.inc @@ -16,102 +16,22 @@ struct WhitelistedCNNICHash { }; static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { - { - { 0x00, 0x5B, 0xF9, 0x8E, 0xED, 0x61, 0x2B, 0x50, 0xEC, 0xDA, 0x7B, 0xFF, 0x56, 0xA2, 0xDF, 0xF4, - 0x67, 0xA8, 0xAD, 0xD7, 0xEE, 0xC0, 0xAB, 0x30, 0x57, 0x54, 0xD7, 0x66, 0xBE, 0xBB, 0x5F, 0xE8 }, - }, - { - { 0x00, 0x87, 0x75, 0xB8, 0xEA, 0xD0, 0xFE, 0x16, 0x26, 0x9C, 0x9A, 0x9A, 0xB2, 0x83, 0x39, 0x55, - 0x49, 0xCA, 0x67, 0xC2, 0xA3, 0xAA, 0xE8, 0x2F, 0x1A, 0x6B, 0x4D, 0x3A, 0xBC, 0xCA, 0xDC, 0x27 }, - }, { { 0x00, 0xC5, 0x9F, 0x5E, 0xF3, 0xB4, 0x6D, 0xBC, 0xA0, 0xA8, 0xBB, 0xA5, 0x0A, 0x72, 0xD4, 0xE1, 0x83, 0x9A, 0x94, 0xFB, 0x1A, 0x58, 0x5A, 0xD7, 0x2A, 0x7A, 0xAC, 0x3C, 0x72, 0x56, 0x1F, 0xC0 }, }, - { - { 0x00, 0xC6, 0x81, 0x13, 0x16, 0xBD, 0x9C, 0x91, 0x98, 0x6E, 0xA9, 0x7E, 0x2C, 0x30, 0xAB, 0xEF, - 0xA0, 0xD5, 0x68, 0x04, 0x89, 0x0D, 0x65, 0x8D, 0xFF, 0x08, 0x59, 0x11, 0x6E, 0xB4, 0xC2, 0x32 }, - }, - { - { 0x00, 0xCB, 0x92, 0x51, 0xAF, 0xFA, 0x0E, 0x4C, 0xA0, 0xA5, 0x61, 0x1F, 0x1A, 0x79, 0x15, 0x05, - 0xD2, 0xAB, 0xF8, 0x9D, 0xD0, 0x48, 0x53, 0x29, 0x16, 0xF0, 0x5F, 0xD8, 0x74, 0xF2, 0x5D, 0xCD }, - }, - { - { 0x00, 0xDE, 0xFF, 0x68, 0x2E, 0x35, 0x10, 0x22, 0xCC, 0x3B, 0xBB, 0x4E, 0xB5, 0x88, 0x0A, 0x97, - 0x27, 0x88, 0x0A, 0xF3, 0x52, 0xFB, 0xBE, 0x2F, 0x91, 0x24, 0xBE, 0x92, 0x88, 0x4B, 0x18, 0xFD }, - }, - { - { 0x00, 0xF7, 0x28, 0x14, 0x8C, 0x8C, 0x28, 0x90, 0x7F, 0xAC, 0xF3, 0x89, 0xC0, 0xE9, 0xB9, 0xBC, - 0x6F, 0xD1, 0xB8, 0xDE, 0xE0, 0xE8, 0x5B, 0x65, 0xFE, 0x39, 0x39, 0x8B, 0xEE, 0x95, 0xDC, 0x59 }, - }, - { - { 0x00, 0xF8, 0x4A, 0x82, 0x67, 0xB3, 0xDA, 0xEE, 0x1E, 0x16, 0x90, 0x75, 0x1C, 0x86, 0xBD, 0x78, - 0x94, 0x08, 0x65, 0x94, 0x3E, 0xEE, 0x52, 0xE9, 0x7D, 0x98, 0x50, 0x1A, 0xC8, 0xE1, 0x58, 0x94 }, - }, - { - { 0x01, 0x1D, 0x7D, 0xC8, 0x19, 0x01, 0xAB, 0xCA, 0xE0, 0xF4, 0x74, 0x4C, 0x17, 0xB8, 0xF7, 0x87, - 0xF3, 0x97, 0x41, 0x3A, 0x42, 0x3D, 0xC0, 0x82, 0xC4, 0xB3, 0x80, 0x23, 0xDE, 0x42, 0x00, 0x75 }, - }, - { - { 0x01, 0x5F, 0x9B, 0x68, 0xD6, 0x4B, 0x86, 0x0D, 0x5E, 0xD0, 0x40, 0x50, 0x66, 0xA3, 0xF2, 0xFD, - 0x9D, 0x6D, 0xDE, 0x3A, 0x9B, 0x35, 0x73, 0x17, 0x34, 0x10, 0xE6, 0xCE, 0x63, 0x9B, 0x77, 0x91 }, - }, - { - { 0x01, 0xD6, 0x0A, 0xE5, 0x22, 0x20, 0x8E, 0xC6, 0xF5, 0x04, 0xD5, 0x91, 0xF9, 0x7A, 0x99, 0xA5, - 0xEF, 0x25, 0x25, 0x98, 0x71, 0xE4, 0x77, 0x42, 0xD4, 0x71, 0xE2, 0x6F, 0xF0, 0x75, 0xE9, 0xE9 }, - }, - { - { 0x01, 0xF1, 0x14, 0x28, 0x67, 0x99, 0xEA, 0x8B, 0x24, 0x08, 0xE3, 0xDA, 0xBE, 0x90, 0xF3, 0xAD, - 0xEA, 0x20, 0x46, 0x32, 0xAA, 0x3B, 0x82, 0xD2, 0xE5, 0x5A, 0x8D, 0xCF, 0x5B, 0x7E, 0xD7, 0xAD }, - }, - { - { 0x01, 0xFC, 0xEB, 0xF0, 0x6A, 0xF4, 0x9D, 0x87, 0x8A, 0xF9, 0xBD, 0x57, 0xE1, 0x2D, 0xBE, 0xA7, - 0xEB, 0x80, 0x12, 0x0F, 0x7C, 0x10, 0xCD, 0x1A, 0x1A, 0x98, 0x89, 0x8E, 0xD8, 0xE7, 0xEC, 0x4C }, - }, { { 0x02, 0x01, 0x4E, 0x80, 0xF5, 0xC4, 0xF3, 0x8B, 0xA9, 0xD9, 0x04, 0x79, 0x1A, 0x63, 0xF6, 0x4D, 0x05, 0xF9, 0xE2, 0x03, 0xA1, 0xF1, 0x2B, 0x06, 0xD6, 0x55, 0x94, 0x01, 0x41, 0x0E, 0x73, 0x36 }, }, - { - { 0x02, 0x08, 0x22, 0xAB, 0x1B, 0x8C, 0xC0, 0xD8, 0x22, 0x03, 0x60, 0xA1, 0xAF, 0x8B, 0xB4, 0xD9, - 0xBE, 0x60, 0xE8, 0x43, 0x9E, 0x2B, 0xA3, 0x07, 0x8D, 0x61, 0xF4, 0x01, 0xE1, 0x5B, 0x41, 0xBC }, - }, { { 0x02, 0x35, 0x38, 0xE2, 0x48, 0x15, 0x28, 0x75, 0x29, 0x2F, 0x2C, 0x83, 0x9A, 0xB3, 0x2B, 0xC7, 0x35, 0x1E, 0x2B, 0x29, 0x99, 0x1D, 0x66, 0xAE, 0xA6, 0x16, 0xCB, 0x0B, 0x26, 0xA5, 0xE3, 0x75 }, }, - { - { 0x02, 0x61, 0x53, 0xE5, 0x91, 0xCD, 0x82, 0xF7, 0xBD, 0xCE, 0x99, 0xB3, 0xBA, 0x10, 0xA8, 0xD6, - 0x90, 0x24, 0xC6, 0x36, 0xD3, 0x5D, 0xAB, 0x1A, 0x95, 0x6C, 0x7D, 0x7A, 0xEF, 0x80, 0x3A, 0xDE }, - }, - { - { 0x02, 0xC4, 0x8C, 0x3A, 0xDC, 0xF9, 0x9F, 0x28, 0xF4, 0x79, 0xB8, 0xF6, 0x79, 0x88, 0x77, 0x78, - 0xB9, 0x3A, 0x06, 0xAF, 0xF1, 0x6E, 0x35, 0x8F, 0x40, 0x9B, 0xC6, 0xFE, 0x54, 0x03, 0x04, 0xC6 }, - }, { { 0x02, 0xEC, 0x35, 0xF5, 0x83, 0x4C, 0xD2, 0xC3, 0x43, 0x33, 0x39, 0x9A, 0xEA, 0x6B, 0xDA, 0x84, 0x68, 0xAB, 0x8D, 0x74, 0xEF, 0x6C, 0xA5, 0x2D, 0x33, 0x7A, 0x30, 0x69, 0x4C, 0x3F, 0x95, 0xA4 }, }, - { - { 0x03, 0x2A, 0x7E, 0x55, 0xFE, 0xC3, 0x74, 0xC6, 0xD7, 0x9C, 0xFF, 0xDB, 0x46, 0x7C, 0x5C, 0xCD, - 0x56, 0xF5, 0x49, 0x0A, 0xAE, 0x9A, 0xF1, 0xBC, 0xCC, 0x7E, 0x54, 0xDA, 0xFA, 0x6D, 0x8A, 0x3F }, - }, - { - { 0x03, 0x33, 0xB3, 0x91, 0x64, 0xD6, 0x25, 0xF0, 0x1D, 0x50, 0x83, 0xDE, 0x2F, 0xB1, 0xE2, 0x5D, - 0x89, 0x34, 0x29, 0x69, 0x0F, 0xA5, 0xD7, 0x7D, 0x84, 0x90, 0x1E, 0xD1, 0x9B, 0x22, 0x1D, 0xF3 }, - }, - { - { 0x03, 0x83, 0xF9, 0xC1, 0xF5, 0xC8, 0x4C, 0x02, 0x64, 0xE6, 0x3B, 0x2A, 0x96, 0x21, 0x21, 0x37, - 0x58, 0x70, 0x0D, 0x1A, 0xFB, 0x61, 0xF8, 0x00, 0x1F, 0x3E, 0xFF, 0x81, 0x44, 0xE6, 0xFE, 0x73 }, - }, - { - { 0x03, 0xD9, 0x9F, 0x24, 0xF8, 0x64, 0x4B, 0x80, 0x4D, 0x8E, 0x3B, 0xC9, 0xC8, 0x7C, 0x02, 0x4E, - 0x4B, 0xB7, 0x0D, 0xC6, 0x30, 0x1B, 0xCD, 0xE3, 0x24, 0x12, 0xB4, 0xCE, 0x8C, 0x0C, 0x14, 0x58 }, - }, - { - { 0x03, 0xDE, 0x42, 0xAF, 0x1F, 0x30, 0x9F, 0x95, 0xF6, 0xC8, 0x91, 0x03, 0xEA, 0x98, 0x7E, 0x84, - 0xD3, 0x18, 0x6B, 0x60, 0x65, 0xF9, 0x60, 0x7A, 0x06, 0x6A, 0x30, 0x2B, 0x58, 0x05, 0xEB, 0x3B }, - }, { { 0x03, 0xE0, 0x6E, 0x0B, 0x7A, 0x2C, 0xBA, 0xE4, 0xB6, 0x8B, 0xCE, 0x5F, 0x83, 0xE7, 0xA9, 0x31, 0x6E, 0xD7, 0x82, 0x3E, 0x8D, 0x94, 0x85, 0x38, 0xF1, 0x94, 0x3F, 0xA4, 0x27, 0xD7, 0x91, 0x0E }, @@ -124,62 +44,6 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x04, 0x18, 0xD5, 0x3E, 0xBC, 0x8E, 0x71, 0x41, 0x25, 0x1B, 0x4D, 0xC8, 0xFA, 0x7B, 0x2B, 0xD8, 0xFD, 0x3A, 0x1C, 0x65, 0x2A, 0xA1, 0x16, 0xE7, 0xFC, 0x70, 0x0B, 0x2A, 0xB5, 0x1A, 0x2A, 0x1A }, }, - { - { 0x04, 0x3E, 0xD7, 0xFF, 0x71, 0xBD, 0x65, 0xAE, 0x28, 0x35, 0xB0, 0xCB, 0x38, 0x74, 0x8D, 0x0B, - 0x08, 0x5F, 0x86, 0xF7, 0x5F, 0x2A, 0x96, 0xC8, 0xD4, 0x64, 0x00, 0x89, 0xBC, 0x58, 0x3D, 0x7B }, - }, - { - { 0x04, 0x49, 0x38, 0x0A, 0x30, 0xBD, 0x6D, 0xBD, 0x55, 0xDF, 0xE2, 0x54, 0xC8, 0x20, 0xA0, 0x77, - 0xFF, 0x11, 0xCA, 0xFC, 0x83, 0xB5, 0x0E, 0x0A, 0x13, 0xF1, 0x3D, 0x59, 0xD3, 0xCA, 0x6C, 0xAF }, - }, - { - { 0x04, 0x6F, 0xDA, 0x46, 0xF0, 0xC4, 0x7B, 0x4A, 0x4D, 0x90, 0x31, 0x03, 0x7B, 0x33, 0xDB, 0xAC, - 0x99, 0x86, 0x1B, 0x7F, 0x0F, 0x85, 0x1D, 0x15, 0x1A, 0x83, 0x29, 0xF8, 0x42, 0x1B, 0x41, 0x5E }, - }, - { - { 0x04, 0x71, 0x57, 0x2C, 0x03, 0x03, 0x7D, 0xEE, 0x2B, 0x40, 0x09, 0x6E, 0xE8, 0xAA, 0x37, 0x82, - 0xC6, 0xFA, 0x81, 0x42, 0xCC, 0xA2, 0x68, 0x19, 0x09, 0xDA, 0xE8, 0xC4, 0x66, 0xD0, 0x58, 0x4E }, - }, - { - { 0x04, 0x80, 0x71, 0x3A, 0x76, 0x91, 0x7E, 0xB1, 0x7F, 0xB5, 0x4C, 0x93, 0xEE, 0xD3, 0xFD, 0x8A, - 0x98, 0x2B, 0xD9, 0x06, 0x9C, 0x69, 0xAB, 0xEA, 0xDE, 0xB2, 0x5A, 0x76, 0xD9, 0xA5, 0x90, 0x65 }, - }, - { - { 0x04, 0x8A, 0x21, 0x7A, 0xD4, 0x4E, 0x00, 0xCA, 0xD1, 0xEB, 0xEE, 0x67, 0x23, 0x51, 0xD2, 0x89, - 0x10, 0xAF, 0x69, 0xED, 0x4D, 0x45, 0x5A, 0xEF, 0x42, 0x76, 0x23, 0xF7, 0xD7, 0xAD, 0xDE, 0xC7 }, - }, - { - { 0x04, 0xA6, 0x4D, 0xD4, 0x31, 0x97, 0xC6, 0x2C, 0x2C, 0xD3, 0xB6, 0x0B, 0xDF, 0x30, 0x5B, 0x3E, - 0x81, 0xE5, 0xF5, 0x00, 0x2C, 0x15, 0x78, 0x59, 0xFB, 0xB7, 0xB4, 0x85, 0x45, 0xE6, 0x49, 0x11 }, - }, - { - { 0x04, 0xDE, 0x66, 0x05, 0x94, 0x63, 0xAF, 0xD2, 0xC1, 0x1E, 0x9E, 0x4F, 0xD6, 0xAE, 0x55, 0x07, - 0xEF, 0x68, 0xEF, 0x91, 0x54, 0x0C, 0x41, 0x0C, 0x32, 0xA8, 0xF0, 0x24, 0x62, 0x5F, 0x6B, 0xB0 }, - }, - { - { 0x05, 0x2E, 0xEB, 0x25, 0xB7, 0x24, 0xBA, 0x44, 0xF4, 0x81, 0xBE, 0x5C, 0x80, 0xFD, 0xB5, 0x5F, - 0x36, 0xB8, 0xD9, 0xBC, 0xE6, 0x45, 0xB2, 0x2F, 0xA1, 0x35, 0xC7, 0xD9, 0x74, 0xCB, 0xF6, 0xFE }, - }, - { - { 0x05, 0x4F, 0xF2, 0x4D, 0xD5, 0x0D, 0x49, 0x84, 0x68, 0x3B, 0x8B, 0xB0, 0x1A, 0xDE, 0xE5, 0xA8, - 0x73, 0x1F, 0x7C, 0x24, 0xCD, 0x11, 0x6F, 0x5A, 0xC6, 0x75, 0xE0, 0x17, 0x33, 0xCA, 0xD1, 0x83 }, - }, - { - { 0x05, 0x64, 0x05, 0x92, 0x8F, 0xDC, 0x6D, 0xFC, 0x08, 0xCD, 0x89, 0x88, 0x63, 0x0E, 0xE2, 0xD8, - 0x23, 0x5A, 0x62, 0xFC, 0xD1, 0xDB, 0xC9, 0x12, 0xA6, 0x52, 0xA3, 0xFD, 0xAC, 0xD4, 0xF3, 0x51 }, - }, - { - { 0x05, 0x69, 0xC6, 0xC6, 0x2A, 0x75, 0xA3, 0x9B, 0x82, 0x4F, 0x48, 0x77, 0xC8, 0x8E, 0xC0, 0x08, - 0x9C, 0x09, 0x42, 0x58, 0x1E, 0x38, 0x77, 0xFF, 0xF9, 0x19, 0x50, 0xEA, 0x0F, 0x9D, 0xD4, 0xFE }, - }, - { - { 0x05, 0xA7, 0xAF, 0xA3, 0x20, 0x08, 0xFE, 0x48, 0x46, 0x29, 0x67, 0xE7, 0xF8, 0x79, 0x9F, 0x72, - 0x48, 0x71, 0x80, 0xEC, 0x0F, 0x68, 0xBA, 0xF7, 0x96, 0x7A, 0x87, 0xFA, 0x0A, 0x75, 0xCF, 0xAA }, - }, - { - { 0x06, 0x17, 0xF8, 0xBC, 0x10, 0x4C, 0x24, 0x0A, 0x8E, 0x33, 0x42, 0x82, 0x00, 0x29, 0x1D, 0xB3, - 0xA6, 0xA0, 0x67, 0x70, 0x90, 0xCB, 0x02, 0x39, 0x9F, 0xFD, 0x88, 0x75, 0xB9, 0x05, 0xB1, 0x1F }, - }, { { 0x06, 0xD4, 0x08, 0xFF, 0xA9, 0x93, 0xAF, 0x04, 0x45, 0x9C, 0x45, 0x67, 0x1A, 0xAB, 0xD8, 0x7E, 0xF9, 0x2B, 0x85, 0x6B, 0x1B, 0x42, 0xC6, 0x7E, 0x00, 0x5E, 0xB4, 0xD2, 0x71, 0x58, 0xA8, 0x42 }, @@ -188,22 +52,10 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x07, 0x19, 0x4F, 0x47, 0xF4, 0xCE, 0xD0, 0x96, 0xD1, 0x06, 0x8D, 0x34, 0x49, 0x3B, 0x67, 0x37, 0x14, 0x45, 0x16, 0x93, 0xA6, 0xA2, 0x71, 0x2F, 0x70, 0x8F, 0x59, 0x36, 0x12, 0x11, 0xC6, 0x21 }, }, - { - { 0x07, 0x3C, 0xA3, 0x1D, 0x60, 0x08, 0x54, 0xA8, 0x29, 0x9A, 0xFF, 0x74, 0xE9, 0x8A, 0xC1, 0xED, - 0x48, 0x2A, 0xCA, 0x06, 0x8E, 0xC5, 0x90, 0x61, 0x54, 0xEA, 0x24, 0x7B, 0x6C, 0x27, 0x6E, 0xE9 }, - }, - { - { 0x07, 0x76, 0x08, 0x6A, 0x5A, 0x31, 0x72, 0x42, 0xA2, 0x50, 0x4C, 0x45, 0x3C, 0x89, 0xFF, 0xD3, - 0xC4, 0xF3, 0xA3, 0x6C, 0x46, 0xBE, 0xB3, 0xF5, 0xF3, 0x55, 0xDB, 0x47, 0x6D, 0xD7, 0x7C, 0x19 }, - }, { { 0x07, 0x8F, 0xEE, 0x58, 0x8A, 0x2C, 0x55, 0xC8, 0xE2, 0xC1, 0x78, 0x71, 0xAA, 0xB6, 0xE4, 0x00, 0xB3, 0xFD, 0xBC, 0xDC, 0xF3, 0x91, 0x46, 0xA0, 0x89, 0x37, 0xF9, 0xAC, 0x06, 0xA1, 0xB8, 0xBD }, }, - { - { 0x07, 0xA9, 0x5C, 0x81, 0xED, 0x15, 0x9E, 0x44, 0xA0, 0x41, 0x2B, 0xDE, 0xB1, 0x31, 0xA1, 0x1F, - 0x26, 0xE3, 0x4E, 0x51, 0x67, 0xEC, 0xF2, 0x11, 0x78, 0xF3, 0xEF, 0xBF, 0xB3, 0xA2, 0xBB, 0x72 }, - }, { { 0x07, 0xE9, 0x60, 0x9E, 0x05, 0xDC, 0x0A, 0x1E, 0x52, 0x15, 0x06, 0x49, 0xEB, 0xF4, 0x1F, 0x6D, 0xE3, 0x86, 0x7C, 0x9C, 0x25, 0xFE, 0x17, 0x7B, 0xAB, 0xCF, 0xD9, 0xB3, 0x70, 0x46, 0x13, 0x8B }, @@ -216,58 +68,22 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x08, 0xC2, 0xD3, 0x17, 0xA8, 0x4A, 0x3C, 0xBE, 0x38, 0xDE, 0x64, 0xA2, 0x4D, 0xD4, 0x27, 0x91, 0x09, 0xE2, 0xBC, 0x02, 0x2B, 0x93, 0xB1, 0x05, 0xA8, 0x94, 0xA5, 0x1A, 0xDC, 0x3E, 0xE5, 0xCC }, }, - { - { 0x08, 0xC7, 0xB0, 0x23, 0xA9, 0x9A, 0x63, 0x74, 0x13, 0xDE, 0x2C, 0x9D, 0x88, 0x09, 0x82, 0x33, - 0x8D, 0x09, 0x36, 0xF1, 0x21, 0x25, 0x1E, 0x75, 0x58, 0x59, 0x12, 0x62, 0x92, 0xF9, 0x6B, 0x1A }, - }, - { - { 0x09, 0x06, 0x86, 0xA8, 0x02, 0xD8, 0x42, 0x73, 0x06, 0x33, 0x5B, 0xC4, 0x63, 0x5F, 0x95, 0x8F, - 0x90, 0xB2, 0x76, 0xEB, 0x7B, 0x1A, 0x62, 0x7C, 0xBE, 0xA7, 0xF8, 0xA1, 0xD2, 0x44, 0xEE, 0x8A }, - }, - { - { 0x09, 0x1F, 0x0A, 0xDD, 0x81, 0x63, 0xC3, 0x11, 0xB3, 0xDF, 0x6C, 0x8A, 0xBA, 0x7B, 0xD3, 0x35, - 0x0C, 0x52, 0xC4, 0xFC, 0xAE, 0xC1, 0x67, 0x62, 0xF6, 0x64, 0xC4, 0xCB, 0xDC, 0xC5, 0x77, 0xC8 }, - }, - { - { 0x09, 0x35, 0x58, 0xED, 0xE2, 0x67, 0x67, 0x32, 0x63, 0x49, 0xE7, 0xBE, 0xBC, 0x8C, 0x77, 0x02, - 0x94, 0xC4, 0x42, 0xA7, 0x2E, 0x6C, 0x98, 0x0E, 0xA0, 0x4E, 0xFA, 0x90, 0x07, 0x30, 0x81, 0x3E }, - }, { { 0x09, 0x9F, 0x3E, 0x71, 0xB5, 0x00, 0xD1, 0x5B, 0x03, 0x7B, 0x93, 0xAA, 0x5F, 0xB4, 0x16, 0x19, 0x0A, 0xD1, 0xDF, 0x86, 0x73, 0xAB, 0x31, 0xA8, 0xF6, 0xD9, 0x7F, 0x59, 0x5E, 0x8E, 0x16, 0xE9 }, }, - { - { 0x09, 0xA2, 0xC1, 0x4E, 0x5D, 0x62, 0xC3, 0x4A, 0xA7, 0x06, 0xFF, 0xAB, 0xD2, 0x1E, 0x7A, 0xD2, - 0x25, 0xF6, 0x25, 0xF7, 0x1F, 0xF8, 0x9D, 0xB3, 0x9B, 0x32, 0x2A, 0xCB, 0x0C, 0x84, 0x57, 0x4F }, - }, - { - { 0x09, 0xA5, 0x9E, 0x8B, 0x56, 0xFD, 0x2B, 0xA0, 0xAC, 0x68, 0x5C, 0xB6, 0xF7, 0x51, 0xA0, 0x2F, - 0x83, 0x5C, 0x68, 0x50, 0x81, 0xA2, 0xD5, 0xDC, 0x02, 0xB0, 0x4E, 0x9B, 0x3B, 0xC7, 0xC8, 0xBC }, - }, { { 0x09, 0xEB, 0xDD, 0x1B, 0x7F, 0xFA, 0x4E, 0xD7, 0x4B, 0xEB, 0xAE, 0x96, 0xBA, 0x10, 0x65, 0xDC, 0x7D, 0xA1, 0xC5, 0xD3, 0x18, 0x3C, 0xC5, 0x94, 0x19, 0xE9, 0x78, 0x36, 0xAF, 0x7F, 0x6D, 0x70 }, }, - { - { 0x09, 0xFC, 0x8C, 0xAD, 0x2C, 0xE7, 0x52, 0x3C, 0xDB, 0xED, 0x70, 0x5F, 0xDA, 0x4B, 0x22, 0x8C, - 0xD4, 0xBB, 0xA3, 0xB7, 0xF9, 0xF2, 0x50, 0xEA, 0x6B, 0xE2, 0x3C, 0x17, 0x00, 0xA5, 0x1C, 0xE5 }, - }, { { 0x0A, 0x01, 0x88, 0x81, 0x2C, 0x9D, 0xE8, 0x8A, 0x2F, 0x0A, 0x5C, 0x4C, 0x57, 0xE6, 0xF9, 0xA8, 0x15, 0x69, 0xE9, 0xC7, 0x09, 0xC0, 0x95, 0x40, 0x80, 0xE5, 0xE4, 0xE6, 0x62, 0x85, 0x6D, 0xF8 }, }, - { - { 0x0A, 0x35, 0xB0, 0xDA, 0x94, 0xB8, 0xA4, 0xB4, 0xAE, 0xB6, 0x32, 0xB0, 0x90, 0xC8, 0xA3, 0xC0, - 0x81, 0x9B, 0xC6, 0x74, 0x99, 0xF8, 0x92, 0x8B, 0xF6, 0x8E, 0xB2, 0xFF, 0x4E, 0xD4, 0x29, 0x51 }, - }, { { 0x0A, 0x42, 0x19, 0x7E, 0x48, 0x70, 0xB2, 0x34, 0x20, 0xF5, 0x51, 0x9F, 0xB8, 0x39, 0xB6, 0xCC, 0x83, 0x03, 0x52, 0x9A, 0xA9, 0x06, 0x9A, 0xD1, 0xA0, 0x90, 0x86, 0xCF, 0x6C, 0xBA, 0x07, 0xC2 }, }, - { - { 0x0A, 0xB1, 0xB1, 0x53, 0x74, 0x59, 0x75, 0x6C, 0xD4, 0x1C, 0x02, 0x6D, 0x46, 0x83, 0x64, 0x3A, - 0xC1, 0x6C, 0xF9, 0xCB, 0x1C, 0x28, 0xBD, 0x27, 0x8A, 0x18, 0x53, 0x52, 0x30, 0xD6, 0xE4, 0x93 }, - }, { { 0x0B, 0x03, 0xE1, 0x27, 0xC2, 0xE3, 0x3E, 0xAD, 0xBC, 0xB0, 0x99, 0x80, 0x46, 0xCC, 0x9B, 0xA7, 0x33, 0x46, 0x3E, 0x0C, 0xA6, 0x43, 0x52, 0x27, 0x81, 0xB0, 0x3D, 0x81, 0x53, 0x97, 0xEB, 0x4F }, @@ -276,62 +92,22 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x0B, 0x1E, 0x1E, 0x73, 0x43, 0xA0, 0xE9, 0x1C, 0x2A, 0x27, 0xDD, 0x2A, 0x4D, 0x7E, 0x6B, 0xF1, 0xE8, 0x04, 0x4B, 0x58, 0xCE, 0x1A, 0xE8, 0x1E, 0x27, 0xD8, 0x14, 0xFD, 0x2D, 0xC0, 0x18, 0x93 }, }, - { - { 0x0B, 0x23, 0x83, 0x47, 0x04, 0xD5, 0x51, 0xF9, 0x14, 0xD0, 0xAE, 0xD0, 0x6A, 0x5F, 0x1A, 0x72, - 0x48, 0x11, 0xDB, 0x55, 0x18, 0x00, 0x4C, 0xB2, 0xC3, 0x8C, 0xF9, 0x71, 0x49, 0x64, 0xDB, 0x21 }, - }, - { - { 0x0B, 0x28, 0x58, 0xC0, 0x3B, 0xA3, 0xF1, 0x10, 0x18, 0x68, 0x8E, 0xC6, 0x2F, 0x1C, 0x17, 0x30, - 0xDC, 0xA2, 0x20, 0x48, 0x57, 0xCE, 0x5F, 0xAD, 0xB6, 0x6C, 0xE6, 0x6B, 0xDA, 0xB1, 0x70, 0x3D }, - }, - { - { 0x0B, 0x3D, 0x17, 0x8D, 0x8A, 0x68, 0x43, 0x73, 0x19, 0x35, 0x9F, 0xA3, 0x54, 0x28, 0x65, 0xAD, - 0xE1, 0x20, 0x02, 0x9A, 0xBE, 0x5B, 0x02, 0xBA, 0xFF, 0xBE, 0x98, 0x8B, 0x2A, 0x14, 0x46, 0x3D }, - }, - { - { 0x0B, 0x45, 0xC6, 0x0D, 0xE2, 0x72, 0x59, 0xC9, 0x59, 0x56, 0x71, 0xCE, 0xA0, 0xBE, 0x71, 0x1E, - 0x0F, 0x64, 0x49, 0xEE, 0xC6, 0x19, 0x88, 0x3A, 0x6C, 0x39, 0x3D, 0xCE, 0x51, 0x85, 0xA7, 0xAC }, - }, { { 0x0B, 0x48, 0xD5, 0x5C, 0xAC, 0x84, 0xFD, 0xEE, 0x15, 0xD8, 0x1A, 0xFF, 0x99, 0x07, 0xBB, 0x9A, 0x57, 0x11, 0xA9, 0x5C, 0xE2, 0x3A, 0x8D, 0x4D, 0x5E, 0x88, 0x62, 0xBF, 0x15, 0xA7, 0x6A, 0x75 }, }, - { - { 0x0B, 0x85, 0xEA, 0x41, 0xE5, 0x44, 0x13, 0x86, 0xC9, 0x44, 0xE8, 0x1D, 0x47, 0xEC, 0x0F, 0x42, - 0x0B, 0x54, 0xE5, 0x11, 0x14, 0x38, 0xCB, 0x5A, 0x1C, 0xBD, 0x53, 0xC7, 0x8E, 0x7E, 0xD2, 0xA6 }, - }, { { 0x0B, 0xFE, 0xA1, 0x38, 0x31, 0x67, 0x3E, 0xC9, 0x69, 0xD0, 0x5F, 0xD8, 0x67, 0xB6, 0x69, 0xF2, 0x71, 0x24, 0xAF, 0xEB, 0x7C, 0x60, 0x8C, 0xFE, 0x54, 0xCF, 0x46, 0x33, 0x06, 0xCC, 0x99, 0x2E }, }, - { - { 0x0C, 0x02, 0xA0, 0x08, 0xA4, 0x98, 0xD9, 0x82, 0x26, 0x80, 0xEC, 0x09, 0x73, 0x3B, 0x15, 0xCF, - 0xE2, 0x66, 0x30, 0xDA, 0x43, 0x94, 0x65, 0x82, 0xE5, 0xDA, 0xCA, 0x43, 0x89, 0x9D, 0x5F, 0x6F }, - }, - { - { 0x0C, 0x14, 0xF5, 0x4B, 0x4A, 0xE1, 0xD2, 0xBC, 0xA2, 0x83, 0x40, 0x09, 0x0E, 0x37, 0x37, 0x6C, - 0xFD, 0xE7, 0x78, 0x4A, 0xA7, 0x20, 0xB3, 0x55, 0x9C, 0x42, 0xD8, 0xC9, 0x4F, 0x44, 0xCB, 0x04 }, - }, - { - { 0x0C, 0xA8, 0x11, 0xFE, 0xDB, 0x74, 0xBE, 0xAD, 0x8B, 0xB6, 0xA9, 0xEF, 0x22, 0xE7, 0x3A, 0x5F, - 0x5F, 0x3F, 0x38, 0x53, 0xFD, 0xE6, 0xDB, 0xE3, 0xF6, 0xA2, 0xD8, 0xEF, 0x7F, 0x62, 0x27, 0x3A }, - }, { { 0x0C, 0xB9, 0x31, 0x93, 0xF1, 0x65, 0x26, 0xE1, 0xD1, 0x65, 0x52, 0x11, 0x7B, 0xA2, 0x1A, 0xAC, 0xB9, 0xF1, 0xD7, 0xA8, 0x93, 0x56, 0xA3, 0x5D, 0xE4, 0xF6, 0x65, 0xE9, 0x39, 0x90, 0x79, 0x38 }, }, - { - { 0x0D, 0x01, 0xD9, 0x55, 0x23, 0x47, 0x90, 0x24, 0x17, 0x4E, 0x8D, 0xC1, 0x05, 0x00, 0x90, 0x39, - 0xE7, 0x3C, 0x0B, 0xC6, 0x34, 0x66, 0x54, 0x6D, 0x91, 0xFA, 0xCD, 0x29, 0xAA, 0x39, 0x13, 0xC6 }, - }, { { 0x0D, 0x16, 0x1B, 0xB9, 0xCA, 0x0D, 0x20, 0xE4, 0x67, 0x35, 0x89, 0x67, 0x22, 0x78, 0xB0, 0xA3, 0xC5, 0xE2, 0x69, 0x30, 0xA4, 0xDC, 0x3A, 0x82, 0x16, 0x85, 0x43, 0x24, 0x27, 0xC7, 0x31, 0x5A }, }, - { - { 0x0D, 0x18, 0x5D, 0x97, 0x79, 0xAC, 0xFE, 0x41, 0x89, 0x12, 0xB5, 0x9E, 0xF7, 0xCD, 0x42, 0x8B, - 0xD4, 0xBC, 0x7F, 0x2B, 0xCD, 0xED, 0x9E, 0xAD, 0xAB, 0x55, 0xF0, 0x66, 0xE2, 0x9E, 0xDF, 0x4F }, - }, { { 0x0D, 0x66, 0x45, 0x6B, 0x0B, 0xF4, 0xAA, 0x54, 0x16, 0xE4, 0x4D, 0x9F, 0xDB, 0x40, 0x38, 0x3D, 0x34, 0x3D, 0x7B, 0x3F, 0x6A, 0xFE, 0x69, 0xAA, 0x08, 0x95, 0xBB, 0x1A, 0xB5, 0xE0, 0x61, 0xA0 }, @@ -340,30 +116,6 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x0D, 0x71, 0xC8, 0xCA, 0x16, 0x56, 0x59, 0xEF, 0xAF, 0x69, 0x65, 0x29, 0x28, 0x9A, 0xAE, 0x25, 0xD9, 0xC4, 0x2A, 0x1B, 0xBB, 0x03, 0x5A, 0x2B, 0x8C, 0x61, 0x14, 0x7E, 0x1B, 0x8B, 0x90, 0x52 }, }, - { - { 0x0D, 0xAB, 0xAE, 0xCB, 0x0D, 0x12, 0x9B, 0xC6, 0x36, 0xE8, 0x4A, 0x4B, 0x23, 0x93, 0x46, 0x03, - 0x06, 0xAB, 0x49, 0xBD, 0x03, 0xE2, 0x22, 0xEE, 0x79, 0x2A, 0x36, 0x9E, 0x6E, 0x4F, 0x70, 0x72 }, - }, - { - { 0x0D, 0xE7, 0xAB, 0x16, 0xC8, 0xC2, 0xAB, 0x33, 0x4A, 0x01, 0x65, 0x96, 0x97, 0x41, 0x5A, 0x9E, - 0x28, 0x02, 0xEE, 0xDC, 0x41, 0xAC, 0xF7, 0x46, 0x92, 0x41, 0xE2, 0xD3, 0x9B, 0x97, 0x9D, 0x81 }, - }, - { - { 0x0E, 0x23, 0x35, 0x4D, 0xE8, 0xD0, 0xE4, 0x79, 0xCA, 0x89, 0xA3, 0x0F, 0xD3, 0xEF, 0x7E, 0x20, - 0xBF, 0xC2, 0x80, 0x39, 0x8D, 0x4C, 0xDC, 0x28, 0x18, 0x79, 0xDA, 0x66, 0xEA, 0xD3, 0x73, 0xD0 }, - }, - { - { 0x0E, 0x4F, 0xD8, 0x53, 0xD6, 0x0F, 0xD7, 0x69, 0x90, 0xD7, 0x77, 0xAF, 0x09, 0x79, 0xD4, 0x65, - 0x16, 0xBD, 0xC9, 0x09, 0xA8, 0xD9, 0xD5, 0xEF, 0x70, 0x15, 0x59, 0xBF, 0x74, 0x62, 0xC4, 0xAF }, - }, - { - { 0x0E, 0x56, 0x71, 0x6D, 0xD3, 0xC1, 0x83, 0xAA, 0x5D, 0xE0, 0xD3, 0x96, 0x89, 0x88, 0x94, 0xF0, - 0x03, 0xAA, 0xFF, 0x06, 0x2E, 0x15, 0x82, 0x33, 0xEF, 0xFB, 0x5B, 0xC9, 0xE8, 0x33, 0x71, 0x4B }, - }, - { - { 0x0E, 0x67, 0x06, 0x78, 0x44, 0xAA, 0xC4, 0xC8, 0xC3, 0x56, 0xE7, 0xAA, 0xB8, 0x6B, 0x58, 0xB0, - 0x14, 0x21, 0x03, 0x87, 0xD2, 0xC1, 0x55, 0xDE, 0x71, 0x94, 0x08, 0x65, 0x12, 0xCF, 0x09, 0xDE }, - }, { { 0x0E, 0xFD, 0x68, 0x73, 0xD6, 0x0E, 0x77, 0x96, 0x2D, 0xF6, 0x00, 0x16, 0xDC, 0x3B, 0xAF, 0x9C, 0xA7, 0x1E, 0x7D, 0x86, 0x19, 0xE7, 0xEB, 0xAA, 0x3A, 0xF2, 0xDC, 0xB5, 0xBA, 0x24, 0xDE, 0xC2 }, @@ -372,86 +124,14 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x0E, 0xFF, 0x3C, 0xFF, 0xDA, 0x4A, 0x3E, 0x87, 0x23, 0x4A, 0x86, 0xC7, 0x0D, 0x49, 0x8C, 0x62, 0x60, 0x7F, 0x37, 0x44, 0xEA, 0x71, 0xF1, 0x83, 0x1D, 0xCF, 0xCA, 0xF3, 0xAF, 0x15, 0x56, 0x9C }, }, - { - { 0x0F, 0x07, 0xAA, 0xD7, 0xAC, 0x55, 0x6F, 0x85, 0x86, 0xCB, 0xF3, 0x47, 0x8F, 0x2E, 0xC0, 0xB5, - 0x29, 0xCA, 0x46, 0x5B, 0x19, 0x3F, 0xC2, 0xA6, 0xE1, 0x93, 0x28, 0x3A, 0xD8, 0xD7, 0xA5, 0x50 }, - }, - { - { 0x0F, 0x2C, 0x25, 0x7A, 0xFB, 0xE8, 0x25, 0x5D, 0x2D, 0x6F, 0x4D, 0x52, 0xC4, 0xE5, 0x31, 0x59, - 0xB7, 0xBA, 0x96, 0xF9, 0xBA, 0x07, 0xFA, 0x6D, 0x8C, 0xE1, 0xD0, 0xAC, 0x03, 0x3C, 0x17, 0xF7 }, - }, - { - { 0x0F, 0x43, 0xFC, 0x12, 0x47, 0x01, 0xFE, 0x29, 0xB7, 0x14, 0xF3, 0x05, 0xE2, 0x61, 0xB6, 0x32, - 0x04, 0x82, 0xC0, 0x09, 0x6F, 0xFE, 0xAD, 0x35, 0xE1, 0xF8, 0xE6, 0x32, 0xC6, 0x4D, 0x7B, 0x20 }, - }, - { - { 0x0F, 0x57, 0xED, 0x67, 0x2B, 0xAC, 0x50, 0x14, 0x89, 0xE4, 0xF4, 0xAB, 0x4B, 0x1D, 0xB1, 0x75, - 0x81, 0xFE, 0xB8, 0x76, 0x0F, 0xFB, 0xC0, 0x8A, 0x82, 0x83, 0xE0, 0xF8, 0x41, 0xAE, 0x01, 0x3C }, - }, - { - { 0x10, 0x14, 0xB6, 0xDB, 0xF3, 0xC9, 0x11, 0xEB, 0x21, 0x6F, 0xE6, 0xEC, 0xE6, 0x8C, 0xA9, 0x37, - 0x92, 0xCC, 0xCB, 0xD3, 0xC3, 0x9C, 0xBF, 0x83, 0xE8, 0x93, 0xD4, 0x4D, 0x5E, 0x4F, 0x00, 0xDB }, - }, - { - { 0x10, 0x7F, 0xA4, 0x31, 0x4E, 0x09, 0x74, 0x84, 0x8A, 0x9C, 0x14, 0xE0, 0x62, 0x10, 0x44, 0x7B, - 0x0A, 0xDF, 0xB8, 0x26, 0xB3, 0xE5, 0xBF, 0x88, 0x76, 0x93, 0x1F, 0xF4, 0x80, 0x74, 0x02, 0x01 }, - }, { { 0x10, 0x83, 0x6D, 0xA0, 0xCD, 0x6A, 0xC0, 0x95, 0xDD, 0x7A, 0xC3, 0x4D, 0x99, 0x01, 0x90, 0x9A, 0x8E, 0xF8, 0x4D, 0x6E, 0xE0, 0x5B, 0x83, 0x43, 0x03, 0xD4, 0x7F, 0xC0, 0xA5, 0xF9, 0x14, 0xFA }, }, - { - { 0x10, 0xCF, 0x15, 0xBB, 0x1E, 0xA3, 0x0B, 0xB4, 0xA2, 0xE5, 0x39, 0x1C, 0x39, 0xAF, 0xA3, 0xA9, - 0x96, 0xC8, 0x53, 0x22, 0xB1, 0x1F, 0xDE, 0xD5, 0xFB, 0x84, 0x80, 0x35, 0x5C, 0x78, 0x3E, 0xAD }, - }, - { - { 0x10, 0xDC, 0x64, 0x9C, 0x0A, 0x35, 0x20, 0x69, 0x0B, 0x49, 0xA8, 0x97, 0xEA, 0xB4, 0x97, 0xF4, - 0x38, 0x81, 0x0D, 0x28, 0x4F, 0xCB, 0xF2, 0x22, 0xA1, 0xDE, 0x45, 0x27, 0x1D, 0x1C, 0xCF, 0x17 }, - }, - { - { 0x11, 0x59, 0xD3, 0x5C, 0x9C, 0x09, 0xEF, 0x77, 0xCB, 0xEA, 0x92, 0x2E, 0xF5, 0xBB, 0xB0, 0x36, - 0x51, 0x11, 0x65, 0x52, 0x7A, 0xCF, 0x44, 0xAA, 0xB5, 0xDE, 0x87, 0x5E, 0x2F, 0x51, 0xA2, 0xDD }, - }, - { - { 0x11, 0x65, 0x97, 0x60, 0x44, 0x7F, 0xB6, 0x8D, 0x4F, 0xBB, 0x37, 0x6E, 0x3B, 0x66, 0xB1, 0x94, - 0xDA, 0x3E, 0xE0, 0x42, 0x5A, 0x0B, 0xC2, 0x13, 0x88, 0x06, 0xB2, 0x78, 0x43, 0x79, 0xD3, 0xB8 }, - }, - { - { 0x11, 0x6A, 0x75, 0xFA, 0x6F, 0x84, 0x56, 0x46, 0x7A, 0x45, 0xF1, 0x4D, 0xA4, 0xB7, 0xCF, 0x3E, - 0x37, 0xE6, 0xA7, 0xCF, 0x07, 0x5B, 0x23, 0x35, 0xB2, 0x01, 0x1D, 0x93, 0x8B, 0x0F, 0x09, 0xA0 }, - }, { { 0x11, 0xA4, 0x02, 0x7B, 0x45, 0xFC, 0x9A, 0x6F, 0x40, 0x21, 0x25, 0xC3, 0xCA, 0x22, 0x68, 0xE0, 0x15, 0xA3, 0x1B, 0xA4, 0xFD, 0xB0, 0x05, 0x9D, 0x66, 0x6B, 0x73, 0xC8, 0x51, 0xD5, 0x35, 0x92 }, }, - { - { 0x11, 0xB7, 0x69, 0xDE, 0xDE, 0x8B, 0xD6, 0x15, 0xFC, 0x71, 0x20, 0x0B, 0x20, 0xB9, 0xA3, 0x1D, - 0x70, 0x93, 0x15, 0x16, 0xEC, 0x54, 0x42, 0xC3, 0xDD, 0xC9, 0xC8, 0xD1, 0x90, 0x21, 0x9D, 0xE1 }, - }, - { - { 0x11, 0xD3, 0x0D, 0xD7, 0x81, 0x07, 0x21, 0x88, 0x84, 0xB6, 0x55, 0xD8, 0x62, 0xAB, 0x05, 0x0E, - 0xAC, 0x0F, 0x5E, 0x33, 0x8E, 0xB1, 0x18, 0x44, 0x4B, 0x36, 0x0C, 0x8A, 0x3E, 0x05, 0x09, 0x9D }, - }, - { - { 0x11, 0xDE, 0x20, 0x2A, 0x3E, 0x34, 0x13, 0xA2, 0x33, 0x3E, 0xC1, 0x67, 0x8E, 0xBB, 0x50, 0x6D, - 0xD9, 0x55, 0x7C, 0x06, 0x81, 0xCE, 0x5F, 0xED, 0xCD, 0x25, 0xAA, 0xD1, 0x2C, 0x46, 0x67, 0xD6 }, - }, - { - { 0x11, 0xE7, 0x54, 0xF7, 0x95, 0x9E, 0x25, 0xB0, 0x18, 0x52, 0xA0, 0x46, 0xB1, 0xD2, 0xC2, 0xF6, - 0x48, 0x93, 0x53, 0x7A, 0x47, 0x4D, 0x14, 0x1D, 0x6E, 0x50, 0x50, 0x1E, 0x33, 0x9D, 0x89, 0x19 }, - }, - { - { 0x11, 0xF6, 0x34, 0xE0, 0x59, 0xEA, 0xBB, 0x99, 0xD6, 0x48, 0xD4, 0xFF, 0x6C, 0xD4, 0x29, 0x8E, - 0xD2, 0x0A, 0xA8, 0x2C, 0xCC, 0xDE, 0x8E, 0x81, 0x09, 0x80, 0x16, 0xE2, 0xAC, 0x72, 0xD4, 0x16 }, - }, - { - { 0x12, 0x0D, 0x2B, 0x28, 0x15, 0xC5, 0xEF, 0x5C, 0x28, 0x71, 0xA1, 0x93, 0x4D, 0xD4, 0x3D, 0x49, - 0x9E, 0x4E, 0xE6, 0xB6, 0x30, 0x00, 0xAE, 0x1A, 0xBE, 0xF7, 0x6D, 0x0D, 0x85, 0x51, 0xEF, 0xC6 }, - }, - { - { 0x12, 0x50, 0x6D, 0x3D, 0xE8, 0xC3, 0x19, 0xCC, 0x5B, 0x07, 0x90, 0x67, 0x7B, 0x90, 0x86, 0x36, - 0xE0, 0x86, 0x5B, 0x5F, 0xA1, 0x95, 0xDC, 0x87, 0xAF, 0x26, 0xF2, 0xAA, 0x05, 0xC2, 0x9F, 0xAD }, - }, { { 0x12, 0x6B, 0x1B, 0xA6, 0x38, 0xC7, 0xE6, 0x99, 0xBC, 0xBC, 0x54, 0xF5, 0x79, 0xAC, 0xD3, 0x9F, 0xE6, 0x1D, 0x08, 0x22, 0x5F, 0xE5, 0xB1, 0xF9, 0x01, 0x88, 0xB2, 0x3F, 0xD8, 0x43, 0x3E, 0x8E }, @@ -464,22 +144,6 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x13, 0x6A, 0x40, 0x09, 0x81, 0xB1, 0xA3, 0xE0, 0x5F, 0xDC, 0xAC, 0x20, 0xA2, 0x36, 0xF8, 0x6E, 0x94, 0xE5, 0xEE, 0x58, 0x59, 0xD8, 0xFD, 0x45, 0xE9, 0xE9, 0xC5, 0xA6, 0xC5, 0xC0, 0xA4, 0x13 }, }, - { - { 0x13, 0xBD, 0x07, 0x7B, 0x8A, 0x9F, 0x46, 0xFF, 0x8F, 0x2F, 0xFD, 0x23, 0x6E, 0x53, 0xA7, 0x2C, - 0x3B, 0x87, 0xF3, 0x4C, 0xC9, 0xDB, 0xB5, 0x81, 0x7E, 0x4D, 0xBA, 0x1B, 0xD3, 0xBC, 0x9E, 0x5F }, - }, - { - { 0x13, 0xCF, 0x4A, 0xC3, 0x21, 0x48, 0xB9, 0xC5, 0x61, 0x8A, 0x7D, 0xA6, 0x2F, 0x1C, 0xB8, 0x41, - 0x56, 0x68, 0xD5, 0x9F, 0xD3, 0xB3, 0x04, 0x1F, 0x50, 0x23, 0x20, 0xE5, 0x8E, 0x95, 0x1B, 0xC0 }, - }, - { - { 0x13, 0xE0, 0x1B, 0xE5, 0x72, 0xDC, 0x11, 0xFA, 0xC3, 0xB4, 0x7A, 0xE6, 0x8F, 0x92, 0xDC, 0x00, - 0xF1, 0x00, 0xBF, 0x77, 0x53, 0x7B, 0x89, 0x47, 0xF4, 0xC1, 0x1C, 0x25, 0xA0, 0xB6, 0xF9, 0xF6 }, - }, - { - { 0x13, 0xF7, 0xAC, 0xE5, 0xF5, 0x11, 0xC1, 0xF9, 0x43, 0x88, 0xE5, 0xC8, 0xA7, 0x25, 0x8A, 0x61, - 0x86, 0x14, 0xB0, 0x1C, 0xEA, 0xDC, 0xB0, 0x0A, 0x94, 0xB3, 0xCC, 0x7A, 0xE7, 0x01, 0xBE, 0xAE }, - }, { { 0x14, 0x21, 0x28, 0xA6, 0x65, 0x1C, 0xDC, 0x18, 0x70, 0xC2, 0x67, 0x5E, 0xC0, 0xB0, 0xEF, 0x32, 0xB5, 0xD4, 0xC1, 0x55, 0x35, 0x8E, 0x7E, 0xD9, 0x5A, 0x98, 0xE8, 0x3B, 0x1A, 0xD8, 0xBE, 0x4D }, @@ -488,18 +152,6 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x14, 0x47, 0x25, 0xA6, 0x79, 0x1C, 0x60, 0x0C, 0x4C, 0x2C, 0xF3, 0x94, 0x3F, 0x3E, 0xCF, 0x40, 0xD6, 0x31, 0xD7, 0x60, 0xE4, 0x51, 0xEF, 0x28, 0x29, 0xAF, 0xFB, 0xEE, 0x74, 0x80, 0xAD, 0x17 }, }, - { - { 0x14, 0x60, 0x80, 0x7B, 0x0D, 0x93, 0xDD, 0x79, 0xF4, 0xA3, 0xB9, 0x07, 0x45, 0xE9, 0xA7, 0x15, - 0x29, 0xF1, 0xEC, 0x26, 0x63, 0x30, 0x41, 0x57, 0x4A, 0x81, 0x80, 0xE0, 0xCE, 0x42, 0x81, 0xDF }, - }, - { - { 0x14, 0xB0, 0x98, 0x34, 0xE2, 0xA5, 0xBC, 0x61, 0x9A, 0x79, 0xA5, 0xD2, 0xCE, 0x48, 0x78, 0xFA, - 0xBC, 0xA0, 0x6D, 0x76, 0xC2, 0x37, 0x65, 0xFD, 0x45, 0x86, 0x3C, 0x22, 0xFE, 0xCE, 0x30, 0x38 }, - }, - { - { 0x14, 0xF3, 0xB4, 0x17, 0x3B, 0x9F, 0x8C, 0x81, 0x90, 0x39, 0x74, 0xE6, 0x4C, 0x68, 0xDF, 0xAE, - 0xB6, 0xB7, 0xD8, 0x4B, 0x94, 0x2A, 0xAE, 0x78, 0x89, 0x03, 0xA1, 0x54, 0x01, 0x08, 0x57, 0xE7 }, - }, { { 0x15, 0x27, 0x2A, 0xBC, 0x1F, 0x0C, 0x4D, 0x1D, 0x1A, 0x92, 0x08, 0x73, 0x55, 0xA1, 0xE0, 0x42, 0x6C, 0x2B, 0xB5, 0xB4, 0x37, 0x30, 0x00, 0xB8, 0x2C, 0x2C, 0xCA, 0xB7, 0xFA, 0xD6, 0xFA, 0x20 }, @@ -516,118 +168,22 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x15, 0x5D, 0x88, 0x6E, 0x99, 0x1D, 0x40, 0x0A, 0xBF, 0x2F, 0x83, 0xC2, 0x80, 0xD1, 0x24, 0x6D, 0xCE, 0x02, 0xA6, 0x28, 0x31, 0x26, 0xC6, 0x17, 0xE4, 0x17, 0xD2, 0xB7, 0xEA, 0xC1, 0x19, 0x24 }, }, - { - { 0x15, 0x75, 0x93, 0x18, 0x80, 0x19, 0x6D, 0xE8, 0x0D, 0x97, 0xFE, 0xF1, 0x85, 0xD2, 0x7A, 0xF6, - 0xAD, 0x6B, 0x5B, 0x04, 0x0D, 0x87, 0x6C, 0xDF, 0x4A, 0x39, 0xB5, 0xB7, 0x8E, 0x96, 0xB7, 0xD5 }, - }, - { - { 0x15, 0xB0, 0xD9, 0xBE, 0xD6, 0x2B, 0xD8, 0x96, 0x11, 0x59, 0xFE, 0x7E, 0x88, 0x92, 0xF8, 0xE8, - 0xEB, 0xB0, 0xCE, 0x81, 0xE6, 0x8D, 0xEA, 0xDD, 0x29, 0x0F, 0xDD, 0xCE, 0xD0, 0x9D, 0xE7, 0xF1 }, - }, - { - { 0x15, 0xC0, 0x27, 0x02, 0x53, 0x4E, 0xB0, 0x57, 0x23, 0x9F, 0xD7, 0x85, 0x8A, 0xE3, 0x42, 0x23, - 0xBC, 0x57, 0x78, 0xA8, 0xB7, 0x1F, 0x92, 0x50, 0xD5, 0xD3, 0x3B, 0x31, 0x3C, 0x30, 0x2A, 0x67 }, - }, - { - { 0x15, 0xC1, 0x73, 0xD2, 0xF3, 0x73, 0xC2, 0x27, 0xDC, 0xFF, 0x4E, 0xCC, 0x68, 0xE8, 0x56, 0x7C, - 0xDA, 0xE3, 0x5D, 0xDF, 0x1E, 0xF4, 0x55, 0xCE, 0x53, 0x4A, 0x15, 0x90, 0x28, 0x79, 0xF4, 0xFE }, - }, - { - { 0x15, 0xCF, 0x2F, 0x78, 0xE6, 0x79, 0x62, 0x2C, 0x06, 0x78, 0xDC, 0x5B, 0xA8, 0x03, 0x84, 0x7A, - 0xBD, 0xB5, 0xEA, 0x64, 0x31, 0x65, 0x3E, 0xC2, 0x5F, 0xDC, 0x8D, 0x2B, 0xB3, 0x3D, 0x12, 0x23 }, - }, - { - { 0x15, 0xEA, 0x55, 0xF0, 0x2C, 0x49, 0x02, 0xEC, 0x77, 0x72, 0x64, 0xE0, 0x81, 0x71, 0x41, 0x24, - 0x7C, 0x52, 0x00, 0xE1, 0x16, 0x56, 0xFD, 0xC2, 0x72, 0x9D, 0x59, 0x5C, 0x37, 0x79, 0x95, 0x6C }, - }, - { - { 0x16, 0x21, 0xEC, 0x14, 0xE0, 0xB4, 0x13, 0xFA, 0xB7, 0xD0, 0x27, 0x5A, 0x9A, 0xC3, 0xC3, 0xC9, - 0x85, 0x13, 0xFE, 0x18, 0xA2, 0x02, 0x86, 0xF6, 0x56, 0x59, 0x36, 0x9C, 0x8D, 0x34, 0x68, 0xDA }, - }, - { - { 0x16, 0x9A, 0xFA, 0x4C, 0x7D, 0x97, 0x78, 0xC7, 0x1D, 0xB5, 0x84, 0x6C, 0xCA, 0x8E, 0xB7, 0x19, - 0x12, 0x3D, 0x4B, 0x06, 0xB3, 0xFF, 0x98, 0x66, 0xD7, 0x4D, 0x6E, 0x18, 0x7C, 0x1E, 0xF9, 0x70 }, - }, - { - { 0x16, 0xE7, 0x66, 0x47, 0xB3, 0x97, 0xEB, 0x4E, 0xFD, 0x9A, 0x79, 0xF2, 0xFB, 0xBA, 0x9A, 0xCA, - 0x46, 0xCE, 0xAD, 0x95, 0x43, 0x05, 0xFE, 0xE5, 0xB1, 0x3B, 0x5D, 0x53, 0xDB, 0x7C, 0x1D, 0xB1 }, - }, - { - { 0x17, 0x29, 0xB3, 0x34, 0x7A, 0x7D, 0x93, 0x73, 0x17, 0xE3, 0xDA, 0x5C, 0xC7, 0xF7, 0xB0, 0xD8, - 0xFD, 0x97, 0x72, 0x24, 0x7A, 0x57, 0x99, 0x93, 0x9A, 0x44, 0xD3, 0xA9, 0x7A, 0x50, 0xB9, 0xD9 }, - }, - { - { 0x17, 0x46, 0x68, 0x4E, 0x66, 0x21, 0x77, 0x68, 0x70, 0xDE, 0x55, 0x65, 0xDF, 0xD3, 0x3A, 0x30, - 0x92, 0x77, 0x18, 0x59, 0x6C, 0x01, 0x30, 0xF8, 0x77, 0x4B, 0xE9, 0x9C, 0xD2, 0xA2, 0x51, 0x06 }, - }, - { - { 0x17, 0x59, 0x7E, 0x00, 0x45, 0x6C, 0x38, 0x32, 0xE1, 0x85, 0x1C, 0x30, 0x0C, 0xD5, 0x52, 0xC2, - 0xE7, 0x73, 0x35, 0x8C, 0xF0, 0xF6, 0x88, 0x58, 0xF3, 0x4F, 0xCA, 0x34, 0x45, 0xC6, 0x4D, 0xB7 }, - }, - { - { 0x17, 0x5A, 0x97, 0x05, 0x5C, 0x9E, 0x03, 0x88, 0x2A, 0xCD, 0x35, 0x40, 0x58, 0xE2, 0x43, 0xE3, - 0x3A, 0x84, 0x76, 0xEF, 0x83, 0xB4, 0xB2, 0x08, 0xFC, 0xF6, 0x64, 0xE8, 0x4F, 0x05, 0x08, 0xB5 }, - }, - { - { 0x17, 0x99, 0x63, 0xD2, 0x28, 0x4D, 0xEC, 0x64, 0xAC, 0x6C, 0xE5, 0x60, 0x0B, 0xE9, 0x9A, 0xC4, - 0xF0, 0x4D, 0xD3, 0x20, 0x35, 0xE4, 0xF1, 0x24, 0x28, 0xEC, 0x9E, 0x51, 0xED, 0xF6, 0xB0, 0x6C }, - }, - { - { 0x17, 0xD1, 0xF6, 0xE5, 0x1C, 0xB3, 0xAF, 0x91, 0x23, 0xD4, 0xFC, 0xB3, 0x84, 0x18, 0x39, 0x4D, - 0xE3, 0xE6, 0xC3, 0x33, 0x3F, 0x80, 0x20, 0xD5, 0x13, 0x48, 0xDE, 0xBA, 0xCC, 0x74, 0x70, 0x14 }, - }, - { - { 0x17, 0xF7, 0x25, 0xAC, 0x12, 0xCE, 0xA5, 0xE0, 0x86, 0x6F, 0xCC, 0x3E, 0x83, 0x4E, 0x9C, 0xB6, - 0x34, 0x14, 0x5C, 0xED, 0xC5, 0x6B, 0x61, 0x3D, 0x2A, 0x1F, 0xE1, 0x3C, 0xF4, 0x0E, 0xDF, 0xD4 }, - }, - { - { 0x18, 0x04, 0xF7, 0x1E, 0x2C, 0x7A, 0xDC, 0x93, 0x38, 0xCA, 0x1B, 0x71, 0xDF, 0x81, 0xF8, 0x3E, - 0x59, 0xD4, 0xF4, 0x1C, 0xAF, 0x1D, 0x9F, 0x17, 0xD7, 0x87, 0x22, 0x4B, 0x0A, 0xF6, 0x46, 0xF3 }, - }, { { 0x18, 0x1E, 0xBB, 0x29, 0x8D, 0x20, 0x68, 0x5C, 0x48, 0xF7, 0x53, 0x89, 0x80, 0xC5, 0x63, 0xC8, 0xF7, 0x48, 0x95, 0x4C, 0xF2, 0x64, 0x41, 0x9A, 0x72, 0xFC, 0xC6, 0x34, 0x0A, 0x10, 0x23, 0x80 }, }, - { - { 0x18, 0x41, 0x69, 0xC5, 0x5C, 0xA2, 0xE2, 0x44, 0xF5, 0xF3, 0x3E, 0x5E, 0x9B, 0x82, 0x89, 0x2B, - 0x88, 0x5F, 0xD0, 0x2B, 0x0C, 0xEA, 0xFF, 0x5E, 0xB7, 0xEC, 0x05, 0x30, 0x72, 0xE9, 0xF3, 0x39 }, - }, { { 0x19, 0x77, 0x3E, 0xE9, 0xE9, 0x35, 0x6B, 0x88, 0x11, 0xD6, 0x56, 0x79, 0x9C, 0x53, 0x16, 0x0B, 0x61, 0x73, 0xFA, 0x8A, 0x81, 0x47, 0x97, 0xDB, 0xCD, 0x55, 0xB2, 0x27, 0x38, 0x70, 0x60, 0x3E }, }, - { - { 0x19, 0xD5, 0x67, 0x31, 0x19, 0x02, 0xA4, 0xA2, 0x61, 0xF8, 0xA8, 0x3D, 0x0C, 0xFE, 0x10, 0x1D, - 0x9C, 0x5C, 0x1F, 0x68, 0x0F, 0xF8, 0xF4, 0xEC, 0x0D, 0xF2, 0x3D, 0x84, 0x41, 0x92, 0xFB, 0x3B }, - }, { { 0x1A, 0x9E, 0xC6, 0x8C, 0xED, 0xB6, 0xBD, 0x94, 0x0C, 0x95, 0x34, 0xE6, 0x84, 0xBB, 0x04, 0x9F, 0xF1, 0xE2, 0x3B, 0x66, 0xA1, 0x33, 0x01, 0x2F, 0xC3, 0x99, 0xEB, 0x4F, 0xB5, 0xD3, 0xAA, 0x35 }, }, - { - { 0x1A, 0xCD, 0x0A, 0x9E, 0x5E, 0x20, 0x22, 0xBE, 0xE5, 0xA4, 0xFC, 0x2E, 0x7F, 0x69, 0xF8, 0x82, - 0x3E, 0xDC, 0x26, 0x5B, 0x97, 0x6A, 0x7F, 0x61, 0x41, 0x16, 0x03, 0x98, 0x6B, 0x90, 0x24, 0xF8 }, - }, - { - { 0x1A, 0xFA, 0xB3, 0x15, 0x5B, 0x57, 0x17, 0xC0, 0x89, 0x82, 0xF9, 0x0C, 0x88, 0xA7, 0xAA, 0xC3, - 0x6B, 0xEB, 0x00, 0x03, 0xFA, 0xC4, 0x9B, 0xCA, 0x74, 0xA1, 0xCC, 0x52, 0x09, 0xB7, 0x04, 0x39 }, - }, - { - { 0x1B, 0x56, 0xBA, 0x1E, 0xFF, 0xAC, 0x97, 0x36, 0x60, 0x74, 0xCE, 0x07, 0x24, 0xE7, 0x04, 0x59, - 0xDF, 0x99, 0x82, 0x1C, 0x3F, 0xAF, 0x20, 0xDE, 0x5C, 0x05, 0x30, 0x52, 0x52, 0xBE, 0x64, 0x3A }, - }, - { - { 0x1B, 0x69, 0xC0, 0xDD, 0xB0, 0x9B, 0xC2, 0xF0, 0xE9, 0x65, 0x7F, 0xFA, 0x94, 0x83, 0x96, 0xAF, - 0xC0, 0xCB, 0x45, 0xC0, 0x19, 0x7E, 0xC0, 0x85, 0x78, 0xC5, 0x61, 0x83, 0xEE, 0xEF, 0x59, 0x7B }, - }, { { 0x1B, 0x7B, 0xF8, 0xD9, 0xE8, 0x29, 0x3C, 0x53, 0xDD, 0x59, 0xEC, 0x97, 0xFE, 0x16, 0xF0, 0xEA, 0xB4, 0x68, 0x5B, 0x95, 0xCE, 0x14, 0xD2, 0x62, 0x3E, 0x70, 0x94, 0x2C, 0xFF, 0x25, 0xE7, 0x30 }, }, - { - { 0x1B, 0xD6, 0xA6, 0xF7, 0x63, 0xD2, 0xF6, 0xD8, 0xBC, 0xEC, 0x91, 0xA6, 0x22, 0xAA, 0x37, 0x00, - 0xD7, 0xA4, 0x2D, 0x18, 0x8C, 0x5B, 0xD8, 0x64, 0x16, 0x57, 0x6F, 0xFD, 0x32, 0x50, 0x7C, 0x92 }, - }, { { 0x1B, 0xD7, 0xB3, 0x62, 0xBC, 0x14, 0x66, 0xFA, 0xC0, 0x5E, 0xC5, 0x9E, 0x12, 0xE8, 0x1B, 0xE7, 0x35, 0x38, 0xC4, 0x97, 0x28, 0xF5, 0xAD, 0xBA, 0x2D, 0x81, 0xFC, 0xDB, 0xC4, 0x65, 0x7C, 0x1B }, @@ -644,46 +200,14 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x1C, 0x04, 0x82, 0x0F, 0x7B, 0x4A, 0x2F, 0x1E, 0x38, 0x5D, 0xE1, 0xDE, 0x16, 0xB2, 0x22, 0x6E, 0x88, 0x3D, 0x9C, 0x34, 0x66, 0x3E, 0x1B, 0x64, 0xE8, 0x5B, 0x98, 0x0E, 0xAF, 0xF0, 0xB9, 0xD3 }, }, - { - { 0x1C, 0x74, 0xBA, 0x75, 0xE5, 0x1B, 0x48, 0x29, 0x54, 0xC3, 0x8B, 0xF4, 0xD5, 0x1E, 0xFC, 0x70, - 0xA0, 0xA0, 0x4D, 0x41, 0x3A, 0xC1, 0xFF, 0x8E, 0xB9, 0x90, 0x39, 0x9D, 0x1F, 0x1A, 0xA9, 0xC4 }, - }, - { - { 0x1C, 0x76, 0xBB, 0xCA, 0x37, 0x71, 0x77, 0x5B, 0xB9, 0xB0, 0xC3, 0x33, 0x71, 0x70, 0x32, 0x69, - 0x06, 0x16, 0x77, 0xCA, 0x7B, 0x18, 0x99, 0xEF, 0x8C, 0x77, 0xE4, 0x15, 0x22, 0x2B, 0x56, 0xB6 }, - }, - { - { 0x1D, 0x36, 0x08, 0xAC, 0x22, 0xF0, 0x09, 0x40, 0xEE, 0x08, 0x4A, 0x8B, 0x2F, 0xD7, 0x95, 0x89, - 0x72, 0x57, 0x79, 0x4E, 0x3E, 0x00, 0xC2, 0xD2, 0x67, 0x10, 0xD2, 0xEA, 0x02, 0x79, 0xAC, 0xB5 }, - }, - { - { 0x1D, 0x57, 0xA3, 0xC0, 0x97, 0x74, 0x07, 0xE1, 0x57, 0xDF, 0x71, 0x97, 0x48, 0x91, 0x16, 0xE5, - 0xFC, 0x17, 0xED, 0x2A, 0x90, 0xFE, 0xD9, 0x6B, 0x3D, 0x4D, 0x5A, 0x4E, 0x0A, 0x80, 0xE1, 0xFB }, - }, - { - { 0x1D, 0x72, 0xE5, 0x91, 0x26, 0xFD, 0x8B, 0x78, 0x8E, 0xA5, 0x39, 0x63, 0xAD, 0x02, 0x07, 0x6B, - 0x3B, 0x04, 0x0E, 0xE8, 0xCD, 0x4C, 0xB8, 0xBD, 0xCD, 0xF3, 0xE5, 0xA9, 0x9F, 0x63, 0x70, 0x02 }, - }, { { 0x1D, 0x9E, 0xC0, 0x06, 0xA5, 0x26, 0xFA, 0xB5, 0xCE, 0x2E, 0x71, 0xFD, 0xFC, 0x07, 0xC0, 0x11, 0xF7, 0x65, 0x7B, 0xF8, 0x5F, 0x5D, 0x03, 0x52, 0xB8, 0xCB, 0x21, 0x8D, 0x4F, 0xCB, 0xC4, 0x43 }, }, - { - { 0x1E, 0x50, 0x62, 0x19, 0x88, 0xA0, 0x25, 0x0F, 0x2A, 0xDE, 0x2A, 0x16, 0xFC, 0xD8, 0x38, 0x46, - 0xDB, 0xD7, 0xA9, 0x0B, 0x2A, 0x71, 0xC8, 0x0A, 0x1D, 0xB1, 0x94, 0x6B, 0x89, 0x89, 0x1C, 0x46 }, - }, { { 0x1E, 0x78, 0xF8, 0x08, 0x84, 0xE3, 0x2A, 0x2E, 0xA5, 0xAD, 0x1E, 0xE8, 0x35, 0x88, 0xAC, 0xDB, 0x18, 0x4A, 0x4A, 0x6E, 0x87, 0x56, 0x5B, 0xF5, 0x03, 0xB5, 0x69, 0x7A, 0xBF, 0xAE, 0x64, 0xA4 }, }, - { - { 0x1E, 0xFE, 0x6A, 0x78, 0x51, 0x41, 0x33, 0x39, 0x7B, 0x05, 0x9C, 0xE1, 0x3A, 0x4F, 0xC9, 0x88, - 0xAE, 0x38, 0x4E, 0x21, 0x12, 0x7F, 0x13, 0xA1, 0x0E, 0x96, 0x7B, 0x9A, 0xA2, 0xAC, 0xF8, 0x81 }, - }, - { - { 0x1F, 0x00, 0x4B, 0x82, 0x0C, 0xF6, 0x8B, 0x00, 0x7B, 0xB5, 0x72, 0xA0, 0xED, 0x42, 0x9C, 0x79, - 0x8F, 0x79, 0x44, 0x4F, 0x6F, 0x13, 0x29, 0x32, 0xEE, 0x5F, 0x8E, 0x28, 0xA4, 0x0A, 0xB9, 0x86 }, - }, { { 0x1F, 0x11, 0x85, 0xA5, 0x21, 0xE2, 0x8E, 0x95, 0x17, 0x1C, 0xF3, 0x86, 0x07, 0x8A, 0x76, 0x4A, 0x9A, 0x3E, 0x71, 0xC2, 0x59, 0xBC, 0xDC, 0x5F, 0x8E, 0x66, 0xE1, 0xB5, 0x20, 0x55, 0xA2, 0x6D }, @@ -692,122 +216,42 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x1F, 0x23, 0xD7, 0xA6, 0x38, 0x17, 0x1F, 0x6D, 0x09, 0x99, 0x64, 0xE0, 0xFA, 0x01, 0x72, 0x1C, 0x06, 0xCC, 0xEB, 0x8E, 0xA2, 0x98, 0xBF, 0xD0, 0x04, 0x8E, 0x13, 0x8D, 0x98, 0xFC, 0x36, 0x24 }, }, - { - { 0x1F, 0x68, 0x40, 0x10, 0xC1, 0x92, 0xAB, 0xFA, 0x85, 0xA7, 0x9B, 0xBA, 0x45, 0xCE, 0x76, 0x4B, - 0x2D, 0xA8, 0x1F, 0x99, 0x1F, 0x5F, 0x01, 0xD9, 0xEB, 0x7E, 0x3C, 0x99, 0x9B, 0x78, 0x75, 0x0E }, - }, - { - { 0x1F, 0x7D, 0x37, 0x52, 0x93, 0x22, 0x7D, 0x04, 0x97, 0x5B, 0x78, 0x97, 0xDC, 0x17, 0x25, 0x39, - 0x64, 0xDC, 0xD7, 0xD0, 0x06, 0x7E, 0x84, 0xC6, 0xD8, 0x47, 0x9D, 0xFA, 0x27, 0x6E, 0xBE, 0xD0 }, - }, - { - { 0x1F, 0x88, 0x42, 0x37, 0xFD, 0x5C, 0xE3, 0xD9, 0xBC, 0x02, 0x4D, 0x1B, 0x26, 0xAB, 0xCB, 0x94, - 0x07, 0xA4, 0x35, 0x13, 0x78, 0xE0, 0xBD, 0x89, 0xDB, 0x67, 0xBE, 0xF8, 0xEF, 0xC8, 0xA5, 0x6E }, - }, { { 0x1F, 0xC7, 0xF8, 0x10, 0x4E, 0x27, 0xFF, 0x2A, 0x45, 0x56, 0xF9, 0x1E, 0x05, 0x42, 0x17, 0xC5, 0x8F, 0x69, 0x3F, 0x70, 0x36, 0x25, 0x9E, 0x39, 0x80, 0xB5, 0x59, 0x5B, 0x04, 0x3D, 0x11, 0x92 }, }, - { - { 0x1F, 0xD4, 0xB6, 0xA0, 0xDE, 0x45, 0x04, 0x2B, 0xCA, 0x14, 0xE3, 0x4A, 0x83, 0x78, 0x7C, 0x59, - 0x95, 0x5D, 0x82, 0xA0, 0x1C, 0xE3, 0x20, 0x05, 0xAC, 0x48, 0x83, 0x72, 0xA8, 0xFD, 0x41, 0xA6 }, - }, { { 0x20, 0x0B, 0x49, 0xBD, 0xD6, 0x35, 0x02, 0x57, 0xCC, 0xD4, 0xE6, 0xAD, 0xE1, 0xCB, 0x75, 0x13, 0x8D, 0xD6, 0xD9, 0x06, 0xFE, 0xF3, 0x49, 0xC0, 0xC9, 0x86, 0xA5, 0x1B, 0x29, 0xB9, 0xE5, 0x2D }, }, { - { 0x20, 0x15, 0x60, 0x8B, 0x8E, 0x86, 0xBA, 0x63, 0x12, 0x01, 0xC2, 0x12, 0x20, 0x99, 0x57, 0xAF, - 0xCB, 0x6E, 0xDF, 0x27, 0x22, 0xC6, 0x1B, 0x00, 0xE2, 0xFC, 0x92, 0x46, 0xA8, 0xD5, 0x20, 0x4E }, + { 0x21, 0x09, 0xF3, 0x10, 0x7D, 0x97, 0xF8, 0x70, 0x48, 0x70, 0x8E, 0xC8, 0x7C, 0xA2, 0xDC, 0x31, + 0x8B, 0x2F, 0x2B, 0x57, 0x47, 0xC3, 0x38, 0xBD, 0x9C, 0x6D, 0xBC, 0xD6, 0x0F, 0xD6, 0xBE, 0xA2 }, }, { - { 0x20, 0x7A, 0xE5, 0xE6, 0x56, 0xB3, 0xB1, 0x26, 0x39, 0x41, 0x83, 0x54, 0x5D, 0xF9, 0x9C, 0xC8, - 0x36, 0x53, 0x7A, 0x16, 0x88, 0x58, 0xD8, 0xCE, 0xB4, 0x5A, 0x6A, 0x52, 0x65, 0x86, 0xCA, 0xAE }, + { 0x21, 0x78, 0xE8, 0x28, 0x3A, 0x73, 0x39, 0x6E, 0x08, 0xC0, 0xA1, 0x1A, 0x88, 0x72, 0xFA, 0x4A, + 0x9F, 0xCC, 0x05, 0x67, 0x0C, 0xEE, 0xFF, 0xB8, 0x95, 0x83, 0x8E, 0xB6, 0x59, 0xDE, 0x38, 0xDB }, }, { - { 0x20, 0x8A, 0x46, 0xD9, 0x07, 0xE6, 0xB4, 0x09, 0x0E, 0x31, 0x02, 0xE1, 0xC7, 0xF1, 0x81, 0x57, - 0x21, 0x6C, 0xFC, 0x9A, 0xB9, 0xD5, 0x0F, 0x47, 0x83, 0x25, 0x8D, 0x79, 0x35, 0x01, 0x34, 0xBD }, + { 0x22, 0x01, 0x71, 0xF7, 0x0E, 0x1F, 0xC3, 0xC4, 0xF7, 0x8D, 0xA6, 0xC8, 0xB1, 0xD7, 0x2C, 0x3B, + 0xA8, 0x31, 0x9A, 0x46, 0xF8, 0x19, 0x2D, 0x1E, 0x19, 0xB9, 0xE2, 0x9A, 0xBA, 0x18, 0xEE, 0x87 }, }, { - { 0x20, 0xF1, 0x85, 0xBC, 0x7F, 0xA7, 0x61, 0x16, 0x6E, 0xA3, 0xA9, 0x98, 0x8F, 0xB1, 0x0B, 0x24, - 0xC7, 0x01, 0xEF, 0xDD, 0xAB, 0xE4, 0x74, 0x05, 0x63, 0x43, 0xA1, 0x36, 0x11, 0xD5, 0x4D, 0x7D }, + { 0x23, 0x19, 0xCB, 0x3D, 0x58, 0xC6, 0xD5, 0x53, 0x62, 0x5D, 0xE5, 0xF4, 0x25, 0x2B, 0xF0, 0x29, + 0xAB, 0x83, 0x05, 0xEB, 0xF2, 0x2F, 0xA2, 0x3E, 0x99, 0x73, 0x04, 0x66, 0xDE, 0x24, 0xD6, 0xC3 }, }, { - { 0x21, 0x03, 0x9F, 0x99, 0x3D, 0xAE, 0x79, 0x03, 0xA0, 0xA7, 0xAA, 0x93, 0x5B, 0x96, 0x70, 0x1A, - 0xDD, 0x7E, 0xC5, 0xCA, 0x99, 0xE1, 0x7E, 0x65, 0x1C, 0x21, 0x29, 0x5B, 0x3B, 0x65, 0x70, 0x49 }, - }, - { - { 0x21, 0x05, 0xA5, 0xB7, 0x80, 0x1C, 0xE4, 0x55, 0xA2, 0xA9, 0x31, 0xA2, 0x23, 0xBB, 0x8B, 0xF4, - 0x11, 0x28, 0x16, 0x03, 0x70, 0xFD, 0x25, 0xFC, 0x11, 0x23, 0xAB, 0x57, 0x9E, 0x06, 0x29, 0x23 }, - }, - { - { 0x21, 0x09, 0xF3, 0x10, 0x7D, 0x97, 0xF8, 0x70, 0x48, 0x70, 0x8E, 0xC8, 0x7C, 0xA2, 0xDC, 0x31, - 0x8B, 0x2F, 0x2B, 0x57, 0x47, 0xC3, 0x38, 0xBD, 0x9C, 0x6D, 0xBC, 0xD6, 0x0F, 0xD6, 0xBE, 0xA2 }, - }, - { - { 0x21, 0x4A, 0xBC, 0x84, 0x5D, 0x66, 0x68, 0x76, 0xC4, 0x78, 0x12, 0x84, 0x14, 0x16, 0xC6, 0xFB, - 0xFF, 0x4A, 0x38, 0x32, 0x20, 0x61, 0xB6, 0x5D, 0x9C, 0x5F, 0x6B, 0x74, 0x98, 0x2B, 0xC6, 0xEA }, - }, - { - { 0x21, 0x62, 0xAB, 0xC2, 0x7D, 0x0C, 0x3D, 0xA0, 0xF6, 0xAF, 0xF9, 0x76, 0x95, 0xFB, 0x3D, 0x47, - 0x7F, 0x4C, 0x63, 0x34, 0xFF, 0xB3, 0xE5, 0xBC, 0xD0, 0xE3, 0x05, 0x49, 0xD5, 0xFE, 0xEB, 0x47 }, - }, - { - { 0x21, 0x78, 0xE8, 0x28, 0x3A, 0x73, 0x39, 0x6E, 0x08, 0xC0, 0xA1, 0x1A, 0x88, 0x72, 0xFA, 0x4A, - 0x9F, 0xCC, 0x05, 0x67, 0x0C, 0xEE, 0xFF, 0xB8, 0x95, 0x83, 0x8E, 0xB6, 0x59, 0xDE, 0x38, 0xDB }, - }, - { - { 0x21, 0x82, 0x84, 0x4F, 0xB2, 0x8F, 0xB4, 0x71, 0x78, 0xEB, 0x38, 0x1C, 0xDB, 0xF1, 0x18, 0x06, - 0x3D, 0x6A, 0x9E, 0x43, 0xCC, 0x04, 0xE4, 0x8A, 0xEF, 0x84, 0xCE, 0x9C, 0xCE, 0x58, 0x4A, 0x5C }, - }, - { - { 0x22, 0x01, 0x71, 0xF7, 0x0E, 0x1F, 0xC3, 0xC4, 0xF7, 0x8D, 0xA6, 0xC8, 0xB1, 0xD7, 0x2C, 0x3B, - 0xA8, 0x31, 0x9A, 0x46, 0xF8, 0x19, 0x2D, 0x1E, 0x19, 0xB9, 0xE2, 0x9A, 0xBA, 0x18, 0xEE, 0x87 }, - }, - { - { 0x22, 0x2E, 0xC2, 0x75, 0xE6, 0x8A, 0x31, 0x7D, 0x60, 0x80, 0x67, 0x9D, 0xDF, 0x56, 0x78, 0x6A, - 0xBD, 0x2B, 0x11, 0xF2, 0x5A, 0x17, 0x15, 0x33, 0xCF, 0xBD, 0x59, 0xEE, 0x0D, 0xFA, 0x4E, 0xE4 }, - }, - { - { 0x22, 0x7A, 0x2B, 0xFF, 0xAB, 0xDE, 0xE1, 0x8C, 0x2C, 0x54, 0xE6, 0xE9, 0xB5, 0x8A, 0xBD, 0xBF, - 0x93, 0x07, 0xA4, 0x06, 0x2E, 0xDA, 0x97, 0xD4, 0xF6, 0xC4, 0x48, 0x1B, 0xB6, 0xEC, 0xA9, 0xE4 }, - }, - { - { 0x23, 0x19, 0xCB, 0x3D, 0x58, 0xC6, 0xD5, 0x53, 0x62, 0x5D, 0xE5, 0xF4, 0x25, 0x2B, 0xF0, 0x29, - 0xAB, 0x83, 0x05, 0xEB, 0xF2, 0x2F, 0xA2, 0x3E, 0x99, 0x73, 0x04, 0x66, 0xDE, 0x24, 0xD6, 0xC3 }, - }, - { - { 0x23, 0x3F, 0xC6, 0xF9, 0x15, 0x1F, 0x05, 0x00, 0xBB, 0x38, 0xAD, 0x20, 0x7A, 0xF2, 0x42, 0x21, - 0x3A, 0x6A, 0x51, 0xCE, 0xB3, 0x8C, 0x73, 0x0F, 0xF1, 0xBF, 0xA1, 0x0A, 0x82, 0x4A, 0x71, 0xC7 }, - }, - { - { 0x23, 0x86, 0x51, 0xAB, 0x70, 0xB7, 0x11, 0xA0, 0x65, 0x55, 0x4E, 0x5D, 0x63, 0x6A, 0x34, 0x2C, - 0x8A, 0x6B, 0xFE, 0x46, 0x0E, 0x4E, 0x7B, 0x4C, 0x9E, 0xAF, 0xB4, 0x75, 0xD5, 0x68, 0x51, 0xD8 }, - }, - { - { 0x23, 0x8A, 0x80, 0xCC, 0x9B, 0x58, 0x9A, 0xDC, 0x89, 0xB7, 0xA8, 0xF3, 0x4D, 0xDF, 0x12, 0x48, - 0x73, 0x4B, 0x9F, 0x7F, 0x78, 0x20, 0xB6, 0x04, 0x07, 0x66, 0xC5, 0x41, 0x3A, 0xD2, 0xBD, 0xEF }, + { 0x23, 0x8A, 0x80, 0xCC, 0x9B, 0x58, 0x9A, 0xDC, 0x89, 0xB7, 0xA8, 0xF3, 0x4D, 0xDF, 0x12, 0x48, + 0x73, 0x4B, 0x9F, 0x7F, 0x78, 0x20, 0xB6, 0x04, 0x07, 0x66, 0xC5, 0x41, 0x3A, 0xD2, 0xBD, 0xEF }, }, { { 0x23, 0x9C, 0x79, 0x5F, 0x0C, 0x55, 0xA5, 0x53, 0x16, 0x2A, 0x9C, 0xA0, 0x6E, 0x88, 0x01, 0xE1, 0x19, 0xBD, 0xFF, 0x54, 0x35, 0x4A, 0x3F, 0x68, 0x43, 0xCF, 0x2A, 0x2F, 0xA6, 0x01, 0x75, 0x8E }, }, - { - { 0x23, 0xF0, 0xDD, 0xD8, 0x9B, 0x42, 0x82, 0xA6, 0x7F, 0xD0, 0x57, 0x56, 0xFD, 0xC5, 0xD1, 0x8C, - 0x1E, 0x5D, 0xCC, 0xEF, 0xCF, 0x42, 0x65, 0x06, 0x6D, 0xFB, 0x4A, 0xBD, 0x30, 0xD9, 0xE9, 0x77 }, - }, - { - { 0x23, 0xF7, 0xE4, 0xA3, 0x5B, 0xCC, 0xE7, 0x40, 0x36, 0xD9, 0xC8, 0x6F, 0x7F, 0x61, 0x1D, 0x85, - 0xF3, 0x7C, 0xB6, 0x2C, 0x43, 0x24, 0x7D, 0x13, 0x52, 0x22, 0x4E, 0xC3, 0xDC, 0x89, 0xED, 0x37 }, - }, { { 0x24, 0x62, 0x52, 0x48, 0x32, 0xC1, 0x54, 0xD8, 0x4D, 0xF5, 0x8E, 0xD7, 0x75, 0x22, 0x3B, 0xBE, 0x25, 0x7D, 0xEA, 0xF7, 0x0E, 0xF9, 0xD2, 0x08, 0x61, 0x4E, 0xC0, 0xF5, 0x97, 0x7F, 0x6D, 0x58 }, }, - { - { 0x24, 0x63, 0xCB, 0x2E, 0x47, 0x55, 0x71, 0xA8, 0x68, 0x74, 0xEE, 0x45, 0xAE, 0x27, 0x0B, 0x40, - 0x08, 0xD8, 0xBA, 0xF3, 0x65, 0x32, 0x57, 0x0E, 0x28, 0xE2, 0x47, 0xFF, 0x88, 0x7F, 0x86, 0x83 }, - }, { { 0x24, 0x6D, 0x0C, 0x31, 0x48, 0x72, 0x75, 0x59, 0xF9, 0x9A, 0xD0, 0xC1, 0x50, 0x37, 0x70, 0x06, 0xB7, 0xA1, 0x7A, 0x60, 0x3A, 0x47, 0x3B, 0x6A, 0xAC, 0xD2, 0x4E, 0x16, 0xC6, 0xC5, 0x1B, 0x42 }, @@ -816,50 +260,10 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x25, 0x1B, 0xB7, 0xC5, 0x42, 0x33, 0xDA, 0x44, 0xBF, 0x53, 0xB5, 0x8A, 0xF2, 0x9A, 0xE1, 0x74, 0xB9, 0x78, 0xBA, 0xDB, 0x89, 0xA9, 0x50, 0xAB, 0x3E, 0x5F, 0x9B, 0x4D, 0x0D, 0xCD, 0xBC, 0x62 }, }, - { - { 0x25, 0x1D, 0x5D, 0x22, 0x2F, 0x1E, 0x67, 0x1D, 0x72, 0x1E, 0x1C, 0x26, 0x39, 0xB3, 0xB6, 0xD2, - 0x30, 0xB5, 0xC6, 0xB3, 0x0C, 0x8E, 0x34, 0xC8, 0x08, 0x75, 0x38, 0x8C, 0xCF, 0x23, 0xFB, 0x38 }, - }, - { - { 0x25, 0x50, 0x90, 0x44, 0x10, 0xAE, 0x84, 0xA6, 0xF8, 0xAD, 0xF5, 0x40, 0x46, 0x38, 0x7E, 0xBC, - 0x92, 0x6F, 0x0B, 0x2F, 0x66, 0x94, 0x61, 0xD7, 0xE6, 0x1A, 0xEE, 0x8D, 0xCE, 0xB8, 0x71, 0x3B }, - }, - { - { 0x25, 0x5A, 0x49, 0x8B, 0xEB, 0x7C, 0x89, 0x42, 0x74, 0xE5, 0xE3, 0xD4, 0x3B, 0x27, 0xAD, 0x66, - 0x62, 0x0B, 0x90, 0xCB, 0x91, 0x62, 0xC4, 0x68, 0x5F, 0xA2, 0x6D, 0x85, 0xF5, 0xA4, 0x3A, 0xA0 }, - }, - { - { 0x25, 0x6F, 0xD8, 0x6F, 0x52, 0x51, 0x34, 0x36, 0x1D, 0xA8, 0x0C, 0x18, 0xE5, 0xE2, 0x9F, 0x75, - 0xF1, 0x10, 0xCA, 0x94, 0xB6, 0x2C, 0xD7, 0x18, 0x33, 0x1A, 0xDE, 0xBF, 0x81, 0x64, 0x6B, 0x3E }, - }, - { - { 0x25, 0x8C, 0x68, 0x91, 0xF0, 0x89, 0xB5, 0x09, 0x4B, 0xE3, 0x3D, 0x6C, 0x82, 0x21, 0x5E, 0x72, - 0x65, 0xAC, 0xA9, 0x3F, 0x7C, 0x9B, 0x41, 0x45, 0xD0, 0x8A, 0xFF, 0x1F, 0x48, 0x30, 0x58, 0xAA }, - }, { { 0x26, 0x03, 0xCB, 0xDF, 0x69, 0x75, 0xE3, 0x68, 0x83, 0x7F, 0x95, 0x1A, 0x00, 0x49, 0xFD, 0xC3, 0xC4, 0xB2, 0x39, 0xF0, 0x82, 0xF6, 0xBF, 0x89, 0x5D, 0xB8, 0xF3, 0x27, 0x05, 0xE6, 0x9C, 0xF3 }, }, - { - { 0x26, 0x33, 0xFD, 0x33, 0x50, 0xF8, 0x73, 0x50, 0x2D, 0x94, 0x53, 0x7A, 0xD8, 0x66, 0x3D, 0x2A, - 0xEF, 0xA5, 0x9A, 0x03, 0x57, 0x28, 0x8C, 0x64, 0x42, 0x3C, 0x74, 0xC8, 0x6F, 0x8C, 0x92, 0xB9 }, - }, - { - { 0x26, 0x5F, 0x09, 0x6C, 0x74, 0xF9, 0xC4, 0x5A, 0x3B, 0xD3, 0x7C, 0x2B, 0xC8, 0x23, 0xEE, 0x27, - 0x1A, 0x23, 0xF8, 0xF5, 0xC0, 0x9E, 0x1B, 0x71, 0x68, 0x7A, 0xEC, 0x17, 0xE3, 0x8E, 0x46, 0x91 }, - }, - { - { 0x26, 0xB2, 0x11, 0xCC, 0x34, 0x6D, 0x60, 0x37, 0x1B, 0x24, 0xBD, 0x0D, 0xBA, 0xB3, 0xF4, 0x3D, - 0x5D, 0xE3, 0xF2, 0x05, 0x47, 0xC1, 0x4C, 0x0B, 0xA1, 0xE0, 0xB2, 0xED, 0xDD, 0x73, 0x02, 0x64 }, - }, - { - { 0x26, 0xB9, 0x4C, 0xA0, 0x1E, 0x63, 0x4E, 0xD0, 0xCB, 0x4F, 0xF3, 0xC9, 0xBC, 0xC2, 0x8A, 0x5E, - 0x8F, 0x49, 0xCA, 0xCD, 0xE7, 0xEB, 0xA2, 0x63, 0x2D, 0x3D, 0x30, 0x3F, 0xB2, 0xED, 0xE8, 0x63 }, - }, - { - { 0x27, 0x16, 0xE1, 0x51, 0x81, 0x4B, 0xC2, 0x23, 0x49, 0x83, 0xF6, 0x53, 0xBF, 0x4D, 0x47, 0x1D, - 0x37, 0x5B, 0xDA, 0xCB, 0x3E, 0xAA, 0xEA, 0x96, 0xB4, 0x80, 0xCD, 0xDA, 0xCA, 0x0D, 0x4C, 0xDA }, - }, { { 0x27, 0x50, 0x11, 0x93, 0xE4, 0x61, 0xCA, 0xCE, 0x55, 0x32, 0xFA, 0xD5, 0xD5, 0xB2, 0x7E, 0x01, 0x16, 0x57, 0x92, 0xE0, 0x4F, 0x24, 0x21, 0x93, 0x2F, 0x39, 0x28, 0xAF, 0x9F, 0xCD, 0xA4, 0xF3 }, @@ -872,18 +276,6 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x28, 0x07, 0x10, 0x60, 0x44, 0x03, 0x45, 0xD0, 0x0E, 0x80, 0xB9, 0xD7, 0xCB, 0xE1, 0x87, 0xC1, 0xD8, 0xB0, 0xF2, 0xEF, 0x5D, 0x0A, 0xAC, 0x9C, 0xCE, 0xEF, 0x9A, 0x8C, 0x5A, 0x06, 0xF3, 0x02 }, }, - { - { 0x28, 0x16, 0x1F, 0x94, 0xD5, 0xA3, 0xFE, 0x36, 0x1F, 0x3C, 0xD8, 0xBB, 0xFA, 0x8D, 0x9D, 0xB7, - 0x11, 0x05, 0x8B, 0xA9, 0x67, 0xEE, 0xBD, 0x8D, 0x42, 0xEC, 0xB9, 0x27, 0xBF, 0x09, 0xF4, 0x40 }, - }, - { - { 0x28, 0x76, 0x00, 0xE8, 0x45, 0x25, 0xA9, 0xE2, 0xEF, 0xB3, 0xC3, 0x30, 0xD8, 0x0E, 0xC6, 0x0C, - 0x3F, 0x7D, 0x7B, 0xB2, 0x07, 0x89, 0x4E, 0xB6, 0xCD, 0x7B, 0x85, 0xEE, 0x74, 0xFF, 0x9A, 0x46 }, - }, - { - { 0x28, 0xC2, 0x4D, 0x7A, 0xEF, 0xCB, 0xA0, 0x50, 0x94, 0x94, 0xEF, 0x21, 0x06, 0x48, 0x17, 0xFB, - 0xAA, 0x89, 0x1F, 0xB3, 0xC5, 0x2F, 0xC7, 0x17, 0x81, 0xDD, 0x5E, 0xAC, 0x18, 0xD7, 0x4D, 0x7A }, - }, { { 0x28, 0xD9, 0x51, 0x84, 0xB5, 0xEA, 0x14, 0x0F, 0x47, 0x4F, 0x3A, 0xF6, 0xCE, 0x70, 0x52, 0xE8, 0x59, 0x3C, 0xF3, 0xA5, 0x01, 0x0F, 0x52, 0x24, 0x1A, 0x1E, 0x36, 0x64, 0x60, 0xE5, 0x91, 0x9E }, @@ -892,66 +284,14 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x29, 0x01, 0x93, 0xE3, 0x7A, 0x38, 0x87, 0xFD, 0x36, 0x15, 0xDF, 0x12, 0x2E, 0x95, 0x21, 0x17, 0x42, 0x15, 0xEE, 0x68, 0xF7, 0x44, 0xB2, 0xFA, 0x35, 0xD2, 0x9C, 0x5D, 0xF1, 0x08, 0xF5, 0x5B }, }, - { - { 0x29, 0x0C, 0x79, 0x6F, 0x6D, 0x23, 0xDE, 0x2A, 0xAE, 0x80, 0x77, 0xAB, 0xCC, 0xFC, 0x52, 0xEE, - 0x5C, 0x71, 0x35, 0x3F, 0x9A, 0xB6, 0xBD, 0x56, 0x5C, 0x6A, 0xBD, 0x26, 0x9F, 0xF5, 0xE9, 0xBA }, - }, - { - { 0x29, 0x4A, 0x2B, 0xF8, 0x7B, 0x50, 0x1D, 0x28, 0x4F, 0x37, 0x80, 0x96, 0x0E, 0x8E, 0x72, 0xA1, - 0x8A, 0xF1, 0xC6, 0x3B, 0xD7, 0xDE, 0x4C, 0x4D, 0xDE, 0xA3, 0x7B, 0xF0, 0x27, 0xD4, 0x2C, 0xB8 }, - }, - { - { 0x29, 0x54, 0x18, 0x23, 0xE0, 0x69, 0x14, 0xB4, 0xD6, 0x2A, 0x93, 0x8D, 0xC4, 0x9C, 0x8A, 0x0D, - 0x17, 0xD9, 0x94, 0x96, 0x0E, 0xEE, 0xC7, 0xD9, 0x75, 0x31, 0xAF, 0x71, 0x5E, 0xDE, 0x4A, 0xDF }, - }, - { - { 0x29, 0x74, 0x8A, 0x69, 0xE9, 0x42, 0xA0, 0x67, 0xE6, 0xA6, 0xA3, 0x5A, 0x9D, 0x40, 0x00, 0x0A, - 0x31, 0x8D, 0x7D, 0xDF, 0x5F, 0x5A, 0x2F, 0x4D, 0x3D, 0x18, 0xBE, 0xBA, 0xD3, 0x96, 0x91, 0xEC }, - }, - { - { 0x29, 0x7A, 0xC8, 0x25, 0xC1, 0x98, 0x06, 0xFB, 0x88, 0x1F, 0xD9, 0x1C, 0x61, 0x2D, 0x6C, 0xC2, - 0x1B, 0x28, 0xE4, 0xA5, 0x72, 0xCF, 0xB7, 0x16, 0x04, 0xE5, 0x54, 0x41, 0x4D, 0xFD, 0xEA, 0xDC }, - }, - { - { 0x29, 0xA8, 0x28, 0x26, 0x64, 0x3D, 0x5A, 0x98, 0xC4, 0x7D, 0xF3, 0xA7, 0x8F, 0xBB, 0x84, 0x49, - 0xB3, 0xE6, 0xD3, 0xCC, 0xE6, 0x2C, 0xF4, 0x57, 0x12, 0xA4, 0xCD, 0x99, 0x21, 0xF3, 0xC6, 0x88 }, - }, - { - { 0x29, 0xD4, 0x91, 0x44, 0x01, 0x60, 0x8A, 0xE7, 0x65, 0x51, 0x53, 0xB6, 0x23, 0x67, 0x1F, 0x75, - 0x92, 0x99, 0x4D, 0x4B, 0xE3, 0x88, 0x39, 0x59, 0x13, 0xA3, 0x60, 0x22, 0x1F, 0x90, 0xC0, 0x91 }, - }, { { 0x2A, 0x0F, 0x70, 0x67, 0x6E, 0x18, 0x4D, 0x49, 0x39, 0xA4, 0x04, 0xDE, 0x35, 0xAC, 0x84, 0xAB, 0x81, 0xAF, 0xEC, 0x36, 0x17, 0xE7, 0xE1, 0xBF, 0x34, 0x67, 0xD4, 0x19, 0x25, 0x5D, 0xD8, 0x17 }, }, - { - { 0x2A, 0x6B, 0x9F, 0x6F, 0xDC, 0x43, 0xBF, 0x65, 0xE2, 0xA1, 0x0E, 0xDE, 0x36, 0x64, 0xC8, 0x3F, - 0xCB, 0xEC, 0x13, 0x9A, 0x6E, 0x6C, 0xC5, 0xC8, 0x32, 0xD3, 0x27, 0x89, 0x5B, 0x52, 0x0E, 0xA2 }, - }, { { 0x2A, 0xA6, 0x47, 0x8C, 0xC7, 0x5D, 0x67, 0xA8, 0xCA, 0x55, 0xB2, 0xE1, 0x63, 0xFD, 0xBB, 0xBC, 0x9D, 0x74, 0xB4, 0xE5, 0xF3, 0x7B, 0x7D, 0xBD, 0x13, 0xC9, 0x4E, 0x85, 0x8D, 0x40, 0xDA, 0xD0 }, }, - { - { 0x2A, 0xC0, 0x65, 0xAE, 0x39, 0x6B, 0x87, 0x54, 0x9C, 0x3F, 0x09, 0xE5, 0x8F, 0x16, 0x4B, 0x24, - 0x2E, 0xC5, 0x9D, 0x13, 0x92, 0xB1, 0xB2, 0x50, 0x14, 0xBF, 0x47, 0x94, 0xAC, 0x13, 0x01, 0xB0 }, - }, - { - { 0x2B, 0x36, 0xDE, 0x39, 0xD5, 0xED, 0x42, 0xE1, 0xEC, 0x06, 0x57, 0x49, 0xD5, 0x82, 0xE0, 0x14, - 0xB5, 0xAF, 0xF2, 0x67, 0xF8, 0x7C, 0x03, 0x15, 0x27, 0xD9, 0x15, 0xAB, 0x43, 0x02, 0x88, 0x9E }, - }, - { - { 0x2B, 0x66, 0x75, 0xF5, 0x89, 0x9B, 0x2D, 0x3F, 0x36, 0xAF, 0x0A, 0x0F, 0xFB, 0xB6, 0xDC, 0x60, - 0x3E, 0x4C, 0x9E, 0x82, 0x8D, 0xA2, 0xB2, 0xD0, 0x24, 0xE3, 0x04, 0x30, 0x71, 0xAB, 0x15, 0xCE }, - }, - { - { 0x2B, 0x6E, 0x7A, 0xF1, 0xDE, 0x52, 0xF4, 0xAF, 0x97, 0xCC, 0x3A, 0x13, 0x6D, 0xCB, 0x82, 0xE0, - 0xF2, 0xCA, 0x06, 0xA8, 0x73, 0x16, 0x9C, 0x02, 0x87, 0x86, 0x10, 0x18, 0x44, 0xC3, 0x05, 0x15 }, - }, - { - { 0x2B, 0xDC, 0xF7, 0x06, 0x67, 0x7A, 0x3B, 0x68, 0xF1, 0x37, 0xF7, 0xF6, 0x9B, 0x36, 0x6B, 0x79, - 0xCA, 0x5A, 0xEB, 0xD3, 0x35, 0xBF, 0xB9, 0xD0, 0x3D, 0x58, 0xBD, 0x85, 0xA8, 0x66, 0x36, 0xBB }, - }, { { 0x2B, 0xF1, 0xE3, 0xF0, 0x37, 0x5A, 0x9A, 0x21, 0xC0, 0x7A, 0x92, 0x18, 0x04, 0x2F, 0x18, 0x77, 0x3F, 0x43, 0xEA, 0xB0, 0xF5, 0xC0, 0x00, 0x26, 0x45, 0x40, 0x48, 0x2F, 0x04, 0xAE, 0x18, 0xEF }, @@ -960,10 +300,6 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x2C, 0x82, 0x47, 0x4F, 0x0E, 0xF6, 0xCB, 0x65, 0x0A, 0x13, 0xEF, 0x20, 0x99, 0x6E, 0x65, 0x7B, 0x67, 0x24, 0xF0, 0xA0, 0xD5, 0xEE, 0x24, 0x6D, 0x26, 0xBB, 0xFA, 0x0A, 0xBB, 0x2C, 0x22, 0xE1 }, }, - { - { 0x2C, 0x8C, 0xDE, 0x6B, 0xB0, 0xD1, 0x2C, 0xD2, 0xDD, 0x63, 0xE9, 0x40, 0x09, 0x4F, 0xD2, 0x62, - 0x5D, 0x2C, 0xFD, 0x9A, 0x64, 0x7E, 0x0C, 0x64, 0x0E, 0xCF, 0x1C, 0x78, 0x92, 0x1E, 0xEA, 0x17 }, - }, { { 0x2C, 0x9B, 0xE1, 0x2D, 0xA4, 0x99, 0xEA, 0xBB, 0x2F, 0xFD, 0xF9, 0x91, 0x6F, 0x2B, 0x27, 0x18, 0x81, 0x19, 0x5B, 0x74, 0x19, 0xBD, 0x1E, 0xEF, 0x8D, 0x50, 0x77, 0x2A, 0xB9, 0x46, 0x4A, 0xA8 }, @@ -972,42 +308,10 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x2C, 0xBD, 0xD5, 0x6C, 0xE4, 0xB4, 0x06, 0x09, 0xE9, 0xAA, 0x52, 0x1E, 0xAA, 0x76, 0xAC, 0x7E, 0x55, 0x73, 0x7B, 0xF4, 0x3E, 0x2B, 0x0C, 0x30, 0xDD, 0xCF, 0x59, 0x87, 0x2E, 0xAB, 0xE7, 0x7B }, }, - { - { 0x2C, 0xF2, 0x6D, 0xA5, 0x76, 0x7E, 0xDE, 0x07, 0xC3, 0x73, 0x58, 0xCD, 0x5F, 0x71, 0xD1, 0x23, - 0xBB, 0x19, 0x77, 0x28, 0x85, 0x87, 0xC7, 0x3F, 0x84, 0xB0, 0x8F, 0xF8, 0xAA, 0x01, 0x9A, 0x69 }, - }, - { - { 0x2D, 0x0C, 0xE9, 0x16, 0x71, 0xC2, 0x54, 0x4C, 0xF6, 0xBD, 0x10, 0x30, 0x6F, 0x9B, 0x2C, 0x91, - 0x75, 0xF2, 0xC3, 0x1A, 0x23, 0x8E, 0x14, 0x68, 0x67, 0x65, 0x97, 0x89, 0x87, 0x3D, 0xC1, 0x75 }, - }, - { - { 0x2D, 0x5F, 0x95, 0xEF, 0x95, 0xAD, 0x1C, 0xCA, 0xC8, 0xE8, 0x25, 0xC1, 0x61, 0x5F, 0x82, 0x1F, - 0x0F, 0x44, 0xDF, 0xB8, 0xAA, 0x31, 0xDD, 0xF2, 0xC9, 0x83, 0x3E, 0x50, 0xC6, 0x95, 0x1C, 0xC0 }, - }, - { - { 0x2D, 0x9C, 0xC0, 0x3B, 0xC4, 0x51, 0xD1, 0xE0, 0xBA, 0x65, 0x11, 0xF4, 0x89, 0x31, 0x75, 0xD0, - 0x43, 0x46, 0x85, 0x6A, 0x41, 0x69, 0x86, 0x99, 0x4E, 0x94, 0x60, 0xD7, 0x4A, 0x48, 0x40, 0xB9 }, - }, - { - { 0x2D, 0xB5, 0x36, 0x48, 0xA6, 0x14, 0x69, 0x57, 0x01, 0xC7, 0xC5, 0x1E, 0x35, 0xFF, 0x38, 0xD6, - 0x4F, 0x27, 0xA2, 0x7D, 0x55, 0xDF, 0xF4, 0xB1, 0x4A, 0xC4, 0x50, 0xC7, 0x5E, 0xB1, 0x18, 0x6E }, - }, - { - { 0x2D, 0xD5, 0xE6, 0xD3, 0x73, 0x36, 0x34, 0x2F, 0x01, 0x1E, 0xB9, 0x7A, 0x2B, 0x77, 0x38, 0x9D, - 0xE6, 0xD2, 0x23, 0x8D, 0x87, 0x69, 0x65, 0x08, 0x2F, 0xD7, 0x94, 0x47, 0x00, 0x50, 0xBE, 0x12 }, - }, { { 0x2D, 0xDE, 0xE4, 0x5F, 0x72, 0x78, 0x38, 0xDE, 0xAD, 0xE6, 0x7E, 0x9C, 0xA7, 0x05, 0xEB, 0xB4, 0xC2, 0xE9, 0x40, 0xAE, 0x1B, 0x9D, 0x62, 0x35, 0x72, 0x18, 0x04, 0x58, 0x31, 0xE9, 0x8F, 0xDE }, }, - { - { 0x2E, 0x17, 0x46, 0x49, 0x4E, 0x86, 0xD6, 0x93, 0x0B, 0x24, 0x98, 0x8B, 0x12, 0x9B, 0x38, 0x6B, - 0xC2, 0x08, 0xE2, 0xFB, 0xC8, 0xD3, 0xEA, 0x27, 0x7A, 0x23, 0xE5, 0x46, 0x33, 0xAF, 0xF1, 0x8F }, - }, - { - { 0x2E, 0x43, 0x2A, 0x54, 0x5D, 0xFE, 0x2D, 0xA3, 0xAD, 0x00, 0xCC, 0x87, 0x89, 0x23, 0xA1, 0x85, - 0xD6, 0xA3, 0xF9, 0x67, 0x5C, 0x36, 0xDC, 0x3C, 0xD3, 0x70, 0x2A, 0xEF, 0xEB, 0x27, 0x0C, 0x85 }, - }, { { 0x2E, 0x5D, 0xD2, 0x55, 0x09, 0x6D, 0x64, 0x83, 0x10, 0x5C, 0xB6, 0x03, 0x6C, 0x59, 0x17, 0x57, 0xFD, 0x98, 0x49, 0x70, 0x66, 0x05, 0x3F, 0x83, 0x39, 0xE4, 0xD8, 0xD0, 0xC3, 0x75, 0x49, 0x03 }, @@ -1016,46 +320,10 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x2E, 0xD2, 0x05, 0x8F, 0x39, 0xEA, 0xBA, 0x5C, 0xB3, 0xD7, 0xDF, 0x24, 0xCA, 0x74, 0xA7, 0x7D, 0xDC, 0x12, 0x06, 0x01, 0x52, 0x7B, 0x0F, 0x51, 0x06, 0x91, 0x05, 0xCA, 0x88, 0x37, 0x6E, 0x20 }, }, - { - { 0x2F, 0x39, 0xBB, 0x30, 0xAA, 0x5C, 0xBB, 0x62, 0x01, 0x7C, 0x6C, 0x79, 0x90, 0xE3, 0xF9, 0xA4, - 0x0D, 0x46, 0x9F, 0x76, 0x50, 0x59, 0x81, 0xC8, 0x6F, 0x95, 0x55, 0x4F, 0x48, 0x7A, 0x52, 0x76 }, - }, - { - { 0x2F, 0x79, 0xD6, 0xF6, 0xA3, 0x2F, 0x1B, 0xEE, 0x22, 0x37, 0xA0, 0x18, 0xE6, 0xAE, 0xC4, 0xF4, - 0x9E, 0x2C, 0x5C, 0x3C, 0xDB, 0xB6, 0x99, 0xE1, 0x6F, 0x8E, 0xF4, 0x14, 0xEE, 0xFF, 0x8D, 0xA3 }, - }, - { - { 0x2F, 0x8B, 0xC9, 0x6F, 0x12, 0x95, 0x05, 0x6C, 0x10, 0x67, 0x20, 0x39, 0x57, 0xE3, 0xCB, 0xCC, - 0x3B, 0x16, 0xC4, 0x91, 0xD4, 0xDA, 0xC0, 0xA7, 0xDE, 0xE4, 0x2D, 0xD5, 0x4C, 0x10, 0xD4, 0x96 }, - }, - { - { 0x2F, 0x9B, 0x7B, 0x60, 0xA3, 0xE8, 0x74, 0x2C, 0x5D, 0xBE, 0x3E, 0xC6, 0x01, 0x69, 0xD7, 0xA4, - 0x4F, 0x1B, 0xB5, 0x6D, 0x51, 0xF6, 0x51, 0x37, 0x2C, 0x28, 0x32, 0x69, 0x33, 0x7B, 0xF8, 0x15 }, - }, - { - { 0x2F, 0xEF, 0xA7, 0xCB, 0x12, 0x6B, 0x81, 0xC9, 0x47, 0x4D, 0x3E, 0x2C, 0x9B, 0x97, 0x3A, 0x83, - 0x69, 0xBB, 0x08, 0x43, 0x41, 0xD3, 0x82, 0xD3, 0x7E, 0x9E, 0x95, 0xC4, 0xDB, 0xE3, 0x71, 0xEE }, - }, - { - { 0x30, 0x2B, 0xC4, 0xAF, 0xFB, 0x52, 0xA9, 0xA6, 0xB9, 0x7A, 0x1D, 0xBF, 0x87, 0x98, 0xFA, 0xB2, - 0xAD, 0x57, 0xD3, 0x6F, 0x75, 0x84, 0x88, 0x8E, 0x03, 0x67, 0x4A, 0x5D, 0xD6, 0xE1, 0x09, 0x91 }, - }, - { - { 0x30, 0x2F, 0x5D, 0xC8, 0xF0, 0x75, 0xED, 0x03, 0x99, 0xD4, 0xBB, 0x3E, 0xA1, 0x92, 0x25, 0xDA, - 0x56, 0x3C, 0x9E, 0x3C, 0xF3, 0xA6, 0xF8, 0x0D, 0x28, 0x4D, 0x55, 0x31, 0xC2, 0xD0, 0xDD, 0xF7 }, - }, - { - { 0x30, 0x35, 0x3B, 0x41, 0x90, 0x04, 0xDD, 0x1B, 0xA0, 0x64, 0x4A, 0x2A, 0x0B, 0x7B, 0xE9, 0x4F, - 0xB8, 0x6F, 0x5E, 0x27, 0x5D, 0x67, 0x94, 0xA6, 0xDB, 0xBA, 0xA3, 0x21, 0x32, 0x3E, 0xD8, 0xB7 }, - }, { { 0x30, 0x7B, 0x09, 0x34, 0xEF, 0x97, 0x85, 0xE7, 0x08, 0xED, 0x48, 0x1A, 0x99, 0x7A, 0x8A, 0x88, 0xB7, 0xBF, 0x22, 0xDD, 0x26, 0xAA, 0x17, 0x17, 0x31, 0xB8, 0xF7, 0xE0, 0xD5, 0x97, 0xB7, 0x08 }, }, - { - { 0x30, 0x9B, 0x6E, 0x00, 0x40, 0x46, 0x87, 0x96, 0x01, 0xA0, 0xD8, 0xA0, 0x42, 0x3F, 0x73, 0xB1, - 0x6A, 0x91, 0xA4, 0xBC, 0x16, 0xED, 0x2A, 0x84, 0x60, 0x66, 0xCD, 0xC0, 0x38, 0x2F, 0x97, 0x71 }, - }, { { 0x30, 0xCB, 0x41, 0x11, 0xFB, 0x10, 0x08, 0x6F, 0xC6, 0xA4, 0x1F, 0x04, 0xB7, 0xE9, 0xD4, 0xCF, 0x66, 0x10, 0xBB, 0x06, 0x59, 0xD8, 0xE2, 0xAC, 0x80, 0x4F, 0xC8, 0x96, 0xB0, 0x25, 0x42, 0xBB }, @@ -1072,74 +340,18 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x31, 0xB8, 0x3E, 0x01, 0x90, 0x98, 0x95, 0xBC, 0x74, 0x2D, 0x6B, 0xE8, 0x40, 0x0A, 0xDE, 0x51, 0xB2, 0x09, 0x83, 0xF6, 0x83, 0xA2, 0xAA, 0xEE, 0xB2, 0x5F, 0x58, 0xDF, 0x98, 0x1B, 0xDE, 0x0D }, }, - { - { 0x31, 0xED, 0x8A, 0x8C, 0xC6, 0xEE, 0x5E, 0x88, 0x4F, 0x21, 0x4F, 0x26, 0x7F, 0xE3, 0xA2, 0x27, - 0xD4, 0xE6, 0xED, 0x36, 0xA7, 0x7F, 0xA2, 0x24, 0x6F, 0x0A, 0xD0, 0x77, 0x8A, 0x6B, 0x3F, 0x97 }, - }, - { - { 0x32, 0x36, 0x98, 0x50, 0x9D, 0x8F, 0x8B, 0xFB, 0xD4, 0xF9, 0x04, 0xBD, 0x1D, 0x84, 0x64, 0x12, - 0xC5, 0x27, 0xB7, 0x70, 0x06, 0x2A, 0xAD, 0xDF, 0x9E, 0x91, 0x9D, 0x84, 0x10, 0xEA, 0xA4, 0x9F }, - }, - { - { 0x32, 0x8B, 0x9A, 0x45, 0xEF, 0xEF, 0x20, 0xB5, 0xD1, 0x57, 0x39, 0xDD, 0xFA, 0xC1, 0x0C, 0x7E, - 0xFE, 0x5F, 0xA7, 0x96, 0xBF, 0xE0, 0x1E, 0xD1, 0xA1, 0x25, 0xA9, 0x15, 0x8E, 0x2F, 0x1B, 0x17 }, - }, - { - { 0x32, 0x9B, 0x70, 0xBF, 0x79, 0xD8, 0x11, 0x7E, 0x95, 0x3B, 0x49, 0x97, 0xBB, 0x62, 0x72, 0xDF, - 0x50, 0x49, 0x5F, 0xA0, 0xB4, 0x5B, 0xAD, 0xB3, 0xEC, 0x0A, 0x83, 0x16, 0x33, 0x6F, 0xE3, 0xA2 }, - }, - { - { 0x32, 0xDB, 0xC4, 0x6B, 0x80, 0x80, 0x5A, 0x56, 0x97, 0x4B, 0x2A, 0x5D, 0xDE, 0x67, 0x34, 0x28, - 0xED, 0x03, 0xB0, 0x76, 0x5E, 0x15, 0xD9, 0x4C, 0x55, 0xE5, 0x4D, 0x2F, 0x55, 0x70, 0xF2, 0x0B }, - }, { { 0x32, 0xEF, 0x13, 0x33, 0x86, 0xBF, 0x0C, 0x63, 0xCF, 0x29, 0xD6, 0x2B, 0x0D, 0x76, 0x88, 0x9E, 0x9D, 0x9D, 0x53, 0x2E, 0xE4, 0x90, 0x38, 0x94, 0x4D, 0xBC, 0x21, 0x49, 0xD8, 0xCA, 0xA5, 0xD1 }, }, - { - { 0x33, 0x03, 0x23, 0x10, 0x4C, 0x25, 0x2F, 0xCE, 0xB9, 0xE6, 0x63, 0x0D, 0x9F, 0xE7, 0x1F, 0x17, - 0xB6, 0xC2, 0x25, 0xA6, 0x5C, 0x76, 0x08, 0x15, 0xE4, 0x08, 0x74, 0x6C, 0x33, 0x1A, 0xB4, 0xF6 }, - }, - { - { 0x33, 0x0D, 0x78, 0x66, 0xC2, 0x5F, 0x7C, 0xE3, 0x47, 0x3C, 0x6D, 0x55, 0x9C, 0xEA, 0x4B, 0x94, - 0x01, 0xF9, 0xE5, 0x2E, 0x4C, 0x24, 0x7A, 0x5E, 0x49, 0xA1, 0xF1, 0x44, 0x59, 0x9A, 0x5A, 0x79 }, - }, - { - { 0x33, 0xC9, 0x15, 0x03, 0xBC, 0x7E, 0xBE, 0x5A, 0x5D, 0xD0, 0xCF, 0xBB, 0x37, 0x52, 0x64, 0xDD, - 0x5A, 0x31, 0x1E, 0x48, 0xF4, 0x26, 0x6B, 0x32, 0x50, 0x8A, 0x02, 0x5D, 0x04, 0xFA, 0xDF, 0x38 }, - }, { { 0x34, 0x06, 0x4F, 0xF9, 0x3B, 0x27, 0x4C, 0xF5, 0xA7, 0x24, 0xEC, 0x19, 0x64, 0x50, 0x4A, 0x71, 0x0A, 0xB9, 0x7B, 0xA1, 0x10, 0x3C, 0xD9, 0xB9, 0x8C, 0x81, 0xD0, 0xAB, 0xCF, 0x3B, 0x19, 0xBD }, }, - { - { 0x34, 0x15, 0x1A, 0x33, 0x82, 0x78, 0xDA, 0x7E, 0xC2, 0x62, 0x33, 0x81, 0x7D, 0x96, 0x44, 0xB5, - 0x6F, 0x8F, 0x48, 0xC1, 0xC3, 0x70, 0xCD, 0x25, 0xFC, 0xE7, 0xDE, 0x64, 0x54, 0x4F, 0xE9, 0x36 }, - }, { { 0x34, 0x65, 0xC2, 0xF9, 0xA0, 0xCF, 0x36, 0xE5, 0xEE, 0xF0, 0x27, 0x1C, 0x52, 0x91, 0x2D, 0x58, 0x6F, 0xB2, 0x0B, 0x94, 0x43, 0xE7, 0xD5, 0x82, 0xA3, 0xE2, 0x23, 0x93, 0xFA, 0xC8, 0x1B, 0xB4 }, }, - { - { 0x34, 0x9B, 0x72, 0x1D, 0x0B, 0xB9, 0xA4, 0xC4, 0xAA, 0x33, 0x43, 0x60, 0xA6, 0x6A, 0xC3, 0xA7, - 0x3F, 0xA8, 0xD8, 0xD3, 0x60, 0x0D, 0x89, 0x4E, 0xB0, 0xC7, 0xD2, 0x84, 0x23, 0xC6, 0x78, 0x57 }, - }, - { - { 0x34, 0xE6, 0xF1, 0x7A, 0x14, 0xD3, 0xD2, 0x8A, 0xFD, 0x51, 0xCF, 0x40, 0x49, 0x3A, 0xB2, 0xCF, - 0xE0, 0x18, 0xEF, 0x98, 0x1E, 0x23, 0xF1, 0xFC, 0x91, 0x60, 0xFB, 0x91, 0x2C, 0xDC, 0x5C, 0xB9 }, - }, - { - { 0x35, 0x13, 0x6F, 0x88, 0xB4, 0x24, 0x76, 0x0E, 0x17, 0x5E, 0xFC, 0x19, 0x9B, 0x75, 0xE5, 0x25, - 0x35, 0xF2, 0xDF, 0x59, 0xFF, 0xD0, 0x69, 0x3A, 0x5A, 0x3F, 0x78, 0x1F, 0x6F, 0xF4, 0xB6, 0x50 }, - }, - { - { 0x35, 0x49, 0xB6, 0xEC, 0xBD, 0x8D, 0x25, 0x2B, 0xE7, 0x17, 0xB9, 0x22, 0x73, 0x27, 0x38, 0x08, - 0x0B, 0xAF, 0xD5, 0x60, 0xB4, 0x5A, 0x05, 0x40, 0x33, 0xBD, 0x11, 0x0B, 0x3C, 0x39, 0x48, 0x22 }, - }, - { - { 0x35, 0x58, 0x91, 0xA3, 0x12, 0x34, 0xFD, 0xD0, 0x84, 0x79, 0xB8, 0xAB, 0xA8, 0x58, 0x1E, 0x85, - 0x7C, 0x6B, 0x5C, 0x6B, 0x40, 0xCF, 0xFC, 0x7B, 0x67, 0x80, 0x92, 0x65, 0x1F, 0x06, 0x87, 0xC1 }, - }, { { 0x35, 0x98, 0x10, 0xFF, 0xFE, 0xD1, 0x3A, 0x2C, 0x25, 0xCD, 0x91, 0xFC, 0xF0, 0x85, 0x59, 0x33, 0xC9, 0x94, 0xA9, 0xDF, 0xC9, 0x39, 0x2D, 0x97, 0x07, 0xC3, 0xC0, 0xE7, 0x30, 0x0F, 0x90, 0x8D }, @@ -1160,38 +372,10 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x36, 0xF5, 0xA9, 0x7D, 0x79, 0x3F, 0x84, 0x97, 0x44, 0xD6, 0xAB, 0x39, 0xB7, 0xA8, 0x18, 0xF8, 0x17, 0x6E, 0x65, 0x20, 0xDC, 0x86, 0x3D, 0xCE, 0x43, 0xB3, 0x98, 0xC3, 0x0B, 0x5E, 0xDB, 0x09 }, }, - { - { 0x37, 0x07, 0x9D, 0x98, 0x72, 0x7C, 0x42, 0xA4, 0x1D, 0x66, 0x18, 0xFC, 0xCD, 0xC6, 0xFF, 0xA1, - 0x5E, 0xD3, 0xB2, 0xFE, 0xC7, 0xAC, 0x0A, 0x09, 0x7B, 0x74, 0xC5, 0x72, 0xBB, 0xCD, 0xA8, 0xD7 }, - }, - { - { 0x37, 0x87, 0x37, 0xCD, 0x85, 0x19, 0xBA, 0xC5, 0x32, 0x2F, 0xDB, 0x28, 0xF4, 0x4A, 0x43, 0xC5, - 0x09, 0xA5, 0x44, 0x7A, 0xD2, 0x68, 0x3B, 0xA1, 0x90, 0x05, 0xE3, 0x1B, 0x0D, 0x54, 0x8C, 0x6D }, - }, - { - { 0x37, 0x98, 0xB3, 0x35, 0x53, 0x40, 0xD2, 0x76, 0x2A, 0x02, 0x08, 0xF3, 0x47, 0x20, 0xD2, 0xA1, - 0x52, 0xEF, 0xA9, 0xE8, 0x96, 0x57, 0x18, 0xB8, 0x93, 0x06, 0xF6, 0x91, 0x33, 0x56, 0x32, 0xE9 }, - }, - { - { 0x37, 0x99, 0x0F, 0x5B, 0x5C, 0x71, 0x11, 0x89, 0x98, 0xF9, 0xC8, 0xE1, 0x54, 0x65, 0x69, 0x16, - 0x1A, 0x82, 0xBB, 0xFB, 0x4B, 0x4F, 0xC4, 0xCA, 0xA3, 0xF4, 0xB7, 0xE7, 0x4A, 0xF5, 0x15, 0xFE }, - }, - { - { 0x37, 0xC9, 0x7A, 0x48, 0xF5, 0xEE, 0x3E, 0x68, 0xCC, 0x24, 0xB5, 0x4E, 0x7C, 0x4D, 0x9F, 0x91, - 0xC7, 0xD1, 0x8B, 0x8D, 0xB6, 0x1E, 0x04, 0xEE, 0x64, 0x25, 0x1E, 0x75, 0xB0, 0xD1, 0x9F, 0xC5 }, - }, - { - { 0x37, 0xEC, 0xDB, 0x1E, 0x7A, 0xBA, 0x93, 0xBB, 0x83, 0xC8, 0xC4, 0xB7, 0xBB, 0xDE, 0xAF, 0xFF, - 0xB5, 0x95, 0xC7, 0x3C, 0xA4, 0x21, 0x88, 0xAA, 0xB5, 0x0F, 0x06, 0x27, 0xD3, 0xE1, 0x70, 0x18 }, - }, { { 0x38, 0x23, 0x4E, 0x55, 0x9D, 0x30, 0x27, 0xD1, 0x61, 0xDA, 0x8C, 0x98, 0x88, 0x04, 0x9A, 0x4D, 0x20, 0xAC, 0xF2, 0x00, 0x90, 0xAD, 0x1A, 0x22, 0x2B, 0x73, 0x9A, 0xC8, 0x6E, 0xB7, 0x6F, 0x06 }, }, - { - { 0x38, 0x68, 0xB9, 0x52, 0x53, 0xEF, 0xDB, 0x85, 0x46, 0x62, 0x00, 0xDD, 0xE5, 0x0B, 0x0D, 0x52, - 0xDA, 0x5A, 0x2B, 0x8A, 0x01, 0xB7, 0x26, 0xCE, 0xF6, 0xCE, 0x3B, 0x13, 0x7C, 0x80, 0x6C, 0x05 }, - }, { { 0x39, 0x02, 0x27, 0xCE, 0x88, 0x1C, 0x71, 0x8B, 0x59, 0xA6, 0xBC, 0x31, 0x90, 0xD5, 0x17, 0xE7, 0x1E, 0x1E, 0x58, 0x66, 0x93, 0xC8, 0xBF, 0x8A, 0x30, 0x27, 0x26, 0x20, 0x13, 0xFE, 0x16, 0x63 }, @@ -1200,10 +384,6 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x39, 0x21, 0x5C, 0xAA, 0x37, 0x1A, 0xBE, 0x57, 0x6A, 0xB9, 0x3B, 0x18, 0xC2, 0xF3, 0x75, 0x5E, 0xE2, 0x6F, 0x8C, 0x3A, 0xDB, 0x75, 0x9B, 0x6F, 0x34, 0x78, 0x9F, 0xB8, 0xEC, 0xF0, 0x54, 0x28 }, }, - { - { 0x39, 0x23, 0xD1, 0x9C, 0x31, 0x06, 0x03, 0xCD, 0xFD, 0x06, 0x23, 0x92, 0xD1, 0x76, 0xC0, 0xC6, - 0x92, 0x55, 0xEF, 0xFE, 0xE4, 0xEF, 0xF1, 0x09, 0x29, 0x1C, 0x03, 0xA2, 0x21, 0xBA, 0x91, 0xE2 }, - }, { { 0x39, 0x7B, 0xA8, 0x8A, 0x05, 0xDA, 0xFD, 0x7D, 0x58, 0xFA, 0xCF, 0x45, 0x60, 0xA6, 0x88, 0xAB, 0xEE, 0xD2, 0x13, 0xE0, 0xF8, 0x8C, 0x76, 0xB6, 0x2A, 0xB2, 0xFD, 0xE3, 0x67, 0xC3, 0x2D, 0x32 }, @@ -1212,42 +392,6 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x39, 0x7D, 0x00, 0x6E, 0xF8, 0xAF, 0xB2, 0x0F, 0x43, 0x61, 0xA6, 0xC9, 0x72, 0xF0, 0xC5, 0x7C, 0xC0, 0x87, 0x74, 0x01, 0x06, 0x12, 0x78, 0x3F, 0xBA, 0xBC, 0xB8, 0xD6, 0xF6, 0x03, 0x9E, 0x2C }, }, - { - { 0x39, 0x7D, 0x03, 0x62, 0xFA, 0xED, 0xE6, 0xFA, 0x94, 0x27, 0x4F, 0xFC, 0xF9, 0x8F, 0xF3, 0x52, - 0x55, 0x31, 0x58, 0x5D, 0x18, 0x33, 0xE0, 0x07, 0x3E, 0x5D, 0x20, 0x2D, 0xED, 0x62, 0x39, 0x55 }, - }, - { - { 0x39, 0xB1, 0x9F, 0x06, 0x65, 0xD6, 0x87, 0x8D, 0xD2, 0x5C, 0xA7, 0x30, 0x15, 0xBA, 0x0A, 0xE3, - 0xBD, 0xBA, 0x87, 0xDB, 0xCF, 0xAD, 0x38, 0x7A, 0x94, 0x52, 0x59, 0x4D, 0x73, 0x68, 0xEA, 0x85 }, - }, - { - { 0x39, 0xD7, 0x44, 0x77, 0x31, 0x72, 0x8B, 0xBA, 0x92, 0x36, 0x72, 0x7D, 0xBD, 0x7C, 0x7E, 0xE1, - 0x70, 0xE5, 0x9F, 0x3B, 0x53, 0x73, 0x79, 0x6D, 0x7D, 0xE1, 0xC6, 0xA2, 0xBE, 0x31, 0x22, 0x18 }, - }, - { - { 0x39, 0xDA, 0x1B, 0xE6, 0x56, 0x43, 0x55, 0x34, 0x6E, 0x46, 0x99, 0x66, 0x3C, 0x19, 0x95, 0x54, - 0x87, 0xA0, 0x88, 0x56, 0xFF, 0xBE, 0xEE, 0x74, 0x01, 0x67, 0x99, 0xC7, 0xA3, 0x4B, 0x48, 0xEE }, - }, - { - { 0x39, 0xFF, 0x6E, 0x31, 0x69, 0x9F, 0x5D, 0x68, 0x92, 0x97, 0x6D, 0x11, 0xDD, 0xBB, 0x14, 0x24, - 0xED, 0x0C, 0xEC, 0x48, 0x36, 0x3E, 0x94, 0xEA, 0xE3, 0xCD, 0x5F, 0x4C, 0xAF, 0x1C, 0xBD, 0x2F }, - }, - { - { 0x3A, 0x02, 0xEA, 0xD6, 0x33, 0x22, 0x6E, 0x1E, 0x45, 0x3A, 0x58, 0x50, 0xAE, 0x4D, 0x7C, 0x8D, - 0x3E, 0x0C, 0x25, 0xA4, 0xC9, 0x5C, 0x1E, 0x2D, 0xFB, 0xB7, 0xFF, 0xEB, 0x27, 0xE3, 0x64, 0x7A }, - }, - { - { 0x3A, 0x1F, 0xF2, 0x01, 0x71, 0x88, 0x3F, 0x4E, 0x9B, 0xA9, 0x96, 0x68, 0x79, 0x04, 0xCD, 0xDB, - 0x7A, 0x25, 0xAA, 0x35, 0xB0, 0xAD, 0x8E, 0xA8, 0x78, 0xFB, 0x88, 0x6D, 0xD8, 0xCF, 0x93, 0xCF }, - }, - { - { 0x3A, 0x2D, 0x31, 0x0F, 0x13, 0x05, 0xB4, 0xEB, 0x9D, 0x10, 0x3A, 0xA2, 0x9D, 0x47, 0x86, 0xF7, - 0xDF, 0x41, 0xD8, 0x5D, 0x56, 0xEB, 0xC9, 0x8C, 0x3C, 0xAA, 0xDD, 0x4B, 0xAA, 0x3D, 0x57, 0xF9 }, - }, - { - { 0x3A, 0xB9, 0x0F, 0xFD, 0x22, 0x10, 0xEB, 0x89, 0x9C, 0x6F, 0xB7, 0xFD, 0x26, 0x8D, 0xE0, 0x0B, - 0x00, 0x9F, 0x50, 0xE8, 0x18, 0x70, 0xA2, 0x20, 0xFF, 0xAE, 0xA2, 0x4E, 0x41, 0x76, 0xDE, 0x45 }, - }, { { 0x3A, 0xCF, 0x85, 0x3C, 0x4E, 0x45, 0x02, 0xBD, 0x82, 0xD5, 0x85, 0xD5, 0xE0, 0x82, 0xC4, 0xB3, 0xAD, 0x03, 0xCD, 0xB6, 0xB5, 0x05, 0xCA, 0x80, 0x47, 0x19, 0x88, 0xEC, 0x4C, 0x58, 0x99, 0x9E }, @@ -1260,18 +404,10 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x3B, 0x47, 0x85, 0x0B, 0xF8, 0x4C, 0x4C, 0xF2, 0xCA, 0x6C, 0x31, 0xB3, 0x78, 0x39, 0xC9, 0x50, 0x76, 0x63, 0x70, 0xD7, 0xF4, 0xB6, 0x4A, 0xD0, 0x18, 0x55, 0xCA, 0xCF, 0xE3, 0x51, 0x2F, 0xC3 }, }, - { - { 0x3B, 0x4A, 0x9F, 0x55, 0x6C, 0xCA, 0xC7, 0x0C, 0xA1, 0xF3, 0x3A, 0xF6, 0xDE, 0xCC, 0x66, 0xCA, - 0xFD, 0x2D, 0x30, 0x1D, 0x49, 0x7B, 0x49, 0x0B, 0x30, 0x80, 0x46, 0x35, 0xBA, 0xD2, 0x56, 0x94 }, - }, { { 0x3B, 0x6E, 0x3B, 0xB7, 0x00, 0x04, 0xBD, 0x78, 0xC9, 0x69, 0xA7, 0xFB, 0xD5, 0x11, 0x33, 0xA2, 0xB3, 0xC4, 0xDF, 0xB6, 0xBA, 0x38, 0x5D, 0xCE, 0x3F, 0xB8, 0x4D, 0x73, 0x6B, 0xEA, 0xB1, 0xD9 }, }, - { - { 0x3B, 0x93, 0xAC, 0x19, 0x6E, 0xC6, 0x7B, 0xF2, 0x78, 0x7F, 0x42, 0x40, 0xC0, 0xD1, 0x11, 0x37, - 0xEF, 0x79, 0xA4, 0xED, 0x1F, 0x5D, 0x1F, 0x3D, 0x04, 0x24, 0x1F, 0x03, 0xDC, 0x2D, 0xA3, 0x70 }, - }, { { 0x3B, 0xAA, 0x31, 0x31, 0x70, 0x68, 0xAC, 0xE0, 0x89, 0xAE, 0xB4, 0xA8, 0x8D, 0x7E, 0xDE, 0xBE, 0x94, 0xAB, 0x4A, 0xCE, 0x46, 0xBB, 0xD2, 0x68, 0x3E, 0x3F, 0xDF, 0xF5, 0x59, 0x30, 0x0F, 0x93 }, @@ -1280,54 +416,14 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x3C, 0x38, 0x36, 0x2E, 0x16, 0x8B, 0xB4, 0xA7, 0x59, 0xC4, 0x80, 0x55, 0x1C, 0xB1, 0x65, 0x6F, 0x6A, 0x96, 0x8B, 0x9B, 0x43, 0xCB, 0xE0, 0xD7, 0x39, 0x75, 0x4A, 0xB7, 0x8A, 0x28, 0x87, 0x0E }, }, - { - { 0x3C, 0xE3, 0xF1, 0x9C, 0x03, 0xB3, 0x44, 0x00, 0x75, 0x6F, 0x64, 0x18, 0xE0, 0x12, 0xE9, 0x42, - 0x26, 0x5C, 0x27, 0x11, 0x98, 0x43, 0xFE, 0x0F, 0x44, 0x34, 0x5B, 0x94, 0xC1, 0xB0, 0x6C, 0xEF }, - }, { { 0x3D, 0x14, 0x47, 0x2D, 0xCE, 0x4A, 0xFD, 0xC2, 0x27, 0x6C, 0x81, 0x47, 0x97, 0xC7, 0xBC, 0x7A, 0x6C, 0x14, 0xF7, 0x95, 0x3E, 0x7E, 0x9F, 0xEA, 0x69, 0x51, 0x04, 0x0F, 0x2D, 0xAF, 0xBE, 0x9A }, }, - { - { 0x3D, 0x45, 0xBF, 0x0F, 0x64, 0x9B, 0xF5, 0xD1, 0xF8, 0x91, 0x85, 0x31, 0xA7, 0x7C, 0xF9, 0xBF, - 0x5C, 0xA1, 0x85, 0x0C, 0x82, 0x02, 0x69, 0xD7, 0xB2, 0xC8, 0xEC, 0xD0, 0x54, 0x3A, 0x61, 0x65 }, - }, - { - { 0x3D, 0x77, 0xB1, 0xCC, 0x1C, 0x46, 0xF8, 0x58, 0x03, 0x50, 0x53, 0x33, 0xCA, 0x8D, 0xE4, 0x77, - 0x71, 0xDD, 0xE8, 0x94, 0x4A, 0x51, 0x4E, 0xF4, 0x47, 0x08, 0xBF, 0x0E, 0xA6, 0x27, 0x58, 0x50 }, - }, - { - { 0x3D, 0xC7, 0xB5, 0x72, 0xD3, 0xEE, 0xCE, 0xFD, 0x48, 0x07, 0x16, 0x30, 0x9D, 0x2E, 0xC9, 0x24, - 0x8D, 0x4D, 0x5D, 0xD1, 0xD8, 0x4F, 0xDB, 0x3E, 0x70, 0x1B, 0x58, 0x2E, 0x72, 0xB2, 0xDF, 0xE0 }, - }, - { - { 0x3D, 0xE9, 0xE2, 0xFF, 0xBA, 0x92, 0xFC, 0x57, 0xB7, 0x96, 0x4E, 0xE0, 0x59, 0xA3, 0x38, 0x37, - 0x96, 0x37, 0x4E, 0xD8, 0x0D, 0xBE, 0x7F, 0x67, 0x7E, 0xDE, 0x79, 0x98, 0x11, 0xE7, 0xAC, 0x16 }, - }, - { - { 0x3E, 0x6F, 0x37, 0x53, 0xF1, 0xAB, 0x10, 0x62, 0x60, 0xDB, 0xEF, 0xA6, 0x8E, 0xC5, 0x85, 0x01, - 0x29, 0x1D, 0x1E, 0xB4, 0x00, 0x28, 0x8F, 0x06, 0xED, 0xF2, 0x9F, 0x8F, 0x8F, 0x66, 0xB0, 0x1A }, - }, { { 0x3E, 0x8E, 0x9B, 0xAD, 0x8E, 0xD9, 0xB5, 0x72, 0x38, 0x2E, 0x59, 0x8D, 0x2D, 0x73, 0x67, 0xE1, 0xFD, 0x6A, 0xF6, 0x95, 0x25, 0x00, 0x9D, 0x67, 0xB4, 0xE8, 0xAF, 0x80, 0xD9, 0x15, 0x85, 0x49 }, }, - { - { 0x3E, 0xC1, 0xC3, 0x43, 0xC6, 0x60, 0x05, 0x10, 0x57, 0x97, 0x47, 0xA7, 0x1A, 0xEA, 0xB3, 0x04, - 0x1A, 0x71, 0x8E, 0x4F, 0xC6, 0xE2, 0x96, 0xFE, 0xB7, 0x50, 0xA3, 0x12, 0x38, 0x72, 0x6E, 0xA5 }, - }, - { - { 0x3E, 0xD6, 0x85, 0x47, 0x65, 0x07, 0x91, 0x35, 0xAA, 0xEE, 0xB7, 0xD8, 0xA3, 0x79, 0x17, 0xDC, - 0x71, 0x74, 0x5E, 0xA6, 0x0F, 0xA9, 0x62, 0x1B, 0xAA, 0x30, 0x7F, 0xBE, 0x71, 0xA7, 0x3C, 0x43 }, - }, - { - { 0x3F, 0x08, 0x40, 0x27, 0x4E, 0x66, 0x15, 0x90, 0xC1, 0x46, 0x75, 0x96, 0x0F, 0xCC, 0x42, 0x06, - 0x95, 0x36, 0x58, 0x6F, 0x07, 0x60, 0x92, 0x48, 0x76, 0x24, 0x0F, 0x09, 0x04, 0x31, 0x78, 0x91 }, - }, - { - { 0x3F, 0x1B, 0x41, 0x14, 0xF9, 0x89, 0xE8, 0x56, 0x8F, 0x1B, 0x04, 0x53, 0x46, 0x5C, 0x11, 0x3F, - 0x32, 0xC3, 0x85, 0x10, 0xF5, 0x81, 0x77, 0x01, 0x81, 0x3D, 0x69, 0x3E, 0xF1, 0xA6, 0x8F, 0xCB }, - }, { { 0x3F, 0x27, 0xBD, 0xCA, 0x9B, 0x0E, 0x42, 0xF3, 0xF6, 0xD0, 0x91, 0x2C, 0x92, 0xE2, 0xDA, 0x65, 0xCB, 0x35, 0x8F, 0x0B, 0x8F, 0x80, 0x5B, 0xEC, 0x5D, 0xE9, 0x32, 0x51, 0xD9, 0xC4, 0xB1, 0x99 }, @@ -1336,46 +432,18 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x3F, 0x2E, 0xA6, 0x4E, 0xFB, 0xD6, 0xBF, 0xC4, 0x0A, 0xF0, 0xAD, 0x46, 0xA4, 0xA2, 0x57, 0x84, 0x19, 0xD8, 0x68, 0x6E, 0x38, 0x98, 0x8B, 0x91, 0x47, 0x01, 0x8C, 0x36, 0x29, 0x31, 0xE4, 0xF9 }, }, - { - { 0x3F, 0x3F, 0x08, 0x2F, 0xAB, 0x0C, 0xBD, 0x83, 0x16, 0xEA, 0x9D, 0xC1, 0xC7, 0x7E, 0xC6, 0x4C, - 0x32, 0x4D, 0x9C, 0x3D, 0x86, 0x08, 0xC7, 0x79, 0x56, 0xF1, 0x27, 0xA9, 0xB8, 0xF4, 0x9C, 0x46 }, - }, { { 0x3F, 0x4F, 0x28, 0x8B, 0xAF, 0x5B, 0xDE, 0x86, 0x72, 0xD6, 0xAD, 0xD1, 0x50, 0xE3, 0x23, 0x79, 0x49, 0x9A, 0x16, 0xC5, 0x81, 0xFB, 0x77, 0x37, 0xEC, 0x49, 0x80, 0xE4, 0xF9, 0xC3, 0x3D, 0x4D }, }, - { - { 0x3F, 0x5C, 0xFC, 0xAB, 0x44, 0x1A, 0x30, 0xD8, 0xF0, 0x1A, 0xC1, 0xAE, 0x9E, 0x08, 0xA2, 0xDB, - 0x70, 0xC4, 0xC1, 0x6D, 0xED, 0x03, 0xA4, 0x21, 0xD4, 0x1B, 0x8F, 0x42, 0xD5, 0xC1, 0x89, 0x6E }, - }, { { 0x3F, 0x92, 0x54, 0x89, 0x64, 0xCC, 0xDE, 0xFB, 0x29, 0x96, 0x5A, 0x27, 0xC1, 0x6C, 0x2F, 0xED, 0x28, 0xD9, 0xB9, 0x14, 0x0E, 0x4F, 0xB5, 0x5B, 0x37, 0x22, 0x4C, 0x67, 0xB2, 0xA0, 0x55, 0x1F }, }, - { - { 0x3F, 0x93, 0x0A, 0x4E, 0xE4, 0x43, 0x8B, 0x20, 0xD0, 0x3B, 0xD6, 0x25, 0x6E, 0x18, 0xE1, 0x3D, - 0xB2, 0x45, 0x0E, 0x59, 0x38, 0xF9, 0x81, 0xA8, 0xC4, 0x19, 0x0D, 0x56, 0xF0, 0xD8, 0xAC, 0x88 }, - }, - { - { 0x3F, 0xB6, 0xC4, 0x03, 0x19, 0x63, 0xB9, 0x67, 0x28, 0xBF, 0x93, 0x8D, 0x9B, 0x59, 0xC9, 0x05, - 0x43, 0xA9, 0xA6, 0x3E, 0xA3, 0x9C, 0xD2, 0x76, 0x14, 0xF2, 0x41, 0x28, 0xA9, 0x64, 0xEF, 0x84 }, - }, - { - { 0x3F, 0xD9, 0x29, 0x81, 0x1E, 0x0A, 0x80, 0xA3, 0xF4, 0xCD, 0xA3, 0x50, 0x2E, 0x1C, 0x20, 0x29, - 0xA7, 0xA3, 0xC1, 0x61, 0x06, 0x95, 0x5D, 0x3D, 0x93, 0x16, 0x71, 0x15, 0xFE, 0x7B, 0xC6, 0xE2 }, - }, { { 0x40, 0x58, 0xEC, 0x4A, 0x7A, 0x7B, 0xA0, 0xB8, 0x65, 0xA7, 0x39, 0xA0, 0x0C, 0x85, 0xF3, 0x44, 0x58, 0x79, 0xD6, 0x5E, 0x1D, 0x42, 0x2E, 0xED, 0x07, 0x65, 0x5A, 0x8E, 0x3E, 0xC3, 0x18, 0xCF }, }, - { - { 0x40, 0x89, 0x12, 0x59, 0x8B, 0x4D, 0x99, 0x69, 0x1D, 0x46, 0xDC, 0x3C, 0x06, 0x19, 0x82, 0xB9, - 0x48, 0x74, 0x3F, 0x0C, 0x0D, 0x26, 0xFF, 0x38, 0x50, 0xA3, 0xCA, 0x6B, 0x78, 0x97, 0x91, 0x5E }, - }, - { - { 0x41, 0x1E, 0x5A, 0x18, 0x2A, 0x48, 0x3C, 0x67, 0x0F, 0x89, 0xAC, 0xEE, 0xA6, 0xDA, 0xA1, 0xF9, - 0xA6, 0x22, 0x7E, 0xDF, 0x04, 0x9C, 0x05, 0xE3, 0xC4, 0xCF, 0xF7, 0x28, 0x42, 0x45, 0x9A, 0xA2 }, - }, { { 0x41, 0x29, 0x6B, 0x9F, 0xAA, 0xD6, 0x41, 0x33, 0xFC, 0xCB, 0xA6, 0xBA, 0x74, 0x54, 0x11, 0xEC, 0xC9, 0x11, 0xFD, 0x8E, 0xD5, 0x41, 0x90, 0x0F, 0x9E, 0x20, 0x36, 0x08, 0xEE, 0xA3, 0x59, 0x2D }, @@ -1388,4201 +456,1129 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0x41, 0xA6, 0x8D, 0xFD, 0x90, 0xDA, 0x6D, 0x12, 0x09, 0x84, 0x85, 0xBF, 0x6F, 0x87, 0x24, 0x5F, 0x4E, 0xC0, 0x54, 0x71, 0xDA, 0x59, 0xD0, 0x81, 0x06, 0x01, 0x53, 0xA2, 0x22, 0x25, 0x23, 0x7F }, }, - { - { 0x41, 0xAB, 0x57, 0x74, 0x49, 0xA7, 0x50, 0xEF, 0x45, 0x0D, 0x86, 0x4D, 0xB0, 0x6B, 0x7C, 0xBA, - 0x1F, 0x63, 0xE1, 0x1D, 0x1D, 0x86, 0xB7, 0x8C, 0x70, 0x5B, 0xB4, 0x27, 0x34, 0xF5, 0x05, 0x2D }, - }, { { 0x42, 0x08, 0x71, 0xD8, 0xAC, 0x49, 0x3C, 0xF9, 0x46, 0x8B, 0xB3, 0x76, 0x97, 0x6D, 0x65, 0x5E, 0xF0, 0xAF, 0xAA, 0xC2, 0x3D, 0x77, 0x00, 0x92, 0x20, 0xC3, 0xAF, 0x8B, 0xDD, 0x37, 0x5A, 0x24 }, }, - { - { 0x42, 0x53, 0xEB, 0x35, 0x06, 0x2F, 0x32, 0x3B, 0x82, 0xDE, 0xD0, 0x0D, 0x53, 0x83, 0x18, 0x06, - 0x7F, 0xE0, 0xDF, 0x41, 0x2B, 0xC9, 0x20, 0x77, 0x92, 0x5B, 0x76, 0x92, 0xCC, 0xCB, 0x27, 0x29 }, - }, { { 0x42, 0x5D, 0x4E, 0xBF, 0x1B, 0xDE, 0x0B, 0xF8, 0xD1, 0xDB, 0xD3, 0x3D, 0x8D, 0x16, 0x34, 0xC4, 0xFA, 0xFE, 0xB6, 0xF8, 0x05, 0xF1, 0xCC, 0xB5, 0x34, 0xAC, 0xB7, 0x2A, 0xED, 0xA2, 0xCD, 0x0A }, }, { - { 0x42, 0x7B, 0x6D, 0x3D, 0x1F, 0x9E, 0xF7, 0x34, 0xC7, 0x3B, 0x89, 0x23, 0xD0, 0xE0, 0x9A, 0x7C, - 0xB2, 0xD4, 0x7C, 0x78, 0xE0, 0x26, 0x2B, 0x4E, 0x71, 0x32, 0xB4, 0xB8, 0xF0, 0xF7, 0xFB, 0x40 }, + { 0x44, 0x12, 0x63, 0x80, 0xA0, 0x73, 0xFE, 0xA1, 0xA2, 0x00, 0x4F, 0x71, 0x1D, 0xF2, 0xCA, 0x47, + 0xC2, 0xC4, 0xB4, 0xFF, 0x64, 0x4E, 0x76, 0xAF, 0xBE, 0x27, 0x97, 0xC9, 0x63, 0x7C, 0x6A, 0xF9 }, }, { - { 0x42, 0xB0, 0x75, 0xEB, 0xF9, 0xFF, 0x9D, 0x6F, 0xCD, 0xF1, 0xBA, 0x60, 0x80, 0x72, 0x8D, 0x21, - 0xC9, 0xCD, 0x6F, 0xBA, 0xA5, 0x45, 0xDA, 0x03, 0x6C, 0xC6, 0x59, 0xCF, 0x90, 0x5F, 0xB3, 0x0C }, + { 0x44, 0x25, 0xDD, 0xFB, 0xBA, 0xFB, 0xE1, 0xAA, 0xCE, 0x25, 0x85, 0x70, 0x48, 0x96, 0x9D, 0xC8, + 0x9D, 0xF5, 0x97, 0x7B, 0xB2, 0xE3, 0x34, 0x7C, 0x9C, 0xEB, 0x0E, 0x5A, 0x7B, 0x68, 0xC5, 0x31 }, }, { - { 0x43, 0x05, 0xD8, 0x7B, 0xE4, 0xB6, 0xCF, 0x63, 0xA5, 0x00, 0xEE, 0x4B, 0x8D, 0x09, 0x4F, 0x02, - 0x40, 0xAF, 0x3B, 0x0E, 0x9B, 0xF5, 0x9B, 0xB9, 0xAC, 0x20, 0x32, 0xEE, 0xB9, 0x1D, 0x23, 0xDF }, + { 0x45, 0x63, 0xCF, 0x13, 0xC2, 0x49, 0x2C, 0xAA, 0x92, 0xF5, 0x5B, 0x17, 0x26, 0x3A, 0xDD, 0x72, + 0x04, 0xA8, 0x0F, 0xE6, 0x24, 0x0C, 0x4D, 0x63, 0xE8, 0x39, 0x59, 0x58, 0xF6, 0x94, 0xCD, 0x33 }, }, { - { 0x43, 0x09, 0x9D, 0xB4, 0xCF, 0x34, 0x1D, 0x41, 0x3E, 0xCC, 0xEE, 0xFC, 0xAF, 0xCD, 0x58, 0xE7, - 0xE3, 0xB7, 0x77, 0xCF, 0x72, 0x80, 0xF3, 0x23, 0xF4, 0x72, 0x08, 0x61, 0x04, 0x9F, 0x55, 0xFE }, + { 0x45, 0xCB, 0x86, 0xCA, 0x97, 0x52, 0x29, 0xB7, 0xD5, 0xDA, 0xFC, 0x05, 0xEB, 0x0C, 0x53, 0x65, + 0x82, 0x3A, 0x91, 0xA9, 0x8B, 0x7D, 0xBE, 0x81, 0xAB, 0x5F, 0x17, 0x8B, 0x2D, 0xA4, 0xAD, 0x9E }, }, { - { 0x43, 0x13, 0x91, 0xE1, 0x14, 0x14, 0xEC, 0x0C, 0x5C, 0xF5, 0xE7, 0xB3, 0x9C, 0x65, 0xFE, 0xDB, - 0x2E, 0xC8, 0x8C, 0x54, 0x48, 0xBF, 0x35, 0xEE, 0x17, 0x0D, 0xC3, 0xB5, 0xE1, 0x7E, 0xD0, 0x88 }, + { 0x46, 0x9B, 0xD8, 0x04, 0xE9, 0x98, 0xAE, 0x27, 0x9A, 0xC3, 0xFE, 0x1B, 0x52, 0x88, 0x46, 0xE7, + 0xAE, 0xC7, 0x6C, 0x56, 0xB8, 0x0B, 0x40, 0xF3, 0x24, 0x20, 0x8F, 0x5A, 0x9F, 0x64, 0x5C, 0xB5 }, }, { - { 0x43, 0x30, 0xEB, 0xAF, 0x74, 0xBD, 0xD4, 0x36, 0x56, 0xA7, 0x2B, 0x3F, 0xAB, 0x4D, 0x66, 0xDF, - 0x0B, 0x45, 0xCA, 0xB4, 0x93, 0x7D, 0x01, 0xBE, 0xB8, 0xDE, 0x9B, 0x0F, 0x2F, 0xDA, 0xAE, 0xAD }, + { 0x46, 0xCD, 0x08, 0x08, 0x8D, 0x36, 0x06, 0x2C, 0x56, 0x71, 0x09, 0x2C, 0x02, 0x76, 0x7A, 0x25, + 0x0D, 0xE7, 0x0B, 0xF3, 0xE1, 0x53, 0x63, 0x69, 0x66, 0xE6, 0x6E, 0xC5, 0x7E, 0x8E, 0xE9, 0xF5 }, }, { - { 0x43, 0x71, 0x9B, 0x00, 0xB1, 0xEB, 0xBE, 0x02, 0xD2, 0x57, 0x72, 0xE8, 0x41, 0x22, 0x1E, 0xC7, - 0x53, 0x00, 0x02, 0x0B, 0x75, 0x8D, 0xEC, 0x19, 0xD4, 0x2E, 0x33, 0x8E, 0x92, 0xBA, 0x49, 0x4C }, + { 0x47, 0x84, 0xF6, 0xCD, 0x59, 0x3D, 0x7B, 0x31, 0x2E, 0xB1, 0xF6, 0x19, 0xE1, 0x11, 0xDF, 0x3B, + 0x48, 0x6D, 0x1B, 0xF8, 0x37, 0x15, 0xAD, 0x8D, 0xAB, 0xA5, 0x72, 0xAF, 0xB2, 0x61, 0xD5, 0xBE }, }, { - { 0x43, 0x9D, 0x38, 0x5E, 0x8B, 0x11, 0x68, 0x0E, 0x0F, 0xB7, 0x4F, 0x78, 0xA9, 0x74, 0xBD, 0x64, - 0x6D, 0xDE, 0xB5, 0x4E, 0x06, 0x71, 0x42, 0x25, 0x97, 0xB2, 0xFA, 0x88, 0x5D, 0x05, 0x59, 0x28 }, + { 0x48, 0xC5, 0xD4, 0xFF, 0x5D, 0x08, 0x4A, 0xC1, 0x95, 0xB1, 0xA6, 0xA2, 0x19, 0xF8, 0x1B, 0xBD, + 0xF9, 0xD2, 0xE5, 0xC0, 0x70, 0xEC, 0x97, 0xDF, 0x3C, 0xB0, 0xB7, 0x3E, 0xF4, 0x70, 0xDC, 0xE9 }, }, { - { 0x44, 0x12, 0x63, 0x80, 0xA0, 0x73, 0xFE, 0xA1, 0xA2, 0x00, 0x4F, 0x71, 0x1D, 0xF2, 0xCA, 0x47, - 0xC2, 0xC4, 0xB4, 0xFF, 0x64, 0x4E, 0x76, 0xAF, 0xBE, 0x27, 0x97, 0xC9, 0x63, 0x7C, 0x6A, 0xF9 }, + { 0x49, 0xDC, 0xF8, 0xFA, 0x68, 0xE9, 0x2B, 0x5C, 0x21, 0xFE, 0xF9, 0x3D, 0x26, 0x0C, 0x24, 0x8C, + 0xE3, 0xBE, 0x98, 0x62, 0x68, 0x68, 0xE7, 0x5A, 0x3F, 0x63, 0x34, 0xBB, 0x7D, 0xC1, 0x81, 0xEC }, }, { - { 0x44, 0x25, 0xDD, 0xFB, 0xBA, 0xFB, 0xE1, 0xAA, 0xCE, 0x25, 0x85, 0x70, 0x48, 0x96, 0x9D, 0xC8, - 0x9D, 0xF5, 0x97, 0x7B, 0xB2, 0xE3, 0x34, 0x7C, 0x9C, 0xEB, 0x0E, 0x5A, 0x7B, 0x68, 0xC5, 0x31 }, + { 0x4B, 0x1F, 0xC8, 0x2D, 0x24, 0x72, 0x92, 0x7A, 0xC1, 0x7C, 0x58, 0x43, 0x07, 0xCB, 0x96, 0xD6, + 0xFD, 0xDB, 0x8D, 0x50, 0xA5, 0x29, 0x53, 0x07, 0xD3, 0x0C, 0x75, 0x88, 0x59, 0x6A, 0xD4, 0x0B }, }, { - { 0x44, 0x5C, 0x03, 0x3A, 0x43, 0xC2, 0x23, 0x38, 0x8E, 0x1C, 0x54, 0x26, 0x92, 0xAB, 0xE5, 0x7D, - 0x27, 0xC3, 0x35, 0x6E, 0x40, 0x95, 0x0F, 0x1D, 0xBA, 0x03, 0x91, 0xAD, 0xC9, 0x1B, 0x10, 0xC8 }, + { 0x4B, 0x35, 0x02, 0xFF, 0xAD, 0x64, 0x16, 0x39, 0x4F, 0x2F, 0x78, 0x47, 0x76, 0x13, 0x39, 0x69, + 0xA5, 0x5C, 0xA8, 0xF3, 0x9F, 0x78, 0x3C, 0x26, 0x0F, 0xFE, 0xDB, 0xA8, 0xFC, 0xE4, 0x19, 0x70 }, }, { - { 0x44, 0xA0, 0x6E, 0xB4, 0x9A, 0x72, 0xBC, 0xA4, 0x4A, 0x58, 0x1F, 0x4F, 0x10, 0x91, 0xAB, 0xEF, - 0x33, 0x2D, 0x8A, 0x7C, 0xEF, 0x60, 0xE6, 0x8D, 0xAF, 0x84, 0x13, 0x23, 0x26, 0x12, 0x90, 0xF0 }, + { 0x4B, 0x51, 0xFC, 0x11, 0x4B, 0xAC, 0x8E, 0x2D, 0x2A, 0xF2, 0xAE, 0x56, 0x84, 0x42, 0x9C, 0xCA, + 0xAB, 0x21, 0x39, 0xC9, 0xB3, 0x51, 0xBF, 0x7E, 0x1B, 0x03, 0x0A, 0xE8, 0x62, 0x4A, 0xC1, 0x72 }, }, { - { 0x44, 0xC2, 0x00, 0x2E, 0xEA, 0xBE, 0x55, 0xAA, 0x9B, 0xF9, 0x7C, 0xF3, 0xEF, 0xD4, 0xFB, 0x06, - 0xEC, 0xE5, 0x10, 0xB4, 0xAB, 0xE9, 0xAC, 0xB8, 0x2C, 0x36, 0xEF, 0x23, 0x5B, 0x9D, 0xC8, 0xA1 }, + { 0x4C, 0xD0, 0xD6, 0x7E, 0xCC, 0x3B, 0x01, 0xC8, 0xC2, 0x63, 0x4E, 0x7A, 0x73, 0x76, 0x12, 0xF6, + 0x3A, 0x17, 0xFF, 0x51, 0x0A, 0x77, 0xA8, 0x04, 0xBB, 0x33, 0x1B, 0x2B, 0xE5, 0x8D, 0xFE, 0x0C }, }, { - { 0x44, 0xEB, 0x83, 0xC7, 0xEB, 0xD4, 0x1D, 0x2C, 0x09, 0x67, 0x45, 0xFA, 0x9D, 0x7B, 0x3B, 0xC9, - 0x4D, 0xA5, 0x61, 0x82, 0x92, 0xB7, 0x0E, 0x3A, 0xB2, 0x50, 0xE3, 0x83, 0x53, 0x98, 0xC6, 0x7C }, + { 0x4D, 0xCF, 0xEB, 0xDC, 0x15, 0x4B, 0x0C, 0x85, 0x46, 0x7F, 0x6F, 0x52, 0xAD, 0x80, 0x4E, 0x19, + 0x1D, 0x5B, 0xC8, 0x13, 0x51, 0x72, 0x0E, 0xC0, 0xD1, 0x9B, 0xD2, 0x5B, 0xF8, 0xF0, 0xA5, 0x53 }, }, { - { 0x45, 0x3E, 0x22, 0x73, 0x3C, 0xBF, 0xBD, 0xAC, 0x2F, 0xFD, 0x38, 0x74, 0x3D, 0x54, 0xB8, 0x88, - 0xD0, 0x8F, 0x9C, 0x44, 0xBB, 0x59, 0xDC, 0x55, 0x0D, 0xF0, 0x25, 0xC2, 0xA0, 0x0E, 0x4D, 0x3B }, + { 0x4F, 0x19, 0xDD, 0x12, 0x92, 0x4C, 0xE0, 0xC1, 0x4F, 0x82, 0xC0, 0x56, 0xC7, 0xD4, 0x2B, 0xAC, + 0x43, 0xD0, 0x13, 0x3A, 0xAF, 0x89, 0xC1, 0xEF, 0xDC, 0xFA, 0x3C, 0x3E, 0x47, 0x09, 0x7D, 0x59 }, }, { - { 0x45, 0x60, 0xDB, 0xDB, 0x1C, 0x43, 0x68, 0x50, 0xEF, 0xB0, 0x03, 0x1E, 0xF8, 0x2B, 0x9F, 0x70, - 0x88, 0x21, 0x9E, 0xCE, 0xD2, 0x69, 0x56, 0x1F, 0xB4, 0xD1, 0xB0, 0x18, 0x3C, 0x44, 0xC2, 0xB5 }, + { 0x4F, 0xFB, 0x59, 0x19, 0xBC, 0x38, 0x5C, 0x8C, 0x58, 0xE4, 0x62, 0xBF, 0x13, 0x22, 0x10, 0xD8, + 0xB7, 0x86, 0x12, 0xD0, 0xC2, 0x2A, 0x6B, 0x6A, 0x68, 0x2E, 0x0B, 0x9E, 0x9C, 0x9F, 0x9A, 0x44 }, }, { - { 0x45, 0x63, 0xCF, 0x13, 0xC2, 0x49, 0x2C, 0xAA, 0x92, 0xF5, 0x5B, 0x17, 0x26, 0x3A, 0xDD, 0x72, - 0x04, 0xA8, 0x0F, 0xE6, 0x24, 0x0C, 0x4D, 0x63, 0xE8, 0x39, 0x59, 0x58, 0xF6, 0x94, 0xCD, 0x33 }, + { 0x50, 0xF4, 0x78, 0x1E, 0xB1, 0xC1, 0x46, 0x70, 0xD9, 0xA5, 0x52, 0xC3, 0x49, 0x5F, 0xB9, 0xF6, + 0xAE, 0x86, 0x8A, 0xB1, 0xC9, 0xD9, 0x83, 0xE0, 0x82, 0x68, 0x65, 0xA1, 0x02, 0xEC, 0xA6, 0xD3 }, }, { - { 0x45, 0x86, 0xDA, 0x12, 0xA9, 0x43, 0xE6, 0x33, 0xD0, 0xD4, 0x43, 0x91, 0x85, 0x44, 0x39, 0x57, - 0x25, 0x58, 0x7F, 0x0A, 0xA8, 0x41, 0xCA, 0xFD, 0xC6, 0xC8, 0x5D, 0x26, 0x1D, 0x3C, 0xD6, 0x79 }, + { 0x51, 0x6A, 0x2F, 0x33, 0x60, 0xC7, 0x6F, 0xC4, 0x6A, 0xB2, 0x88, 0x7F, 0x88, 0xE8, 0xD0, 0x8E, + 0xFB, 0xD8, 0x44, 0x5A, 0xA7, 0xBB, 0xD2, 0x29, 0xDF, 0xC7, 0x1A, 0x90, 0x4F, 0x55, 0xAE, 0xB4 }, }, { - { 0x45, 0xA7, 0x1A, 0x5C, 0xC4, 0x37, 0xDF, 0x07, 0xE3, 0x86, 0x55, 0x43, 0x6D, 0x96, 0xD8, 0x49, - 0x66, 0xE4, 0x83, 0x9D, 0x37, 0xAD, 0xCC, 0xE9, 0xE9, 0xB2, 0x2B, 0x6E, 0xCB, 0x48, 0x92, 0x8E }, + { 0x52, 0x1F, 0x6C, 0x6A, 0x84, 0x36, 0x65, 0x79, 0xCA, 0x2D, 0xEA, 0xEB, 0x23, 0x15, 0xBF, 0x8E, + 0x53, 0x1C, 0x9F, 0xA4, 0x7B, 0x89, 0x9D, 0xA2, 0x72, 0x16, 0xA9, 0x98, 0x82, 0x86, 0xAF, 0xE5 }, }, { - { 0x45, 0xCB, 0x86, 0xCA, 0x97, 0x52, 0x29, 0xB7, 0xD5, 0xDA, 0xFC, 0x05, 0xEB, 0x0C, 0x53, 0x65, - 0x82, 0x3A, 0x91, 0xA9, 0x8B, 0x7D, 0xBE, 0x81, 0xAB, 0x5F, 0x17, 0x8B, 0x2D, 0xA4, 0xAD, 0x9E }, + { 0x52, 0xFF, 0x8B, 0x6E, 0x98, 0xB0, 0x96, 0x19, 0x90, 0x03, 0xDE, 0x97, 0xBC, 0xCF, 0xD2, 0xA7, + 0xF1, 0xAC, 0x57, 0xA8, 0x31, 0x35, 0xB9, 0x55, 0xFF, 0x68, 0x63, 0x36, 0xA6, 0x91, 0xD5, 0xCA }, }, { - { 0x45, 0xCC, 0x74, 0xA3, 0xDB, 0xCB, 0x59, 0xA1, 0x35, 0x35, 0x39, 0xFA, 0x5B, 0x1A, 0xF9, 0x74, - 0x6B, 0xA5, 0xC7, 0xF0, 0xF1, 0x6F, 0x7C, 0xC1, 0xF7, 0x0C, 0x71, 0x32, 0x38, 0x82, 0x7E, 0x37 }, + { 0x53, 0x79, 0x64, 0x58, 0xDA, 0x97, 0xCE, 0x36, 0x78, 0xF2, 0xD1, 0xD9, 0xB2, 0xA5, 0xB2, 0xFB, + 0x30, 0x75, 0xEA, 0xFA, 0xF6, 0xFF, 0x04, 0x78, 0xB5, 0x72, 0xDD, 0xFD, 0x70, 0x99, 0xAE, 0xE2 }, }, { - { 0x45, 0xD1, 0xF0, 0xB3, 0x4E, 0x90, 0xDC, 0x45, 0x86, 0x4E, 0x40, 0x4E, 0x21, 0xE4, 0x73, 0xF5, - 0x54, 0x2E, 0x6A, 0x07, 0x5A, 0x18, 0x9E, 0x6D, 0x9E, 0xF5, 0xC1, 0x16, 0xE0, 0xCE, 0x97, 0xFC }, + { 0x53, 0x9C, 0xA9, 0xE1, 0xF0, 0x6A, 0xF2, 0x10, 0x7F, 0x96, 0xBF, 0x4B, 0x7D, 0xD4, 0xCE, 0xCD, + 0x9E, 0xD1, 0x1A, 0x38, 0xD6, 0x70, 0x91, 0x69, 0x9C, 0x56, 0x26, 0xE2, 0x7A, 0x1F, 0x54, 0xA5 }, }, { - { 0x45, 0xD7, 0x98, 0xFB, 0xC7, 0x66, 0x6C, 0xD7, 0xA0, 0x39, 0x5E, 0x45, 0x0C, 0x5B, 0x4E, 0x1D, - 0x98, 0xFD, 0x0E, 0xDC, 0x7F, 0x97, 0xA0, 0x31, 0x3A, 0x3B, 0x13, 0x86, 0x27, 0x8D, 0xDB, 0x08 }, + { 0x55, 0x21, 0xF9, 0x63, 0x57, 0x81, 0x58, 0xB8, 0xD0, 0xE7, 0xC4, 0x91, 0xCD, 0xB8, 0x5C, 0x3D, + 0xE9, 0xD5, 0x2E, 0xA5, 0x1F, 0xFC, 0xB0, 0x93, 0xD3, 0x12, 0x28, 0x11, 0x13, 0x14, 0x97, 0xEB }, }, { - { 0x45, 0xE9, 0xCF, 0x0A, 0xF0, 0x43, 0xA3, 0xC2, 0xBB, 0x74, 0xD4, 0x63, 0x66, 0x93, 0x1C, 0x3D, - 0xFC, 0xA5, 0x3D, 0x36, 0x26, 0x64, 0x37, 0xD2, 0xA9, 0x46, 0x84, 0xFE, 0xE9, 0x4E, 0x0C, 0x0D }, + { 0x55, 0xD0, 0xEB, 0xE3, 0x2C, 0xBA, 0x09, 0xF6, 0x58, 0x4D, 0x9E, 0x7B, 0x57, 0x92, 0xA4, 0x03, + 0xC2, 0x1D, 0x39, 0xD6, 0xE1, 0xF5, 0xE8, 0xED, 0x37, 0xB9, 0x3F, 0xA6, 0x1D, 0x88, 0x35, 0x16 }, }, { - { 0x46, 0x9B, 0xD8, 0x04, 0xE9, 0x98, 0xAE, 0x27, 0x9A, 0xC3, 0xFE, 0x1B, 0x52, 0x88, 0x46, 0xE7, - 0xAE, 0xC7, 0x6C, 0x56, 0xB8, 0x0B, 0x40, 0xF3, 0x24, 0x20, 0x8F, 0x5A, 0x9F, 0x64, 0x5C, 0xB5 }, + { 0x58, 0x1A, 0xDE, 0x64, 0x84, 0x95, 0xB4, 0xB1, 0x62, 0x9C, 0x3C, 0x7C, 0x78, 0xEF, 0xBE, 0xF2, + 0x75, 0x06, 0x56, 0x65, 0xB2, 0x41, 0x1C, 0x0E, 0x5F, 0xCF, 0xBC, 0x7E, 0xB4, 0xBE, 0x34, 0x0B }, }, { - { 0x46, 0xCD, 0x08, 0x08, 0x8D, 0x36, 0x06, 0x2C, 0x56, 0x71, 0x09, 0x2C, 0x02, 0x76, 0x7A, 0x25, - 0x0D, 0xE7, 0x0B, 0xF3, 0xE1, 0x53, 0x63, 0x69, 0x66, 0xE6, 0x6E, 0xC5, 0x7E, 0x8E, 0xE9, 0xF5 }, + { 0x59, 0xC9, 0xE8, 0xDF, 0x03, 0x0B, 0x1C, 0xD5, 0x89, 0xA8, 0xB3, 0x4F, 0xE7, 0x42, 0x51, 0xEA, + 0xD5, 0xA5, 0xFB, 0xE9, 0xE6, 0x13, 0x67, 0xCA, 0x76, 0xAF, 0xD9, 0xDD, 0xD9, 0xC6, 0xF1, 0x6F }, }, { - { 0x46, 0xE3, 0x7D, 0x9C, 0x51, 0xC6, 0x40, 0x06, 0x4C, 0xD9, 0x5C, 0x8F, 0xEA, 0x7D, 0x65, 0x78, - 0x0C, 0x2C, 0x4F, 0x0E, 0xB8, 0xEE, 0x56, 0x67, 0xEF, 0x5D, 0xCC, 0xD3, 0x1F, 0x44, 0xE0, 0x8D }, + { 0x59, 0xE9, 0xFA, 0x2F, 0xF0, 0x76, 0x89, 0x33, 0x28, 0x33, 0xC6, 0x40, 0xF5, 0x05, 0xFA, 0x24, + 0x09, 0xEB, 0x88, 0x93, 0x32, 0x57, 0xC1, 0x93, 0xB0, 0x07, 0xD3, 0xA2, 0x89, 0x6A, 0x98, 0x50 }, }, { - { 0x46, 0xEC, 0x1D, 0x4F, 0x78, 0xCA, 0xA6, 0xEC, 0x0B, 0xCB, 0x5C, 0x8C, 0x60, 0x63, 0x04, 0x73, - 0x9B, 0xA5, 0x10, 0xB5, 0x97, 0xB4, 0xC8, 0x46, 0x30, 0x81, 0xF3, 0x1F, 0x7C, 0xDB, 0x4E, 0xC1 }, + { 0x59, 0xEE, 0x9B, 0x36, 0x80, 0xAE, 0x20, 0x56, 0x83, 0x9C, 0x0B, 0xF6, 0x9E, 0xE6, 0x63, 0x26, + 0x57, 0x16, 0xA8, 0xE2, 0x4C, 0xC6, 0x49, 0x95, 0xFB, 0xA6, 0xCB, 0x6F, 0x0C, 0x12, 0x39, 0xDC }, }, { - { 0x46, 0xED, 0x9B, 0x23, 0xA0, 0x9E, 0x91, 0x19, 0xD7, 0x96, 0xE4, 0xFE, 0xC1, 0x1C, 0x26, 0x3C, - 0x74, 0x89, 0x28, 0xB0, 0xA9, 0x90, 0x09, 0x5D, 0xA8, 0xA6, 0x3E, 0x71, 0x47, 0x19, 0x49, 0x1E }, + { 0x5A, 0x84, 0xAF, 0xE6, 0x74, 0x05, 0xAB, 0xE8, 0x4A, 0x0C, 0xD4, 0x2C, 0x2B, 0xA2, 0xE4, 0xC8, + 0x8F, 0x35, 0xE0, 0xA5, 0x95, 0xE5, 0x69, 0xA3, 0xE1, 0x86, 0x69, 0x44, 0x40, 0x5B, 0xE7, 0x36 }, }, { - { 0x47, 0x78, 0xD4, 0xA5, 0x37, 0x9B, 0x45, 0x4E, 0x69, 0x68, 0x79, 0x20, 0xC1, 0xFE, 0x05, 0xB9, - 0x17, 0xAD, 0x50, 0x0C, 0x00, 0x57, 0xE9, 0x07, 0x19, 0xDC, 0x26, 0x15, 0xAF, 0x97, 0x44, 0x22 }, + { 0x5A, 0x8E, 0x86, 0x21, 0x2C, 0x06, 0x33, 0x94, 0x94, 0xF8, 0x5B, 0x5F, 0x85, 0x11, 0xDF, 0x00, + 0x00, 0x23, 0x94, 0x07, 0x8F, 0xFC, 0x77, 0x4D, 0x43, 0x6F, 0x0D, 0x63, 0x86, 0xD7, 0xA6, 0xF7 }, }, { - { 0x47, 0x84, 0xF6, 0xCD, 0x59, 0x3D, 0x7B, 0x31, 0x2E, 0xB1, 0xF6, 0x19, 0xE1, 0x11, 0xDF, 0x3B, - 0x48, 0x6D, 0x1B, 0xF8, 0x37, 0x15, 0xAD, 0x8D, 0xAB, 0xA5, 0x72, 0xAF, 0xB2, 0x61, 0xD5, 0xBE }, + { 0x5A, 0xC0, 0x98, 0x2D, 0xA0, 0xC8, 0x3D, 0x0B, 0xA9, 0x38, 0x1A, 0x5C, 0xD8, 0x7B, 0x80, 0xD1, + 0x10, 0xF2, 0x6E, 0xE8, 0x39, 0x27, 0x1B, 0xC2, 0x70, 0x60, 0x8F, 0xD1, 0x43, 0x7F, 0x55, 0xB0 }, }, { - { 0x47, 0xB2, 0xF4, 0xD6, 0xB8, 0x4E, 0xB7, 0x44, 0x53, 0xA9, 0xEC, 0xDC, 0x2D, 0x21, 0xC9, 0xD6, - 0xBE, 0x8A, 0x3D, 0x83, 0xF8, 0xA3, 0x8B, 0x31, 0x8D, 0x87, 0x26, 0x1A, 0xA9, 0x86, 0x98, 0x5E }, + { 0x5B, 0x29, 0x3D, 0x30, 0x9F, 0x64, 0x24, 0xBC, 0x26, 0x4F, 0x4B, 0xB0, 0x18, 0xAE, 0xF5, 0x0E, + 0x63, 0xE3, 0x37, 0xD1, 0x4D, 0xF0, 0x64, 0xC5, 0x7A, 0x23, 0x52, 0x83, 0x42, 0x16, 0x1C, 0x68 }, }, { - { 0x48, 0x08, 0x68, 0xBA, 0xB4, 0x84, 0xC5, 0x05, 0x38, 0x7C, 0x95, 0x7E, 0xBC, 0x12, 0x2F, 0x01, - 0x4D, 0x79, 0xC5, 0xEC, 0x63, 0xA8, 0x74, 0xD7, 0x33, 0xCF, 0x81, 0x7E, 0x3D, 0xED, 0x0D, 0x46 }, + { 0x5C, 0x7F, 0xF0, 0x55, 0xC2, 0xFD, 0x03, 0x3F, 0x34, 0xC4, 0xC4, 0xF7, 0xC4, 0xFB, 0x7D, 0xDA, + 0xAA, 0xFB, 0x43, 0x56, 0xC5, 0x60, 0xC9, 0x9E, 0xDF, 0xF0, 0x74, 0xDA, 0x04, 0xAF, 0x65, 0x7C }, }, { - { 0x48, 0x09, 0x80, 0xFC, 0xEB, 0x50, 0xEB, 0x37, 0x4C, 0x91, 0x6C, 0xB2, 0xA4, 0x3A, 0xFB, 0xD5, - 0x35, 0x21, 0x1A, 0xEA, 0x9B, 0x12, 0xB7, 0xA4, 0x5A, 0xAF, 0x90, 0xBA, 0x9C, 0xA4, 0x70, 0x0F }, + { 0x5C, 0xD2, 0x44, 0x6A, 0x8E, 0x4A, 0x0F, 0xA7, 0xE3, 0xCD, 0xF8, 0x00, 0x5D, 0xED, 0xCE, 0xBA, + 0xE9, 0xE6, 0x81, 0x9A, 0x8A, 0x69, 0x87, 0x31, 0x55, 0x5B, 0x7D, 0xC9, 0xD0, 0xA2, 0x3F, 0xC0 }, }, { - { 0x48, 0x13, 0x2A, 0xF3, 0x5F, 0x2F, 0x63, 0x53, 0x2E, 0xAC, 0x4D, 0x64, 0x4B, 0xA3, 0x11, 0x09, - 0xCF, 0xEB, 0xE6, 0x56, 0x48, 0x3A, 0x76, 0x43, 0x7A, 0xDC, 0xA1, 0xD8, 0x44, 0x3C, 0x22, 0xCF }, + { 0x5C, 0xEB, 0xEB, 0xD8, 0x34, 0x01, 0xB7, 0x0B, 0xAC, 0xB5, 0x4F, 0x66, 0xA9, 0xB7, 0x78, 0x55, + 0x69, 0x6E, 0xCE, 0x16, 0x7F, 0xE6, 0xC6, 0x0A, 0x05, 0x16, 0x8B, 0xE4, 0x39, 0x19, 0xC8, 0x0F }, }, { - { 0x48, 0x1F, 0xEB, 0xED, 0xD0, 0x11, 0xFC, 0xB0, 0x3F, 0xBD, 0xD5, 0x8F, 0xC9, 0x97, 0x85, 0x20, - 0xF5, 0x00, 0x63, 0x83, 0x6D, 0x0F, 0xB0, 0x8E, 0x9F, 0xDC, 0x42, 0x7C, 0x14, 0xC7, 0x97, 0xB7 }, + { 0x5E, 0x23, 0xDB, 0xD4, 0xD0, 0xC9, 0xBF, 0xB1, 0x5F, 0x61, 0x6A, 0x95, 0x17, 0xA1, 0x30, 0xD8, + 0x66, 0xA8, 0xCB, 0x0B, 0x18, 0x96, 0x3D, 0x54, 0xE7, 0xED, 0xAE, 0xE2, 0x61, 0xCB, 0x1C, 0x19 }, }, { - { 0x48, 0x4B, 0x8B, 0xC1, 0xE6, 0xCB, 0xBA, 0x3F, 0x01, 0xF7, 0xA9, 0x34, 0x5A, 0x88, 0x4C, 0xF5, - 0xF1, 0x5D, 0x82, 0xDA, 0x56, 0x98, 0xB6, 0xB3, 0x71, 0xE4, 0xDC, 0x6B, 0xBD, 0x6C, 0x8A, 0xE8 }, + { 0x5F, 0x8B, 0x88, 0x8E, 0xE9, 0x6C, 0x0C, 0x0F, 0x5A, 0x91, 0x72, 0x90, 0xAC, 0xA6, 0x5A, 0xFD, + 0x6E, 0xBD, 0xAE, 0x05, 0xA0, 0x2A, 0xAF, 0x04, 0x29, 0xE9, 0x72, 0xEC, 0x01, 0x90, 0xEC, 0xFC }, }, { - { 0x48, 0x5C, 0xF2, 0xB0, 0xA5, 0xE6, 0x9A, 0x0A, 0x9A, 0xAB, 0x03, 0xFF, 0x82, 0xBD, 0x6B, 0x7B, - 0x2E, 0xDF, 0x8E, 0x1B, 0x54, 0x45, 0x8E, 0x14, 0x2A, 0xEB, 0x88, 0xBA, 0xA8, 0x84, 0x0E, 0x5B }, + { 0x62, 0x2E, 0xC3, 0xBE, 0x7C, 0xF5, 0xE4, 0xE6, 0x3F, 0x74, 0x18, 0x69, 0x28, 0x74, 0x40, 0x05, + 0xCB, 0xB7, 0x8D, 0xF3, 0x06, 0xB8, 0x67, 0xC3, 0xFC, 0xAD, 0x5E, 0x2B, 0xA7, 0x53, 0x96, 0x83 }, }, { - { 0x48, 0x61, 0x56, 0x1A, 0xE5, 0x65, 0x86, 0xB8, 0xCD, 0xA5, 0xC2, 0xF8, 0x75, 0x0B, 0x8D, 0x34, - 0x38, 0x51, 0x53, 0xE4, 0xB8, 0x44, 0x0A, 0x9A, 0x37, 0xD6, 0x6D, 0xF8, 0x76, 0x94, 0x5F, 0x3F }, + { 0x62, 0x6F, 0x7E, 0xB4, 0xFD, 0x9B, 0x71, 0xFF, 0xAA, 0x0C, 0x8E, 0xC9, 0x65, 0x54, 0x64, 0xE6, + 0x5E, 0x7F, 0x96, 0xCF, 0xA3, 0x82, 0x73, 0x97, 0x41, 0x35, 0x66, 0xAA, 0x2C, 0xC1, 0xE5, 0x72 }, }, { - { 0x48, 0xC5, 0xD4, 0xFF, 0x5D, 0x08, 0x4A, 0xC1, 0x95, 0xB1, 0xA6, 0xA2, 0x19, 0xF8, 0x1B, 0xBD, - 0xF9, 0xD2, 0xE5, 0xC0, 0x70, 0xEC, 0x97, 0xDF, 0x3C, 0xB0, 0xB7, 0x3E, 0xF4, 0x70, 0xDC, 0xE9 }, + { 0x63, 0x64, 0x15, 0x61, 0x77, 0xDC, 0xDF, 0x60, 0x4D, 0xF9, 0x1E, 0x31, 0x32, 0x2E, 0x57, 0x74, + 0x69, 0x1E, 0x0C, 0x41, 0xFA, 0x0D, 0x2F, 0x25, 0x7A, 0xD7, 0xF9, 0xF0, 0x25, 0x98, 0x14, 0x45 }, }, { - { 0x48, 0xE9, 0xC3, 0xDB, 0x3A, 0x8F, 0x3B, 0x82, 0x60, 0x20, 0x9F, 0x05, 0x13, 0x3D, 0xBA, 0xDB, - 0xF5, 0x11, 0x7F, 0xB1, 0x0D, 0x11, 0x14, 0xA8, 0xC9, 0x26, 0x83, 0x45, 0x41, 0x59, 0x41, 0x63 }, + { 0x65, 0x66, 0x00, 0xA4, 0x5E, 0x45, 0x6A, 0xBA, 0x5B, 0x00, 0x8D, 0x87, 0x91, 0x54, 0xB7, 0x69, + 0x0D, 0x7F, 0x27, 0x31, 0x02, 0x09, 0x7D, 0x8F, 0xD8, 0xC3, 0xDE, 0xAB, 0x30, 0xD8, 0x4A, 0xB2 }, }, { - { 0x49, 0x64, 0xF3, 0x85, 0xCC, 0x36, 0x3B, 0xF0, 0x61, 0x7E, 0x05, 0x66, 0xB2, 0xE0, 0xD3, 0x03, - 0x3E, 0xB1, 0x26, 0x27, 0x0E, 0x00, 0xD3, 0x22, 0xF0, 0x95, 0xEC, 0xBA, 0x13, 0x06, 0x88, 0x8C }, + { 0x65, 0xED, 0x61, 0xA8, 0x8C, 0x55, 0xEF, 0xB0, 0x38, 0x07, 0x1A, 0xEE, 0xDE, 0xF8, 0xE1, 0x83, + 0xE2, 0x37, 0x38, 0x46, 0x97, 0x26, 0xEB, 0x99, 0x68, 0x0C, 0xD2, 0x44, 0x72, 0x73, 0x6B, 0xEC }, }, { - { 0x49, 0xDC, 0xF8, 0xFA, 0x68, 0xE9, 0x2B, 0x5C, 0x21, 0xFE, 0xF9, 0x3D, 0x26, 0x0C, 0x24, 0x8C, - 0xE3, 0xBE, 0x98, 0x62, 0x68, 0x68, 0xE7, 0x5A, 0x3F, 0x63, 0x34, 0xBB, 0x7D, 0xC1, 0x81, 0xEC }, + { 0x66, 0x50, 0xB2, 0xEA, 0x64, 0x4C, 0x3F, 0x4E, 0x8C, 0x9E, 0x3C, 0x46, 0xAC, 0xEA, 0xC4, 0x52, + 0x33, 0xD8, 0x66, 0xE3, 0x98, 0xFF, 0x90, 0xEB, 0x59, 0xB2, 0xC6, 0x25, 0x20, 0x82, 0xAC, 0x04 }, }, { - { 0x49, 0xE0, 0xD6, 0x97, 0x5A, 0x23, 0x47, 0x67, 0x2C, 0xC4, 0x1A, 0x76, 0x86, 0x3A, 0xA9, 0x30, - 0xB6, 0x7C, 0x2A, 0xA4, 0xF6, 0x65, 0x1F, 0x9A, 0x28, 0xF7, 0xFB, 0x38, 0xB4, 0xA4, 0x41, 0x96 }, + { 0x66, 0xBE, 0x7E, 0xA1, 0x13, 0x8B, 0xCB, 0xA4, 0xDE, 0x0B, 0x41, 0x28, 0x5D, 0x9A, 0x13, 0x3F, + 0xA7, 0xF5, 0x70, 0xA3, 0xC8, 0x13, 0x55, 0x79, 0xB8, 0x60, 0x19, 0x9D, 0x0A, 0x51, 0x45, 0x7C }, }, { - { 0x49, 0xF3, 0x0D, 0xB3, 0x32, 0xF4, 0x53, 0x6A, 0xD4, 0x53, 0xBC, 0x68, 0x9C, 0x2C, 0x63, 0x10, - 0x6F, 0xFF, 0xC2, 0xB1, 0x86, 0x23, 0xAA, 0x0B, 0xDE, 0xAA, 0xB4, 0xF9, 0xEB, 0x7C, 0x0E, 0x42 }, + { 0x69, 0x01, 0x4B, 0xBC, 0x84, 0x29, 0xD8, 0x5F, 0x41, 0xC2, 0x22, 0xD9, 0x7F, 0x7E, 0xD5, 0x35, + 0xCF, 0x81, 0x23, 0x9A, 0xF2, 0x7A, 0xCC, 0x88, 0x70, 0xDC, 0xD4, 0x08, 0x34, 0x8B, 0x48, 0xBA }, }, { - { 0x4A, 0x10, 0xBC, 0x78, 0x52, 0x2D, 0xAA, 0x83, 0xF4, 0x55, 0x81, 0xE5, 0xFB, 0xF6, 0x3D, 0xE8, - 0x47, 0x92, 0x4F, 0x93, 0x78, 0x3C, 0xB0, 0x5C, 0xAE, 0x3C, 0x1C, 0x5B, 0x57, 0x01, 0x04, 0x69 }, + { 0x69, 0x21, 0x1F, 0x36, 0x3A, 0x2D, 0xBE, 0x01, 0x5B, 0x31, 0xCB, 0xD9, 0xFC, 0x5E, 0x94, 0xC2, + 0xF6, 0xF4, 0x3C, 0x58, 0xDB, 0xDE, 0xE9, 0xE3, 0xE4, 0x6B, 0x19, 0xD7, 0x59, 0xBB, 0xB8, 0x81 }, }, { - { 0x4A, 0x47, 0x5B, 0x01, 0xD5, 0xE2, 0x70, 0xAB, 0xEE, 0xA0, 0xCC, 0x08, 0xAF, 0x77, 0xB9, 0x6C, - 0x8A, 0xE2, 0x82, 0x6F, 0x32, 0x61, 0xA0, 0xFD, 0xA3, 0x7A, 0xCA, 0xD3, 0xC9, 0xC8, 0x60, 0x41 }, + { 0x69, 0x75, 0x67, 0xBB, 0xAC, 0x94, 0xEE, 0xC3, 0xE6, 0xFA, 0x4A, 0x4E, 0x46, 0xFA, 0x51, 0x74, + 0x05, 0xF3, 0x77, 0xC0, 0xDE, 0xE3, 0xD4, 0x29, 0x91, 0x4E, 0x6B, 0x7E, 0xA0, 0x8C, 0xB1, 0xA6 }, }, { - { 0x4A, 0x8E, 0x3A, 0xDB, 0xDC, 0xBE, 0x3E, 0x7E, 0xD8, 0x7D, 0x81, 0x4F, 0x60, 0x46, 0x1B, 0x82, - 0x36, 0x24, 0xF4, 0x9B, 0xE3, 0x5D, 0x66, 0x39, 0x09, 0xEC, 0xB1, 0x8F, 0xBF, 0x06, 0x01, 0x3F }, + { 0x6A, 0xAC, 0xC5, 0x09, 0x2F, 0x12, 0xBC, 0x94, 0xA0, 0xAD, 0x0E, 0x9E, 0xF6, 0x36, 0x43, 0x7D, + 0x36, 0x0D, 0xC7, 0xC9, 0xF1, 0x40, 0x44, 0x17, 0xA3, 0x36, 0x91, 0x94, 0x4E, 0x76, 0x31, 0x36 }, }, { - { 0x4A, 0x90, 0x3B, 0x61, 0xE8, 0x1B, 0x53, 0xDA, 0xEF, 0x8E, 0xD3, 0xF7, 0x72, 0x14, 0xC6, 0xB7, - 0x74, 0xD4, 0xD2, 0x9D, 0xD6, 0x75, 0xC9, 0x1C, 0xDB, 0x2E, 0x0C, 0xEB, 0x36, 0xBC, 0x66, 0xE7 }, + { 0x6B, 0x4A, 0x8C, 0xB6, 0x07, 0xF5, 0x1C, 0x83, 0x0D, 0xE7, 0x20, 0xF4, 0xBB, 0xDE, 0xDF, 0x49, + 0x10, 0x15, 0x13, 0xDF, 0xD1, 0xDB, 0x0B, 0x0A, 0x97, 0xCC, 0x3F, 0xDD, 0x9A, 0x39, 0xC6, 0xE7 }, }, { - { 0x4A, 0xA7, 0xD5, 0xCD, 0xB1, 0x8E, 0x5E, 0xAE, 0x05, 0x9D, 0x54, 0x10, 0xFD, 0x5B, 0x44, 0xA5, - 0x9E, 0xBA, 0x0D, 0xE9, 0x66, 0x3C, 0x42, 0x2F, 0x42, 0x35, 0x87, 0x04, 0xC3, 0x2C, 0x90, 0x2D }, + { 0x6C, 0x8F, 0xD1, 0xE6, 0xE1, 0x1B, 0xAF, 0xA6, 0x17, 0x78, 0x13, 0xA0, 0x44, 0x40, 0xB1, 0xB9, + 0x6A, 0x1C, 0xDB, 0x7C, 0x2D, 0x70, 0x3F, 0x55, 0xDE, 0x85, 0x7C, 0x80, 0xA8, 0x9E, 0x73, 0x25 }, }, { - { 0x4A, 0xCF, 0x9D, 0xA9, 0x05, 0x2F, 0x0B, 0x8C, 0xFF, 0xF7, 0x37, 0xCD, 0xA3, 0x39, 0x11, 0xC2, - 0x9E, 0xFC, 0xBF, 0xFD, 0x4B, 0xF4, 0xB7, 0x24, 0x83, 0xFA, 0xA7, 0xC7, 0x45, 0x1D, 0xFD, 0x42 }, + { 0x6C, 0xC6, 0xDC, 0xDA, 0x58, 0xC6, 0x1F, 0xB2, 0x86, 0x70, 0xD1, 0xC2, 0x01, 0x76, 0x57, 0xB0, + 0xC5, 0xD6, 0x1A, 0x26, 0xC9, 0xCB, 0xD1, 0xEA, 0x75, 0x5C, 0x68, 0x20, 0xB5, 0xF6, 0xD6, 0x7D }, }, { - { 0x4A, 0xD2, 0x17, 0xA9, 0x6E, 0x15, 0x30, 0xCB, 0xC5, 0xDE, 0xB8, 0x6A, 0xFF, 0x27, 0x63, 0x55, - 0x23, 0x59, 0xDA, 0x5B, 0x59, 0x82, 0xE5, 0x38, 0xBA, 0xB7, 0xC9, 0x2A, 0x15, 0x9C, 0xB8, 0x3C }, + { 0x6D, 0x32, 0xF4, 0x93, 0x40, 0x56, 0xEE, 0x17, 0x14, 0xCA, 0x72, 0x70, 0x3F, 0x64, 0x46, 0x9B, + 0x98, 0x58, 0xFC, 0x39, 0x96, 0x4B, 0x4C, 0x03, 0x93, 0xB3, 0x7D, 0xDE, 0xAB, 0x8B, 0x19, 0x75 }, }, { - { 0x4A, 0xE5, 0xE5, 0x1E, 0x7F, 0xF1, 0x67, 0x47, 0x77, 0x5E, 0x2B, 0x2C, 0x05, 0x72, 0x1D, 0x95, - 0xEB, 0xEB, 0x8C, 0x46, 0x01, 0xFD, 0xDC, 0xDC, 0x90, 0xFB, 0xCE, 0x69, 0x7E, 0x35, 0x01, 0x2C }, + { 0x6D, 0xC9, 0x87, 0x5C, 0xD3, 0x46, 0xA2, 0x2B, 0x47, 0xB2, 0x80, 0xB1, 0xB1, 0x45, 0x0D, 0x87, + 0x8E, 0x09, 0x8B, 0xB2, 0xE2, 0xA9, 0xE3, 0xC2, 0x5C, 0xC7, 0x6A, 0xFF, 0x93, 0xC0, 0xBE, 0xAB }, }, { - { 0x4B, 0x04, 0x83, 0x2E, 0x6C, 0x99, 0xEA, 0x3A, 0x31, 0xF4, 0x83, 0x76, 0x82, 0xB5, 0x43, 0x7C, - 0x09, 0x99, 0x78, 0x1E, 0x77, 0xCB, 0xDE, 0xB8, 0x93, 0xDB, 0xFE, 0xF3, 0x1E, 0x0E, 0xE3, 0x3E }, + { 0x6E, 0x1A, 0x88, 0x63, 0xF2, 0x93, 0x4B, 0x39, 0x01, 0x23, 0x7E, 0x84, 0xD0, 0x76, 0x27, 0x04, + 0x23, 0x06, 0x78, 0x7F, 0x2D, 0xE0, 0x66, 0x30, 0xBD, 0x37, 0xD8, 0x03, 0x94, 0x35, 0xBF, 0xCA }, }, { - { 0x4B, 0x1F, 0xC8, 0x2D, 0x24, 0x72, 0x92, 0x7A, 0xC1, 0x7C, 0x58, 0x43, 0x07, 0xCB, 0x96, 0xD6, - 0xFD, 0xDB, 0x8D, 0x50, 0xA5, 0x29, 0x53, 0x07, 0xD3, 0x0C, 0x75, 0x88, 0x59, 0x6A, 0xD4, 0x0B }, + { 0x6F, 0x3B, 0xB3, 0x4B, 0x5D, 0x32, 0x91, 0xDF, 0xB3, 0xE4, 0x12, 0x71, 0xA1, 0xD7, 0x30, 0xCD, + 0xBC, 0xFF, 0xC1, 0x0B, 0x68, 0x05, 0x9D, 0xCC, 0xD3, 0x1C, 0x47, 0x4B, 0xB7, 0x44, 0x16, 0xE5 }, }, { - { 0x4B, 0x2D, 0xF9, 0xFA, 0xF4, 0x2F, 0x2B, 0x06, 0x61, 0x28, 0x80, 0xD2, 0x69, 0x04, 0x2B, 0x6C, - 0x1C, 0x51, 0xE7, 0xAC, 0xF0, 0x45, 0x91, 0xB6, 0x68, 0x66, 0x33, 0x5F, 0xCE, 0x7C, 0xC6, 0x84 }, + { 0x6F, 0xBD, 0xCD, 0xF1, 0xB4, 0x37, 0x9F, 0xC4, 0x73, 0xAB, 0x5E, 0xEA, 0x4E, 0xC2, 0xF4, 0x84, + 0xCE, 0x91, 0xD1, 0x0E, 0x31, 0x34, 0x5F, 0x15, 0xA7, 0x6A, 0x84, 0x85, 0xB8, 0xFF, 0xFB, 0x7E }, }, { - { 0x4B, 0x35, 0x02, 0xFF, 0xAD, 0x64, 0x16, 0x39, 0x4F, 0x2F, 0x78, 0x47, 0x76, 0x13, 0x39, 0x69, - 0xA5, 0x5C, 0xA8, 0xF3, 0x9F, 0x78, 0x3C, 0x26, 0x0F, 0xFE, 0xDB, 0xA8, 0xFC, 0xE4, 0x19, 0x70 }, + { 0x6F, 0xDC, 0x18, 0xD6, 0x55, 0x14, 0xDD, 0xCE, 0xF0, 0x2F, 0xEA, 0x81, 0x7A, 0x1B, 0x70, 0x84, + 0x71, 0x95, 0xFF, 0x5C, 0x07, 0xB1, 0x3D, 0x6A, 0x97, 0x1E, 0x0E, 0x77, 0x4B, 0x44, 0x10, 0xA0 }, }, { - { 0x4B, 0x51, 0xFC, 0x11, 0x4B, 0xAC, 0x8E, 0x2D, 0x2A, 0xF2, 0xAE, 0x56, 0x84, 0x42, 0x9C, 0xCA, - 0xAB, 0x21, 0x39, 0xC9, 0xB3, 0x51, 0xBF, 0x7E, 0x1B, 0x03, 0x0A, 0xE8, 0x62, 0x4A, 0xC1, 0x72 }, + { 0x70, 0xB8, 0xEC, 0xD5, 0x62, 0xEC, 0x3D, 0x9F, 0x48, 0x64, 0x75, 0x2A, 0x3A, 0x8C, 0x54, 0x39, + 0x93, 0xB4, 0x38, 0x72, 0x8F, 0xE2, 0x71, 0x81, 0xF4, 0xC0, 0x8D, 0xE6, 0xA0, 0xD8, 0xB7, 0x9A }, }, { - { 0x4B, 0x5D, 0xBF, 0x01, 0x0B, 0x3E, 0x62, 0x78, 0x9C, 0x43, 0x8E, 0x07, 0x18, 0xEC, 0xB4, 0x4A, - 0x5D, 0xC0, 0x8F, 0xEB, 0xCF, 0xF7, 0x0A, 0xDF, 0x5B, 0xE0, 0x0A, 0x6E, 0x49, 0xE5, 0x71, 0xF7 }, + { 0x71, 0x1E, 0xF0, 0x96, 0x33, 0x43, 0x8A, 0xC5, 0xBE, 0x9D, 0xA8, 0x12, 0x2E, 0x7A, 0xCF, 0x0E, + 0xA2, 0x68, 0xB8, 0x72, 0xAD, 0xDC, 0x3E, 0xE8, 0x37, 0x2B, 0x91, 0x6D, 0x60, 0x65, 0xCF, 0xA8 }, }, { - { 0x4B, 0x92, 0xDC, 0xFD, 0x0E, 0xDA, 0x00, 0x5D, 0x9A, 0x37, 0x3D, 0x91, 0xA6, 0x1F, 0x23, 0x12, - 0x9D, 0x7B, 0x85, 0x3D, 0x79, 0x52, 0x87, 0xC9, 0x5C, 0x7E, 0x17, 0x24, 0xA9, 0x1C, 0x53, 0xB3 }, + { 0x72, 0x1B, 0x1F, 0x92, 0x9D, 0xA7, 0xEA, 0xF8, 0x96, 0x24, 0x64, 0x7B, 0xA3, 0xCC, 0x4E, 0x1E, + 0xD1, 0x57, 0x54, 0xAB, 0x83, 0x6E, 0x33, 0x58, 0xB0, 0x35, 0xA1, 0xF2, 0x27, 0x4A, 0x43, 0xBE }, }, { - { 0x4B, 0xB1, 0x83, 0xDE, 0xB1, 0x16, 0xAC, 0x82, 0xAD, 0xC2, 0xC1, 0x0F, 0x61, 0x4C, 0x13, 0x11, - 0xBF, 0xE9, 0xAA, 0xAB, 0x0D, 0x34, 0x87, 0x00, 0xC4, 0xD2, 0xD3, 0x52, 0xFD, 0xBA, 0x67, 0x7E }, + { 0x72, 0xE7, 0x49, 0x87, 0x21, 0x0C, 0x7E, 0xF6, 0x67, 0x46, 0xE4, 0x9A, 0x96, 0xDF, 0x55, 0xCC, + 0x6F, 0xAD, 0xF7, 0xA6, 0x31, 0xC7, 0xAE, 0x3F, 0x3E, 0x9E, 0x18, 0x72, 0x3D, 0xE5, 0x2A, 0x6E }, }, { - { 0x4C, 0x08, 0x8A, 0x68, 0x93, 0x6D, 0x5F, 0x6F, 0x12, 0xCB, 0x4A, 0x8F, 0x97, 0xA8, 0xF4, 0xAB, - 0x94, 0x96, 0x4C, 0xF6, 0xFB, 0x27, 0x6F, 0x0A, 0x9D, 0x78, 0x9E, 0xA6, 0x73, 0xB2, 0x7E, 0x04 }, + { 0x73, 0x3B, 0x42, 0x24, 0x25, 0x8D, 0xEE, 0x07, 0x0E, 0xDF, 0xA3, 0x41, 0x1F, 0xBC, 0x9B, 0xAD, + 0x31, 0x65, 0xBE, 0x66, 0x0F, 0x34, 0x0A, 0xA2, 0x30, 0x8A, 0x5A, 0x33, 0x23, 0xFA, 0xBF, 0xA7 }, }, { - { 0x4C, 0x33, 0x6E, 0x46, 0x9E, 0x9C, 0x01, 0xC3, 0x84, 0xAB, 0x9A, 0xA2, 0x2E, 0x9E, 0x3F, 0x36, - 0xF1, 0xE5, 0x9C, 0xFE, 0x05, 0x0F, 0x66, 0xEC, 0x07, 0xD0, 0xFD, 0x02, 0x30, 0xCC, 0xF4, 0x23 }, + { 0x76, 0x98, 0x67, 0x60, 0xAC, 0xFE, 0x55, 0x59, 0xA2, 0xA2, 0xAB, 0x2A, 0x4E, 0x85, 0x49, 0x83, + 0xC5, 0xFD, 0xE6, 0x73, 0xCE, 0x8E, 0xB1, 0x71, 0x23, 0x49, 0x48, 0x64, 0x86, 0x7A, 0x98, 0xB1 }, }, { - { 0x4C, 0x3A, 0x76, 0xD1, 0x2C, 0x70, 0x0C, 0x25, 0x1B, 0x02, 0x04, 0xBA, 0x9F, 0x27, 0xC0, 0xDA, - 0xCB, 0x2E, 0x47, 0x37, 0x72, 0x64, 0xCD, 0x31, 0xC4, 0xFE, 0xA4, 0xA4, 0x58, 0x5A, 0x99, 0x60 }, + { 0x77, 0xDD, 0xC8, 0x1B, 0xD2, 0x8B, 0x9D, 0x46, 0x1E, 0x7D, 0x3C, 0xD4, 0xA8, 0x12, 0x2A, 0xA9, + 0x8A, 0x24, 0x60, 0xFB, 0xA0, 0x8F, 0x1B, 0x7B, 0xAC, 0xB6, 0x6C, 0x92, 0xD7, 0x99, 0x1C, 0xCC }, }, { - { 0x4C, 0x3C, 0x7C, 0xBC, 0x42, 0x1C, 0xE0, 0xD1, 0x84, 0x4E, 0xA7, 0xB4, 0x6F, 0x61, 0xD7, 0x87, - 0xE0, 0x4F, 0x94, 0x01, 0x71, 0x49, 0xBE, 0xA3, 0x28, 0xED, 0xC3, 0x6C, 0x20, 0xE3, 0x2F, 0xAA }, + { 0x78, 0x0C, 0x33, 0xFE, 0x95, 0x4C, 0xC4, 0xDB, 0x39, 0x04, 0xD7, 0x6A, 0x68, 0x58, 0xBC, 0xD1, + 0x01, 0x7F, 0x52, 0xDA, 0x59, 0x9D, 0x36, 0xDA, 0xE6, 0x66, 0xC0, 0x4E, 0x41, 0xAF, 0x8D, 0xCD }, }, { - { 0x4C, 0x4B, 0xB6, 0x05, 0x65, 0xB5, 0xCA, 0x7F, 0x02, 0xF8, 0xF5, 0x9B, 0xFA, 0x1D, 0x1D, 0x62, - 0x71, 0xB2, 0xF1, 0x4D, 0x5C, 0xD3, 0xA0, 0x43, 0x51, 0xC3, 0xC4, 0x9D, 0x3F, 0xA0, 0x43, 0xB4 }, + { 0x78, 0xC9, 0x30, 0x40, 0x5A, 0x72, 0x0D, 0x9F, 0x00, 0x66, 0xDD, 0x88, 0xA2, 0xA8, 0xDA, 0xFB, + 0xBE, 0x6C, 0xD6, 0x5D, 0x54, 0xB7, 0x76, 0x06, 0x42, 0x1B, 0x45, 0x43, 0x8C, 0x65, 0x8A, 0xD4 }, }, { - { 0x4C, 0x8A, 0x29, 0xB5, 0x81, 0x7D, 0x90, 0x99, 0xA4, 0xFE, 0xD1, 0xE7, 0x93, 0xB2, 0x8E, 0x2F, - 0xAF, 0x6E, 0x87, 0x14, 0xEE, 0x77, 0x60, 0xA7, 0xD5, 0x3E, 0x31, 0x15, 0x2C, 0x18, 0xAC, 0xC2 }, + { 0x79, 0x8F, 0x83, 0xB1, 0xC4, 0xC6, 0x5C, 0x4D, 0x5D, 0xEA, 0x13, 0x03, 0x53, 0x53, 0xD8, 0xED, + 0xE5, 0xD7, 0x1D, 0x99, 0x47, 0xF4, 0x34, 0xFD, 0xEA, 0x0D, 0xBC, 0x1E, 0xC8, 0x2F, 0x45, 0x35 }, }, { - { 0x4C, 0xBA, 0x10, 0x70, 0x0C, 0x5F, 0xA6, 0xE0, 0x4F, 0x2E, 0xDF, 0xE5, 0x40, 0x2A, 0xDD, 0x82, - 0xBD, 0x8E, 0xAF, 0xAB, 0x38, 0x44, 0x71, 0x11, 0xBE, 0x62, 0x63, 0x7D, 0x64, 0x9F, 0xE3, 0xC6 }, + { 0x79, 0xA8, 0xFC, 0x72, 0x70, 0xB2, 0xE5, 0xF3, 0x35, 0x6B, 0x09, 0xC6, 0xB8, 0x64, 0xFC, 0x92, + 0xE5, 0xFB, 0xC9, 0xE6, 0x9B, 0xEC, 0x93, 0xA4, 0xE3, 0x3B, 0x8D, 0xF5, 0x75, 0x60, 0x17, 0xBE }, }, { - { 0x4C, 0xD0, 0xD6, 0x7E, 0xCC, 0x3B, 0x01, 0xC8, 0xC2, 0x63, 0x4E, 0x7A, 0x73, 0x76, 0x12, 0xF6, - 0x3A, 0x17, 0xFF, 0x51, 0x0A, 0x77, 0xA8, 0x04, 0xBB, 0x33, 0x1B, 0x2B, 0xE5, 0x8D, 0xFE, 0x0C }, + { 0x7B, 0xFE, 0x47, 0xAE, 0xBA, 0x8B, 0x0A, 0x3A, 0x94, 0x5A, 0x88, 0xD8, 0xEF, 0x18, 0x91, 0xC9, + 0x89, 0x97, 0x8A, 0xBF, 0x12, 0x2E, 0xC5, 0xE0, 0x51, 0x4B, 0xE3, 0x6C, 0x3A, 0x7F, 0x22, 0x9B }, }, { - { 0x4C, 0xD6, 0xDC, 0xC0, 0x71, 0xC6, 0x81, 0x56, 0x6F, 0x1F, 0xB5, 0x46, 0x95, 0x12, 0x67, 0xE3, - 0x2A, 0x36, 0x9D, 0x64, 0xAD, 0x95, 0x1A, 0xB4, 0xCA, 0x83, 0x36, 0xF6, 0xEE, 0x86, 0xC6, 0x08 }, + { 0x7D, 0x20, 0xC7, 0xA9, 0x27, 0x26, 0x2B, 0xE7, 0x38, 0xD2, 0x58, 0xD0, 0xFD, 0x97, 0x6E, 0x9A, + 0xF3, 0x6E, 0xF7, 0x99, 0x5F, 0x05, 0xE2, 0x87, 0x6A, 0x29, 0xAE, 0xBC, 0x3A, 0x24, 0xAA, 0xCE }, }, { - { 0x4C, 0xD8, 0x6A, 0xA6, 0x0C, 0xB3, 0x69, 0x00, 0xA9, 0xAA, 0x3B, 0x7B, 0x02, 0x7D, 0x71, 0x4C, - 0x0F, 0x76, 0x07, 0xC3, 0x56, 0x73, 0x3B, 0xA2, 0x21, 0xAA, 0xE4, 0x09, 0x47, 0xF7, 0xFA, 0xCB }, + { 0x7E, 0x2E, 0xDB, 0x9D, 0x38, 0xF9, 0x29, 0x3C, 0xDD, 0xD6, 0x03, 0xB1, 0x75, 0xC9, 0xB2, 0x05, + 0xAC, 0x0B, 0x55, 0x3A, 0x4B, 0xF5, 0xFB, 0x08, 0xC2, 0x46, 0xEC, 0xF9, 0xC8, 0x49, 0xDB, 0x28 }, }, { - { 0x4D, 0x25, 0x2E, 0x6E, 0x1A, 0x15, 0x9A, 0xC2, 0x22, 0xB3, 0x2E, 0x9D, 0xD0, 0x31, 0x56, 0x7B, - 0x69, 0x31, 0x4B, 0xE8, 0xE8, 0x21, 0x1C, 0x1F, 0xB3, 0xC8, 0xB5, 0x3C, 0x26, 0x0A, 0x74, 0xE5 }, + { 0x7F, 0x95, 0x9B, 0x06, 0x34, 0xDA, 0x94, 0xFA, 0xCA, 0xDA, 0xB0, 0x21, 0xCF, 0x94, 0x20, 0x78, + 0x16, 0x00, 0x36, 0x13, 0xEF, 0x09, 0xEB, 0x54, 0xF6, 0x48, 0x60, 0x50, 0x08, 0x19, 0x02, 0x75 }, }, { - { 0x4D, 0x54, 0x4D, 0x4E, 0x41, 0xC0, 0xFB, 0x15, 0x5F, 0x04, 0x7D, 0x7F, 0xB1, 0xEF, 0x29, 0xD1, - 0x1B, 0xDF, 0xEC, 0xA9, 0xD4, 0x11, 0xAF, 0x8B, 0x12, 0x54, 0x1F, 0x11, 0x50, 0xC0, 0xB4, 0x44 }, + { 0x7F, 0x9A, 0x69, 0xCF, 0xA2, 0xF5, 0x0C, 0x13, 0xE1, 0xB7, 0x11, 0xDD, 0x6B, 0x14, 0x69, 0x2B, + 0xDB, 0x77, 0xD9, 0xFF, 0xD8, 0xC1, 0x10, 0xAE, 0x5D, 0x05, 0xA4, 0xCB, 0x73, 0x12, 0x37, 0x48 }, }, { - { 0x4D, 0xCF, 0xEB, 0xDC, 0x15, 0x4B, 0x0C, 0x85, 0x46, 0x7F, 0x6F, 0x52, 0xAD, 0x80, 0x4E, 0x19, - 0x1D, 0x5B, 0xC8, 0x13, 0x51, 0x72, 0x0E, 0xC0, 0xD1, 0x9B, 0xD2, 0x5B, 0xF8, 0xF0, 0xA5, 0x53 }, + { 0x80, 0x20, 0x56, 0xE1, 0xDB, 0x9D, 0x9B, 0x73, 0x21, 0xD1, 0xFF, 0xBB, 0xE1, 0x2F, 0x5C, 0xBE, + 0xDE, 0xC3, 0x6D, 0x0B, 0x5E, 0xC2, 0xA4, 0xE1, 0x8D, 0x99, 0x54, 0x36, 0x4C, 0xEC, 0x81, 0x29 }, }, { - { 0x4D, 0xE2, 0x4B, 0x7F, 0xE2, 0x6D, 0x50, 0x6E, 0x76, 0xAC, 0x3A, 0xCB, 0x32, 0x53, 0x3D, 0x50, - 0x1B, 0xC1, 0x6A, 0x2D, 0x50, 0xB5, 0x6D, 0x65, 0x96, 0xB3, 0x0B, 0x21, 0xB0, 0x1E, 0x4D, 0x09 }, + { 0x80, 0x97, 0x63, 0x4C, 0xE3, 0x3D, 0x41, 0x53, 0x3D, 0x41, 0x5D, 0xAF, 0xDB, 0x8B, 0xA1, 0x91, + 0xC0, 0x30, 0x52, 0xAC, 0x8B, 0xAA, 0x25, 0x54, 0x34, 0x77, 0x3A, 0x16, 0x4B, 0x91, 0x1D, 0x6E }, }, { - { 0x4D, 0xE5, 0xA5, 0xDE, 0x12, 0x4E, 0x27, 0x69, 0x81, 0x79, 0x67, 0x53, 0xDD, 0x20, 0x20, 0xB1, - 0x10, 0x54, 0x09, 0x32, 0xF7, 0x4F, 0x97, 0x41, 0xD9, 0x6C, 0x1D, 0xB9, 0x50, 0x5D, 0x5F, 0xF1 }, + { 0x80, 0xD0, 0x17, 0x09, 0x34, 0xD2, 0x2A, 0xEA, 0x73, 0x3F, 0x11, 0x5E, 0x52, 0x42, 0xC6, 0xB8, + 0x6D, 0x7F, 0xCF, 0xB4, 0x90, 0x4E, 0x65, 0xB7, 0xB7, 0xB9, 0x07, 0xF2, 0xCA, 0x94, 0xED, 0x71 }, }, { - { 0x4E, 0x33, 0x78, 0xEC, 0x23, 0x7C, 0x01, 0xA3, 0xCD, 0x85, 0x9E, 0x1D, 0xC9, 0x29, 0xD6, 0xA6, - 0xEF, 0xB6, 0x36, 0x7A, 0x72, 0x58, 0x41, 0xCF, 0x54, 0x13, 0x25, 0xC0, 0x61, 0xF8, 0xBF, 0xD4 }, + { 0x81, 0x1D, 0xF2, 0xF4, 0x73, 0x6F, 0x85, 0x62, 0xE2, 0x02, 0xFD, 0x00, 0x75, 0x32, 0xF1, 0xDE, + 0x40, 0x17, 0x86, 0x1E, 0xFA, 0xBE, 0x67, 0x34, 0x20, 0xC2, 0x7F, 0x2E, 0x2A, 0x33, 0xFA, 0xC1 }, }, { - { 0x4E, 0x48, 0xC1, 0x6C, 0x9D, 0x0D, 0xE5, 0xDD, 0x8C, 0x9C, 0x36, 0x37, 0x35, 0xDD, 0xFB, 0xC3, - 0xDB, 0xD2, 0x6E, 0xA0, 0xAE, 0xCD, 0xE1, 0xC7, 0x62, 0xBB, 0x56, 0xBB, 0x3F, 0xE4, 0xFA, 0x74 }, + { 0x81, 0x1E, 0x37, 0x86, 0x37, 0xB1, 0xD2, 0xCB, 0xB1, 0x89, 0xAF, 0xD6, 0x74, 0x95, 0xFE, 0x8A, + 0xB9, 0xD8, 0x3A, 0x74, 0x2E, 0x35, 0x8C, 0xBB, 0xDB, 0xD1, 0x54, 0x98, 0xBF, 0x9C, 0x7B, 0x56 }, }, { - { 0x4E, 0x56, 0x28, 0x87, 0x76, 0x0B, 0xA6, 0xC0, 0x2C, 0x8B, 0x1D, 0x54, 0xC6, 0x05, 0xD2, 0x67, - 0x5A, 0xC9, 0x9B, 0x13, 0x24, 0x52, 0xDE, 0x6F, 0xE9, 0x6B, 0xAE, 0x54, 0x75, 0x5E, 0xD8, 0x90 }, + { 0x81, 0xA0, 0xF1, 0xD0, 0x29, 0x46, 0x8E, 0xE8, 0x66, 0x36, 0x4A, 0x19, 0x8A, 0x26, 0x08, 0x58, + 0x30, 0xC2, 0xA4, 0x16, 0xE4, 0x9E, 0x22, 0x4C, 0xE8, 0x09, 0x66, 0xFC, 0xC4, 0x99, 0xD6, 0x36 }, }, { - { 0x4E, 0x59, 0x82, 0xAC, 0x8E, 0xB9, 0x51, 0x12, 0x2D, 0x08, 0x77, 0xBB, 0xED, 0x12, 0x8C, 0x14, - 0xC3, 0x30, 0xE4, 0xFE, 0x98, 0xB9, 0x20, 0x04, 0x91, 0x58, 0x75, 0x10, 0x38, 0x26, 0xDE, 0x30 }, + { 0x82, 0x56, 0x8B, 0x3B, 0xB3, 0xC6, 0x55, 0xD7, 0xF2, 0x2D, 0x8C, 0x97, 0xA5, 0x66, 0x9C, 0xC8, + 0x34, 0xA2, 0xDD, 0x7C, 0xDA, 0xE7, 0x5A, 0x26, 0x45, 0x59, 0x55, 0x16, 0x46, 0x55, 0x8E, 0x14 }, }, { - { 0x4E, 0x6F, 0xB7, 0x05, 0x5D, 0xA4, 0x37, 0xEB, 0x46, 0x8D, 0x77, 0x94, 0x59, 0x96, 0xBE, 0x17, - 0x7E, 0x97, 0xDD, 0xA8, 0x9E, 0xF9, 0xA4, 0xB0, 0x61, 0x17, 0xB4, 0xE9, 0x75, 0xE1, 0xC5, 0x50 }, + { 0x82, 0x7C, 0x8C, 0x80, 0x11, 0x1F, 0xF2, 0x21, 0xC3, 0xEB, 0x1E, 0xF5, 0xC0, 0xD5, 0xD4, 0x34, + 0x48, 0x31, 0x86, 0xE2, 0x09, 0x00, 0x75, 0x63, 0x15, 0x8E, 0x9E, 0x76, 0xD2, 0x79, 0x0F, 0x1C }, }, { - { 0x4E, 0xF1, 0x31, 0x9C, 0x31, 0x26, 0xF0, 0x22, 0xAD, 0x27, 0xE5, 0xC4, 0x1A, 0x6C, 0x03, 0xFE, - 0x93, 0x05, 0x70, 0x7B, 0xF2, 0x02, 0x9A, 0xF3, 0x7F, 0x9F, 0x89, 0xE0, 0xF2, 0x5A, 0x93, 0x1C }, + { 0x82, 0x92, 0x67, 0xC5, 0xAD, 0x70, 0xE5, 0x45, 0x18, 0x02, 0x3A, 0xB7, 0x85, 0xFA, 0x3C, 0xDE, + 0xD6, 0x6F, 0x42, 0x5D, 0xE1, 0xF3, 0x2F, 0xCD, 0x72, 0x1B, 0x49, 0x46, 0x3A, 0x5A, 0x5F, 0x5B }, }, { - { 0x4F, 0x19, 0xDD, 0x12, 0x92, 0x4C, 0xE0, 0xC1, 0x4F, 0x82, 0xC0, 0x56, 0xC7, 0xD4, 0x2B, 0xAC, - 0x43, 0xD0, 0x13, 0x3A, 0xAF, 0x89, 0xC1, 0xEF, 0xDC, 0xFA, 0x3C, 0x3E, 0x47, 0x09, 0x7D, 0x59 }, + { 0x83, 0x34, 0xEA, 0xB8, 0x1C, 0x60, 0x4E, 0x99, 0xD5, 0x40, 0x51, 0x3E, 0xF2, 0xE3, 0x7A, 0xBA, + 0x71, 0x4F, 0x07, 0xB2, 0xBA, 0x01, 0x0A, 0xD7, 0x1D, 0xC4, 0xE1, 0x1A, 0x92, 0x18, 0xC1, 0x8C }, }, { - { 0x4F, 0x23, 0xC6, 0x87, 0x0C, 0x7C, 0xFA, 0x6D, 0x31, 0x92, 0x70, 0x3D, 0xCA, 0xFD, 0x8F, 0x46, - 0xB7, 0xBC, 0xC3, 0x72, 0xDC, 0x6D, 0x1C, 0x61, 0x00, 0x9A, 0x01, 0x75, 0x20, 0xE9, 0xF3, 0xDF }, + { 0x83, 0x54, 0x7A, 0xCA, 0x3C, 0xED, 0x73, 0xDF, 0x99, 0x14, 0xF3, 0x15, 0x60, 0x74, 0x63, 0x79, + 0x29, 0x4C, 0x76, 0x0E, 0xF9, 0xA8, 0xB7, 0x6E, 0x00, 0x06, 0x46, 0xC7, 0x39, 0x07, 0x21, 0x65 }, }, { - { 0x4F, 0x54, 0x31, 0xA9, 0xA1, 0x5E, 0x08, 0x9B, 0x70, 0x53, 0xB6, 0x61, 0x47, 0xE2, 0xB6, 0x23, - 0xD5, 0x87, 0x6F, 0x9A, 0x04, 0x56, 0x44, 0x67, 0xAE, 0x16, 0x13, 0xF6, 0xA8, 0x15, 0x98, 0x38 }, + { 0x83, 0x89, 0xC8, 0x79, 0xB6, 0x3B, 0x82, 0x9D, 0x2D, 0x39, 0xA8, 0xCF, 0xB7, 0x87, 0xE7, 0x72, + 0x77, 0xD5, 0xCF, 0xA3, 0xE3, 0x6F, 0xDA, 0xCB, 0xAB, 0x4D, 0x18, 0xB2, 0xB0, 0x4E, 0x32, 0x94 }, }, { - { 0x4F, 0x79, 0xC7, 0x9D, 0x52, 0x62, 0x28, 0xB1, 0x0C, 0x70, 0xD3, 0xD7, 0x2A, 0xAA, 0x71, 0x87, - 0xB7, 0x2C, 0x7E, 0xCD, 0x48, 0xF9, 0x16, 0x95, 0xCA, 0x41, 0xA3, 0x6C, 0x55, 0x5C, 0x6C, 0x43 }, + { 0x84, 0x23, 0xB3, 0xF1, 0xCC, 0x85, 0x2B, 0x49, 0xCF, 0x81, 0xB7, 0xD5, 0xFF, 0x51, 0xA7, 0xA5, + 0x6A, 0x84, 0x78, 0x3A, 0x2D, 0xF7, 0x43, 0x61, 0xFF, 0x2E, 0xEE, 0x0F, 0x92, 0x12, 0xC1, 0x59 }, }, { - { 0x4F, 0x9A, 0xCC, 0x0B, 0x75, 0xCE, 0xAA, 0x7C, 0xB3, 0x88, 0x47, 0x09, 0x52, 0xC9, 0x98, 0x08, - 0xE4, 0xF3, 0xCB, 0x99, 0xA7, 0x73, 0xA6, 0x00, 0xCD, 0xDF, 0x2C, 0xF3, 0x1A, 0xE7, 0xEC, 0x72 }, + { 0x84, 0x7B, 0x5F, 0x1E, 0xEB, 0x2A, 0x44, 0x13, 0xC8, 0xFA, 0x37, 0x98, 0x21, 0x97, 0x37, 0xE1, + 0x92, 0xBA, 0x72, 0x72, 0xA1, 0x08, 0xB7, 0x17, 0x28, 0xA8, 0xD1, 0x65, 0x17, 0xF6, 0x1E, 0x9D }, }, { - { 0x4F, 0xAF, 0xAE, 0xBC, 0x7E, 0x20, 0x21, 0xC8, 0x43, 0x86, 0xEC, 0x9D, 0x82, 0xA4, 0x9C, 0x24, - 0xDB, 0xEF, 0xEB, 0x71, 0x2E, 0xA7, 0x2C, 0x0D, 0x64, 0x73, 0x51, 0x86, 0x13, 0x53, 0xCD, 0x69 }, + { 0x85, 0x31, 0xB2, 0xBF, 0xC5, 0x45, 0x79, 0xE8, 0xF1, 0x8F, 0x27, 0xB2, 0xE6, 0xEC, 0xC0, 0xF8, + 0x90, 0x64, 0xEE, 0x86, 0x87, 0x0E, 0xCC, 0x8B, 0xBE, 0x0C, 0xE6, 0x86, 0xEC, 0xDA, 0x2C, 0x17 }, }, { - { 0x4F, 0xE9, 0xF1, 0x68, 0x70, 0x6A, 0x07, 0x5D, 0xA9, 0x6C, 0x71, 0x3D, 0xA4, 0x32, 0x61, 0xE3, - 0x39, 0xA9, 0x93, 0x6E, 0xDD, 0xD5, 0x88, 0x8B, 0xD6, 0x35, 0x00, 0xCA, 0xA6, 0xEF, 0xBF, 0xA8 }, + { 0x85, 0x76, 0x0F, 0x59, 0x51, 0x90, 0xE9, 0xB4, 0x67, 0x8B, 0xBF, 0x44, 0xEF, 0xB5, 0xCF, 0x8F, + 0x6B, 0x19, 0x37, 0xA9, 0xB8, 0x6B, 0x31, 0xB7, 0x51, 0xBE, 0xCF, 0x72, 0x18, 0x03, 0xB0, 0x1C }, }, { - { 0x4F, 0xFB, 0x59, 0x19, 0xBC, 0x38, 0x5C, 0x8C, 0x58, 0xE4, 0x62, 0xBF, 0x13, 0x22, 0x10, 0xD8, - 0xB7, 0x86, 0x12, 0xD0, 0xC2, 0x2A, 0x6B, 0x6A, 0x68, 0x2E, 0x0B, 0x9E, 0x9C, 0x9F, 0x9A, 0x44 }, + { 0x85, 0xF0, 0x79, 0x36, 0xB4, 0x29, 0x1F, 0x36, 0xD9, 0xB7, 0x5F, 0x42, 0xE8, 0xB7, 0xEE, 0x8A, + 0x64, 0xE6, 0x32, 0xA1, 0x18, 0x11, 0x65, 0xFE, 0x72, 0xB4, 0x88, 0x23, 0xC3, 0xD9, 0x9D, 0x9D }, }, { - { 0x50, 0x15, 0xB9, 0xC9, 0x92, 0xC8, 0x87, 0xC2, 0x4C, 0x99, 0x15, 0x38, 0xDD, 0xD5, 0x1D, 0x01, - 0x49, 0xCD, 0x9F, 0xF3, 0x60, 0x49, 0xF3, 0xD8, 0xA0, 0xB2, 0xD2, 0x92, 0x23, 0xF7, 0x91, 0x38 }, + { 0x86, 0x12, 0x9F, 0xE7, 0x61, 0x99, 0x4D, 0x7B, 0x64, 0xE4, 0x02, 0x85, 0x8F, 0x88, 0xC5, 0x2B, + 0x3E, 0xB9, 0xC0, 0x71, 0xFF, 0xBE, 0x80, 0x02, 0x80, 0xAC, 0x8C, 0x0C, 0x6F, 0x79, 0xE7, 0xA6 }, }, { - { 0x50, 0x30, 0x55, 0x80, 0x8F, 0x4C, 0x49, 0xCF, 0xFC, 0xDE, 0x02, 0x27, 0x3C, 0x13, 0x16, 0x38, - 0xF4, 0x3D, 0x38, 0x56, 0x13, 0xE0, 0x73, 0x3D, 0xB4, 0x5F, 0xBD, 0x2A, 0x29, 0x11, 0xD6, 0xE4 }, + { 0x86, 0x19, 0x6B, 0x0F, 0xD3, 0x0F, 0x8F, 0x57, 0x56, 0x98, 0xB5, 0xEE, 0xF2, 0x69, 0xD0, 0x69, + 0x2F, 0x88, 0xAD, 0xEA, 0xC4, 0x83, 0x6A, 0x62, 0x67, 0xAB, 0xC8, 0x36, 0x23, 0x34, 0x00, 0x86 }, }, { - { 0x50, 0x3C, 0x0A, 0xE6, 0x83, 0x4E, 0x46, 0xCA, 0xED, 0x49, 0x7C, 0x43, 0x73, 0x3F, 0x39, 0x7E, - 0x04, 0xD3, 0x06, 0xD5, 0xF8, 0x10, 0x11, 0xD2, 0x0E, 0x5A, 0x03, 0xC5, 0x6B, 0x89, 0xDA, 0x15 }, + { 0x86, 0xD1, 0x8B, 0xCD, 0xDE, 0x16, 0x45, 0x42, 0x48, 0x6E, 0x56, 0x44, 0x2C, 0xE1, 0xB8, 0x8B, + 0x1A, 0x10, 0x73, 0x7C, 0xBD, 0x5E, 0xA4, 0xAA, 0xB8, 0xD5, 0xB8, 0xAF, 0x51, 0xF5, 0x29, 0x09 }, }, { - { 0x50, 0x81, 0x1D, 0x6E, 0x9D, 0xAF, 0x31, 0x2A, 0x6A, 0xC2, 0xAF, 0x6B, 0x52, 0x13, 0xC9, 0x56, - 0x20, 0xE0, 0x24, 0xE0, 0x87, 0xAE, 0x5E, 0xB0, 0xCC, 0x8A, 0xA2, 0x6F, 0xBE, 0xD9, 0xD9, 0x85 }, + { 0x88, 0x8D, 0x6D, 0x77, 0xD8, 0x1C, 0x62, 0x91, 0xCB, 0x84, 0xD9, 0xD6, 0x56, 0x27, 0x82, 0xFD, + 0x2E, 0xB3, 0x42, 0x5D, 0x49, 0x1E, 0x68, 0x74, 0x20, 0x28, 0x4B, 0x76, 0xA1, 0xDE, 0xBF, 0xAB }, }, { - { 0x50, 0xF4, 0x78, 0x1E, 0xB1, 0xC1, 0x46, 0x70, 0xD9, 0xA5, 0x52, 0xC3, 0x49, 0x5F, 0xB9, 0xF6, - 0xAE, 0x86, 0x8A, 0xB1, 0xC9, 0xD9, 0x83, 0xE0, 0x82, 0x68, 0x65, 0xA1, 0x02, 0xEC, 0xA6, 0xD3 }, + { 0x89, 0xAF, 0x0E, 0x54, 0xC7, 0x62, 0x77, 0x86, 0x93, 0x52, 0x9D, 0x0A, 0x95, 0x0B, 0x78, 0x33, + 0xF5, 0xEA, 0xBA, 0xF3, 0x42, 0x79, 0x72, 0x60, 0x7F, 0xB2, 0xC7, 0x0C, 0x96, 0xA3, 0x21, 0x61 }, }, { - { 0x51, 0x19, 0xB5, 0x19, 0x01, 0x56, 0xDD, 0x6D, 0x6B, 0x34, 0x16, 0x60, 0xF8, 0xA3, 0xC6, 0x25, - 0x0A, 0xC5, 0x2D, 0x82, 0xBD, 0x26, 0xC3, 0x30, 0x7E, 0x28, 0xB4, 0x03, 0xD3, 0x84, 0x94, 0x9F }, + { 0x89, 0xDA, 0xC7, 0x89, 0x6B, 0x46, 0xF2, 0xFC, 0x8B, 0xEA, 0x62, 0x11, 0xFF, 0x98, 0xB6, 0x1F, + 0xAA, 0x15, 0x7B, 0xA8, 0xC4, 0xAD, 0x6F, 0xD1, 0x75, 0x92, 0x75, 0xCE, 0x39, 0x41, 0xC3, 0x28 }, }, { - { 0x51, 0x3E, 0x76, 0xB7, 0xBF, 0xB0, 0xF4, 0xEE, 0x3F, 0x09, 0x94, 0xC9, 0x56, 0xB9, 0xCD, 0x4F, - 0xFF, 0x03, 0xFA, 0x14, 0x38, 0x68, 0xCF, 0x3C, 0x59, 0x9B, 0x7C, 0x33, 0xCC, 0x41, 0xA2, 0xF4 }, + { 0x8A, 0x09, 0x85, 0xBF, 0x86, 0xE8, 0xC9, 0xB9, 0x17, 0xEC, 0x84, 0xDA, 0x2A, 0x56, 0x73, 0x1E, + 0x75, 0x2A, 0xA0, 0xDC, 0x52, 0x87, 0xC2, 0xBF, 0x39, 0x51, 0x0B, 0xB3, 0xF0, 0xF2, 0x0A, 0xD1 }, }, { - { 0x51, 0x45, 0x0F, 0x2B, 0x44, 0x5C, 0x6D, 0xED, 0x83, 0x9C, 0xD9, 0x97, 0x86, 0xD4, 0x03, 0x01, - 0x1C, 0x2D, 0xBE, 0xDC, 0x72, 0x96, 0xDB, 0xC8, 0x55, 0x44, 0xAC, 0x1B, 0x71, 0xDA, 0x4A, 0x95 }, + { 0x8A, 0xAF, 0x36, 0x3C, 0xC9, 0xD8, 0x44, 0x15, 0xA7, 0xEB, 0x0D, 0x72, 0xDA, 0x08, 0xB3, 0x58, + 0x80, 0x68, 0x55, 0x9C, 0xB0, 0xA9, 0xAE, 0x92, 0xB8, 0xF4, 0x60, 0x2E, 0xDA, 0x23, 0x82, 0xAA }, }, { - { 0x51, 0x6A, 0x2F, 0x33, 0x60, 0xC7, 0x6F, 0xC4, 0x6A, 0xB2, 0x88, 0x7F, 0x88, 0xE8, 0xD0, 0x8E, - 0xFB, 0xD8, 0x44, 0x5A, 0xA7, 0xBB, 0xD2, 0x29, 0xDF, 0xC7, 0x1A, 0x90, 0x4F, 0x55, 0xAE, 0xB4 }, + { 0x8A, 0xB2, 0x77, 0x62, 0xF4, 0xA2, 0xE3, 0x11, 0x22, 0x04, 0x96, 0x98, 0x39, 0x99, 0xC8, 0xC4, + 0x60, 0x96, 0x3D, 0xFC, 0x1B, 0x88, 0x51, 0x11, 0x1D, 0xA4, 0x1D, 0x3F, 0x3B, 0x0A, 0x6E, 0x94 }, }, { - { 0x51, 0xC5, 0x2A, 0x80, 0xBC, 0x2E, 0x24, 0xFB, 0x47, 0x1F, 0xE4, 0x5E, 0x78, 0xCF, 0x01, 0x84, - 0xE0, 0xC4, 0x67, 0x0E, 0x20, 0xE6, 0xCA, 0xDA, 0x20, 0xBD, 0xF9, 0x6E, 0x2D, 0x71, 0x20, 0xF7 }, + { 0x8A, 0xD1, 0xD5, 0x48, 0x95, 0x27, 0xB5, 0x28, 0xE5, 0xB5, 0xD6, 0xA5, 0x95, 0x78, 0x87, 0x08, + 0x88, 0x8A, 0x3F, 0xB1, 0x9F, 0x2C, 0x7C, 0x8B, 0x38, 0x07, 0x0E, 0x1F, 0x38, 0x98, 0x96, 0x8B }, }, { - { 0x52, 0x1F, 0x6C, 0x6A, 0x84, 0x36, 0x65, 0x79, 0xCA, 0x2D, 0xEA, 0xEB, 0x23, 0x15, 0xBF, 0x8E, - 0x53, 0x1C, 0x9F, 0xA4, 0x7B, 0x89, 0x9D, 0xA2, 0x72, 0x16, 0xA9, 0x98, 0x82, 0x86, 0xAF, 0xE5 }, + { 0x8A, 0xDB, 0x49, 0xD4, 0x15, 0x53, 0x56, 0x70, 0x5B, 0x64, 0x42, 0x6A, 0x99, 0x0F, 0x58, 0xB3, + 0xA0, 0x71, 0xEF, 0x78, 0x2E, 0x6C, 0x09, 0x53, 0x07, 0xD7, 0x74, 0x74, 0xD5, 0xB5, 0x7A, 0x62 }, }, { - { 0x52, 0x75, 0xC2, 0x38, 0x02, 0x7B, 0x22, 0xAA, 0x51, 0x9B, 0x36, 0xA8, 0x03, 0xAF, 0xF5, 0x6E, - 0xBB, 0x4E, 0x1A, 0x6C, 0x56, 0x9A, 0x81, 0xEA, 0xDE, 0xD5, 0x86, 0x35, 0xA7, 0x7B, 0x15, 0x80 }, + { 0x8B, 0x3A, 0x10, 0x35, 0xC3, 0xFD, 0xF3, 0x45, 0xFB, 0x70, 0x80, 0x44, 0x83, 0xA5, 0x04, 0x49, + 0xA3, 0xD7, 0x60, 0xC6, 0xBA, 0x48, 0xF5, 0xB8, 0x2D, 0x6B, 0xB2, 0x62, 0xED, 0x9D, 0xE3, 0x73 }, }, { - { 0x52, 0xE4, 0x38, 0x85, 0x10, 0x91, 0xB9, 0x8C, 0x01, 0xFE, 0x1A, 0x5E, 0xC5, 0x4F, 0xA9, 0x8A, - 0xA0, 0x64, 0xAB, 0xA6, 0xE1, 0xB3, 0x3D, 0xD9, 0x83, 0xC4, 0x15, 0x15, 0x28, 0x96, 0xF0, 0xB8 }, + { 0x8B, 0x3A, 0x75, 0xCB, 0xC3, 0x62, 0xD2, 0x35, 0x57, 0x0E, 0x5D, 0xE7, 0x04, 0x29, 0x38, 0x70, + 0x8A, 0x1B, 0x0F, 0xCE, 0xB4, 0x59, 0x86, 0x2A, 0x38, 0x67, 0xB7, 0x34, 0xCD, 0xCB, 0x97, 0x94 }, }, { - { 0x52, 0xFF, 0x8B, 0x6E, 0x98, 0xB0, 0x96, 0x19, 0x90, 0x03, 0xDE, 0x97, 0xBC, 0xCF, 0xD2, 0xA7, - 0xF1, 0xAC, 0x57, 0xA8, 0x31, 0x35, 0xB9, 0x55, 0xFF, 0x68, 0x63, 0x36, 0xA6, 0x91, 0xD5, 0xCA }, + { 0x8C, 0x3E, 0x7C, 0x1D, 0xCC, 0x7D, 0xD8, 0xE7, 0xD8, 0xBF, 0x7B, 0x5B, 0x3A, 0xE5, 0xE0, 0x27, + 0x2E, 0x81, 0x1A, 0xB9, 0xF3, 0xC3, 0xC5, 0x38, 0xE5, 0x74, 0x71, 0x77, 0xE6, 0x2D, 0x62, 0x92 }, }, { - { 0x53, 0x49, 0x98, 0x5A, 0x83, 0x22, 0xC0, 0xA9, 0x54, 0x1F, 0xB6, 0x81, 0x31, 0xC2, 0xA4, 0xF4, - 0x7D, 0x46, 0xC5, 0xBB, 0x3B, 0xAC, 0x23, 0x76, 0x6A, 0x26, 0x55, 0x17, 0x43, 0x71, 0x40, 0xB6 }, + { 0x8C, 0x7C, 0x65, 0x7B, 0xDA, 0x13, 0xCA, 0x62, 0xF2, 0x9A, 0x65, 0xC6, 0xD5, 0x19, 0x3A, 0x93, + 0xCF, 0x6C, 0x58, 0x77, 0x18, 0xAD, 0xCA, 0x67, 0x15, 0x8E, 0x97, 0xD3, 0x6A, 0x62, 0x3E, 0xCA }, }, { - { 0x53, 0x79, 0x64, 0x58, 0xDA, 0x97, 0xCE, 0x36, 0x78, 0xF2, 0xD1, 0xD9, 0xB2, 0xA5, 0xB2, 0xFB, - 0x30, 0x75, 0xEA, 0xFA, 0xF6, 0xFF, 0x04, 0x78, 0xB5, 0x72, 0xDD, 0xFD, 0x70, 0x99, 0xAE, 0xE2 }, + { 0x8C, 0xA6, 0x79, 0x62, 0xC4, 0xA8, 0x09, 0x13, 0x33, 0xF2, 0x4E, 0xFD, 0x60, 0xEE, 0x70, 0xCF, + 0xED, 0xDB, 0xD6, 0x41, 0x59, 0x04, 0x70, 0x9E, 0x78, 0x5C, 0x33, 0x1B, 0x1E, 0xF5, 0x8F, 0x8E }, }, { - { 0x53, 0x96, 0x8B, 0x36, 0x22, 0x80, 0xFE, 0xB7, 0x27, 0x51, 0xF6, 0xED, 0xB9, 0xB2, 0x7C, 0x5F, - 0x50, 0xDD, 0x4C, 0x0E, 0x43, 0x4A, 0x54, 0x09, 0x76, 0xA5, 0xBE, 0xE3, 0x40, 0x3C, 0x92, 0x7E }, + { 0x8E, 0x18, 0xFD, 0xBD, 0xB0, 0x08, 0x16, 0x00, 0x35, 0xFA, 0xF5, 0x01, 0x5B, 0xE7, 0xDA, 0xF4, + 0x63, 0xB5, 0xC4, 0x14, 0xEA, 0xBC, 0x8B, 0x89, 0xF3, 0xDB, 0xA2, 0x05, 0xAB, 0x09, 0xA6, 0x43 }, }, { - { 0x53, 0x96, 0xB9, 0x32, 0x9D, 0xE7, 0xB3, 0x55, 0x2E, 0x18, 0x0D, 0xDD, 0x33, 0x17, 0x63, 0x53, - 0xBA, 0xCD, 0x65, 0x66, 0x18, 0x2B, 0x2B, 0x23, 0x05, 0x71, 0x67, 0x0A, 0xCE, 0xB0, 0xC1, 0x91 }, + { 0x8F, 0x10, 0x10, 0x47, 0x93, 0xE8, 0x55, 0x42, 0xBC, 0x06, 0x04, 0xD6, 0xCF, 0x21, 0x5F, 0x78, + 0x80, 0xBD, 0x6A, 0x4D, 0xD0, 0xFD, 0xF1, 0xE7, 0xA5, 0xB9, 0xCA, 0x12, 0x46, 0xF5, 0xC4, 0x09 }, }, { - { 0x53, 0x9C, 0xA9, 0xE1, 0xF0, 0x6A, 0xF2, 0x10, 0x7F, 0x96, 0xBF, 0x4B, 0x7D, 0xD4, 0xCE, 0xCD, - 0x9E, 0xD1, 0x1A, 0x38, 0xD6, 0x70, 0x91, 0x69, 0x9C, 0x56, 0x26, 0xE2, 0x7A, 0x1F, 0x54, 0xA5 }, + { 0x8F, 0x71, 0x27, 0x76, 0x2E, 0xE7, 0x51, 0x69, 0xBD, 0xC3, 0x5B, 0x04, 0xA7, 0x28, 0xE9, 0xD3, + 0x1B, 0x7E, 0x4D, 0x37, 0x89, 0xAA, 0x2C, 0x46, 0xD8, 0xA3, 0x1B, 0x3D, 0xFA, 0x81, 0xA9, 0x7E }, }, { - { 0x53, 0xAF, 0xBD, 0xDB, 0xFA, 0xC7, 0x4E, 0xBC, 0xA1, 0xBE, 0xF4, 0xBA, 0xCD, 0xEB, 0x45, 0x29, - 0x7C, 0x43, 0xF0, 0xF7, 0x4E, 0x8D, 0x04, 0xBA, 0x81, 0x79, 0xB4, 0xF3, 0x72, 0x41, 0xBE, 0x6C }, + { 0x8F, 0x94, 0x15, 0x92, 0x6F, 0x40, 0x49, 0xEA, 0x41, 0x8A, 0x30, 0x7C, 0x76, 0x36, 0xE4, 0x9B, + 0x14, 0x4F, 0xA5, 0x3E, 0x52, 0xE1, 0x04, 0x15, 0x5F, 0x58, 0x03, 0x5E, 0x45, 0x41, 0xCD, 0x6E }, }, { - { 0x53, 0xB6, 0xE2, 0xAA, 0xA6, 0x2D, 0x18, 0x5A, 0x42, 0x3E, 0x92, 0x9D, 0x8C, 0x75, 0xD7, 0xE3, - 0x2B, 0x37, 0x2F, 0x5D, 0xF0, 0x06, 0x0A, 0x73, 0xBA, 0xFA, 0xC4, 0x9A, 0xA8, 0x51, 0x1E, 0x24 }, + { 0x90, 0xB3, 0xA1, 0x85, 0x36, 0x86, 0xAF, 0xEB, 0x15, 0x4A, 0xEF, 0x7E, 0x84, 0x0D, 0x38, 0x04, + 0x4E, 0x7D, 0x7F, 0x6D, 0xC4, 0xCE, 0x82, 0x8C, 0xE3, 0x97, 0x55, 0xAC, 0x88, 0xE4, 0x2E, 0x07 }, }, { - { 0x53, 0xEB, 0xD5, 0x29, 0x2D, 0x32, 0xCE, 0xA0, 0x08, 0x60, 0x96, 0x78, 0xC4, 0x3B, 0xDD, 0xAB, - 0x90, 0x28, 0xBA, 0x6C, 0x17, 0x68, 0x4C, 0x51, 0x22, 0x42, 0x62, 0x43, 0xCB, 0x61, 0x2A, 0x29 }, + { 0x90, 0xE2, 0x51, 0x86, 0x7F, 0x6B, 0x0C, 0x14, 0xBD, 0x9B, 0x51, 0x0C, 0xFD, 0xA8, 0x48, 0x49, + 0x72, 0xFD, 0xF0, 0xE0, 0x6D, 0xC1, 0x1F, 0x5D, 0x1D, 0x59, 0x0B, 0xE3, 0xFC, 0x38, 0xDF, 0xF0 }, }, { - { 0x53, 0xED, 0x84, 0xE5, 0xC9, 0xAD, 0x2B, 0xD1, 0xCB, 0x2C, 0xC8, 0x36, 0x52, 0xEA, 0x0C, 0xC3, - 0x71, 0xCD, 0x53, 0x4B, 0xD5, 0x97, 0xCE, 0x7E, 0x07, 0x37, 0xA0, 0xAB, 0x10, 0x65, 0x73, 0xAA }, + { 0x91, 0x90, 0xF8, 0x25, 0x51, 0x0C, 0x65, 0x98, 0xE1, 0x9D, 0x17, 0xDB, 0xBE, 0x6E, 0x7C, 0x82, + 0x31, 0x86, 0x9C, 0xA7, 0xF6, 0xE3, 0x07, 0xA2, 0xC2, 0xCC, 0x54, 0x77, 0x8D, 0x4A, 0x89, 0xB3 }, }, { - { 0x54, 0x1B, 0xED, 0x16, 0x7D, 0x7D, 0xE0, 0x5F, 0x80, 0x63, 0x73, 0xA3, 0x86, 0x8F, 0x73, 0x4C, - 0xBD, 0xF7, 0x09, 0x53, 0x6B, 0x3B, 0xCF, 0x20, 0x64, 0xB2, 0x59, 0xFE, 0x2A, 0x83, 0x76, 0xAA }, + { 0x91, 0xC7, 0x6E, 0xF8, 0xC7, 0x05, 0x3B, 0x2A, 0x27, 0x0B, 0x97, 0x19, 0x78, 0x3C, 0x85, 0x10, + 0xA2, 0x89, 0x0A, 0x48, 0x40, 0x18, 0x63, 0x72, 0x6E, 0x23, 0x3A, 0x82, 0xBF, 0x9A, 0x0B, 0xCF }, }, { - { 0x54, 0x41, 0xFB, 0xB0, 0x5D, 0x6D, 0x4A, 0xED, 0xE0, 0x3B, 0x48, 0x2F, 0x51, 0x95, 0x1C, 0x7E, - 0xF0, 0x73, 0x45, 0x53, 0xCE, 0xC7, 0x80, 0xFB, 0xDC, 0xFA, 0x30, 0x0C, 0xC1, 0x79, 0x0D, 0x66 }, + { 0x92, 0x3F, 0x0F, 0x8C, 0x40, 0x5A, 0x02, 0xE6, 0x82, 0xC4, 0xB4, 0x66, 0x5A, 0x7E, 0xE7, 0x16, + 0xAA, 0x57, 0xE0, 0xA5, 0x86, 0xC2, 0x4A, 0x16, 0x5A, 0xAD, 0x7E, 0x5B, 0xDA, 0x22, 0x78, 0x24 }, }, { - { 0x54, 0xA5, 0x1F, 0x64, 0xD6, 0x28, 0x61, 0x49, 0xF2, 0x3A, 0x43, 0xCC, 0x73, 0x67, 0x00, 0x0E, - 0xF0, 0x16, 0x03, 0x89, 0x9C, 0xBC, 0x94, 0xA1, 0xA4, 0xE3, 0xBE, 0xEC, 0xFE, 0xE8, 0x40, 0x66 }, + { 0x92, 0x71, 0x44, 0x12, 0x1C, 0x23, 0x63, 0x57, 0x07, 0xE9, 0x40, 0x7F, 0x7F, 0xFF, 0x6A, 0x64, + 0x63, 0x5D, 0x7C, 0xE9, 0x06, 0x66, 0xD4, 0x29, 0x94, 0x09, 0x7A, 0xF4, 0x0C, 0x31, 0x36, 0xFB }, }, { - { 0x55, 0x21, 0xF9, 0x63, 0x57, 0x81, 0x58, 0xB8, 0xD0, 0xE7, 0xC4, 0x91, 0xCD, 0xB8, 0x5C, 0x3D, - 0xE9, 0xD5, 0x2E, 0xA5, 0x1F, 0xFC, 0xB0, 0x93, 0xD3, 0x12, 0x28, 0x11, 0x13, 0x14, 0x97, 0xEB }, - }, - { - { 0x55, 0x54, 0xEC, 0x61, 0xF2, 0x57, 0x6E, 0x34, 0xE7, 0x21, 0x56, 0xA6, 0xF6, 0xFD, 0x5E, 0xE8, - 0xF4, 0x26, 0x2A, 0xB5, 0x3F, 0x7B, 0xC9, 0xF1, 0x8B, 0xB6, 0xD7, 0xEB, 0x3E, 0x16, 0x28, 0xDE }, - }, - { - { 0x55, 0xB2, 0x84, 0x5F, 0x48, 0x44, 0xA7, 0x72, 0x46, 0x36, 0x41, 0x78, 0xA1, 0x71, 0xC2, 0x26, - 0xFC, 0xFD, 0x75, 0xC7, 0x63, 0xBA, 0xD0, 0x87, 0xF6, 0x02, 0xE7, 0xB4, 0xAC, 0xD9, 0xEC, 0xB3 }, - }, - { - { 0x55, 0xD0, 0xEB, 0xE3, 0x2C, 0xBA, 0x09, 0xF6, 0x58, 0x4D, 0x9E, 0x7B, 0x57, 0x92, 0xA4, 0x03, - 0xC2, 0x1D, 0x39, 0xD6, 0xE1, 0xF5, 0xE8, 0xED, 0x37, 0xB9, 0x3F, 0xA6, 0x1D, 0x88, 0x35, 0x16 }, - }, - { - { 0x56, 0x65, 0xC2, 0xE5, 0x64, 0x33, 0x29, 0x85, 0xB8, 0xD2, 0xC4, 0xFB, 0x61, 0x14, 0x57, 0xD8, - 0xD5, 0x65, 0x9A, 0xE0, 0x05, 0x87, 0x4C, 0x6F, 0x30, 0x34, 0xD2, 0x9F, 0x2A, 0x9A, 0x78, 0x32 }, - }, - { - { 0x56, 0x81, 0x4B, 0xB4, 0x69, 0xC3, 0x87, 0x31, 0xFC, 0x0D, 0x84, 0xB8, 0x6F, 0x87, 0xB3, 0x5B, - 0xAF, 0xF3, 0x2A, 0x0F, 0x13, 0xC2, 0x61, 0x64, 0x02, 0x70, 0x36, 0xC9, 0x4E, 0x8D, 0x64, 0x3F }, - }, - { - { 0x56, 0x8F, 0x37, 0xB3, 0xAB, 0xBD, 0xA3, 0xE8, 0x03, 0x12, 0xB1, 0xB1, 0x43, 0x27, 0x2C, 0x44, - 0xE1, 0xFB, 0x78, 0xEE, 0x3F, 0x30, 0x0F, 0x5B, 0x54, 0xF5, 0xB2, 0x9A, 0x7A, 0xD8, 0xD7, 0x43 }, - }, - { - { 0x56, 0x96, 0x18, 0xD5, 0x4E, 0x3C, 0x61, 0x1B, 0x79, 0x7E, 0xEB, 0x01, 0xDF, 0x9C, 0x1C, 0x5C, - 0x14, 0x6D, 0x87, 0xB3, 0xB1, 0x29, 0xBA, 0x42, 0x29, 0x88, 0x88, 0x82, 0x10, 0x04, 0xFD, 0xCB }, - }, - { - { 0x57, 0xB8, 0xBF, 0xB7, 0x22, 0x41, 0x15, 0xB7, 0xF2, 0xAE, 0x12, 0x89, 0x74, 0xB6, 0xD0, 0x74, - 0x1B, 0xB2, 0x8F, 0x48, 0x0B, 0xE8, 0x96, 0xEE, 0x09, 0x7C, 0xEE, 0x68, 0x6E, 0xA3, 0xAA, 0xAB }, - }, - { - { 0x57, 0xC1, 0x4C, 0x78, 0x2C, 0xF5, 0x8C, 0x3B, 0x72, 0x28, 0x0F, 0xEF, 0x7D, 0xA9, 0xE2, 0xD9, - 0x71, 0xE5, 0x25, 0x03, 0xC4, 0x15, 0x99, 0x59, 0x68, 0xB6, 0x04, 0x37, 0x2A, 0x18, 0x96, 0xBF }, - }, - { - { 0x58, 0x0C, 0x45, 0xD6, 0xE2, 0x55, 0x8E, 0x7C, 0x7D, 0xA8, 0x19, 0xA5, 0x99, 0xD5, 0xB1, 0x6F, - 0x0E, 0x18, 0x79, 0xF0, 0xCB, 0x58, 0x31, 0xDF, 0xDB, 0x9A, 0xB2, 0xFF, 0x6E, 0x8E, 0x4B, 0xA0 }, - }, - { - { 0x58, 0x1A, 0xDE, 0x64, 0x84, 0x95, 0xB4, 0xB1, 0x62, 0x9C, 0x3C, 0x7C, 0x78, 0xEF, 0xBE, 0xF2, - 0x75, 0x06, 0x56, 0x65, 0xB2, 0x41, 0x1C, 0x0E, 0x5F, 0xCF, 0xBC, 0x7E, 0xB4, 0xBE, 0x34, 0x0B }, - }, - { - { 0x58, 0x36, 0x98, 0x46, 0xC0, 0x25, 0x15, 0x0E, 0xCF, 0xB2, 0x2C, 0xCE, 0xB8, 0xE4, 0xDE, 0x9A, - 0xC3, 0xD0, 0x2D, 0x9E, 0x23, 0x6C, 0x02, 0xEF, 0xB5, 0x5F, 0x63, 0xEB, 0xAF, 0xEA, 0xF7, 0x5B }, - }, - { - { 0x58, 0x98, 0xBE, 0xD1, 0x46, 0x1E, 0x18, 0x9D, 0xC5, 0x97, 0x73, 0x75, 0x9C, 0xB6, 0x9B, 0xE3, - 0x36, 0x86, 0xB2, 0xD8, 0x0E, 0x73, 0x21, 0x9F, 0x07, 0x96, 0xEB, 0x8F, 0x0F, 0x79, 0x59, 0x09 }, - }, - { - { 0x59, 0x3F, 0x23, 0x88, 0x0B, 0x59, 0xED, 0x5A, 0xA4, 0x8A, 0x2D, 0xB5, 0x01, 0x44, 0xFC, 0x8E, - 0xAB, 0xB7, 0xB5, 0x35, 0xA6, 0x2A, 0x61, 0x7B, 0x28, 0x82, 0xB8, 0x5D, 0xCF, 0x50, 0xB8, 0x02 }, - }, - { - { 0x59, 0x43, 0x09, 0x51, 0x02, 0x8B, 0x87, 0x78, 0x01, 0x67, 0xC9, 0x56, 0x47, 0x9A, 0x81, 0x5F, - 0x91, 0xBC, 0x6C, 0x00, 0xC2, 0xE5, 0x0C, 0x35, 0xF0, 0x5F, 0xCF, 0xF5, 0x27, 0x68, 0xC7, 0x37 }, - }, - { - { 0x59, 0xC9, 0xE8, 0xDF, 0x03, 0x0B, 0x1C, 0xD5, 0x89, 0xA8, 0xB3, 0x4F, 0xE7, 0x42, 0x51, 0xEA, - 0xD5, 0xA5, 0xFB, 0xE9, 0xE6, 0x13, 0x67, 0xCA, 0x76, 0xAF, 0xD9, 0xDD, 0xD9, 0xC6, 0xF1, 0x6F }, - }, - { - { 0x59, 0xE8, 0x20, 0x27, 0xA5, 0xF6, 0x28, 0x1A, 0xBC, 0xFB, 0x41, 0xA9, 0x9F, 0xFC, 0xB5, 0xBA, - 0xB1, 0x3A, 0xA1, 0x32, 0x57, 0xFC, 0x12, 0xE1, 0xDD, 0x4C, 0x38, 0x08, 0xB9, 0x64, 0x27, 0x39 }, - }, - { - { 0x59, 0xE9, 0xFA, 0x2F, 0xF0, 0x76, 0x89, 0x33, 0x28, 0x33, 0xC6, 0x40, 0xF5, 0x05, 0xFA, 0x24, - 0x09, 0xEB, 0x88, 0x93, 0x32, 0x57, 0xC1, 0x93, 0xB0, 0x07, 0xD3, 0xA2, 0x89, 0x6A, 0x98, 0x50 }, - }, - { - { 0x59, 0xEE, 0x2C, 0xB6, 0x0C, 0x80, 0xE7, 0x37, 0x33, 0x72, 0x1C, 0xA6, 0xCD, 0x0C, 0x88, 0x63, - 0xDD, 0x9A, 0xF6, 0xB8, 0x2F, 0x35, 0x0C, 0xE9, 0x88, 0x72, 0xF2, 0x2E, 0x23, 0x89, 0x5A, 0x55 }, - }, - { - { 0x59, 0xEE, 0x9B, 0x36, 0x80, 0xAE, 0x20, 0x56, 0x83, 0x9C, 0x0B, 0xF6, 0x9E, 0xE6, 0x63, 0x26, - 0x57, 0x16, 0xA8, 0xE2, 0x4C, 0xC6, 0x49, 0x95, 0xFB, 0xA6, 0xCB, 0x6F, 0x0C, 0x12, 0x39, 0xDC }, - }, - { - { 0x5A, 0x28, 0x15, 0x08, 0x72, 0x33, 0x83, 0xE1, 0x3D, 0x56, 0x37, 0x61, 0x41, 0x19, 0x23, 0xFB, - 0x20, 0xD5, 0xC2, 0x83, 0x56, 0x64, 0xAB, 0xFC, 0x9C, 0x02, 0x4E, 0x54, 0xE9, 0x5B, 0xCA, 0x87 }, - }, - { - { 0x5A, 0x2A, 0x8B, 0xCB, 0xEF, 0x60, 0xF7, 0x79, 0x13, 0xB1, 0xB6, 0xAE, 0xDF, 0xD3, 0xAE, 0x8F, - 0xE5, 0xFC, 0x42, 0x2F, 0xDB, 0x3B, 0xA7, 0x9E, 0xF7, 0x17, 0xA9, 0xBE, 0x19, 0xFA, 0x89, 0xDC }, - }, - { - { 0x5A, 0x6B, 0xB1, 0x1F, 0x2E, 0xFD, 0x5E, 0x60, 0x25, 0xC6, 0x06, 0xF5, 0x58, 0x81, 0x30, 0xE1, - 0x7C, 0x88, 0xED, 0xAE, 0xDC, 0x2A, 0xA9, 0x41, 0xE2, 0x54, 0x3A, 0xDD, 0x77, 0x25, 0x31, 0xBE }, - }, - { - { 0x5A, 0x84, 0xAF, 0xE6, 0x74, 0x05, 0xAB, 0xE8, 0x4A, 0x0C, 0xD4, 0x2C, 0x2B, 0xA2, 0xE4, 0xC8, - 0x8F, 0x35, 0xE0, 0xA5, 0x95, 0xE5, 0x69, 0xA3, 0xE1, 0x86, 0x69, 0x44, 0x40, 0x5B, 0xE7, 0x36 }, - }, - { - { 0x5A, 0x87, 0x99, 0x5F, 0x97, 0xBB, 0x5A, 0x55, 0x61, 0x7F, 0x5F, 0x8B, 0xE9, 0x53, 0xB9, 0x5E, - 0x3C, 0x45, 0xE2, 0x51, 0x5E, 0x7D, 0x38, 0xB6, 0xA4, 0x33, 0xD8, 0xC4, 0xA4, 0xAA, 0x4E, 0xF4 }, - }, - { - { 0x5A, 0x8C, 0x3A, 0x7D, 0x66, 0xEA, 0x0F, 0x6E, 0x88, 0xBE, 0x15, 0xD3, 0x28, 0x62, 0xFB, 0x39, - 0xF2, 0x5F, 0xEA, 0xAC, 0x12, 0xC2, 0xCD, 0x6A, 0x68, 0xE8, 0x9C, 0x4C, 0x30, 0xEE, 0x73, 0x63 }, - }, - { - { 0x5A, 0x8E, 0x86, 0x21, 0x2C, 0x06, 0x33, 0x94, 0x94, 0xF8, 0x5B, 0x5F, 0x85, 0x11, 0xDF, 0x00, - 0x00, 0x23, 0x94, 0x07, 0x8F, 0xFC, 0x77, 0x4D, 0x43, 0x6F, 0x0D, 0x63, 0x86, 0xD7, 0xA6, 0xF7 }, - }, - { - { 0x5A, 0xC0, 0x98, 0x2D, 0xA0, 0xC8, 0x3D, 0x0B, 0xA9, 0x38, 0x1A, 0x5C, 0xD8, 0x7B, 0x80, 0xD1, - 0x10, 0xF2, 0x6E, 0xE8, 0x39, 0x27, 0x1B, 0xC2, 0x70, 0x60, 0x8F, 0xD1, 0x43, 0x7F, 0x55, 0xB0 }, - }, - { - { 0x5A, 0xD0, 0x17, 0xDD, 0x25, 0x23, 0xF2, 0x51, 0xAF, 0x5E, 0xDC, 0xE4, 0x2A, 0x8F, 0x18, 0x5E, - 0x6D, 0x0E, 0x7D, 0xC8, 0x00, 0xF4, 0xA5, 0x9A, 0xF7, 0x7C, 0x12, 0x47, 0x37, 0x69, 0xD9, 0x37 }, - }, - { - { 0x5A, 0xE2, 0xFA, 0x90, 0x43, 0x53, 0x46, 0x3B, 0xAE, 0xE6, 0x96, 0x53, 0xB2, 0x19, 0xC1, 0x5B, - 0xC9, 0xCD, 0x80, 0xE7, 0x01, 0x40, 0x08, 0xE7, 0x26, 0x31, 0x09, 0x79, 0x52, 0x54, 0x8C, 0x60 }, - }, - { - { 0x5A, 0xED, 0x28, 0x2D, 0x88, 0x21, 0xAA, 0xDF, 0x6E, 0x01, 0x0D, 0x94, 0x66, 0x66, 0x09, 0x25, - 0x7C, 0xA0, 0xAF, 0x4C, 0xE5, 0xBD, 0x7F, 0xC9, 0xCD, 0x8C, 0x9F, 0x32, 0x5F, 0xEB, 0xAE, 0x6D }, - }, - { - { 0x5B, 0x1F, 0x32, 0x78, 0x8D, 0xD9, 0xD7, 0xE9, 0x06, 0x80, 0x7D, 0x03, 0x01, 0x45, 0xC8, 0xAD, - 0x20, 0x11, 0x03, 0x0C, 0xDB, 0xF0, 0xA6, 0x03, 0x08, 0x14, 0x93, 0x7E, 0x54, 0xD1, 0x54, 0x68 }, - }, - { - { 0x5B, 0x1F, 0x32, 0xF6, 0x88, 0x12, 0xD9, 0xC3, 0xD3, 0x34, 0x99, 0x39, 0x48, 0x4E, 0x3E, 0xDF, - 0xC6, 0xC2, 0x33, 0xB6, 0x5F, 0x9D, 0xDB, 0x3D, 0x4B, 0x30, 0xFC, 0x4B, 0xE2, 0x0E, 0x0D, 0x84 }, - }, - { - { 0x5B, 0x29, 0x3D, 0x30, 0x9F, 0x64, 0x24, 0xBC, 0x26, 0x4F, 0x4B, 0xB0, 0x18, 0xAE, 0xF5, 0x0E, - 0x63, 0xE3, 0x37, 0xD1, 0x4D, 0xF0, 0x64, 0xC5, 0x7A, 0x23, 0x52, 0x83, 0x42, 0x16, 0x1C, 0x68 }, - }, - { - { 0x5C, 0x06, 0x2F, 0x0D, 0x7E, 0x21, 0x91, 0xDF, 0xC1, 0x60, 0xE4, 0xC0, 0x59, 0xAE, 0xD4, 0xD1, - 0x83, 0xBD, 0x2D, 0x0F, 0x40, 0x98, 0x3D, 0x03, 0xB4, 0xE8, 0xDA, 0xA1, 0x1F, 0xF5, 0xE8, 0x95 }, - }, - { - { 0x5C, 0x35, 0x91, 0x21, 0x9B, 0x7A, 0x55, 0x9A, 0x0D, 0x78, 0xAF, 0xE0, 0x6D, 0xFC, 0x80, 0x85, - 0x78, 0x23, 0xD2, 0x49, 0x56, 0x30, 0x08, 0x22, 0xBB, 0x1D, 0x6E, 0x60, 0x01, 0x98, 0x11, 0xE8 }, - }, - { - { 0x5C, 0x7F, 0xF0, 0x55, 0xC2, 0xFD, 0x03, 0x3F, 0x34, 0xC4, 0xC4, 0xF7, 0xC4, 0xFB, 0x7D, 0xDA, - 0xAA, 0xFB, 0x43, 0x56, 0xC5, 0x60, 0xC9, 0x9E, 0xDF, 0xF0, 0x74, 0xDA, 0x04, 0xAF, 0x65, 0x7C }, - }, - { - { 0x5C, 0xD2, 0x44, 0x6A, 0x8E, 0x4A, 0x0F, 0xA7, 0xE3, 0xCD, 0xF8, 0x00, 0x5D, 0xED, 0xCE, 0xBA, - 0xE9, 0xE6, 0x81, 0x9A, 0x8A, 0x69, 0x87, 0x31, 0x55, 0x5B, 0x7D, 0xC9, 0xD0, 0xA2, 0x3F, 0xC0 }, - }, - { - { 0x5C, 0xEB, 0xEB, 0xD8, 0x34, 0x01, 0xB7, 0x0B, 0xAC, 0xB5, 0x4F, 0x66, 0xA9, 0xB7, 0x78, 0x55, - 0x69, 0x6E, 0xCE, 0x16, 0x7F, 0xE6, 0xC6, 0x0A, 0x05, 0x16, 0x8B, 0xE4, 0x39, 0x19, 0xC8, 0x0F }, - }, - { - { 0x5D, 0x01, 0x5E, 0x1F, 0xF4, 0x40, 0xD8, 0x3E, 0x1E, 0x1C, 0xE0, 0x99, 0x9C, 0x42, 0x6C, 0xED, - 0xD8, 0x75, 0xEE, 0x22, 0x6F, 0x79, 0xA6, 0xD6, 0xB8, 0xFB, 0xBF, 0x14, 0x6A, 0x43, 0xF4, 0x2D }, - }, - { - { 0x5D, 0x69, 0x52, 0x4D, 0xE6, 0x3A, 0x8B, 0xE0, 0x1A, 0x82, 0x31, 0xB4, 0x33, 0x3E, 0xC8, 0x97, - 0x74, 0xC5, 0x8D, 0x82, 0xB4, 0xAD, 0xBD, 0x20, 0x91, 0x42, 0x84, 0x06, 0xA0, 0x6B, 0x16, 0xB0 }, - }, - { - { 0x5E, 0x23, 0xDB, 0xD4, 0xD0, 0xC9, 0xBF, 0xB1, 0x5F, 0x61, 0x6A, 0x95, 0x17, 0xA1, 0x30, 0xD8, - 0x66, 0xA8, 0xCB, 0x0B, 0x18, 0x96, 0x3D, 0x54, 0xE7, 0xED, 0xAE, 0xE2, 0x61, 0xCB, 0x1C, 0x19 }, - }, - { - { 0x5E, 0xAE, 0xD7, 0x13, 0x5C, 0x21, 0x69, 0x76, 0xAD, 0x4E, 0xDC, 0x4D, 0xBB, 0x3F, 0x1F, 0xA1, - 0xF7, 0xC2, 0x85, 0x54, 0xF1, 0x4F, 0x1A, 0xD1, 0xC6, 0x2A, 0xBA, 0xBB, 0x00, 0xCF, 0x7B, 0x66 }, - }, - { - { 0x5F, 0x1E, 0xAE, 0xF6, 0xB7, 0xE3, 0x2F, 0x26, 0xC8, 0x7A, 0xD9, 0x4A, 0x10, 0xF9, 0x0B, 0xF2, - 0xB3, 0x4F, 0x0E, 0x21, 0x13, 0x71, 0x37, 0x0C, 0xB3, 0xDA, 0xCD, 0xE1, 0x00, 0x63, 0x9D, 0xBE }, - }, - { - { 0x5F, 0x30, 0xF0, 0x3A, 0x89, 0xBF, 0x8F, 0x2B, 0x9B, 0x82, 0xC9, 0x35, 0xF8, 0x8E, 0xC6, 0x87, - 0xEC, 0x07, 0xBC, 0xC8, 0x0E, 0xC8, 0x24, 0xE5, 0x74, 0x51, 0x72, 0xB4, 0x50, 0x29, 0x90, 0xBE }, - }, - { - { 0x5F, 0x5C, 0xCA, 0x19, 0x1E, 0xC9, 0x2F, 0x4D, 0xAD, 0x96, 0x6D, 0xAA, 0xFD, 0x6D, 0xE7, 0x56, - 0x34, 0x44, 0x18, 0x60, 0x4D, 0x8A, 0xD5, 0x0A, 0x78, 0x14, 0xF4, 0x39, 0xF4, 0xF2, 0x0A, 0xF1 }, - }, - { - { 0x5F, 0x85, 0xDE, 0xA9, 0xBB, 0x0D, 0x94, 0x81, 0xC2, 0x47, 0x23, 0x2E, 0xF2, 0x5C, 0x77, 0xE8, - 0x4E, 0x68, 0x95, 0x60, 0x0D, 0x0B, 0xDA, 0xF8, 0xE7, 0x0E, 0x82, 0x8A, 0xDC, 0x6F, 0xD4, 0xFF }, - }, - { - { 0x5F, 0x8B, 0x88, 0x8E, 0xE9, 0x6C, 0x0C, 0x0F, 0x5A, 0x91, 0x72, 0x90, 0xAC, 0xA6, 0x5A, 0xFD, - 0x6E, 0xBD, 0xAE, 0x05, 0xA0, 0x2A, 0xAF, 0x04, 0x29, 0xE9, 0x72, 0xEC, 0x01, 0x90, 0xEC, 0xFC }, - }, - { - { 0x60, 0x1A, 0xF7, 0x2F, 0xB0, 0x6F, 0xE6, 0x68, 0x79, 0x92, 0xC5, 0x8F, 0xAC, 0x32, 0xE3, 0x0C, - 0x01, 0x9E, 0xAF, 0x41, 0xE0, 0xB3, 0x85, 0x7E, 0xA9, 0x00, 0xA1, 0x61, 0x08, 0xEB, 0x34, 0xDE }, - }, - { - { 0x60, 0x28, 0x6B, 0x5F, 0xB1, 0xA4, 0x7F, 0x8C, 0x79, 0x3E, 0xBE, 0x0A, 0x4F, 0x9E, 0xA0, 0xEF, - 0xB6, 0xFF, 0xF7, 0xD0, 0x1C, 0x79, 0x10, 0xEF, 0xF7, 0x4E, 0xD3, 0xB2, 0x88, 0xF4, 0xE6, 0x27 }, - }, - { - { 0x60, 0x38, 0x42, 0xEB, 0x89, 0xDA, 0xAD, 0xF7, 0x17, 0xF7, 0xE0, 0x91, 0x22, 0xA0, 0x6A, 0xC8, - 0x19, 0x04, 0x51, 0x2C, 0x2D, 0xA1, 0xCB, 0xC2, 0x90, 0xCC, 0x52, 0xD4, 0xDC, 0x0C, 0x7F, 0xEC }, - }, - { - { 0x60, 0x47, 0xA1, 0x61, 0x21, 0xDA, 0x00, 0xB4, 0x31, 0x60, 0x6D, 0x15, 0xE8, 0x40, 0x5F, 0x0D, - 0x19, 0xCF, 0xFE, 0x7C, 0xDE, 0x91, 0x69, 0x8C, 0x79, 0x4B, 0x3A, 0x35, 0x1D, 0xB1, 0x4D, 0x6B }, - }, - { - { 0x60, 0x4C, 0xE5, 0x2B, 0x8F, 0xC5, 0x72, 0xF0, 0xEC, 0x55, 0xF1, 0xC6, 0x37, 0x08, 0xDF, 0xD9, - 0x7E, 0xF1, 0xC7, 0x99, 0xD4, 0x8C, 0x27, 0x6B, 0x37, 0x34, 0x75, 0xE3, 0xA4, 0x61, 0xF3, 0x12 }, - }, - { - { 0x60, 0x69, 0xE0, 0x4E, 0xF3, 0x7E, 0xE3, 0x29, 0xCF, 0x15, 0xE9, 0xFD, 0x64, 0x1F, 0x18, 0x24, - 0xB8, 0x4B, 0x34, 0x4B, 0x63, 0x80, 0x30, 0x05, 0x81, 0x66, 0x2B, 0x2D, 0x44, 0x31, 0x3A, 0x95 }, - }, - { - { 0x60, 0xA3, 0xFB, 0x74, 0x7C, 0xF6, 0x5B, 0x04, 0xE9, 0xBE, 0x15, 0xDA, 0x26, 0xA9, 0xDD, 0x99, - 0x59, 0x71, 0xA9, 0x1A, 0x6F, 0x02, 0xE0, 0x14, 0xA9, 0xD7, 0x4D, 0x1F, 0x69, 0x45, 0xE1, 0x2E }, - }, - { - { 0x60, 0xCA, 0x81, 0xE3, 0x5B, 0x9A, 0x6F, 0x07, 0xE1, 0x3C, 0x02, 0xAE, 0x41, 0x15, 0xB0, 0x00, - 0x54, 0x30, 0xCF, 0x46, 0x0E, 0xFC, 0x7D, 0xBA, 0xF1, 0x5F, 0x51, 0xF7, 0xA9, 0x4A, 0xD1, 0x6A }, - }, - { - { 0x60, 0xDF, 0xF2, 0xAB, 0xA6, 0x5C, 0x74, 0xB5, 0x07, 0x49, 0x16, 0x32, 0xAD, 0x81, 0xC0, 0x9A, - 0x54, 0x71, 0xAE, 0xE8, 0x7C, 0xA1, 0x58, 0x03, 0x5D, 0x66, 0x79, 0x47, 0x83, 0x5E, 0xA8, 0xBF }, - }, - { - { 0x61, 0x65, 0xFD, 0x7A, 0x3D, 0xCB, 0x29, 0xAD, 0x23, 0xCC, 0x44, 0x64, 0x4F, 0xC2, 0x23, 0x25, - 0x94, 0x5D, 0xDF, 0xED, 0x0C, 0x18, 0xB3, 0x5B, 0x17, 0x43, 0xAD, 0x96, 0x28, 0x43, 0x69, 0xBE }, - }, - { - { 0x61, 0x91, 0x5B, 0xC8, 0xDF, 0x67, 0x8C, 0x52, 0xA2, 0x3C, 0x2D, 0x53, 0xC6, 0x47, 0x31, 0x4E, - 0x63, 0x6E, 0xEF, 0xC5, 0x40, 0x81, 0xA7, 0x0D, 0x3A, 0xC1, 0x45, 0x28, 0x66, 0x1D, 0x62, 0xFF }, - }, - { - { 0x61, 0xA7, 0x62, 0xEF, 0x47, 0xBC, 0xA4, 0xEE, 0x77, 0xA5, 0xC8, 0xAF, 0x03, 0x98, 0x9A, 0x9D, - 0xEA, 0xCA, 0x4D, 0x82, 0x8A, 0x53, 0xD9, 0x23, 0xE7, 0x0B, 0xFB, 0xC7, 0x25, 0x4A, 0xC7, 0x70 }, - }, - { - { 0x61, 0xC8, 0xF2, 0xE2, 0x97, 0xD0, 0x51, 0x91, 0x32, 0x07, 0xEF, 0x02, 0x93, 0x63, 0xB8, 0xE7, - 0x33, 0x7A, 0x39, 0x6E, 0x09, 0x9C, 0xA9, 0xDC, 0xF8, 0x07, 0x33, 0x97, 0x32, 0x66, 0x4B, 0x74 }, - }, - { - { 0x62, 0x2E, 0xC3, 0xBE, 0x7C, 0xF5, 0xE4, 0xE6, 0x3F, 0x74, 0x18, 0x69, 0x28, 0x74, 0x40, 0x05, - 0xCB, 0xB7, 0x8D, 0xF3, 0x06, 0xB8, 0x67, 0xC3, 0xFC, 0xAD, 0x5E, 0x2B, 0xA7, 0x53, 0x96, 0x83 }, - }, - { - { 0x62, 0x61, 0x3D, 0xA8, 0x69, 0xE5, 0xA2, 0x36, 0xC1, 0x29, 0x21, 0x73, 0x87, 0x25, 0xE9, 0x7C, - 0x68, 0x05, 0x8D, 0x04, 0x0A, 0x07, 0xE9, 0x65, 0x4B, 0x2D, 0xF5, 0xE2, 0xD8, 0x7D, 0x05, 0x1F }, - }, - { - { 0x62, 0x6F, 0x7E, 0xB4, 0xFD, 0x9B, 0x71, 0xFF, 0xAA, 0x0C, 0x8E, 0xC9, 0x65, 0x54, 0x64, 0xE6, - 0x5E, 0x7F, 0x96, 0xCF, 0xA3, 0x82, 0x73, 0x97, 0x41, 0x35, 0x66, 0xAA, 0x2C, 0xC1, 0xE5, 0x72 }, - }, - { - { 0x63, 0x35, 0x8C, 0x6D, 0xEB, 0xDF, 0x48, 0x2B, 0xB2, 0xD3, 0x21, 0x13, 0xD3, 0xF0, 0xB1, 0x73, - 0x77, 0xE2, 0xF7, 0xC9, 0x25, 0xB9, 0xFE, 0xB3, 0x47, 0x8B, 0xD9, 0x94, 0x56, 0x31, 0x3E, 0x78 }, - }, - { - { 0x63, 0x64, 0x15, 0x61, 0x77, 0xDC, 0xDF, 0x60, 0x4D, 0xF9, 0x1E, 0x31, 0x32, 0x2E, 0x57, 0x74, - 0x69, 0x1E, 0x0C, 0x41, 0xFA, 0x0D, 0x2F, 0x25, 0x7A, 0xD7, 0xF9, 0xF0, 0x25, 0x98, 0x14, 0x45 }, - }, - { - { 0x63, 0x65, 0xEB, 0x4E, 0x37, 0xEA, 0x23, 0x8B, 0xBC, 0x40, 0xA7, 0x65, 0x1E, 0xDD, 0x9A, 0x1C, - 0x65, 0xFC, 0x54, 0xE3, 0xB8, 0x8F, 0xA7, 0xA0, 0x6D, 0x92, 0xC6, 0x13, 0xAE, 0xDE, 0xD6, 0x5D }, - }, - { - { 0x63, 0x6A, 0x25, 0xBD, 0xDB, 0xB6, 0x5E, 0x7C, 0xC0, 0xE6, 0x1F, 0x91, 0xCA, 0xFE, 0xB1, 0xFE, - 0x5D, 0xD2, 0x67, 0xAC, 0x67, 0x32, 0x25, 0xCC, 0x81, 0x8E, 0xA0, 0x2B, 0x9C, 0xC9, 0x4B, 0xE2 }, - }, - { - { 0x63, 0x80, 0x65, 0xEC, 0x95, 0xF1, 0xEA, 0x81, 0xD9, 0x5B, 0xA4, 0xDB, 0x9E, 0xA9, 0xA2, 0xEF, - 0xE2, 0xD6, 0xCD, 0x78, 0x75, 0x88, 0x67, 0x04, 0x5C, 0x06, 0xB6, 0x48, 0xA5, 0xDA, 0x89, 0xB2 }, - }, - { - { 0x63, 0xEA, 0x63, 0x4F, 0x3C, 0x84, 0x62, 0x3C, 0xF7, 0xB0, 0x61, 0x29, 0xE2, 0x7A, 0xCD, 0xF2, - 0x13, 0xD2, 0x52, 0xBE, 0x85, 0x87, 0xEB, 0xB0, 0x7A, 0x63, 0x68, 0x07, 0x78, 0x2B, 0xBD, 0x61 }, - }, - { - { 0x64, 0x87, 0xC9, 0x20, 0xB1, 0x30, 0x16, 0xF4, 0xA0, 0xAA, 0xD3, 0x9F, 0xE1, 0x97, 0x8B, 0xEC, - 0xE9, 0xF4, 0xFA, 0x13, 0xED, 0x0C, 0x42, 0x4D, 0xAA, 0x41, 0x6B, 0xAA, 0x75, 0x89, 0x62, 0x01 }, - }, - { - { 0x64, 0xD4, 0x92, 0x41, 0x6E, 0xE0, 0x55, 0x57, 0x9C, 0x46, 0x3B, 0x21, 0x1A, 0xFE, 0xF7, 0x46, - 0xC3, 0x30, 0xCA, 0x05, 0xF4, 0x4D, 0x85, 0x90, 0x85, 0x59, 0x5D, 0x6F, 0x10, 0xE5, 0x0E, 0xC4 }, - }, - { - { 0x64, 0xDE, 0xB1, 0x36, 0xA4, 0x3E, 0x7D, 0x21, 0x62, 0x29, 0x9B, 0x82, 0xA4, 0xFE, 0x8D, 0xB9, - 0x60, 0xC6, 0x61, 0x7C, 0x60, 0x3B, 0x7D, 0x96, 0x72, 0xA6, 0x2C, 0xA1, 0x40, 0xA6, 0xDA, 0x6A }, - }, - { - { 0x65, 0x66, 0x00, 0xA4, 0x5E, 0x45, 0x6A, 0xBA, 0x5B, 0x00, 0x8D, 0x87, 0x91, 0x54, 0xB7, 0x69, - 0x0D, 0x7F, 0x27, 0x31, 0x02, 0x09, 0x7D, 0x8F, 0xD8, 0xC3, 0xDE, 0xAB, 0x30, 0xD8, 0x4A, 0xB2 }, - }, - { - { 0x65, 0xC1, 0x3A, 0x93, 0x7F, 0xCD, 0x1E, 0xAC, 0x7D, 0x52, 0x33, 0x03, 0xB9, 0x09, 0x91, 0x75, - 0xFE, 0xB7, 0xC3, 0x57, 0x0F, 0xBD, 0xA2, 0xE5, 0x7D, 0x57, 0xD3, 0xFC, 0x47, 0x24, 0xDC, 0xB5 }, - }, - { - { 0x65, 0xEB, 0x8A, 0x1C, 0x57, 0x67, 0x6D, 0x21, 0x53, 0xF2, 0x1A, 0x34, 0x11, 0xB8, 0x9C, 0xCD, - 0x71, 0xBC, 0xC8, 0xC9, 0xDC, 0x2C, 0xC6, 0x1F, 0x83, 0x65, 0x27, 0xE0, 0x81, 0xC0, 0x56, 0x72 }, - }, - { - { 0x65, 0xED, 0x61, 0xA8, 0x8C, 0x55, 0xEF, 0xB0, 0x38, 0x07, 0x1A, 0xEE, 0xDE, 0xF8, 0xE1, 0x83, - 0xE2, 0x37, 0x38, 0x46, 0x97, 0x26, 0xEB, 0x99, 0x68, 0x0C, 0xD2, 0x44, 0x72, 0x73, 0x6B, 0xEC }, - }, - { - { 0x66, 0x07, 0xDF, 0xFF, 0x5D, 0x0B, 0xD3, 0xC9, 0x75, 0x92, 0xCC, 0x75, 0x39, 0x4D, 0x8B, 0x58, - 0x59, 0xF7, 0x5D, 0xA5, 0x12, 0x31, 0x34, 0xD7, 0xC7, 0xE2, 0x1A, 0xA7, 0x48, 0x91, 0x84, 0xEB }, - }, - { - { 0x66, 0x30, 0xB4, 0x4A, 0x1A, 0x28, 0xDE, 0xCB, 0x3B, 0x58, 0xED, 0xCE, 0xEC, 0x13, 0xB2, 0xC5, - 0xA7, 0x4F, 0x38, 0x6A, 0x1B, 0xF1, 0x18, 0x73, 0x75, 0xDE, 0x17, 0x8E, 0x4E, 0x9B, 0xB2, 0x8E }, - }, - { - { 0x66, 0x49, 0xE0, 0x34, 0xC6, 0x9D, 0x14, 0x24, 0xD2, 0x8C, 0x42, 0x68, 0xBA, 0x95, 0x1E, 0xE1, - 0xB4, 0x8A, 0xE1, 0x5F, 0xEB, 0xE7, 0xD6, 0xBE, 0x9D, 0x75, 0xF6, 0xA4, 0xAC, 0x7A, 0xC2, 0x53 }, - }, - { - { 0x66, 0x50, 0xB2, 0xEA, 0x64, 0x4C, 0x3F, 0x4E, 0x8C, 0x9E, 0x3C, 0x46, 0xAC, 0xEA, 0xC4, 0x52, - 0x33, 0xD8, 0x66, 0xE3, 0x98, 0xFF, 0x90, 0xEB, 0x59, 0xB2, 0xC6, 0x25, 0x20, 0x82, 0xAC, 0x04 }, - }, - { - { 0x66, 0x72, 0x1F, 0xE0, 0x69, 0xF1, 0xAA, 0x25, 0x32, 0x11, 0x68, 0x0E, 0xAD, 0x5C, 0x9E, 0x3D, - 0x12, 0x3C, 0x21, 0x24, 0xD3, 0xA2, 0xA4, 0xBD, 0x78, 0x82, 0xF7, 0x36, 0x5A, 0x33, 0x05, 0xA3 }, - }, - { - { 0x66, 0x79, 0x28, 0x7E, 0xBB, 0xC5, 0x67, 0x48, 0xEE, 0xD6, 0x8F, 0x9E, 0x4C, 0xCF, 0x24, 0xEF, - 0x96, 0xA4, 0x1F, 0x73, 0xBB, 0x83, 0x4A, 0x51, 0x71, 0x64, 0xF0, 0x41, 0xCC, 0x5D, 0x86, 0x05 }, - }, - { - { 0x66, 0xBE, 0x7E, 0xA1, 0x13, 0x8B, 0xCB, 0xA4, 0xDE, 0x0B, 0x41, 0x28, 0x5D, 0x9A, 0x13, 0x3F, - 0xA7, 0xF5, 0x70, 0xA3, 0xC8, 0x13, 0x55, 0x79, 0xB8, 0x60, 0x19, 0x9D, 0x0A, 0x51, 0x45, 0x7C }, - }, - { - { 0x66, 0xC9, 0x9A, 0x49, 0x61, 0x2E, 0x60, 0x18, 0x90, 0x02, 0xE2, 0x03, 0x04, 0xD2, 0xFC, 0xC5, - 0xBE, 0x07, 0x59, 0xDF, 0xBA, 0x84, 0x04, 0x70, 0x7E, 0x85, 0x37, 0x00, 0x26, 0x51, 0x84, 0x85 }, - }, - { - { 0x67, 0xA1, 0xBD, 0x09, 0x91, 0x6A, 0x22, 0xC0, 0x53, 0x3D, 0x0B, 0xF6, 0xCA, 0x1F, 0x3B, 0x03, - 0x3F, 0xAD, 0xCA, 0xC1, 0xFF, 0x8A, 0x89, 0x94, 0xD7, 0xF5, 0xC4, 0x79, 0xAD, 0x3A, 0x2E, 0xF5 }, - }, - { - { 0x67, 0xC3, 0xC0, 0xA1, 0x60, 0xE9, 0x28, 0x5E, 0x35, 0xA4, 0x22, 0xBB, 0x43, 0x4B, 0xFF, 0xFF, - 0xEE, 0x28, 0x79, 0xC6, 0xC0, 0xA5, 0x69, 0x36, 0x56, 0xE7, 0x73, 0xA6, 0xDD, 0x68, 0x5F, 0x0E }, - }, - { - { 0x67, 0xCF, 0x34, 0x6C, 0xF2, 0x46, 0x77, 0x1B, 0x3F, 0x5F, 0x3E, 0x51, 0xCD, 0x75, 0x4E, 0x10, - 0x93, 0x27, 0x3D, 0x35, 0x69, 0x88, 0x80, 0x84, 0x26, 0xF5, 0xDD, 0x2E, 0xD4, 0x8B, 0xBF, 0x49 }, - }, - { - { 0x68, 0x6E, 0xA9, 0xA7, 0x73, 0x2C, 0x5A, 0x6E, 0xDC, 0xA8, 0x44, 0xA6, 0x1F, 0x9D, 0xFD, 0x05, - 0xAC, 0x2F, 0x80, 0xF6, 0xC7, 0xED, 0x5E, 0xDF, 0x19, 0x9B, 0x8B, 0xD2, 0x78, 0x5D, 0x92, 0xFC }, - }, - { - { 0x68, 0x99, 0x4C, 0xFE, 0x06, 0x8D, 0xE8, 0x75, 0xEC, 0x56, 0x82, 0xBE, 0x3C, 0x5C, 0xB3, 0x25, - 0x47, 0x3B, 0x21, 0x25, 0xE6, 0xF1, 0xF3, 0xEA, 0x57, 0xCC, 0x09, 0xFE, 0x25, 0xB5, 0xB6, 0x93 }, - }, - { - { 0x68, 0xD3, 0x49, 0x5B, 0x3C, 0xAE, 0xE4, 0x1A, 0x70, 0x9A, 0x41, 0x65, 0xD4, 0x9D, 0xFE, 0xE7, - 0x4D, 0xCF, 0xB6, 0xD1, 0x3F, 0x7C, 0xF9, 0x43, 0xAA, 0xFF, 0xB9, 0xE6, 0xDC, 0x81, 0xDB, 0x04 }, - }, - { - { 0x69, 0x01, 0x4B, 0xBC, 0x84, 0x29, 0xD8, 0x5F, 0x41, 0xC2, 0x22, 0xD9, 0x7F, 0x7E, 0xD5, 0x35, - 0xCF, 0x81, 0x23, 0x9A, 0xF2, 0x7A, 0xCC, 0x88, 0x70, 0xDC, 0xD4, 0x08, 0x34, 0x8B, 0x48, 0xBA }, - }, - { - { 0x69, 0x21, 0x1F, 0x36, 0x3A, 0x2D, 0xBE, 0x01, 0x5B, 0x31, 0xCB, 0xD9, 0xFC, 0x5E, 0x94, 0xC2, - 0xF6, 0xF4, 0x3C, 0x58, 0xDB, 0xDE, 0xE9, 0xE3, 0xE4, 0x6B, 0x19, 0xD7, 0x59, 0xBB, 0xB8, 0x81 }, - }, - { - { 0x69, 0x44, 0xFE, 0x2E, 0xFD, 0x6C, 0x78, 0xE1, 0x40, 0x74, 0xBC, 0x3D, 0x9A, 0xC2, 0x3C, 0x8A, - 0x65, 0x7D, 0x0E, 0x8E, 0xBD, 0xF7, 0x4E, 0xC2, 0xCD, 0x26, 0x67, 0x74, 0x9D, 0x9D, 0xAD, 0xCB }, - }, - { - { 0x69, 0x52, 0x89, 0x99, 0x34, 0xD7, 0x23, 0x2B, 0xF9, 0xF6, 0x96, 0x8B, 0xCA, 0x13, 0x43, 0x92, - 0x47, 0xBF, 0xC3, 0x65, 0x92, 0x98, 0x00, 0x3D, 0xB1, 0xEE, 0xB7, 0x43, 0x92, 0x81, 0xB1, 0xD6 }, - }, - { - { 0x69, 0x54, 0x0E, 0x3B, 0xAB, 0x9A, 0x6E, 0x46, 0x58, 0x62, 0xCF, 0x2B, 0xCA, 0x5A, 0x63, 0x62, - 0x55, 0xF6, 0x9D, 0x46, 0x26, 0x39, 0xD3, 0xD9, 0x23, 0xFF, 0x93, 0x91, 0x90, 0x1B, 0x6C, 0x92 }, - }, - { - { 0x69, 0x75, 0x67, 0xBB, 0xAC, 0x94, 0xEE, 0xC3, 0xE6, 0xFA, 0x4A, 0x4E, 0x46, 0xFA, 0x51, 0x74, - 0x05, 0xF3, 0x77, 0xC0, 0xDE, 0xE3, 0xD4, 0x29, 0x91, 0x4E, 0x6B, 0x7E, 0xA0, 0x8C, 0xB1, 0xA6 }, - }, - { - { 0x69, 0xD3, 0x38, 0xE5, 0xD8, 0xC0, 0x69, 0xE7, 0xDC, 0x10, 0xD3, 0x82, 0x1F, 0x7A, 0x83, 0x0D, - 0xEB, 0x5D, 0x95, 0x7C, 0x8E, 0xC6, 0xEC, 0xD2, 0x5A, 0xF7, 0x24, 0x3E, 0xD0, 0xE4, 0xDC, 0x26 }, - }, - { - { 0x6A, 0x9C, 0x89, 0x45, 0x1E, 0xF3, 0xC9, 0xE3, 0xA2, 0x96, 0x2F, 0x8D, 0xB6, 0xF8, 0x7D, 0x20, - 0x77, 0x8D, 0x05, 0xA8, 0x74, 0x34, 0xA0, 0x78, 0x2B, 0x02, 0x53, 0x6D, 0xCD, 0x02, 0x4B, 0x4B }, - }, - { - { 0x6A, 0xAC, 0xC5, 0x09, 0x2F, 0x12, 0xBC, 0x94, 0xA0, 0xAD, 0x0E, 0x9E, 0xF6, 0x36, 0x43, 0x7D, - 0x36, 0x0D, 0xC7, 0xC9, 0xF1, 0x40, 0x44, 0x17, 0xA3, 0x36, 0x91, 0x94, 0x4E, 0x76, 0x31, 0x36 }, - }, - { - { 0x6A, 0xC3, 0x2D, 0xA9, 0x16, 0x8F, 0x70, 0xD0, 0x9F, 0xE9, 0xF7, 0x55, 0x3E, 0x67, 0x0F, 0xA4, - 0xAA, 0xAC, 0xE8, 0x7B, 0x5A, 0x0B, 0x9A, 0x3F, 0x22, 0x2D, 0x7A, 0x8B, 0xBA, 0x76, 0xD2, 0xF2 }, - }, - { - { 0x6A, 0xE7, 0x98, 0xD7, 0xDE, 0x07, 0x84, 0x90, 0xA5, 0x0F, 0x73, 0x89, 0x86, 0xD4, 0x03, 0x39, - 0x42, 0x97, 0x9D, 0xE2, 0x42, 0x6A, 0xFA, 0x95, 0x42, 0x24, 0x2E, 0x76, 0x3F, 0xEC, 0xF4, 0xA6 }, - }, - { - { 0x6B, 0x15, 0x66, 0xBF, 0x94, 0xA2, 0x26, 0xEE, 0x7C, 0xF3, 0x67, 0x5D, 0x63, 0x92, 0x73, 0x16, - 0x54, 0x56, 0x4B, 0x05, 0xC7, 0x2F, 0xCD, 0x7F, 0x6A, 0x97, 0xBA, 0xA1, 0x53, 0xE7, 0x6A, 0x18 }, - }, - { - { 0x6B, 0x37, 0xDD, 0x56, 0xDB, 0xC9, 0x97, 0x01, 0xEE, 0x6B, 0x55, 0x75, 0x23, 0x8B, 0x1E, 0xCF, - 0x35, 0xDF, 0x1B, 0x5E, 0x85, 0x91, 0x09, 0x1D, 0xB6, 0x8C, 0xC3, 0x5B, 0xD5, 0xA3, 0x6C, 0xE4 }, - }, - { - { 0x6B, 0x4A, 0x8C, 0xB6, 0x07, 0xF5, 0x1C, 0x83, 0x0D, 0xE7, 0x20, 0xF4, 0xBB, 0xDE, 0xDF, 0x49, - 0x10, 0x15, 0x13, 0xDF, 0xD1, 0xDB, 0x0B, 0x0A, 0x97, 0xCC, 0x3F, 0xDD, 0x9A, 0x39, 0xC6, 0xE7 }, - }, - { - { 0x6C, 0x07, 0x12, 0x67, 0x53, 0x03, 0x6A, 0x21, 0xBD, 0x20, 0xFC, 0x64, 0xEC, 0x6B, 0xA6, 0xE7, - 0x32, 0x59, 0x19, 0x1C, 0xBB, 0xBB, 0xFF, 0x21, 0x03, 0x74, 0xC8, 0x9E, 0x64, 0xF4, 0xD8, 0xD6 }, - }, - { - { 0x6C, 0x21, 0xDC, 0xB3, 0x38, 0x5C, 0x2B, 0x75, 0xA1, 0x5B, 0x2F, 0x61, 0x22, 0xFB, 0x58, 0xA1, - 0x24, 0x86, 0xAA, 0x4A, 0x4D, 0x23, 0x9E, 0xD0, 0x16, 0x74, 0x35, 0x8C, 0x9C, 0x71, 0x48, 0x6D }, - }, - { - { 0x6C, 0x67, 0xE6, 0x03, 0x63, 0x52, 0x5A, 0x65, 0x0A, 0x86, 0xB5, 0xE9, 0x46, 0x09, 0xDE, 0x13, - 0xF6, 0xBD, 0xB9, 0x0E, 0xCC, 0x2B, 0xB2, 0xA1, 0x8F, 0xDA, 0x99, 0x59, 0x52, 0x3A, 0x18, 0xD9 }, - }, - { - { 0x6C, 0x72, 0x94, 0x87, 0xC9, 0x02, 0x5D, 0x18, 0x10, 0x51, 0x29, 0xFA, 0x0B, 0xA2, 0x94, 0x4D, - 0xA8, 0x6A, 0xF1, 0xDB, 0x2D, 0x03, 0x4B, 0xE2, 0xBB, 0x73, 0x64, 0x50, 0x0C, 0x05, 0xA6, 0xDE }, - }, - { - { 0x6C, 0x8D, 0x4E, 0x52, 0x7E, 0x74, 0x08, 0x82, 0x6D, 0xB8, 0x4D, 0x04, 0x1A, 0x0E, 0x29, 0xD6, - 0xDE, 0x13, 0xA6, 0x1E, 0x63, 0x6B, 0xF6, 0xB6, 0xF5, 0xF6, 0x75, 0x42, 0x7A, 0xCE, 0xCE, 0x9E }, - }, - { - { 0x6C, 0x8F, 0xD1, 0xE6, 0xE1, 0x1B, 0xAF, 0xA6, 0x17, 0x78, 0x13, 0xA0, 0x44, 0x40, 0xB1, 0xB9, - 0x6A, 0x1C, 0xDB, 0x7C, 0x2D, 0x70, 0x3F, 0x55, 0xDE, 0x85, 0x7C, 0x80, 0xA8, 0x9E, 0x73, 0x25 }, - }, - { - { 0x6C, 0xC6, 0xDC, 0xDA, 0x58, 0xC6, 0x1F, 0xB2, 0x86, 0x70, 0xD1, 0xC2, 0x01, 0x76, 0x57, 0xB0, - 0xC5, 0xD6, 0x1A, 0x26, 0xC9, 0xCB, 0xD1, 0xEA, 0x75, 0x5C, 0x68, 0x20, 0xB5, 0xF6, 0xD6, 0x7D }, - }, - { - { 0x6C, 0xC8, 0x0F, 0x47, 0x96, 0x4E, 0x0D, 0xCB, 0x39, 0xE4, 0xD0, 0x1B, 0x3B, 0x3E, 0xBC, 0x8B, - 0x9C, 0x77, 0xB4, 0x08, 0x59, 0xBB, 0x5D, 0x5C, 0x31, 0x27, 0x4D, 0xA5, 0x39, 0xFA, 0xCA, 0x8D }, - }, - { - { 0x6D, 0x32, 0xF4, 0x93, 0x40, 0x56, 0xEE, 0x17, 0x14, 0xCA, 0x72, 0x70, 0x3F, 0x64, 0x46, 0x9B, - 0x98, 0x58, 0xFC, 0x39, 0x96, 0x4B, 0x4C, 0x03, 0x93, 0xB3, 0x7D, 0xDE, 0xAB, 0x8B, 0x19, 0x75 }, - }, - { - { 0x6D, 0x4E, 0xD4, 0x29, 0x38, 0x15, 0x90, 0xBD, 0x3C, 0x6B, 0x7C, 0xB7, 0xE4, 0xE4, 0x25, 0xC8, - 0xE2, 0x1F, 0x79, 0xFF, 0x4D, 0x40, 0x00, 0xB9, 0x65, 0x3F, 0xA1, 0x27, 0xE1, 0x41, 0xD3, 0x50 }, - }, - { - { 0x6D, 0x4E, 0xE5, 0x3B, 0xF9, 0x9F, 0xFA, 0xBB, 0x1C, 0x9B, 0x77, 0x96, 0x66, 0xEF, 0xC4, 0x5E, - 0x6A, 0xB3, 0xFA, 0x74, 0xAB, 0x37, 0x30, 0x9F, 0x8C, 0xDE, 0xF7, 0x2C, 0x94, 0x39, 0x23, 0xEE }, - }, - { - { 0x6D, 0x84, 0x0B, 0xBB, 0xA9, 0x3F, 0x53, 0x9B, 0xE0, 0x84, 0x9D, 0x26, 0xD5, 0x27, 0x7B, 0xD7, - 0xF2, 0x4B, 0xBA, 0x93, 0x5E, 0x05, 0x0D, 0x11, 0x26, 0xD7, 0x78, 0x22, 0xB5, 0x90, 0x26, 0x83 }, - }, - { - { 0x6D, 0xC9, 0x87, 0x5C, 0xD3, 0x46, 0xA2, 0x2B, 0x47, 0xB2, 0x80, 0xB1, 0xB1, 0x45, 0x0D, 0x87, - 0x8E, 0x09, 0x8B, 0xB2, 0xE2, 0xA9, 0xE3, 0xC2, 0x5C, 0xC7, 0x6A, 0xFF, 0x93, 0xC0, 0xBE, 0xAB }, - }, - { - { 0x6E, 0x0C, 0x0B, 0x5D, 0x7B, 0x82, 0x23, 0x21, 0x87, 0x41, 0xE6, 0x7B, 0x87, 0x6C, 0xCB, 0x8C, - 0xB5, 0x81, 0x11, 0x48, 0x82, 0x87, 0xDA, 0x8C, 0x30, 0x64, 0xE8, 0x2E, 0xCC, 0xC2, 0x70, 0x12 }, - }, - { - { 0x6E, 0x16, 0x35, 0x9E, 0x05, 0xEB, 0x14, 0xEC, 0x86, 0xEE, 0xE5, 0x9D, 0x01, 0x0C, 0xD6, 0x4F, - 0x1D, 0x1B, 0x4B, 0xA1, 0xEF, 0x46, 0xA2, 0x0F, 0x35, 0xC6, 0xA6, 0x3D, 0xC5, 0x3A, 0x2A, 0xCB }, - }, - { - { 0x6E, 0x1A, 0x88, 0x63, 0xF2, 0x93, 0x4B, 0x39, 0x01, 0x23, 0x7E, 0x84, 0xD0, 0x76, 0x27, 0x04, - 0x23, 0x06, 0x78, 0x7F, 0x2D, 0xE0, 0x66, 0x30, 0xBD, 0x37, 0xD8, 0x03, 0x94, 0x35, 0xBF, 0xCA }, - }, - { - { 0x6E, 0x1C, 0xB1, 0x2A, 0x08, 0x3C, 0x89, 0x08, 0xFB, 0x06, 0x04, 0x56, 0xEE, 0xE8, 0x74, 0xED, - 0xD9, 0xFA, 0x71, 0x3F, 0x26, 0x95, 0xEE, 0x5E, 0xE8, 0x59, 0x84, 0x83, 0xE3, 0x02, 0x8F, 0x0B }, - }, - { - { 0x6E, 0x8D, 0x55, 0xEE, 0x2F, 0x72, 0x5A, 0x0B, 0xA5, 0xDF, 0x43, 0x43, 0xA0, 0x6F, 0xD3, 0x71, - 0x54, 0x25, 0x6B, 0xCF, 0xF7, 0xCE, 0xE0, 0xB7, 0x00, 0xAC, 0xDD, 0x91, 0x56, 0x49, 0x79, 0x99 }, - }, - { - { 0x6E, 0xB8, 0xA7, 0xBA, 0x7F, 0xC2, 0x1C, 0x62, 0x40, 0x3F, 0x63, 0x76, 0xBB, 0x10, 0x44, 0x82, - 0x48, 0x8D, 0xA9, 0xC1, 0x41, 0x4A, 0xE3, 0xAB, 0x06, 0xE0, 0x1E, 0xD7, 0x32, 0x42, 0xAB, 0xD7 }, - }, - { - { 0x6E, 0xEB, 0x39, 0xDA, 0xD7, 0x3F, 0xC5, 0x99, 0x72, 0x42, 0x17, 0xCF, 0xF0, 0x21, 0xD5, 0xAC, - 0x4E, 0x7E, 0x2B, 0xF4, 0x76, 0xEA, 0xF4, 0xFD, 0x4D, 0x7B, 0xFB, 0x6E, 0x4F, 0x18, 0xC1, 0x73 }, - }, - { - { 0x6F, 0x1C, 0x4A, 0x29, 0x79, 0xFC, 0xBE, 0xAD, 0xC5, 0xD5, 0x80, 0xE5, 0xBF, 0xDB, 0xF8, 0x4C, - 0xC6, 0xA0, 0xF2, 0xA9, 0x2E, 0xB1, 0xC6, 0x88, 0xD5, 0x31, 0x3A, 0x0F, 0xDA, 0xCF, 0x0B, 0x56 }, - }, - { - { 0x6F, 0x3B, 0xB3, 0x4B, 0x5D, 0x32, 0x91, 0xDF, 0xB3, 0xE4, 0x12, 0x71, 0xA1, 0xD7, 0x30, 0xCD, - 0xBC, 0xFF, 0xC1, 0x0B, 0x68, 0x05, 0x9D, 0xCC, 0xD3, 0x1C, 0x47, 0x4B, 0xB7, 0x44, 0x16, 0xE5 }, - }, - { - { 0x6F, 0x7E, 0x99, 0xB2, 0x6C, 0xF2, 0x57, 0x61, 0xCA, 0x87, 0xD7, 0x0E, 0xB1, 0xDD, 0x32, 0xCD, - 0x0D, 0x2B, 0xD1, 0xFE, 0x7F, 0x62, 0x2E, 0xF6, 0x47, 0x18, 0x9C, 0xEB, 0x91, 0x43, 0x8D, 0x99 }, - }, - { - { 0x6F, 0x92, 0x7B, 0x13, 0xE5, 0x9C, 0xA9, 0x87, 0x61, 0x82, 0x07, 0xAF, 0xED, 0xE2, 0xE8, 0xE1, - 0xD9, 0xC3, 0x03, 0xE1, 0xF1, 0x2F, 0x19, 0x2D, 0xF3, 0xF7, 0x0E, 0x5D, 0x1D, 0x4D, 0x2C, 0x18 }, - }, - { - { 0x6F, 0x95, 0xDB, 0x28, 0x26, 0x61, 0x3C, 0xA6, 0x12, 0x0D, 0x81, 0x15, 0xFB, 0xA3, 0xDD, 0x0A, - 0x2A, 0x22, 0x31, 0x2D, 0x74, 0x88, 0xBF, 0x77, 0x0F, 0x9C, 0x57, 0x96, 0xC9, 0x02, 0xBC, 0xC3 }, - }, - { - { 0x6F, 0xB0, 0x06, 0xB4, 0x5F, 0x4A, 0xB6, 0xF5, 0x28, 0x12, 0xBD, 0x1F, 0x9D, 0x8C, 0xF1, 0x0E, - 0x2B, 0x4C, 0x8C, 0xE5, 0x2A, 0x4D, 0xF6, 0x56, 0x84, 0xF3, 0x08, 0x48, 0x1C, 0xEE, 0xC8, 0x93 }, - }, - { - { 0x6F, 0xBD, 0xCD, 0xF1, 0xB4, 0x37, 0x9F, 0xC4, 0x73, 0xAB, 0x5E, 0xEA, 0x4E, 0xC2, 0xF4, 0x84, - 0xCE, 0x91, 0xD1, 0x0E, 0x31, 0x34, 0x5F, 0x15, 0xA7, 0x6A, 0x84, 0x85, 0xB8, 0xFF, 0xFB, 0x7E }, - }, - { - { 0x6F, 0xDC, 0x18, 0xD6, 0x55, 0x14, 0xDD, 0xCE, 0xF0, 0x2F, 0xEA, 0x81, 0x7A, 0x1B, 0x70, 0x84, - 0x71, 0x95, 0xFF, 0x5C, 0x07, 0xB1, 0x3D, 0x6A, 0x97, 0x1E, 0x0E, 0x77, 0x4B, 0x44, 0x10, 0xA0 }, - }, - { - { 0x70, 0xB8, 0xEC, 0xD5, 0x62, 0xEC, 0x3D, 0x9F, 0x48, 0x64, 0x75, 0x2A, 0x3A, 0x8C, 0x54, 0x39, - 0x93, 0xB4, 0x38, 0x72, 0x8F, 0xE2, 0x71, 0x81, 0xF4, 0xC0, 0x8D, 0xE6, 0xA0, 0xD8, 0xB7, 0x9A }, - }, - { - { 0x70, 0xE0, 0xB7, 0xF5, 0xC7, 0xA3, 0xD1, 0xF3, 0x96, 0x85, 0x84, 0x5D, 0x94, 0xFC, 0x9E, 0x77, - 0x7C, 0x12, 0x69, 0xCF, 0x15, 0x31, 0x68, 0x51, 0x98, 0x3D, 0x60, 0x58, 0x76, 0x1C, 0xF0, 0x63 }, - }, - { - { 0x70, 0xED, 0x64, 0x0C, 0xBC, 0xE7, 0x84, 0xA6, 0x8E, 0xCD, 0xD6, 0x32, 0x0B, 0x61, 0x3C, 0x88, - 0x42, 0xE6, 0xD7, 0x09, 0xBD, 0x96, 0xF1, 0xD2, 0x43, 0xE4, 0xB2, 0x1E, 0xED, 0x8B, 0x12, 0x8C }, - }, - { - { 0x71, 0x1E, 0xF0, 0x96, 0x33, 0x43, 0x8A, 0xC5, 0xBE, 0x9D, 0xA8, 0x12, 0x2E, 0x7A, 0xCF, 0x0E, - 0xA2, 0x68, 0xB8, 0x72, 0xAD, 0xDC, 0x3E, 0xE8, 0x37, 0x2B, 0x91, 0x6D, 0x60, 0x65, 0xCF, 0xA8 }, - }, - { - { 0x71, 0xCF, 0x8D, 0x5C, 0x16, 0xF0, 0xDF, 0x67, 0xD2, 0x3F, 0x67, 0x06, 0xAE, 0xB9, 0x7C, 0x8E, - 0xAE, 0x2C, 0xAF, 0xC6, 0xBE, 0xC9, 0x4A, 0x4D, 0xB2, 0x40, 0x5A, 0x37, 0xFF, 0x30, 0x92, 0x5F }, - }, - { - { 0x72, 0x1B, 0x1F, 0x92, 0x9D, 0xA7, 0xEA, 0xF8, 0x96, 0x24, 0x64, 0x7B, 0xA3, 0xCC, 0x4E, 0x1E, - 0xD1, 0x57, 0x54, 0xAB, 0x83, 0x6E, 0x33, 0x58, 0xB0, 0x35, 0xA1, 0xF2, 0x27, 0x4A, 0x43, 0xBE }, - }, - { - { 0x72, 0xAA, 0x1A, 0xF2, 0x9A, 0xB0, 0x96, 0x5B, 0x34, 0x57, 0x14, 0x79, 0x84, 0x9B, 0x84, 0x74, - 0xB8, 0x81, 0x80, 0xE2, 0x1B, 0x98, 0x58, 0x92, 0x9B, 0xD6, 0x3E, 0x30, 0x91, 0x9C, 0xFC, 0xD9 }, - }, - { - { 0x72, 0xB6, 0x11, 0x01, 0x0E, 0xA4, 0x7D, 0x3D, 0x1E, 0x24, 0x53, 0xD7, 0x9D, 0x19, 0x03, 0x15, - 0x53, 0x4E, 0x55, 0x31, 0x2A, 0x7E, 0xBC, 0xAA, 0xB0, 0xE5, 0x5F, 0xF0, 0x03, 0x41, 0xD7, 0x14 }, - }, - { - { 0x72, 0xE7, 0x49, 0x87, 0x21, 0x0C, 0x7E, 0xF6, 0x67, 0x46, 0xE4, 0x9A, 0x96, 0xDF, 0x55, 0xCC, - 0x6F, 0xAD, 0xF7, 0xA6, 0x31, 0xC7, 0xAE, 0x3F, 0x3E, 0x9E, 0x18, 0x72, 0x3D, 0xE5, 0x2A, 0x6E }, - }, - { - { 0x73, 0x06, 0x2E, 0xFC, 0x20, 0xB4, 0x17, 0xF7, 0x4C, 0xD1, 0xA4, 0xE6, 0xA6, 0x36, 0x9F, 0x97, - 0x18, 0x86, 0x94, 0xFF, 0x9D, 0xCE, 0xFF, 0x1F, 0x5E, 0x4C, 0x11, 0x99, 0x74, 0x44, 0x6A, 0x3F }, - }, - { - { 0x73, 0x29, 0x62, 0x43, 0xC0, 0xDD, 0x61, 0xB1, 0x7F, 0x5C, 0x58, 0x89, 0x4C, 0x31, 0x3E, 0xF7, - 0xA8, 0x48, 0xAE, 0xE3, 0x1B, 0x08, 0x96, 0xE0, 0xB3, 0xE1, 0x51, 0x7F, 0x6E, 0x6D, 0x9F, 0x2F }, - }, - { - { 0x73, 0x3B, 0x42, 0x24, 0x25, 0x8D, 0xEE, 0x07, 0x0E, 0xDF, 0xA3, 0x41, 0x1F, 0xBC, 0x9B, 0xAD, - 0x31, 0x65, 0xBE, 0x66, 0x0F, 0x34, 0x0A, 0xA2, 0x30, 0x8A, 0x5A, 0x33, 0x23, 0xFA, 0xBF, 0xA7 }, - }, - { - { 0x73, 0x46, 0x99, 0x89, 0x4A, 0xD4, 0xB5, 0xA8, 0xA2, 0xDD, 0x9A, 0xB4, 0xFD, 0x5F, 0x63, 0x25, - 0x30, 0x3B, 0x49, 0x16, 0x4C, 0xA8, 0xD8, 0xE7, 0xBA, 0x99, 0x77, 0x81, 0x7E, 0x4A, 0xE2, 0x4F }, - }, - { - { 0x73, 0x9D, 0x17, 0x23, 0x23, 0xF2, 0xB2, 0x84, 0x07, 0x0A, 0xCE, 0x43, 0x09, 0x8C, 0x8B, 0x21, - 0xC4, 0x7A, 0x53, 0xF9, 0x98, 0x5F, 0x2F, 0xAD, 0x5F, 0x8B, 0x2E, 0xB7, 0x03, 0x4F, 0xDB, 0x21 }, - }, - { - { 0x73, 0xB4, 0x34, 0x22, 0x97, 0x6D, 0xAE, 0x7F, 0x98, 0x1E, 0xE5, 0x0A, 0xD7, 0x5B, 0xE2, 0x3A, - 0x41, 0xFF, 0x77, 0x09, 0xA7, 0x25, 0x2A, 0x4D, 0x15, 0x98, 0x52, 0x5F, 0x9D, 0x88, 0x22, 0x97 }, - }, - { - { 0x73, 0xBF, 0x46, 0xA8, 0x4B, 0x39, 0x94, 0xC7, 0x08, 0xA8, 0x2C, 0xD7, 0xC5, 0xB7, 0xAF, 0xFC, - 0xF9, 0x09, 0xF9, 0x6F, 0x16, 0x8E, 0x8D, 0xD1, 0xBD, 0x1A, 0xDB, 0xC7, 0x15, 0x99, 0xEC, 0xAA }, - }, - { - { 0x74, 0x2F, 0xCF, 0x73, 0x56, 0x51, 0xCE, 0xB1, 0x84, 0x3C, 0xE3, 0xD6, 0x56, 0x72, 0x34, 0x68, - 0xAB, 0x22, 0x85, 0x6C, 0x6A, 0x80, 0x56, 0xB9, 0x1C, 0x75, 0xC5, 0x8A, 0x67, 0xEC, 0xA8, 0xBE }, - }, - { - { 0x74, 0x54, 0x0F, 0xA5, 0x0A, 0x36, 0x2E, 0x68, 0x6D, 0x99, 0x17, 0x98, 0x18, 0x35, 0x09, 0x83, - 0x6C, 0x95, 0xA3, 0xFB, 0x04, 0x58, 0x00, 0x22, 0xF9, 0x68, 0x58, 0x4F, 0x8A, 0xCF, 0x60, 0x1F }, - }, - { - { 0x74, 0x8D, 0x42, 0x49, 0x6D, 0xA9, 0x25, 0x45, 0x90, 0x54, 0xE1, 0x3E, 0x38, 0xEC, 0x9F, 0x8E, - 0x6C, 0x5F, 0x97, 0x29, 0x7A, 0xB3, 0xA0, 0x14, 0x58, 0x99, 0x85, 0x26, 0xB0, 0xFD, 0x3A, 0xED }, - }, - { - { 0x74, 0xA9, 0x27, 0xE7, 0xB2, 0xF1, 0xF6, 0x48, 0x3D, 0xC2, 0x59, 0x21, 0xAB, 0xBE, 0x2F, 0x97, - 0x74, 0xA2, 0x0C, 0xB8, 0x96, 0xBA, 0xB5, 0x64, 0x8C, 0x2A, 0xB0, 0xF9, 0xDB, 0xDA, 0x3D, 0xA6 }, - }, - { - { 0x75, 0x83, 0x10, 0x84, 0x6A, 0xD5, 0x74, 0x05, 0x71, 0x1A, 0xDC, 0x4A, 0x1A, 0xF0, 0xEC, 0x51, - 0x8F, 0x82, 0x2D, 0x1A, 0x6C, 0xA9, 0x1E, 0xC2, 0x51, 0xF1, 0x22, 0xD4, 0x10, 0x6F, 0x99, 0xD9 }, - }, - { - { 0x75, 0x86, 0x5A, 0xA6, 0xFC, 0x45, 0x8E, 0x5A, 0x7B, 0x63, 0x04, 0x07, 0x07, 0x4F, 0x43, 0x11, - 0x1D, 0xD9, 0x21, 0x24, 0xB7, 0x7C, 0xE4, 0x02, 0x6D, 0x82, 0x41, 0xCF, 0x23, 0x71, 0xD9, 0xCC }, - }, - { - { 0x75, 0xBB, 0x15, 0x25, 0x09, 0xB7, 0x19, 0x04, 0xE4, 0x40, 0x0F, 0xB4, 0x23, 0xA5, 0x80, 0xAA, - 0xE1, 0xDD, 0xB7, 0x68, 0xF6, 0xFD, 0x36, 0xE6, 0x30, 0x94, 0xEB, 0xE3, 0x92, 0x15, 0xF3, 0x90 }, - }, - { - { 0x75, 0xC1, 0x6D, 0x87, 0x10, 0x9A, 0x9D, 0x86, 0xE3, 0x90, 0x2E, 0xE1, 0xE0, 0x7B, 0xE1, 0x13, - 0xB4, 0x15, 0x53, 0x0D, 0xC7, 0x3F, 0x7F, 0x7F, 0x1D, 0x7F, 0xE0, 0xDB, 0x7B, 0x02, 0x50, 0x30 }, - }, - { - { 0x75, 0xE9, 0xA1, 0x5D, 0x94, 0x88, 0x0C, 0x66, 0x14, 0x82, 0xCF, 0xC1, 0x96, 0x4C, 0xBC, 0xE2, - 0xB1, 0xCA, 0x7A, 0x9F, 0x81, 0xD4, 0x07, 0x30, 0x12, 0x47, 0x1F, 0x27, 0x23, 0xCB, 0x72, 0x8A }, - }, - { - { 0x76, 0x73, 0x18, 0x0F, 0x9D, 0x9A, 0x85, 0x48, 0x4B, 0x5C, 0x16, 0x99, 0xA2, 0xDC, 0x17, 0xFC, - 0x61, 0x13, 0xA3, 0xED, 0x5B, 0xC9, 0xC0, 0x55, 0x8C, 0xB8, 0x2D, 0xFF, 0x9E, 0x50, 0x32, 0x09 }, - }, - { - { 0x76, 0x98, 0x67, 0x60, 0xAC, 0xFE, 0x55, 0x59, 0xA2, 0xA2, 0xAB, 0x2A, 0x4E, 0x85, 0x49, 0x83, - 0xC5, 0xFD, 0xE6, 0x73, 0xCE, 0x8E, 0xB1, 0x71, 0x23, 0x49, 0x48, 0x64, 0x86, 0x7A, 0x98, 0xB1 }, - }, - { - { 0x76, 0xBC, 0x5D, 0x17, 0xFE, 0x9F, 0x0E, 0x89, 0x7E, 0x4D, 0xDB, 0x87, 0xD5, 0xB8, 0xDD, 0x2E, - 0xB2, 0xAC, 0x82, 0xF6, 0xA3, 0x11, 0x06, 0xED, 0xFD, 0x67, 0xDD, 0xCD, 0xE6, 0xA4, 0x3F, 0x17 }, - }, - { - { 0x76, 0xCA, 0x72, 0xCC, 0x37, 0xAB, 0x2A, 0xA3, 0x83, 0x98, 0x71, 0x0F, 0x02, 0x20, 0xFA, 0xF3, - 0x30, 0x1D, 0x54, 0x49, 0x38, 0xFB, 0x24, 0x19, 0x2D, 0xEC, 0x32, 0xF7, 0x44, 0xE4, 0x22, 0x10 }, - }, - { - { 0x76, 0xCD, 0xF0, 0x78, 0xA8, 0x89, 0x1F, 0x1B, 0x3D, 0x0A, 0xA7, 0x1D, 0x6E, 0x18, 0xD7, 0x6A, - 0x4D, 0x20, 0x7A, 0xAF, 0x84, 0xC6, 0x12, 0x95, 0x0E, 0xDF, 0xCD, 0x92, 0x82, 0xA1, 0x11, 0x44 }, - }, - { - { 0x77, 0x4F, 0x40, 0x72, 0x98, 0x9C, 0xA1, 0x55, 0x18, 0x17, 0x73, 0xB0, 0x55, 0x07, 0x6F, 0xFD, - 0x10, 0x21, 0x82, 0xC6, 0xAB, 0xE2, 0xA9, 0xCE, 0x03, 0x0F, 0x8D, 0xF2, 0x99, 0x56, 0xE1, 0x48 }, - }, - { - { 0x77, 0x59, 0x71, 0xD4, 0x48, 0x9D, 0xBE, 0x27, 0x72, 0xDB, 0x72, 0xAC, 0x28, 0xB8, 0xB3, 0x71, - 0xB0, 0x21, 0xC3, 0xD6, 0x26, 0x14, 0xD0, 0x7B, 0x6F, 0x5B, 0x8C, 0x2A, 0x57, 0x70, 0x25, 0xAE }, - }, - { - { 0x77, 0x95, 0x6B, 0x48, 0xCD, 0xD9, 0x15, 0x0B, 0xD8, 0x7D, 0x8D, 0x81, 0x50, 0x60, 0xAC, 0x8C, - 0x84, 0x81, 0x3A, 0x53, 0x87, 0x1A, 0x58, 0x6A, 0x69, 0x8B, 0x18, 0x79, 0x89, 0x13, 0xD3, 0xB8 }, - }, - { - { 0x77, 0xAC, 0x72, 0x54, 0x6A, 0x39, 0xCA, 0x2F, 0x24, 0xE2, 0xD1, 0x3C, 0x0D, 0x74, 0x91, 0x5F, - 0x67, 0xBC, 0xD4, 0x37, 0x09, 0xA9, 0xE5, 0xDB, 0x8B, 0x33, 0x1A, 0x55, 0x77, 0xFD, 0x50, 0x88 }, - }, - { - { 0x77, 0xB7, 0xCC, 0x99, 0xCE, 0x02, 0x4E, 0x0B, 0x7E, 0xD5, 0x33, 0xC9, 0x9C, 0xC8, 0x25, 0x08, - 0xEB, 0xA6, 0xAC, 0x3A, 0x0B, 0xE5, 0xBC, 0xBF, 0x7A, 0xC9, 0x94, 0x95, 0x2B, 0x6D, 0x35, 0x07 }, - }, - { - { 0x77, 0xB9, 0x6A, 0x00, 0x77, 0x15, 0xA0, 0x8C, 0x6A, 0x22, 0xDB, 0x14, 0xC7, 0xF4, 0xF1, 0xD7, - 0xF4, 0xA7, 0x41, 0xCE, 0x47, 0x32, 0xEC, 0xF8, 0x3E, 0x74, 0xC1, 0xC9, 0x63, 0x22, 0x83, 0xCD }, - }, - { - { 0x77, 0xDD, 0xC8, 0x1B, 0xD2, 0x8B, 0x9D, 0x46, 0x1E, 0x7D, 0x3C, 0xD4, 0xA8, 0x12, 0x2A, 0xA9, - 0x8A, 0x24, 0x60, 0xFB, 0xA0, 0x8F, 0x1B, 0x7B, 0xAC, 0xB6, 0x6C, 0x92, 0xD7, 0x99, 0x1C, 0xCC }, - }, - { - { 0x78, 0x0C, 0x33, 0xFE, 0x95, 0x4C, 0xC4, 0xDB, 0x39, 0x04, 0xD7, 0x6A, 0x68, 0x58, 0xBC, 0xD1, - 0x01, 0x7F, 0x52, 0xDA, 0x59, 0x9D, 0x36, 0xDA, 0xE6, 0x66, 0xC0, 0x4E, 0x41, 0xAF, 0x8D, 0xCD }, - }, - { - { 0x78, 0x41, 0x36, 0x37, 0x9B, 0xA0, 0xDB, 0xD7, 0xB3, 0xBA, 0xDC, 0x52, 0xDC, 0xE6, 0xBB, 0x81, - 0x07, 0xA3, 0x56, 0xC8, 0x48, 0x3F, 0x13, 0xE1, 0x69, 0x75, 0x0B, 0xC2, 0x07, 0x0A, 0x67, 0xD9 }, - }, - { - { 0x78, 0xC9, 0x30, 0x40, 0x5A, 0x72, 0x0D, 0x9F, 0x00, 0x66, 0xDD, 0x88, 0xA2, 0xA8, 0xDA, 0xFB, - 0xBE, 0x6C, 0xD6, 0x5D, 0x54, 0xB7, 0x76, 0x06, 0x42, 0x1B, 0x45, 0x43, 0x8C, 0x65, 0x8A, 0xD4 }, - }, - { - { 0x79, 0x17, 0x21, 0x35, 0x7E, 0x4B, 0xA1, 0x38, 0xE0, 0x3D, 0x59, 0xBA, 0xC1, 0x41, 0x42, 0x80, - 0x52, 0xE9, 0x88, 0x42, 0x39, 0x84, 0x7A, 0x4D, 0x92, 0xCA, 0xC0, 0x9F, 0xEB, 0xFE, 0x6A, 0xA4 }, - }, - { - { 0x79, 0x44, 0x5A, 0x43, 0x7B, 0xBE, 0xB4, 0xA5, 0x59, 0xC8, 0x1C, 0x8E, 0x57, 0xBB, 0xFB, 0x18, - 0x66, 0xE2, 0xE2, 0xBF, 0x6E, 0x70, 0xA5, 0x63, 0x22, 0x1B, 0x62, 0x7B, 0x71, 0x7D, 0xE6, 0xB1 }, - }, - { - { 0x79, 0x8F, 0x83, 0xB1, 0xC4, 0xC6, 0x5C, 0x4D, 0x5D, 0xEA, 0x13, 0x03, 0x53, 0x53, 0xD8, 0xED, - 0xE5, 0xD7, 0x1D, 0x99, 0x47, 0xF4, 0x34, 0xFD, 0xEA, 0x0D, 0xBC, 0x1E, 0xC8, 0x2F, 0x45, 0x35 }, - }, - { - { 0x79, 0x94, 0x68, 0xFC, 0x28, 0x7D, 0x4F, 0x78, 0x13, 0xBD, 0xC1, 0x53, 0xF2, 0x8F, 0x77, 0x91, - 0x24, 0xCB, 0x79, 0xAE, 0xC9, 0x35, 0xB2, 0x2C, 0x7A, 0x6A, 0xAC, 0xB9, 0x8D, 0xD5, 0x14, 0x0C }, - }, - { - { 0x79, 0xA8, 0xFC, 0x72, 0x70, 0xB2, 0xE5, 0xF3, 0x35, 0x6B, 0x09, 0xC6, 0xB8, 0x64, 0xFC, 0x92, - 0xE5, 0xFB, 0xC9, 0xE6, 0x9B, 0xEC, 0x93, 0xA4, 0xE3, 0x3B, 0x8D, 0xF5, 0x75, 0x60, 0x17, 0xBE }, - }, - { - { 0x79, 0xBE, 0x4E, 0x3A, 0x42, 0x2B, 0x14, 0x29, 0x92, 0xEA, 0x5B, 0xAB, 0xFC, 0x3A, 0xAD, 0x5F, - 0x31, 0xDB, 0x1C, 0x40, 0xEF, 0x82, 0x9A, 0x38, 0x03, 0xF7, 0xF5, 0xCF, 0xEF, 0xEF, 0xD1, 0x60 }, - }, - { - { 0x7A, 0x1E, 0x5E, 0xA4, 0xE9, 0x74, 0xEB, 0x10, 0x8A, 0xDA, 0x2D, 0xDF, 0xBD, 0x06, 0x8A, 0xC3, - 0x5D, 0x0F, 0x9D, 0xFA, 0xE6, 0x70, 0xF3, 0xE3, 0x95, 0xD4, 0x03, 0x7C, 0x3F, 0x8C, 0x4D, 0xD0 }, - }, - { - { 0x7A, 0x31, 0xB7, 0x14, 0x7A, 0x27, 0x75, 0x33, 0x8B, 0xFA, 0x3D, 0x0B, 0xBB, 0x68, 0x56, 0x33, - 0xFE, 0xB8, 0x5E, 0x2A, 0xF9, 0x4D, 0x71, 0xBF, 0x2B, 0x64, 0x0B, 0xE1, 0xE7, 0x1C, 0xE8, 0x34 }, - }, - { - { 0x7A, 0x33, 0x5D, 0x4D, 0xB3, 0x54, 0x8B, 0xA0, 0xA4, 0x73, 0x79, 0x7D, 0x3A, 0x5B, 0xE2, 0x58, - 0x4B, 0x42, 0x55, 0x83, 0xAD, 0x6F, 0x28, 0x69, 0xD4, 0x79, 0xB9, 0x72, 0xBD, 0x0F, 0x53, 0xCA }, - }, - { - { 0x7A, 0x42, 0xD5, 0x7B, 0x05, 0x32, 0x4E, 0x85, 0x83, 0x55, 0x05, 0x58, 0x26, 0xB1, 0x55, 0x17, - 0x42, 0x5B, 0x5A, 0x18, 0x9C, 0x17, 0xB4, 0x7C, 0x18, 0x4C, 0xAC, 0xE7, 0xAC, 0x63, 0x18, 0xD0 }, - }, - { - { 0x7A, 0x4C, 0x08, 0x9A, 0x75, 0xD1, 0x85, 0x93, 0x3C, 0xA0, 0xB8, 0x24, 0xB3, 0x86, 0x08, 0xE2, - 0x6F, 0x2D, 0xF0, 0x15, 0x01, 0x62, 0x26, 0xD2, 0x15, 0x8A, 0x7B, 0x3B, 0x82, 0x02, 0x9A, 0x05 }, - }, - { - { 0x7A, 0x5B, 0x68, 0x1E, 0x54, 0x45, 0x1D, 0xCB, 0x0A, 0xA6, 0x0D, 0x9F, 0x02, 0xFD, 0x13, 0x7F, - 0xA5, 0xC1, 0x9E, 0x2B, 0xF7, 0x30, 0xC8, 0x9F, 0x36, 0xC9, 0x1C, 0xC6, 0xE7, 0x8C, 0xC6, 0xFB }, - }, - { - { 0x7B, 0x2C, 0x84, 0x1F, 0x5A, 0x96, 0x35, 0x28, 0xC8, 0x79, 0x9F, 0x4B, 0x71, 0x48, 0xF9, 0xF2, - 0xA5, 0x05, 0x15, 0x76, 0x06, 0x9D, 0xEF, 0xD9, 0xF6, 0xC0, 0xCA, 0x31, 0x3D, 0xF2, 0xDB, 0x99 }, - }, - { - { 0x7B, 0x78, 0xBF, 0x4D, 0x71, 0x4E, 0xDF, 0xD5, 0xCE, 0x84, 0xA3, 0x86, 0x6D, 0xDF, 0x14, 0x82, - 0x36, 0xBD, 0x80, 0xFC, 0xCA, 0x6B, 0x9E, 0xF2, 0x6D, 0xC5, 0xB0, 0xDF, 0x9F, 0xE3, 0xE2, 0x0F }, - }, - { - { 0x7B, 0x8D, 0xD4, 0xFC, 0x3F, 0xC9, 0xA9, 0x00, 0x77, 0x96, 0x0E, 0x15, 0x32, 0x2F, 0x9C, 0xD2, - 0x29, 0x8C, 0xF2, 0xED, 0x16, 0xC0, 0xDD, 0x3D, 0xDA, 0xB2, 0x3E, 0xDD, 0xBF, 0x4E, 0x28, 0xC0 }, - }, - { - { 0x7B, 0x93, 0xA8, 0x76, 0x2E, 0x89, 0x97, 0x0B, 0xFB, 0x19, 0xEC, 0x06, 0xE9, 0x39, 0x1E, 0x87, - 0x48, 0xB1, 0x69, 0x95, 0x1A, 0x8D, 0xA9, 0x86, 0x8F, 0x07, 0xEC, 0x68, 0xD0, 0x6A, 0x57, 0x34 }, - }, - { - { 0x7B, 0xFE, 0x47, 0xAE, 0xBA, 0x8B, 0x0A, 0x3A, 0x94, 0x5A, 0x88, 0xD8, 0xEF, 0x18, 0x91, 0xC9, - 0x89, 0x97, 0x8A, 0xBF, 0x12, 0x2E, 0xC5, 0xE0, 0x51, 0x4B, 0xE3, 0x6C, 0x3A, 0x7F, 0x22, 0x9B }, - }, - { - { 0x7C, 0x30, 0xFF, 0x35, 0xE7, 0x8A, 0xBA, 0x08, 0xF8, 0xA9, 0xB4, 0xD9, 0x8E, 0xA2, 0x9A, 0xE4, - 0xA5, 0xA4, 0x24, 0x72, 0xF5, 0x91, 0xCA, 0x11, 0xFB, 0x5E, 0x11, 0x21, 0x06, 0x28, 0x63, 0x96 }, - }, - { - { 0x7C, 0x63, 0xB8, 0x8E, 0x58, 0x19, 0x07, 0x0F, 0xC1, 0x4A, 0xDB, 0x67, 0xD6, 0xDA, 0xA1, 0x29, - 0x83, 0x14, 0x30, 0x4A, 0x9C, 0x05, 0x30, 0x18, 0x02, 0x7D, 0xF8, 0x36, 0x91, 0x4D, 0x73, 0xD4 }, - }, - { - { 0x7C, 0xA0, 0x86, 0x8B, 0xEB, 0xAE, 0x8A, 0xCA, 0x9D, 0x0F, 0x75, 0x38, 0x65, 0xC3, 0x2A, 0x0D, - 0x2D, 0xD4, 0xF1, 0x48, 0x6E, 0x37, 0x34, 0xA6, 0xA3, 0x71, 0x0E, 0xCC, 0x3E, 0x57, 0xF9, 0xED }, - }, - { - { 0x7C, 0xF9, 0x2F, 0x75, 0xBB, 0xE7, 0xA1, 0x4D, 0x86, 0x93, 0xF9, 0x93, 0xC3, 0xD1, 0xA6, 0x08, - 0xDB, 0xE0, 0xD1, 0x8F, 0x80, 0x8E, 0x21, 0x2D, 0xC8, 0xE1, 0xF5, 0xDA, 0x58, 0x04, 0xB3, 0x07 }, - }, - { - { 0x7D, 0x0D, 0x63, 0xAC, 0x53, 0x9B, 0xB6, 0xC1, 0x0F, 0x2C, 0xAC, 0x34, 0xC4, 0xE8, 0x08, 0xC5, - 0x23, 0xCB, 0x5F, 0xE2, 0x79, 0x44, 0xF3, 0xD1, 0x58, 0x84, 0x95, 0xCC, 0xB3, 0xFC, 0xF8, 0xE0 }, - }, - { - { 0x7D, 0x20, 0xC7, 0xA9, 0x27, 0x26, 0x2B, 0xE7, 0x38, 0xD2, 0x58, 0xD0, 0xFD, 0x97, 0x6E, 0x9A, - 0xF3, 0x6E, 0xF7, 0x99, 0x5F, 0x05, 0xE2, 0x87, 0x6A, 0x29, 0xAE, 0xBC, 0x3A, 0x24, 0xAA, 0xCE }, - }, - { - { 0x7D, 0x27, 0x04, 0xF3, 0x8E, 0x5D, 0x3F, 0x86, 0x0E, 0x58, 0xE9, 0x5F, 0xBD, 0x13, 0x57, 0x37, - 0xE6, 0x29, 0xE3, 0xF5, 0x3C, 0x07, 0xE2, 0x11, 0xBF, 0x48, 0x33, 0x86, 0x0C, 0xA5, 0x40, 0xC3 }, - }, - { - { 0x7D, 0x2D, 0x31, 0x2B, 0xA8, 0x5E, 0x81, 0xC4, 0xC5, 0xF0, 0x4B, 0xCB, 0x48, 0x3F, 0xF8, 0xCB, - 0x62, 0xFA, 0xF8, 0x32, 0xBE, 0x9F, 0x1E, 0xA0, 0x95, 0x0A, 0x12, 0x6E, 0xA2, 0x52, 0xBC, 0xE6 }, - }, - { - { 0x7D, 0xB2, 0x70, 0xBC, 0xAC, 0xD6, 0x26, 0x5D, 0x05, 0x05, 0x60, 0x85, 0x24, 0xA9, 0x03, 0xF9, - 0x87, 0xC1, 0xC8, 0xC9, 0xEA, 0xF5, 0x1F, 0x66, 0x65, 0x5E, 0xB8, 0x36, 0xB5, 0x05, 0xA6, 0xDA }, - }, - { - { 0x7D, 0xF7, 0x1C, 0x35, 0x19, 0x78, 0x05, 0x7A, 0x4D, 0x30, 0x0E, 0x15, 0xAD, 0xB7, 0xCF, 0x28, - 0xF1, 0xA5, 0xBB, 0x76, 0x92, 0x9C, 0x58, 0xA2, 0x50, 0x25, 0x3C, 0x30, 0x48, 0xF2, 0x88, 0xDB }, - }, - { - { 0x7E, 0x2E, 0xDB, 0x9D, 0x38, 0xF9, 0x29, 0x3C, 0xDD, 0xD6, 0x03, 0xB1, 0x75, 0xC9, 0xB2, 0x05, - 0xAC, 0x0B, 0x55, 0x3A, 0x4B, 0xF5, 0xFB, 0x08, 0xC2, 0x46, 0xEC, 0xF9, 0xC8, 0x49, 0xDB, 0x28 }, - }, - { - { 0x7E, 0x70, 0x13, 0x07, 0x36, 0xAE, 0xD9, 0xBC, 0xD2, 0x18, 0x44, 0x96, 0x6D, 0x0D, 0x1E, 0x2F, - 0xBA, 0x58, 0xE7, 0xC3, 0x9E, 0xA1, 0x47, 0x76, 0x13, 0xF7, 0x9E, 0x0F, 0x60, 0x40, 0xB5, 0x44 }, - }, - { - { 0x7E, 0x8A, 0x44, 0x80, 0xAB, 0x99, 0xAB, 0x10, 0x36, 0x89, 0xF4, 0x6F, 0xC9, 0xB7, 0x9F, 0xA0, - 0xD9, 0xFD, 0xA4, 0x64, 0xAF, 0x96, 0xEC, 0x20, 0xCC, 0xE6, 0xA2, 0x5B, 0x9C, 0xF7, 0xDC, 0xD3 }, - }, - { - { 0x7F, 0x41, 0xA6, 0x10, 0x7E, 0x34, 0x2B, 0x5D, 0x73, 0x80, 0x8D, 0xB0, 0x2A, 0x86, 0x8B, 0xB0, - 0xA8, 0xCB, 0xDE, 0xA3, 0x6A, 0x70, 0x54, 0x54, 0xAA, 0x8D, 0x86, 0xC8, 0xDE, 0x5C, 0x40, 0x55 }, - }, - { - { 0x7F, 0x83, 0xAC, 0xEF, 0xC5, 0x22, 0xD2, 0xAC, 0x23, 0xB2, 0x22, 0x10, 0xAF, 0x23, 0xE2, 0x99, - 0xEB, 0x69, 0x9A, 0x32, 0x1C, 0xBF, 0xDC, 0x78, 0xE4, 0x3A, 0x8C, 0xCB, 0x8F, 0x08, 0x6A, 0x84 }, - }, - { - { 0x7F, 0x86, 0xD3, 0xAA, 0x7E, 0xA7, 0x5C, 0x18, 0x03, 0x9D, 0x6A, 0xF9, 0x9C, 0xEF, 0x75, 0x04, - 0xCE, 0x7B, 0x05, 0x05, 0x9B, 0xBF, 0xE7, 0x3F, 0xCD, 0xEC, 0xFC, 0x71, 0xB2, 0x53, 0x8D, 0x72 }, - }, - { - { 0x7F, 0x95, 0x9B, 0x06, 0x34, 0xDA, 0x94, 0xFA, 0xCA, 0xDA, 0xB0, 0x21, 0xCF, 0x94, 0x20, 0x78, - 0x16, 0x00, 0x36, 0x13, 0xEF, 0x09, 0xEB, 0x54, 0xF6, 0x48, 0x60, 0x50, 0x08, 0x19, 0x02, 0x75 }, - }, - { - { 0x7F, 0x9A, 0x69, 0xCF, 0xA2, 0xF5, 0x0C, 0x13, 0xE1, 0xB7, 0x11, 0xDD, 0x6B, 0x14, 0x69, 0x2B, - 0xDB, 0x77, 0xD9, 0xFF, 0xD8, 0xC1, 0x10, 0xAE, 0x5D, 0x05, 0xA4, 0xCB, 0x73, 0x12, 0x37, 0x48 }, - }, - { - { 0x7F, 0xDD, 0xAE, 0x79, 0x7D, 0xA7, 0x9C, 0x9F, 0xA8, 0xD6, 0x9C, 0x15, 0x79, 0x31, 0x69, 0x22, - 0x13, 0x64, 0xEA, 0x95, 0xE7, 0xC1, 0xB2, 0x39, 0x71, 0x32, 0x3D, 0xB1, 0xB0, 0x88, 0xDE, 0x9C }, - }, - { - { 0x7F, 0xE5, 0x74, 0x9C, 0xA3, 0xF3, 0xDB, 0x71, 0xD5, 0xC7, 0x40, 0xD9, 0x75, 0x87, 0x16, 0x3D, - 0x21, 0x1E, 0xFF, 0xAF, 0x79, 0x40, 0xDA, 0x62, 0xA6, 0xAA, 0x07, 0xEC, 0x64, 0xBD, 0xFB, 0x2D }, - }, - { - { 0x80, 0x20, 0x56, 0xE1, 0xDB, 0x9D, 0x9B, 0x73, 0x21, 0xD1, 0xFF, 0xBB, 0xE1, 0x2F, 0x5C, 0xBE, - 0xDE, 0xC3, 0x6D, 0x0B, 0x5E, 0xC2, 0xA4, 0xE1, 0x8D, 0x99, 0x54, 0x36, 0x4C, 0xEC, 0x81, 0x29 }, - }, - { - { 0x80, 0x47, 0x74, 0x1D, 0x79, 0x7E, 0xB4, 0xED, 0x49, 0xE5, 0x1E, 0xD6, 0x77, 0x45, 0xA4, 0xE4, - 0xEE, 0x90, 0x23, 0xC4, 0x37, 0xAE, 0x53, 0x23, 0xCB, 0xEE, 0x97, 0x05, 0xEF, 0x9C, 0x4C, 0xD6 }, - }, - { - { 0x80, 0x58, 0x7F, 0x37, 0x5E, 0xA1, 0x5D, 0x52, 0x19, 0x26, 0xD7, 0x0B, 0x35, 0x26, 0xC0, 0x80, - 0xF4, 0x8C, 0x05, 0x6E, 0x9B, 0x13, 0x40, 0xCB, 0xBA, 0x1F, 0x9E, 0x11, 0xBB, 0xE8, 0x78, 0x96 }, - }, - { - { 0x80, 0x97, 0x63, 0x4C, 0xE3, 0x3D, 0x41, 0x53, 0x3D, 0x41, 0x5D, 0xAF, 0xDB, 0x8B, 0xA1, 0x91, - 0xC0, 0x30, 0x52, 0xAC, 0x8B, 0xAA, 0x25, 0x54, 0x34, 0x77, 0x3A, 0x16, 0x4B, 0x91, 0x1D, 0x6E }, - }, - { - { 0x80, 0xD0, 0x17, 0x09, 0x34, 0xD2, 0x2A, 0xEA, 0x73, 0x3F, 0x11, 0x5E, 0x52, 0x42, 0xC6, 0xB8, - 0x6D, 0x7F, 0xCF, 0xB4, 0x90, 0x4E, 0x65, 0xB7, 0xB7, 0xB9, 0x07, 0xF2, 0xCA, 0x94, 0xED, 0x71 }, - }, - { - { 0x80, 0xDC, 0xF7, 0x3D, 0xE4, 0x85, 0x8B, 0xDC, 0x49, 0x33, 0x9C, 0x62, 0xA6, 0xB6, 0x96, 0x93, - 0x31, 0x10, 0x03, 0x6E, 0x4F, 0x9E, 0xFD, 0x83, 0x4F, 0x22, 0xA7, 0xB6, 0x62, 0xF9, 0x5C, 0x6A }, - }, - { - { 0x80, 0xE7, 0x3A, 0x40, 0x88, 0xF2, 0x8A, 0x18, 0x67, 0xD5, 0x5D, 0xA9, 0x87, 0x67, 0xEF, 0x22, - 0xA5, 0xAE, 0xE8, 0xF4, 0x45, 0x0B, 0x61, 0x1B, 0x4B, 0x32, 0x78, 0xEF, 0x25, 0x87, 0xB6, 0x6B }, - }, - { - { 0x80, 0xF3, 0xEB, 0x58, 0xEA, 0x6A, 0xA2, 0x85, 0x11, 0xB0, 0x9B, 0x68, 0xF2, 0xDE, 0xF9, 0xB4, - 0xAF, 0xA9, 0x9C, 0x97, 0x44, 0xC0, 0xBE, 0x4E, 0x23, 0x94, 0x89, 0xF0, 0x4F, 0x75, 0xA3, 0xA5 }, - }, - { - { 0x80, 0xF6, 0xC1, 0xE5, 0x6A, 0xEC, 0x30, 0x64, 0x72, 0x50, 0x23, 0x05, 0x61, 0x06, 0x61, 0xF9, - 0x8A, 0x00, 0xA5, 0xAD, 0x10, 0x33, 0x1D, 0x57, 0xBE, 0xF0, 0xD9, 0x7F, 0x32, 0x2A, 0xD8, 0x48 }, - }, - { - { 0x81, 0x1D, 0xF2, 0xF4, 0x73, 0x6F, 0x85, 0x62, 0xE2, 0x02, 0xFD, 0x00, 0x75, 0x32, 0xF1, 0xDE, - 0x40, 0x17, 0x86, 0x1E, 0xFA, 0xBE, 0x67, 0x34, 0x20, 0xC2, 0x7F, 0x2E, 0x2A, 0x33, 0xFA, 0xC1 }, - }, - { - { 0x81, 0x1E, 0x37, 0x86, 0x37, 0xB1, 0xD2, 0xCB, 0xB1, 0x89, 0xAF, 0xD6, 0x74, 0x95, 0xFE, 0x8A, - 0xB9, 0xD8, 0x3A, 0x74, 0x2E, 0x35, 0x8C, 0xBB, 0xDB, 0xD1, 0x54, 0x98, 0xBF, 0x9C, 0x7B, 0x56 }, - }, - { - { 0x81, 0x21, 0x5F, 0x4C, 0x05, 0x58, 0x6C, 0x90, 0x8B, 0xA6, 0x65, 0x15, 0xD6, 0xA2, 0x64, 0x81, - 0xED, 0xDC, 0xD9, 0x89, 0x44, 0xAC, 0x01, 0x98, 0x40, 0xE9, 0xE3, 0x32, 0x2E, 0x35, 0x8D, 0xD2 }, - }, - { - { 0x81, 0xA0, 0xF1, 0xD0, 0x29, 0x46, 0x8E, 0xE8, 0x66, 0x36, 0x4A, 0x19, 0x8A, 0x26, 0x08, 0x58, - 0x30, 0xC2, 0xA4, 0x16, 0xE4, 0x9E, 0x22, 0x4C, 0xE8, 0x09, 0x66, 0xFC, 0xC4, 0x99, 0xD6, 0x36 }, - }, - { - { 0x81, 0xA9, 0x15, 0x6B, 0x26, 0x47, 0xCA, 0xFA, 0x38, 0xB2, 0xE3, 0x15, 0x1A, 0x5A, 0x5D, 0x17, - 0xDB, 0xED, 0x81, 0xE9, 0x07, 0x54, 0xD1, 0xE8, 0x25, 0xF0, 0xBF, 0xC9, 0x13, 0x7C, 0x8B, 0xBF }, - }, - { - { 0x81, 0xD4, 0xB0, 0x8A, 0xCD, 0x90, 0xF2, 0xDE, 0xE1, 0x8A, 0xC4, 0x20, 0xF5, 0x1D, 0xA9, 0x91, - 0x05, 0x35, 0x82, 0x47, 0xBB, 0x03, 0x87, 0xCF, 0xA9, 0x4D, 0xD9, 0x67, 0xA9, 0xCC, 0x18, 0x68 }, - }, - { - { 0x81, 0xEE, 0x8C, 0x58, 0x6E, 0xC3, 0xE4, 0x77, 0xC8, 0x1E, 0xF4, 0x44, 0xDF, 0x09, 0x5A, 0xE0, - 0x99, 0xD8, 0x06, 0x9B, 0x89, 0xFF, 0xB1, 0xD0, 0x8F, 0xAD, 0x75, 0x3E, 0xE4, 0xE9, 0x4F, 0x71 }, - }, - { - { 0x82, 0x2E, 0xBE, 0x7B, 0x2E, 0x8A, 0xF1, 0x78, 0x8A, 0x36, 0x08, 0x83, 0x84, 0xF4, 0xC0, 0x6A, - 0x6D, 0x65, 0x9D, 0x95, 0x56, 0x83, 0xF0, 0x99, 0xE2, 0x54, 0x2D, 0x97, 0x58, 0xE1, 0xA6, 0x21 }, - }, - { - { 0x82, 0x33, 0xDE, 0x42, 0x18, 0xE4, 0xEF, 0x19, 0x38, 0xE6, 0xA8, 0xA3, 0x8A, 0xB0, 0xBC, 0x1A, - 0x96, 0x4B, 0xA5, 0x76, 0x1A, 0x52, 0x99, 0x50, 0x22, 0x15, 0x0C, 0x86, 0x02, 0x6B, 0x90, 0xC9 }, - }, - { - { 0x82, 0x42, 0x7C, 0x6E, 0xF1, 0x1E, 0xCE, 0x3B, 0x94, 0x0B, 0xE6, 0xB3, 0x93, 0x62, 0x2F, 0xC9, - 0x51, 0x7D, 0xBC, 0xE1, 0xC0, 0x0C, 0xF9, 0x18, 0x50, 0x89, 0x64, 0x43, 0xF5, 0x38, 0x2F, 0x89 }, - }, - { - { 0x82, 0x4E, 0xF3, 0x18, 0x7F, 0x9C, 0xFE, 0x14, 0x27, 0x10, 0x13, 0xBC, 0xFB, 0x85, 0xE1, 0x4B, - 0x5A, 0x8E, 0x0D, 0x72, 0x1C, 0x3F, 0x53, 0x6E, 0x0F, 0xDD, 0xFF, 0x42, 0x4D, 0x1F, 0xA0, 0xD8 }, - }, - { - { 0x82, 0x56, 0x8B, 0x3B, 0xB3, 0xC6, 0x55, 0xD7, 0xF2, 0x2D, 0x8C, 0x97, 0xA5, 0x66, 0x9C, 0xC8, - 0x34, 0xA2, 0xDD, 0x7C, 0xDA, 0xE7, 0x5A, 0x26, 0x45, 0x59, 0x55, 0x16, 0x46, 0x55, 0x8E, 0x14 }, - }, - { - { 0x82, 0x7C, 0x8C, 0x80, 0x11, 0x1F, 0xF2, 0x21, 0xC3, 0xEB, 0x1E, 0xF5, 0xC0, 0xD5, 0xD4, 0x34, - 0x48, 0x31, 0x86, 0xE2, 0x09, 0x00, 0x75, 0x63, 0x15, 0x8E, 0x9E, 0x76, 0xD2, 0x79, 0x0F, 0x1C }, - }, - { - { 0x82, 0x92, 0x67, 0xC5, 0xAD, 0x70, 0xE5, 0x45, 0x18, 0x02, 0x3A, 0xB7, 0x85, 0xFA, 0x3C, 0xDE, - 0xD6, 0x6F, 0x42, 0x5D, 0xE1, 0xF3, 0x2F, 0xCD, 0x72, 0x1B, 0x49, 0x46, 0x3A, 0x5A, 0x5F, 0x5B }, - }, - { - { 0x82, 0xAF, 0x5C, 0xB6, 0xAD, 0x08, 0x2A, 0xDA, 0x2C, 0x25, 0x2F, 0x74, 0x96, 0x7B, 0xED, 0x01, - 0xAB, 0xA0, 0x87, 0x88, 0x42, 0x02, 0xD4, 0x5D, 0xD4, 0x80, 0xFB, 0x1C, 0x3D, 0x1C, 0x0C, 0x63 }, - }, - { - { 0x82, 0xB1, 0xDD, 0x9C, 0x01, 0xE8, 0xCD, 0x57, 0xDD, 0xA5, 0x1C, 0xCC, 0x29, 0x0B, 0x32, 0xE2, - 0xBB, 0xFD, 0x08, 0x8C, 0x2B, 0xDF, 0x75, 0x46, 0xA8, 0x9C, 0x60, 0x99, 0x78, 0xC8, 0x1B, 0xC2 }, - }, - { - { 0x82, 0xC0, 0x7B, 0x94, 0x4B, 0xBA, 0xC1, 0xB2, 0x95, 0xE2, 0x5F, 0x91, 0xA5, 0xFB, 0x0F, 0x2A, - 0xFC, 0xBA, 0x7E, 0x09, 0xB2, 0x17, 0x27, 0xEE, 0xD8, 0x13, 0x0C, 0xDE, 0x8F, 0x08, 0x0F, 0xCA }, - }, - { - { 0x82, 0xD1, 0x9B, 0xD8, 0x0A, 0x88, 0x6B, 0x28, 0x61, 0xC3, 0x09, 0x97, 0x4C, 0x1C, 0x99, 0x3D, - 0xBE, 0xC3, 0x7E, 0x30, 0x85, 0xC1, 0x47, 0xC4, 0x1F, 0x23, 0xD9, 0xF1, 0x20, 0xD8, 0x9B, 0x68 }, - }, - { - { 0x82, 0xE1, 0xBD, 0xB3, 0xDC, 0x4F, 0x02, 0x36, 0x3A, 0x79, 0x6B, 0x60, 0xA8, 0x8E, 0x4E, 0x71, - 0xBD, 0x33, 0xB0, 0xBE, 0x4C, 0xC5, 0xB8, 0x33, 0x25, 0x2B, 0x83, 0x27, 0xB8, 0x0B, 0xD7, 0xE2 }, - }, - { - { 0x83, 0x23, 0xBD, 0x61, 0x09, 0xFD, 0x94, 0xD5, 0x5F, 0x57, 0xA9, 0x60, 0x42, 0xA2, 0x16, 0xD8, - 0x6A, 0x04, 0xEC, 0xDB, 0x65, 0x7C, 0xEF, 0xEE, 0x62, 0x8C, 0x35, 0xF2, 0x1F, 0x29, 0x4A, 0x68 }, - }, - { - { 0x83, 0x25, 0x41, 0x78, 0xAE, 0x2C, 0x8B, 0xAA, 0x1A, 0xCB, 0xB9, 0x99, 0x82, 0x63, 0x8C, 0x79, - 0x9B, 0x9B, 0x37, 0x9D, 0xA4, 0xD0, 0x2B, 0x28, 0x91, 0x86, 0x20, 0xE2, 0xF1, 0xD8, 0x35, 0xC5 }, - }, - { - { 0x83, 0x34, 0xEA, 0xB8, 0x1C, 0x60, 0x4E, 0x99, 0xD5, 0x40, 0x51, 0x3E, 0xF2, 0xE3, 0x7A, 0xBA, - 0x71, 0x4F, 0x07, 0xB2, 0xBA, 0x01, 0x0A, 0xD7, 0x1D, 0xC4, 0xE1, 0x1A, 0x92, 0x18, 0xC1, 0x8C }, - }, - { - { 0x83, 0x54, 0x7A, 0xCA, 0x3C, 0xED, 0x73, 0xDF, 0x99, 0x14, 0xF3, 0x15, 0x60, 0x74, 0x63, 0x79, - 0x29, 0x4C, 0x76, 0x0E, 0xF9, 0xA8, 0xB7, 0x6E, 0x00, 0x06, 0x46, 0xC7, 0x39, 0x07, 0x21, 0x65 }, - }, - { - { 0x83, 0x89, 0xC8, 0x79, 0xB6, 0x3B, 0x82, 0x9D, 0x2D, 0x39, 0xA8, 0xCF, 0xB7, 0x87, 0xE7, 0x72, - 0x77, 0xD5, 0xCF, 0xA3, 0xE3, 0x6F, 0xDA, 0xCB, 0xAB, 0x4D, 0x18, 0xB2, 0xB0, 0x4E, 0x32, 0x94 }, - }, - { - { 0x83, 0xF8, 0x00, 0xB3, 0xE5, 0x28, 0x52, 0xDE, 0xBC, 0xC5, 0x04, 0xC2, 0x5B, 0x63, 0x58, 0x34, - 0x30, 0x7B, 0x14, 0x5E, 0x38, 0x87, 0x50, 0xAA, 0xC1, 0x63, 0x90, 0x9D, 0x30, 0x4B, 0xE3, 0xD2 }, - }, - { - { 0x84, 0x23, 0xB3, 0xF1, 0xCC, 0x85, 0x2B, 0x49, 0xCF, 0x81, 0xB7, 0xD5, 0xFF, 0x51, 0xA7, 0xA5, - 0x6A, 0x84, 0x78, 0x3A, 0x2D, 0xF7, 0x43, 0x61, 0xFF, 0x2E, 0xEE, 0x0F, 0x92, 0x12, 0xC1, 0x59 }, - }, - { - { 0x84, 0x26, 0xBC, 0x06, 0xDB, 0xB5, 0x18, 0x71, 0x34, 0x66, 0xC7, 0x6A, 0xEA, 0x52, 0x1B, 0xCE, - 0x39, 0xD3, 0x91, 0xA8, 0x89, 0xCB, 0xBA, 0x9B, 0x7B, 0x72, 0xDC, 0xDA, 0x89, 0xF3, 0x46, 0x55 }, - }, - { - { 0x84, 0x3D, 0x84, 0x33, 0x2B, 0x42, 0xAB, 0xBA, 0xB3, 0x71, 0xC9, 0xD9, 0xEF, 0xEC, 0xEB, 0x34, - 0x21, 0x8B, 0x72, 0xF5, 0xD8, 0x79, 0x29, 0xE2, 0xE5, 0x6C, 0xA2, 0xFD, 0x0A, 0x60, 0x41, 0xB6 }, - }, - { - { 0x84, 0x7B, 0x5F, 0x1E, 0xEB, 0x2A, 0x44, 0x13, 0xC8, 0xFA, 0x37, 0x98, 0x21, 0x97, 0x37, 0xE1, - 0x92, 0xBA, 0x72, 0x72, 0xA1, 0x08, 0xB7, 0x17, 0x28, 0xA8, 0xD1, 0x65, 0x17, 0xF6, 0x1E, 0x9D }, - }, - { - { 0x84, 0x88, 0x61, 0x71, 0x6D, 0x7A, 0xD3, 0xF9, 0x6F, 0xFF, 0x73, 0xF8, 0x2E, 0x6C, 0x75, 0x7C, - 0x43, 0x35, 0xAE, 0x5D, 0x3A, 0x1F, 0x52, 0xC4, 0xB6, 0x24, 0x08, 0xDB, 0x51, 0xDF, 0x9E, 0xB2 }, - }, - { - { 0x85, 0x04, 0x81, 0x97, 0xF0, 0x2B, 0xF1, 0xA0, 0x38, 0x81, 0x27, 0xE3, 0x2B, 0x5F, 0x0A, 0xD5, - 0xBC, 0xD9, 0x39, 0x89, 0x14, 0x1E, 0x2C, 0xF3, 0x2B, 0x04, 0x6F, 0x19, 0x01, 0x50, 0x59, 0xC8 }, - }, - { - { 0x85, 0x09, 0xCC, 0xB8, 0x81, 0xDB, 0x1D, 0x96, 0x1D, 0xD9, 0xA0, 0x6C, 0xE9, 0x8A, 0xA6, 0x2F, - 0x19, 0xC9, 0x5F, 0x3C, 0x2A, 0xC3, 0x60, 0x2E, 0x0C, 0xD3, 0xC6, 0xC3, 0x8E, 0x68, 0x6E, 0xD4 }, - }, - { - { 0x85, 0x31, 0xB2, 0xBF, 0xC5, 0x45, 0x79, 0xE8, 0xF1, 0x8F, 0x27, 0xB2, 0xE6, 0xEC, 0xC0, 0xF8, - 0x90, 0x64, 0xEE, 0x86, 0x87, 0x0E, 0xCC, 0x8B, 0xBE, 0x0C, 0xE6, 0x86, 0xEC, 0xDA, 0x2C, 0x17 }, - }, - { - { 0x85, 0x76, 0x0F, 0x59, 0x51, 0x90, 0xE9, 0xB4, 0x67, 0x8B, 0xBF, 0x44, 0xEF, 0xB5, 0xCF, 0x8F, - 0x6B, 0x19, 0x37, 0xA9, 0xB8, 0x6B, 0x31, 0xB7, 0x51, 0xBE, 0xCF, 0x72, 0x18, 0x03, 0xB0, 0x1C }, - }, - { - { 0x85, 0xF0, 0x79, 0x36, 0xB4, 0x29, 0x1F, 0x36, 0xD9, 0xB7, 0x5F, 0x42, 0xE8, 0xB7, 0xEE, 0x8A, - 0x64, 0xE6, 0x32, 0xA1, 0x18, 0x11, 0x65, 0xFE, 0x72, 0xB4, 0x88, 0x23, 0xC3, 0xD9, 0x9D, 0x9D }, - }, - { - { 0x86, 0x12, 0x9F, 0xE7, 0x61, 0x99, 0x4D, 0x7B, 0x64, 0xE4, 0x02, 0x85, 0x8F, 0x88, 0xC5, 0x2B, - 0x3E, 0xB9, 0xC0, 0x71, 0xFF, 0xBE, 0x80, 0x02, 0x80, 0xAC, 0x8C, 0x0C, 0x6F, 0x79, 0xE7, 0xA6 }, - }, - { - { 0x86, 0x19, 0x6B, 0x0F, 0xD3, 0x0F, 0x8F, 0x57, 0x56, 0x98, 0xB5, 0xEE, 0xF2, 0x69, 0xD0, 0x69, - 0x2F, 0x88, 0xAD, 0xEA, 0xC4, 0x83, 0x6A, 0x62, 0x67, 0xAB, 0xC8, 0x36, 0x23, 0x34, 0x00, 0x86 }, - }, - { - { 0x86, 0xD1, 0x8B, 0xCD, 0xDE, 0x16, 0x45, 0x42, 0x48, 0x6E, 0x56, 0x44, 0x2C, 0xE1, 0xB8, 0x8B, - 0x1A, 0x10, 0x73, 0x7C, 0xBD, 0x5E, 0xA4, 0xAA, 0xB8, 0xD5, 0xB8, 0xAF, 0x51, 0xF5, 0x29, 0x09 }, - }, - { - { 0x87, 0x09, 0x8D, 0x69, 0x5D, 0xA4, 0xA2, 0x84, 0x8D, 0xD4, 0x18, 0xF2, 0xC6, 0x4A, 0xDF, 0x3B, - 0xD7, 0x11, 0x7C, 0x98, 0xE9, 0xB7, 0x2E, 0x0F, 0x46, 0xA3, 0x67, 0x80, 0x64, 0x5E, 0x4F, 0x80 }, - }, - { - { 0x87, 0xEB, 0xCB, 0xB0, 0x73, 0x7A, 0xE3, 0x27, 0xC6, 0xBE, 0x9D, 0x3F, 0xA2, 0xC7, 0x5D, 0x1E, - 0xEA, 0x0A, 0xE6, 0x6D, 0x20, 0xD3, 0x8A, 0xF6, 0xED, 0x76, 0xE6, 0xB1, 0x49, 0x9C, 0x83, 0x1F }, - }, - { - { 0x87, 0xEB, 0xCD, 0x34, 0x6C, 0xBF, 0xD5, 0x3E, 0x1A, 0x0E, 0x38, 0x25, 0x69, 0x69, 0x07, 0xE2, - 0x9F, 0x26, 0x9F, 0xEB, 0x06, 0x64, 0xA9, 0x42, 0x67, 0x78, 0xF5, 0x73, 0xC0, 0x68, 0xA6, 0x96 }, - }, - { - { 0x88, 0x51, 0x76, 0x78, 0x61, 0xC9, 0x72, 0x7D, 0x92, 0x77, 0x63, 0x62, 0x78, 0xFB, 0x94, 0x1B, - 0x88, 0x85, 0xD9, 0x99, 0x02, 0x48, 0xBF, 0x91, 0x45, 0x9E, 0x52, 0x7C, 0xE7, 0xF0, 0x6C, 0xF6 }, - }, - { - { 0x88, 0x76, 0x88, 0xDC, 0x6E, 0x9F, 0xE3, 0xDB, 0x05, 0x05, 0x7F, 0xC6, 0x38, 0xEB, 0x8B, 0x29, - 0x4C, 0x3D, 0x8E, 0x0A, 0xAE, 0x17, 0x51, 0xF7, 0x58, 0xF6, 0x36, 0x70, 0x37, 0x2E, 0x66, 0x6D }, - }, - { - { 0x88, 0x8D, 0x6D, 0x77, 0xD8, 0x1C, 0x62, 0x91, 0xCB, 0x84, 0xD9, 0xD6, 0x56, 0x27, 0x82, 0xFD, - 0x2E, 0xB3, 0x42, 0x5D, 0x49, 0x1E, 0x68, 0x74, 0x20, 0x28, 0x4B, 0x76, 0xA1, 0xDE, 0xBF, 0xAB }, - }, - { - { 0x88, 0xB0, 0x25, 0x04, 0x88, 0x31, 0x94, 0xB9, 0x9F, 0xD1, 0xB8, 0x1D, 0x5D, 0x5D, 0xC4, 0x99, - 0xD3, 0x97, 0x65, 0x62, 0x1F, 0x7F, 0x43, 0x0C, 0x73, 0x46, 0xA7, 0x7B, 0x23, 0x39, 0x43, 0x82 }, - }, - { - { 0x89, 0x76, 0xB5, 0x94, 0xAC, 0xDD, 0xC1, 0xB2, 0xAB, 0xD7, 0x5F, 0xA1, 0xA1, 0xEA, 0x24, 0x59, - 0x92, 0x9A, 0x7E, 0x81, 0x4C, 0x9E, 0xE3, 0xF7, 0xBA, 0x21, 0xB3, 0x80, 0x82, 0x88, 0xBE, 0xBB }, - }, - { - { 0x89, 0xAF, 0x0E, 0x54, 0xC7, 0x62, 0x77, 0x86, 0x93, 0x52, 0x9D, 0x0A, 0x95, 0x0B, 0x78, 0x33, - 0xF5, 0xEA, 0xBA, 0xF3, 0x42, 0x79, 0x72, 0x60, 0x7F, 0xB2, 0xC7, 0x0C, 0x96, 0xA3, 0x21, 0x61 }, - }, - { - { 0x89, 0xB6, 0xA4, 0x32, 0x03, 0xD5, 0x82, 0x55, 0xD9, 0x1C, 0xC4, 0x67, 0x25, 0x4B, 0x85, 0x2F, - 0xE6, 0x43, 0x47, 0x38, 0x97, 0x44, 0x79, 0xCE, 0x21, 0x64, 0x0B, 0x7E, 0xC3, 0x5F, 0x24, 0xAC }, - }, - { - { 0x89, 0xCE, 0x0F, 0xE0, 0xE0, 0xB3, 0xE3, 0xAC, 0x38, 0x6E, 0x3A, 0xD6, 0x70, 0xF3, 0x45, 0x57, - 0xE4, 0x73, 0xB8, 0x01, 0xBC, 0x56, 0xE4, 0x1D, 0xBD, 0x91, 0xD7, 0x5A, 0xA1, 0x9A, 0x47, 0x31 }, - }, - { - { 0x89, 0xDA, 0xC7, 0x89, 0x6B, 0x46, 0xF2, 0xFC, 0x8B, 0xEA, 0x62, 0x11, 0xFF, 0x98, 0xB6, 0x1F, - 0xAA, 0x15, 0x7B, 0xA8, 0xC4, 0xAD, 0x6F, 0xD1, 0x75, 0x92, 0x75, 0xCE, 0x39, 0x41, 0xC3, 0x28 }, - }, - { - { 0x8A, 0x09, 0x85, 0xBF, 0x86, 0xE8, 0xC9, 0xB9, 0x17, 0xEC, 0x84, 0xDA, 0x2A, 0x56, 0x73, 0x1E, - 0x75, 0x2A, 0xA0, 0xDC, 0x52, 0x87, 0xC2, 0xBF, 0x39, 0x51, 0x0B, 0xB3, 0xF0, 0xF2, 0x0A, 0xD1 }, - }, - { - { 0x8A, 0x1A, 0xD8, 0x6B, 0xC0, 0x1D, 0x05, 0x9D, 0x53, 0xD7, 0x8D, 0xE1, 0x97, 0xAC, 0x42, 0x99, - 0x8F, 0xEE, 0x20, 0x88, 0x8A, 0xF0, 0xF2, 0x5F, 0x2F, 0x79, 0x7D, 0x62, 0x00, 0xAF, 0xF0, 0xBE }, - }, - { - { 0x8A, 0x59, 0x4E, 0xB2, 0xF8, 0x23, 0x64, 0x65, 0xF0, 0x91, 0x8A, 0xED, 0x99, 0xA7, 0x36, 0x48, - 0x2B, 0x80, 0xAF, 0xD3, 0xD3, 0x3E, 0x9F, 0x17, 0x46, 0x90, 0x8C, 0x21, 0x57, 0xCA, 0xD2, 0x89 }, - }, - { - { 0x8A, 0x74, 0xC4, 0x83, 0xDB, 0x8B, 0x72, 0xDC, 0x6A, 0x59, 0x80, 0xA4, 0x8E, 0x26, 0x2A, 0x5F, - 0x3B, 0x7D, 0xB2, 0xBF, 0xF7, 0xAE, 0xB2, 0xB9, 0xC7, 0xD7, 0x28, 0xF5, 0x4E, 0x55, 0xD6, 0xDD }, - }, - { - { 0x8A, 0xAF, 0x36, 0x3C, 0xC9, 0xD8, 0x44, 0x15, 0xA7, 0xEB, 0x0D, 0x72, 0xDA, 0x08, 0xB3, 0x58, - 0x80, 0x68, 0x55, 0x9C, 0xB0, 0xA9, 0xAE, 0x92, 0xB8, 0xF4, 0x60, 0x2E, 0xDA, 0x23, 0x82, 0xAA }, - }, - { - { 0x8A, 0xB2, 0x77, 0x62, 0xF4, 0xA2, 0xE3, 0x11, 0x22, 0x04, 0x96, 0x98, 0x39, 0x99, 0xC8, 0xC4, - 0x60, 0x96, 0x3D, 0xFC, 0x1B, 0x88, 0x51, 0x11, 0x1D, 0xA4, 0x1D, 0x3F, 0x3B, 0x0A, 0x6E, 0x94 }, - }, - { - { 0x8A, 0xB4, 0x2A, 0x77, 0xBE, 0x55, 0x99, 0xD7, 0x0E, 0x6F, 0xDB, 0xB7, 0x87, 0xE6, 0xA0, 0xFF, - 0x21, 0xC5, 0x09, 0x5F, 0x86, 0xE2, 0xD7, 0x62, 0x34, 0x0D, 0x3D, 0xDD, 0xCC, 0x75, 0x87, 0x0C }, - }, - { - { 0x8A, 0xC9, 0x1B, 0x83, 0x10, 0x9D, 0x39, 0x9C, 0xC2, 0xBC, 0x69, 0x98, 0x49, 0x03, 0x73, 0x37, - 0x9B, 0xDD, 0xE4, 0xDA, 0x04, 0xBA, 0x8B, 0xAA, 0x3B, 0x22, 0x5C, 0x37, 0xDD, 0x21, 0x3C, 0xD9 }, - }, - { - { 0x8A, 0xD1, 0xD5, 0x48, 0x95, 0x27, 0xB5, 0x28, 0xE5, 0xB5, 0xD6, 0xA5, 0x95, 0x78, 0x87, 0x08, - 0x88, 0x8A, 0x3F, 0xB1, 0x9F, 0x2C, 0x7C, 0x8B, 0x38, 0x07, 0x0E, 0x1F, 0x38, 0x98, 0x96, 0x8B }, - }, - { - { 0x8A, 0xDB, 0x49, 0xD4, 0x15, 0x53, 0x56, 0x70, 0x5B, 0x64, 0x42, 0x6A, 0x99, 0x0F, 0x58, 0xB3, - 0xA0, 0x71, 0xEF, 0x78, 0x2E, 0x6C, 0x09, 0x53, 0x07, 0xD7, 0x74, 0x74, 0xD5, 0xB5, 0x7A, 0x62 }, - }, - { - { 0x8B, 0x00, 0xC4, 0x18, 0xC1, 0x50, 0x94, 0x4B, 0x2B, 0x53, 0x2F, 0x5D, 0x87, 0x9F, 0x7D, 0x42, - 0xF8, 0xFE, 0x71, 0x1E, 0x77, 0x35, 0xC6, 0x5D, 0x3C, 0xA0, 0x68, 0x50, 0x74, 0xA2, 0xEA, 0x48 }, - }, - { - { 0x8B, 0x1B, 0x7C, 0x94, 0xB9, 0x94, 0x4F, 0x59, 0xA3, 0xDE, 0x10, 0x21, 0x3B, 0xF6, 0x2B, 0xDC, - 0x50, 0x15, 0x79, 0x0D, 0xDB, 0x18, 0x6F, 0x63, 0x18, 0x24, 0x1A, 0x01, 0x51, 0x51, 0x3C, 0xF6 }, - }, - { - { 0x8B, 0x3A, 0x10, 0x35, 0xC3, 0xFD, 0xF3, 0x45, 0xFB, 0x70, 0x80, 0x44, 0x83, 0xA5, 0x04, 0x49, - 0xA3, 0xD7, 0x60, 0xC6, 0xBA, 0x48, 0xF5, 0xB8, 0x2D, 0x6B, 0xB2, 0x62, 0xED, 0x9D, 0xE3, 0x73 }, - }, - { - { 0x8B, 0x3A, 0x75, 0xCB, 0xC3, 0x62, 0xD2, 0x35, 0x57, 0x0E, 0x5D, 0xE7, 0x04, 0x29, 0x38, 0x70, - 0x8A, 0x1B, 0x0F, 0xCE, 0xB4, 0x59, 0x86, 0x2A, 0x38, 0x67, 0xB7, 0x34, 0xCD, 0xCB, 0x97, 0x94 }, - }, - { - { 0x8B, 0x59, 0x74, 0x2D, 0xFF, 0xF2, 0xD5, 0xBF, 0x70, 0x92, 0x6D, 0x1F, 0xE8, 0x00, 0x7D, 0x35, - 0x57, 0x91, 0x63, 0xFA, 0x4E, 0xEE, 0x1D, 0x03, 0x38, 0xF4, 0x4E, 0xD8, 0xD9, 0xFB, 0x67, 0x28 }, - }, - { - { 0x8B, 0xBE, 0x23, 0x92, 0xCB, 0xCE, 0xEF, 0x09, 0x75, 0xC2, 0xF4, 0xAE, 0xA1, 0xC6, 0x5A, 0xFD, - 0x27, 0x53, 0x0C, 0x9B, 0x05, 0x67, 0x6E, 0x31, 0xA1, 0x17, 0xAF, 0x44, 0xDC, 0x0A, 0x26, 0x98 }, - }, - { - { 0x8B, 0xD6, 0x24, 0xA6, 0x83, 0x99, 0x17, 0xA1, 0x9B, 0x87, 0x13, 0x50, 0xE7, 0x88, 0x98, 0x0C, - 0xA8, 0xF4, 0x2B, 0xA0, 0x96, 0x64, 0x22, 0xE8, 0xB7, 0xDD, 0xB3, 0x75, 0xB4, 0xC3, 0x50, 0xD3 }, - }, - { - { 0x8C, 0x3E, 0x7C, 0x1D, 0xCC, 0x7D, 0xD8, 0xE7, 0xD8, 0xBF, 0x7B, 0x5B, 0x3A, 0xE5, 0xE0, 0x27, - 0x2E, 0x81, 0x1A, 0xB9, 0xF3, 0xC3, 0xC5, 0x38, 0xE5, 0x74, 0x71, 0x77, 0xE6, 0x2D, 0x62, 0x92 }, - }, - { - { 0x8C, 0x3F, 0x58, 0x3D, 0xA8, 0x5F, 0x57, 0x4D, 0xBA, 0x1F, 0xD1, 0xE2, 0x70, 0x28, 0xFF, 0x93, - 0x42, 0x32, 0x2E, 0xF9, 0x08, 0xBB, 0xFA, 0x8B, 0x66, 0x40, 0x65, 0x2C, 0x4A, 0x73, 0x93, 0x7E }, - }, - { - { 0x8C, 0x7C, 0x65, 0x7B, 0xDA, 0x13, 0xCA, 0x62, 0xF2, 0x9A, 0x65, 0xC6, 0xD5, 0x19, 0x3A, 0x93, - 0xCF, 0x6C, 0x58, 0x77, 0x18, 0xAD, 0xCA, 0x67, 0x15, 0x8E, 0x97, 0xD3, 0x6A, 0x62, 0x3E, 0xCA }, - }, - { - { 0x8C, 0xA6, 0x79, 0x62, 0xC4, 0xA8, 0x09, 0x13, 0x33, 0xF2, 0x4E, 0xFD, 0x60, 0xEE, 0x70, 0xCF, - 0xED, 0xDB, 0xD6, 0x41, 0x59, 0x04, 0x70, 0x9E, 0x78, 0x5C, 0x33, 0x1B, 0x1E, 0xF5, 0x8F, 0x8E }, - }, - { - { 0x8C, 0xB4, 0x26, 0x39, 0x8A, 0xD9, 0x7B, 0x04, 0x5D, 0x6A, 0xE9, 0x75, 0x3E, 0x4D, 0x48, 0xB1, - 0x79, 0x23, 0xB9, 0x36, 0x5A, 0x6B, 0x4B, 0x97, 0xC4, 0xEC, 0xAC, 0x4A, 0x4B, 0x37, 0x03, 0x4B }, - }, - { - { 0x8C, 0xCD, 0x79, 0x41, 0x63, 0x00, 0xCA, 0x61, 0xEE, 0x56, 0xA6, 0x0D, 0xA1, 0xC8, 0x09, 0x35, - 0xB8, 0x6E, 0x27, 0x91, 0x93, 0xAD, 0x3D, 0x05, 0x65, 0x72, 0x9D, 0x69, 0xE0, 0x8C, 0x86, 0x96 }, - }, - { - { 0x8C, 0xFA, 0x92, 0x51, 0xB4, 0xDA, 0xEF, 0x50, 0x81, 0x0D, 0x6E, 0x19, 0xF5, 0xF8, 0x8E, 0xA2, - 0xC6, 0x5D, 0xB7, 0xA2, 0xE8, 0xA5, 0x06, 0xF7, 0xDF, 0x99, 0x55, 0x81, 0x7D, 0xDD, 0xEB, 0xC8 }, - }, - { - { 0x8D, 0x44, 0xD4, 0x17, 0x60, 0x46, 0x06, 0x3E, 0x2E, 0xB3, 0xC7, 0x50, 0x38, 0x13, 0xBB, 0xBB, - 0xF6, 0xCA, 0x6D, 0x54, 0x3F, 0x40, 0xB3, 0x99, 0xCC, 0x43, 0xF1, 0x12, 0x4B, 0x28, 0xFB, 0x97 }, - }, - { - { 0x8D, 0x73, 0x19, 0x48, 0x17, 0xF0, 0x97, 0x86, 0x15, 0x84, 0x61, 0x36, 0xC9, 0x8A, 0x59, 0x01, - 0x72, 0x8A, 0xB7, 0xFE, 0x11, 0x92, 0xE4, 0xED, 0x6D, 0x59, 0xB1, 0xDA, 0x5A, 0x42, 0x7D, 0xDA }, - }, - { - { 0x8D, 0x74, 0xC0, 0xD6, 0x6B, 0xB2, 0xEE, 0xB2, 0x6B, 0x9A, 0x55, 0x74, 0x38, 0x5D, 0xA7, 0xB4, - 0x14, 0x0A, 0xF0, 0x70, 0x47, 0xD2, 0xFE, 0x64, 0x3D, 0x1D, 0x1A, 0xE5, 0xB1, 0x96, 0x90, 0x43 }, - }, - { - { 0x8D, 0x85, 0xDA, 0x44, 0x6F, 0x5C, 0x79, 0x54, 0xBD, 0xF7, 0x6C, 0x09, 0x0C, 0xD2, 0x46, 0x68, - 0xFF, 0x23, 0x3C, 0xCD, 0xF6, 0x6B, 0x94, 0xDA, 0xD9, 0x92, 0x98, 0xEB, 0xCB, 0x16, 0x8D, 0xC5 }, - }, - { - { 0x8D, 0x8A, 0xD7, 0xC2, 0x60, 0x58, 0x16, 0xDD, 0x44, 0xB4, 0x29, 0x77, 0x9E, 0xD3, 0x62, 0xB9, - 0x88, 0x37, 0x5B, 0x65, 0x90, 0x46, 0x36, 0x04, 0xF0, 0x86, 0x07, 0x6E, 0x30, 0xE0, 0xA9, 0x5D }, - }, - { - { 0x8D, 0xF5, 0x42, 0x29, 0x9F, 0x9B, 0xDD, 0xF5, 0xAD, 0x42, 0xEE, 0x39, 0x88, 0xDD, 0x21, 0xBF, - 0x21, 0x6B, 0x82, 0x70, 0x91, 0x47, 0xB1, 0x43, 0x1D, 0x08, 0x20, 0xA0, 0x10, 0xD1, 0xC6, 0xBE }, - }, - { - { 0x8D, 0xFE, 0x05, 0xBF, 0x3B, 0x70, 0x65, 0xA3, 0x6F, 0x66, 0xB4, 0xA9, 0x80, 0x6A, 0xBF, 0x8A, - 0x7F, 0x37, 0xF6, 0xD9, 0x2D, 0x3E, 0xB7, 0x11, 0x49, 0xCE, 0x49, 0x21, 0x42, 0xCC, 0x85, 0x79 }, - }, - { - { 0x8E, 0x18, 0xFD, 0xBD, 0xB0, 0x08, 0x16, 0x00, 0x35, 0xFA, 0xF5, 0x01, 0x5B, 0xE7, 0xDA, 0xF4, - 0x63, 0xB5, 0xC4, 0x14, 0xEA, 0xBC, 0x8B, 0x89, 0xF3, 0xDB, 0xA2, 0x05, 0xAB, 0x09, 0xA6, 0x43 }, - }, - { - { 0x8E, 0x2E, 0x4E, 0x29, 0xA3, 0xB4, 0x7F, 0x9B, 0x4A, 0xF7, 0xF6, 0x02, 0xE9, 0xD2, 0xBA, 0xBA, - 0xED, 0xC3, 0x2D, 0x4A, 0x9E, 0xF2, 0x1A, 0x74, 0x1B, 0x07, 0xCE, 0xC1, 0xE4, 0x24, 0x90, 0xCF }, - }, - { - { 0x8E, 0x38, 0x31, 0x6E, 0x38, 0x8B, 0x56, 0x17, 0x8E, 0x60, 0x10, 0xAD, 0xC2, 0xCA, 0xBB, 0x40, - 0x24, 0x92, 0x64, 0xB3, 0x34, 0x42, 0x20, 0xCE, 0xD9, 0xF6, 0xEC, 0xBC, 0xF0, 0x71, 0x1C, 0x34 }, - }, - { - { 0x8E, 0x57, 0x12, 0xC7, 0x5E, 0xC1, 0xE0, 0x31, 0x73, 0x15, 0x96, 0x35, 0x60, 0xF2, 0x6C, 0x8E, - 0xCB, 0x29, 0xA7, 0xA0, 0x28, 0x7F, 0x84, 0xE7, 0xCC, 0x29, 0x99, 0x67, 0x5E, 0x41, 0xA0, 0x5D }, - }, - { - { 0x8E, 0xB9, 0x24, 0x0B, 0x19, 0xA3, 0xCC, 0x2F, 0xF2, 0xCD, 0xF9, 0xAD, 0x2C, 0x71, 0x2E, 0x23, - 0xF4, 0x1E, 0x35, 0x2A, 0xE1, 0xDA, 0x79, 0x29, 0xD6, 0x08, 0xCB, 0xBC, 0x81, 0xA9, 0xE0, 0xC3 }, - }, - { - { 0x8F, 0x01, 0xE1, 0x2E, 0xF4, 0x24, 0x16, 0x9D, 0x2D, 0x5C, 0x2D, 0x25, 0x73, 0xD4, 0x97, 0x36, - 0xE6, 0x9B, 0x05, 0x74, 0x1D, 0x31, 0xB1, 0x62, 0x61, 0xB5, 0xBD, 0xB3, 0xB4, 0x48, 0x77, 0xE2 }, - }, - { - { 0x8F, 0x10, 0x10, 0x47, 0x93, 0xE8, 0x55, 0x42, 0xBC, 0x06, 0x04, 0xD6, 0xCF, 0x21, 0x5F, 0x78, - 0x80, 0xBD, 0x6A, 0x4D, 0xD0, 0xFD, 0xF1, 0xE7, 0xA5, 0xB9, 0xCA, 0x12, 0x46, 0xF5, 0xC4, 0x09 }, - }, - { - { 0x8F, 0x71, 0x27, 0x76, 0x2E, 0xE7, 0x51, 0x69, 0xBD, 0xC3, 0x5B, 0x04, 0xA7, 0x28, 0xE9, 0xD3, - 0x1B, 0x7E, 0x4D, 0x37, 0x89, 0xAA, 0x2C, 0x46, 0xD8, 0xA3, 0x1B, 0x3D, 0xFA, 0x81, 0xA9, 0x7E }, - }, - { - { 0x8F, 0x93, 0xC5, 0xA7, 0xC0, 0x96, 0x66, 0x8B, 0xD4, 0x51, 0x56, 0xBA, 0xD5, 0x6F, 0x06, 0x12, - 0x04, 0x5D, 0x63, 0x65, 0xB6, 0xBB, 0xAA, 0x63, 0xBA, 0xCB, 0xF2, 0xBE, 0x01, 0xB5, 0x2C, 0xD3 }, - }, - { - { 0x8F, 0x94, 0x15, 0x92, 0x6F, 0x40, 0x49, 0xEA, 0x41, 0x8A, 0x30, 0x7C, 0x76, 0x36, 0xE4, 0x9B, - 0x14, 0x4F, 0xA5, 0x3E, 0x52, 0xE1, 0x04, 0x15, 0x5F, 0x58, 0x03, 0x5E, 0x45, 0x41, 0xCD, 0x6E }, - }, - { - { 0x8F, 0x9F, 0x3E, 0x59, 0xD3, 0x6A, 0x9F, 0x33, 0x15, 0x04, 0x9B, 0x99, 0x1C, 0x89, 0xC3, 0x21, - 0xE1, 0xF1, 0xF6, 0x78, 0xE0, 0xA2, 0xA4, 0x2F, 0xC1, 0x44, 0xE5, 0xFF, 0xF2, 0x3B, 0x62, 0xA5 }, - }, - { - { 0x8F, 0xA2, 0x4B, 0x76, 0xD7, 0xAA, 0xD1, 0x53, 0x3F, 0xEA, 0xFE, 0x73, 0xE0, 0x0F, 0xFA, 0x8B, - 0x89, 0x4B, 0x95, 0xB4, 0xE7, 0x01, 0x59, 0x54, 0x9E, 0xAD, 0xA6, 0x58, 0xF6, 0xA2, 0x2B, 0x88 }, - }, - { - { 0x8F, 0xCB, 0x3C, 0x28, 0xE8, 0x1E, 0xFA, 0x6A, 0x1F, 0xE3, 0x4D, 0x03, 0x8A, 0x3B, 0xFB, 0x00, - 0x72, 0x96, 0xA0, 0x48, 0x24, 0xB3, 0xA2, 0x06, 0xE9, 0xEF, 0x28, 0x97, 0xE6, 0x97, 0x51, 0x10 }, - }, - { - { 0x90, 0x30, 0xEC, 0x29, 0x71, 0x10, 0x6A, 0x7C, 0x68, 0x8B, 0xBE, 0xA9, 0x1D, 0x70, 0xF3, 0x4D, - 0x75, 0xD6, 0x74, 0x5B, 0x30, 0x48, 0xFB, 0x1D, 0x9D, 0x3B, 0xC4, 0x9F, 0x9F, 0xC8, 0x78, 0xBA }, - }, - { - { 0x90, 0xB3, 0xA1, 0x85, 0x36, 0x86, 0xAF, 0xEB, 0x15, 0x4A, 0xEF, 0x7E, 0x84, 0x0D, 0x38, 0x04, - 0x4E, 0x7D, 0x7F, 0x6D, 0xC4, 0xCE, 0x82, 0x8C, 0xE3, 0x97, 0x55, 0xAC, 0x88, 0xE4, 0x2E, 0x07 }, - }, - { - { 0x90, 0xE2, 0x51, 0x86, 0x7F, 0x6B, 0x0C, 0x14, 0xBD, 0x9B, 0x51, 0x0C, 0xFD, 0xA8, 0x48, 0x49, - 0x72, 0xFD, 0xF0, 0xE0, 0x6D, 0xC1, 0x1F, 0x5D, 0x1D, 0x59, 0x0B, 0xE3, 0xFC, 0x38, 0xDF, 0xF0 }, - }, - { - { 0x90, 0xF2, 0xF3, 0x73, 0xB9, 0xA6, 0x2E, 0x3C, 0xC8, 0x15, 0x87, 0x57, 0x58, 0x13, 0x18, 0x9B, - 0xA6, 0x9C, 0x67, 0x28, 0x1F, 0x41, 0x93, 0xE4, 0x9B, 0x31, 0x68, 0x9A, 0xA3, 0x7C, 0x3C, 0x21 }, - }, - { - { 0x91, 0x02, 0x41, 0xA2, 0xDD, 0x40, 0xA2, 0x83, 0xEA, 0x1F, 0x0F, 0x4F, 0x31, 0xC9, 0x48, 0x9D, - 0x38, 0x45, 0x0F, 0x08, 0xCA, 0x8B, 0xCC, 0x21, 0x87, 0xF6, 0x90, 0xB4, 0x4F, 0x37, 0x30, 0x17 }, - }, - { - { 0x91, 0x31, 0x4F, 0xF3, 0xFB, 0x23, 0xD3, 0x41, 0x44, 0x63, 0x17, 0xF1, 0xC6, 0xCA, 0x9D, 0x6C, - 0x6D, 0xCB, 0x7A, 0x95, 0x65, 0x1D, 0xA7, 0xE3, 0xF1, 0x56, 0x00, 0xF4, 0x3A, 0x25, 0x8A, 0xF3 }, - }, - { - { 0x91, 0x3B, 0xE0, 0x71, 0xEC, 0x66, 0x46, 0x91, 0x37, 0x98, 0x38, 0x6E, 0x69, 0x4F, 0x08, 0x8B, - 0xF0, 0x9D, 0x48, 0xA3, 0x97, 0xF9, 0x79, 0xE1, 0x24, 0x4C, 0x20, 0x2F, 0x3C, 0x8E, 0x13, 0x8D }, - }, - { - { 0x91, 0x6B, 0x1A, 0x6B, 0x61, 0x6C, 0x6D, 0x8A, 0xC1, 0x49, 0xA3, 0x31, 0x04, 0x83, 0x51, 0x1A, - 0xF7, 0xA7, 0xD5, 0x3C, 0x60, 0x17, 0x9E, 0x7F, 0xA7, 0x93, 0x1E, 0x59, 0x70, 0xB7, 0x82, 0xF1 }, - }, - { - { 0x91, 0x90, 0xF8, 0x25, 0x51, 0x0C, 0x65, 0x98, 0xE1, 0x9D, 0x17, 0xDB, 0xBE, 0x6E, 0x7C, 0x82, - 0x31, 0x86, 0x9C, 0xA7, 0xF6, 0xE3, 0x07, 0xA2, 0xC2, 0xCC, 0x54, 0x77, 0x8D, 0x4A, 0x89, 0xB3 }, - }, - { - { 0x91, 0xC7, 0x6E, 0xF8, 0xC7, 0x05, 0x3B, 0x2A, 0x27, 0x0B, 0x97, 0x19, 0x78, 0x3C, 0x85, 0x10, - 0xA2, 0x89, 0x0A, 0x48, 0x40, 0x18, 0x63, 0x72, 0x6E, 0x23, 0x3A, 0x82, 0xBF, 0x9A, 0x0B, 0xCF }, - }, - { - { 0x92, 0x3F, 0x0F, 0x8C, 0x40, 0x5A, 0x02, 0xE6, 0x82, 0xC4, 0xB4, 0x66, 0x5A, 0x7E, 0xE7, 0x16, - 0xAA, 0x57, 0xE0, 0xA5, 0x86, 0xC2, 0x4A, 0x16, 0x5A, 0xAD, 0x7E, 0x5B, 0xDA, 0x22, 0x78, 0x24 }, - }, - { - { 0x92, 0x71, 0x44, 0x12, 0x1C, 0x23, 0x63, 0x57, 0x07, 0xE9, 0x40, 0x7F, 0x7F, 0xFF, 0x6A, 0x64, - 0x63, 0x5D, 0x7C, 0xE9, 0x06, 0x66, 0xD4, 0x29, 0x94, 0x09, 0x7A, 0xF4, 0x0C, 0x31, 0x36, 0xFB }, - }, - { - { 0x92, 0x83, 0x70, 0x07, 0x63, 0x1B, 0x8F, 0xFA, 0x02, 0x91, 0xD9, 0xE9, 0xC4, 0xB0, 0x8A, 0x5B, - 0xFA, 0x84, 0x5B, 0xA1, 0x7E, 0x79, 0xA2, 0x2D, 0x9D, 0x9D, 0x44, 0xB9, 0x02, 0x23, 0x3D, 0x16 }, - }, - { - { 0x92, 0x8C, 0x1C, 0xD7, 0x50, 0x82, 0x84, 0x1A, 0x02, 0xEF, 0x8B, 0x49, 0x45, 0x6D, 0x6D, 0x3B, - 0x72, 0xB9, 0x79, 0xFF, 0xDA, 0xFB, 0xFD, 0xE2, 0xC6, 0x50, 0xD3, 0x53, 0xDC, 0xD4, 0xF8, 0xFE }, - }, - { - { 0x93, 0x03, 0x43, 0xB5, 0xE8, 0xC1, 0x5D, 0x6D, 0x93, 0x9D, 0x0F, 0x39, 0xF0, 0x53, 0x7A, 0xA6, - 0x23, 0x3F, 0x61, 0x17, 0x93, 0x79, 0xCE, 0xBC, 0x8D, 0x7C, 0x62, 0x01, 0x09, 0x9F, 0xFD, 0xE2 }, - }, - { - { 0x93, 0x8A, 0xE3, 0xE7, 0x15, 0x48, 0xA9, 0xC3, 0x14, 0x27, 0xCB, 0xA7, 0x40, 0xBE, 0x2E, 0xB9, - 0x26, 0x88, 0x68, 0xBD, 0xAC, 0xC1, 0xDA, 0xA8, 0x67, 0x02, 0xFA, 0xB7, 0x93, 0x70, 0xB8, 0xF9 }, - }, - { - { 0x93, 0xAC, 0x4B, 0xBC, 0x6E, 0xBD, 0x52, 0x7E, 0xA9, 0x42, 0xAF, 0x29, 0x4A, 0x5D, 0xAB, 0xD1, - 0x4F, 0xE7, 0x7C, 0x5E, 0x6A, 0x4E, 0xEB, 0x14, 0xB8, 0x0D, 0x42, 0x9F, 0x39, 0xFD, 0xCC, 0xE7 }, - }, - { - { 0x94, 0x18, 0xEF, 0x6D, 0x9F, 0xF6, 0x06, 0xFD, 0xC7, 0x55, 0x78, 0xF0, 0xF5, 0xDE, 0xEA, 0xB1, - 0x39, 0x69, 0x80, 0xF5, 0xB5, 0xD3, 0x96, 0x9D, 0x7A, 0x0F, 0x23, 0x83, 0x70, 0x3F, 0x9B, 0xB1 }, - }, - { - { 0x94, 0x77, 0xCF, 0xEC, 0xDA, 0x46, 0x1D, 0xBC, 0x01, 0xA3, 0xA3, 0x0E, 0xA2, 0x64, 0x31, 0x42, - 0x5B, 0xD1, 0xB1, 0x0C, 0xF7, 0xC2, 0xF2, 0x06, 0x0E, 0xCB, 0x39, 0xF7, 0xD4, 0x15, 0x5B, 0x0D }, - }, - { - { 0x94, 0x97, 0xDC, 0x04, 0xAA, 0xBB, 0xED, 0xF0, 0xD9, 0xE7, 0x65, 0x40, 0x60, 0x02, 0x55, 0x76, - 0x7D, 0xF3, 0xB9, 0x70, 0x59, 0x67, 0x02, 0x86, 0x70, 0x7D, 0x85, 0x85, 0xE4, 0xD8, 0x2C, 0x63 }, - }, - { - { 0x94, 0x9E, 0x13, 0x59, 0x7F, 0x32, 0x06, 0x9F, 0xF3, 0xA6, 0xCF, 0x49, 0x07, 0x1E, 0x70, 0xF4, - 0x0C, 0x4A, 0x2E, 0x07, 0x2E, 0x98, 0x69, 0xFE, 0x15, 0x97, 0xEE, 0x8E, 0xB7, 0x16, 0x34, 0x09 }, - }, - { - { 0x94, 0xC5, 0x29, 0xAA, 0x2D, 0xFE, 0xB3, 0x9F, 0x5E, 0x6C, 0x66, 0xD3, 0x53, 0x37, 0x1E, 0xBC, - 0xD2, 0xCA, 0xED, 0xBD, 0x1F, 0x0E, 0x6C, 0x79, 0x75, 0x5E, 0xEE, 0x61, 0xE9, 0xE6, 0x24, 0xF4 }, - }, - { - { 0x94, 0xDC, 0x80, 0x07, 0x49, 0x1D, 0xA8, 0xBF, 0xB7, 0x39, 0x14, 0xAD, 0xCE, 0xF7, 0x1A, 0x12, - 0x41, 0x58, 0xBA, 0xD1, 0x7B, 0xA8, 0x8F, 0xA9, 0x46, 0x57, 0x9B, 0xBC, 0x2D, 0x64, 0x97, 0x8D }, - }, - { - { 0x95, 0x68, 0x33, 0xAE, 0xE6, 0x61, 0x19, 0x26, 0xE9, 0x52, 0x72, 0xA1, 0xF5, 0x88, 0xF9, 0x2A, - 0xF5, 0x2C, 0xAE, 0x70, 0x7A, 0xCD, 0xCC, 0x82, 0x63, 0x99, 0x7B, 0xFA, 0x8C, 0x71, 0x9C, 0xA8 }, - }, - { - { 0x95, 0x6D, 0xBC, 0x65, 0x57, 0x62, 0xCE, 0x49, 0xE5, 0xE8, 0x46, 0x99, 0x2C, 0x26, 0xEB, 0xF5, - 0x66, 0x60, 0x42, 0xD2, 0xC0, 0xD7, 0xE7, 0xCF, 0x74, 0x04, 0x26, 0xBE, 0x3C, 0x51, 0x99, 0x72 }, - }, - { - { 0x95, 0x89, 0xDA, 0xC9, 0xEC, 0xE7, 0x6D, 0xF5, 0x72, 0x01, 0x96, 0xDC, 0x58, 0x6D, 0x17, 0x9D, - 0x73, 0x5D, 0xF7, 0x17, 0x92, 0x6C, 0x06, 0x1E, 0xA7, 0x0C, 0x40, 0x85, 0x64, 0x8F, 0xF3, 0x12 }, - }, - { - { 0x95, 0xF4, 0x59, 0xAC, 0xF2, 0x57, 0x64, 0x4C, 0x90, 0x9A, 0xDC, 0xAE, 0xAD, 0xD8, 0x8A, 0x3C, - 0x57, 0x76, 0x2E, 0xCB, 0x09, 0x2C, 0x50, 0xB4, 0x51, 0xC1, 0x58, 0x6B, 0x21, 0x8E, 0x6B, 0x26 }, - }, - { - { 0x96, 0xA4, 0x59, 0x90, 0xFC, 0xD0, 0x1C, 0x9C, 0x2A, 0xF0, 0x64, 0x5F, 0x87, 0xB9, 0x69, 0x8B, - 0x05, 0xAF, 0xE6, 0x94, 0x32, 0xEB, 0x57, 0x01, 0x08, 0x20, 0x13, 0xBA, 0xC5, 0xB0, 0x55, 0x60 }, - }, - { - { 0x96, 0xEB, 0x44, 0xAA, 0x6A, 0x20, 0x49, 0xE6, 0xBA, 0xFF, 0xE6, 0xB5, 0x21, 0xC4, 0xAD, 0x8C, - 0x58, 0x77, 0x26, 0xCA, 0xA0, 0x12, 0xE8, 0xFB, 0x8E, 0x8E, 0x21, 0x89, 0x77, 0xBF, 0x1D, 0xF6 }, - }, - { - { 0x97, 0x4F, 0x51, 0xA6, 0x04, 0x68, 0x48, 0xFA, 0xA7, 0xB3, 0x3F, 0xD2, 0x39, 0x13, 0x86, 0x42, - 0x8B, 0xD5, 0x24, 0xEA, 0xEB, 0xA8, 0x01, 0x4E, 0x6D, 0x1F, 0xE2, 0x54, 0x38, 0x3F, 0x41, 0x79 }, - }, - { - { 0x97, 0x83, 0x7F, 0xE4, 0xCF, 0xBF, 0x4F, 0xF0, 0x37, 0x63, 0x1C, 0xF4, 0xB5, 0x3F, 0x9F, 0xA8, - 0xAB, 0x37, 0xA8, 0x30, 0x1C, 0xAB, 0x9E, 0x48, 0x71, 0x5F, 0x53, 0x7D, 0xD0, 0x8A, 0x68, 0x48 }, - }, - { - { 0x97, 0x8D, 0x6F, 0x1E, 0x9A, 0xA3, 0xA3, 0xCE, 0xB1, 0xAD, 0xA6, 0x09, 0xE2, 0x00, 0x95, 0xFB, - 0xC3, 0x3A, 0x6B, 0xBC, 0x6A, 0x21, 0xD8, 0x0A, 0x4E, 0xCB, 0x27, 0x3C, 0x60, 0xAC, 0x2A, 0xC7 }, - }, - { - { 0x97, 0xD6, 0x24, 0xEA, 0xC8, 0x80, 0x91, 0x03, 0x4A, 0x84, 0xB4, 0xDC, 0x63, 0x33, 0x92, 0x37, - 0xDA, 0xF4, 0xA2, 0xB0, 0xF6, 0xC6, 0xE2, 0x55, 0xE7, 0xEC, 0xE6, 0x82, 0x59, 0x1D, 0x5E, 0xDC }, - }, - { - { 0x97, 0xE2, 0x11, 0x70, 0x95, 0x44, 0x9C, 0xDF, 0xC0, 0xA8, 0x3E, 0xD4, 0x9E, 0x65, 0x0A, 0xDF, - 0xD9, 0xBC, 0x0B, 0x3C, 0x50, 0x04, 0x9D, 0x7B, 0x93, 0x24, 0x5A, 0xCC, 0x3A, 0x0C, 0x16, 0xAF }, - }, - { - { 0x98, 0x15, 0x9D, 0xD1, 0x88, 0x39, 0xFD, 0xF4, 0x3E, 0xC0, 0x00, 0x23, 0xAD, 0x1D, 0x4E, 0x27, - 0xD8, 0xF9, 0x50, 0xBE, 0xC8, 0x60, 0x40, 0x11, 0x1E, 0x84, 0x54, 0xCE, 0x44, 0x6F, 0xAB, 0x75 }, - }, - { - { 0x98, 0x39, 0xE6, 0x09, 0x46, 0xEF, 0x20, 0xE2, 0x44, 0x68, 0xC1, 0x81, 0x88, 0xBB, 0xB3, 0xC6, - 0xE8, 0x80, 0xF3, 0x6D, 0x0D, 0xED, 0xE8, 0xD2, 0x4A, 0x23, 0x05, 0x86, 0x3A, 0x5B, 0x5D, 0xFE }, - }, - { - { 0x98, 0x57, 0x02, 0xC0, 0x55, 0x05, 0xD9, 0xBA, 0xE0, 0xCE, 0x23, 0xAB, 0x2C, 0xB8, 0x65, 0xA1, - 0xD1, 0x3F, 0x7B, 0xE0, 0x4F, 0xAB, 0xC1, 0x19, 0x49, 0x4B, 0x4C, 0xC1, 0x0A, 0x7D, 0x9A, 0xDB }, - }, - { - { 0x98, 0x76, 0x8D, 0x66, 0x7E, 0x4D, 0xFC, 0x1D, 0x99, 0x5E, 0x42, 0xC7, 0x1E, 0x31, 0x93, 0x31, - 0x6C, 0xEF, 0x8C, 0x2A, 0xF5, 0x9A, 0x0E, 0xA6, 0x19, 0x81, 0xFB, 0x42, 0x00, 0x72, 0x57, 0xC7 }, - }, - { - { 0x98, 0x7A, 0xD4, 0x70, 0x5F, 0x65, 0x65, 0xAF, 0x64, 0x53, 0x0D, 0x09, 0x60, 0xB8, 0x82, 0x74, - 0x0A, 0xFB, 0x8A, 0x74, 0xD5, 0xCC, 0x3C, 0x68, 0x19, 0x34, 0x69, 0x83, 0xF2, 0x51, 0x33, 0x37 }, - }, - { - { 0x98, 0xAA, 0xB4, 0xED, 0x43, 0x89, 0xF3, 0x5E, 0x74, 0x23, 0x74, 0x90, 0x68, 0x01, 0x15, 0x3D, - 0xC7, 0xC8, 0xE3, 0x2D, 0x18, 0xB4, 0xD7, 0x81, 0x88, 0x28, 0x3A, 0x55, 0x77, 0xCB, 0x55, 0xFB }, - }, - { - { 0x98, 0xB5, 0x92, 0x4E, 0x06, 0xCD, 0xEA, 0x1B, 0xA1, 0x7F, 0xDB, 0x1B, 0x13, 0x97, 0x90, 0x24, - 0xB1, 0xC2, 0x5B, 0x0A, 0x69, 0x0C, 0xFE, 0x87, 0x8D, 0x4C, 0xB4, 0x07, 0x76, 0xB9, 0x6F, 0xB0 }, - }, - { - { 0x98, 0xEB, 0xC4, 0x98, 0xBD, 0x91, 0x23, 0x5E, 0xDF, 0xC2, 0xDC, 0x7B, 0xE1, 0x8D, 0x88, 0xF3, - 0x5E, 0x9F, 0x33, 0x41, 0xD8, 0x8E, 0xF4, 0x38, 0xA8, 0xD4, 0x11, 0xF1, 0x88, 0x11, 0x54, 0x56 }, - }, - { - { 0x99, 0x05, 0x0A, 0x48, 0x01, 0x8D, 0x00, 0xB3, 0xBF, 0xE5, 0xA8, 0x09, 0x24, 0x6E, 0x25, 0x54, - 0x5F, 0x36, 0xD2, 0x17, 0x8F, 0xD2, 0x02, 0xAE, 0x5D, 0xC8, 0xE7, 0xFF, 0x4D, 0x5A, 0x07, 0xF9 }, - }, - { - { 0x99, 0x08, 0xA8, 0xDD, 0x06, 0x0C, 0x74, 0xFA, 0xB2, 0x0C, 0x2F, 0x44, 0x17, 0x26, 0x0A, 0xFA, - 0xF0, 0x6D, 0x6C, 0x10, 0x81, 0xB2, 0x6C, 0x5F, 0x5F, 0x51, 0x5C, 0x2D, 0x04, 0xEB, 0x4A, 0x52 }, - }, - { - { 0x99, 0x45, 0xBA, 0x12, 0xC4, 0x4B, 0x5A, 0x01, 0x4D, 0xBC, 0x4D, 0xBB, 0xCA, 0x86, 0x10, 0x87, - 0xC1, 0x9E, 0xDD, 0x6D, 0xCE, 0xB1, 0x6D, 0x52, 0x88, 0x63, 0x63, 0xA7, 0xCD, 0xC8, 0x69, 0x5F }, - }, - { - { 0x99, 0xA5, 0x5F, 0x76, 0xCB, 0xEA, 0x0F, 0x3E, 0x60, 0x71, 0xD3, 0x82, 0x18, 0x1A, 0xF6, 0xCB, - 0x25, 0xBD, 0xC5, 0x87, 0x5E, 0x29, 0xF0, 0xF4, 0xD7, 0x19, 0xA9, 0xD3, 0x5B, 0x5B, 0xD6, 0xBF }, - }, - { - { 0x99, 0xB1, 0x38, 0xBB, 0x53, 0xC5, 0x4D, 0x1C, 0x7A, 0xC2, 0x9A, 0x57, 0x85, 0xC8, 0xB1, 0x9F, - 0xDD, 0xC3, 0x7D, 0x99, 0x4A, 0x3E, 0x6C, 0x31, 0xF7, 0x50, 0xA1, 0xBF, 0xEB, 0xE9, 0xFE, 0xF9 }, - }, - { - { 0x99, 0xB4, 0x6C, 0x68, 0x90, 0x62, 0x37, 0x40, 0x23, 0xDB, 0x68, 0x19, 0xF8, 0x89, 0xD3, 0xC1, - 0xBB, 0x8A, 0x83, 0x8C, 0x6B, 0x51, 0x7E, 0x32, 0x7E, 0xD9, 0x1C, 0x6C, 0x96, 0x2D, 0x06, 0x49 }, - }, - { - { 0x99, 0xE1, 0xFB, 0x3E, 0xEB, 0x89, 0x1E, 0xBA, 0x4F, 0x9B, 0xD4, 0x7F, 0x04, 0xBC, 0x9A, 0x62, - 0xBD, 0x3B, 0x61, 0x85, 0x45, 0x4B, 0xF5, 0x35, 0x9E, 0x39, 0x37, 0xE0, 0xB8, 0xA5, 0xFF, 0xB7 }, - }, - { - { 0x9A, 0x4B, 0x49, 0x93, 0xB4, 0xED, 0x8C, 0x27, 0xE7, 0x7F, 0x3C, 0x8A, 0xAF, 0xDB, 0xDC, 0x11, - 0x1A, 0x36, 0xB7, 0x3C, 0xCA, 0xDB, 0x87, 0x04, 0x98, 0x25, 0x00, 0xD1, 0xB0, 0xF1, 0x09, 0xF2 }, - }, - { - { 0x9A, 0x4C, 0xA1, 0x75, 0xC4, 0x6F, 0x5C, 0x17, 0x05, 0x5E, 0x28, 0x16, 0xC8, 0x37, 0x98, 0x54, - 0x89, 0x46, 0x76, 0xEE, 0xB3, 0x4C, 0xF7, 0x2A, 0x14, 0x83, 0x04, 0x97, 0xD8, 0x4A, 0x4F, 0x6C }, - }, - { - { 0x9A, 0x5D, 0x7A, 0xF0, 0xF3, 0xF4, 0x34, 0xBA, 0x6E, 0x67, 0x37, 0x65, 0x2C, 0x42, 0x87, 0x6A, - 0x8E, 0xC1, 0x9A, 0xCE, 0x0C, 0x7C, 0xBF, 0x3E, 0xCE, 0x5C, 0x32, 0x62, 0xAE, 0xEB, 0x77, 0xD4 }, - }, - { - { 0x9A, 0x5F, 0xAB, 0xE5, 0x8A, 0x1E, 0xAE, 0x4B, 0x20, 0xBA, 0xB3, 0xA7, 0xEB, 0x5E, 0x42, 0xA2, - 0xDA, 0x83, 0x11, 0x59, 0x25, 0x7D, 0xD4, 0xE3, 0x55, 0x2E, 0xC6, 0xF7, 0xD2, 0x67, 0xFA, 0xBA }, - }, - { - { 0x9A, 0x9F, 0x50, 0x16, 0x20, 0x70, 0x69, 0x62, 0xE5, 0x07, 0xF7, 0x57, 0xB2, 0xFE, 0x76, 0x44, - 0xA3, 0xF4, 0x96, 0x90, 0x57, 0x1A, 0x30, 0x34, 0xDB, 0xBC, 0x35, 0x96, 0xA4, 0xC1, 0x60, 0x2C }, - }, - { - { 0x9A, 0xA3, 0xBC, 0xD0, 0x80, 0x11, 0xE2, 0xF9, 0x0A, 0x59, 0x2A, 0xD7, 0xA4, 0x9D, 0xB2, 0x7F, - 0xAA, 0xD8, 0xA7, 0x3C, 0xEA, 0x24, 0x6C, 0x21, 0x65, 0x09, 0xBB, 0x36, 0x27, 0xE8, 0x2A, 0x22 }, - }, - { - { 0x9A, 0xAE, 0x9D, 0x45, 0xAA, 0x04, 0x03, 0x06, 0x4B, 0xC5, 0xA7, 0x4D, 0xD0, 0x32, 0x5D, 0xA4, - 0x1E, 0x12, 0xCF, 0x58, 0x6C, 0x46, 0x2E, 0xE0, 0x6C, 0x2B, 0xB4, 0x56, 0xF8, 0x44, 0x1C, 0x4F }, - }, - { - { 0x9A, 0xC0, 0xD1, 0x78, 0x82, 0x0B, 0xC5, 0x49, 0x96, 0x0A, 0xA1, 0x52, 0xBC, 0x17, 0x3D, 0x70, - 0xBA, 0x6B, 0x36, 0x24, 0x7E, 0x18, 0xA0, 0x42, 0xEB, 0x83, 0x05, 0x41, 0x96, 0x84, 0xA7, 0x2C }, - }, - { - { 0x9A, 0xC1, 0x48, 0xB3, 0x72, 0x12, 0xAD, 0x5D, 0xDE, 0xC4, 0x36, 0xB5, 0x65, 0x77, 0xF5, 0x4B, - 0x99, 0xEA, 0xFC, 0x69, 0x2C, 0x4E, 0x6F, 0xFD, 0x75, 0x85, 0x39, 0xCD, 0xAE, 0xFE, 0x30, 0x4D }, - }, - { - { 0x9A, 0xEE, 0x05, 0x8D, 0x61, 0x51, 0xE2, 0x65, 0xE2, 0x5F, 0x9A, 0x82, 0x34, 0x54, 0x38, 0xC5, - 0xA7, 0x42, 0x8C, 0xD6, 0xD8, 0xE2, 0xB4, 0xF3, 0x39, 0xC4, 0x7F, 0xB2, 0x38, 0xC0, 0x93, 0x3F }, - }, - { - { 0x9B, 0x4B, 0xBC, 0xEA, 0x3E, 0x22, 0xA4, 0x3B, 0xC5, 0xD6, 0x58, 0x7F, 0x58, 0x1D, 0x0A, 0x14, - 0x38, 0xD2, 0xEE, 0xA6, 0xDA, 0xD9, 0xF1, 0xAA, 0x23, 0xFC, 0x23, 0x09, 0x7A, 0xDF, 0x4D, 0x75 }, - }, - { - { 0x9B, 0x8F, 0x9F, 0xC4, 0xAF, 0xA7, 0x04, 0x0D, 0x4E, 0x59, 0x4D, 0x66, 0x7C, 0x44, 0x44, 0xB5, - 0x25, 0x88, 0x20, 0xC0, 0x8F, 0x89, 0x91, 0x0E, 0xD3, 0x42, 0x1C, 0xB4, 0xA9, 0x7B, 0xB7, 0x9E }, - }, - { - { 0x9B, 0xC8, 0xF4, 0xCD, 0x33, 0xB9, 0x19, 0xCF, 0xFC, 0x0B, 0x71, 0x72, 0x63, 0x1A, 0x87, 0xD3, - 0x5B, 0xAF, 0x27, 0xB8, 0xA4, 0x75, 0x28, 0xAE, 0x25, 0x29, 0x35, 0x8F, 0x42, 0x1A, 0xCC, 0xB1 }, - }, - { - { 0x9B, 0xD6, 0x5A, 0xC4, 0x0A, 0x62, 0x5A, 0x81, 0x90, 0x4F, 0xE7, 0x8F, 0x89, 0x35, 0x25, 0x1E, - 0x5C, 0x66, 0x91, 0xF0, 0xB3, 0xD7, 0x24, 0x54, 0xD3, 0x84, 0x12, 0x01, 0xF3, 0x9F, 0xCD, 0x1E }, - }, - { - { 0x9C, 0x70, 0x8D, 0x5B, 0xAB, 0x37, 0xF5, 0xB6, 0xBC, 0x8A, 0x77, 0x53, 0x12, 0x57, 0x2A, 0xB2, - 0x79, 0x21, 0x6D, 0x55, 0x6D, 0xA7, 0x4A, 0xC2, 0xA7, 0xC0, 0x41, 0xE8, 0xCE, 0xB0, 0xBE, 0x0A }, - }, - { - { 0x9C, 0x85, 0x31, 0xE7, 0xC8, 0xFB, 0xDA, 0xB8, 0x61, 0x4D, 0x56, 0x17, 0x79, 0x9E, 0x00, 0x6B, - 0x69, 0x42, 0xE4, 0x20, 0xC4, 0x07, 0x1D, 0x7D, 0xB8, 0x9C, 0xD7, 0x72, 0x81, 0x69, 0x16, 0x70 }, - }, - { - { 0x9C, 0xCA, 0x23, 0x7C, 0xDF, 0xCA, 0x2C, 0x72, 0xC6, 0x09, 0x25, 0x4A, 0x72, 0x57, 0xFE, 0xD5, - 0x3A, 0xF1, 0x44, 0xAB, 0xC2, 0x5E, 0xCD, 0x8E, 0xF7, 0x01, 0x30, 0x8C, 0xB1, 0x3C, 0xF7, 0x69 }, - }, - { - { 0x9C, 0xF9, 0x96, 0xC5, 0x3A, 0x2A, 0x7B, 0x1A, 0x99, 0xAE, 0x53, 0x0F, 0xC4, 0x36, 0x19, 0x62, - 0x28, 0xEA, 0xE4, 0x79, 0x72, 0xAE, 0x9C, 0xB0, 0x69, 0xB1, 0x8C, 0x29, 0xE3, 0x30, 0x40, 0x9C }, - }, - { - { 0x9D, 0x32, 0x0D, 0x7B, 0x3D, 0x46, 0x34, 0x5F, 0x0F, 0x2D, 0xEC, 0xB7, 0x62, 0xA4, 0x81, 0x7B, - 0x26, 0xA9, 0xA7, 0xCF, 0xE8, 0x71, 0xB1, 0x3E, 0x84, 0xE7, 0xEC, 0x81, 0x0A, 0xAE, 0xB6, 0x2C }, - }, - { - { 0x9D, 0x50, 0xB9, 0x1D, 0xB0, 0x1B, 0xD1, 0x89, 0x9A, 0xF8, 0x17, 0xAD, 0xBF, 0xDC, 0x24, 0x8F, - 0x75, 0xC8, 0x43, 0x53, 0xA9, 0xAE, 0x7A, 0x0B, 0xB4, 0xD1, 0x56, 0x32, 0x9B, 0xDB, 0x51, 0xE0 }, - }, - { - { 0x9D, 0x6B, 0xDF, 0xCF, 0x0C, 0xBF, 0xFE, 0xEA, 0x3B, 0x1A, 0xC7, 0xE9, 0x63, 0xCB, 0xB5, 0xF2, - 0x7F, 0xBD, 0xA8, 0x9D, 0x27, 0x77, 0xF6, 0x0E, 0x56, 0x5B, 0x27, 0x78, 0x54, 0xEF, 0xB0, 0x19 }, - }, - { - { 0x9D, 0xAC, 0x33, 0x14, 0xB2, 0x5B, 0xB7, 0x9A, 0x39, 0xCD, 0x01, 0xEC, 0x4B, 0x33, 0xA1, 0x2F, - 0x47, 0x51, 0x2F, 0x54, 0x09, 0xFF, 0x09, 0x5D, 0x40, 0xAA, 0xD6, 0x20, 0x84, 0xEF, 0x15, 0xBE }, - }, - { - { 0x9D, 0xAC, 0x9D, 0x66, 0xDE, 0xD0, 0xC1, 0x5D, 0x23, 0x24, 0x1A, 0x90, 0x78, 0xA9, 0x1E, 0xC1, - 0xE9, 0x40, 0x70, 0xA1, 0x5C, 0x70, 0x29, 0x45, 0x02, 0xFE, 0x73, 0x8D, 0x12, 0x1C, 0xCA, 0xAC }, - }, - { - { 0x9E, 0x0B, 0xF3, 0x1A, 0xC8, 0x33, 0xF8, 0xB1, 0x40, 0x4C, 0xCA, 0xB1, 0x23, 0x84, 0x63, 0x48, - 0xA0, 0x3C, 0x0F, 0xF5, 0x11, 0xC6, 0xEC, 0x05, 0xA8, 0x6D, 0xF0, 0xDB, 0x51, 0x92, 0xA5, 0x2B }, - }, - { - { 0x9E, 0x2E, 0xC8, 0xE6, 0x1C, 0x76, 0x0D, 0x8E, 0x1B, 0x94, 0x2C, 0xEA, 0x8C, 0x2D, 0x55, 0xA9, - 0xF1, 0x8D, 0x3C, 0xD8, 0x4C, 0x0B, 0x9B, 0x5B, 0x23, 0x4D, 0x15, 0xAC, 0x56, 0x8E, 0x0E, 0xCD }, - }, - { - { 0x9E, 0x80, 0xD0, 0x33, 0xE6, 0x10, 0x90, 0x7B, 0xFE, 0x1F, 0xD8, 0xDF, 0x2D, 0x36, 0xDD, 0xEF, - 0x00, 0xC8, 0xFC, 0x7B, 0xF7, 0xB7, 0xFD, 0x7E, 0x8D, 0x45, 0x92, 0xAB, 0xF3, 0xC4, 0x21, 0xDE }, - }, - { - { 0x9E, 0x85, 0xD4, 0xAC, 0x8B, 0x36, 0x0E, 0x4D, 0xB2, 0xED, 0x37, 0x34, 0x10, 0x16, 0xE3, 0x7B, - 0xD5, 0x5C, 0x2D, 0x59, 0x79, 0x5D, 0x0A, 0x7C, 0x26, 0xA4, 0x4E, 0x7E, 0x80, 0x98, 0x3E, 0x75 }, - }, - { - { 0x9E, 0x98, 0xF7, 0xDA, 0x04, 0x74, 0xD4, 0x86, 0x5A, 0xC7, 0x05, 0xD4, 0xD7, 0xAB, 0xBE, 0xB7, - 0x1A, 0xEF, 0xBA, 0x2C, 0xF2, 0xE0, 0x82, 0xF0, 0x5F, 0xED, 0x53, 0x62, 0x41, 0x4B, 0xD3, 0x93 }, - }, - { - { 0x9E, 0xEA, 0x28, 0xDF, 0x01, 0x4D, 0x91, 0x24, 0x4F, 0xF9, 0x31, 0x4F, 0x43, 0x4A, 0x84, 0x7B, - 0x65, 0x89, 0xC1, 0xF2, 0x03, 0x58, 0x33, 0x9D, 0x79, 0xFC, 0xA6, 0x76, 0x63, 0x2D, 0xFF, 0xFE }, - }, - { - { 0x9F, 0x24, 0x5C, 0x0A, 0x0E, 0xC6, 0x3A, 0xAA, 0xCB, 0xF9, 0x69, 0xC6, 0xFC, 0x24, 0xA1, 0x07, - 0x15, 0x83, 0xB7, 0x79, 0xA5, 0x8A, 0xB6, 0x23, 0xDD, 0x15, 0x31, 0xA2, 0xCA, 0x9F, 0x87, 0x51 }, - }, - { - { 0x9F, 0x41, 0xC4, 0x19, 0xDA, 0x0B, 0xE3, 0x20, 0x5E, 0xA3, 0x84, 0xF9, 0x08, 0xF0, 0x5F, 0x42, - 0x8E, 0xD9, 0x13, 0xB1, 0x49, 0x93, 0x3A, 0x67, 0x2F, 0x79, 0x67, 0x60, 0x0C, 0x02, 0x0F, 0x1E }, - }, - { - { 0x9F, 0xAF, 0x1C, 0x11, 0xA3, 0xC7, 0xE2, 0x41, 0xF8, 0x63, 0x71, 0x97, 0xE8, 0x99, 0x68, 0xDB, - 0x86, 0x6A, 0xD0, 0x1A, 0x5D, 0x4E, 0xD5, 0x34, 0x59, 0x48, 0x65, 0xB9, 0x70, 0x75, 0xF2, 0x60 }, - }, - { - { 0x9F, 0xC3, 0xA4, 0xDD, 0xD9, 0x8A, 0xDD, 0xB2, 0xCE, 0x89, 0x3B, 0xD6, 0x84, 0x2C, 0x48, 0x89, - 0xA3, 0x1F, 0x4B, 0x95, 0xE1, 0x69, 0xD2, 0x3D, 0xC5, 0x54, 0xE6, 0x02, 0x4D, 0xEC, 0x98, 0xA9 }, - }, - { - { 0x9F, 0xE0, 0x91, 0x58, 0x70, 0x38, 0x5D, 0xDB, 0xB6, 0x2F, 0xA6, 0xE3, 0x23, 0x95, 0xEB, 0xE8, - 0x33, 0x34, 0x46, 0x00, 0x43, 0x6D, 0xAC, 0xC9, 0xB5, 0x69, 0x21, 0x4E, 0xEB, 0x8C, 0x0A, 0xF0 }, - }, - { - { 0x9F, 0xF9, 0x38, 0x40, 0xB0, 0x1F, 0x96, 0xB6, 0xF3, 0xC3, 0x10, 0xA0, 0x21, 0x90, 0xAD, 0xC3, - 0x3A, 0x15, 0x69, 0x39, 0x5B, 0xBC, 0xEE, 0x11, 0x6A, 0x15, 0xE1, 0x58, 0xA6, 0x2B, 0xA5, 0x0B }, - }, - { - { 0x9F, 0xFA, 0x4E, 0xF4, 0xFC, 0xF2, 0xCF, 0xD1, 0xB2, 0x7C, 0x6A, 0x62, 0xE3, 0xC4, 0x23, 0x5B, - 0xD8, 0x3C, 0xC5, 0xE0, 0x06, 0xE9, 0x2A, 0x55, 0xE4, 0xA9, 0x86, 0xE6, 0x30, 0x53, 0x57, 0xE3 }, - }, - { - { 0xA0, 0x44, 0xF2, 0xC0, 0x41, 0xF4, 0x18, 0x5B, 0xC0, 0xFE, 0x1A, 0xD3, 0xE0, 0xA3, 0xE0, 0xC2, - 0x7E, 0x24, 0xF4, 0x58, 0xDC, 0xB7, 0xD9, 0x07, 0x39, 0xB6, 0x4A, 0x68, 0x94, 0x45, 0xD4, 0xB6 }, - }, - { - { 0xA0, 0x77, 0x42, 0xD5, 0xB2, 0x99, 0x96, 0x65, 0x06, 0x76, 0x2E, 0x02, 0xE4, 0x20, 0xF1, 0xA9, - 0xC4, 0xAB, 0x73, 0x29, 0xAE, 0x29, 0x5F, 0x01, 0x5F, 0x74, 0x7D, 0xA1, 0x82, 0xA9, 0xC3, 0x9C }, - }, - { - { 0xA0, 0xAB, 0x9F, 0x42, 0xD0, 0x9D, 0x06, 0x44, 0x23, 0x8C, 0x63, 0xF2, 0x19, 0x26, 0x52, 0x8F, - 0xA5, 0x3E, 0x56, 0x6D, 0x83, 0x3E, 0xF1, 0xB0, 0x8D, 0x9E, 0xE7, 0xF3, 0x4D, 0x2B, 0x6D, 0x8E }, - }, - { - { 0xA0, 0xC2, 0xD2, 0x07, 0xA4, 0x7E, 0x18, 0xD0, 0x37, 0x14, 0xD5, 0xB3, 0x44, 0x5D, 0x88, 0xBE, - 0x81, 0xFF, 0x5E, 0x1D, 0x16, 0x07, 0x3D, 0xC1, 0x16, 0x6B, 0xB5, 0x44, 0x8F, 0xF6, 0x52, 0xDF }, - }, - { - { 0xA0, 0xC8, 0xA5, 0x3F, 0xD7, 0x58, 0x3E, 0x43, 0x91, 0xBE, 0xB8, 0xD0, 0xFE, 0xD8, 0x43, 0x1F, - 0x61, 0xB8, 0x52, 0xC1, 0xBE, 0x43, 0xAB, 0x91, 0x61, 0x4B, 0xBB, 0xEB, 0x3B, 0x4F, 0x47, 0x4E }, - }, - { - { 0xA0, 0xFE, 0xF8, 0x2E, 0xAD, 0xF5, 0xFE, 0xEC, 0xF8, 0x99, 0x16, 0xDA, 0x89, 0x4B, 0x2F, 0xA5, - 0x18, 0x29, 0x25, 0x6E, 0xB9, 0x59, 0x01, 0x8D, 0x8B, 0xC5, 0x1C, 0x88, 0xB4, 0x50, 0xC9, 0xD3 }, - }, - { - { 0xA1, 0x14, 0xA3, 0x50, 0x0A, 0x66, 0x1C, 0x15, 0x5A, 0xB1, 0xA8, 0x99, 0x7E, 0xFC, 0xFD, 0xD7, - 0xA1, 0x38, 0x3E, 0xA0, 0x5E, 0x45, 0x2C, 0x55, 0x1B, 0xB0, 0xC8, 0xBD, 0x8E, 0x4A, 0xAA, 0xDA }, - }, - { - { 0xA1, 0x97, 0x7D, 0x0C, 0x92, 0x7C, 0x21, 0xEB, 0x47, 0x6F, 0x67, 0xBE, 0xFE, 0xD6, 0xCF, 0x2C, - 0x61, 0xB7, 0x45, 0xF0, 0xCE, 0x8D, 0x26, 0x58, 0x3D, 0x03, 0xB2, 0x70, 0x02, 0xD5, 0xCD, 0xAF }, - }, - { - { 0xA1, 0xA3, 0xF6, 0x88, 0xFF, 0x45, 0xF6, 0x56, 0x75, 0x7A, 0x24, 0x52, 0xD5, 0xDB, 0xCD, 0x15, - 0x39, 0x4A, 0xC1, 0x1A, 0xF3, 0x8C, 0x2F, 0xEA, 0x0C, 0x7C, 0x39, 0x07, 0xFE, 0xC4, 0xB7, 0x8C }, - }, - { - { 0xA1, 0xF7, 0xA0, 0x7A, 0x4A, 0x67, 0xF6, 0xFF, 0x96, 0xCB, 0x97, 0xB8, 0xAD, 0x2B, 0x59, 0xBE, - 0xF6, 0xB1, 0xF3, 0x03, 0x80, 0xAB, 0x38, 0x3F, 0xAD, 0xF1, 0x23, 0x95, 0xA4, 0xBB, 0x08, 0x14 }, - }, - { - { 0xA2, 0x39, 0x3F, 0x9C, 0x59, 0x6C, 0x5F, 0xE2, 0xC6, 0x49, 0x39, 0xC6, 0x00, 0x43, 0x70, 0x8D, - 0x5F, 0xC6, 0x5F, 0x0C, 0xE8, 0x3E, 0x00, 0x73, 0x9D, 0x75, 0xA3, 0x31, 0xCC, 0xEA, 0x84, 0x45 }, - }, - { - { 0xA2, 0x3E, 0xD1, 0xB5, 0x14, 0x44, 0x95, 0xF7, 0x29, 0xD1, 0x90, 0xAD, 0xE0, 0x7C, 0xA9, 0x38, - 0xBC, 0x7D, 0x9F, 0x6D, 0x26, 0xF7, 0xE4, 0xF6, 0x0B, 0x50, 0x52, 0xDE, 0x66, 0x64, 0xDD, 0x64 }, - }, - { - { 0xA2, 0x6B, 0xA6, 0x8B, 0xD5, 0x7F, 0x66, 0x70, 0x89, 0xB7, 0x52, 0x56, 0x1D, 0x87, 0x12, 0xF0, - 0x8C, 0x7D, 0x96, 0x3D, 0x0F, 0xCD, 0x36, 0xAC, 0x58, 0x99, 0x8E, 0x4C, 0x1F, 0xD3, 0xE2, 0xDA }, - }, - { - { 0xA2, 0x6C, 0x37, 0x5E, 0xB3, 0x19, 0x6E, 0x28, 0x3B, 0xEC, 0x60, 0x3D, 0xB6, 0xBB, 0xDA, 0xE2, - 0x49, 0x55, 0xE4, 0xBA, 0x91, 0x0C, 0xD4, 0x2D, 0x9E, 0xAC, 0x55, 0xCA, 0xC6, 0x10, 0x3A, 0xB9 }, - }, - { - { 0xA3, 0x36, 0x7E, 0xDD, 0x97, 0xBE, 0x14, 0x34, 0xBA, 0x2C, 0x9C, 0xD0, 0x05, 0xF0, 0x1F, 0x5C, - 0x91, 0xA9, 0x32, 0x78, 0xFA, 0x14, 0xAB, 0xEF, 0x73, 0x3C, 0x43, 0xA6, 0x9F, 0xCA, 0x09, 0x6E }, - }, - { - { 0xA3, 0x75, 0x46, 0x27, 0x03, 0x85, 0x5B, 0x0F, 0x31, 0x40, 0xFD, 0xA3, 0xB5, 0x3A, 0xC4, 0x2C, - 0x0E, 0x09, 0x0E, 0xA4, 0x91, 0x20, 0x21, 0xB0, 0x4B, 0x1E, 0xB4, 0xF2, 0xB2, 0xD5, 0xD9, 0xC6 }, - }, - { - { 0xA3, 0xA4, 0xFC, 0x03, 0xE1, 0x75, 0xF2, 0x68, 0x02, 0x57, 0x46, 0x34, 0xDE, 0x70, 0x7D, 0x2F, - 0x92, 0xF4, 0xD0, 0xCB, 0x90, 0xCD, 0xB6, 0x1D, 0xD1, 0x95, 0x8B, 0xCF, 0x0C, 0x55, 0x20, 0x86 }, - }, - { - { 0xA4, 0x46, 0x9F, 0x13, 0x11, 0x77, 0xD7, 0xFD, 0xAB, 0x22, 0x64, 0xB2, 0xC9, 0xFA, 0x76, 0xAC, - 0x05, 0x0F, 0x42, 0xC6, 0xD6, 0x80, 0x2B, 0xA4, 0x07, 0x22, 0xD6, 0x48, 0x51, 0x24, 0x25, 0x1C }, - }, - { - { 0xA4, 0x55, 0x6D, 0x49, 0x3B, 0x52, 0x03, 0xAD, 0xE9, 0xAC, 0x0A, 0xAB, 0x86, 0xE4, 0x21, 0xDB, - 0xCF, 0xB2, 0x61, 0x00, 0x84, 0x07, 0xF3, 0xC6, 0x7B, 0x10, 0xD7, 0xCF, 0x48, 0x9D, 0xB8, 0x83 }, - }, - { - { 0xA4, 0xB4, 0xE2, 0xA5, 0x14, 0x66, 0xB8, 0x81, 0x06, 0xD3, 0xA0, 0xCB, 0x4C, 0x75, 0x26, 0xF1, - 0x0D, 0x21, 0x80, 0x90, 0x30, 0x82, 0x80, 0x98, 0xF4, 0x87, 0x78, 0x5E, 0x98, 0x78, 0xE6, 0x9C }, - }, - { - { 0xA5, 0x22, 0xAD, 0x4E, 0x88, 0x20, 0xD2, 0x31, 0x0D, 0xF1, 0x36, 0x76, 0x2B, 0x25, 0x32, 0x41, - 0x2D, 0x00, 0xA5, 0x03, 0x1B, 0x70, 0x28, 0x9A, 0xE6, 0x06, 0xC9, 0xA5, 0x8B, 0xFB, 0xDB, 0xD7 }, - }, - { - { 0xA5, 0x58, 0xCC, 0x2E, 0x2F, 0xE1, 0x06, 0x81, 0x12, 0x0B, 0xD2, 0x57, 0x94, 0xF8, 0xCA, 0x20, - 0xB0, 0x94, 0x3F, 0xBD, 0x13, 0x6E, 0x4B, 0x36, 0x77, 0x30, 0xF0, 0x5E, 0x71, 0x21, 0xF8, 0x97 }, - }, - { - { 0xA5, 0x60, 0x81, 0x15, 0x27, 0xB1, 0xFC, 0x3E, 0x25, 0xAF, 0x12, 0xC6, 0x10, 0xD3, 0x58, 0x18, - 0x43, 0x32, 0x10, 0xD3, 0x15, 0x27, 0x56, 0x45, 0x67, 0xDB, 0x9F, 0xF1, 0xA2, 0xED, 0x66, 0x90 }, - }, - { - { 0xA5, 0x61, 0x59, 0x83, 0x9A, 0x9E, 0x88, 0xA6, 0x18, 0xED, 0xB3, 0xCE, 0x3B, 0x8F, 0x16, 0x52, - 0x35, 0x22, 0xAF, 0x8B, 0x0C, 0x53, 0xEE, 0x1E, 0xA0, 0x85, 0x38, 0xB8, 0x88, 0x29, 0xC9, 0x2D }, - }, - { - { 0xA5, 0x67, 0x98, 0x6C, 0xE0, 0xE3, 0x36, 0xF8, 0x4F, 0xDC, 0x08, 0x15, 0xB8, 0x6E, 0xA3, 0x03, - 0x34, 0x3C, 0xF8, 0xC1, 0x0F, 0x37, 0x27, 0x83, 0x27, 0x14, 0x86, 0xB9, 0xC9, 0x3B, 0x63, 0x67 }, - }, - { - { 0xA5, 0x6A, 0x64, 0x81, 0xFE, 0x83, 0xDA, 0xB2, 0xEB, 0xA7, 0x01, 0x1D, 0x91, 0x3D, 0xB1, 0xA5, - 0x65, 0x83, 0xB1, 0x3A, 0xA9, 0x69, 0xC8, 0x32, 0xE7, 0x7E, 0x22, 0xFE, 0xBC, 0xC9, 0xE1, 0x30 }, - }, - { - { 0xA5, 0x9C, 0xAE, 0xC7, 0x30, 0x06, 0xB3, 0x36, 0x8F, 0x19, 0x6D, 0x6E, 0x12, 0x17, 0x48, 0x2D, - 0xD6, 0x61, 0x0E, 0x39, 0x5F, 0x27, 0x1F, 0x91, 0x31, 0x51, 0x9C, 0x02, 0x2B, 0xE2, 0x1A, 0x02 }, - }, - { - { 0xA5, 0xDB, 0xAF, 0x01, 0xD3, 0xD5, 0x79, 0xEE, 0x8A, 0x48, 0x8E, 0xE8, 0xD7, 0x44, 0x09, 0x58, - 0xF7, 0xBF, 0x97, 0xA2, 0xBC, 0xA8, 0xD9, 0x71, 0xF6, 0xF8, 0x97, 0x10, 0xBC, 0x2D, 0x10, 0x6F }, - }, - { - { 0xA6, 0x13, 0x01, 0x30, 0x19, 0xBB, 0x3E, 0xEC, 0x44, 0xCC, 0xBA, 0x1B, 0x46, 0xBD, 0x14, 0x09, - 0x62, 0x5D, 0x25, 0x82, 0x4E, 0x88, 0x2A, 0x5F, 0xF8, 0x63, 0x5B, 0x4C, 0x41, 0x83, 0x2E, 0x3C }, - }, - { - { 0xA6, 0x21, 0xAE, 0x36, 0x54, 0xAC, 0xFD, 0x17, 0x23, 0x30, 0x70, 0xE9, 0xB1, 0x8D, 0xFD, 0x91, - 0x6A, 0x55, 0x2E, 0x6A, 0x8B, 0x82, 0x42, 0xBD, 0x57, 0xBB, 0xCD, 0xF4, 0xE6, 0x5E, 0x99, 0x76 }, - }, - { - { 0xA6, 0x26, 0x87, 0xDE, 0x88, 0x0C, 0xF3, 0x35, 0xAE, 0x42, 0x4D, 0x4A, 0xDE, 0x29, 0xC7, 0xEC, - 0x33, 0xBF, 0xB9, 0xF8, 0x6E, 0xC7, 0xFC, 0xAF, 0x61, 0x9D, 0x71, 0x7C, 0x86, 0xB8, 0xFB, 0xBC }, - }, - { - { 0xA6, 0x33, 0x5D, 0xF3, 0xAB, 0xA5, 0xEA, 0xDF, 0xBD, 0xC9, 0xC2, 0xDC, 0x9D, 0x6B, 0xE6, 0x0B, - 0xB6, 0x2D, 0xF2, 0xFE, 0x24, 0xEC, 0x7B, 0xA7, 0x67, 0xBE, 0x65, 0xD3, 0x7F, 0x3C, 0x90, 0xF8 }, - }, - { - { 0xA6, 0x5C, 0xAE, 0x6C, 0x12, 0xE4, 0x7F, 0x8F, 0x67, 0x0C, 0x69, 0x37, 0xB1, 0xF0, 0xE1, 0x5C, - 0xF3, 0xA4, 0x4C, 0x11, 0x9C, 0xAF, 0x5E, 0x32, 0x6D, 0x8D, 0xB0, 0x81, 0xBE, 0x4F, 0xC3, 0x0A }, - }, - { - { 0xA6, 0x62, 0xFC, 0x81, 0xC9, 0x09, 0x34, 0xB9, 0xB4, 0xD6, 0x30, 0xB5, 0xD8, 0x2E, 0x86, 0xF2, - 0x36, 0x3E, 0xC1, 0x5C, 0xCF, 0xCD, 0xAF, 0xA7, 0xA2, 0x0C, 0x9B, 0x4E, 0x3A, 0x90, 0x0D, 0xD1 }, - }, - { - { 0xA6, 0x90, 0xB4, 0x5E, 0x85, 0xD9, 0x97, 0xF3, 0x3C, 0xBE, 0x1B, 0xE7, 0x5B, 0xC3, 0xD8, 0xE7, - 0x66, 0x3A, 0xFC, 0x0B, 0x62, 0x00, 0xBF, 0x4D, 0x74, 0x79, 0x0C, 0x17, 0x9F, 0xF0, 0x6A, 0x10 }, - }, - { - { 0xA6, 0xA4, 0xA3, 0xF6, 0x1F, 0xA5, 0x8C, 0xE9, 0x70, 0xB4, 0x58, 0xB7, 0xC3, 0x7C, 0x05, 0x2E, - 0xAD, 0x1E, 0xB2, 0x0B, 0x85, 0x67, 0xE3, 0x51, 0xAD, 0x8E, 0x6F, 0xBA, 0x49, 0xC2, 0x69, 0x2C }, - }, - { - { 0xA6, 0xB6, 0xDA, 0xD4, 0x51, 0x5B, 0x1C, 0xFC, 0x70, 0x37, 0x1C, 0xFC, 0xFC, 0x32, 0x30, 0x71, - 0x0E, 0x30, 0xEF, 0xE4, 0x0F, 0x95, 0xD5, 0x20, 0xAF, 0xC8, 0x65, 0x31, 0xE8, 0xC8, 0xF8, 0x41 }, - }, - { - { 0xA6, 0xDE, 0x6C, 0x3B, 0x8C, 0x14, 0x05, 0xCB, 0xE1, 0x2D, 0xB4, 0x09, 0x97, 0x61, 0x71, 0xAC, - 0xB5, 0x1F, 0xB3, 0xDC, 0xFB, 0xB7, 0x6E, 0xE3, 0x84, 0x95, 0x39, 0xCD, 0x8A, 0xB0, 0x66, 0xDF }, - }, - { - { 0xA6, 0xF1, 0xFA, 0xC9, 0x75, 0x7D, 0xFC, 0xB0, 0x66, 0x9F, 0x1F, 0x54, 0x68, 0xAC, 0xF6, 0xEA, - 0x83, 0x84, 0xB7, 0xC2, 0xC3, 0x0E, 0x40, 0xAA, 0xA9, 0x39, 0x21, 0xF2, 0x38, 0x72, 0xCA, 0xED }, - }, - { - { 0xA7, 0x08, 0x0D, 0xEB, 0x9A, 0xFE, 0x85, 0xBA, 0x27, 0xFE, 0xB4, 0xA9, 0xC2, 0xF9, 0xA7, 0x54, - 0xF3, 0xD5, 0xFF, 0xE6, 0xC3, 0xC4, 0xEE, 0x95, 0x56, 0x63, 0x1C, 0xE7, 0xEA, 0x20, 0x22, 0x72 }, - }, - { - { 0xA7, 0x0F, 0x0C, 0xE2, 0xD4, 0xFB, 0xE6, 0x63, 0x6A, 0x7A, 0x48, 0x94, 0x3C, 0xBD, 0x2D, 0x99, - 0x0E, 0x40, 0xFA, 0xA6, 0xD8, 0x56, 0x87, 0x7F, 0x45, 0x5B, 0xF0, 0x15, 0xF5, 0x45, 0x11, 0x3C }, - }, - { - { 0xA7, 0x36, 0xB1, 0x97, 0xE6, 0xFB, 0x3B, 0x62, 0x32, 0xED, 0xB3, 0xC8, 0xD6, 0x8C, 0xE1, 0x35, - 0x1A, 0x48, 0xB5, 0x6F, 0x70, 0x11, 0xBB, 0x99, 0x20, 0xCF, 0xCA, 0x75, 0x7E, 0x57, 0xC6, 0xC4 }, - }, - { - { 0xA7, 0x5D, 0x18, 0x19, 0x6F, 0x2F, 0x30, 0xF0, 0x36, 0x12, 0x7C, 0x67, 0x58, 0x14, 0x9D, 0x1E, - 0xE3, 0xDC, 0x4F, 0x03, 0x02, 0x68, 0x74, 0x05, 0x9E, 0xA4, 0x58, 0x7C, 0x77, 0x5A, 0x65, 0x21 }, - }, - { - { 0xA7, 0x7C, 0x12, 0x1C, 0xCE, 0x27, 0x74, 0xBC, 0xDD, 0x8C, 0xD5, 0x64, 0x71, 0x8C, 0x83, 0x18, - 0xF8, 0x1A, 0xEC, 0x99, 0x97, 0x00, 0xD9, 0xB9, 0x85, 0x9C, 0x2D, 0xB7, 0x63, 0x8A, 0xAC, 0xC0 }, - }, - { - { 0xA7, 0x7E, 0x5C, 0x39, 0xEB, 0x66, 0xA9, 0x48, 0x74, 0x88, 0xC7, 0xD1, 0x44, 0xC6, 0x37, 0xB6, - 0xB4, 0xC5, 0xCD, 0xA2, 0x09, 0x02, 0xD8, 0x22, 0x95, 0xB7, 0x5B, 0xFF, 0xD5, 0xB9, 0x61, 0x98 }, - }, - { - { 0xA7, 0x86, 0x18, 0xD8, 0xA7, 0xF0, 0x08, 0xAF, 0xDC, 0x72, 0x44, 0x98, 0x2C, 0x11, 0x34, 0xC5, - 0xDC, 0x91, 0xEC, 0x94, 0x25, 0xBF, 0xEF, 0xC8, 0xCC, 0x0A, 0xF8, 0xF8, 0xC7, 0x59, 0x61, 0xC2 }, - }, - { - { 0xA8, 0x53, 0xAD, 0xC1, 0xC2, 0x18, 0x59, 0xAF, 0x7C, 0x46, 0x2B, 0x4A, 0xA0, 0xA5, 0x74, 0xCA, - 0x9F, 0xEE, 0xFB, 0x18, 0x5A, 0x1F, 0xDB, 0xB6, 0xC1, 0x0E, 0x17, 0xD6, 0x01, 0xB7, 0x09, 0x8F }, - }, - { - { 0xA8, 0x7F, 0x0D, 0xF3, 0xEB, 0x2C, 0x90, 0x1F, 0x11, 0x6F, 0x6A, 0x8B, 0x01, 0xE2, 0x95, 0xCD, - 0x60, 0x72, 0x69, 0x5A, 0xB1, 0x65, 0x4B, 0x7B, 0xF9, 0xC4, 0x7E, 0x06, 0x20, 0x25, 0x6F, 0x81 }, - }, - { - { 0xA8, 0xC6, 0xB0, 0x72, 0x2A, 0x0D, 0x13, 0xDC, 0x8B, 0x7F, 0xBB, 0x20, 0xBC, 0x66, 0xE6, 0x03, - 0x0E, 0x4B, 0xDE, 0x99, 0xEA, 0xCA, 0x9C, 0x96, 0x5D, 0x34, 0x65, 0xC9, 0xAB, 0xFF, 0x64, 0x11 }, - }, - { - { 0xA8, 0xDF, 0xF0, 0x6A, 0x17, 0x35, 0xB4, 0x6D, 0x17, 0xDA, 0xEB, 0xC3, 0x43, 0x43, 0x18, 0x31, - 0x3B, 0x2D, 0x9E, 0x7C, 0x3E, 0xF4, 0x8F, 0x28, 0x53, 0x75, 0x35, 0x13, 0xE1, 0xB2, 0x53, 0xA8 }, - }, - { - { 0xA8, 0xE3, 0x8C, 0x6E, 0xC0, 0x93, 0xF5, 0xAF, 0x53, 0x88, 0xF1, 0xE7, 0x66, 0xD7, 0x5F, 0xFB, - 0x57, 0xDD, 0xBE, 0x3E, 0x9D, 0xC2, 0xE0, 0xBE, 0x57, 0xBB, 0x88, 0x36, 0x46, 0xC5, 0xC0, 0x32 }, - }, - { - { 0xA9, 0x0B, 0x8D, 0xE1, 0x7F, 0x6B, 0x68, 0x37, 0x56, 0x21, 0x2D, 0xB3, 0xAB, 0x34, 0x89, 0x6E, - 0x91, 0x70, 0x93, 0x11, 0x3E, 0x47, 0xCA, 0x35, 0x96, 0x2E, 0xAC, 0xCA, 0x9C, 0xB3, 0x86, 0xF0 }, - }, - { - { 0xA9, 0x20, 0x6F, 0x6D, 0x45, 0x43, 0xED, 0x74, 0x4A, 0x5F, 0x15, 0x4A, 0xCB, 0x44, 0x50, 0x89, - 0x6B, 0x62, 0x5D, 0x7E, 0x32, 0x33, 0x85, 0xA9, 0xFD, 0x25, 0x63, 0x93, 0x2F, 0x9C, 0xCC, 0x1B }, - }, - { - { 0xA9, 0x4C, 0xC9, 0xDE, 0x55, 0x52, 0xA6, 0xD9, 0x6F, 0xE4, 0x10, 0xBE, 0x03, 0x97, 0x6F, 0x6B, - 0x0D, 0x4D, 0xA0, 0x5D, 0x73, 0x7A, 0xD2, 0xA3, 0x1E, 0x0B, 0xAD, 0x90, 0x82, 0xA5, 0x77, 0xB1 }, - }, - { - { 0xA9, 0x5C, 0x06, 0x3E, 0x9E, 0x35, 0x84, 0xE5, 0x99, 0x88, 0xF0, 0x73, 0x86, 0x4C, 0x18, 0x76, - 0xB5, 0xDF, 0x9B, 0x44, 0xC6, 0x1B, 0x4A, 0x8B, 0xE4, 0x83, 0xBE, 0x05, 0xCF, 0xD1, 0xA1, 0xA6 }, - }, - { - { 0xA9, 0x67, 0x07, 0x76, 0x47, 0x9A, 0xB3, 0xA1, 0x4F, 0xCD, 0x01, 0x56, 0x63, 0x86, 0xCC, 0x45, - 0xCF, 0xA0, 0x53, 0x5A, 0xE0, 0xE9, 0x54, 0x5F, 0x86, 0x3B, 0xCF, 0x7A, 0x7C, 0xD6, 0x1A, 0x2B }, - }, - { - { 0xA9, 0x71, 0x2F, 0x85, 0xED, 0x2E, 0x25, 0xAD, 0xA5, 0x7D, 0xC1, 0xF0, 0xF8, 0x6D, 0xE1, 0x07, - 0xB5, 0xE2, 0xF0, 0x36, 0x09, 0x53, 0xF1, 0xED, 0x12, 0x5E, 0x37, 0x07, 0x59, 0x47, 0x1D, 0x09 }, - }, - { - { 0xA9, 0x7C, 0x77, 0xCA, 0x22, 0xEB, 0x80, 0xCC, 0x7B, 0xA9, 0x62, 0xEB, 0x58, 0x03, 0xBF, 0xCE, - 0x89, 0x6D, 0x57, 0x43, 0xDB, 0x12, 0x84, 0xC8, 0xAD, 0xBA, 0x37, 0x91, 0x7D, 0xF8, 0x03, 0xB1 }, - }, - { - { 0xA9, 0x94, 0xC9, 0x09, 0x10, 0x60, 0x9A, 0xF5, 0x0A, 0x4C, 0x09, 0x22, 0x97, 0xC9, 0xB4, 0xC7, - 0xF1, 0x03, 0x96, 0xAF, 0x73, 0x95, 0xE9, 0xE1, 0xBF, 0xB8, 0x99, 0x53, 0xFA, 0x15, 0x25, 0x9B }, - }, - { - { 0xA9, 0xE2, 0x85, 0xD1, 0xC2, 0xE8, 0xCA, 0x53, 0xCE, 0x97, 0xBB, 0xA6, 0x54, 0x8C, 0xA2, 0xF8, - 0x59, 0xE4, 0xC1, 0xF5, 0xF3, 0x57, 0x6C, 0xA3, 0x2D, 0x03, 0x30, 0x6E, 0x42, 0x3E, 0xF2, 0x5E }, - }, - { - { 0xAA, 0x0E, 0x12, 0x52, 0x43, 0x6D, 0xEF, 0x79, 0x07, 0xFB, 0x99, 0xF7, 0x64, 0x15, 0x50, 0xD8, - 0x0F, 0xAF, 0xFB, 0xF3, 0x01, 0x71, 0x1C, 0x7B, 0x6B, 0xEF, 0x59, 0x6F, 0x94, 0x10, 0xEF, 0xD2 }, - }, - { - { 0xAA, 0xEB, 0xFE, 0x2D, 0x21, 0xB7, 0xE5, 0x35, 0x1B, 0xB9, 0x99, 0x69, 0x44, 0x44, 0x19, 0xEF, - 0x21, 0xC9, 0x68, 0x8C, 0xE0, 0x53, 0x24, 0x88, 0x84, 0xCA, 0xB0, 0xB8, 0x95, 0x10, 0x30, 0xFF }, - }, - { - { 0xAB, 0x41, 0x28, 0x10, 0x9C, 0xAB, 0x8A, 0x58, 0x7C, 0x8F, 0xF4, 0xC7, 0xF6, 0x87, 0x34, 0x49, - 0x98, 0x18, 0xD1, 0x3F, 0x52, 0x26, 0x76, 0xD0, 0x66, 0xB3, 0x52, 0x17, 0x6F, 0xD2, 0x35, 0x96 }, - }, - { - { 0xAB, 0x80, 0xD9, 0xBA, 0x0A, 0xEF, 0xAD, 0x7B, 0xEC, 0xCE, 0x7F, 0x5E, 0x61, 0x59, 0x9A, 0xF5, - 0x26, 0x69, 0xBF, 0x59, 0x50, 0x7F, 0x8E, 0xF1, 0x99, 0x13, 0xC4, 0x2E, 0xE1, 0x29, 0xDA, 0xF0 }, - }, - { - { 0xAB, 0xA1, 0x08, 0xA4, 0xB1, 0x89, 0x3D, 0x18, 0xA3, 0x88, 0xB7, 0x22, 0x54, 0x1C, 0xA2, 0xC0, - 0x05, 0xC2, 0x69, 0x9A, 0x61, 0xFE, 0xAB, 0xBF, 0x61, 0x7A, 0xAA, 0xDD, 0xD4, 0x9E, 0xA9, 0x4D }, - }, - { - { 0xAB, 0xA7, 0x8E, 0x90, 0xF3, 0x24, 0x17, 0xAE, 0xC2, 0x8E, 0xEA, 0x30, 0x22, 0xA2, 0xE2, 0xB7, - 0x66, 0x1A, 0xC7, 0x23, 0xC8, 0x7E, 0x0D, 0xBC, 0xE2, 0x33, 0xE2, 0x16, 0x8F, 0xCF, 0x91, 0xB3 }, - }, - { - { 0xAB, 0xDD, 0x1E, 0xA9, 0x43, 0xC2, 0x32, 0x71, 0x63, 0x8E, 0x8F, 0x96, 0xFC, 0xD0, 0xDD, 0x3D, - 0xF5, 0x45, 0x07, 0x9D, 0xB7, 0x08, 0xEA, 0x64, 0x92, 0x5B, 0x62, 0xAD, 0x92, 0x3C, 0x43, 0xD5 }, - }, - { - { 0xAB, 0xEB, 0x6A, 0xA0, 0xD1, 0xB0, 0xE0, 0x49, 0xD6, 0x9D, 0xF8, 0x3A, 0xDD, 0x19, 0xF7, 0x26, - 0x8A, 0x38, 0xDE, 0x6C, 0x00, 0x72, 0x60, 0x68, 0xC2, 0xEE, 0xE4, 0x55, 0x44, 0xF6, 0xD6, 0x7A }, - }, - { - { 0xAB, 0xED, 0xE5, 0xB0, 0xE2, 0xB1, 0x5F, 0xFE, 0xF1, 0x84, 0x71, 0xC4, 0x53, 0xF0, 0xC4, 0x85, - 0xD2, 0x78, 0xFD, 0xE6, 0x3F, 0x82, 0x74, 0x13, 0xCC, 0x10, 0xDE, 0x4B, 0x82, 0xDE, 0xF6, 0x8D }, - }, - { - { 0xAC, 0x1B, 0x4C, 0x64, 0x6C, 0xAE, 0xFB, 0x10, 0x8A, 0x54, 0xCA, 0xB5, 0x4A, 0x96, 0xE9, 0x66, - 0x6E, 0x72, 0xA8, 0x20, 0x22, 0x44, 0xEF, 0x3D, 0x7C, 0xA9, 0x34, 0xDF, 0xCC, 0x24, 0xFC, 0xA7 }, - }, - { - { 0xAC, 0x7C, 0x14, 0xB9, 0x56, 0x8F, 0x92, 0x07, 0x5A, 0xD4, 0xA3, 0xBA, 0x3D, 0x4B, 0x01, 0x84, - 0x91, 0xF3, 0x66, 0x1A, 0x37, 0x9B, 0x3D, 0xFE, 0xDD, 0x6F, 0xD3, 0xC3, 0x2E, 0xFA, 0x84, 0x7D }, - }, - { - { 0xAC, 0x8C, 0x6F, 0x03, 0xE4, 0xBA, 0xCF, 0x72, 0x20, 0x25, 0xDB, 0x54, 0xD0, 0xFA, 0xAE, 0x7D, - 0xBE, 0x51, 0x37, 0x97, 0x37, 0x39, 0x45, 0x05, 0xF0, 0x86, 0xAA, 0x89, 0xE2, 0xD4, 0xF7, 0x3B }, - }, - { - { 0xAC, 0x90, 0x98, 0xF6, 0x4F, 0xE1, 0x03, 0xC8, 0xC1, 0x40, 0x30, 0xDB, 0xCE, 0xDD, 0x63, 0xD1, - 0xD1, 0x7C, 0x33, 0x8E, 0xBD, 0x1D, 0x7D, 0xE5, 0x6C, 0x79, 0xD2, 0x1A, 0x6F, 0x2E, 0x47, 0xA7 }, - }, - { - { 0xAC, 0x91, 0x0B, 0x02, 0xB4, 0xAB, 0x08, 0x16, 0xF0, 0xD9, 0x52, 0x0C, 0x94, 0xD3, 0x6C, 0x28, - 0x93, 0x38, 0x8C, 0x6A, 0xE1, 0xCA, 0x37, 0xA2, 0x4D, 0x48, 0x92, 0x70, 0x2A, 0xC7, 0xCD, 0x0C }, - }, - { - { 0xAD, 0x4B, 0x2F, 0x8E, 0xF2, 0xDE, 0xFB, 0x01, 0x92, 0x3C, 0x9C, 0x0F, 0xE2, 0x5A, 0x9A, 0xCE, - 0x41, 0xFA, 0x9E, 0x69, 0x75, 0x85, 0xFC, 0x3D, 0xDF, 0x8D, 0x34, 0xE7, 0x45, 0xFF, 0x0F, 0x12 }, - }, - { - { 0xAD, 0x69, 0x54, 0x5F, 0x9F, 0x85, 0x25, 0x5F, 0xE4, 0x16, 0x51, 0x3D, 0x94, 0xDB, 0x31, 0x50, - 0x5F, 0x38, 0x4B, 0x52, 0x3C, 0x2C, 0xA2, 0x6E, 0xDC, 0x0A, 0x54, 0x9A, 0x8F, 0x16, 0x26, 0xF9 }, - }, - { - { 0xAD, 0xB7, 0xF8, 0xE5, 0x75, 0x00, 0x60, 0xD5, 0x87, 0xD6, 0x02, 0x54, 0x58, 0xFC, 0xB0, 0xB6, - 0xCE, 0x4F, 0x3D, 0x86, 0x79, 0x2B, 0xAF, 0xF0, 0xAA, 0xCC, 0x19, 0x0A, 0xB7, 0x0C, 0xB6, 0x2C }, - }, - { - { 0xAD, 0xF9, 0x1E, 0x85, 0x6E, 0xCA, 0xA9, 0xB5, 0x1C, 0x0A, 0x4A, 0x93, 0xA1, 0xAA, 0x53, 0xE5, - 0x2C, 0x31, 0x85, 0xB6, 0x7A, 0x72, 0xBD, 0x2F, 0x8F, 0x5B, 0x14, 0xB5, 0x84, 0x0E, 0x52, 0x9F }, - }, - { - { 0xAE, 0x03, 0x19, 0xFE, 0xA6, 0xA6, 0x5E, 0x84, 0xE8, 0x54, 0xB5, 0x15, 0x50, 0xEA, 0x44, 0x4F, - 0xA3, 0xB8, 0xBB, 0x50, 0xAE, 0x93, 0x74, 0x01, 0x3C, 0xFE, 0xF3, 0x88, 0x73, 0x5D, 0x0B, 0xD3 }, - }, - { - { 0xAE, 0x2F, 0x15, 0xEA, 0x4A, 0xA5, 0x39, 0x81, 0x41, 0x0F, 0x98, 0x93, 0x81, 0xA4, 0x41, 0x5A, - 0xF1, 0x84, 0x3D, 0x19, 0xE4, 0x39, 0x07, 0xAF, 0x53, 0xB2, 0x0F, 0x7F, 0xA7, 0x73, 0x2A, 0x93 }, - }, - { - { 0xAE, 0x4D, 0xF3, 0x97, 0x9B, 0x74, 0x27, 0x34, 0xA3, 0x39, 0xC4, 0x70, 0x1D, 0x5E, 0x13, 0x21, - 0x26, 0x3F, 0xF4, 0x4E, 0x67, 0x56, 0x49, 0x05, 0xF4, 0x9E, 0x25, 0x34, 0x62, 0xB8, 0x02, 0x25 }, - }, - { - { 0xAE, 0xE7, 0xD6, 0x4C, 0x89, 0x7A, 0x32, 0xDB, 0xCA, 0xF1, 0x15, 0x6F, 0xC7, 0xBF, 0xC8, 0x00, - 0x96, 0x73, 0x85, 0xD5, 0xB1, 0xE3, 0x25, 0xD8, 0xFA, 0x3B, 0x9C, 0x16, 0x25, 0xBC, 0x29, 0x92 }, - }, - { - { 0xAF, 0x0B, 0x21, 0x86, 0x24, 0x61, 0xD1, 0xF3, 0x9B, 0x07, 0x44, 0xFD, 0xC9, 0x28, 0x77, 0x99, - 0x62, 0x01, 0x1D, 0xFE, 0x0B, 0xD8, 0xD9, 0x56, 0xC2, 0x47, 0xB5, 0xF5, 0xB4, 0x43, 0x63, 0x1C }, - }, - { - { 0xAF, 0x1F, 0x37, 0x1F, 0x34, 0x84, 0x57, 0x51, 0x65, 0x2D, 0xC7, 0x48, 0x23, 0xF3, 0x01, 0x5C, - 0x5A, 0x11, 0xCA, 0x65, 0x3F, 0x28, 0x70, 0x1E, 0xDD, 0x4A, 0x7E, 0x0D, 0x23, 0x17, 0x1B, 0xBB }, - }, - { - { 0xAF, 0x6A, 0x9D, 0x88, 0xAD, 0xE1, 0x24, 0xDB, 0xF9, 0x50, 0xB2, 0xC4, 0x27, 0xBC, 0x40, 0x19, - 0x63, 0xB9, 0x61, 0x25, 0xC0, 0xA2, 0xAE, 0xBB, 0x7F, 0xB3, 0xF9, 0x8E, 0x48, 0x7A, 0x7F, 0xA6 }, - }, - { - { 0xAF, 0x6B, 0x80, 0x51, 0x47, 0x14, 0x0A, 0x0E, 0x41, 0x81, 0xD8, 0x6A, 0x7E, 0x8F, 0x07, 0x69, - 0xB6, 0x1D, 0x46, 0xD7, 0xB6, 0xFA, 0xC6, 0xE6, 0xF9, 0x59, 0x6D, 0xE9, 0x4A, 0xA8, 0xE2, 0xE8 }, - }, - { - { 0xAF, 0xB5, 0x7F, 0x89, 0x64, 0x9A, 0xB3, 0x0A, 0xF4, 0x88, 0x43, 0x05, 0xAF, 0x88, 0xEE, 0x56, - 0x5B, 0xA8, 0xD3, 0xC5, 0xC3, 0x57, 0x4A, 0xB8, 0x59, 0xFC, 0x07, 0x23, 0x2F, 0xC6, 0x73, 0xB9 }, - }, - { - { 0xAF, 0xBB, 0x40, 0x3C, 0xAD, 0x0D, 0x19, 0xCC, 0x26, 0xAE, 0x5B, 0x1E, 0x31, 0x0A, 0xC1, 0xAE, - 0x79, 0x47, 0x1B, 0xAD, 0x2B, 0xD7, 0x7B, 0xE4, 0x0F, 0x12, 0x50, 0x4C, 0x42, 0xE5, 0x22, 0x0B }, - }, - { - { 0xAF, 0xE7, 0xB8, 0xEE, 0xFD, 0xF5, 0x4E, 0x7F, 0x1C, 0x5A, 0x6B, 0xED, 0xF7, 0x54, 0xCE, 0x97, - 0x0F, 0xA1, 0x19, 0x59, 0xE7, 0x80, 0x38, 0xCC, 0x36, 0x8A, 0xC7, 0x78, 0xB7, 0x5C, 0x92, 0x4B }, - }, - { - { 0xAF, 0xE9, 0x28, 0xC5, 0x84, 0x8E, 0xCE, 0x02, 0xC2, 0xBD, 0xDC, 0xD9, 0x4B, 0x5A, 0x59, 0x30, - 0x31, 0x50, 0x9D, 0x78, 0x2B, 0xEB, 0x50, 0x20, 0xAC, 0xB3, 0x33, 0x71, 0x49, 0x18, 0xF0, 0x39 }, - }, - { - { 0xB0, 0x16, 0x77, 0xD9, 0xCA, 0x50, 0x46, 0x3F, 0x21, 0x8A, 0x5D, 0x33, 0x9E, 0x72, 0xF8, 0x59, - 0xF8, 0xB4, 0x1A, 0xE7, 0x9D, 0xCB, 0x8F, 0xA1, 0x65, 0x08, 0x45, 0xCE, 0xC4, 0xD8, 0xCB, 0x87 }, - }, - { - { 0xB0, 0x1E, 0xB1, 0x82, 0x68, 0x1A, 0xA9, 0x5D, 0x7B, 0xEA, 0xAF, 0x53, 0xBA, 0x75, 0x5B, 0x7F, - 0x3D, 0x0F, 0xB7, 0x97, 0x76, 0xD5, 0x62, 0xB9, 0x93, 0x8F, 0xFE, 0x98, 0x8D, 0x99, 0xB3, 0x13 }, - }, - { - { 0xB0, 0x5C, 0x14, 0x33, 0x61, 0x75, 0x9B, 0xE1, 0x52, 0xFD, 0x76, 0xA5, 0xFF, 0xA4, 0x87, 0x2D, - 0xD4, 0x2E, 0xA0, 0x60, 0xAE, 0x40, 0xA3, 0x83, 0x13, 0xB7, 0xB5, 0x4A, 0xEC, 0x06, 0x73, 0xC2 }, - }, - { - { 0xB0, 0x62, 0x43, 0x51, 0xFD, 0x68, 0x51, 0x23, 0x01, 0x38, 0x56, 0xEC, 0x40, 0x63, 0x25, 0xFC, - 0xCB, 0x16, 0x45, 0x76, 0x50, 0xA8, 0x71, 0xF5, 0xFB, 0x91, 0x5D, 0xDD, 0x75, 0x4A, 0x3B, 0xC9 }, - }, - { - { 0xB0, 0xB6, 0x32, 0x1C, 0x45, 0x9B, 0xDB, 0x78, 0x91, 0x8E, 0xC3, 0x16, 0xBD, 0x36, 0xEC, 0x5F, - 0x30, 0x55, 0x8E, 0xE0, 0x2E, 0xCC, 0x51, 0xE3, 0x77, 0xC5, 0xF8, 0xAB, 0xA4, 0x1D, 0xBA, 0x6D }, - }, - { - { 0xB0, 0xE0, 0xE1, 0x6C, 0x5F, 0x69, 0x1F, 0x66, 0xA9, 0x57, 0x3B, 0xD3, 0xCF, 0x43, 0xF9, 0xDF, - 0xD2, 0xAD, 0x3E, 0x56, 0x15, 0x54, 0x63, 0x7F, 0x1E, 0x7B, 0x71, 0x91, 0x4D, 0x62, 0x73, 0x38 }, - }, - { - { 0xB1, 0x61, 0xD6, 0x09, 0x5B, 0x6E, 0x9B, 0x1D, 0xB5, 0x16, 0xDA, 0x1C, 0x2D, 0xEF, 0x9C, 0xE9, - 0x11, 0xC7, 0xA5, 0xBB, 0x55, 0xEF, 0xF5, 0x05, 0x66, 0xD5, 0xD1, 0xE0, 0xDC, 0x4F, 0x45, 0xCD }, - }, - { - { 0xB1, 0x91, 0x9D, 0x6C, 0xFA, 0xC2, 0x0D, 0x03, 0x47, 0x76, 0x87, 0x1A, 0xB0, 0xA2, 0x57, 0x8A, - 0xC0, 0xB2, 0xDD, 0xB6, 0x8B, 0xE1, 0xDC, 0x75, 0x91, 0x80, 0x44, 0x1F, 0x05, 0x3A, 0x27, 0x2C }, - }, - { - { 0xB1, 0x92, 0x30, 0x7C, 0xFA, 0xEE, 0x42, 0x7B, 0x76, 0x7B, 0xC2, 0xF9, 0x9B, 0xC2, 0x26, 0x74, - 0x26, 0x0A, 0x4E, 0x8E, 0x1E, 0x6B, 0x36, 0x19, 0x8C, 0x2F, 0x4E, 0xEA, 0x67, 0xCA, 0x85, 0xEF }, - }, - { - { 0xB1, 0xA5, 0x89, 0x8E, 0x3B, 0x0D, 0x0A, 0x7A, 0x80, 0x76, 0x79, 0x3D, 0x6C, 0x63, 0xA3, 0x22, - 0xEA, 0xB7, 0x1F, 0x7E, 0x28, 0x74, 0x5D, 0xEF, 0xF5, 0xA0, 0xC3, 0x3A, 0x8E, 0xEC, 0xE4, 0xFA }, - }, - { - { 0xB2, 0xAF, 0x84, 0x2D, 0x01, 0x52, 0x07, 0x85, 0x37, 0x0E, 0x3E, 0xB5, 0x9C, 0xB8, 0x89, 0x29, - 0xDE, 0x38, 0xA7, 0x15, 0xBF, 0x4C, 0xEF, 0x45, 0xE5, 0x95, 0xCE, 0xED, 0x3F, 0xEA, 0x26, 0x79 }, - }, - { - { 0xB2, 0xBA, 0x3B, 0x49, 0xB8, 0xE5, 0x84, 0x51, 0x81, 0x6B, 0x10, 0x83, 0x6C, 0x4F, 0x1C, 0xA6, - 0xA3, 0x39, 0x37, 0xCE, 0xB8, 0xF0, 0xC0, 0x4B, 0x9F, 0x75, 0x8C, 0x5E, 0xB4, 0x78, 0x41, 0x1F }, - }, - { - { 0xB2, 0xC6, 0xF7, 0xC6, 0x2F, 0xA5, 0x6A, 0x4E, 0x57, 0xB7, 0x62, 0xA8, 0x9C, 0x3C, 0x55, 0xDD, - 0x81, 0xC1, 0x82, 0x7E, 0xDF, 0xB0, 0xD4, 0x41, 0x80, 0xE4, 0xFA, 0xDC, 0xEB, 0x23, 0x72, 0x73 }, - }, - { - { 0xB2, 0xDC, 0x86, 0x25, 0x6C, 0xCF, 0xF4, 0xBB, 0x14, 0xFD, 0x70, 0x27, 0x9F, 0xCC, 0x3C, 0xE9, - 0x25, 0xC5, 0x1F, 0xB7, 0x17, 0xE5, 0x87, 0x6F, 0x29, 0x1B, 0xA1, 0x70, 0x73, 0x43, 0x85, 0x68 }, - }, - { - { 0xB2, 0xE5, 0xFA, 0xF7, 0xEE, 0xBE, 0xD8, 0xC2, 0x9C, 0x7B, 0x83, 0x65, 0x3A, 0xF3, 0xFC, 0x9F, - 0x8D, 0xE4, 0x6E, 0xE5, 0x3B, 0x64, 0x9C, 0x94, 0x53, 0x87, 0xB0, 0xCF, 0xF8, 0xB7, 0x14, 0x93 }, - }, - { - { 0xB3, 0x07, 0x32, 0xE7, 0x56, 0x52, 0x9E, 0x38, 0x59, 0xC4, 0x31, 0x23, 0x86, 0x19, 0x53, 0x34, - 0x79, 0x8E, 0x43, 0xC4, 0xBE, 0xBC, 0xC4, 0xCF, 0xED, 0xFB, 0x2E, 0xBF, 0xA0, 0xDD, 0x80, 0x0E }, - }, - { - { 0xB3, 0x0D, 0x88, 0x44, 0x30, 0x43, 0xF5, 0xF3, 0x72, 0x32, 0xBB, 0x9B, 0xAC, 0xB9, 0x94, 0xC5, - 0xBA, 0xE9, 0x3A, 0x46, 0xFC, 0x87, 0xF1, 0x51, 0x29, 0xC9, 0x74, 0x69, 0xA5, 0x81, 0x4E, 0xCA }, - }, - { - { 0xB3, 0x19, 0xAF, 0x08, 0x28, 0x68, 0x1F, 0x97, 0x35, 0xA4, 0x8D, 0x11, 0x17, 0x39, 0xB8, 0x62, - 0x89, 0xAE, 0xF7, 0xFB, 0x81, 0x7C, 0x04, 0x7F, 0x12, 0x75, 0xA5, 0x87, 0xA7, 0x32, 0x2C, 0x0B }, - }, - { - { 0xB3, 0x1A, 0xF0, 0xC2, 0xE5, 0x1E, 0xA2, 0x1C, 0x91, 0x04, 0xF9, 0x4F, 0xAA, 0x66, 0xE0, 0xCC, - 0xC0, 0x41, 0x34, 0xD5, 0x80, 0x9A, 0x2A, 0x26, 0x70, 0xA3, 0xB7, 0xBC, 0x7D, 0xD9, 0x64, 0xF8 }, - }, - { - { 0xB3, 0x35, 0x93, 0x3F, 0xC9, 0x72, 0x3E, 0x9D, 0xAA, 0x0D, 0x0C, 0xE7, 0x1C, 0x66, 0x5A, 0xDD, - 0xA5, 0xAB, 0xDA, 0xF3, 0x5A, 0xDB, 0x10, 0xD7, 0x6E, 0xDC, 0x9C, 0x8E, 0x4E, 0xBA, 0x05, 0x6E }, - }, - { - { 0xB3, 0x95, 0x0E, 0x0B, 0xD2, 0x2C, 0x39, 0xFA, 0xB1, 0xDB, 0xD7, 0xBE, 0xB7, 0x42, 0x56, 0xAF, - 0xB1, 0x1D, 0xCB, 0x26, 0x35, 0x69, 0x70, 0x83, 0xD6, 0x8F, 0xDB, 0xEE, 0x80, 0xB0, 0x5F, 0x54 }, - }, - { - { 0xB3, 0xE6, 0x42, 0x06, 0x6E, 0x41, 0x78, 0x67, 0xD9, 0x0F, 0xB9, 0xB2, 0xBA, 0x15, 0x41, 0x98, - 0xA5, 0xC5, 0xF6, 0xCC, 0x82, 0x9B, 0x51, 0x39, 0xDF, 0xD6, 0x91, 0xE5, 0x1A, 0xD3, 0x74, 0xAD }, - }, - { - { 0xB3, 0xF4, 0xB1, 0x6F, 0x8E, 0xCE, 0xBB, 0x41, 0x47, 0x4F, 0x92, 0x4F, 0xEE, 0xF9, 0xB0, 0xBD, - 0x97, 0x9B, 0x36, 0x36, 0xC3, 0x4F, 0xF2, 0x72, 0x3F, 0x67, 0x3C, 0x8E, 0xEE, 0x2A, 0xF1, 0x52 }, - }, - { - { 0xB4, 0x02, 0x2C, 0x24, 0x25, 0xA5, 0xB7, 0x5A, 0x9B, 0x5E, 0x80, 0x08, 0x1C, 0x95, 0x3A, 0xD3, - 0xDB, 0x93, 0xB2, 0x52, 0xDA, 0x0E, 0x25, 0xEC, 0x8B, 0xAD, 0x0C, 0x36, 0xAA, 0x11, 0x09, 0x2E }, - }, - { - { 0xB4, 0x2A, 0x78, 0xB0, 0x6F, 0x28, 0x15, 0xD4, 0xA0, 0x49, 0xFE, 0x83, 0xF3, 0xD2, 0x9B, 0x38, - 0x5B, 0x90, 0xD3, 0xD0, 0x0B, 0xA8, 0x57, 0xD6, 0x2F, 0x19, 0x67, 0x81, 0xDD, 0xA3, 0xD1, 0x85 }, - }, - { - { 0xB4, 0x2C, 0x64, 0xF0, 0x25, 0xDF, 0x8F, 0x37, 0x0E, 0xB7, 0xA4, 0x69, 0x94, 0x2B, 0x97, 0xE2, - 0xF8, 0xB5, 0xF4, 0xBF, 0xAC, 0xC4, 0xCF, 0x17, 0xD2, 0xA0, 0x8F, 0xCA, 0x57, 0xBB, 0xC4, 0x9B }, - }, - { - { 0xB4, 0xAE, 0x2A, 0x6B, 0xFC, 0xA5, 0x31, 0xC9, 0x9C, 0x69, 0xB3, 0x5A, 0xFE, 0x67, 0x54, 0xFC, - 0x49, 0x27, 0x5B, 0x6C, 0xCA, 0xCD, 0xC8, 0x26, 0x9C, 0x27, 0x0C, 0xDB, 0x2B, 0x58, 0xC0, 0x8F }, - }, - { - { 0xB4, 0xD4, 0x67, 0xFC, 0x5E, 0x97, 0xDB, 0x25, 0xA1, 0xFD, 0xB0, 0x06, 0xD2, 0x77, 0x66, 0xB9, - 0x99, 0x5B, 0xB9, 0xC7, 0x7B, 0x66, 0x43, 0x97, 0x08, 0xA4, 0x59, 0xB0, 0x43, 0xD0, 0x33, 0x24 }, - }, - { - { 0xB4, 0xED, 0xCD, 0x6F, 0x8A, 0x01, 0x82, 0xB7, 0x17, 0xF0, 0x6F, 0xE1, 0xD7, 0xAC, 0x9C, 0x62, - 0x33, 0xD4, 0x38, 0x22, 0xE9, 0xFD, 0x14, 0xDB, 0x98, 0xF7, 0xF8, 0x4E, 0x32, 0x79, 0x6D, 0x08 }, - }, - { - { 0xB4, 0xF1, 0xEF, 0x4A, 0xA5, 0x1F, 0x02, 0x1E, 0xD2, 0x66, 0x26, 0x44, 0xCE, 0xDA, 0x31, 0x1D, - 0x86, 0xF5, 0x64, 0x0D, 0xAF, 0xE9, 0xA4, 0x39, 0x18, 0x89, 0x37, 0xD8, 0x09, 0x13, 0x90, 0x75 }, - }, - { - { 0xB5, 0x25, 0x36, 0x2F, 0x68, 0x54, 0x4A, 0xC1, 0x8C, 0x2F, 0x5C, 0x19, 0x51, 0x47, 0x94, 0x40, - 0x45, 0x8C, 0x59, 0xD7, 0xBB, 0x00, 0x5F, 0x19, 0x91, 0x17, 0x51, 0xB4, 0xD3, 0x97, 0x1D, 0x5C }, - }, - { - { 0xB5, 0x3B, 0x30, 0x01, 0x2D, 0xBC, 0xA0, 0x5E, 0x6A, 0xF7, 0xEB, 0x9C, 0xA2, 0xA7, 0xDD, 0xA7, - 0xDB, 0x0F, 0x61, 0x21, 0x6C, 0x9C, 0xA4, 0x7D, 0x48, 0x4F, 0xA0, 0x97, 0xCF, 0xBA, 0x2C, 0x46 }, - }, - { - { 0xB5, 0x53, 0x5E, 0x99, 0x84, 0x36, 0xBF, 0x17, 0x42, 0xCF, 0x3F, 0xB1, 0xC1, 0x9A, 0x66, 0x6B, - 0xDE, 0x55, 0x09, 0x4B, 0x3E, 0xD5, 0xCF, 0xB2, 0x09, 0x5D, 0xF0, 0x8E, 0xC6, 0xDD, 0xF6, 0x76 }, - }, - { - { 0xB5, 0xB8, 0xD0, 0x08, 0x69, 0xDD, 0x78, 0x64, 0x9D, 0xAB, 0xD4, 0x41, 0x14, 0x08, 0xA8, 0xFF, - 0x1A, 0xC5, 0x43, 0xEC, 0xA8, 0x80, 0xAE, 0xED, 0xB5, 0x83, 0x28, 0xED, 0xDA, 0x47, 0x1B, 0xFC }, - }, - { - { 0xB5, 0xE2, 0xAA, 0x4C, 0x7F, 0xA4, 0x65, 0xA9, 0x72, 0xAF, 0x17, 0x0E, 0x21, 0x76, 0xD1, 0x83, - 0x51, 0xE6, 0x8D, 0x94, 0x95, 0x0D, 0x87, 0x55, 0x9C, 0x65, 0x20, 0x43, 0xFE, 0xCB, 0x05, 0x2D }, - }, - { - { 0xB5, 0xE5, 0xDC, 0xDE, 0xCB, 0x8D, 0xEB, 0x27, 0x13, 0x4F, 0x02, 0xA5, 0x18, 0x79, 0x43, 0x16, - 0xF0, 0x8F, 0xAF, 0x9C, 0x2B, 0x1F, 0xDA, 0xD6, 0xD4, 0x86, 0x61, 0xF5, 0x7E, 0xA6, 0x45, 0xD9 }, - }, - { - { 0xB5, 0xEF, 0x42, 0xC4, 0xBC, 0xED, 0xF1, 0x7B, 0xEC, 0xC7, 0x5B, 0xF4, 0x63, 0x66, 0x49, 0xCE, - 0xBF, 0xF8, 0x71, 0x1B, 0xCE, 0xFF, 0xFA, 0x69, 0x5C, 0xC2, 0x52, 0xFA, 0x57, 0x4D, 0x42, 0x18 }, - }, - { - { 0xB6, 0x60, 0x21, 0xDE, 0x5D, 0xE8, 0x81, 0x36, 0xBB, 0x09, 0x49, 0x1A, 0x46, 0xE0, 0xFC, 0x6B, - 0x69, 0x33, 0x9B, 0xD9, 0xAC, 0xC9, 0xA4, 0xEA, 0x84, 0xCC, 0x76, 0x4C, 0x39, 0xF5, 0x70, 0xA3 }, - }, - { - { 0xB6, 0x66, 0x7D, 0x8E, 0xD2, 0x85, 0x85, 0x10, 0x8D, 0x3D, 0x97, 0x12, 0x72, 0xBC, 0xB5, 0x17, - 0x82, 0x84, 0x5B, 0xDD, 0xEB, 0x32, 0xFA, 0xBA, 0x96, 0x31, 0xE5, 0x0C, 0x0C, 0x04, 0x0B, 0x54 }, - }, - { - { 0xB6, 0x67, 0xDC, 0x46, 0x65, 0x60, 0x6A, 0xCA, 0xEE, 0xA4, 0xC1, 0x4D, 0xA9, 0x1D, 0xEC, 0x87, - 0x6C, 0x2E, 0xA3, 0x76, 0x0B, 0xCB, 0x1B, 0x1D, 0x50, 0xD7, 0x55, 0x98, 0xA2, 0x61, 0x8C, 0x56 }, - }, - { - { 0xB6, 0x82, 0x3C, 0x9D, 0xBC, 0x8E, 0x8C, 0x05, 0x4B, 0xCF, 0x60, 0xF2, 0x38, 0x21, 0xAC, 0x6C, - 0x58, 0x19, 0x73, 0x51, 0xEA, 0xCF, 0xA5, 0x57, 0x4C, 0xF0, 0x41, 0xB4, 0xCE, 0x6B, 0x84, 0x04 }, - }, - { - { 0xB6, 0x8D, 0x56, 0xB6, 0x8C, 0xC0, 0x99, 0xFF, 0xDE, 0xE7, 0xD5, 0x70, 0x1F, 0x1E, 0x1E, 0x97, - 0x26, 0xDC, 0x75, 0x7C, 0x22, 0x22, 0xB0, 0xA0, 0x1E, 0x4A, 0x32, 0x72, 0xF8, 0xB3, 0x84, 0xF2 }, - }, - { - { 0xB6, 0x90, 0x8F, 0xAB, 0x0C, 0xA2, 0xD7, 0xD6, 0x5D, 0xCA, 0x8B, 0x10, 0xD0, 0x1F, 0x08, 0x48, - 0x13, 0x1C, 0x1C, 0x32, 0x10, 0xA2, 0x5B, 0x47, 0xC7, 0x9E, 0x33, 0xC4, 0xAC, 0x09, 0x5F, 0x7E }, - }, - { - { 0xB6, 0xCD, 0x3F, 0x77, 0x3A, 0xE4, 0x02, 0xE5, 0x2D, 0xFE, 0x4F, 0x14, 0xBD, 0x11, 0x49, 0x5C, - 0x9C, 0xA8, 0x80, 0xF5, 0x3D, 0x4F, 0x5A, 0x7A, 0x24, 0x96, 0xE4, 0xA9, 0xAE, 0x29, 0x53, 0x80 }, - }, - { - { 0xB7, 0x02, 0x1A, 0x28, 0x5D, 0x89, 0xA7, 0xE9, 0xDE, 0x1A, 0xFC, 0xFA, 0x8F, 0x66, 0x6A, 0x55, - 0x92, 0xBB, 0xA6, 0xD2, 0xAC, 0x28, 0xDD, 0x62, 0x74, 0x7E, 0xC1, 0x86, 0x19, 0x1C, 0x57, 0xF7 }, - }, - { - { 0xB7, 0x06, 0xDE, 0x1B, 0xD1, 0xEE, 0x2F, 0x4C, 0xEC, 0x6C, 0xE0, 0x92, 0x02, 0x2B, 0x49, 0x32, - 0x81, 0xE2, 0x9A, 0x21, 0x73, 0x50, 0x8C, 0x9B, 0xD0, 0xFB, 0xC2, 0xC3, 0xD9, 0x68, 0xE3, 0xE7 }, - }, - { - { 0xB7, 0x1F, 0x29, 0x1E, 0x6E, 0xC6, 0xBD, 0x6C, 0x4F, 0x2B, 0x81, 0xF7, 0xF7, 0x21, 0x06, 0x73, - 0xE9, 0x73, 0x08, 0xAF, 0xF1, 0x24, 0x3F, 0x26, 0x99, 0x5A, 0x25, 0xFA, 0x23, 0x0C, 0xFE, 0x4C }, - }, - { - { 0xB7, 0x45, 0x85, 0x05, 0xC5, 0x17, 0x90, 0x14, 0x9C, 0x5E, 0x98, 0x00, 0xFD, 0x22, 0x74, 0x8A, - 0x1D, 0x44, 0x66, 0x5F, 0x68, 0x34, 0xBA, 0x84, 0x4E, 0x9A, 0x0C, 0x32, 0x31, 0x4A, 0x57, 0x21 }, - }, - { - { 0xB7, 0x4C, 0x89, 0x90, 0x0B, 0xBC, 0x4C, 0xE2, 0x8D, 0xCA, 0x03, 0x3F, 0x80, 0x08, 0x70, 0x03, - 0xD1, 0x89, 0xEC, 0xDD, 0x54, 0xC3, 0xFD, 0x23, 0x79, 0xDA, 0x5E, 0x22, 0x17, 0x57, 0xBC, 0x73 }, - }, - { - { 0xB7, 0x65, 0xC9, 0x6B, 0x69, 0x18, 0xAB, 0x88, 0xBF, 0xBE, 0xC4, 0x32, 0xA7, 0x5B, 0x79, 0x97, - 0xDF, 0xFA, 0x55, 0x96, 0xD1, 0x13, 0xD1, 0x6F, 0x13, 0x7E, 0xFE, 0x7D, 0x76, 0x2B, 0xE1, 0x52 }, - }, - { - { 0xB7, 0x9F, 0xCA, 0x4D, 0x47, 0x92, 0xEC, 0x5E, 0x5A, 0x74, 0x06, 0x59, 0x81, 0x3A, 0x0F, 0x46, - 0x08, 0xEA, 0xF9, 0xBA, 0x9C, 0xBB, 0xA8, 0xA0, 0xF8, 0xDA, 0xE1, 0xDD, 0xBB, 0xE6, 0x1E, 0x77 }, - }, - { - { 0xB8, 0x30, 0xC5, 0x8C, 0x49, 0x50, 0x7D, 0xD9, 0x85, 0x7C, 0xC0, 0xCE, 0x37, 0xFA, 0xC7, 0xFA, - 0x3C, 0xDE, 0xA0, 0x4E, 0x9B, 0x64, 0x3E, 0x38, 0xD5, 0x3B, 0x38, 0x1D, 0xB8, 0xFB, 0x89, 0x5D }, - }, - { - { 0xB8, 0x37, 0xC3, 0x7E, 0xE9, 0x9C, 0x18, 0x2B, 0x07, 0xAD, 0x6D, 0x79, 0x1F, 0x53, 0x9E, 0x22, - 0xE0, 0x4E, 0x0D, 0xDB, 0x16, 0xF9, 0xC1, 0x57, 0xA1, 0x35, 0x20, 0xAC, 0xAE, 0xD0, 0x7D, 0xCA }, - }, - { - { 0xB8, 0x74, 0x36, 0x95, 0x1C, 0xEC, 0x37, 0x7E, 0xEF, 0x73, 0xDE, 0x4B, 0x74, 0xF2, 0x83, 0xC4, - 0x2B, 0x2C, 0xCB, 0x1C, 0xA3, 0x7C, 0x5B, 0x30, 0xAA, 0xD6, 0x55, 0xA7, 0x40, 0x1A, 0x3D, 0x2F }, - }, - { - { 0xB8, 0x8C, 0xE8, 0x1A, 0x7B, 0x4B, 0x62, 0x65, 0x71, 0x0F, 0x38, 0xD0, 0xCA, 0x3E, 0x01, 0xFF, - 0xAB, 0xDE, 0x0F, 0xC2, 0x48, 0x3E, 0x21, 0xB8, 0xF1, 0xA5, 0xFF, 0x48, 0x3B, 0x2D, 0x60, 0xCE }, - }, - { - { 0xB9, 0x42, 0x94, 0x19, 0xF2, 0x9F, 0xE3, 0x5C, 0xD8, 0xCF, 0x94, 0x92, 0xD5, 0xA9, 0xB5, 0xD2, - 0x24, 0x1D, 0xDA, 0x4E, 0x12, 0x15, 0x6F, 0x37, 0x4C, 0xEC, 0x78, 0x4F, 0x44, 0x5B, 0x43, 0xF2 }, - }, - { - { 0xB9, 0x8D, 0x83, 0x38, 0x55, 0xC3, 0x67, 0x88, 0x62, 0xB6, 0x2F, 0x36, 0x50, 0xDB, 0x00, 0xA3, - 0x45, 0xF4, 0x6A, 0x0E, 0x8E, 0x01, 0x1A, 0x20, 0x01, 0x3F, 0xD8, 0xED, 0xCE, 0x25, 0x27, 0x0D }, - }, - { - { 0xB9, 0x9C, 0xDB, 0x82, 0xA9, 0x77, 0x31, 0x12, 0xC0, 0x67, 0x17, 0xD7, 0x74, 0x50, 0x51, 0xA7, - 0x01, 0xF3, 0x00, 0xD5, 0x25, 0xD0, 0x55, 0x6E, 0x67, 0x5A, 0x04, 0xCA, 0xEF, 0x26, 0x22, 0x89 }, - }, - { - { 0xB9, 0xCC, 0x92, 0xF7, 0x8C, 0x2C, 0x19, 0x57, 0xDB, 0xB6, 0xC4, 0xA5, 0xE4, 0x25, 0x44, 0x68, - 0xFB, 0xCD, 0x88, 0xB1, 0xFD, 0x9F, 0x98, 0xFA, 0x6D, 0x76, 0x08, 0x70, 0x9E, 0xBE, 0x92, 0x8D }, - }, - { - { 0xBA, 0x0A, 0x8C, 0xC1, 0xC2, 0xF6, 0x62, 0x9B, 0x78, 0xAF, 0xEF, 0x1D, 0x22, 0xD5, 0x57, 0x7A, - 0x13, 0x81, 0x13, 0xC4, 0xC6, 0x21, 0x89, 0x48, 0x47, 0x44, 0xC2, 0x92, 0x50, 0x24, 0x49, 0x7C }, - }, - { - { 0xBA, 0x18, 0x2C, 0x1B, 0x75, 0xD8, 0xDF, 0xD1, 0x18, 0x92, 0xE4, 0x77, 0x59, 0x59, 0xAD, 0x8A, - 0x8C, 0x78, 0x2C, 0xEF, 0x60, 0xEC, 0xEA, 0xBE, 0x56, 0x19, 0x72, 0x9B, 0xB8, 0x1B, 0x4A, 0x10 }, - }, - { - { 0xBA, 0x2F, 0xDE, 0x44, 0xDD, 0xAE, 0x01, 0x8A, 0x51, 0x06, 0xC5, 0x0C, 0x36, 0xA2, 0x33, 0x0D, - 0xF4, 0x30, 0x68, 0x9E, 0x0A, 0x6D, 0xCA, 0x6A, 0xBF, 0x85, 0x7F, 0xA2, 0xFD, 0xED, 0xE8, 0xD4 }, - }, - { - { 0xBA, 0x51, 0xAF, 0xF5, 0xD5, 0xD3, 0x10, 0x5F, 0x34, 0xA2, 0xB3, 0x3A, 0x83, 0xE3, 0xAD, 0xFD, - 0x12, 0xD7, 0x9C, 0xA6, 0x05, 0x90, 0x9D, 0x96, 0x03, 0x3E, 0x32, 0xA5, 0xCF, 0x2F, 0x71, 0xF6 }, - }, - { - { 0xBA, 0xCF, 0x5E, 0x99, 0xF5, 0x7F, 0x78, 0xCC, 0x32, 0xF2, 0xAF, 0x8D, 0x4E, 0x80, 0x6A, 0x0A, - 0x36, 0xCE, 0x9B, 0x42, 0xE9, 0xC7, 0x5C, 0x54, 0x8D, 0xED, 0x55, 0xD2, 0x48, 0x62, 0xCA, 0x17 }, - }, - { - { 0xBB, 0x0B, 0xD1, 0xE6, 0x9F, 0xF4, 0xA3, 0x89, 0x51, 0x61, 0x13, 0x55, 0x2C, 0x17, 0xAB, 0x77, - 0x82, 0xA7, 0xEB, 0xBA, 0xEA, 0x0B, 0xE3, 0x9F, 0x58, 0x92, 0x84, 0x1F, 0x1F, 0x74, 0xD2, 0x98 }, - }, - { - { 0xBB, 0x13, 0xDF, 0x73, 0xB6, 0xE8, 0x89, 0x77, 0x7C, 0x4D, 0x85, 0xEC, 0x93, 0xB8, 0x3E, 0xA8, - 0xBB, 0x95, 0x43, 0xF9, 0xFC, 0x08, 0xC2, 0xB3, 0x1C, 0x02, 0xAC, 0x72, 0xB3, 0x1A, 0x09, 0x0D }, - }, - { - { 0xBB, 0x48, 0x13, 0xED, 0xFC, 0xF7, 0x4A, 0x4F, 0x12, 0xD9, 0x8F, 0x99, 0x6B, 0xF7, 0x98, 0xD4, - 0xED, 0xE3, 0xCB, 0xB7, 0x00, 0x07, 0x31, 0x7A, 0x2C, 0x6B, 0x54, 0x9D, 0xBF, 0x92, 0xA8, 0x5E }, - }, - { - { 0xBB, 0x5C, 0xB3, 0x78, 0xB7, 0xB9, 0x48, 0x7F, 0xA6, 0x1B, 0xC0, 0x91, 0x3D, 0xA1, 0xDF, 0x26, - 0xA1, 0xCF, 0xEF, 0xF7, 0x45, 0x2D, 0x9B, 0xA3, 0x6C, 0xAC, 0x47, 0xA8, 0x5C, 0x7F, 0xF3, 0x48 }, - }, - { - { 0xBB, 0x77, 0x41, 0x99, 0x17, 0x89, 0x5C, 0x74, 0x0F, 0x39, 0x61, 0x60, 0x1B, 0x99, 0xB5, 0xC2, - 0x25, 0x67, 0x37, 0xAA, 0x6C, 0x6E, 0x88, 0x27, 0x48, 0x5E, 0x44, 0x8E, 0x69, 0x74, 0xB1, 0x6B }, - }, - { - { 0xBB, 0xAA, 0x32, 0x35, 0x0E, 0x2D, 0xC5, 0x06, 0x07, 0xAA, 0xC6, 0x5B, 0x29, 0x81, 0xD3, 0x97, - 0xC8, 0xB9, 0xAF, 0x51, 0x22, 0x38, 0xCA, 0xD4, 0xCB, 0xB3, 0x10, 0x07, 0x64, 0xE7, 0xA3, 0x94 }, - }, - { - { 0xBB, 0xAD, 0x8A, 0x81, 0x54, 0xD7, 0xAB, 0x8E, 0x3F, 0x3A, 0x67, 0x09, 0x7B, 0x4D, 0xB7, 0x44, - 0x8F, 0x4B, 0x07, 0xE4, 0x7C, 0xDA, 0xA6, 0xB8, 0x36, 0xED, 0xD2, 0x67, 0x68, 0xF9, 0x64, 0x92 }, - }, - { - { 0xBB, 0xE6, 0xB5, 0x24, 0x36, 0x69, 0x0A, 0x58, 0x57, 0x74, 0x91, 0x27, 0xCC, 0xB6, 0xAB, 0x5B, - 0x16, 0xD6, 0xB3, 0x06, 0x6C, 0x71, 0x27, 0x25, 0xA2, 0xC5, 0xFC, 0x4F, 0x61, 0xB8, 0xA9, 0x88 }, - }, - { - { 0xBC, 0x14, 0x2E, 0xBA, 0xC2, 0x78, 0xA8, 0xFE, 0x8C, 0xA8, 0xBC, 0x2C, 0x62, 0xFB, 0xCC, 0x40, - 0x17, 0xFF, 0x24, 0x96, 0x98, 0xBE, 0xED, 0xFB, 0x1E, 0xF3, 0x6F, 0x37, 0x5F, 0xB3, 0x9F, 0x72 }, - }, - { - { 0xBC, 0x1A, 0x3B, 0x83, 0x46, 0xA5, 0x18, 0x4E, 0x8F, 0xE2, 0xA9, 0x36, 0xD6, 0xD9, 0xCE, 0x2C, - 0xBE, 0x3A, 0x92, 0x05, 0x54, 0xE0, 0x60, 0xF9, 0x07, 0x97, 0xF9, 0x8F, 0xEE, 0x62, 0xA8, 0x52 }, - }, - { - { 0xBC, 0x3F, 0x40, 0xAE, 0xDC, 0x2D, 0xDF, 0x00, 0x3F, 0x3A, 0x5C, 0xCA, 0x77, 0xBF, 0x3B, 0x63, - 0x26, 0xC9, 0x3C, 0xCF, 0xA1, 0x6D, 0x1C, 0xC1, 0xBC, 0xF1, 0x3D, 0x5E, 0x46, 0xEA, 0x0D, 0xB6 }, - }, - { - { 0xBC, 0x98, 0x39, 0xC8, 0xB9, 0x22, 0xF6, 0x54, 0x57, 0x67, 0xA2, 0xBA, 0x46, 0x5A, 0x5B, 0xEA, - 0x9A, 0xA1, 0x84, 0x11, 0x52, 0x99, 0x4A, 0x6C, 0xF4, 0x67, 0x83, 0xAE, 0x49, 0x98, 0xAF, 0xCC }, - }, - { - { 0xBC, 0xE9, 0x07, 0x86, 0x57, 0x91, 0xAE, 0x71, 0x57, 0x9C, 0x64, 0xEE, 0x76, 0xB1, 0xAE, 0x09, - 0xF6, 0x55, 0x22, 0x2D, 0x38, 0x7B, 0xA7, 0xC1, 0x11, 0xF6, 0xA3, 0x0B, 0x7C, 0xD3, 0x98, 0x4D }, - }, - { - { 0xBD, 0x20, 0x20, 0x24, 0x96, 0x06, 0xC0, 0x1C, 0xE7, 0x70, 0xB2, 0x56, 0xE3, 0x8E, 0x82, 0x6B, - 0x87, 0x42, 0x04, 0xCD, 0x70, 0x44, 0x69, 0x6E, 0x6F, 0xBA, 0x53, 0x58, 0xBD, 0x44, 0xD6, 0x9A }, - }, - { - { 0xBD, 0x2E, 0x2F, 0x37, 0xC9, 0x66, 0xC3, 0x86, 0xD9, 0x70, 0x44, 0xFD, 0xE3, 0xE3, 0xF9, 0x00, - 0xFB, 0x1A, 0x0B, 0x04, 0x03, 0xB5, 0x81, 0x72, 0x5F, 0x34, 0xE3, 0xC1, 0x90, 0x05, 0x60, 0x56 }, - }, - { - { 0xBD, 0x4F, 0x30, 0xA1, 0x05, 0xD4, 0xC4, 0x5A, 0x36, 0x7F, 0x55, 0xDA, 0xE7, 0x33, 0x84, 0x75, - 0x5E, 0x01, 0x67, 0x8A, 0x32, 0x1F, 0xF0, 0x4C, 0x99, 0xD2, 0xD5, 0x2A, 0x2B, 0xFD, 0x7A, 0xCF }, - }, - { - { 0xBD, 0xD5, 0x42, 0x49, 0xDD, 0xD5, 0x4B, 0xC7, 0x2A, 0xA7, 0xA7, 0x5F, 0x77, 0x63, 0xA8, 0x38, - 0xCF, 0x4B, 0xA1, 0x7F, 0xB3, 0x64, 0x72, 0xBA, 0x12, 0x69, 0x8C, 0x45, 0xDF, 0x88, 0xE8, 0x46 }, - }, - { - { 0xBE, 0x2E, 0x88, 0xC5, 0xEE, 0x30, 0x7B, 0xA5, 0x41, 0x73, 0xA6, 0x00, 0x2B, 0x99, 0x16, 0x92, - 0xC8, 0xBD, 0x1D, 0x40, 0x8A, 0x59, 0x2F, 0x70, 0x7B, 0xB1, 0xAF, 0x56, 0xF5, 0xB9, 0xD7, 0x42 }, - }, - { - { 0xBE, 0x34, 0x75, 0x8B, 0x19, 0xD4, 0x31, 0x2D, 0x65, 0xB9, 0xE0, 0x78, 0xB6, 0xF8, 0xD9, 0x27, - 0x7C, 0x5E, 0x52, 0x1B, 0xA1, 0xF0, 0xD3, 0x15, 0x20, 0x9B, 0x2B, 0x56, 0x2D, 0x73, 0x91, 0x89 }, - }, - { - { 0xBE, 0x41, 0x0A, 0x51, 0xD3, 0x44, 0x17, 0x76, 0x91, 0xB3, 0x42, 0x64, 0x10, 0xA4, 0x41, 0xAF, - 0xD1, 0xC9, 0x40, 0xB1, 0xB2, 0x7C, 0xF5, 0x29, 0xEE, 0x87, 0xA1, 0x40, 0x3B, 0xB0, 0x16, 0xF4 }, - }, - { - { 0xBE, 0x5C, 0x3C, 0xD0, 0x6E, 0x3C, 0x58, 0x1A, 0x4E, 0x67, 0xAB, 0x8F, 0x77, 0x85, 0x51, 0xBB, - 0x0F, 0x41, 0x24, 0x4C, 0x6B, 0xBB, 0x41, 0x1D, 0x9B, 0xF1, 0x27, 0x19, 0x0F, 0x60, 0x99, 0x9D }, - }, - { - { 0xBE, 0x68, 0x35, 0x4F, 0x7C, 0x36, 0x24, 0x2D, 0xB6, 0x20, 0x4F, 0x20, 0x13, 0x1B, 0x01, 0xFF, - 0x28, 0xB7, 0xDD, 0xFF, 0x36, 0x2E, 0x42, 0x9B, 0xFD, 0xF8, 0x8F, 0x36, 0x37, 0x58, 0x24, 0x51 }, - }, - { - { 0xBE, 0xAC, 0x00, 0x60, 0x68, 0x7E, 0xB2, 0x5A, 0x9B, 0xED, 0x21, 0xA1, 0x99, 0x97, 0xAF, 0xFF, - 0x67, 0x7C, 0x89, 0x61, 0xDC, 0x00, 0xE2, 0x3B, 0x4C, 0x1E, 0x27, 0x7F, 0xF8, 0x58, 0xC0, 0x92 }, - }, - { - { 0xBE, 0xB7, 0x1D, 0xAF, 0x38, 0x97, 0x76, 0xCE, 0x8B, 0x4A, 0xC8, 0x18, 0x90, 0x1E, 0x02, 0xC0, - 0x6C, 0xFE, 0xF5, 0x22, 0x34, 0xFC, 0x49, 0x20, 0x3B, 0x4A, 0xA7, 0x73, 0x35, 0xB6, 0x63, 0x9B }, - }, - { - { 0xBE, 0xB9, 0x09, 0x0C, 0x92, 0xD1, 0x6B, 0xD0, 0x5A, 0xF3, 0x91, 0x5A, 0x39, 0xCC, 0x2A, 0xFA, - 0x9F, 0x6A, 0x8A, 0x6F, 0xBE, 0xD4, 0xFE, 0x54, 0xD9, 0xDE, 0x32, 0x49, 0x23, 0xB3, 0x93, 0x5A }, - }, - { - { 0xBE, 0xD5, 0xB6, 0xAD, 0xE6, 0xC9, 0xC2, 0x15, 0xE4, 0x14, 0x53, 0x21, 0x9A, 0xF2, 0x9A, 0x8B, - 0x8D, 0x76, 0x9D, 0x36, 0x43, 0x8C, 0x3F, 0x96, 0x61, 0x76, 0xE3, 0xBC, 0xC9, 0x1F, 0x2E, 0xE8 }, - }, - { - { 0xBE, 0xD6, 0xF8, 0x1A, 0xD8, 0x5E, 0x71, 0x6B, 0x60, 0xD3, 0xE9, 0x7D, 0x8B, 0x90, 0x81, 0xE9, - 0xC1, 0xB9, 0xEC, 0x3B, 0xE8, 0xF3, 0xFD, 0x5B, 0xAD, 0x55, 0x40, 0x2B, 0x79, 0x78, 0x5B, 0x37 }, - }, - { - { 0xBE, 0xE1, 0xD6, 0x40, 0x7D, 0x2F, 0xE3, 0xDB, 0x76, 0x64, 0x4C, 0x58, 0xA4, 0xF2, 0xB6, 0x4E, - 0x62, 0xF8, 0x93, 0xF8, 0x04, 0xFB, 0x9A, 0x87, 0xFE, 0xA3, 0x2C, 0x4C, 0x76, 0x45, 0x7F, 0x3B }, - }, - { - { 0xBE, 0xE5, 0x93, 0x20, 0xCE, 0x39, 0xB6, 0xBB, 0x7A, 0xC7, 0x72, 0xCD, 0xF3, 0xD3, 0x0D, 0xFE, - 0x57, 0xE0, 0x60, 0xCC, 0xA9, 0xE5, 0x4A, 0x62, 0x99, 0x96, 0xAA, 0x4F, 0xCB, 0xD4, 0xAF, 0x0E }, - }, - { - { 0xBE, 0xE9, 0x05, 0xD6, 0xA4, 0x20, 0x55, 0x47, 0x66, 0x90, 0xD3, 0x89, 0xD4, 0x80, 0x66, 0x5D, - 0x10, 0x29, 0xD0, 0xA0, 0x24, 0x75, 0x35, 0xE0, 0xA1, 0x4A, 0x79, 0x8E, 0xE3, 0xF5, 0xA3, 0x3D }, - }, - { - { 0xBF, 0x38, 0xE6, 0xAE, 0x32, 0x0F, 0x69, 0x16, 0x16, 0x0D, 0xA6, 0x06, 0x86, 0x83, 0xBF, 0x49, - 0xF2, 0xB2, 0x2B, 0x25, 0x24, 0x84, 0x63, 0x68, 0xF5, 0x04, 0x51, 0x81, 0x52, 0x40, 0x25, 0x9A }, - }, - { - { 0xBF, 0x60, 0xAE, 0xB3, 0x91, 0xC0, 0xFB, 0xD0, 0x49, 0x53, 0x52, 0x6D, 0xA9, 0xFD, 0x59, 0x96, - 0x9A, 0x82, 0xF1, 0xEE, 0x81, 0xA7, 0x97, 0x98, 0xA4, 0x17, 0x1E, 0x14, 0x59, 0x39, 0x19, 0x67 }, - }, - { - { 0xBF, 0xC6, 0x2C, 0x0A, 0x05, 0x85, 0xBC, 0x32, 0xD4, 0x0C, 0xBC, 0x2E, 0x24, 0xA4, 0x8E, 0x26, - 0x43, 0x4A, 0xE3, 0x33, 0x27, 0xD7, 0xE9, 0x8D, 0x1C, 0x57, 0xB6, 0xC5, 0x28, 0x4B, 0x95, 0x7A }, - }, - { - { 0xBF, 0xF4, 0x3A, 0x97, 0x20, 0x48, 0x2D, 0x13, 0x4C, 0xD5, 0xEE, 0x8A, 0x88, 0x99, 0xE1, 0xA7, - 0x36, 0xBF, 0x54, 0xA2, 0xB7, 0x86, 0x26, 0x9C, 0x0D, 0xCB, 0x8B, 0xA1, 0x92, 0xA8, 0x1F, 0xA4 }, - }, - { - { 0xC0, 0x09, 0xA1, 0xBE, 0x5B, 0xE8, 0xAF, 0xB5, 0x25, 0x8E, 0x12, 0x85, 0x5C, 0x64, 0xD0, 0x4D, - 0x13, 0xE8, 0xCC, 0xC4, 0x7B, 0x02, 0xBF, 0x3B, 0x51, 0xC6, 0xE1, 0x18, 0x05, 0xAE, 0xEC, 0xEB }, - }, - { - { 0xC0, 0x52, 0xE0, 0x98, 0xDD, 0x04, 0x2B, 0x3D, 0x44, 0x0F, 0x8F, 0xFB, 0xEE, 0x31, 0x91, 0x67, - 0x1F, 0x5F, 0x78, 0x4B, 0x94, 0x9C, 0x2D, 0x23, 0x3D, 0x60, 0xDA, 0x66, 0xC5, 0xC3, 0x6C, 0xFD }, - }, - { - { 0xC0, 0x9F, 0xFA, 0x0E, 0xDD, 0x16, 0xBA, 0x55, 0xF2, 0x3C, 0xEA, 0xF7, 0x2B, 0x11, 0x34, 0xE9, - 0x28, 0xDB, 0xA1, 0xC2, 0x34, 0x5A, 0x5A, 0xB5, 0x63, 0x1E, 0x25, 0x41, 0x24, 0x05, 0x4A, 0xDB }, - }, - { - { 0xC0, 0xAB, 0xD1, 0xC3, 0x56, 0x2F, 0xBC, 0x7F, 0xF7, 0xBD, 0x38, 0x95, 0x54, 0x60, 0xC3, 0xFC, - 0x43, 0x55, 0x0D, 0x97, 0x7F, 0x25, 0xE3, 0x43, 0xD4, 0x9C, 0xD4, 0xAF, 0xAD, 0xF2, 0x09, 0x3C }, - }, - { - { 0xC0, 0xD3, 0xDC, 0x9A, 0x2D, 0x13, 0x9D, 0x38, 0xCE, 0x02, 0xC0, 0x78, 0xF3, 0xC2, 0x92, 0x5D, - 0x89, 0x1D, 0x24, 0xE4, 0x36, 0x13, 0xCB, 0xEE, 0x3F, 0x18, 0xA2, 0xC8, 0x60, 0x98, 0x84, 0xB2 }, - }, - { - { 0xC0, 0xFE, 0xB7, 0x2A, 0x5F, 0x33, 0x16, 0x5C, 0x0D, 0xC7, 0xC4, 0x24, 0x7E, 0x23, 0xF3, 0x8C, - 0xC6, 0x1F, 0x25, 0x24, 0x42, 0xB2, 0xF6, 0x13, 0x40, 0x92, 0xDE, 0x3B, 0xAD, 0x7E, 0x45, 0x0D }, - }, - { - { 0xC1, 0x36, 0x56, 0xB8, 0xB3, 0xDD, 0x77, 0xCB, 0x97, 0x0D, 0xB1, 0x38, 0x81, 0x10, 0x6F, 0xB0, - 0x99, 0x8E, 0xC5, 0x4E, 0x94, 0xF8, 0x2E, 0xE4, 0x4D, 0xEA, 0x1B, 0x1A, 0x65, 0x90, 0xFC, 0xE7 }, - }, - { - { 0xC1, 0x53, 0xE6, 0x04, 0xED, 0xD6, 0x55, 0x50, 0x5D, 0xFF, 0x3F, 0x04, 0xB4, 0xAA, 0x95, 0xA4, - 0x73, 0xCD, 0x3F, 0xAB, 0x0A, 0x4D, 0xBC, 0xB9, 0x85, 0x84, 0xCD, 0x4B, 0x66, 0x46, 0x32, 0xF9 }, - }, - { - { 0xC1, 0x63, 0x98, 0xBA, 0xC4, 0xEA, 0x08, 0x39, 0xDF, 0x12, 0xEB, 0x3D, 0x6B, 0xF3, 0x98, 0x6D, - 0x4C, 0x69, 0x78, 0x04, 0xE0, 0x2A, 0xB9, 0x78, 0x8D, 0x3C, 0xF3, 0xB0, 0x38, 0x6E, 0x64, 0x10 }, - }, - { - { 0xC1, 0x73, 0xB2, 0x9F, 0x14, 0x85, 0xEE, 0x0F, 0x3F, 0xE6, 0x24, 0xDA, 0xAE, 0xBF, 0x21, 0x45, - 0x14, 0x1F, 0x7C, 0xD0, 0xE4, 0xC5, 0xEA, 0x2F, 0x46, 0xB7, 0xAF, 0xE3, 0x74, 0x8C, 0xC5, 0x03 }, - }, - { - { 0xC1, 0x77, 0x12, 0x97, 0xA4, 0xE8, 0xDC, 0x53, 0x75, 0x19, 0x5E, 0x1B, 0x63, 0x04, 0x2B, 0x59, - 0x19, 0x09, 0xF1, 0xD7, 0xEB, 0x5D, 0x25, 0xF2, 0x97, 0xAE, 0x7A, 0x61, 0xC1, 0x53, 0x8F, 0x9E }, - }, - { - { 0xC1, 0x7C, 0xE3, 0xBE, 0xF9, 0xCC, 0x61, 0x0B, 0x71, 0x3C, 0xFF, 0x47, 0xCC, 0xBE, 0x95, 0x8A, - 0xA7, 0x78, 0x35, 0x8D, 0xCC, 0x7C, 0x52, 0x63, 0xC1, 0xAA, 0x7F, 0xE4, 0x22, 0xF3, 0x9B, 0xC6 }, - }, - { - { 0xC1, 0x86, 0xBE, 0x26, 0xE4, 0x47, 0x89, 0x7C, 0x48, 0x3C, 0x43, 0xFD, 0xC0, 0x86, 0xE2, 0x60, - 0x74, 0x17, 0xEB, 0x3E, 0xA7, 0x88, 0xEC, 0x03, 0x10, 0xA7, 0x9D, 0xA9, 0x24, 0x1D, 0x16, 0xDE }, - }, - { - { 0xC1, 0xC3, 0x03, 0x06, 0x23, 0x16, 0x38, 0xEA, 0x57, 0x60, 0xAF, 0xBE, 0xF1, 0x44, 0x50, 0x68, - 0x22, 0x6C, 0xA0, 0x25, 0xF5, 0xE0, 0x86, 0xE2, 0x21, 0x21, 0x54, 0xDA, 0xC2, 0xE5, 0x48, 0x49 }, - }, - { - { 0xC1, 0xDE, 0x5F, 0xA3, 0x92, 0x13, 0x68, 0x58, 0x11, 0xA5, 0xBA, 0x93, 0x12, 0x1D, 0xE7, 0xA3, - 0x95, 0x98, 0x4E, 0x84, 0x44, 0x4E, 0x58, 0xF1, 0x63, 0xB7, 0xA6, 0x20, 0xAE, 0x3B, 0xBF, 0xA8 }, - }, - { - { 0xC1, 0xE8, 0x95, 0xA8, 0x27, 0x96, 0x4B, 0x9C, 0x04, 0x91, 0x69, 0xAD, 0xFF, 0x9A, 0x30, 0x32, - 0xD8, 0x70, 0x6A, 0x71, 0x7A, 0xCD, 0xB6, 0xF3, 0x39, 0x44, 0xFF, 0xA9, 0x62, 0xC6, 0x0D, 0x44 }, - }, - { - { 0xC2, 0x17, 0x03, 0x01, 0xD2, 0x2F, 0x8D, 0xC0, 0x42, 0xDC, 0xED, 0xD8, 0x3A, 0x92, 0x05, 0xC6, - 0x95, 0x25, 0x6F, 0x18, 0x4E, 0xD4, 0xBD, 0x5B, 0x52, 0x98, 0x28, 0x0A, 0xA6, 0x73, 0xB3, 0x7F }, - }, - { - { 0xC2, 0x29, 0xEE, 0xBB, 0x9E, 0x1A, 0x91, 0x38, 0x80, 0x87, 0xA3, 0xE0, 0x5F, 0x0C, 0x8A, 0x6B, - 0xB6, 0x84, 0x25, 0x6E, 0x34, 0x06, 0x68, 0xEE, 0xA2, 0x14, 0x01, 0x1D, 0x75, 0x2E, 0xF6, 0xB2 }, - }, - { - { 0xC2, 0xAD, 0xDF, 0x99, 0xCF, 0xC4, 0x2C, 0xE0, 0xE5, 0xA0, 0x93, 0xBC, 0xBF, 0x87, 0x40, 0x7C, - 0x61, 0x1F, 0x9D, 0x0A, 0xBF, 0x2A, 0x35, 0xD6, 0xE8, 0x03, 0xA3, 0x8E, 0xCB, 0x92, 0xC7, 0xB3 }, - }, - { - { 0xC2, 0xE7, 0x92, 0x11, 0x6A, 0x05, 0x00, 0x00, 0xBD, 0x47, 0x59, 0x1D, 0x93, 0x04, 0x71, 0xE6, - 0x17, 0x4C, 0x93, 0x85, 0xF5, 0xDC, 0x32, 0xB7, 0x62, 0x31, 0x65, 0x5F, 0xC8, 0x5E, 0x22, 0xE2 }, - }, - { - { 0xC2, 0xE8, 0x7A, 0xF9, 0xFE, 0x26, 0x55, 0x64, 0xE1, 0x09, 0xA3, 0x9D, 0x73, 0xBC, 0xD4, 0x7A, - 0x4E, 0x98, 0x75, 0x6F, 0x76, 0xEB, 0xDF, 0xB7, 0xA6, 0x57, 0x0A, 0xDA, 0xB9, 0xDD, 0xDD, 0xFB }, - }, - { - { 0xC3, 0x3A, 0x14, 0x69, 0x59, 0xF3, 0x02, 0x8B, 0x97, 0x1A, 0x8D, 0x3B, 0xF0, 0x30, 0x38, 0x7E, - 0x33, 0xBC, 0xC5, 0xB5, 0x2B, 0xA9, 0xA6, 0x8A, 0x7F, 0x76, 0x34, 0x39, 0x23, 0x6D, 0x61, 0x1A }, - }, - { - { 0xC3, 0x79, 0x03, 0xC5, 0x3A, 0xE6, 0x02, 0xEC, 0x96, 0x9E, 0xC3, 0x3F, 0x63, 0xFE, 0x9A, 0xB2, - 0x0C, 0x39, 0x5F, 0x83, 0x0D, 0x30, 0xE4, 0xEE, 0x9D, 0x8D, 0xD9, 0x05, 0x92, 0x1E, 0xC1, 0xA0 }, - }, - { - { 0xC3, 0xCF, 0x54, 0x16, 0xA5, 0x31, 0xAF, 0x4B, 0xFA, 0xE8, 0x9C, 0x45, 0x14, 0x3F, 0x20, 0xCC, - 0x1B, 0x3E, 0x18, 0x1D, 0x29, 0xC2, 0xD0, 0xE8, 0xFF, 0x7D, 0x3F, 0x2A, 0x66, 0xB1, 0x82, 0xFE }, - }, - { - { 0xC3, 0xDE, 0xF4, 0xB0, 0xD7, 0xF0, 0x81, 0xC7, 0xFB, 0x88, 0x91, 0x0D, 0xBD, 0xA3, 0x14, 0xDE, - 0x57, 0xA9, 0xCF, 0xDB, 0x40, 0xF8, 0x64, 0x7E, 0xF2, 0x88, 0xCE, 0xC9, 0x67, 0x3E, 0x00, 0x0C }, - }, - { - { 0xC4, 0x21, 0x98, 0x61, 0x93, 0xF8, 0x62, 0xFF, 0x25, 0x8C, 0x1C, 0xCC, 0x94, 0x9D, 0x1B, 0x3A, - 0xCB, 0x67, 0xB4, 0xF6, 0x38, 0x31, 0xC6, 0x32, 0xE6, 0x9B, 0xD0, 0xFB, 0x08, 0xA2, 0x69, 0x67 }, - }, - { - { 0xC4, 0x85, 0x0E, 0x1C, 0x62, 0xB1, 0x7C, 0xEF, 0xD0, 0xDC, 0x64, 0xD4, 0xA8, 0x66, 0x95, 0x3E, - 0x11, 0x54, 0xDC, 0x88, 0xD9, 0xBD, 0x96, 0x16, 0x47, 0xB6, 0xB2, 0x34, 0x1D, 0x85, 0xD9, 0xBA }, - }, - { - { 0xC4, 0x87, 0xA2, 0x59, 0x81, 0x9B, 0x56, 0xD3, 0x15, 0x9D, 0xD1, 0x73, 0x15, 0x7E, 0x86, 0x45, - 0xB7, 0x0B, 0xCA, 0x29, 0x08, 0xCB, 0x2C, 0x5B, 0xAE, 0x34, 0x48, 0x6E, 0xA4, 0xF6, 0x14, 0xFF }, - }, - { - { 0xC4, 0x98, 0xA1, 0xB6, 0x9F, 0x54, 0x40, 0x86, 0x17, 0x47, 0x47, 0x71, 0x5A, 0x27, 0x4D, 0x3F, - 0xB5, 0x90, 0x19, 0xBE, 0x09, 0x21, 0x31, 0xBC, 0xFA, 0xA8, 0x3A, 0x39, 0x5F, 0x7E, 0x57, 0x3C }, - }, - { - { 0xC4, 0xE2, 0x8D, 0xD8, 0x3F, 0xE3, 0x0C, 0x96, 0x33, 0x8C, 0xEF, 0x77, 0x73, 0xC6, 0xDF, 0xCA, - 0x6C, 0xE4, 0xFA, 0x96, 0x41, 0xBE, 0xAB, 0x38, 0x05, 0xA8, 0xEF, 0xB6, 0xCD, 0xC3, 0xCF, 0x0A }, - }, - { - { 0xC4, 0xF4, 0x79, 0x81, 0xF4, 0x5D, 0x90, 0x3B, 0x56, 0x2F, 0x39, 0xF6, 0x17, 0x45, 0xF4, 0xE1, - 0x90, 0x48, 0x1C, 0x4B, 0x56, 0xA4, 0xBD, 0xF5, 0xA0, 0xE1, 0x61, 0xE3, 0xE9, 0x42, 0x83, 0x89 }, - }, - { - { 0xC5, 0x00, 0xB8, 0x3F, 0x3E, 0x06, 0x6C, 0xD1, 0xDD, 0x0E, 0xBC, 0xD7, 0x3D, 0xD4, 0x01, 0x61, - 0xB9, 0x25, 0x9A, 0xA7, 0x7A, 0xB8, 0xA6, 0x47, 0xE8, 0x57, 0x1F, 0xF3, 0x37, 0xCF, 0x94, 0x6D }, - }, - { - { 0xC5, 0x1E, 0x9B, 0x95, 0x9A, 0xCF, 0x0D, 0xDA, 0xFF, 0x54, 0x64, 0x9C, 0xB5, 0xFC, 0x68, 0xFC, - 0xDC, 0xB2, 0x70, 0xB2, 0x7A, 0x53, 0xD4, 0x0A, 0xDA, 0xBE, 0xD0, 0x8B, 0x79, 0x7B, 0x14, 0xB6 }, - }, - { - { 0xC5, 0x29, 0x5B, 0xA6, 0xE2, 0x7E, 0x72, 0x10, 0x22, 0xFE, 0xB2, 0x1E, 0x78, 0xEB, 0x7B, 0x03, - 0x57, 0xC9, 0xCD, 0x56, 0x5B, 0xD0, 0xE5, 0x96, 0x72, 0xF6, 0x66, 0x34, 0x2B, 0x79, 0x94, 0x9D }, - }, - { - { 0xC5, 0x82, 0x1F, 0xA0, 0x9B, 0x7A, 0x3F, 0x59, 0x65, 0xF3, 0xC6, 0x37, 0xC6, 0xDC, 0x91, 0x40, - 0xF4, 0xC4, 0x29, 0x00, 0x10, 0x78, 0xA5, 0xEE, 0x2B, 0x10, 0x6F, 0x87, 0xBF, 0xA2, 0xC3, 0x1A }, - }, - { - { 0xC5, 0x9F, 0x27, 0xDF, 0x84, 0x0B, 0xC2, 0x18, 0x71, 0x35, 0xCD, 0x17, 0xB6, 0xF4, 0x75, 0x23, - 0xB4, 0xD5, 0x5C, 0x47, 0xBD, 0x4D, 0x8C, 0x2C, 0x4B, 0x15, 0x4C, 0x14, 0x65, 0xC8, 0x06, 0xFE }, - }, - { - { 0xC6, 0x12, 0x75, 0x6B, 0xA5, 0x42, 0x34, 0x4A, 0xDC, 0x1B, 0x80, 0xE9, 0x38, 0x84, 0x5A, 0x1E, - 0xD6, 0xE9, 0x38, 0xFE, 0xF4, 0x0D, 0x04, 0xEC, 0x86, 0x55, 0x8F, 0x4B, 0x21, 0x05, 0x2F, 0xD2 }, - }, - { - { 0xC6, 0x17, 0xE0, 0x85, 0x5B, 0xF1, 0x4F, 0xBF, 0x21, 0xAF, 0x00, 0x82, 0x25, 0xCA, 0xBE, 0x40, - 0x4F, 0x73, 0x8C, 0x27, 0x8A, 0x4A, 0x42, 0x87, 0xF1, 0xEE, 0x38, 0x01, 0x27, 0xC5, 0x61, 0xFA }, - }, - { - { 0xC6, 0x41, 0x82, 0xD6, 0x05, 0xC1, 0xCB, 0xE1, 0x9B, 0xD3, 0xB7, 0xFE, 0x55, 0x7F, 0x58, 0xCD, - 0x52, 0x10, 0x30, 0x97, 0xA3, 0x3B, 0xF8, 0x4A, 0xF2, 0x22, 0xC8, 0xCE, 0x72, 0x52, 0x61, 0x15 }, - }, - { - { 0xC6, 0x48, 0x76, 0x70, 0x78, 0x83, 0x67, 0x74, 0x64, 0x11, 0xC9, 0x38, 0xBD, 0xDB, 0x5C, 0xFC, - 0x0D, 0x20, 0xAC, 0xF8, 0x29, 0xD2, 0xA1, 0x39, 0x12, 0x7A, 0x22, 0x7B, 0xC0, 0x06, 0x03, 0xDC }, - }, - { - { 0xC6, 0x67, 0x05, 0xFC, 0xA8, 0x55, 0x10, 0xFD, 0x14, 0x58, 0xE2, 0xF4, 0x51, 0xD4, 0x54, 0x43, - 0x55, 0xD0, 0xB1, 0x03, 0xFE, 0x6D, 0xB4, 0x73, 0x78, 0xE7, 0x28, 0x37, 0xED, 0x9A, 0x2E, 0x6F }, - }, - { - { 0xC6, 0x81, 0x77, 0x4B, 0x31, 0x13, 0x72, 0x97, 0x0C, 0x4E, 0xCA, 0xED, 0x00, 0x22, 0xEB, 0x5E, - 0xF9, 0xC2, 0x32, 0x80, 0x35, 0xC2, 0x5B, 0x00, 0xD8, 0xFA, 0xF0, 0x1E, 0xCF, 0x2C, 0x03, 0x9C }, - }, - { - { 0xC6, 0x89, 0xB9, 0x95, 0x6C, 0x73, 0x11, 0xD7, 0x34, 0x6A, 0x7F, 0xA3, 0x8B, 0x2C, 0xCD, 0xE3, - 0xEF, 0xEE, 0x85, 0x3D, 0x7C, 0x2C, 0x41, 0x4F, 0x81, 0xF3, 0xB0, 0x64, 0xE6, 0xAF, 0x1F, 0x49 }, - }, - { - { 0xC6, 0xA4, 0x24, 0xBF, 0x7C, 0xFE, 0x31, 0x72, 0x74, 0x7A, 0x47, 0x14, 0xA0, 0xEF, 0xB9, 0x17, - 0x93, 0x8C, 0x5E, 0xBD, 0x59, 0x12, 0x9D, 0xED, 0x7A, 0x81, 0x18, 0xC7, 0xF6, 0x59, 0xD1, 0x33 }, - }, - { - { 0xC6, 0xAD, 0x1D, 0x7A, 0x14, 0x1A, 0x91, 0x75, 0x2D, 0x31, 0xFB, 0xC1, 0x06, 0x16, 0xBF, 0x1C, - 0xA2, 0xFB, 0x5B, 0x02, 0xE8, 0x46, 0xB5, 0x9E, 0x63, 0x34, 0x6B, 0x31, 0x92, 0xA7, 0x52, 0x92 }, - }, - { - { 0xC6, 0xC6, 0xB0, 0x9A, 0xFA, 0x64, 0x6E, 0x4E, 0x1D, 0x75, 0xC9, 0x23, 0xAE, 0xB0, 0x2B, 0x39, - 0xF8, 0xF0, 0x7A, 0x74, 0x33, 0x59, 0xDD, 0x22, 0xB4, 0xB5, 0x32, 0x41, 0xB7, 0xB0, 0x3D, 0x63 }, - }, - { - { 0xC7, 0x01, 0x83, 0x64, 0x38, 0xF3, 0x7B, 0xEA, 0x8A, 0x88, 0x16, 0x10, 0x63, 0x70, 0x86, 0xF8, - 0x8D, 0x9A, 0x11, 0x5E, 0x00, 0x92, 0x46, 0xD2, 0x7F, 0x48, 0x9F, 0xA7, 0x18, 0x51, 0x88, 0xA8 }, - }, - { - { 0xC7, 0xA6, 0xF4, 0xE6, 0xAC, 0xFA, 0x70, 0x88, 0x7A, 0xEF, 0xEC, 0x5C, 0x75, 0x66, 0x9E, 0x04, - 0x43, 0xDB, 0x00, 0x2D, 0xBD, 0xB5, 0xED, 0x95, 0xFB, 0xBE, 0x52, 0xC5, 0xC9, 0xB8, 0xF2, 0x01 }, - }, - { - { 0xC7, 0xF8, 0x85, 0xE4, 0x1A, 0xA5, 0x3B, 0x8C, 0xB8, 0xE4, 0xE5, 0x59, 0xC4, 0x04, 0x3A, 0x87, - 0xDA, 0xFB, 0x78, 0x7A, 0x0D, 0x2B, 0x2E, 0xF1, 0xBC, 0xC0, 0x55, 0x71, 0xB7, 0x5D, 0x4E, 0x29 }, - }, - { - { 0xC7, 0xFF, 0x8E, 0xFD, 0xEC, 0xDF, 0x00, 0xD1, 0xFC, 0x8D, 0x55, 0x2D, 0x2A, 0x70, 0x70, 0xE5, - 0xE3, 0x3D, 0x42, 0xE5, 0x90, 0xF5, 0x86, 0xC6, 0xAE, 0xDE, 0x03, 0x2B, 0x2D, 0x86, 0x7B, 0xD5 }, - }, - { - { 0xC7, 0xFF, 0xB4, 0x9F, 0xBC, 0x94, 0x72, 0x24, 0x5C, 0x8E, 0x95, 0xDE, 0x62, 0x9A, 0xF5, 0xC1, - 0xBF, 0xEA, 0xC5, 0x50, 0x04, 0xC1, 0x54, 0x82, 0x3A, 0x58, 0xBA, 0xE8, 0x05, 0x6E, 0x3C, 0x64 }, - }, - { - { 0xC8, 0x26, 0xBE, 0xDD, 0x88, 0x6A, 0x87, 0x1D, 0xD5, 0xCF, 0x3A, 0x2A, 0xE0, 0xA5, 0x1C, 0x93, - 0xBC, 0x2C, 0xFF, 0x31, 0x90, 0xD1, 0xCB, 0x2C, 0x13, 0x13, 0x97, 0x29, 0x5A, 0x81, 0x76, 0xB5 }, - }, - { - { 0xC8, 0x37, 0xD6, 0xF2, 0xAB, 0x14, 0x79, 0x91, 0x42, 0xED, 0x3C, 0x79, 0xBE, 0xD9, 0x44, 0x1E, - 0x92, 0x50, 0xBD, 0x05, 0x20, 0x25, 0xAD, 0x8A, 0xF4, 0x40, 0x41, 0xAC, 0x19, 0xEF, 0xBB, 0x4C }, - }, - { - { 0xC8, 0xC6, 0x92, 0x81, 0xBE, 0x05, 0xC4, 0x14, 0xEA, 0xA3, 0x1C, 0x61, 0xB6, 0x52, 0x93, 0xBE, - 0x72, 0xB5, 0x89, 0xD1, 0xD5, 0xE4, 0xB7, 0x59, 0xD5, 0xED, 0xAF, 0x54, 0x63, 0x99, 0xA2, 0xEF }, - }, - { - { 0xC8, 0xF2, 0x99, 0x18, 0xD3, 0x41, 0xEE, 0x02, 0x20, 0xA4, 0x4D, 0xB0, 0xF0, 0xC2, 0xD9, 0xC4, - 0x16, 0x6E, 0x02, 0x3A, 0x66, 0xCA, 0x6D, 0x1D, 0x3F, 0x78, 0xF1, 0x58, 0x93, 0x61, 0x90, 0x8E }, - }, - { - { 0xC9, 0x43, 0x10, 0x03, 0xBB, 0xEA, 0xB5, 0x8E, 0x35, 0x2F, 0xDE, 0xB4, 0x5B, 0x7F, 0xCF, 0x15, - 0xC7, 0x3F, 0x07, 0x34, 0xA0, 0x7D, 0x6C, 0xBD, 0xF6, 0x32, 0x92, 0x92, 0xEB, 0x81, 0x2C, 0x93 }, - }, - { - { 0xC9, 0x72, 0xF4, 0xF9, 0x6E, 0x71, 0x33, 0xE1, 0x6E, 0x55, 0x57, 0xA0, 0x57, 0xB1, 0xD4, 0x2B, - 0xA9, 0x2D, 0x98, 0x5C, 0xAE, 0xE7, 0x3C, 0xAF, 0xDA, 0xEB, 0x55, 0xEC, 0xA2, 0xE4, 0xAB, 0xB0 }, - }, - { - { 0xC9, 0x78, 0x37, 0x2C, 0x9E, 0x11, 0x60, 0x71, 0xB6, 0x1B, 0x90, 0x92, 0xA9, 0xAA, 0x96, 0x81, - 0x62, 0x36, 0x55, 0xA6, 0x6F, 0x4F, 0xCB, 0xC4, 0xD3, 0xA6, 0x7E, 0xFD, 0x56, 0x72, 0x48, 0x30 }, - }, - { - { 0xC9, 0x7E, 0x4D, 0x81, 0xE7, 0x4E, 0x3D, 0x0A, 0x5E, 0xE0, 0x9C, 0x6F, 0x76, 0x9B, 0x95, 0x7E, - 0x70, 0x04, 0xAD, 0x2C, 0x9F, 0xC6, 0x66, 0x8A, 0x69, 0xD6, 0xCA, 0x29, 0xE0, 0x66, 0xE7, 0xFE }, - }, - { - { 0xC9, 0x84, 0x0B, 0xFB, 0x2C, 0x2D, 0x46, 0x82, 0x7C, 0xC7, 0x55, 0xC7, 0x5B, 0x12, 0x8A, 0x4F, - 0x0B, 0x7E, 0x06, 0xE5, 0xAC, 0x44, 0xEE, 0x8F, 0xFB, 0x92, 0x9A, 0xAC, 0xD9, 0x58, 0x3F, 0x39 }, - }, - { - { 0xC9, 0xE5, 0x7C, 0x8F, 0xE0, 0x00, 0x40, 0x58, 0x58, 0xBA, 0x46, 0xBE, 0xCB, 0x84, 0x78, 0xAA, - 0x8A, 0xD8, 0x24, 0x90, 0x8B, 0x90, 0xC4, 0xB5, 0xF4, 0x73, 0x8F, 0xEB, 0xD3, 0x11, 0x3B, 0xE0 }, - }, - { - { 0xCA, 0x18, 0x88, 0xDC, 0x1C, 0xEE, 0xC3, 0x5F, 0x92, 0x31, 0xD4, 0x1D, 0x23, 0x07, 0x77, 0x82, - 0x91, 0xDF, 0x33, 0x81, 0xAE, 0x6F, 0x3B, 0xC4, 0x17, 0xA9, 0xD9, 0x94, 0x4D, 0xE3, 0x06, 0x48 }, - }, - { - { 0xCA, 0x21, 0x0B, 0x73, 0x5D, 0xC0, 0x7F, 0xFB, 0xD2, 0x3C, 0x5B, 0x61, 0x30, 0x76, 0xE3, 0xD5, - 0x1B, 0xB3, 0xCE, 0x53, 0x52, 0x6A, 0x1A, 0xDF, 0xC7, 0x32, 0x54, 0x25, 0x49, 0xD8, 0xF9, 0xDA }, - }, - { - { 0xCA, 0x55, 0x6F, 0x82, 0xC9, 0x68, 0x4C, 0x9A, 0xF3, 0x55, 0x7D, 0x3E, 0x2D, 0x88, 0xAF, 0x92, - 0xED, 0x25, 0x9C, 0x20, 0xFF, 0xD1, 0xDD, 0xE9, 0xF7, 0x9D, 0x6B, 0x92, 0xC6, 0x1E, 0xE1, 0xB9 }, - }, - { - { 0xCA, 0x5A, 0x11, 0x99, 0xC9, 0xA7, 0xA3, 0x7F, 0xAD, 0xCF, 0x8D, 0xE9, 0x88, 0xDC, 0xFE, 0x55, - 0xBF, 0x80, 0x39, 0x38, 0x6D, 0x60, 0x34, 0xC1, 0xBD, 0xD8, 0x69, 0x2D, 0x49, 0x2F, 0x4C, 0x6C }, - }, - { - { 0xCA, 0x5F, 0x30, 0x7A, 0x0A, 0xA2, 0x8F, 0xF4, 0x33, 0x29, 0xCC, 0xFD, 0xC0, 0x0D, 0xE3, 0x5E, - 0xED, 0x83, 0xDA, 0x0E, 0x4B, 0x15, 0x1A, 0x76, 0xEC, 0x9E, 0x1E, 0x93, 0x5A, 0x5E, 0x36, 0xB0 }, - }, - { - { 0xCA, 0x5F, 0x8F, 0x8A, 0xF0, 0xD9, 0xFA, 0x3F, 0x80, 0x03, 0x88, 0x49, 0x54, 0xE8, 0xAA, 0x1B, - 0x8A, 0xAD, 0x4E, 0xE8, 0xD1, 0x4E, 0x82, 0xF3, 0x3F, 0xBA, 0xE3, 0xB4, 0x59, 0x8B, 0x5F, 0x90 }, - }, - { - { 0xCA, 0x6C, 0xC4, 0xBA, 0x92, 0x04, 0x14, 0x20, 0x7A, 0xA0, 0xE0, 0xF3, 0x3F, 0x27, 0x44, 0xC3, - 0x1A, 0x37, 0x78, 0x27, 0x50, 0x89, 0x24, 0x6E, 0x9E, 0x98, 0x4C, 0xB7, 0x2C, 0x58, 0x72, 0xFC }, - }, - { - { 0xCA, 0x91, 0x6E, 0xA3, 0xFA, 0x04, 0xFA, 0x3D, 0xA0, 0xC0, 0xB9, 0x27, 0xE8, 0x1D, 0xBD, 0x77, - 0xC0, 0xE4, 0x1C, 0xB8, 0xFF, 0x04, 0xAD, 0x95, 0x33, 0xB8, 0x5D, 0x87, 0xBD, 0x63, 0x30, 0x92 }, - }, - { - { 0xCA, 0xBE, 0x25, 0x56, 0xF1, 0xBB, 0x56, 0x57, 0x0C, 0xEF, 0x3A, 0x87, 0x03, 0x32, 0x71, 0xA1, - 0xF2, 0x1D, 0x09, 0xB7, 0xFD, 0x04, 0x12, 0x83, 0x18, 0xE5, 0xE7, 0xBC, 0xE3, 0xA2, 0x01, 0xE2 }, - }, - { - { 0xCA, 0xC4, 0xBB, 0x2C, 0x3D, 0x5F, 0xC7, 0xCB, 0x19, 0xC5, 0x41, 0x06, 0x79, 0x59, 0xD7, 0x20, - 0xEF, 0x4C, 0xBF, 0x52, 0x98, 0x01, 0xBE, 0xE1, 0xC8, 0xDE, 0xBF, 0x42, 0x75, 0xFC, 0x08, 0x3B }, - }, - { - { 0xCA, 0xDC, 0xD5, 0xAE, 0x1B, 0x75, 0x6A, 0xB7, 0x41, 0xB3, 0x56, 0x9C, 0x42, 0xA5, 0x41, 0x1F, - 0x09, 0x3E, 0x4E, 0x1F, 0x01, 0x2E, 0xC5, 0x79, 0x91, 0xCB, 0xD6, 0xDB, 0xE0, 0x8F, 0xAA, 0xC1 }, - }, - { - { 0xCB, 0x51, 0x19, 0xD5, 0x1A, 0x4E, 0xE8, 0x5D, 0x7D, 0x4B, 0xD0, 0xD7, 0xEC, 0xBA, 0xAD, 0x4E, - 0xC4, 0x43, 0x65, 0x4D, 0xA8, 0x5D, 0xD2, 0x46, 0xBB, 0x5E, 0x03, 0x7F, 0xE7, 0x70, 0x79, 0xB6 }, - }, - { - { 0xCB, 0x7A, 0x43, 0x8D, 0x16, 0xE4, 0xA5, 0xF3, 0xC5, 0x6F, 0xDF, 0x19, 0x1E, 0x1D, 0xAF, 0x9F, - 0x32, 0x5C, 0x65, 0x0B, 0xD6, 0x2F, 0x07, 0xC4, 0x67, 0x71, 0x72, 0x07, 0x35, 0x1A, 0xE3, 0x29 }, - }, - { - { 0xCB, 0x9C, 0x10, 0xF2, 0xCB, 0x7F, 0x7C, 0xDB, 0xFD, 0xB1, 0xF8, 0xED, 0x6A, 0x42, 0x32, 0xB4, - 0x4D, 0x6F, 0x7C, 0x32, 0x57, 0xA5, 0x94, 0x99, 0xE2, 0x37, 0xEC, 0x11, 0x3A, 0x2D, 0xDC, 0x1D }, - }, - { - { 0xCC, 0x2A, 0x70, 0x6F, 0xE6, 0x8F, 0x5D, 0x17, 0xF4, 0xAB, 0xAF, 0x60, 0x86, 0xE5, 0xBD, 0x97, - 0xAE, 0x35, 0xEB, 0x35, 0x9F, 0x75, 0xC0, 0x92, 0xBB, 0xA4, 0x93, 0xFE, 0x11, 0xF2, 0x69, 0xFD }, - }, - { - { 0xCC, 0x30, 0xD8, 0x19, 0xDE, 0x54, 0x05, 0xF6, 0x49, 0xC8, 0xB7, 0xA8, 0x14, 0x8F, 0x26, 0xD7, - 0x71, 0x08, 0x3E, 0xC5, 0x18, 0xF9, 0xB6, 0x6F, 0xF5, 0x47, 0xF2, 0x82, 0x2D, 0x11, 0x93, 0x6D }, - }, - { - { 0xCC, 0x4E, 0x09, 0x63, 0x13, 0xDF, 0xA0, 0xCC, 0x24, 0x77, 0xA3, 0xA5, 0xB7, 0x9A, 0xEF, 0x0A, - 0x45, 0x54, 0x58, 0x69, 0xA7, 0xF8, 0x8A, 0x29, 0x14, 0x96, 0x06, 0x4B, 0x69, 0x76, 0xE1, 0x4D }, - }, - { - { 0xCC, 0x5C, 0xBD, 0xDB, 0x14, 0x85, 0x91, 0x00, 0xF8, 0x46, 0x23, 0xAF, 0xBB, 0x00, 0x6D, 0x90, - 0x6B, 0x71, 0xBC, 0xC3, 0xAA, 0x84, 0x07, 0x44, 0x0C, 0x7F, 0x10, 0x47, 0x0C, 0xA9, 0x29, 0x21 }, - }, - { - { 0xCC, 0x65, 0xCD, 0xC5, 0x33, 0x62, 0xD4, 0x21, 0x62, 0x7E, 0xAE, 0xF5, 0xD0, 0xC8, 0xE4, 0xC4, - 0xE2, 0x40, 0xAD, 0xE0, 0xC9, 0xD4, 0x20, 0xBE, 0x67, 0x1E, 0x70, 0xF0, 0xFB, 0xAC, 0x8D, 0x0A }, - }, - { - { 0xCC, 0xA9, 0x7F, 0x5E, 0x4E, 0x65, 0xB6, 0x11, 0x97, 0x5F, 0xC4, 0x4A, 0xAC, 0xD4, 0x3F, 0x49, - 0x0E, 0xB9, 0x47, 0x4D, 0x15, 0xFF, 0x07, 0x40, 0x55, 0xB5, 0x93, 0x28, 0x81, 0xF1, 0x1F, 0x3F }, - }, - { - { 0xCC, 0xCB, 0x6F, 0xA7, 0xEF, 0x62, 0x78, 0x99, 0xFA, 0x6F, 0xCC, 0x96, 0x50, 0x9B, 0x22, 0x55, - 0x77, 0x4E, 0xD9, 0x94, 0xA0, 0xB7, 0xA5, 0x74, 0xB8, 0x4E, 0xBD, 0xC1, 0xAE, 0x59, 0xA4, 0xA8 }, - }, - { - { 0xCD, 0x12, 0x53, 0xFF, 0xC5, 0x8D, 0xC6, 0x3D, 0x0B, 0xAF, 0xBD, 0xDE, 0x1B, 0xBF, 0xF0, 0x33, - 0xAE, 0xAB, 0x63, 0x30, 0x9B, 0x4D, 0x72, 0xE7, 0x59, 0xC4, 0x79, 0xC2, 0xE5, 0x5D, 0x39, 0xBD }, - }, - { - { 0xCD, 0x51, 0xED, 0x79, 0xB6, 0x39, 0x06, 0x32, 0x75, 0x7F, 0x8A, 0xAD, 0x39, 0xD3, 0xBE, 0xBD, - 0xDC, 0x79, 0xBB, 0x90, 0xD0, 0x46, 0xFD, 0xF1, 0x46, 0xDA, 0x62, 0xF6, 0x9D, 0x28, 0x41, 0x34 }, - }, - { - { 0xCD, 0x8E, 0xA1, 0x1F, 0xF5, 0x9F, 0x00, 0x9F, 0xD3, 0x02, 0xD7, 0x90, 0xA2, 0x89, 0xB7, 0x04, - 0x76, 0x1E, 0x01, 0xCF, 0x27, 0x3F, 0xD9, 0x70, 0xD9, 0xC7, 0xC1, 0xEC, 0xA4, 0x9D, 0x48, 0x51 }, - }, - { - { 0xCD, 0xB1, 0x62, 0x53, 0xD2, 0x2E, 0xD5, 0xD4, 0x26, 0xCF, 0xA1, 0xB0, 0x5C, 0xEC, 0xD8, 0x6E, - 0xF1, 0xB7, 0xDE, 0xAA, 0x07, 0xC5, 0x70, 0x5E, 0xBB, 0xAF, 0x7D, 0x9A, 0x80, 0x7D, 0x56, 0x16 }, - }, - { - { 0xCD, 0xC0, 0x39, 0xF3, 0xA2, 0xD1, 0xBB, 0xA5, 0xE8, 0x09, 0x4E, 0x55, 0x23, 0xCF, 0x60, 0x47, - 0x09, 0x7D, 0x4B, 0x3C, 0xD4, 0xEC, 0x4E, 0xD6, 0xAA, 0x8E, 0xB7, 0xB4, 0xD8, 0xB5, 0x77, 0x7D }, - }, - { - { 0xCD, 0xC4, 0xEA, 0x92, 0x02, 0xE3, 0x3E, 0xDD, 0x0F, 0x2D, 0x3A, 0xE8, 0x6A, 0xCA, 0xC7, 0xFB, - 0x25, 0x35, 0x4B, 0x02, 0x23, 0x5B, 0x09, 0x33, 0xAA, 0x81, 0xA3, 0x13, 0xB5, 0xFD, 0xFE, 0xEC }, - }, - { - { 0xCE, 0x2C, 0xF2, 0x55, 0x72, 0x57, 0x21, 0x30, 0x71, 0x73, 0x68, 0x19, 0xB7, 0xD2, 0x88, 0xA9, - 0x30, 0x77, 0x2B, 0x9B, 0x78, 0x2E, 0x61, 0x60, 0x03, 0x8F, 0xC6, 0x7A, 0x76, 0x0D, 0x7C, 0xDC }, - }, - { - { 0xCE, 0x47, 0xD5, 0x29, 0x14, 0xEF, 0xAA, 0xBE, 0x41, 0x80, 0xD4, 0xA0, 0xF7, 0xE1, 0xBC, 0xA4, - 0x72, 0x0B, 0x35, 0xA4, 0x43, 0x11, 0x93, 0x61, 0x26, 0x57, 0x99, 0x71, 0xBF, 0x16, 0x8C, 0x71 }, - }, - { - { 0xCE, 0x4C, 0x2F, 0x8F, 0x16, 0x46, 0x8A, 0x58, 0x88, 0xE9, 0x0F, 0x73, 0x4E, 0x4D, 0x22, 0x02, - 0xDF, 0xAD, 0xBF, 0xA6, 0x6F, 0x5B, 0x35, 0x75, 0x2B, 0xAA, 0x76, 0x21, 0xA7, 0x60, 0xB0, 0x88 }, - }, - { - { 0xCE, 0x52, 0x40, 0xCB, 0xAC, 0x28, 0x6B, 0x4E, 0x87, 0x69, 0xCE, 0xDC, 0x3F, 0x79, 0xD0, 0x6D, - 0x9C, 0x8D, 0x15, 0xD3, 0xD6, 0xC6, 0x84, 0x50, 0xF7, 0xC2, 0x9D, 0x44, 0x1D, 0x02, 0xFA, 0x50 }, - }, - { - { 0xCE, 0x81, 0x44, 0x58, 0x54, 0x03, 0x1F, 0x3D, 0x0F, 0x5C, 0x88, 0x75, 0x46, 0x4D, 0xCD, 0x5B, - 0xA6, 0xC8, 0x90, 0xF4, 0x49, 0xB3, 0x20, 0x7B, 0xCA, 0x2B, 0xC9, 0x61, 0x82, 0x2D, 0x27, 0xC4 }, - }, - { - { 0xCE, 0x83, 0x25, 0x83, 0x1D, 0xA3, 0xAF, 0x4D, 0x77, 0xAC, 0x41, 0xCE, 0xD9, 0x2A, 0xED, 0x17, - 0x95, 0x8A, 0x2B, 0x27, 0xAA, 0xFD, 0xEF, 0x64, 0xDB, 0x3E, 0xA2, 0x26, 0x03, 0x2C, 0x0F, 0x87 }, - }, - { - { 0xCE, 0x84, 0x19, 0xA7, 0xC8, 0x87, 0xFD, 0x59, 0x48, 0xB1, 0x0D, 0xC2, 0x64, 0x5C, 0x05, 0xCF, - 0xA1, 0xE1, 0x69, 0x06, 0xAC, 0x83, 0x35, 0x02, 0xA3, 0x0C, 0x42, 0xAD, 0x3F, 0x00, 0x7F, 0x17 }, - }, - { - { 0xCE, 0x9D, 0xE7, 0xAC, 0x2E, 0x0B, 0x8A, 0x4F, 0x85, 0xF5, 0xB6, 0x4E, 0x65, 0x22, 0x8D, 0x03, - 0xFC, 0x77, 0x93, 0xD9, 0x49, 0x42, 0xF8, 0x8A, 0x1C, 0x72, 0xBB, 0x7B, 0x61, 0x14, 0x51, 0xD5 }, - }, - { - { 0xCF, 0x03, 0x40, 0x17, 0x5B, 0x25, 0x03, 0xC8, 0xFA, 0x5D, 0x52, 0xED, 0x42, 0x5B, 0xF3, 0x7E, - 0x69, 0xC1, 0x80, 0xE5, 0x75, 0xAD, 0xC1, 0xA2, 0x6A, 0x47, 0x81, 0x97, 0x71, 0xB6, 0x8F, 0x7D }, - }, - { - { 0xCF, 0x10, 0xFA, 0xC3, 0x54, 0x4D, 0xCE, 0xE1, 0xBB, 0x98, 0x7E, 0x92, 0xE7, 0x35, 0x48, 0xB1, - 0xC6, 0xA8, 0x65, 0xE6, 0x9C, 0xD2, 0x91, 0x8A, 0xD0, 0x1D, 0xAF, 0x89, 0xB1, 0x04, 0x6A, 0x51 }, - }, - { - { 0xCF, 0x3C, 0x62, 0x0B, 0x39, 0xA4, 0x91, 0xB1, 0xBD, 0xC0, 0x33, 0x5F, 0xA1, 0x15, 0xB4, 0xF5, - 0xAE, 0xD7, 0xD8, 0xCD, 0x8E, 0xBB, 0xF2, 0xCA, 0x73, 0x7E, 0x7C, 0x6A, 0xC2, 0x00, 0x68, 0x0E }, - }, - { - { 0xCF, 0x3E, 0xCB, 0x41, 0xA4, 0xE8, 0x1B, 0x3A, 0xC8, 0x27, 0xDC, 0xBE, 0x4E, 0xB6, 0xD1, 0xCD, - 0x4C, 0x53, 0x4A, 0xDF, 0x8C, 0x87, 0xE4, 0xAA, 0x0C, 0xB2, 0x97, 0x15, 0x74, 0x6F, 0x04, 0x0B }, - }, - { - { 0xCF, 0x55, 0x5E, 0x56, 0x05, 0xDF, 0xA7, 0x42, 0x35, 0x33, 0xDD, 0xDA, 0xF7, 0x48, 0x72, 0xD1, - 0x68, 0x46, 0xE2, 0xCB, 0xF0, 0x30, 0x7D, 0x33, 0xA1, 0x0D, 0xF5, 0x72, 0x40, 0x67, 0x2F, 0x42 }, - }, - { - { 0xCF, 0x92, 0x77, 0xCE, 0xEA, 0x50, 0x1A, 0x49, 0x66, 0x04, 0x3E, 0xF2, 0xB0, 0xF8, 0x86, 0x2A, - 0xC9, 0x00, 0x93, 0x89, 0x78, 0x08, 0x26, 0x22, 0xC5, 0x7A, 0x50, 0x07, 0xC9, 0xC6, 0x53, 0x9D }, - }, - { - { 0xCF, 0xA0, 0xC0, 0x0C, 0xB2, 0xFB, 0x4B, 0x85, 0x7A, 0xAD, 0x22, 0xB1, 0x3A, 0x90, 0xE3, 0x46, - 0xA0, 0x3E, 0x6B, 0x79, 0xAB, 0xD5, 0xD2, 0x75, 0xB5, 0x43, 0x24, 0x68, 0x17, 0x92, 0xD6, 0xD1 }, - }, - { - { 0xCF, 0xFC, 0x37, 0x2D, 0xB5, 0xDA, 0x47, 0xAC, 0xDD, 0xF3, 0x1A, 0x84, 0x9B, 0xD2, 0xE2, 0xBD, - 0x25, 0xB6, 0x58, 0xEE, 0xB8, 0xDA, 0x82, 0x51, 0x59, 0x9A, 0x97, 0x51, 0x89, 0xB5, 0xF8, 0x24 }, - }, - { - { 0xD0, 0x71, 0x14, 0xB2, 0x97, 0xB2, 0x9F, 0xA2, 0xE0, 0xEC, 0xCD, 0xF1, 0x58, 0x7C, 0x0F, 0x03, - 0xF8, 0x81, 0x63, 0x95, 0x46, 0x1D, 0x01, 0x1C, 0x47, 0x7B, 0xD7, 0xFE, 0x83, 0x8A, 0x3D, 0x0B }, - }, - { - { 0xD0, 0xC4, 0x74, 0xE4, 0x47, 0xE3, 0x38, 0xA5, 0x4D, 0x31, 0xB3, 0xA0, 0xF4, 0x47, 0x43, 0x75, - 0x1E, 0x45, 0xCB, 0x92, 0x87, 0xA0, 0x1F, 0x2B, 0x0A, 0x51, 0xE6, 0x4F, 0x16, 0xC9, 0xA7, 0x5C }, - }, - { - { 0xD0, 0xEA, 0x0E, 0x9F, 0xD1, 0x80, 0x10, 0x0D, 0xCA, 0xC8, 0xB1, 0xB3, 0xFB, 0x95, 0xCE, 0xCB, - 0x9E, 0xCB, 0x1D, 0xFD, 0xCD, 0x6D, 0xF6, 0x16, 0xD8, 0xE1, 0x17, 0x50, 0x8A, 0x5C, 0xEE, 0xFD }, - }, - { - { 0xD0, 0xF5, 0x93, 0xC1, 0xA8, 0x1B, 0x1E, 0xF8, 0x51, 0x69, 0x81, 0xEE, 0x56, 0xF1, 0xD5, 0x98, - 0xA2, 0xA6, 0x03, 0x48, 0x8C, 0x67, 0x8C, 0x1B, 0x7B, 0xBE, 0xA6, 0x44, 0x6B, 0x00, 0x83, 0xAD }, - }, - { - { 0xD1, 0x07, 0x9A, 0x99, 0xF7, 0x3A, 0x01, 0xC9, 0x6E, 0xA6, 0x78, 0x84, 0x16, 0x62, 0xDA, 0x5E, - 0x74, 0xCA, 0xB2, 0xC4, 0x1D, 0x1F, 0x83, 0x45, 0x47, 0xFE, 0x65, 0x0F, 0x28, 0x50, 0xCD, 0x27 }, - }, - { - { 0xD1, 0x24, 0xFC, 0x30, 0x54, 0x79, 0x1F, 0x76, 0xBB, 0x8B, 0xAF, 0x57, 0xF5, 0xC4, 0x5B, 0x69, - 0x16, 0x8C, 0x3A, 0x6E, 0xE3, 0xFB, 0xCD, 0xF3, 0xEC, 0x2A, 0x77, 0xE8, 0x7C, 0x7C, 0x50, 0x09 }, - }, - { - { 0xD1, 0xBA, 0x62, 0xAC, 0x65, 0x17, 0x92, 0x3B, 0x96, 0x74, 0xF6, 0xA9, 0x73, 0xA1, 0x13, 0x17, - 0xC3, 0x0C, 0x20, 0x4F, 0x63, 0x65, 0xD1, 0x03, 0x00, 0x21, 0xB6, 0xF1, 0xF7, 0xFF, 0xBA, 0xA5 }, - }, - { - { 0xD1, 0xFA, 0xD9, 0xA8, 0xE6, 0x2E, 0x06, 0xCF, 0x9B, 0x40, 0x3A, 0xDF, 0x51, 0xED, 0x60, 0x75, - 0xEC, 0xE7, 0x61, 0xA1, 0x0D, 0xD6, 0xA4, 0xD8, 0xDE, 0x08, 0x82, 0x2F, 0xBB, 0x08, 0x22, 0xFD }, - }, - { - { 0xD2, 0x29, 0x2E, 0x6F, 0x6C, 0x3A, 0xF8, 0xAE, 0xEE, 0x62, 0xA8, 0x14, 0xB3, 0x17, 0x1D, 0xE4, - 0xA6, 0xD6, 0x60, 0xED, 0x25, 0xA2, 0x01, 0xB9, 0xBA, 0x7D, 0xE8, 0x3F, 0xDB, 0xE3, 0x95, 0x5E }, - }, - { - { 0xD2, 0x3F, 0xEB, 0x93, 0x47, 0x60, 0xB8, 0xDF, 0x4E, 0xE6, 0xB0, 0xE8, 0xBB, 0x4F, 0x5D, 0x31, - 0x5D, 0x40, 0x5B, 0xF0, 0x56, 0x18, 0x2E, 0x5D, 0x5F, 0x70, 0x20, 0x31, 0x94, 0x61, 0x8A, 0x05 }, - }, - { - { 0xD2, 0x56, 0x79, 0xCB, 0x58, 0x3B, 0xA0, 0x10, 0x8F, 0x74, 0x97, 0xE3, 0x21, 0xC6, 0x5C, 0x4D, - 0xC2, 0xCA, 0x0F, 0x28, 0x20, 0xC7, 0xFC, 0xDB, 0x11, 0x3F, 0x05, 0x72, 0xDF, 0x44, 0x79, 0x34 }, - }, - { - { 0xD2, 0x90, 0x3C, 0xA2, 0x55, 0x17, 0x27, 0xED, 0x01, 0x71, 0xCC, 0x4A, 0x43, 0xB3, 0xCA, 0xE0, - 0x09, 0xB7, 0x47, 0xB9, 0xF4, 0xF8, 0x48, 0x72, 0x92, 0x27, 0xBF, 0x59, 0x02, 0xF2, 0x3E, 0x47 }, - }, - { - { 0xD2, 0xB9, 0x70, 0xF3, 0x30, 0x65, 0x03, 0xE7, 0xD4, 0xBC, 0x63, 0x04, 0x64, 0xB2, 0xAF, 0x39, - 0x20, 0x66, 0x06, 0xD3, 0x6F, 0xF0, 0x51, 0xD9, 0x7D, 0x40, 0xD5, 0x8A, 0xB5, 0x37, 0x72, 0x83 }, - }, - { - { 0xD2, 0xC7, 0x0A, 0x4C, 0x52, 0xFB, 0xFC, 0x7B, 0x4C, 0x2D, 0xFE, 0x94, 0xCB, 0x44, 0x50, 0x37, - 0x1E, 0x72, 0x36, 0xBD, 0xBD, 0x1C, 0x81, 0x13, 0xFF, 0x36, 0x0F, 0xA4, 0xA1, 0x58, 0x1E, 0xFC }, - }, - { - { 0xD2, 0xD1, 0x84, 0xCA, 0x5B, 0x97, 0xAC, 0x7B, 0xD3, 0x4E, 0x78, 0x42, 0x4C, 0xA0, 0xC2, 0xB3, - 0x9C, 0x35, 0x08, 0x52, 0xCC, 0xB1, 0x33, 0xE5, 0xA1, 0x87, 0xF7, 0x61, 0x7D, 0x00, 0xB0, 0x2C }, - }, - { - { 0xD2, 0xE8, 0xA1, 0x23, 0x7A, 0x93, 0xF5, 0x78, 0xD1, 0xBA, 0x8F, 0x09, 0xE4, 0xFF, 0x10, 0x7B, - 0x62, 0x35, 0x78, 0x85, 0x42, 0xAA, 0x61, 0x83, 0xD1, 0x76, 0xDB, 0xF1, 0xC8, 0x8D, 0xCF, 0xB6 }, - }, - { - { 0xD3, 0x10, 0x0B, 0xC8, 0x42, 0x8B, 0xA2, 0x3A, 0xE1, 0x3B, 0x41, 0xEA, 0xA2, 0x95, 0xBF, 0xBF, - 0xD6, 0x97, 0xF5, 0x0B, 0x81, 0xCA, 0xEF, 0x6A, 0x30, 0xA4, 0xD1, 0x99, 0x47, 0x1B, 0x9F, 0x32 }, - }, - { - { 0xD3, 0x22, 0xE0, 0xC4, 0x4E, 0xA7, 0x92, 0xC0, 0x00, 0x13, 0x01, 0xA6, 0x32, 0xA1, 0x1D, 0x50, - 0x6E, 0xA9, 0x17, 0xDE, 0xED, 0xCA, 0x8E, 0xD0, 0x5F, 0x9E, 0x7A, 0xF0, 0xB6, 0x08, 0x55, 0x8B }, - }, - { - { 0xD3, 0x8E, 0x25, 0x54, 0xA9, 0xEE, 0x9B, 0x6D, 0xBC, 0xC4, 0x89, 0x2D, 0x71, 0x44, 0x7E, 0xF1, - 0x78, 0x92, 0xF3, 0xBC, 0xA3, 0x33, 0x95, 0x2D, 0xAA, 0x12, 0x16, 0xC9, 0xE9, 0x56, 0x22, 0x27 }, - }, - { - { 0xD3, 0xFF, 0x14, 0xAD, 0xD8, 0x86, 0x5F, 0xAA, 0x9C, 0x30, 0x3A, 0xED, 0xF9, 0x34, 0x53, 0x85, - 0x49, 0x8D, 0x44, 0xE1, 0xCD, 0xE0, 0x45, 0x6F, 0x1F, 0x33, 0xB4, 0x54, 0xC3, 0x95, 0x04, 0x58 }, - }, - { - { 0xD4, 0xA8, 0x3C, 0x51, 0x04, 0x29, 0x4F, 0x6A, 0xEC, 0x2A, 0xA0, 0x9F, 0xA6, 0xEF, 0x5F, 0xA0, - 0xF1, 0x72, 0xFD, 0xE6, 0xC4, 0xAC, 0xD9, 0x97, 0x2F, 0x39, 0xFE, 0xE2, 0x92, 0x4B, 0xE2, 0x74 }, - }, - { - { 0xD4, 0xC3, 0xFD, 0x99, 0x41, 0x39, 0x82, 0x2A, 0xF3, 0x4D, 0xED, 0xF2, 0xC0, 0xE6, 0x2A, 0xE5, - 0xEC, 0x67, 0x28, 0xAA, 0x6E, 0xAE, 0x4B, 0x65, 0x8D, 0x93, 0xBD, 0xAF, 0x3E, 0x4A, 0x7C, 0x0C }, - }, - { - { 0xD5, 0x04, 0x88, 0x96, 0x86, 0x07, 0x29, 0xA8, 0xFA, 0x5D, 0x23, 0x57, 0x81, 0x2B, 0xA5, 0x6C, - 0xBE, 0x84, 0xC9, 0xAB, 0x7D, 0x14, 0xDF, 0x47, 0x64, 0xE0, 0xB6, 0x62, 0x0F, 0xA3, 0x20, 0x10 }, - }, - { - { 0xD5, 0x07, 0x55, 0x61, 0x65, 0x49, 0x1E, 0xB1, 0x24, 0x3D, 0x9A, 0x61, 0xE2, 0x5D, 0x20, 0x84, - 0x7C, 0x57, 0xBC, 0xB2, 0x98, 0xE6, 0xD8, 0x5B, 0x7C, 0x45, 0xBE, 0xFB, 0x3D, 0x9C, 0x7B, 0x35 }, - }, - { - { 0xD5, 0x41, 0xA7, 0x7E, 0x13, 0x6E, 0x9E, 0x70, 0x3B, 0xB9, 0x9F, 0x80, 0x68, 0xCF, 0xEE, 0x86, - 0xA4, 0xB9, 0xF0, 0x89, 0xE0, 0x2D, 0x0C, 0x6C, 0xB6, 0xD4, 0xA3, 0x94, 0x6C, 0x6B, 0x16, 0x7A }, - }, - { - { 0xD5, 0x50, 0xB9, 0xA6, 0xD5, 0xC3, 0xF5, 0x25, 0x7C, 0x99, 0xB9, 0x94, 0x43, 0x69, 0x88, 0x3D, - 0xA1, 0x1D, 0xBE, 0x23, 0xB9, 0x6E, 0x19, 0x34, 0xED, 0xED, 0x52, 0x1B, 0x73, 0x55, 0xE4, 0x44 }, - }, - { - { 0xD5, 0x83, 0x7F, 0x79, 0xAD, 0xB8, 0x27, 0x89, 0x70, 0xDF, 0x46, 0x7E, 0xDF, 0x42, 0x5B, 0x8A, - 0x31, 0xB7, 0x50, 0xBC, 0x3B, 0x9C, 0x07, 0x57, 0xD4, 0xDA, 0x14, 0xC5, 0x0F, 0xCF, 0x76, 0x88 }, - }, - { - { 0xD5, 0x83, 0x94, 0x96, 0xCD, 0xC8, 0x5B, 0xE3, 0xD1, 0xF1, 0xAC, 0x65, 0x2E, 0xFA, 0x92, 0xBE, - 0xA3, 0xB0, 0x61, 0xC1, 0x3D, 0xAD, 0x5A, 0x82, 0x11, 0x22, 0xCF, 0xE9, 0xC7, 0x1A, 0x5A, 0x32 }, - }, - { - { 0xD5, 0xA4, 0xEE, 0x46, 0x95, 0xB5, 0x65, 0xA6, 0x7E, 0x50, 0x48, 0x66, 0xFE, 0x5B, 0xA3, 0xC0, - 0xED, 0xCA, 0xEE, 0xD5, 0x2A, 0xD0, 0xAF, 0x07, 0xE6, 0x79, 0x17, 0x73, 0x85, 0x12, 0xC8, 0xF5 }, - }, - { - { 0xD5, 0xCB, 0xAB, 0xC2, 0x61, 0x1A, 0x6C, 0x55, 0xAF, 0xB0, 0x43, 0x27, 0xE2, 0x60, 0x8C, 0xEC, - 0xF3, 0x45, 0x6C, 0x9F, 0xD8, 0xC7, 0x66, 0x58, 0x18, 0xA5, 0x4D, 0x5D, 0x93, 0x24, 0x97, 0xAB }, - }, - { - { 0xD6, 0x25, 0xC0, 0x59, 0x2B, 0x25, 0xDC, 0x03, 0xAA, 0x7E, 0x87, 0x8E, 0x6A, 0x85, 0x09, 0x1B, - 0xAA, 0x07, 0x8D, 0x26, 0x8B, 0xBD, 0xB4, 0x9F, 0x09, 0x67, 0x94, 0x08, 0x61, 0x2D, 0x1E, 0xFE }, - }, - { - { 0xD6, 0x46, 0x08, 0xB1, 0x5F, 0x71, 0xFC, 0x3B, 0x91, 0x90, 0xA2, 0x00, 0xEE, 0x3C, 0xB5, 0xBC, - 0xD9, 0xFC, 0x5B, 0x99, 0xFB, 0x67, 0x74, 0x9D, 0x18, 0x87, 0xD9, 0x17, 0xD8, 0x50, 0x01, 0x0B }, - }, - { - { 0xD6, 0x83, 0xD0, 0x6E, 0xB9, 0x28, 0x74, 0x43, 0xE5, 0x01, 0xEC, 0xF7, 0x1D, 0xAD, 0xA6, 0x80, - 0x35, 0x88, 0x71, 0xD1, 0x2A, 0x53, 0xFB, 0xCC, 0x44, 0x09, 0x2E, 0x76, 0x4E, 0xE5, 0xBA, 0x08 }, - }, - { - { 0xD6, 0xD1, 0xB3, 0x5C, 0xBC, 0x12, 0xFB, 0x1C, 0x70, 0xA0, 0xB4, 0x3B, 0xA5, 0x9A, 0xB3, 0xD3, - 0x22, 0x5F, 0x37, 0x32, 0x64, 0xDD, 0x87, 0xFB, 0xCA, 0x00, 0x61, 0xEC, 0x1C, 0x4D, 0xA1, 0x1A }, - }, - { - { 0xD7, 0x0E, 0xB9, 0xB3, 0xFE, 0xAD, 0xD3, 0x05, 0x3F, 0x5B, 0xBC, 0xD5, 0xBB, 0xDE, 0x27, 0x48, - 0xCC, 0xCF, 0xB3, 0xE4, 0x41, 0x36, 0x7C, 0xE9, 0x3B, 0x76, 0xCC, 0x46, 0xCC, 0xE3, 0x76, 0xC8 }, - }, - { - { 0xD7, 0x2C, 0x0E, 0x02, 0xA8, 0x71, 0xA9, 0xC2, 0x86, 0x7D, 0xB5, 0x13, 0x63, 0x62, 0x56, 0x98, - 0x32, 0xDC, 0x3B, 0x85, 0xAA, 0x05, 0x4A, 0x6C, 0x9E, 0xCC, 0x19, 0x01, 0x0E, 0xBA, 0x39, 0x3A }, - }, - { - { 0xD7, 0x32, 0x49, 0x74, 0xB5, 0x60, 0x09, 0x62, 0x17, 0x61, 0xF7, 0xC0, 0xFF, 0x68, 0x9D, 0xDE, - 0x47, 0x74, 0x99, 0x85, 0xE1, 0xEE, 0x8B, 0x5C, 0x89, 0x61, 0xDD, 0x8F, 0x6A, 0x78, 0xBB, 0xF5 }, - }, - { - { 0xD8, 0x0D, 0x49, 0xD7, 0xC6, 0x7A, 0x19, 0x3D, 0xE4, 0x4C, 0x4A, 0xD0, 0xA2, 0xF1, 0x0D, 0x04, - 0x33, 0xBD, 0x28, 0xFF, 0x57, 0x46, 0xB4, 0x2D, 0x8D, 0x27, 0x7F, 0x60, 0x8D, 0xAB, 0x7E, 0xFD }, - }, - { - { 0xD8, 0x18, 0xA4, 0x72, 0x70, 0xFD, 0xCD, 0x56, 0x4C, 0x8C, 0xEF, 0xBC, 0x28, 0xF7, 0x6D, 0x93, - 0x0B, 0x6C, 0x0D, 0xAE, 0x09, 0xD9, 0x3D, 0x24, 0x20, 0xEB, 0x7C, 0xDE, 0x20, 0x59, 0xAD, 0xBA }, - }, - { - { 0xD8, 0x29, 0xD3, 0x8A, 0xF1, 0xC4, 0x45, 0x73, 0x8B, 0xD8, 0x12, 0xE2, 0x8E, 0x38, 0x26, 0xB3, - 0x32, 0x27, 0x32, 0xAB, 0xE0, 0x02, 0x32, 0x89, 0xFE, 0x5A, 0x9E, 0xA6, 0x15, 0xF4, 0xF8, 0x97 }, - }, - { - { 0xD8, 0x32, 0x8D, 0x2F, 0xF8, 0x7E, 0xC3, 0xE9, 0x0B, 0x84, 0xD9, 0xA1, 0x7B, 0x1E, 0x90, 0x24, - 0xF6, 0x27, 0xC1, 0xEC, 0xC3, 0x5E, 0xC7, 0xE6, 0x71, 0xC1, 0x42, 0x92, 0xA7, 0xB8, 0x8B, 0x43 }, - }, - { - { 0xD8, 0x55, 0x49, 0xFC, 0xD2, 0x4D, 0x36, 0xCB, 0x3F, 0x7C, 0x18, 0x06, 0x3F, 0x97, 0x5A, 0x16, - 0x9F, 0xE3, 0xA1, 0xFB, 0x8D, 0x0A, 0x35, 0x9F, 0xD3, 0x5C, 0x28, 0x7B, 0xB2, 0xAF, 0x50, 0xCA }, - }, - { - { 0xD8, 0x7A, 0x9D, 0xF7, 0x19, 0x1E, 0x29, 0xC8, 0x04, 0x1E, 0x4C, 0x19, 0x3C, 0x03, 0xA8, 0xA7, - 0x12, 0x5F, 0x16, 0x6E, 0xA6, 0xCB, 0x21, 0x1F, 0xFF, 0x4B, 0xEE, 0x45, 0x0D, 0x72, 0x58, 0x09 }, - }, - { - { 0xD8, 0x83, 0xDD, 0x00, 0x1C, 0x4E, 0x5C, 0x22, 0x6E, 0xE2, 0xC1, 0xF1, 0x0A, 0x66, 0x6F, 0xA1, - 0x6E, 0x5A, 0xA9, 0x12, 0x30, 0x58, 0x38, 0xED, 0x9C, 0xDD, 0xC1, 0x56, 0x4D, 0xC6, 0x49, 0x64 }, - }, - { - { 0xD8, 0xF0, 0xE4, 0x50, 0x14, 0xD7, 0x09, 0x7D, 0xB4, 0xD6, 0xF7, 0x65, 0xEF, 0xE8, 0xB2, 0xB1, - 0x3A, 0x18, 0xDD, 0xE7, 0x39, 0xDF, 0x2A, 0xF7, 0x72, 0x73, 0x50, 0x26, 0x47, 0x04, 0xF7, 0x90 }, - }, - { - { 0xD8, 0xFF, 0x73, 0x93, 0x1F, 0x89, 0x1D, 0x94, 0x70, 0xBD, 0x60, 0xF4, 0xC7, 0x4A, 0x0E, 0x28, - 0x88, 0xC8, 0x0D, 0xCB, 0x1E, 0xCF, 0xB1, 0x18, 0xC3, 0xDC, 0x81, 0x90, 0xDA, 0x99, 0x1A, 0x70 }, - }, - { - { 0xD9, 0x2E, 0x3E, 0xE3, 0x82, 0xC8, 0xDC, 0xAF, 0xA0, 0x39, 0x3D, 0x9F, 0x9A, 0x00, 0xBF, 0x4C, - 0xD9, 0xD5, 0x64, 0x26, 0x2B, 0x18, 0x0F, 0x68, 0x16, 0x0B, 0x20, 0x34, 0xC5, 0x44, 0xD1, 0x0A }, - }, - { - { 0xD9, 0x41, 0x01, 0xB0, 0xDF, 0x02, 0xCD, 0xFE, 0xEA, 0xD5, 0x21, 0xD0, 0xE2, 0xCF, 0x3A, 0x69, - 0x46, 0x1F, 0x82, 0x6B, 0xB7, 0xA4, 0xAB, 0x50, 0xBA, 0x36, 0xA3, 0xC1, 0xF8, 0x3A, 0x52, 0xC4 }, - }, - { - { 0xD9, 0x65, 0xF7, 0x41, 0x62, 0x04, 0xDA, 0x83, 0x1A, 0xF6, 0x6B, 0xFA, 0x8F, 0x90, 0xD1, 0x41, - 0xE9, 0x93, 0xF0, 0x00, 0x21, 0x33, 0xF2, 0x8D, 0xE9, 0x7F, 0x56, 0x4A, 0x1D, 0x60, 0x4E, 0xCC }, - }, - { - { 0xD9, 0x7F, 0x55, 0xB9, 0x57, 0x9B, 0x05, 0xAE, 0x4A, 0x3E, 0xD7, 0xFC, 0x55, 0x8C, 0x58, 0x45, - 0x64, 0x51, 0x60, 0xDA, 0xB3, 0x53, 0x85, 0xC1, 0x38, 0xBC, 0x89, 0x9C, 0x4D, 0xAD, 0x8B, 0x36 }, - }, - { - { 0xD9, 0x81, 0x67, 0x9E, 0x4E, 0xCD, 0xE9, 0xC5, 0xAB, 0x5B, 0xEF, 0x9D, 0x5F, 0x97, 0x7B, 0x0F, - 0x32, 0xF9, 0x25, 0x56, 0xE2, 0x06, 0xB1, 0x51, 0x09, 0xA9, 0xBB, 0xEC, 0x59, 0x16, 0xE2, 0xD7 }, - }, - { - { 0xD9, 0x89, 0x73, 0x8D, 0x2D, 0xE5, 0x06, 0x5B, 0x8E, 0x7A, 0x8C, 0x07, 0x44, 0x88, 0xBE, 0x8E, - 0x7D, 0x93, 0xAA, 0x82, 0xA8, 0x35, 0x96, 0x49, 0x24, 0xC5, 0x8F, 0x32, 0x09, 0xFB, 0x56, 0x9E }, - }, - { - { 0xD9, 0xD0, 0xD9, 0x6E, 0xB3, 0x28, 0xE0, 0xC1, 0x77, 0x8B, 0x56, 0xA9, 0x2F, 0x71, 0x24, 0x3B, - 0x6C, 0x0D, 0xB4, 0x5C, 0x62, 0x51, 0x32, 0xDD, 0x82, 0xCA, 0x11, 0xA0, 0x97, 0xE7, 0x91, 0xC6 }, - }, - { - { 0xD9, 0xE8, 0xCC, 0xDA, 0x78, 0xFB, 0x8D, 0x5D, 0xBC, 0xE6, 0x94, 0x15, 0x57, 0x61, 0xF4, 0xD0, - 0x2C, 0x30, 0xCC, 0x8D, 0x7A, 0xEA, 0x0E, 0x11, 0x88, 0x2D, 0x79, 0x37, 0x6C, 0x72, 0x90, 0xFF }, - }, - { - { 0xDA, 0x1D, 0x8C, 0x2F, 0xE5, 0x25, 0xA6, 0xAD, 0xD6, 0xCD, 0x0F, 0xB4, 0x0F, 0xCD, 0xBF, 0xCE, - 0x0D, 0x19, 0x72, 0xED, 0x61, 0xAC, 0xDD, 0x5A, 0x0F, 0xE0, 0x19, 0x7F, 0x01, 0x07, 0x8D, 0x7F }, - }, - { - { 0xDA, 0xA3, 0x09, 0xDA, 0xEF, 0xCB, 0x5C, 0xD3, 0xBD, 0xF6, 0xE1, 0x4B, 0xA6, 0x89, 0x0B, 0x4F, - 0x73, 0xF2, 0xEC, 0x1C, 0xEF, 0xC1, 0xD5, 0x1F, 0x45, 0xCD, 0x9F, 0xC2, 0x2B, 0x01, 0x9A, 0x1E }, - }, - { - { 0xDA, 0xB2, 0xF9, 0xE8, 0xB5, 0xF8, 0x56, 0x47, 0x90, 0x93, 0x2D, 0x6B, 0xDB, 0x34, 0x29, 0x16, - 0x2D, 0x5E, 0x2C, 0xB5, 0xD0, 0x10, 0x2D, 0x79, 0xD8, 0x89, 0xAD, 0x5A, 0xB6, 0xEE, 0xC4, 0x77 }, - }, - { - { 0xDA, 0xDF, 0x97, 0x13, 0x34, 0x14, 0xAD, 0x51, 0x3F, 0xC7, 0x50, 0x14, 0xE9, 0x56, 0x65, 0xDA, - 0xD7, 0x76, 0xB1, 0x50, 0x4B, 0x15, 0x67, 0x43, 0x4F, 0xD8, 0x2A, 0x79, 0xA2, 0x20, 0xE9, 0xA1 }, - }, - { - { 0xDB, 0x1B, 0x33, 0x54, 0x93, 0xBE, 0x68, 0xD2, 0x8E, 0x3C, 0x4D, 0x3D, 0x11, 0x84, 0x99, 0x42, - 0x26, 0x17, 0x93, 0x49, 0xDA, 0xF1, 0x79, 0x5B, 0x77, 0x39, 0x3E, 0x2D, 0xD9, 0x87, 0xBB, 0x43 }, - }, - { - { 0xDB, 0x1D, 0x05, 0x4E, 0xEF, 0x12, 0xBD, 0x34, 0xA5, 0xBD, 0x99, 0xCD, 0xC5, 0xB8, 0x64, 0x8D, - 0x8E, 0x10, 0xDE, 0xF9, 0xC7, 0x8A, 0xFD, 0x90, 0xA4, 0xB4, 0xAD, 0x1E, 0xD1, 0xD9, 0x09, 0x06 }, - }, - { - { 0xDB, 0x2D, 0xB8, 0x4B, 0x17, 0x3C, 0xE2, 0x83, 0xBA, 0x18, 0x0F, 0xA2, 0x2F, 0x15, 0xC5, 0x5F, - 0x6A, 0x2A, 0x27, 0x66, 0x9C, 0xA8, 0x14, 0xA0, 0x3B, 0x9E, 0xD0, 0x31, 0x90, 0xCF, 0x92, 0xF6 }, - }, - { - { 0xDB, 0x57, 0x78, 0x2A, 0x14, 0xE1, 0x3C, 0x3B, 0xE5, 0x38, 0x9A, 0x26, 0x08, 0x1C, 0x99, 0x8B, - 0x5F, 0xFA, 0x67, 0xDD, 0x45, 0x97, 0xF8, 0xCA, 0x67, 0xEF, 0x10, 0x6A, 0xD7, 0x5F, 0x34, 0x9F }, - }, - { - { 0xDB, 0xA1, 0x23, 0x67, 0x1F, 0xED, 0x4B, 0x28, 0x70, 0x33, 0xA4, 0xB0, 0x06, 0x8F, 0xC7, 0x14, - 0xA5, 0xFC, 0x9C, 0x02, 0x6E, 0xF5, 0x65, 0x0B, 0x42, 0xDE, 0x25, 0x85, 0x9A, 0x12, 0x6A, 0xD1 }, - }, - { - { 0xDB, 0xA2, 0x21, 0xC2, 0xAB, 0x44, 0xB5, 0x2C, 0x0B, 0x83, 0x36, 0xC4, 0x69, 0xFA, 0xA8, 0x56, - 0xD6, 0xC3, 0xEC, 0xDC, 0x6C, 0x24, 0x6B, 0xE3, 0xCA, 0xC7, 0xE0, 0xF6, 0x28, 0x4B, 0x5B, 0xDA }, - }, - { - { 0xDC, 0x30, 0x45, 0x1C, 0xFB, 0x1A, 0x68, 0x3F, 0xC5, 0xB2, 0xF3, 0x16, 0x56, 0x02, 0x49, 0x6A, - 0x8F, 0xC1, 0xED, 0xA7, 0xCD, 0x1E, 0x61, 0xB3, 0xE1, 0x67, 0x47, 0x71, 0xD1, 0x4F, 0x7A, 0x0E }, - }, - { - { 0xDC, 0x3D, 0x81, 0xC3, 0x01, 0xBC, 0xDE, 0xC5, 0x38, 0xEF, 0xC7, 0xFA, 0x6A, 0x4E, 0x5A, 0x13, - 0xE5, 0x17, 0xD2, 0xA4, 0x61, 0x22, 0x2D, 0xED, 0x98, 0x3E, 0x75, 0x56, 0x4D, 0x0E, 0x68, 0x84 }, - }, - { - { 0xDC, 0x42, 0x4A, 0x70, 0x87, 0x80, 0x95, 0x98, 0x7A, 0x5B, 0xCD, 0x17, 0x1A, 0xA5, 0x13, 0x67, - 0x7B, 0xDA, 0x56, 0xDF, 0x35, 0xB6, 0x81, 0xC7, 0x07, 0x84, 0x0F, 0xDC, 0xEA, 0xC5, 0xE4, 0x0F }, - }, - { - { 0xDC, 0x69, 0x58, 0x6C, 0xCD, 0x6D, 0x51, 0x0D, 0xD1, 0xCF, 0x79, 0x56, 0xA6, 0x71, 0xD0, 0x84, - 0xEE, 0x14, 0x99, 0xDA, 0x54, 0xB8, 0xBC, 0x79, 0xEB, 0x07, 0x28, 0x71, 0xA9, 0x18, 0xC4, 0x06 }, - }, - { - { 0xDC, 0x90, 0x90, 0x55, 0x0C, 0x93, 0x42, 0xE2, 0xFA, 0xE2, 0x42, 0x26, 0xA4, 0xF9, 0xB3, 0xF6, - 0x93, 0xF4, 0xD1, 0x46, 0x52, 0x79, 0xC3, 0x7B, 0x46, 0x14, 0x38, 0xF4, 0xF5, 0x3C, 0x0E, 0x0B }, - }, - { - { 0xDC, 0xB2, 0x1D, 0xEF, 0x3C, 0x26, 0x0B, 0x20, 0x50, 0xF3, 0x4C, 0x5F, 0x51, 0xBE, 0x30, 0x9C, - 0x3C, 0x76, 0x36, 0x30, 0x6D, 0x51, 0xB9, 0xBE, 0x43, 0xD8, 0x9D, 0xE0, 0x8F, 0x60, 0xD9, 0x4A }, - }, - { - { 0xDD, 0x30, 0xCB, 0x75, 0xC9, 0x3E, 0x01, 0xFC, 0xC6, 0xE8, 0x44, 0x63, 0xFD, 0x47, 0x78, 0x15, - 0x8F, 0x3A, 0x18, 0xCE, 0x89, 0x67, 0x7B, 0x01, 0xE6, 0xFF, 0x5B, 0xA7, 0x2F, 0xA4, 0xD0, 0xF6 }, - }, - { - { 0xDD, 0x9D, 0xD7, 0xC1, 0x80, 0xB2, 0x73, 0x50, 0x83, 0xF5, 0xC7, 0x29, 0x3E, 0xC8, 0x64, 0x07, - 0x4B, 0x42, 0x27, 0xFE, 0x0E, 0xAE, 0x8D, 0x4D, 0xAF, 0x66, 0x54, 0x0D, 0x82, 0x2F, 0x81, 0xA1 }, - }, - { - { 0xDE, 0x01, 0xA7, 0x27, 0x1A, 0x95, 0x3D, 0xA2, 0xF0, 0xFD, 0xDB, 0x6B, 0x37, 0xFE, 0x00, 0x28, - 0xDE, 0x8B, 0x7D, 0x3C, 0xE5, 0x79, 0x1B, 0x45, 0x0D, 0xD2, 0x83, 0xB2, 0x0A, 0xDB, 0x05, 0xD2 }, - }, - { - { 0xDE, 0x45, 0x46, 0xC0, 0x24, 0x51, 0xA5, 0xB5, 0xAD, 0x85, 0xEA, 0x53, 0x2F, 0x09, 0x6F, 0xDF, - 0x1E, 0x2B, 0x41, 0x71, 0xD9, 0x6A, 0x1D, 0xC3, 0x93, 0x6A, 0x19, 0x74, 0xF0, 0x58, 0xF0, 0xB2 }, - }, - { - { 0xDE, 0x5C, 0x3D, 0x09, 0x58, 0xA6, 0x12, 0xBD, 0x6D, 0x48, 0x09, 0x15, 0x03, 0x3D, 0x97, 0x15, - 0x58, 0xDF, 0x35, 0xCE, 0xB1, 0xC9, 0x18, 0xE6, 0x9A, 0x01, 0x34, 0x51, 0xE4, 0x50, 0x95, 0xB8 }, - }, - { - { 0xDE, 0x77, 0xEA, 0xDB, 0xCB, 0xC2, 0x05, 0xDD, 0x55, 0xA0, 0xE1, 0x18, 0xCA, 0x67, 0x74, 0xF9, - 0x58, 0x09, 0xA8, 0x2C, 0xA0, 0x1B, 0x2D, 0x5E, 0x85, 0x72, 0xE6, 0x17, 0xB6, 0xAB, 0xF4, 0x72 }, + { 0x94, 0xDC, 0x80, 0x07, 0x49, 0x1D, 0xA8, 0xBF, 0xB7, 0x39, 0x14, 0xAD, 0xCE, 0xF7, 0x1A, 0x12, + 0x41, 0x58, 0xBA, 0xD1, 0x7B, 0xA8, 0x8F, 0xA9, 0x46, 0x57, 0x9B, 0xBC, 0x2D, 0x64, 0x97, 0x8D }, }, { - { 0xDE, 0xCD, 0xB9, 0xFC, 0x1D, 0xDE, 0xC9, 0x7E, 0x09, 0xC3, 0x02, 0x6A, 0xCE, 0xB7, 0x6B, 0xDA, - 0xE9, 0xDE, 0xB6, 0x62, 0x75, 0x1D, 0xDA, 0x34, 0x9D, 0x2F, 0xA6, 0xBD, 0x75, 0xCA, 0x59, 0x14 }, + { 0x95, 0x68, 0x33, 0xAE, 0xE6, 0x61, 0x19, 0x26, 0xE9, 0x52, 0x72, 0xA1, 0xF5, 0x88, 0xF9, 0x2A, + 0xF5, 0x2C, 0xAE, 0x70, 0x7A, 0xCD, 0xCC, 0x82, 0x63, 0x99, 0x7B, 0xFA, 0x8C, 0x71, 0x9C, 0xA8 }, }, { - { 0xDE, 0xD1, 0x9A, 0xD5, 0xDE, 0x99, 0x65, 0xD9, 0x22, 0x5C, 0x1B, 0xBA, 0x5F, 0xB4, 0xD8, 0x90, - 0xC8, 0xE5, 0xC0, 0x35, 0xE4, 0x85, 0x27, 0x52, 0xB6, 0x69, 0xB0, 0x40, 0x0F, 0x24, 0xF1, 0x74 }, + { 0x95, 0x89, 0xDA, 0xC9, 0xEC, 0xE7, 0x6D, 0xF5, 0x72, 0x01, 0x96, 0xDC, 0x58, 0x6D, 0x17, 0x9D, + 0x73, 0x5D, 0xF7, 0x17, 0x92, 0x6C, 0x06, 0x1E, 0xA7, 0x0C, 0x40, 0x85, 0x64, 0x8F, 0xF3, 0x12 }, }, { - { 0xDF, 0x12, 0x39, 0x4E, 0x73, 0xCB, 0x8C, 0x95, 0xC5, 0x7E, 0x49, 0x8B, 0x96, 0xFF, 0x65, 0x2C, - 0x06, 0xAC, 0x62, 0xA9, 0xA8, 0xED, 0x83, 0x85, 0x39, 0x93, 0xDC, 0xBD, 0xEB, 0xC0, 0x16, 0xAA }, + { 0x96, 0xA4, 0x59, 0x90, 0xFC, 0xD0, 0x1C, 0x9C, 0x2A, 0xF0, 0x64, 0x5F, 0x87, 0xB9, 0x69, 0x8B, + 0x05, 0xAF, 0xE6, 0x94, 0x32, 0xEB, 0x57, 0x01, 0x08, 0x20, 0x13, 0xBA, 0xC5, 0xB0, 0x55, 0x60 }, }, { - { 0xDF, 0x30, 0xBF, 0x8D, 0x1B, 0xF9, 0x37, 0x8E, 0x43, 0x3E, 0xF9, 0xE1, 0xB3, 0xA2, 0x28, 0xA0, - 0x7E, 0x36, 0x58, 0xA5, 0xBC, 0x43, 0x88, 0x23, 0x45, 0x4D, 0xB0, 0x6A, 0x67, 0x94, 0x4C, 0x6E }, + { 0x96, 0xEB, 0x44, 0xAA, 0x6A, 0x20, 0x49, 0xE6, 0xBA, 0xFF, 0xE6, 0xB5, 0x21, 0xC4, 0xAD, 0x8C, + 0x58, 0x77, 0x26, 0xCA, 0xA0, 0x12, 0xE8, 0xFB, 0x8E, 0x8E, 0x21, 0x89, 0x77, 0xBF, 0x1D, 0xF6 }, }, { - { 0xDF, 0x51, 0x6D, 0xA3, 0xC8, 0x2D, 0x2D, 0x71, 0x17, 0x77, 0x76, 0x59, 0xCC, 0x9D, 0xBE, 0x7C, - 0xEC, 0x22, 0x70, 0x8F, 0x22, 0x59, 0x47, 0x6F, 0xFC, 0x48, 0x60, 0x34, 0x94, 0xFC, 0x87, 0xD3 }, + { 0x97, 0x4F, 0x51, 0xA6, 0x04, 0x68, 0x48, 0xFA, 0xA7, 0xB3, 0x3F, 0xD2, 0x39, 0x13, 0x86, 0x42, + 0x8B, 0xD5, 0x24, 0xEA, 0xEB, 0xA8, 0x01, 0x4E, 0x6D, 0x1F, 0xE2, 0x54, 0x38, 0x3F, 0x41, 0x79 }, }, { - { 0xDF, 0x69, 0xF9, 0x6A, 0x85, 0x67, 0x8F, 0x6C, 0xAF, 0x3F, 0xDE, 0x25, 0xEC, 0xFB, 0x5D, 0xF4, - 0x74, 0x70, 0x87, 0xC2, 0xAF, 0x3B, 0x00, 0x65, 0xFB, 0x15, 0x10, 0x55, 0xCB, 0xCB, 0xA8, 0xC1 }, + { 0x97, 0x8D, 0x6F, 0x1E, 0x9A, 0xA3, 0xA3, 0xCE, 0xB1, 0xAD, 0xA6, 0x09, 0xE2, 0x00, 0x95, 0xFB, + 0xC3, 0x3A, 0x6B, 0xBC, 0x6A, 0x21, 0xD8, 0x0A, 0x4E, 0xCB, 0x27, 0x3C, 0x60, 0xAC, 0x2A, 0xC7 }, }, { - { 0xDF, 0xE5, 0xE5, 0x4F, 0x77, 0x04, 0xBE, 0xA9, 0xCE, 0xC9, 0xC3, 0x36, 0x85, 0xE8, 0x93, 0x37, - 0x6F, 0xE0, 0x65, 0xD3, 0x3B, 0xBC, 0x23, 0x5D, 0x16, 0xA4, 0x35, 0x3D, 0x3C, 0x28, 0x41, 0xED }, + { 0x98, 0xB5, 0x92, 0x4E, 0x06, 0xCD, 0xEA, 0x1B, 0xA1, 0x7F, 0xDB, 0x1B, 0x13, 0x97, 0x90, 0x24, + 0xB1, 0xC2, 0x5B, 0x0A, 0x69, 0x0C, 0xFE, 0x87, 0x8D, 0x4C, 0xB4, 0x07, 0x76, 0xB9, 0x6F, 0xB0 }, }, { - { 0xDF, 0xFB, 0x15, 0x21, 0xAA, 0x2D, 0x83, 0x65, 0x9A, 0x85, 0x8E, 0x14, 0x62, 0x82, 0x43, 0xD7, - 0x23, 0x14, 0x5E, 0xA8, 0x13, 0x77, 0xDE, 0xD7, 0x99, 0x1A, 0x3C, 0x00, 0xA3, 0x88, 0x9B, 0xF5 }, + { 0x99, 0xA5, 0x5F, 0x76, 0xCB, 0xEA, 0x0F, 0x3E, 0x60, 0x71, 0xD3, 0x82, 0x18, 0x1A, 0xF6, 0xCB, + 0x25, 0xBD, 0xC5, 0x87, 0x5E, 0x29, 0xF0, 0xF4, 0xD7, 0x19, 0xA9, 0xD3, 0x5B, 0x5B, 0xD6, 0xBF }, }, { - { 0xE0, 0x0B, 0xD7, 0x86, 0xD1, 0xF2, 0xF4, 0x46, 0xC4, 0xBA, 0x83, 0x99, 0xD4, 0xD8, 0xD5, 0xA0, - 0xD1, 0x98, 0x57, 0x8F, 0x42, 0x99, 0xFD, 0xFD, 0xAF, 0xF7, 0x8C, 0x3F, 0x67, 0x71, 0xF3, 0x94 }, + { 0x9A, 0x4B, 0x49, 0x93, 0xB4, 0xED, 0x8C, 0x27, 0xE7, 0x7F, 0x3C, 0x8A, 0xAF, 0xDB, 0xDC, 0x11, + 0x1A, 0x36, 0xB7, 0x3C, 0xCA, 0xDB, 0x87, 0x04, 0x98, 0x25, 0x00, 0xD1, 0xB0, 0xF1, 0x09, 0xF2 }, }, { - { 0xE0, 0x65, 0x19, 0x10, 0x41, 0x74, 0x08, 0xBE, 0x2B, 0x0C, 0xFD, 0x3D, 0x9E, 0xAA, 0xEB, 0xCA, - 0x32, 0x1F, 0x61, 0x6D, 0xDA, 0x48, 0xCB, 0x4F, 0x09, 0x10, 0x9D, 0x67, 0x19, 0x45, 0xA1, 0x1C }, + { 0x9A, 0x5F, 0xAB, 0xE5, 0x8A, 0x1E, 0xAE, 0x4B, 0x20, 0xBA, 0xB3, 0xA7, 0xEB, 0x5E, 0x42, 0xA2, + 0xDA, 0x83, 0x11, 0x59, 0x25, 0x7D, 0xD4, 0xE3, 0x55, 0x2E, 0xC6, 0xF7, 0xD2, 0x67, 0xFA, 0xBA }, }, { - { 0xE0, 0x8B, 0x2C, 0xC2, 0x7A, 0xE8, 0xE2, 0xEF, 0x1A, 0x33, 0x01, 0x7A, 0x9A, 0xC2, 0x5D, 0xDA, - 0xFB, 0x5E, 0xA1, 0x12, 0xC9, 0x56, 0xB0, 0x02, 0xFE, 0x6C, 0x79, 0x80, 0x14, 0xAA, 0x90, 0x65 }, + { 0x9A, 0xAE, 0x9D, 0x45, 0xAA, 0x04, 0x03, 0x06, 0x4B, 0xC5, 0xA7, 0x4D, 0xD0, 0x32, 0x5D, 0xA4, + 0x1E, 0x12, 0xCF, 0x58, 0x6C, 0x46, 0x2E, 0xE0, 0x6C, 0x2B, 0xB4, 0x56, 0xF8, 0x44, 0x1C, 0x4F }, }, { - { 0xE0, 0xA0, 0x7B, 0x39, 0x6D, 0x25, 0x7F, 0xAB, 0xB4, 0xE3, 0x22, 0xD8, 0x79, 0x94, 0x88, 0x37, - 0x28, 0x7A, 0xAA, 0x99, 0xAD, 0x14, 0xD7, 0x8D, 0x3A, 0x2F, 0x9D, 0xFE, 0x5C, 0x97, 0x28, 0xBF }, + { 0x9B, 0x8F, 0x9F, 0xC4, 0xAF, 0xA7, 0x04, 0x0D, 0x4E, 0x59, 0x4D, 0x66, 0x7C, 0x44, 0x44, 0xB5, + 0x25, 0x88, 0x20, 0xC0, 0x8F, 0x89, 0x91, 0x0E, 0xD3, 0x42, 0x1C, 0xB4, 0xA9, 0x7B, 0xB7, 0x9E }, }, { - { 0xE0, 0xA9, 0xD9, 0x63, 0x6E, 0xFA, 0x36, 0xA7, 0x72, 0xAC, 0xB5, 0xD0, 0x22, 0xFC, 0xA9, 0x73, - 0x71, 0xB4, 0x4F, 0x7B, 0x80, 0x4B, 0x03, 0x97, 0xFB, 0x6C, 0x37, 0x1A, 0x22, 0x5B, 0xDA, 0x78 }, + { 0x9C, 0x70, 0x8D, 0x5B, 0xAB, 0x37, 0xF5, 0xB6, 0xBC, 0x8A, 0x77, 0x53, 0x12, 0x57, 0x2A, 0xB2, + 0x79, 0x21, 0x6D, 0x55, 0x6D, 0xA7, 0x4A, 0xC2, 0xA7, 0xC0, 0x41, 0xE8, 0xCE, 0xB0, 0xBE, 0x0A }, }, { - { 0xE0, 0xBB, 0xEF, 0x7E, 0xE4, 0x37, 0xB0, 0x59, 0xE0, 0x3B, 0x52, 0x9B, 0xE6, 0xB4, 0x09, 0x6D, - 0x56, 0xC7, 0x4E, 0x90, 0x67, 0xB0, 0x5F, 0x87, 0xAA, 0x6A, 0x5A, 0x61, 0x93, 0x40, 0xA7, 0xC3 }, + { 0x9C, 0xCA, 0x23, 0x7C, 0xDF, 0xCA, 0x2C, 0x72, 0xC6, 0x09, 0x25, 0x4A, 0x72, 0x57, 0xFE, 0xD5, + 0x3A, 0xF1, 0x44, 0xAB, 0xC2, 0x5E, 0xCD, 0x8E, 0xF7, 0x01, 0x30, 0x8C, 0xB1, 0x3C, 0xF7, 0x69 }, }, { - { 0xE0, 0xDD, 0xE1, 0x29, 0xD2, 0x60, 0xC3, 0xDA, 0xB6, 0x91, 0xD8, 0x1D, 0xAB, 0xAD, 0x73, 0x4C, - 0x9A, 0xDC, 0x61, 0xD2, 0x0C, 0x1A, 0xE1, 0xB6, 0x72, 0x4E, 0x7B, 0x27, 0x92, 0x75, 0xDA, 0x35 }, + { 0x9D, 0x6B, 0xDF, 0xCF, 0x0C, 0xBF, 0xFE, 0xEA, 0x3B, 0x1A, 0xC7, 0xE9, 0x63, 0xCB, 0xB5, 0xF2, + 0x7F, 0xBD, 0xA8, 0x9D, 0x27, 0x77, 0xF6, 0x0E, 0x56, 0x5B, 0x27, 0x78, 0x54, 0xEF, 0xB0, 0x19 }, }, { - { 0xE1, 0xB2, 0xE8, 0x6B, 0x0D, 0xA8, 0x69, 0xE9, 0x25, 0x26, 0x6C, 0x1B, 0x56, 0x88, 0x34, 0x5A, - 0x17, 0xB0, 0xF6, 0xE2, 0xA2, 0x14, 0x94, 0x54, 0x7E, 0xAC, 0x09, 0x7C, 0x8B, 0xF5, 0x3C, 0x5A }, + { 0x9D, 0xAC, 0x33, 0x14, 0xB2, 0x5B, 0xB7, 0x9A, 0x39, 0xCD, 0x01, 0xEC, 0x4B, 0x33, 0xA1, 0x2F, + 0x47, 0x51, 0x2F, 0x54, 0x09, 0xFF, 0x09, 0x5D, 0x40, 0xAA, 0xD6, 0x20, 0x84, 0xEF, 0x15, 0xBE }, }, { - { 0xE1, 0xD4, 0xBB, 0x78, 0x58, 0x58, 0x9E, 0x08, 0x7E, 0x01, 0xAE, 0x85, 0x99, 0x5A, 0x5C, 0x2F, - 0xD0, 0xAC, 0xED, 0xF4, 0x40, 0x55, 0xFF, 0x96, 0x73, 0x8F, 0x2B, 0x32, 0xB3, 0x31, 0x6E, 0xB0 }, + { 0x9F, 0x24, 0x5C, 0x0A, 0x0E, 0xC6, 0x3A, 0xAA, 0xCB, 0xF9, 0x69, 0xC6, 0xFC, 0x24, 0xA1, 0x07, + 0x15, 0x83, 0xB7, 0x79, 0xA5, 0x8A, 0xB6, 0x23, 0xDD, 0x15, 0x31, 0xA2, 0xCA, 0x9F, 0x87, 0x51 }, }, { - { 0xE1, 0xD6, 0x44, 0xA0, 0x96, 0xBD, 0x8A, 0x6C, 0xAC, 0xBB, 0xDA, 0x3E, 0x7F, 0xC3, 0x38, 0xEA, - 0xDD, 0xC1, 0x2F, 0x23, 0x6C, 0x72, 0x61, 0xE4, 0x5F, 0x8A, 0xD2, 0xD8, 0x42, 0x42, 0x4F, 0x72 }, + { 0x9F, 0xAF, 0x1C, 0x11, 0xA3, 0xC7, 0xE2, 0x41, 0xF8, 0x63, 0x71, 0x97, 0xE8, 0x99, 0x68, 0xDB, + 0x86, 0x6A, 0xD0, 0x1A, 0x5D, 0x4E, 0xD5, 0x34, 0x59, 0x48, 0x65, 0xB9, 0x70, 0x75, 0xF2, 0x60 }, }, { - { 0xE2, 0x24, 0x10, 0xB5, 0xA6, 0x7F, 0xED, 0xC2, 0x64, 0x69, 0x4C, 0x44, 0x9D, 0x84, 0xFA, 0x1A, - 0x02, 0xBC, 0x8B, 0x21, 0x28, 0xC1, 0x25, 0x60, 0x71, 0x58, 0xC9, 0x1B, 0x05, 0x38, 0x6C, 0x6A }, + { 0x9F, 0xFA, 0x4E, 0xF4, 0xFC, 0xF2, 0xCF, 0xD1, 0xB2, 0x7C, 0x6A, 0x62, 0xE3, 0xC4, 0x23, 0x5B, + 0xD8, 0x3C, 0xC5, 0xE0, 0x06, 0xE9, 0x2A, 0x55, 0xE4, 0xA9, 0x86, 0xE6, 0x30, 0x53, 0x57, 0xE3 }, }, { - { 0xE2, 0xA8, 0x47, 0xC3, 0xF0, 0x9B, 0xEB, 0x6F, 0x05, 0x68, 0x6F, 0x17, 0x79, 0x1B, 0x05, 0xF1, - 0xFE, 0x25, 0xF7, 0x71, 0x86, 0x9C, 0x42, 0x63, 0xA5, 0x5B, 0x94, 0x18, 0x77, 0xE4, 0x79, 0x04 }, + { 0xA0, 0xC2, 0xD2, 0x07, 0xA4, 0x7E, 0x18, 0xD0, 0x37, 0x14, 0xD5, 0xB3, 0x44, 0x5D, 0x88, 0xBE, + 0x81, 0xFF, 0x5E, 0x1D, 0x16, 0x07, 0x3D, 0xC1, 0x16, 0x6B, 0xB5, 0x44, 0x8F, 0xF6, 0x52, 0xDF }, }, { - { 0xE2, 0xB4, 0x03, 0x32, 0x0B, 0x01, 0xF6, 0x03, 0xD7, 0xB0, 0xCA, 0x1F, 0x89, 0xF0, 0x8E, 0x25, - 0xA7, 0x95, 0xE8, 0xB6, 0x04, 0x36, 0x8B, 0xA0, 0x78, 0x69, 0x68, 0x46, 0x8C, 0x18, 0xC3, 0xF0 }, + { 0xA1, 0x97, 0x7D, 0x0C, 0x92, 0x7C, 0x21, 0xEB, 0x47, 0x6F, 0x67, 0xBE, 0xFE, 0xD6, 0xCF, 0x2C, + 0x61, 0xB7, 0x45, 0xF0, 0xCE, 0x8D, 0x26, 0x58, 0x3D, 0x03, 0xB2, 0x70, 0x02, 0xD5, 0xCD, 0xAF }, }, { - { 0xE2, 0xDE, 0x18, 0x3E, 0xAE, 0x35, 0x4C, 0xCF, 0x68, 0xF2, 0x52, 0x56, 0x76, 0xD7, 0x26, 0x46, - 0x06, 0x01, 0x38, 0x43, 0xAC, 0xB1, 0xFB, 0xFF, 0xA0, 0x22, 0x99, 0xA7, 0x4E, 0xA0, 0xDF, 0x62 }, + { 0xA2, 0x6C, 0x37, 0x5E, 0xB3, 0x19, 0x6E, 0x28, 0x3B, 0xEC, 0x60, 0x3D, 0xB6, 0xBB, 0xDA, 0xE2, + 0x49, 0x55, 0xE4, 0xBA, 0x91, 0x0C, 0xD4, 0x2D, 0x9E, 0xAC, 0x55, 0xCA, 0xC6, 0x10, 0x3A, 0xB9 }, }, { - { 0xE2, 0xF3, 0x9A, 0x9D, 0x48, 0xA3, 0x22, 0x10, 0x55, 0xB3, 0xC8, 0xA3, 0xEB, 0x14, 0x39, 0xD6, - 0xB8, 0x73, 0x01, 0x3E, 0xE4, 0xD0, 0x97, 0x12, 0x20, 0x64, 0xF2, 0x7E, 0xC0, 0x3D, 0xD4, 0xDA }, + { 0xA3, 0xA4, 0xFC, 0x03, 0xE1, 0x75, 0xF2, 0x68, 0x02, 0x57, 0x46, 0x34, 0xDE, 0x70, 0x7D, 0x2F, + 0x92, 0xF4, 0xD0, 0xCB, 0x90, 0xCD, 0xB6, 0x1D, 0xD1, 0x95, 0x8B, 0xCF, 0x0C, 0x55, 0x20, 0x86 }, }, { - { 0xE2, 0xF5, 0xDE, 0x57, 0xCD, 0x67, 0x24, 0x9A, 0x7E, 0x1F, 0x45, 0x5B, 0x85, 0xC0, 0x6F, 0x0D, - 0x80, 0x9E, 0x75, 0xA5, 0x5C, 0x6B, 0x05, 0x48, 0x16, 0xE0, 0x19, 0x89, 0x9A, 0x3A, 0x02, 0xFF }, + { 0xA6, 0x62, 0xFC, 0x81, 0xC9, 0x09, 0x34, 0xB9, 0xB4, 0xD6, 0x30, 0xB5, 0xD8, 0x2E, 0x86, 0xF2, + 0x36, 0x3E, 0xC1, 0x5C, 0xCF, 0xCD, 0xAF, 0xA7, 0xA2, 0x0C, 0x9B, 0x4E, 0x3A, 0x90, 0x0D, 0xD1 }, }, { - { 0xE3, 0x1F, 0xA0, 0xBD, 0xE8, 0x58, 0x9E, 0xDD, 0xDA, 0x1C, 0x5D, 0x1A, 0xA9, 0xC5, 0x81, 0x86, - 0xC3, 0x14, 0x36, 0x85, 0x67, 0xBD, 0xF9, 0xDC, 0xD5, 0x37, 0xAA, 0xE3, 0xCF, 0xF8, 0x77, 0x52 }, + { 0xA6, 0xA4, 0xA3, 0xF6, 0x1F, 0xA5, 0x8C, 0xE9, 0x70, 0xB4, 0x58, 0xB7, 0xC3, 0x7C, 0x05, 0x2E, + 0xAD, 0x1E, 0xB2, 0x0B, 0x85, 0x67, 0xE3, 0x51, 0xAD, 0x8E, 0x6F, 0xBA, 0x49, 0xC2, 0x69, 0x2C }, }, { - { 0xE3, 0xC8, 0xFC, 0x63, 0x7B, 0x7B, 0xB0, 0xCC, 0x67, 0x4A, 0x5A, 0x4C, 0x3B, 0x4D, 0x35, 0x62, - 0xEB, 0x8A, 0xA0, 0x0D, 0x7A, 0xD2, 0xC8, 0xA9, 0xC6, 0x37, 0x09, 0xE4, 0x51, 0x06, 0x52, 0xD5 }, + { 0xA6, 0xDE, 0x6C, 0x3B, 0x8C, 0x14, 0x05, 0xCB, 0xE1, 0x2D, 0xB4, 0x09, 0x97, 0x61, 0x71, 0xAC, + 0xB5, 0x1F, 0xB3, 0xDC, 0xFB, 0xB7, 0x6E, 0xE3, 0x84, 0x95, 0x39, 0xCD, 0x8A, 0xB0, 0x66, 0xDF }, }, { - { 0xE4, 0x6C, 0x8D, 0x7E, 0x4D, 0x59, 0x76, 0x83, 0x0B, 0xE3, 0x7A, 0x22, 0x25, 0x75, 0x55, 0x42, - 0x20, 0x81, 0xE1, 0xA8, 0x4B, 0x72, 0x6B, 0xCF, 0x17, 0xB0, 0x43, 0x54, 0x1E, 0x7C, 0xA7, 0x15 }, + { 0xA8, 0x53, 0xAD, 0xC1, 0xC2, 0x18, 0x59, 0xAF, 0x7C, 0x46, 0x2B, 0x4A, 0xA0, 0xA5, 0x74, 0xCA, + 0x9F, 0xEE, 0xFB, 0x18, 0x5A, 0x1F, 0xDB, 0xB6, 0xC1, 0x0E, 0x17, 0xD6, 0x01, 0xB7, 0x09, 0x8F }, }, { - { 0xE5, 0x3C, 0x7E, 0xA6, 0xB1, 0x2D, 0x3E, 0xCA, 0xBF, 0xB0, 0x2F, 0xE4, 0x88, 0x56, 0xE6, 0x38, - 0xBD, 0x0C, 0x6F, 0xEB, 0x35, 0x75, 0x7C, 0x19, 0xAE, 0xFA, 0x3D, 0x51, 0x92, 0x17, 0xE2, 0x9E }, + { 0xA8, 0xDF, 0xF0, 0x6A, 0x17, 0x35, 0xB4, 0x6D, 0x17, 0xDA, 0xEB, 0xC3, 0x43, 0x43, 0x18, 0x31, + 0x3B, 0x2D, 0x9E, 0x7C, 0x3E, 0xF4, 0x8F, 0x28, 0x53, 0x75, 0x35, 0x13, 0xE1, 0xB2, 0x53, 0xA8 }, }, { - { 0xE5, 0x6B, 0xF9, 0xFA, 0xF8, 0xEE, 0x91, 0xD8, 0x2F, 0xAF, 0xDF, 0x9B, 0x51, 0x20, 0x64, 0x7F, - 0x0D, 0x67, 0xF7, 0x18, 0xD7, 0x55, 0x49, 0x87, 0xFA, 0x06, 0x4B, 0xB2, 0x38, 0xCB, 0xE3, 0x9A }, + { 0xA8, 0xE3, 0x8C, 0x6E, 0xC0, 0x93, 0xF5, 0xAF, 0x53, 0x88, 0xF1, 0xE7, 0x66, 0xD7, 0x5F, 0xFB, + 0x57, 0xDD, 0xBE, 0x3E, 0x9D, 0xC2, 0xE0, 0xBE, 0x57, 0xBB, 0x88, 0x36, 0x46, 0xC5, 0xC0, 0x32 }, }, { - { 0xE5, 0x70, 0x93, 0x54, 0xAF, 0x05, 0x47, 0x26, 0x95, 0x3F, 0xC5, 0xC3, 0xBB, 0x13, 0x3E, 0x16, - 0xC7, 0xBB, 0xB7, 0xC3, 0x5A, 0xFC, 0xC3, 0x21, 0xCD, 0xA0, 0x35, 0x0B, 0xEB, 0x57, 0x17, 0x77 }, + { 0xA9, 0x0B, 0x8D, 0xE1, 0x7F, 0x6B, 0x68, 0x37, 0x56, 0x21, 0x2D, 0xB3, 0xAB, 0x34, 0x89, 0x6E, + 0x91, 0x70, 0x93, 0x11, 0x3E, 0x47, 0xCA, 0x35, 0x96, 0x2E, 0xAC, 0xCA, 0x9C, 0xB3, 0x86, 0xF0 }, }, { - { 0xE5, 0x9A, 0x43, 0xB8, 0x41, 0x20, 0x26, 0x84, 0x36, 0xC3, 0x5E, 0xD8, 0x6D, 0x73, 0x21, 0x38, - 0x5F, 0xB9, 0x1F, 0x89, 0x82, 0x83, 0x3E, 0x5F, 0x54, 0xD2, 0xAE, 0xE2, 0x09, 0x56, 0x2F, 0x2F }, + { 0xA9, 0x71, 0x2F, 0x85, 0xED, 0x2E, 0x25, 0xAD, 0xA5, 0x7D, 0xC1, 0xF0, 0xF8, 0x6D, 0xE1, 0x07, + 0xB5, 0xE2, 0xF0, 0x36, 0x09, 0x53, 0xF1, 0xED, 0x12, 0x5E, 0x37, 0x07, 0x59, 0x47, 0x1D, 0x09 }, }, { - { 0xE5, 0xAF, 0x76, 0xA5, 0xA0, 0xCC, 0x06, 0x75, 0x0E, 0x8C, 0x17, 0x76, 0x9A, 0xF3, 0x4D, 0x72, - 0x43, 0x76, 0x7F, 0xBE, 0x2A, 0x9F, 0x4A, 0xBC, 0x17, 0x08, 0xEA, 0x1C, 0x86, 0x2A, 0x38, 0xEB }, + { 0xAA, 0xEB, 0xFE, 0x2D, 0x21, 0xB7, 0xE5, 0x35, 0x1B, 0xB9, 0x99, 0x69, 0x44, 0x44, 0x19, 0xEF, + 0x21, 0xC9, 0x68, 0x8C, 0xE0, 0x53, 0x24, 0x88, 0x84, 0xCA, 0xB0, 0xB8, 0x95, 0x10, 0x30, 0xFF }, }, { - { 0xE5, 0xF1, 0x20, 0xB8, 0x78, 0x63, 0x43, 0x1A, 0xD8, 0x34, 0xD8, 0x47, 0x94, 0x86, 0x4A, 0x90, - 0x0E, 0x39, 0x30, 0xE0, 0xCE, 0xCE, 0xA1, 0x4B, 0x0D, 0x31, 0x33, 0xA9, 0x87, 0x74, 0x48, 0x89 }, + { 0xAB, 0x41, 0x28, 0x10, 0x9C, 0xAB, 0x8A, 0x58, 0x7C, 0x8F, 0xF4, 0xC7, 0xF6, 0x87, 0x34, 0x49, + 0x98, 0x18, 0xD1, 0x3F, 0x52, 0x26, 0x76, 0xD0, 0x66, 0xB3, 0x52, 0x17, 0x6F, 0xD2, 0x35, 0x96 }, }, { - { 0xE6, 0x17, 0x7C, 0x86, 0xB8, 0x35, 0x58, 0x0A, 0x7A, 0x09, 0x50, 0x34, 0x78, 0x98, 0xAB, 0x63, - 0xAF, 0x11, 0xEC, 0x99, 0x60, 0x64, 0x45, 0x4C, 0x04, 0x62, 0xBE, 0x5D, 0x4E, 0xD5, 0x22, 0x48 }, + { 0xAB, 0x80, 0xD9, 0xBA, 0x0A, 0xEF, 0xAD, 0x7B, 0xEC, 0xCE, 0x7F, 0x5E, 0x61, 0x59, 0x9A, 0xF5, + 0x26, 0x69, 0xBF, 0x59, 0x50, 0x7F, 0x8E, 0xF1, 0x99, 0x13, 0xC4, 0x2E, 0xE1, 0x29, 0xDA, 0xF0 }, }, { - { 0xE6, 0x44, 0xD1, 0x1C, 0x37, 0x07, 0x0F, 0x89, 0x69, 0x33, 0x08, 0x17, 0x8D, 0x6B, 0xE4, 0x95, - 0x94, 0x96, 0x92, 0xC1, 0xFB, 0xEB, 0x30, 0xED, 0x32, 0x9B, 0x74, 0x02, 0x7F, 0xCF, 0xFD, 0x48 }, + { 0xAB, 0xEB, 0x6A, 0xA0, 0xD1, 0xB0, 0xE0, 0x49, 0xD6, 0x9D, 0xF8, 0x3A, 0xDD, 0x19, 0xF7, 0x26, + 0x8A, 0x38, 0xDE, 0x6C, 0x00, 0x72, 0x60, 0x68, 0xC2, 0xEE, 0xE4, 0x55, 0x44, 0xF6, 0xD6, 0x7A }, }, { - { 0xE6, 0x7E, 0x9D, 0xC8, 0x17, 0x8E, 0x8D, 0xAD, 0x62, 0x91, 0x40, 0x22, 0xAE, 0x76, 0xD4, 0x75, - 0x1E, 0x9E, 0x26, 0xC6, 0x32, 0x68, 0xD3, 0xB9, 0xDF, 0xC8, 0x86, 0xE6, 0x7A, 0xAA, 0x9E, 0xEB }, + { 0xAC, 0x1B, 0x4C, 0x64, 0x6C, 0xAE, 0xFB, 0x10, 0x8A, 0x54, 0xCA, 0xB5, 0x4A, 0x96, 0xE9, 0x66, + 0x6E, 0x72, 0xA8, 0x20, 0x22, 0x44, 0xEF, 0x3D, 0x7C, 0xA9, 0x34, 0xDF, 0xCC, 0x24, 0xFC, 0xA7 }, }, { - { 0xE6, 0xA7, 0x10, 0x85, 0x6E, 0x43, 0x3D, 0x4F, 0x5F, 0xAA, 0xD2, 0xAE, 0xF4, 0x38, 0x6F, 0x17, - 0x46, 0x02, 0xC8, 0xFA, 0xE4, 0x50, 0x0F, 0x34, 0x40, 0xDD, 0x3C, 0x78, 0xF6, 0xE8, 0xDA, 0x6C }, + { 0xAC, 0x7C, 0x14, 0xB9, 0x56, 0x8F, 0x92, 0x07, 0x5A, 0xD4, 0xA3, 0xBA, 0x3D, 0x4B, 0x01, 0x84, + 0x91, 0xF3, 0x66, 0x1A, 0x37, 0x9B, 0x3D, 0xFE, 0xDD, 0x6F, 0xD3, 0xC3, 0x2E, 0xFA, 0x84, 0x7D }, }, { - { 0xE6, 0xB0, 0xF2, 0xE2, 0x5B, 0xD5, 0x16, 0xE4, 0xBB, 0xA3, 0x7A, 0x2B, 0xF2, 0xE2, 0xC7, 0x2A, - 0x1E, 0x53, 0x9C, 0x60, 0x30, 0xF3, 0xCF, 0x9B, 0xBE, 0x5E, 0x79, 0x72, 0x8D, 0x68, 0x64, 0x78 }, + { 0xAD, 0x69, 0x54, 0x5F, 0x9F, 0x85, 0x25, 0x5F, 0xE4, 0x16, 0x51, 0x3D, 0x94, 0xDB, 0x31, 0x50, + 0x5F, 0x38, 0x4B, 0x52, 0x3C, 0x2C, 0xA2, 0x6E, 0xDC, 0x0A, 0x54, 0x9A, 0x8F, 0x16, 0x26, 0xF9 }, }, { - { 0xE6, 0xC9, 0x32, 0x43, 0x98, 0x7B, 0x3B, 0xB2, 0x8A, 0xB8, 0x6F, 0xDD, 0x6B, 0xF4, 0xD9, 0xA5, - 0x94, 0xF8, 0xD5, 0xBC, 0xE3, 0xB2, 0xF6, 0xAF, 0x51, 0x97, 0x15, 0x53, 0x08, 0xC6, 0x03, 0x2D }, + { 0xAE, 0x03, 0x19, 0xFE, 0xA6, 0xA6, 0x5E, 0x84, 0xE8, 0x54, 0xB5, 0x15, 0x50, 0xEA, 0x44, 0x4F, + 0xA3, 0xB8, 0xBB, 0x50, 0xAE, 0x93, 0x74, 0x01, 0x3C, 0xFE, 0xF3, 0x88, 0x73, 0x5D, 0x0B, 0xD3 }, }, { - { 0xE6, 0xE5, 0x4D, 0xE7, 0xB4, 0x97, 0x54, 0xD3, 0x57, 0xB0, 0xA8, 0xD9, 0x4A, 0x4D, 0x4F, 0x80, - 0xAC, 0xD1, 0x99, 0x4C, 0xCC, 0x1C, 0x99, 0x08, 0xE9, 0xF0, 0xD9, 0x21, 0xE4, 0x28, 0xB8, 0x38 }, + { 0xAE, 0x4D, 0xF3, 0x97, 0x9B, 0x74, 0x27, 0x34, 0xA3, 0x39, 0xC4, 0x70, 0x1D, 0x5E, 0x13, 0x21, + 0x26, 0x3F, 0xF4, 0x4E, 0x67, 0x56, 0x49, 0x05, 0xF4, 0x9E, 0x25, 0x34, 0x62, 0xB8, 0x02, 0x25 }, }, { - { 0xE7, 0x0C, 0xBB, 0x7A, 0xF7, 0xAA, 0x20, 0xB9, 0x89, 0x0B, 0xC1, 0xF9, 0xFA, 0x00, 0xD8, 0x09, - 0x0B, 0x5A, 0xC9, 0x82, 0x5E, 0xA9, 0xD2, 0xFD, 0xF7, 0x7C, 0xA4, 0xDA, 0xE9, 0x44, 0x51, 0xB2 }, + { 0xAF, 0x1F, 0x37, 0x1F, 0x34, 0x84, 0x57, 0x51, 0x65, 0x2D, 0xC7, 0x48, 0x23, 0xF3, 0x01, 0x5C, + 0x5A, 0x11, 0xCA, 0x65, 0x3F, 0x28, 0x70, 0x1E, 0xDD, 0x4A, 0x7E, 0x0D, 0x23, 0x17, 0x1B, 0xBB }, }, { - { 0xE7, 0x5D, 0x32, 0x90, 0xA6, 0x9A, 0xB5, 0x96, 0xEE, 0x17, 0x9D, 0xC1, 0x34, 0xAA, 0x07, 0x1E, - 0x69, 0xFD, 0x98, 0x25, 0xFC, 0x06, 0x2E, 0x33, 0x8B, 0xA2, 0x23, 0x5E, 0xE3, 0x25, 0x56, 0xD2 }, + { 0xAF, 0x6B, 0x80, 0x51, 0x47, 0x14, 0x0A, 0x0E, 0x41, 0x81, 0xD8, 0x6A, 0x7E, 0x8F, 0x07, 0x69, + 0xB6, 0x1D, 0x46, 0xD7, 0xB6, 0xFA, 0xC6, 0xE6, 0xF9, 0x59, 0x6D, 0xE9, 0x4A, 0xA8, 0xE2, 0xE8 }, }, { - { 0xE7, 0xD5, 0x73, 0x8A, 0xCD, 0x7F, 0x56, 0x3D, 0xD6, 0x8E, 0x86, 0x75, 0xC8, 0x78, 0xC6, 0xC6, - 0x80, 0x02, 0xD6, 0x40, 0x60, 0x46, 0xAF, 0x40, 0x56, 0x01, 0x3A, 0xA4, 0x6E, 0xA0, 0x37, 0x54 }, + { 0xB0, 0x5C, 0x14, 0x33, 0x61, 0x75, 0x9B, 0xE1, 0x52, 0xFD, 0x76, 0xA5, 0xFF, 0xA4, 0x87, 0x2D, + 0xD4, 0x2E, 0xA0, 0x60, 0xAE, 0x40, 0xA3, 0x83, 0x13, 0xB7, 0xB5, 0x4A, 0xEC, 0x06, 0x73, 0xC2 }, }, { - { 0xE7, 0xFD, 0x58, 0x39, 0x86, 0x80, 0xFA, 0xBD, 0x43, 0x21, 0xCD, 0xBE, 0x23, 0x33, 0xCB, 0xC2, - 0xC5, 0x4A, 0x32, 0xFF, 0x76, 0x6C, 0x4A, 0x94, 0x43, 0xC3, 0x6E, 0x2C, 0xEB, 0x46, 0xC5, 0xF0 }, + { 0xB0, 0xE0, 0xE1, 0x6C, 0x5F, 0x69, 0x1F, 0x66, 0xA9, 0x57, 0x3B, 0xD3, 0xCF, 0x43, 0xF9, 0xDF, + 0xD2, 0xAD, 0x3E, 0x56, 0x15, 0x54, 0x63, 0x7F, 0x1E, 0x7B, 0x71, 0x91, 0x4D, 0x62, 0x73, 0x38 }, }, { - { 0xE8, 0x02, 0xCB, 0x32, 0x13, 0x85, 0x51, 0xE5, 0x57, 0x44, 0xD4, 0x11, 0xC4, 0x8C, 0x7D, 0x5F, - 0x47, 0xB8, 0x15, 0x47, 0xB1, 0x23, 0x47, 0x90, 0xDA, 0x5D, 0xA4, 0x33, 0x97, 0x2E, 0x57, 0x27 }, + { 0xB2, 0xDC, 0x86, 0x25, 0x6C, 0xCF, 0xF4, 0xBB, 0x14, 0xFD, 0x70, 0x27, 0x9F, 0xCC, 0x3C, 0xE9, + 0x25, 0xC5, 0x1F, 0xB7, 0x17, 0xE5, 0x87, 0x6F, 0x29, 0x1B, 0xA1, 0x70, 0x73, 0x43, 0x85, 0x68 }, }, { - { 0xE8, 0x16, 0xF9, 0x92, 0x94, 0xA1, 0x3A, 0xC2, 0xFA, 0x2B, 0xFB, 0x76, 0xC2, 0x2D, 0xFA, 0x71, - 0xBC, 0x3D, 0xA4, 0x8F, 0x67, 0x1E, 0xF7, 0x7C, 0x00, 0xAA, 0x8E, 0x45, 0x9B, 0x7C, 0xC8, 0x2A }, + { 0xB3, 0x0D, 0x88, 0x44, 0x30, 0x43, 0xF5, 0xF3, 0x72, 0x32, 0xBB, 0x9B, 0xAC, 0xB9, 0x94, 0xC5, + 0xBA, 0xE9, 0x3A, 0x46, 0xFC, 0x87, 0xF1, 0x51, 0x29, 0xC9, 0x74, 0x69, 0xA5, 0x81, 0x4E, 0xCA }, }, { - { 0xE8, 0x1A, 0x87, 0x45, 0xAD, 0x86, 0xF6, 0x5F, 0xA0, 0xD8, 0x51, 0xFC, 0xB7, 0x2E, 0x3E, 0xF5, - 0x4D, 0x51, 0xBC, 0x60, 0xB9, 0x68, 0x0C, 0xB2, 0x5E, 0xB2, 0xF3, 0xAC, 0x44, 0xEA, 0xA7, 0xA4 }, + { 0xB3, 0x1A, 0xF0, 0xC2, 0xE5, 0x1E, 0xA2, 0x1C, 0x91, 0x04, 0xF9, 0x4F, 0xAA, 0x66, 0xE0, 0xCC, + 0xC0, 0x41, 0x34, 0xD5, 0x80, 0x9A, 0x2A, 0x26, 0x70, 0xA3, 0xB7, 0xBC, 0x7D, 0xD9, 0x64, 0xF8 }, }, { - { 0xE8, 0x21, 0x3C, 0x45, 0x51, 0x81, 0x61, 0xBC, 0x36, 0x37, 0x3D, 0xCD, 0x2D, 0x4B, 0x21, 0xB7, - 0x6A, 0x7C, 0x06, 0x6D, 0xF5, 0x52, 0x6E, 0x88, 0x8B, 0x6E, 0xED, 0x09, 0xA9, 0xEE, 0xD0, 0x62 }, + { 0xB3, 0xE6, 0x42, 0x06, 0x6E, 0x41, 0x78, 0x67, 0xD9, 0x0F, 0xB9, 0xB2, 0xBA, 0x15, 0x41, 0x98, + 0xA5, 0xC5, 0xF6, 0xCC, 0x82, 0x9B, 0x51, 0x39, 0xDF, 0xD6, 0x91, 0xE5, 0x1A, 0xD3, 0x74, 0xAD }, }, { - { 0xE8, 0x68, 0xE4, 0xE2, 0x52, 0xDC, 0x95, 0x87, 0x75, 0x75, 0x6E, 0xC0, 0x10, 0xFA, 0xCF, 0xB8, - 0x79, 0x63, 0x6A, 0x35, 0x27, 0xB3, 0xB8, 0xDB, 0x9B, 0xF9, 0x26, 0x03, 0x6A, 0xD4, 0x0E, 0x92 }, + { 0xB3, 0xF4, 0xB1, 0x6F, 0x8E, 0xCE, 0xBB, 0x41, 0x47, 0x4F, 0x92, 0x4F, 0xEE, 0xF9, 0xB0, 0xBD, + 0x97, 0x9B, 0x36, 0x36, 0xC3, 0x4F, 0xF2, 0x72, 0x3F, 0x67, 0x3C, 0x8E, 0xEE, 0x2A, 0xF1, 0x52 }, }, { - { 0xE8, 0x6E, 0xE6, 0x9D, 0x51, 0xBE, 0x64, 0xF8, 0x28, 0xFC, 0x22, 0xCC, 0xE5, 0xBC, 0xC1, 0x1D, - 0x24, 0xA5, 0xF1, 0x77, 0xF9, 0xBA, 0x99, 0x51, 0x92, 0x71, 0xA4, 0xF3, 0x9F, 0x0C, 0x51, 0x7C }, + { 0xB4, 0xD4, 0x67, 0xFC, 0x5E, 0x97, 0xDB, 0x25, 0xA1, 0xFD, 0xB0, 0x06, 0xD2, 0x77, 0x66, 0xB9, + 0x99, 0x5B, 0xB9, 0xC7, 0x7B, 0x66, 0x43, 0x97, 0x08, 0xA4, 0x59, 0xB0, 0x43, 0xD0, 0x33, 0x24 }, }, { - { 0xE8, 0xA6, 0x09, 0xEC, 0x44, 0xF9, 0x3C, 0x12, 0xE0, 0x81, 0xE5, 0x94, 0x3B, 0x5E, 0xA0, 0x48, - 0x68, 0x14, 0x48, 0x33, 0x32, 0x5D, 0xAA, 0x64, 0x4F, 0x3F, 0x9F, 0xB7, 0x6A, 0xA2, 0x77, 0xC8 }, + { 0xB4, 0xED, 0xCD, 0x6F, 0x8A, 0x01, 0x82, 0xB7, 0x17, 0xF0, 0x6F, 0xE1, 0xD7, 0xAC, 0x9C, 0x62, + 0x33, 0xD4, 0x38, 0x22, 0xE9, 0xFD, 0x14, 0xDB, 0x98, 0xF7, 0xF8, 0x4E, 0x32, 0x79, 0x6D, 0x08 }, }, { - { 0xE9, 0x52, 0x76, 0x76, 0x30, 0x2F, 0xFB, 0x14, 0x91, 0x15, 0x65, 0x19, 0x28, 0xF0, 0x4D, 0x9C, - 0x96, 0xAF, 0xEF, 0x18, 0xB5, 0x72, 0x12, 0x37, 0x52, 0x75, 0x4B, 0x38, 0xA9, 0x7C, 0x8E, 0xF0 }, + { 0xB5, 0xE5, 0xDC, 0xDE, 0xCB, 0x8D, 0xEB, 0x27, 0x13, 0x4F, 0x02, 0xA5, 0x18, 0x79, 0x43, 0x16, + 0xF0, 0x8F, 0xAF, 0x9C, 0x2B, 0x1F, 0xDA, 0xD6, 0xD4, 0x86, 0x61, 0xF5, 0x7E, 0xA6, 0x45, 0xD9 }, }, { - { 0xE9, 0x65, 0xDB, 0x91, 0x44, 0x8E, 0xFF, 0xC5, 0x3D, 0xEF, 0x1B, 0x72, 0x68, 0xA2, 0xF5, 0xAB, - 0x95, 0xB1, 0x4A, 0x2A, 0x90, 0x2C, 0x6A, 0xC9, 0xB2, 0x54, 0xEC, 0xAF, 0xC7, 0x9F, 0x08, 0xD8 }, + { 0xB5, 0xEF, 0x42, 0xC4, 0xBC, 0xED, 0xF1, 0x7B, 0xEC, 0xC7, 0x5B, 0xF4, 0x63, 0x66, 0x49, 0xCE, + 0xBF, 0xF8, 0x71, 0x1B, 0xCE, 0xFF, 0xFA, 0x69, 0x5C, 0xC2, 0x52, 0xFA, 0x57, 0x4D, 0x42, 0x18 }, }, { - { 0xE9, 0xC2, 0x8F, 0x7A, 0x33, 0xFB, 0xC5, 0xB4, 0x49, 0xC9, 0x5A, 0x88, 0x47, 0x1D, 0x3F, 0x71, - 0xFB, 0x34, 0x7A, 0x02, 0xCE, 0xB0, 0x5E, 0xB0, 0xE7, 0x1C, 0x7B, 0xB7, 0x46, 0x45, 0xC8, 0x92 }, + { 0xB6, 0x82, 0x3C, 0x9D, 0xBC, 0x8E, 0x8C, 0x05, 0x4B, 0xCF, 0x60, 0xF2, 0x38, 0x21, 0xAC, 0x6C, + 0x58, 0x19, 0x73, 0x51, 0xEA, 0xCF, 0xA5, 0x57, 0x4C, 0xF0, 0x41, 0xB4, 0xCE, 0x6B, 0x84, 0x04 }, }, { - { 0xE9, 0xF5, 0x71, 0xC7, 0x71, 0x64, 0xAB, 0xEA, 0xE1, 0x85, 0x28, 0x37, 0x5C, 0xFD, 0xC7, 0x21, - 0x9A, 0x6B, 0xDE, 0x46, 0x1B, 0x19, 0x73, 0xBE, 0x2B, 0xB8, 0xBD, 0xF0, 0xDA, 0x78, 0xB2, 0xB4 }, + { 0xB7, 0x06, 0xDE, 0x1B, 0xD1, 0xEE, 0x2F, 0x4C, 0xEC, 0x6C, 0xE0, 0x92, 0x02, 0x2B, 0x49, 0x32, + 0x81, 0xE2, 0x9A, 0x21, 0x73, 0x50, 0x8C, 0x9B, 0xD0, 0xFB, 0xC2, 0xC3, 0xD9, 0x68, 0xE3, 0xE7 }, }, { - { 0xEA, 0x2E, 0x8C, 0x23, 0xAA, 0x7C, 0xC3, 0x7D, 0x64, 0xCF, 0xC3, 0x03, 0xDD, 0x9F, 0x3F, 0x92, - 0x1B, 0xAE, 0x11, 0x8C, 0xA3, 0xDF, 0x81, 0xE5, 0x92, 0xE3, 0x0B, 0xBB, 0x03, 0x71, 0x4D, 0x96 }, + { 0xB8, 0x74, 0x36, 0x95, 0x1C, 0xEC, 0x37, 0x7E, 0xEF, 0x73, 0xDE, 0x4B, 0x74, 0xF2, 0x83, 0xC4, + 0x2B, 0x2C, 0xCB, 0x1C, 0xA3, 0x7C, 0x5B, 0x30, 0xAA, 0xD6, 0x55, 0xA7, 0x40, 0x1A, 0x3D, 0x2F }, }, { - { 0xEA, 0x51, 0x8B, 0x42, 0x91, 0x89, 0x39, 0xA6, 0x22, 0x63, 0xA7, 0xCC, 0xD2, 0xA9, 0xB5, 0x44, - 0x9C, 0x58, 0x1C, 0x2E, 0xA9, 0x9C, 0x2B, 0x74, 0x3F, 0x6F, 0x18, 0x3D, 0xFC, 0x19, 0xED, 0xFF }, + { 0xB9, 0x8D, 0x83, 0x38, 0x55, 0xC3, 0x67, 0x88, 0x62, 0xB6, 0x2F, 0x36, 0x50, 0xDB, 0x00, 0xA3, + 0x45, 0xF4, 0x6A, 0x0E, 0x8E, 0x01, 0x1A, 0x20, 0x01, 0x3F, 0xD8, 0xED, 0xCE, 0x25, 0x27, 0x0D }, }, { - { 0xEA, 0x5A, 0xB6, 0x6C, 0xAF, 0xDE, 0x63, 0x38, 0xC0, 0x67, 0x8D, 0x74, 0x54, 0xD0, 0x79, 0x6D, - 0xDE, 0xA0, 0xD2, 0x84, 0xDD, 0xAA, 0x79, 0x4D, 0x04, 0x42, 0x0E, 0xDA, 0x97, 0x71, 0xC5, 0x1A }, + { 0xBA, 0x51, 0xAF, 0xF5, 0xD5, 0xD3, 0x10, 0x5F, 0x34, 0xA2, 0xB3, 0x3A, 0x83, 0xE3, 0xAD, 0xFD, + 0x12, 0xD7, 0x9C, 0xA6, 0x05, 0x90, 0x9D, 0x96, 0x03, 0x3E, 0x32, 0xA5, 0xCF, 0x2F, 0x71, 0xF6 }, }, { - { 0xEA, 0x76, 0x8A, 0xF7, 0x9B, 0x07, 0xCE, 0x21, 0xC2, 0x64, 0x90, 0xE9, 0x4B, 0xC0, 0x7A, 0x2A, - 0xAE, 0x96, 0xBD, 0x60, 0xA4, 0x19, 0xE9, 0x8B, 0x03, 0x63, 0x87, 0xF2, 0x10, 0x2D, 0x28, 0xF6 }, + { 0xBB, 0x5C, 0xB3, 0x78, 0xB7, 0xB9, 0x48, 0x7F, 0xA6, 0x1B, 0xC0, 0x91, 0x3D, 0xA1, 0xDF, 0x26, + 0xA1, 0xCF, 0xEF, 0xF7, 0x45, 0x2D, 0x9B, 0xA3, 0x6C, 0xAC, 0x47, 0xA8, 0x5C, 0x7F, 0xF3, 0x48 }, }, { - { 0xEA, 0x81, 0xEE, 0xEB, 0x60, 0x6B, 0xC9, 0x1C, 0x0E, 0x07, 0xDA, 0x1F, 0x86, 0x04, 0x89, 0x3C, - 0x1D, 0x17, 0x84, 0x60, 0xDE, 0xE8, 0x7E, 0xD5, 0x37, 0xFF, 0x8D, 0x85, 0xE4, 0x00, 0x02, 0xF5 }, + { 0xBC, 0x14, 0x2E, 0xBA, 0xC2, 0x78, 0xA8, 0xFE, 0x8C, 0xA8, 0xBC, 0x2C, 0x62, 0xFB, 0xCC, 0x40, + 0x17, 0xFF, 0x24, 0x96, 0x98, 0xBE, 0xED, 0xFB, 0x1E, 0xF3, 0x6F, 0x37, 0x5F, 0xB3, 0x9F, 0x72 }, }, { - { 0xEA, 0xC1, 0x29, 0xDC, 0x3A, 0xE7, 0xF5, 0xCC, 0x0F, 0x13, 0x46, 0x57, 0x0D, 0x06, 0x92, 0x6A, - 0x85, 0x01, 0xB0, 0xD2, 0x06, 0x9B, 0xF7, 0x17, 0xAF, 0x69, 0xD1, 0xBE, 0x0E, 0x3E, 0x30, 0xDE }, + { 0xBD, 0x2E, 0x2F, 0x37, 0xC9, 0x66, 0xC3, 0x86, 0xD9, 0x70, 0x44, 0xFD, 0xE3, 0xE3, 0xF9, 0x00, + 0xFB, 0x1A, 0x0B, 0x04, 0x03, 0xB5, 0x81, 0x72, 0x5F, 0x34, 0xE3, 0xC1, 0x90, 0x05, 0x60, 0x56 }, }, { - { 0xEB, 0x11, 0x63, 0xAA, 0xEF, 0xE8, 0xFD, 0x88, 0xE1, 0x32, 0x7B, 0x48, 0xA9, 0xC0, 0x06, 0x2E, - 0x06, 0xF0, 0xA6, 0xEA, 0xA0, 0xA0, 0x18, 0x24, 0x7F, 0x9F, 0xA4, 0xE3, 0x4E, 0x3A, 0x47, 0x4C }, + { 0xBE, 0xB9, 0x09, 0x0C, 0x92, 0xD1, 0x6B, 0xD0, 0x5A, 0xF3, 0x91, 0x5A, 0x39, 0xCC, 0x2A, 0xFA, + 0x9F, 0x6A, 0x8A, 0x6F, 0xBE, 0xD4, 0xFE, 0x54, 0xD9, 0xDE, 0x32, 0x49, 0x23, 0xB3, 0x93, 0x5A }, }, { - { 0xEB, 0x43, 0x76, 0xB1, 0xD2, 0x38, 0x2A, 0xC1, 0xC3, 0xEE, 0x27, 0xBE, 0x86, 0x67, 0xEC, 0xF5, - 0xAB, 0x36, 0x25, 0x5A, 0x3C, 0x36, 0xC7, 0x22, 0x74, 0x33, 0x8A, 0xD7, 0x17, 0x56, 0x25, 0x11 }, + { 0xBF, 0x38, 0xE6, 0xAE, 0x32, 0x0F, 0x69, 0x16, 0x16, 0x0D, 0xA6, 0x06, 0x86, 0x83, 0xBF, 0x49, + 0xF2, 0xB2, 0x2B, 0x25, 0x24, 0x84, 0x63, 0x68, 0xF5, 0x04, 0x51, 0x81, 0x52, 0x40, 0x25, 0x9A }, }, { - { 0xEB, 0x5B, 0x21, 0x0F, 0x76, 0xA3, 0xC4, 0x5E, 0x5A, 0x76, 0x07, 0x64, 0x3E, 0x15, 0x26, 0x0D, - 0x1C, 0x93, 0xFD, 0x9B, 0xE0, 0xFA, 0xB1, 0x0B, 0x76, 0xDC, 0x96, 0x86, 0xF6, 0x54, 0xC6, 0xE5 }, + { 0xBF, 0x60, 0xAE, 0xB3, 0x91, 0xC0, 0xFB, 0xD0, 0x49, 0x53, 0x52, 0x6D, 0xA9, 0xFD, 0x59, 0x96, + 0x9A, 0x82, 0xF1, 0xEE, 0x81, 0xA7, 0x97, 0x98, 0xA4, 0x17, 0x1E, 0x14, 0x59, 0x39, 0x19, 0x67 }, }, { - { 0xEB, 0x89, 0x84, 0xD1, 0xA9, 0xFE, 0x26, 0x7C, 0x07, 0x9A, 0xE2, 0xF2, 0xF1, 0x6F, 0x01, 0xE6, - 0x0C, 0x4C, 0xEA, 0x94, 0x34, 0xC5, 0x29, 0x7A, 0x71, 0x88, 0xAA, 0x09, 0x25, 0x1D, 0x03, 0xE0 }, + { 0xBF, 0xF4, 0x3A, 0x97, 0x20, 0x48, 0x2D, 0x13, 0x4C, 0xD5, 0xEE, 0x8A, 0x88, 0x99, 0xE1, 0xA7, + 0x36, 0xBF, 0x54, 0xA2, 0xB7, 0x86, 0x26, 0x9C, 0x0D, 0xCB, 0x8B, 0xA1, 0x92, 0xA8, 0x1F, 0xA4 }, }, { - { 0xEB, 0xB7, 0xC4, 0x12, 0x58, 0x17, 0x82, 0x26, 0xAD, 0x37, 0xCC, 0xAF, 0x01, 0x1F, 0xCF, 0xF0, - 0x54, 0xB7, 0x7A, 0xC4, 0x9F, 0xCE, 0x28, 0x13, 0x5F, 0x5A, 0xFC, 0x51, 0x63, 0x15, 0xEA, 0x4D }, + { 0xC0, 0x09, 0xA1, 0xBE, 0x5B, 0xE8, 0xAF, 0xB5, 0x25, 0x8E, 0x12, 0x85, 0x5C, 0x64, 0xD0, 0x4D, + 0x13, 0xE8, 0xCC, 0xC4, 0x7B, 0x02, 0xBF, 0x3B, 0x51, 0xC6, 0xE1, 0x18, 0x05, 0xAE, 0xEC, 0xEB }, }, { - { 0xEC, 0x01, 0x78, 0xD1, 0xCA, 0x3B, 0x94, 0x52, 0xAA, 0x5C, 0xD5, 0xD3, 0x75, 0x45, 0x6B, 0xAB, - 0xF0, 0xDC, 0x0E, 0xD2, 0x29, 0x91, 0x5D, 0x1A, 0x8F, 0x49, 0x6D, 0xF2, 0xA2, 0xA0, 0x98, 0x71 }, + { 0xC0, 0x9F, 0xFA, 0x0E, 0xDD, 0x16, 0xBA, 0x55, 0xF2, 0x3C, 0xEA, 0xF7, 0x2B, 0x11, 0x34, 0xE9, + 0x28, 0xDB, 0xA1, 0xC2, 0x34, 0x5A, 0x5A, 0xB5, 0x63, 0x1E, 0x25, 0x41, 0x24, 0x05, 0x4A, 0xDB }, }, { - { 0xEC, 0x27, 0x05, 0x63, 0xB0, 0x5A, 0x06, 0xE5, 0xAA, 0xA5, 0xE6, 0xD5, 0xBB, 0xCC, 0x17, 0xCD, - 0x1C, 0xB5, 0xB2, 0xA9, 0x4D, 0x93, 0x84, 0x75, 0xF1, 0x58, 0x17, 0x6F, 0x4D, 0x84, 0xF4, 0x53 }, + { 0xC0, 0xAB, 0xD1, 0xC3, 0x56, 0x2F, 0xBC, 0x7F, 0xF7, 0xBD, 0x38, 0x95, 0x54, 0x60, 0xC3, 0xFC, + 0x43, 0x55, 0x0D, 0x97, 0x7F, 0x25, 0xE3, 0x43, 0xD4, 0x9C, 0xD4, 0xAF, 0xAD, 0xF2, 0x09, 0x3C }, }, { - { 0xEC, 0x4B, 0xBD, 0xEB, 0x15, 0x12, 0x1D, 0x96, 0x76, 0x4D, 0x6C, 0x01, 0xB2, 0x7E, 0xD5, 0xAE, - 0x86, 0x46, 0x5C, 0x46, 0xD5, 0xA4, 0x0E, 0x34, 0xAE, 0xFC, 0x09, 0x2D, 0x3E, 0x8B, 0xB1, 0x76 }, + { 0xC0, 0xFE, 0xB7, 0x2A, 0x5F, 0x33, 0x16, 0x5C, 0x0D, 0xC7, 0xC4, 0x24, 0x7E, 0x23, 0xF3, 0x8C, + 0xC6, 0x1F, 0x25, 0x24, 0x42, 0xB2, 0xF6, 0x13, 0x40, 0x92, 0xDE, 0x3B, 0xAD, 0x7E, 0x45, 0x0D }, }, { - { 0xEC, 0x5F, 0xA4, 0x73, 0x12, 0x1E, 0x3F, 0x49, 0xF0, 0x95, 0x3A, 0x2A, 0x91, 0x83, 0x39, 0xE3, - 0x6F, 0x3C, 0xB6, 0xB8, 0xD8, 0xB8, 0x9E, 0x91, 0x74, 0x23, 0xDA, 0xCE, 0xAC, 0xE6, 0xD5, 0x8A }, + { 0xC1, 0x77, 0x12, 0x97, 0xA4, 0xE8, 0xDC, 0x53, 0x75, 0x19, 0x5E, 0x1B, 0x63, 0x04, 0x2B, 0x59, + 0x19, 0x09, 0xF1, 0xD7, 0xEB, 0x5D, 0x25, 0xF2, 0x97, 0xAE, 0x7A, 0x61, 0xC1, 0x53, 0x8F, 0x9E }, }, { - { 0xEC, 0x79, 0x76, 0xC2, 0xB8, 0x10, 0x31, 0xF5, 0x88, 0x49, 0x5B, 0xC1, 0x9F, 0x51, 0xB0, 0x36, - 0xF8, 0x4F, 0x48, 0x1D, 0x9B, 0x15, 0x73, 0xD9, 0x8A, 0x7C, 0x32, 0x67, 0xC0, 0x63, 0x1E, 0x00 }, + { 0xC1, 0x86, 0xBE, 0x26, 0xE4, 0x47, 0x89, 0x7C, 0x48, 0x3C, 0x43, 0xFD, 0xC0, 0x86, 0xE2, 0x60, + 0x74, 0x17, 0xEB, 0x3E, 0xA7, 0x88, 0xEC, 0x03, 0x10, 0xA7, 0x9D, 0xA9, 0x24, 0x1D, 0x16, 0xDE }, }, { - { 0xEC, 0xCE, 0x4E, 0x52, 0x82, 0xFD, 0x2E, 0xE0, 0x03, 0xA4, 0x03, 0x2C, 0x80, 0xD3, 0x32, 0x1A, - 0x69, 0x47, 0x25, 0x98, 0x94, 0x59, 0x09, 0xCB, 0x25, 0x55, 0x7A, 0xA8, 0x47, 0x74, 0x2D, 0xDF }, + { 0xC1, 0xDE, 0x5F, 0xA3, 0x92, 0x13, 0x68, 0x58, 0x11, 0xA5, 0xBA, 0x93, 0x12, 0x1D, 0xE7, 0xA3, + 0x95, 0x98, 0x4E, 0x84, 0x44, 0x4E, 0x58, 0xF1, 0x63, 0xB7, 0xA6, 0x20, 0xAE, 0x3B, 0xBF, 0xA8 }, }, { - { 0xED, 0x2B, 0x81, 0xA0, 0xF8, 0xF1, 0x46, 0x5E, 0xA2, 0xF4, 0x17, 0xA4, 0xE8, 0x34, 0xC2, 0x2A, - 0x22, 0xEE, 0x7A, 0x9D, 0xDF, 0x59, 0xA8, 0x3B, 0x89, 0x82, 0xB0, 0xE1, 0x07, 0x19, 0x64, 0x42 }, + { 0xC2, 0xAD, 0xDF, 0x99, 0xCF, 0xC4, 0x2C, 0xE0, 0xE5, 0xA0, 0x93, 0xBC, 0xBF, 0x87, 0x40, 0x7C, + 0x61, 0x1F, 0x9D, 0x0A, 0xBF, 0x2A, 0x35, 0xD6, 0xE8, 0x03, 0xA3, 0x8E, 0xCB, 0x92, 0xC7, 0xB3 }, }, { - { 0xED, 0x50, 0xC1, 0x22, 0xAA, 0x2A, 0x49, 0x53, 0xF0, 0x51, 0xB7, 0x81, 0x41, 0x33, 0xAB, 0xBC, - 0x37, 0xA0, 0xC2, 0x21, 0x1B, 0xF7, 0x44, 0x0D, 0x75, 0xB3, 0x5E, 0xE5, 0x4E, 0x5A, 0x98, 0x86 }, + { 0xC2, 0xE7, 0x92, 0x11, 0x6A, 0x05, 0x00, 0x00, 0xBD, 0x47, 0x59, 0x1D, 0x93, 0x04, 0x71, 0xE6, + 0x17, 0x4C, 0x93, 0x85, 0xF5, 0xDC, 0x32, 0xB7, 0x62, 0x31, 0x65, 0x5F, 0xC8, 0x5E, 0x22, 0xE2 }, }, { - { 0xED, 0x57, 0xFB, 0x37, 0xD8, 0x73, 0xD5, 0x26, 0xB1, 0xB6, 0xFD, 0xC3, 0x38, 0x0F, 0xA9, 0x30, - 0x0D, 0xA6, 0x25, 0x81, 0x4C, 0x35, 0xF1, 0x0A, 0x04, 0x93, 0xEE, 0x19, 0xFF, 0x09, 0x60, 0x29 }, + { 0xC3, 0x79, 0x03, 0xC5, 0x3A, 0xE6, 0x02, 0xEC, 0x96, 0x9E, 0xC3, 0x3F, 0x63, 0xFE, 0x9A, 0xB2, + 0x0C, 0x39, 0x5F, 0x83, 0x0D, 0x30, 0xE4, 0xEE, 0x9D, 0x8D, 0xD9, 0x05, 0x92, 0x1E, 0xC1, 0xA0 }, }, { - { 0xED, 0x5B, 0xB8, 0x6A, 0x95, 0xA5, 0xFE, 0x2B, 0x17, 0x08, 0xF2, 0x56, 0x75, 0x4A, 0x89, 0xC4, - 0x29, 0x67, 0x9B, 0x30, 0x75, 0x8E, 0xE0, 0x12, 0x2B, 0x9E, 0x50, 0x85, 0x8D, 0xE2, 0x10, 0x4B }, + { 0xC3, 0xCF, 0x54, 0x16, 0xA5, 0x31, 0xAF, 0x4B, 0xFA, 0xE8, 0x9C, 0x45, 0x14, 0x3F, 0x20, 0xCC, + 0x1B, 0x3E, 0x18, 0x1D, 0x29, 0xC2, 0xD0, 0xE8, 0xFF, 0x7D, 0x3F, 0x2A, 0x66, 0xB1, 0x82, 0xFE }, }, { - { 0xED, 0x6D, 0xDA, 0xE4, 0xF4, 0xAF, 0xCE, 0x6B, 0xAF, 0x3A, 0x63, 0x7D, 0x89, 0x0A, 0x0D, 0x65, - 0x75, 0x3E, 0x45, 0x97, 0x14, 0x5A, 0xF8, 0x97, 0x53, 0x9B, 0xF9, 0xF7, 0xD3, 0x42, 0xA1, 0xD1 }, + { 0xC4, 0x98, 0xA1, 0xB6, 0x9F, 0x54, 0x40, 0x86, 0x17, 0x47, 0x47, 0x71, 0x5A, 0x27, 0x4D, 0x3F, + 0xB5, 0x90, 0x19, 0xBE, 0x09, 0x21, 0x31, 0xBC, 0xFA, 0xA8, 0x3A, 0x39, 0x5F, 0x7E, 0x57, 0x3C }, }, { - { 0xED, 0xC1, 0xBF, 0x3E, 0xFB, 0xF7, 0xE1, 0xD9, 0x5E, 0x19, 0xC5, 0x5E, 0xCA, 0xE7, 0x7E, 0x83, - 0x69, 0x46, 0xAB, 0x0A, 0x26, 0xA7, 0x8E, 0x32, 0xA4, 0x72, 0xC9, 0xD3, 0x6C, 0x69, 0xCE, 0xCD }, + { 0xC4, 0xE2, 0x8D, 0xD8, 0x3F, 0xE3, 0x0C, 0x96, 0x33, 0x8C, 0xEF, 0x77, 0x73, 0xC6, 0xDF, 0xCA, + 0x6C, 0xE4, 0xFA, 0x96, 0x41, 0xBE, 0xAB, 0x38, 0x05, 0xA8, 0xEF, 0xB6, 0xCD, 0xC3, 0xCF, 0x0A }, }, { - { 0xED, 0xF4, 0xDF, 0x97, 0x2C, 0xAD, 0x6C, 0x47, 0x0B, 0xAB, 0x5D, 0x66, 0x42, 0xF6, 0x60, 0xB8, - 0x42, 0xD6, 0xC9, 0x73, 0x07, 0x44, 0x93, 0xE4, 0xEF, 0x1B, 0xBF, 0x31, 0x1A, 0x92, 0x79, 0x95 }, + { 0xC5, 0x00, 0xB8, 0x3F, 0x3E, 0x06, 0x6C, 0xD1, 0xDD, 0x0E, 0xBC, 0xD7, 0x3D, 0xD4, 0x01, 0x61, + 0xB9, 0x25, 0x9A, 0xA7, 0x7A, 0xB8, 0xA6, 0x47, 0xE8, 0x57, 0x1F, 0xF3, 0x37, 0xCF, 0x94, 0x6D }, }, { - { 0xEE, 0x0C, 0xF6, 0x2B, 0x9D, 0x8E, 0x42, 0xA2, 0x23, 0xB9, 0xA9, 0x60, 0xB5, 0xE9, 0x67, 0x0C, - 0xCC, 0x34, 0x6D, 0x89, 0x93, 0x8F, 0xFA, 0x5D, 0xF7, 0x98, 0x65, 0xE4, 0x13, 0xD6, 0x31, 0x54 }, + { 0xC5, 0x29, 0x5B, 0xA6, 0xE2, 0x7E, 0x72, 0x10, 0x22, 0xFE, 0xB2, 0x1E, 0x78, 0xEB, 0x7B, 0x03, + 0x57, 0xC9, 0xCD, 0x56, 0x5B, 0xD0, 0xE5, 0x96, 0x72, 0xF6, 0x66, 0x34, 0x2B, 0x79, 0x94, 0x9D }, }, { - { 0xEE, 0x1A, 0x2F, 0xA9, 0x58, 0x37, 0x5E, 0x11, 0x06, 0xE2, 0xC9, 0x05, 0xED, 0x8A, 0x26, 0x4F, - 0x28, 0x19, 0xCB, 0xB5, 0x26, 0x11, 0x8D, 0x30, 0x68, 0x9D, 0x17, 0x90, 0x42, 0x9A, 0x46, 0xA1 }, + { 0xC6, 0x12, 0x75, 0x6B, 0xA5, 0x42, 0x34, 0x4A, 0xDC, 0x1B, 0x80, 0xE9, 0x38, 0x84, 0x5A, 0x1E, + 0xD6, 0xE9, 0x38, 0xFE, 0xF4, 0x0D, 0x04, 0xEC, 0x86, 0x55, 0x8F, 0x4B, 0x21, 0x05, 0x2F, 0xD2 }, }, { - { 0xEE, 0x34, 0xE1, 0xA1, 0x9B, 0xC8, 0x89, 0xF8, 0x5F, 0x7F, 0x0F, 0x5B, 0xF8, 0x72, 0xB1, 0xAC, - 0x56, 0x5E, 0xC6, 0xF1, 0x9D, 0xB5, 0x17, 0xBA, 0x4E, 0xD7, 0x55, 0xC4, 0x18, 0x5F, 0x69, 0xE8 }, + { 0xC6, 0x17, 0xE0, 0x85, 0x5B, 0xF1, 0x4F, 0xBF, 0x21, 0xAF, 0x00, 0x82, 0x25, 0xCA, 0xBE, 0x40, + 0x4F, 0x73, 0x8C, 0x27, 0x8A, 0x4A, 0x42, 0x87, 0xF1, 0xEE, 0x38, 0x01, 0x27, 0xC5, 0x61, 0xFA }, }, { - { 0xEE, 0x35, 0x71, 0x37, 0x61, 0x52, 0x7A, 0xE4, 0x8E, 0x7E, 0x40, 0x94, 0xB2, 0xB9, 0x1D, 0x3D, - 0xD2, 0x64, 0x3F, 0x38, 0xE2, 0x6D, 0x34, 0x36, 0x36, 0x52, 0xFE, 0x5C, 0x2B, 0xBC, 0x41, 0x6B }, + { 0xC6, 0xA4, 0x24, 0xBF, 0x7C, 0xFE, 0x31, 0x72, 0x74, 0x7A, 0x47, 0x14, 0xA0, 0xEF, 0xB9, 0x17, + 0x93, 0x8C, 0x5E, 0xBD, 0x59, 0x12, 0x9D, 0xED, 0x7A, 0x81, 0x18, 0xC7, 0xF6, 0x59, 0xD1, 0x33 }, }, { - { 0xEE, 0x3D, 0x0B, 0xC5, 0xA6, 0x5A, 0xF5, 0x8D, 0x43, 0x2D, 0x08, 0x63, 0x7B, 0xE0, 0xB7, 0xBA, - 0x49, 0xC2, 0x32, 0x61, 0x8D, 0xA9, 0xC8, 0x97, 0x3F, 0x88, 0x56, 0x8C, 0x88, 0x89, 0xD1, 0xAD }, + { 0xC6, 0xAD, 0x1D, 0x7A, 0x14, 0x1A, 0x91, 0x75, 0x2D, 0x31, 0xFB, 0xC1, 0x06, 0x16, 0xBF, 0x1C, + 0xA2, 0xFB, 0x5B, 0x02, 0xE8, 0x46, 0xB5, 0x9E, 0x63, 0x34, 0x6B, 0x31, 0x92, 0xA7, 0x52, 0x92 }, }, { - { 0xEE, 0xE4, 0x9F, 0xCF, 0x29, 0x63, 0x9E, 0xD8, 0x82, 0xE0, 0x1A, 0xD1, 0xF0, 0xF5, 0xA1, 0xC5, - 0x55, 0x09, 0x26, 0xAF, 0xD4, 0x23, 0x4E, 0xF1, 0x46, 0xBC, 0x47, 0x09, 0xFE, 0x5D, 0x90, 0xE8 }, + { 0xC7, 0x01, 0x83, 0x64, 0x38, 0xF3, 0x7B, 0xEA, 0x8A, 0x88, 0x16, 0x10, 0x63, 0x70, 0x86, 0xF8, + 0x8D, 0x9A, 0x11, 0x5E, 0x00, 0x92, 0x46, 0xD2, 0x7F, 0x48, 0x9F, 0xA7, 0x18, 0x51, 0x88, 0xA8 }, }, { - { 0xEF, 0x36, 0xA2, 0x29, 0x89, 0x65, 0xE4, 0x98, 0x84, 0x59, 0xB9, 0x21, 0x6A, 0xB3, 0x3C, 0x3C, - 0xA8, 0x42, 0xD2, 0x16, 0x83, 0xB6, 0x2A, 0x2B, 0xF1, 0x53, 0x0D, 0x30, 0xB0, 0xAE, 0x78, 0x25 }, + { 0xC7, 0xFF, 0x8E, 0xFD, 0xEC, 0xDF, 0x00, 0xD1, 0xFC, 0x8D, 0x55, 0x2D, 0x2A, 0x70, 0x70, 0xE5, + 0xE3, 0x3D, 0x42, 0xE5, 0x90, 0xF5, 0x86, 0xC6, 0xAE, 0xDE, 0x03, 0x2B, 0x2D, 0x86, 0x7B, 0xD5 }, }, { - { 0xEF, 0x6D, 0xE0, 0xC4, 0x85, 0x70, 0xBD, 0x71, 0x51, 0x6B, 0xF6, 0x39, 0x5D, 0xBD, 0x29, 0x33, - 0x7C, 0xFC, 0xB7, 0xD4, 0x26, 0x64, 0x10, 0xA1, 0xF5, 0xDA, 0x08, 0x08, 0xE0, 0x96, 0xF4, 0x55 }, + { 0xC7, 0xFF, 0xB4, 0x9F, 0xBC, 0x94, 0x72, 0x24, 0x5C, 0x8E, 0x95, 0xDE, 0x62, 0x9A, 0xF5, 0xC1, + 0xBF, 0xEA, 0xC5, 0x50, 0x04, 0xC1, 0x54, 0x82, 0x3A, 0x58, 0xBA, 0xE8, 0x05, 0x6E, 0x3C, 0x64 }, }, { - { 0xEF, 0x7E, 0x8C, 0xCD, 0x7B, 0xCF, 0xB7, 0x1D, 0x2A, 0xA7, 0xBC, 0xDD, 0x8F, 0xD2, 0xD2, 0xD1, - 0x55, 0x77, 0x9D, 0xE8, 0x68, 0x43, 0x20, 0x44, 0x35, 0x1E, 0x98, 0x02, 0xCC, 0xA2, 0x90, 0xAF }, + { 0xC8, 0x37, 0xD6, 0xF2, 0xAB, 0x14, 0x79, 0x91, 0x42, 0xED, 0x3C, 0x79, 0xBE, 0xD9, 0x44, 0x1E, + 0x92, 0x50, 0xBD, 0x05, 0x20, 0x25, 0xAD, 0x8A, 0xF4, 0x40, 0x41, 0xAC, 0x19, 0xEF, 0xBB, 0x4C }, }, { - { 0xEF, 0xAF, 0xCA, 0x84, 0x90, 0x30, 0x7B, 0x0F, 0x62, 0x2B, 0xF4, 0x3A, 0x0E, 0xB3, 0xC5, 0x1A, - 0xCB, 0xDD, 0xDE, 0xDC, 0x23, 0x92, 0xF1, 0x61, 0xAC, 0xED, 0x16, 0x71, 0xA6, 0x53, 0x60, 0x7E }, + { 0xC9, 0x43, 0x10, 0x03, 0xBB, 0xEA, 0xB5, 0x8E, 0x35, 0x2F, 0xDE, 0xB4, 0x5B, 0x7F, 0xCF, 0x15, + 0xC7, 0x3F, 0x07, 0x34, 0xA0, 0x7D, 0x6C, 0xBD, 0xF6, 0x32, 0x92, 0x92, 0xEB, 0x81, 0x2C, 0x93 }, }, { - { 0xEF, 0xB5, 0xBE, 0x9F, 0xA2, 0xC6, 0xEE, 0x48, 0x9F, 0x9E, 0xB3, 0xDD, 0x55, 0x42, 0xA7, 0x0C, - 0x22, 0x57, 0xB5, 0x6B, 0x24, 0x0B, 0x3B, 0x4B, 0x29, 0xF3, 0xB4, 0xE6, 0xBA, 0x8A, 0xED, 0xE3 }, + { 0xC9, 0x72, 0xF4, 0xF9, 0x6E, 0x71, 0x33, 0xE1, 0x6E, 0x55, 0x57, 0xA0, 0x57, 0xB1, 0xD4, 0x2B, + 0xA9, 0x2D, 0x98, 0x5C, 0xAE, 0xE7, 0x3C, 0xAF, 0xDA, 0xEB, 0x55, 0xEC, 0xA2, 0xE4, 0xAB, 0xB0 }, }, { - { 0xEF, 0xC1, 0x72, 0xEE, 0xAB, 0xE2, 0xAE, 0x26, 0xBC, 0xBF, 0x0E, 0xDD, 0x22, 0x19, 0xE6, 0x62, - 0xE4, 0x63, 0xF9, 0x58, 0x03, 0x40, 0xF3, 0x47, 0x3D, 0xAD, 0x35, 0xE7, 0x50, 0xB0, 0x70, 0x68 }, + { 0xC9, 0x78, 0x37, 0x2C, 0x9E, 0x11, 0x60, 0x71, 0xB6, 0x1B, 0x90, 0x92, 0xA9, 0xAA, 0x96, 0x81, + 0x62, 0x36, 0x55, 0xA6, 0x6F, 0x4F, 0xCB, 0xC4, 0xD3, 0xA6, 0x7E, 0xFD, 0x56, 0x72, 0x48, 0x30 }, }, { - { 0xEF, 0xCE, 0x18, 0x13, 0x67, 0x41, 0x03, 0xC4, 0x43, 0xAF, 0x12, 0x8F, 0x84, 0x81, 0x8E, 0x33, - 0x85, 0x3E, 0x3B, 0x69, 0x03, 0x55, 0x35, 0x36, 0x57, 0x98, 0xEA, 0xF7, 0x5F, 0x7E, 0xAF, 0x79 }, + { 0xCA, 0x55, 0x6F, 0x82, 0xC9, 0x68, 0x4C, 0x9A, 0xF3, 0x55, 0x7D, 0x3E, 0x2D, 0x88, 0xAF, 0x92, + 0xED, 0x25, 0x9C, 0x20, 0xFF, 0xD1, 0xDD, 0xE9, 0xF7, 0x9D, 0x6B, 0x92, 0xC6, 0x1E, 0xE1, 0xB9 }, }, { - { 0xEF, 0xD1, 0xE0, 0xE7, 0x3F, 0xA8, 0x71, 0x00, 0xB7, 0x6A, 0x93, 0x23, 0x49, 0xC4, 0x5D, 0x09, - 0xB2, 0x8B, 0x2D, 0x8A, 0x00, 0x17, 0x19, 0xA5, 0x8D, 0xFA, 0xCC, 0x74, 0x84, 0xC7, 0xCF, 0x42 }, + { 0xCA, 0xBE, 0x25, 0x56, 0xF1, 0xBB, 0x56, 0x57, 0x0C, 0xEF, 0x3A, 0x87, 0x03, 0x32, 0x71, 0xA1, + 0xF2, 0x1D, 0x09, 0xB7, 0xFD, 0x04, 0x12, 0x83, 0x18, 0xE5, 0xE7, 0xBC, 0xE3, 0xA2, 0x01, 0xE2 }, }, { - { 0xF0, 0x11, 0xAD, 0x9E, 0xDD, 0x4F, 0xE7, 0x18, 0x8D, 0x77, 0x2E, 0xBA, 0xFA, 0x5B, 0xF5, 0x32, - 0x92, 0x47, 0x77, 0x88, 0xDC, 0x12, 0x80, 0x32, 0x76, 0xB0, 0x00, 0xC4, 0x41, 0x91, 0x03, 0xF0 }, + { 0xCA, 0xDC, 0xD5, 0xAE, 0x1B, 0x75, 0x6A, 0xB7, 0x41, 0xB3, 0x56, 0x9C, 0x42, 0xA5, 0x41, 0x1F, + 0x09, 0x3E, 0x4E, 0x1F, 0x01, 0x2E, 0xC5, 0x79, 0x91, 0xCB, 0xD6, 0xDB, 0xE0, 0x8F, 0xAA, 0xC1 }, }, { - { 0xF0, 0x15, 0x95, 0xF5, 0xA4, 0x66, 0x88, 0x78, 0xF6, 0xC7, 0x98, 0xA5, 0xD2, 0xF1, 0x35, 0x23, - 0xF3, 0xAF, 0xB2, 0x0E, 0xF7, 0x6F, 0xE5, 0x77, 0x6F, 0xCE, 0x47, 0xD3, 0x40, 0x9D, 0xF3, 0xC2 }, + { 0xCB, 0x7A, 0x43, 0x8D, 0x16, 0xE4, 0xA5, 0xF3, 0xC5, 0x6F, 0xDF, 0x19, 0x1E, 0x1D, 0xAF, 0x9F, + 0x32, 0x5C, 0x65, 0x0B, 0xD6, 0x2F, 0x07, 0xC4, 0x67, 0x71, 0x72, 0x07, 0x35, 0x1A, 0xE3, 0x29 }, }, { - { 0xF0, 0x2F, 0x9D, 0xA4, 0x5D, 0x9E, 0xB9, 0x86, 0x19, 0x4E, 0x06, 0xF5, 0xE6, 0x18, 0x95, 0x45, - 0x12, 0xC9, 0x02, 0x6E, 0x7C, 0xA7, 0xB5, 0x1E, 0x66, 0x5D, 0xB6, 0xAD, 0xBA, 0xC1, 0xF6, 0x00 }, + { 0xCC, 0x2A, 0x70, 0x6F, 0xE6, 0x8F, 0x5D, 0x17, 0xF4, 0xAB, 0xAF, 0x60, 0x86, 0xE5, 0xBD, 0x97, + 0xAE, 0x35, 0xEB, 0x35, 0x9F, 0x75, 0xC0, 0x92, 0xBB, 0xA4, 0x93, 0xFE, 0x11, 0xF2, 0x69, 0xFD }, }, { - { 0xF0, 0x6B, 0x35, 0x95, 0x36, 0xD1, 0x34, 0x32, 0x8B, 0x36, 0x00, 0x4D, 0xA9, 0xA9, 0x19, 0x0C, - 0x3A, 0x76, 0x69, 0xE8, 0x27, 0x8D, 0xB9, 0xF7, 0x58, 0x57, 0xC4, 0x8D, 0x64, 0x4B, 0xE2, 0x03 }, + { 0xCC, 0x30, 0xD8, 0x19, 0xDE, 0x54, 0x05, 0xF6, 0x49, 0xC8, 0xB7, 0xA8, 0x14, 0x8F, 0x26, 0xD7, + 0x71, 0x08, 0x3E, 0xC5, 0x18, 0xF9, 0xB6, 0x6F, 0xF5, 0x47, 0xF2, 0x82, 0x2D, 0x11, 0x93, 0x6D }, }, { - { 0xF0, 0xCF, 0xC7, 0x79, 0x13, 0x39, 0x7D, 0xE2, 0x38, 0xED, 0xB5, 0x9F, 0x0F, 0x99, 0x23, 0xC6, - 0xD4, 0x11, 0x0A, 0x4B, 0x3A, 0xC8, 0xAC, 0x76, 0x55, 0x6A, 0x0C, 0x92, 0x44, 0xF0, 0x3F, 0xC1 }, + { 0xCC, 0x65, 0xCD, 0xC5, 0x33, 0x62, 0xD4, 0x21, 0x62, 0x7E, 0xAE, 0xF5, 0xD0, 0xC8, 0xE4, 0xC4, + 0xE2, 0x40, 0xAD, 0xE0, 0xC9, 0xD4, 0x20, 0xBE, 0x67, 0x1E, 0x70, 0xF0, 0xFB, 0xAC, 0x8D, 0x0A }, }, { - { 0xF1, 0x13, 0x93, 0xAF, 0xAA, 0xCB, 0x50, 0x3A, 0xE4, 0xAC, 0xCC, 0x3E, 0xDF, 0xC5, 0x8F, 0x9A, - 0xD8, 0xA9, 0x6A, 0x01, 0x2E, 0x3A, 0xC3, 0x8E, 0xCB, 0xAA, 0x28, 0x62, 0xB8, 0x05, 0x69, 0x8B }, + { 0xCD, 0xB1, 0x62, 0x53, 0xD2, 0x2E, 0xD5, 0xD4, 0x26, 0xCF, 0xA1, 0xB0, 0x5C, 0xEC, 0xD8, 0x6E, + 0xF1, 0xB7, 0xDE, 0xAA, 0x07, 0xC5, 0x70, 0x5E, 0xBB, 0xAF, 0x7D, 0x9A, 0x80, 0x7D, 0x56, 0x16 }, }, { - { 0xF1, 0x46, 0x85, 0xC4, 0xC1, 0x0C, 0x79, 0xFC, 0x97, 0xE1, 0x84, 0xEA, 0x7D, 0x22, 0xF8, 0xEE, - 0x4A, 0x81, 0xD0, 0x56, 0x95, 0xAB, 0x08, 0xD2, 0x5D, 0x4A, 0x73, 0x3B, 0x60, 0xB4, 0x70, 0xDF }, + { 0xCD, 0xC0, 0x39, 0xF3, 0xA2, 0xD1, 0xBB, 0xA5, 0xE8, 0x09, 0x4E, 0x55, 0x23, 0xCF, 0x60, 0x47, + 0x09, 0x7D, 0x4B, 0x3C, 0xD4, 0xEC, 0x4E, 0xD6, 0xAA, 0x8E, 0xB7, 0xB4, 0xD8, 0xB5, 0x77, 0x7D }, }, { - { 0xF1, 0x4B, 0xF7, 0x41, 0x19, 0x15, 0xEF, 0x83, 0x96, 0xCC, 0x04, 0x0A, 0x6F, 0x30, 0x12, 0xBD, - 0x81, 0x8C, 0x11, 0x9D, 0x03, 0x98, 0xCE, 0xD6, 0x1D, 0x80, 0x9E, 0xF9, 0x4B, 0xD8, 0x62, 0xD8 }, + { 0xCD, 0xC4, 0xEA, 0x92, 0x02, 0xE3, 0x3E, 0xDD, 0x0F, 0x2D, 0x3A, 0xE8, 0x6A, 0xCA, 0xC7, 0xFB, + 0x25, 0x35, 0x4B, 0x02, 0x23, 0x5B, 0x09, 0x33, 0xAA, 0x81, 0xA3, 0x13, 0xB5, 0xFD, 0xFE, 0xEC }, }, { - { 0xF1, 0x9A, 0xE4, 0x7D, 0x93, 0x67, 0x16, 0x52, 0x78, 0xE1, 0x66, 0xED, 0x44, 0xFF, 0xC3, 0x7E, - 0x5B, 0x28, 0x19, 0x6C, 0x01, 0x4B, 0xF1, 0x18, 0xCF, 0xC6, 0x4E, 0xD5, 0xFA, 0x18, 0x19, 0x4D }, + { 0xCE, 0x4C, 0x2F, 0x8F, 0x16, 0x46, 0x8A, 0x58, 0x88, 0xE9, 0x0F, 0x73, 0x4E, 0x4D, 0x22, 0x02, + 0xDF, 0xAD, 0xBF, 0xA6, 0x6F, 0x5B, 0x35, 0x75, 0x2B, 0xAA, 0x76, 0x21, 0xA7, 0x60, 0xB0, 0x88 }, }, { - { 0xF1, 0xB5, 0xF4, 0xB2, 0x1E, 0xA3, 0x2D, 0x06, 0x26, 0xAA, 0x5A, 0x6B, 0xF5, 0xC4, 0xDE, 0x59, - 0x1C, 0xF1, 0x65, 0x0F, 0xA8, 0x22, 0xF1, 0x34, 0xD9, 0x2D, 0x54, 0x8F, 0x15, 0x77, 0x73, 0xD6 }, + { 0xCE, 0x81, 0x44, 0x58, 0x54, 0x03, 0x1F, 0x3D, 0x0F, 0x5C, 0x88, 0x75, 0x46, 0x4D, 0xCD, 0x5B, + 0xA6, 0xC8, 0x90, 0xF4, 0x49, 0xB3, 0x20, 0x7B, 0xCA, 0x2B, 0xC9, 0x61, 0x82, 0x2D, 0x27, 0xC4 }, }, { - { 0xF2, 0x06, 0x59, 0x72, 0x49, 0x8D, 0x5E, 0x12, 0x79, 0x8E, 0x1E, 0x1F, 0xF3, 0xE1, 0x1D, 0xE4, - 0x23, 0x3A, 0xBB, 0xBD, 0x30, 0x8A, 0x58, 0x07, 0x60, 0x58, 0x48, 0x18, 0x6E, 0x44, 0x11, 0x7F }, + { 0xCF, 0xA0, 0xC0, 0x0C, 0xB2, 0xFB, 0x4B, 0x85, 0x7A, 0xAD, 0x22, 0xB1, 0x3A, 0x90, 0xE3, 0x46, + 0xA0, 0x3E, 0x6B, 0x79, 0xAB, 0xD5, 0xD2, 0x75, 0xB5, 0x43, 0x24, 0x68, 0x17, 0x92, 0xD6, 0xD1 }, }, { - { 0xF2, 0x54, 0x76, 0xF3, 0xAB, 0x8E, 0x5E, 0x0B, 0x9B, 0xB6, 0x1D, 0x4C, 0xE4, 0x50, 0x7F, 0xA3, - 0x52, 0x93, 0xC6, 0x64, 0x15, 0xD7, 0xD1, 0x91, 0x9B, 0x29, 0xBB, 0x8C, 0xBF, 0xFD, 0xA5, 0x00 }, + { 0xD0, 0xF5, 0x93, 0xC1, 0xA8, 0x1B, 0x1E, 0xF8, 0x51, 0x69, 0x81, 0xEE, 0x56, 0xF1, 0xD5, 0x98, + 0xA2, 0xA6, 0x03, 0x48, 0x8C, 0x67, 0x8C, 0x1B, 0x7B, 0xBE, 0xA6, 0x44, 0x6B, 0x00, 0x83, 0xAD }, }, { - { 0xF2, 0x6F, 0x08, 0x73, 0x87, 0xBC, 0x9B, 0x62, 0xF5, 0x38, 0xB0, 0x76, 0xD6, 0xBD, 0xFD, 0x15, - 0x87, 0x36, 0xDE, 0x71, 0x61, 0xC6, 0xBC, 0xA3, 0x86, 0xF5, 0x7D, 0xD2, 0xB0, 0x0B, 0x8F, 0xE0 }, + { 0xD2, 0x90, 0x3C, 0xA2, 0x55, 0x17, 0x27, 0xED, 0x01, 0x71, 0xCC, 0x4A, 0x43, 0xB3, 0xCA, 0xE0, + 0x09, 0xB7, 0x47, 0xB9, 0xF4, 0xF8, 0x48, 0x72, 0x92, 0x27, 0xBF, 0x59, 0x02, 0xF2, 0x3E, 0x47 }, }, { - { 0xF2, 0xB1, 0x95, 0x84, 0x6E, 0xE2, 0xB9, 0xAB, 0x5F, 0x18, 0xE6, 0x80, 0x21, 0xF8, 0xDF, 0x7C, - 0x0B, 0x60, 0x58, 0xDE, 0xDE, 0x86, 0xC5, 0xD5, 0x90, 0xF2, 0xE8, 0x64, 0x3A, 0xFE, 0x04, 0x52 }, + { 0xD2, 0xE8, 0xA1, 0x23, 0x7A, 0x93, 0xF5, 0x78, 0xD1, 0xBA, 0x8F, 0x09, 0xE4, 0xFF, 0x10, 0x7B, + 0x62, 0x35, 0x78, 0x85, 0x42, 0xAA, 0x61, 0x83, 0xD1, 0x76, 0xDB, 0xF1, 0xC8, 0x8D, 0xCF, 0xB6 }, }, { - { 0xF2, 0xE3, 0x0F, 0xB6, 0xCD, 0x91, 0x67, 0x54, 0x84, 0x72, 0xCC, 0xDF, 0x58, 0x9F, 0x3D, 0x00, - 0x43, 0x0C, 0x22, 0xB8, 0x33, 0x44, 0xA1, 0x16, 0x5B, 0x64, 0xE6, 0x87, 0x4D, 0xF3, 0x5E, 0xDC }, + { 0xD5, 0x04, 0x88, 0x96, 0x86, 0x07, 0x29, 0xA8, 0xFA, 0x5D, 0x23, 0x57, 0x81, 0x2B, 0xA5, 0x6C, + 0xBE, 0x84, 0xC9, 0xAB, 0x7D, 0x14, 0xDF, 0x47, 0x64, 0xE0, 0xB6, 0x62, 0x0F, 0xA3, 0x20, 0x10 }, }, { - { 0xF2, 0xE5, 0x30, 0x0C, 0x39, 0xF2, 0x86, 0xC6, 0x78, 0x99, 0x90, 0x9C, 0x7C, 0xE7, 0x35, 0x9B, - 0x09, 0x45, 0xD2, 0xAF, 0xD3, 0x4A, 0x6D, 0xD6, 0x9E, 0x08, 0xCD, 0xA5, 0x44, 0xC8, 0x7B, 0x3A }, + { 0xD5, 0x41, 0xA7, 0x7E, 0x13, 0x6E, 0x9E, 0x70, 0x3B, 0xB9, 0x9F, 0x80, 0x68, 0xCF, 0xEE, 0x86, + 0xA4, 0xB9, 0xF0, 0x89, 0xE0, 0x2D, 0x0C, 0x6C, 0xB6, 0xD4, 0xA3, 0x94, 0x6C, 0x6B, 0x16, 0x7A }, }, { - { 0xF3, 0x0C, 0x0A, 0xED, 0x70, 0x6D, 0x22, 0x55, 0x5F, 0x07, 0x09, 0x6A, 0xF4, 0xB8, 0xBE, 0xDC, - 0x16, 0x3C, 0x0F, 0x6E, 0xD5, 0x34, 0x6E, 0xFC, 0x28, 0xE8, 0xCF, 0xAF, 0x84, 0x2F, 0xA5, 0xD9 }, + { 0xD5, 0x83, 0x94, 0x96, 0xCD, 0xC8, 0x5B, 0xE3, 0xD1, 0xF1, 0xAC, 0x65, 0x2E, 0xFA, 0x92, 0xBE, + 0xA3, 0xB0, 0x61, 0xC1, 0x3D, 0xAD, 0x5A, 0x82, 0x11, 0x22, 0xCF, 0xE9, 0xC7, 0x1A, 0x5A, 0x32 }, }, { - { 0xF3, 0x25, 0x58, 0x52, 0x53, 0xD2, 0x8E, 0x72, 0x02, 0x3F, 0x04, 0xDA, 0x0A, 0x2C, 0xB5, 0x0F, - 0xBD, 0x4B, 0x75, 0xC2, 0x5A, 0x3A, 0x80, 0x25, 0x3F, 0x70, 0x36, 0xCE, 0x71, 0x74, 0x1B, 0x9B }, + { 0xD5, 0xA4, 0xEE, 0x46, 0x95, 0xB5, 0x65, 0xA6, 0x7E, 0x50, 0x48, 0x66, 0xFE, 0x5B, 0xA3, 0xC0, + 0xED, 0xCA, 0xEE, 0xD5, 0x2A, 0xD0, 0xAF, 0x07, 0xE6, 0x79, 0x17, 0x73, 0x85, 0x12, 0xC8, 0xF5 }, }, { - { 0xF3, 0x48, 0x7E, 0x13, 0xEA, 0xB9, 0x5D, 0xA9, 0xAF, 0xED, 0xE0, 0x74, 0x84, 0x4B, 0xDE, 0x4C, - 0xA0, 0x31, 0x48, 0x26, 0xCC, 0xBD, 0x06, 0x96, 0x29, 0x8C, 0x35, 0x32, 0x4A, 0x91, 0xCB, 0xEB }, + { 0xD6, 0x25, 0xC0, 0x59, 0x2B, 0x25, 0xDC, 0x03, 0xAA, 0x7E, 0x87, 0x8E, 0x6A, 0x85, 0x09, 0x1B, + 0xAA, 0x07, 0x8D, 0x26, 0x8B, 0xBD, 0xB4, 0x9F, 0x09, 0x67, 0x94, 0x08, 0x61, 0x2D, 0x1E, 0xFE }, }, { - { 0xF3, 0x5F, 0xE6, 0x61, 0xD1, 0x88, 0x65, 0x29, 0x35, 0xE2, 0xC0, 0xE5, 0x19, 0x11, 0x8F, 0x7C, - 0x4E, 0x45, 0x7B, 0x0C, 0x65, 0xC8, 0xE1, 0x4B, 0xCE, 0xDC, 0x7D, 0x4C, 0xC5, 0x1E, 0x81, 0xD0 }, + { 0xD6, 0xD1, 0xB3, 0x5C, 0xBC, 0x12, 0xFB, 0x1C, 0x70, 0xA0, 0xB4, 0x3B, 0xA5, 0x9A, 0xB3, 0xD3, + 0x22, 0x5F, 0x37, 0x32, 0x64, 0xDD, 0x87, 0xFB, 0xCA, 0x00, 0x61, 0xEC, 0x1C, 0x4D, 0xA1, 0x1A }, }, { - { 0xF3, 0xCB, 0x8E, 0xA4, 0xE8, 0xF2, 0xA7, 0x00, 0x9C, 0x23, 0x3A, 0x64, 0x88, 0x71, 0xDB, 0x46, - 0x04, 0xD5, 0x45, 0x4B, 0xC5, 0x55, 0x9E, 0x9B, 0xF1, 0xBB, 0x2E, 0xB0, 0x00, 0x99, 0x3B, 0xDF }, + { 0xD7, 0x32, 0x49, 0x74, 0xB5, 0x60, 0x09, 0x62, 0x17, 0x61, 0xF7, 0xC0, 0xFF, 0x68, 0x9D, 0xDE, + 0x47, 0x74, 0x99, 0x85, 0xE1, 0xEE, 0x8B, 0x5C, 0x89, 0x61, 0xDD, 0x8F, 0x6A, 0x78, 0xBB, 0xF5 }, }, { - { 0xF4, 0x0C, 0x5A, 0x4F, 0xE5, 0xA7, 0x08, 0x81, 0x08, 0x7E, 0x61, 0x6A, 0xAD, 0x68, 0x23, 0x09, - 0x21, 0xDA, 0xF0, 0x31, 0x01, 0xEB, 0x91, 0x2F, 0x13, 0x3A, 0x8B, 0xD1, 0xC5, 0xCF, 0x0A, 0xD0 }, + { 0xD9, 0x2E, 0x3E, 0xE3, 0x82, 0xC8, 0xDC, 0xAF, 0xA0, 0x39, 0x3D, 0x9F, 0x9A, 0x00, 0xBF, 0x4C, + 0xD9, 0xD5, 0x64, 0x26, 0x2B, 0x18, 0x0F, 0x68, 0x16, 0x0B, 0x20, 0x34, 0xC5, 0x44, 0xD1, 0x0A }, }, { - { 0xF4, 0x2A, 0x12, 0xA1, 0x43, 0x57, 0xC0, 0xCF, 0x12, 0x2B, 0xBD, 0x82, 0x77, 0x69, 0xFB, 0x56, - 0xDB, 0xF5, 0xB6, 0xEE, 0x89, 0x4F, 0x02, 0x5B, 0x9A, 0xDE, 0x25, 0x88, 0xA9, 0xB5, 0x5D, 0x9B }, + { 0xD9, 0x65, 0xF7, 0x41, 0x62, 0x04, 0xDA, 0x83, 0x1A, 0xF6, 0x6B, 0xFA, 0x8F, 0x90, 0xD1, 0x41, + 0xE9, 0x93, 0xF0, 0x00, 0x21, 0x33, 0xF2, 0x8D, 0xE9, 0x7F, 0x56, 0x4A, 0x1D, 0x60, 0x4E, 0xCC }, }, { - { 0xF4, 0x83, 0x3E, 0x73, 0x82, 0x42, 0x02, 0x18, 0xFF, 0xA7, 0x8D, 0xFA, 0x23, 0x50, 0x0E, 0x7D, - 0x34, 0x8F, 0x80, 0xFB, 0x87, 0xE9, 0x82, 0x48, 0x61, 0x3B, 0x59, 0x24, 0x2D, 0x99, 0x1A, 0x78 }, + { 0xD9, 0x7F, 0x55, 0xB9, 0x57, 0x9B, 0x05, 0xAE, 0x4A, 0x3E, 0xD7, 0xFC, 0x55, 0x8C, 0x58, 0x45, + 0x64, 0x51, 0x60, 0xDA, 0xB3, 0x53, 0x85, 0xC1, 0x38, 0xBC, 0x89, 0x9C, 0x4D, 0xAD, 0x8B, 0x36 }, }, { - { 0xF4, 0x91, 0x32, 0x07, 0xAD, 0xC7, 0x68, 0xEC, 0x7C, 0xA6, 0xB1, 0xFE, 0x03, 0xEF, 0x9C, 0xF1, - 0x0B, 0x7D, 0xB6, 0x01, 0xD7, 0xF6, 0x6C, 0x10, 0x2C, 0x84, 0xE4, 0x70, 0x92, 0x9E, 0xE4, 0xA1 }, + { 0xDA, 0xDF, 0x97, 0x13, 0x34, 0x14, 0xAD, 0x51, 0x3F, 0xC7, 0x50, 0x14, 0xE9, 0x56, 0x65, 0xDA, + 0xD7, 0x76, 0xB1, 0x50, 0x4B, 0x15, 0x67, 0x43, 0x4F, 0xD8, 0x2A, 0x79, 0xA2, 0x20, 0xE9, 0xA1 }, }, { - { 0xF4, 0xCC, 0xA7, 0x7F, 0x70, 0x42, 0xD6, 0x78, 0x8A, 0x04, 0x5E, 0xAD, 0x54, 0x95, 0x1A, 0x25, - 0x4A, 0x26, 0x9E, 0xD9, 0x85, 0x4A, 0x62, 0x06, 0xB4, 0xAA, 0x5B, 0xE9, 0x9F, 0xC7, 0xD9, 0xAC }, + { 0xDE, 0xCD, 0xB9, 0xFC, 0x1D, 0xDE, 0xC9, 0x7E, 0x09, 0xC3, 0x02, 0x6A, 0xCE, 0xB7, 0x6B, 0xDA, + 0xE9, 0xDE, 0xB6, 0x62, 0x75, 0x1D, 0xDA, 0x34, 0x9D, 0x2F, 0xA6, 0xBD, 0x75, 0xCA, 0x59, 0x14 }, }, { - { 0xF4, 0xD1, 0xD1, 0x3C, 0xFD, 0x04, 0x31, 0x16, 0x09, 0x38, 0xE8, 0xE9, 0xB2, 0xE3, 0x80, 0x61, - 0x97, 0xCA, 0x7F, 0xFD, 0xEC, 0x7A, 0xAD, 0xFE, 0xAF, 0xFB, 0x4D, 0xA4, 0x72, 0x92, 0x4E, 0xDF }, + { 0xDE, 0xD1, 0x9A, 0xD5, 0xDE, 0x99, 0x65, 0xD9, 0x22, 0x5C, 0x1B, 0xBA, 0x5F, 0xB4, 0xD8, 0x90, + 0xC8, 0xE5, 0xC0, 0x35, 0xE4, 0x85, 0x27, 0x52, 0xB6, 0x69, 0xB0, 0x40, 0x0F, 0x24, 0xF1, 0x74 }, }, { - { 0xF5, 0x12, 0x02, 0xF2, 0xDD, 0x4C, 0x4A, 0xD1, 0x04, 0x3A, 0xF5, 0xA3, 0x75, 0xAD, 0xD0, 0x69, - 0xE7, 0x4B, 0x4C, 0x3E, 0xFA, 0xB5, 0xE0, 0xF6, 0xDD, 0xA9, 0x20, 0xD2, 0x3D, 0xB7, 0xCC, 0x73 }, + { 0xDF, 0x30, 0xBF, 0x8D, 0x1B, 0xF9, 0x37, 0x8E, 0x43, 0x3E, 0xF9, 0xE1, 0xB3, 0xA2, 0x28, 0xA0, + 0x7E, 0x36, 0x58, 0xA5, 0xBC, 0x43, 0x88, 0x23, 0x45, 0x4D, 0xB0, 0x6A, 0x67, 0x94, 0x4C, 0x6E }, }, { - { 0xF5, 0x82, 0xF1, 0x66, 0xB8, 0x2B, 0xED, 0x47, 0xEF, 0xE3, 0x66, 0x1A, 0xA8, 0x02, 0x32, 0xFA, - 0x81, 0x67, 0xD2, 0xE8, 0x97, 0x96, 0xA3, 0x66, 0xEA, 0x35, 0xAD, 0x40, 0xA1, 0xBA, 0x2F, 0x66 }, + { 0xDF, 0x69, 0xF9, 0x6A, 0x85, 0x67, 0x8F, 0x6C, 0xAF, 0x3F, 0xDE, 0x25, 0xEC, 0xFB, 0x5D, 0xF4, + 0x74, 0x70, 0x87, 0xC2, 0xAF, 0x3B, 0x00, 0x65, 0xFB, 0x15, 0x10, 0x55, 0xCB, 0xCB, 0xA8, 0xC1 }, }, { - { 0xF5, 0x98, 0x77, 0xC3, 0xC9, 0x03, 0xF2, 0x02, 0xDD, 0xB7, 0x2C, 0xE9, 0x9B, 0x18, 0x02, 0x63, - 0x9A, 0xA6, 0x53, 0x9B, 0x08, 0x6E, 0xAA, 0x74, 0xCA, 0xAB, 0x16, 0xAB, 0x9B, 0xF3, 0x0D, 0x95 }, + { 0xE0, 0x0B, 0xD7, 0x86, 0xD1, 0xF2, 0xF4, 0x46, 0xC4, 0xBA, 0x83, 0x99, 0xD4, 0xD8, 0xD5, 0xA0, + 0xD1, 0x98, 0x57, 0x8F, 0x42, 0x99, 0xFD, 0xFD, 0xAF, 0xF7, 0x8C, 0x3F, 0x67, 0x71, 0xF3, 0x94 }, }, { - { 0xF5, 0xCA, 0x51, 0xE5, 0xB2, 0x72, 0xD3, 0x77, 0x52, 0x4A, 0x38, 0xD1, 0xA0, 0x3B, 0x51, 0x23, - 0x7C, 0xA0, 0x89, 0x47, 0x24, 0x19, 0xE5, 0x61, 0x9F, 0xFD, 0x71, 0x7A, 0x09, 0x8B, 0x5B, 0x42 }, + { 0xE0, 0x8B, 0x2C, 0xC2, 0x7A, 0xE8, 0xE2, 0xEF, 0x1A, 0x33, 0x01, 0x7A, 0x9A, 0xC2, 0x5D, 0xDA, + 0xFB, 0x5E, 0xA1, 0x12, 0xC9, 0x56, 0xB0, 0x02, 0xFE, 0x6C, 0x79, 0x80, 0x14, 0xAA, 0x90, 0x65 }, }, { - { 0xF5, 0xE1, 0xF7, 0xDA, 0x24, 0x9D, 0xB8, 0x7D, 0x6B, 0xB8, 0xF9, 0x6E, 0xE7, 0x3D, 0xD1, 0x31, - 0xBD, 0xDF, 0xAF, 0x62, 0xCC, 0x0B, 0x46, 0x5F, 0x3A, 0x47, 0x4F, 0x91, 0xD3, 0xE3, 0xB5, 0xEC }, + { 0xE1, 0xB2, 0xE8, 0x6B, 0x0D, 0xA8, 0x69, 0xE9, 0x25, 0x26, 0x6C, 0x1B, 0x56, 0x88, 0x34, 0x5A, + 0x17, 0xB0, 0xF6, 0xE2, 0xA2, 0x14, 0x94, 0x54, 0x7E, 0xAC, 0x09, 0x7C, 0x8B, 0xF5, 0x3C, 0x5A }, }, { - { 0xF6, 0x13, 0xD5, 0x90, 0x46, 0xD1, 0x66, 0x71, 0xD3, 0xC5, 0x60, 0x17, 0x6F, 0x3D, 0x77, 0xFD, - 0xC5, 0x1E, 0x5F, 0x57, 0xB5, 0xE4, 0x8A, 0xE7, 0xA4, 0xB9, 0x70, 0x0A, 0x11, 0xD4, 0x69, 0x3A }, + { 0xE1, 0xD6, 0x44, 0xA0, 0x96, 0xBD, 0x8A, 0x6C, 0xAC, 0xBB, 0xDA, 0x3E, 0x7F, 0xC3, 0x38, 0xEA, + 0xDD, 0xC1, 0x2F, 0x23, 0x6C, 0x72, 0x61, 0xE4, 0x5F, 0x8A, 0xD2, 0xD8, 0x42, 0x42, 0x4F, 0x72 }, }, { - { 0xF6, 0x1E, 0x88, 0xE4, 0x31, 0x76, 0x13, 0x50, 0x00, 0x62, 0x99, 0x19, 0xD9, 0x39, 0x82, 0xDB, - 0x67, 0xE9, 0xD1, 0x77, 0x4E, 0x7E, 0xD0, 0xB4, 0xFA, 0x03, 0x8E, 0x1B, 0x24, 0xEC, 0x0A, 0xCF }, + { 0xE2, 0x24, 0x10, 0xB5, 0xA6, 0x7F, 0xED, 0xC2, 0x64, 0x69, 0x4C, 0x44, 0x9D, 0x84, 0xFA, 0x1A, + 0x02, 0xBC, 0x8B, 0x21, 0x28, 0xC1, 0x25, 0x60, 0x71, 0x58, 0xC9, 0x1B, 0x05, 0x38, 0x6C, 0x6A }, }, { - { 0xF6, 0x41, 0xE7, 0xE0, 0x1B, 0xF4, 0xF2, 0xB0, 0xD0, 0xC4, 0x8B, 0xA6, 0x38, 0xA0, 0x2E, 0x26, - 0xBD, 0xDB, 0xD7, 0x7B, 0xC5, 0xE9, 0x72, 0x61, 0x94, 0xDB, 0x1A, 0xEA, 0x4F, 0x2F, 0xD7, 0x71 }, + { 0xE2, 0xA8, 0x47, 0xC3, 0xF0, 0x9B, 0xEB, 0x6F, 0x05, 0x68, 0x6F, 0x17, 0x79, 0x1B, 0x05, 0xF1, + 0xFE, 0x25, 0xF7, 0x71, 0x86, 0x9C, 0x42, 0x63, 0xA5, 0x5B, 0x94, 0x18, 0x77, 0xE4, 0x79, 0x04 }, }, { - { 0xF6, 0x54, 0x6B, 0x2F, 0xFE, 0x2B, 0xAE, 0xF7, 0x35, 0xE8, 0x25, 0x67, 0xA6, 0xE2, 0x36, 0x75, - 0x03, 0x94, 0xC1, 0x19, 0x14, 0x09, 0x87, 0x0C, 0x6F, 0xBE, 0x95, 0x2D, 0x08, 0xA3, 0x3A, 0xBA }, + { 0xE2, 0xF3, 0x9A, 0x9D, 0x48, 0xA3, 0x22, 0x10, 0x55, 0xB3, 0xC8, 0xA3, 0xEB, 0x14, 0x39, 0xD6, + 0xB8, 0x73, 0x01, 0x3E, 0xE4, 0xD0, 0x97, 0x12, 0x20, 0x64, 0xF2, 0x7E, 0xC0, 0x3D, 0xD4, 0xDA }, }, { - { 0xF6, 0x6E, 0xDF, 0xF6, 0xA3, 0x94, 0xC6, 0x6D, 0xF5, 0xBF, 0x9F, 0xE7, 0x84, 0xE6, 0x31, 0xF7, - 0x9A, 0xF3, 0x9C, 0xB1, 0x4F, 0x3A, 0xC5, 0x16, 0x11, 0xF6, 0xFE, 0x1D, 0x9D, 0x1E, 0x1C, 0xE9 }, + { 0xE2, 0xF5, 0xDE, 0x57, 0xCD, 0x67, 0x24, 0x9A, 0x7E, 0x1F, 0x45, 0x5B, 0x85, 0xC0, 0x6F, 0x0D, + 0x80, 0x9E, 0x75, 0xA5, 0x5C, 0x6B, 0x05, 0x48, 0x16, 0xE0, 0x19, 0x89, 0x9A, 0x3A, 0x02, 0xFF }, }, { - { 0xF6, 0x93, 0x79, 0x9B, 0xBD, 0xF1, 0xFF, 0x89, 0xBA, 0x48, 0xF2, 0xBF, 0xE2, 0x8F, 0x89, 0x36, - 0x6A, 0xC3, 0xB4, 0x13, 0x54, 0x7D, 0xB8, 0x06, 0x0D, 0xB5, 0x07, 0xAB, 0xC9, 0x42, 0x0B, 0xA8 }, + { 0xE6, 0x44, 0xD1, 0x1C, 0x37, 0x07, 0x0F, 0x89, 0x69, 0x33, 0x08, 0x17, 0x8D, 0x6B, 0xE4, 0x95, + 0x94, 0x96, 0x92, 0xC1, 0xFB, 0xEB, 0x30, 0xED, 0x32, 0x9B, 0x74, 0x02, 0x7F, 0xCF, 0xFD, 0x48 }, }, { - { 0xF6, 0x9D, 0x95, 0x42, 0xDB, 0x97, 0xEC, 0x65, 0xBF, 0xF8, 0x45, 0x23, 0x0A, 0xDC, 0x76, 0xB0, - 0x3C, 0x15, 0x91, 0x2F, 0x6F, 0x09, 0x97, 0x32, 0x9D, 0x5C, 0x2D, 0x14, 0xF6, 0xB2, 0x5E, 0xDF }, + { 0xE6, 0xB0, 0xF2, 0xE2, 0x5B, 0xD5, 0x16, 0xE4, 0xBB, 0xA3, 0x7A, 0x2B, 0xF2, 0xE2, 0xC7, 0x2A, + 0x1E, 0x53, 0x9C, 0x60, 0x30, 0xF3, 0xCF, 0x9B, 0xBE, 0x5E, 0x79, 0x72, 0x8D, 0x68, 0x64, 0x78 }, }, { - { 0xF6, 0xA8, 0x1F, 0x59, 0xB1, 0x13, 0xBA, 0xB9, 0x52, 0xD6, 0x2B, 0xDA, 0xB9, 0x70, 0xC8, 0xEE, - 0xD9, 0xF7, 0x26, 0x22, 0xFA, 0x8A, 0xC6, 0xD8, 0x48, 0xC3, 0xE2, 0xC6, 0x14, 0x62, 0xEF, 0x95 }, + { 0xE6, 0xE5, 0x4D, 0xE7, 0xB4, 0x97, 0x54, 0xD3, 0x57, 0xB0, 0xA8, 0xD9, 0x4A, 0x4D, 0x4F, 0x80, + 0xAC, 0xD1, 0x99, 0x4C, 0xCC, 0x1C, 0x99, 0x08, 0xE9, 0xF0, 0xD9, 0x21, 0xE4, 0x28, 0xB8, 0x38 }, }, { - { 0xF6, 0xAA, 0xEF, 0x12, 0xFC, 0x25, 0x2D, 0xD9, 0xE7, 0xF7, 0x75, 0x2C, 0x2F, 0x74, 0x5D, 0x59, - 0xD6, 0x37, 0x57, 0xC6, 0xCC, 0x14, 0xD2, 0x25, 0x3A, 0x64, 0x7C, 0xD1, 0x81, 0x49, 0x39, 0x93 }, + { 0xE7, 0x0C, 0xBB, 0x7A, 0xF7, 0xAA, 0x20, 0xB9, 0x89, 0x0B, 0xC1, 0xF9, 0xFA, 0x00, 0xD8, 0x09, + 0x0B, 0x5A, 0xC9, 0x82, 0x5E, 0xA9, 0xD2, 0xFD, 0xF7, 0x7C, 0xA4, 0xDA, 0xE9, 0x44, 0x51, 0xB2 }, }, { - { 0xF6, 0xE3, 0x03, 0x5A, 0xEC, 0xC9, 0xC9, 0x6B, 0x03, 0xE9, 0x73, 0x71, 0xF3, 0x60, 0xF5, 0xBA, - 0x02, 0x14, 0x13, 0x81, 0x27, 0x5D, 0x71, 0xC1, 0x41, 0xEA, 0xF6, 0x3A, 0x06, 0x55, 0x23, 0x07 }, + { 0xE8, 0x16, 0xF9, 0x92, 0x94, 0xA1, 0x3A, 0xC2, 0xFA, 0x2B, 0xFB, 0x76, 0xC2, 0x2D, 0xFA, 0x71, + 0xBC, 0x3D, 0xA4, 0x8F, 0x67, 0x1E, 0xF7, 0x7C, 0x00, 0xAA, 0x8E, 0x45, 0x9B, 0x7C, 0xC8, 0x2A }, }, { - { 0xF6, 0xFE, 0xB3, 0x88, 0x25, 0xE6, 0xEE, 0x7B, 0xA5, 0xBF, 0xD9, 0x4B, 0xB5, 0x77, 0x12, 0xA4, - 0x14, 0x1E, 0xB8, 0xD0, 0x92, 0xBB, 0x2D, 0x5D, 0xD1, 0x64, 0xF6, 0x74, 0xA2, 0xE5, 0xB0, 0x64 }, + { 0xE8, 0x21, 0x3C, 0x45, 0x51, 0x81, 0x61, 0xBC, 0x36, 0x37, 0x3D, 0xCD, 0x2D, 0x4B, 0x21, 0xB7, + 0x6A, 0x7C, 0x06, 0x6D, 0xF5, 0x52, 0x6E, 0x88, 0x8B, 0x6E, 0xED, 0x09, 0xA9, 0xEE, 0xD0, 0x62 }, }, { - { 0xF7, 0x22, 0xE3, 0x21, 0x67, 0xF0, 0x0D, 0x96, 0xEB, 0x35, 0xF9, 0xB9, 0x43, 0xD2, 0x56, 0x26, - 0x5B, 0xA5, 0x5E, 0x70, 0x34, 0x6D, 0x8C, 0xEE, 0x54, 0x48, 0x29, 0xC2, 0xB0, 0x9B, 0x95, 0x90 }, + { 0xE9, 0xF5, 0x71, 0xC7, 0x71, 0x64, 0xAB, 0xEA, 0xE1, 0x85, 0x28, 0x37, 0x5C, 0xFD, 0xC7, 0x21, + 0x9A, 0x6B, 0xDE, 0x46, 0x1B, 0x19, 0x73, 0xBE, 0x2B, 0xB8, 0xBD, 0xF0, 0xDA, 0x78, 0xB2, 0xB4 }, }, { - { 0xF7, 0x76, 0x3B, 0xE8, 0x7E, 0x67, 0x8B, 0x31, 0x18, 0x66, 0x11, 0x9A, 0xD5, 0xAC, 0xDF, 0x8F, - 0xDB, 0x3B, 0xBB, 0x46, 0x5B, 0x83, 0x40, 0x61, 0x64, 0xAC, 0x21, 0x30, 0x34, 0xE8, 0xAD, 0x0E }, + { 0xEB, 0x11, 0x63, 0xAA, 0xEF, 0xE8, 0xFD, 0x88, 0xE1, 0x32, 0x7B, 0x48, 0xA9, 0xC0, 0x06, 0x2E, + 0x06, 0xF0, 0xA6, 0xEA, 0xA0, 0xA0, 0x18, 0x24, 0x7F, 0x9F, 0xA4, 0xE3, 0x4E, 0x3A, 0x47, 0x4C }, }, { - { 0xF7, 0x77, 0x35, 0xCE, 0xE3, 0x38, 0x5C, 0xEC, 0xBC, 0x88, 0x4A, 0x54, 0xCE, 0x7F, 0xB1, 0x78, - 0xA0, 0x40, 0x3C, 0x3E, 0x2B, 0x16, 0x9E, 0x49, 0xF9, 0x38, 0xA8, 0x1D, 0xAD, 0x15, 0xDC, 0x1C }, + { 0xEC, 0x4B, 0xBD, 0xEB, 0x15, 0x12, 0x1D, 0x96, 0x76, 0x4D, 0x6C, 0x01, 0xB2, 0x7E, 0xD5, 0xAE, + 0x86, 0x46, 0x5C, 0x46, 0xD5, 0xA4, 0x0E, 0x34, 0xAE, 0xFC, 0x09, 0x2D, 0x3E, 0x8B, 0xB1, 0x76 }, }, { - { 0xF7, 0xB5, 0x97, 0x11, 0xCA, 0xE9, 0x11, 0xEF, 0x56, 0xC8, 0x1B, 0x54, 0x03, 0x6F, 0x21, 0x32, - 0xEC, 0xFA, 0x0F, 0x09, 0x08, 0x90, 0xAF, 0xCA, 0x7E, 0x16, 0x39, 0x4E, 0xD4, 0x99, 0xE8, 0x0C }, + { 0xEC, 0x5F, 0xA4, 0x73, 0x12, 0x1E, 0x3F, 0x49, 0xF0, 0x95, 0x3A, 0x2A, 0x91, 0x83, 0x39, 0xE3, + 0x6F, 0x3C, 0xB6, 0xB8, 0xD8, 0xB8, 0x9E, 0x91, 0x74, 0x23, 0xDA, 0xCE, 0xAC, 0xE6, 0xD5, 0x8A }, }, { - { 0xF7, 0xD9, 0x10, 0xBC, 0xE2, 0xAB, 0x1A, 0xCA, 0xA6, 0x7B, 0x66, 0x3A, 0x8A, 0xDD, 0xBD, 0xA2, - 0x93, 0xB5, 0x1C, 0xED, 0xE7, 0x86, 0x8B, 0x69, 0xA3, 0xCE, 0xA7, 0xFF, 0xD0, 0x10, 0xB3, 0xA8 }, + { 0xEC, 0xCE, 0x4E, 0x52, 0x82, 0xFD, 0x2E, 0xE0, 0x03, 0xA4, 0x03, 0x2C, 0x80, 0xD3, 0x32, 0x1A, + 0x69, 0x47, 0x25, 0x98, 0x94, 0x59, 0x09, 0xCB, 0x25, 0x55, 0x7A, 0xA8, 0x47, 0x74, 0x2D, 0xDF }, }, { - { 0xF8, 0x0C, 0x71, 0x5B, 0x84, 0x49, 0x5D, 0xBE, 0xDA, 0xBF, 0xEB, 0x1B, 0x05, 0x7F, 0xA0, 0x80, - 0x93, 0x10, 0x5D, 0x74, 0x6F, 0x8D, 0x4F, 0x10, 0x35, 0xD4, 0xE1, 0xD8, 0x6B, 0xE2, 0xB4, 0x80 }, + { 0xED, 0x5B, 0xB8, 0x6A, 0x95, 0xA5, 0xFE, 0x2B, 0x17, 0x08, 0xF2, 0x56, 0x75, 0x4A, 0x89, 0xC4, + 0x29, 0x67, 0x9B, 0x30, 0x75, 0x8E, 0xE0, 0x12, 0x2B, 0x9E, 0x50, 0x85, 0x8D, 0xE2, 0x10, 0x4B }, }, { - { 0xF8, 0x24, 0x21, 0x09, 0xF2, 0x80, 0xE3, 0x51, 0xBF, 0xD6, 0x11, 0x95, 0xF8, 0x84, 0x52, 0x5D, - 0xC8, 0xE0, 0x64, 0xD6, 0x85, 0x07, 0x57, 0x49, 0x52, 0x08, 0x3F, 0xAD, 0xCD, 0xCB, 0x91, 0x4B }, + { 0xED, 0xC1, 0xBF, 0x3E, 0xFB, 0xF7, 0xE1, 0xD9, 0x5E, 0x19, 0xC5, 0x5E, 0xCA, 0xE7, 0x7E, 0x83, + 0x69, 0x46, 0xAB, 0x0A, 0x26, 0xA7, 0x8E, 0x32, 0xA4, 0x72, 0xC9, 0xD3, 0x6C, 0x69, 0xCE, 0xCD }, }, { - { 0xF8, 0x2C, 0xC3, 0xC4, 0x5E, 0x9F, 0x62, 0x42, 0x7D, 0xFF, 0xE7, 0x8F, 0x48, 0x8D, 0x5B, 0x5F, - 0x79, 0x2A, 0xF0, 0xBE, 0x06, 0x5D, 0xDD, 0x59, 0xCA, 0x2C, 0x28, 0x61, 0xFB, 0x32, 0xC3, 0x2A }, + { 0xED, 0xF4, 0xDF, 0x97, 0x2C, 0xAD, 0x6C, 0x47, 0x0B, 0xAB, 0x5D, 0x66, 0x42, 0xF6, 0x60, 0xB8, + 0x42, 0xD6, 0xC9, 0x73, 0x07, 0x44, 0x93, 0xE4, 0xEF, 0x1B, 0xBF, 0x31, 0x1A, 0x92, 0x79, 0x95 }, }, { - { 0xF8, 0x64, 0x44, 0x3E, 0x2F, 0x63, 0x9E, 0x7C, 0xFF, 0xD2, 0x42, 0x21, 0xF6, 0x1B, 0xBF, 0xF0, - 0x7C, 0xCE, 0x5C, 0x61, 0xDD, 0xB1, 0x68, 0xB3, 0xB4, 0x04, 0xD7, 0xC8, 0xCD, 0xCA, 0x18, 0xB2 }, + { 0xEE, 0x0C, 0xF6, 0x2B, 0x9D, 0x8E, 0x42, 0xA2, 0x23, 0xB9, 0xA9, 0x60, 0xB5, 0xE9, 0x67, 0x0C, + 0xCC, 0x34, 0x6D, 0x89, 0x93, 0x8F, 0xFA, 0x5D, 0xF7, 0x98, 0x65, 0xE4, 0x13, 0xD6, 0x31, 0x54 }, }, { - { 0xF8, 0x76, 0xC7, 0x3F, 0xAE, 0x72, 0x52, 0x5D, 0x4A, 0xD5, 0x26, 0x69, 0xBC, 0x5A, 0x34, 0xDC, - 0x8D, 0x46, 0x14, 0xE9, 0x3B, 0xFD, 0xEE, 0xEC, 0xA3, 0xD9, 0xBE, 0xCA, 0x97, 0x2E, 0xC6, 0xB8 }, + { 0xEE, 0x34, 0xE1, 0xA1, 0x9B, 0xC8, 0x89, 0xF8, 0x5F, 0x7F, 0x0F, 0x5B, 0xF8, 0x72, 0xB1, 0xAC, + 0x56, 0x5E, 0xC6, 0xF1, 0x9D, 0xB5, 0x17, 0xBA, 0x4E, 0xD7, 0x55, 0xC4, 0x18, 0x5F, 0x69, 0xE8 }, }, { - { 0xF8, 0x81, 0x51, 0xC3, 0xD8, 0x91, 0x6B, 0x1D, 0x03, 0xA0, 0x5F, 0x55, 0x85, 0xEC, 0x38, 0xAD, - 0x1C, 0xC0, 0x3A, 0x36, 0x2E, 0x68, 0x60, 0x8E, 0x39, 0x13, 0xED, 0xDF, 0xB1, 0xFD, 0xF1, 0x27 }, + { 0xEF, 0x36, 0xA2, 0x29, 0x89, 0x65, 0xE4, 0x98, 0x84, 0x59, 0xB9, 0x21, 0x6A, 0xB3, 0x3C, 0x3C, + 0xA8, 0x42, 0xD2, 0x16, 0x83, 0xB6, 0x2A, 0x2B, 0xF1, 0x53, 0x0D, 0x30, 0xB0, 0xAE, 0x78, 0x25 }, }, { - { 0xF8, 0x94, 0xF9, 0x67, 0x36, 0x9C, 0xE7, 0xCF, 0xA3, 0x1A, 0xC1, 0x9A, 0x66, 0x65, 0xB0, 0xC4, - 0x24, 0xBA, 0x40, 0x8A, 0xD5, 0xD3, 0x65, 0xF1, 0x68, 0xD8, 0xBE, 0xEB, 0x79, 0xF4, 0x89, 0xF3 }, + { 0xEF, 0xAF, 0xCA, 0x84, 0x90, 0x30, 0x7B, 0x0F, 0x62, 0x2B, 0xF4, 0x3A, 0x0E, 0xB3, 0xC5, 0x1A, + 0xCB, 0xDD, 0xDE, 0xDC, 0x23, 0x92, 0xF1, 0x61, 0xAC, 0xED, 0x16, 0x71, 0xA6, 0x53, 0x60, 0x7E }, }, { - { 0xF8, 0xCF, 0x1E, 0x08, 0x6A, 0x6A, 0x06, 0x3F, 0xAD, 0x25, 0x74, 0x25, 0xAA, 0xE7, 0x20, 0x01, - 0x40, 0x05, 0xB4, 0x15, 0x91, 0x2D, 0xBB, 0x8C, 0x0B, 0xC9, 0x99, 0xAF, 0x48, 0x48, 0xCF, 0xE5 }, + { 0xEF, 0xD1, 0xE0, 0xE7, 0x3F, 0xA8, 0x71, 0x00, 0xB7, 0x6A, 0x93, 0x23, 0x49, 0xC4, 0x5D, 0x09, + 0xB2, 0x8B, 0x2D, 0x8A, 0x00, 0x17, 0x19, 0xA5, 0x8D, 0xFA, 0xCC, 0x74, 0x84, 0xC7, 0xCF, 0x42 }, }, { - { 0xF9, 0x0E, 0x7C, 0x21, 0x81, 0xBA, 0x53, 0x4D, 0xCF, 0x5B, 0xB6, 0xDB, 0xF7, 0xF9, 0xAD, 0xA3, - 0xFF, 0x98, 0xDE, 0x50, 0x0C, 0xBD, 0x42, 0x12, 0xC0, 0xD1, 0xFA, 0x05, 0x82, 0x80, 0xFD, 0x57 }, + { 0xF0, 0x11, 0xAD, 0x9E, 0xDD, 0x4F, 0xE7, 0x18, 0x8D, 0x77, 0x2E, 0xBA, 0xFA, 0x5B, 0xF5, 0x32, + 0x92, 0x47, 0x77, 0x88, 0xDC, 0x12, 0x80, 0x32, 0x76, 0xB0, 0x00, 0xC4, 0x41, 0x91, 0x03, 0xF0 }, }, { - { 0xF9, 0x29, 0xC1, 0x0E, 0x66, 0x15, 0xB3, 0xE7, 0x1F, 0xDA, 0x31, 0xF1, 0xB7, 0x1A, 0x44, 0x47, - 0x00, 0x7E, 0xE3, 0x7A, 0x39, 0x3C, 0x32, 0xE0, 0xFB, 0x34, 0xFC, 0xF1, 0x05, 0x5D, 0x51, 0x8F }, + { 0xF0, 0x2F, 0x9D, 0xA4, 0x5D, 0x9E, 0xB9, 0x86, 0x19, 0x4E, 0x06, 0xF5, 0xE6, 0x18, 0x95, 0x45, + 0x12, 0xC9, 0x02, 0x6E, 0x7C, 0xA7, 0xB5, 0x1E, 0x66, 0x5D, 0xB6, 0xAD, 0xBA, 0xC1, 0xF6, 0x00 }, }, { - { 0xF9, 0x8B, 0x43, 0x93, 0xF7, 0xC3, 0x1D, 0x37, 0x03, 0x49, 0x81, 0x63, 0xE7, 0x77, 0x9F, 0x75, - 0xDE, 0xF6, 0xAF, 0x44, 0x10, 0x44, 0x6A, 0x03, 0x4D, 0x52, 0x8C, 0xB7, 0x14, 0x3A, 0xA0, 0x13 }, + { 0xF0, 0x6B, 0x35, 0x95, 0x36, 0xD1, 0x34, 0x32, 0x8B, 0x36, 0x00, 0x4D, 0xA9, 0xA9, 0x19, 0x0C, + 0x3A, 0x76, 0x69, 0xE8, 0x27, 0x8D, 0xB9, 0xF7, 0x58, 0x57, 0xC4, 0x8D, 0x64, 0x4B, 0xE2, 0x03 }, }, { - { 0xF9, 0xA7, 0xDD, 0xD3, 0xFF, 0x51, 0xAF, 0x30, 0x7F, 0x95, 0x4F, 0x7B, 0x44, 0xDB, 0xD2, 0x42, - 0x83, 0xCF, 0x97, 0xB6, 0x25, 0xBE, 0x76, 0x6B, 0x43, 0x5E, 0x6C, 0x26, 0xD9, 0xCC, 0xAC, 0xC3 }, + { 0xF0, 0xCF, 0xC7, 0x79, 0x13, 0x39, 0x7D, 0xE2, 0x38, 0xED, 0xB5, 0x9F, 0x0F, 0x99, 0x23, 0xC6, + 0xD4, 0x11, 0x0A, 0x4B, 0x3A, 0xC8, 0xAC, 0x76, 0x55, 0x6A, 0x0C, 0x92, 0x44, 0xF0, 0x3F, 0xC1 }, }, { - { 0xF9, 0xAF, 0xE7, 0x1B, 0xF1, 0xF4, 0x1B, 0xCD, 0xE6, 0x4F, 0x3F, 0x35, 0x82, 0x60, 0xE7, 0x74, - 0x18, 0x76, 0x18, 0x8D, 0xE6, 0x99, 0x04, 0xA6, 0xD0, 0xB6, 0x3A, 0x32, 0x93, 0x02, 0xFA, 0x3D }, + { 0xF2, 0xB1, 0x95, 0x84, 0x6E, 0xE2, 0xB9, 0xAB, 0x5F, 0x18, 0xE6, 0x80, 0x21, 0xF8, 0xDF, 0x7C, + 0x0B, 0x60, 0x58, 0xDE, 0xDE, 0x86, 0xC5, 0xD5, 0x90, 0xF2, 0xE8, 0x64, 0x3A, 0xFE, 0x04, 0x52 }, }, { - { 0xF9, 0xF5, 0xFD, 0xAE, 0x79, 0x59, 0x07, 0x40, 0xB3, 0x85, 0xA8, 0x33, 0x12, 0x7A, 0x28, 0x21, - 0xFB, 0x9D, 0x03, 0xC0, 0xC6, 0xA1, 0xBE, 0x42, 0xEB, 0x2A, 0xBF, 0xD2, 0x0D, 0xF6, 0xB7, 0xB9 }, + { 0xF2, 0xE5, 0x30, 0x0C, 0x39, 0xF2, 0x86, 0xC6, 0x78, 0x99, 0x90, 0x9C, 0x7C, 0xE7, 0x35, 0x9B, + 0x09, 0x45, 0xD2, 0xAF, 0xD3, 0x4A, 0x6D, 0xD6, 0x9E, 0x08, 0xCD, 0xA5, 0x44, 0xC8, 0x7B, 0x3A }, }, { - { 0xF9, 0xFB, 0xFD, 0xD0, 0x91, 0x50, 0x4F, 0x93, 0x08, 0xBC, 0xA0, 0xE3, 0x03, 0x1B, 0xDE, 0x76, - 0x36, 0x62, 0x6B, 0x1E, 0x53, 0x6E, 0xCF, 0xAE, 0x7B, 0xB7, 0x34, 0xC2, 0xE6, 0xD0, 0xE9, 0xDE }, + { 0xF3, 0x0C, 0x0A, 0xED, 0x70, 0x6D, 0x22, 0x55, 0x5F, 0x07, 0x09, 0x6A, 0xF4, 0xB8, 0xBE, 0xDC, + 0x16, 0x3C, 0x0F, 0x6E, 0xD5, 0x34, 0x6E, 0xFC, 0x28, 0xE8, 0xCF, 0xAF, 0x84, 0x2F, 0xA5, 0xD9 }, }, { - { 0xFA, 0x2A, 0x2F, 0x77, 0x8C, 0xBE, 0xF9, 0xF1, 0xB4, 0xA8, 0xFC, 0x57, 0xBF, 0x79, 0x5F, 0x1F, - 0x8C, 0xF6, 0x23, 0xDB, 0x15, 0xBE, 0x65, 0x81, 0xEB, 0xA3, 0x6B, 0x2A, 0x86, 0x49, 0xD2, 0x1E }, + { 0xF6, 0x13, 0xD5, 0x90, 0x46, 0xD1, 0x66, 0x71, 0xD3, 0xC5, 0x60, 0x17, 0x6F, 0x3D, 0x77, 0xFD, + 0xC5, 0x1E, 0x5F, 0x57, 0xB5, 0xE4, 0x8A, 0xE7, 0xA4, 0xB9, 0x70, 0x0A, 0x11, 0xD4, 0x69, 0x3A }, }, { - { 0xFA, 0x50, 0x6B, 0xD0, 0x69, 0x4B, 0x92, 0x94, 0xB9, 0x9F, 0x7B, 0x5C, 0x90, 0x07, 0xCE, 0x13, - 0xA6, 0x03, 0x07, 0xF4, 0xC5, 0x94, 0xEB, 0xFB, 0xE7, 0xB3, 0x4A, 0x05, 0x50, 0xAE, 0x3D, 0x4F }, + { 0xF6, 0x54, 0x6B, 0x2F, 0xFE, 0x2B, 0xAE, 0xF7, 0x35, 0xE8, 0x25, 0x67, 0xA6, 0xE2, 0x36, 0x75, + 0x03, 0x94, 0xC1, 0x19, 0x14, 0x09, 0x87, 0x0C, 0x6F, 0xBE, 0x95, 0x2D, 0x08, 0xA3, 0x3A, 0xBA }, }, { - { 0xFA, 0x83, 0xFB, 0xD3, 0x29, 0x80, 0xB9, 0x55, 0x23, 0xDA, 0xFA, 0xED, 0xFE, 0x15, 0x0E, 0x91, - 0xFF, 0x80, 0xEB, 0xDC, 0xB2, 0xB7, 0x8D, 0x9E, 0x9C, 0x3A, 0x70, 0xFD, 0x79, 0x85, 0x1B, 0x69 }, + { 0xF6, 0xAA, 0xEF, 0x12, 0xFC, 0x25, 0x2D, 0xD9, 0xE7, 0xF7, 0x75, 0x2C, 0x2F, 0x74, 0x5D, 0x59, + 0xD6, 0x37, 0x57, 0xC6, 0xCC, 0x14, 0xD2, 0x25, 0x3A, 0x64, 0x7C, 0xD1, 0x81, 0x49, 0x39, 0x93 }, }, { - { 0xFA, 0x95, 0xB3, 0xF9, 0x6F, 0xC9, 0xC2, 0xD3, 0xA7, 0x9B, 0x05, 0x48, 0x67, 0x6C, 0x18, 0x48, - 0x5A, 0xF1, 0x10, 0x4C, 0xCA, 0x9B, 0xB6, 0xB8, 0xDD, 0x9B, 0x5A, 0x54, 0x3C, 0xB6, 0xC6, 0x2E }, + { 0xF8, 0x64, 0x44, 0x3E, 0x2F, 0x63, 0x9E, 0x7C, 0xFF, 0xD2, 0x42, 0x21, 0xF6, 0x1B, 0xBF, 0xF0, + 0x7C, 0xCE, 0x5C, 0x61, 0xDD, 0xB1, 0x68, 0xB3, 0xB4, 0x04, 0xD7, 0xC8, 0xCD, 0xCA, 0x18, 0xB2 }, }, { - { 0xFA, 0xE4, 0x72, 0x1E, 0x39, 0x47, 0xA5, 0x0D, 0xD0, 0x4D, 0x16, 0xAC, 0xEF, 0xF3, 0x55, 0xC0, - 0x87, 0xB7, 0xE2, 0x24, 0x6B, 0xE6, 0x0F, 0xBC, 0x26, 0x2A, 0x53, 0x52, 0xAD, 0xAC, 0x18, 0x01 }, + { 0xF8, 0x94, 0xF9, 0x67, 0x36, 0x9C, 0xE7, 0xCF, 0xA3, 0x1A, 0xC1, 0x9A, 0x66, 0x65, 0xB0, 0xC4, + 0x24, 0xBA, 0x40, 0x8A, 0xD5, 0xD3, 0x65, 0xF1, 0x68, 0xD8, 0xBE, 0xEB, 0x79, 0xF4, 0x89, 0xF3 }, }, { - { 0xFB, 0x44, 0x15, 0x70, 0x4C, 0x1D, 0x61, 0x55, 0x10, 0x6D, 0x88, 0xF3, 0xB2, 0x0F, 0xEC, 0x9F, - 0x6E, 0x82, 0x0C, 0x82, 0x24, 0xFE, 0xE3, 0x5E, 0x45, 0x22, 0x85, 0x19, 0x05, 0xF3, 0x28, 0xD7 }, + { 0xF8, 0xCF, 0x1E, 0x08, 0x6A, 0x6A, 0x06, 0x3F, 0xAD, 0x25, 0x74, 0x25, 0xAA, 0xE7, 0x20, 0x01, + 0x40, 0x05, 0xB4, 0x15, 0x91, 0x2D, 0xBB, 0x8C, 0x0B, 0xC9, 0x99, 0xAF, 0x48, 0x48, 0xCF, 0xE5 }, }, { { 0xFB, 0x9A, 0xF7, 0x9D, 0xEA, 0x18, 0xAF, 0x62, 0x99, 0x85, 0x0E, 0x25, 0x15, 0x9B, 0x4F, 0xB2, @@ -5592,10 +1588,6 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0xFB, 0xC4, 0xC9, 0xBA, 0xCF, 0xE3, 0xDA, 0x64, 0x13, 0x18, 0x26, 0x6B, 0x72, 0x58, 0x56, 0x00, 0x35, 0xBC, 0x64, 0x60, 0x8E, 0x34, 0xB9, 0x90, 0xCA, 0x92, 0xA5, 0x52, 0xF3, 0x14, 0x21, 0x61 }, }, - { - { 0xFB, 0xDD, 0x65, 0xD5, 0x6E, 0x48, 0x0C, 0xD2, 0x53, 0x1B, 0xAB, 0xFB, 0x98, 0xAD, 0x6E, 0x35, - 0x22, 0x1E, 0xB9, 0x8A, 0xE4, 0x63, 0x2C, 0x43, 0x12, 0xDB, 0x75, 0x17, 0xB1, 0x36, 0x54, 0x72 }, - }, { { 0xFB, 0xED, 0xD3, 0x88, 0x89, 0xF0, 0xB4, 0x1F, 0x73, 0x4D, 0xE2, 0xF4, 0xC9, 0xD6, 0xF2, 0x7C, 0x8D, 0x4A, 0xA9, 0xAB, 0x73, 0x64, 0x91, 0xE1, 0x64, 0xE1, 0x21, 0xB7, 0xBC, 0xAF, 0x44, 0xE8 }, @@ -5604,26 +1596,10 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0xFC, 0x01, 0xA5, 0x5A, 0x36, 0xCC, 0x8B, 0x7B, 0x7C, 0xA2, 0xEA, 0xB0, 0x84, 0x60, 0xC2, 0x8D, 0x1D, 0x6C, 0xD8, 0x9C, 0x57, 0x59, 0x94, 0x05, 0xD5, 0x37, 0x4B, 0x91, 0xAA, 0xEB, 0xC8, 0x79 }, }, - { - { 0xFC, 0x11, 0xD0, 0x51, 0xC2, 0x7A, 0x33, 0xA2, 0xE8, 0x1C, 0xB7, 0x20, 0xA9, 0xE6, 0xD8, 0xA7, - 0xFE, 0x3C, 0x5D, 0x94, 0x13, 0x9C, 0xBA, 0x0F, 0x5E, 0xAA, 0x61, 0xBA, 0xBE, 0x34, 0x1A, 0x8B }, - }, - { - { 0xFC, 0x2F, 0x1E, 0x84, 0x29, 0x82, 0xC9, 0x3B, 0x85, 0xD2, 0x79, 0xA8, 0x3D, 0xF2, 0x13, 0xC1, - 0xA3, 0x33, 0x29, 0x7D, 0x42, 0xA3, 0x1A, 0x8C, 0xC7, 0x8A, 0x3F, 0x73, 0xCD, 0xF8, 0xAF, 0x9A }, - }, { { 0xFC, 0x4D, 0x9A, 0x37, 0xE5, 0xF7, 0x32, 0x72, 0xD0, 0xA9, 0xDF, 0xCC, 0xE9, 0x03, 0x12, 0xC7, 0x52, 0xE1, 0xB5, 0x2E, 0xB6, 0x54, 0xC4, 0x2C, 0x36, 0x94, 0x4B, 0x90, 0x2A, 0x30, 0x41, 0x07 }, }, - { - { 0xFC, 0x53, 0x0D, 0x33, 0x87, 0x60, 0xB5, 0x92, 0x47, 0x55, 0xE1, 0x55, 0x62, 0x34, 0xF0, 0x2D, - 0x84, 0x04, 0x71, 0x11, 0x08, 0xF1, 0xB7, 0xC8, 0xE4, 0x8C, 0x05, 0xDB, 0x84, 0xF8, 0xBA, 0x7F }, - }, - { - { 0xFC, 0x55, 0x86, 0x91, 0xDA, 0xFF, 0xE1, 0xE3, 0x53, 0x8D, 0x38, 0xA6, 0xD3, 0xA9, 0xE6, 0xE7, - 0xC9, 0x9D, 0x24, 0x0C, 0x86, 0x89, 0x66, 0x73, 0x56, 0x27, 0x99, 0x72, 0xFB, 0x4F, 0x30, 0x85 }, - }, { { 0xFC, 0x56, 0xDB, 0xA1, 0xE7, 0xAF, 0xBD, 0xAA, 0x07, 0x33, 0xC6, 0x91, 0x1C, 0x5F, 0x1F, 0x18, 0x28, 0xCB, 0x12, 0x98, 0x31, 0x40, 0x1A, 0x3C, 0xFD, 0xEA, 0xA7, 0x24, 0x62, 0x95, 0x35, 0x94 }, @@ -5636,30 +1612,10 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0xFC, 0xA6, 0x23, 0x5D, 0x2A, 0xA4, 0xB1, 0xB2, 0x51, 0x50, 0x78, 0x57, 0xB4, 0xF0, 0x08, 0xDF, 0xD5, 0x27, 0x04, 0x2C, 0xE0, 0x45, 0x01, 0xAA, 0xE2, 0x9D, 0xD2, 0x05, 0xBB, 0xEF, 0xCE, 0x0D }, }, - { - { 0xFC, 0xB7, 0xFE, 0x6D, 0x32, 0x2D, 0x87, 0xC7, 0x51, 0x59, 0x47, 0x79, 0x50, 0x88, 0x95, 0x8A, - 0x5F, 0x75, 0xBF, 0xF1, 0x18, 0x40, 0x21, 0xEF, 0x05, 0xD6, 0xF4, 0xD3, 0xC4, 0x3B, 0x85, 0xC5 }, - }, - { - { 0xFC, 0xE5, 0x47, 0xE1, 0x43, 0x54, 0x87, 0x7F, 0xED, 0x93, 0x0B, 0x19, 0xFD, 0xE7, 0xC6, 0xF9, - 0xCB, 0xF5, 0xD4, 0xB5, 0x7B, 0xA5, 0x34, 0x4A, 0x0D, 0x40, 0x10, 0xFF, 0x70, 0x5A, 0x03, 0xDE }, - }, { { 0xFC, 0xE7, 0x34, 0xE1, 0x2B, 0x8E, 0xFB, 0x43, 0x12, 0x71, 0xBF, 0xF6, 0x7A, 0x7A, 0x0A, 0x93, 0xB2, 0x19, 0xDD, 0x5E, 0x5D, 0xCC, 0x12, 0x58, 0x59, 0x4D, 0x96, 0xFC, 0xE1, 0x93, 0xB8, 0x60 }, }, - { - { 0xFC, 0xF6, 0x81, 0x39, 0x64, 0x2F, 0x8D, 0x79, 0xA4, 0x86, 0x15, 0xE4, 0x44, 0xCE, 0xD6, 0x90, - 0xFA, 0x60, 0xEB, 0xFD, 0x0A, 0x06, 0x0A, 0x49, 0x93, 0x89, 0x98, 0x8A, 0x2C, 0x2C, 0x05, 0xCE }, - }, - { - { 0xFD, 0x44, 0x89, 0xF0, 0x27, 0x27, 0xDB, 0x36, 0xC1, 0x84, 0x35, 0xE5, 0xC4, 0xA9, 0xF8, 0x63, - 0xAC, 0xD8, 0x04, 0xAE, 0x1B, 0x39, 0x7F, 0xBB, 0x83, 0xD4, 0x27, 0x5A, 0xF5, 0x6D, 0xF8, 0x9F }, - }, - { - { 0xFD, 0x85, 0xCC, 0x72, 0x1B, 0x77, 0xC4, 0x41, 0xC8, 0xB1, 0xF1, 0x4A, 0xDE, 0x34, 0x8A, 0x3E, - 0xC9, 0xFA, 0xA6, 0x26, 0x4A, 0x91, 0x3F, 0xB8, 0xD3, 0x4C, 0x98, 0x3B, 0x43, 0x60, 0xE9, 0x7B }, - }, { { 0xFD, 0x9C, 0xFE, 0x14, 0xDA, 0xD8, 0x97, 0x8C, 0x5B, 0xC8, 0x88, 0x93, 0x8F, 0x16, 0xF3, 0xB3, 0x98, 0xF7, 0x63, 0xA3, 0xAD, 0xAF, 0xAA, 0x4A, 0xD9, 0x41, 0xB7, 0xE3, 0x87, 0xEB, 0x4F, 0x4A }, @@ -5668,10 +1624,6 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0xFD, 0xED, 0x92, 0xCB, 0x40, 0x91, 0x66, 0x82, 0x3A, 0x35, 0xE2, 0x17, 0xF3, 0x0B, 0x38, 0xC4, 0x86, 0xF8, 0x3E, 0xF2, 0xD4, 0xF2, 0x7B, 0x05, 0xF1, 0x8C, 0x74, 0x49, 0x81, 0x33, 0x9A, 0x1C }, }, - { - { 0xFE, 0x0F, 0x6A, 0xDC, 0x4C, 0xB9, 0xA1, 0x3F, 0xCB, 0xAF, 0xD8, 0x98, 0xC1, 0xBB, 0x53, 0xB3, - 0xD9, 0x33, 0x74, 0x49, 0x9D, 0xF3, 0x47, 0xB7, 0x1F, 0x13, 0x4C, 0x94, 0x3C, 0x4F, 0xF1, 0x20 }, - }, { { 0xFE, 0x26, 0xB2, 0xA6, 0x45, 0xA3, 0x1A, 0x91, 0x11, 0x00, 0x09, 0x9A, 0xA9, 0xA2, 0x93, 0x9F, 0x49, 0xE9, 0xFB, 0xEA, 0x64, 0x48, 0x7B, 0xDF, 0x68, 0xA5, 0x23, 0x70, 0x32, 0x92, 0xD6, 0xA0 }, @@ -5684,42 +1636,10 @@ static const struct WhitelistedCNNICHash WhitelistedCNNICHashes[] = { { 0xFE, 0x4F, 0x35, 0x6C, 0x7F, 0x9B, 0xFC, 0x17, 0xFF, 0xCB, 0x68, 0xD0, 0x76, 0x4E, 0xCB, 0x2A, 0x87, 0xCA, 0xA0, 0xAE, 0x4C, 0xB5, 0x66, 0x62, 0x21, 0x04, 0xD3, 0x6F, 0xFB, 0x52, 0xCB, 0x29 }, }, - { - { 0xFE, 0xAA, 0xBD, 0xD7, 0x92, 0xA4, 0x31, 0x68, 0x99, 0x98, 0x3E, 0xF5, 0x7B, 0xEA, 0x99, 0xBE, - 0x81, 0x15, 0x6D, 0x47, 0x9C, 0xDF, 0x7B, 0x81, 0xF5, 0x58, 0x49, 0x60, 0x92, 0xD3, 0x17, 0x16 }, - }, - { - { 0xFE, 0xB8, 0xF0, 0x0C, 0x83, 0xEA, 0x05, 0xBD, 0xA2, 0x85, 0x0E, 0xC5, 0xBB, 0x77, 0x43, 0xE4, - 0x42, 0xEB, 0xF4, 0x31, 0xE3, 0xBA, 0x75, 0x4A, 0xA2, 0xD9, 0x47, 0x5E, 0x98, 0x0B, 0x6E, 0x3A }, - }, - { - { 0xFE, 0xC5, 0xFF, 0x1D, 0x4E, 0x56, 0x49, 0xB0, 0x1F, 0xBA, 0xAB, 0xD9, 0x02, 0x2D, 0xBF, 0x86, - 0xA7, 0x60, 0x2D, 0x89, 0x04, 0x45, 0x1B, 0xF4, 0x93, 0xC4, 0xAF, 0xE1, 0x1C, 0x99, 0xAE, 0x07 }, - }, - { - { 0xFE, 0xFF, 0x60, 0xF2, 0xDA, 0x22, 0xC9, 0xDB, 0xBC, 0x3D, 0x10, 0x13, 0x1E, 0xE4, 0x39, 0xBA, - 0xE3, 0xE0, 0x0E, 0x58, 0xCC, 0xE0, 0xBD, 0x07, 0x4F, 0x55, 0xF7, 0x7C, 0x3B, 0x00, 0xF9, 0x35 }, - }, - { - { 0xFF, 0x0E, 0x31, 0x58, 0x55, 0x2A, 0x28, 0x10, 0xA9, 0x71, 0x3D, 0xE8, 0x3B, 0x03, 0x25, 0xA1, - 0x16, 0x4A, 0xA6, 0x0E, 0x9C, 0xE5, 0x74, 0x20, 0x1D, 0x6B, 0x9B, 0x8B, 0xEA, 0xBA, 0x1F, 0x47 }, - }, - { - { 0xFF, 0x4C, 0x40, 0xA0, 0x13, 0xA4, 0x1E, 0x5A, 0xDB, 0x23, 0x1A, 0x14, 0xA9, 0x77, 0xB5, 0x8C, - 0x4F, 0xE7, 0x8D, 0x0C, 0xA3, 0x5C, 0x59, 0x35, 0xE2, 0x22, 0x07, 0x21, 0xCC, 0x54, 0x14, 0xF3 }, - }, { { 0xFF, 0x82, 0x6E, 0x2D, 0x0C, 0xB7, 0x71, 0x68, 0x68, 0x67, 0x5A, 0xE4, 0xB4, 0x31, 0xB6, 0x37, 0x1E, 0x9F, 0x0C, 0xDF, 0xCC, 0xB4, 0x9D, 0x43, 0xBA, 0x30, 0x49, 0xBF, 0xDD, 0x2C, 0x41, 0xB1 }, }, - { - { 0xFF, 0xC9, 0x74, 0x1A, 0x5E, 0x6A, 0x5A, 0x7C, 0xC3, 0xBB, 0x10, 0xCA, 0x31, 0x3F, 0x97, 0x7A, - 0xA9, 0xCC, 0xC1, 0x92, 0x28, 0xDB, 0xE1, 0x39, 0xB0, 0xC2, 0xD9, 0xF1, 0xF4, 0x1D, 0x83, 0x1B }, - }, - { - { 0xFF, 0xD5, 0x3F, 0x73, 0x6D, 0x4E, 0x0D, 0xC3, 0xBE, 0x8E, 0x43, 0xD9, 0x15, 0x09, 0xE0, 0x44, - 0x79, 0x1D, 0x36, 0xD4, 0x49, 0x12, 0xA6, 0xFA, 0xBA, 0x52, 0x28, 0x25, 0x10, 0x0E, 0x0A, 0x7C }, - }, { { 0xFF, 0xDC, 0x6B, 0x85, 0xFE, 0x7B, 0x10, 0x83, 0xB5, 0x41, 0x6F, 0x80, 0x6F, 0xC2, 0x44, 0xB9, 0xE4, 0xDF, 0x42, 0x99, 0xFB, 0xE3, 0xF6, 0x81, 0xAF, 0x3F, 0x5C, 0xF4, 0x22, 0x5A, 0x8E, 0xAF }, From 535492d321fe44c25af8579ab8b794127f9ec635 Mon Sep 17 00:00:00 2001 From: Stewart X Addison Date: Wed, 18 Jan 2017 12:53:04 +0000 Subject: [PATCH 019/121] doc: clarify msg when doc/api/cli.md not updated PR-URL: https://github.com/nodejs/node/pull/10872 Reviewed-By: Gibson Fahnestock Reviewed-By: Italo A. Casas Reviewed-By: Timothy Gu Reviewed-By: James M Snell --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7cd85983708fbd..394d3b913af82c 100644 --- a/Makefile +++ b/Makefile @@ -504,7 +504,7 @@ PKGDIR=out/dist-osx release-only: @if [ "$(DISTTYPE)" != "nightly" ] && [ "$(DISTTYPE)" != "next-nightly" ] && \ `grep -q REPLACEME doc/api/*.md`; then \ - echo 'Please update Added: tags in the documentation first.' ; \ + echo 'Please update REPLACEME in Added: tags in doc/api/*.md (See doc/releases.md)' ; \ exit 1 ; \ fi @if [ "$(shell git status --porcelain | egrep -v '^\?\? ')" = "" ]; then \ From 3ebe306bb0ad9992c8cc1e27bd5aeb55357acbb5 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 1 Feb 2017 16:01:09 -0800 Subject: [PATCH 020/121] doc: edit stability text for clarity and style PR-URL: https://github.com/nodejs/node/pull/11112 Reviewed-By: Timothy Gu Reviewed-By: Italo A. Casas Reviewed-By: Claudio Rodriguez Reviewed-By: Joyee Cheung Reviewed-By: James M Snell Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Anna Henningsen --- doc/api/documentation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/documentation.md b/doc/api/documentation.md index 38ede72cf6c338..947010d951bdab 100644 --- a/doc/api/documentation.md +++ b/doc/api/documentation.md @@ -58,7 +58,7 @@ is a high priority, and will not be broken unless absolutely necessary. ```txt Stability: 3 - Locked -Only fixes related to security, performance, or bug fixes will be accepted. +Only bug fixes, security fixes, and performance improvements will be accepted. Please do not suggest API changes in this area; they will be refused. ``` From 815e668209042825731ebbde92342b943f3f8b3b Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Tue, 31 Jan 2017 09:34:30 -0800 Subject: [PATCH 021/121] test: add --abort-on-timeout option to test.py Currently, when a process times out, it is terminated by sending it the SIGTERM signal. Sending SIGBART instead allows the operating system to generate a core file that can be investigated later using post-mortem debuggers such as llnode or mdb_v8. This can be very useful when investigating flaky tests that time out, since in that case the failure is difficult to reproduce, and being able to look at a core file makes a big difference. With these changes, passing the --abort-on-timeout command line option to tools/test.py now sends SIGABRT to processes timing out on all platforms but Windows. PR-URL: https://github.com/nodejs/node/pull/11086 Ref: https://github.com/nodejs/node/issues/11026 Reviewed-By: James M Snell Reviewed-By: Gibson Fahnestock Reviewed-By: Sakthipriyan Vairamani Reviewed-By: Santiago Gimeno Reviewed-By: Ben Noordhuis Reviewed-By: Colin Ihrig Reviewed-By: Michael Dawson Reviewed-By: Anna Henningsen --- tools/test.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/tools/test.py b/tools/test.py index b6db2cd68e3f7e..c900b1a83a88e0 100755 --- a/tools/test.py +++ b/tools/test.py @@ -565,11 +565,11 @@ def HasFailed(self): return execution_failed -def KillProcessWithID(pid): +def KillProcessWithID(pid, signal_to_send=signal.SIGTERM): if utils.IsWindows(): os.popen('taskkill /T /F /PID %d' % pid) else: - os.kill(pid, signal.SIGTERM) + os.kill(pid, signal_to_send) MAX_SLEEP_TIME = 0.1 @@ -588,6 +588,17 @@ def Win32SetErrorMode(mode): pass return prev_error_mode + +def KillTimedOutProcess(context, pid): + signal_to_send = signal.SIGTERM + if context.abort_on_timeout: + # Using SIGABRT here allows the OS to generate a core dump that can be + # looked at post-mortem, which helps for investigating failures that are + # difficult to reproduce. + signal_to_send = signal.SIGABRT + KillProcessWithID(pid, signal_to_send) + + def RunProcess(context, timeout, args, **rest): if context.verbose: print "#", " ".join(args) popen_args = args @@ -627,7 +638,7 @@ def RunProcess(context, timeout, args, **rest): while True: if time.time() >= end_time: # Kill the process and wait for it to exit. - KillProcessWithID(process.pid) + KillTimedOutProcess(context, process.pid) exit_code = process.wait() timed_out = True break @@ -648,7 +659,7 @@ def RunProcess(context, timeout, args, **rest): while exit_code is None: if (not end_time is None) and (time.time() >= end_time): # Kill the process and wait for it to exit. - KillProcessWithID(process.pid) + KillTimedOutProcess(context, process.pid) exit_code = process.wait() timed_out = True else: @@ -851,7 +862,7 @@ class Context(object): def __init__(self, workspace, buildspace, verbose, vm, args, expect_fail, timeout, processor, suppress_dialogs, - store_unexpected_output, repeat): + store_unexpected_output, repeat, abort_on_timeout): self.workspace = workspace self.buildspace = buildspace self.verbose = verbose @@ -863,6 +874,7 @@ def __init__(self, workspace, buildspace, verbose, vm, args, expect_fail, self.suppress_dialogs = suppress_dialogs self.store_unexpected_output = store_unexpected_output self.repeat = repeat + self.abort_on_timeout = abort_on_timeout def GetVm(self, arch, mode): if arch == 'none': @@ -1385,6 +1397,9 @@ def BuildOptions(): result.add_option('--repeat', help='Number of times to repeat given tests', default=1, type="int") + result.add_option('--abort-on-timeout', + help='Send SIGABRT instead of SIGTERM to kill processes that time out', + default=False, dest="abort_on_timeout") return result @@ -1566,7 +1581,8 @@ def Main(): processor, options.suppress_dialogs, options.store_unexpected_output, - options.repeat) + options.repeat, + options.abort_on_timeout) # Get status for tests sections = [ ] From 5d58756b4192909789cc6260dbd319bb05f02d5c Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Wed, 1 Feb 2017 16:01:33 -0800 Subject: [PATCH 022/121] doc: remove assertions about assert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The assert docs have some language that suggests that we don't want bug fixes. We do. Send in bug fixes, please. (Just no new API features.) We'd love to not have assert in core at all, but that ship has sailed. It's here to stay. Let's at least make it not have surprising behaviors. Because we want good things for our users. PR-URL: https://github.com/nodejs/node/pull/11113 Reviewed-By: Italo A. Casas Reviewed-By: Timothy Gu Reviewed-By: Daniel Bevenius Reviewed-By: Joyee Cheung Reviewed-By: Gibson Fahnestock Reviewed-By: James M Snell Reviewed-By: Сковорода Никита Андреевич --- doc/api/assert.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/doc/api/assert.md b/doc/api/assert.md index 3db5f676886ca8..2a5c583a7fbfdc 100644 --- a/doc/api/assert.md +++ b/doc/api/assert.md @@ -3,14 +3,11 @@ > Stability: 3 - Locked The `assert` module provides a simple set of assertion tests that can be used to -test invariants. The module is intended for internal use by Node.js, but can be -used in application code via `require('assert')`. However, `assert` is not a -testing framework, and is not intended to be used as a general purpose assertion -library. +test invariants. The API for the `assert` module is [Locked][]. This means that there will be no -additions or changes to any of the methods implemented and exposed by -the module. +additions or changes to any of the methods implemented and exposed by the +module. ## assert(value[, message]) + // - asyncTaskStarted + // - asyncTaskCanceled <-- canceled before finished + // <-- async stack requested here --> + // - asyncTaskFinished + std::unique_ptr stack; + if (stackIt != m_asyncTaskStacks.end() && stackIt->second) + stack = stackIt->second->cloneImpl(); + m_currentStacks.push_back(std::move(stack)); +} + +void V8Debugger::asyncTaskFinished(void* task) { + if (!m_maxAsyncCallStackDepth) return; + // We could start instrumenting half way and the stack is empty. + if (!m_currentStacks.size()) return; + + DCHECK(m_currentTasks.back() == task); + m_currentTasks.pop_back(); + + m_currentStacks.pop_back(); + if (m_recurringTasks.find(task) == m_recurringTasks.end()) + m_asyncTaskStacks.erase(task); +} + +void V8Debugger::allAsyncTasksCanceled() { + m_asyncTaskStacks.clear(); + m_recurringTasks.clear(); + m_currentStacks.clear(); + m_currentTasks.clear(); +} + +void V8Debugger::muteScriptParsedEvents() { + ++m_ignoreScriptParsedEventsCounter; +} + +void V8Debugger::unmuteScriptParsedEvents() { + --m_ignoreScriptParsedEventsCounter; + DCHECK_GE(m_ignoreScriptParsedEventsCounter, 0); +} + +std::unique_ptr V8Debugger::captureStackTrace( + bool fullStack) { + if (!m_isolate->InContext()) return nullptr; + + v8::HandleScope handles(m_isolate); + int contextGroupId = getGroupId(m_isolate->GetCurrentContext()); + if (!contextGroupId) return nullptr; + + size_t stackSize = + fullStack ? V8StackTraceImpl::maxCallStackSizeToCapture : 1; + if (m_inspector->enabledRuntimeAgentForGroup(contextGroupId)) + stackSize = V8StackTraceImpl::maxCallStackSizeToCapture; + + return V8StackTraceImpl::capture(this, contextGroupId, stackSize); +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-debugger.h b/deps/v8/src/inspector/v8-debugger.h new file mode 100644 index 00000000000000..83c1b21b02a712 --- /dev/null +++ b/deps/v8/src/inspector/v8-debugger.h @@ -0,0 +1,160 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8DEBUGGER_H_ +#define V8_INSPECTOR_V8DEBUGGER_H_ + +#include + +#include "src/base/macros.h" +#include "src/inspector/java-script-call-frame.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Runtime.h" +#include "src/inspector/v8-debugger-script.h" + +#include "include/v8-debug.h" +#include "include/v8-inspector.h" + +namespace v8_inspector { + +struct ScriptBreakpoint; +class V8DebuggerAgentImpl; +class V8InspectorImpl; +class V8StackTraceImpl; + +using protocol::ErrorString; + +class V8Debugger { + public: + V8Debugger(v8::Isolate*, V8InspectorImpl*); + ~V8Debugger(); + + static int contextId(v8::Local); + static int getGroupId(v8::Local); + int markContext(const V8ContextInfo&); + + bool enabled() const; + + String16 setBreakpoint(const String16& sourceID, const ScriptBreakpoint&, + int* actualLineNumber, int* actualColumnNumber); + void removeBreakpoint(const String16& breakpointId); + void setBreakpointsActivated(bool); + bool breakpointsActivated() const { return m_breakpointsActivated; } + + enum PauseOnExceptionsState { + DontPauseOnExceptions, + PauseOnAllExceptions, + PauseOnUncaughtExceptions + }; + PauseOnExceptionsState getPauseOnExceptionsState(); + void setPauseOnExceptionsState(PauseOnExceptionsState); + void setPauseOnNextStatement(bool); + bool canBreakProgram(); + void breakProgram(); + void continueProgram(); + void stepIntoStatement(); + void stepOverStatement(); + void stepOutOfFunction(); + void clearStepping(); + + bool setScriptSource(const String16& sourceID, + v8::Local newSource, bool dryRun, + ErrorString*, + protocol::Maybe*, + JavaScriptCallFrames* newCallFrames, + protocol::Maybe* stackChanged); + JavaScriptCallFrames currentCallFrames(int limit = 0); + + // Each script inherits debug data from v8::Context where it has been + // compiled. + // Only scripts whose debug data matches |contextGroupId| will be reported. + // Passing 0 will result in reporting all scripts. + void getCompiledScripts(int contextGroupId, + std::vector>&); + void enable(); + void disable(); + + bool isPaused(); + v8::Local pausedContext() { return m_pausedContext; } + + int maxAsyncCallChainDepth() { return m_maxAsyncCallStackDepth; } + V8StackTraceImpl* currentAsyncCallChain(); + void setAsyncCallStackDepth(V8DebuggerAgentImpl*, int); + std::unique_ptr createStackTrace(v8::Local); + std::unique_ptr captureStackTrace(bool fullStack); + + v8::MaybeLocal internalProperties(v8::Local, + v8::Local); + + void asyncTaskScheduled(const StringView& taskName, void* task, + bool recurring); + void asyncTaskScheduled(const String16& taskName, void* task, bool recurring); + void asyncTaskCanceled(void* task); + void asyncTaskStarted(void* task); + void asyncTaskFinished(void* task); + void allAsyncTasksCanceled(); + + void muteScriptParsedEvents(); + void unmuteScriptParsedEvents(); + + V8InspectorImpl* inspector() { return m_inspector; } + + private: + void compileDebuggerScript(); + v8::MaybeLocal callDebuggerMethod(const char* functionName, + int argc, + v8::Local argv[]); + v8::Local debuggerContext() const; + void clearBreakpoints(); + + static void breakProgramCallback(const v8::FunctionCallbackInfo&); + void handleProgramBreak(v8::Local pausedContext, + v8::Local executionState, + v8::Local exception, + v8::Local hitBreakpoints, + bool isPromiseRejection = false); + static void v8DebugEventCallback(const v8::Debug::EventDetails&); + v8::Local callInternalGetterFunction(v8::Local, + const char* functionName); + void handleV8DebugEvent(const v8::Debug::EventDetails&); + void handleV8AsyncTaskEvent(v8::Local, + v8::Local executionState, + v8::Local eventData); + + v8::Local collectionEntries(v8::Local, + v8::Local); + v8::Local generatorObjectLocation(v8::Local, + v8::Local); + v8::Local functionLocation(v8::Local, + v8::Local); + v8::MaybeLocal functionScopes(v8::Local, + v8::Local); + + v8::Isolate* m_isolate; + V8InspectorImpl* m_inspector; + int m_lastContextId; + int m_enableCount; + bool m_breakpointsActivated; + v8::Global m_debuggerScript; + v8::Global m_debuggerContext; + v8::Local m_executionState; + v8::Local m_pausedContext; + bool m_runningNestedMessageLoop; + int m_ignoreScriptParsedEventsCounter; + + using AsyncTaskToStackTrace = + protocol::HashMap>; + AsyncTaskToStackTrace m_asyncTaskStacks; + protocol::HashSet m_recurringTasks; + int m_maxAsyncCallStackDepth; + std::vector m_currentTasks; + std::vector> m_currentStacks; + protocol::HashMap m_maxAsyncCallStackDepthMap; + + DISALLOW_COPY_AND_ASSIGN(V8Debugger); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8DEBUGGER_H_ diff --git a/deps/v8/src/inspector/v8-function-call.cc b/deps/v8/src/inspector/v8-function-call.cc new file mode 100644 index 00000000000000..3880e3100e497e --- /dev/null +++ b/deps/v8/src/inspector/v8-function-call.cc @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2009 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "src/inspector/v8-function-call.h" + +#include "src/inspector/string-util.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +V8FunctionCall::V8FunctionCall(V8InspectorImpl* inspector, + v8::Local context, + v8::Local value, const String16& name) + : m_inspector(inspector), + m_context(context), + m_name(toV8String(context->GetIsolate(), name)), + m_value(value) {} + +void V8FunctionCall::appendArgument(v8::Local value) { + m_arguments.push_back(value); +} + +void V8FunctionCall::appendArgument(const String16& argument) { + m_arguments.push_back(toV8String(m_context->GetIsolate(), argument)); +} + +void V8FunctionCall::appendArgument(int argument) { + m_arguments.push_back(v8::Number::New(m_context->GetIsolate(), argument)); +} + +void V8FunctionCall::appendArgument(bool argument) { + m_arguments.push_back(argument ? v8::True(m_context->GetIsolate()) + : v8::False(m_context->GetIsolate())); +} + +v8::Local V8FunctionCall::call(bool& hadException, + bool reportExceptions) { + v8::TryCatch tryCatch(m_context->GetIsolate()); + tryCatch.SetVerbose(reportExceptions); + + v8::Local result = callWithoutExceptionHandling(); + hadException = tryCatch.HasCaught(); + return result; +} + +v8::Local V8FunctionCall::callWithoutExceptionHandling() { + v8::Local thisObject = v8::Local::Cast(m_value); + v8::Local value; + if (!thisObject->Get(m_context, m_name).ToLocal(&value)) + return v8::Local(); + + DCHECK(value->IsFunction()); + + v8::Local function = v8::Local::Cast(value); + std::unique_ptr[]> info( + new v8::Local[m_arguments.size()]); + for (size_t i = 0; i < m_arguments.size(); ++i) { + info[i] = m_arguments[i]; + DCHECK(!info[i].IsEmpty()); + } + + int contextGroupId = V8Debugger::getGroupId(m_context); + if (contextGroupId) { + m_inspector->client()->muteMetrics(contextGroupId); + m_inspector->muteExceptions(contextGroupId); + } + v8::MicrotasksScope microtasksScope(m_context->GetIsolate(), + v8::MicrotasksScope::kDoNotRunMicrotasks); + v8::MaybeLocal maybeResult = function->Call( + m_context, thisObject, static_cast(m_arguments.size()), info.get()); + if (contextGroupId) { + m_inspector->client()->unmuteMetrics(contextGroupId); + m_inspector->unmuteExceptions(contextGroupId); + } + + v8::Local result; + if (!maybeResult.ToLocal(&result)) return v8::Local(); + return result; +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-function-call.h b/deps/v8/src/inspector/v8-function-call.h new file mode 100644 index 00000000000000..0337caa339e202 --- /dev/null +++ b/deps/v8/src/inspector/v8-function-call.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2009 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef V8_INSPECTOR_V8FUNCTIONCALL_H_ +#define V8_INSPECTOR_V8FUNCTIONCALL_H_ + +#include "src/inspector/string-16.h" + +#include "include/v8.h" + +namespace v8_inspector { + +class V8InspectorImpl; + +class V8FunctionCall { + public: + V8FunctionCall(V8InspectorImpl*, v8::Local, v8::Local, + const String16& name); + + void appendArgument(v8::Local); + void appendArgument(const String16&); + void appendArgument(int); + void appendArgument(bool); + + v8::Local call(bool& hadException, bool reportExceptions = true); + v8::Local callWithoutExceptionHandling(); + + protected: + V8InspectorImpl* m_inspector; + v8::Local m_context; + std::vector> m_arguments; + v8::Local m_name; + v8::Local m_value; +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8FUNCTIONCALL_H_ diff --git a/deps/v8/src/inspector/v8-heap-profiler-agent-impl.cc b/deps/v8/src/inspector/v8-heap-profiler-agent-impl.cc new file mode 100644 index 00000000000000..84c890bf3f72bf --- /dev/null +++ b/deps/v8/src/inspector/v8-heap-profiler-agent-impl.cc @@ -0,0 +1,407 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-heap-profiler-agent-impl.h" + +#include "src/inspector/injected-script.h" +#include "src/inspector/protocol/Protocol.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-inspector-session-impl.h" + +#include "include/v8-inspector.h" +#include "include/v8-profiler.h" +#include "include/v8-version.h" + +namespace v8_inspector { + +namespace { + +namespace HeapProfilerAgentState { +static const char heapProfilerEnabled[] = "heapProfilerEnabled"; +static const char heapObjectsTrackingEnabled[] = "heapObjectsTrackingEnabled"; +static const char allocationTrackingEnabled[] = "allocationTrackingEnabled"; +static const char samplingHeapProfilerEnabled[] = "samplingHeapProfilerEnabled"; +static const char samplingHeapProfilerInterval[] = + "samplingHeapProfilerInterval"; +} + +class HeapSnapshotProgress final : public v8::ActivityControl { + public: + explicit HeapSnapshotProgress(protocol::HeapProfiler::Frontend* frontend) + : m_frontend(frontend) {} + ControlOption ReportProgressValue(int done, int total) override { + m_frontend->reportHeapSnapshotProgress(done, total, + protocol::Maybe()); + if (done >= total) { + m_frontend->reportHeapSnapshotProgress(total, total, true); + } + m_frontend->flush(); + return kContinue; + } + + private: + protocol::HeapProfiler::Frontend* m_frontend; +}; + +class GlobalObjectNameResolver final + : public v8::HeapProfiler::ObjectNameResolver { + public: + explicit GlobalObjectNameResolver(V8InspectorSessionImpl* session) + : m_offset(0), m_strings(10000), m_session(session) {} + + const char* GetName(v8::Local object) override { + InspectedContext* context = m_session->inspector()->getContext( + m_session->contextGroupId(), + V8Debugger::contextId(object->CreationContext())); + if (!context) return ""; + String16 name = context->origin(); + size_t length = name.length(); + if (m_offset + length + 1 >= m_strings.size()) return ""; + for (size_t i = 0; i < length; ++i) { + UChar ch = name[i]; + m_strings[m_offset + i] = ch > 0xff ? '?' : static_cast(ch); + } + m_strings[m_offset + length] = '\0'; + char* result = &*m_strings.begin() + m_offset; + m_offset += length + 1; + return result; + } + + private: + size_t m_offset; + std::vector m_strings; + V8InspectorSessionImpl* m_session; +}; + +class HeapSnapshotOutputStream final : public v8::OutputStream { + public: + explicit HeapSnapshotOutputStream(protocol::HeapProfiler::Frontend* frontend) + : m_frontend(frontend) {} + void EndOfStream() override {} + int GetChunkSize() override { return 102400; } + WriteResult WriteAsciiChunk(char* data, int size) override { + m_frontend->addHeapSnapshotChunk(String16(data, size)); + m_frontend->flush(); + return kContinue; + } + + private: + protocol::HeapProfiler::Frontend* m_frontend; +}; + +v8::Local objectByHeapObjectId(v8::Isolate* isolate, int id) { + v8::HeapProfiler* profiler = isolate->GetHeapProfiler(); + v8::Local value = profiler->FindObjectById(id); + if (value.IsEmpty() || !value->IsObject()) return v8::Local(); + return value.As(); +} + +class InspectableHeapObject final : public V8InspectorSession::Inspectable { + public: + explicit InspectableHeapObject(int heapObjectId) + : m_heapObjectId(heapObjectId) {} + v8::Local get(v8::Local context) override { + return objectByHeapObjectId(context->GetIsolate(), m_heapObjectId); + } + + private: + int m_heapObjectId; +}; + +class HeapStatsStream final : public v8::OutputStream { + public: + explicit HeapStatsStream(protocol::HeapProfiler::Frontend* frontend) + : m_frontend(frontend) {} + + void EndOfStream() override {} + + WriteResult WriteAsciiChunk(char* data, int size) override { + DCHECK(false); + return kAbort; + } + + WriteResult WriteHeapStatsChunk(v8::HeapStatsUpdate* updateData, + int count) override { + DCHECK_GT(count, 0); + std::unique_ptr> statsDiff = + protocol::Array::create(); + for (int i = 0; i < count; ++i) { + statsDiff->addItem(updateData[i].index); + statsDiff->addItem(updateData[i].count); + statsDiff->addItem(updateData[i].size); + } + m_frontend->heapStatsUpdate(std::move(statsDiff)); + return kContinue; + } + + private: + protocol::HeapProfiler::Frontend* m_frontend; +}; + +} // namespace + +V8HeapProfilerAgentImpl::V8HeapProfilerAgentImpl( + V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, + protocol::DictionaryValue* state) + : m_session(session), + m_isolate(session->inspector()->isolate()), + m_frontend(frontendChannel), + m_state(state), + m_hasTimer(false) {} + +V8HeapProfilerAgentImpl::~V8HeapProfilerAgentImpl() {} + +void V8HeapProfilerAgentImpl::restore() { + if (m_state->booleanProperty(HeapProfilerAgentState::heapProfilerEnabled, + false)) + m_frontend.resetProfiles(); + if (m_state->booleanProperty( + HeapProfilerAgentState::heapObjectsTrackingEnabled, false)) + startTrackingHeapObjectsInternal(m_state->booleanProperty( + HeapProfilerAgentState::allocationTrackingEnabled, false)); + if (m_state->booleanProperty( + HeapProfilerAgentState::samplingHeapProfilerEnabled, false)) { + ErrorString error; + double samplingInterval = m_state->doubleProperty( + HeapProfilerAgentState::samplingHeapProfilerInterval, -1); + DCHECK_GE(samplingInterval, 0); + startSampling(&error, Maybe(samplingInterval)); + } +} + +void V8HeapProfilerAgentImpl::collectGarbage(ErrorString*) { + m_isolate->LowMemoryNotification(); +} + +void V8HeapProfilerAgentImpl::startTrackingHeapObjects( + ErrorString*, const protocol::Maybe& trackAllocations) { + m_state->setBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled, true); + bool allocationTrackingEnabled = trackAllocations.fromMaybe(false); + m_state->setBoolean(HeapProfilerAgentState::allocationTrackingEnabled, + allocationTrackingEnabled); + startTrackingHeapObjectsInternal(allocationTrackingEnabled); +} + +void V8HeapProfilerAgentImpl::stopTrackingHeapObjects( + ErrorString* error, const protocol::Maybe& reportProgress) { + requestHeapStatsUpdate(); + takeHeapSnapshot(error, reportProgress); + stopTrackingHeapObjectsInternal(); +} + +void V8HeapProfilerAgentImpl::enable(ErrorString*) { + m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, true); +} + +void V8HeapProfilerAgentImpl::disable(ErrorString* error) { + stopTrackingHeapObjectsInternal(); + if (m_state->booleanProperty( + HeapProfilerAgentState::samplingHeapProfilerEnabled, false)) { + v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); + if (profiler) profiler->StopSamplingHeapProfiler(); + } + m_isolate->GetHeapProfiler()->ClearObjectIds(); + m_state->setBoolean(HeapProfilerAgentState::heapProfilerEnabled, false); +} + +void V8HeapProfilerAgentImpl::takeHeapSnapshot( + ErrorString* errorString, const protocol::Maybe& reportProgress) { + v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); + if (!profiler) { + *errorString = "Cannot access v8 heap profiler"; + return; + } + std::unique_ptr progress; + if (reportProgress.fromMaybe(false)) + progress = wrapUnique(new HeapSnapshotProgress(&m_frontend)); + + GlobalObjectNameResolver resolver(m_session); + const v8::HeapSnapshot* snapshot = + profiler->TakeHeapSnapshot(progress.get(), &resolver); + if (!snapshot) { + *errorString = "Failed to take heap snapshot"; + return; + } + HeapSnapshotOutputStream stream(&m_frontend); + snapshot->Serialize(&stream); + const_cast(snapshot)->Delete(); +} + +void V8HeapProfilerAgentImpl::getObjectByHeapObjectId( + ErrorString* error, const String16& heapSnapshotObjectId, + const protocol::Maybe& objectGroup, + std::unique_ptr* result) { + bool ok; + int id = heapSnapshotObjectId.toInteger(&ok); + if (!ok) { + *error = "Invalid heap snapshot object id"; + return; + } + + v8::HandleScope handles(m_isolate); + v8::Local heapObject = objectByHeapObjectId(m_isolate, id); + if (heapObject.IsEmpty()) { + *error = "Object is not available"; + return; + } + + if (!m_session->inspector()->client()->isInspectableHeapObject(heapObject)) { + *error = "Object is not available"; + return; + } + + *result = m_session->wrapObject(heapObject->CreationContext(), heapObject, + objectGroup.fromMaybe(""), false); + if (!result) *error = "Object is not available"; +} + +void V8HeapProfilerAgentImpl::addInspectedHeapObject( + ErrorString* errorString, const String16& inspectedHeapObjectId) { + bool ok; + int id = inspectedHeapObjectId.toInteger(&ok); + if (!ok) { + *errorString = "Invalid heap snapshot object id"; + return; + } + + v8::HandleScope handles(m_isolate); + v8::Local heapObject = objectByHeapObjectId(m_isolate, id); + if (heapObject.IsEmpty()) { + *errorString = "Object is not available"; + return; + } + + if (!m_session->inspector()->client()->isInspectableHeapObject(heapObject)) { + *errorString = "Object is not available"; + return; + } + + m_session->addInspectedObject(wrapUnique(new InspectableHeapObject(id))); +} + +void V8HeapProfilerAgentImpl::getHeapObjectId(ErrorString* errorString, + const String16& objectId, + String16* heapSnapshotObjectId) { + v8::HandleScope handles(m_isolate); + v8::Local value; + v8::Local context; + if (!m_session->unwrapObject(errorString, objectId, &value, &context, + nullptr) || + value->IsUndefined()) + return; + + v8::SnapshotObjectId id = m_isolate->GetHeapProfiler()->GetObjectId(value); + *heapSnapshotObjectId = String16::fromInteger(static_cast(id)); +} + +void V8HeapProfilerAgentImpl::requestHeapStatsUpdate() { + HeapStatsStream stream(&m_frontend); + v8::SnapshotObjectId lastSeenObjectId = + m_isolate->GetHeapProfiler()->GetHeapStats(&stream); + m_frontend.lastSeenObjectId( + lastSeenObjectId, m_session->inspector()->client()->currentTimeMS()); +} + +// static +void V8HeapProfilerAgentImpl::onTimer(void* data) { + reinterpret_cast(data)->requestHeapStatsUpdate(); +} + +void V8HeapProfilerAgentImpl::startTrackingHeapObjectsInternal( + bool trackAllocations) { + m_isolate->GetHeapProfiler()->StartTrackingHeapObjects(trackAllocations); + if (!m_hasTimer) { + m_hasTimer = true; + m_session->inspector()->client()->startRepeatingTimer( + 0.05, &V8HeapProfilerAgentImpl::onTimer, reinterpret_cast(this)); + } +} + +void V8HeapProfilerAgentImpl::stopTrackingHeapObjectsInternal() { + if (m_hasTimer) { + m_session->inspector()->client()->cancelTimer( + reinterpret_cast(this)); + m_hasTimer = false; + } + m_isolate->GetHeapProfiler()->StopTrackingHeapObjects(); + m_state->setBoolean(HeapProfilerAgentState::heapObjectsTrackingEnabled, + false); + m_state->setBoolean(HeapProfilerAgentState::allocationTrackingEnabled, false); +} + +void V8HeapProfilerAgentImpl::startSampling( + ErrorString* errorString, const Maybe& samplingInterval) { + v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); + if (!profiler) { + *errorString = "Cannot access v8 heap profiler"; + return; + } + const unsigned defaultSamplingInterval = 1 << 15; + double samplingIntervalValue = + samplingInterval.fromMaybe(defaultSamplingInterval); + m_state->setDouble(HeapProfilerAgentState::samplingHeapProfilerInterval, + samplingIntervalValue); + m_state->setBoolean(HeapProfilerAgentState::samplingHeapProfilerEnabled, + true); + profiler->StartSamplingHeapProfiler( + static_cast(samplingIntervalValue), 128, + v8::HeapProfiler::kSamplingForceGC); +} + +namespace { +std::unique_ptr +buildSampingHeapProfileNode(const v8::AllocationProfile::Node* node) { + auto children = protocol::Array< + protocol::HeapProfiler::SamplingHeapProfileNode>::create(); + for (const auto* child : node->children) + children->addItem(buildSampingHeapProfileNode(child)); + size_t selfSize = 0; + for (const auto& allocation : node->allocations) + selfSize += allocation.size * allocation.count; + std::unique_ptr callFrame = + protocol::Runtime::CallFrame::create() + .setFunctionName(toProtocolString(node->name)) + .setScriptId(String16::fromInteger(node->script_id)) + .setUrl(toProtocolString(node->script_name)) + .setLineNumber(node->line_number - 1) + .setColumnNumber(node->column_number - 1) + .build(); + std::unique_ptr result = + protocol::HeapProfiler::SamplingHeapProfileNode::create() + .setCallFrame(std::move(callFrame)) + .setSelfSize(selfSize) + .setChildren(std::move(children)) + .build(); + return result; +} +} // namespace + +void V8HeapProfilerAgentImpl::stopSampling( + ErrorString* errorString, + std::unique_ptr* profile) { + v8::HeapProfiler* profiler = m_isolate->GetHeapProfiler(); + if (!profiler) { + *errorString = "Cannot access v8 heap profiler"; + return; + } + v8::HandleScope scope( + m_isolate); // Allocation profile contains Local handles. + std::unique_ptr v8Profile( + profiler->GetAllocationProfile()); + profiler->StopSamplingHeapProfiler(); + m_state->setBoolean(HeapProfilerAgentState::samplingHeapProfilerEnabled, + false); + if (!v8Profile) { + *errorString = "Cannot access v8 sampled heap profile."; + return; + } + v8::AllocationProfile::Node* root = v8Profile->GetRootNode(); + *profile = protocol::HeapProfiler::SamplingHeapProfile::create() + .setHead(buildSampingHeapProfileNode(root)) + .build(); +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-heap-profiler-agent-impl.h b/deps/v8/src/inspector/v8-heap-profiler-agent-impl.h new file mode 100644 index 00000000000000..caa969870bacc5 --- /dev/null +++ b/deps/v8/src/inspector/v8-heap-profiler-agent-impl.h @@ -0,0 +1,73 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8HEAPPROFILERAGENTIMPL_H_ +#define V8_INSPECTOR_V8HEAPPROFILERAGENTIMPL_H_ + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/HeapProfiler.h" + +#include "include/v8.h" + +namespace v8_inspector { + +class V8InspectorSessionImpl; + +using protocol::ErrorString; +using protocol::Maybe; + +class V8HeapProfilerAgentImpl : public protocol::HeapProfiler::Backend { + public: + V8HeapProfilerAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, + protocol::DictionaryValue* state); + ~V8HeapProfilerAgentImpl() override; + void restore(); + + void collectGarbage(ErrorString*) override; + + void enable(ErrorString*) override; + void startTrackingHeapObjects(ErrorString*, + const Maybe& trackAllocations) override; + void stopTrackingHeapObjects(ErrorString*, + const Maybe& reportProgress) override; + + void disable(ErrorString*) override; + + void takeHeapSnapshot(ErrorString*, + const Maybe& reportProgress) override; + + void getObjectByHeapObjectId( + ErrorString*, const String16& heapSnapshotObjectId, + const Maybe& objectGroup, + std::unique_ptr* result) override; + void addInspectedHeapObject(ErrorString*, + const String16& inspectedHeapObjectId) override; + void getHeapObjectId(ErrorString*, const String16& objectId, + String16* heapSnapshotObjectId) override; + + void startSampling(ErrorString*, + const Maybe& samplingInterval) override; + void stopSampling( + ErrorString*, + std::unique_ptr*) override; + + private: + void startTrackingHeapObjectsInternal(bool trackAllocations); + void stopTrackingHeapObjectsInternal(); + void requestHeapStatsUpdate(); + static void onTimer(void*); + + V8InspectorSessionImpl* m_session; + v8::Isolate* m_isolate; + protocol::HeapProfiler::Frontend m_frontend; + protocol::DictionaryValue* m_state; + bool m_hasTimer; + + DISALLOW_COPY_AND_ASSIGN(V8HeapProfilerAgentImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8HEAPPROFILERAGENTIMPL_H_ diff --git a/deps/v8/src/inspector/v8-injected-script-host.cc b/deps/v8/src/inspector/v8-injected-script-host.cc new file mode 100644 index 00000000000000..dc41ef8631febe --- /dev/null +++ b/deps/v8/src/inspector/v8-injected-script-host.cc @@ -0,0 +1,216 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-injected-script-host.h" + +#include "src/base/macros.h" +#include "src/inspector/injected-script-native.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-internal-value-type.h" +#include "src/inspector/v8-value-copier.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +namespace { + +void setFunctionProperty(v8::Local context, + v8::Local obj, const char* name, + v8::FunctionCallback callback, + v8::Local external) { + v8::Local funcName = + toV8StringInternalized(context->GetIsolate(), name); + v8::Local func; + if (!v8::Function::New(context, callback, external, 0, + v8::ConstructorBehavior::kThrow) + .ToLocal(&func)) + return; + func->SetName(funcName); + createDataProperty(context, obj, funcName, func); +} + +V8InspectorImpl* unwrapInspector( + const v8::FunctionCallbackInfo& info) { + DCHECK(!info.Data().IsEmpty()); + DCHECK(info.Data()->IsExternal()); + V8InspectorImpl* inspector = + static_cast(info.Data().As()->Value()); + DCHECK(inspector); + return inspector; +} + +} // namespace + +v8::Local V8InjectedScriptHost::create( + v8::Local context, V8InspectorImpl* inspector) { + v8::Isolate* isolate = inspector->isolate(); + v8::Local injectedScriptHost = v8::Object::New(isolate); + bool success = injectedScriptHost->SetPrototype(context, v8::Null(isolate)) + .FromMaybe(false); + DCHECK(success); + USE(success); + v8::Local debuggerExternal = + v8::External::New(isolate, inspector); + setFunctionProperty(context, injectedScriptHost, "internalConstructorName", + V8InjectedScriptHost::internalConstructorNameCallback, + debuggerExternal); + setFunctionProperty( + context, injectedScriptHost, "formatAccessorsAsProperties", + V8InjectedScriptHost::formatAccessorsAsProperties, debuggerExternal); + setFunctionProperty(context, injectedScriptHost, "subtype", + V8InjectedScriptHost::subtypeCallback, debuggerExternal); + setFunctionProperty(context, injectedScriptHost, "getInternalProperties", + V8InjectedScriptHost::getInternalPropertiesCallback, + debuggerExternal); + setFunctionProperty(context, injectedScriptHost, "objectHasOwnProperty", + V8InjectedScriptHost::objectHasOwnPropertyCallback, + debuggerExternal); + setFunctionProperty(context, injectedScriptHost, "bind", + V8InjectedScriptHost::bindCallback, debuggerExternal); + setFunctionProperty(context, injectedScriptHost, "proxyTargetValue", + V8InjectedScriptHost::proxyTargetValueCallback, + debuggerExternal); + return injectedScriptHost; +} + +void V8InjectedScriptHost::internalConstructorNameCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() < 1 || !info[0]->IsObject()) return; + + v8::Local object = info[0].As(); + info.GetReturnValue().Set(object->GetConstructorName()); +} + +void V8InjectedScriptHost::formatAccessorsAsProperties( + const v8::FunctionCallbackInfo& info) { + DCHECK_EQ(info.Length(), 2); + info.GetReturnValue().Set(false); + if (!info[1]->IsFunction()) return; + // Check that function is user-defined. + if (info[1].As()->ScriptId() != v8::UnboundScript::kNoScriptId) + return; + info.GetReturnValue().Set( + unwrapInspector(info)->client()->formatAccessorsAsProperties(info[0])); +} + +void V8InjectedScriptHost::subtypeCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() < 1) return; + + v8::Isolate* isolate = info.GetIsolate(); + v8::Local value = info[0]; + if (value->IsObject()) { + v8::Local internalType = v8InternalValueTypeFrom( + isolate->GetCurrentContext(), v8::Local::Cast(value)); + if (internalType->IsString()) { + info.GetReturnValue().Set(internalType); + return; + } + } + if (value->IsArray() || value->IsArgumentsObject()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "array")); + return; + } + if (value->IsTypedArray()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "typedarray")); + return; + } + if (value->IsDate()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "date")); + return; + } + if (value->IsRegExp()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "regexp")); + return; + } + if (value->IsMap() || value->IsWeakMap()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "map")); + return; + } + if (value->IsSet() || value->IsWeakSet()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "set")); + return; + } + if (value->IsMapIterator() || value->IsSetIterator()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "iterator")); + return; + } + if (value->IsGeneratorObject()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "generator")); + return; + } + if (value->IsNativeError()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "error")); + return; + } + if (value->IsProxy()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "proxy")); + return; + } + if (value->IsPromise()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "promise")); + return; + } + std::unique_ptr subtype = + unwrapInspector(info)->client()->valueSubtype(value); + if (subtype) { + info.GetReturnValue().Set(toV8String(isolate, subtype->string())); + return; + } +} + +void V8InjectedScriptHost::getInternalPropertiesCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() < 1) return; + v8::Local properties; + if (unwrapInspector(info) + ->debugger() + ->internalProperties(info.GetIsolate()->GetCurrentContext(), info[0]) + .ToLocal(&properties)) + info.GetReturnValue().Set(properties); +} + +void V8InjectedScriptHost::objectHasOwnPropertyCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() < 2 || !info[0]->IsObject() || !info[1]->IsString()) return; + bool result = info[0] + .As() + ->HasOwnProperty(info.GetIsolate()->GetCurrentContext(), + v8::Local::Cast(info[1])) + .FromMaybe(false); + info.GetReturnValue().Set(v8::Boolean::New(info.GetIsolate(), result)); +} + +void V8InjectedScriptHost::bindCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() < 2 || !info[1]->IsString()) return; + InjectedScriptNative* injectedScriptNative = + InjectedScriptNative::fromInjectedScriptHost(info.GetIsolate(), + info.Holder()); + if (!injectedScriptNative) return; + + v8::Local context = info.GetIsolate()->GetCurrentContext(); + v8::Local v8groupName = + info[1]->ToString(context).ToLocalChecked(); + String16 groupName = toProtocolStringWithTypeCheck(v8groupName); + int id = injectedScriptNative->bind(info[0], groupName); + info.GetReturnValue().Set(id); +} + +void V8InjectedScriptHost::proxyTargetValueCallback( + const v8::FunctionCallbackInfo& info) { + if (info.Length() != 1 || !info[0]->IsProxy()) { + UNREACHABLE(); + return; + } + v8::Local target = info[0].As(); + while (target->IsProxy()) + target = v8::Local::Cast(target)->GetTarget(); + info.GetReturnValue().Set(target); +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-injected-script-host.h b/deps/v8/src/inspector/v8-injected-script-host.h new file mode 100644 index 00000000000000..7d293af5a754d8 --- /dev/null +++ b/deps/v8/src/inspector/v8-injected-script-host.h @@ -0,0 +1,46 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8INJECTEDSCRIPTHOST_H_ +#define V8_INSPECTOR_V8INJECTEDSCRIPTHOST_H_ + +#include "include/v8.h" + +namespace v8_inspector { + +class V8InspectorImpl; + +// SECURITY NOTE: Although the InjectedScriptHost is intended for use solely by +// the inspector, +// a reference to the InjectedScriptHost may be leaked to the page being +// inspected. Thus, the +// InjectedScriptHost must never implemment methods that have more power over +// the page than the +// page already has itself (e.g. origin restriction bypasses). + +class V8InjectedScriptHost { + public: + // We expect that debugger outlives any JS context and thus + // V8InjectedScriptHost (owned by JS) + // is destroyed before inspector. + static v8::Local create(v8::Local, V8InspectorImpl*); + + private: + static void internalConstructorNameCallback( + const v8::FunctionCallbackInfo&); + static void formatAccessorsAsProperties( + const v8::FunctionCallbackInfo&); + static void subtypeCallback(const v8::FunctionCallbackInfo&); + static void getInternalPropertiesCallback( + const v8::FunctionCallbackInfo&); + static void objectHasOwnPropertyCallback( + const v8::FunctionCallbackInfo&); + static void bindCallback(const v8::FunctionCallbackInfo&); + static void proxyTargetValueCallback( + const v8::FunctionCallbackInfo&); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8INJECTEDSCRIPTHOST_H_ diff --git a/deps/v8/src/inspector/v8-inspector-impl.cc b/deps/v8/src/inspector/v8-inspector-impl.cc new file mode 100644 index 00000000000000..bd68548fbf9f82 --- /dev/null +++ b/deps/v8/src/inspector/v8-inspector-impl.cc @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2010-2011 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "src/inspector/v8-inspector-impl.h" + +#include "src/inspector/inspected-context.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-console-agent-impl.h" +#include "src/inspector/v8-console-message.h" +#include "src/inspector/v8-debugger-agent-impl.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-session-impl.h" +#include "src/inspector/v8-profiler-agent-impl.h" +#include "src/inspector/v8-runtime-agent-impl.h" +#include "src/inspector/v8-stack-trace-impl.h" + +namespace v8_inspector { + +std::unique_ptr V8Inspector::create(v8::Isolate* isolate, + V8InspectorClient* client) { + return wrapUnique(new V8InspectorImpl(isolate, client)); +} + +V8InspectorImpl::V8InspectorImpl(v8::Isolate* isolate, + V8InspectorClient* client) + : m_isolate(isolate), + m_client(client), + m_debugger(new V8Debugger(isolate, this)), + m_capturingStackTracesCount(0), + m_lastExceptionId(0) {} + +V8InspectorImpl::~V8InspectorImpl() {} + +V8DebuggerAgentImpl* V8InspectorImpl::enabledDebuggerAgentForGroup( + int contextGroupId) { + V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); + V8DebuggerAgentImpl* agent = session ? session->debuggerAgent() : nullptr; + return agent && agent->enabled() ? agent : nullptr; +} + +V8RuntimeAgentImpl* V8InspectorImpl::enabledRuntimeAgentForGroup( + int contextGroupId) { + V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); + V8RuntimeAgentImpl* agent = session ? session->runtimeAgent() : nullptr; + return agent && agent->enabled() ? agent : nullptr; +} + +V8ProfilerAgentImpl* V8InspectorImpl::enabledProfilerAgentForGroup( + int contextGroupId) { + V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); + V8ProfilerAgentImpl* agent = session ? session->profilerAgent() : nullptr; + return agent && agent->enabled() ? agent : nullptr; +} + +v8::MaybeLocal V8InspectorImpl::runCompiledScript( + v8::Local context, v8::Local script) { + v8::MicrotasksScope microtasksScope(m_isolate, + v8::MicrotasksScope::kRunMicrotasks); + int groupId = V8Debugger::getGroupId(context); + if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) + agent->willExecuteScript(script->GetUnboundScript()->GetId()); + v8::MaybeLocal result = script->Run(context); + // Get agent from the map again, since it could have detached during script + // execution. + if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) + agent->didExecuteScript(); + return result; +} + +v8::MaybeLocal V8InspectorImpl::callFunction( + v8::Local function, v8::Local context, + v8::Local receiver, int argc, v8::Local info[]) { + v8::MicrotasksScope microtasksScope(m_isolate, + v8::MicrotasksScope::kRunMicrotasks); + int groupId = V8Debugger::getGroupId(context); + if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) + agent->willExecuteScript(function->ScriptId()); + v8::MaybeLocal result = + function->Call(context, receiver, argc, info); + // Get agent from the map again, since it could have detached during script + // execution. + if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) + agent->didExecuteScript(); + return result; +} + +v8::MaybeLocal V8InspectorImpl::compileAndRunInternalScript( + v8::Local context, v8::Local source) { + v8::Local script = + compileScript(context, source, String16(), true); + if (script.IsEmpty()) return v8::MaybeLocal(); + v8::MicrotasksScope microtasksScope(m_isolate, + v8::MicrotasksScope::kDoNotRunMicrotasks); + return script->Run(context); +} + +v8::Local V8InspectorImpl::compileScript( + v8::Local context, v8::Local code, + const String16& fileName, bool markAsInternal) { + v8::ScriptOrigin origin( + toV8String(m_isolate, fileName), v8::Integer::New(m_isolate, 0), + v8::Integer::New(m_isolate, 0), + v8::False(m_isolate), // sharable + v8::Local(), + v8::Boolean::New(m_isolate, markAsInternal), // internal + toV8String(m_isolate, String16()), // sourceMap + v8::True(m_isolate)); // opaqueresource + v8::ScriptCompiler::Source source(code, origin); + v8::Local script; + if (!v8::ScriptCompiler::Compile(context, &source, + v8::ScriptCompiler::kNoCompileOptions) + .ToLocal(&script)) + return v8::Local(); + return script; +} + +void V8InspectorImpl::enableStackCapturingIfNeeded() { + if (!m_capturingStackTracesCount) + V8StackTraceImpl::setCaptureStackTraceForUncaughtExceptions(m_isolate, + true); + ++m_capturingStackTracesCount; +} + +void V8InspectorImpl::disableStackCapturingIfNeeded() { + if (!(--m_capturingStackTracesCount)) + V8StackTraceImpl::setCaptureStackTraceForUncaughtExceptions(m_isolate, + false); +} + +void V8InspectorImpl::muteExceptions(int contextGroupId) { + m_muteExceptionsMap[contextGroupId]++; +} + +void V8InspectorImpl::unmuteExceptions(int contextGroupId) { + m_muteExceptionsMap[contextGroupId]--; +} + +V8ConsoleMessageStorage* V8InspectorImpl::ensureConsoleMessageStorage( + int contextGroupId) { + ConsoleStorageMap::iterator storageIt = + m_consoleStorageMap.find(contextGroupId); + if (storageIt == m_consoleStorageMap.end()) + storageIt = + m_consoleStorageMap + .insert(std::make_pair( + contextGroupId, + wrapUnique(new V8ConsoleMessageStorage(this, contextGroupId)))) + .first; + return storageIt->second.get(); +} + +bool V8InspectorImpl::hasConsoleMessageStorage(int contextGroupId) { + ConsoleStorageMap::iterator storageIt = + m_consoleStorageMap.find(contextGroupId); + return storageIt != m_consoleStorageMap.end(); +} + +std::unique_ptr V8InspectorImpl::createStackTrace( + v8::Local stackTrace) { + return m_debugger->createStackTrace(stackTrace); +} + +std::unique_ptr V8InspectorImpl::connect( + int contextGroupId, V8Inspector::Channel* channel, + const StringView& state) { + DCHECK(m_sessions.find(contextGroupId) == m_sessions.cend()); + std::unique_ptr session = + V8InspectorSessionImpl::create(this, contextGroupId, channel, state); + m_sessions[contextGroupId] = session.get(); + return std::move(session); +} + +void V8InspectorImpl::disconnect(V8InspectorSessionImpl* session) { + DCHECK(m_sessions.find(session->contextGroupId()) != m_sessions.end()); + m_sessions.erase(session->contextGroupId()); +} + +InspectedContext* V8InspectorImpl::getContext(int groupId, + int contextId) const { + if (!groupId || !contextId) return nullptr; + + ContextsByGroupMap::const_iterator contextGroupIt = m_contexts.find(groupId); + if (contextGroupIt == m_contexts.end()) return nullptr; + + ContextByIdMap::iterator contextIt = contextGroupIt->second->find(contextId); + if (contextIt == contextGroupIt->second->end()) return nullptr; + + return contextIt->second.get(); +} + +void V8InspectorImpl::contextCreated(const V8ContextInfo& info) { + int contextId = m_debugger->markContext(info); + + ContextsByGroupMap::iterator contextIt = m_contexts.find(info.contextGroupId); + if (contextIt == m_contexts.end()) + contextIt = m_contexts + .insert(std::make_pair(info.contextGroupId, + wrapUnique(new ContextByIdMap()))) + .first; + + const auto& contextById = contextIt->second; + + DCHECK(contextById->find(contextId) == contextById->cend()); + InspectedContext* context = new InspectedContext(this, info, contextId); + (*contextById)[contextId] = wrapUnique(context); + SessionMap::iterator sessionIt = m_sessions.find(info.contextGroupId); + if (sessionIt != m_sessions.end()) + sessionIt->second->runtimeAgent()->reportExecutionContextCreated(context); +} + +void V8InspectorImpl::contextDestroyed(v8::Local context) { + int contextId = V8Debugger::contextId(context); + int contextGroupId = V8Debugger::getGroupId(context); + + ConsoleStorageMap::iterator storageIt = + m_consoleStorageMap.find(contextGroupId); + if (storageIt != m_consoleStorageMap.end()) + storageIt->second->contextDestroyed(contextId); + + InspectedContext* inspectedContext = getContext(contextGroupId, contextId); + if (!inspectedContext) return; + + SessionMap::iterator iter = m_sessions.find(contextGroupId); + if (iter != m_sessions.end()) + iter->second->runtimeAgent()->reportExecutionContextDestroyed( + inspectedContext); + discardInspectedContext(contextGroupId, contextId); +} + +void V8InspectorImpl::resetContextGroup(int contextGroupId) { + m_consoleStorageMap.erase(contextGroupId); + m_muteExceptionsMap.erase(contextGroupId); + SessionMap::iterator session = m_sessions.find(contextGroupId); + if (session != m_sessions.end()) session->second->reset(); + m_contexts.erase(contextGroupId); +} + +void V8InspectorImpl::willExecuteScript(v8::Local context, + int scriptId) { + if (V8DebuggerAgentImpl* agent = + enabledDebuggerAgentForGroup(V8Debugger::getGroupId(context))) + agent->willExecuteScript(scriptId); +} + +void V8InspectorImpl::didExecuteScript(v8::Local context) { + if (V8DebuggerAgentImpl* agent = + enabledDebuggerAgentForGroup(V8Debugger::getGroupId(context))) + agent->didExecuteScript(); +} + +void V8InspectorImpl::idleStarted() { + for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { + if (it->second->profilerAgent()->idleStarted()) return; + } +} + +void V8InspectorImpl::idleFinished() { + for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { + if (it->second->profilerAgent()->idleFinished()) return; + } +} + +unsigned V8InspectorImpl::exceptionThrown( + v8::Local context, const StringView& message, + v8::Local exception, const StringView& detailedMessage, + const StringView& url, unsigned lineNumber, unsigned columnNumber, + std::unique_ptr stackTrace, int scriptId) { + int contextGroupId = V8Debugger::getGroupId(context); + if (!contextGroupId || m_muteExceptionsMap[contextGroupId]) return 0; + std::unique_ptr stackTraceImpl = + wrapUnique(static_cast(stackTrace.release())); + unsigned exceptionId = nextExceptionId(); + std::unique_ptr consoleMessage = + V8ConsoleMessage::createForException( + m_client->currentTimeMS(), toString16(detailedMessage), + toString16(url), lineNumber, columnNumber, std::move(stackTraceImpl), + scriptId, m_isolate, toString16(message), + V8Debugger::contextId(context), exception, exceptionId); + ensureConsoleMessageStorage(contextGroupId) + ->addMessage(std::move(consoleMessage)); + return exceptionId; +} + +void V8InspectorImpl::exceptionRevoked(v8::Local context, + unsigned exceptionId, + const StringView& message) { + int contextGroupId = V8Debugger::getGroupId(context); + if (!contextGroupId) return; + + std::unique_ptr consoleMessage = + V8ConsoleMessage::createForRevokedException( + m_client->currentTimeMS(), toString16(message), exceptionId); + ensureConsoleMessageStorage(contextGroupId) + ->addMessage(std::move(consoleMessage)); +} + +std::unique_ptr V8InspectorImpl::captureStackTrace( + bool fullStack) { + return m_debugger->captureStackTrace(fullStack); +} + +void V8InspectorImpl::asyncTaskScheduled(const StringView& taskName, void* task, + bool recurring) { + m_debugger->asyncTaskScheduled(taskName, task, recurring); +} + +void V8InspectorImpl::asyncTaskCanceled(void* task) { + m_debugger->asyncTaskCanceled(task); +} + +void V8InspectorImpl::asyncTaskStarted(void* task) { + m_debugger->asyncTaskStarted(task); +} + +void V8InspectorImpl::asyncTaskFinished(void* task) { + m_debugger->asyncTaskFinished(task); +} + +void V8InspectorImpl::allAsyncTasksCanceled() { + m_debugger->allAsyncTasksCanceled(); +} + +v8::Local V8InspectorImpl::regexContext() { + if (m_regexContext.IsEmpty()) + m_regexContext.Reset(m_isolate, v8::Context::New(m_isolate)); + return m_regexContext.Get(m_isolate); +} + +void V8InspectorImpl::discardInspectedContext(int contextGroupId, + int contextId) { + if (!getContext(contextGroupId, contextId)) return; + m_contexts[contextGroupId]->erase(contextId); + if (m_contexts[contextGroupId]->empty()) m_contexts.erase(contextGroupId); +} + +const V8InspectorImpl::ContextByIdMap* V8InspectorImpl::contextGroup( + int contextGroupId) { + ContextsByGroupMap::iterator iter = m_contexts.find(contextGroupId); + return iter == m_contexts.end() ? nullptr : iter->second.get(); +} + +V8InspectorSessionImpl* V8InspectorImpl::sessionForContextGroup( + int contextGroupId) { + if (!contextGroupId) return nullptr; + SessionMap::iterator iter = m_sessions.find(contextGroupId); + return iter == m_sessions.end() ? nullptr : iter->second; +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-inspector-impl.h b/deps/v8/src/inspector/v8-inspector-impl.h new file mode 100644 index 00000000000000..0ca1a6a7297b02 --- /dev/null +++ b/deps/v8/src/inspector/v8-inspector-impl.h @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2010, Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef V8_INSPECTOR_V8INSPECTORIMPL_H_ +#define V8_INSPECTOR_V8INSPECTORIMPL_H_ + +#include + +#include "src/base/macros.h" +#include "src/inspector/protocol/Protocol.h" + +#include "include/v8-debug.h" +#include "include/v8-inspector.h" + +namespace v8_inspector { + +class InspectedContext; +class V8ConsoleMessageStorage; +class V8Debugger; +class V8DebuggerAgentImpl; +class V8InspectorSessionImpl; +class V8ProfilerAgentImpl; +class V8RuntimeAgentImpl; +class V8StackTraceImpl; + +class V8InspectorImpl : public V8Inspector { + public: + V8InspectorImpl(v8::Isolate*, V8InspectorClient*); + ~V8InspectorImpl() override; + + v8::Isolate* isolate() const { return m_isolate; } + V8InspectorClient* client() { return m_client; } + V8Debugger* debugger() { return m_debugger.get(); } + + v8::MaybeLocal runCompiledScript(v8::Local, + v8::Local); + v8::MaybeLocal callFunction(v8::Local, + v8::Local, + v8::Local receiver, + int argc, v8::Local info[]); + v8::MaybeLocal compileAndRunInternalScript(v8::Local, + v8::Local); + v8::Local compileScript(v8::Local, + v8::Local, + const String16& fileName, + bool markAsInternal); + v8::Local regexContext(); + + // V8Inspector implementation. + std::unique_ptr connect(int contextGroupId, + V8Inspector::Channel*, + const StringView& state) override; + void contextCreated(const V8ContextInfo&) override; + void contextDestroyed(v8::Local) override; + void resetContextGroup(int contextGroupId) override; + void willExecuteScript(v8::Local, int scriptId) override; + void didExecuteScript(v8::Local) override; + void idleStarted() override; + void idleFinished() override; + unsigned exceptionThrown(v8::Local, const StringView& message, + v8::Local exception, + const StringView& detailedMessage, + const StringView& url, unsigned lineNumber, + unsigned columnNumber, std::unique_ptr, + int scriptId) override; + void exceptionRevoked(v8::Local, unsigned exceptionId, + const StringView& message) override; + std::unique_ptr createStackTrace( + v8::Local) override; + std::unique_ptr captureStackTrace(bool fullStack) override; + void asyncTaskScheduled(const StringView& taskName, void* task, + bool recurring) override; + void asyncTaskCanceled(void* task) override; + void asyncTaskStarted(void* task) override; + void asyncTaskFinished(void* task) override; + void allAsyncTasksCanceled() override; + + unsigned nextExceptionId() { return ++m_lastExceptionId; } + void enableStackCapturingIfNeeded(); + void disableStackCapturingIfNeeded(); + void muteExceptions(int contextGroupId); + void unmuteExceptions(int contextGroupId); + V8ConsoleMessageStorage* ensureConsoleMessageStorage(int contextGroupId); + bool hasConsoleMessageStorage(int contextGroupId); + using ContextByIdMap = + protocol::HashMap>; + void discardInspectedContext(int contextGroupId, int contextId); + const ContextByIdMap* contextGroup(int contextGroupId); + void disconnect(V8InspectorSessionImpl*); + V8InspectorSessionImpl* sessionForContextGroup(int contextGroupId); + InspectedContext* getContext(int groupId, int contextId) const; + V8DebuggerAgentImpl* enabledDebuggerAgentForGroup(int contextGroupId); + V8RuntimeAgentImpl* enabledRuntimeAgentForGroup(int contextGroupId); + V8ProfilerAgentImpl* enabledProfilerAgentForGroup(int contextGroupId); + + private: + v8::Isolate* m_isolate; + V8InspectorClient* m_client; + std::unique_ptr m_debugger; + v8::Global m_regexContext; + int m_capturingStackTracesCount; + unsigned m_lastExceptionId; + + using MuteExceptionsMap = protocol::HashMap; + MuteExceptionsMap m_muteExceptionsMap; + + using ContextsByGroupMap = + protocol::HashMap>; + ContextsByGroupMap m_contexts; + + using SessionMap = protocol::HashMap; + SessionMap m_sessions; + + using ConsoleStorageMap = + protocol::HashMap>; + ConsoleStorageMap m_consoleStorageMap; + + DISALLOW_COPY_AND_ASSIGN(V8InspectorImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8INSPECTORIMPL_H_ diff --git a/deps/v8/src/inspector/v8-inspector-session-impl.cc b/deps/v8/src/inspector/v8-inspector-session-impl.cc new file mode 100644 index 00000000000000..c3d3f48f00fb52 --- /dev/null +++ b/deps/v8/src/inspector/v8-inspector-session-impl.cc @@ -0,0 +1,417 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-inspector-session-impl.h" + +#include "src/inspector/injected-script.h" +#include "src/inspector/inspected-context.h" +#include "src/inspector/protocol/Protocol.h" +#include "src/inspector/remote-object-id.h" +#include "src/inspector/search-util.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-console-agent-impl.h" +#include "src/inspector/v8-debugger-agent-impl.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-heap-profiler-agent-impl.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-profiler-agent-impl.h" +#include "src/inspector/v8-runtime-agent-impl.h" +#include "src/inspector/v8-schema-agent-impl.h" + +namespace v8_inspector { + +// static +bool V8InspectorSession::canDispatchMethod(const StringView& method) { + return stringViewStartsWith(method, + protocol::Runtime::Metainfo::commandPrefix) || + stringViewStartsWith(method, + protocol::Debugger::Metainfo::commandPrefix) || + stringViewStartsWith(method, + protocol::Profiler::Metainfo::commandPrefix) || + stringViewStartsWith( + method, protocol::HeapProfiler::Metainfo::commandPrefix) || + stringViewStartsWith(method, + protocol::Console::Metainfo::commandPrefix) || + stringViewStartsWith(method, + protocol::Schema::Metainfo::commandPrefix); +} + +std::unique_ptr V8InspectorSessionImpl::create( + V8InspectorImpl* inspector, int contextGroupId, + V8Inspector::Channel* channel, const StringView& state) { + return wrapUnique( + new V8InspectorSessionImpl(inspector, contextGroupId, channel, state)); +} + +V8InspectorSessionImpl::V8InspectorSessionImpl(V8InspectorImpl* inspector, + int contextGroupId, + V8Inspector::Channel* channel, + const StringView& savedState) + : m_contextGroupId(contextGroupId), + m_inspector(inspector), + m_channel(channel), + m_customObjectFormatterEnabled(false), + m_dispatcher(this), + m_state(nullptr), + m_runtimeAgent(nullptr), + m_debuggerAgent(nullptr), + m_heapProfilerAgent(nullptr), + m_profilerAgent(nullptr), + m_consoleAgent(nullptr), + m_schemaAgent(nullptr) { + if (savedState.length()) { + std::unique_ptr state = + protocol::parseJSON(toString16(savedState)); + if (state) m_state = protocol::DictionaryValue::cast(std::move(state)); + if (!m_state) m_state = protocol::DictionaryValue::create(); + } else { + m_state = protocol::DictionaryValue::create(); + } + + m_runtimeAgent = wrapUnique(new V8RuntimeAgentImpl( + this, this, agentState(protocol::Runtime::Metainfo::domainName))); + protocol::Runtime::Dispatcher::wire(&m_dispatcher, m_runtimeAgent.get()); + + m_debuggerAgent = wrapUnique(new V8DebuggerAgentImpl( + this, this, agentState(protocol::Debugger::Metainfo::domainName))); + protocol::Debugger::Dispatcher::wire(&m_dispatcher, m_debuggerAgent.get()); + + m_profilerAgent = wrapUnique(new V8ProfilerAgentImpl( + this, this, agentState(protocol::Profiler::Metainfo::domainName))); + protocol::Profiler::Dispatcher::wire(&m_dispatcher, m_profilerAgent.get()); + + m_heapProfilerAgent = wrapUnique(new V8HeapProfilerAgentImpl( + this, this, agentState(protocol::HeapProfiler::Metainfo::domainName))); + protocol::HeapProfiler::Dispatcher::wire(&m_dispatcher, + m_heapProfilerAgent.get()); + + m_consoleAgent = wrapUnique(new V8ConsoleAgentImpl( + this, this, agentState(protocol::Console::Metainfo::domainName))); + protocol::Console::Dispatcher::wire(&m_dispatcher, m_consoleAgent.get()); + + m_schemaAgent = wrapUnique(new V8SchemaAgentImpl( + this, this, agentState(protocol::Schema::Metainfo::domainName))); + protocol::Schema::Dispatcher::wire(&m_dispatcher, m_schemaAgent.get()); + + if (savedState.length()) { + m_runtimeAgent->restore(); + m_debuggerAgent->restore(); + m_heapProfilerAgent->restore(); + m_profilerAgent->restore(); + m_consoleAgent->restore(); + } +} + +V8InspectorSessionImpl::~V8InspectorSessionImpl() { + ErrorString errorString; + m_consoleAgent->disable(&errorString); + m_profilerAgent->disable(&errorString); + m_heapProfilerAgent->disable(&errorString); + m_debuggerAgent->disable(&errorString); + m_runtimeAgent->disable(&errorString); + + discardInjectedScripts(); + m_inspector->disconnect(this); +} + +protocol::DictionaryValue* V8InspectorSessionImpl::agentState( + const String16& name) { + protocol::DictionaryValue* state = m_state->getObject(name); + if (!state) { + std::unique_ptr newState = + protocol::DictionaryValue::create(); + state = newState.get(); + m_state->setObject(name, std::move(newState)); + } + return state; +} + +void V8InspectorSessionImpl::sendProtocolResponse(int callId, + const String16& message) { + m_channel->sendProtocolResponse(callId, toStringView(message)); +} + +void V8InspectorSessionImpl::sendProtocolNotification(const String16& message) { + m_channel->sendProtocolNotification(toStringView(message)); +} + +void V8InspectorSessionImpl::flushProtocolNotifications() { + m_channel->flushProtocolNotifications(); +} + +void V8InspectorSessionImpl::reset() { + m_debuggerAgent->reset(); + m_runtimeAgent->reset(); + discardInjectedScripts(); +} + +void V8InspectorSessionImpl::discardInjectedScripts() { + m_inspectedObjects.clear(); + const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_contextGroupId); + if (!contexts) return; + + std::vector keys; + keys.reserve(contexts->size()); + for (auto& idContext : *contexts) keys.push_back(idContext.first); + for (auto& key : keys) { + contexts = m_inspector->contextGroup(m_contextGroupId); + if (!contexts) continue; + auto contextIt = contexts->find(key); + if (contextIt != contexts->end()) + contextIt->second + ->discardInjectedScript(); // This may destroy some contexts. + } +} + +InjectedScript* V8InspectorSessionImpl::findInjectedScript( + ErrorString* errorString, int contextId) { + if (!contextId) { + *errorString = "Cannot find context with specified id"; + return nullptr; + } + + const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_contextGroupId); + if (!contexts) { + *errorString = "Cannot find context with specified id"; + return nullptr; + } + + auto contextsIt = contexts->find(contextId); + if (contextsIt == contexts->end()) { + *errorString = "Cannot find context with specified id"; + return nullptr; + } + + const std::unique_ptr& context = contextsIt->second; + if (!context->getInjectedScript()) { + if (!context->createInjectedScript()) { + *errorString = "Cannot access specified execution context"; + return nullptr; + } + if (m_customObjectFormatterEnabled) + context->getInjectedScript()->setCustomObjectFormatterEnabled(true); + } + return context->getInjectedScript(); +} + +InjectedScript* V8InspectorSessionImpl::findInjectedScript( + ErrorString* errorString, RemoteObjectIdBase* objectId) { + return objectId ? findInjectedScript(errorString, objectId->contextId()) + : nullptr; +} + +void V8InspectorSessionImpl::releaseObjectGroup(const StringView& objectGroup) { + releaseObjectGroup(toString16(objectGroup)); +} + +void V8InspectorSessionImpl::releaseObjectGroup(const String16& objectGroup) { + const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_contextGroupId); + if (!contexts) return; + + std::vector keys; + for (auto& idContext : *contexts) keys.push_back(idContext.first); + for (auto& key : keys) { + contexts = m_inspector->contextGroup(m_contextGroupId); + if (!contexts) continue; + auto contextsIt = contexts->find(key); + if (contextsIt == contexts->end()) continue; + InjectedScript* injectedScript = contextsIt->second->getInjectedScript(); + if (injectedScript) + injectedScript->releaseObjectGroup( + objectGroup); // This may destroy some contexts. + } +} + +bool V8InspectorSessionImpl::unwrapObject( + std::unique_ptr* error, const StringView& objectId, + v8::Local* object, v8::Local* context, + std::unique_ptr* objectGroup) { + ErrorString errorString; + String16 objectGroupString; + bool result = + unwrapObject(&errorString, toString16(objectId), object, context, + objectGroup ? &objectGroupString : nullptr); + if (error) *error = StringBufferImpl::adopt(errorString); + if (objectGroup) *objectGroup = StringBufferImpl::adopt(objectGroupString); + return result; +} + +bool V8InspectorSessionImpl::unwrapObject(ErrorString* errorString, + const String16& objectId, + v8::Local* object, + v8::Local* context, + String16* objectGroup) { + std::unique_ptr remoteId = + RemoteObjectId::parse(errorString, objectId); + if (!remoteId) return false; + InjectedScript* injectedScript = + findInjectedScript(errorString, remoteId.get()); + if (!injectedScript) return false; + if (!injectedScript->findObject(errorString, *remoteId, object)) return false; + *context = injectedScript->context()->context(); + if (objectGroup) *objectGroup = injectedScript->objectGroupName(*remoteId); + return true; +} + +std::unique_ptr +V8InspectorSessionImpl::wrapObject(v8::Local context, + v8::Local value, + const StringView& groupName) { + return wrapObject(context, value, toString16(groupName), false); +} + +std::unique_ptr +V8InspectorSessionImpl::wrapObject(v8::Local context, + v8::Local value, + const String16& groupName, + bool generatePreview) { + ErrorString errorString; + InjectedScript* injectedScript = + findInjectedScript(&errorString, V8Debugger::contextId(context)); + if (!injectedScript) return nullptr; + return injectedScript->wrapObject(&errorString, value, groupName, false, + generatePreview); +} + +std::unique_ptr +V8InspectorSessionImpl::wrapTable(v8::Local context, + v8::Local table, + v8::Local columns) { + ErrorString errorString; + InjectedScript* injectedScript = + findInjectedScript(&errorString, V8Debugger::contextId(context)); + if (!injectedScript) return nullptr; + return injectedScript->wrapTable(table, columns); +} + +void V8InspectorSessionImpl::setCustomObjectFormatterEnabled(bool enabled) { + m_customObjectFormatterEnabled = enabled; + const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_contextGroupId); + if (!contexts) return; + for (auto& idContext : *contexts) { + InjectedScript* injectedScript = idContext.second->getInjectedScript(); + if (injectedScript) + injectedScript->setCustomObjectFormatterEnabled(enabled); + } +} + +void V8InspectorSessionImpl::reportAllContexts(V8RuntimeAgentImpl* agent) { + const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_contextGroupId); + if (!contexts) return; + for (auto& idContext : *contexts) + agent->reportExecutionContextCreated(idContext.second.get()); +} + +void V8InspectorSessionImpl::dispatchProtocolMessage( + const StringView& message) { + m_dispatcher.dispatch(protocol::parseJSON(message)); +} + +std::unique_ptr V8InspectorSessionImpl::stateJSON() { + String16 json = m_state->toJSONString(); + return StringBufferImpl::adopt(json); +} + +std::vector> +V8InspectorSessionImpl::supportedDomains() { + std::vector> domains = + supportedDomainsImpl(); + std::vector> result; + for (size_t i = 0; i < domains.size(); ++i) + result.push_back(std::move(domains[i])); + return result; +} + +std::vector> +V8InspectorSessionImpl::supportedDomainsImpl() { + std::vector> result; + result.push_back(protocol::Schema::Domain::create() + .setName(protocol::Runtime::Metainfo::domainName) + .setVersion(protocol::Runtime::Metainfo::version) + .build()); + result.push_back(protocol::Schema::Domain::create() + .setName(protocol::Debugger::Metainfo::domainName) + .setVersion(protocol::Debugger::Metainfo::version) + .build()); + result.push_back(protocol::Schema::Domain::create() + .setName(protocol::Profiler::Metainfo::domainName) + .setVersion(protocol::Profiler::Metainfo::version) + .build()); + result.push_back(protocol::Schema::Domain::create() + .setName(protocol::HeapProfiler::Metainfo::domainName) + .setVersion(protocol::HeapProfiler::Metainfo::version) + .build()); + result.push_back(protocol::Schema::Domain::create() + .setName(protocol::Schema::Metainfo::domainName) + .setVersion(protocol::Schema::Metainfo::version) + .build()); + return result; +} + +void V8InspectorSessionImpl::addInspectedObject( + std::unique_ptr inspectable) { + m_inspectedObjects.insert(m_inspectedObjects.begin(), std::move(inspectable)); + if (m_inspectedObjects.size() > kInspectedObjectBufferSize) + m_inspectedObjects.resize(kInspectedObjectBufferSize); +} + +V8InspectorSession::Inspectable* V8InspectorSessionImpl::inspectedObject( + unsigned num) { + if (num >= m_inspectedObjects.size()) return nullptr; + return m_inspectedObjects[num].get(); +} + +void V8InspectorSessionImpl::schedulePauseOnNextStatement( + const StringView& breakReason, const StringView& breakDetails) { + m_debuggerAgent->schedulePauseOnNextStatement( + toString16(breakReason), + protocol::DictionaryValue::cast(protocol::parseJSON(breakDetails))); +} + +void V8InspectorSessionImpl::cancelPauseOnNextStatement() { + m_debuggerAgent->cancelPauseOnNextStatement(); +} + +void V8InspectorSessionImpl::breakProgram(const StringView& breakReason, + const StringView& breakDetails) { + m_debuggerAgent->breakProgram( + toString16(breakReason), + protocol::DictionaryValue::cast(protocol::parseJSON(breakDetails))); +} + +void V8InspectorSessionImpl::setSkipAllPauses(bool skip) { + ErrorString errorString; + m_debuggerAgent->setSkipAllPauses(&errorString, skip); +} + +void V8InspectorSessionImpl::resume() { + ErrorString errorString; + m_debuggerAgent->resume(&errorString); +} + +void V8InspectorSessionImpl::stepOver() { + ErrorString errorString; + m_debuggerAgent->stepOver(&errorString); +} + +std::vector> +V8InspectorSessionImpl::searchInTextByLines(const StringView& text, + const StringView& query, + bool caseSensitive, bool isRegex) { + // TODO(dgozman): search may operate on StringView and avoid copying |text|. + std::vector> matches = + searchInTextByLinesImpl(this, toString16(text), toString16(query), + caseSensitive, isRegex); + std::vector> result; + for (size_t i = 0; i < matches.size(); ++i) + result.push_back(std::move(matches[i])); + return result; +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-inspector-session-impl.h b/deps/v8/src/inspector/v8-inspector-session-impl.h new file mode 100644 index 00000000000000..e84e8c99a77c3f --- /dev/null +++ b/deps/v8/src/inspector/v8-inspector-session-impl.h @@ -0,0 +1,126 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8INSPECTORSESSIONIMPL_H_ +#define V8_INSPECTOR_V8INSPECTORSESSIONIMPL_H_ + +#include + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Runtime.h" +#include "src/inspector/protocol/Schema.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +class InjectedScript; +class RemoteObjectIdBase; +class V8ConsoleAgentImpl; +class V8DebuggerAgentImpl; +class V8InspectorImpl; +class V8HeapProfilerAgentImpl; +class V8ProfilerAgentImpl; +class V8RuntimeAgentImpl; +class V8SchemaAgentImpl; + +using protocol::ErrorString; + +class V8InspectorSessionImpl : public V8InspectorSession, + public protocol::FrontendChannel { + public: + static std::unique_ptr create( + V8InspectorImpl*, int contextGroupId, V8Inspector::Channel*, + const StringView& state); + ~V8InspectorSessionImpl(); + + V8InspectorImpl* inspector() const { return m_inspector; } + V8ConsoleAgentImpl* consoleAgent() { return m_consoleAgent.get(); } + V8DebuggerAgentImpl* debuggerAgent() { return m_debuggerAgent.get(); } + V8SchemaAgentImpl* schemaAgent() { return m_schemaAgent.get(); } + V8ProfilerAgentImpl* profilerAgent() { return m_profilerAgent.get(); } + V8RuntimeAgentImpl* runtimeAgent() { return m_runtimeAgent.get(); } + int contextGroupId() const { return m_contextGroupId; } + + InjectedScript* findInjectedScript(ErrorString*, int contextId); + InjectedScript* findInjectedScript(ErrorString*, RemoteObjectIdBase*); + void reset(); + void discardInjectedScripts(); + void reportAllContexts(V8RuntimeAgentImpl*); + void setCustomObjectFormatterEnabled(bool); + std::unique_ptr wrapObject( + v8::Local, v8::Local, const String16& groupName, + bool generatePreview); + std::unique_ptr wrapTable( + v8::Local, v8::Local table, + v8::Local columns); + std::vector> supportedDomainsImpl(); + bool unwrapObject(ErrorString*, const String16& objectId, + v8::Local*, v8::Local*, + String16* objectGroup); + void releaseObjectGroup(const String16& objectGroup); + + // V8InspectorSession implementation. + void dispatchProtocolMessage(const StringView& message) override; + std::unique_ptr stateJSON() override; + std::vector> supportedDomains() + override; + void addInspectedObject( + std::unique_ptr) override; + void schedulePauseOnNextStatement(const StringView& breakReason, + const StringView& breakDetails) override; + void cancelPauseOnNextStatement() override; + void breakProgram(const StringView& breakReason, + const StringView& breakDetails) override; + void setSkipAllPauses(bool) override; + void resume() override; + void stepOver() override; + std::vector> + searchInTextByLines(const StringView& text, const StringView& query, + bool caseSensitive, bool isRegex) override; + void releaseObjectGroup(const StringView& objectGroup) override; + bool unwrapObject(std::unique_ptr*, const StringView& objectId, + v8::Local*, v8::Local*, + std::unique_ptr* objectGroup) override; + std::unique_ptr wrapObject( + v8::Local, v8::Local, + const StringView& groupName) override; + + V8InspectorSession::Inspectable* inspectedObject(unsigned num); + static const unsigned kInspectedObjectBufferSize = 5; + + private: + V8InspectorSessionImpl(V8InspectorImpl*, int contextGroupId, + V8Inspector::Channel*, const StringView& state); + protocol::DictionaryValue* agentState(const String16& name); + + // protocol::FrontendChannel implementation. + void sendProtocolResponse(int callId, const String16& message) override; + void sendProtocolNotification(const String16& message) override; + void flushProtocolNotifications() override; + + int m_contextGroupId; + V8InspectorImpl* m_inspector; + V8Inspector::Channel* m_channel; + bool m_customObjectFormatterEnabled; + + protocol::UberDispatcher m_dispatcher; + std::unique_ptr m_state; + + std::unique_ptr m_runtimeAgent; + std::unique_ptr m_debuggerAgent; + std::unique_ptr m_heapProfilerAgent; + std::unique_ptr m_profilerAgent; + std::unique_ptr m_consoleAgent; + std::unique_ptr m_schemaAgent; + std::vector> + m_inspectedObjects; + + DISALLOW_COPY_AND_ASSIGN(V8InspectorSessionImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8INSPECTORSESSIONIMPL_H_ diff --git a/deps/v8/src/inspector/v8-internal-value-type.cc b/deps/v8/src/inspector/v8-internal-value-type.cc new file mode 100644 index 00000000000000..cde8bc9f7f9957 --- /dev/null +++ b/deps/v8/src/inspector/v8-internal-value-type.cc @@ -0,0 +1,77 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-internal-value-type.h" + +#include "src/inspector/protocol-platform.h" +#include "src/inspector/string-util.h" + +namespace v8_inspector { + +namespace { + +v8::Local internalSubtypePrivate(v8::Isolate* isolate) { + return v8::Private::ForApi( + isolate, + toV8StringInternalized(isolate, "V8InternalType#internalSubtype")); +} + +v8::Local subtypeForInternalType(v8::Isolate* isolate, + V8InternalValueType type) { + switch (type) { + case V8InternalValueType::kEntry: + return toV8StringInternalized(isolate, "internal#entry"); + case V8InternalValueType::kLocation: + return toV8StringInternalized(isolate, "internal#location"); + case V8InternalValueType::kScope: + return toV8StringInternalized(isolate, "internal#scope"); + case V8InternalValueType::kScopeList: + return toV8StringInternalized(isolate, "internal#scopeList"); + } + UNREACHABLE(); + return v8::Local(); +} + +} // namespace + +bool markAsInternal(v8::Local context, + v8::Local object, V8InternalValueType type) { + v8::Isolate* isolate = context->GetIsolate(); + v8::Local privateValue = internalSubtypePrivate(isolate); + v8::Local subtype = subtypeForInternalType(isolate, type); + return object->SetPrivate(context, privateValue, subtype).FromMaybe(false); +} + +bool markArrayEntriesAsInternal(v8::Local context, + v8::Local array, + V8InternalValueType type) { + v8::Isolate* isolate = context->GetIsolate(); + v8::Local privateValue = internalSubtypePrivate(isolate); + v8::Local subtype = subtypeForInternalType(isolate, type); + for (uint32_t i = 0; i < array->Length(); ++i) { + v8::Local entry; + if (!array->Get(context, i).ToLocal(&entry) || !entry->IsObject()) + return false; + if (!entry.As() + ->SetPrivate(context, privateValue, subtype) + .FromMaybe(false)) + return false; + } + return true; +} + +v8::Local v8InternalValueTypeFrom(v8::Local context, + v8::Local object) { + v8::Isolate* isolate = context->GetIsolate(); + v8::Local privateValue = internalSubtypePrivate(isolate); + if (!object->HasPrivate(context, privateValue).FromMaybe(false)) + return v8::Null(isolate); + v8::Local subtypeValue; + if (!object->GetPrivate(context, privateValue).ToLocal(&subtypeValue) || + !subtypeValue->IsString()) + return v8::Null(isolate); + return subtypeValue; +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-internal-value-type.h b/deps/v8/src/inspector/v8-internal-value-type.h new file mode 100644 index 00000000000000..e648a0d4a3ec7d --- /dev/null +++ b/deps/v8/src/inspector/v8-internal-value-type.h @@ -0,0 +1,23 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8INTERNALVALUETYPE_H_ +#define V8_INSPECTOR_V8INTERNALVALUETYPE_H_ + +#include "include/v8.h" + +namespace v8_inspector { + +enum class V8InternalValueType { kEntry, kLocation, kScope, kScopeList }; + +bool markAsInternal(v8::Local, v8::Local, + V8InternalValueType); +bool markArrayEntriesAsInternal(v8::Local, v8::Local, + V8InternalValueType); +v8::Local v8InternalValueTypeFrom(v8::Local, + v8::Local); + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8INTERNALVALUETYPE_H_ diff --git a/deps/v8/src/inspector/v8-profiler-agent-impl.cc b/deps/v8/src/inspector/v8-profiler-agent-impl.cc new file mode 100644 index 00000000000000..0511ca39b55ca1 --- /dev/null +++ b/deps/v8/src/inspector/v8-profiler-agent-impl.cc @@ -0,0 +1,321 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-profiler-agent-impl.h" + +#include + +#include "src/base/atomicops.h" +#include "src/inspector/protocol/Protocol.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-inspector-session-impl.h" +#include "src/inspector/v8-stack-trace-impl.h" + +#include "include/v8-profiler.h" + +namespace v8_inspector { + +namespace ProfilerAgentState { +static const char samplingInterval[] = "samplingInterval"; +static const char userInitiatedProfiling[] = "userInitiatedProfiling"; +static const char profilerEnabled[] = "profilerEnabled"; +} + +namespace { + +std::unique_ptr> +buildInspectorObjectForPositionTicks(const v8::CpuProfileNode* node) { + unsigned lineCount = node->GetHitLineCount(); + if (!lineCount) return nullptr; + auto array = protocol::Array::create(); + std::vector entries(lineCount); + if (node->GetLineTicks(&entries[0], lineCount)) { + for (unsigned i = 0; i < lineCount; i++) { + std::unique_ptr line = + protocol::Profiler::PositionTickInfo::create() + .setLine(entries[i].line) + .setTicks(entries[i].hit_count) + .build(); + array->addItem(std::move(line)); + } + } + return array; +} + +std::unique_ptr buildInspectorObjectFor( + v8::Isolate* isolate, const v8::CpuProfileNode* node) { + v8::HandleScope handleScope(isolate); + auto callFrame = + protocol::Runtime::CallFrame::create() + .setFunctionName(toProtocolString(node->GetFunctionName())) + .setScriptId(String16::fromInteger(node->GetScriptId())) + .setUrl(toProtocolString(node->GetScriptResourceName())) + .setLineNumber(node->GetLineNumber() - 1) + .setColumnNumber(node->GetColumnNumber() - 1) + .build(); + auto result = protocol::Profiler::ProfileNode::create() + .setCallFrame(std::move(callFrame)) + .setHitCount(node->GetHitCount()) + .setId(node->GetNodeId()) + .build(); + + const int childrenCount = node->GetChildrenCount(); + if (childrenCount) { + auto children = protocol::Array::create(); + for (int i = 0; i < childrenCount; i++) + children->addItem(node->GetChild(i)->GetNodeId()); + result->setChildren(std::move(children)); + } + + const char* deoptReason = node->GetBailoutReason(); + if (deoptReason && deoptReason[0] && strcmp(deoptReason, "no reason")) + result->setDeoptReason(deoptReason); + + auto positionTicks = buildInspectorObjectForPositionTicks(node); + if (positionTicks) result->setPositionTicks(std::move(positionTicks)); + + return result; +} + +std::unique_ptr> buildInspectorObjectForSamples( + v8::CpuProfile* v8profile) { + auto array = protocol::Array::create(); + int count = v8profile->GetSamplesCount(); + for (int i = 0; i < count; i++) + array->addItem(v8profile->GetSample(i)->GetNodeId()); + return array; +} + +std::unique_ptr> buildInspectorObjectForTimestamps( + v8::CpuProfile* v8profile) { + auto array = protocol::Array::create(); + int count = v8profile->GetSamplesCount(); + uint64_t lastTime = v8profile->GetStartTime(); + for (int i = 0; i < count; i++) { + uint64_t ts = v8profile->GetSampleTimestamp(i); + array->addItem(static_cast(ts - lastTime)); + lastTime = ts; + } + return array; +} + +void flattenNodesTree(v8::Isolate* isolate, const v8::CpuProfileNode* node, + protocol::Array* list) { + list->addItem(buildInspectorObjectFor(isolate, node)); + const int childrenCount = node->GetChildrenCount(); + for (int i = 0; i < childrenCount; i++) + flattenNodesTree(isolate, node->GetChild(i), list); +} + +std::unique_ptr createCPUProfile( + v8::Isolate* isolate, v8::CpuProfile* v8profile) { + auto nodes = protocol::Array::create(); + flattenNodesTree(isolate, v8profile->GetTopDownRoot(), nodes.get()); + return protocol::Profiler::Profile::create() + .setNodes(std::move(nodes)) + .setStartTime(static_cast(v8profile->GetStartTime())) + .setEndTime(static_cast(v8profile->GetEndTime())) + .setSamples(buildInspectorObjectForSamples(v8profile)) + .setTimeDeltas(buildInspectorObjectForTimestamps(v8profile)) + .build(); +} + +std::unique_ptr currentDebugLocation( + V8InspectorImpl* inspector) { + std::unique_ptr callStack = + inspector->debugger()->captureStackTrace(false /* fullStack */); + auto location = protocol::Debugger::Location::create() + .setScriptId(toString16(callStack->topScriptId())) + .setLineNumber(callStack->topLineNumber()) + .build(); + location->setColumnNumber(callStack->topColumnNumber()); + return location; +} + +volatile int s_lastProfileId = 0; + +} // namespace + +class V8ProfilerAgentImpl::ProfileDescriptor { + public: + ProfileDescriptor(const String16& id, const String16& title) + : m_id(id), m_title(title) {} + String16 m_id; + String16 m_title; +}; + +V8ProfilerAgentImpl::V8ProfilerAgentImpl( + V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, + protocol::DictionaryValue* state) + : m_session(session), + m_isolate(m_session->inspector()->isolate()), + m_profiler(nullptr), + m_state(state), + m_frontend(frontendChannel), + m_enabled(false), + m_recordingCPUProfile(false) {} + +V8ProfilerAgentImpl::~V8ProfilerAgentImpl() { + if (m_profiler) m_profiler->Dispose(); +} + +void V8ProfilerAgentImpl::consoleProfile(const String16& title) { + if (!m_enabled) return; + String16 id = nextProfileId(); + m_startedProfiles.push_back(ProfileDescriptor(id, title)); + startProfiling(id); + m_frontend.consoleProfileStarted( + id, currentDebugLocation(m_session->inspector()), title); +} + +void V8ProfilerAgentImpl::consoleProfileEnd(const String16& title) { + if (!m_enabled) return; + String16 id; + String16 resolvedTitle; + // Take last started profile if no title was passed. + if (title.isEmpty()) { + if (m_startedProfiles.empty()) return; + id = m_startedProfiles.back().m_id; + resolvedTitle = m_startedProfiles.back().m_title; + m_startedProfiles.pop_back(); + } else { + for (size_t i = 0; i < m_startedProfiles.size(); i++) { + if (m_startedProfiles[i].m_title == title) { + resolvedTitle = title; + id = m_startedProfiles[i].m_id; + m_startedProfiles.erase(m_startedProfiles.begin() + i); + break; + } + } + if (id.isEmpty()) return; + } + std::unique_ptr profile = + stopProfiling(id, true); + if (!profile) return; + std::unique_ptr location = + currentDebugLocation(m_session->inspector()); + m_frontend.consoleProfileFinished(id, std::move(location), std::move(profile), + resolvedTitle); +} + +void V8ProfilerAgentImpl::enable(ErrorString*) { + if (m_enabled) return; + m_enabled = true; + DCHECK(!m_profiler); + m_profiler = v8::CpuProfiler::New(m_isolate); + m_state->setBoolean(ProfilerAgentState::profilerEnabled, true); +} + +void V8ProfilerAgentImpl::disable(ErrorString* errorString) { + if (!m_enabled) return; + for (size_t i = m_startedProfiles.size(); i > 0; --i) + stopProfiling(m_startedProfiles[i - 1].m_id, false); + m_startedProfiles.clear(); + stop(nullptr, nullptr); + m_profiler->Dispose(); + m_profiler = nullptr; + m_enabled = false; + m_state->setBoolean(ProfilerAgentState::profilerEnabled, false); +} + +void V8ProfilerAgentImpl::setSamplingInterval(ErrorString* error, + int interval) { + if (m_recordingCPUProfile) { + *error = "Cannot change sampling interval when profiling."; + return; + } + m_state->setInteger(ProfilerAgentState::samplingInterval, interval); + m_profiler->SetSamplingInterval(interval); +} + +void V8ProfilerAgentImpl::restore() { + DCHECK(!m_enabled); + if (!m_state->booleanProperty(ProfilerAgentState::profilerEnabled, false)) + return; + m_enabled = true; + DCHECK(!m_profiler); + m_profiler = v8::CpuProfiler::New(m_isolate); + int interval = 0; + m_state->getInteger(ProfilerAgentState::samplingInterval, &interval); + if (interval) m_profiler->SetSamplingInterval(interval); + if (m_state->booleanProperty(ProfilerAgentState::userInitiatedProfiling, + false)) { + ErrorString error; + start(&error); + } +} + +void V8ProfilerAgentImpl::start(ErrorString* error) { + if (m_recordingCPUProfile) return; + if (!m_enabled) { + *error = "Profiler is not enabled"; + return; + } + m_recordingCPUProfile = true; + m_frontendInitiatedProfileId = nextProfileId(); + startProfiling(m_frontendInitiatedProfileId); + m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, true); +} + +void V8ProfilerAgentImpl::stop( + ErrorString* errorString, + std::unique_ptr* profile) { + if (!m_recordingCPUProfile) { + if (errorString) *errorString = "No recording profiles found"; + return; + } + m_recordingCPUProfile = false; + std::unique_ptr cpuProfile = + stopProfiling(m_frontendInitiatedProfileId, !!profile); + if (profile) { + *profile = std::move(cpuProfile); + if (!profile->get() && errorString) *errorString = "Profile is not found"; + } + m_frontendInitiatedProfileId = String16(); + m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, false); +} + +String16 V8ProfilerAgentImpl::nextProfileId() { + return String16::fromInteger( + v8::base::NoBarrier_AtomicIncrement(&s_lastProfileId, 1)); +} + +void V8ProfilerAgentImpl::startProfiling(const String16& title) { + v8::HandleScope handleScope(m_isolate); + m_profiler->StartProfiling(toV8String(m_isolate, title), true); +} + +std::unique_ptr V8ProfilerAgentImpl::stopProfiling( + const String16& title, bool serialize) { + v8::HandleScope handleScope(m_isolate); + v8::CpuProfile* profile = + m_profiler->StopProfiling(toV8String(m_isolate, title)); + if (!profile) return nullptr; + std::unique_ptr result; + if (serialize) result = createCPUProfile(m_isolate, profile); + profile->Delete(); + return result; +} + +bool V8ProfilerAgentImpl::isRecording() const { + return m_recordingCPUProfile || !m_startedProfiles.empty(); +} + +bool V8ProfilerAgentImpl::idleStarted() { + if (m_profiler) m_profiler->SetIdle(true); + return m_profiler; +} + +bool V8ProfilerAgentImpl::idleFinished() { + if (m_profiler) m_profiler->SetIdle(false); + return m_profiler; +} + +void V8ProfilerAgentImpl::collectSample() { + if (m_profiler) m_profiler->CollectSample(); +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-profiler-agent-impl.h b/deps/v8/src/inspector/v8-profiler-agent-impl.h new file mode 100644 index 00000000000000..ee8997653af518 --- /dev/null +++ b/deps/v8/src/inspector/v8-profiler-agent-impl.h @@ -0,0 +1,74 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8PROFILERAGENTIMPL_H_ +#define V8_INSPECTOR_V8PROFILERAGENTIMPL_H_ + +#include + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Profiler.h" + +namespace v8 { +class CpuProfiler; +class Isolate; +} + +namespace v8_inspector { + +class V8InspectorSessionImpl; + +using protocol::ErrorString; + +class V8ProfilerAgentImpl : public protocol::Profiler::Backend { + public: + V8ProfilerAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, + protocol::DictionaryValue* state); + ~V8ProfilerAgentImpl() override; + + bool enabled() const { return m_enabled; } + void restore(); + + void enable(ErrorString*) override; + void disable(ErrorString*) override; + void setSamplingInterval(ErrorString*, int) override; + void start(ErrorString*) override; + void stop(ErrorString*, + std::unique_ptr*) override; + + void consoleProfile(const String16& title); + void consoleProfileEnd(const String16& title); + + bool idleStarted(); + bool idleFinished(); + + void collectSample(); + + private: + String16 nextProfileId(); + + void startProfiling(const String16& title); + std::unique_ptr stopProfiling( + const String16& title, bool serialize); + + bool isRecording() const; + + V8InspectorSessionImpl* m_session; + v8::Isolate* m_isolate; + v8::CpuProfiler* m_profiler; + protocol::DictionaryValue* m_state; + protocol::Profiler::Frontend m_frontend; + bool m_enabled; + bool m_recordingCPUProfile; + class ProfileDescriptor; + std::vector m_startedProfiles; + String16 m_frontendInitiatedProfileId; + + DISALLOW_COPY_AND_ASSIGN(V8ProfilerAgentImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8PROFILERAGENTIMPL_H_ diff --git a/deps/v8/src/inspector/v8-regex.cc b/deps/v8/src/inspector/v8-regex.cc new file mode 100644 index 00000000000000..47af70d3604ae1 --- /dev/null +++ b/deps/v8/src/inspector/v8-regex.cc @@ -0,0 +1,93 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-regex.h" + +#include + +#include "src/inspector/string-util.h" +#include "src/inspector/v8-inspector-impl.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +V8Regex::V8Regex(V8InspectorImpl* inspector, const String16& pattern, + bool caseSensitive, bool multiline) + : m_inspector(inspector) { + v8::Isolate* isolate = m_inspector->isolate(); + v8::HandleScope handleScope(isolate); + v8::Local context = m_inspector->regexContext(); + v8::Context::Scope contextScope(context); + v8::TryCatch tryCatch(isolate); + + unsigned flags = v8::RegExp::kNone; + if (!caseSensitive) flags |= v8::RegExp::kIgnoreCase; + if (multiline) flags |= v8::RegExp::kMultiline; + + v8::Local regex; + if (v8::RegExp::New(context, toV8String(isolate, pattern), + static_cast(flags)) + .ToLocal(®ex)) + m_regex.Reset(isolate, regex); + else if (tryCatch.HasCaught()) + m_errorMessage = toProtocolString(tryCatch.Message()->Get()); + else + m_errorMessage = "Internal error"; +} + +int V8Regex::match(const String16& string, int startFrom, + int* matchLength) const { + if (matchLength) *matchLength = 0; + + if (m_regex.IsEmpty() || string.isEmpty()) return -1; + + // v8 strings are limited to int. + if (string.length() > INT_MAX) return -1; + + v8::Isolate* isolate = m_inspector->isolate(); + v8::HandleScope handleScope(isolate); + v8::Local context = m_inspector->regexContext(); + v8::MicrotasksScope microtasks(isolate, + v8::MicrotasksScope::kDoNotRunMicrotasks); + v8::TryCatch tryCatch(isolate); + + v8::Local regex = m_regex.Get(isolate); + v8::Local exec; + if (!regex->Get(context, toV8StringInternalized(isolate, "exec")) + .ToLocal(&exec)) + return -1; + v8::Local argv[] = { + toV8String(isolate, string.substring(startFrom))}; + v8::Local returnValue; + if (!exec.As() + ->Call(context, regex, arraysize(argv), argv) + .ToLocal(&returnValue)) + return -1; + + // RegExp#exec returns null if there's no match, otherwise it returns an + // Array of strings with the first being the whole match string and others + // being subgroups. The Array also has some random properties tacked on like + // "index" which is the offset of the match. + // + // https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/exec + + DCHECK(!returnValue.IsEmpty()); + if (!returnValue->IsArray()) return -1; + + v8::Local result = returnValue.As(); + v8::Local matchOffset; + if (!result->Get(context, toV8StringInternalized(isolate, "index")) + .ToLocal(&matchOffset)) + return -1; + if (matchLength) { + v8::Local match; + if (!result->Get(context, 0).ToLocal(&match)) return -1; + *matchLength = match.As()->Length(); + } + + return matchOffset.As()->Value() + startFrom; +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-regex.h b/deps/v8/src/inspector/v8-regex.h new file mode 100644 index 00000000000000..b4b1f8ce13517a --- /dev/null +++ b/deps/v8/src/inspector/v8-regex.h @@ -0,0 +1,37 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8REGEX_H_ +#define V8_INSPECTOR_V8REGEX_H_ + +#include "src/base/macros.h" +#include "src/inspector/string-16.h" + +#include "include/v8.h" + +namespace v8_inspector { + +class V8InspectorImpl; + +enum MultilineMode { MultilineDisabled, MultilineEnabled }; + +class V8Regex { + public: + V8Regex(V8InspectorImpl*, const String16&, bool caseSensitive, + bool multiline = false); + int match(const String16&, int startFrom = 0, int* matchLength = 0) const; + bool isValid() const { return !m_regex.IsEmpty(); } + const String16& errorMessage() const { return m_errorMessage; } + + private: + V8InspectorImpl* m_inspector; + v8::Global m_regex; + String16 m_errorMessage; + + DISALLOW_COPY_AND_ASSIGN(V8Regex); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8REGEX_H_ diff --git a/deps/v8/src/inspector/v8-runtime-agent-impl.cc b/deps/v8/src/inspector/v8-runtime-agent-impl.cc new file mode 100644 index 00000000000000..640ec317d23752 --- /dev/null +++ b/deps/v8/src/inspector/v8-runtime-agent-impl.cc @@ -0,0 +1,738 @@ +/* + * Copyright (C) 2011 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "src/inspector/v8-runtime-agent-impl.h" + +#include "src/inspector/injected-script.h" +#include "src/inspector/inspected-context.h" +#include "src/inspector/protocol/Protocol.h" +#include "src/inspector/remote-object-id.h" +#include "src/inspector/string-util.h" +#include "src/inspector/v8-console-message.h" +#include "src/inspector/v8-debugger-agent-impl.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-inspector-session-impl.h" +#include "src/inspector/v8-stack-trace-impl.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +namespace V8RuntimeAgentImplState { +static const char customObjectFormatterEnabled[] = + "customObjectFormatterEnabled"; +static const char runtimeEnabled[] = "runtimeEnabled"; +}; + +using protocol::Runtime::RemoteObject; + +static bool hasInternalError(ErrorString* errorString, bool hasError) { + if (hasError) *errorString = "Internal error"; + return hasError; +} + +namespace { + +template +class ProtocolPromiseHandler { + public: + static void add(V8InspectorImpl* inspector, v8::Local context, + v8::MaybeLocal value, + const String16& notPromiseError, int contextGroupId, + int executionContextId, const String16& objectGroup, + bool returnByValue, bool generatePreview, + std::unique_ptr callback) { + if (value.IsEmpty()) { + callback->sendFailure("Internal error"); + return; + } + if (!value.ToLocalChecked()->IsPromise()) { + callback->sendFailure(notPromiseError); + return; + } + v8::MicrotasksScope microtasks_scope(inspector->isolate(), + v8::MicrotasksScope::kRunMicrotasks); + v8::Local promise = + v8::Local::Cast(value.ToLocalChecked()); + Callback* rawCallback = callback.get(); + ProtocolPromiseHandler* handler = new ProtocolPromiseHandler( + inspector, contextGroupId, executionContextId, objectGroup, + returnByValue, generatePreview, std::move(callback)); + v8::Local wrapper = handler->m_wrapper.Get(inspector->isolate()); + + v8::Local thenCallbackFunction = + v8::Function::New(context, thenCallback, wrapper, 0, + v8::ConstructorBehavior::kThrow) + .ToLocalChecked(); + if (promise->Then(context, thenCallbackFunction).IsEmpty()) { + rawCallback->sendFailure("Internal error"); + return; + } + v8::Local catchCallbackFunction = + v8::Function::New(context, catchCallback, wrapper, 0, + v8::ConstructorBehavior::kThrow) + .ToLocalChecked(); + if (promise->Catch(context, catchCallbackFunction).IsEmpty()) { + rawCallback->sendFailure("Internal error"); + return; + } + } + + private: + static void thenCallback(const v8::FunctionCallbackInfo& info) { + ProtocolPromiseHandler* handler = + static_cast*>( + info.Data().As()->Value()); + DCHECK(handler); + v8::Local value = + info.Length() > 0 + ? info[0] + : v8::Local::Cast(v8::Undefined(info.GetIsolate())); + std::unique_ptr wrappedValue( + handler->wrapObject(value)); + if (!wrappedValue) return; + handler->m_callback->sendSuccess( + std::move(wrappedValue), Maybe()); + } + + static void catchCallback(const v8::FunctionCallbackInfo& info) { + ProtocolPromiseHandler* handler = + static_cast*>( + info.Data().As()->Value()); + DCHECK(handler); + v8::Local value = + info.Length() > 0 + ? info[0] + : v8::Local::Cast(v8::Undefined(info.GetIsolate())); + + std::unique_ptr wrappedValue( + handler->wrapObject(value)); + if (!wrappedValue) return; + + std::unique_ptr stack = + handler->m_inspector->debugger()->captureStackTrace(true); + std::unique_ptr exceptionDetails = + protocol::Runtime::ExceptionDetails::create() + .setExceptionId(handler->m_inspector->nextExceptionId()) + .setText("Uncaught (in promise)") + .setLineNumber(stack && !stack->isEmpty() ? stack->topLineNumber() + : 0) + .setColumnNumber( + stack && !stack->isEmpty() ? stack->topColumnNumber() : 0) + .setException(wrappedValue->clone()) + .build(); + if (stack) + exceptionDetails->setStackTrace(stack->buildInspectorObjectImpl()); + if (stack && !stack->isEmpty()) + exceptionDetails->setScriptId(toString16(stack->topScriptId())); + handler->m_callback->sendSuccess(std::move(wrappedValue), + std::move(exceptionDetails)); + } + + ProtocolPromiseHandler(V8InspectorImpl* inspector, int contextGroupId, + int executionContextId, const String16& objectGroup, + bool returnByValue, bool generatePreview, + std::unique_ptr callback) + : m_inspector(inspector), + m_contextGroupId(contextGroupId), + m_executionContextId(executionContextId), + m_objectGroup(objectGroup), + m_returnByValue(returnByValue), + m_generatePreview(generatePreview), + m_callback(std::move(callback)), + m_wrapper(inspector->isolate(), + v8::External::New(inspector->isolate(), this)) { + m_wrapper.SetWeak(this, cleanup, v8::WeakCallbackType::kParameter); + } + + static void cleanup( + const v8::WeakCallbackInfo>& data) { + if (!data.GetParameter()->m_wrapper.IsEmpty()) { + data.GetParameter()->m_wrapper.Reset(); + data.SetSecondPassCallback(cleanup); + } else { + data.GetParameter()->m_callback->sendFailure("Promise was collected"); + delete data.GetParameter(); + } + } + + std::unique_ptr wrapObject( + v8::Local value) { + ErrorString errorString; + InjectedScript::ContextScope scope(&errorString, m_inspector, + m_contextGroupId, m_executionContextId); + if (!scope.initialize()) { + m_callback->sendFailure(errorString); + return nullptr; + } + std::unique_ptr wrappedValue = + scope.injectedScript()->wrapObject(&errorString, value, m_objectGroup, + m_returnByValue, m_generatePreview); + if (!wrappedValue) { + m_callback->sendFailure(errorString); + return nullptr; + } + return wrappedValue; + } + + V8InspectorImpl* m_inspector; + int m_contextGroupId; + int m_executionContextId; + String16 m_objectGroup; + bool m_returnByValue; + bool m_generatePreview; + std::unique_ptr m_callback; + v8::Global m_wrapper; +}; + +template +bool wrapEvaluateResultAsync(InjectedScript* injectedScript, + v8::MaybeLocal maybeResultValue, + const v8::TryCatch& tryCatch, + const String16& objectGroup, bool returnByValue, + bool generatePreview, Callback* callback) { + std::unique_ptr result; + Maybe exceptionDetails; + + ErrorString errorString; + injectedScript->wrapEvaluateResult( + &errorString, maybeResultValue, tryCatch, objectGroup, returnByValue, + generatePreview, &result, &exceptionDetails); + if (errorString.isEmpty()) { + callback->sendSuccess(std::move(result), exceptionDetails); + return true; + } + callback->sendFailure(errorString); + return false; +} + +int ensureContext(ErrorString* errorString, V8InspectorImpl* inspector, + int contextGroupId, const Maybe& executionContextId) { + int contextId; + if (executionContextId.isJust()) { + contextId = executionContextId.fromJust(); + } else { + v8::HandleScope handles(inspector->isolate()); + v8::Local defaultContext = + inspector->client()->ensureDefaultContextInGroup(contextGroupId); + if (defaultContext.IsEmpty()) { + *errorString = "Cannot find default execution context"; + return 0; + } + contextId = V8Debugger::contextId(defaultContext); + } + return contextId; +} + +} // namespace + +V8RuntimeAgentImpl::V8RuntimeAgentImpl( + V8InspectorSessionImpl* session, protocol::FrontendChannel* FrontendChannel, + protocol::DictionaryValue* state) + : m_session(session), + m_state(state), + m_frontend(FrontendChannel), + m_inspector(session->inspector()), + m_enabled(false) {} + +V8RuntimeAgentImpl::~V8RuntimeAgentImpl() {} + +void V8RuntimeAgentImpl::evaluate( + const String16& expression, const Maybe& objectGroup, + const Maybe& includeCommandLineAPI, const Maybe& silent, + const Maybe& executionContextId, const Maybe& returnByValue, + const Maybe& generatePreview, const Maybe& userGesture, + const Maybe& awaitPromise, + std::unique_ptr callback) { + ErrorString errorString; + int contextId = + ensureContext(&errorString, m_inspector, m_session->contextGroupId(), + executionContextId); + if (!errorString.isEmpty()) { + callback->sendFailure(errorString); + return; + } + + InjectedScript::ContextScope scope(&errorString, m_inspector, + m_session->contextGroupId(), contextId); + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); + if (userGesture.fromMaybe(false)) scope.pretendUserGesture(); + + if (includeCommandLineAPI.fromMaybe(false) && + !scope.installCommandLineAPI()) { + callback->sendFailure(errorString); + return; + } + + bool evalIsDisabled = !scope.context()->IsCodeGenerationFromStringsAllowed(); + // Temporarily enable allow evals for inspector. + if (evalIsDisabled) scope.context()->AllowCodeGenerationFromStrings(true); + + v8::MaybeLocal maybeResultValue; + v8::Local script = m_inspector->compileScript( + scope.context(), toV8String(m_inspector->isolate(), expression), + String16(), false); + if (!script.IsEmpty()) + maybeResultValue = m_inspector->runCompiledScript(scope.context(), script); + + if (evalIsDisabled) scope.context()->AllowCodeGenerationFromStrings(false); + + // Re-initialize after running client's code, as it could have destroyed + // context or session. + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { + wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, + scope.tryCatch(), objectGroup.fromMaybe(""), + returnByValue.fromMaybe(false), + generatePreview.fromMaybe(false), callback.get()); + return; + } + ProtocolPromiseHandler::add( + m_inspector, scope.context(), maybeResultValue, + "Result of the evaluation is not a promise", m_session->contextGroupId(), + scope.injectedScript()->context()->contextId(), objectGroup.fromMaybe(""), + returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), + std::move(callback)); +} + +void V8RuntimeAgentImpl::awaitPromise( + const String16& promiseObjectId, const Maybe& returnByValue, + const Maybe& generatePreview, + std::unique_ptr callback) { + ErrorString errorString; + InjectedScript::ObjectScope scope( + &errorString, m_inspector, m_session->contextGroupId(), promiseObjectId); + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + ProtocolPromiseHandler::add( + m_inspector, scope.context(), scope.object(), + "Could not find promise with given id", m_session->contextGroupId(), + scope.injectedScript()->context()->contextId(), scope.objectGroupName(), + returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), + std::move(callback)); +} + +void V8RuntimeAgentImpl::callFunctionOn( + const String16& objectId, const String16& expression, + const Maybe>& + optionalArguments, + const Maybe& silent, const Maybe& returnByValue, + const Maybe& generatePreview, const Maybe& userGesture, + const Maybe& awaitPromise, + std::unique_ptr callback) { + ErrorString errorString; + InjectedScript::ObjectScope scope(&errorString, m_inspector, + m_session->contextGroupId(), objectId); + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + std::unique_ptr[]> argv = nullptr; + int argc = 0; + if (optionalArguments.isJust()) { + protocol::Array* arguments = + optionalArguments.fromJust(); + argc = static_cast(arguments->length()); + argv.reset(new v8::Local[argc]); + for (int i = 0; i < argc; ++i) { + v8::Local argumentValue; + if (!scope.injectedScript() + ->resolveCallArgument(&errorString, arguments->get(i)) + .ToLocal(&argumentValue)) { + callback->sendFailure(errorString); + return; + } + argv[i] = argumentValue; + } + } + + if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); + if (userGesture.fromMaybe(false)) scope.pretendUserGesture(); + + v8::MaybeLocal maybeFunctionValue = + m_inspector->compileAndRunInternalScript( + scope.context(), + toV8String(m_inspector->isolate(), "(" + expression + ")")); + // Re-initialize after running client's code, as it could have destroyed + // context or session. + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + if (scope.tryCatch().HasCaught()) { + wrapEvaluateResultAsync(scope.injectedScript(), maybeFunctionValue, + scope.tryCatch(), scope.objectGroupName(), false, + false, callback.get()); + return; + } + + v8::Local functionValue; + if (!maybeFunctionValue.ToLocal(&functionValue) || + !functionValue->IsFunction()) { + callback->sendFailure("Given expression does not evaluate to a function"); + return; + } + + v8::MaybeLocal maybeResultValue = m_inspector->callFunction( + functionValue.As(), scope.context(), scope.object(), argc, + argv.get()); + // Re-initialize after running client's code, as it could have destroyed + // context or session. + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { + wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, + scope.tryCatch(), scope.objectGroupName(), + returnByValue.fromMaybe(false), + generatePreview.fromMaybe(false), callback.get()); + return; + } + + ProtocolPromiseHandler::add( + m_inspector, scope.context(), maybeResultValue, + "Result of the function call is not a promise", + m_session->contextGroupId(), + scope.injectedScript()->context()->contextId(), scope.objectGroupName(), + returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), + std::move(callback)); +} + +void V8RuntimeAgentImpl::getProperties( + ErrorString* errorString, const String16& objectId, + const Maybe& ownProperties, const Maybe& accessorPropertiesOnly, + const Maybe& generatePreview, + std::unique_ptr>* + result, + Maybe>* + internalProperties, + Maybe* exceptionDetails) { + using protocol::Runtime::InternalPropertyDescriptor; + + InjectedScript::ObjectScope scope(errorString, m_inspector, + m_session->contextGroupId(), objectId); + if (!scope.initialize()) return; + + scope.ignoreExceptionsAndMuteConsole(); + if (!scope.object()->IsObject()) { + *errorString = "Value with given id is not an object"; + return; + } + + v8::Local object = scope.object().As(); + scope.injectedScript()->getProperties( + errorString, object, scope.objectGroupName(), + ownProperties.fromMaybe(false), accessorPropertiesOnly.fromMaybe(false), + generatePreview.fromMaybe(false), result, exceptionDetails); + if (!errorString->isEmpty() || exceptionDetails->isJust() || + accessorPropertiesOnly.fromMaybe(false)) + return; + v8::Local propertiesArray; + if (hasInternalError(errorString, !m_inspector->debugger() + ->internalProperties(scope.context(), + scope.object()) + .ToLocal(&propertiesArray))) + return; + std::unique_ptr> + propertiesProtocolArray = + protocol::Array::create(); + for (uint32_t i = 0; i < propertiesArray->Length(); i += 2) { + v8::Local name; + if (hasInternalError( + errorString, + !propertiesArray->Get(scope.context(), i).ToLocal(&name)) || + !name->IsString()) + return; + v8::Local value; + if (hasInternalError( + errorString, + !propertiesArray->Get(scope.context(), i + 1).ToLocal(&value))) + return; + std::unique_ptr wrappedValue = + scope.injectedScript()->wrapObject(errorString, value, + scope.objectGroupName()); + if (!wrappedValue) return; + propertiesProtocolArray->addItem( + InternalPropertyDescriptor::create() + .setName(toProtocolString(name.As())) + .setValue(std::move(wrappedValue)) + .build()); + } + if (!propertiesProtocolArray->length()) return; + *internalProperties = std::move(propertiesProtocolArray); +} + +void V8RuntimeAgentImpl::releaseObject(ErrorString* errorString, + const String16& objectId) { + InjectedScript::ObjectScope scope(errorString, m_inspector, + m_session->contextGroupId(), objectId); + if (!scope.initialize()) return; + scope.injectedScript()->releaseObject(objectId); +} + +void V8RuntimeAgentImpl::releaseObjectGroup(ErrorString*, + const String16& objectGroup) { + m_session->releaseObjectGroup(objectGroup); +} + +void V8RuntimeAgentImpl::runIfWaitingForDebugger(ErrorString* errorString) { + m_inspector->client()->runIfWaitingForDebugger(m_session->contextGroupId()); +} + +void V8RuntimeAgentImpl::setCustomObjectFormatterEnabled(ErrorString*, + bool enabled) { + m_state->setBoolean(V8RuntimeAgentImplState::customObjectFormatterEnabled, + enabled); + m_session->setCustomObjectFormatterEnabled(enabled); +} + +void V8RuntimeAgentImpl::discardConsoleEntries(ErrorString*) { + V8ConsoleMessageStorage* storage = + m_inspector->ensureConsoleMessageStorage(m_session->contextGroupId()); + storage->clear(); +} + +void V8RuntimeAgentImpl::compileScript( + ErrorString* errorString, const String16& expression, + const String16& sourceURL, bool persistScript, + const Maybe& executionContextId, Maybe* scriptId, + Maybe* exceptionDetails) { + if (!m_enabled) { + *errorString = "Runtime agent is not enabled"; + return; + } + int contextId = + ensureContext(errorString, m_inspector, m_session->contextGroupId(), + executionContextId); + if (!errorString->isEmpty()) return; + InjectedScript::ContextScope scope(errorString, m_inspector, + m_session->contextGroupId(), contextId); + if (!scope.initialize()) return; + + if (!persistScript) m_inspector->debugger()->muteScriptParsedEvents(); + v8::Local script = m_inspector->compileScript( + scope.context(), toV8String(m_inspector->isolate(), expression), + sourceURL, false); + if (!persistScript) m_inspector->debugger()->unmuteScriptParsedEvents(); + if (script.IsEmpty()) { + if (scope.tryCatch().HasCaught()) + *exceptionDetails = scope.injectedScript()->createExceptionDetails( + errorString, scope.tryCatch(), String16(), false); + else + *errorString = "Script compilation failed"; + return; + } + + if (!persistScript) return; + + String16 scriptValueId = + String16::fromInteger(script->GetUnboundScript()->GetId()); + std::unique_ptr> global( + new v8::Global(m_inspector->isolate(), script)); + m_compiledScripts[scriptValueId] = std::move(global); + *scriptId = scriptValueId; +} + +void V8RuntimeAgentImpl::runScript( + const String16& scriptId, const Maybe& executionContextId, + const Maybe& objectGroup, const Maybe& silent, + const Maybe& includeCommandLineAPI, const Maybe& returnByValue, + const Maybe& generatePreview, const Maybe& awaitPromise, + std::unique_ptr callback) { + if (!m_enabled) { + callback->sendFailure("Runtime agent is not enabled"); + return; + } + + auto it = m_compiledScripts.find(scriptId); + if (it == m_compiledScripts.end()) { + callback->sendFailure("No script with given id"); + return; + } + + ErrorString errorString; + int contextId = + ensureContext(&errorString, m_inspector, m_session->contextGroupId(), + executionContextId); + if (!errorString.isEmpty()) { + callback->sendFailure(errorString); + return; + } + + InjectedScript::ContextScope scope(&errorString, m_inspector, + m_session->contextGroupId(), contextId); + if (!scope.initialize()) { + callback->sendFailure(errorString); + return; + } + + if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); + + std::unique_ptr> scriptWrapper = std::move(it->second); + m_compiledScripts.erase(it); + v8::Local script = scriptWrapper->Get(m_inspector->isolate()); + if (script.IsEmpty()) { + callback->sendFailure("Script execution failed"); + return; + } + + if (includeCommandLineAPI.fromMaybe(false) && !scope.installCommandLineAPI()) + return; + + v8::MaybeLocal maybeResultValue = + m_inspector->runCompiledScript(scope.context(), script); + + // Re-initialize after running client's code, as it could have destroyed + // context or session. + if (!scope.initialize()) return; + + if (!awaitPromise.fromMaybe(false) || scope.tryCatch().HasCaught()) { + wrapEvaluateResultAsync(scope.injectedScript(), maybeResultValue, + scope.tryCatch(), objectGroup.fromMaybe(""), + returnByValue.fromMaybe(false), + generatePreview.fromMaybe(false), callback.get()); + return; + } + ProtocolPromiseHandler::add( + m_inspector, scope.context(), maybeResultValue.ToLocalChecked(), + "Result of the script execution is not a promise", + m_session->contextGroupId(), + scope.injectedScript()->context()->contextId(), objectGroup.fromMaybe(""), + returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), + std::move(callback)); +} + +void V8RuntimeAgentImpl::restore() { + if (!m_state->booleanProperty(V8RuntimeAgentImplState::runtimeEnabled, false)) + return; + m_frontend.executionContextsCleared(); + ErrorString error; + enable(&error); + if (m_state->booleanProperty( + V8RuntimeAgentImplState::customObjectFormatterEnabled, false)) + m_session->setCustomObjectFormatterEnabled(true); +} + +void V8RuntimeAgentImpl::enable(ErrorString* errorString) { + if (m_enabled) return; + m_inspector->client()->beginEnsureAllContextsInGroup( + m_session->contextGroupId()); + m_enabled = true; + m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, true); + m_inspector->enableStackCapturingIfNeeded(); + m_session->reportAllContexts(this); + V8ConsoleMessageStorage* storage = + m_inspector->ensureConsoleMessageStorage(m_session->contextGroupId()); + for (const auto& message : storage->messages()) { + if (!reportMessage(message.get(), false)) return; + } +} + +void V8RuntimeAgentImpl::disable(ErrorString* errorString) { + if (!m_enabled) return; + m_enabled = false; + m_state->setBoolean(V8RuntimeAgentImplState::runtimeEnabled, false); + m_inspector->disableStackCapturingIfNeeded(); + m_session->discardInjectedScripts(); + reset(); + m_inspector->client()->endEnsureAllContextsInGroup( + m_session->contextGroupId()); +} + +void V8RuntimeAgentImpl::reset() { + m_compiledScripts.clear(); + if (m_enabled) { + if (const V8InspectorImpl::ContextByIdMap* contexts = + m_inspector->contextGroup(m_session->contextGroupId())) { + for (auto& idContext : *contexts) idContext.second->setReported(false); + } + m_frontend.executionContextsCleared(); + } +} + +void V8RuntimeAgentImpl::reportExecutionContextCreated( + InspectedContext* context) { + if (!m_enabled) return; + context->setReported(true); + std::unique_ptr description = + protocol::Runtime::ExecutionContextDescription::create() + .setId(context->contextId()) + .setName(context->humanReadableName()) + .setOrigin(context->origin()) + .build(); + if (!context->auxData().isEmpty()) + description->setAuxData(protocol::DictionaryValue::cast( + protocol::parseJSON(context->auxData()))); + m_frontend.executionContextCreated(std::move(description)); +} + +void V8RuntimeAgentImpl::reportExecutionContextDestroyed( + InspectedContext* context) { + if (m_enabled && context->isReported()) { + context->setReported(false); + m_frontend.executionContextDestroyed(context->contextId()); + } +} + +void V8RuntimeAgentImpl::inspect( + std::unique_ptr objectToInspect, + std::unique_ptr hints) { + if (m_enabled) + m_frontend.inspectRequested(std::move(objectToInspect), std::move(hints)); +} + +void V8RuntimeAgentImpl::messageAdded(V8ConsoleMessage* message) { + if (m_enabled) reportMessage(message, true); +} + +bool V8RuntimeAgentImpl::reportMessage(V8ConsoleMessage* message, + bool generatePreview) { + message->reportToFrontend(&m_frontend, m_session, generatePreview); + m_frontend.flush(); + return m_inspector->hasConsoleMessageStorage(m_session->contextGroupId()); +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-runtime-agent-impl.h b/deps/v8/src/inspector/v8-runtime-agent-impl.h new file mode 100644 index 00000000000000..edeeed47ed455c --- /dev/null +++ b/deps/v8/src/inspector/v8-runtime-agent-impl.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2011 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef V8_INSPECTOR_V8RUNTIMEAGENTIMPL_H_ +#define V8_INSPECTOR_V8RUNTIMEAGENTIMPL_H_ + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Runtime.h" + +#include "include/v8.h" + +namespace v8_inspector { + +class InjectedScript; +class InspectedContext; +class RemoteObjectIdBase; +class V8ConsoleMessage; +class V8InspectorImpl; +class V8InspectorSessionImpl; + +using protocol::ErrorString; +using protocol::Maybe; + +class V8RuntimeAgentImpl : public protocol::Runtime::Backend { + public: + V8RuntimeAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, + protocol::DictionaryValue* state); + ~V8RuntimeAgentImpl() override; + void restore(); + + // Part of the protocol. + void enable(ErrorString*) override; + void disable(ErrorString*) override; + void evaluate(const String16& expression, const Maybe& objectGroup, + const Maybe& includeCommandLineAPI, + const Maybe& silent, const Maybe& executionContextId, + const Maybe& returnByValue, + const Maybe& generatePreview, + const Maybe& userGesture, const Maybe& awaitPromise, + std::unique_ptr) override; + void awaitPromise(const String16& promiseObjectId, + const Maybe& returnByValue, + const Maybe& generatePreview, + std::unique_ptr) override; + void callFunctionOn( + const String16& objectId, const String16& expression, + const Maybe>& + optionalArguments, + const Maybe& silent, const Maybe& returnByValue, + const Maybe& generatePreview, const Maybe& userGesture, + const Maybe& awaitPromise, + std::unique_ptr) override; + void releaseObject(ErrorString*, const String16& objectId) override; + void getProperties( + ErrorString*, const String16& objectId, const Maybe& ownProperties, + const Maybe& accessorPropertiesOnly, + const Maybe& generatePreview, + std::unique_ptr>* + result, + Maybe>* + internalProperties, + Maybe*) override; + void releaseObjectGroup(ErrorString*, const String16& objectGroup) override; + void runIfWaitingForDebugger(ErrorString*) override; + void setCustomObjectFormatterEnabled(ErrorString*, bool) override; + void discardConsoleEntries(ErrorString*) override; + void compileScript(ErrorString*, const String16& expression, + const String16& sourceURL, bool persistScript, + const Maybe& executionContextId, Maybe*, + Maybe*) override; + void runScript(const String16&, const Maybe& executionContextId, + const Maybe& objectGroup, const Maybe& silent, + const Maybe& includeCommandLineAPI, + const Maybe& returnByValue, + const Maybe& generatePreview, + const Maybe& awaitPromise, + std::unique_ptr) override; + + void reset(); + void reportExecutionContextCreated(InspectedContext*); + void reportExecutionContextDestroyed(InspectedContext*); + void inspect(std::unique_ptr objectToInspect, + std::unique_ptr hints); + void messageAdded(V8ConsoleMessage*); + bool enabled() const { return m_enabled; } + + private: + bool reportMessage(V8ConsoleMessage*, bool generatePreview); + + V8InspectorSessionImpl* m_session; + protocol::DictionaryValue* m_state; + protocol::Runtime::Frontend m_frontend; + V8InspectorImpl* m_inspector; + bool m_enabled; + protocol::HashMap>> + m_compiledScripts; + + DISALLOW_COPY_AND_ASSIGN(V8RuntimeAgentImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8RUNTIMEAGENTIMPL_H_ diff --git a/deps/v8/src/inspector/v8-schema-agent-impl.cc b/deps/v8/src/inspector/v8-schema-agent-impl.cc new file mode 100644 index 00000000000000..9eed5bdf813710 --- /dev/null +++ b/deps/v8/src/inspector/v8-schema-agent-impl.cc @@ -0,0 +1,29 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-schema-agent-impl.h" + +#include "src/inspector/protocol/Protocol.h" +#include "src/inspector/v8-inspector-session-impl.h" + +namespace v8_inspector { + +V8SchemaAgentImpl::V8SchemaAgentImpl(V8InspectorSessionImpl* session, + protocol::FrontendChannel* frontendChannel, + protocol::DictionaryValue* state) + : m_session(session), m_frontend(frontendChannel) {} + +V8SchemaAgentImpl::~V8SchemaAgentImpl() {} + +void V8SchemaAgentImpl::getDomains( + ErrorString*, + std::unique_ptr>* result) { + std::vector> domains = + m_session->supportedDomainsImpl(); + *result = protocol::Array::create(); + for (size_t i = 0; i < domains.size(); ++i) + (*result)->addItem(std::move(domains[i])); +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-schema-agent-impl.h b/deps/v8/src/inspector/v8-schema-agent-impl.h new file mode 100644 index 00000000000000..6150201f8bdace --- /dev/null +++ b/deps/v8/src/inspector/v8-schema-agent-impl.h @@ -0,0 +1,37 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8SCHEMAAGENTIMPL_H_ +#define V8_INSPECTOR_V8SCHEMAAGENTIMPL_H_ + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Schema.h" + +namespace v8_inspector { + +class V8InspectorSessionImpl; + +using protocol::ErrorString; + +class V8SchemaAgentImpl : public protocol::Schema::Backend { + public: + V8SchemaAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, + protocol::DictionaryValue* state); + ~V8SchemaAgentImpl() override; + + void getDomains( + ErrorString*, + std::unique_ptr>*) override; + + private: + V8InspectorSessionImpl* m_session; + protocol::Schema::Frontend m_frontend; + + DISALLOW_COPY_AND_ASSIGN(V8SchemaAgentImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8SCHEMAAGENTIMPL_H_ diff --git a/deps/v8/src/inspector/v8-stack-trace-impl.cc b/deps/v8/src/inspector/v8-stack-trace-impl.cc new file mode 100644 index 00000000000000..1a38c6dd82a002 --- /dev/null +++ b/deps/v8/src/inspector/v8-stack-trace-impl.cc @@ -0,0 +1,281 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-stack-trace-impl.h" + +#include "src/inspector/string-util.h" +#include "src/inspector/v8-debugger.h" +#include "src/inspector/v8-inspector-impl.h" +#include "src/inspector/v8-profiler-agent-impl.h" + +#include "include/v8-debug.h" +#include "include/v8-profiler.h" +#include "include/v8-version.h" + +namespace v8_inspector { + +namespace { + +static const v8::StackTrace::StackTraceOptions stackTraceOptions = + static_cast( + v8::StackTrace::kLineNumber | v8::StackTrace::kColumnOffset | + v8::StackTrace::kScriptId | v8::StackTrace::kScriptNameOrSourceURL | + v8::StackTrace::kFunctionName); + +V8StackTraceImpl::Frame toFrame(v8::Local frame) { + String16 scriptId = String16::fromInteger(frame->GetScriptId()); + String16 sourceName; + v8::Local sourceNameValue(frame->GetScriptNameOrSourceURL()); + if (!sourceNameValue.IsEmpty()) + sourceName = toProtocolString(sourceNameValue); + + String16 functionName; + v8::Local functionNameValue(frame->GetFunctionName()); + if (!functionNameValue.IsEmpty()) + functionName = toProtocolString(functionNameValue); + + int sourceLineNumber = frame->GetLineNumber(); + int sourceColumn = frame->GetColumn(); + return V8StackTraceImpl::Frame(functionName, scriptId, sourceName, + sourceLineNumber, sourceColumn); +} + +void toFramesVector(v8::Local stackTrace, + std::vector& frames, + size_t maxStackSize, v8::Isolate* isolate) { + DCHECK(isolate->InContext()); + int frameCount = stackTrace->GetFrameCount(); + if (frameCount > static_cast(maxStackSize)) + frameCount = static_cast(maxStackSize); + for (int i = 0; i < frameCount; i++) { + v8::Local stackFrame = stackTrace->GetFrame(i); + frames.push_back(toFrame(stackFrame)); + } +} + +} // namespace + +V8StackTraceImpl::Frame::Frame() + : m_functionName("undefined"), + m_scriptId(""), + m_scriptName("undefined"), + m_lineNumber(0), + m_columnNumber(0) {} + +V8StackTraceImpl::Frame::Frame(const String16& functionName, + const String16& scriptId, + const String16& scriptName, int lineNumber, + int column) + : m_functionName(functionName), + m_scriptId(scriptId), + m_scriptName(scriptName), + m_lineNumber(lineNumber), + m_columnNumber(column) { + DCHECK(m_lineNumber != v8::Message::kNoLineNumberInfo); + DCHECK(m_columnNumber != v8::Message::kNoColumnInfo); +} + +V8StackTraceImpl::Frame::~Frame() {} + +// buildInspectorObject() and SourceLocation's toTracedValue() should set the +// same fields. +// If either of them is modified, the other should be also modified. +std::unique_ptr +V8StackTraceImpl::Frame::buildInspectorObject() const { + return protocol::Runtime::CallFrame::create() + .setFunctionName(m_functionName) + .setScriptId(m_scriptId) + .setUrl(m_scriptName) + .setLineNumber(m_lineNumber - 1) + .setColumnNumber(m_columnNumber - 1) + .build(); +} + +V8StackTraceImpl::Frame V8StackTraceImpl::Frame::clone() const { + return Frame(m_functionName, m_scriptId, m_scriptName, m_lineNumber, + m_columnNumber); +} + +// static +void V8StackTraceImpl::setCaptureStackTraceForUncaughtExceptions( + v8::Isolate* isolate, bool capture) { + isolate->SetCaptureStackTraceForUncaughtExceptions( + capture, V8StackTraceImpl::maxCallStackSizeToCapture, stackTraceOptions); +} + +// static +std::unique_ptr V8StackTraceImpl::create( + V8Debugger* debugger, int contextGroupId, + v8::Local stackTrace, size_t maxStackSize, + const String16& description) { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::HandleScope scope(isolate); + std::vector frames; + if (!stackTrace.IsEmpty()) + toFramesVector(stackTrace, frames, maxStackSize, isolate); + + int maxAsyncCallChainDepth = 1; + V8StackTraceImpl* asyncCallChain = nullptr; + if (debugger && maxStackSize > 1) { + asyncCallChain = debugger->currentAsyncCallChain(); + maxAsyncCallChainDepth = debugger->maxAsyncCallChainDepth(); + } + // Do not accidentally append async call chain from another group. This should + // not + // happen if we have proper instrumentation, but let's double-check to be + // safe. + if (contextGroupId && asyncCallChain && asyncCallChain->m_contextGroupId && + asyncCallChain->m_contextGroupId != contextGroupId) { + asyncCallChain = nullptr; + maxAsyncCallChainDepth = 1; + } + + // Only the top stack in the chain may be empty, so ensure that second stack + // is non-empty (it's the top of appended chain). + if (asyncCallChain && asyncCallChain->isEmpty()) + asyncCallChain = asyncCallChain->m_parent.get(); + + if (stackTrace.IsEmpty() && !asyncCallChain) return nullptr; + + std::unique_ptr result(new V8StackTraceImpl( + contextGroupId, description, frames, + asyncCallChain ? asyncCallChain->cloneImpl() : nullptr)); + + // Crop to not exceed maxAsyncCallChainDepth. + V8StackTraceImpl* deepest = result.get(); + while (deepest && maxAsyncCallChainDepth) { + deepest = deepest->m_parent.get(); + maxAsyncCallChainDepth--; + } + if (deepest) deepest->m_parent.reset(); + + return result; +} + +// static +std::unique_ptr V8StackTraceImpl::capture( + V8Debugger* debugger, int contextGroupId, size_t maxStackSize, + const String16& description) { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::HandleScope handleScope(isolate); + v8::Local stackTrace; + if (isolate->InContext()) { + if (debugger) { + V8InspectorImpl* inspector = debugger->inspector(); + V8ProfilerAgentImpl* profilerAgent = + inspector->enabledProfilerAgentForGroup(contextGroupId); + if (profilerAgent) profilerAgent->collectSample(); + } + stackTrace = v8::StackTrace::CurrentStackTrace( + isolate, static_cast(maxStackSize), stackTraceOptions); + } + return V8StackTraceImpl::create(debugger, contextGroupId, stackTrace, + maxStackSize, description); +} + +std::unique_ptr V8StackTraceImpl::cloneImpl() { + std::vector framesCopy(m_frames); + return wrapUnique( + new V8StackTraceImpl(m_contextGroupId, m_description, framesCopy, + m_parent ? m_parent->cloneImpl() : nullptr)); +} + +std::unique_ptr V8StackTraceImpl::clone() { + std::vector frames; + for (size_t i = 0; i < m_frames.size(); i++) + frames.push_back(m_frames.at(i).clone()); + return wrapUnique( + new V8StackTraceImpl(m_contextGroupId, m_description, frames, nullptr)); +} + +V8StackTraceImpl::V8StackTraceImpl(int contextGroupId, + const String16& description, + std::vector& frames, + std::unique_ptr parent) + : m_contextGroupId(contextGroupId), + m_description(description), + m_parent(std::move(parent)) { + m_frames.swap(frames); +} + +V8StackTraceImpl::~V8StackTraceImpl() {} + +StringView V8StackTraceImpl::topSourceURL() const { + DCHECK(m_frames.size()); + return toStringView(m_frames[0].m_scriptName); +} + +int V8StackTraceImpl::topLineNumber() const { + DCHECK(m_frames.size()); + return m_frames[0].m_lineNumber; +} + +int V8StackTraceImpl::topColumnNumber() const { + DCHECK(m_frames.size()); + return m_frames[0].m_columnNumber; +} + +StringView V8StackTraceImpl::topFunctionName() const { + DCHECK(m_frames.size()); + return toStringView(m_frames[0].m_functionName); +} + +StringView V8StackTraceImpl::topScriptId() const { + DCHECK(m_frames.size()); + return toStringView(m_frames[0].m_scriptId); +} + +std::unique_ptr +V8StackTraceImpl::buildInspectorObjectImpl() const { + std::unique_ptr> frames = + protocol::Array::create(); + for (size_t i = 0; i < m_frames.size(); i++) + frames->addItem(m_frames.at(i).buildInspectorObject()); + + std::unique_ptr stackTrace = + protocol::Runtime::StackTrace::create() + .setCallFrames(std::move(frames)) + .build(); + if (!m_description.isEmpty()) stackTrace->setDescription(m_description); + if (m_parent) stackTrace->setParent(m_parent->buildInspectorObjectImpl()); + return stackTrace; +} + +std::unique_ptr +V8StackTraceImpl::buildInspectorObjectForTail(V8Debugger* debugger) const { + v8::HandleScope handleScope(v8::Isolate::GetCurrent()); + // Next call collapses possible empty stack and ensures + // maxAsyncCallChainDepth. + std::unique_ptr fullChain = V8StackTraceImpl::create( + debugger, m_contextGroupId, v8::Local(), + V8StackTraceImpl::maxCallStackSizeToCapture); + if (!fullChain || !fullChain->m_parent) return nullptr; + return fullChain->m_parent->buildInspectorObjectImpl(); +} + +std::unique_ptr +V8StackTraceImpl::buildInspectorObject() const { + return buildInspectorObjectImpl(); +} + +std::unique_ptr V8StackTraceImpl::toString() const { + String16Builder stackTrace; + for (size_t i = 0; i < m_frames.size(); ++i) { + const Frame& frame = m_frames[i]; + stackTrace.append("\n at " + (frame.functionName().length() + ? frame.functionName() + : "(anonymous function)")); + stackTrace.append(" ("); + stackTrace.append(frame.sourceURL()); + stackTrace.append(':'); + stackTrace.append(String16::fromInteger(frame.lineNumber())); + stackTrace.append(':'); + stackTrace.append(String16::fromInteger(frame.columnNumber())); + stackTrace.append(')'); + } + String16 string = stackTrace.toString(); + return StringBufferImpl::adopt(string); +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-stack-trace-impl.h b/deps/v8/src/inspector/v8-stack-trace-impl.h new file mode 100644 index 00000000000000..f0a452e9390dd8 --- /dev/null +++ b/deps/v8/src/inspector/v8-stack-trace-impl.h @@ -0,0 +1,99 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8STACKTRACEIMPL_H_ +#define V8_INSPECTOR_V8STACKTRACEIMPL_H_ + +#include + +#include "src/base/macros.h" +#include "src/inspector/protocol/Forward.h" +#include "src/inspector/protocol/Runtime.h" + +#include "include/v8-inspector.h" + +namespace v8_inspector { + +class TracedValue; +class V8Debugger; + +// Note: async stack trace may have empty top stack with non-empty tail to +// indicate +// that current native-only state had some async story. +// On the other hand, any non-top async stack is guaranteed to be non-empty. +class V8StackTraceImpl final : public V8StackTrace { + public: + static const size_t maxCallStackSizeToCapture = 200; + + class Frame { + public: + Frame(); + Frame(const String16& functionName, const String16& scriptId, + const String16& scriptName, int lineNumber, int column = 0); + ~Frame(); + + const String16& functionName() const { return m_functionName; } + const String16& scriptId() const { return m_scriptId; } + const String16& sourceURL() const { return m_scriptName; } + int lineNumber() const { return m_lineNumber; } + int columnNumber() const { return m_columnNumber; } + Frame clone() const; + + private: + friend class V8StackTraceImpl; + std::unique_ptr buildInspectorObject() const; + void toTracedValue(TracedValue*) const; + + String16 m_functionName; + String16 m_scriptId; + String16 m_scriptName; + int m_lineNumber; + int m_columnNumber; + }; + + static void setCaptureStackTraceForUncaughtExceptions(v8::Isolate*, + bool capture); + static std::unique_ptr create( + V8Debugger*, int contextGroupId, v8::Local, + size_t maxStackSize, const String16& description = String16()); + static std::unique_ptr capture( + V8Debugger*, int contextGroupId, size_t maxStackSize, + const String16& description = String16()); + + // This method drops the async chain. Use cloneImpl() instead. + std::unique_ptr clone() override; + std::unique_ptr cloneImpl(); + std::unique_ptr buildInspectorObjectForTail( + V8Debugger*) const; + std::unique_ptr buildInspectorObjectImpl() + const; + ~V8StackTraceImpl() override; + + // V8StackTrace implementation. + bool isEmpty() const override { return !m_frames.size(); }; + StringView topSourceURL() const override; + int topLineNumber() const override; + int topColumnNumber() const override; + StringView topScriptId() const override; + StringView topFunctionName() const override; + std::unique_ptr buildInspectorObject() + const override; + std::unique_ptr toString() const override; + + private: + V8StackTraceImpl(int contextGroupId, const String16& description, + std::vector& frames, + std::unique_ptr parent); + + int m_contextGroupId; + String16 m_description; + std::vector m_frames; + std::unique_ptr m_parent; + + DISALLOW_COPY_AND_ASSIGN(V8StackTraceImpl); +}; + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8STACKTRACEIMPL_H_ diff --git a/deps/v8/src/inspector/v8-value-copier.cc b/deps/v8/src/inspector/v8-value-copier.cc new file mode 100644 index 00000000000000..09d86b7b985016 --- /dev/null +++ b/deps/v8/src/inspector/v8-value-copier.cc @@ -0,0 +1,110 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/inspector/v8-value-copier.h" + +namespace v8_inspector { + +namespace { + +static int kMaxDepth = 20; +static int kMaxCalls = 1000; + +class V8ValueCopier { + public: + v8::MaybeLocal copy(v8::Local value, int depth) { + if (++m_calls > kMaxCalls || depth > kMaxDepth) + return v8::MaybeLocal(); + + if (value.IsEmpty()) return v8::MaybeLocal(); + if (value->IsNull() || value->IsUndefined() || value->IsBoolean() || + value->IsString() || value->IsNumber()) + return value; + if (!value->IsObject()) return v8::MaybeLocal(); + v8::Local object = value.As(); + if (object->CreationContext() != m_from) return value; + + if (object->IsArray()) { + v8::Local array = object.As(); + v8::Local result = v8::Array::New(m_isolate, array->Length()); + if (!result->SetPrototype(m_to, v8::Null(m_isolate)).FromMaybe(false)) + return v8::MaybeLocal(); + for (uint32_t i = 0; i < array->Length(); ++i) { + v8::Local item; + if (!array->Get(m_from, i).ToLocal(&item)) + return v8::MaybeLocal(); + v8::Local copied; + if (!copy(item, depth + 1).ToLocal(&copied)) + return v8::MaybeLocal(); + if (!createDataProperty(m_to, result, i, copied).FromMaybe(false)) + return v8::MaybeLocal(); + } + return result; + } + + v8::Local result = v8::Object::New(m_isolate); + if (!result->SetPrototype(m_to, v8::Null(m_isolate)).FromMaybe(false)) + return v8::MaybeLocal(); + v8::Local properties; + if (!object->GetOwnPropertyNames(m_from).ToLocal(&properties)) + return v8::MaybeLocal(); + for (uint32_t i = 0; i < properties->Length(); ++i) { + v8::Local name; + if (!properties->Get(m_from, i).ToLocal(&name) || !name->IsString()) + return v8::MaybeLocal(); + v8::Local property; + if (!object->Get(m_from, name).ToLocal(&property)) + return v8::MaybeLocal(); + v8::Local copied; + if (!copy(property, depth + 1).ToLocal(&copied)) + return v8::MaybeLocal(); + if (!createDataProperty(m_to, result, v8::Local::Cast(name), + copied) + .FromMaybe(false)) + return v8::MaybeLocal(); + } + return result; + } + + v8::Isolate* m_isolate; + v8::Local m_from; + v8::Local m_to; + int m_calls; +}; + +} // namespace + +v8::MaybeLocal copyValueFromDebuggerContext( + v8::Isolate* isolate, v8::Local debuggerContext, + v8::Local toContext, v8::Local value) { + V8ValueCopier copier; + copier.m_isolate = isolate; + copier.m_from = debuggerContext; + copier.m_to = toContext; + copier.m_calls = 0; + return copier.copy(value, 0); +} + +v8::Maybe createDataProperty(v8::Local context, + v8::Local object, + v8::Local key, + v8::Local value) { + v8::TryCatch tryCatch(context->GetIsolate()); + v8::Isolate::DisallowJavascriptExecutionScope throwJs( + context->GetIsolate(), + v8::Isolate::DisallowJavascriptExecutionScope::THROW_ON_FAILURE); + return object->CreateDataProperty(context, key, value); +} + +v8::Maybe createDataProperty(v8::Local context, + v8::Local array, int index, + v8::Local value) { + v8::TryCatch tryCatch(context->GetIsolate()); + v8::Isolate::DisallowJavascriptExecutionScope throwJs( + context->GetIsolate(), + v8::Isolate::DisallowJavascriptExecutionScope::THROW_ON_FAILURE); + return array->CreateDataProperty(context, index, value); +} + +} // namespace v8_inspector diff --git a/deps/v8/src/inspector/v8-value-copier.h b/deps/v8/src/inspector/v8-value-copier.h new file mode 100644 index 00000000000000..c24a5648a21642 --- /dev/null +++ b/deps/v8/src/inspector/v8-value-copier.h @@ -0,0 +1,24 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INSPECTOR_V8VALUECOPIER_H_ +#define V8_INSPECTOR_V8VALUECOPIER_H_ + +#include "include/v8.h" + +namespace v8_inspector { + +v8::MaybeLocal copyValueFromDebuggerContext( + v8::Isolate*, v8::Local debuggerContext, + v8::Local toContext, v8::Local); +v8::Maybe createDataProperty(v8::Local, + v8::Local, + v8::Local key, + v8::Local); +v8::Maybe createDataProperty(v8::Local, v8::Local, + int index, v8::Local); + +} // namespace v8_inspector + +#endif // V8_INSPECTOR_V8VALUECOPIER_H_ diff --git a/deps/v8/src/interface-descriptors.cc b/deps/v8/src/interface-descriptors.cc index a16cae7d61cc68..2628b9fb6fd2c7 100644 --- a/deps/v8/src/interface-descriptors.cc +++ b/deps/v8/src/interface-descriptors.cc @@ -7,41 +7,6 @@ namespace v8 { namespace internal { -namespace { -// Constructors for common combined semantic and representation types. -Type* SmiType(Zone* zone) { - return Type::Intersect(Type::SignedSmall(), Type::TaggedSigned(), zone); -} - - -Type* UntaggedIntegral32(Zone* zone) { - return Type::Intersect(Type::Signed32(), Type::UntaggedIntegral32(), zone); -} - - -Type* AnyTagged(Zone* zone) { - return Type::Intersect( - Type::Any(), - Type::Union(Type::TaggedPointer(), Type::TaggedSigned(), zone), zone); -} - - -Type* ExternalPointer(Zone* zone) { - return Type::Intersect(Type::Internal(), Type::UntaggedPointer(), zone); -} -} // namespace - -FunctionType* CallInterfaceDescriptor::BuildDefaultFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), parameter_count, zone) - ->AsFunction(); - while (parameter_count-- != 0) { - function->InitParameter(parameter_count, AnyTagged(zone)); - } - return function; -} void CallInterfaceDescriptorData::InitializePlatformSpecific( int register_parameter_count, const Register* registers, @@ -56,6 +21,22 @@ void CallInterfaceDescriptorData::InitializePlatformSpecific( } } +void CallInterfaceDescriptorData::InitializePlatformIndependent( + int parameter_count, int extra_parameter_count, + const MachineType* machine_types) { + // InterfaceDescriptor owns a copy of the MachineType array. + // We only care about parameters, not receiver and result. + param_count_ = parameter_count + extra_parameter_count; + machine_types_.reset(NewArray(param_count_)); + for (int i = 0; i < param_count_; i++) { + if (machine_types == NULL || i >= parameter_count) { + machine_types_[i] = MachineType::AnyTagged(); + } else { + machine_types_[i] = machine_types[i]; + } + } +} + const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const { CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0); size_t index = data_ - start; @@ -79,15 +60,12 @@ void VoidDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(0, nullptr); } -FunctionType* -FastNewFunctionContextDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction(); - function->InitParameter(0, AnyTagged(zone)); - function->InitParameter(1, UntaggedIntegral32(zone)); - return function; +void FastNewFunctionContextDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + MachineType machine_types[] = {MachineType::AnyTagged(), + MachineType::Int32()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } void FastNewFunctionContextDescriptor::InitializePlatformSpecific( @@ -96,33 +74,28 @@ void FastNewFunctionContextDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } -FunctionType* LoadDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kReceiver, AnyTagged(zone)); - function->InitParameter(kName, AnyTagged(zone)); - function->InitParameter(kSlot, SmiType(zone)); - return function; +void LoadDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kReceiver, kName, kSlot + MachineType machine_types[] = {MachineType::AnyTagged(), + MachineType::AnyTagged(), + MachineType::TaggedSigned()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } - void LoadDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister()}; data->InitializePlatformSpecific(arraysize(registers), registers); } -FunctionType* LoadGlobalDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kSlot, SmiType(zone)); - return function; +void LoadGlobalDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kSlot + MachineType machine_types[] = {MachineType::TaggedSigned()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } void LoadGlobalDescriptor::InitializePlatformSpecific( @@ -131,16 +104,13 @@ void LoadGlobalDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } -FunctionType* -LoadGlobalWithVectorDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kSlot, SmiType(zone)); - function->InitParameter(kVector, AnyTagged(zone)); - return function; +void LoadGlobalWithVectorDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kSlot, kVector + MachineType machine_types[] = {MachineType::TaggedSigned(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } void LoadGlobalWithVectorDescriptor::InitializePlatformSpecific( @@ -150,76 +120,77 @@ void LoadGlobalWithVectorDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } -FunctionType* StoreDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kReceiver, AnyTagged(zone)); - function->InitParameter(kName, AnyTagged(zone)); - function->InitParameter(kValue, AnyTagged(zone)); - function->InitParameter(kSlot, SmiType(zone)); - return function; +void StoreDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kReceiver, kName, kValue, kSlot + MachineType machine_types[] = { + MachineType::AnyTagged(), MachineType::AnyTagged(), + MachineType::AnyTagged(), MachineType::TaggedSigned()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } void StoreDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), SlotRegister()}; - data->InitializePlatformSpecific(arraysize(registers), registers); -} + int len = arraysize(registers) - kStackArgumentsCount; + data->InitializePlatformSpecific(len, registers); +} void StoreTransitionDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { - Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), - MapRegister()}; - - data->InitializePlatformSpecific(arraysize(registers), registers); + Register registers[] = { + ReceiverRegister(), NameRegister(), MapRegister(), + ValueRegister(), SlotRegister(), VectorRegister(), + }; + int len = arraysize(registers) - kStackArgumentsCount; + data->InitializePlatformSpecific(len, registers); } - -void VectorStoreTransitionDescriptor::InitializePlatformSpecific( +void StoreTransitionDescriptor::InitializePlatformIndependent( CallInterfaceDescriptorData* data) { - if (SlotRegister().is(no_reg)) { - Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), - MapRegister(), VectorRegister()}; - data->InitializePlatformSpecific(arraysize(registers), registers); - } else { - Register registers[] = {ReceiverRegister(), NameRegister(), - ValueRegister(), MapRegister(), - SlotRegister(), VectorRegister()}; - data->InitializePlatformSpecific(arraysize(registers), registers); - } + // kReceiver, kName, kMap, kValue, kSlot, kVector + MachineType machine_types[] = { + MachineType::AnyTagged(), MachineType::AnyTagged(), + MachineType::AnyTagged(), MachineType::AnyTagged(), + MachineType::TaggedSigned(), MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } -FunctionType* -StoreTransitionDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kReceiver, AnyTagged(zone)); - function->InitParameter(kName, AnyTagged(zone)); - function->InitParameter(kValue, AnyTagged(zone)); - function->InitParameter(kMap, AnyTagged(zone)); - return function; +void StoreNamedTransitionDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kReceiver, kFieldOffset, kMap, kValue, kSlot, kVector, kName + MachineType machine_types[] = { + MachineType::AnyTagged(), MachineType::TaggedSigned(), + MachineType::AnyTagged(), MachineType::AnyTagged(), + MachineType::TaggedSigned(), MachineType::AnyTagged(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } -FunctionType* -StoreGlobalViaContextDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kSlot, UntaggedIntegral32(zone)); - function->InitParameter(kValue, AnyTagged(zone)); - return function; +void StoreNamedTransitionDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = { + ReceiverRegister(), FieldOffsetRegister(), MapRegister(), + ValueRegister(), SlotRegister(), VectorRegister(), + NameRegister(), + }; + int len = arraysize(registers) - kStackArgumentsCount; + data->InitializePlatformSpecific(len, registers); } +void StoreGlobalViaContextDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kSlot, kValue + MachineType machine_types[] = {MachineType::Int32(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} void StoreGlobalViaContextDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { @@ -252,18 +223,14 @@ void MathPowIntegerDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } -FunctionType* -LoadWithVectorDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kReceiver, AnyTagged(zone)); - function->InitParameter(kName, AnyTagged(zone)); - function->InitParameter(kSlot, SmiType(zone)); - function->InitParameter(kVector, AnyTagged(zone)); - return function; +void LoadWithVectorDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kReceiver, kName, kSlot, kVector + MachineType machine_types[] = { + MachineType::AnyTagged(), MachineType::AnyTagged(), + MachineType::TaggedSigned(), MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } @@ -274,63 +241,33 @@ void LoadWithVectorDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } -FunctionType* -VectorStoreTransitionDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - bool has_slot = !VectorStoreTransitionDescriptor::SlotRegister().is(no_reg); - int arg_count = has_slot ? 6 : 5; - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), arg_count, zone) - ->AsFunction(); - int index = 0; - // TODO(ishell): use ParameterIndices here - function->InitParameter(index++, AnyTagged(zone)); // receiver - function->InitParameter(index++, AnyTagged(zone)); // name - function->InitParameter(index++, AnyTagged(zone)); // value - function->InitParameter(index++, AnyTagged(zone)); // map - if (has_slot) { - function->InitParameter(index++, SmiType(zone)); // slot - } - function->InitParameter(index++, AnyTagged(zone)); // vector - return function; -} - -FunctionType* -StoreWithVectorDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kReceiver, AnyTagged(zone)); - function->InitParameter(kName, AnyTagged(zone)); - function->InitParameter(kValue, AnyTagged(zone)); - function->InitParameter(kSlot, SmiType(zone)); - function->InitParameter(kVector, AnyTagged(zone)); - return function; +void StoreWithVectorDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kReceiver, kName, kValue, kSlot, kVector + MachineType machine_types[] = { + MachineType::AnyTagged(), MachineType::AnyTagged(), + MachineType::AnyTagged(), MachineType::TaggedSigned(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } void StoreWithVectorDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), SlotRegister(), VectorRegister()}; - data->InitializePlatformSpecific(arraysize(registers), registers); + int len = arraysize(registers) - kStackArgumentsCount; + data->InitializePlatformSpecific(len, registers); } -FunctionType* -BinaryOpWithVectorDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - DCHECK_EQ(parameter_count, kParameterCount); - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kLeft, AnyTagged(zone)); - function->InitParameter(kRight, AnyTagged(zone)); - function->InitParameter(kSlot, UntaggedIntegral32(zone)); - function->InitParameter(kVector, AnyTagged(zone)); - return function; +void BinaryOpWithVectorDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kLeft, kRight, kSlot, kVector + MachineType machine_types[] = {MachineType::AnyTagged(), + MachineType::AnyTagged(), MachineType::Int32(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } const Register ApiGetterDescriptor::ReceiverRegister() { @@ -349,291 +286,204 @@ void ContextOnlyDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(0, nullptr); } -CallInterfaceDescriptor OnStackArgsDescriptorBase::ForArgs( - Isolate* isolate, int parameter_count) { - switch (parameter_count) { - case 1: - return OnStackWith1ArgsDescriptor(isolate); - case 2: - return OnStackWith2ArgsDescriptor(isolate); - case 3: - return OnStackWith3ArgsDescriptor(isolate); - case 4: - return OnStackWith4ArgsDescriptor(isolate); - case 5: - return OnStackWith5ArgsDescriptor(isolate); - case 6: - return OnStackWith6ArgsDescriptor(isolate); - case 7: - return OnStackWith7ArgsDescriptor(isolate); - default: - UNREACHABLE(); - return VoidDescriptor(isolate); - } +void GrowArrayElementsDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {ObjectRegister(), KeyRegister()}; + data->InitializePlatformSpecific(arraysize(registers), registers); } -FunctionType* -OnStackArgsDescriptorBase::BuildCallInterfaceDescriptorFunctionTypeWithArg( - Isolate* isolate, int register_parameter_count, int parameter_count) { - DCHECK_EQ(0, register_parameter_count); - DCHECK_GT(parameter_count, 0); - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), AnyTagged(zone), parameter_count, zone) - ->AsFunction(); - for (int i = 0; i < parameter_count; i++) { - function->InitParameter(i, AnyTagged(zone)); - } - return function; +void VarArgFunctionDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kActualArgumentsCount + MachineType machine_types[] = {MachineType::Int32()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } -void OnStackArgsDescriptorBase::InitializePlatformSpecific( +void FastCloneRegExpDescriptor::InitializePlatformIndependent( CallInterfaceDescriptorData* data) { - data->InitializePlatformSpecific(0, nullptr); + // kClosure, kLiteralIndex, kPattern, kFlags + MachineType machine_types[] = { + MachineType::AnyTagged(), MachineType::TaggedSigned(), + MachineType::AnyTagged(), MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } -void GrowArrayElementsDescriptor::InitializePlatformSpecific( +void FastCloneShallowArrayDescriptor::InitializePlatformIndependent( CallInterfaceDescriptorData* data) { - Register registers[] = {ObjectRegister(), KeyRegister()}; - data->InitializePlatformSpecific(arraysize(registers), registers); + // kClosure, kLiteralIndex, kConstantElements + MachineType machine_types[] = {MachineType::AnyTagged(), + MachineType::TaggedSigned(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } -FunctionType* -VarArgFunctionDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), AnyTagged(zone), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kActualArgumentsCount, UntaggedIntegral32(zone)); - return function; -} - -FunctionType* -FastCloneRegExpDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kClosure, AnyTagged(zone)); - function->InitParameter(kLiteralIndex, SmiType(zone)); - function->InitParameter(kPattern, AnyTagged(zone)); - function->InitParameter(kFlags, AnyTagged(zone)); - return function; -} - -FunctionType* -FastCloneShallowArrayDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kClosure, AnyTagged(zone)); - function->InitParameter(kLiteralIndex, SmiType(zone)); - function->InitParameter(kConstantElements, AnyTagged(zone)); - return function; -} - -FunctionType* -CreateAllocationSiteDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kVector, AnyTagged(zone)); - function->InitParameter(kSlot, SmiType(zone)); - return function; -} - -FunctionType* -CreateWeakCellDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kVector, AnyTagged(zone)); - function->InitParameter(kSlot, SmiType(zone)); - function->InitParameter(kValue, AnyTagged(zone)); - return function; -} - -FunctionType* -CallTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kFunction, AnyTagged(zone)); - function->InitParameter(kActualArgumentsCount, UntaggedIntegral32(zone)); - return function; -} - -FunctionType* ConstructStubDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kFunction, AnyTagged(zone)); - function->InitParameter(kNewTarget, AnyTagged(zone)); - function->InitParameter(kActualArgumentsCount, UntaggedIntegral32(zone)); - function->InitParameter(kAllocationSite, AnyTagged(zone)); - return function; -} - -FunctionType* -ConstructTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kFunction, AnyTagged(zone)); - function->InitParameter(kNewTarget, AnyTagged(zone)); - function->InitParameter(kActualArgumentsCount, UntaggedIntegral32(zone)); - return function; -} - -FunctionType* -CallFunctionWithFeedbackDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kFunction, Type::Receiver()); - function->InitParameter(kSlot, SmiType(zone)); - return function; -} - -FunctionType* CallFunctionWithFeedbackAndVectorDescriptor:: - BuildCallInterfaceDescriptorFunctionType(Isolate* isolate, - int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kFunction, Type::Receiver()); - function->InitParameter(kSlot, SmiType(zone)); - function->InitParameter(kVector, AnyTagged(zone)); - return function; -} - -FunctionType* -ArrayNoArgumentConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kFunction, Type::Receiver()); - function->InitParameter(kAllocationSite, AnyTagged(zone)); - function->InitParameter(kActualArgumentsCount, UntaggedIntegral32(zone)); - function->InitParameter(kFunctionParameter, AnyTagged(zone)); - return function; -} - -FunctionType* ArraySingleArgumentConstructorDescriptor:: - BuildCallInterfaceDescriptorFunctionType(Isolate* isolate, - int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kFunction, Type::Receiver()); - function->InitParameter(kAllocationSite, AnyTagged(zone)); - function->InitParameter(kActualArgumentsCount, UntaggedIntegral32(zone)); - function->InitParameter(kFunctionParameter, AnyTagged(zone)); - function->InitParameter(kArraySizeSmiParameter, AnyTagged(zone)); - return function; -} - -FunctionType* -ArrayNArgumentsConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kFunction, Type::Receiver()); - function->InitParameter(kAllocationSite, AnyTagged(zone)); - function->InitParameter(kActualArgumentsCount, UntaggedIntegral32(zone)); - return function; -} - -FunctionType* -ArgumentAdaptorDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kFunction, Type::Receiver()); - function->InitParameter(kNewTarget, AnyTagged(zone)); - function->InitParameter(kActualArgumentsCount, UntaggedIntegral32(zone)); - function->InitParameter(kExpectedArgumentsCount, UntaggedIntegral32(zone)); - return function; -} - -CallInterfaceDescriptor ApiCallbackDescriptorBase::ForArgs(Isolate* isolate, - int argc) { - switch (argc) { - case 0: - return ApiCallbackWith0ArgsDescriptor(isolate); - case 1: - return ApiCallbackWith1ArgsDescriptor(isolate); - case 2: - return ApiCallbackWith2ArgsDescriptor(isolate); - case 3: - return ApiCallbackWith3ArgsDescriptor(isolate); - case 4: - return ApiCallbackWith4ArgsDescriptor(isolate); - case 5: - return ApiCallbackWith5ArgsDescriptor(isolate); - case 6: - return ApiCallbackWith6ArgsDescriptor(isolate); - case 7: - return ApiCallbackWith7ArgsDescriptor(isolate); - default: - UNREACHABLE(); - return VoidDescriptor(isolate); - } +void CreateAllocationSiteDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kVector, kSlot + MachineType machine_types[] = {MachineType::AnyTagged(), + MachineType::TaggedSigned()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } -FunctionType* -ApiCallbackDescriptorBase::BuildCallInterfaceDescriptorFunctionTypeWithArg( - Isolate* isolate, int parameter_count, int argc) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = Type::Function(AnyTagged(zone), Type::Undefined(), - kParameterCount + argc, zone) - ->AsFunction(); - function->InitParameter(kFunction, AnyTagged(zone)); - function->InitParameter(kCallData, AnyTagged(zone)); - function->InitParameter(kHolder, AnyTagged(zone)); - function->InitParameter(kApiFunctionAddress, ExternalPointer(zone)); - for (int i = 0; i < argc; i++) { - function->InitParameter(i, AnyTagged(zone)); - } - return function; -} - -FunctionType* -InterpreterDispatchDescriptor::BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int parameter_count) { - Zone* zone = isolate->interface_descriptor_zone(); - FunctionType* function = - Type::Function(AnyTagged(zone), Type::Undefined(), kParameterCount, zone) - ->AsFunction(); - function->InitParameter(kAccumulator, AnyTagged(zone)); - function->InitParameter(kBytecodeOffset, UntaggedIntegral32(zone)); - function->InitParameter(kBytecodeArray, AnyTagged(zone)); - function->InitParameter(kDispatchTable, AnyTagged(zone)); - return function; +void CreateWeakCellDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kVector, kSlot, kValue + MachineType machine_types[] = {MachineType::AnyTagged(), + MachineType::TaggedSigned(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void CallTrampolineDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kFunction, kActualArgumentsCount + MachineType machine_types[] = {MachineType::AnyTagged(), + MachineType::Int32()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void ConstructStubDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kFunction, kNewTarget, kActualArgumentsCount, kAllocationSite + MachineType machine_types[] = {MachineType::AnyTagged(), + MachineType::AnyTagged(), MachineType::Int32(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void ConstructTrampolineDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kFunction, kNewTarget, kActualArgumentsCount + MachineType machine_types[] = { + MachineType::AnyTagged(), MachineType::AnyTagged(), MachineType::Int32()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void CallFunctionWithFeedbackDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kFunction, kSlot + MachineType machine_types[] = {MachineType::AnyTagged(), + MachineType::TaggedSigned()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kFunction, kSlot, kVector + MachineType machine_types[] = {MachineType::TaggedPointer(), + MachineType::TaggedSigned(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void ArrayNoArgumentConstructorDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kFunction, kAllocationSite, kActualArgumentsCount, kFunctionParameter + MachineType machine_types[] = {MachineType::TaggedPointer(), + MachineType::AnyTagged(), MachineType::Int32(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void ArraySingleArgumentConstructorDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kFunction, kAllocationSite, kActualArgumentsCount, kFunctionParameter, + // kArraySizeSmiParameter + MachineType machine_types[] = { + MachineType::TaggedPointer(), MachineType::AnyTagged(), + MachineType::Int32(), MachineType::AnyTagged(), MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void ArrayNArgumentsConstructorDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kFunction, kAllocationSite, kActualArgumentsCount + MachineType machine_types[] = {MachineType::TaggedPointer(), + MachineType::AnyTagged(), + MachineType::Int32()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void ArgumentAdaptorDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kFunction, kNewTarget, kActualArgumentsCount, kExpectedArgumentsCount + MachineType machine_types[] = {MachineType::TaggedPointer(), + MachineType::AnyTagged(), MachineType::Int32(), + MachineType::Int32()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void ApiCallbackDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kFunction, kCallData, kHolder, kApiFunctionAddress + MachineType machine_types[] = { + MachineType::AnyTagged(), MachineType::AnyTagged(), + MachineType::AnyTagged(), MachineType::Pointer()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void InterpreterDispatchDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kAccumulator, kBytecodeOffset, kBytecodeArray, kDispatchTable + MachineType machine_types[] = { + MachineType::AnyTagged(), MachineType::IntPtr(), MachineType::AnyTagged(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void InterpreterPushArgsAndCallDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kNumberOfArguments, kFirstArgument, kFunction + MachineType machine_types[] = {MachineType::Int32(), MachineType::Pointer(), + MachineType::AnyTagged()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void InterpreterPushArgsAndConstructDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kNumberOfArguments, kNewTarget, kConstructor, kFeedbackElement, + // kFirstArgument + MachineType machine_types[] = { + MachineType::Int32(), MachineType::AnyTagged(), MachineType::AnyTagged(), + MachineType::AnyTagged(), MachineType::Pointer()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void InterpreterPushArgsAndConstructArrayDescriptor:: + InitializePlatformIndependent(CallInterfaceDescriptorData* data) { + // kNumberOfArguments, kFunction, kFeedbackElement, kFirstArgument + MachineType machine_types[] = {MachineType::Int32(), MachineType::AnyTagged(), + MachineType::AnyTagged(), + MachineType::Pointer()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); +} + +void InterpreterCEntryDescriptor::InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + // kNumberOfArguments, kFirstArgument, kFunctionEntry + MachineType machine_types[] = {MachineType::Int32(), MachineType::Pointer(), + MachineType::Pointer()}; + data->InitializePlatformIndependent(arraysize(machine_types), 0, + machine_types); } } // namespace internal diff --git a/deps/v8/src/interface-descriptors.h b/deps/v8/src/interface-descriptors.h index af59bdb121727e..09dc377338632a 100644 --- a/deps/v8/src/interface-descriptors.h +++ b/deps/v8/src/interface-descriptors.h @@ -15,137 +15,130 @@ namespace internal { class PlatformInterfaceDescriptor; -#define INTERFACE_DESCRIPTOR_LIST(V) \ - V(Void) \ - V(ContextOnly) \ - V(OnStackWith1Args) \ - V(OnStackWith2Args) \ - V(OnStackWith3Args) \ - V(OnStackWith4Args) \ - V(OnStackWith5Args) \ - V(OnStackWith6Args) \ - V(OnStackWith7Args) \ - V(Load) \ - V(LoadWithVector) \ - V(LoadGlobal) \ - V(LoadGlobalWithVector) \ - V(Store) \ - V(StoreWithVector) \ - V(StoreTransition) \ - V(VectorStoreTransition) \ - V(VarArgFunction) \ - V(FastNewClosure) \ - V(FastNewFunctionContext) \ - V(FastNewObject) \ - V(FastNewRestParameter) \ - V(FastNewSloppyArguments) \ - V(FastNewStrictArguments) \ - V(TypeConversion) \ - V(Typeof) \ - V(FastCloneRegExp) \ - V(FastCloneShallowArray) \ - V(FastCloneShallowObject) \ - V(CreateAllocationSite) \ - V(CreateWeakCell) \ - V(CallFunction) \ - V(CallFunctionWithFeedback) \ - V(CallFunctionWithFeedbackAndVector) \ - V(CallConstruct) \ - V(CallTrampoline) \ - V(ConstructStub) \ - V(ConstructTrampoline) \ - V(RegExpConstructResult) \ - V(CopyFastSmiOrObjectElements) \ - V(TransitionElementsKind) \ - V(AllocateHeapNumber) \ - V(AllocateFloat32x4) \ - V(AllocateInt32x4) \ - V(AllocateUint32x4) \ - V(AllocateBool32x4) \ - V(AllocateInt16x8) \ - V(AllocateUint16x8) \ - V(AllocateBool16x8) \ - V(AllocateInt8x16) \ - V(AllocateUint8x16) \ - V(AllocateBool8x16) \ - V(ArrayNoArgumentConstructor) \ - V(ArraySingleArgumentConstructor) \ - V(ArrayNArgumentsConstructor) \ - V(Compare) \ - V(BinaryOp) \ - V(BinaryOpWithAllocationSite) \ - V(BinaryOpWithVector) \ - V(CountOp) \ - V(StringAdd) \ - V(StringCompare) \ - V(Keyed) \ - V(Named) \ - V(HasProperty) \ - V(ForInFilter) \ - V(GetProperty) \ - V(CallHandler) \ - V(ArgumentAdaptor) \ - V(ApiCallbackWith0Args) \ - V(ApiCallbackWith1Args) \ - V(ApiCallbackWith2Args) \ - V(ApiCallbackWith3Args) \ - V(ApiCallbackWith4Args) \ - V(ApiCallbackWith5Args) \ - V(ApiCallbackWith6Args) \ - V(ApiCallbackWith7Args) \ - V(ApiGetter) \ - V(StoreGlobalViaContext) \ - V(MathPowTagged) \ - V(MathPowInteger) \ - V(GrowArrayElements) \ - V(InterpreterDispatch) \ - V(InterpreterPushArgsAndCall) \ - V(InterpreterPushArgsAndConstruct) \ - V(InterpreterCEntry) \ +#define INTERFACE_DESCRIPTOR_LIST(V) \ + V(Void) \ + V(ContextOnly) \ + V(Load) \ + V(LoadWithVector) \ + V(LoadGlobal) \ + V(LoadGlobalWithVector) \ + V(Store) \ + V(StoreWithVector) \ + V(StoreNamedTransition) \ + V(StoreTransition) \ + V(VarArgFunction) \ + V(FastNewClosure) \ + V(FastNewFunctionContext) \ + V(FastNewObject) \ + V(FastNewRestParameter) \ + V(FastNewSloppyArguments) \ + V(FastNewStrictArguments) \ + V(TypeConversion) \ + V(Typeof) \ + V(FastCloneRegExp) \ + V(FastCloneShallowArray) \ + V(FastCloneShallowObject) \ + V(CreateAllocationSite) \ + V(CreateWeakCell) \ + V(CallFunction) \ + V(CallFunctionWithFeedback) \ + V(CallFunctionWithFeedbackAndVector) \ + V(CallConstruct) \ + V(CallTrampoline) \ + V(ConstructStub) \ + V(ConstructTrampoline) \ + V(RegExpExec) \ + V(RegExpConstructResult) \ + V(CopyFastSmiOrObjectElements) \ + V(TransitionElementsKind) \ + V(AllocateHeapNumber) \ + V(AllocateFloat32x4) \ + V(AllocateInt32x4) \ + V(AllocateUint32x4) \ + V(AllocateBool32x4) \ + V(AllocateInt16x8) \ + V(AllocateUint16x8) \ + V(AllocateBool16x8) \ + V(AllocateInt8x16) \ + V(AllocateUint8x16) \ + V(AllocateBool8x16) \ + V(ArrayNoArgumentConstructor) \ + V(ArraySingleArgumentConstructor) \ + V(ArrayNArgumentsConstructor) \ + V(Compare) \ + V(BinaryOp) \ + V(BinaryOpWithAllocationSite) \ + V(BinaryOpWithVector) \ + V(CountOp) \ + V(StringAdd) \ + V(StringCompare) \ + V(SubString) \ + V(Keyed) \ + V(Named) \ + V(HasProperty) \ + V(ForInFilter) \ + V(GetProperty) \ + V(CallHandler) \ + V(ArgumentAdaptor) \ + V(ApiCallback) \ + V(ApiGetter) \ + V(StoreGlobalViaContext) \ + V(MathPowTagged) \ + V(MathPowInteger) \ + V(GrowArrayElements) \ + V(InterpreterDispatch) \ + V(InterpreterPushArgsAndCall) \ + V(InterpreterPushArgsAndConstruct) \ + V(InterpreterPushArgsAndConstructArray) \ + V(InterpreterCEntry) \ V(ResumeGenerator) class CallInterfaceDescriptorData { public: - CallInterfaceDescriptorData() - : register_param_count_(-1), function_type_(nullptr) {} + CallInterfaceDescriptorData() : register_param_count_(-1), param_count_(-1) {} // A copy of the passed in registers and param_representations is made // and owned by the CallInterfaceDescriptorData. - void InitializePlatformIndependent(FunctionType* function_type) { - function_type_ = function_type; - } - - // TODO(mvstanton): Instead of taking parallel arrays register and - // param_representations, how about a struct that puts the representation - // and register side by side (eg, RegRep(r1, Representation::Tagged()). - // The same should go for the CodeStubDescriptor class. void InitializePlatformSpecific( int register_parameter_count, const Register* registers, PlatformInterfaceDescriptor* platform_descriptor = NULL); - bool IsInitialized() const { return register_param_count_ >= 0; } + // if machine_types is null, then an array of size + // (register_parameter_count + extra_parameter_count) will be created + // with MachineType::AnyTagged() for each member. + // + // if machine_types is not null, then it should be of the size + // register_parameter_count. Those members of the parameter array + // will be initialized from {machine_types}, and the rest initialized + // to MachineType::AnyTagged(). + void InitializePlatformIndependent(int parameter_count, + int extra_parameter_count, + const MachineType* machine_types); + + bool IsInitialized() const { + return register_param_count_ >= 0 && param_count_ >= 0; + } - int param_count() const { return function_type_->Arity(); } + int param_count() const { return param_count_; } int register_param_count() const { return register_param_count_; } Register register_param(int index) const { return register_params_[index]; } Register* register_params() const { return register_params_.get(); } - Type* param_type(int index) const { return function_type_->Parameter(index); } + MachineType param_type(int index) const { return machine_types_[index]; } PlatformInterfaceDescriptor* platform_specific_descriptor() const { return platform_specific_descriptor_; } private: int register_param_count_; + int param_count_; // The Register params are allocated dynamically by the // InterfaceDescriptor, and freed on destruction. This is because static // arrays of Registers cause creation of runtime static initializers // which we don't want. std::unique_ptr register_params_; - - // Specifies types for parameters and return - FunctionType* function_type_; + std::unique_ptr machine_types_; PlatformInterfaceDescriptor* platform_specific_descriptor_; @@ -186,7 +179,7 @@ class CallInterfaceDescriptor { return data()->register_param(index); } - Type* GetParameterType(int index) const { + MachineType GetParameterType(int index) const { DCHECK(index < data()->param_count()); return data()->param_type(index); } @@ -200,21 +193,18 @@ class CallInterfaceDescriptor { const char* DebugName(Isolate* isolate) const; - static FunctionType* BuildDefaultFunctionType(Isolate* isolate, - int parameter_count); - protected: const CallInterfaceDescriptorData* data() const { return data_; } - virtual FunctionType* BuildCallInterfaceDescriptorFunctionType( - Isolate* isolate, int register_param_count) { - return BuildDefaultFunctionType(isolate, register_param_count); - } - virtual void InitializePlatformSpecific(CallInterfaceDescriptorData* data) { UNREACHABLE(); } + virtual void InitializePlatformIndependent( + CallInterfaceDescriptorData* data) { + data->InitializePlatformIndependent(data->register_param_count(), 0, NULL); + } + void Initialize(Isolate* isolate, CallDescriptors::Key key) { if (!data()->IsInitialized()) { // We should only initialize descriptors on the isolate's main thread. @@ -222,9 +212,7 @@ class CallInterfaceDescriptor { CallInterfaceDescriptorData* d = isolate->call_descriptor_data(key); DCHECK(d == data()); // d should be a modifiable pointer to data(). InitializePlatformSpecific(d); - FunctionType* function_type = BuildCallInterfaceDescriptorFunctionType( - isolate, d->register_param_count()); - d->InitializePlatformIndependent(function_type); + InitializePlatformIndependent(d); } } @@ -264,23 +252,26 @@ class CallInterfaceDescriptor { \ public: -#define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base) \ - DECLARE_DESCRIPTOR(name, base) \ - protected: \ - FunctionType* BuildCallInterfaceDescriptorFunctionType( \ - Isolate* isolate, int register_param_count) override; \ - \ +#define DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(name, base) \ + DECLARE_DESCRIPTOR(name, base) \ + protected: \ + void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \ + override; \ + \ public: -#define DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(name, base, arg) \ - DECLARE_DESCRIPTOR_WITH_BASE(name, base) \ - protected: \ - FunctionType* BuildCallInterfaceDescriptorFunctionType( \ - Isolate* isolate, int register_param_count) override { \ - return BuildCallInterfaceDescriptorFunctionTypeWithArg( \ - isolate, register_param_count, arg); \ - } \ - \ +#define DECLARE_DESCRIPTOR_WITH_STACK_ARGS(name, base) \ + DECLARE_DESCRIPTOR_WITH_BASE(name, base) \ + protected: \ + void InitializePlatformIndependent(CallInterfaceDescriptorData* data) \ + override { \ + data->InitializePlatformIndependent(0, kParameterCount, NULL); \ + } \ + void InitializePlatformSpecific(CallInterfaceDescriptorData* data) \ + override { \ + data->InitializePlatformSpecific(0, nullptr); \ + } \ + \ public: #define DEFINE_PARAMETERS(...) \ @@ -301,73 +292,6 @@ class ContextOnlyDescriptor : public CallInterfaceDescriptor { DECLARE_DESCRIPTOR(ContextOnlyDescriptor, CallInterfaceDescriptor) }; -// The OnStackWith*ArgsDescriptors have a lot of boilerplate. The superclass -// OnStackArgsDescriptorBase is not meant to be instantiated directly and has no -// public constructors to ensure this is so.contains all the logic, and the -// -// Use OnStackArgsDescriptorBase::ForArgs(isolate, parameter_count) to -// instantiate a descriptor with the number of args. -class OnStackArgsDescriptorBase : public CallInterfaceDescriptor { - public: - static CallInterfaceDescriptor ForArgs(Isolate* isolate, int parameter_count); - - protected: - OnStackArgsDescriptorBase(Isolate* isolate, CallDescriptors::Key key) - : CallInterfaceDescriptor(isolate, key) {} - void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; - FunctionType* BuildCallInterfaceDescriptorFunctionTypeWithArg( - Isolate* isolate, int register_parameter_count, int parameter_count); -}; - -class OnStackWith1ArgsDescriptor : public OnStackArgsDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith1ArgsDescriptor, - OnStackArgsDescriptorBase, - 1) -}; - -class OnStackWith2ArgsDescriptor : public OnStackArgsDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith2ArgsDescriptor, - OnStackArgsDescriptorBase, - 2) -}; - -class OnStackWith3ArgsDescriptor : public OnStackArgsDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith3ArgsDescriptor, - OnStackArgsDescriptorBase, - 3) -}; - -class OnStackWith4ArgsDescriptor : public OnStackArgsDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith4ArgsDescriptor, - OnStackArgsDescriptorBase, - 4) -}; - -class OnStackWith5ArgsDescriptor : public OnStackArgsDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith5ArgsDescriptor, - OnStackArgsDescriptorBase, - 5) -}; - -class OnStackWith6ArgsDescriptor : public OnStackArgsDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith6ArgsDescriptor, - OnStackArgsDescriptorBase, - 6) -}; - -class OnStackWith7ArgsDescriptor : public OnStackArgsDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG(OnStackWith7ArgsDescriptor, - OnStackArgsDescriptorBase, - 7) -}; - // LoadDescriptor is used by all stubs that implement Load/KeyedLoad ICs. class LoadDescriptor : public CallInterfaceDescriptor { public: @@ -401,42 +325,47 @@ class StoreDescriptor : public CallInterfaceDescriptor { static const Register NameRegister(); static const Register ValueRegister(); static const Register SlotRegister(); -}; +#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 + static const bool kPassLastArgsOnStack = true; +#else + static const bool kPassLastArgsOnStack = false; +#endif + + // Pass value and slot through the stack. + static const int kStackArgumentsCount = kPassLastArgsOnStack ? 2 : 0; +}; class StoreTransitionDescriptor : public StoreDescriptor { public: - DEFINE_PARAMETERS(kReceiver, kName, kValue, kMap) + DEFINE_PARAMETERS(kReceiver, kName, kMap, kValue, kSlot, kVector) DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreTransitionDescriptor, StoreDescriptor) static const Register MapRegister(); -}; + static const Register SlotRegister(); + static const Register VectorRegister(); + // Pass value, slot and vector through the stack. + static const int kStackArgumentsCount = kPassLastArgsOnStack ? 3 : 0; +}; -class VectorStoreTransitionDescriptor : public StoreDescriptor { +class StoreNamedTransitionDescriptor : public StoreTransitionDescriptor { public: - DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(VectorStoreTransitionDescriptor, - StoreDescriptor) - - // TODO(ishell): use DEFINE_PARAMETERS macro here - // Extends StoreDescriptor with Map parameter. - enum ParameterIndices { - kReceiver = 0, - kName = 1, - kValue = 2, + DEFINE_PARAMETERS(kReceiver, kFieldOffset, kMap, kValue, kSlot, kVector, + kName) + DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(StoreNamedTransitionDescriptor, + StoreTransitionDescriptor) - kMap = 3, - - kSlot = 4, // not present on ia32. - kVirtualSlotVector = 4, - - kVector = 5 - }; + // Always pass name on the stack. + static const bool kPassLastArgsOnStack = true; + static const int kStackArgumentsCount = + StoreTransitionDescriptor::kStackArgumentsCount + 1; - static const Register MapRegister(); - static const Register SlotRegister(); - static const Register VectorRegister(); + static const Register NameRegister() { return no_reg; } + static const Register FieldOffsetRegister() { + return StoreTransitionDescriptor::NameRegister(); + } }; class StoreWithVectorDescriptor : public StoreDescriptor { @@ -446,6 +375,9 @@ class StoreWithVectorDescriptor : public StoreDescriptor { StoreDescriptor) static const Register VectorRegister(); + + // Pass value, slot and vector through the stack. + static const int kStackArgumentsCount = kPassLastArgsOnStack ? 3 : 0; }; class LoadWithVectorDescriptor : public LoadDescriptor { @@ -632,6 +564,12 @@ class CallConstructDescriptor : public CallInterfaceDescriptor { DECLARE_DESCRIPTOR(CallConstructDescriptor, CallInterfaceDescriptor) }; +class RegExpExecDescriptor : public CallInterfaceDescriptor { + public: + DEFINE_PARAMETERS(kRegExpObject, kString, kPreviousIndex, kLastMatchInfo) + DECLARE_DESCRIPTOR_WITH_STACK_ARGS(RegExpExecDescriptor, + CallInterfaceDescriptor) +}; class RegExpConstructResultDescriptor : public CallInterfaceDescriptor { public: @@ -751,6 +689,13 @@ class StringCompareDescriptor : public CallInterfaceDescriptor { static const Register RightRegister(); }; +class SubStringDescriptor : public CallInterfaceDescriptor { + public: + DEFINE_PARAMETERS(kString, kFrom, kTo) + DECLARE_DESCRIPTOR_WITH_STACK_ARGS(SubStringDescriptor, + CallInterfaceDescriptor) +}; + // TODO(ishell): not used, remove. class KeyedDescriptor : public CallInterfaceDescriptor { public: @@ -778,79 +723,13 @@ class ArgumentAdaptorDescriptor : public CallInterfaceDescriptor { CallInterfaceDescriptor) }; -// The ApiCallback*Descriptors have a lot of boilerplate. The superclass -// ApiCallbackDescriptorBase contains all the logic, and the -// ApiCallbackWith*ArgsDescriptor merely instantiate these with a -// parameter for the number of args. -// -// The base class is not meant to be instantiated directly and has no -// public constructors to ensure this is so. -// -// The simplest usage for all the ApiCallback*Descriptors is probably -// ApiCallbackDescriptorBase::ForArgs(isolate, argc) -// -class ApiCallbackDescriptorBase : public CallInterfaceDescriptor { +class ApiCallbackDescriptor : public CallInterfaceDescriptor { public: DEFINE_PARAMETERS(kFunction, kCallData, kHolder, kApiFunctionAddress) - static CallInterfaceDescriptor ForArgs(Isolate* isolate, int argc); - - protected: - ApiCallbackDescriptorBase(Isolate* isolate, CallDescriptors::Key key) - : CallInterfaceDescriptor(isolate, key) {} - void InitializePlatformSpecific(CallInterfaceDescriptorData* data) override; - FunctionType* BuildCallInterfaceDescriptorFunctionTypeWithArg( - Isolate* isolate, int parameter_count, int argc); -}; - -class ApiCallbackWith0ArgsDescriptor : public ApiCallbackDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( - ApiCallbackWith0ArgsDescriptor, ApiCallbackDescriptorBase, 0) -}; - -class ApiCallbackWith1ArgsDescriptor : public ApiCallbackDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( - ApiCallbackWith1ArgsDescriptor, ApiCallbackDescriptorBase, 1) -}; - -class ApiCallbackWith2ArgsDescriptor : public ApiCallbackDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( - ApiCallbackWith2ArgsDescriptor, ApiCallbackDescriptorBase, 2) -}; - -class ApiCallbackWith3ArgsDescriptor : public ApiCallbackDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( - ApiCallbackWith3ArgsDescriptor, ApiCallbackDescriptorBase, 3) -}; - -class ApiCallbackWith4ArgsDescriptor : public ApiCallbackDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( - ApiCallbackWith4ArgsDescriptor, ApiCallbackDescriptorBase, 4) -}; - -class ApiCallbackWith5ArgsDescriptor : public ApiCallbackDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( - ApiCallbackWith5ArgsDescriptor, ApiCallbackDescriptorBase, 5) -}; - -class ApiCallbackWith6ArgsDescriptor : public ApiCallbackDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( - ApiCallbackWith6ArgsDescriptor, ApiCallbackDescriptorBase, 6) -}; - -class ApiCallbackWith7ArgsDescriptor : public ApiCallbackDescriptorBase { - public: - DECLARE_DESCRIPTOR_WITH_BASE_AND_FUNCTION_TYPE_ARG( - ApiCallbackWith7ArgsDescriptor, ApiCallbackDescriptorBase, 7) + DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(ApiCallbackDescriptor, + CallInterfaceDescriptor) }; - class ApiGetterDescriptor : public CallInterfaceDescriptor { public: DEFINE_PARAMETERS(kReceiver, kHolder, kCallback) @@ -904,22 +783,35 @@ class InterpreterDispatchDescriptor : public CallInterfaceDescriptor { class InterpreterPushArgsAndCallDescriptor : public CallInterfaceDescriptor { public: - DECLARE_DESCRIPTOR(InterpreterPushArgsAndCallDescriptor, - CallInterfaceDescriptor) + DEFINE_PARAMETERS(kNumberOfArguments, kFirstArgument, kFunction) + DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE( + InterpreterPushArgsAndCallDescriptor, CallInterfaceDescriptor) }; class InterpreterPushArgsAndConstructDescriptor : public CallInterfaceDescriptor { public: - DECLARE_DESCRIPTOR(InterpreterPushArgsAndConstructDescriptor, - CallInterfaceDescriptor) + DEFINE_PARAMETERS(kNumberOfArguments, kNewTarget, kConstructor, + kFeedbackElement, kFirstArgument) + DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE( + InterpreterPushArgsAndConstructDescriptor, CallInterfaceDescriptor) }; +class InterpreterPushArgsAndConstructArrayDescriptor + : public CallInterfaceDescriptor { + public: + DEFINE_PARAMETERS(kNumberOfArguments, kFunction, kFeedbackElement, + kFirstArgument) + DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE( + InterpreterPushArgsAndConstructArrayDescriptor, CallInterfaceDescriptor) +}; class InterpreterCEntryDescriptor : public CallInterfaceDescriptor { public: - DECLARE_DESCRIPTOR(InterpreterCEntryDescriptor, CallInterfaceDescriptor) + DEFINE_PARAMETERS(kNumberOfArguments, kFirstArgument, kFunctionEntry) + DECLARE_DESCRIPTOR_WITH_CUSTOM_FUNCTION_TYPE(InterpreterCEntryDescriptor, + CallInterfaceDescriptor) }; class ResumeGeneratorDescriptor final : public CallInterfaceDescriptor { diff --git a/deps/v8/src/interpreter/OWNERS b/deps/v8/src/interpreter/OWNERS index d12fcf90d92cc5..4e6a721fe05e90 100644 --- a/deps/v8/src/interpreter/OWNERS +++ b/deps/v8/src/interpreter/OWNERS @@ -3,5 +3,4 @@ set noparent bmeurer@chromium.org mstarzinger@chromium.org mythria@chromium.org -oth@chromium.org rmcilroy@chromium.org diff --git a/deps/v8/src/interpreter/bytecode-array-builder.cc b/deps/v8/src/interpreter/bytecode-array-builder.cc index 9bef5a5a4cdb3d..dfa395095abaf7 100644 --- a/deps/v8/src/interpreter/bytecode-array-builder.cc +++ b/deps/v8/src/interpreter/bytecode-array-builder.cc @@ -4,7 +4,6 @@ #include "src/interpreter/bytecode-array-builder.h" -#include "src/compiler.h" #include "src/globals.h" #include "src/interpreter/bytecode-array-writer.h" #include "src/interpreter/bytecode-dead-code-optimizer.h" @@ -29,7 +28,7 @@ BytecodeArrayBuilder::BytecodeArrayBuilder( parameter_count_(parameter_count), local_register_count_(locals_count), context_register_count_(context_count), - temporary_allocator_(zone, fixed_register_count()), + register_allocator_(fixed_register_count()), bytecode_array_writer_(zone, &constant_array_builder_, source_position_mode), pipeline_(&bytecode_array_writer_) { @@ -47,7 +46,8 @@ BytecodeArrayBuilder::BytecodeArrayBuilder( if (FLAG_ignition_reo) { pipeline_ = new (zone) BytecodeRegisterOptimizer( - zone, &temporary_allocator_, parameter_count, pipeline_); + zone, ®ister_allocator_, fixed_register_count(), parameter_count, + pipeline_); } return_position_ = @@ -70,10 +70,6 @@ Register BytecodeArrayBuilder::Parameter(int parameter_index) const { return Register::FromParameterIndex(parameter_index, parameter_count()); } -bool BytecodeArrayBuilder::RegisterIsParameterOrLocal(Register reg) const { - return reg.is_parameter() || reg.index() < locals_count(); -} - Handle BytecodeArrayBuilder::ToBytecodeArray(Isolate* isolate) { DCHECK(return_seen_in_block_); DCHECK(!bytecode_generated_); @@ -81,86 +77,121 @@ Handle BytecodeArrayBuilder::ToBytecodeArray(Isolate* isolate) { Handle handler_table = handler_table_builder()->ToHandlerTable(isolate); - return pipeline_->ToBytecodeArray(isolate, fixed_register_count(), + return pipeline_->ToBytecodeArray(isolate, total_register_count(), parameter_count(), handler_table); } -namespace { - -static bool ExpressionPositionIsNeeded(Bytecode bytecode) { - // An expression position is always needed if filtering is turned - // off. Otherwise an expression is only needed if the bytecode has - // external side effects. - return !FLAG_ignition_filter_expression_positions || - !Bytecodes::IsWithoutExternalSideEffects(bytecode); -} - -} // namespace - -void BytecodeArrayBuilder::AttachSourceInfo(BytecodeNode* node) { - if (latest_source_info_.is_valid()) { - // Statement positions need to be emitted immediately. Expression - // positions can be pushed back until a bytecode is found that can - // throw. Hence we only invalidate the existing source position - // information if it is used. - if (latest_source_info_.is_statement() || - ExpressionPositionIsNeeded(node->bytecode())) { - node->source_info().Clone(latest_source_info_); - latest_source_info_.set_invalid(); - } - } -} - void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1, uint32_t operand2, uint32_t operand3) { DCHECK(OperandsAreValid(bytecode, 4, operand0, operand1, operand2, operand3)); - BytecodeNode node(bytecode, operand0, operand1, operand2, operand3); - AttachSourceInfo(&node); + BytecodeNode node(bytecode, operand0, operand1, operand2, operand3, + &latest_source_info_); pipeline()->Write(&node); } void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1, uint32_t operand2) { DCHECK(OperandsAreValid(bytecode, 3, operand0, operand1, operand2)); - BytecodeNode node(bytecode, operand0, operand1, operand2); - AttachSourceInfo(&node); + BytecodeNode node(bytecode, operand0, operand1, operand2, + &latest_source_info_); pipeline()->Write(&node); } void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1) { DCHECK(OperandsAreValid(bytecode, 2, operand0, operand1)); - BytecodeNode node(bytecode, operand0, operand1); - AttachSourceInfo(&node); + BytecodeNode node(bytecode, operand0, operand1, &latest_source_info_); pipeline()->Write(&node); } void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0) { DCHECK(OperandsAreValid(bytecode, 1, operand0)); - BytecodeNode node(bytecode, operand0); - AttachSourceInfo(&node); + BytecodeNode node(bytecode, operand0, &latest_source_info_); pipeline()->Write(&node); } void BytecodeArrayBuilder::Output(Bytecode bytecode) { DCHECK(OperandsAreValid(bytecode, 0)); - BytecodeNode node(bytecode); - AttachSourceInfo(&node); + BytecodeNode node(bytecode, &latest_source_info_); pipeline()->Write(&node); } +void BytecodeArrayBuilder::OutputJump(Bytecode bytecode, BytecodeLabel* label) { + BytecodeNode node(bytecode, 0, &latest_source_info_); + pipeline_->WriteJump(&node, label); + LeaveBasicBlock(); +} + +void BytecodeArrayBuilder::OutputJump(Bytecode bytecode, uint32_t operand0, + BytecodeLabel* label) { + BytecodeNode node(bytecode, 0, operand0, &latest_source_info_); + pipeline_->WriteJump(&node, label); + LeaveBasicBlock(); +} + BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op, Register reg, int feedback_slot) { - Output(BytecodeForBinaryOperation(op), RegisterOperand(reg), - UnsignedOperand(feedback_slot)); + switch (op) { + case Token::Value::ADD: + Output(Bytecode::kAdd, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::SUB: + Output(Bytecode::kSub, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::MUL: + Output(Bytecode::kMul, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::DIV: + Output(Bytecode::kDiv, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::MOD: + Output(Bytecode::kMod, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::BIT_OR: + Output(Bytecode::kBitwiseOr, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::BIT_XOR: + Output(Bytecode::kBitwiseXor, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::BIT_AND: + Output(Bytecode::kBitwiseAnd, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::SHL: + Output(Bytecode::kShiftLeft, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::SAR: + Output(Bytecode::kShiftRight, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::SHR: + Output(Bytecode::kShiftRightLogical, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + default: + UNREACHABLE(); + } return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op, int feedback_slot) { - Output(BytecodeForCountOperation(op), UnsignedOperand(feedback_slot)); + if (op == Token::Value::ADD) { + Output(Bytecode::kInc, UnsignedOperand(feedback_slot)); + } else { + DCHECK_EQ(op, Token::Value::SUB); + Output(Bytecode::kDec, UnsignedOperand(feedback_slot)); + } return *this; } @@ -169,15 +200,51 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { return *this; } - BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { Output(Bytecode::kTypeOf); return *this; } -BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op, - Register reg) { - Output(BytecodeForCompareOperation(op), RegisterOperand(reg)); +BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation( + Token::Value op, Register reg, int feedback_slot) { + switch (op) { + case Token::Value::EQ: + Output(Bytecode::kTestEqual, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::NE: + Output(Bytecode::kTestNotEqual, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::EQ_STRICT: + Output(Bytecode::kTestEqualStrict, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::LT: + Output(Bytecode::kTestLessThan, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::GT: + Output(Bytecode::kTestGreaterThan, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::LTE: + Output(Bytecode::kTestLessThanOrEqual, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::GTE: + Output(Bytecode::kTestGreaterThanOrEqual, RegisterOperand(reg), + UnsignedOperand(feedback_slot)); + break; + case Token::Value::INSTANCEOF: + Output(Bytecode::kTestInstanceOf, RegisterOperand(reg)); + break; + case Token::Value::IN: + Output(Bytecode::kTestIn, RegisterOperand(reg)); + break; + default: + UNREACHABLE(); + } return *this; } @@ -250,50 +317,90 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal(int feedback_slot, TypeofMode typeof_mode) { - // TODO(rmcilroy): Potentially store typeof information in an - // operand rather than having extra bytecodes. - Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode); - Output(bytecode, UnsignedOperand(feedback_slot)); + if (typeof_mode == INSIDE_TYPEOF) { + Output(Bytecode::kLdaGlobalInsideTypeof, feedback_slot); + } else { + DCHECK_EQ(typeof_mode, NOT_INSIDE_TYPEOF); + Output(Bytecode::kLdaGlobal, UnsignedOperand(feedback_slot)); + } return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::StoreGlobal( const Handle name, int feedback_slot, LanguageMode language_mode) { - Bytecode bytecode = BytecodeForStoreGlobal(language_mode); size_t name_index = GetConstantPoolEntry(name); - Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); + if (language_mode == SLOPPY) { + Output(Bytecode::kStaGlobalSloppy, UnsignedOperand(name_index), + UnsignedOperand(feedback_slot)); + } else { + DCHECK_EQ(language_mode, STRICT); + Output(Bytecode::kStaGlobalStrict, UnsignedOperand(name_index), + UnsignedOperand(feedback_slot)); + } return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context, - int slot_index) { + int slot_index, + int depth) { Output(Bytecode::kLdaContextSlot, RegisterOperand(context), - UnsignedOperand(slot_index)); + UnsignedOperand(slot_index), UnsignedOperand(depth)); return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context, - int slot_index) { + int slot_index, + int depth) { Output(Bytecode::kStaContextSlot, RegisterOperand(context), - UnsignedOperand(slot_index)); + UnsignedOperand(slot_index), UnsignedOperand(depth)); return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot( const Handle name, TypeofMode typeof_mode) { + size_t name_index = GetConstantPoolEntry(name); + if (typeof_mode == INSIDE_TYPEOF) { + Output(Bytecode::kLdaLookupSlotInsideTypeof, UnsignedOperand(name_index)); + } else { + DCHECK_EQ(typeof_mode, NOT_INSIDE_TYPEOF); + Output(Bytecode::kLdaLookupSlot, UnsignedOperand(name_index)); + } + return *this; +} + +BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupContextSlot( + const Handle name, TypeofMode typeof_mode, int slot_index, + int depth) { + Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF) + ? Bytecode::kLdaLookupContextSlotInsideTypeof + : Bytecode::kLdaLookupContextSlot; + size_t name_index = GetConstantPoolEntry(name); + Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(slot_index), + UnsignedOperand(depth)); + return *this; +} + +BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupGlobalSlot( + const Handle name, TypeofMode typeof_mode, int feedback_slot, + int depth) { Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF) - ? Bytecode::kLdaLookupSlotInsideTypeof - : Bytecode::kLdaLookupSlot; + ? Bytecode::kLdaLookupGlobalSlotInsideTypeof + : Bytecode::kLdaLookupGlobalSlot; size_t name_index = GetConstantPoolEntry(name); - Output(bytecode, UnsignedOperand(name_index)); + Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(feedback_slot), + UnsignedOperand(depth)); return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::StoreLookupSlot( const Handle name, LanguageMode language_mode) { - Bytecode bytecode = BytecodeForStoreLookupSlot(language_mode); size_t name_index = GetConstantPoolEntry(name); - Output(bytecode, UnsignedOperand(name_index)); + if (language_mode == SLOPPY) { + Output(Bytecode::kStaLookupSlotSloppy, UnsignedOperand(name_index)); + } else { + DCHECK_EQ(language_mode, STRICT); + Output(Bytecode::kStaLookupSlotStrict, UnsignedOperand(name_index)); + } return *this; } @@ -315,19 +422,29 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( Register object, const Handle name, int feedback_slot, LanguageMode language_mode) { - Bytecode bytecode = BytecodeForStoreNamedProperty(language_mode); size_t name_index = GetConstantPoolEntry(name); - Output(bytecode, RegisterOperand(object), UnsignedOperand(name_index), - UnsignedOperand(feedback_slot)); + if (language_mode == SLOPPY) { + Output(Bytecode::kStaNamedPropertySloppy, RegisterOperand(object), + UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); + } else { + DCHECK_EQ(language_mode, STRICT); + Output(Bytecode::kStaNamedPropertyStrict, RegisterOperand(object), + UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); + } return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( Register object, Register key, int feedback_slot, LanguageMode language_mode) { - Bytecode bytecode = BytecodeForStoreKeyedProperty(language_mode); - Output(bytecode, RegisterOperand(object), RegisterOperand(key), - UnsignedOperand(feedback_slot)); + if (language_mode == SLOPPY) { + Output(Bytecode::kStaKeyedPropertySloppy, RegisterOperand(object), + RegisterOperand(key), UnsignedOperand(feedback_slot)); + } else { + DCHECK_EQ(language_mode, STRICT); + Output(Bytecode::kStaKeyedPropertyStrict, RegisterOperand(object), + RegisterOperand(key), UnsignedOperand(feedback_slot)); + } return *this; } @@ -346,10 +463,11 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CreateBlockContext( } BytecodeArrayBuilder& BytecodeArrayBuilder::CreateCatchContext( - Register exception, Handle name) { + Register exception, Handle name, Handle scope_info) { size_t name_index = GetConstantPoolEntry(name); + size_t scope_info_index = GetConstantPoolEntry(scope_info); Output(Bytecode::kCreateCatchContext, RegisterOperand(exception), - UnsignedOperand(name_index)); + UnsignedOperand(name_index), UnsignedOperand(scope_info_index)); return *this; } @@ -358,18 +476,29 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CreateFunctionContext(int slots) { return *this; } -BytecodeArrayBuilder& BytecodeArrayBuilder::CreateWithContext(Register object) { - Output(Bytecode::kCreateWithContext, RegisterOperand(object)); +BytecodeArrayBuilder& BytecodeArrayBuilder::CreateWithContext( + Register object, Handle scope_info) { + size_t scope_info_index = GetConstantPoolEntry(scope_info); + Output(Bytecode::kCreateWithContext, RegisterOperand(object), + UnsignedOperand(scope_info_index)); return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments( CreateArgumentsType type) { - // TODO(rmcilroy): Consider passing the type as a bytecode operand rather - // than having two different bytecodes once we have better support for - // branches in the InterpreterAssembler. - Bytecode bytecode = BytecodeForCreateArguments(type); - Output(bytecode); + switch (type) { + case CreateArgumentsType::kMappedArguments: + Output(Bytecode::kCreateMappedArguments); + break; + case CreateArgumentsType::kUnmappedArguments: + Output(Bytecode::kCreateUnmappedArguments); + break; + case CreateArgumentsType::kRestParameter: + Output(Bytecode::kCreateRestParameter); + break; + default: + UNREACHABLE(); + } return *this; } @@ -411,19 +540,19 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { return *this; } -BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject( +BytecodeArrayBuilder& BytecodeArrayBuilder::ConvertAccumulatorToObject( Register out) { Output(Bytecode::kToObject, RegisterOperand(out)); return *this; } -BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName( +BytecodeArrayBuilder& BytecodeArrayBuilder::ConvertAccumulatorToName( Register out) { Output(Bytecode::kToName, RegisterOperand(out)); return *this; } -BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToNumber( +BytecodeArrayBuilder& BytecodeArrayBuilder::ConvertAccumulatorToNumber( Register out) { Output(Bytecode::kToNumber, RegisterOperand(out)); return *this; @@ -442,43 +571,44 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(const BytecodeLabel& target, return *this; } -BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode, - BytecodeLabel* label) { - BytecodeNode node(jump_bytecode, 0); - AttachSourceInfo(&node); - pipeline_->WriteJump(&node, label); - LeaveBasicBlock(); - return *this; -} - BytecodeArrayBuilder& BytecodeArrayBuilder::Jump(BytecodeLabel* label) { - return OutputJump(Bytecode::kJump, label); + OutputJump(Bytecode::kJump, label); + return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::JumpIfTrue(BytecodeLabel* label) { // The peephole optimizer attempts to simplify JumpIfToBooleanTrue // to JumpIfTrue. - return OutputJump(Bytecode::kJumpIfToBooleanTrue, label); + OutputJump(Bytecode::kJumpIfToBooleanTrue, label); + return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::JumpIfFalse(BytecodeLabel* label) { - // The peephole optimizer attempts to simplify JumpIfToBooleanFalse - // to JumpIfFalse. - return OutputJump(Bytecode::kJumpIfToBooleanFalse, label); + OutputJump(Bytecode::kJumpIfToBooleanFalse, label); + return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::JumpIfNull(BytecodeLabel* label) { - return OutputJump(Bytecode::kJumpIfNull, label); + OutputJump(Bytecode::kJumpIfNull, label); + return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::JumpIfUndefined( BytecodeLabel* label) { - return OutputJump(Bytecode::kJumpIfUndefined, label); + OutputJump(Bytecode::kJumpIfUndefined, label); + return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::JumpIfNotHole( BytecodeLabel* label) { - return OutputJump(Bytecode::kJumpIfNotHole, label); + OutputJump(Bytecode::kJumpIfNotHole, label); + return *this; +} + +BytecodeArrayBuilder& BytecodeArrayBuilder::JumpLoop(BytecodeLabel* label, + int loop_depth) { + OutputJump(Bytecode::kJumpLoop, UnsignedOperand(loop_depth), label); + return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::StackCheck(int position) { @@ -499,11 +629,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::StackCheck(int position) { return *this; } -BytecodeArrayBuilder& BytecodeArrayBuilder::OsrPoll(int loop_depth) { - Output(Bytecode::kOsrPoll, UnsignedOperand(loop_depth)); - return *this; -} - BytecodeArrayBuilder& BytecodeArrayBuilder::Throw() { Output(Bytecode::kThrow); return *this; @@ -527,24 +652,27 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() { } BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare( - Register receiver, Register cache_info_triple) { + Register receiver, RegisterList cache_info_triple) { + DCHECK_EQ(3, cache_info_triple.register_count()); Output(Bytecode::kForInPrepare, RegisterOperand(receiver), - RegisterOperand(cache_info_triple)); + RegisterOperand(cache_info_triple.first_register())); return *this; } -BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index, - Register cache_length) { - Output(Bytecode::kForInDone, RegisterOperand(index), +BytecodeArrayBuilder& BytecodeArrayBuilder::ForInContinue( + Register index, Register cache_length) { + Output(Bytecode::kForInContinue, RegisterOperand(index), RegisterOperand(cache_length)); return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext( - Register receiver, Register index, Register cache_type_array_pair, + Register receiver, Register index, RegisterList cache_type_array_pair, int feedback_slot) { + DCHECK_EQ(2, cache_type_array_pair.register_count()); Output(Bytecode::kForInNext, RegisterOperand(receiver), - RegisterOperand(index), RegisterOperand(cache_type_array_pair), + RegisterOperand(index), + RegisterOperand(cache_type_array_pair.first_register()), UnsignedOperand(feedback_slot)); return *this; } @@ -591,45 +719,39 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::MarkTryEnd(int handler_id) { return *this; } -void BytecodeArrayBuilder::EnsureReturn() { - if (!return_seen_in_block_) { - LoadUndefined(); - Return(); - } - DCHECK(return_seen_in_block_); -} - BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, - Register receiver_args, - size_t receiver_args_count, + RegisterList args, int feedback_slot, TailCallMode tail_call_mode) { - Bytecode bytecode = BytecodeForCall(tail_call_mode); - Output(bytecode, RegisterOperand(callable), RegisterOperand(receiver_args), - UnsignedOperand(receiver_args_count), UnsignedOperand(feedback_slot)); + if (tail_call_mode == TailCallMode::kDisallow) { + Output(Bytecode::kCall, RegisterOperand(callable), + RegisterOperand(args.first_register()), + UnsignedOperand(args.register_count()), + UnsignedOperand(feedback_slot)); + } else { + DCHECK(tail_call_mode == TailCallMode::kAllow); + Output(Bytecode::kTailCall, RegisterOperand(callable), + RegisterOperand(args.first_register()), + UnsignedOperand(args.register_count()), + UnsignedOperand(feedback_slot)); + } return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor, - Register first_arg, - size_t arg_count) { - if (!first_arg.is_valid()) { - DCHECK_EQ(0u, arg_count); - first_arg = Register(0); - } + RegisterList args, + int feedback_slot_id) { Output(Bytecode::kNew, RegisterOperand(constructor), - RegisterOperand(first_arg), UnsignedOperand(arg_count)); + RegisterOperand(args.first_register()), + UnsignedOperand(args.register_count()), + UnsignedOperand(feedback_slot_id)); return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( - Runtime::FunctionId function_id, Register first_arg, size_t arg_count) { + Runtime::FunctionId function_id, RegisterList args) { DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size); DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); - if (!first_arg.is_valid()) { - DCHECK_EQ(0u, arg_count); - first_arg = Register(0); - } Bytecode bytecode; uint32_t id; if (IntrinsicsHelper::IsSupported(function_id)) { @@ -639,35 +761,56 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( bytecode = Bytecode::kCallRuntime; id = static_cast(function_id); } - Output(bytecode, id, RegisterOperand(first_arg), UnsignedOperand(arg_count)); + Output(bytecode, id, RegisterOperand(args.first_register()), + UnsignedOperand(args.register_count())); return *this; } +BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( + Runtime::FunctionId function_id, Register arg) { + return CallRuntime(function_id, RegisterList(arg.index(), 1)); +} + +BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( + Runtime::FunctionId function_id) { + return CallRuntime(function_id, RegisterList()); +} + BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair( - Runtime::FunctionId function_id, Register first_arg, size_t arg_count, - Register first_return) { + Runtime::FunctionId function_id, RegisterList args, + RegisterList return_pair) { DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size); DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); - if (!first_arg.is_valid()) { - DCHECK_EQ(0u, arg_count); - first_arg = Register(0); - } + DCHECK_EQ(2, return_pair.register_count()); Output(Bytecode::kCallRuntimeForPair, static_cast(function_id), - RegisterOperand(first_arg), UnsignedOperand(arg_count), - RegisterOperand(first_return)); + RegisterOperand(args.first_register()), + UnsignedOperand(args.register_count()), + RegisterOperand(return_pair.first_register())); return *this; } -BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime( - int context_index, Register receiver_args, size_t receiver_args_count) { +BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair( + Runtime::FunctionId function_id, Register arg, RegisterList return_pair) { + return CallRuntimeForPair(function_id, RegisterList(arg.index(), 1), + return_pair); +} + +BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime(int context_index, + RegisterList args) { Output(Bytecode::kCallJSRuntime, UnsignedOperand(context_index), - RegisterOperand(receiver_args), UnsignedOperand(receiver_args_count)); + RegisterOperand(args.first_register()), + UnsignedOperand(args.register_count())); return *this; } BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object, LanguageMode language_mode) { - Output(BytecodeForDelete(language_mode), RegisterOperand(object)); + if (language_mode == SLOPPY) { + Output(Bytecode::kDeletePropertySloppy, RegisterOperand(object)); + } else { + DCHECK_EQ(language_mode, STRICT); + Output(Bytecode::kDeletePropertyStrict, RegisterOperand(object)); + } return *this; } @@ -689,29 +832,6 @@ void BytecodeArrayBuilder::SetReturnPosition() { latest_source_info_.MakeStatementPosition(return_position_); } -void BytecodeArrayBuilder::SetStatementPosition(Statement* stmt) { - if (stmt->position() == kNoSourcePosition) return; - latest_source_info_.MakeStatementPosition(stmt->position()); -} - -void BytecodeArrayBuilder::SetExpressionPosition(Expression* expr) { - if (expr->position() == kNoSourcePosition) return; - if (!latest_source_info_.is_statement()) { - // Ensure the current expression position is overwritten with the - // latest value. - latest_source_info_.MakeExpressionPosition(expr->position()); - } -} - -void BytecodeArrayBuilder::SetExpressionAsStatementPosition(Expression* expr) { - if (expr->position() == kNoSourcePosition) return; - latest_source_info_.MakeStatementPosition(expr->position()); -} - -bool BytecodeArrayBuilder::TemporaryRegisterIsLive(Register reg) const { - return temporary_register_allocator()->RegisterIsLive(reg); -} - bool BytecodeArrayBuilder::RegisterIsValid(Register reg) const { if (!reg.is_valid()) { return false; @@ -726,7 +846,7 @@ bool BytecodeArrayBuilder::RegisterIsValid(Register reg) const { } else if (reg.index() < fixed_register_count()) { return true; } else { - return TemporaryRegisterIsLive(reg); + return register_allocator()->RegisterIsLive(reg); } } @@ -743,19 +863,6 @@ bool BytecodeArrayBuilder::OperandsAreValid( switch (operand_types[i]) { case OperandType::kNone: return false; - case OperandType::kRegCount: { - CHECK_NE(i, 0); - CHECK(operand_types[i - 1] == OperandType::kMaybeReg || - operand_types[i - 1] == OperandType::kReg); - if (i > 0 && operands[i] > 0) { - Register start = Register::FromOperand(operands[i - 1]); - Register end(start.index() + static_cast(operands[i]) - 1); - if (!RegisterIsValid(start) || !RegisterIsValid(end) || start > end) { - return false; - } - } - break; - } case OperandType::kFlag8: case OperandType::kIntrinsicId: if (Bytecodes::SizeForUnsignedOperand(operands[i]) > @@ -770,17 +877,28 @@ bool BytecodeArrayBuilder::OperandsAreValid( } break; case OperandType::kIdx: - // TODO(oth): Consider splitting OperandType::kIdx into two - // operand types. One which is a constant pool index that can - // be checked, and the other is an unsigned value. + // TODO(leszeks): Possibly split this up into constant pool indices and + // other indices, for checking. break; + case OperandType::kUImm: case OperandType::kImm: break; - case OperandType::kMaybeReg: - if (Register::FromOperand(operands[i]) == Register(0)) { - break; + case OperandType::kRegList: { + CHECK_LT(i, operand_count - 1); + CHECK(operand_types[i + 1] == OperandType::kRegCount); + int reg_count = static_cast(operands[i + 1]); + if (reg_count == 0) { + return Register::FromOperand(operands[i]) == Register(0); + } else { + Register start = Register::FromOperand(operands[i]); + Register end(start.index() + reg_count - 1); + if (!RegisterIsValid(start) || !RegisterIsValid(end) || start > end) { + return false; + } } - // Fall-through to kReg case. + i++; // Skip past kRegCount operand. + break; + } case OperandType::kReg: case OperandType::kRegOut: { Register reg = Register::FromOperand(operands[i]); @@ -808,186 +926,14 @@ bool BytecodeArrayBuilder::OperandsAreValid( } break; } + case OperandType::kRegCount: + UNREACHABLE(); // Dealt with in kRegList above. } } return true; } -// static -Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) { - switch (op) { - case Token::Value::ADD: - return Bytecode::kAdd; - case Token::Value::SUB: - return Bytecode::kSub; - case Token::Value::MUL: - return Bytecode::kMul; - case Token::Value::DIV: - return Bytecode::kDiv; - case Token::Value::MOD: - return Bytecode::kMod; - case Token::Value::BIT_OR: - return Bytecode::kBitwiseOr; - case Token::Value::BIT_XOR: - return Bytecode::kBitwiseXor; - case Token::Value::BIT_AND: - return Bytecode::kBitwiseAnd; - case Token::Value::SHL: - return Bytecode::kShiftLeft; - case Token::Value::SAR: - return Bytecode::kShiftRight; - case Token::Value::SHR: - return Bytecode::kShiftRightLogical; - default: - UNREACHABLE(); - return Bytecode::kIllegal; - } -} - -// static -Bytecode BytecodeArrayBuilder::BytecodeForCountOperation(Token::Value op) { - switch (op) { - case Token::Value::ADD: - return Bytecode::kInc; - case Token::Value::SUB: - return Bytecode::kDec; - default: - UNREACHABLE(); - return Bytecode::kIllegal; - } -} - -// static -Bytecode BytecodeArrayBuilder::BytecodeForCompareOperation(Token::Value op) { - switch (op) { - case Token::Value::EQ: - return Bytecode::kTestEqual; - case Token::Value::NE: - return Bytecode::kTestNotEqual; - case Token::Value::EQ_STRICT: - return Bytecode::kTestEqualStrict; - case Token::Value::LT: - return Bytecode::kTestLessThan; - case Token::Value::GT: - return Bytecode::kTestGreaterThan; - case Token::Value::LTE: - return Bytecode::kTestLessThanOrEqual; - case Token::Value::GTE: - return Bytecode::kTestGreaterThanOrEqual; - case Token::Value::INSTANCEOF: - return Bytecode::kTestInstanceOf; - case Token::Value::IN: - return Bytecode::kTestIn; - default: - UNREACHABLE(); - return Bytecode::kIllegal; - } -} - -// static -Bytecode BytecodeArrayBuilder::BytecodeForStoreNamedProperty( - LanguageMode language_mode) { - switch (language_mode) { - case SLOPPY: - return Bytecode::kStaNamedPropertySloppy; - case STRICT: - return Bytecode::kStaNamedPropertyStrict; - default: - UNREACHABLE(); - } - return Bytecode::kIllegal; -} - -// static -Bytecode BytecodeArrayBuilder::BytecodeForStoreKeyedProperty( - LanguageMode language_mode) { - switch (language_mode) { - case SLOPPY: - return Bytecode::kStaKeyedPropertySloppy; - case STRICT: - return Bytecode::kStaKeyedPropertyStrict; - default: - UNREACHABLE(); - } - return Bytecode::kIllegal; -} - -// static -Bytecode BytecodeArrayBuilder::BytecodeForLoadGlobal(TypeofMode typeof_mode) { - return typeof_mode == INSIDE_TYPEOF ? Bytecode::kLdaGlobalInsideTypeof - : Bytecode::kLdaGlobal; -} - -// static -Bytecode BytecodeArrayBuilder::BytecodeForStoreGlobal( - LanguageMode language_mode) { - switch (language_mode) { - case SLOPPY: - return Bytecode::kStaGlobalSloppy; - case STRICT: - return Bytecode::kStaGlobalStrict; - default: - UNREACHABLE(); - } - return Bytecode::kIllegal; -} - -// static -Bytecode BytecodeArrayBuilder::BytecodeForStoreLookupSlot( - LanguageMode language_mode) { - switch (language_mode) { - case SLOPPY: - return Bytecode::kStaLookupSlotSloppy; - case STRICT: - return Bytecode::kStaLookupSlotStrict; - default: - UNREACHABLE(); - } - return Bytecode::kIllegal; -} - -// static -Bytecode BytecodeArrayBuilder::BytecodeForCreateArguments( - CreateArgumentsType type) { - switch (type) { - case CreateArgumentsType::kMappedArguments: - return Bytecode::kCreateMappedArguments; - case CreateArgumentsType::kUnmappedArguments: - return Bytecode::kCreateUnmappedArguments; - case CreateArgumentsType::kRestParameter: - return Bytecode::kCreateRestParameter; - } - UNREACHABLE(); - return Bytecode::kIllegal; -} - -// static -Bytecode BytecodeArrayBuilder::BytecodeForDelete(LanguageMode language_mode) { - switch (language_mode) { - case SLOPPY: - return Bytecode::kDeletePropertySloppy; - case STRICT: - return Bytecode::kDeletePropertyStrict; - default: - UNREACHABLE(); - } - return Bytecode::kIllegal; -} - -// static -Bytecode BytecodeArrayBuilder::BytecodeForCall(TailCallMode tail_call_mode) { - switch (tail_call_mode) { - case TailCallMode::kDisallow: - return Bytecode::kCall; - case TailCallMode::kAllow: - return Bytecode::kTailCall; - default: - UNREACHABLE(); - } - return Bytecode::kIllegal; -} - } // namespace interpreter } // namespace internal } // namespace v8 diff --git a/deps/v8/src/interpreter/bytecode-array-builder.h b/deps/v8/src/interpreter/bytecode-array-builder.h index 51b61861c3636f..a9fa7a7bb5c2bd 100644 --- a/deps/v8/src/interpreter/bytecode-array-builder.h +++ b/deps/v8/src/interpreter/bytecode-array-builder.h @@ -12,7 +12,7 @@ #include "src/interpreter/bytecodes.h" #include "src/interpreter/constant-array-builder.h" #include "src/interpreter/handler-table-builder.h" -#include "src/zone-containers.h" +#include "src/zone/zone-containers.h" namespace v8 { namespace internal { @@ -61,23 +61,14 @@ class BytecodeArrayBuilder final : public ZoneObject { int fixed_register_count() const { return context_count() + locals_count(); } // Returns the number of fixed and temporary registers. - int fixed_and_temporary_register_count() const { - return fixed_register_count() + temporary_register_count(); - } - - int temporary_register_count() const { - return temporary_register_allocator()->allocation_count(); + int total_register_count() const { + DCHECK_LE(fixed_register_count(), + register_allocator()->maximum_register_count()); + return register_allocator()->maximum_register_count(); } Register Parameter(int parameter_index) const; - // Return true if the register |reg| represents a parameter or a - // local. - bool RegisterIsParameterOrLocal(Register reg) const; - - // Returns true if the register |reg| is a live temporary register. - bool TemporaryRegisterIsLive(Register reg) const; - // Constant loads to accumulator. BytecodeArrayBuilder& LoadConstantPoolEntry(size_t entry); BytecodeArrayBuilder& LoadLiteral(v8::internal::Smi* value); @@ -94,11 +85,15 @@ class BytecodeArrayBuilder final : public ZoneObject { int feedback_slot, LanguageMode language_mode); - // Load the object at |slot_index| in |context| into the accumulator. - BytecodeArrayBuilder& LoadContextSlot(Register context, int slot_index); + // Load the object at |slot_index| at |depth| in the context chain starting + // with |context| into the accumulator. + BytecodeArrayBuilder& LoadContextSlot(Register context, int slot_index, + int depth); - // Stores the object in the accumulator into |slot_index| of |context|. - BytecodeArrayBuilder& StoreContextSlot(Register context, int slot_index); + // Stores the object in the accumulator into |slot_index| at |depth| in the + // context chain starting with |context|. + BytecodeArrayBuilder& StoreContextSlot(Register context, int slot_index, + int depth); // Register-accumulator transfers. BytecodeArrayBuilder& LoadAccumulatorWithRegister(Register reg); @@ -127,6 +122,20 @@ class BytecodeArrayBuilder final : public ZoneObject { BytecodeArrayBuilder& LoadLookupSlot(const Handle name, TypeofMode typeof_mode); + // Lookup the variable with |name|, which is known to be at |slot_index| at + // |depth| in the context chain if not shadowed by a context extension + // somewhere in that context chain. + BytecodeArrayBuilder& LoadLookupContextSlot(const Handle name, + TypeofMode typeof_mode, + int slot_index, int depth); + + // Lookup the variable with |name|, which has its feedback in |feedback_slot| + // and is known to be global if not shadowed by a context extension somewhere + // up to |depth| in that context chain. + BytecodeArrayBuilder& LoadLookupGlobalSlot(const Handle name, + TypeofMode typeof_mode, + int feedback_slot, int depth); + // Store value in the accumulator into the variable with |name|. BytecodeArrayBuilder& StoreLookupSlot(const Handle name, LanguageMode language_mode); @@ -139,17 +148,19 @@ class BytecodeArrayBuilder final : public ZoneObject { // in the accumulator. BytecodeArrayBuilder& CreateBlockContext(Handle scope_info); - // Create a new context for a catch block with |exception| and |name| and the - // closure in the accumulator. + // Create a new context for a catch block with |exception|, |name|, + // |scope_info|, and the closure in the accumulator. BytecodeArrayBuilder& CreateCatchContext(Register exception, - Handle name); + Handle name, + Handle scope_info); // Create a new context with size |slots|. BytecodeArrayBuilder& CreateFunctionContext(int slots); - // Creates a new context for a with-statement with the |object| in a register - // and the closure in the accumulator. - BytecodeArrayBuilder& CreateWithContext(Register object); + // Creates a new context with the given |scope_info| for a with-statement + // with the |object| in a register and the closure in the accumulator. + BytecodeArrayBuilder& CreateWithContext(Register object, + Handle scope_info); // Create a new arguments object in the accumulator. BytecodeArrayBuilder& CreateArguments(CreateArgumentsType type); @@ -171,46 +182,42 @@ class BytecodeArrayBuilder final : public ZoneObject { BytecodeArrayBuilder& PopContext(Register context); // Call a JS function. The JSFunction or Callable to be called should be in - // |callable|, the receiver should be in |receiver_args| and all subsequent - // arguments should be in registers to - // . Type feedback is recorded in - // the |feedback_slot| in the type feedback vector. + // |callable|. The arguments should be in |args|, with the receiver in + // |args[0]|. Type feedback is recorded in the |feedback_slot| in the type + // feedback vector. BytecodeArrayBuilder& Call( - Register callable, Register receiver_args, size_t receiver_arg_count, - int feedback_slot, TailCallMode tail_call_mode = TailCallMode::kDisallow); - - BytecodeArrayBuilder& TailCall(Register callable, Register receiver_args, - size_t receiver_arg_count, int feedback_slot) { - return Call(callable, receiver_args, receiver_arg_count, feedback_slot, - TailCallMode::kAllow); - } + Register callable, RegisterList args, int feedback_slot, + TailCallMode tail_call_mode = TailCallMode::kDisallow); // Call the new operator. The accumulator holds the |new_target|. - // The |constructor| is in a register followed by |arg_count| - // consecutive arguments starting at |first_arg| for the constuctor - // invocation. - BytecodeArrayBuilder& New(Register constructor, Register first_arg, - size_t arg_count); - - // Call the runtime function with |function_id|. The first argument should be - // in |first_arg| and all subsequent arguments should be in registers - // to . + // The |constructor| is in a register and arguments are in |args|. + BytecodeArrayBuilder& New(Register constructor, RegisterList args, + int feedback_slot); + + // Call the runtime function with |function_id| and arguments |args|. + BytecodeArrayBuilder& CallRuntime(Runtime::FunctionId function_id, + RegisterList args); + // Call the runtime function with |function_id| with single argument |arg|. BytecodeArrayBuilder& CallRuntime(Runtime::FunctionId function_id, - Register first_arg, size_t arg_count); + Register arg); + // Call the runtime function with |function_id| with no arguments. + BytecodeArrayBuilder& CallRuntime(Runtime::FunctionId function_id); - // Call the runtime function with |function_id| that returns a pair of values. - // The first argument should be in |first_arg| and all subsequent arguments - // should be in registers to . The - // return values will be returned in and . + // Call the runtime function with |function_id| and arguments |args|, that + // returns a pair of values. The return values will be returned in + // |return_pair|. BytecodeArrayBuilder& CallRuntimeForPair(Runtime::FunctionId function_id, - Register first_arg, size_t arg_count, - Register first_return); + RegisterList args, + RegisterList return_pair); + // Call the runtime function with |function_id| with single argument |arg| + // that returns a pair of values. The return values will be returned in + // |return_pair|. + BytecodeArrayBuilder& CallRuntimeForPair(Runtime::FunctionId function_id, + Register arg, + RegisterList return_pair); - // Call the JS runtime function with |context_index|. The the receiver should - // be in |receiver_args| and all subsequent arguments should be in registers - // to . - BytecodeArrayBuilder& CallJSRuntime(int context_index, Register receiver_args, - size_t receiver_args_count); + // Call the JS runtime function with |context_index| and arguments |args|. + BytecodeArrayBuilder& CallJSRuntime(int context_index, RegisterList args); // Operators (register holds the lhs value, accumulator holds the rhs value). // Type feedback will be recorded in the |feedback_slot| @@ -230,15 +237,13 @@ class BytecodeArrayBuilder final : public ZoneObject { BytecodeArrayBuilder& Delete(Register object, LanguageMode language_mode); // Tests. - BytecodeArrayBuilder& CompareOperation(Token::Value op, Register reg); - - // Casts accumulator and stores result in accumulator. - BytecodeArrayBuilder& CastAccumulatorToBoolean(); + BytecodeArrayBuilder& CompareOperation(Token::Value op, Register reg, + int feedback_slot = kNoFeedbackSlot); - // Casts accumulator and stores result in register |out|. - BytecodeArrayBuilder& CastAccumulatorToJSObject(Register out); - BytecodeArrayBuilder& CastAccumulatorToName(Register out); - BytecodeArrayBuilder& CastAccumulatorToNumber(Register out); + // Converts accumulator and stores result in register |out|. + BytecodeArrayBuilder& ConvertAccumulatorToObject(Register out); + BytecodeArrayBuilder& ConvertAccumulatorToName(Register out); + BytecodeArrayBuilder& ConvertAccumulatorToNumber(Register out); // Flow Control. BytecodeArrayBuilder& Bind(BytecodeLabel* label); @@ -250,11 +255,10 @@ class BytecodeArrayBuilder final : public ZoneObject { BytecodeArrayBuilder& JumpIfNotHole(BytecodeLabel* label); BytecodeArrayBuilder& JumpIfNull(BytecodeLabel* label); BytecodeArrayBuilder& JumpIfUndefined(BytecodeLabel* label); + BytecodeArrayBuilder& JumpLoop(BytecodeLabel* label, int loop_depth); BytecodeArrayBuilder& StackCheck(int position); - BytecodeArrayBuilder& OsrPoll(int loop_depth); - BytecodeArrayBuilder& Throw(); BytecodeArrayBuilder& ReThrow(); BytecodeArrayBuilder& Return(); @@ -264,10 +268,10 @@ class BytecodeArrayBuilder final : public ZoneObject { // Complex flow control. BytecodeArrayBuilder& ForInPrepare(Register receiver, - Register cache_info_triple); - BytecodeArrayBuilder& ForInDone(Register index, Register cache_length); + RegisterList cache_info_triple); + BytecodeArrayBuilder& ForInContinue(Register index, Register cache_length); BytecodeArrayBuilder& ForInNext(Register receiver, Register index, - Register cache_type_array_pair, + RegisterList cache_type_array_pair, int feedback_slot); BytecodeArrayBuilder& ForInStep(Register index); @@ -292,20 +296,55 @@ class BytecodeArrayBuilder final : public ZoneObject { void InitializeReturnPosition(FunctionLiteral* literal); - void SetStatementPosition(Statement* stmt); - void SetExpressionPosition(Expression* expr); - void SetExpressionAsStatementPosition(Expression* expr); + void SetStatementPosition(Statement* stmt) { + if (stmt->position() == kNoSourcePosition) return; + latest_source_info_.MakeStatementPosition(stmt->position()); + } + + void SetExpressionPosition(Expression* expr) { + if (expr->position() == kNoSourcePosition) return; + if (!latest_source_info_.is_statement()) { + // Ensure the current expression position is overwritten with the + // latest value. + latest_source_info_.MakeExpressionPosition(expr->position()); + } + } + + void SetExpressionAsStatementPosition(Expression* expr) { + if (expr->position() == kNoSourcePosition) return; + latest_source_info_.MakeStatementPosition(expr->position()); + } + + bool RequiresImplicitReturn() const { return !return_seen_in_block_; } // Accessors - TemporaryRegisterAllocator* temporary_register_allocator() { - return &temporary_allocator_; + BytecodeRegisterAllocator* register_allocator() { + return ®ister_allocator_; } - const TemporaryRegisterAllocator* temporary_register_allocator() const { - return &temporary_allocator_; + const BytecodeRegisterAllocator* register_allocator() const { + return ®ister_allocator_; } Zone* zone() const { return zone_; } - void EnsureReturn(); + private: + friend class BytecodeRegisterAllocator; + + INLINE(void Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1, + uint32_t operand2, uint32_t operand3)); + INLINE(void Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1, + uint32_t operand2)); + INLINE(void Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1)); + INLINE(void Output(Bytecode bytecode, uint32_t operand0)); + INLINE(void Output(Bytecode bytecode)); + + INLINE(void OutputJump(Bytecode bytecode, BytecodeLabel* label)); + INLINE(void OutputJump(Bytecode bytecode, uint32_t operand0, + BytecodeLabel* label)); + + bool RegisterIsValid(Register reg) const; + bool OperandsAreValid(Bytecode bytecode, int operand_count, + uint32_t operand0 = 0, uint32_t operand1 = 0, + uint32_t operand2 = 0, uint32_t operand3 = 0) const; static uint32_t RegisterOperand(Register reg) { return static_cast(reg.ToOperand()); @@ -325,40 +364,6 @@ class BytecodeArrayBuilder final : public ZoneObject { return static_cast(value); } - private: - friend class BytecodeRegisterAllocator; - - static Bytecode BytecodeForBinaryOperation(Token::Value op); - static Bytecode BytecodeForCountOperation(Token::Value op); - static Bytecode BytecodeForCompareOperation(Token::Value op); - static Bytecode BytecodeForStoreNamedProperty(LanguageMode language_mode); - static Bytecode BytecodeForStoreKeyedProperty(LanguageMode language_mode); - static Bytecode BytecodeForLoadGlobal(TypeofMode typeof_mode); - static Bytecode BytecodeForStoreGlobal(LanguageMode language_mode); - static Bytecode BytecodeForStoreLookupSlot(LanguageMode language_mode); - static Bytecode BytecodeForCreateArguments(CreateArgumentsType type); - static Bytecode BytecodeForDelete(LanguageMode language_mode); - static Bytecode BytecodeForCall(TailCallMode tail_call_mode); - - void Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1, - uint32_t operand2, uint32_t operand3); - void Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1, - uint32_t operand2); - void Output(Bytecode bytecode, uint32_t operand0, uint32_t operand1); - void Output(Bytecode bytecode, uint32_t operand0); - void Output(Bytecode bytecode); - - BytecodeArrayBuilder& OutputJump(Bytecode jump_bytecode, - BytecodeLabel* label); - - bool RegisterIsValid(Register reg) const; - bool OperandsAreValid(Bytecode bytecode, int operand_count, - uint32_t operand0 = 0, uint32_t operand1 = 0, - uint32_t operand2 = 0, uint32_t operand3 = 0) const; - - // Attach latest source position to |node|. - void AttachSourceInfo(BytecodeNode* node); - // Set position for return. void SetReturnPosition(); @@ -395,11 +400,13 @@ class BytecodeArrayBuilder final : public ZoneObject { int local_register_count_; int context_register_count_; int return_position_; - TemporaryRegisterAllocator temporary_allocator_; + BytecodeRegisterAllocator register_allocator_; BytecodeArrayWriter bytecode_array_writer_; BytecodePipelineStage* pipeline_; BytecodeSourceInfo latest_source_info_; + static int const kNoFeedbackSlot = 0; + DISALLOW_COPY_AND_ASSIGN(BytecodeArrayBuilder); }; diff --git a/deps/v8/src/interpreter/bytecode-array-iterator.cc b/deps/v8/src/interpreter/bytecode-array-iterator.cc index 84c0028342867f..e596b11a0568a9 100644 --- a/deps/v8/src/interpreter/bytecode-array-iterator.cc +++ b/deps/v8/src/interpreter/bytecode-array-iterator.cc @@ -97,6 +97,13 @@ uint32_t BytecodeArrayIterator::GetFlagOperand(int operand_index) const { return GetUnsignedOperand(operand_index, OperandType::kFlag8); } +uint32_t BytecodeArrayIterator::GetUnsignedImmediateOperand( + int operand_index) const { + DCHECK_EQ(Bytecodes::GetOperandType(current_bytecode(), operand_index), + OperandType::kUImm); + return GetUnsignedOperand(operand_index, OperandType::kUImm); +} + int32_t BytecodeArrayIterator::GetImmediateOperand(int operand_index) const { DCHECK_EQ(Bytecodes::GetOperandType(current_bytecode(), operand_index), OperandType::kImm); @@ -133,11 +140,11 @@ int BytecodeArrayIterator::GetRegisterOperandRange(int operand_index) const { DCHECK_LE(operand_index, Bytecodes::NumberOfOperands(current_bytecode())); const OperandType* operand_types = Bytecodes::GetOperandTypes(current_bytecode()); - DCHECK(Bytecodes::IsRegisterOperandType(operand_types[operand_index])); - if (operand_types[operand_index + 1] == OperandType::kRegCount) { + OperandType operand_type = operand_types[operand_index]; + DCHECK(Bytecodes::IsRegisterOperandType(operand_type)); + if (operand_type == OperandType::kRegList) { return GetRegisterCountOperand(operand_index + 1); } else { - OperandType operand_type = operand_types[operand_index]; return Bytecodes::GetNumberOfRegistersRepresentedBy(operand_type); } } diff --git a/deps/v8/src/interpreter/bytecode-array-iterator.h b/deps/v8/src/interpreter/bytecode-array-iterator.h index 0f7c6c7df98dad..09226252cc0fc9 100644 --- a/deps/v8/src/interpreter/bytecode-array-iterator.h +++ b/deps/v8/src/interpreter/bytecode-array-iterator.h @@ -31,6 +31,7 @@ class BytecodeArrayIterator { } uint32_t GetFlagOperand(int operand_index) const; + uint32_t GetUnsignedImmediateOperand(int operand_index) const; int32_t GetImmediateOperand(int operand_index) const; uint32_t GetIndexOperand(int operand_index) const; uint32_t GetRegisterCountOperand(int operand_index) const; diff --git a/deps/v8/src/interpreter/bytecode-array-writer.cc b/deps/v8/src/interpreter/bytecode-array-writer.cc index 6694a3697cb195..fb3876819e4cbf 100644 --- a/deps/v8/src/interpreter/bytecode-array-writer.cc +++ b/deps/v8/src/interpreter/bytecode-array-writer.cc @@ -21,27 +21,23 @@ BytecodeArrayWriter::BytecodeArrayWriter( Zone* zone, ConstantArrayBuilder* constant_array_builder, SourcePositionTableBuilder::RecordingMode source_position_mode) : bytecodes_(zone), - max_register_count_(0), unbound_jumps_(0), source_position_table_builder_(zone, source_position_mode), - constant_array_builder_(constant_array_builder) {} + constant_array_builder_(constant_array_builder) { + bytecodes_.reserve(512); // Derived via experimentation. +} // override BytecodeArrayWriter::~BytecodeArrayWriter() {} // override Handle BytecodeArrayWriter::ToBytecodeArray( - Isolate* isolate, int fixed_register_count, int parameter_count, + Isolate* isolate, int register_count, int parameter_count, Handle handler_table) { DCHECK_EQ(0, unbound_jumps_); int bytecode_size = static_cast(bytecodes()->size()); - - // All locals need a frame slot for the debugger, but may not be - // present in generated code. - int frame_size_for_locals = fixed_register_count * kPointerSize; - int frame_size_used = max_register_count() * kPointerSize; - int frame_size = std::max(frame_size_for_locals, frame_size_used); + int frame_size = register_count * kPointerSize; Handle constant_pool = constant_array_builder()->ToFixedArray(isolate); Handle bytecode_array = isolate->factory()->NewBytecodeArray( @@ -104,116 +100,48 @@ void BytecodeArrayWriter::UpdateSourcePositionTable( } } -namespace { - -OperandScale ScaleForScalableByteOperand(OperandSize operand_size) { - STATIC_ASSERT(static_cast(OperandSize::kByte) == - static_cast(OperandScale::kSingle)); - STATIC_ASSERT(static_cast(OperandSize::kShort) == - static_cast(OperandScale::kDouble)); - STATIC_ASSERT(static_cast(OperandSize::kQuad) == - static_cast(OperandScale::kQuadruple)); - return static_cast(operand_size); -} - -OperandScale OperandScaleForScalableSignedByte(uint32_t operand_value) { - int32_t signed_operand = static_cast(operand_value); - OperandSize bytes_required = Bytecodes::SizeForSignedOperand(signed_operand); - return ScaleForScalableByteOperand(bytes_required); -} - -OperandScale OperandScaleForScalableUnsignedByte(uint32_t operand_value) { - OperandSize bytes_required = Bytecodes::SizeForUnsignedOperand(operand_value); - return ScaleForScalableByteOperand(bytes_required); -} - -OperandScale GetOperandScale(const BytecodeNode* const node) { - const OperandTypeInfo* operand_type_infos = - Bytecodes::GetOperandTypeInfos(node->bytecode()); - OperandScale operand_scale = OperandScale::kSingle; - int operand_count = node->operand_count(); - for (int i = 0; i < operand_count; ++i) { - switch (operand_type_infos[i]) { - case OperandTypeInfo::kScalableSignedByte: { - uint32_t operand = node->operand(i); - operand_scale = - std::max(operand_scale, OperandScaleForScalableSignedByte(operand)); - break; - } - case OperandTypeInfo::kScalableUnsignedByte: { - uint32_t operand = node->operand(i); - operand_scale = std::max(operand_scale, - OperandScaleForScalableUnsignedByte(operand)); - break; - } - case OperandTypeInfo::kFixedUnsignedByte: - case OperandTypeInfo::kFixedUnsignedShort: - break; - case OperandTypeInfo::kNone: - UNREACHABLE(); - break; - } - } - return operand_scale; -} - -} // namespace - void BytecodeArrayWriter::EmitBytecode(const BytecodeNode* const node) { DCHECK_NE(node->bytecode(), Bytecode::kIllegal); - uint8_t buffer[kMaxSizeOfPackedBytecode]; - uint8_t* buffer_limit = buffer; + Bytecode bytecode = node->bytecode(); + OperandScale operand_scale = node->operand_scale(); - OperandScale operand_scale = GetOperandScale(node); if (operand_scale != OperandScale::kSingle) { Bytecode prefix = Bytecodes::OperandScaleToPrefixBytecode(operand_scale); - *buffer_limit++ = Bytecodes::ToByte(prefix); + bytecodes()->push_back(Bytecodes::ToByte(prefix)); } - - Bytecode bytecode = node->bytecode(); - *buffer_limit++ = Bytecodes::ToByte(bytecode); + bytecodes()->push_back(Bytecodes::ToByte(bytecode)); const uint32_t* const operands = node->operands(); - const OperandType* operand_types = Bytecodes::GetOperandTypes(bytecode); - const int operand_count = Bytecodes::NumberOfOperands(bytecode); + const int operand_count = node->operand_count(); + const OperandSize* operand_sizes = + Bytecodes::GetOperandSizes(bytecode, operand_scale); for (int i = 0; i < operand_count; ++i) { - OperandSize operand_size = - Bytecodes::SizeOfOperand(operand_types[i], operand_scale); - switch (operand_size) { + switch (operand_sizes[i]) { case OperandSize::kNone: UNREACHABLE(); break; case OperandSize::kByte: - *buffer_limit++ = static_cast(operands[i]); + bytecodes()->push_back(static_cast(operands[i])); break; case OperandSize::kShort: { - WriteUnalignedUInt16(buffer_limit, operands[i]); - buffer_limit += 2; + uint16_t operand = static_cast(operands[i]); + const uint8_t* raw_operand = reinterpret_cast(&operand); + bytecodes()->push_back(raw_operand[0]); + bytecodes()->push_back(raw_operand[1]); break; } case OperandSize::kQuad: { - WriteUnalignedUInt32(buffer_limit, operands[i]); - buffer_limit += 4; + const uint8_t* raw_operand = + reinterpret_cast(&operands[i]); + bytecodes()->push_back(raw_operand[0]); + bytecodes()->push_back(raw_operand[1]); + bytecodes()->push_back(raw_operand[2]); + bytecodes()->push_back(raw_operand[3]); break; } } - - int count = Bytecodes::GetNumberOfRegistersRepresentedBy(operand_types[i]); - if (count == 0) { - continue; - } - // NB operand_types is terminated by OperandType::kNone so - // operand_types[i + 1] is valid whilst i < operand_count. - if (operand_types[i + 1] == OperandType::kRegCount) { - count = static_cast(operands[i]); - } - Register reg = Register::FromOperand(static_cast(operands[i])); - max_register_count_ = std::max(max_register_count_, reg.index() + count); } - - DCHECK_LE(buffer_limit, buffer + sizeof(buffer)); - bytecodes()->insert(bytecodes()->end(), buffer, buffer_limit); } // static @@ -247,18 +175,17 @@ void BytecodeArrayWriter::PatchJumpWith8BitOperand(size_t jump_location, DCHECK(Bytecodes::IsJumpImmediate(jump_bytecode)); size_t operand_location = jump_location + 1; DCHECK_EQ(bytecodes()->at(operand_location), k8BitJumpPlaceholder); - if (Bytecodes::SizeForSignedOperand(delta) == OperandSize::kByte) { - // The jump fits within the range of an Imm operand, so cancel + if (Bytecodes::ScaleForSignedOperand(delta) == OperandScale::kSingle) { + // The jump fits within the range of an Imm8 operand, so cancel // the reservation and jump directly. constant_array_builder()->DiscardReservedEntry(OperandSize::kByte); bytecodes()->at(operand_location) = static_cast(delta); } else { - // The jump does not fit within the range of an Imm operand, so + // The jump does not fit within the range of an Imm8 operand, so // commit reservation putting the offset into the constant pool, // and update the jump instruction and operand. size_t entry = constant_array_builder()->CommitReservedEntry( OperandSize::kByte, Smi::FromInt(delta)); - DCHECK_LE(entry, kMaxUInt32); DCHECK_EQ(Bytecodes::SizeForUnsignedOperand(static_cast(entry)), OperandSize::kByte); jump_bytecode = GetJumpWithConstantOperand(jump_bytecode); @@ -273,14 +200,21 @@ void BytecodeArrayWriter::PatchJumpWith16BitOperand(size_t jump_location, DCHECK(Bytecodes::IsJumpImmediate(jump_bytecode)); size_t operand_location = jump_location + 1; uint8_t operand_bytes[2]; - if (Bytecodes::SizeForSignedOperand(delta) <= OperandSize::kShort) { + if (Bytecodes::ScaleForSignedOperand(delta) <= OperandScale::kDouble) { + // The jump fits within the range of an Imm16 operand, so cancel + // the reservation and jump directly. constant_array_builder()->DiscardReservedEntry(OperandSize::kShort); WriteUnalignedUInt16(operand_bytes, static_cast(delta)); } else { - jump_bytecode = GetJumpWithConstantOperand(jump_bytecode); - bytecodes()->at(jump_location) = Bytecodes::ToByte(jump_bytecode); + // The jump does not fit within the range of an Imm16 operand, so + // commit reservation putting the offset into the constant pool, + // and update the jump instruction and operand. size_t entry = constant_array_builder()->CommitReservedEntry( OperandSize::kShort, Smi::FromInt(delta)); + DCHECK_EQ(Bytecodes::SizeForUnsignedOperand(static_cast(entry)), + OperandSize::kShort); + jump_bytecode = GetJumpWithConstantOperand(jump_bytecode); + bytecodes()->at(jump_location) = Bytecodes::ToByte(jump_bytecode); WriteUnalignedUInt16(operand_bytes, static_cast(entry)); } DCHECK(bytecodes()->at(operand_location) == k8BitJumpPlaceholder && @@ -351,13 +285,14 @@ void BytecodeArrayWriter::EmitJump(BytecodeNode* node, BytecodeLabel* label) { // Label has been bound already so this is a backwards jump. size_t abs_delta = current_offset - label->offset(); int delta = -static_cast(abs_delta); - OperandSize operand_size = Bytecodes::SizeForSignedOperand(delta); - if (operand_size > OperandSize::kByte) { + OperandScale operand_scale = Bytecodes::ScaleForSignedOperand(delta); + if (operand_scale > OperandScale::kSingle) { // Adjust for scaling byte prefix for wide jump offset. DCHECK_LE(delta, 0); delta -= 1; } - node->set_bytecode(node->bytecode(), delta); + DCHECK_EQ(Bytecode::kJumpLoop, node->bytecode()); + node->set_bytecode(node->bytecode(), delta, node->operand(1)); } else { // The label has not yet been bound so this is a forward reference // that will be patched when the label is bound. We create a @@ -369,6 +304,7 @@ void BytecodeArrayWriter::EmitJump(BytecodeNode* node, BytecodeLabel* label) { label->set_referrer(current_offset); OperandSize reserved_operand_size = constant_array_builder()->CreateReservedEntry(); + DCHECK_NE(Bytecode::kJumpLoop, node->bytecode()); switch (reserved_operand_size) { case OperandSize::kNone: UNREACHABLE(); diff --git a/deps/v8/src/interpreter/bytecode-array-writer.h b/deps/v8/src/interpreter/bytecode-array-writer.h index 17fe3d4732ebbf..712fcb98378ac9 100644 --- a/deps/v8/src/interpreter/bytecode-array-writer.h +++ b/deps/v8/src/interpreter/bytecode-array-writer.h @@ -33,7 +33,7 @@ class BytecodeArrayWriter final : public BytecodePipelineStage { void BindLabel(BytecodeLabel* label) override; void BindLabel(const BytecodeLabel& target, BytecodeLabel* label) override; Handle ToBytecodeArray( - Isolate* isolate, int fixed_register_count, int parameter_count, + Isolate* isolate, int register_count, int parameter_count, Handle handler_table) override; private: @@ -69,10 +69,8 @@ class BytecodeArrayWriter final : public BytecodePipelineStage { ConstantArrayBuilder* constant_array_builder() { return constant_array_builder_; } - int max_register_count() { return max_register_count_; } ZoneVector bytecodes_; - int max_register_count_; int unbound_jumps_; SourcePositionTableBuilder source_position_table_builder_; ConstantArrayBuilder* constant_array_builder_; diff --git a/deps/v8/src/interpreter/bytecode-dead-code-optimizer.cc b/deps/v8/src/interpreter/bytecode-dead-code-optimizer.cc index 5d301c76ce7b88..848036c01e811b 100644 --- a/deps/v8/src/interpreter/bytecode-dead-code-optimizer.cc +++ b/deps/v8/src/interpreter/bytecode-dead-code-optimizer.cc @@ -14,10 +14,10 @@ BytecodeDeadCodeOptimizer::BytecodeDeadCodeOptimizer( // override Handle BytecodeDeadCodeOptimizer::ToBytecodeArray( - Isolate* isolate, int fixed_register_count, int parameter_count, + Isolate* isolate, int register_count, int parameter_count, Handle handler_table) { - return next_stage_->ToBytecodeArray(isolate, fixed_register_count, - parameter_count, handler_table); + return next_stage_->ToBytecodeArray(isolate, register_count, parameter_count, + handler_table); } // override diff --git a/deps/v8/src/interpreter/bytecode-dead-code-optimizer.h b/deps/v8/src/interpreter/bytecode-dead-code-optimizer.h index 8a9732cb3f2864..188d6108902184 100644 --- a/deps/v8/src/interpreter/bytecode-dead-code-optimizer.h +++ b/deps/v8/src/interpreter/bytecode-dead-code-optimizer.h @@ -24,7 +24,7 @@ class BytecodeDeadCodeOptimizer final : public BytecodePipelineStage, void BindLabel(BytecodeLabel* label) override; void BindLabel(const BytecodeLabel& target, BytecodeLabel* label) override; Handle ToBytecodeArray( - Isolate* isolate, int fixed_register_count, int parameter_count, + Isolate* isolate, int register_count, int parameter_count, Handle handler_table) override; private: diff --git a/deps/v8/src/interpreter/bytecode-decoder.cc b/deps/v8/src/interpreter/bytecode-decoder.cc index 74c5806ef5e925..49751897ee8a46 100644 --- a/deps/v8/src/interpreter/bytecode-decoder.cc +++ b/deps/v8/src/interpreter/bytecode-decoder.cc @@ -22,6 +22,15 @@ Register BytecodeDecoder::DecodeRegisterOperand(const uint8_t* operand_start, return Register::FromOperand(operand); } +// static +RegisterList BytecodeDecoder::DecodeRegisterListOperand( + const uint8_t* operand_start, uint32_t count, OperandType operand_type, + OperandScale operand_scale) { + Register first_reg = + DecodeRegisterOperand(operand_start, operand_type, operand_scale); + return RegisterList(first_reg.index(), static_cast(count)); +} + // static int32_t BytecodeDecoder::DecodeSignedOperand(const uint8_t* operand_start, OperandType operand_type, @@ -94,7 +103,6 @@ std::ostream& BytecodeDecoder::Decode(std::ostream& os, if (Bytecodes::IsDebugBreak(bytecode)) return os; int number_of_operands = Bytecodes::NumberOfOperands(bytecode); - int range = 0; for (int i = 0; i < number_of_operands; i++) { OperandType op_type = Bytecodes::GetOperandType(bytecode, i); int operand_offset = @@ -102,11 +110,8 @@ std::ostream& BytecodeDecoder::Decode(std::ostream& os, const uint8_t* operand_start = &bytecode_start[prefix_offset + operand_offset]; switch (op_type) { - case interpreter::OperandType::kRegCount: - os << "#" - << DecodeUnsignedOperand(operand_start, op_type, operand_scale); - break; case interpreter::OperandType::kIdx: + case interpreter::OperandType::kUImm: case interpreter::OperandType::kRuntimeId: case interpreter::OperandType::kIntrinsicId: os << "[" @@ -121,7 +126,6 @@ std::ostream& BytecodeDecoder::Decode(std::ostream& os, os << "#" << DecodeUnsignedOperand(operand_start, op_type, operand_scale); break; - case interpreter::OperandType::kMaybeReg: case interpreter::OperandType::kReg: case interpreter::OperandType::kRegOut: { Register reg = @@ -129,19 +133,40 @@ std::ostream& BytecodeDecoder::Decode(std::ostream& os, os << reg.ToString(parameter_count); break; } - case interpreter::OperandType::kRegOutTriple: - range += 1; + case interpreter::OperandType::kRegOutTriple: { + RegisterList reg_list = + DecodeRegisterListOperand(operand_start, 3, op_type, operand_scale); + os << reg_list.first_register().ToString(parameter_count) << "-" + << reg_list.last_register().ToString(parameter_count); + break; + } case interpreter::OperandType::kRegOutPair: case interpreter::OperandType::kRegPair: { - range += 1; - Register first_reg = - DecodeRegisterOperand(operand_start, op_type, operand_scale); - Register last_reg = Register(first_reg.index() + range); - os << first_reg.ToString(parameter_count) << "-" - << last_reg.ToString(parameter_count); + RegisterList reg_list = + DecodeRegisterListOperand(operand_start, 2, op_type, operand_scale); + os << reg_list.first_register().ToString(parameter_count) << "-" + << reg_list.last_register().ToString(parameter_count); + break; + } + case interpreter::OperandType::kRegList: { + DCHECK_LT(i, number_of_operands - 1); + DCHECK_EQ(Bytecodes::GetOperandType(bytecode, i + 1), + OperandType::kRegCount); + int reg_count_offset = + Bytecodes::GetOperandOffset(bytecode, i + 1, operand_scale); + const uint8_t* reg_count_operand = + &bytecode_start[prefix_offset + reg_count_offset]; + uint32_t count = DecodeUnsignedOperand( + reg_count_operand, OperandType::kRegCount, operand_scale); + RegisterList reg_list = DecodeRegisterListOperand( + operand_start, count, op_type, operand_scale); + os << reg_list.first_register().ToString(parameter_count) << "-" + << reg_list.last_register().ToString(parameter_count); + i++; // Skip kRegCount. break; } case interpreter::OperandType::kNone: + case interpreter::OperandType::kRegCount: // Dealt with in kRegList. UNREACHABLE(); break; } diff --git a/deps/v8/src/interpreter/bytecode-decoder.h b/deps/v8/src/interpreter/bytecode-decoder.h index 6613179d0c1734..d1749efb7f86b8 100644 --- a/deps/v8/src/interpreter/bytecode-decoder.h +++ b/deps/v8/src/interpreter/bytecode-decoder.h @@ -21,6 +21,12 @@ class BytecodeDecoder final { OperandType operand_type, OperandScale operand_scale); + // Decodes a register list operand in a byte array. + static RegisterList DecodeRegisterListOperand(const uint8_t* operand_start, + uint32_t count, + OperandType operand_type, + OperandScale operand_scale); + // Decodes a signed operand in a byte array. static int32_t DecodeSignedOperand(const uint8_t* operand_start, OperandType operand_type, diff --git a/deps/v8/src/interpreter/bytecode-flags.cc b/deps/v8/src/interpreter/bytecode-flags.cc index 9b25dbd230959d..158af13ea73edd 100644 --- a/deps/v8/src/interpreter/bytecode-flags.cc +++ b/deps/v8/src/interpreter/bytecode-flags.cc @@ -10,6 +10,14 @@ namespace v8 { namespace internal { namespace interpreter { +// static +uint8_t CreateArrayLiteralFlags::Encode(bool use_fast_shallow_clone, + int runtime_flags) { + uint8_t result = FlagsBits::encode(runtime_flags); + result |= FastShallowCloneBit::encode(use_fast_shallow_clone); + return result; +} + // static uint8_t CreateObjectLiteralFlags::Encode(bool fast_clone_supported, int properties_count, diff --git a/deps/v8/src/interpreter/bytecode-flags.h b/deps/v8/src/interpreter/bytecode-flags.h index 1068d8a9d9c39b..6e87ce20b23c41 100644 --- a/deps/v8/src/interpreter/bytecode-flags.h +++ b/deps/v8/src/interpreter/bytecode-flags.h @@ -11,6 +11,17 @@ namespace v8 { namespace internal { namespace interpreter { +class CreateArrayLiteralFlags { + public: + class FlagsBits : public BitField8 {}; + class FastShallowCloneBit : public BitField8 {}; + + static uint8_t Encode(bool use_fast_shallow_clone, int runtime_flags); + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(CreateArrayLiteralFlags); +}; + class CreateObjectLiteralFlags { public: class FlagsBits : public BitField8 {}; diff --git a/deps/v8/src/interpreter/bytecode-generator.cc b/deps/v8/src/interpreter/bytecode-generator.cc index 6ff43a41707fe4..db5a596b85ba8e 100644 --- a/deps/v8/src/interpreter/bytecode-generator.cc +++ b/deps/v8/src/interpreter/bytecode-generator.cc @@ -4,15 +4,16 @@ #include "src/interpreter/bytecode-generator.h" +#include "src/ast/compile-time-value.h" #include "src/ast/scopes.h" #include "src/code-stubs.h" +#include "src/compilation-info.h" #include "src/compiler.h" #include "src/interpreter/bytecode-flags.h" #include "src/interpreter/bytecode-label.h" #include "src/interpreter/bytecode-register-allocator.h" #include "src/interpreter/control-flow-builders.h" #include "src/objects.h" -#include "src/parsing/parser.h" #include "src/parsing/token.h" namespace v8 { @@ -216,10 +217,10 @@ class BytecodeGenerator::ControlScopeForTopLevel final case CMD_CONTINUE: UNREACHABLE(); case CMD_RETURN: - generator()->builder()->Return(); + generator()->BuildReturn(); return true; case CMD_RETHROW: - generator()->builder()->ReThrow(); + generator()->BuildReThrow(); return true; } return false; @@ -310,7 +311,7 @@ class BytecodeGenerator::ControlScopeForTryCatch final case CMD_RETURN: break; case CMD_RETHROW: - generator()->builder()->ReThrow(); + generator()->BuildReThrow(); return true; } return false; @@ -373,75 +374,35 @@ class BytecodeGenerator::RegisterAllocationScope { public: explicit RegisterAllocationScope(BytecodeGenerator* generator) : generator_(generator), - outer_(generator->register_allocator()), - allocator_(builder()->zone(), - builder()->temporary_register_allocator()) { - generator_->set_register_allocator(this); - } + outer_next_register_index_( + generator->register_allocator()->next_register_index()) {} virtual ~RegisterAllocationScope() { - generator_->set_register_allocator(outer_); - } - - Register NewRegister() { - RegisterAllocationScope* current_scope = generator()->register_allocator(); - if ((current_scope == this) || - (current_scope->outer() == this && - !current_scope->allocator_.HasConsecutiveAllocations())) { - // Regular case - Allocating registers in current or outer context. - // VisitForRegisterValue allocates register in outer context. - return allocator_.NewRegister(); - } else { - // If it is required to allocate a register other than current or outer - // scopes, allocate a new temporary register. It might be expensive to - // walk the full context chain and compute the list of consecutive - // reservations in the innerscopes. - UNIMPLEMENTED(); - return Register::invalid_value(); - } - } - - void PrepareForConsecutiveAllocations(int count) { - allocator_.PrepareForConsecutiveAllocations(count); + generator_->register_allocator()->ReleaseRegisters( + outer_next_register_index_); } - Register NextConsecutiveRegister() { - return allocator_.NextConsecutiveRegister(); - } - - bool RegisterIsAllocatedInThisScope(Register reg) const { - return allocator_.RegisterIsAllocatedInThisScope(reg); - } - - RegisterAllocationScope* outer() const { return outer_; } - private: - BytecodeGenerator* generator() const { return generator_; } - BytecodeArrayBuilder* builder() const { return generator_->builder(); } - BytecodeGenerator* generator_; - RegisterAllocationScope* outer_; - BytecodeRegisterAllocator allocator_; + int outer_next_register_index_; DISALLOW_COPY_AND_ASSIGN(RegisterAllocationScope); }; -// Scoped base class for determining where the result of an expression -// is stored. +// Scoped base class for determining how the result of an expression will be +// used. class BytecodeGenerator::ExpressionResultScope { public: ExpressionResultScope(BytecodeGenerator* generator, Expression::Context kind) : generator_(generator), kind_(kind), outer_(generator->execution_result()), - allocator_(generator), - result_identified_(false) { + allocator_(generator) { generator_->set_execution_result(this); } virtual ~ExpressionResultScope() { generator_->set_execution_result(outer_); - DCHECK(result_identified() || generator_->HasStackOverflow()); } bool IsEffect() const { return kind_ == Expression::kEffect; } @@ -453,28 +414,11 @@ class BytecodeGenerator::ExpressionResultScope { return reinterpret_cast(this); } - virtual void SetResultInAccumulator() = 0; - virtual void SetResultInRegister(Register reg) = 0; - - protected: - ExpressionResultScope* outer() const { return outer_; } - BytecodeArrayBuilder* builder() const { return generator_->builder(); } - BytecodeGenerator* generator() const { return generator_; } - const RegisterAllocationScope* allocator() const { return &allocator_; } - - void set_result_identified() { - DCHECK(!result_identified()); - result_identified_ = true; - } - - bool result_identified() const { return result_identified_; } - private: BytecodeGenerator* generator_; Expression::Context kind_; ExpressionResultScope* outer_; RegisterAllocationScope allocator_; - bool result_identified_; DISALLOW_COPY_AND_ASSIGN(ExpressionResultScope); }; @@ -485,61 +429,15 @@ class BytecodeGenerator::EffectResultScope final : public ExpressionResultScope { public: explicit EffectResultScope(BytecodeGenerator* generator) - : ExpressionResultScope(generator, Expression::kEffect) { - set_result_identified(); - } - - virtual void SetResultInAccumulator() {} - virtual void SetResultInRegister(Register reg) {} -}; - -// Scoped class used when the result of the current expression to be -// evaluated should go into the interpreter's accumulator register. -class BytecodeGenerator::AccumulatorResultScope final - : public ExpressionResultScope { - public: - explicit AccumulatorResultScope(BytecodeGenerator* generator) - : ExpressionResultScope(generator, Expression::kValue) {} - - virtual void SetResultInAccumulator() { set_result_identified(); } - - virtual void SetResultInRegister(Register reg) { - builder()->LoadAccumulatorWithRegister(reg); - set_result_identified(); - } + : ExpressionResultScope(generator, Expression::kEffect) {} }; // Scoped class used when the result of the current expression to be -// evaluated should go into an interpreter register. -class BytecodeGenerator::RegisterResultScope final - : public ExpressionResultScope { +// evaluated should go into the interpreter's accumulator. +class BytecodeGenerator::ValueResultScope final : public ExpressionResultScope { public: - explicit RegisterResultScope(BytecodeGenerator* generator) + explicit ValueResultScope(BytecodeGenerator* generator) : ExpressionResultScope(generator, Expression::kValue) {} - - virtual void SetResultInAccumulator() { - result_register_ = allocator()->outer()->NewRegister(); - builder()->StoreAccumulatorInRegister(result_register_); - set_result_identified(); - } - - virtual void SetResultInRegister(Register reg) { - DCHECK(builder()->RegisterIsParameterOrLocal(reg) || - (builder()->TemporaryRegisterIsLive(reg) && - !allocator()->RegisterIsAllocatedInThisScope(reg))); - result_register_ = reg; - set_result_identified(); - } - - Register ResultRegister() { - if (generator()->HasStackOverflow() && !result_identified()) { - SetResultInAccumulator(); - } - return result_register_; - } - - private: - Register result_register_; }; // Scoped class used when the result of the current expression to be @@ -554,18 +452,10 @@ class BytecodeGenerator::TestResultScope final : public ExpressionResultScope { fallthrough_(fallthrough), result_consumed_by_test_(false) {} - virtual void SetResultInAccumulator() { set_result_identified(); } - - virtual void SetResultInRegister(Register reg) { - builder()->LoadAccumulatorWithRegister(reg); - set_result_identified(); - } - // Used when code special cases for TestResultScope and consumes any // possible value by testing and jumping to a then/else label. void SetResultConsumedByTest() { result_consumed_by_test_ = true; - set_result_identified(); } bool ResultConsumedByTest() { return result_consumed_by_test_; } @@ -677,22 +567,17 @@ BytecodeGenerator::BytecodeGenerator(CompilationInfo* info) execution_control_(nullptr), execution_context_(nullptr), execution_result_(nullptr), - register_allocator_(nullptr), generator_resume_points_(info->literal()->yield_count(), info->zone()), generator_state_(), loop_depth_(0), home_object_symbol_(info->isolate()->factory()->home_object_symbol()), prototype_string_(info->isolate()->factory()->prototype_string()) { - InitializeAstVisitor(info->isolate()->stack_guard()->real_climit()); } Handle BytecodeGenerator::FinalizeBytecode(Isolate* isolate) { - // Create an inner HandleScope to avoid unnecessarily canonicalizing handles - // created as part of bytecode finalization. - HandleScope scope(isolate); AllocateDeferredConstants(); if (HasStackOverflow()) return Handle(); - return scope.CloseAndEscape(builder()->ToBytecodeArray(isolate)); + return builder()->ToBytecodeArray(isolate); } void BytecodeGenerator::AllocateDeferredConstants() { @@ -726,11 +611,13 @@ void BytecodeGenerator::AllocateDeferredConstants() { } } -void BytecodeGenerator::GenerateBytecode() { +void BytecodeGenerator::GenerateBytecode(uintptr_t stack_limit) { DisallowHeapAllocation no_allocation; DisallowHandleAllocation no_handles; DisallowHandleDereference no_deref; + InitializeAstVisitor(stack_limit); + // Initialize the incoming context. ContextScope incoming_context(this, scope(), false); @@ -744,12 +631,11 @@ void BytecodeGenerator::GenerateBytecode() { VisitGeneratorPrologue(); } - // Build function context only if there are context allocated variables. if (scope()->NeedsContext()) { // Push a new inner context scope for the function. - VisitNewLocalFunctionContext(); + BuildNewLocalActivationContext(); ContextScope local_function_context(this, scope(), false); - VisitBuildLocalActivationContext(); + BuildLocalActivationContextInitialization(); GenerateBytecodeBody(); } else { GenerateBytecodeBody(); @@ -763,7 +649,13 @@ void BytecodeGenerator::GenerateBytecode() { if (!label.is_bound()) builder()->Bind(&label); } - builder()->EnsureReturn(); + // Emit an implicit return instruction in case control flow can fall off the + // end of the function without an explicit return being present on all paths. + if (builder()->RequiresImplicitReturn()) { + builder()->LoadUndefined(); + BuildReturn(); + } + DCHECK(!builder()->RequiresImplicitReturn()); } void BytecodeGenerator::GenerateBytecodeBody() { @@ -771,8 +663,7 @@ void BytecodeGenerator::GenerateBytecodeBody() { VisitArgumentsObject(scope()->arguments()); // Build rest arguments array if it is used. - int rest_index; - Variable* rest_parameter = scope()->rest_parameter(&rest_index); + Variable* rest_parameter = scope()->rest_parameter(); VisitRestArgumentsArray(rest_parameter); // Build assignment to {.this_function} variable if it is used. @@ -781,10 +672,8 @@ void BytecodeGenerator::GenerateBytecodeBody() { // Build assignment to {new.target} variable if it is used. VisitNewTargetVariable(scope()->new_target_var()); - // TODO(rmcilroy): Emit tracing call if requested to do so. - if (FLAG_trace) { - UNIMPLEMENTED(); - } + // Emit tracing call if requested to do so. + if (FLAG_trace) builder()->CallRuntime(Runtime::kTraceEnter); // Visit declarations within the function scope. VisitDeclarations(scope()->declarations()); @@ -829,14 +718,6 @@ void BytecodeGenerator::VisitIterationHeader(IterationStatement* stmt, loop_builder->LoopHeader(&resume_points_in_loop); - // Insert an explicit {OsrPoll} right after the loop header, to trigger - // on-stack replacement when armed for the given loop nesting depth. - if (FLAG_ignition_osr) { - // TODO(4764): Merge this with another bytecode (e.g. {Jump} back edge). - int level = Min(loop_depth_, AbstractCode::kMaxLoopNestingMarker - 1); - builder()->OsrPoll(level); - } - if (stmt->yield_count() > 0) { // If we are not resuming, fall through to loop body. // If we are resuming, perform state dispatch. @@ -882,7 +763,7 @@ void BytecodeGenerator::VisitGeneratorPrologue() { void BytecodeGenerator::VisitBlock(Block* stmt) { // Visit declarations and statements. if (stmt->scope() != nullptr && stmt->scope()->NeedsContext()) { - VisitNewLocalBlockContext(stmt->scope()); + BuildNewLocalBlockContext(stmt->scope()); ContextScope scope(this, stmt->scope()); VisitBlockDeclarationsAndStatements(stmt); } else { @@ -903,7 +784,6 @@ void BytecodeGenerator::VisitBlockDeclarationsAndStatements(Block* stmt) { void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) { Variable* variable = decl->proxy()->var(); switch (variable->location()) { - case VariableLocation::GLOBAL: case VariableLocation::UNALLOCATED: { DCHECK(!variable->binding_needs_init()); FeedbackVectorSlot slot = decl->proxy()->VariableFeedbackSlot(); @@ -926,8 +806,9 @@ void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) { break; case VariableLocation::CONTEXT: if (variable->binding_needs_init()) { + DCHECK_EQ(0, execution_context()->ContextChainDepth(variable->scope())); builder()->LoadTheHole().StoreContextSlot(execution_context()->reg(), - variable->index()); + variable->index(), 0); } break; case VariableLocation::LOOKUP: { @@ -939,18 +820,24 @@ void BytecodeGenerator::VisitVariableDeclaration(VariableDeclaration* decl) { builder() ->LoadLiteral(variable->name()) .StoreAccumulatorInRegister(name) - .CallRuntime(Runtime::kDeclareEvalVar, name, 1); + .CallRuntime(Runtime::kDeclareEvalVar, name); break; } case VariableLocation::MODULE: - UNREACHABLE(); + if (variable->IsExport() && variable->binding_needs_init()) { + builder()->LoadTheHole(); + VisitVariableAssignment(variable, Token::INIT, + FeedbackVectorSlot::Invalid()); + } + // Nothing to do for imports. + break; } } void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { Variable* variable = decl->proxy()->var(); + DCHECK(variable->mode() == LET || variable->mode() == VAR); switch (variable->location()) { - case VariableLocation::GLOBAL: case VariableLocation::UNALLOCATED: { FeedbackVectorSlot slot = decl->proxy()->VariableFeedbackSlot(); globals_builder()->AddFunctionDeclaration(slot, decl->fun()); @@ -959,8 +846,6 @@ void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { case VariableLocation::PARAMETER: case VariableLocation::LOCAL: { VisitForAccumulatorValue(decl->fun()); - DCHECK(variable->mode() == LET || variable->mode() == VAR || - variable->mode() == CONST); VisitVariableAssignment(variable, Token::INIT, FeedbackVectorSlot::Invalid()); break; @@ -968,23 +853,27 @@ void BytecodeGenerator::VisitFunctionDeclaration(FunctionDeclaration* decl) { case VariableLocation::CONTEXT: { DCHECK_EQ(0, execution_context()->ContextChainDepth(variable->scope())); VisitForAccumulatorValue(decl->fun()); - builder()->StoreContextSlot(execution_context()->reg(), - variable->index()); + builder()->StoreContextSlot(execution_context()->reg(), variable->index(), + 0); break; } case VariableLocation::LOOKUP: { - register_allocator()->PrepareForConsecutiveAllocations(2); - Register name = register_allocator()->NextConsecutiveRegister(); - Register literal = register_allocator()->NextConsecutiveRegister(); - builder()->LoadLiteral(variable->name()).StoreAccumulatorInRegister(name); - + RegisterList args = register_allocator()->NewRegisterList(2); + builder() + ->LoadLiteral(variable->name()) + .StoreAccumulatorInRegister(args[0]); VisitForAccumulatorValue(decl->fun()); - builder()->StoreAccumulatorInRegister(literal).CallRuntime( - Runtime::kDeclareEvalFunction, name, 2); + builder()->StoreAccumulatorInRegister(args[1]).CallRuntime( + Runtime::kDeclareEvalFunction, args); break; } case VariableLocation::MODULE: - UNREACHABLE(); + DCHECK_EQ(variable->mode(), LET); + DCHECK(variable->IsExport()); + VisitForAccumulatorValue(decl->fun()); + VisitVariableAssignment(variable, Token::INIT, + FeedbackVectorSlot::Invalid()); + break; } } @@ -1002,20 +891,15 @@ void BytecodeGenerator::VisitDeclarations( builder()->AllocateConstantPoolEntry()); int encoded_flags = info()->GetDeclareGlobalsFlags(); - register_allocator()->PrepareForConsecutiveAllocations(3); - - Register pairs = register_allocator()->NextConsecutiveRegister(); - Register flags = register_allocator()->NextConsecutiveRegister(); - Register function = register_allocator()->NextConsecutiveRegister(); - // Emit code to declare globals. + RegisterList args = register_allocator()->NewRegisterList(3); builder() ->LoadConstantPoolEntry(globals_builder()->constant_pool_entry()) - .StoreAccumulatorInRegister(pairs) + .StoreAccumulatorInRegister(args[0]) .LoadLiteral(Smi::FromInt(encoded_flags)) - .StoreAccumulatorInRegister(flags) - .MoveRegister(Register::function_closure(), function) - .CallRuntime(Runtime::kDeclareGlobalsForInterpreter, pairs, 3); + .StoreAccumulatorInRegister(args[1]) + .MoveRegister(Register::function_closure(), args[2]) + .CallRuntime(Runtime::kDeclareGlobalsForInterpreter, args); // Push and reset globals builder. global_declarations_.push_back(globals_builder()); @@ -1097,7 +981,7 @@ void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) { builder()->SetStatementPosition(stmt); VisitForAccumulatorValue(stmt->expression()); - VisitNewLocalWithContext(); + BuildNewLocalWithContext(stmt->scope()); VisitInScope(stmt->statement(), stmt->scope()); } @@ -1126,7 +1010,9 @@ void BytecodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { // Perform label comparison as if via '===' with tag. VisitForAccumulatorValue(clause->label()); - builder()->CompareOperation(Token::Value::EQ_STRICT, tag); + builder()->CompareOperation( + Token::Value::EQ_STRICT, tag, + feedback_index(clause->CompareOperationFeedbackSlot())); switch_builder.Case(i); } @@ -1168,13 +1054,16 @@ void BytecodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) { } else if (stmt->cond()->ToBooleanIsTrue()) { VisitIterationHeader(stmt, &loop_builder); VisitIterationBody(stmt, &loop_builder); - loop_builder.JumpToHeader(); + loop_builder.JumpToHeader(loop_depth_); } else { VisitIterationHeader(stmt, &loop_builder); VisitIterationBody(stmt, &loop_builder); builder()->SetExpressionAsStatementPosition(stmt->cond()); - VisitForTest(stmt->cond(), loop_builder.header_labels(), - loop_builder.break_labels(), TestFallthrough::kElse); + BytecodeLabels loop_backbranch(zone()); + VisitForTest(stmt->cond(), &loop_backbranch, loop_builder.break_labels(), + TestFallthrough::kThen); + loop_backbranch.Bind(builder()); + loop_builder.JumpToHeader(loop_depth_); } loop_builder.EndLoop(); } @@ -1195,7 +1084,7 @@ void BytecodeGenerator::VisitWhileStatement(WhileStatement* stmt) { loop_body.Bind(builder()); } VisitIterationBody(stmt, &loop_builder); - loop_builder.JumpToHeader(); + loop_builder.JumpToHeader(loop_depth_); loop_builder.EndLoop(); } @@ -1223,7 +1112,7 @@ void BytecodeGenerator::VisitForStatement(ForStatement* stmt) { builder()->SetStatementPosition(stmt->next()); Visit(stmt->next()); } - loop_builder.JumpToHeader(); + loop_builder.JumpToHeader(loop_depth_); loop_builder.EndLoop(); } @@ -1265,36 +1154,28 @@ void BytecodeGenerator::VisitForInAssignment(Expression* expr, } case NAMED_SUPER_PROPERTY: { RegisterAllocationScope register_scope(this); - register_allocator()->PrepareForConsecutiveAllocations(4); - Register receiver = register_allocator()->NextConsecutiveRegister(); - Register home_object = register_allocator()->NextConsecutiveRegister(); - Register name = register_allocator()->NextConsecutiveRegister(); - Register value = register_allocator()->NextConsecutiveRegister(); - builder()->StoreAccumulatorInRegister(value); + RegisterList args = register_allocator()->NewRegisterList(4); + builder()->StoreAccumulatorInRegister(args[3]); SuperPropertyReference* super_property = property->obj()->AsSuperPropertyReference(); - VisitForRegisterValue(super_property->this_var(), receiver); - VisitForRegisterValue(super_property->home_object(), home_object); + VisitForRegisterValue(super_property->this_var(), args[0]); + VisitForRegisterValue(super_property->home_object(), args[1]); builder() ->LoadLiteral(property->key()->AsLiteral()->AsPropertyName()) - .StoreAccumulatorInRegister(name); - BuildNamedSuperPropertyStore(receiver, home_object, name, value); + .StoreAccumulatorInRegister(args[2]) + .CallRuntime(StoreToSuperRuntimeId(), args); break; } case KEYED_SUPER_PROPERTY: { RegisterAllocationScope register_scope(this); - register_allocator()->PrepareForConsecutiveAllocations(4); - Register receiver = register_allocator()->NextConsecutiveRegister(); - Register home_object = register_allocator()->NextConsecutiveRegister(); - Register key = register_allocator()->NextConsecutiveRegister(); - Register value = register_allocator()->NextConsecutiveRegister(); - builder()->StoreAccumulatorInRegister(value); + RegisterList args = register_allocator()->NewRegisterList(4); + builder()->StoreAccumulatorInRegister(args[3]); SuperPropertyReference* super_property = property->obj()->AsSuperPropertyReference(); - VisitForRegisterValue(super_property->this_var(), receiver); - VisitForRegisterValue(super_property->home_object(), home_object); - VisitForRegisterValue(property->key(), key); - BuildKeyedSuperPropertyStore(receiver, home_object, key, value); + VisitForRegisterValue(super_property->this_var(), args[0]); + VisitForRegisterValue(super_property->home_object(), args[1]); + VisitForRegisterValue(property->key(), args[2]); + builder()->CallRuntime(StoreKeyedToSuperRuntimeId(), args); break; } } @@ -1316,15 +1197,12 @@ void BytecodeGenerator::VisitForInStatement(ForInStatement* stmt) { builder()->JumpIfUndefined(&subject_undefined_label); builder()->JumpIfNull(&subject_null_label); Register receiver = register_allocator()->NewRegister(); - builder()->CastAccumulatorToJSObject(receiver); + builder()->ConvertAccumulatorToObject(receiver); - register_allocator()->PrepareForConsecutiveAllocations(3); - Register cache_type = register_allocator()->NextConsecutiveRegister(); - Register cache_array = register_allocator()->NextConsecutiveRegister(); - Register cache_length = register_allocator()->NextConsecutiveRegister(); // Used as kRegTriple and kRegPair in ForInPrepare and ForInNext. - USE(cache_array); - builder()->ForInPrepare(receiver, cache_type); + RegisterList triple = register_allocator()->NewRegisterList(3); + Register cache_length = triple[2]; + builder()->ForInPrepare(receiver, triple); // Set up loop counter Register index = register_allocator()->NewRegister(); @@ -1334,17 +1212,17 @@ void BytecodeGenerator::VisitForInStatement(ForInStatement* stmt) { // The loop VisitIterationHeader(stmt, &loop_builder); builder()->SetExpressionAsStatementPosition(stmt->each()); - builder()->ForInDone(index, cache_length); - loop_builder.BreakIfTrue(); - DCHECK(Register::AreContiguous(cache_type, cache_array)); + builder()->ForInContinue(index, cache_length); + loop_builder.BreakIfFalse(); FeedbackVectorSlot slot = stmt->ForInFeedbackSlot(); - builder()->ForInNext(receiver, index, cache_type, feedback_index(slot)); + builder()->ForInNext(receiver, index, triple.Truncate(2), + feedback_index(slot)); loop_builder.ContinueIfUndefined(); VisitForInAssignment(stmt->each(), stmt->EachFeedbackSlot()); VisitIterationBody(stmt, &loop_builder); builder()->ForInStep(index); builder()->StoreAccumulatorInRegister(index); - loop_builder.JumpToHeader(); + loop_builder.JumpToHeader(loop_depth_); loop_builder.EndLoop(); builder()->Bind(&subject_null_label); builder()->Bind(&subject_undefined_label); @@ -1364,13 +1242,12 @@ void BytecodeGenerator::VisitForOfStatement(ForOfStatement* stmt) { VisitForEffect(stmt->assign_each()); VisitIterationBody(stmt, &loop_builder); - loop_builder.JumpToHeader(); + loop_builder.JumpToHeader(loop_depth_); loop_builder.EndLoop(); } void BytecodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) { TryCatchBuilder try_control_builder(builder(), stmt->catch_prediction()); - Register no_reg; // Preserve the context in a dedicated register, so that it can be restored // when the handler is entered by the stack-unwinding machinery. @@ -1388,12 +1265,12 @@ void BytecodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) { try_control_builder.EndTry(); // Create a catch scope that binds the exception. - VisitNewLocalCatchContext(stmt->variable()); + BuildNewLocalCatchContext(stmt->variable(), stmt->scope()); builder()->StoreAccumulatorInRegister(context); // If requested, clear message object as we enter the catch block. if (stmt->clear_pending_message()) { - builder()->CallRuntime(Runtime::kInterpreterClearPendingMessage, no_reg, 0); + builder()->CallRuntime(Runtime::kInterpreterClearPendingMessage); } // Load the catch context into the accumulator. @@ -1406,7 +1283,6 @@ void BytecodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) { void BytecodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { TryFinallyBuilder try_control_builder(builder(), stmt->catch_prediction()); - Register no_reg; // We keep a record of all paths that enter the finally-block to be able to // dispatch to the correct continuation point after the statements in the @@ -1454,7 +1330,7 @@ void BytecodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { // Clear message object as we enter the finally block. builder() - ->CallRuntime(Runtime::kInterpreterClearPendingMessage, no_reg, 0) + ->CallRuntime(Runtime::kInterpreterClearPendingMessage) .StoreAccumulatorInRegister(message); // Evaluate the finally-block. @@ -1462,7 +1338,7 @@ void BytecodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { try_control_builder.EndFinally(); // Pending message object is restored on exit. - builder()->CallRuntime(Runtime::kInterpreterSetPendingMessage, message, 1); + builder()->CallRuntime(Runtime::kInterpreterSetPendingMessage, message); // Dynamic dispatch after the finally-block. commands.ApplyDeferredCommands(); @@ -1479,16 +1355,15 @@ void BytecodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) { size_t entry = builder()->AllocateConstantPoolEntry(); builder()->CreateClosure(entry, flags); function_literals_.push_back(std::make_pair(expr, entry)); - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitClassLiteral(ClassLiteral* expr) { VisitClassLiteralForRuntimeDefinition(expr); // Load the "prototype" from the constructor. - register_allocator()->PrepareForConsecutiveAllocations(2); - Register literal = register_allocator()->NextConsecutiveRegister(); - Register prototype = register_allocator()->NextConsecutiveRegister(); + RegisterList args = register_allocator()->NewRegisterList(2); + Register literal = args[0]; + Register prototype = args[1]; FeedbackVectorSlot slot = expr->PrototypeSlot(); builder() ->StoreAccumulatorInRegister(literal) @@ -1496,7 +1371,7 @@ void BytecodeGenerator::VisitClassLiteral(ClassLiteral* expr) { .StoreAccumulatorInRegister(prototype); VisitClassLiteralProperties(expr, literal, prototype); - builder()->CallRuntime(Runtime::kToFastProperties, literal, 1); + builder()->CallRuntime(Runtime::kToFastProperties, literal); // Assign to class variable. if (expr->class_variable_proxy() != nullptr) { Variable* var = expr->class_variable_proxy()->var(); @@ -1505,49 +1380,37 @@ void BytecodeGenerator::VisitClassLiteral(ClassLiteral* expr) { : FeedbackVectorSlot::Invalid(); VisitVariableAssignment(var, Token::INIT, slot); } - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitClassLiteralForRuntimeDefinition( ClassLiteral* expr) { - AccumulatorResultScope result_scope(this); - register_allocator()->PrepareForConsecutiveAllocations(4); - Register extends = register_allocator()->NextConsecutiveRegister(); - Register constructor = register_allocator()->NextConsecutiveRegister(); - Register start_position = register_allocator()->NextConsecutiveRegister(); - Register end_position = register_allocator()->NextConsecutiveRegister(); - + RegisterAllocationScope register_scope(this); + RegisterList args = register_allocator()->NewRegisterList(4); VisitForAccumulatorValueOrTheHole(expr->extends()); - builder()->StoreAccumulatorInRegister(extends); - - VisitForAccumulatorValue(expr->constructor()); + builder()->StoreAccumulatorInRegister(args[0]); + VisitForRegisterValue(expr->constructor(), args[1]); builder() - ->StoreAccumulatorInRegister(constructor) - .LoadLiteral(Smi::FromInt(expr->start_position())) - .StoreAccumulatorInRegister(start_position) + ->LoadLiteral(Smi::FromInt(expr->start_position())) + .StoreAccumulatorInRegister(args[2]) .LoadLiteral(Smi::FromInt(expr->end_position())) - .StoreAccumulatorInRegister(end_position) - .CallRuntime(Runtime::kDefineClass, extends, 4); - result_scope.SetResultInAccumulator(); + .StoreAccumulatorInRegister(args[3]) + .CallRuntime(Runtime::kDefineClass, args); } void BytecodeGenerator::VisitClassLiteralProperties(ClassLiteral* expr, Register literal, Register prototype) { RegisterAllocationScope register_scope(this); - register_allocator()->PrepareForConsecutiveAllocations(5); - Register receiver = register_allocator()->NextConsecutiveRegister(); - Register key = register_allocator()->NextConsecutiveRegister(); - Register value = register_allocator()->NextConsecutiveRegister(); - Register attr = register_allocator()->NextConsecutiveRegister(); - Register set_function_name = register_allocator()->NextConsecutiveRegister(); + RegisterList args = register_allocator()->NewRegisterList(5); + Register receiver = args[0], key = args[1], value = args[2], attr = args[3], + set_function_name = args[4]; bool attr_assigned = false; Register old_receiver = Register::invalid_value(); // Create nodes to store method values into the literal. for (int i = 0; i < expr->properties()->length(); i++) { - ObjectLiteral::Property* property = expr->properties()->at(i); + ClassLiteral::Property* property = expr->properties()->at(i); // Set-up receiver. Register new_receiver = property->is_static() ? literal : prototype; @@ -1557,17 +1420,23 @@ void BytecodeGenerator::VisitClassLiteralProperties(ClassLiteral* expr, } VisitForAccumulatorValue(property->key()); - builder()->CastAccumulatorToName(key); - // The static prototype property is read only. We handle the non computed - // property name case in the parser. Since this is the only case where we - // need to check for an own read only property we special case this so we do - // not need to do this for every property. + builder()->ConvertAccumulatorToName(key); + if (property->is_static() && property->is_computed_name()) { - VisitClassLiteralStaticPrototypeWithComputedName(key); + // The static prototype property is read only. We handle the non computed + // property name case in the parser. Since this is the only case where we + // need to check for an own read only property we special case this so we + // do not need to do this for every property. + BytecodeLabel done; + builder() + ->LoadLiteral(prototype_string()) + .CompareOperation(Token::Value::EQ_STRICT, key) + .JumpIfFalse(&done) + .CallRuntime(Runtime::kThrowStaticPrototypeError) + .Bind(&done); } - VisitForAccumulatorValue(property->value()); - builder()->StoreAccumulatorInRegister(value); + VisitForRegisterValue(property->value(), value); VisitSetHomeObject(value, receiver, property); if (!attr_assigned) { @@ -1578,51 +1447,36 @@ void BytecodeGenerator::VisitClassLiteralProperties(ClassLiteral* expr, } switch (property->kind()) { - case ObjectLiteral::Property::CONSTANT: - case ObjectLiteral::Property::MATERIALIZED_LITERAL: - case ObjectLiteral::Property::PROTOTYPE: - // Invalid properties for ES6 classes. - UNREACHABLE(); - break; - case ObjectLiteral::Property::COMPUTED: { + case ClassLiteral::Property::METHOD: { builder() ->LoadLiteral(Smi::FromInt(property->NeedsSetFunctionName())) - .StoreAccumulatorInRegister(set_function_name); - builder()->CallRuntime(Runtime::kDefineDataPropertyInLiteral, receiver, - 5); + .StoreAccumulatorInRegister(set_function_name) + .CallRuntime(Runtime::kDefineDataPropertyInLiteral, args); break; } - case ObjectLiteral::Property::GETTER: { + case ClassLiteral::Property::GETTER: { builder()->CallRuntime(Runtime::kDefineGetterPropertyUnchecked, - receiver, 4); + args.Truncate(4)); break; } - case ObjectLiteral::Property::SETTER: { + case ClassLiteral::Property::SETTER: { builder()->CallRuntime(Runtime::kDefineSetterPropertyUnchecked, - receiver, 4); + args.Truncate(4)); + break; + } + case ClassLiteral::Property::FIELD: { + UNREACHABLE(); break; } } } } -void BytecodeGenerator::VisitClassLiteralStaticPrototypeWithComputedName( - Register key) { - BytecodeLabel done; - builder() - ->LoadLiteral(prototype_string()) - .CompareOperation(Token::Value::EQ_STRICT, key) - .JumpIfFalse(&done) - .CallRuntime(Runtime::kThrowStaticPrototypeError, Register(0), 0) - .Bind(&done); -} - void BytecodeGenerator::VisitNativeFunctionLiteral( NativeFunctionLiteral* expr) { size_t entry = builder()->AllocateConstantPoolEntry(); builder()->CreateClosure(entry, NOT_TENURED); native_function_literals_.push_back(std::make_pair(expr, entry)); - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitDoExpression(DoExpression* expr) { @@ -1652,8 +1506,6 @@ void BytecodeGenerator::VisitConditional(Conditional* expr) { VisitForAccumulatorValue(expr->else_expression()); builder()->Bind(&end_label); } - - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitLiteral(Literal* expr) { @@ -1674,7 +1526,6 @@ void BytecodeGenerator::VisitLiteral(Literal* expr) { } else { builder()->LoadLiteral(raw_value->value()); } - execution_result()->SetResultInAccumulator(); } } @@ -1682,7 +1533,6 @@ void BytecodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) { // Materialize a regular expression literal. builder()->CreateRegExpLiteral(expr->pattern(), expr->literal_index(), expr->flags()); - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { @@ -1693,7 +1543,7 @@ void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { expr->ComputeFlags()); // Allocate in the outer scope since this register is used to return the // expression's results to the caller. - Register literal = register_allocator()->outer()->NewRegister(); + Register literal = register_allocator()->NewRegister(); builder()->CreateObjectLiteral(expr->constant_properties(), expr->literal_index(), flags, literal); @@ -1737,23 +1587,17 @@ void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { VisitForEffect(property->value()); } } else { - register_allocator()->PrepareForConsecutiveAllocations(4); - Register literal_argument = - register_allocator()->NextConsecutiveRegister(); - Register key = register_allocator()->NextConsecutiveRegister(); - Register value = register_allocator()->NextConsecutiveRegister(); - Register language = register_allocator()->NextConsecutiveRegister(); - - builder()->MoveRegister(literal, literal_argument); - VisitForAccumulatorValue(property->key()); - builder()->StoreAccumulatorInRegister(key); - VisitForAccumulatorValue(property->value()); - builder()->StoreAccumulatorInRegister(value); + RegisterList args = register_allocator()->NewRegisterList(4); + + builder()->MoveRegister(literal, args[0]); + VisitForRegisterValue(property->key(), args[1]); + VisitForRegisterValue(property->value(), args[2]); if (property->emit_store()) { builder() ->LoadLiteral(Smi::FromInt(SLOPPY)) - .StoreAccumulatorInRegister(language) - .CallRuntime(Runtime::kSetProperty, literal_argument, 4); + .StoreAccumulatorInRegister(args[3]) + .CallRuntime(Runtime::kSetProperty, args); + Register value = args[2]; VisitSetHomeObject(value, literal, property); } } @@ -1761,15 +1605,10 @@ void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { } case ObjectLiteral::Property::PROTOTYPE: { DCHECK(property->emit_store()); - register_allocator()->PrepareForConsecutiveAllocations(2); - Register literal_argument = - register_allocator()->NextConsecutiveRegister(); - Register value = register_allocator()->NextConsecutiveRegister(); - - builder()->MoveRegister(literal, literal_argument); - VisitForAccumulatorValue(property->value()); - builder()->StoreAccumulatorInRegister(value).CallRuntime( - Runtime::kInternalSetPrototype, literal_argument, 2); + RegisterList args = register_allocator()->NewRegisterList(2); + builder()->MoveRegister(literal, args[0]); + VisitForRegisterValue(property->value(), args[1]); + builder()->CallRuntime(Runtime::kInternalSetPrototype, args); break; } case ObjectLiteral::Property::GETTER: @@ -1790,23 +1629,15 @@ void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { for (AccessorTable::Iterator it = accessor_table.begin(); it != accessor_table.end(); ++it) { RegisterAllocationScope inner_register_scope(this); - register_allocator()->PrepareForConsecutiveAllocations(5); - Register literal_argument = register_allocator()->NextConsecutiveRegister(); - Register name = register_allocator()->NextConsecutiveRegister(); - Register getter = register_allocator()->NextConsecutiveRegister(); - Register setter = register_allocator()->NextConsecutiveRegister(); - Register attr = register_allocator()->NextConsecutiveRegister(); - - builder()->MoveRegister(literal, literal_argument); - VisitForAccumulatorValue(it->first); - builder()->StoreAccumulatorInRegister(name); - VisitObjectLiteralAccessor(literal, it->second->getter, getter); - VisitObjectLiteralAccessor(literal, it->second->setter, setter); + RegisterList args = register_allocator()->NewRegisterList(5); + builder()->MoveRegister(literal, args[0]); + VisitForRegisterValue(it->first, args[1]); + VisitObjectLiteralAccessor(literal, it->second->getter, args[2]); + VisitObjectLiteralAccessor(literal, it->second->setter, args[3]); builder() ->LoadLiteral(Smi::FromInt(NONE)) - .StoreAccumulatorInRegister(attr) - .CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, - literal_argument, 5); + .StoreAccumulatorInRegister(args[4]) + .CallRuntime(Runtime::kDefineAccessorPropertyUnchecked, args); } // Object literals have two parts. The "static" part on the left contains no @@ -1824,66 +1655,68 @@ void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) { if (property->kind() == ObjectLiteral::Property::PROTOTYPE) { DCHECK(property->emit_store()); - register_allocator()->PrepareForConsecutiveAllocations(2); - Register literal_argument = - register_allocator()->NextConsecutiveRegister(); - Register value = register_allocator()->NextConsecutiveRegister(); - - builder()->MoveRegister(literal, literal_argument); - VisitForAccumulatorValue(property->value()); - builder()->StoreAccumulatorInRegister(value).CallRuntime( - Runtime::kInternalSetPrototype, literal_argument, 2); + RegisterList args = register_allocator()->NewRegisterList(2); + builder()->MoveRegister(literal, args[0]); + VisitForRegisterValue(property->value(), args[1]); + builder()->CallRuntime(Runtime::kInternalSetPrototype, args); continue; } - register_allocator()->PrepareForConsecutiveAllocations(5); - Register literal_argument = register_allocator()->NextConsecutiveRegister(); - Register key = register_allocator()->NextConsecutiveRegister(); - Register value = register_allocator()->NextConsecutiveRegister(); - Register attr = register_allocator()->NextConsecutiveRegister(); - DCHECK(Register::AreContiguous(literal_argument, key, value, attr)); - Register set_function_name = - register_allocator()->NextConsecutiveRegister(); - - builder()->MoveRegister(literal, literal_argument); - VisitForAccumulatorValue(property->key()); - builder()->CastAccumulatorToName(key); - VisitForAccumulatorValue(property->value()); - builder()->StoreAccumulatorInRegister(value); - VisitSetHomeObject(value, literal, property); - builder()->LoadLiteral(Smi::FromInt(NONE)).StoreAccumulatorInRegister(attr); switch (property->kind()) { case ObjectLiteral::Property::CONSTANT: case ObjectLiteral::Property::COMPUTED: - case ObjectLiteral::Property::MATERIALIZED_LITERAL: + case ObjectLiteral::Property::MATERIALIZED_LITERAL: { + RegisterList args = register_allocator()->NewRegisterList(5); + builder()->MoveRegister(literal, args[0]); + VisitForAccumulatorValue(property->key()); + builder()->ConvertAccumulatorToName(args[1]); + VisitForRegisterValue(property->value(), args[2]); + VisitSetHomeObject(args[2], literal, property); builder() - ->LoadLiteral(Smi::FromInt(property->NeedsSetFunctionName())) - .StoreAccumulatorInRegister(set_function_name); - builder()->CallRuntime(Runtime::kDefineDataPropertyInLiteral, - literal_argument, 5); - break; - case ObjectLiteral::Property::PROTOTYPE: - UNREACHABLE(); // Handled specially above. + ->LoadLiteral(Smi::FromInt(NONE)) + .StoreAccumulatorInRegister(args[3]) + .LoadLiteral(Smi::FromInt(property->NeedsSetFunctionName())) + .StoreAccumulatorInRegister(args[4]); + builder()->CallRuntime(Runtime::kDefineDataPropertyInLiteral, args); break; + } case ObjectLiteral::Property::GETTER: - builder()->CallRuntime(Runtime::kDefineGetterPropertyUnchecked, - literal_argument, 4); + case ObjectLiteral::Property::SETTER: { + RegisterList args = register_allocator()->NewRegisterList(4); + builder()->MoveRegister(literal, args[0]); + VisitForAccumulatorValue(property->key()); + builder()->ConvertAccumulatorToName(args[1]); + VisitForRegisterValue(property->value(), args[2]); + VisitSetHomeObject(args[2], literal, property); + builder() + ->LoadLiteral(Smi::FromInt(NONE)) + .StoreAccumulatorInRegister(args[3]); + Runtime::FunctionId function_id = + property->kind() == ObjectLiteral::Property::GETTER + ? Runtime::kDefineGetterPropertyUnchecked + : Runtime::kDefineSetterPropertyUnchecked; + builder()->CallRuntime(function_id, args); break; - case ObjectLiteral::Property::SETTER: - builder()->CallRuntime(Runtime::kDefineSetterPropertyUnchecked, - literal_argument, 4); + } + case ObjectLiteral::Property::PROTOTYPE: + UNREACHABLE(); // Handled specially above. break; } } - execution_result()->SetResultInRegister(literal); + builder()->LoadAccumulatorWithRegister(literal); } void BytecodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { // Deep-copy the literal boilerplate. + int runtime_flags = expr->ComputeFlags(); + bool use_fast_shallow_clone = + (runtime_flags & ArrayLiteral::kShallowElements) != 0 && + expr->values()->length() <= JSArray::kInitialMaxFastElementArray; + uint8_t flags = + CreateArrayLiteralFlags::Encode(use_fast_shallow_clone, runtime_flags); builder()->CreateArrayLiteral(expr->constant_elements(), - expr->literal_index(), - expr->ComputeFlags(true)); + expr->literal_index(), flags); Register index, literal; // Evaluate all the non-constant subexpressions and store them into the @@ -1915,7 +1748,6 @@ void BytecodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) { // Restore literal array into accumulator. builder()->LoadAccumulatorWithRegister(literal); } - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitVariableProxy(VariableProxy* proxy) { @@ -1953,7 +1785,6 @@ void BytecodeGenerator::VisitVariableLoad(Variable* variable, BuildHoleCheckForVariableLoad(variable); break; } - case VariableLocation::GLOBAL: case VariableLocation::UNALLOCATED: { builder()->LoadGlobal(feedback_index(slot), typeof_mode); break; @@ -1964,85 +1795,82 @@ void BytecodeGenerator::VisitVariableLoad(Variable* variable, Register context_reg; if (context) { context_reg = context->reg(); + depth = 0; } else { - context_reg = register_allocator()->NewRegister(); - // Walk the context chain to find the context at the given depth. - // TODO(rmcilroy): Perform this work in a bytecode handler once we have - // a generic mechanism for performing jumps in interpreter.cc. - // TODO(mythria): Also update bytecode graph builder with correct depth - // when this changes. - builder() - ->LoadAccumulatorWithRegister(execution_context()->reg()) - .StoreAccumulatorInRegister(context_reg); - for (int i = 0; i < depth; ++i) { - builder() - ->LoadContextSlot(context_reg, Context::PREVIOUS_INDEX) - .StoreAccumulatorInRegister(context_reg); - } + context_reg = execution_context()->reg(); } - builder()->LoadContextSlot(context_reg, variable->index()); + builder()->LoadContextSlot(context_reg, variable->index(), depth); BuildHoleCheckForVariableLoad(variable); break; } case VariableLocation::LOOKUP: { - builder()->LoadLookupSlot(variable->name(), typeof_mode); + switch (variable->mode()) { + case DYNAMIC_LOCAL: { + Variable* local_variable = variable->local_if_not_shadowed(); + int depth = + execution_context()->ContextChainDepth(local_variable->scope()); + builder()->LoadLookupContextSlot(variable->name(), typeof_mode, + local_variable->index(), depth); + BuildHoleCheckForVariableLoad(variable); + break; + } + case DYNAMIC_GLOBAL: { + int depth = scope()->ContextChainLengthUntilOutermostSloppyEval(); + builder()->LoadLookupGlobalSlot(variable->name(), typeof_mode, + feedback_index(slot), depth); + break; + } + default: + builder()->LoadLookupSlot(variable->name(), typeof_mode); + } + break; + } + case VariableLocation::MODULE: { + ModuleDescriptor* descriptor = scope()->GetModuleScope()->module(); + if (variable->IsExport()) { + auto it = descriptor->regular_exports().find(variable->raw_name()); + DCHECK(it != descriptor->regular_exports().end()); + Register export_name = register_allocator()->NewRegister(); + builder() + ->LoadLiteral(it->second->export_name->string()) + .StoreAccumulatorInRegister(export_name) + .CallRuntime(Runtime::kLoadModuleExport, export_name); + } else { + auto it = descriptor->regular_imports().find(variable->raw_name()); + DCHECK(it != descriptor->regular_imports().end()); + RegisterList args = register_allocator()->NewRegisterList(2); + builder() + ->LoadLiteral(it->second->import_name->string()) + .StoreAccumulatorInRegister(args[0]) + .LoadLiteral(Smi::FromInt(it->second->module_request)) + .StoreAccumulatorInRegister(args[1]) + .CallRuntime(Runtime::kLoadModuleImport, args); + } + BuildHoleCheckForVariableLoad(variable); break; } - case VariableLocation::MODULE: - UNREACHABLE(); } - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitVariableLoadForAccumulatorValue( Variable* variable, FeedbackVectorSlot slot, TypeofMode typeof_mode) { - AccumulatorResultScope accumulator_result(this); + ValueResultScope accumulator_result(this); VisitVariableLoad(variable, slot, typeof_mode); } -Register BytecodeGenerator::VisitVariableLoadForRegisterValue( - Variable* variable, FeedbackVectorSlot slot, TypeofMode typeof_mode) { - RegisterResultScope register_scope(this); - VisitVariableLoad(variable, slot, typeof_mode); - return register_scope.ResultRegister(); -} - -void BytecodeGenerator::BuildNamedSuperPropertyLoad(Register receiver, - Register home_object, - Register name) { - DCHECK(Register::AreContiguous(receiver, home_object, name)); - builder()->CallRuntime(Runtime::kLoadFromSuper, receiver, 3); -} - -void BytecodeGenerator::BuildKeyedSuperPropertyLoad(Register receiver, - Register home_object, - Register key) { - DCHECK(Register::AreContiguous(receiver, home_object, key)); - builder()->CallRuntime(Runtime::kLoadKeyedFromSuper, receiver, 3); -} - -void BytecodeGenerator::BuildNamedSuperPropertyStore(Register receiver, - Register home_object, - Register name, - Register value) { - DCHECK(Register::AreContiguous(receiver, home_object, name, value)); - Runtime::FunctionId function_id = is_strict(language_mode()) - ? Runtime::kStoreToSuper_Strict - : Runtime::kStoreToSuper_Sloppy; - builder()->CallRuntime(function_id, receiver, 4); +void BytecodeGenerator::BuildReturn() { + if (FLAG_trace) { + RegisterAllocationScope register_scope(this); + Register result = register_allocator()->NewRegister(); + // Runtime returns {result} value, preserving accumulator. + builder()->StoreAccumulatorInRegister(result).CallRuntime( + Runtime::kTraceExit, result); + } + builder()->Return(); } -void BytecodeGenerator::BuildKeyedSuperPropertyStore(Register receiver, - Register home_object, - Register key, - Register value) { - DCHECK(Register::AreContiguous(receiver, home_object, key, value)); - Runtime::FunctionId function_id = is_strict(language_mode()) - ? Runtime::kStoreKeyedToSuper_Strict - : Runtime::kStoreKeyedToSuper_Sloppy; - builder()->CallRuntime(function_id, receiver, 4); -} +void BytecodeGenerator::BuildReThrow() { builder()->ReThrow(); } void BytecodeGenerator::BuildAbort(BailoutReason bailout_reason) { RegisterAllocationScope register_scope(this); @@ -2050,14 +1878,14 @@ void BytecodeGenerator::BuildAbort(BailoutReason bailout_reason) { builder() ->LoadLiteral(Smi::FromInt(static_cast(bailout_reason))) .StoreAccumulatorInRegister(reason) - .CallRuntime(Runtime::kAbort, reason, 1); + .CallRuntime(Runtime::kAbort, reason); } void BytecodeGenerator::BuildThrowReferenceError(Handle name) { RegisterAllocationScope register_scope(this); Register name_reg = register_allocator()->NewRegister(); builder()->LoadLiteral(name).StoreAccumulatorInRegister(name_reg).CallRuntime( - Runtime::kThrowReferenceError, name_reg, 1); + Runtime::kThrowReferenceError, name_reg); } void BytecodeGenerator::BuildThrowIfHole(Handle name) { @@ -2083,7 +1911,6 @@ void BytecodeGenerator::BuildThrowIfNotHole(Handle name) { void BytecodeGenerator::BuildHoleCheckForVariableAssignment(Variable* variable, Token::Value op) { - DCHECK(variable->mode() != CONST_LEGACY); if (op != Token::INIT) { // Perform an initialization check for let/const declared variables. // E.g. let x = (x = 20); is not allowed. @@ -2128,20 +1955,13 @@ void BytecodeGenerator::VisitVariableAssignment(Variable* variable, builder()->LoadAccumulatorWithRegister(value_temp); } - if ((mode == CONST || mode == CONST_LEGACY) && op != Token::INIT) { - if (mode == CONST || is_strict(language_mode())) { - builder()->CallRuntime(Runtime::kThrowConstAssignError, Register(), - 0); - } - // Non-initializing assignments to legacy constants are ignored - // in sloppy mode. Break here to avoid storing into variable. - break; + if (mode != CONST || op == Token::INIT) { + builder()->StoreAccumulatorInRegister(destination); + } else if (variable->throw_on_const_assignment(language_mode())) { + builder()->CallRuntime(Runtime::kThrowConstAssignError); } - - builder()->StoreAccumulatorInRegister(destination); break; } - case VariableLocation::GLOBAL: case VariableLocation::UNALLOCATED: { builder()->StoreGlobal(variable->name(), feedback_index(slot), language_mode()); @@ -2154,24 +1974,9 @@ void BytecodeGenerator::VisitVariableAssignment(Variable* variable, if (context) { context_reg = context->reg(); + depth = 0; } else { - Register value_temp = register_allocator()->NewRegister(); - context_reg = register_allocator()->NewRegister(); - // Walk the context chain to find the context at the given depth. - // TODO(rmcilroy): Perform this work in a bytecode handler once we have - // a generic mechanism for performing jumps in interpreter.cc. - // TODO(mythria): Also update bytecode graph builder with correct depth - // when this changes. - builder() - ->StoreAccumulatorInRegister(value_temp) - .LoadAccumulatorWithRegister(execution_context()->reg()) - .StoreAccumulatorInRegister(context_reg); - for (int i = 0; i < depth; ++i) { - builder() - ->LoadContextSlot(context_reg, Context::PREVIOUS_INDEX) - .StoreAccumulatorInRegister(context_reg); - } - builder()->LoadAccumulatorWithRegister(value_temp); + context_reg = execution_context()->reg(); } if (hole_check_required) { @@ -2179,38 +1984,57 @@ void BytecodeGenerator::VisitVariableAssignment(Variable* variable, Register value_temp = register_allocator()->NewRegister(); builder() ->StoreAccumulatorInRegister(value_temp) - .LoadContextSlot(context_reg, variable->index()); + .LoadContextSlot(context_reg, variable->index(), depth); BuildHoleCheckForVariableAssignment(variable, op); builder()->LoadAccumulatorWithRegister(value_temp); } - if ((mode == CONST || mode == CONST_LEGACY) && op != Token::INIT) { - if (mode == CONST || is_strict(language_mode())) { - builder()->CallRuntime(Runtime::kThrowConstAssignError, Register(), - 0); - } - // Non-initializing assignments to legacy constants are ignored - // in sloppy mode. Break here to avoid storing into variable. - break; + if (mode != CONST || op == Token::INIT) { + builder()->StoreContextSlot(context_reg, variable->index(), depth); + } else if (variable->throw_on_const_assignment(language_mode())) { + builder()->CallRuntime(Runtime::kThrowConstAssignError); } - - builder()->StoreContextSlot(context_reg, variable->index()); break; } case VariableLocation::LOOKUP: { - DCHECK_NE(CONST_LEGACY, variable->mode()); builder()->StoreLookupSlot(variable->name(), language_mode()); break; } - case VariableLocation::MODULE: - UNREACHABLE(); + case VariableLocation::MODULE: { + DCHECK(IsDeclaredVariableMode(mode)); + + if (mode == CONST && op != Token::INIT) { + builder()->CallRuntime(Runtime::kThrowConstAssignError); + break; + } + + // If we don't throw above, we know that we're dealing with an + // export because imports are const and we do not generate initializing + // assignments for them. + DCHECK(variable->IsExport()); + + ModuleDescriptor* mod = scope()->GetModuleScope()->module(); + // There may be several export names for this local name, but it doesn't + // matter which one we pick, as they all map to the same cell. + auto it = mod->regular_exports().find(variable->raw_name()); + DCHECK(it != mod->regular_exports().end()); + + RegisterList args = register_allocator()->NewRegisterList(2); + builder() + ->StoreAccumulatorInRegister(args[1]) + .LoadLiteral(it->second->export_name->string()) + .StoreAccumulatorInRegister(args[0]) + .CallRuntime(Runtime::kStoreModuleExport, args); + break; + } } } void BytecodeGenerator::VisitAssignment(Assignment* expr) { DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); - Register object, key, home_object, value; + Register object, key; + RegisterList super_property_args; Handle name; // Left-hand side can only be a property, a global or a variable slot. @@ -2229,44 +2053,29 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { } case KEYED_PROPERTY: { object = VisitForRegisterValue(property->obj()); - if (expr->is_compound()) { - // Use VisitForAccumulator and store to register so that the key is - // still in the accumulator for loading the old value below. - key = register_allocator()->NewRegister(); - VisitForAccumulatorValue(property->key()); - builder()->StoreAccumulatorInRegister(key); - } else { - key = VisitForRegisterValue(property->key()); - } + key = VisitForRegisterValue(property->key()); break; } case NAMED_SUPER_PROPERTY: { - register_allocator()->PrepareForConsecutiveAllocations(4); - object = register_allocator()->NextConsecutiveRegister(); - home_object = register_allocator()->NextConsecutiveRegister(); - key = register_allocator()->NextConsecutiveRegister(); - value = register_allocator()->NextConsecutiveRegister(); + super_property_args = register_allocator()->NewRegisterList(4); SuperPropertyReference* super_property = property->obj()->AsSuperPropertyReference(); - VisitForRegisterValue(super_property->this_var(), object); - VisitForRegisterValue(super_property->home_object(), home_object); + VisitForRegisterValue(super_property->this_var(), super_property_args[0]); + VisitForRegisterValue(super_property->home_object(), + super_property_args[1]); builder() ->LoadLiteral(property->key()->AsLiteral()->AsPropertyName()) - .StoreAccumulatorInRegister(key); + .StoreAccumulatorInRegister(super_property_args[2]); break; } case KEYED_SUPER_PROPERTY: { - register_allocator()->PrepareForConsecutiveAllocations(4); - object = register_allocator()->NextConsecutiveRegister(); - home_object = register_allocator()->NextConsecutiveRegister(); - key = register_allocator()->NextConsecutiveRegister(); - value = register_allocator()->NextConsecutiveRegister(); - builder()->StoreAccumulatorInRegister(value); + super_property_args = register_allocator()->NewRegisterList(4); SuperPropertyReference* super_property = property->obj()->AsSuperPropertyReference(); - VisitForRegisterValue(super_property->this_var(), object); - VisitForRegisterValue(super_property->home_object(), home_object); - VisitForRegisterValue(property->key(), key); + VisitForRegisterValue(super_property->this_var(), super_property_args[0]); + VisitForRegisterValue(super_property->home_object(), + super_property_args[1]); + VisitForRegisterValue(property->key(), super_property_args[2]); break; } } @@ -2274,17 +2083,16 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { // Evaluate the value and potentially handle compound assignments by loading // the left-hand side value and performing a binary operation. if (expr->is_compound()) { - Register old_value; + Register old_value = register_allocator()->NewRegister(); switch (assign_type) { case VARIABLE: { VariableProxy* proxy = expr->target()->AsVariableProxy(); - old_value = VisitVariableLoadForRegisterValue( - proxy->var(), proxy->VariableFeedbackSlot()); + VisitVariableLoad(proxy->var(), proxy->VariableFeedbackSlot()); + builder()->StoreAccumulatorInRegister(old_value); break; } case NAMED_PROPERTY: { FeedbackVectorSlot slot = property->PropertyFeedbackSlot(); - old_value = register_allocator()->NewRegister(); builder() ->LoadNamedProperty(object, name, feedback_index(slot)) .StoreAccumulatorInRegister(old_value); @@ -2294,22 +2102,23 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { // Key is already in accumulator at this point due to evaluating the // LHS above. FeedbackVectorSlot slot = property->PropertyFeedbackSlot(); - old_value = register_allocator()->NewRegister(); builder() ->LoadKeyedProperty(object, feedback_index(slot)) .StoreAccumulatorInRegister(old_value); break; } case NAMED_SUPER_PROPERTY: { - old_value = register_allocator()->NewRegister(); - BuildNamedSuperPropertyLoad(object, home_object, key); - builder()->StoreAccumulatorInRegister(old_value); + builder() + ->CallRuntime(Runtime::kLoadFromSuper, + super_property_args.Truncate(3)) + .StoreAccumulatorInRegister(old_value); break; } case KEYED_SUPER_PROPERTY: { - old_value = register_allocator()->NewRegister(); - BuildKeyedSuperPropertyLoad(object, home_object, key); - builder()->StoreAccumulatorInRegister(old_value); + builder() + ->CallRuntime(Runtime::kLoadKeyedFromSuper, + super_property_args.Truncate(3)) + .StoreAccumulatorInRegister(old_value); break; } } @@ -2342,17 +2151,18 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) { language_mode()); break; case NAMED_SUPER_PROPERTY: { - builder()->StoreAccumulatorInRegister(value); - BuildNamedSuperPropertyStore(object, home_object, key, value); + builder() + ->StoreAccumulatorInRegister(super_property_args[3]) + .CallRuntime(StoreToSuperRuntimeId(), super_property_args); break; } case KEYED_SUPER_PROPERTY: { - builder()->StoreAccumulatorInRegister(value); - BuildKeyedSuperPropertyStore(object, home_object, key, value); + builder() + ->StoreAccumulatorInRegister(super_property_args[3]) + .CallRuntime(StoreKeyedToSuperRuntimeId(), super_property_args); break; } } - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitYield(Yield* expr) { @@ -2382,12 +2192,12 @@ void BytecodeGenerator::VisitYield(Yield* expr) { Register input = register_allocator()->NewRegister(); builder() - ->CallRuntime(Runtime::kInlineGeneratorGetInputOrDebugPos, generator, 1) + ->CallRuntime(Runtime::kInlineGeneratorGetInputOrDebugPos, generator) .StoreAccumulatorInRegister(input); Register resume_mode = register_allocator()->NewRegister(); builder() - ->CallRuntime(Runtime::kInlineGeneratorGetResumeMode, generator, 1) + ->CallRuntime(Runtime::kInlineGeneratorGetResumeMode, generator) .StoreAccumulatorInRegister(resume_mode); // Now dispatch on resume mode. @@ -2407,14 +2217,12 @@ void BytecodeGenerator::VisitYield(Yield* expr) { builder()->Bind(&resume_with_return); { - register_allocator()->PrepareForConsecutiveAllocations(2); - Register value = register_allocator()->NextConsecutiveRegister(); - Register done = register_allocator()->NextConsecutiveRegister(); + RegisterList args = register_allocator()->NewRegisterList(2); builder() - ->MoveRegister(input, value) + ->MoveRegister(input, args[0]) .LoadTrue() - .StoreAccumulatorInRegister(done) - .CallRuntime(Runtime::kInlineCreateIterResultObject, value, 2); + .StoreAccumulatorInRegister(args[1]) + .CallRuntime(Runtime::kInlineCreateIterResultObject, args); execution_control()->ReturnAccumulator(); } @@ -2430,18 +2238,12 @@ void BytecodeGenerator::VisitYield(Yield* expr) { builder()->Bind(&resume_with_next); builder()->LoadAccumulatorWithRegister(input); } - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitThrow(Throw* expr) { VisitForAccumulatorValue(expr->exception()); builder()->SetExpressionPosition(expr); builder()->Throw(); - // Throw statements are modeled as expressions instead of statements. These - // are converted from assignment statements in Rewriter::ReWrite pass. An - // assignment statement expects a value in the accumulator. This is a hack to - // avoid DCHECK fails assert accumulator has been set. - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitPropertyLoad(Register obj, Property* expr) { @@ -2469,56 +2271,45 @@ void BytecodeGenerator::VisitPropertyLoad(Register obj, Property* expr) { VisitKeyedSuperPropertyLoad(expr, Register::invalid_value()); break; } - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitPropertyLoadForAccumulator(Register obj, Property* expr) { - AccumulatorResultScope result_scope(this); + ValueResultScope result_scope(this); VisitPropertyLoad(obj, expr); } void BytecodeGenerator::VisitNamedSuperPropertyLoad(Property* property, Register opt_receiver_out) { RegisterAllocationScope register_scope(this); - register_allocator()->PrepareForConsecutiveAllocations(3); - - Register receiver, home_object, name; - receiver = register_allocator()->NextConsecutiveRegister(); - home_object = register_allocator()->NextConsecutiveRegister(); - name = register_allocator()->NextConsecutiveRegister(); SuperPropertyReference* super_property = property->obj()->AsSuperPropertyReference(); - VisitForRegisterValue(super_property->this_var(), receiver); - VisitForRegisterValue(super_property->home_object(), home_object); + RegisterList args = register_allocator()->NewRegisterList(3); + VisitForRegisterValue(super_property->this_var(), args[0]); + VisitForRegisterValue(super_property->home_object(), args[1]); builder() ->LoadLiteral(property->key()->AsLiteral()->AsPropertyName()) - .StoreAccumulatorInRegister(name); - BuildNamedSuperPropertyLoad(receiver, home_object, name); + .StoreAccumulatorInRegister(args[2]) + .CallRuntime(Runtime::kLoadFromSuper, args); if (opt_receiver_out.is_valid()) { - builder()->MoveRegister(receiver, opt_receiver_out); + builder()->MoveRegister(args[0], opt_receiver_out); } } void BytecodeGenerator::VisitKeyedSuperPropertyLoad(Property* property, Register opt_receiver_out) { RegisterAllocationScope register_scope(this); - register_allocator()->PrepareForConsecutiveAllocations(3); - - Register receiver, home_object, key; - receiver = register_allocator()->NextConsecutiveRegister(); - home_object = register_allocator()->NextConsecutiveRegister(); - key = register_allocator()->NextConsecutiveRegister(); SuperPropertyReference* super_property = property->obj()->AsSuperPropertyReference(); - VisitForRegisterValue(super_property->this_var(), receiver); - VisitForRegisterValue(super_property->home_object(), home_object); - VisitForRegisterValue(property->key(), key); - BuildKeyedSuperPropertyLoad(receiver, home_object, key); + RegisterList args = register_allocator()->NewRegisterList(3); + VisitForRegisterValue(super_property->this_var(), args[0]); + VisitForRegisterValue(super_property->home_object(), args[1]); + VisitForRegisterValue(property->key(), args[2]); + builder()->CallRuntime(Runtime::kLoadKeyedFromSuper, args); if (opt_receiver_out.is_valid()) { - builder()->MoveRegister(receiver, opt_receiver_out); + builder()->MoveRegister(args[0], opt_receiver_out); } } @@ -2533,36 +2324,13 @@ void BytecodeGenerator::VisitProperty(Property* expr) { } } -Register BytecodeGenerator::VisitArguments(ZoneList* args) { - if (args->length() == 0) { - return Register(); +void BytecodeGenerator::VisitArguments(ZoneList* args, + RegisterList arg_regs, + size_t first_argument_register) { + // Visit arguments. + for (int i = 0; i < static_cast(args->length()); i++) { + VisitForRegisterValue(args->at(i), arg_regs[first_argument_register + i]); } - - // Visit arguments and place in a contiguous block of temporary - // registers. Return the first temporary register corresponding to - // the first argument. - // - // NB the caller may have already called - // PrepareForConsecutiveAllocations() with args->length() + N. The - // second call here will be a no-op provided there have been N or - // less calls to NextConsecutiveRegister(). Otherwise, the arguments - // here will be consecutive, but they will not be consecutive with - // earlier consecutive allocations made by the caller. - register_allocator()->PrepareForConsecutiveAllocations(args->length()); - - // Visit for first argument that goes into returned register - Register first_arg = register_allocator()->NextConsecutiveRegister(); - VisitForAccumulatorValue(args->at(0)); - builder()->StoreAccumulatorInRegister(first_arg); - - // Visit remaining arguments - for (int i = 1; i < static_cast(args->length()); i++) { - Register ith_arg = register_allocator()->NextConsecutiveRegister(); - VisitForAccumulatorValue(args->at(i)); - builder()->StoreAccumulatorInRegister(ith_arg); - DCHECK(ith_arg.index() - i == first_arg.index()); - } - return first_arg; } void BytecodeGenerator::VisitCall(Call* expr) { @@ -2573,18 +2341,15 @@ void BytecodeGenerator::VisitCall(Call* expr) { return VisitCallSuper(expr); } - // Prepare the callee and the receiver to the function call. This depends on - // the semantics of the underlying call type. + Register callee = register_allocator()->NewRegister(); - // The receiver and arguments need to be allocated consecutively for - // Call(). We allocate the callee and receiver consecutively for calls to - // %LoadLookupSlotForCall. Future optimizations could avoid this there are - // no arguments or the receiver and arguments are already consecutive. - ZoneList* args = expr->arguments(); - register_allocator()->PrepareForConsecutiveAllocations(args->length() + 2); - Register callee = register_allocator()->NextConsecutiveRegister(); - Register receiver = register_allocator()->NextConsecutiveRegister(); + // Add an argument register for the receiver. + RegisterList args = + register_allocator()->NewRegisterList(expr->arguments()->length() + 1); + Register receiver = args[0]; + // Prepare the callee and the receiver to the function call. This depends on + // the semantics of the underlying call type. switch (call_type) { case Call::NAMED_PROPERTY_CALL: case Call::KEYED_PROPERTY_CALL: { @@ -2613,12 +2378,13 @@ void BytecodeGenerator::VisitCall(Call* expr) { // Call %LoadLookupSlotForCall to get the callee and receiver. DCHECK(Register::AreContiguous(callee, receiver)); + RegisterList result_pair(callee.index(), 2); Variable* variable = callee_expr->AsVariableProxy()->var(); builder() ->LoadLiteral(variable->name()) .StoreAccumulatorInRegister(name) - .CallRuntimeForPair(Runtime::kLoadLookupSlotForCall, name, 1, - callee); + .CallRuntimeForPair(Runtime::kLoadLookupSlotForCall, name, + result_pair); break; } // Fall through. @@ -2626,8 +2392,7 @@ void BytecodeGenerator::VisitCall(Call* expr) { } case Call::OTHER_CALL: { builder()->LoadUndefined().StoreAccumulatorInRegister(receiver); - VisitForAccumulatorValue(callee_expr); - builder()->StoreAccumulatorInRegister(callee); + VisitForRegisterValue(callee_expr, callee); break; } case Call::NAMED_SUPER_PROPERTY_CALL: { @@ -2647,42 +2412,34 @@ void BytecodeGenerator::VisitCall(Call* expr) { break; } - // Evaluate all arguments to the function call and store in sequential + // Evaluate all arguments to the function call and store in sequential args // registers. - Register arg = VisitArguments(args); - CHECK(args->length() == 0 || arg.index() == receiver.index() + 1); + VisitArguments(expr->arguments(), args, 1); // Resolve callee for a potential direct eval call. This block will mutate the // callee value. - if (call_type == Call::POSSIBLY_EVAL_CALL && args->length() > 0) { + if (call_type == Call::POSSIBLY_EVAL_CALL && + expr->arguments()->length() > 0) { RegisterAllocationScope inner_register_scope(this); - register_allocator()->PrepareForConsecutiveAllocations(6); - Register callee_for_eval = register_allocator()->NextConsecutiveRegister(); - Register source = register_allocator()->NextConsecutiveRegister(); - Register function = register_allocator()->NextConsecutiveRegister(); - Register language = register_allocator()->NextConsecutiveRegister(); - Register eval_scope_position = - register_allocator()->NextConsecutiveRegister(); - Register eval_position = register_allocator()->NextConsecutiveRegister(); - // Set up arguments for ResolvePossiblyDirectEval by copying callee, source // strings and function closure, and loading language and // position. + RegisterList runtime_call_args = register_allocator()->NewRegisterList(6); builder() - ->MoveRegister(callee, callee_for_eval) - .MoveRegister(arg, source) - .MoveRegister(Register::function_closure(), function) + ->MoveRegister(callee, runtime_call_args[0]) + .MoveRegister(args[1], runtime_call_args[1]) + .MoveRegister(Register::function_closure(), runtime_call_args[2]) .LoadLiteral(Smi::FromInt(language_mode())) - .StoreAccumulatorInRegister(language) + .StoreAccumulatorInRegister(runtime_call_args[3]) .LoadLiteral( Smi::FromInt(execution_context()->scope()->start_position())) - .StoreAccumulatorInRegister(eval_scope_position) + .StoreAccumulatorInRegister(runtime_call_args[4]) .LoadLiteral(Smi::FromInt(expr->position())) - .StoreAccumulatorInRegister(eval_position); + .StoreAccumulatorInRegister(runtime_call_args[5]); // Call ResolvePossiblyDirectEval and modify the callee. builder() - ->CallRuntime(Runtime::kResolvePossiblyDirectEval, callee_for_eval, 6) + ->CallRuntime(Runtime::kResolvePossiblyDirectEval, runtime_call_args) .StoreAccumulatorInRegister(callee); } @@ -2692,16 +2449,14 @@ void BytecodeGenerator::VisitCall(Call* expr) { if (expr->CallFeedbackICSlot().IsInvalid()) { DCHECK(call_type == Call::POSSIBLY_EVAL_CALL); // Valid type feedback slots can only be greater than kReservedIndexCount. - // We use 0 to indicate an invalid slot it. Statically assert that 0 cannot + // We use 0 to indicate an invalid slot id. Statically assert that 0 cannot // be a valid slot id. STATIC_ASSERT(TypeFeedbackVector::kReservedIndexCount > 0); feedback_slot_index = 0; } else { feedback_slot_index = feedback_index(expr->CallFeedbackICSlot()); } - builder()->Call(callee, receiver, 1 + args->length(), feedback_slot_index, - expr->tail_call_mode()); - execution_result()->SetResultInAccumulator(); + builder()->Call(callee, args, feedback_slot_index, expr->tail_call_mode()); } void BytecodeGenerator::VisitCallSuper(Call* expr) { @@ -2709,17 +2464,15 @@ void BytecodeGenerator::VisitCallSuper(Call* expr) { SuperCallReference* super = expr->expression()->AsSuperCallReference(); // Prepare the constructor to the super call. - Register this_function = register_allocator()->NewRegister(); - VisitForAccumulatorValue(super->this_function_var()); - builder() - ->StoreAccumulatorInRegister(this_function) - .CallRuntime(Runtime::kInlineGetSuperConstructor, this_function, 1); + Register this_function = VisitForRegisterValue(super->this_function_var()); + builder()->CallRuntime(Runtime::kInlineGetSuperConstructor, this_function); Register constructor = this_function; // Re-use dead this_function register. builder()->StoreAccumulatorInRegister(constructor); - ZoneList* args = expr->arguments(); - Register first_arg = VisitArguments(args); + RegisterList args = + register_allocator()->NewRegisterList(expr->arguments()->length()); + VisitArguments(expr->arguments(), args); // The new target is loaded into the accumulator from the // {new.target} variable. @@ -2727,51 +2480,51 @@ void BytecodeGenerator::VisitCallSuper(Call* expr) { // Call construct. builder()->SetExpressionPosition(expr); - builder()->New(constructor, first_arg, args->length()); - execution_result()->SetResultInAccumulator(); + // Valid type feedback slots can only be greater than kReservedIndexCount. + // Assert that 0 cannot be valid a valid slot id. + STATIC_ASSERT(TypeFeedbackVector::kReservedIndexCount > 0); + // Type feedback is not necessary for super constructor calls. The type + // information can be inferred in most cases. Slot id 0 indicates type + // feedback is not required. + builder()->New(constructor, args, 0); } void BytecodeGenerator::VisitCallNew(CallNew* expr) { - Register constructor = register_allocator()->NewRegister(); - VisitForAccumulatorValue(expr->expression()); - builder()->StoreAccumulatorInRegister(constructor); - - ZoneList* args = expr->arguments(); - Register first_arg = VisitArguments(args); + Register constructor = VisitForRegisterValue(expr->expression()); + RegisterList args = + register_allocator()->NewRegisterList(expr->arguments()->length()); + VisitArguments(expr->arguments(), args); builder()->SetExpressionPosition(expr); // The accumulator holds new target which is the same as the // constructor for CallNew. builder() ->LoadAccumulatorWithRegister(constructor) - .New(constructor, first_arg, args->length()); - execution_result()->SetResultInAccumulator(); + .New(constructor, args, feedback_index(expr->CallNewFeedbackSlot())); } void BytecodeGenerator::VisitCallRuntime(CallRuntime* expr) { - ZoneList* args = expr->arguments(); if (expr->is_jsruntime()) { // Allocate a register for the receiver and load it with undefined. - register_allocator()->PrepareForConsecutiveAllocations(1 + args->length()); - Register receiver = register_allocator()->NextConsecutiveRegister(); + RegisterList args = + register_allocator()->NewRegisterList(expr->arguments()->length() + 1); + Register receiver = args[0]; builder()->LoadUndefined().StoreAccumulatorInRegister(receiver); - Register first_arg = VisitArguments(args); - CHECK(args->length() == 0 || first_arg.index() == receiver.index() + 1); - builder()->CallJSRuntime(expr->context_index(), receiver, - 1 + args->length()); + VisitArguments(expr->arguments(), args, 1); + builder()->CallJSRuntime(expr->context_index(), args); } else { // Evaluate all arguments to the runtime call. - Register first_arg = VisitArguments(args); + RegisterList args = + register_allocator()->NewRegisterList(expr->arguments()->length()); + VisitArguments(expr->arguments(), args); Runtime::FunctionId function_id = expr->function()->function_id; - builder()->CallRuntime(function_id, first_arg, args->length()); + builder()->CallRuntime(function_id, args); } - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitVoid(UnaryOperation* expr) { VisitForEffect(expr->expression()); builder()->LoadUndefined(); - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitTypeOf(UnaryOperation* expr) { @@ -2785,7 +2538,6 @@ void BytecodeGenerator::VisitTypeOf(UnaryOperation* expr) { VisitForAccumulatorValue(expr->expression()); } builder()->TypeOf(); - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitNot(UnaryOperation* expr) { @@ -2802,7 +2554,6 @@ void BytecodeGenerator::VisitNot(UnaryOperation* expr) { } else { VisitForAccumulatorValue(expr->expression()); builder()->LogicalNot(); - execution_result()->SetResultInAccumulator(); } } @@ -2846,16 +2597,15 @@ void BytecodeGenerator::VisitDelete(UnaryOperation* expr) { Variable* variable = proxy->var(); DCHECK(is_sloppy(language_mode()) || variable->is_this()); switch (variable->location()) { - case VariableLocation::GLOBAL: case VariableLocation::UNALLOCATED: { // Global var, let, const or variables not explicitly declared. Register native_context = register_allocator()->NewRegister(); Register global_object = register_allocator()->NewRegister(); builder() ->LoadContextSlot(execution_context()->reg(), - Context::NATIVE_CONTEXT_INDEX) + Context::NATIVE_CONTEXT_INDEX, 0) .StoreAccumulatorInRegister(native_context) - .LoadContextSlot(native_context, Context::EXTENSION_INDEX) + .LoadContextSlot(native_context, Context::EXTENSION_INDEX, 0) .StoreAccumulatorInRegister(global_object) .LoadLiteral(variable->name()) .Delete(global_object, language_mode()); @@ -2878,7 +2628,7 @@ void BytecodeGenerator::VisitDelete(UnaryOperation* expr) { builder() ->LoadLiteral(variable->name()) .StoreAccumulatorInRegister(name_reg) - .CallRuntime(Runtime::kDeleteLookupSlot, name_reg, 1); + .CallRuntime(Runtime::kDeleteLookupSlot, name_reg); break; } default: @@ -2889,7 +2639,6 @@ void BytecodeGenerator::VisitDelete(UnaryOperation* expr) { VisitForEffect(expr->expression()); builder()->LoadTrue(); } - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitCountOperation(CountOperation* expr) { @@ -2902,7 +2651,8 @@ void BytecodeGenerator::VisitCountOperation(CountOperation* expr) { bool is_postfix = expr->is_postfix() && !execution_result()->IsEffect(); // Evaluate LHS expression and get old value. - Register object, home_object, key, old_value, value; + Register object, key, old_value; + RegisterList super_property_args; Handle name; switch (assign_type) { case VARIABLE: { @@ -2930,44 +2680,36 @@ void BytecodeGenerator::VisitCountOperation(CountOperation* expr) { break; } case NAMED_SUPER_PROPERTY: { - register_allocator()->PrepareForConsecutiveAllocations(4); - object = register_allocator()->NextConsecutiveRegister(); - home_object = register_allocator()->NextConsecutiveRegister(); - key = register_allocator()->NextConsecutiveRegister(); - value = register_allocator()->NextConsecutiveRegister(); + super_property_args = register_allocator()->NewRegisterList(4); + RegisterList load_super_args = super_property_args.Truncate(3); SuperPropertyReference* super_property = property->obj()->AsSuperPropertyReference(); - VisitForRegisterValue(super_property->this_var(), object); - VisitForRegisterValue(super_property->home_object(), home_object); + VisitForRegisterValue(super_property->this_var(), load_super_args[0]); + VisitForRegisterValue(super_property->home_object(), load_super_args[1]); builder() ->LoadLiteral(property->key()->AsLiteral()->AsPropertyName()) - .StoreAccumulatorInRegister(key); - BuildNamedSuperPropertyLoad(object, home_object, key); + .StoreAccumulatorInRegister(load_super_args[2]) + .CallRuntime(Runtime::kLoadFromSuper, load_super_args); break; } case KEYED_SUPER_PROPERTY: { - register_allocator()->PrepareForConsecutiveAllocations(4); - object = register_allocator()->NextConsecutiveRegister(); - home_object = register_allocator()->NextConsecutiveRegister(); - key = register_allocator()->NextConsecutiveRegister(); - value = register_allocator()->NextConsecutiveRegister(); - builder()->StoreAccumulatorInRegister(value); + super_property_args = register_allocator()->NewRegisterList(4); + RegisterList load_super_args = super_property_args.Truncate(3); SuperPropertyReference* super_property = property->obj()->AsSuperPropertyReference(); - VisitForRegisterValue(super_property->this_var(), object); - VisitForRegisterValue(super_property->home_object(), home_object); - VisitForRegisterValue(property->key(), key); - BuildKeyedSuperPropertyLoad(object, home_object, key); + VisitForRegisterValue(super_property->this_var(), load_super_args[0]); + VisitForRegisterValue(super_property->home_object(), load_super_args[1]); + VisitForRegisterValue(property->key(), load_super_args[2]); + builder()->CallRuntime(Runtime::kLoadKeyedFromSuper, load_super_args); break; } } // Save result for postfix expressions. if (is_postfix) { - old_value = register_allocator()->outer()->NewRegister(); - // Convert old value into a number before saving it. - builder()->CastAccumulatorToNumber(old_value); + old_value = register_allocator()->NewRegister(); + builder()->ConvertAccumulatorToNumber(old_value); } // Perform +1/-1 operation. @@ -2994,22 +2736,22 @@ void BytecodeGenerator::VisitCountOperation(CountOperation* expr) { break; } case NAMED_SUPER_PROPERTY: { - builder()->StoreAccumulatorInRegister(value); - BuildNamedSuperPropertyStore(object, home_object, key, value); + builder() + ->StoreAccumulatorInRegister(super_property_args[3]) + .CallRuntime(StoreToSuperRuntimeId(), super_property_args); break; } case KEYED_SUPER_PROPERTY: { - builder()->StoreAccumulatorInRegister(value); - BuildKeyedSuperPropertyStore(object, home_object, key, value); + builder() + ->StoreAccumulatorInRegister(super_property_args[3]) + .CallRuntime(StoreKeyedToSuperRuntimeId(), super_property_args); break; } } // Restore old value for postfix expressions. if (is_postfix) { - execution_result()->SetResultInRegister(old_value); - } else { - execution_result()->SetResultInAccumulator(); + builder()->LoadAccumulatorWithRegister(old_value); } } @@ -3034,8 +2776,8 @@ void BytecodeGenerator::VisitCompareOperation(CompareOperation* expr) { Register lhs = VisitForRegisterValue(expr->left()); VisitForAccumulatorValue(expr->right()); builder()->SetExpressionPosition(expr); - builder()->CompareOperation(expr->op(), lhs); - execution_result()->SetResultInAccumulator(); + FeedbackVectorSlot slot = expr->CompareOperationFeedbackSlot(); + builder()->CompareOperation(expr->op(), lhs, feedback_index(slot)); } void BytecodeGenerator::VisitArithmeticExpression(BinaryOperation* expr) { @@ -3045,7 +2787,6 @@ void BytecodeGenerator::VisitArithmeticExpression(BinaryOperation* expr) { VisitForAccumulatorValue(expr->right()); FeedbackVectorSlot slot = expr->BinaryOperationFeedbackSlot(); builder()->BinaryOperation(expr->op(), lhs, feedback_index(slot)); - execution_result()->SetResultInAccumulator(); } void BytecodeGenerator::VisitSpread(Spread* expr) { UNREACHABLE(); } @@ -3055,7 +2796,7 @@ void BytecodeGenerator::VisitEmptyParentheses(EmptyParentheses* expr) { } void BytecodeGenerator::VisitThisFunction(ThisFunction* expr) { - execution_result()->SetResultInRegister(Register::function_closure()); + builder()->LoadAccumulatorWithRegister(Register::function_closure()); } void BytecodeGenerator::VisitSuperCallReference(SuperCallReference* expr) { @@ -3065,8 +2806,7 @@ void BytecodeGenerator::VisitSuperCallReference(SuperCallReference* expr) { void BytecodeGenerator::VisitSuperPropertyReference( SuperPropertyReference* expr) { - builder()->CallRuntime(Runtime::kThrowUnsupportedSuperError, Register(0), 0); - execution_result()->SetResultInAccumulator(); + builder()->CallRuntime(Runtime::kThrowUnsupportedSuperError); } void BytecodeGenerator::VisitCommaExpression(BinaryOperation* binop) { @@ -3106,7 +2846,6 @@ void BytecodeGenerator::VisitLogicalOrExpression(BinaryOperation* binop) { VisitForAccumulatorValue(right); builder()->Bind(&end_label); } - execution_result()->SetResultInAccumulator(); } } @@ -3142,7 +2881,6 @@ void BytecodeGenerator::VisitLogicalAndExpression(BinaryOperation* binop) { VisitForAccumulatorValue(right); builder()->Bind(&end_label); } - execution_result()->SetResultInAccumulator(); } } @@ -3150,35 +2888,45 @@ void BytecodeGenerator::VisitRewritableExpression(RewritableExpression* expr) { Visit(expr->expression()); } -void BytecodeGenerator::VisitNewLocalFunctionContext() { - AccumulatorResultScope accumulator_execution_result(this); +void BytecodeGenerator::BuildNewLocalActivationContext() { + ValueResultScope value_execution_result(this); Scope* scope = this->scope(); - // Allocate a new local context. + // Create the appropriate context. if (scope->is_script_scope()) { - RegisterAllocationScope register_scope(this); - Register closure = register_allocator()->NewRegister(); - Register scope_info = register_allocator()->NewRegister(); - DCHECK(Register::AreContiguous(closure, scope_info)); + RegisterList args = register_allocator()->NewRegisterList(2); builder() ->LoadAccumulatorWithRegister(Register::function_closure()) - .StoreAccumulatorInRegister(closure) + .StoreAccumulatorInRegister(args[0]) .LoadLiteral(scope->scope_info()) - .StoreAccumulatorInRegister(scope_info) - .CallRuntime(Runtime::kNewScriptContext, closure, 2); + .StoreAccumulatorInRegister(args[1]) + .CallRuntime(Runtime::kNewScriptContext, args); + } else if (scope->is_module_scope()) { + // We don't need to do anything for the outer script scope. + DCHECK(scope->outer_scope()->is_script_scope()); + + // A JSFunction representing a module is called with the module object as + // its sole argument, which we pass on to PushModuleContext. + RegisterList args = register_allocator()->NewRegisterList(3); + builder() + ->MoveRegister(builder()->Parameter(1), args[0]) + .LoadAccumulatorWithRegister(Register::function_closure()) + .StoreAccumulatorInRegister(args[1]) + .LoadLiteral(scope->scope_info()) + .StoreAccumulatorInRegister(args[2]) + .CallRuntime(Runtime::kPushModuleContext, args); } else { int slot_count = scope->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; if (slot_count <= FastNewFunctionContextStub::kMaximumSlots) { builder()->CreateFunctionContext(slot_count); } else { builder()->CallRuntime(Runtime::kNewFunctionContext, - Register::function_closure(), 1); + Register::function_closure()); } } - execution_result()->SetResultInAccumulator(); } -void BytecodeGenerator::VisitBuildLocalActivationContext() { +void BytecodeGenerator::BuildLocalActivationContextInitialization() { DeclarationScope* scope = this->scope(); if (scope->has_this_declaration() && scope->receiver()->IsContextSlot()) { @@ -3187,7 +2935,7 @@ void BytecodeGenerator::VisitBuildLocalActivationContext() { // Context variable (at bottom of the context chain). DCHECK_EQ(0, scope->ContextChainLength(variable->scope())); builder()->LoadAccumulatorWithRegister(receiver).StoreContextSlot( - execution_context()->reg(), variable->index()); + execution_context()->reg(), variable->index(), 0); } // Copy parameters into context if necessary. @@ -3201,56 +2949,53 @@ void BytecodeGenerator::VisitBuildLocalActivationContext() { Register parameter(builder()->Parameter(i + 1)); // Context variable (at bottom of the context chain). DCHECK_EQ(0, scope->ContextChainLength(variable->scope())); - builder()->LoadAccumulatorWithRegister(parameter) - .StoreContextSlot(execution_context()->reg(), variable->index()); + builder()->LoadAccumulatorWithRegister(parameter).StoreContextSlot( + execution_context()->reg(), variable->index(), 0); } } -void BytecodeGenerator::VisitNewLocalBlockContext(Scope* scope) { - AccumulatorResultScope accumulator_execution_result(this); +void BytecodeGenerator::BuildNewLocalBlockContext(Scope* scope) { + ValueResultScope value_execution_result(this); DCHECK(scope->is_block_scope()); VisitFunctionClosureForContext(); builder()->CreateBlockContext(scope->scope_info()); - execution_result()->SetResultInAccumulator(); } -void BytecodeGenerator::VisitNewLocalWithContext() { - AccumulatorResultScope accumulator_execution_result(this); +void BytecodeGenerator::BuildNewLocalWithContext(Scope* scope) { + ValueResultScope value_execution_result(this); Register extension_object = register_allocator()->NewRegister(); - builder()->CastAccumulatorToJSObject(extension_object); + builder()->ConvertAccumulatorToObject(extension_object); VisitFunctionClosureForContext(); - builder()->CreateWithContext(extension_object); - execution_result()->SetResultInAccumulator(); + builder()->CreateWithContext(extension_object, scope->scope_info()); } -void BytecodeGenerator::VisitNewLocalCatchContext(Variable* variable) { - AccumulatorResultScope accumulator_execution_result(this); +void BytecodeGenerator::BuildNewLocalCatchContext(Variable* variable, + Scope* scope) { + ValueResultScope value_execution_result(this); DCHECK(variable->IsContextSlot()); Register exception = register_allocator()->NewRegister(); builder()->StoreAccumulatorInRegister(exception); VisitFunctionClosureForContext(); - builder()->CreateCatchContext(exception, variable->name()); - execution_result()->SetResultInAccumulator(); + builder()->CreateCatchContext(exception, variable->name(), + scope->scope_info()); } void BytecodeGenerator::VisitObjectLiteralAccessor( Register home_object, ObjectLiteralProperty* property, Register value_out) { - // TODO(rmcilroy): Replace value_out with VisitForRegister(); if (property == nullptr) { builder()->LoadNull().StoreAccumulatorInRegister(value_out); } else { - VisitForAccumulatorValue(property->value()); - builder()->StoreAccumulatorInRegister(value_out); + VisitForRegisterValue(property->value(), value_out); VisitSetHomeObject(value_out, home_object, property); } } void BytecodeGenerator::VisitSetHomeObject(Register value, Register home_object, - ObjectLiteralProperty* property, + LiteralProperty* property, int slot_number) { Expression* expr = property->value(); if (FunctionLiteral::NeedsHomeObject(expr)) { @@ -3302,38 +3047,44 @@ void BytecodeGenerator::VisitNewTargetVariable(Variable* variable) { // Store the new target we were called with in the given variable. builder()->LoadAccumulatorWithRegister(Register::new_target()); VisitVariableAssignment(variable, Token::INIT, FeedbackVectorSlot::Invalid()); + + // TODO(mstarzinger): The register is not set by the deoptimizer + // and we need to make sure {BytecodeRegisterOptimizer} flushes its state + // before a local variable containing the is used. Using a label + // as below flushes the entire pipeline, we should be more specific here. + BytecodeLabel flush_state_label; + builder()->Bind(&flush_state_label); } void BytecodeGenerator::VisitFunctionClosureForContext() { - AccumulatorResultScope accumulator_execution_result(this); + ValueResultScope value_execution_result(this); DeclarationScope* closure_scope = execution_context()->scope()->GetClosureScope(); - if (closure_scope->is_script_scope() || - closure_scope->is_module_scope()) { + if (closure_scope->is_script_scope()) { // Contexts nested in the native context have a canonical empty function as // their closure, not the anonymous closure containing the global code. Register native_context = register_allocator()->NewRegister(); builder() ->LoadContextSlot(execution_context()->reg(), - Context::NATIVE_CONTEXT_INDEX) + Context::NATIVE_CONTEXT_INDEX, 0) .StoreAccumulatorInRegister(native_context) - .LoadContextSlot(native_context, Context::CLOSURE_INDEX); + .LoadContextSlot(native_context, Context::CLOSURE_INDEX, 0); } else if (closure_scope->is_eval_scope()) { // Contexts created by a call to eval have the same closure as the // context calling eval, not the anonymous closure containing the eval // code. Fetch it from the context. builder()->LoadContextSlot(execution_context()->reg(), - Context::CLOSURE_INDEX); + Context::CLOSURE_INDEX, 0); } else { - DCHECK(closure_scope->is_function_scope()); + DCHECK(closure_scope->is_function_scope() || + closure_scope->is_module_scope()); builder()->LoadAccumulatorWithRegister(Register::function_closure()); } - execution_result()->SetResultInAccumulator(); } // Visits the expression |expr| and places the result in the accumulator. void BytecodeGenerator::VisitForAccumulatorValue(Expression* expr) { - AccumulatorResultScope accumulator_scope(this); + ValueResultScope accumulator_scope(this); Visit(expr); } @@ -3354,16 +3105,17 @@ void BytecodeGenerator::VisitForEffect(Expression* expr) { // Visits the expression |expr| and returns the register containing // the expression result. Register BytecodeGenerator::VisitForRegisterValue(Expression* expr) { - RegisterResultScope register_scope(this); - Visit(expr); - return register_scope.ResultRegister(); + VisitForAccumulatorValue(expr); + Register result = register_allocator()->NewRegister(); + builder()->StoreAccumulatorInRegister(result); + return result; } // Visits the expression |expr| and stores the expression result in // |destination|. void BytecodeGenerator::VisitForRegisterValue(Expression* expr, Register destination) { - AccumulatorResultScope register_scope(this); + ValueResultScope register_scope(this); Visit(expr); builder()->StoreAccumulatorInRegister(destination); } @@ -3412,6 +3164,16 @@ int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { return TypeFeedbackVector::GetIndex(slot); } +Runtime::FunctionId BytecodeGenerator::StoreToSuperRuntimeId() { + return is_strict(language_mode()) ? Runtime::kStoreToSuper_Strict + : Runtime::kStoreToSuper_Sloppy; +} + +Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { + return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict + : Runtime::kStoreKeyedToSuper_Sloppy; +} + } // namespace interpreter } // namespace internal } // namespace v8 diff --git a/deps/v8/src/interpreter/bytecode-generator.h b/deps/v8/src/interpreter/bytecode-generator.h index ee72135f4398f2..03067de08d4796 100644 --- a/deps/v8/src/interpreter/bytecode-generator.h +++ b/deps/v8/src/interpreter/bytecode-generator.h @@ -24,7 +24,7 @@ class BytecodeGenerator final : public AstVisitor { public: explicit BytecodeGenerator(CompilationInfo* info); - void GenerateBytecode(); + void GenerateBytecode(uintptr_t stack_limit); Handle FinalizeBytecode(Isolate* isolate); #define DECLARE_VISIT(type) void Visit##type(type* node); @@ -36,7 +36,6 @@ class BytecodeGenerator final : public AstVisitor { void VisitStatements(ZoneList* statments); private: - class AccumulatorResultScope; class ContextScope; class ControlScope; class ControlScopeForBreakable; @@ -47,9 +46,9 @@ class BytecodeGenerator final : public AstVisitor { class ExpressionResultScope; class EffectResultScope; class GlobalDeclarationsBuilder; - class RegisterResultScope; class RegisterAllocationScope; class TestResultScope; + class ValueResultScope; enum class TestFallthrough { kThen, kElse, kNone }; @@ -73,8 +72,10 @@ class BytecodeGenerator final : public AstVisitor { // Used by flow control routines to evaluate loop condition. void VisitCondition(Expression* expr); - // Helper visitors which perform common operations. - Register VisitArguments(ZoneList* arguments); + // Visit the arguments expressions in |args| and store them in |args_regs| + // starting at register |first_argument_register| in the list. + void VisitArguments(ZoneList* args, RegisterList arg_regs, + size_t first_argument_register = 0); // Visit a keyed super property load. The optional // |opt_receiver_out| register will have the receiver stored to it @@ -104,15 +105,8 @@ class BytecodeGenerator final : public AstVisitor { void VisitVariableAssignment(Variable* variable, Token::Value op, FeedbackVectorSlot slot); - void BuildNamedSuperPropertyStore(Register receiver, Register home_object, - Register name, Register value); - void BuildKeyedSuperPropertyStore(Register receiver, Register home_object, - Register key, Register value); - void BuildNamedSuperPropertyLoad(Register receiver, Register home_object, - Register name); - void BuildKeyedSuperPropertyLoad(Register receiver, Register home_object, - Register key); - + void BuildReturn(); + void BuildReThrow(); void BuildAbort(BailoutReason bailout_reason); void BuildThrowIfHole(Handle name); void BuildThrowIfNotHole(Handle name); @@ -125,6 +119,12 @@ class BytecodeGenerator final : public AstVisitor { void BuildIndexedJump(Register value, size_t start_index, size_t size, ZoneVector& targets); + void BuildNewLocalActivationContext(); + void BuildLocalActivationContextInitialization(); + void BuildNewLocalBlockContext(Scope* scope); + void BuildNewLocalCatchContext(Variable* variable, Scope* scope); + void BuildNewLocalWithContext(Scope* scope); + void VisitGeneratorPrologue(); void VisitArgumentsObject(Variable* variable); @@ -133,18 +133,12 @@ class BytecodeGenerator final : public AstVisitor { void VisitClassLiteralForRuntimeDefinition(ClassLiteral* expr); void VisitClassLiteralProperties(ClassLiteral* expr, Register literal, Register prototype); - void VisitClassLiteralStaticPrototypeWithComputedName(Register name); void VisitThisFunctionVariable(Variable* variable); void VisitNewTargetVariable(Variable* variable); - void VisitNewLocalFunctionContext(); - void VisitBuildLocalActivationContext(); void VisitBlockDeclarationsAndStatements(Block* stmt); - void VisitNewLocalBlockContext(Scope* scope); - void VisitNewLocalCatchContext(Variable* variable); - void VisitNewLocalWithContext(); void VisitFunctionClosureForContext(); void VisitSetHomeObject(Register value, Register home_object, - ObjectLiteralProperty* property, int slot_number = 0); + LiteralProperty* property, int slot_number = 0); void VisitObjectLiteralAccessor(Register home_object, ObjectLiteralProperty* property, Register value_out); @@ -168,13 +162,10 @@ class BytecodeGenerator final : public AstVisitor { void VisitForTest(Expression* expr, BytecodeLabels* then_labels, BytecodeLabels* else_labels, TestFallthrough fallthrough); - // Methods for tracking and remapping register. - void RecordStoreToRegister(Register reg); - Register LoadFromAliasedRegister(Register reg); - - // Initialize an array of temporary registers with consecutive registers. - template - void InitializeWithConsecutiveRegisters(Register (®isters)[N]); + // Returns the runtime function id for a store to super for the function's + // language mode. + inline Runtime::FunctionId StoreToSuperRuntimeId(); + inline Runtime::FunctionId StoreKeyedToSuperRuntimeId(); inline BytecodeArrayBuilder* builder() const { return builder_; } inline Zone* zone() const { return zone_; } @@ -193,12 +184,8 @@ class BytecodeGenerator final : public AstVisitor { execution_result_ = execution_result; } ExpressionResultScope* execution_result() const { return execution_result_; } - inline void set_register_allocator( - RegisterAllocationScope* register_allocator) { - register_allocator_ = register_allocator; - } - RegisterAllocationScope* register_allocator() const { - return register_allocator_; + BytecodeRegisterAllocator* register_allocator() const { + return builder()->register_allocator(); } GlobalDeclarationsBuilder* globals_builder() { return globals_builder_; } @@ -222,7 +209,6 @@ class BytecodeGenerator final : public AstVisitor { ControlScope* execution_control_; ContextScope* execution_context_; ExpressionResultScope* execution_result_; - RegisterAllocationScope* register_allocator_; ZoneVector generator_resume_points_; Register generator_state_; diff --git a/deps/v8/src/interpreter/bytecode-label.h b/deps/v8/src/interpreter/bytecode-label.h index d96cf66d13a9dd..b5f602d21651a1 100644 --- a/deps/v8/src/interpreter/bytecode-label.h +++ b/deps/v8/src/interpreter/bytecode-label.h @@ -5,7 +5,7 @@ #ifndef V8_INTERPRETER_BYTECODE_LABEL_H_ #define V8_INTERPRETER_BYTECODE_LABEL_H_ -#include "src/zone-containers.h" +#include "src/zone/zone-containers.h" namespace v8 { namespace internal { diff --git a/deps/v8/src/interpreter/bytecode-operands.cc b/deps/v8/src/interpreter/bytecode-operands.cc new file mode 100644 index 00000000000000..6be81fe62eb5a0 --- /dev/null +++ b/deps/v8/src/interpreter/bytecode-operands.cc @@ -0,0 +1,89 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/interpreter/bytecode-operands.h" + +#include + +namespace v8 { +namespace internal { +namespace interpreter { + +namespace { + +const char* AccumulatorUseToString(AccumulatorUse accumulator_use) { + switch (accumulator_use) { + case AccumulatorUse::kNone: + return "None"; + case AccumulatorUse::kRead: + return "Read"; + case AccumulatorUse::kWrite: + return "Write"; + case AccumulatorUse::kReadWrite: + return "ReadWrite"; + } + UNREACHABLE(); + return ""; +} + +const char* OperandTypeToString(OperandType operand_type) { + switch (operand_type) { +#define CASE(Name, _) \ + case OperandType::k##Name: \ + return #Name; + OPERAND_TYPE_LIST(CASE) +#undef CASE + } + UNREACHABLE(); + return ""; +} + +const char* OperandScaleToString(OperandScale operand_scale) { + switch (operand_scale) { +#define CASE(Name, _) \ + case OperandScale::k##Name: \ + return #Name; + OPERAND_SCALE_LIST(CASE) +#undef CASE + } + UNREACHABLE(); + return ""; +} + +const char* OperandSizeToString(OperandSize operand_size) { + switch (operand_size) { + case OperandSize::kNone: + return "None"; + case OperandSize::kByte: + return "Byte"; + case OperandSize::kShort: + return "Short"; + case OperandSize::kQuad: + return "Quad"; + } + UNREACHABLE(); + return ""; +} + +} // namespace + +std::ostream& operator<<(std::ostream& os, const AccumulatorUse& use) { + return os << AccumulatorUseToString(use); +} + +std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size) { + return os << OperandSizeToString(operand_size); +} + +std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale) { + return os << OperandScaleToString(operand_scale); +} + +std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) { + return os << OperandTypeToString(operand_type); +} + +} // namespace interpreter +} // namespace internal +} // namespace v8 diff --git a/deps/v8/src/interpreter/bytecode-operands.h b/deps/v8/src/interpreter/bytecode-operands.h new file mode 100644 index 00000000000000..b35c4866be7332 --- /dev/null +++ b/deps/v8/src/interpreter/bytecode-operands.h @@ -0,0 +1,126 @@ +// Copyright 2016 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_INTERPRETER_BYTECODE_OPERANDS_H_ +#define V8_INTERPRETER_BYTECODE_OPERANDS_H_ + +#include "src/globals.h" + +namespace v8 { +namespace internal { +namespace interpreter { + +#define INVALID_OPERAND_TYPE_LIST(V) V(None, OperandTypeInfo::kNone) + +#define REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ + V(RegList, OperandTypeInfo::kScalableSignedByte) \ + V(Reg, OperandTypeInfo::kScalableSignedByte) \ + V(RegPair, OperandTypeInfo::kScalableSignedByte) + +#define REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) \ + V(RegOut, OperandTypeInfo::kScalableSignedByte) \ + V(RegOutPair, OperandTypeInfo::kScalableSignedByte) \ + V(RegOutTriple, OperandTypeInfo::kScalableSignedByte) + +#define SCALAR_OPERAND_TYPE_LIST(V) \ + V(Flag8, OperandTypeInfo::kFixedUnsignedByte) \ + V(IntrinsicId, OperandTypeInfo::kFixedUnsignedByte) \ + V(Idx, OperandTypeInfo::kScalableUnsignedByte) \ + V(UImm, OperandTypeInfo::kScalableUnsignedByte) \ + V(Imm, OperandTypeInfo::kScalableSignedByte) \ + V(RegCount, OperandTypeInfo::kScalableUnsignedByte) \ + V(RuntimeId, OperandTypeInfo::kFixedUnsignedShort) + +#define REGISTER_OPERAND_TYPE_LIST(V) \ + REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ + REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) + +#define NON_REGISTER_OPERAND_TYPE_LIST(V) \ + INVALID_OPERAND_TYPE_LIST(V) \ + SCALAR_OPERAND_TYPE_LIST(V) + +// The list of operand types used by bytecodes. +#define OPERAND_TYPE_LIST(V) \ + NON_REGISTER_OPERAND_TYPE_LIST(V) \ + REGISTER_OPERAND_TYPE_LIST(V) + +// Enumeration of scaling factors applicable to scalable operands. Code +// relies on being able to cast values to integer scaling values. +#define OPERAND_SCALE_LIST(V) \ + V(Single, 1) \ + V(Double, 2) \ + V(Quadruple, 4) + +enum class OperandScale : uint8_t { +#define DECLARE_OPERAND_SCALE(Name, Scale) k##Name = Scale, + OPERAND_SCALE_LIST(DECLARE_OPERAND_SCALE) +#undef DECLARE_OPERAND_SCALE + kLast = kQuadruple +}; + +// Enumeration of the size classes of operand types used by +// bytecodes. Code relies on being able to cast values to integer +// types to get the size in bytes. +enum class OperandSize : uint8_t { + kNone = 0, + kByte = 1, + kShort = 2, + kQuad = 4, + kLast = kQuad +}; + +// Primitive operand info used that summarize properties of operands. +// Columns are Name, IsScalable, IsUnsigned, UnscaledSize. +#define OPERAND_TYPE_INFO_LIST(V) \ + V(None, false, false, OperandSize::kNone) \ + V(ScalableSignedByte, true, false, OperandSize::kByte) \ + V(ScalableUnsignedByte, true, true, OperandSize::kByte) \ + V(FixedUnsignedByte, false, true, OperandSize::kByte) \ + V(FixedUnsignedShort, false, true, OperandSize::kShort) + +enum class OperandTypeInfo : uint8_t { +#define DECLARE_OPERAND_TYPE_INFO(Name, ...) k##Name, + OPERAND_TYPE_INFO_LIST(DECLARE_OPERAND_TYPE_INFO) +#undef DECLARE_OPERAND_TYPE_INFO +}; + +// Enumeration of operand types used by bytecodes. +enum class OperandType : uint8_t { +#define DECLARE_OPERAND_TYPE(Name, _) k##Name, + OPERAND_TYPE_LIST(DECLARE_OPERAND_TYPE) +#undef DECLARE_OPERAND_TYPE +#define COUNT_OPERAND_TYPES(x, _) +1 + // The COUNT_OPERAND macro will turn this into kLast = -1 +1 +1... which will + // evaluate to the same value as the last operand. + kLast = -1 OPERAND_TYPE_LIST(COUNT_OPERAND_TYPES) +#undef COUNT_OPERAND_TYPES +}; + +enum class AccumulatorUse : uint8_t { + kNone = 0, + kRead = 1 << 0, + kWrite = 1 << 1, + kReadWrite = kRead | kWrite +}; + +inline AccumulatorUse operator&(AccumulatorUse lhs, AccumulatorUse rhs) { + int result = static_cast(lhs) & static_cast(rhs); + return static_cast(result); +} + +inline AccumulatorUse operator|(AccumulatorUse lhs, AccumulatorUse rhs) { + int result = static_cast(lhs) | static_cast(rhs); + return static_cast(result); +} + +std::ostream& operator<<(std::ostream& os, const AccumulatorUse& use); +std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale); +std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size); +std::ostream& operator<<(std::ostream& os, const OperandType& operand_type); + +} // namespace interpreter +} // namespace internal +} // namespace v8 + +#endif // V8_INTERPRETER_BYTECODE_OPERANDS_H_ diff --git a/deps/v8/src/interpreter/bytecode-peephole-optimizer.cc b/deps/v8/src/interpreter/bytecode-peephole-optimizer.cc index 11aebb6ddb3ef1..c87d31c39f04ae 100644 --- a/deps/v8/src/interpreter/bytecode-peephole-optimizer.cc +++ b/deps/v8/src/interpreter/bytecode-peephole-optimizer.cc @@ -13,17 +13,17 @@ namespace interpreter { BytecodePeepholeOptimizer::BytecodePeepholeOptimizer( BytecodePipelineStage* next_stage) - : next_stage_(next_stage) { + : next_stage_(next_stage), last_(Bytecode::kIllegal) { InvalidateLast(); } // override Handle BytecodePeepholeOptimizer::ToBytecodeArray( - Isolate* isolate, int fixed_register_count, int parameter_count, + Isolate* isolate, int register_count, int parameter_count, Handle handler_table) { Flush(); - return next_stage_->ToBytecodeArray(isolate, fixed_register_count, - parameter_count, handler_table); + return next_stage_->ToBytecodeArray(isolate, register_count, parameter_count, + handler_table); } // override @@ -142,7 +142,7 @@ void TransformLdaSmiBinaryOpToBinaryOpWithSmi(Bytecode new_bytecode, current->set_bytecode(new_bytecode, last->operand(0), current->operand(0), current->operand(1)); if (last->source_info().is_valid()) { - current->source_info().Clone(last->source_info()); + current->source_info_ptr()->Clone(last->source_info()); } } @@ -153,7 +153,7 @@ void TransformLdaZeroBinaryOpToBinaryOpWithZero(Bytecode new_bytecode, current->set_bytecode(new_bytecode, 0, current->operand(0), current->operand(1)); if (last->source_info().is_valid()) { - current->source_info().Clone(last->source_info()); + current->source_info_ptr()->Clone(last->source_info()); } } @@ -223,7 +223,7 @@ void BytecodePeepholeOptimizer::ElideLastAction( // |node| can not have a valid source position if the source // position of last() is valid (per rules in // CanElideLastBasedOnSourcePosition()). - node->source_info().Clone(last()->source_info()); + node->source_info_ptr()->Clone(last()->source_info()); } SetLast(node); } else { @@ -314,7 +314,7 @@ void BytecodePeepholeOptimizer::ElideLastBeforeJumpAction( if (!CanElideLastBasedOnSourcePosition(node)) { next_stage()->Write(last()); } else if (!node->source_info().is_valid()) { - node->source_info().Clone(last()->source_info()); + node->source_info_ptr()->Clone(last()->source_info()); } InvalidateLast(); } diff --git a/deps/v8/src/interpreter/bytecode-peephole-optimizer.h b/deps/v8/src/interpreter/bytecode-peephole-optimizer.h index 2f4a35fd1bcd55..cedd742f87932d 100644 --- a/deps/v8/src/interpreter/bytecode-peephole-optimizer.h +++ b/deps/v8/src/interpreter/bytecode-peephole-optimizer.h @@ -28,7 +28,7 @@ class BytecodePeepholeOptimizer final : public BytecodePipelineStage, void BindLabel(BytecodeLabel* label) override; void BindLabel(const BytecodeLabel& target, BytecodeLabel* label) override; Handle ToBytecodeArray( - Isolate* isolate, int fixed_register_count, int parameter_count, + Isolate* isolate, int register_count, int parameter_count, Handle handler_table) override; private: diff --git a/deps/v8/src/interpreter/bytecode-pipeline.cc b/deps/v8/src/interpreter/bytecode-pipeline.cc index 66b8bdf533cf70..6e6a6b6fab6af1 100644 --- a/deps/v8/src/interpreter/bytecode-pipeline.cc +++ b/deps/v8/src/interpreter/bytecode-pipeline.cc @@ -11,45 +11,6 @@ namespace v8 { namespace internal { namespace interpreter { -BytecodeNode::BytecodeNode(Bytecode bytecode) { - DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 0); - bytecode_ = bytecode; -} - -BytecodeNode::BytecodeNode(Bytecode bytecode, uint32_t operand0) { - DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 1); - bytecode_ = bytecode; - operands_[0] = operand0; -} - -BytecodeNode::BytecodeNode(Bytecode bytecode, uint32_t operand0, - uint32_t operand1) { - DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 2); - bytecode_ = bytecode; - operands_[0] = operand0; - operands_[1] = operand1; -} - -BytecodeNode::BytecodeNode(Bytecode bytecode, uint32_t operand0, - uint32_t operand1, uint32_t operand2) { - DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 3); - bytecode_ = bytecode; - operands_[0] = operand0; - operands_[1] = operand1; - operands_[2] = operand2; -} - -BytecodeNode::BytecodeNode(Bytecode bytecode, uint32_t operand0, - uint32_t operand1, uint32_t operand2, - uint32_t operand3) { - DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 4); - bytecode_ = bytecode; - operands_[0] = operand0; - operands_[1] = operand1; - operands_[2] = operand2; - operands_[3] = operand3; -} - BytecodeNode::BytecodeNode(const BytecodeNode& other) { memcpy(this, &other, sizeof(other)); } @@ -83,23 +44,6 @@ void BytecodeNode::Print(std::ostream& os) const { #endif // DEBUG } -void BytecodeNode::Transform(Bytecode new_bytecode, uint32_t extra_operand) { - DCHECK_EQ(Bytecodes::NumberOfOperands(new_bytecode), - Bytecodes::NumberOfOperands(bytecode()) + 1); - DCHECK(Bytecodes::NumberOfOperands(bytecode()) < 1 || - Bytecodes::GetOperandType(new_bytecode, 0) == - Bytecodes::GetOperandType(bytecode(), 0)); - DCHECK(Bytecodes::NumberOfOperands(bytecode()) < 2 || - Bytecodes::GetOperandType(new_bytecode, 1) == - Bytecodes::GetOperandType(bytecode(), 1)); - DCHECK(Bytecodes::NumberOfOperands(bytecode()) < 3 || - Bytecodes::GetOperandType(new_bytecode, 2) == - Bytecodes::GetOperandType(bytecode(), 2)); - DCHECK(Bytecodes::NumberOfOperands(bytecode()) < 4); - operands_[operand_count()] = extra_operand; - bytecode_ = new_bytecode; -} - bool BytecodeNode::operator==(const BytecodeNode& other) const { if (this == &other) { return true; diff --git a/deps/v8/src/interpreter/bytecode-pipeline.h b/deps/v8/src/interpreter/bytecode-pipeline.h index 1668bab9c15840..0b1a1f1bf3afa9 100644 --- a/deps/v8/src/interpreter/bytecode-pipeline.h +++ b/deps/v8/src/interpreter/bytecode-pipeline.h @@ -9,7 +9,7 @@ #include "src/interpreter/bytecode-register.h" #include "src/interpreter/bytecodes.h" #include "src/objects.h" -#include "src/zone-containers.h" +#include "src/zone/zone-containers.h" namespace v8 { namespace internal { @@ -47,7 +47,7 @@ class BytecodePipelineStage { // Flush the pipeline and generate a bytecode array. virtual Handle ToBytecodeArray( - Isolate* isolate, int fixed_register_count, int parameter_count, + Isolate* isolate, int register_count, int parameter_count, Handle handler_table) = 0; }; @@ -134,21 +134,69 @@ class BytecodeSourceInfo final { PositionType position_type_; int source_position_; - - DISALLOW_COPY_AND_ASSIGN(BytecodeSourceInfo); }; // A container for a generated bytecode, it's operands, and source information. // These must be allocated by a BytecodeNodeAllocator instance. class BytecodeNode final : ZoneObject { public: - explicit BytecodeNode(Bytecode bytecode = Bytecode::kIllegal); - BytecodeNode(Bytecode bytecode, uint32_t operand0); - BytecodeNode(Bytecode bytecode, uint32_t operand0, uint32_t operand1); - BytecodeNode(Bytecode bytecode, uint32_t operand0, uint32_t operand1, - uint32_t operand2); - BytecodeNode(Bytecode bytecode, uint32_t operand0, uint32_t operand1, - uint32_t operand2, uint32_t operand3); + INLINE(BytecodeNode(const Bytecode bytecode, + BytecodeSourceInfo* source_info = nullptr)) + : bytecode_(bytecode), + operand_count_(0), + operand_scale_(OperandScale::kSingle) { + DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), operand_count()); + AttachSourceInfo(source_info); + } + + INLINE(BytecodeNode(const Bytecode bytecode, uint32_t operand0, + BytecodeSourceInfo* source_info = nullptr)) + : bytecode_(bytecode), + operand_count_(1), + operand_scale_(OperandScale::kSingle) { + DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), operand_count()); + SetOperand(0, operand0); + AttachSourceInfo(source_info); + } + + INLINE(BytecodeNode(const Bytecode bytecode, uint32_t operand0, + uint32_t operand1, + BytecodeSourceInfo* source_info = nullptr)) + : bytecode_(bytecode), + operand_count_(2), + operand_scale_(OperandScale::kSingle) { + DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), operand_count()); + SetOperand(0, operand0); + SetOperand(1, operand1); + AttachSourceInfo(source_info); + } + + INLINE(BytecodeNode(const Bytecode bytecode, uint32_t operand0, + uint32_t operand1, uint32_t operand2, + BytecodeSourceInfo* source_info = nullptr)) + : bytecode_(bytecode), + operand_count_(3), + operand_scale_(OperandScale::kSingle) { + DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), operand_count()); + SetOperand(0, operand0); + SetOperand(1, operand1); + SetOperand(2, operand2); + AttachSourceInfo(source_info); + } + + INLINE(BytecodeNode(const Bytecode bytecode, uint32_t operand0, + uint32_t operand1, uint32_t operand2, uint32_t operand3, + BytecodeSourceInfo* source_info = nullptr)) + : bytecode_(bytecode), + operand_count_(4), + operand_scale_(OperandScale::kSingle) { + DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), operand_count()); + SetOperand(0, operand0); + SetOperand(1, operand1); + SetOperand(2, operand2); + SetOperand(3, operand3); + AttachSourceInfo(source_info); + } BytecodeNode(const BytecodeNode& other); BytecodeNode& operator=(const BytecodeNode& other); @@ -162,25 +210,33 @@ class BytecodeNode final : ZoneObject { void set_bytecode(Bytecode bytecode) { DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 0); bytecode_ = bytecode; + operand_count_ = 0; + operand_scale_ = OperandScale::kSingle; } void set_bytecode(Bytecode bytecode, uint32_t operand0) { DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 1); bytecode_ = bytecode; - operands_[0] = operand0; + operand_count_ = 1; + operand_scale_ = OperandScale::kSingle; + SetOperand(0, operand0); } void set_bytecode(Bytecode bytecode, uint32_t operand0, uint32_t operand1) { DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 2); bytecode_ = bytecode; - operands_[0] = operand0; - operands_[1] = operand1; + operand_count_ = 2; + operand_scale_ = OperandScale::kSingle; + SetOperand(0, operand0); + SetOperand(1, operand1); } void set_bytecode(Bytecode bytecode, uint32_t operand0, uint32_t operand1, uint32_t operand2) { DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), 3); bytecode_ = bytecode; - operands_[0] = operand0; - operands_[1] = operand1; - operands_[2] = operand2; + operand_count_ = 3; + operand_scale_ = OperandScale::kSingle; + SetOperand(0, operand0); + SetOperand(1, operand1); + SetOperand(2, operand2); } // Clone |other|. @@ -191,7 +247,36 @@ class BytecodeNode final : ZoneObject { // Transform to a node representing |new_bytecode| which has one // operand more than the current bytecode. - void Transform(Bytecode new_bytecode, uint32_t extra_operand); + void Transform(Bytecode new_bytecode, uint32_t extra_operand) { + DCHECK_EQ(Bytecodes::NumberOfOperands(new_bytecode), + Bytecodes::NumberOfOperands(bytecode()) + 1); + DCHECK(Bytecodes::NumberOfOperands(bytecode()) < 1 || + Bytecodes::GetOperandType(new_bytecode, 0) == + Bytecodes::GetOperandType(bytecode(), 0)); + DCHECK(Bytecodes::NumberOfOperands(bytecode()) < 2 || + Bytecodes::GetOperandType(new_bytecode, 1) == + Bytecodes::GetOperandType(bytecode(), 1)); + DCHECK(Bytecodes::NumberOfOperands(bytecode()) < 3 || + Bytecodes::GetOperandType(new_bytecode, 2) == + Bytecodes::GetOperandType(bytecode(), 2)); + DCHECK(Bytecodes::NumberOfOperands(bytecode()) < 4); + + bytecode_ = new_bytecode; + operand_count_++; + SetOperand(operand_count() - 1, extra_operand); + } + + // Updates the operand at |operand_index| to |operand|. + void UpdateOperand(int operand_index, uint32_t operand) { + DCHECK_LE(operand_index, Bytecodes::NumberOfOperands(bytecode())); + operands_[operand_index] = operand; + if ((Bytecodes::OperandIsScalableSignedByte(bytecode(), operand_index) && + Bytecodes::ScaleForSignedOperand(operand) != operand_scale_) || + (Bytecodes::OperandIsScalableUnsignedByte(bytecode(), operand_index) && + Bytecodes::ScaleForUnsignedOperand(operand) != operand_scale_)) { + UpdateScale(); + } + } Bytecode bytecode() const { return bytecode_; } @@ -199,22 +284,60 @@ class BytecodeNode final : ZoneObject { DCHECK_LT(i, operand_count()); return operands_[i]; } - uint32_t* operands() { return operands_; } const uint32_t* operands() const { return operands_; } - int operand_count() const { return Bytecodes::NumberOfOperands(bytecode_); } + int operand_count() const { return operand_count_; } + OperandScale operand_scale() const { return operand_scale_; } const BytecodeSourceInfo& source_info() const { return source_info_; } - BytecodeSourceInfo& source_info() { return source_info_; } + BytecodeSourceInfo* source_info_ptr() { return &source_info_; } bool operator==(const BytecodeNode& other) const; bool operator!=(const BytecodeNode& other) const { return !(*this == other); } private: - static const int kInvalidPosition = kMinInt; + INLINE(void AttachSourceInfo(BytecodeSourceInfo* source_info)) { + if (source_info && source_info->is_valid()) { + // Statement positions need to be emitted immediately. Expression + // positions can be pushed back until a bytecode is found that can + // throw (if expression position filtering is turned on). We only + // invalidate the existing source position information if it is used. + if (source_info->is_statement() || + !FLAG_ignition_filter_expression_positions || + !Bytecodes::IsWithoutExternalSideEffects(bytecode())) { + source_info_.Clone(*source_info); + source_info->set_invalid(); + } + } + } + + INLINE(void UpdateScaleForOperand(int operand_index, uint32_t operand)) { + if (Bytecodes::OperandIsScalableSignedByte(bytecode(), operand_index)) { + operand_scale_ = + std::max(operand_scale_, Bytecodes::ScaleForSignedOperand(operand)); + } else if (Bytecodes::OperandIsScalableUnsignedByte(bytecode(), + operand_index)) { + operand_scale_ = + std::max(operand_scale_, Bytecodes::ScaleForUnsignedOperand(operand)); + } + } + + INLINE(void SetOperand(int operand_index, uint32_t operand)) { + operands_[operand_index] = operand; + UpdateScaleForOperand(operand_index, operand); + } + + void UpdateScale() { + operand_scale_ = OperandScale::kSingle; + for (int i = 0; i < operand_count(); i++) { + UpdateScaleForOperand(i, operands_[i]); + } + } Bytecode bytecode_; uint32_t operands_[Bytecodes::kMaxOperands]; + int operand_count_; + OperandScale operand_scale_; BytecodeSourceInfo source_info_; }; diff --git a/deps/v8/src/interpreter/bytecode-register-allocator.cc b/deps/v8/src/interpreter/bytecode-register-allocator.cc deleted file mode 100644 index 10afcdc76d5572..00000000000000 --- a/deps/v8/src/interpreter/bytecode-register-allocator.cc +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2015 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "src/interpreter/bytecode-register-allocator.h" - -#include "src/interpreter/bytecode-array-builder.h" - -namespace v8 { -namespace internal { -namespace interpreter { - -TemporaryRegisterAllocator::TemporaryRegisterAllocator(Zone* zone, - int allocation_base) - : free_temporaries_(zone), - allocation_base_(allocation_base), - allocation_count_(0), - observer_(nullptr) {} - -Register TemporaryRegisterAllocator::first_temporary_register() const { - DCHECK(allocation_count() > 0); - return Register(allocation_base()); -} - -Register TemporaryRegisterAllocator::last_temporary_register() const { - DCHECK(allocation_count() > 0); - return Register(allocation_base() + allocation_count() - 1); -} - -void TemporaryRegisterAllocator::set_observer( - TemporaryRegisterObserver* observer) { - DCHECK(observer_ == nullptr); - observer_ = observer; -} - -int TemporaryRegisterAllocator::AllocateTemporaryRegister() { - allocation_count_ += 1; - return allocation_base() + allocation_count() - 1; -} - -int TemporaryRegisterAllocator::BorrowTemporaryRegister() { - if (free_temporaries_.empty()) { - return AllocateTemporaryRegister(); - } else { - auto pos = free_temporaries_.begin(); - int retval = *pos; - free_temporaries_.erase(pos); - return retval; - } -} - -int TemporaryRegisterAllocator::BorrowTemporaryRegisterNotInRange( - int start_index, int end_index) { - if (free_temporaries_.empty()) { - int next_allocation = allocation_base() + allocation_count(); - while (next_allocation >= start_index && next_allocation <= end_index) { - free_temporaries_.insert(AllocateTemporaryRegister()); - next_allocation += 1; - } - return AllocateTemporaryRegister(); - } - - ZoneSet::iterator index = free_temporaries_.lower_bound(start_index); - if (index == free_temporaries_.begin()) { - // If start_index is the first free register, check for a register - // greater than end_index. - index = free_temporaries_.upper_bound(end_index); - if (index == free_temporaries_.end()) { - return AllocateTemporaryRegister(); - } - } else { - // If there is a free register < start_index - index--; - } - - int retval = *index; - free_temporaries_.erase(index); - return retval; -} - -int TemporaryRegisterAllocator::PrepareForConsecutiveTemporaryRegisters( - size_t count) { - if (count == 0) { - return -1; - } - - // TODO(oth): replace use of set<> here for free_temporaries with a - // more efficient structure. And/or partition into two searches - - // one before the translation window and one after. - - // A run will require at least |count| free temporaries. - while (free_temporaries_.size() < count) { - free_temporaries_.insert(AllocateTemporaryRegister()); - } - - // Search within existing temporaries for a run. - auto start = free_temporaries_.begin(); - size_t run_length = 0; - for (auto run_end = start; run_end != free_temporaries_.end(); run_end++) { - int expected = *start + static_cast(run_length); - if (*run_end != expected) { - start = run_end; - run_length = 0; - } - if (++run_length == count) { - return *start; - } - } - - // Continue run if possible across existing last temporary. - if (allocation_count_ > 0 && (start == free_temporaries_.end() || - *start + static_cast(run_length) != - last_temporary_register().index() + 1)) { - run_length = 0; - } - - // Pad temporaries if extended run would cross translation boundary. - Register reg_first(*start); - Register reg_last(*start + static_cast(count) - 1); - - // Ensure enough registers for run. - while (run_length++ < count) { - free_temporaries_.insert(AllocateTemporaryRegister()); - } - - int run_start = - last_temporary_register().index() - static_cast(count) + 1; - return run_start; -} - -bool TemporaryRegisterAllocator::RegisterIsLive(Register reg) const { - if (allocation_count_ > 0) { - DCHECK(reg >= first_temporary_register() && - reg <= last_temporary_register()); - return free_temporaries_.find(reg.index()) == free_temporaries_.end(); - } else { - return false; - } -} - -void TemporaryRegisterAllocator::BorrowConsecutiveTemporaryRegister( - int reg_index) { - DCHECK(free_temporaries_.find(reg_index) != free_temporaries_.end()); - free_temporaries_.erase(reg_index); -} - -void TemporaryRegisterAllocator::ReturnTemporaryRegister(int reg_index) { - DCHECK(free_temporaries_.find(reg_index) == free_temporaries_.end()); - free_temporaries_.insert(reg_index); - if (observer_) { - observer_->TemporaryRegisterFreeEvent(Register(reg_index)); - } -} - -BytecodeRegisterAllocator::BytecodeRegisterAllocator( - Zone* zone, TemporaryRegisterAllocator* allocator) - : base_allocator_(allocator), - allocated_(zone), - next_consecutive_register_(-1), - next_consecutive_count_(-1) {} - -BytecodeRegisterAllocator::~BytecodeRegisterAllocator() { - for (auto i = allocated_.rbegin(); i != allocated_.rend(); i++) { - base_allocator()->ReturnTemporaryRegister(*i); - } - allocated_.clear(); -} - -Register BytecodeRegisterAllocator::NewRegister() { - int allocated = -1; - if (next_consecutive_count_ <= 0) { - allocated = base_allocator()->BorrowTemporaryRegister(); - } else { - allocated = base_allocator()->BorrowTemporaryRegisterNotInRange( - next_consecutive_register_, - next_consecutive_register_ + next_consecutive_count_ - 1); - } - allocated_.push_back(allocated); - return Register(allocated); -} - -bool BytecodeRegisterAllocator::RegisterIsAllocatedInThisScope( - Register reg) const { - for (auto i = allocated_.begin(); i != allocated_.end(); i++) { - if (*i == reg.index()) return true; - } - return false; -} - -void BytecodeRegisterAllocator::PrepareForConsecutiveAllocations(size_t count) { - if (static_cast(count) > next_consecutive_count_) { - next_consecutive_register_ = - base_allocator()->PrepareForConsecutiveTemporaryRegisters(count); - next_consecutive_count_ = static_cast(count); - } -} - -Register BytecodeRegisterAllocator::NextConsecutiveRegister() { - DCHECK_GE(next_consecutive_register_, 0); - DCHECK_GT(next_consecutive_count_, 0); - base_allocator()->BorrowConsecutiveTemporaryRegister( - next_consecutive_register_); - allocated_.push_back(next_consecutive_register_); - next_consecutive_count_--; - return Register(next_consecutive_register_++); -} - -} // namespace interpreter -} // namespace internal -} // namespace v8 diff --git a/deps/v8/src/interpreter/bytecode-register-allocator.h b/deps/v8/src/interpreter/bytecode-register-allocator.h index b8f737be793866..e9de4661d30fad 100644 --- a/deps/v8/src/interpreter/bytecode-register-allocator.h +++ b/deps/v8/src/interpreter/bytecode-register-allocator.h @@ -5,106 +5,76 @@ #ifndef V8_INTERPRETER_BYTECODE_REGISTER_ALLOCATOR_H_ #define V8_INTERPRETER_BYTECODE_REGISTER_ALLOCATOR_H_ +#include "src/interpreter/bytecode-register.h" #include "src/interpreter/bytecodes.h" -#include "src/zone-containers.h" +#include "src/zone/zone-containers.h" namespace v8 { namespace internal { namespace interpreter { -class BytecodeArrayBuilder; -class Register; -class TemporaryRegisterObserver; - -class TemporaryRegisterAllocator final { - public: - TemporaryRegisterAllocator(Zone* zone, int start_index); - - // Borrow a temporary register. - int BorrowTemporaryRegister(); - - // Borrow a temporary register from the register range outside of - // |start_index| to |end_index|. - int BorrowTemporaryRegisterNotInRange(int start_index, int end_index); - - // Return a temporary register when no longer used. - void ReturnTemporaryRegister(int reg_index); - - // Ensure a run of consecutive registers is available. Each register in - // the range should be borrowed with BorrowConsecutiveTemporaryRegister(). - // Returns the start index of the run. - int PrepareForConsecutiveTemporaryRegisters(size_t count); - - // Borrow a register from a range prepared with - // PrepareForConsecutiveTemporaryRegisters(). - void BorrowConsecutiveTemporaryRegister(int reg_index); - - // Returns true if |reg| is a temporary register and is currently - // borrowed. - bool RegisterIsLive(Register reg) const; - - // Returns the first register in the range of temporary registers. - Register first_temporary_register() const; - - // Returns the last register in the range of temporary registers. - Register last_temporary_register() const; - - // Returns the start index of temporary register allocations. - int allocation_base() const { return allocation_base_; } - - // Returns the number of temporary register allocations made. - int allocation_count() const { return allocation_count_; } - - // Sets an observer for temporary register events. - void set_observer(TemporaryRegisterObserver* observer); - - private: - // Allocate a temporary register. - int AllocateTemporaryRegister(); - - ZoneSet free_temporaries_; - int allocation_base_; - int allocation_count_; - TemporaryRegisterObserver* observer_; - - DISALLOW_COPY_AND_ASSIGN(TemporaryRegisterAllocator); -}; - -class TemporaryRegisterObserver { - public: - virtual ~TemporaryRegisterObserver() {} - virtual void TemporaryRegisterFreeEvent(Register reg) = 0; -}; - -// A class that allows the instantiator to allocate temporary registers that are -// cleaned up when scope is closed. +// A class that allows the allocation of contiguous temporary registers. class BytecodeRegisterAllocator final { public: - explicit BytecodeRegisterAllocator(Zone* zone, - TemporaryRegisterAllocator* allocator); - ~BytecodeRegisterAllocator(); - Register NewRegister(); - - // Ensure |count| consecutive allocations are available. - void PrepareForConsecutiveAllocations(size_t count); - - // Get the next consecutive allocation after calling - // PrepareForConsecutiveAllocations. - Register NextConsecutiveRegister(); - - // Returns true if |reg| is allocated in this allocator. - bool RegisterIsAllocatedInThisScope(Register reg) const; - - // Returns true if unused consecutive allocations remain. - bool HasConsecutiveAllocations() const { return next_consecutive_count_ > 0; } + // Enables observation of register allocation and free events. + class Observer { + public: + virtual ~Observer() {} + virtual void RegisterAllocateEvent(Register reg) = 0; + virtual void RegisterListAllocateEvent(RegisterList reg_list) = 0; + virtual void RegisterListFreeEvent(RegisterList reg_list) = 0; + }; + + explicit BytecodeRegisterAllocator(int start_index) + : next_register_index_(start_index), + max_register_count_(start_index), + observer_(nullptr) {} + ~BytecodeRegisterAllocator() {} + + // Returns a new register. + Register NewRegister() { + Register reg(next_register_index_++); + max_register_count_ = std::max(next_register_index_, max_register_count_); + if (observer_) { + observer_->RegisterAllocateEvent(reg); + } + return reg; + } + + // Returns a consecutive list of |count| new registers. + RegisterList NewRegisterList(int count) { + RegisterList reg_list(next_register_index_, count); + next_register_index_ += count; + max_register_count_ = std::max(next_register_index_, max_register_count_); + if (observer_) { + observer_->RegisterListAllocateEvent(reg_list); + } + return reg_list; + } + + // Release all registers above |register_index|. + void ReleaseRegisters(int register_index) { + if (observer_) { + observer_->RegisterListFreeEvent( + RegisterList(register_index, next_register_index_ - register_index)); + } + next_register_index_ = register_index; + } + + // Returns true if the register |reg| is a live register. + bool RegisterIsLive(Register reg) const { + return reg.index() < next_register_index_; + } + + void set_observer(Observer* observer) { observer_ = observer; } + + int next_register_index() const { return next_register_index_; } + int maximum_register_count() const { return max_register_count_; } private: - TemporaryRegisterAllocator* base_allocator() const { return base_allocator_; } - - TemporaryRegisterAllocator* base_allocator_; - ZoneVector allocated_; - int next_consecutive_register_; - int next_consecutive_count_; + int next_register_index_; + int max_register_count_; + Observer* observer_; DISALLOW_COPY_AND_ASSIGN(BytecodeRegisterAllocator); }; diff --git a/deps/v8/src/interpreter/bytecode-register-optimizer.cc b/deps/v8/src/interpreter/bytecode-register-optimizer.cc index d28f215de85663..acbe0ba5a1235b 100644 --- a/deps/v8/src/interpreter/bytecode-register-optimizer.cc +++ b/deps/v8/src/interpreter/bytecode-register-optimizer.cc @@ -15,10 +15,12 @@ const uint32_t BytecodeRegisterOptimizer::kInvalidEquivalenceId; // register is materialized in the bytecode stream. class BytecodeRegisterOptimizer::RegisterInfo final : public ZoneObject { public: - RegisterInfo(Register reg, uint32_t equivalence_id, bool materialized) + RegisterInfo(Register reg, uint32_t equivalence_id, bool materialized, + bool allocated) : register_(reg), equivalence_id_(equivalence_id), materialized_(materialized), + allocated_(allocated), next_(this), prev_(this) {} @@ -48,12 +50,17 @@ class BytecodeRegisterOptimizer::RegisterInfo final : public ZoneObject { // exists. RegisterInfo* GetEquivalentToMaterialize(); + // Marks all temporary registers of the equivalence set as unmaterialized. + void MarkTemporariesAsUnmaterialized(Register temporary_base); + // Get an equivalent register. Returns this if none exists. RegisterInfo* GetEquivalent(); Register register_value() const { return register_; } bool materialized() const { return materialized_; } void set_materialized(bool materialized) { materialized_ = materialized; } + bool allocated() const { return allocated_; } + void set_allocated(bool allocated) { allocated_ = allocated; } void set_equivalence_id(uint32_t equivalence_id) { equivalence_id_ = equivalence_id; } @@ -63,6 +70,7 @@ class BytecodeRegisterOptimizer::RegisterInfo final : public ZoneObject { Register register_; uint32_t equivalence_id_; bool materialized_; + bool allocated_; // Equivalence set pointers. RegisterInfo* next_; @@ -155,8 +163,9 @@ BytecodeRegisterOptimizer::RegisterInfo::GetEquivalentToMaterialize() { if (visitor->materialized()) { return nullptr; } - if (best_info == nullptr || - visitor->register_value() < best_info->register_value()) { + if (visitor->allocated() && + (best_info == nullptr || + visitor->register_value() < best_info->register_value())) { best_info = visitor; } visitor = visitor->next_; @@ -164,16 +173,31 @@ BytecodeRegisterOptimizer::RegisterInfo::GetEquivalentToMaterialize() { return best_info; } +void BytecodeRegisterOptimizer::RegisterInfo::MarkTemporariesAsUnmaterialized( + Register temporary_base) { + DCHECK(this->register_value() < temporary_base); + DCHECK(this->materialized()); + RegisterInfo* visitor = this->next_; + while (visitor != this) { + if (visitor->register_value() >= temporary_base) { + visitor->set_materialized(false); + } + visitor = visitor->next_; + } +} + BytecodeRegisterOptimizer::RegisterInfo* BytecodeRegisterOptimizer::RegisterInfo::GetEquivalent() { return next_; } BytecodeRegisterOptimizer::BytecodeRegisterOptimizer( - Zone* zone, TemporaryRegisterAllocator* register_allocator, - int parameter_count, BytecodePipelineStage* next_stage) + Zone* zone, BytecodeRegisterAllocator* register_allocator, + int fixed_registers_count, int parameter_count, + BytecodePipelineStage* next_stage) : accumulator_(Register::virtual_accumulator()), - temporary_base_(register_allocator->allocation_base()), + temporary_base_(fixed_registers_count), + max_register_index_(fixed_registers_count - 1), register_info_table_(zone), equivalence_id_(0), next_stage_(next_stage), @@ -198,7 +222,7 @@ BytecodeRegisterOptimizer::BytecodeRegisterOptimizer( static_cast(temporary_base_.index())); for (size_t i = 0; i < register_info_table_.size(); ++i) { register_info_table_[i] = new (zone) RegisterInfo( - RegisterFromRegisterInfoTableIndex(i), NextEquivalenceId(), true); + RegisterFromRegisterInfoTableIndex(i), NextEquivalenceId(), true, true); DCHECK_EQ(register_info_table_[i]->register_value().index(), RegisterFromRegisterInfoTableIndex(i).index()); } @@ -208,15 +232,17 @@ BytecodeRegisterOptimizer::BytecodeRegisterOptimizer( // override Handle BytecodeRegisterOptimizer::ToBytecodeArray( - Isolate* isolate, int fixed_register_count, int parameter_count, + Isolate* isolate, int register_count, int parameter_count, Handle handler_table) { FlushState(); - return next_stage_->ToBytecodeArray(isolate, fixed_register_count, + return next_stage_->ToBytecodeArray(isolate, max_register_index_ + 1, parameter_count, handler_table); } // override void BytecodeRegisterOptimizer::Write(BytecodeNode* node) { + // Jumps are handled by WriteJump. + DCHECK(!Bytecodes::IsJump(node->bytecode())); // // Transfers with observable registers as the destination will be // immediately materialized so the source position information will @@ -245,18 +271,16 @@ void BytecodeRegisterOptimizer::Write(BytecodeNode* node) { break; } - if (Bytecodes::IsJump(node->bytecode()) || - node->bytecode() == Bytecode::kDebugger || + if (node->bytecode() == Bytecode::kDebugger || node->bytecode() == Bytecode::kSuspendGenerator) { // All state must be flushed before emitting - // - a jump (due to how bytecode offsets for jumps are evaluated), // - a call to the debugger (as it can manipulate locals and parameters), // - a generator suspend (as this involves saving all registers). FlushState(); } PrepareOperands(node); - WriteToNextStage(node); + next_stage_->Write(node); } // override @@ -295,7 +319,7 @@ void BytecodeRegisterOptimizer::FlushState() { // own equivalence set. RegisterInfo* equivalent; while ((equivalent = reg_info->GetEquivalent()) != reg_info) { - if (!equivalent->materialized()) { + if (equivalent->allocated() && !equivalent->materialized()) { OutputRegisterTransfer(reg_info, equivalent); } equivalent->MoveToNewEquivalenceSet(NextEquivalenceId(), true); @@ -306,38 +330,29 @@ void BytecodeRegisterOptimizer::FlushState() { flush_required_ = false; } -void BytecodeRegisterOptimizer::WriteToNextStage(BytecodeNode* node) const { - next_stage_->Write(node); -} - -void BytecodeRegisterOptimizer::WriteToNextStage( - BytecodeNode* node, const BytecodeSourceInfo& source_info) const { - if (source_info.is_valid()) { - node->source_info().Clone(source_info); - } - next_stage_->Write(node); -} - void BytecodeRegisterOptimizer::OutputRegisterTransfer( RegisterInfo* input_info, RegisterInfo* output_info, - const BytecodeSourceInfo& source_info) { + BytecodeSourceInfo* source_info) { Register input = input_info->register_value(); Register output = output_info->register_value(); DCHECK_NE(input.index(), output.index()); if (input == accumulator_) { uint32_t operand = static_cast(output.ToOperand()); - BytecodeNode node(Bytecode::kStar, operand); - WriteToNextStage(&node, source_info); + BytecodeNode node(Bytecode::kStar, operand, source_info); + next_stage_->Write(&node); } else if (output == accumulator_) { uint32_t operand = static_cast(input.ToOperand()); - BytecodeNode node(Bytecode::kLdar, operand); - WriteToNextStage(&node, source_info); + BytecodeNode node(Bytecode::kLdar, operand, source_info); + next_stage_->Write(&node); } else { uint32_t operand0 = static_cast(input.ToOperand()); uint32_t operand1 = static_cast(output.ToOperand()); - BytecodeNode node(Bytecode::kMov, operand0, operand1); - WriteToNextStage(&node, source_info); + BytecodeNode node(Bytecode::kMov, operand0, operand1, source_info); + next_stage_->Write(&node); + } + if (output != accumulator_) { + max_register_index_ = std::max(max_register_index_, output.index()); } output_info->set_materialized(true); } @@ -389,7 +404,7 @@ void BytecodeRegisterOptimizer::AddToEquivalenceSet( void BytecodeRegisterOptimizer::RegisterTransfer( RegisterInfo* input_info, RegisterInfo* output_info, - const BytecodeSourceInfo& source_info) { + BytecodeSourceInfo* source_info) { // Materialize an alternate in the equivalence set that // |output_info| is leaving. if (output_info->materialized()) { @@ -408,42 +423,48 @@ void BytecodeRegisterOptimizer::RegisterTransfer( output_info->set_materialized(false); RegisterInfo* materialized_info = input_info->GetMaterializedEquivalent(); OutputRegisterTransfer(materialized_info, output_info, source_info); - } else if (source_info.is_valid()) { + } else if (source_info->is_valid()) { // Emit a placeholder nop to maintain source position info. EmitNopForSourceInfo(source_info); } + + bool input_is_observable = RegisterIsObservable(input_info->register_value()); + if (input_is_observable) { + // If input is observable by the debugger, mark all other temporaries + // registers as unmaterialized so that this register is used in preference. + input_info->MarkTemporariesAsUnmaterialized(temporary_base_); + } } void BytecodeRegisterOptimizer::EmitNopForSourceInfo( - const BytecodeSourceInfo& source_info) const { - DCHECK(source_info.is_valid()); - BytecodeNode nop(Bytecode::kNop); - nop.source_info().Clone(source_info); - WriteToNextStage(&nop); + BytecodeSourceInfo* source_info) const { + DCHECK(source_info->is_valid()); + BytecodeNode nop(Bytecode::kNop, source_info); + next_stage_->Write(&nop); } -void BytecodeRegisterOptimizer::DoLdar(const BytecodeNode* const node) { +void BytecodeRegisterOptimizer::DoLdar(BytecodeNode* node) { Register input = GetRegisterInputOperand( 0, node->bytecode(), node->operands(), node->operand_count()); RegisterInfo* input_info = GetRegisterInfo(input); - RegisterTransfer(input_info, accumulator_info_, node->source_info()); + RegisterTransfer(input_info, accumulator_info_, node->source_info_ptr()); } -void BytecodeRegisterOptimizer::DoMov(const BytecodeNode* const node) { +void BytecodeRegisterOptimizer::DoMov(BytecodeNode* node) { Register input = GetRegisterInputOperand( 0, node->bytecode(), node->operands(), node->operand_count()); RegisterInfo* input_info = GetRegisterInfo(input); Register output = GetRegisterOutputOperand( 1, node->bytecode(), node->operands(), node->operand_count()); - RegisterInfo* output_info = GetOrCreateRegisterInfo(output); - RegisterTransfer(input_info, output_info, node->source_info()); + RegisterInfo* output_info = GetRegisterInfo(output); + RegisterTransfer(input_info, output_info, node->source_info_ptr()); } -void BytecodeRegisterOptimizer::DoStar(const BytecodeNode* const node) { +void BytecodeRegisterOptimizer::DoStar(BytecodeNode* node) { Register output = GetRegisterOutputOperand( 0, node->bytecode(), node->operands(), node->operand_count()); - RegisterInfo* output_info = GetOrCreateRegisterInfo(output); - RegisterTransfer(accumulator_info_, output_info, node->source_info()); + RegisterInfo* output_info = GetRegisterInfo(output); + RegisterTransfer(accumulator_info_, output_info, node->source_info_ptr()); } void BytecodeRegisterOptimizer::PrepareRegisterOutputOperand( @@ -451,6 +472,8 @@ void BytecodeRegisterOptimizer::PrepareRegisterOutputOperand( if (reg_info->materialized()) { CreateMaterializedEquivalent(reg_info); } + max_register_index_ = + std::max(max_register_index_, reg_info->register_value().index()); reg_info->MoveToNewEquivalenceSet(NextEquivalenceId(), true); } @@ -458,7 +481,7 @@ void BytecodeRegisterOptimizer::PrepareRegisterRangeOutputOperand( Register start, int count) { for (int i = 0; i < count; ++i) { Register reg(start.index() + i); - RegisterInfo* reg_info = GetOrCreateRegisterInfo(reg); + RegisterInfo* reg_info = GetRegisterInfo(reg); PrepareRegisterOutputOperand(reg_info); } } @@ -468,7 +491,7 @@ Register BytecodeRegisterOptimizer::GetEquivalentRegisterForInputOperand( // For a temporary register, RegInfo state may need be created. For // locals and parameters, the RegInfo state is created in the // BytecodeRegisterOptimizer constructor. - RegisterInfo* reg_info = GetOrCreateRegisterInfo(reg); + RegisterInfo* reg_info = GetRegisterInfo(reg); if (reg_info->materialized()) { return reg; } else { @@ -481,8 +504,8 @@ Register BytecodeRegisterOptimizer::GetEquivalentRegisterForInputOperand( void BytecodeRegisterOptimizer::PrepareRegisterInputOperand( BytecodeNode* const node, Register reg, int operand_index) { Register equivalent = GetEquivalentRegisterForInputOperand(reg); - node->operands()[operand_index] = - static_cast(equivalent.ToOperand()); + node->UpdateOperand(operand_index, + static_cast(equivalent.ToOperand())); } void BytecodeRegisterOptimizer::PrepareRegisterRangeInputOperand(Register start, @@ -510,9 +533,9 @@ void BytecodeRegisterOptimizer::PrepareRegisterOperands( Bytecodes::GetOperandTypes(node->bytecode()); for (int i = 0; i < operand_count; ++i) { int count; - // operand_types is terminated by OperandType::kNone so this does not - // go out of bounds. - if (operand_types[i + 1] == OperandType::kRegCount) { + if (operand_types[i] == OperandType::kRegList) { + DCHECK_LT(i, operand_count - 1); + DCHECK(operand_types[i + 1] == OperandType::kRegCount); count = static_cast(operands[i + 1]); } else { count = Bytecodes::GetNumberOfRegistersRepresentedBy(operand_types[i]); @@ -577,8 +600,8 @@ Register BytecodeRegisterOptimizer::GetRegisterOutputOperand( BytecodeRegisterOptimizer::RegisterInfo* BytecodeRegisterOptimizer::GetRegisterInfo(Register reg) { size_t index = GetRegisterInfoTableIndex(reg); - return (index < register_info_table_.size()) ? register_info_table_[index] - : nullptr; + DCHECK_LT(index, register_info_table_.size()); + return register_info_table_[index]; } BytecodeRegisterOptimizer::RegisterInfo* @@ -599,26 +622,37 @@ BytecodeRegisterOptimizer::NewRegisterInfo(Register reg) { void BytecodeRegisterOptimizer::GrowRegisterMap(Register reg) { DCHECK(RegisterIsTemporary(reg)); size_t index = GetRegisterInfoTableIndex(reg); - DCHECK_GE(index, register_info_table_.size()); - size_t new_size = index + 1; - size_t old_size = register_info_table_.size(); - register_info_table_.resize(new_size); - for (size_t i = old_size; i < new_size; ++i) { - register_info_table_[i] = new (zone()) RegisterInfo( - RegisterFromRegisterInfoTableIndex(i), NextEquivalenceId(), false); + if (index >= register_info_table_.size()) { + size_t new_size = index + 1; + size_t old_size = register_info_table_.size(); + register_info_table_.resize(new_size); + for (size_t i = old_size; i < new_size; ++i) { + register_info_table_[i] = + new (zone()) RegisterInfo(RegisterFromRegisterInfoTableIndex(i), + NextEquivalenceId(), false, false); + } } } -void BytecodeRegisterOptimizer::TemporaryRegisterFreeEvent(Register reg) { - RegisterInfo* info = GetRegisterInfo(reg); - if (info != nullptr) { - // If register is materialized and part of equivalence set, make - // sure another member of the set holds the value before the - // temporary register is removed. - if (info->materialized()) { - CreateMaterializedEquivalent(info); +void BytecodeRegisterOptimizer::RegisterAllocateEvent(Register reg) { + GetOrCreateRegisterInfo(reg)->set_allocated(true); +} + +void BytecodeRegisterOptimizer::RegisterListAllocateEvent( + RegisterList reg_list) { + if (reg_list.register_count() != 0) { + int first_index = reg_list.first_register().index(); + GrowRegisterMap(Register(first_index + reg_list.register_count() - 1)); + for (int i = 0; i < reg_list.register_count(); i++) { + GetRegisterInfo(Register(first_index + i))->set_allocated(true); } - info->MoveToNewEquivalenceSet(kInvalidEquivalenceId, false); + } +} + +void BytecodeRegisterOptimizer::RegisterListFreeEvent(RegisterList reg_list) { + int first_index = reg_list.first_register().index(); + for (int i = 0; i < reg_list.register_count(); i++) { + GetRegisterInfo(Register(first_index + i))->set_allocated(false); } } diff --git a/deps/v8/src/interpreter/bytecode-register-optimizer.h b/deps/v8/src/interpreter/bytecode-register-optimizer.h index fb087b527a84b1..eda22e5f4d91ae 100644 --- a/deps/v8/src/interpreter/bytecode-register-optimizer.h +++ b/deps/v8/src/interpreter/bytecode-register-optimizer.h @@ -15,13 +15,14 @@ namespace interpreter { // registers. The bytecode generator uses temporary registers // liberally for correctness and convenience and this stage removes // transfers that are not required and preserves correctness. -class BytecodeRegisterOptimizer final : public BytecodePipelineStage, - public TemporaryRegisterObserver, - public ZoneObject { +class BytecodeRegisterOptimizer final + : public BytecodePipelineStage, + public BytecodeRegisterAllocator::Observer, + public ZoneObject { public: BytecodeRegisterOptimizer(Zone* zone, - TemporaryRegisterAllocator* register_allocator, - int parameter_count, + BytecodeRegisterAllocator* register_allocator, + int fixed_registers_count, int parameter_count, BytecodePipelineStage* next_stage); virtual ~BytecodeRegisterOptimizer() {} @@ -31,7 +32,7 @@ class BytecodeRegisterOptimizer final : public BytecodePipelineStage, void BindLabel(BytecodeLabel* label) override; void BindLabel(const BytecodeLabel& target, BytecodeLabel* label) override; Handle ToBytecodeArray( - Isolate* isolate, int fixed_register_count, int parameter_count, + Isolate* isolate, int register_count, int parameter_count, Handle handler_table) override; private: @@ -39,34 +40,32 @@ class BytecodeRegisterOptimizer final : public BytecodePipelineStage, class RegisterInfo; - // TemporaryRegisterObserver interface. - void TemporaryRegisterFreeEvent(Register reg) override; + // BytecodeRegisterAllocator::Observer interface. + void RegisterAllocateEvent(Register reg) override; + void RegisterListAllocateEvent(RegisterList reg_list) override; + void RegisterListFreeEvent(RegisterList reg) override; // Helpers for BytecodePipelineStage interface. void FlushState(); - void WriteToNextStage(BytecodeNode* node) const; - void WriteToNextStage(BytecodeNode* node, - const BytecodeSourceInfo& output_info) const; // Update internal state for register transfer from |input| to // |output| using |source_info| as source position information if // any bytecodes are emitted due to transfer. void RegisterTransfer(RegisterInfo* input, RegisterInfo* output, - const BytecodeSourceInfo& source_info); + BytecodeSourceInfo* source_info); // Emit a register transfer bytecode from |input| to |output|. - void OutputRegisterTransfer( - RegisterInfo* input, RegisterInfo* output, - const BytecodeSourceInfo& source_info = BytecodeSourceInfo()); + void OutputRegisterTransfer(RegisterInfo* input, RegisterInfo* output, + BytecodeSourceInfo* source_info = nullptr); // Emits a Nop to preserve source position information in the // bytecode pipeline. - void EmitNopForSourceInfo(const BytecodeSourceInfo& source_info) const; + void EmitNopForSourceInfo(BytecodeSourceInfo* source_info) const; // Handlers for bytecode nodes for register to register transfers. - void DoLdar(const BytecodeNode* const node); - void DoMov(const BytecodeNode* const node); - void DoStar(const BytecodeNode* const node); + void DoLdar(BytecodeNode* node); + void DoMov(BytecodeNode* node); + void DoStar(BytecodeNode* node); // Operand processing methods for bytecodes other than those // performing register to register transfers. @@ -133,6 +132,7 @@ class BytecodeRegisterOptimizer final : public BytecodePipelineStage, const Register accumulator_; RegisterInfo* accumulator_info_; const Register temporary_base_; + int max_register_index_; // Direct mapping to register info. ZoneVector register_info_table_; diff --git a/deps/v8/src/interpreter/bytecode-register.cc b/deps/v8/src/interpreter/bytecode-register.cc index 31e3b908527e22..1ce512b0e062fc 100644 --- a/deps/v8/src/interpreter/bytecode-register.cc +++ b/deps/v8/src/interpreter/bytecode-register.cc @@ -121,7 +121,7 @@ bool Register::AreContiguous(Register reg1, Register reg2, Register reg3, return true; } -std::string Register::ToString(int parameter_count) { +std::string Register::ToString(int parameter_count) const { if (is_current_context()) { return std::string(""); } else if (is_function_closure()) { diff --git a/deps/v8/src/interpreter/bytecode-register.h b/deps/v8/src/interpreter/bytecode-register.h index b698da6a74b3b0..d698d4049d55ea 100644 --- a/deps/v8/src/interpreter/bytecode-register.h +++ b/deps/v8/src/interpreter/bytecode-register.h @@ -66,7 +66,7 @@ class Register final { Register reg4 = Register(), Register reg5 = Register()); - std::string ToString(int parameter_count); + std::string ToString(int parameter_count) const; bool operator==(const Register& other) const { return index() == other.index(); @@ -98,6 +98,40 @@ class Register final { int index_; }; +class RegisterList { + public: + RegisterList() : first_reg_index_(Register().index()), register_count_(0) {} + RegisterList(int first_reg_index, int register_count) + : first_reg_index_(first_reg_index), register_count_(register_count) {} + + // Returns a new RegisterList which is a truncated version of this list, with + // |count| registers. + const RegisterList Truncate(int new_count) { + DCHECK_GE(new_count, 0); + DCHECK_LT(new_count, register_count_); + return RegisterList(first_reg_index_, new_count); + } + + const Register operator[](size_t i) const { + DCHECK_LT(static_cast(i), register_count_); + return Register(first_reg_index_ + static_cast(i)); + } + + const Register first_register() const { + return (register_count() == 0) ? Register(0) : (*this)[0]; + } + + const Register last_register() const { + return (register_count() == 0) ? Register(0) : (*this)[register_count_ - 1]; + } + + int register_count() const { return register_count_; } + + private: + int first_reg_index_; + int register_count_; +}; + } // namespace interpreter } // namespace internal } // namespace v8 diff --git a/deps/v8/src/interpreter/bytecode-traits.h b/deps/v8/src/interpreter/bytecode-traits.h index 672a687faf0f7c..f71598cbef9480 100644 --- a/deps/v8/src/interpreter/bytecode-traits.h +++ b/deps/v8/src/interpreter/bytecode-traits.h @@ -5,7 +5,7 @@ #ifndef V8_INTERPRETER_BYTECODE_TRAITS_H_ #define V8_INTERPRETER_BYTECODE_TRAITS_H_ -#include "src/interpreter/bytecodes.h" +#include "src/interpreter/bytecode-operands.h" namespace v8 { namespace internal { @@ -65,208 +65,88 @@ struct OperandScaler { static const OperandSize kOperandSize = static_cast(kSize); }; -template -struct RegisterOperandTraits { - static const int kIsRegisterOperand = 0; +template +struct SumHelper; +template +struct SumHelper { + static const int kValue = value; }; - -#define DECLARE_REGISTER_OPERAND(Name, _) \ - template <> \ - struct RegisterOperandTraits { \ - static const int kIsRegisterOperand = 1; \ - }; -REGISTER_OPERAND_TYPE_LIST(DECLARE_REGISTER_OPERAND) -#undef DECLARE_REGISTER_OPERAND - -template -struct BytecodeTraits {}; - -template -struct BytecodeTraits { - static const OperandType* GetOperandTypes() { - static const OperandType operand_types[] = {operand_0, operand_1, operand_2, - operand_3, OperandType::kNone}; - return operand_types; - } - - static const OperandTypeInfo* GetOperandTypeInfos() { - static const OperandTypeInfo operand_type_infos[] = { - OperandTraits::kOperandTypeInfo, - OperandTraits::kOperandTypeInfo, - OperandTraits::kOperandTypeInfo, - OperandTraits::kOperandTypeInfo, OperandTypeInfo::kNone}; - return operand_type_infos; - } - - template - static inline bool HasAnyOperandsOfType() { - return operand_0 == ot || operand_1 == ot || operand_2 == ot || - operand_3 == ot; - } - - static inline bool IsScalable() { - return (OperandTraits::TypeInfoTraits::kIsScalable | - OperandTraits::TypeInfoTraits::kIsScalable | - OperandTraits::TypeInfoTraits::kIsScalable | - OperandTraits::TypeInfoTraits::kIsScalable); - } - - static const AccumulatorUse kAccumulatorUse = accumulator_use; - static const int kOperandCount = 4; - static const int kRegisterOperandCount = - RegisterOperandTraits::kIsRegisterOperand + - RegisterOperandTraits::kIsRegisterOperand + - RegisterOperandTraits::kIsRegisterOperand + - RegisterOperandTraits::kIsRegisterOperand; +template +struct SumHelper { + static const int kValue = value + SumHelper::kValue; }; -template -struct BytecodeTraits { - static const OperandType* GetOperandTypes() { - static const OperandType operand_types[] = {operand_0, operand_1, operand_2, - OperandType::kNone}; - return operand_types; - } - - static const OperandTypeInfo* GetOperandTypeInfos() { - static const OperandTypeInfo operand_type_infos[] = { - OperandTraits::kOperandTypeInfo, - OperandTraits::kOperandTypeInfo, - OperandTraits::kOperandTypeInfo, OperandTypeInfo::kNone}; - return operand_type_infos; - } - - template - static inline bool HasAnyOperandsOfType() { - return operand_0 == ot || operand_1 == ot || operand_2 == ot; - } - - static inline bool IsScalable() { - return (OperandTraits::TypeInfoTraits::kIsScalable | - OperandTraits::TypeInfoTraits::kIsScalable | - OperandTraits::TypeInfoTraits::kIsScalable); - } - - static const AccumulatorUse kAccumulatorUse = accumulator_use; - static const int kOperandCount = 3; - static const int kRegisterOperandCount = - RegisterOperandTraits::kIsRegisterOperand + - RegisterOperandTraits::kIsRegisterOperand + - RegisterOperandTraits::kIsRegisterOperand; -}; - -template -struct BytecodeTraits { - static const OperandType* GetOperandTypes() { - static const OperandType operand_types[] = {operand_0, operand_1, - OperandType::kNone}; - return operand_types; - } - - static const OperandTypeInfo* GetOperandTypeInfos() { - static const OperandTypeInfo operand_type_infos[] = { - OperandTraits::kOperandTypeInfo, - OperandTraits::kOperandTypeInfo, OperandTypeInfo::kNone}; - return operand_type_infos; - } - - template - static inline bool HasAnyOperandsOfType() { - return operand_0 == ot || operand_1 == ot; - } - - static inline bool IsScalable() { - return (OperandTraits::TypeInfoTraits::kIsScalable | - OperandTraits::TypeInfoTraits::kIsScalable); - } - +template +struct BytecodeTraits { + static const OperandType kOperandTypes[]; + static const OperandTypeInfo kOperandTypeInfos[]; + static const OperandSize kSingleScaleOperandSizes[]; + static const OperandSize kDoubleScaleOperandSizes[]; + static const OperandSize kQuadrupleScaleOperandSizes[]; + static const int kSingleScaleSize = SumHelper< + 1, OperandScaler::kSize...>::kValue; + static const int kDoubleScaleSize = SumHelper< + 1, OperandScaler::kSize...>::kValue; + static const int kQuadrupleScaleSize = SumHelper< + 1, OperandScaler::kSize...>::kValue; static const AccumulatorUse kAccumulatorUse = accumulator_use; - static const int kOperandCount = 2; - static const int kRegisterOperandCount = - RegisterOperandTraits::kIsRegisterOperand + - RegisterOperandTraits::kIsRegisterOperand; + static const int kOperandCount = sizeof...(operands); }; -template -struct BytecodeTraits { - static const OperandType* GetOperandTypes() { - static const OperandType operand_types[] = {operand_0, OperandType::kNone}; - return operand_types; - } - - static const OperandTypeInfo* GetOperandTypeInfos() { - static const OperandTypeInfo operand_type_infos[] = { - OperandTraits::kOperandTypeInfo, OperandTypeInfo::kNone}; - return operand_type_infos; - } - - template - static inline bool HasAnyOperandsOfType() { - return operand_0 == ot; - } - - static inline bool IsScalable() { - return OperandTraits::TypeInfoTraits::kIsScalable; - } - - static const AccumulatorUse kAccumulatorUse = accumulator_use; - static const int kOperandCount = 1; - static const int kRegisterOperandCount = - RegisterOperandTraits::kIsRegisterOperand; -}; +template +STATIC_CONST_MEMBER_DEFINITION const OperandType + BytecodeTraits::kOperandTypes[] = { + operands...}; +template +STATIC_CONST_MEMBER_DEFINITION const OperandTypeInfo + BytecodeTraits::kOperandTypeInfos[] = { + OperandTraits::kOperandTypeInfo...}; +template +STATIC_CONST_MEMBER_DEFINITION const OperandSize + BytecodeTraits::kSingleScaleOperandSizes[] = { + OperandScaler::kOperandSize...}; +template +STATIC_CONST_MEMBER_DEFINITION const OperandSize + BytecodeTraits::kDoubleScaleOperandSizes[] = { + OperandScaler::kOperandSize...}; +template +STATIC_CONST_MEMBER_DEFINITION const OperandSize BytecodeTraits< + accumulator_use, operands...>::kQuadrupleScaleOperandSizes[] = { + OperandScaler::kOperandSize...}; template struct BytecodeTraits { - static const OperandType* GetOperandTypes() { - static const OperandType operand_types[] = {OperandType::kNone}; - return operand_types; - } - - static const OperandTypeInfo* GetOperandTypeInfos() { - static const OperandTypeInfo operand_type_infos[] = { - OperandTypeInfo::kNone}; - return operand_type_infos; - } - - template - static inline bool HasAnyOperandsOfType() { - return false; - } - - static inline bool IsScalable() { return false; } - + static const OperandType kOperandTypes[]; + static const OperandTypeInfo kOperandTypeInfos[]; + static const OperandSize kSingleScaleOperandSizes[]; + static const OperandSize kDoubleScaleOperandSizes[]; + static const OperandSize kQuadrupleScaleOperandSizes[]; + static const int kSingleScaleSize = 1; + static const int kDoubleScaleSize = 1; + static const int kQuadrupleScaleSize = 1; static const AccumulatorUse kAccumulatorUse = accumulator_use; static const int kOperandCount = 0; - static const int kRegisterOperandCount = 0; }; -static OperandSize ScaledOperandSize(OperandType operand_type, - OperandScale operand_scale) { - STATIC_ASSERT(static_cast(OperandScale::kQuadruple) == 4 && - OperandScale::kLast == OperandScale::kQuadruple); - int index = static_cast(operand_scale) >> 1; - switch (operand_type) { -#define CASE(Name, TypeInfo) \ - case OperandType::k##Name: { \ - static const OperandSize kOperandSizes[] = { \ - OperandScaler::kOperandSize, \ - OperandScaler::kOperandSize, \ - OperandScaler::kOperandSize}; \ - return kOperandSizes[index]; \ - } - OPERAND_TYPE_LIST(CASE) -#undef CASE - } - UNREACHABLE(); - return OperandSize::kNone; -} +template +STATIC_CONST_MEMBER_DEFINITION const OperandType + BytecodeTraits::kOperandTypes[] = {OperandType::kNone}; +template +STATIC_CONST_MEMBER_DEFINITION const OperandTypeInfo + BytecodeTraits::kOperandTypeInfos[] = { + OperandTypeInfo::kNone}; +template +STATIC_CONST_MEMBER_DEFINITION const OperandSize + BytecodeTraits::kSingleScaleOperandSizes[] = { + OperandSize::kNone}; +template +STATIC_CONST_MEMBER_DEFINITION const OperandSize + BytecodeTraits::kDoubleScaleOperandSizes[] = { + OperandSize::kNone}; +template +STATIC_CONST_MEMBER_DEFINITION const OperandSize + BytecodeTraits::kQuadrupleScaleOperandSizes[] = { + OperandSize::kNone}; } // namespace interpreter } // namespace internal diff --git a/deps/v8/src/interpreter/bytecodes.cc b/deps/v8/src/interpreter/bytecodes.cc index 09bcd22b928ba5..c58f4685a2d3d0 100644 --- a/deps/v8/src/interpreter/bytecodes.cc +++ b/deps/v8/src/interpreter/bytecodes.cc @@ -7,14 +7,55 @@ #include #include "src/base/bits.h" -#include "src/globals.h" #include "src/interpreter/bytecode-traits.h" namespace v8 { namespace internal { namespace interpreter { -STATIC_CONST_MEMBER_DEFINITION const int Bytecodes::kMaxOperands; +// clang-format off +const OperandType* const Bytecodes::kOperandTypes[] = { +#define ENTRY(Name, ...) BytecodeTraits<__VA_ARGS__>::kOperandTypes, + BYTECODE_LIST(ENTRY) +#undef ENTRY +}; + +const OperandTypeInfo* const Bytecodes::kOperandTypeInfos[] = { +#define ENTRY(Name, ...) BytecodeTraits<__VA_ARGS__>::kOperandTypeInfos, + BYTECODE_LIST(ENTRY) +#undef ENTRY +}; + +const int Bytecodes::kOperandCount[] = { +#define ENTRY(Name, ...) BytecodeTraits<__VA_ARGS__>::kOperandCount, + BYTECODE_LIST(ENTRY) +#undef ENTRY +}; + +const AccumulatorUse Bytecodes::kAccumulatorUse[] = { +#define ENTRY(Name, ...) BytecodeTraits<__VA_ARGS__>::kAccumulatorUse, + BYTECODE_LIST(ENTRY) +#undef ENTRY +}; + +const int Bytecodes::kBytecodeSizes[][3] = { +#define ENTRY(Name, ...) \ + { BytecodeTraits<__VA_ARGS__>::kSingleScaleSize, \ + BytecodeTraits<__VA_ARGS__>::kDoubleScaleSize, \ + BytecodeTraits<__VA_ARGS__>::kQuadrupleScaleSize }, + BYTECODE_LIST(ENTRY) +#undef ENTRY +}; + +const OperandSize* const Bytecodes::kOperandSizes[][3] = { +#define ENTRY(Name, ...) \ + { BytecodeTraits<__VA_ARGS__>::kSingleScaleOperandSizes, \ + BytecodeTraits<__VA_ARGS__>::kDoubleScaleOperandSizes, \ + BytecodeTraits<__VA_ARGS__>::kQuadrupleScaleOperandSizes }, + BYTECODE_LIST(ENTRY) +#undef ENTRY +}; +// clang-format on // static const char* Bytecodes::ToString(Bytecode bytecode) { @@ -43,77 +84,6 @@ std::string Bytecodes::ToString(Bytecode bytecode, OperandScale operand_scale) { } } -// static -const char* Bytecodes::AccumulatorUseToString(AccumulatorUse accumulator_use) { - switch (accumulator_use) { - case AccumulatorUse::kNone: - return "None"; - case AccumulatorUse::kRead: - return "Read"; - case AccumulatorUse::kWrite: - return "Write"; - case AccumulatorUse::kReadWrite: - return "ReadWrite"; - } - UNREACHABLE(); - return ""; -} - -// static -const char* Bytecodes::OperandTypeToString(OperandType operand_type) { - switch (operand_type) { -#define CASE(Name, _) \ - case OperandType::k##Name: \ - return #Name; - OPERAND_TYPE_LIST(CASE) -#undef CASE - } - UNREACHABLE(); - return ""; -} - -// static -const char* Bytecodes::OperandScaleToString(OperandScale operand_scale) { - switch (operand_scale) { -#define CASE(Name, _) \ - case OperandScale::k##Name: \ - return #Name; - OPERAND_SCALE_LIST(CASE) -#undef CASE - } - UNREACHABLE(); - return ""; -} - -// static -const char* Bytecodes::OperandSizeToString(OperandSize operand_size) { - switch (operand_size) { - case OperandSize::kNone: - return "None"; - case OperandSize::kByte: - return "Byte"; - case OperandSize::kShort: - return "Short"; - case OperandSize::kQuad: - return "Quad"; - } - UNREACHABLE(); - return ""; -} - -// static -uint8_t Bytecodes::ToByte(Bytecode bytecode) { - DCHECK_LE(bytecode, Bytecode::kLast); - return static_cast(bytecode); -} - -// static -Bytecode Bytecodes::FromByte(uint8_t value) { - Bytecode bytecode = static_cast(value); - DCHECK(bytecode <= Bytecode::kLast); - return bytecode; -} - // static Bytecode Bytecodes::GetDebugBreak(Bytecode bytecode) { DCHECK(!IsDebugBreak(bytecode)); @@ -124,7 +94,7 @@ Bytecode Bytecodes::GetDebugBreak(Bytecode bytecode) { return Bytecode::kDebugBreakExtraWide; } int bytecode_size = Size(bytecode, OperandScale::kSingle); -#define RETURN_IF_DEBUG_BREAK_SIZE_MATCHES(Name, ...) \ +#define RETURN_IF_DEBUG_BREAK_SIZE_MATCHES(Name) \ if (bytecode_size == Size(Bytecode::k##Name, OperandScale::kSingle)) { \ return Bytecode::k##Name; \ } @@ -134,224 +104,6 @@ Bytecode Bytecodes::GetDebugBreak(Bytecode bytecode) { return Bytecode::kIllegal; } -// static -int Bytecodes::Size(Bytecode bytecode, OperandScale operand_scale) { - int size = 1; - for (int i = 0; i < NumberOfOperands(bytecode); i++) { - OperandSize operand_size = GetOperandSize(bytecode, i, operand_scale); - int delta = static_cast(operand_size); - DCHECK(base::bits::IsPowerOfTwo32(static_cast(delta))); - size += delta; - } - return size; -} - -// static -size_t Bytecodes::ReturnCount(Bytecode bytecode) { - return bytecode == Bytecode::kReturn ? 1 : 0; -} - -// static -int Bytecodes::NumberOfOperands(Bytecode bytecode) { - DCHECK(bytecode <= Bytecode::kLast); - switch (bytecode) { -#define CASE(Name, ...) \ - case Bytecode::k##Name: \ - return BytecodeTraits<__VA_ARGS__>::kOperandCount; - BYTECODE_LIST(CASE) -#undef CASE - } - UNREACHABLE(); - return 0; -} - -// static -int Bytecodes::NumberOfRegisterOperands(Bytecode bytecode) { - DCHECK(bytecode <= Bytecode::kLast); - switch (bytecode) { -#define CASE(Name, ...) \ - case Bytecode::k##Name: \ - typedef BytecodeTraits<__VA_ARGS__> Name##Trait; \ - return Name##Trait::kRegisterOperandCount; - BYTECODE_LIST(CASE) -#undef CASE - } - UNREACHABLE(); - return false; -} - -// static -Bytecode Bytecodes::OperandScaleToPrefixBytecode(OperandScale operand_scale) { - switch (operand_scale) { - case OperandScale::kQuadruple: - return Bytecode::kExtraWide; - case OperandScale::kDouble: - return Bytecode::kWide; - default: - UNREACHABLE(); - return Bytecode::kIllegal; - } -} - -// static -bool Bytecodes::OperandScaleRequiresPrefixBytecode(OperandScale operand_scale) { - return operand_scale != OperandScale::kSingle; -} - -// static -OperandScale Bytecodes::PrefixBytecodeToOperandScale(Bytecode bytecode) { - switch (bytecode) { - case Bytecode::kExtraWide: - case Bytecode::kDebugBreakExtraWide: - return OperandScale::kQuadruple; - case Bytecode::kWide: - case Bytecode::kDebugBreakWide: - return OperandScale::kDouble; - default: - UNREACHABLE(); - return OperandScale::kSingle; - } -} - -// static -AccumulatorUse Bytecodes::GetAccumulatorUse(Bytecode bytecode) { - DCHECK(bytecode <= Bytecode::kLast); - switch (bytecode) { -#define CASE(Name, ...) \ - case Bytecode::k##Name: \ - return BytecodeTraits<__VA_ARGS__>::kAccumulatorUse; - BYTECODE_LIST(CASE) -#undef CASE - } - UNREACHABLE(); - return AccumulatorUse::kNone; -} - -// static -bool Bytecodes::ReadsAccumulator(Bytecode bytecode) { - return (GetAccumulatorUse(bytecode) & AccumulatorUse::kRead) == - AccumulatorUse::kRead; -} - -// static -bool Bytecodes::WritesAccumulator(Bytecode bytecode) { - return (GetAccumulatorUse(bytecode) & AccumulatorUse::kWrite) == - AccumulatorUse::kWrite; -} - -// static -bool Bytecodes::WritesBooleanToAccumulator(Bytecode bytecode) { - switch (bytecode) { - case Bytecode::kLdaTrue: - case Bytecode::kLdaFalse: - case Bytecode::kToBooleanLogicalNot: - case Bytecode::kLogicalNot: - case Bytecode::kTestEqual: - case Bytecode::kTestNotEqual: - case Bytecode::kTestEqualStrict: - case Bytecode::kTestLessThan: - case Bytecode::kTestLessThanOrEqual: - case Bytecode::kTestGreaterThan: - case Bytecode::kTestGreaterThanOrEqual: - case Bytecode::kTestInstanceOf: - case Bytecode::kTestIn: - case Bytecode::kForInDone: - return true; - default: - return false; - } -} - -// static -bool Bytecodes::IsAccumulatorLoadWithoutEffects(Bytecode bytecode) { - switch (bytecode) { - case Bytecode::kLdaZero: - case Bytecode::kLdaSmi: - case Bytecode::kLdaUndefined: - case Bytecode::kLdaNull: - case Bytecode::kLdaTheHole: - case Bytecode::kLdaTrue: - case Bytecode::kLdaFalse: - case Bytecode::kLdaConstant: - case Bytecode::kLdar: - return true; - default: - return false; - } -} - -// static -bool Bytecodes::IsJumpWithoutEffects(Bytecode bytecode) { - return IsJump(bytecode) && !IsJumpIfToBoolean(bytecode); -} - -// static -bool Bytecodes::IsRegisterLoadWithoutEffects(Bytecode bytecode) { - switch (bytecode) { - case Bytecode::kMov: - case Bytecode::kPopContext: - case Bytecode::kPushContext: - case Bytecode::kStar: - case Bytecode::kLdrUndefined: - return true; - default: - return false; - } -} - -// static -bool Bytecodes::IsWithoutExternalSideEffects(Bytecode bytecode) { - // These bytecodes only manipulate interpreter frame state and will - // never throw. - return (IsAccumulatorLoadWithoutEffects(bytecode) || - IsRegisterLoadWithoutEffects(bytecode) || - bytecode == Bytecode::kNop || IsJumpWithoutEffects(bytecode)); -} - -// static -OperandType Bytecodes::GetOperandType(Bytecode bytecode, int i) { - DCHECK_LE(bytecode, Bytecode::kLast); - DCHECK_LT(i, NumberOfOperands(bytecode)); - DCHECK_GE(i, 0); - return GetOperandTypes(bytecode)[i]; -} - -// static -const OperandType* Bytecodes::GetOperandTypes(Bytecode bytecode) { - DCHECK(bytecode <= Bytecode::kLast); - switch (bytecode) { -#define CASE(Name, ...) \ - case Bytecode::k##Name: \ - return BytecodeTraits<__VA_ARGS__>::GetOperandTypes(); - BYTECODE_LIST(CASE) -#undef CASE - } - UNREACHABLE(); - return nullptr; -} - -// static -const OperandTypeInfo* Bytecodes::GetOperandTypeInfos(Bytecode bytecode) { - DCHECK(bytecode <= Bytecode::kLast); - switch (bytecode) { -#define CASE(Name, ...) \ - case Bytecode::k##Name: \ - return BytecodeTraits<__VA_ARGS__>::GetOperandTypeInfos(); - BYTECODE_LIST(CASE) -#undef CASE - } - UNREACHABLE(); - return nullptr; -} - -// static -OperandSize Bytecodes::GetOperandSize(Bytecode bytecode, int i, - OperandScale operand_scale) { - DCHECK_LT(i, NumberOfOperands(bytecode)); - OperandType operand_type = GetOperandType(bytecode, i); - return SizeOfOperand(operand_type, operand_scale); -} - // static int Bytecodes::GetOperandOffset(Bytecode bytecode, int i, OperandScale operand_scale) { @@ -366,67 +118,6 @@ int Bytecodes::GetOperandOffset(Bytecode bytecode, int i, return offset; } -// static -OperandSize Bytecodes::SizeOfOperand(OperandType operand_type, - OperandScale operand_scale) { - return static_cast( - ScaledOperandSize(operand_type, operand_scale)); -} - -// static -bool Bytecodes::IsConditionalJumpImmediate(Bytecode bytecode) { - return bytecode == Bytecode::kJumpIfTrue || - bytecode == Bytecode::kJumpIfFalse || - bytecode == Bytecode::kJumpIfToBooleanTrue || - bytecode == Bytecode::kJumpIfToBooleanFalse || - bytecode == Bytecode::kJumpIfNotHole || - bytecode == Bytecode::kJumpIfNull || - bytecode == Bytecode::kJumpIfUndefined; -} - -// static -bool Bytecodes::IsConditionalJumpConstant(Bytecode bytecode) { - return bytecode == Bytecode::kJumpIfTrueConstant || - bytecode == Bytecode::kJumpIfFalseConstant || - bytecode == Bytecode::kJumpIfToBooleanTrueConstant || - bytecode == Bytecode::kJumpIfToBooleanFalseConstant || - bytecode == Bytecode::kJumpIfNotHoleConstant || - bytecode == Bytecode::kJumpIfNullConstant || - bytecode == Bytecode::kJumpIfUndefinedConstant; -} - -// static -bool Bytecodes::IsConditionalJump(Bytecode bytecode) { - return IsConditionalJumpImmediate(bytecode) || - IsConditionalJumpConstant(bytecode); -} - - -// static -bool Bytecodes::IsJumpImmediate(Bytecode bytecode) { - return bytecode == Bytecode::kJump || IsConditionalJumpImmediate(bytecode); -} - - -// static -bool Bytecodes::IsJumpConstant(Bytecode bytecode) { - return bytecode == Bytecode::kJumpConstant || - IsConditionalJumpConstant(bytecode); -} - -// static -bool Bytecodes::IsJump(Bytecode bytecode) { - return IsJumpImmediate(bytecode) || IsJumpConstant(bytecode); -} - -// static -bool Bytecodes::IsJumpIfToBoolean(Bytecode bytecode) { - return bytecode == Bytecode::kJumpIfToBooleanTrue || - bytecode == Bytecode::kJumpIfToBooleanFalse || - bytecode == Bytecode::kJumpIfToBooleanTrueConstant || - bytecode == Bytecode::kJumpIfToBooleanFalseConstant; -} - // static Bytecode Bytecodes::GetJumpWithoutToBoolean(Bytecode bytecode) { switch (bytecode) { @@ -445,19 +136,6 @@ Bytecode Bytecodes::GetJumpWithoutToBoolean(Bytecode bytecode) { return Bytecode::kIllegal; } -// static -bool Bytecodes::IsCallOrNew(Bytecode bytecode) { - return bytecode == Bytecode::kCall || bytecode == Bytecode::kTailCall || - bytecode == Bytecode::kNew; -} - -// static -bool Bytecodes::IsCallRuntime(Bytecode bytecode) { - return bytecode == Bytecode::kCallRuntime || - bytecode == Bytecode::kCallRuntimeForPair || - bytecode == Bytecode::kInvokeIntrinsic; -} - // static bool Bytecodes::IsDebugBreak(Bytecode bytecode) { switch (bytecode) { @@ -471,53 +149,6 @@ bool Bytecodes::IsDebugBreak(Bytecode bytecode) { return false; } -// static -bool Bytecodes::IsLdarOrStar(Bytecode bytecode) { - return bytecode == Bytecode::kLdar || bytecode == Bytecode::kStar; -} - -// static -bool Bytecodes::IsBytecodeWithScalableOperands(Bytecode bytecode) { - switch (bytecode) { -#define CASE(Name, ...) \ - case Bytecode::k##Name: \ - typedef BytecodeTraits<__VA_ARGS__> Name##Trait; \ - return Name##Trait::IsScalable(); - BYTECODE_LIST(CASE) -#undef CASE - } - UNREACHABLE(); - return false; -} - -// static -bool Bytecodes::IsPrefixScalingBytecode(Bytecode bytecode) { - switch (bytecode) { - case Bytecode::kExtraWide: - case Bytecode::kDebugBreakExtraWide: - case Bytecode::kWide: - case Bytecode::kDebugBreakWide: - return true; - default: - return false; - } -} - -// static -bool Bytecodes::PutsNameInAccumulator(Bytecode bytecode) { - return bytecode == Bytecode::kTypeOf; -} - -// static -bool Bytecodes::IsJumpOrReturn(Bytecode bytecode) { - return bytecode == Bytecode::kReturn || IsJump(bytecode); -} - -// static -bool Bytecodes::IsMaybeRegisterOperandType(OperandType operand_type) { - return operand_type == OperandType::kMaybeReg; -} - // static bool Bytecodes::IsRegisterOperandType(OperandType operand_type) { switch (operand_type) { @@ -599,21 +230,11 @@ bool Bytecodes::IsStarLookahead(Bytecode bytecode, OperandScale operand_scale) { } // static -int Bytecodes::GetNumberOfRegistersRepresentedBy(OperandType operand_type) { - switch (operand_type) { - case OperandType::kMaybeReg: - case OperandType::kReg: - case OperandType::kRegOut: - return 1; - case OperandType::kRegPair: - case OperandType::kRegOutPair: - return 2; - case OperandType::kRegOutTriple: - return 3; - default: - return 0; +bool Bytecodes::IsBytecodeWithScalableOperands(Bytecode bytecode) { + for (int i = 0; i < NumberOfOperands(bytecode); i++) { + if (OperandIsScalable(bytecode, i)) return true; } - return 0; + return false; } // static @@ -630,25 +251,28 @@ bool Bytecodes::IsUnsignedOperandType(OperandType operand_type) { } // static -OperandSize Bytecodes::SizeForSignedOperand(int value) { - if (value >= kMinInt8 && value <= kMaxInt8) { - return OperandSize::kByte; - } else if (value >= kMinInt16 && value <= kMaxInt16) { - return OperandSize::kShort; - } else { - return OperandSize::kQuad; - } -} - -// static -OperandSize Bytecodes::SizeForUnsignedOperand(uint32_t value) { - if (value <= kMaxUInt8) { - return OperandSize::kByte; - } else if (value <= kMaxUInt16) { - return OperandSize::kShort; - } else { - return OperandSize::kQuad; - } +OperandSize Bytecodes::SizeOfOperand(OperandType operand_type, + OperandScale operand_scale) { + DCHECK_LE(operand_type, OperandType::kLast); + DCHECK_GE(operand_scale, OperandScale::kSingle); + DCHECK_LE(operand_scale, OperandScale::kLast); + STATIC_ASSERT(static_cast(OperandScale::kQuadruple) == 4 && + OperandScale::kLast == OperandScale::kQuadruple); + int scale_index = static_cast(operand_scale) >> 1; + // clang-format off + static const OperandSize kOperandSizes[][3] = { +#define ENTRY(Name, ...) \ + { OperandScaler::kOperandSize, \ + OperandScaler::kOperandSize, \ + OperandScaler::kOperandSize }, + OPERAND_TYPE_LIST(ENTRY) +#undef ENTRY + }; + // clang-format on + return kOperandSizes[static_cast(operand_type)][scale_index]; } // static @@ -662,22 +286,6 @@ std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode) { return os << Bytecodes::ToString(bytecode); } -std::ostream& operator<<(std::ostream& os, const AccumulatorUse& use) { - return os << Bytecodes::AccumulatorUseToString(use); -} - -std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size) { - return os << Bytecodes::OperandSizeToString(operand_size); -} - -std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale) { - return os << Bytecodes::OperandScaleToString(operand_scale); -} - -std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) { - return os << Bytecodes::OperandTypeToString(operand_type); -} - } // namespace interpreter } // namespace internal } // namespace v8 diff --git a/deps/v8/src/interpreter/bytecodes.h b/deps/v8/src/interpreter/bytecodes.h index 036ae728722958..6232966bbca1ab 100644 --- a/deps/v8/src/interpreter/bytecodes.h +++ b/deps/v8/src/interpreter/bytecodes.h @@ -9,6 +9,9 @@ #include #include +#include "src/globals.h" +#include "src/interpreter/bytecode-operands.h" + // This interface and it's implementation are independent of the // libv8_base library as they are used by the interpreter and the // standalone mkpeephole table generator program. @@ -17,64 +20,8 @@ namespace v8 { namespace internal { namespace interpreter { -#define INVALID_OPERAND_TYPE_LIST(V) V(None, OperandTypeInfo::kNone) - -#define REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ - V(MaybeReg, OperandTypeInfo::kScalableSignedByte) \ - V(Reg, OperandTypeInfo::kScalableSignedByte) \ - V(RegPair, OperandTypeInfo::kScalableSignedByte) - -#define REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) \ - V(RegOut, OperandTypeInfo::kScalableSignedByte) \ - V(RegOutPair, OperandTypeInfo::kScalableSignedByte) \ - V(RegOutTriple, OperandTypeInfo::kScalableSignedByte) - -#define SCALAR_OPERAND_TYPE_LIST(V) \ - V(Flag8, OperandTypeInfo::kFixedUnsignedByte) \ - V(IntrinsicId, OperandTypeInfo::kFixedUnsignedByte) \ - V(Idx, OperandTypeInfo::kScalableUnsignedByte) \ - V(Imm, OperandTypeInfo::kScalableSignedByte) \ - V(RegCount, OperandTypeInfo::kScalableUnsignedByte) \ - V(RuntimeId, OperandTypeInfo::kFixedUnsignedShort) - -#define REGISTER_OPERAND_TYPE_LIST(V) \ - REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ - REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) - -#define NON_REGISTER_OPERAND_TYPE_LIST(V) \ - INVALID_OPERAND_TYPE_LIST(V) \ - SCALAR_OPERAND_TYPE_LIST(V) - -// The list of operand types used by bytecodes. -#define OPERAND_TYPE_LIST(V) \ - NON_REGISTER_OPERAND_TYPE_LIST(V) \ - REGISTER_OPERAND_TYPE_LIST(V) - -// Define one debug break bytecode for each possible size of unscaled -// bytecodes. Format is V(, , ). -#define DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \ - V(DebugBreak0, AccumulatorUse::kRead) \ - V(DebugBreak1, AccumulatorUse::kRead, OperandType::kReg) \ - V(DebugBreak2, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg) \ - V(DebugBreak3, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg, \ - OperandType::kReg) \ - V(DebugBreak4, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg, \ - OperandType::kReg, OperandType::kReg) \ - V(DebugBreak5, AccumulatorUse::kRead, OperandType::kRuntimeId, \ - OperandType::kReg, OperandType::kReg) \ - V(DebugBreak6, AccumulatorUse::kRead, OperandType::kRuntimeId, \ - OperandType::kReg, OperandType::kReg, OperandType::kReg) - -// Define one debug break for each widening prefix. -#define DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) \ - V(DebugBreakWide, AccumulatorUse::kRead) \ - V(DebugBreakExtraWide, AccumulatorUse::kRead) - -#define DEBUG_BREAK_BYTECODE_LIST(V) \ - DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \ - DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) - // The list of bytecodes which are interpreted by the interpreter. +// Format is V(, , ). #define BYTECODE_LIST(V) \ /* Extended width operands */ \ V(Wide, AccumulatorUse::kNone) \ @@ -106,15 +53,23 @@ namespace interpreter { V(PushContext, AccumulatorUse::kRead, OperandType::kRegOut) \ V(PopContext, AccumulatorUse::kNone, OperandType::kReg) \ V(LdaContextSlot, AccumulatorUse::kWrite, OperandType::kReg, \ - OperandType::kIdx) \ + OperandType::kIdx, OperandType::kUImm) \ V(LdrContextSlot, AccumulatorUse::kNone, OperandType::kReg, \ - OperandType::kIdx, OperandType::kRegOut) \ + OperandType::kIdx, OperandType::kUImm, OperandType::kRegOut) \ V(StaContextSlot, AccumulatorUse::kRead, OperandType::kReg, \ - OperandType::kIdx) \ + OperandType::kIdx, OperandType::kUImm) \ \ /* Load-Store lookup slots */ \ V(LdaLookupSlot, AccumulatorUse::kWrite, OperandType::kIdx) \ + V(LdaLookupContextSlot, AccumulatorUse::kWrite, OperandType::kIdx, \ + OperandType::kIdx, OperandType::kUImm) \ + V(LdaLookupGlobalSlot, AccumulatorUse::kWrite, OperandType::kIdx, \ + OperandType::kIdx, OperandType::kUImm) \ V(LdaLookupSlotInsideTypeof, AccumulatorUse::kWrite, OperandType::kIdx) \ + V(LdaLookupContextSlotInsideTypeof, AccumulatorUse::kWrite, \ + OperandType::kIdx, OperandType::kIdx, OperandType::kUImm) \ + V(LdaLookupGlobalSlotInsideTypeof, AccumulatorUse::kWrite, \ + OperandType::kIdx, OperandType::kIdx, OperandType::kUImm) \ V(StaLookupSlotSloppy, AccumulatorUse::kReadWrite, OperandType::kIdx) \ V(StaLookupSlotStrict, AccumulatorUse::kReadWrite, OperandType::kIdx) \ \ @@ -188,33 +143,40 @@ namespace interpreter { V(DeletePropertySloppy, AccumulatorUse::kReadWrite, OperandType::kReg) \ \ /* Call operations */ \ - V(Call, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg, \ - OperandType::kRegCount, OperandType::kIdx) \ - V(TailCall, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg, \ + V(Call, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kRegList, \ OperandType::kRegCount, OperandType::kIdx) \ + V(TailCall, AccumulatorUse::kWrite, OperandType::kReg, \ + OperandType::kRegList, OperandType::kRegCount, OperandType::kIdx) \ V(CallRuntime, AccumulatorUse::kWrite, OperandType::kRuntimeId, \ - OperandType::kMaybeReg, OperandType::kRegCount) \ + OperandType::kRegList, OperandType::kRegCount) \ V(CallRuntimeForPair, AccumulatorUse::kNone, OperandType::kRuntimeId, \ - OperandType::kMaybeReg, OperandType::kRegCount, OperandType::kRegOutPair) \ + OperandType::kRegList, OperandType::kRegCount, OperandType::kRegOutPair) \ V(CallJSRuntime, AccumulatorUse::kWrite, OperandType::kIdx, \ - OperandType::kReg, OperandType::kRegCount) \ + OperandType::kRegList, OperandType::kRegCount) \ \ /* Intrinsics */ \ V(InvokeIntrinsic, AccumulatorUse::kWrite, OperandType::kIntrinsicId, \ - OperandType::kMaybeReg, OperandType::kRegCount) \ + OperandType::kRegList, OperandType::kRegCount) \ \ /* New operator */ \ - V(New, AccumulatorUse::kReadWrite, OperandType::kReg, \ - OperandType::kMaybeReg, OperandType::kRegCount) \ + V(New, AccumulatorUse::kReadWrite, OperandType::kReg, OperandType::kRegList, \ + OperandType::kRegCount, OperandType::kIdx) \ \ /* Test Operators */ \ - V(TestEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \ - V(TestNotEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \ - V(TestEqualStrict, AccumulatorUse::kReadWrite, OperandType::kReg) \ - V(TestLessThan, AccumulatorUse::kReadWrite, OperandType::kReg) \ - V(TestGreaterThan, AccumulatorUse::kReadWrite, OperandType::kReg) \ - V(TestLessThanOrEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \ - V(TestGreaterThanOrEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \ + V(TestEqual, AccumulatorUse::kReadWrite, OperandType::kReg, \ + OperandType::kIdx) \ + V(TestNotEqual, AccumulatorUse::kReadWrite, OperandType::kReg, \ + OperandType::kIdx) \ + V(TestEqualStrict, AccumulatorUse::kReadWrite, OperandType::kReg, \ + OperandType::kIdx) \ + V(TestLessThan, AccumulatorUse::kReadWrite, OperandType::kReg, \ + OperandType::kIdx) \ + V(TestGreaterThan, AccumulatorUse::kReadWrite, OperandType::kReg, \ + OperandType::kIdx) \ + V(TestLessThanOrEqual, AccumulatorUse::kReadWrite, OperandType::kReg, \ + OperandType::kIdx) \ + V(TestGreaterThanOrEqual, AccumulatorUse::kReadWrite, OperandType::kReg, \ + OperandType::kIdx) \ V(TestInstanceOf, AccumulatorUse::kReadWrite, OperandType::kReg) \ V(TestIn, AccumulatorUse::kReadWrite, OperandType::kReg) \ \ @@ -238,10 +200,10 @@ namespace interpreter { /* Context allocation */ \ V(CreateBlockContext, AccumulatorUse::kReadWrite, OperandType::kIdx) \ V(CreateCatchContext, AccumulatorUse::kReadWrite, OperandType::kReg, \ + OperandType::kIdx, OperandType::kIdx) \ + V(CreateFunctionContext, AccumulatorUse::kWrite, OperandType::kUImm) \ + V(CreateWithContext, AccumulatorUse::kReadWrite, OperandType::kReg, \ OperandType::kIdx) \ - /* TODO(klaasb) rename Idx or add unsigned Imm OperandType? */ \ - V(CreateFunctionContext, AccumulatorUse::kWrite, OperandType::kIdx) \ - V(CreateWithContext, AccumulatorUse::kReadWrite, OperandType::kReg) \ \ /* Arguments allocation */ \ V(CreateMappedArguments, AccumulatorUse::kWrite) \ @@ -265,11 +227,13 @@ namespace interpreter { V(JumpIfUndefinedConstant, AccumulatorUse::kRead, OperandType::kIdx) \ V(JumpIfNotHole, AccumulatorUse::kRead, OperandType::kImm) \ V(JumpIfNotHoleConstant, AccumulatorUse::kRead, OperandType::kIdx) \ + V(JumpLoop, AccumulatorUse::kNone, OperandType::kImm, OperandType::kImm) \ \ /* Complex flow control For..in */ \ V(ForInPrepare, AccumulatorUse::kNone, OperandType::kReg, \ OperandType::kRegOutTriple) \ - V(ForInDone, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg) \ + V(ForInContinue, AccumulatorUse::kWrite, OperandType::kReg, \ + OperandType::kReg) \ V(ForInNext, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg, \ OperandType::kRegPair, OperandType::kIdx) \ V(ForInStep, AccumulatorUse::kWrite, OperandType::kReg) \ @@ -277,9 +241,6 @@ namespace interpreter { /* Perform a stack guard check */ \ V(StackCheck, AccumulatorUse::kNone) \ \ - /* Perform a check to trigger on-stack replacement */ \ - V(OsrPoll, AccumulatorUse::kNone, OperandType::kImm) \ - \ /* Non-local flow control */ \ V(Throw, AccumulatorUse::kRead) \ V(ReThrow, AccumulatorUse::kRead) \ @@ -291,7 +252,22 @@ namespace interpreter { \ /* Debugger */ \ V(Debugger, AccumulatorUse::kNone) \ - DEBUG_BREAK_BYTECODE_LIST(V) \ + \ + /* Debug Breakpoints - one for each possible size of unscaled bytecodes */ \ + /* and one for each operand widening prefix bytecode */ \ + V(DebugBreak0, AccumulatorUse::kRead) \ + V(DebugBreak1, AccumulatorUse::kRead, OperandType::kReg) \ + V(DebugBreak2, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg) \ + V(DebugBreak3, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg, \ + OperandType::kReg) \ + V(DebugBreak4, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg, \ + OperandType::kReg, OperandType::kReg) \ + V(DebugBreak5, AccumulatorUse::kRead, OperandType::kRuntimeId, \ + OperandType::kReg, OperandType::kReg) \ + V(DebugBreak6, AccumulatorUse::kRead, OperandType::kRuntimeId, \ + OperandType::kReg, OperandType::kReg, OperandType::kReg) \ + V(DebugBreakWide, AccumulatorUse::kRead) \ + V(DebugBreakExtraWide, AccumulatorUse::kRead) \ \ /* Illegal bytecode (terminates execution) */ \ V(Illegal, AccumulatorUse::kNone) \ @@ -300,74 +276,23 @@ namespace interpreter { /* eliminated bytecodes). */ \ V(Nop, AccumulatorUse::kNone) -enum class AccumulatorUse : uint8_t { - kNone = 0, - kRead = 1 << 0, - kWrite = 1 << 1, - kReadWrite = kRead | kWrite -}; +// List of debug break bytecodes. +#define DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \ + V(DebugBreak0) \ + V(DebugBreak1) \ + V(DebugBreak2) \ + V(DebugBreak3) \ + V(DebugBreak4) \ + V(DebugBreak5) \ + V(DebugBreak6) -inline AccumulatorUse operator&(AccumulatorUse lhs, AccumulatorUse rhs) { - int result = static_cast(lhs) & static_cast(rhs); - return static_cast(result); -} - -inline AccumulatorUse operator|(AccumulatorUse lhs, AccumulatorUse rhs) { - int result = static_cast(lhs) | static_cast(rhs); - return static_cast(result); -} - -// Enumeration of scaling factors applicable to scalable operands. Code -// relies on being able to cast values to integer scaling values. -#define OPERAND_SCALE_LIST(V) \ - V(Single, 1) \ - V(Double, 2) \ - V(Quadruple, 4) - -enum class OperandScale : uint8_t { -#define DECLARE_OPERAND_SCALE(Name, Scale) k##Name = Scale, - OPERAND_SCALE_LIST(DECLARE_OPERAND_SCALE) -#undef DECLARE_OPERAND_SCALE - kLast = kQuadruple -}; - -// Enumeration of the size classes of operand types used by -// bytecodes. Code relies on being able to cast values to integer -// types to get the size in bytes. -enum class OperandSize : uint8_t { - kNone = 0, - kByte = 1, - kShort = 2, - kQuad = 4, - kLast = kQuad -}; - -// Primitive operand info used that summarize properties of operands. -// Columns are Name, IsScalable, IsUnsigned, UnscaledSize. -#define OPERAND_TYPE_INFO_LIST(V) \ - V(None, false, false, OperandSize::kNone) \ - V(ScalableSignedByte, true, false, OperandSize::kByte) \ - V(ScalableUnsignedByte, true, true, OperandSize::kByte) \ - V(FixedUnsignedByte, false, true, OperandSize::kByte) \ - V(FixedUnsignedShort, false, true, OperandSize::kShort) - -enum class OperandTypeInfo : uint8_t { -#define DECLARE_OPERAND_TYPE_INFO(Name, ...) k##Name, - OPERAND_TYPE_INFO_LIST(DECLARE_OPERAND_TYPE_INFO) -#undef DECLARE_OPERAND_TYPE_INFO -}; +#define DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) \ + V(DebugBreakWide) \ + V(DebugBreakExtraWide) -// Enumeration of operand types used by bytecodes. -enum class OperandType : uint8_t { -#define DECLARE_OPERAND_TYPE(Name, _) k##Name, - OPERAND_TYPE_LIST(DECLARE_OPERAND_TYPE) -#undef DECLARE_OPERAND_TYPE -#define COUNT_OPERAND_TYPES(x, _) +1 - // The COUNT_OPERAND macro will turn this into kLast = -1 +1 +1... which will - // evaluate to the same value as the last operand. - kLast = -1 OPERAND_TYPE_LIST(COUNT_OPERAND_TYPES) -#undef COUNT_OPERAND_TYPES -}; +#define DEBUG_BREAK_BYTECODE_LIST(V) \ + DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \ + DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) // Enumeration of interpreter bytecodes. enum class Bytecode : uint8_t { @@ -381,6 +306,14 @@ enum class Bytecode : uint8_t { #undef COUNT_BYTECODE }; +// TODO(rmcilroy): Remove once we switch to MSVC 2015 which supports constexpr. +// See crbug.com/603131. +#if V8_CC_MSVC +#define CONSTEXPR const +#else +#define CONSTEXPR constexpr +#endif + class Bytecodes final { public: // The maximum number of operands a bytecode may have. @@ -392,156 +325,314 @@ class Bytecodes final { // Returns string representation of |bytecode|. static std::string ToString(Bytecode bytecode, OperandScale operand_scale); - // Returns string representation of |accumulator_use|. - static const char* AccumulatorUseToString(AccumulatorUse accumulator_use); - - // Returns string representation of |operand_type|. - static const char* OperandTypeToString(OperandType operand_type); - - // Returns string representation of |operand_scale|. - static const char* OperandScaleToString(OperandScale operand_scale); - - // Returns string representation of |operand_size|. - static const char* OperandSizeToString(OperandSize operand_size); - // Returns byte value of bytecode. - static uint8_t ToByte(Bytecode bytecode); + static uint8_t ToByte(Bytecode bytecode) { + DCHECK_LE(bytecode, Bytecode::kLast); + return static_cast(bytecode); + } // Returns bytecode for |value|. - static Bytecode FromByte(uint8_t value); - - // Returns the number of operands expected by |bytecode|. - static int NumberOfOperands(Bytecode bytecode); - - // Returns the number of register operands expected by |bytecode|. - static int NumberOfRegisterOperands(Bytecode bytecode); + static Bytecode FromByte(uint8_t value) { + Bytecode bytecode = static_cast(value); + DCHECK(bytecode <= Bytecode::kLast); + return bytecode; + } // Returns the prefix bytecode representing an operand scale to be // applied to a a bytecode. - static Bytecode OperandScaleToPrefixBytecode(OperandScale operand_scale); + static Bytecode OperandScaleToPrefixBytecode(OperandScale operand_scale) { + switch (operand_scale) { + case OperandScale::kQuadruple: + return Bytecode::kExtraWide; + case OperandScale::kDouble: + return Bytecode::kWide; + default: + UNREACHABLE(); + return Bytecode::kIllegal; + } + } // Returns true if the operand scale requires a prefix bytecode. - static bool OperandScaleRequiresPrefixBytecode(OperandScale operand_scale); + static bool OperandScaleRequiresPrefixBytecode(OperandScale operand_scale) { + return operand_scale != OperandScale::kSingle; + } // Returns the scaling applied to scalable operands if bytecode is // is a scaling prefix. - static OperandScale PrefixBytecodeToOperandScale(Bytecode bytecode); + static OperandScale PrefixBytecodeToOperandScale(Bytecode bytecode) { + switch (bytecode) { + case Bytecode::kExtraWide: + case Bytecode::kDebugBreakExtraWide: + return OperandScale::kQuadruple; + case Bytecode::kWide: + case Bytecode::kDebugBreakWide: + return OperandScale::kDouble; + default: + UNREACHABLE(); + return OperandScale::kSingle; + } + } // Returns how accumulator is used by |bytecode|. - static AccumulatorUse GetAccumulatorUse(Bytecode bytecode); + static AccumulatorUse GetAccumulatorUse(Bytecode bytecode) { + DCHECK(bytecode <= Bytecode::kLast); + return kAccumulatorUse[static_cast(bytecode)]; + } // Returns true if |bytecode| reads the accumulator. - static bool ReadsAccumulator(Bytecode bytecode); + static bool ReadsAccumulator(Bytecode bytecode) { + return (GetAccumulatorUse(bytecode) & AccumulatorUse::kRead) == + AccumulatorUse::kRead; + } // Returns true if |bytecode| writes the accumulator. - static bool WritesAccumulator(Bytecode bytecode); + static bool WritesAccumulator(Bytecode bytecode) { + return (GetAccumulatorUse(bytecode) & AccumulatorUse::kWrite) == + AccumulatorUse::kWrite; + } // Return true if |bytecode| writes the accumulator with a boolean value. - static bool WritesBooleanToAccumulator(Bytecode bytecode); + static bool WritesBooleanToAccumulator(Bytecode bytecode) { + switch (bytecode) { + case Bytecode::kLdaTrue: + case Bytecode::kLdaFalse: + case Bytecode::kToBooleanLogicalNot: + case Bytecode::kLogicalNot: + case Bytecode::kTestEqual: + case Bytecode::kTestNotEqual: + case Bytecode::kTestEqualStrict: + case Bytecode::kTestLessThan: + case Bytecode::kTestLessThanOrEqual: + case Bytecode::kTestGreaterThan: + case Bytecode::kTestGreaterThanOrEqual: + case Bytecode::kTestInstanceOf: + case Bytecode::kTestIn: + case Bytecode::kForInContinue: + return true; + default: + return false; + } + } // Return true if |bytecode| is an accumulator load without effects, // e.g. LdaConstant, LdaTrue, Ldar. - static bool IsAccumulatorLoadWithoutEffects(Bytecode bytecode); - - // Return true if |bytecode| is a jump without effects, - // e.g. any jump excluding those that include type coercion like - // JumpIfTrueToBoolean. - static bool IsJumpWithoutEffects(Bytecode bytecode); + static CONSTEXPR bool IsAccumulatorLoadWithoutEffects(Bytecode bytecode) { + return bytecode == Bytecode::kLdar || bytecode == Bytecode::kLdaZero || + bytecode == Bytecode::kLdaSmi || bytecode == Bytecode::kLdaNull || + bytecode == Bytecode::kLdaTrue || bytecode == Bytecode::kLdaFalse || + bytecode == Bytecode::kLdaUndefined || + bytecode == Bytecode::kLdaTheHole || + bytecode == Bytecode::kLdaConstant; + } // Return true if |bytecode| is a register load without effects, // e.g. Mov, Star, LdrUndefined. - static bool IsRegisterLoadWithoutEffects(Bytecode bytecode); - - // Returns true if |bytecode| has no effects. - static bool IsWithoutExternalSideEffects(Bytecode bytecode); - - // Returns the i-th operand of |bytecode|. - static OperandType GetOperandType(Bytecode bytecode, int i); - - // Returns a pointer to an array of operand types terminated in - // OperandType::kNone. - static const OperandType* GetOperandTypes(Bytecode bytecode); - - // Returns a pointer to an array of operand type info terminated in - // OperandTypeInfo::kNone. - static const OperandTypeInfo* GetOperandTypeInfos(Bytecode bytecode); - - // Returns the size of the i-th operand of |bytecode|. - static OperandSize GetOperandSize(Bytecode bytecode, int i, - OperandScale operand_scale); - - // Returns the offset of the i-th operand of |bytecode| relative to the start - // of the bytecode. - static int GetOperandOffset(Bytecode bytecode, int i, - OperandScale operand_scale); - - // Returns a debug break bytecode to replace |bytecode|. - static Bytecode GetDebugBreak(Bytecode bytecode); - - // Returns the size of the bytecode including its operands for the - // given |operand_scale|. - static int Size(Bytecode bytecode, OperandScale operand_scale); - - // Returns the size of |operand|. - static OperandSize SizeOfOperand(OperandType operand, OperandScale scale); - - // Returns the number of values which |bytecode| returns. - static size_t ReturnCount(Bytecode bytecode); + static CONSTEXPR bool IsRegisterLoadWithoutEffects(Bytecode bytecode) { + return bytecode == Bytecode::kMov || bytecode == Bytecode::kPopContext || + bytecode == Bytecode::kPushContext || bytecode == Bytecode::kStar || + bytecode == Bytecode::kLdrUndefined; + } // Returns true if the bytecode is a conditional jump taking // an immediate byte operand (OperandType::kImm). - static bool IsConditionalJumpImmediate(Bytecode bytecode); + static CONSTEXPR bool IsConditionalJumpImmediate(Bytecode bytecode) { + return bytecode == Bytecode::kJumpIfTrue || + bytecode == Bytecode::kJumpIfFalse || + bytecode == Bytecode::kJumpIfToBooleanTrue || + bytecode == Bytecode::kJumpIfToBooleanFalse || + bytecode == Bytecode::kJumpIfNotHole || + bytecode == Bytecode::kJumpIfNull || + bytecode == Bytecode::kJumpIfUndefined; + } // Returns true if the bytecode is a conditional jump taking // a constant pool entry (OperandType::kIdx). - static bool IsConditionalJumpConstant(Bytecode bytecode); + static CONSTEXPR bool IsConditionalJumpConstant(Bytecode bytecode) { + return bytecode == Bytecode::kJumpIfTrueConstant || + bytecode == Bytecode::kJumpIfFalseConstant || + bytecode == Bytecode::kJumpIfToBooleanTrueConstant || + bytecode == Bytecode::kJumpIfToBooleanFalseConstant || + bytecode == Bytecode::kJumpIfNotHoleConstant || + bytecode == Bytecode::kJumpIfNullConstant || + bytecode == Bytecode::kJumpIfUndefinedConstant; + } // Returns true if the bytecode is a conditional jump taking // any kind of operand. - static bool IsConditionalJump(Bytecode bytecode); + static CONSTEXPR bool IsConditionalJump(Bytecode bytecode) { + return IsConditionalJumpImmediate(bytecode) || + IsConditionalJumpConstant(bytecode); + } // Returns true if the bytecode is a jump or a conditional jump taking // an immediate byte operand (OperandType::kImm). - static bool IsJumpImmediate(Bytecode bytecode); + static CONSTEXPR bool IsJumpImmediate(Bytecode bytecode) { + return bytecode == Bytecode::kJump || bytecode == Bytecode::kJumpLoop || + IsConditionalJumpImmediate(bytecode); + } // Returns true if the bytecode is a jump or conditional jump taking a // constant pool entry (OperandType::kIdx). - static bool IsJumpConstant(Bytecode bytecode); - - // Returns true if the bytecode is a jump or conditional jump taking - // any kind of operand. - static bool IsJump(Bytecode bytecode); + static CONSTEXPR bool IsJumpConstant(Bytecode bytecode) { + return bytecode == Bytecode::kJumpConstant || + IsConditionalJumpConstant(bytecode); + } // Returns true if the bytecode is a jump that internally coerces the // accumulator to a boolean. - static bool IsJumpIfToBoolean(Bytecode bytecode); + static CONSTEXPR bool IsJumpIfToBoolean(Bytecode bytecode) { + return bytecode == Bytecode::kJumpIfToBooleanTrue || + bytecode == Bytecode::kJumpIfToBooleanFalse || + bytecode == Bytecode::kJumpIfToBooleanTrueConstant || + bytecode == Bytecode::kJumpIfToBooleanFalseConstant; + } - // Returns the equivalent jump bytecode without the accumulator coercion. - static Bytecode GetJumpWithoutToBoolean(Bytecode bytecode); + // Returns true if the bytecode is a jump or conditional jump taking + // any kind of operand. + static CONSTEXPR bool IsJump(Bytecode bytecode) { + return IsJumpImmediate(bytecode) || IsJumpConstant(bytecode); + } // Returns true if the bytecode is a conditional jump, a jump, or a return. - static bool IsJumpOrReturn(Bytecode bytecode); + static CONSTEXPR bool IsJumpOrReturn(Bytecode bytecode) { + return bytecode == Bytecode::kReturn || IsJump(bytecode); + } + + // Return true if |bytecode| is a jump without effects, + // e.g. any jump excluding those that include type coercion like + // JumpIfTrueToBoolean. + static CONSTEXPR bool IsJumpWithoutEffects(Bytecode bytecode) { + return IsJump(bytecode) && !IsJumpIfToBoolean(bytecode); + } + + // Returns true if |bytecode| has no effects. These bytecodes only manipulate + // interpreter frame state and will never throw. + static CONSTEXPR bool IsWithoutExternalSideEffects(Bytecode bytecode) { + return (IsAccumulatorLoadWithoutEffects(bytecode) || + IsRegisterLoadWithoutEffects(bytecode) || + bytecode == Bytecode::kNop || IsJumpWithoutEffects(bytecode)); + } + + // Returns true if the bytecode is Ldar or Star. + static CONSTEXPR bool IsLdarOrStar(Bytecode bytecode) { + return bytecode == Bytecode::kLdar || bytecode == Bytecode::kStar; + } + + // Returns true if |bytecode| puts a name in the accumulator. + static CONSTEXPR bool PutsNameInAccumulator(Bytecode bytecode) { + return bytecode == Bytecode::kTypeOf; + } // Returns true if the bytecode is a call or a constructor call. - static bool IsCallOrNew(Bytecode bytecode); + static CONSTEXPR bool IsCallOrNew(Bytecode bytecode) { + return bytecode == Bytecode::kCall || bytecode == Bytecode::kTailCall || + bytecode == Bytecode::kNew; + } // Returns true if the bytecode is a call to the runtime. - static bool IsCallRuntime(Bytecode bytecode); + static CONSTEXPR bool IsCallRuntime(Bytecode bytecode) { + return bytecode == Bytecode::kCallRuntime || + bytecode == Bytecode::kCallRuntimeForPair || + bytecode == Bytecode::kInvokeIntrinsic; + } - // Returns true if the bytecode is a debug break. - static bool IsDebugBreak(Bytecode bytecode); + // Returns true if the bytecode is a scaling prefix bytecode. + static CONSTEXPR bool IsPrefixScalingBytecode(Bytecode bytecode) { + return bytecode == Bytecode::kExtraWide || bytecode == Bytecode::kWide || + bytecode == Bytecode::kDebugBreakExtraWide || + bytecode == Bytecode::kDebugBreakWide; + } - // Returns true if the bytecode is Ldar or Star. - static bool IsLdarOrStar(Bytecode bytecode); + // Returns the number of values which |bytecode| returns. + static CONSTEXPR size_t ReturnCount(Bytecode bytecode) { + return bytecode == Bytecode::kReturn ? 1 : 0; + } + + // Returns the number of operands expected by |bytecode|. + static int NumberOfOperands(Bytecode bytecode) { + DCHECK(bytecode <= Bytecode::kLast); + return kOperandCount[static_cast(bytecode)]; + } + + // Returns the i-th operand of |bytecode|. + static OperandType GetOperandType(Bytecode bytecode, int i) { + DCHECK_LE(bytecode, Bytecode::kLast); + DCHECK_LT(i, NumberOfOperands(bytecode)); + DCHECK_GE(i, 0); + return GetOperandTypes(bytecode)[i]; + } + + // Returns a pointer to an array of operand types terminated in + // OperandType::kNone. + static const OperandType* GetOperandTypes(Bytecode bytecode) { + DCHECK(bytecode <= Bytecode::kLast); + return kOperandTypes[static_cast(bytecode)]; + } + + static bool OperandIsScalableSignedByte(Bytecode bytecode, + int operand_index) { + DCHECK(bytecode <= Bytecode::kLast); + return kOperandTypeInfos[static_cast(bytecode)][operand_index] == + OperandTypeInfo::kScalableSignedByte; + } + + static bool OperandIsScalableUnsignedByte(Bytecode bytecode, + int operand_index) { + DCHECK(bytecode <= Bytecode::kLast); + return kOperandTypeInfos[static_cast(bytecode)][operand_index] == + OperandTypeInfo::kScalableUnsignedByte; + } + + static bool OperandIsScalable(Bytecode bytecode, int operand_index) { + return OperandIsScalableSignedByte(bytecode, operand_index) || + OperandIsScalableUnsignedByte(bytecode, operand_index); + } // Returns true if the bytecode has wider operand forms. static bool IsBytecodeWithScalableOperands(Bytecode bytecode); - // Returns true if the bytecode is a scaling prefix bytecode. - static bool IsPrefixScalingBytecode(Bytecode bytecode); + // Returns the size of the i-th operand of |bytecode|. + static OperandSize GetOperandSize(Bytecode bytecode, int i, + OperandScale operand_scale) { + CHECK_LT(i, NumberOfOperands(bytecode)); + return GetOperandSizes(bytecode, operand_scale)[i]; + } + + // Returns the operand sizes of |bytecode| with scale |operand_scale|. + static const OperandSize* GetOperandSizes(Bytecode bytecode, + OperandScale operand_scale) { + DCHECK(bytecode <= Bytecode::kLast); + DCHECK_GE(operand_scale, OperandScale::kSingle); + DCHECK_LE(operand_scale, OperandScale::kLast); + STATIC_ASSERT(static_cast(OperandScale::kQuadruple) == 4 && + OperandScale::kLast == OperandScale::kQuadruple); + int scale_index = static_cast(operand_scale) >> 1; + return kOperandSizes[static_cast(bytecode)][scale_index]; + } - // Returns true if |bytecode| puts a name in the accumulator. - static bool PutsNameInAccumulator(Bytecode bytecode); + // Returns the offset of the i-th operand of |bytecode| relative to the start + // of the bytecode. + static int GetOperandOffset(Bytecode bytecode, int i, + OperandScale operand_scale); + + // Returns the size of the bytecode including its operands for the + // given |operand_scale|. + static int Size(Bytecode bytecode, OperandScale operand_scale) { + DCHECK(bytecode <= Bytecode::kLast); + STATIC_ASSERT(static_cast(OperandScale::kQuadruple) == 4 && + OperandScale::kLast == OperandScale::kQuadruple); + int scale_index = static_cast(operand_scale) >> 1; + return kBytecodeSizes[static_cast(bytecode)][scale_index]; + } + + // Returns a debug break bytecode to replace |bytecode|. + static Bytecode GetDebugBreak(Bytecode bytecode); + + // Returns the equivalent jump bytecode without the accumulator coercion. + static Bytecode GetJumpWithoutToBoolean(Bytecode bytecode); + + // Returns true if the bytecode is a debug break. + static bool IsDebugBreak(Bytecode bytecode); // Returns true if |operand_type| is any type of register operand. static bool IsRegisterOperandType(OperandType operand_type); @@ -557,12 +648,30 @@ class Bytecodes final { static bool IsStarLookahead(Bytecode bytecode, OperandScale operand_scale); // Returns the number of registers represented by a register operand. For - // instance, a RegPair represents two registers. - static int GetNumberOfRegistersRepresentedBy(OperandType operand_type); - - // Returns true if |operand_type| is a maybe register operand - // (kMaybeReg). - static bool IsMaybeRegisterOperandType(OperandType operand_type); + // instance, a RegPair represents two registers. Should not be called for + // kRegList which has a variable number of registers based on the following + // kRegCount operand. + static int GetNumberOfRegistersRepresentedBy(OperandType operand_type) { + switch (operand_type) { + case OperandType::kReg: + case OperandType::kRegOut: + return 1; + case OperandType::kRegPair: + case OperandType::kRegOutPair: + return 2; + case OperandType::kRegOutTriple: + return 3; + case OperandType::kRegList: + UNREACHABLE(); + return 0; + default: + return 0; + } + return 0; + } + + // Returns the size of |operand| for |operand_scale|. + static OperandSize SizeOfOperand(OperandType operand, OperandScale scale); // Returns true if |operand_type| is a runtime-id operand (kRuntimeId). static bool IsRuntimeIdOperandType(OperandType operand_type); @@ -576,18 +685,55 @@ class Bytecodes final { // OperandScale values. static bool BytecodeHasHandler(Bytecode bytecode, OperandScale operand_scale); - // Return the operand size required to hold a signed operand. - static OperandSize SizeForSignedOperand(int value); - - // Return the operand size required to hold an unsigned operand. - static OperandSize SizeForUnsignedOperand(uint32_t value); + // Return the operand scale required to hold a signed operand with |value|. + static OperandScale ScaleForSignedOperand(int32_t value) { + if (value >= kMinInt8 && value <= kMaxInt8) { + return OperandScale::kSingle; + } else if (value >= kMinInt16 && value <= kMaxInt16) { + return OperandScale::kDouble; + } else { + return OperandScale::kQuadruple; + } + } + + // Return the operand scale required to hold an unsigned operand with |value|. + static OperandScale ScaleForUnsignedOperand(uint32_t value) { + if (value <= kMaxUInt8) { + return OperandScale::kSingle; + } else if (value <= kMaxUInt16) { + return OperandScale::kDouble; + } else { + return OperandScale::kQuadruple; + } + } + + // Return the operand size required to hold an unsigned operand with |value|. + static OperandSize SizeForUnsignedOperand(uint32_t value) { + if (value <= kMaxUInt8) { + return OperandSize::kByte; + } else if (value <= kMaxUInt16) { + return OperandSize::kShort; + } else { + return OperandSize::kQuad; + } + } + + private: + static const OperandType* const kOperandTypes[]; + static const OperandTypeInfo* const kOperandTypeInfos[]; + static const int kOperandCount[]; + static const int kNumberOfRegisterOperands[]; + static const AccumulatorUse kAccumulatorUse[]; + static const bool kIsScalable[]; + static const int kBytecodeSizes[][3]; + static const OperandSize* const kOperandSizes[][3]; }; +// TODO(rmcilroy): Remove once we switch to MSVC 2015 which supports constexpr. +// See crbug.com/603131. +#undef CONSTEXPR + std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode); -std::ostream& operator<<(std::ostream& os, const AccumulatorUse& use); -std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale); -std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size); -std::ostream& operator<<(std::ostream& os, const OperandType& operand_type); } // namespace interpreter } // namespace internal diff --git a/deps/v8/src/interpreter/constant-array-builder.cc b/deps/v8/src/interpreter/constant-array-builder.cc index ff3823fde2d14c..d2b799562383dd 100644 --- a/deps/v8/src/interpreter/constant-array-builder.cc +++ b/deps/v8/src/interpreter/constant-array-builder.cc @@ -4,6 +4,7 @@ #include "src/interpreter/constant-array-builder.h" +#include #include #include "src/isolate.h" @@ -72,9 +73,11 @@ STATIC_CONST_MEMBER_DEFINITION const size_t ConstantArrayBuilder::ConstantArrayBuilder(Zone* zone, Handle the_hole_value) - : constants_map_(zone), + : constants_map_(16, base::KeyEqualityMatcher
(), + ZoneAllocationPolicy(zone)), smi_map_(zone), smi_pairs_(zone), + zone_(zone), the_hole_value_(the_hole_value) { idx_slice_[0] = new (zone) ConstantArraySlice(zone, 0, k8BitCapacity, OperandSize::kByte); @@ -153,16 +156,11 @@ Handle ConstantArrayBuilder::ToFixedArray(Isolate* isolate) { } size_t ConstantArrayBuilder::Insert(Handle object) { - auto entry = constants_map_.find(object.address()); - return (entry == constants_map_.end()) ? AllocateEntry(object) - : entry->second; -} - -ConstantArrayBuilder::index_t ConstantArrayBuilder::AllocateEntry( - Handle object) { - index_t index = AllocateIndex(object); - constants_map_[object.address()] = index; - return index; + return constants_map_ + .LookupOrInsert(object.address(), ObjectHash(object.address()), + [&]() { return AllocateIndex(object); }, + ZoneAllocationPolicy(zone_)) + ->value; } ConstantArrayBuilder::index_t ConstantArrayBuilder::AllocateIndex( diff --git a/deps/v8/src/interpreter/constant-array-builder.h b/deps/v8/src/interpreter/constant-array-builder.h index 2018f256931c8e..78d36f50440c5b 100644 --- a/deps/v8/src/interpreter/constant-array-builder.h +++ b/deps/v8/src/interpreter/constant-array-builder.h @@ -7,7 +7,7 @@ #include "src/identity-map.h" #include "src/interpreter/bytecodes.h" -#include "src/zone-containers.h" +#include "src/zone/zone-containers.h" namespace v8 { namespace internal { @@ -70,7 +70,6 @@ class ConstantArrayBuilder final BASE_EMBEDDED { private: typedef uint32_t index_t; - index_t AllocateEntry(Handle object); index_t AllocateIndex(Handle object); index_t AllocateReservedEntry(Smi* value); @@ -108,9 +107,12 @@ class ConstantArrayBuilder final BASE_EMBEDDED { Handle the_hole_value() const { return the_hole_value_; } ConstantArraySlice* idx_slice_[3]; - ZoneMap constants_map_; + base::TemplateHashMapImpl, + ZoneAllocationPolicy> + constants_map_; ZoneMap smi_map_; ZoneVector> smi_pairs_; + Zone* zone_; Handle the_hole_value_; }; diff --git a/deps/v8/src/interpreter/control-flow-builders.cc b/deps/v8/src/interpreter/control-flow-builders.cc index 56cd481f9cdd50..0e71b96cce7b09 100644 --- a/deps/v8/src/interpreter/control-flow-builders.cc +++ b/deps/v8/src/interpreter/control-flow-builders.cc @@ -60,18 +60,14 @@ void LoopBuilder::LoopHeader(ZoneVector* additional_labels) { } } -void LoopBuilder::JumpToHeader() { +void LoopBuilder::JumpToHeader(int loop_depth) { + // Pass the proper loop nesting level to the backwards branch, to trigger + // on-stack replacement when armed for the given loop nesting depth. + int level = Min(loop_depth, AbstractCode::kMaxLoopNestingMarker - 1); // Loop must have closed form, i.e. all loop elements are within the loop, // the loop header precedes the body and next elements in the loop. DCHECK(loop_header_.is_bound()); - builder()->Jump(&loop_header_); -} - -void LoopBuilder::JumpToHeaderIfTrue() { - // Loop must have closed form, i.e. all loop elements are within the loop, - // the loop header precedes the body and next elements in the loop. - DCHECK(loop_header_.is_bound()); - builder()->JumpIfTrue(&loop_header_); + builder()->JumpLoop(&loop_header_, level); } void LoopBuilder::EndLoop() { diff --git a/deps/v8/src/interpreter/control-flow-builders.h b/deps/v8/src/interpreter/control-flow-builders.h index 5cd9b5bc99680a..3174db5da15fd5 100644 --- a/deps/v8/src/interpreter/control-flow-builders.h +++ b/deps/v8/src/interpreter/control-flow-builders.h @@ -8,7 +8,7 @@ #include "src/interpreter/bytecode-array-builder.h" #include "src/interpreter/bytecode-label.h" -#include "src/zone-containers.h" +#include "src/zone/zone-containers.h" namespace v8 { namespace internal { @@ -86,8 +86,7 @@ class LoopBuilder final : public BreakableControlFlowBuilder { ~LoopBuilder(); void LoopHeader(ZoneVector* additional_labels); - void JumpToHeader(); - void JumpToHeaderIfTrue(); + void JumpToHeader(int loop_depth); void BindContinueTarget(); void EndLoop(); @@ -99,9 +98,6 @@ class LoopBuilder final : public BreakableControlFlowBuilder { void ContinueIfUndefined() { EmitJumpIfUndefined(&continue_labels_); } void ContinueIfNull() { EmitJumpIfNull(&continue_labels_); } - BytecodeLabels* header_labels() { return &header_labels_; } - BytecodeLabels* continue_labels() { return &continue_labels_; } - private: BytecodeLabel loop_header_; diff --git a/deps/v8/src/interpreter/handler-table-builder.h b/deps/v8/src/interpreter/handler-table-builder.h index 26c45f4056651d..25147ca26bfefe 100644 --- a/deps/v8/src/interpreter/handler-table-builder.h +++ b/deps/v8/src/interpreter/handler-table-builder.h @@ -8,7 +8,7 @@ #include "src/handles.h" #include "src/interpreter/bytecode-register.h" #include "src/interpreter/bytecodes.h" -#include "src/zone-containers.h" +#include "src/zone/zone-containers.h" namespace v8 { namespace internal { diff --git a/deps/v8/src/interpreter/interpreter-assembler.cc b/deps/v8/src/interpreter/interpreter-assembler.cc index 227fd395ce2d36..5767ffa8a5a423 100644 --- a/deps/v8/src/interpreter/interpreter-assembler.cc +++ b/deps/v8/src/interpreter/interpreter-assembler.cc @@ -14,7 +14,7 @@ #include "src/interpreter/interpreter.h" #include "src/machine-type.h" #include "src/macro-assembler.h" -#include "src/zone.h" +#include "src/zone/zone.h" namespace v8 { namespace internal { @@ -84,6 +84,71 @@ void InterpreterAssembler::SetContext(Node* value) { StoreRegister(value, Register::current_context()); } +Node* InterpreterAssembler::GetContextAtDepth(Node* context, Node* depth) { + Variable cur_context(this, MachineRepresentation::kTaggedPointer); + cur_context.Bind(context); + + Variable cur_depth(this, MachineRepresentation::kWord32); + cur_depth.Bind(depth); + + Label context_found(this); + + Variable* context_search_loop_variables[2] = {&cur_depth, &cur_context}; + Label context_search(this, 2, context_search_loop_variables); + + // Fast path if the depth is 0. + BranchIfWord32Equal(depth, Int32Constant(0), &context_found, &context_search); + + // Loop until the depth is 0. + Bind(&context_search); + { + cur_depth.Bind(Int32Sub(cur_depth.value(), Int32Constant(1))); + cur_context.Bind( + LoadContextSlot(cur_context.value(), Context::PREVIOUS_INDEX)); + + BranchIfWord32Equal(cur_depth.value(), Int32Constant(0), &context_found, + &context_search); + } + + Bind(&context_found); + return cur_context.value(); +} + +void InterpreterAssembler::GotoIfHasContextExtensionUpToDepth(Node* context, + Node* depth, + Label* target) { + Variable cur_context(this, MachineRepresentation::kTaggedPointer); + cur_context.Bind(context); + + Variable cur_depth(this, MachineRepresentation::kWord32); + cur_depth.Bind(depth); + + Variable* context_search_loop_variables[2] = {&cur_depth, &cur_context}; + Label context_search(this, 2, context_search_loop_variables); + + // Loop until the depth is 0. + Goto(&context_search); + Bind(&context_search); + { + // TODO(leszeks): We only need to do this check if the context had a sloppy + // eval, we could pass in a context chain bitmask to figure out which + // contexts actually need to be checked. + + Node* extension_slot = + LoadContextSlot(cur_context.value(), Context::EXTENSION_INDEX); + + // Jump to the target if the extension slot is not a hole. + GotoIf(WordNotEqual(extension_slot, TheHoleConstant()), target); + + cur_depth.Bind(Int32Sub(cur_depth.value(), Int32Constant(1))); + cur_context.Bind( + LoadContextSlot(cur_context.value(), Context::PREVIOUS_INDEX)); + + GotoIf(Word32NotEqual(cur_depth.value(), Int32Constant(0)), + &context_search); + } +} + Node* InterpreterAssembler::BytecodeOffset() { return bytecode_offset_.value(); } @@ -341,6 +406,14 @@ Node* InterpreterAssembler::BytecodeOperandFlag(int operand_index) { return BytecodeUnsignedOperand(operand_index, operand_size); } +Node* InterpreterAssembler::BytecodeOperandUImm(int operand_index) { + DCHECK_EQ(OperandType::kUImm, + Bytecodes::GetOperandType(bytecode_, operand_index)); + OperandSize operand_size = + Bytecodes::GetOperandSize(bytecode_, operand_index, operand_scale()); + return BytecodeUnsignedOperand(operand_index, operand_size); +} + Node* InterpreterAssembler::BytecodeOperandImm(int operand_index) { DCHECK_EQ(OperandType::kImm, Bytecodes::GetOperandType(bytecode_, operand_index)); @@ -460,6 +533,18 @@ void InterpreterAssembler::CallEpilogue() { } } +Node* InterpreterAssembler::IncrementCallCount(Node* type_feedback_vector, + Node* slot_id) { + Comment("increment call count"); + Node* call_count_slot = IntPtrAdd(slot_id, IntPtrConstant(1)); + Node* call_count = + LoadFixedArrayElement(type_feedback_vector, call_count_slot); + Node* new_count = SmiAdd(call_count, SmiTag(Int32Constant(1))); + // Count is Smi, so we don't need a write barrier. + return StoreFixedArrayElement(type_feedback_vector, call_count_slot, + new_count, SKIP_WRITE_BARRIER); +} + Node* InterpreterAssembler::CallJSWithFeedback(Node* function, Node* context, Node* first_arg, Node* arg_count, Node* slot_id, @@ -481,15 +566,16 @@ Node* InterpreterAssembler::CallJSWithFeedback(Node* function, Node* context, WeakCell::kValueOffset == Symbol::kHashFieldSlot); Variable return_value(this, MachineRepresentation::kTagged); - Label handle_monomorphic(this), extra_checks(this), end(this), call(this); + Label handle_monomorphic(this), extra_checks(this), end(this), call(this), + call_function(this), call_without_feedback(this); // Slot id of 0 is used to indicate no typefeedback is available. Call using // call builtin. STATIC_ASSERT(TypeFeedbackVector::kReservedIndexCount > 0); Node* is_feedback_unavailable = Word32Equal(slot_id, Int32Constant(0)); - GotoIf(is_feedback_unavailable, &call); + GotoIf(is_feedback_unavailable, &call_without_feedback); - // The checks. First, does rdi match the recorded monomorphic target? + // The checks. First, does function match the recorded monomorphic target? Node* feedback_element = LoadFixedArrayElement(type_feedback_vector, slot_id); Node* feedback_value = LoadWeakCellValue(feedback_element); Node* is_monomorphic = WordEqual(function, feedback_value); @@ -503,13 +589,7 @@ Node* InterpreterAssembler::CallJSWithFeedback(Node* function, Node* context, GotoIf(is_smi, &extra_checks); // Increment the call count. - Node* call_count_slot = IntPtrAdd(slot_id, IntPtrConstant(1)); - Node* call_count = - LoadFixedArrayElement(type_feedback_vector, call_count_slot); - Node* new_count = SmiAdd(call_count, SmiTag(Int32Constant(1))); - // Count is Smi, so we don't need a write barrier. - StoreFixedArrayElement(type_feedback_vector, call_count_slot, new_count, - SKIP_WRITE_BARRIER); + IncrementCallCount(type_feedback_vector, slot_id); // Call using call function builtin. Callable callable = CodeFactory::InterpreterPushArgsAndCall( @@ -523,12 +603,42 @@ Node* InterpreterAssembler::CallJSWithFeedback(Node* function, Node* context, Bind(&extra_checks); { - Label check_initialized(this, Label::kDeferred), mark_megamorphic(this); + Label check_initialized(this, Label::kDeferred), mark_megamorphic(this), + check_allocation_site(this), + create_allocation_site(this, Label::kDeferred); // Check if it is a megamorphic target Node* is_megamorphic = WordEqual( feedback_element, HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate()))); - BranchIf(is_megamorphic, &call, &check_initialized); + BranchIf(is_megamorphic, &call, &check_allocation_site); + + Bind(&check_allocation_site); + { + Node* is_allocation_site = + WordEqual(LoadMap(feedback_element), + LoadRoot(Heap::kAllocationSiteMapRootIndex)); + GotoUnless(is_allocation_site, &check_initialized); + + // If it is not the Array() function, mark megamorphic. + Node* context_slot = + LoadFixedArrayElement(LoadNativeContext(context), + Int32Constant(Context::ARRAY_FUNCTION_INDEX)); + Node* is_array_function = WordEqual(context_slot, function); + GotoUnless(is_array_function, &mark_megamorphic); + + // It is a monomorphic Array function. Increment the call count. + IncrementCallCount(type_feedback_vector, slot_id); + + // Call ArrayConstructorStub. + Callable callable_call = + CodeFactory::InterpreterPushArgsAndConstructArray(isolate()); + Node* code_target_call = HeapConstant(callable_call.code()); + Node* ret_value = + CallStub(callable_call.descriptor(), code_target_call, context, + arg_count, function, feedback_element, first_arg); + return_value.Bind(ret_value); + Goto(&end); + } Bind(&check_initialized); { @@ -548,12 +658,12 @@ Node* InterpreterAssembler::CallJSWithFeedback(Node* function, Node* context, WordEqual(instance_type, Int32Constant(JS_FUNCTION_TYPE)); GotoUnless(is_js_function, &mark_megamorphic); - // Check that it is not the Array() function. + // Check if it is the Array() function. Node* context_slot = LoadFixedArrayElement(LoadNativeContext(context), Int32Constant(Context::ARRAY_FUNCTION_INDEX)); Node* is_array_function = WordEqual(context_slot, function); - GotoIf(is_array_function, &mark_megamorphic); + GotoIf(is_array_function, &create_allocation_site); // Check if the function belongs to the same native context Node* native_context = LoadNativeContext( @@ -562,23 +672,22 @@ Node* InterpreterAssembler::CallJSWithFeedback(Node* function, Node* context, WordEqual(native_context, LoadNativeContext(context)); GotoUnless(is_same_native_context, &mark_megamorphic); - // Initialize it to a monomorphic target. - Node* call_count_slot = IntPtrAdd(slot_id, IntPtrConstant(1)); - // Count is Smi, so we don't need a write barrier. - StoreFixedArrayElement(type_feedback_vector, call_count_slot, - SmiTag(Int32Constant(1)), SKIP_WRITE_BARRIER); - CreateWeakCellInFeedbackVector(type_feedback_vector, SmiTag(slot_id), function); // Call using call function builtin. - Callable callable = CodeFactory::InterpreterPushArgsAndCall( - isolate(), tail_call_mode, CallableType::kJSFunction); - Node* code_target = HeapConstant(callable.code()); - Node* ret_value = CallStub(callable.descriptor(), code_target, context, - arg_count, first_arg, function); - return_value.Bind(ret_value); - Goto(&end); + Goto(&call_function); + } + + Bind(&create_allocation_site); + { + CreateAllocationSiteInFeedbackVector(type_feedback_vector, + SmiTag(slot_id)); + + // Call using CallFunction builtin. CallICs have a PREMONOMORPHIC state. + // They start collecting feedback only when a call is executed the second + // time. So, do not pass any feedback here. + Goto(&call_function); } Bind(&mark_megamorphic); @@ -595,7 +704,36 @@ Node* InterpreterAssembler::CallJSWithFeedback(Node* function, Node* context, } } + Bind(&call_function); + { + // Increment the call count. + IncrementCallCount(type_feedback_vector, slot_id); + + Callable callable_call = CodeFactory::InterpreterPushArgsAndCall( + isolate(), tail_call_mode, CallableType::kJSFunction); + Node* code_target_call = HeapConstant(callable_call.code()); + Node* ret_value = CallStub(callable_call.descriptor(), code_target_call, + context, arg_count, first_arg, function); + return_value.Bind(ret_value); + Goto(&end); + } + Bind(&call); + { + // Increment the call count. + IncrementCallCount(type_feedback_vector, slot_id); + + // Call using call builtin. + Callable callable_call = CodeFactory::InterpreterPushArgsAndCall( + isolate(), tail_call_mode, CallableType::kAny); + Node* code_target_call = HeapConstant(callable_call.code()); + Node* ret_value = CallStub(callable_call.descriptor(), code_target_call, + context, arg_count, first_arg, function); + return_value.Bind(ret_value); + Goto(&end); + } + + Bind(&call_without_feedback); { // Call using call builtin. Callable callable_call = CodeFactory::InterpreterPushArgsAndCall( @@ -623,11 +761,169 @@ Node* InterpreterAssembler::CallJS(Node* function, Node* context, Node* InterpreterAssembler::CallConstruct(Node* constructor, Node* context, Node* new_target, Node* first_arg, - Node* arg_count) { - Callable callable = CodeFactory::InterpreterPushArgsAndConstruct(isolate()); - Node* code_target = HeapConstant(callable.code()); - return CallStub(callable.descriptor(), code_target, context, arg_count, - new_target, constructor, first_arg); + Node* arg_count, Node* slot_id, + Node* type_feedback_vector) { + Label call_construct(this), js_function(this), end(this); + Variable return_value(this, MachineRepresentation::kTagged); + Variable allocation_feedback(this, MachineRepresentation::kTagged); + allocation_feedback.Bind(UndefinedConstant()); + + // Slot id of 0 is used to indicate no type feedback is available. + STATIC_ASSERT(TypeFeedbackVector::kReservedIndexCount > 0); + Node* is_feedback_unavailable = Word32Equal(slot_id, Int32Constant(0)); + GotoIf(is_feedback_unavailable, &call_construct); + + // Check that the constructor is not a smi. + Node* is_smi = WordIsSmi(constructor); + GotoIf(is_smi, &call_construct); + + // Check that constructor is a JSFunction. + Node* instance_type = LoadInstanceType(constructor); + Node* is_js_function = + WordEqual(instance_type, Int32Constant(JS_FUNCTION_TYPE)); + BranchIf(is_js_function, &js_function, &call_construct); + + Bind(&js_function); + { + // Cache the called function in a feedback vector slot. Cache states + // are uninitialized, monomorphic (indicated by a JSFunction), and + // megamorphic. + // TODO(mythria/v8:5210): Check if it is better to mark extra_checks as a + // deferred block so that call_construct_function will be scheduled. + Label extra_checks(this), call_construct_function(this); + + Node* feedback_element = + LoadFixedArrayElement(type_feedback_vector, slot_id); + Node* feedback_value = LoadWeakCellValue(feedback_element); + Node* is_monomorphic = WordEqual(constructor, feedback_value); + BranchIf(is_monomorphic, &call_construct_function, &extra_checks); + + Bind(&extra_checks); + { + Label mark_megamorphic(this), initialize(this), + check_allocation_site(this), check_initialized(this), + set_alloc_feedback_and_call(this); + { + // Check if it is a megamorphic target + Comment("check if megamorphic"); + Node* is_megamorphic = WordEqual( + feedback_element, + HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate()))); + GotoIf(is_megamorphic, &call_construct_function); + + Comment("check if weak cell"); + Node* is_weak_cell = WordEqual(LoadMap(feedback_element), + LoadRoot(Heap::kWeakCellMapRootIndex)); + GotoUnless(is_weak_cell, &check_allocation_site); + // If the weak cell is cleared, we have a new chance to become + // monomorphic. + Comment("check if weak cell is cleared"); + Node* is_smi = WordIsSmi(feedback_value); + BranchIf(is_smi, &initialize, &mark_megamorphic); + } + + Bind(&check_allocation_site); + { + Comment("check if it is an allocation site"); + Node* is_allocation_site = + WordEqual(LoadObjectField(feedback_element, 0), + LoadRoot(Heap::kAllocationSiteMapRootIndex)); + GotoUnless(is_allocation_site, &check_initialized); + + // Make sure the function is the Array() function + Node* context_slot = + LoadFixedArrayElement(LoadNativeContext(context), + Int32Constant(Context::ARRAY_FUNCTION_INDEX)); + Node* is_array_function = WordEqual(context_slot, constructor); + BranchIf(is_array_function, &set_alloc_feedback_and_call, + &mark_megamorphic); + } + + Bind(&set_alloc_feedback_and_call); + { + allocation_feedback.Bind(feedback_element); + Goto(&call_construct_function); + } + + Bind(&check_initialized); + { + // Check if it is uninitialized. + Comment("check if uninitialized"); + Node* is_uninitialized = WordEqual( + feedback_element, LoadRoot(Heap::kuninitialized_symbolRootIndex)); + BranchIf(is_uninitialized, &initialize, &mark_megamorphic); + } + + Bind(&initialize); + { + Label create_weak_cell(this), create_allocation_site(this); + Comment("initialize the feedback element"); + // Check that it is the Array() function. + Node* context_slot = + LoadFixedArrayElement(LoadNativeContext(context), + Int32Constant(Context::ARRAY_FUNCTION_INDEX)); + Node* is_array_function = WordEqual(context_slot, constructor); + BranchIf(is_array_function, &create_allocation_site, &create_weak_cell); + + Bind(&create_allocation_site); + { + Node* site = CreateAllocationSiteInFeedbackVector( + type_feedback_vector, SmiTag(slot_id)); + allocation_feedback.Bind(site); + Goto(&call_construct_function); + } + + Bind(&create_weak_cell); + { + CreateWeakCellInFeedbackVector(type_feedback_vector, SmiTag(slot_id), + constructor); + Goto(&call_construct_function); + } + } + + Bind(&mark_megamorphic); + { + // MegamorphicSentinel is an immortal immovable object so + // write-barrier is not needed. + Comment("transition to megamorphic"); + DCHECK( + Heap::RootIsImmortalImmovable(Heap::kmegamorphic_symbolRootIndex)); + StoreFixedArrayElement( + type_feedback_vector, slot_id, + HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate())), + SKIP_WRITE_BARRIER); + Goto(&call_construct_function); + } + } + + Bind(&call_construct_function); + { + Comment("call using callConstructFunction"); + IncrementCallCount(type_feedback_vector, slot_id); + Callable callable_function = CodeFactory::InterpreterPushArgsAndConstruct( + isolate(), CallableType::kJSFunction); + return_value.Bind(CallStub(callable_function.descriptor(), + HeapConstant(callable_function.code()), + context, arg_count, new_target, constructor, + allocation_feedback.value(), first_arg)); + Goto(&end); + } + } + + Bind(&call_construct); + { + Comment("call using callConstruct builtin"); + Callable callable = CodeFactory::InterpreterPushArgsAndConstruct( + isolate(), CallableType::kAny); + Node* code_target = HeapConstant(callable.code()); + return_value.Bind(CallStub(callable.descriptor(), code_target, context, + arg_count, new_target, constructor, + UndefinedConstant(), first_arg)); + Goto(&end); + } + + Bind(&end); + return return_value.value(); } Node* InterpreterAssembler::CallRuntimeN(Node* function_id, Node* context, @@ -651,6 +947,9 @@ Node* InterpreterAssembler::CallRuntimeN(Node* function_id, Node* context, } void InterpreterAssembler::UpdateInterruptBudget(Node* weight) { + // TODO(rmcilroy): It might be worthwhile to only update the budget for + // backwards branches. Those are distinguishable by the {JumpLoop} bytecode. + Label ok(this), interrupt_check(this, Label::kDeferred), end(this); Node* budget_offset = IntPtrConstant(BytecodeArray::kInterruptBudgetOffset - kHeapObjectTag); diff --git a/deps/v8/src/interpreter/interpreter-assembler.h b/deps/v8/src/interpreter/interpreter-assembler.h index b3fa42fbf608eb..9dda20af4877ac 100644 --- a/deps/v8/src/interpreter/interpreter-assembler.h +++ b/deps/v8/src/interpreter/interpreter-assembler.h @@ -32,6 +32,9 @@ class InterpreterAssembler : public CodeStubAssembler { // Returns the index immediate for bytecode operand |operand_index| in the // current bytecode. compiler::Node* BytecodeOperandIdx(int operand_index); + // Returns the UImm8 immediate for bytecode operand |operand_index| in the + // current bytecode. + compiler::Node* BytecodeOperandUImm(int operand_index); // Returns the Imm8 immediate for bytecode operand |operand_index| in the // current bytecode. compiler::Node* BytecodeOperandImm(int operand_index); @@ -53,6 +56,15 @@ class InterpreterAssembler : public CodeStubAssembler { compiler::Node* GetContext(); void SetContext(compiler::Node* value); + // Context at |depth| in the context chain starting at |context|. + compiler::Node* GetContextAtDepth(compiler::Node* context, + compiler::Node* depth); + + // Goto the given |target| if the context chain starting at |context| has any + // extensions up to the given |depth|. + void GotoIfHasContextExtensionUpToDepth(compiler::Node* context, + compiler::Node* depth, Label* target); + // Number of registers. compiler::Node* RegisterCount(); @@ -92,6 +104,11 @@ class InterpreterAssembler : public CodeStubAssembler { // Load the TypeFeedbackVector for the current function. compiler::Node* LoadTypeFeedbackVector(); + // Increment the call count for a CALL_IC or construct call. + // The call count is located at feedback_vector[slot_id + 1]. + compiler::Node* IncrementCallCount(compiler::Node* type_feedback_vector, + compiler::Node* slot_id); + // Call JSFunction or Callable |function| with |arg_count| // arguments (not including receiver) and the first argument // located at |first_arg|. Type feedback is collected in the @@ -120,7 +137,9 @@ class InterpreterAssembler : public CodeStubAssembler { compiler::Node* context, compiler::Node* new_target, compiler::Node* first_arg, - compiler::Node* arg_count); + compiler::Node* arg_count, + compiler::Node* slot_id, + compiler::Node* type_feedback_vector); // Call runtime function with |arg_count| arguments and the first argument // located at |first_arg|. diff --git a/deps/v8/src/interpreter/interpreter.cc b/deps/v8/src/interpreter/interpreter.cc index 68f0342180de90..410030247fc78b 100644 --- a/deps/v8/src/interpreter/interpreter.cc +++ b/deps/v8/src/interpreter/interpreter.cc @@ -9,6 +9,7 @@ #include "src/ast/prettyprinter.h" #include "src/code-factory.h" +#include "src/compilation-info.h" #include "src/compiler.h" #include "src/factory.h" #include "src/interpreter/bytecode-flags.h" @@ -17,7 +18,7 @@ #include "src/interpreter/interpreter-assembler.h" #include "src/interpreter/interpreter-intrinsics.h" #include "src/log.h" -#include "src/zone.h" +#include "src/zone/zone.h" namespace v8 { namespace internal { @@ -150,14 +151,39 @@ int Interpreter::InterruptBudget() { } InterpreterCompilationJob::InterpreterCompilationJob(CompilationInfo* info) - : CompilationJob(info, "Ignition"), generator_(info) {} + : CompilationJob(info->isolate(), info, "Ignition"), generator_(info) {} InterpreterCompilationJob::Status InterpreterCompilationJob::PrepareJobImpl() { + if (FLAG_print_bytecode || FLAG_print_ast) { + OFStream os(stdout); + std::unique_ptr name = info()->GetDebugName(); + os << "[generating bytecode for function: " << info()->GetDebugName().get() + << "]" << std::endl + << std::flush; + } + +#ifdef DEBUG + if (info()->parse_info() && FLAG_print_ast) { + OFStream os(stdout); + os << "--- AST ---" << std::endl + << AstPrinter(info()->isolate()).PrintProgram(info()->literal()) + << std::endl + << std::flush; + } +#endif // DEBUG + return SUCCEEDED; } InterpreterCompilationJob::Status InterpreterCompilationJob::ExecuteJobImpl() { - generator()->GenerateBytecode(); + // TODO(5203): These timers aren't thread safe, move to using the CompilerJob + // timers. + RuntimeCallTimerScope runtimeTimer(info()->isolate(), + &RuntimeCallStats::CompileIgnition); + TimerEventScope timer(info()->isolate()); + TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.CompileIgnition"); + + generator()->GenerateBytecode(stack_limit()); if (generator()->HasStackOverflow()) { return FAILED; @@ -182,34 +208,8 @@ InterpreterCompilationJob::Status InterpreterCompilationJob::FinalizeJobImpl() { return SUCCEEDED; } -bool Interpreter::MakeBytecode(CompilationInfo* info) { - RuntimeCallTimerScope runtimeTimer(info->isolate(), - &RuntimeCallStats::CompileIgnition); - TimerEventScope timer(info->isolate()); - TRACE_EVENT_RUNTIME_CALL_STATS_TRACING_SCOPED( - info->isolate(), &tracing::TraceEventStatsTable::CompileIgnition); - - if (FLAG_print_bytecode || FLAG_print_ast) { - OFStream os(stdout); - std::unique_ptr name = info->GetDebugName(); - os << "[generating bytecode for function: " << info->GetDebugName().get() - << "]" << std::endl - << std::flush; - } - -#ifdef DEBUG - if (info->parse_info() && FLAG_print_ast) { - OFStream os(stdout); - os << "--- AST ---" << std::endl - << AstPrinter(info->isolate()).PrintProgram(info->literal()) << std::endl - << std::flush; - } -#endif // DEBUG - - InterpreterCompilationJob job(info); - if (job.PrepareJob() != CompilationJob::SUCCEEDED) return false; - if (job.ExecuteJob() != CompilationJob::SUCCEEDED) return false; - return job.FinalizeJob() == CompilationJob::SUCCEEDED; +CompilationJob* Interpreter::NewCompilationJob(CompilationInfo* info) { + return new InterpreterCompilationJob(info); } bool Interpreter::IsDispatchTableInitialized() { @@ -421,16 +421,14 @@ void Interpreter::DoMov(InterpreterAssembler* assembler) { __ Dispatch(); } -Node* Interpreter::BuildLoadGlobal(Callable ic, +Node* Interpreter::BuildLoadGlobal(Callable ic, Node* context, + Node* feedback_slot, InterpreterAssembler* assembler) { typedef LoadGlobalWithVectorDescriptor Descriptor; - // Get the global object. - Node* context = __ GetContext(); // Load the global via the LoadGlobalIC. Node* code_target = __ HeapConstant(ic.code()); - Node* raw_slot = __ BytecodeOperandIdx(0); - Node* smi_slot = __ SmiTag(raw_slot); + Node* smi_slot = __ SmiTag(feedback_slot); Node* type_feedback_vector = __ LoadTypeFeedbackVector(); return __ CallStub(ic.descriptor(), code_target, context, Arg(Descriptor::kSlot, smi_slot), @@ -444,7 +442,11 @@ Node* Interpreter::BuildLoadGlobal(Callable ic, void Interpreter::DoLdaGlobal(InterpreterAssembler* assembler) { Callable ic = CodeFactory::LoadGlobalICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF); - Node* result = BuildLoadGlobal(ic, assembler); + + Node* context = __ GetContext(); + + Node* raw_slot = __ BytecodeOperandIdx(0); + Node* result = BuildLoadGlobal(ic, context, raw_slot, assembler); __ SetAccumulator(result); __ Dispatch(); } @@ -456,7 +458,11 @@ void Interpreter::DoLdaGlobal(InterpreterAssembler* assembler) { void Interpreter::DoLdrGlobal(InterpreterAssembler* assembler) { Callable ic = CodeFactory::LoadGlobalICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF); - Node* result = BuildLoadGlobal(ic, assembler); + + Node* context = __ GetContext(); + + Node* raw_slot = __ BytecodeOperandIdx(0); + Node* result = BuildLoadGlobal(ic, context, raw_slot, assembler); Node* destination = __ BytecodeOperandReg(1); __ StoreRegister(result, destination); __ Dispatch(); @@ -469,7 +475,11 @@ void Interpreter::DoLdrGlobal(InterpreterAssembler* assembler) { void Interpreter::DoLdaGlobalInsideTypeof(InterpreterAssembler* assembler) { Callable ic = CodeFactory::LoadGlobalICInOptimizedCode(isolate_, INSIDE_TYPEOF); - Node* result = BuildLoadGlobal(ic, assembler); + + Node* context = __ GetContext(); + + Node* raw_slot = __ BytecodeOperandIdx(0); + Node* result = BuildLoadGlobal(ic, context, raw_slot, assembler); __ SetAccumulator(result); __ Dispatch(); } @@ -520,44 +530,51 @@ compiler::Node* Interpreter::BuildLoadContextSlot( Node* reg_index = __ BytecodeOperandReg(0); Node* context = __ LoadRegister(reg_index); Node* slot_index = __ BytecodeOperandIdx(1); - return __ LoadContextSlot(context, slot_index); + Node* depth = __ BytecodeOperandUImm(2); + Node* slot_context = __ GetContextAtDepth(context, depth); + return __ LoadContextSlot(slot_context, slot_index); } -// LdaContextSlot +// LdaContextSlot // -// Load the object in |slot_index| of |context| into the accumulator. +// Load the object in |slot_index| of the context at |depth| in the context +// chain starting at |context| into the accumulator. void Interpreter::DoLdaContextSlot(InterpreterAssembler* assembler) { Node* result = BuildLoadContextSlot(assembler); __ SetAccumulator(result); __ Dispatch(); } -// LdrContextSlot +// LdrContextSlot // -// Load the object in of into register . +// Load the object in |slot_index| of the context at |depth| in the context +// chain of |context| into register |reg|. void Interpreter::DoLdrContextSlot(InterpreterAssembler* assembler) { Node* result = BuildLoadContextSlot(assembler); - Node* destination = __ BytecodeOperandReg(2); + Node* destination = __ BytecodeOperandReg(3); __ StoreRegister(result, destination); __ Dispatch(); } -// StaContextSlot +// StaContextSlot // -// Stores the object in the accumulator into |slot_index| of |context|. +// Stores the object in the accumulator into |slot_index| of the context at +// |depth| in the context chain starting at |context|. void Interpreter::DoStaContextSlot(InterpreterAssembler* assembler) { Node* value = __ GetAccumulator(); Node* reg_index = __ BytecodeOperandReg(0); Node* context = __ LoadRegister(reg_index); Node* slot_index = __ BytecodeOperandIdx(1); - __ StoreContextSlot(context, slot_index, value); + Node* depth = __ BytecodeOperandUImm(2); + Node* slot_context = __ GetContextAtDepth(context, depth); + __ StoreContextSlot(slot_context, slot_index, value); __ Dispatch(); } void Interpreter::DoLdaLookupSlot(Runtime::FunctionId function_id, InterpreterAssembler* assembler) { - Node* index = __ BytecodeOperandIdx(0); - Node* name = __ LoadConstantPoolEntry(index); + Node* name_index = __ BytecodeOperandIdx(0); + Node* name = __ LoadConstantPoolEntry(name_index); Node* context = __ GetContext(); Node* result = __ CallRuntime(function_id, context, name); __ SetAccumulator(result); @@ -580,6 +597,103 @@ void Interpreter::DoLdaLookupSlotInsideTypeof(InterpreterAssembler* assembler) { DoLdaLookupSlot(Runtime::kLoadLookupSlotInsideTypeof, assembler); } +void Interpreter::DoLdaLookupContextSlot(Runtime::FunctionId function_id, + InterpreterAssembler* assembler) { + Node* context = __ GetContext(); + Node* name_index = __ BytecodeOperandIdx(0); + Node* slot_index = __ BytecodeOperandIdx(1); + Node* depth = __ BytecodeOperandUImm(2); + + Label slowpath(assembler, Label::kDeferred); + + // Check for context extensions to allow the fast path. + __ GotoIfHasContextExtensionUpToDepth(context, depth, &slowpath); + + // Fast path does a normal load context. + { + Node* slot_context = __ GetContextAtDepth(context, depth); + Node* result = __ LoadContextSlot(slot_context, slot_index); + __ SetAccumulator(result); + __ Dispatch(); + } + + // Slow path when we have to call out to the runtime. + __ Bind(&slowpath); + { + Node* name = __ LoadConstantPoolEntry(name_index); + Node* result = __ CallRuntime(function_id, context, name); + __ SetAccumulator(result); + __ Dispatch(); + } +} + +// LdaLookupSlot +// +// Lookup the object with the name in constant pool entry |name_index| +// dynamically. +void Interpreter::DoLdaLookupContextSlot(InterpreterAssembler* assembler) { + DoLdaLookupContextSlot(Runtime::kLoadLookupSlot, assembler); +} + +// LdaLookupSlotInsideTypeof +// +// Lookup the object with the name in constant pool entry |name_index| +// dynamically without causing a NoReferenceError. +void Interpreter::DoLdaLookupContextSlotInsideTypeof( + InterpreterAssembler* assembler) { + DoLdaLookupContextSlot(Runtime::kLoadLookupSlotInsideTypeof, assembler); +} + +void Interpreter::DoLdaLookupGlobalSlot(Runtime::FunctionId function_id, + InterpreterAssembler* assembler) { + Node* context = __ GetContext(); + Node* name_index = __ BytecodeOperandIdx(0); + Node* feedback_slot = __ BytecodeOperandIdx(1); + Node* depth = __ BytecodeOperandUImm(2); + + Label slowpath(assembler, Label::kDeferred); + + // Check for context extensions to allow the fast path + __ GotoIfHasContextExtensionUpToDepth(context, depth, &slowpath); + + // Fast path does a normal load global + { + Callable ic = CodeFactory::LoadGlobalICInOptimizedCode( + isolate_, function_id == Runtime::kLoadLookupSlotInsideTypeof + ? INSIDE_TYPEOF + : NOT_INSIDE_TYPEOF); + Node* result = BuildLoadGlobal(ic, context, feedback_slot, assembler); + __ SetAccumulator(result); + __ Dispatch(); + } + + // Slow path when we have to call out to the runtime + __ Bind(&slowpath); + { + Node* name = __ LoadConstantPoolEntry(name_index); + Node* result = __ CallRuntime(function_id, context, name); + __ SetAccumulator(result); + __ Dispatch(); + } +} + +// LdaLookupGlobalSlot +// +// Lookup the object with the name in constant pool entry |name_index| +// dynamically. +void Interpreter::DoLdaLookupGlobalSlot(InterpreterAssembler* assembler) { + DoLdaLookupGlobalSlot(Runtime::kLoadLookupSlot, assembler); +} + +// LdaLookupGlobalSlotInsideTypeof +// +// Lookup the object with the name in constant pool entry |name_index| +// dynamically without causing a NoReferenceError. +void Interpreter::DoLdaLookupGlobalSlotInsideTypeof( + InterpreterAssembler* assembler) { + DoLdaLookupGlobalSlot(Runtime::kLoadLookupSlotInsideTypeof, assembler); +} + void Interpreter::DoStaLookupSlot(LanguageMode language_mode, InterpreterAssembler* assembler) { Node* value = __ GetAccumulator(); @@ -816,6 +930,80 @@ void Interpreter::DoBinaryOpWithFeedback(InterpreterAssembler* assembler) { __ Dispatch(); } +template +void Interpreter::DoCompareOpWithFeedback(InterpreterAssembler* assembler) { + Node* reg_index = __ BytecodeOperandReg(0); + Node* lhs = __ LoadRegister(reg_index); + Node* rhs = __ GetAccumulator(); + Node* context = __ GetContext(); + Node* slot_index = __ BytecodeOperandIdx(1); + Node* type_feedback_vector = __ LoadTypeFeedbackVector(); + + // TODO(interpreter): the only reason this check is here is because we + // sometimes emit comparisons that shouldn't collect feedback (e.g. + // try-finally blocks and generators), and we could get rid of this by + // introducing Smi equality tests. + Label skip_feedback_update(assembler); + __ GotoIf(__ WordEqual(slot_index, __ IntPtrConstant(0)), + &skip_feedback_update); + + Variable var_type_feedback(assembler, MachineRepresentation::kWord32); + Label lhs_is_smi(assembler), lhs_is_not_smi(assembler), + gather_rhs_type(assembler), do_compare(assembler); + __ Branch(__ WordIsSmi(lhs), &lhs_is_smi, &lhs_is_not_smi); + + __ Bind(&lhs_is_smi); + var_type_feedback.Bind( + __ Int32Constant(CompareOperationFeedback::kSignedSmall)); + __ Goto(&gather_rhs_type); + + __ Bind(&lhs_is_not_smi); + { + Label lhs_is_number(assembler), lhs_is_not_number(assembler); + Node* lhs_map = __ LoadMap(lhs); + __ Branch(__ WordEqual(lhs_map, __ HeapNumberMapConstant()), &lhs_is_number, + &lhs_is_not_number); + + __ Bind(&lhs_is_number); + var_type_feedback.Bind(__ Int32Constant(CompareOperationFeedback::kNumber)); + __ Goto(&gather_rhs_type); + + __ Bind(&lhs_is_not_number); + var_type_feedback.Bind(__ Int32Constant(CompareOperationFeedback::kAny)); + __ Goto(&do_compare); + } + + __ Bind(&gather_rhs_type); + { + Label rhs_is_smi(assembler); + __ GotoIf(__ WordIsSmi(rhs), &rhs_is_smi); + + Node* rhs_map = __ LoadMap(rhs); + Node* rhs_type = + __ Select(__ WordEqual(rhs_map, __ HeapNumberMapConstant()), + __ Int32Constant(CompareOperationFeedback::kNumber), + __ Int32Constant(CompareOperationFeedback::kAny)); + var_type_feedback.Bind(__ Word32Or(var_type_feedback.value(), rhs_type)); + __ Goto(&do_compare); + + __ Bind(&rhs_is_smi); + var_type_feedback.Bind( + __ Word32Or(var_type_feedback.value(), + __ Int32Constant(CompareOperationFeedback::kSignedSmall))); + __ Goto(&do_compare); + } + + __ Bind(&do_compare); + __ UpdateFeedback(var_type_feedback.value(), type_feedback_vector, + slot_index); + __ Goto(&skip_feedback_update); + + __ Bind(&skip_feedback_update); + Node* result = Generator::Generate(assembler, lhs, rhs, context); + __ SetAccumulator(result); + __ Dispatch(); +} + // Add // // Add register to accumulator. @@ -1227,25 +1415,29 @@ void Interpreter::DoUnaryOpWithFeedback(InterpreterAssembler* assembler) { // ToName // -// Cast the object referenced by the accumulator to a name. +// Convert the object referenced by the accumulator to a name. void Interpreter::DoToName(InterpreterAssembler* assembler) { - Node* result = BuildUnaryOp(CodeFactory::ToName(isolate_), assembler); + Node* object = __ GetAccumulator(); + Node* context = __ GetContext(); + Node* result = __ ToName(context, object); __ StoreRegister(result, __ BytecodeOperandReg(0)); __ Dispatch(); } // ToNumber // -// Cast the object referenced by the accumulator to a number. +// Convert the object referenced by the accumulator to a number. void Interpreter::DoToNumber(InterpreterAssembler* assembler) { - Node* result = BuildUnaryOp(CodeFactory::ToNumber(isolate_), assembler); + Node* object = __ GetAccumulator(); + Node* context = __ GetContext(); + Node* result = __ ToNumber(context, object); __ StoreRegister(result, __ BytecodeOperandReg(0)); __ Dispatch(); } // ToObject // -// Cast the object referenced by the accumulator to a JSObject. +// Convert the object referenced by the accumulator to a JSReceiver. void Interpreter::DoToObject(InterpreterAssembler* assembler) { Node* result = BuildUnaryOp(CodeFactory::ToObject(isolate_), assembler); __ StoreRegister(result, __ BytecodeOperandReg(0)); @@ -1395,7 +1587,12 @@ void Interpreter::DoTailCall(InterpreterAssembler* assembler) { DoJSCall(assembler, TailCallMode::kAllow); } -void Interpreter::DoCallRuntimeCommon(InterpreterAssembler* assembler) { +// CallRuntime +// +// Call the runtime function |function_id| with the first argument in +// register |first_arg| and |arg_count| arguments in subsequent +// registers. +void Interpreter::DoCallRuntime(InterpreterAssembler* assembler) { Node* function_id = __ BytecodeOperandRuntimeId(0); Node* first_arg_reg = __ BytecodeOperandReg(1); Node* first_arg = __ RegisterLocation(first_arg_reg); @@ -1406,15 +1603,6 @@ void Interpreter::DoCallRuntimeCommon(InterpreterAssembler* assembler) { __ Dispatch(); } -// CallRuntime -// -// Call the runtime function |function_id| with the first argument in -// register |first_arg| and |arg_count| arguments in subsequent -// registers. -void Interpreter::DoCallRuntime(InterpreterAssembler* assembler) { - DoCallRuntimeCommon(assembler); -} - // InvokeIntrinsic // // Implements the semantic equivalent of calling the runtime function @@ -1432,7 +1620,13 @@ void Interpreter::DoInvokeIntrinsic(InterpreterAssembler* assembler) { __ Dispatch(); } -void Interpreter::DoCallRuntimeForPairCommon(InterpreterAssembler* assembler) { +// CallRuntimeForPair +// +// Call the runtime function |function_id| which returns a pair, with the +// first argument in register |first_arg| and |arg_count| arguments in +// subsequent registers. Returns the result in and +// +void Interpreter::DoCallRuntimeForPair(InterpreterAssembler* assembler) { // Call the runtime function. Node* function_id = __ BytecodeOperandRuntimeId(0); Node* first_arg_reg = __ BytecodeOperandReg(1); @@ -1452,17 +1646,11 @@ void Interpreter::DoCallRuntimeForPairCommon(InterpreterAssembler* assembler) { __ Dispatch(); } -// CallRuntimeForPair +// CallJSRuntime // -// Call the runtime function |function_id| which returns a pair, with the -// first argument in register |first_arg| and |arg_count| arguments in -// subsequent registers. Returns the result in and -// -void Interpreter::DoCallRuntimeForPair(InterpreterAssembler* assembler) { - DoCallRuntimeForPairCommon(assembler); -} - -void Interpreter::DoCallJSRuntimeCommon(InterpreterAssembler* assembler) { +// Call the JS runtime function that has the |context_index| with the receiver +// in register |receiver| and |arg_count| arguments in subsequent registers. +void Interpreter::DoCallJSRuntime(InterpreterAssembler* assembler) { Node* context_index = __ BytecodeOperandIdx(0); Node* receiver_reg = __ BytecodeOperandReg(1); Node* first_arg = __ RegisterLocation(receiver_reg); @@ -1483,15 +1671,13 @@ void Interpreter::DoCallJSRuntimeCommon(InterpreterAssembler* assembler) { __ Dispatch(); } -// CallJSRuntime +// New // -// Call the JS runtime function that has the |context_index| with the receiver -// in register |receiver| and |arg_count| arguments in subsequent registers. -void Interpreter::DoCallJSRuntime(InterpreterAssembler* assembler) { - DoCallJSRuntimeCommon(assembler); -} - -void Interpreter::DoCallConstruct(InterpreterAssembler* assembler) { +// Call operator new with |constructor| and the first argument in +// register |first_arg| and |arg_count| arguments in subsequent +// registers. The new.target is in the accumulator. +// +void Interpreter::DoNew(InterpreterAssembler* assembler) { Callable ic = CodeFactory::InterpreterPushArgsAndConstruct(isolate_); Node* new_target = __ GetAccumulator(); Node* constructor_reg = __ BytecodeOperandReg(0); @@ -1499,56 +1685,48 @@ void Interpreter::DoCallConstruct(InterpreterAssembler* assembler) { Node* first_arg_reg = __ BytecodeOperandReg(1); Node* first_arg = __ RegisterLocation(first_arg_reg); Node* args_count = __ BytecodeOperandCount(2); + Node* slot_id = __ BytecodeOperandIdx(3); + Node* type_feedback_vector = __ LoadTypeFeedbackVector(); Node* context = __ GetContext(); - Node* result = - __ CallConstruct(constructor, context, new_target, first_arg, args_count); + Node* result = __ CallConstruct(constructor, context, new_target, first_arg, + args_count, slot_id, type_feedback_vector); __ SetAccumulator(result); __ Dispatch(); } -// New -// -// Call operator new with |constructor| and the first argument in -// register |first_arg| and |arg_count| arguments in subsequent -// registers. The new.target is in the accumulator. -// -void Interpreter::DoNew(InterpreterAssembler* assembler) { - DoCallConstruct(assembler); -} - // TestEqual // // Test if the value in the register equals the accumulator. void Interpreter::DoTestEqual(InterpreterAssembler* assembler) { - DoBinaryOp(assembler); + DoCompareOpWithFeedback(assembler); } // TestNotEqual // // Test if the value in the register is not equal to the accumulator. void Interpreter::DoTestNotEqual(InterpreterAssembler* assembler) { - DoBinaryOp(assembler); + DoCompareOpWithFeedback(assembler); } // TestEqualStrict // // Test if the value in the register is strictly equal to the accumulator. void Interpreter::DoTestEqualStrict(InterpreterAssembler* assembler) { - DoBinaryOp(assembler); + DoCompareOpWithFeedback(assembler); } // TestLessThan // // Test if the value in the register is less than the accumulator. void Interpreter::DoTestLessThan(InterpreterAssembler* assembler) { - DoBinaryOp(assembler); + DoCompareOpWithFeedback(assembler); } // TestGreaterThan // // Test if the value in the register is greater than the accumulator. void Interpreter::DoTestGreaterThan(InterpreterAssembler* assembler) { - DoBinaryOp(assembler); + DoCompareOpWithFeedback(assembler); } // TestLessThanOrEqual @@ -1556,7 +1734,7 @@ void Interpreter::DoTestGreaterThan(InterpreterAssembler* assembler) { // Test if the value in the register is less than or equal to the // accumulator. void Interpreter::DoTestLessThanOrEqual(InterpreterAssembler* assembler) { - DoBinaryOp(assembler); + DoCompareOpWithFeedback(assembler); } // TestGreaterThanOrEqual @@ -1564,7 +1742,7 @@ void Interpreter::DoTestLessThanOrEqual(InterpreterAssembler* assembler) { // Test if the value in the register is greater than or equal to the // accumulator. void Interpreter::DoTestGreaterThanOrEqual(InterpreterAssembler* assembler) { - DoBinaryOp(assembler); + DoCompareOpWithFeedback(assembler); } // TestIn @@ -1783,6 +1961,35 @@ void Interpreter::DoJumpIfNotHoleConstant(InterpreterAssembler* assembler) { __ JumpIfWordNotEqual(accumulator, the_hole_value, relative_jump); } +// JumpLoop +// +// Jump by number of bytes represented by the immediate operand |imm|. Also +// performs a loop nesting check and potentially triggers OSR in case the +// current OSR level matches (or exceeds) the specified |loop_depth|. +void Interpreter::DoJumpLoop(InterpreterAssembler* assembler) { + Node* relative_jump = __ BytecodeOperandImm(0); + Node* loop_depth = __ BytecodeOperandImm(1); + Node* osr_level = __ LoadOSRNestingLevel(); + + // Check if OSR points at the given {loop_depth} are armed by comparing it to + // the current {osr_level} loaded from the header of the BytecodeArray. + Label ok(assembler), osr_armed(assembler, Label::kDeferred); + Node* condition = __ Int32GreaterThanOrEqual(loop_depth, osr_level); + __ Branch(condition, &ok, &osr_armed); + + __ Bind(&ok); + __ Jump(relative_jump); + + __ Bind(&osr_armed); + { + Callable callable = CodeFactory::InterpreterOnStackReplacement(isolate_); + Node* target = __ HeapConstant(callable.code()); + Node* context = __ GetContext(); + __ CallStub(callable.descriptor(), target, context); + __ Jump(relative_jump); + } +} + // CreateRegExpLiteral // // Creates a regular expression literal for literal index with @@ -1804,21 +2011,47 @@ void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) { // CreateArrayLiteral // -// Creates an array literal for literal index with flags -// and constant elements in . +// Creates an array literal for literal index with +// CreateArrayLiteral flags and constant elements in . void Interpreter::DoCreateArrayLiteral(InterpreterAssembler* assembler) { - Node* index = __ BytecodeOperandIdx(0); - Node* constant_elements = __ LoadConstantPoolEntry(index); Node* literal_index_raw = __ BytecodeOperandIdx(1); Node* literal_index = __ SmiTag(literal_index_raw); - Node* flags_raw = __ BytecodeOperandFlag(2); - Node* flags = __ SmiTag(flags_raw); Node* closure = __ LoadRegister(Register::function_closure()); Node* context = __ GetContext(); - Node* result = __ CallRuntime(Runtime::kCreateArrayLiteral, context, closure, - literal_index, constant_elements, flags); - __ SetAccumulator(result); - __ Dispatch(); + Node* bytecode_flags = __ BytecodeOperandFlag(2); + + Label fast_shallow_clone(assembler), + call_runtime(assembler, Label::kDeferred); + Node* use_fast_shallow_clone = __ Word32And( + bytecode_flags, + __ Int32Constant(CreateArrayLiteralFlags::FastShallowCloneBit::kMask)); + __ BranchIf(use_fast_shallow_clone, &fast_shallow_clone, &call_runtime); + + __ Bind(&fast_shallow_clone); + { + DCHECK(FLAG_allocation_site_pretenuring); + Node* result = FastCloneShallowArrayStub::Generate( + assembler, closure, literal_index, context, &call_runtime, + TRACK_ALLOCATION_SITE); + __ SetAccumulator(result); + __ Dispatch(); + } + + __ Bind(&call_runtime); + { + STATIC_ASSERT(CreateArrayLiteralFlags::FlagsBits::kShift == 0); + Node* flags_raw = __ Word32And( + bytecode_flags, + __ Int32Constant(CreateArrayLiteralFlags::FlagsBits::kMask)); + Node* flags = __ SmiTag(flags_raw); + Node* index = __ BytecodeOperandIdx(0); + Node* constant_elements = __ LoadConstantPoolEntry(index); + Node* result = + __ CallRuntime(Runtime::kCreateArrayLiteral, context, closure, + literal_index, constant_elements, flags); + __ SetAccumulator(result); + __ Dispatch(); + } } // CreateObjectLiteral @@ -1915,19 +2148,22 @@ void Interpreter::DoCreateBlockContext(InterpreterAssembler* assembler) { __ Dispatch(); } -// CreateCatchContext +// CreateCatchContext // // Creates a new context for a catch block with the |exception| in a register, -// the variable name at |index| and the closure in the accumulator. +// the variable name at |name_idx|, the ScopeInfo at |scope_info_idx|, and the +// closure in the accumulator. void Interpreter::DoCreateCatchContext(InterpreterAssembler* assembler) { Node* exception_reg = __ BytecodeOperandReg(0); Node* exception = __ LoadRegister(exception_reg); - Node* index = __ BytecodeOperandIdx(1); - Node* name = __ LoadConstantPoolEntry(index); + Node* name_idx = __ BytecodeOperandIdx(1); + Node* name = __ LoadConstantPoolEntry(name_idx); + Node* scope_info_idx = __ BytecodeOperandIdx(2); + Node* scope_info = __ LoadConstantPoolEntry(scope_info_idx); Node* closure = __ GetAccumulator(); Node* context = __ GetContext(); __ SetAccumulator(__ CallRuntime(Runtime::kPushCatchContext, context, name, - exception, closure)); + exception, scope_info, closure)); __ Dispatch(); } @@ -1936,24 +2172,27 @@ void Interpreter::DoCreateCatchContext(InterpreterAssembler* assembler) { // Creates a new context with number of |slots| for the function closure. void Interpreter::DoCreateFunctionContext(InterpreterAssembler* assembler) { Node* closure = __ LoadRegister(Register::function_closure()); - Node* slots = __ BytecodeOperandIdx(0); + Node* slots = __ BytecodeOperandUImm(0); Node* context = __ GetContext(); __ SetAccumulator( FastNewFunctionContextStub::Generate(assembler, closure, slots, context)); __ Dispatch(); } -// CreateWithContext +// CreateWithContext // -// Creates a new context for a with-statement with the object in |register| and -// the closure in the accumulator. +// Creates a new context with the ScopeInfo at |scope_info_idx| for a +// with-statement with the object in |register| and the closure in the +// accumulator. void Interpreter::DoCreateWithContext(InterpreterAssembler* assembler) { Node* reg_index = __ BytecodeOperandReg(0); Node* object = __ LoadRegister(reg_index); + Node* scope_info_idx = __ BytecodeOperandIdx(1); + Node* scope_info = __ LoadConstantPoolEntry(scope_info_idx); Node* closure = __ GetAccumulator(); Node* context = __ GetContext(); - __ SetAccumulator( - __ CallRuntime(Runtime::kPushWithContext, context, object, closure)); + __ SetAccumulator(__ CallRuntime(Runtime::kPushWithContext, context, object, + scope_info, closure)); __ Dispatch(); } @@ -2047,32 +2286,6 @@ void Interpreter::DoStackCheck(InterpreterAssembler* assembler) { } } -// OsrPoll -// -// Performs a loop nesting check and potentially triggers OSR. -void Interpreter::DoOsrPoll(InterpreterAssembler* assembler) { - Node* loop_depth = __ BytecodeOperandImm(0); - Node* osr_level = __ LoadOSRNestingLevel(); - - // Check if OSR points at the given {loop_depth} are armed by comparing it to - // the current {osr_level} loaded from the header of the BytecodeArray. - Label ok(assembler), osr_armed(assembler, Label::kDeferred); - Node* condition = __ Int32GreaterThanOrEqual(loop_depth, osr_level); - __ Branch(condition, &ok, &osr_armed); - - __ Bind(&ok); - __ Dispatch(); - - __ Bind(&osr_armed); - { - Callable callable = CodeFactory::InterpreterOnStackReplacement(isolate_); - Node* target = __ HeapConstant(callable.code()); - Node* context = __ GetContext(); - __ CallStub(callable.descriptor(), target, context); - __ Dispatch(); - } -} - // Throw // // Throws the exception in the accumulator. @@ -2158,9 +2371,8 @@ void Interpreter::DoForInPrepare(InterpreterAssembler* assembler) { if (FLAG_debug_code) { Label already_receiver(assembler), abort(assembler); Node* instance_type = __ LoadInstanceType(receiver); - Node* first_receiver_type = __ Int32Constant(FIRST_JS_RECEIVER_TYPE); - __ BranchIfInt32GreaterThanOrEqual(instance_type, first_receiver_type, - &already_receiver, &abort); + __ Branch(__ IsJSReceiverInstanceType(instance_type), &already_receiver, + &abort); __ Bind(&abort); { __ Abort(kExpectedJSReceiver); @@ -2260,10 +2472,10 @@ void Interpreter::DoForInNext(InterpreterAssembler* assembler) { } } -// ForInDone +// ForInContinue // -// Returns true if the end of the enumerable properties has been reached. -void Interpreter::DoForInDone(InterpreterAssembler* assembler) { +// Returns false if the end of the enumerable properties has been reached. +void Interpreter::DoForInContinue(InterpreterAssembler* assembler) { Node* index_reg = __ BytecodeOperandReg(0); Node* index = __ LoadRegister(index_reg); Node* cache_length_reg = __ BytecodeOperandReg(1); @@ -2274,12 +2486,12 @@ void Interpreter::DoForInDone(InterpreterAssembler* assembler) { __ BranchIfWordEqual(index, cache_length, &if_true, &if_false); __ Bind(&if_true); { - __ SetAccumulator(__ BooleanConstant(true)); + __ SetAccumulator(__ BooleanConstant(false)); __ Goto(&end); } __ Bind(&if_false); { - __ SetAccumulator(__ BooleanConstant(false)); + __ SetAccumulator(__ BooleanConstant(true)); __ Goto(&end); } __ Bind(&end); diff --git a/deps/v8/src/interpreter/interpreter.h b/deps/v8/src/interpreter/interpreter.h index bbd01029994d67..b646bf83138c3c 100644 --- a/deps/v8/src/interpreter/interpreter.h +++ b/deps/v8/src/interpreter/interpreter.h @@ -22,6 +22,7 @@ namespace internal { class Isolate; class Callable; class CompilationInfo; +class CompilationJob; namespace compiler { class Node; @@ -42,8 +43,8 @@ class Interpreter { // Returns the interrupt budget which should be used for the profiler counter. static int InterruptBudget(); - // Generate bytecode for |info|. - static bool MakeBytecode(CompilationInfo* info); + // Creates a compilation job which will generate bytecode for |info|. + static CompilationJob* NewCompilationJob(CompilationInfo* info); // Return bytecode handler for |bytecode|. Code* GetBytecodeHandler(Bytecode bytecode, OperandScale operand_scale); @@ -55,7 +56,7 @@ class Interpreter { void TraceCodegen(Handle code); const char* LookupNameOfBytecodeHandler(Code* code); - Local GetDispatchCountersObject(); + V8_EXPORT_PRIVATE Local GetDispatchCountersObject(); Address dispatch_table_address() { return reinterpret_cast
(&dispatch_table_[0]); @@ -83,6 +84,11 @@ class Interpreter { template void DoBinaryOpWithFeedback(InterpreterAssembler* assembler); + // Generates code to perform the comparison via |Generator| while gathering + // type feedback. + template + void DoCompareOpWithFeedback(InterpreterAssembler* assembler); + // Generates code to perform the bitwise binary operation corresponding to // |bitwise_op| while gathering type feedback. void DoBitwiseBinaryOp(Token::Value bitwise_op, @@ -118,18 +124,6 @@ class Interpreter { // Generates code to perform a JS call that collects type feedback. void DoJSCall(InterpreterAssembler* assembler, TailCallMode tail_call_mode); - // Generates code to perform a runtime call. - void DoCallRuntimeCommon(InterpreterAssembler* assembler); - - // Generates code to perform a runtime call returning a pair. - void DoCallRuntimeForPairCommon(InterpreterAssembler* assembler); - - // Generates code to perform a JS runtime call. - void DoCallJSRuntimeCommon(InterpreterAssembler* assembler); - - // Generates code to perform a constructor call. - void DoCallConstruct(InterpreterAssembler* assembler); - // Generates code to perform delete via function_id. void DoDelete(Runtime::FunctionId function_id, InterpreterAssembler* assembler); @@ -138,18 +132,28 @@ class Interpreter { void DoLdaLookupSlot(Runtime::FunctionId function_id, InterpreterAssembler* assembler); - // Generates code to perform a lookup slot store depending on |language_mode|. + // Generates code to perform a lookup slot load via |function_id| that can + // fast path to a context slot load. + void DoLdaLookupContextSlot(Runtime::FunctionId function_id, + InterpreterAssembler* assembler); + + // Generates code to perform a lookup slot load via |function_id| that can + // fast path to a global load. + void DoLdaLookupGlobalSlot(Runtime::FunctionId function_id, + InterpreterAssembler* assembler); + + // Generates code to perform a lookup slot store depending on + // |language_mode|. void DoStaLookupSlot(LanguageMode language_mode, InterpreterAssembler* assembler); - // Generates a node with the undefined constant. - compiler::Node* BuildLoadUndefined(InterpreterAssembler* assembler); - // Generates code to load a context slot. compiler::Node* BuildLoadContextSlot(InterpreterAssembler* assembler); // Generates code to load a global. - compiler::Node* BuildLoadGlobal(Callable ic, InterpreterAssembler* assembler); + compiler::Node* BuildLoadGlobal(Callable ic, compiler::Node* context, + compiler::Node* feedback_slot, + InterpreterAssembler* assembler); // Generates code to load a named property. compiler::Node* BuildLoadNamedProperty(Callable ic, diff --git a/deps/v8/src/interpreter/mkpeephole.cc b/deps/v8/src/interpreter/mkpeephole.cc index 8e9d5fea478fa7..270fe83ef9c3a7 100644 --- a/deps/v8/src/interpreter/mkpeephole.cc +++ b/deps/v8/src/interpreter/mkpeephole.cc @@ -146,6 +146,9 @@ PeepholeActionAndData PeepholeActionTableWriter::LookupActionAndData( Bytecode::kIllegal}; } + // TODO(rmcilroy): Add elide for consecutive mov to and from the same + // register. + // Remove ToBoolean coercion from conditional jumps where possible. if (Bytecodes::WritesBooleanToAccumulator(last)) { if (Bytecodes::IsJumpIfToBoolean(current)) { diff --git a/deps/v8/src/isolate-inl.h b/deps/v8/src/isolate-inl.h index 5c71d9188ec51d..34c98bba645a5a 100644 --- a/deps/v8/src/isolate-inl.h +++ b/deps/v8/src/isolate-inl.h @@ -76,6 +76,11 @@ bool Isolate::is_catchable_by_javascript(Object* exception) { return exception != heap()->termination_exception(); } +bool Isolate::is_catchable_by_wasm(Object* exception) { + return is_catchable_by_javascript(exception) && + (exception->IsNumber() || exception->IsSmi()); +} + void Isolate::FireBeforeCallEnteredCallback() { for (int i = 0; i < before_call_entered_callbacks_.length(); i++) { before_call_entered_callbacks_.at(i)(reinterpret_cast(this)); @@ -100,20 +105,6 @@ Isolate::ExceptionScope::~ExceptionScope() { isolate_->set_pending_exception(*pending_exception_); } -SaveContext::SaveContext(Isolate* isolate) - : isolate_(isolate), prev_(isolate->save_context()) { - if (isolate->context() != NULL) { - context_ = Handle(isolate->context()); - } - isolate->set_save_context(this); - c_entry_fp_ = isolate->c_entry_fp(isolate->thread_local_top()); -} - -SaveContext::~SaveContext() { - isolate_->set_context(context_.is_null() ? NULL : *context_); - isolate_->set_save_context(prev_); -} - #define NATIVE_CONTEXT_FIELD_ACCESSOR(index, type, name) \ Handle Isolate::name() { \ return Handle(raw_native_context()->name(), this); \ @@ -147,6 +138,11 @@ bool Isolate::IsHasInstanceLookupChainIntact() { return has_instance_cell->value() == Smi::FromInt(kArrayProtectorValid); } +bool Isolate::IsStringLengthOverflowIntact() { + PropertyCell* has_instance_cell = heap()->string_length_protector(); + return has_instance_cell->value() == Smi::FromInt(kArrayProtectorValid); +} + } // namespace internal } // namespace v8 diff --git a/deps/v8/src/isolate.cc b/deps/v8/src/isolate.cc index e14db60385e6b4..63c927b04c3a7b 100644 --- a/deps/v8/src/isolate.cc +++ b/deps/v8/src/isolate.cc @@ -10,7 +10,6 @@ #include #include "src/ast/context-slot-cache.h" -#include "src/base/accounting-allocator.h" #include "src/base/hashmap.h" #include "src/base/platform/platform.h" #include "src/base/sys-info.h" @@ -28,6 +27,7 @@ #include "src/external-reference-table.h" #include "src/frames-inl.h" #include "src/ic/stub-cache.h" +#include "src/interface-descriptors.h" #include "src/interpreter/interpreter.h" #include "src/isolate-inl.h" #include "src/libsampler/sampler.h" @@ -43,6 +43,7 @@ #include "src/version.h" #include "src/vm-state-inl.h" #include "src/wasm/wasm-module.h" +#include "src/zone/accounting-allocator.h" namespace v8 { namespace internal { @@ -315,21 +316,7 @@ void Isolate::PushStackTraceAndDie(unsigned int magic, void* ptr1, void* ptr2, base::OS::Abort(); } -static Handle MaybeGrow(Isolate* isolate, - Handle elements, - int cur_position, int new_size) { - if (new_size > elements->length()) { - int new_capacity = JSObject::NewElementsCapacity(elements->length()); - Handle new_elements = - isolate->factory()->NewFixedArrayWithHoles(new_capacity); - for (int i = 0; i < cur_position; i++) { - new_elements->set(i, elements->get(i)); - } - elements = new_elements; - } - DCHECK(new_size <= elements->length()); - return elements; -} +namespace { class StackTraceHelper { public: @@ -351,21 +338,17 @@ class StackTraceHelper { break; } encountered_strict_function_ = false; - sloppy_frames_ = 0; } + // Poison stack frames below the first strict mode frame. // The stack trace API should not expose receivers and function // objects on frames deeper than the top-most one with a strict mode - // function. The number of sloppy frames is stored as first element in - // the result array. - void CountSloppyFrames(JSFunction* fun) { + // function. + bool IsStrictFrame(JSFunction* fun) { if (!encountered_strict_function_) { - if (is_strict(fun->shared()->language_mode())) { - encountered_strict_function_ = true; - } else { - sloppy_frames_++; - } + encountered_strict_function_ = is_strict(fun->shared()->language_mode()); } + return encountered_strict_function_; } // Determines whether the given stack frame should be displayed in a stack @@ -375,8 +358,6 @@ class StackTraceHelper { IsInSameSecurityContext(fun); } - int sloppy_frames() const { return sloppy_frames_; } - private: // This mechanism excludes a number of uninteresting frames from the stack // trace. This can be be the first frame (which will be a builtin-exit frame @@ -422,12 +403,9 @@ class StackTraceHelper { const Handle caller_; bool skip_next_frame_; - int sloppy_frames_; bool encountered_strict_function_; }; -namespace { - // TODO(jgruber): Fix all cases in which frames give us a hole value (e.g. the // receiver in RegExp constructor frames. Handle TheHoleToUndefined(Isolate* isolate, Handle in) { @@ -435,35 +413,36 @@ Handle TheHoleToUndefined(Isolate* isolate, Handle in) { ? Handle::cast(isolate->factory()->undefined_value()) : in; } + +bool GetStackTraceLimit(Isolate* isolate, int* result) { + Handle error = isolate->error_function(); + + Handle key = isolate->factory()->stackTraceLimit_string(); + Handle stack_trace_limit = JSReceiver::GetDataProperty(error, key); + if (!stack_trace_limit->IsNumber()) return false; + + // Ensure that limit is not negative. + *result = Max(FastD2IChecked(stack_trace_limit->Number()), 0); + return true; } +} // namespace + Handle Isolate::CaptureSimpleStackTrace(Handle error_object, FrameSkipMode mode, Handle caller) { DisallowJavascriptExecution no_js(this); - // Get stack trace limit. - Handle error = error_function(); - Handle stackTraceLimit = - factory()->InternalizeUtf8String("stackTraceLimit"); - DCHECK(!stackTraceLimit.is_null()); - Handle stack_trace_limit = - JSReceiver::GetDataProperty(error, stackTraceLimit); - if (!stack_trace_limit->IsNumber()) return factory()->undefined_value(); - int limit = FastD2IChecked(stack_trace_limit->Number()); - limit = Max(limit, 0); // Ensure that limit is not negative. - - int initial_size = Min(limit, 10); - Handle elements = - factory()->NewFixedArrayWithHoles(initial_size * 4 + 1); + int limit; + if (!GetStackTraceLimit(this, &limit)) return factory()->undefined_value(); + + const int initial_size = Min(limit, 10); + Handle elements = factory()->NewFrameArray(initial_size); StackTraceHelper helper(this, mode, caller); - // First element is reserved to store the number of sloppy frames. - int cursor = 1; - int frames_seen = 0; - for (StackFrameIterator iter(this); !iter.done() && frames_seen < limit; - iter.Advance()) { + for (StackFrameIterator iter(this); + !iter.done() && elements->FrameCount() < limit; iter.Advance()) { StackFrame* frame = iter.frame(); switch (frame->type()) { @@ -481,26 +460,27 @@ Handle Isolate::CaptureSimpleStackTrace(Handle error_object, // Filter out internal frames that we do not want to show. if (!helper.IsVisibleInStackTrace(*fun)) continue; - helper.CountSloppyFrames(*fun); Handle recv = frames[i].receiver(); Handle abstract_code = frames[i].abstract_code(); + const int offset = frames[i].code_offset(); + + bool force_constructor = false; if (frame->type() == StackFrame::BUILTIN) { // Help CallSite::IsConstructor correctly detect hand-written // construct stubs. - Code* code = Code::cast(*abstract_code); - if (code->is_construct_stub()) { - recv = handle(heap()->call_site_constructor_symbol(), this); + if (Code::cast(*abstract_code)->is_construct_stub()) { + force_constructor = true; } } - Handle offset(Smi::FromInt(frames[i].code_offset()), this); - - elements = MaybeGrow(this, elements, cursor, cursor + 4); - elements->set(cursor++, *TheHoleToUndefined(this, recv)); - elements->set(cursor++, *fun); - elements->set(cursor++, *abstract_code); - elements->set(cursor++, *offset); - frames_seen++; + + int flags = 0; + if (helper.IsStrictFrame(*fun)) flags |= FrameArray::kIsStrict; + if (force_constructor) flags |= FrameArray::kForceConstructor; + + elements = FrameArray::AppendJSFrame( + elements, TheHoleToUndefined(this, recv), fun, abstract_code, + offset, flags); } } break; @@ -510,54 +490,49 @@ Handle Isolate::CaptureSimpleStackTrace(Handle error_object, // Filter out internal frames that we do not want to show. if (!helper.IsVisibleInStackTrace(*fun)) continue; - helper.CountSloppyFrames(*fun); - Handle code = handle(exit_frame->LookupCode(), this); - int offset = + Handle recv(exit_frame->receiver(), this); + Handle code(exit_frame->LookupCode(), this); + const int offset = static_cast(exit_frame->pc() - code->instruction_start()); - // In order to help CallSite::IsConstructor detect builtin constructors, - // we reuse the receiver field to pass along a special symbol. - Handle recv; - if (exit_frame->IsConstructor()) { - recv = factory()->call_site_constructor_symbol(); - } else { - recv = handle(exit_frame->receiver(), this); - } + int flags = 0; + if (helper.IsStrictFrame(*fun)) flags |= FrameArray::kIsStrict; + if (exit_frame->IsConstructor()) flags |= FrameArray::kForceConstructor; - elements = MaybeGrow(this, elements, cursor, cursor + 4); - elements->set(cursor++, *recv); - elements->set(cursor++, *fun); - elements->set(cursor++, *code); - elements->set(cursor++, Smi::FromInt(offset)); - frames_seen++; + elements = FrameArray::AppendJSFrame(elements, recv, fun, + Handle::cast(code), + offset, flags); } break; case StackFrame::WASM: { WasmFrame* wasm_frame = WasmFrame::cast(frame); + Handle wasm_object(wasm_frame->wasm_obj(), this); + const int wasm_function_index = wasm_frame->function_index(); Code* code = wasm_frame->unchecked_code(); - Handle abstract_code = - Handle(AbstractCode::cast(code), this); - int offset = + Handle abstract_code(AbstractCode::cast(code), this); + const int offset = static_cast(wasm_frame->pc() - code->instruction_start()); - elements = MaybeGrow(this, elements, cursor, cursor + 4); - elements->set(cursor++, wasm_frame->wasm_obj()); - elements->set(cursor++, Smi::FromInt(wasm_frame->function_index())); - elements->set(cursor++, *abstract_code); - elements->set(cursor++, Smi::FromInt(offset)); - frames_seen++; + + // TODO(wasm): The wasm object returned by the WasmFrame should always + // be a wasm object. + DCHECK(wasm::IsWasmObject(*wasm_object) || + wasm_object->IsUndefined(this)); + + elements = FrameArray::AppendWasmFrame( + elements, wasm_object, wasm_function_index, abstract_code, offset, + FrameArray::kIsWasmFrame); } break; default: break; } } - elements->set(0, Smi::FromInt(helper.sloppy_frames())); - elements->Shrink(cursor); - Handle result = factory()->NewJSArrayWithElements(elements); - result->set_length(Smi::FromInt(cursor)); + + elements->ShrinkToFit(); + // TODO(yangguo): Queue this structured stack trace for preprocessing on GC. - return result; + return factory()->NewJSArrayWithElements(elements); } MaybeHandle Isolate::CaptureAndSetDetailedStackTrace( @@ -764,19 +739,6 @@ class CaptureStackTraceHelper { Handle constructor_key_; }; - -int PositionFromStackTrace(Handle elements, int index) { - DisallowHeapAllocation no_gc; - Object* maybe_code = elements->get(index + 2); - if (maybe_code->IsSmi()) { - return Smi::cast(maybe_code)->value(); - } else { - AbstractCode* abstract_code = AbstractCode::cast(maybe_code); - int code_offset = Smi::cast(elements->get(index + 3))->value(); - return abstract_code->SourcePosition(code_offset); - } -} - Handle Isolate::CaptureCurrentStackTrace( int frame_limit, StackTrace::StackTraceOptions options) { DisallowJavascriptExecution no_js(this); @@ -963,6 +925,10 @@ bool Isolate::MayAccess(Handle accessing_context, Object* Isolate::StackOverflow() { + if (FLAG_abort_on_stack_overflow) { + FATAL("Aborting on stack overflow"); + } + DisallowJavascriptExecution no_js(this); HandleScope scope(this); @@ -979,7 +945,8 @@ Object* Isolate::StackOverflow() { #ifdef VERIFY_HEAP if (FLAG_verify_heap && FLAG_stress_compaction) { - heap()->CollectAllGarbage(Heap::kNoGCFlags, "trigger compaction"); + heap()->CollectAllGarbage(Heap::kNoGCFlags, + GarbageCollectionReason::kTesting); } #endif // VERIFY_HEAP @@ -1017,6 +984,8 @@ void Isolate::RequestInterrupt(InterruptCallback callback, void* data) { void Isolate::InvokeApiInterruptCallbacks() { + RuntimeCallTimerScope runtimeTimer( + this, &RuntimeCallStats::InvokeApiInterruptCallbacks); // Note: callback below should be called outside of execution access lock. while (true) { InterruptEntry entry; @@ -1180,8 +1149,8 @@ Object* Isolate::UnwindAndFindHandler() { Address handler_sp = nullptr; Address handler_fp = nullptr; - // Special handling of termination exceptions, uncatchable by JavaScript code, - // we unwind the handlers until the top ENTRY handler is found. + // Special handling of termination exceptions, uncatchable by JavaScript and + // Wasm code, we unwind the handlers until the top ENTRY handler is found. bool catchable_by_js = is_catchable_by_javascript(exception); // Compute handler and stack unwinding information by performing a full walk @@ -1203,6 +1172,28 @@ Object* Isolate::UnwindAndFindHandler() { break; } + if (FLAG_wasm_eh_prototype) { + if (frame->is_wasm() && is_catchable_by_wasm(exception)) { + int stack_slots = 0; // Will contain stack slot count of frame. + WasmFrame* wasm_frame = static_cast(frame); + offset = wasm_frame->LookupExceptionHandlerInTable(&stack_slots); + if (offset >= 0) { + // Compute the stack pointer from the frame pointer. This ensures that + // argument slots on the stack are dropped as returning would. + Address return_sp = frame->fp() + + StandardFrameConstants::kFixedFrameSizeAboveFp - + stack_slots * kPointerSize; + + // Gather information from the frame. + code = frame->LookupCode(); + + handler_sp = return_sp; + handler_fp = frame->fp(); + break; + } + } + } + // For optimized frames we perform a lookup in the handler table. if (frame->is_optimized() && catchable_by_js) { OptimizedFrame* js_frame = static_cast(frame); @@ -1349,6 +1340,8 @@ Isolate::CatchType Isolate::PredictExceptionCatcher() { JavaScriptFrame* js_frame = static_cast(frame); HandlerTable::CatchPrediction prediction = PredictException(js_frame); if (prediction == HandlerTable::DESUGARING) return CAUGHT_BY_DESUGARING; + if (prediction == HandlerTable::ASYNC_AWAIT) return CAUGHT_BY_ASYNC_AWAIT; + if (prediction == HandlerTable::PROMISE) return CAUGHT_BY_PROMISE; if (prediction != HandlerTable::UNCAUGHT) return CAUGHT_BY_JAVASCRIPT; } @@ -1425,36 +1418,20 @@ Object* Isolate::PromoteScheduledException() { void Isolate::PrintCurrentStackTrace(FILE* out) { - StackTraceFrameIterator it(this); - while (!it.done()) { + for (StackTraceFrameIterator it(this); !it.done(); it.Advance()) { + if (!it.is_javascript()) continue; + HandleScope scope(this); - // Find code position if recorded in relocation info. - StandardFrame* frame = it.frame(); - AbstractCode* abstract_code; - int code_offset; - if (frame->is_interpreted()) { - InterpretedFrame* iframe = reinterpret_cast(frame); - abstract_code = AbstractCode::cast(iframe->GetBytecodeArray()); - code_offset = iframe->GetBytecodeOffset(); - } else { - DCHECK(frame->is_java_script() || frame->is_wasm()); - Code* code = frame->LookupCode(); - abstract_code = AbstractCode::cast(code); - code_offset = static_cast(frame->pc() - code->instruction_start()); - } - int pos = abstract_code->SourcePosition(code_offset); - JavaScriptFrame* js_frame = JavaScriptFrame::cast(frame); - Handle pos_obj(Smi::FromInt(pos), this); - // Fetch function and receiver. - Handle fun(js_frame->function(), this); - Handle recv(js_frame->receiver(), this); - // Advance to the next JavaScript frame and determine if the - // current frame is the top-level frame. - it.Advance(); - Handle is_top_level = factory()->ToBoolean(it.done()); - // Generate and print stack trace line. - Handle line = - Execution::GetStackTraceLine(recv, fun, pos_obj, is_top_level); + JavaScriptFrame* frame = it.javascript_frame(); + + Handle receiver(frame->receiver(), this); + Handle function(frame->function(), this); + Handle code(AbstractCode::cast(frame->LookupCode()), this); + const int offset = + static_cast(frame->pc() - code->instruction_start()); + + JSStackFrame site(this, receiver, function, code, offset); + Handle line = site.ToString().ToHandleChecked(); if (line->length() > 0) { line->PrintOn(out); PrintF(out, "\n"); @@ -1522,22 +1499,25 @@ bool Isolate::ComputeLocationFromStackTrace(MessageLocation* target, if (!property->IsJSArray()) return false; Handle simple_stack_trace = Handle::cast(property); - Handle elements(FixedArray::cast(simple_stack_trace->elements())); - int elements_limit = Smi::cast(simple_stack_trace->length())->value(); + Handle elements(FrameArray::cast(simple_stack_trace->elements())); - for (int i = 1; i < elements_limit; i += 4) { - Handle fun_obj = handle(elements->get(i + 1), this); - if (fun_obj->IsSmi()) { + const int frame_count = elements->FrameCount(); + for (int i = 0; i < frame_count; i++) { + if (elements->IsWasmFrame(i)) { // TODO(clemensh): handle wasm frames return false; } - Handle fun = Handle::cast(fun_obj); + + Handle fun = handle(elements->Function(i), this); if (!fun->shared()->IsSubjectToDebugging()) continue; Object* script = fun->shared()->script(); if (script->IsScript() && !(Script::cast(script)->source()->IsUndefined(this))) { - int pos = PositionFromStackTrace(elements, i); + AbstractCode* abstract_code = elements->Code(i); + const int code_offset = elements->Offset(i)->value(); + const int pos = abstract_code->SourcePosition(code_offset); + Handle