(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["jsQR"] = factory(); else root["jsQR"] = factory(); })(typeof self !== 'undefined' ? self : this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 3); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BitMatrix = /** @class */ (function () { function BitMatrix(data, width) { this.width = width; this.height = data.length / width; this.data = data; } BitMatrix.createEmpty = function (width, height) { return new BitMatrix(new Uint8ClampedArray(width * height), width); }; BitMatrix.prototype.get = function (x, y) { if (x < 0 || x >= this.width || y < 0 || y >= this.height) { return false; } return !!this.data[y * this.width + x]; }; BitMatrix.prototype.set = function (x, y, v) { this.data[y * this.width + x] = v ? 1 : 0; }; BitMatrix.prototype.setRegion = function (left, top, width, height, v) { for (var y = top; y < top + height; y++) { for (var x = left; x < left + width; x++) { this.set(x, y, !!v); } } }; return BitMatrix; }()); exports.BitMatrix = BitMatrix; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GenericGFPoly_1 = __webpack_require__(2); function addOrSubtractGF(a, b) { return a ^ b; // tslint:disable-line:no-bitwise } exports.addOrSubtractGF = addOrSubtractGF; var GenericGF = /** @class */ (function () { function GenericGF(primitive, size, genBase) { this.primitive = primitive; this.size = size; this.generatorBase = genBase; this.expTable = new Array(this.size); this.logTable = new Array(this.size); var x = 1; for (var i = 0; i < this.size; i++) { this.expTable[i] = x; x = x * 2; if (x >= this.size) { x = (x ^ this.primitive) & (this.size - 1); // tslint:disable-line:no-bitwise } } for (var i = 0; i < this.size - 1; i++) { this.logTable[this.expTable[i]] = i; } this.zero = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([0])); this.one = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([1])); } GenericGF.prototype.multiply = function (a, b) { if (a === 0 || b === 0) { return 0; } return this.expTable[(this.logTable[a] + this.logTable[b]) % (this.size - 1)]; }; GenericGF.prototype.inverse = function (a) { if (a === 0) { throw new Error("Can't invert 0"); } return this.expTable[this.size - this.logTable[a] - 1]; }; GenericGF.prototype.buildMonomial = function (degree, coefficient) { if (degree < 0) { throw new Error("Invalid monomial degree less than 0"); } if (coefficient === 0) { return this.zero; } var coefficients = new Uint8ClampedArray(degree + 1); coefficients[0] = coefficient; return new GenericGFPoly_1.default(this, coefficients); }; GenericGF.prototype.log = function (a) { if (a === 0) { throw new Error("Can't take log(0)"); } return this.logTable[a]; }; GenericGF.prototype.exp = function (a) { return this.expTable[a]; }; return GenericGF; }()); exports.default = GenericGF; /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GenericGF_1 = __webpack_require__(1); var GenericGFPoly = /** @class */ (function () { function GenericGFPoly(field, coefficients) { if (coefficients.length === 0) { throw new Error("No coefficients."); } this.field = field; var coefficientsLength = coefficients.length; if (coefficientsLength > 1 && coefficients[0] === 0) { // Leading term must be non-zero for anything except the constant polynomial "0" var firstNonZero = 1; while (firstNonZero < coefficientsLength && coefficients[firstNonZero] === 0) { firstNonZero++; } if (firstNonZero === coefficientsLength) { this.coefficients = field.zero.coefficients; } else { this.coefficients = new Uint8ClampedArray(coefficientsLength - firstNonZero); for (var i = 0; i < this.coefficients.length; i++) { this.coefficients[i] = coefficients[firstNonZero + i]; } } } else { this.coefficients = coefficients; } } GenericGFPoly.prototype.degree = function () { return this.coefficients.length - 1; }; GenericGFPoly.prototype.isZero = function () { return this.coefficients[0] === 0; }; GenericGFPoly.prototype.getCoefficient = function (degree) { return this.coefficients[this.coefficients.length - 1 - degree]; }; GenericGFPoly.prototype.addOrSubtract = function (other) { var _a; if (this.isZero()) { return other; } if (other.isZero()) { return this; } var smallerCoefficients = this.coefficients; var largerCoefficients = other.coefficients; if (smallerCoefficients.length > largerCoefficients.length) { _a = [largerCoefficients, smallerCoefficients], smallerCoefficients = _a[0], largerCoefficients = _a[1]; } var sumDiff = new Uint8ClampedArray(largerCoefficients.length); var lengthDiff = largerCoefficients.length - smallerCoefficients.length; for (var i = 0; i < lengthDiff; i++) { sumDiff[i] = largerCoefficients[i]; } for (var i = lengthDiff; i < largerCoefficients.length; i++) { sumDiff[i] = GenericGF_1.addOrSubtractGF(smallerCoefficients[i - lengthDiff], largerCoefficients[i]); } return new GenericGFPoly(this.field, sumDiff); }; GenericGFPoly.prototype.multiply = function (scalar) { if (scalar === 0) { return this.field.zero; } if (scalar === 1) { return this; } var size = this.coefficients.length; var product = new Uint8ClampedArray(size); for (var i = 0; i < size; i++) { product[i] = this.field.multiply(this.coefficients[i], scalar); } return new GenericGFPoly(this.field, product); }; GenericGFPoly.prototype.multiplyPoly = function (other) { if (this.isZero() || other.isZero()) { return this.field.zero; } var aCoefficients = this.coefficients; var aLength = aCoefficients.length; var bCoefficients = other.coefficients; var bLength = bCoefficients.length; var product = new Uint8ClampedArray(aLength + bLength - 1); for (var i = 0; i < aLength; i++) { var aCoeff = aCoefficients[i]; for (var j = 0; j < bLength; j++) { product[i + j] = GenericGF_1.addOrSubtractGF(product[i + j], this.field.multiply(aCoeff, bCoefficients[j])); } } return new GenericGFPoly(this.field, product); }; GenericGFPoly.prototype.multiplyByMonomial = function (degree, coefficient) { if (degree < 0) { throw new Error("Invalid degree less than 0"); } if (coefficient === 0) { return this.field.zero; } var size = this.coefficients.length; var product = new Uint8ClampedArray(size + degree); for (var i = 0; i < size; i++) { product[i] = this.field.multiply(this.coefficients[i], coefficient); } return new GenericGFPoly(this.field, product); }; GenericGFPoly.prototype.evaluateAt = function (a) { var result = 0; if (a === 0) { // Just return the x^0 coefficient return this.getCoefficient(0); } var size = this.coefficients.length; if (a === 1) { // Just the sum of the coefficients this.coefficients.forEach(function (coefficient) { result = GenericGF_1.addOrSubtractGF(result, coefficient); }); return result; } result = this.coefficients[0]; for (var i = 1; i < size; i++) { result = GenericGF_1.addOrSubtractGF(this.field.multiply(a, result), this.coefficients[i]); } return result; }; return GenericGFPoly; }()); exports.default = GenericGFPoly; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var binarizer_1 = __webpack_require__(4); var decoder_1 = __webpack_require__(5); var extractor_1 = __webpack_require__(11); var locator_1 = __webpack_require__(12); function scan(matrix) { var locations = locator_1.locate(matrix); if (!locations) { return null; } for (var _i = 0, locations_1 = locations; _i < locations_1.length; _i++) { var location_1 = locations_1[_i]; var extracted = extractor_1.extract(matrix, location_1); var decoded = decoder_1.decode(extracted.matrix); if (decoded) { return { binaryData: decoded.bytes, data: decoded.text, chunks: decoded.chunks, version: decoded.version, location: { topRightCorner: extracted.mappingFunction(location_1.dimension, 0), topLeftCorner: extracted.mappingFunction(0, 0), bottomRightCorner: extracted.mappingFunction(location_1.dimension, location_1.dimension), bottomLeftCorner: extracted.mappingFunction(0, location_1.dimension), topRightFinderPattern: location_1.topRight, topLeftFinderPattern: location_1.topLeft, bottomLeftFinderPattern: location_1.bottomLeft, bottomRightAlignmentPattern: location_1.alignmentPattern, }, }; } } return null; } var defaultOptions = { inversionAttempts: "attemptBoth", }; function jsQR(data, width, height, providedOptions) { if (providedOptions === void 0) { providedOptions = {}; } var options = defaultOptions; Object.keys(options || {}).forEach(function (opt) { options[opt] = providedOptions[opt] || options[opt]; }); var shouldInvert = options.inversionAttempts === "attemptBoth" || options.inversionAttempts === "invertFirst"; var tryInvertedFirst = options.inversionAttempts === "onlyInvert" || options.inversionAttempts === "invertFirst"; var _a = binarizer_1.binarize(data, width, height, shouldInvert), binarized = _a.binarized, inverted = _a.inverted; var result = scan(tryInvertedFirst ? inverted : binarized); if (!result && (options.inversionAttempts === "attemptBoth" || options.inversionAttempts === "invertFirst")) { result = scan(tryInvertedFirst ? binarized : inverted); } return result; } jsQR.default = jsQR; exports.default = jsQR; /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BitMatrix_1 = __webpack_require__(0); var REGION_SIZE = 8; var MIN_DYNAMIC_RANGE = 24; function numBetween(value, min, max) { return value < min ? min : value > max ? max : value; } // Like BitMatrix but accepts arbitry Uint8 values var Matrix = /** @class */ (function () { function Matrix(width, height) { this.width = width; this.data = new Uint8ClampedArray(width * height); } Matrix.prototype.get = function (x, y) { return this.data[y * this.width + x]; }; Matrix.prototype.set = function (x, y, value) { this.data[y * this.width + x] = value; }; return Matrix; }()); function binarize(data, width, height, returnInverted) { if (data.length !== width * height * 4) { throw new Error("Malformed data passed to binarizer."); } // Convert image to greyscale var greyscalePixels = new Matrix(width, height); for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { var r = data[((y * width + x) * 4) + 0]; var g = data[((y * width + x) * 4) + 1]; var b = data[((y * width + x) * 4) + 2]; greyscalePixels.set(x, y, 0.2126 * r + 0.7152 * g + 0.0722 * b); } } var horizontalRegionCount = Math.ceil(width / REGION_SIZE); var verticalRegionCount = Math.ceil(height / REGION_SIZE); var blackPoints = new Matrix(horizontalRegionCount, verticalRegionCount); for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) { for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) { var sum = 0; var min = Infinity; var max = 0; for (var y = 0; y < REGION_SIZE; y++) { for (var x = 0; x < REGION_SIZE; x++) { var pixelLumosity = greyscalePixels.get(hortizontalRegion * REGION_SIZE + x, verticalRegion * REGION_SIZE + y); sum += pixelLumosity; min = Math.min(min, pixelLumosity); max = Math.max(max, pixelLumosity); } } var average = sum / (Math.pow(REGION_SIZE, 2)); if (max - min <= MIN_DYNAMIC_RANGE) { // If variation within the block is low, assume this is a block with only light or only // dark pixels. In that case we do not want to use the average, as it would divide this // low contrast area into black and white pixels, essentially creating data out of noise. // // Default the blackpoint for these blocks to be half the min - effectively white them out average = min / 2; if (verticalRegion > 0 && hortizontalRegion > 0) { // Correct the "white background" assumption for blocks that have neighbors by comparing // the pixels in this block to the previously calculated black points. This is based on // the fact that dark barcode symbology is always surrounded by some amount of light // background for which reasonable black point estimates were made. The bp estimated at // the boundaries is used for the interior. // The (min < bp) is arbitrary but works better than other heuristics that were tried. var averageNeighborBlackPoint = (blackPoints.get(hortizontalRegion, verticalRegion - 1) + (2 * blackPoints.get(hortizontalRegion - 1, verticalRegion)) + blackPoints.get(hortizontalRegion - 1, verticalRegion - 1)) / 4; if (min < averageNeighborBlackPoint) { average = averageNeighborBlackPoint; } } } blackPoints.set(hortizontalRegion, verticalRegion, average); } } var binarized = BitMatrix_1.BitMatrix.createEmpty(width, height); var inverted = null; if (returnInverted) { inverted = BitMatrix_1.BitMatrix.createEmpty(width, height); } for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) { for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) { var left = numBetween(hortizontalRegion, 2, horizontalRegionCount - 3); var top_1 = numBetween(verticalRegion, 2, verticalRegionCount - 3); var sum = 0; for (var xRegion = -2; xRegion <= 2; xRegion++) { for (var yRegion = -2; yRegion <= 2; yRegion++) { sum += blackPoints.get(left + xRegion, top_1 + yRegion); } } var threshold = sum / 25; for (var xRegion = 0; xRegion < REGION_SIZE; xRegion++) { for (var yRegion = 0; yRegion < REGION_SIZE; yRegion++) { var x = hortizontalRegion * REGION_SIZE + xRegion; var y = verticalRegion * REGION_SIZE + yRegion; var lum = greyscalePixels.get(x, y); binarized.set(x, y, lum <= threshold); if (returnInverted) { inverted.set(x, y, !(lum <= threshold)); } } } } } if (returnInverted) { return { binarized: binarized, inverted: inverted }; } return { binarized: binarized }; } exports.binarize = binarize; /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BitMatrix_1 = __webpack_require__(0); var decodeData_1 = __webpack_require__(6); var reedsolomon_1 = __webpack_require__(9); var version_1 = __webpack_require__(10); // tslint:disable:no-bitwise function numBitsDiffering(x, y) { var z = x ^ y; var bitCount = 0; while (z) { bitCount++; z &= z - 1; } return bitCount; } function pushBit(bit, byte) { return (byte << 1) | bit; } // tslint:enable:no-bitwise var FORMAT_INFO_TABLE = [ { bits: 0x5412, formatInfo: { errorCorrectionLevel: 1, dataMask: 0 } }, { bits: 0x5125, formatInfo: { errorCorrectionLevel: 1, dataMask: 1 } }, { bits: 0x5E7C, formatInfo: { errorCorrectionLevel: 1, dataMask: 2 } }, { bits: 0x5B4B, formatInfo: { errorCorrectionLevel: 1, dataMask: 3 } }, { bits: 0x45F9, formatInfo: { errorCorrectionLevel: 1, dataMask: 4 } }, { bits: 0x40CE, formatInfo: { errorCorrectionLevel: 1, dataMask: 5 } }, { bits: 0x4F97, formatInfo: { errorCorrectionLevel: 1, dataMask: 6 } }, { bits: 0x4AA0, formatInfo: { errorCorrectionLevel: 1, dataMask: 7 } }, { bits: 0x77C4, formatInfo: { errorCorrectionLevel: 0, dataMask: 0 } }, { bits: 0x72F3, formatInfo: { errorCorrectionLevel: 0, dataMask: 1 } }, { bits: 0x7DAA, formatInfo: { errorCorrectionLevel: 0, dataMask: 2 } }, { bits: 0x789D, formatInfo: { errorCorrectionLevel: 0, dataMask: 3 } }, { bits: 0x662F, formatInfo: { errorCorrectionLevel: 0, dataMask: 4 } }, { bits: 0x6318, formatInfo: { errorCorrectionLevel: 0, dataMask: 5 } }, { bits: 0x6C41, formatInfo: { errorCorrectionLevel: 0, dataMask: 6 } }, { bits: 0x6976, formatInfo: { errorCorrectionLevel: 0, dataMask: 7 } }, { bits: 0x1689, formatInfo: { errorCorrectionLevel: 3, dataMask: 0 } }, { bits: 0x13BE, formatInfo: { errorCorrectionLevel: 3, dataMask: 1 } }, { bits: 0x1CE7, formatInfo: { errorCorrectionLevel: 3, dataMask: 2 } }, { bits: 0x19D0, formatInfo: { errorCorrectionLevel: 3, dataMask: 3 } }, { bits: 0x0762, formatInfo: { errorCorrectionLevel: 3, dataMask: 4 } }, { bits: 0x0255, formatInfo: { errorCorrectionLevel: 3, dataMask: 5 } }, { bits: 0x0D0C, formatInfo: { errorCorrectionLevel: 3, dataMask: 6 } }, { bits: 0x083B, formatInfo: { errorCorrectionLevel: 3, dataMask: 7 } }, { bits: 0x355F, formatInfo: { errorCorrectionLevel: 2, dataMask: 0 } }, { bits: 0x3068, formatInfo: { errorCorrectionLevel: 2, dataMask: 1 } }, { bits: 0x3F31, formatInfo: { errorCorrectionLevel: 2, dataMask: 2 } }, { bits: 0x3A06, formatInfo: { errorCorrectionLevel: 2, dataMask: 3 } }, { bits: 0x24B4, formatInfo: { errorCorrectionLevel: 2, dataMask: 4 } }, { bits: 0x2183, formatInfo: { errorCorrectionLevel: 2, dataMask: 5 } }, { bits: 0x2EDA, formatInfo: { errorCorrectionLevel: 2, dataMask: 6 } }, { bits: 0x2BED, formatInfo: { errorCorrectionLevel: 2, dataMask: 7 } }, ]; var DATA_MASKS = [ function (p) { return ((p.y + p.x) % 2) === 0; }, function (p) { return (p.y % 2) === 0; }, function (p) { return p.x % 3 === 0; }, function (p) { return (p.y + p.x) % 3 === 0; }, function (p) { return (Math.floor(p.y / 2) + Math.floor(p.x / 3)) % 2 === 0; }, function (p) { return ((p.x * p.y) % 2) + ((p.x * p.y) % 3) === 0; }, function (p) { return ((((p.y * p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; }, function (p) { return ((((p.y + p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; }, ]; function buildFunctionPatternMask(version) { var dimension = 17 + 4 * version.versionNumber; var matrix = BitMatrix_1.BitMatrix.createEmpty(dimension, dimension); matrix.setRegion(0, 0, 9, 9, true); // Top left finder pattern + separator + format matrix.setRegion(dimension - 8, 0, 8, 9, true); // Top right finder pattern + separator + format matrix.setRegion(0, dimension - 8, 9, 8, true); // Bottom left finder pattern + separator + format // Alignment patterns for (var _i = 0, _a = version.alignmentPatternCenters; _i < _a.length; _i++) { var x = _a[_i]; for (var _b = 0, _c = version.alignmentPatternCenters; _b < _c.length; _b++) { var y = _c[_b]; if (!(x === 6 && y === 6 || x === 6 && y === dimension - 7 || x === dimension - 7 && y === 6)) { matrix.setRegion(x - 2, y - 2, 5, 5, true); } } } matrix.setRegion(6, 9, 1, dimension - 17, true); // Vertical timing pattern matrix.setRegion(9, 6, dimension - 17, 1, true); // Horizontal timing pattern if (version.versionNumber > 6) { matrix.setRegion(dimension - 11, 0, 3, 6, true); // Version info, top right matrix.setRegion(0, dimension - 11, 6, 3, true); // Version info, bottom left } return matrix; } function readCodewords(matrix, version, formatInfo) { var dataMask = DATA_MASKS[formatInfo.dataMask]; var dimension = matrix.height; var functionPatternMask = buildFunctionPatternMask(version); var codewords = []; var currentByte = 0; var bitsRead = 0; // Read columns in pairs, from right to left var readingUp = true; for (var columnIndex = dimension - 1; columnIndex > 0; columnIndex -= 2) { if (columnIndex === 6) { // Skip whole column with vertical alignment pattern; columnIndex--; } for (var i = 0; i < dimension; i++) { var y = readingUp ? dimension - 1 - i : i; for (var columnOffset = 0; columnOffset < 2; columnOffset++) { var x = columnIndex - columnOffset; if (!functionPatternMask.get(x, y)) { bitsRead++; var bit = matrix.get(x, y); if (dataMask({ y: y, x: x })) { bit = !bit; } currentByte = pushBit(bit, currentByte); if (bitsRead === 8) { // Whole bytes codewords.push(currentByte); bitsRead = 0; currentByte = 0; } } } } readingUp = !readingUp; } return codewords; } function readVersion(matrix) { var dimension = matrix.height; var provisionalVersion = Math.floor((dimension - 17) / 4); if (provisionalVersion <= 6) { // 6 and under dont have version info in the QR code return version_1.VERSIONS[provisionalVersion - 1]; } var topRightVersionBits = 0; for (var y = 5; y >= 0; y--) { for (var x = dimension - 9; x >= dimension - 11; x--) { topRightVersionBits = pushBit(matrix.get(x, y), topRightVersionBits); } } var bottomLeftVersionBits = 0; for (var x = 5; x >= 0; x--) { for (var y = dimension - 9; y >= dimension - 11; y--) { bottomLeftVersionBits = pushBit(matrix.get(x, y), bottomLeftVersionBits); } } var bestDifference = Infinity; var bestVersion; for (var _i = 0, VERSIONS_1 = version_1.VERSIONS; _i < VERSIONS_1.length; _i++) { var version = VERSIONS_1[_i]; if (version.infoBits === topRightVersionBits || version.infoBits === bottomLeftVersionBits) { return version; } var difference = numBitsDiffering(topRightVersionBits, version.infoBits); if (difference < bestDifference) { bestVersion = version; bestDifference = difference; } difference = numBitsDiffering(bottomLeftVersionBits, version.infoBits); if (difference < bestDifference) { bestVersion = version; bestDifference = difference; } } // We can tolerate up to 3 bits of error since no two version info codewords will // differ in less than 8 bits. if (bestDifference <= 3) { return bestVersion; } } function readFormatInformation(matrix) { var topLeftFormatInfoBits = 0; for (var x = 0; x <= 8; x++) { if (x !== 6) { // Skip timing pattern bit topLeftFormatInfoBits = pushBit(matrix.get(x, 8), topLeftFormatInfoBits); } } for (var y = 7; y >= 0; y--) { if (y !== 6) { // Skip timing pattern bit topLeftFormatInfoBits = pushBit(matrix.get(8, y), topLeftFormatInfoBits); } } var dimension = matrix.height; var topRightBottomRightFormatInfoBits = 0; for (var y = dimension - 1; y >= dimension - 7; y--) { // bottom left topRightBottomRightFormatInfoBits = pushBit(matrix.get(8, y), topRightBottomRightFormatInfoBits); } for (var x = dimension - 8; x < dimension; x++) { // top right topRightBottomRightFormatInfoBits = pushBit(matrix.get(x, 8), topRightBottomRightFormatInfoBits); } var bestDifference = Infinity; var bestFormatInfo = null; for (var _i = 0, FORMAT_INFO_TABLE_1 = FORMAT_INFO_TABLE; _i < FORMAT_INFO_TABLE_1.length; _i++) { var _a = FORMAT_INFO_TABLE_1[_i], bits = _a.bits, formatInfo = _a.formatInfo; if (bits === topLeftFormatInfoBits || bits === topRightBottomRightFormatInfoBits) { return formatInfo; } var difference = numBitsDiffering(topLeftFormatInfoBits, bits); if (difference < bestDifference) { bestFormatInfo = formatInfo; bestDifference = difference; } if (topLeftFormatInfoBits !== topRightBottomRightFormatInfoBits) { // also try the other option difference = numBitsDiffering(topRightBottomRightFormatInfoBits, bits); if (difference < bestDifference) { bestFormatInfo = formatInfo; bestDifference = difference; } } } // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits differing means we found a match if (bestDifference <= 3) { return bestFormatInfo; } return null; } function getDataBlocks(codewords, version, ecLevel) { var ecInfo = version.errorCorrectionLevels[ecLevel]; var dataBlocks = []; var totalCodewords = 0; ecInfo.ecBlocks.forEach(function (block) { for (var i = 0; i < block.numBlocks; i++) { dataBlocks.push({ numDataCodewords: block.dataCodewordsPerBlock, codewords: [] }); totalCodewords += block.dataCodewordsPerBlock + ecInfo.ecCodewordsPerBlock; } }); // In some cases the QR code will be malformed enough that we pull off more or less than we should. // If we pull off less there's nothing we can do. // If we pull off more we can safely truncate if (codewords.length < totalCodewords) { return null; } codewords = codewords.slice(0, totalCodewords); var shortBlockSize = ecInfo.ecBlocks[0].dataCodewordsPerBlock; // Pull codewords to fill the blocks up to the minimum size for (var i = 0; i < shortBlockSize; i++) { for (var _i = 0, dataBlocks_1 = dataBlocks; _i < dataBlocks_1.length; _i++) { var dataBlock = dataBlocks_1[_i]; dataBlock.codewords.push(codewords.shift()); } } // If there are any large blocks, pull codewords to fill the last element of those if (ecInfo.ecBlocks.length > 1) { var smallBlockCount = ecInfo.ecBlocks[0].numBlocks; var largeBlockCount = ecInfo.ecBlocks[1].numBlocks; for (var i = 0; i < largeBlockCount; i++) { dataBlocks[smallBlockCount + i].codewords.push(codewords.shift()); } } // Add the rest of the codewords to the blocks. These are the error correction codewords. while (codewords.length > 0) { for (var _a = 0, dataBlocks_2 = dataBlocks; _a < dataBlocks_2.length; _a++) { var dataBlock = dataBlocks_2[_a]; dataBlock.codewords.push(codewords.shift()); } } return dataBlocks; } function decodeMatrix(matrix) { var version = readVersion(matrix); if (!version) { return null; } var formatInfo = readFormatInformation(matrix); if (!formatInfo) { return null; } var codewords = readCodewords(matrix, version, formatInfo); var dataBlocks = getDataBlocks(codewords, version, formatInfo.errorCorrectionLevel); if (!dataBlocks) { return null; } // Count total number of data bytes var totalBytes = dataBlocks.reduce(function (a, b) { return a + b.numDataCodewords; }, 0); var resultBytes = new Uint8ClampedArray(totalBytes); var resultIndex = 0; for (var _i = 0, dataBlocks_3 = dataBlocks; _i < dataBlocks_3.length; _i++) { var dataBlock = dataBlocks_3[_i]; var correctedBytes = reedsolomon_1.decode(dataBlock.codewords, dataBlock.codewords.length - dataBlock.numDataCodewords); if (!correctedBytes) { return null; } for (var i = 0; i < dataBlock.numDataCodewords; i++) { resultBytes[resultIndex++] = correctedBytes[i]; } } try { return decodeData_1.decode(resultBytes, version.versionNumber); } catch (_a) { return null; } } function decode(matrix) { if (matrix == null) { return null; } var result = decodeMatrix(matrix); if (result) { return result; } // Decoding didn't work, try mirroring the QR across the topLeft -> bottomRight line. for (var x = 0; x < matrix.width; x++) { for (var y = x + 1; y < matrix.height; y++) { if (matrix.get(x, y) !== matrix.get(y, x)) { matrix.set(x, y, !matrix.get(x, y)); matrix.set(y, x, !matrix.get(y, x)); } } } return decodeMatrix(matrix); } exports.decode = decode; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // tslint:disable:no-bitwise var BitStream_1 = __webpack_require__(7); var shiftJISTable_1 = __webpack_require__(8); var Mode; (function (Mode) { Mode["Numeric"] = "numeric"; Mode["Alphanumeric"] = "alphanumeric"; Mode["Byte"] = "byte"; Mode["Kanji"] = "kanji"; Mode["ECI"] = "eci"; })(Mode = exports.Mode || (exports.Mode = {})); var ModeByte; (function (ModeByte) { ModeByte[ModeByte["Terminator"] = 0] = "Terminator"; ModeByte[ModeByte["Numeric"] = 1] = "Numeric"; ModeByte[ModeByte["Alphanumeric"] = 2] = "Alphanumeric"; ModeByte[ModeByte["Byte"] = 4] = "Byte"; ModeByte[ModeByte["Kanji"] = 8] = "Kanji"; ModeByte[ModeByte["ECI"] = 7] = "ECI"; // StructuredAppend = 0x3, // FNC1FirstPosition = 0x5, // FNC1SecondPosition = 0x9, })(ModeByte || (ModeByte = {})); function decodeNumeric(stream, size) { var bytes = []; var text = ""; var characterCountSize = [10, 12, 14][size]; var length = stream.readBits(characterCountSize); // Read digits in groups of 3 while (length >= 3) { var num = stream.readBits(10); if (num >= 1000) { throw new Error("Invalid numeric value above 999"); } var a = Math.floor(num / 100); var b = Math.floor(num / 10) % 10; var c = num % 10; bytes.push(48 + a, 48 + b, 48 + c); text += a.toString() + b.toString() + c.toString(); length -= 3; } // If the number of digits aren't a multiple of 3, the remaining digits are special cased. if (length === 2) { var num = stream.readBits(7); if (num >= 100) { throw new Error("Invalid numeric value above 99"); } var a = Math.floor(num / 10); var b = num % 10; bytes.push(48 + a, 48 + b); text += a.toString() + b.toString(); } else if (length === 1) { var num = stream.readBits(4); if (num >= 10) { throw new Error("Invalid numeric value above 9"); } bytes.push(48 + num); text += num.toString(); } return { bytes: bytes, text: text }; } var AlphanumericCharacterCodes = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " ", "$", "%", "*", "+", "-", ".", "/", ":", ]; function decodeAlphanumeric(stream, size) { var bytes = []; var text = ""; var characterCountSize = [9, 11, 13][size]; var length = stream.readBits(characterCountSize); while (length >= 2) { var v = stream.readBits(11); var a = Math.floor(v / 45); var b = v % 45; bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0), AlphanumericCharacterCodes[b].charCodeAt(0)); text += AlphanumericCharacterCodes[a] + AlphanumericCharacterCodes[b]; length -= 2; } if (length === 1) { var a = stream.readBits(6); bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0)); text += AlphanumericCharacterCodes[a]; } return { bytes: bytes, text: text }; } function decodeByte(stream, size) { var bytes = []; var text = ""; var characterCountSize = [8, 16, 16][size]; var length = stream.readBits(characterCountSize); for (var i = 0; i < length; i++) { var b = stream.readBits(8); bytes.push(b); } try { text += decodeURIComponent(bytes.map(function (b) { return "%" + ("0" + b.toString(16)).substr(-2); }).join("")); } catch (_a) { // failed to decode } return { bytes: bytes, text: text }; } function decodeKanji(stream, size) { var bytes = []; var text = ""; var characterCountSize = [8, 10, 12][size]; var length = stream.readBits(characterCountSize); for (var i = 0; i < length; i++) { var k = stream.readBits(13); var c = (Math.floor(k / 0xC0) << 8) | (k % 0xC0); if (c < 0x1F00) { c += 0x8140; } else { c += 0xC140; } bytes.push(c >> 8, c & 0xFF); text += String.fromCharCode(shiftJISTable_1.shiftJISTable[c]); } return { bytes: bytes, text: text }; } function decode(data, version) { var _a, _b, _c, _d; var stream = new BitStream_1.BitStream(data); // There are 3 'sizes' based on the version. 1-9 is small (0), 10-26 is medium (1) and 27-40 is large (2). var size = version <= 9 ? 0 : version <= 26 ? 1 : 2; var result = { text: "", bytes: [], chunks: [], version: version, }; while (stream.available() >= 4) { var mode = stream.readBits(4); if (mode === ModeByte.Terminator) { return result; } else if (mode === ModeByte.ECI) { if (stream.readBits(1) === 0) { result.chunks.push({ type: Mode.ECI, assignmentNumber: stream.readBits(7), }); } else if (stream.readBits(1) === 0) { result.chunks.push({ type: Mode.ECI, assignmentNumber: stream.readBits(14), }); } else if (stream.readBits(1) === 0) { result.chunks.push({ type: Mode.ECI, assignmentNumber: stream.readBits(21), }); } else { // ECI data seems corrupted result.chunks.push({ type: Mode.ECI, assignmentNumber: -1, }); } } else if (mode === ModeByte.Numeric) { var numericResult = decodeNumeric(stream, size); result.text += numericResult.text; (_a = result.bytes).push.apply(_a, numericResult.bytes); result.chunks.push({ type: Mode.Numeric, text: numericResult.text, }); } else if (mode === ModeByte.Alphanumeric) { var alphanumericResult = decodeAlphanumeric(stream, size); result.text += alphanumericResult.text; (_b = result.bytes).push.apply(_b, alphanumericResult.bytes); result.chunks.push({ type: Mode.Alphanumeric, text: alphanumericResult.text, }); } else if (mode === ModeByte.Byte) { var byteResult = decodeByte(stream, size); result.text += byteResult.text; (_c = result.bytes).push.apply(_c, byteResult.bytes); result.chunks.push({ type: Mode.Byte, bytes: byteResult.bytes, text: byteResult.text, }); } else if (mode === ModeByte.Kanji) { var kanjiResult = decodeKanji(stream, size); result.text += kanjiResult.text; (_d = result.bytes).push.apply(_d, kanjiResult.bytes); result.chunks.push({ type: Mode.Kanji, bytes: kanjiResult.bytes, text: kanjiResult.text, }); } } // If there is no data left, or the remaining bits are all 0, then that counts as a termination marker if (stream.available() === 0 || stream.readBits(stream.available()) === 0) { return result; } } exports.decode = decode; /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // tslint:disable:no-bitwise Object.defineProperty(exports, "__esModule", { value: true }); var BitStream = /** @class */ (function () { function BitStream(bytes) { this.byteOffset = 0; this.bitOffset = 0; this.bytes = bytes; } BitStream.prototype.readBits = function (numBits) { if (numBits < 1 || numBits > 32 || numBits > this.available()) { throw new Error("Cannot read " + numBits.toString() + " bits"); } var result = 0; // First, read remainder from current byte if (this.bitOffset > 0) { var bitsLeft = 8 - this.bitOffset; var toRead = numBits < bitsLeft ? numBits : bitsLeft; var bitsToNotRead = bitsLeft - toRead; var mask = (0xFF >> (8 - toRead)) << bitsToNotRead; result = (this.bytes[this.byteOffset] & mask) >> bitsToNotRead; numBits -= toRead; this.bitOffset += toRead; if (this.bitOffset === 8) { this.bitOffset = 0; this.byteOffset++; } } // Next read whole bytes if (numBits > 0) { while (numBits >= 8) { result = (result << 8) | (this.bytes[this.byteOffset] & 0xFF); this.byteOffset++; numBits -= 8; } // Finally read a partial byte if (numBits > 0) { var bitsToNotRead = 8 - numBits; var mask = (0xFF >> bitsToNotRead) << bitsToNotRead; result = (result << numBits) | ((this.bytes[this.byteOffset] & mask) >> bitsToNotRead); this.bitOffset += numBits; } } return result; }; BitStream.prototype.available = function () { return 8 * (this.bytes.length - this.byteOffset) - this.bitOffset; }; return BitStream; }()); exports.BitStream = BitStream; /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.shiftJISTable = { 0x20: 0x0020, 0x21: 0x0021, 0x22: 0x0022, 0x23: 0x0023, 0x24: 0x0024, 0x25: 0x0025, 0x26: 0x0026, 0x27: 0x0027, 0x28: 0x0028, 0x29: 0x0029, 0x2A: 0x002A, 0x2B: 0x002B, 0x2C: 0x002C, 0x2D: 0x002D, 0x2E: 0x002E, 0x2F: 0x002F, 0x30: 0x0030, 0x31: 0x0031, 0x32: 0x0032, 0x33: 0x0033, 0x34: 0x0034, 0x35: 0x0035, 0x36: 0x0036, 0x37: 0x0037, 0x38: 0x0038, 0x39: 0x0039, 0x3A: 0x003A, 0x3B: 0x003B, 0x3C: 0x003C, 0x3D: 0x003D, 0x3E: 0x003E, 0x3F: 0x003F, 0x40: 0x0040, 0x41: 0x0041, 0x42: 0x0042, 0x43: 0x0043, 0x44: 0x0044, 0x45: 0x0045, 0x46: 0x0046, 0x47: 0x0047, 0x48: 0x0048, 0x49: 0x0049, 0x4A: 0x004A, 0x4B: 0x004B, 0x4C: 0x004C, 0x4D: 0x004D, 0x4E: 0x004E, 0x4F: 0x004F, 0x50: 0x0050, 0x51: 0x0051, 0x52: 0x0052, 0x53: 0x0053, 0x54: 0x0054, 0x55: 0x0055, 0x56: 0x0056, 0x57: 0x0057, 0x58: 0x0058, 0x59: 0x0059, 0x5A: 0x005A, 0x5B: 0x005B, 0x5C: 0x00A5, 0x5D: 0x005D, 0x5E: 0x005E, 0x5F: 0x005F, 0x60: 0x0060, 0x61: 0x0061, 0x62: 0x0062, 0x63: 0x0063, 0x64: 0x0064, 0x65: 0x0065, 0x66: 0x0066, 0x67: 0x0067, 0x68: 0x0068, 0x69: 0x0069, 0x6A: 0x006A, 0x6B: 0x006B, 0x6C: 0x006C, 0x6D: 0x006D, 0x6E: 0x006E, 0x6F: 0x006F, 0x70: 0x0070, 0x71: 0x0071, 0x72: 0x0072, 0x73: 0x0073, 0x74: 0x0074, 0x75: 0x0075, 0x76: 0x0076, 0x77: 0x0077, 0x78: 0x0078, 0x79: 0x0079, 0x7A: 0x007A, 0x7B: 0x007B, 0x7C: 0x007C, 0x7D: 0x007D, 0x7E: 0x203E, 0x8140: 0x3000, 0x8141: 0x3001, 0x8142: 0x3002, 0x8143: 0xFF0C, 0x8144: 0xFF0E, 0x8145: 0x30FB, 0x8146: 0xFF1A, 0x8147: 0xFF1B, 0x8148: 0xFF1F, 0x8149: 0xFF01, 0x814A: 0x309B, 0x814B: 0x309C, 0x814C: 0x00B4, 0x814D: 0xFF40, 0x814E: 0x00A8, 0x814F: 0xFF3E, 0x8150: 0xFFE3, 0x8151: 0xFF3F, 0x8152: 0x30FD, 0x8153: 0x30FE, 0x8154: 0x309D, 0x8155: 0x309E, 0x8156: 0x3003, 0x8157: 0x4EDD, 0x8158: 0x3005, 0x8159: 0x3006, 0x815A: 0x3007, 0x815B: 0x30FC, 0x815C: 0x2015, 0x815D: 0x2010, 0x815E: 0xFF0F, 0x815F: 0x005C, 0x8160: 0x301C, 0x8161: 0x2016, 0x8162: 0xFF5C, 0x8163: 0x2026, 0x8164: 0x2025, 0x8165: 0x2018, 0x8166: 0x2019, 0x8167: 0x201C, 0x8168: 0x201D, 0x8169: 0xFF08, 0x816A: 0xFF09, 0x816B: 0x3014, 0x816C: 0x3015, 0x816D: 0xFF3B, 0x816E: 0xFF3D, 0x816F: 0xFF5B, 0x8170: 0xFF5D, 0x8171: 0x3008, 0x8172: 0x3009, 0x8173: 0x300A, 0x8174: 0x300B, 0x8175: 0x300C, 0x8176: 0x300D, 0x8177: 0x300E, 0x8178: 0x300F, 0x8179: 0x3010, 0x817A: 0x3011, 0x817B: 0xFF0B, 0x817C: 0x2212, 0x817D: 0x00B1, 0x817E: 0x00D7, 0x8180: 0x00F7, 0x8181: 0xFF1D, 0x8182: 0x2260, 0x8183: 0xFF1C, 0x8184: 0xFF1E, 0x8185: 0x2266, 0x8186: 0x2267, 0x8187: 0x221E, 0x8188: 0x2234, 0x8189: 0x2642, 0x818A: 0x2640, 0x818B: 0x00B0, 0x818C: 0x2032, 0x818D: 0x2033, 0x818E: 0x2103, 0x818F: 0xFFE5, 0x8190: 0xFF04, 0x8191: 0x00A2, 0x8192: 0x00A3, 0x8193: 0xFF05, 0x8194: 0xFF03, 0x8195: 0xFF06, 0x8196: 0xFF0A, 0x8197: 0xFF20, 0x8198: 0x00A7, 0x8199: 0x2606, 0x819A: 0x2605, 0x819B: 0x25CB, 0x819C: 0x25CF, 0x819D: 0x25CE, 0x819E: 0x25C7, 0x819F: 0x25C6, 0x81A0: 0x25A1, 0x81A1: 0x25A0, 0x81A2: 0x25B3, 0x81A3: 0x25B2, 0x81A4: 0x25BD, 0x81A5: 0x25BC, 0x81A6: 0x203B, 0x81A7: 0x3012, 0x81A8: 0x2192, 0x81A9: 0x2190, 0x81AA: 0x2191, 0x81AB: 0x2193, 0x81AC: 0x3013, 0x81B8: 0x2208, 0x81B9: 0x220B, 0x81BA: 0x2286, 0x81BB: 0x2287, 0x81BC: 0x2282, 0x81BD: 0x2283, 0x81BE: 0x222A, 0x81BF: 0x2229, 0x81C8: 0x2227, 0x81C9: 0x2228, 0x81CA: 0x00AC, 0x81CB: 0x21D2, 0x81CC: 0x21D4, 0x81CD: 0x2200, 0x81CE: 0x2203, 0x81DA: 0x2220, 0x81DB: 0x22A5, 0x81DC: 0x2312, 0x81DD: 0x2202, 0x81DE: 0x2207, 0x81DF: 0x2261, 0x81E0: 0x2252, 0x81E1: 0x226A, 0x81E2: 0x226B, 0x81E3: 0x221A, 0x81E4: 0x223D, 0x81E5: 0x221D, 0x81E6: 0x2235, 0x81E7: 0x222B, 0x81E8: 0x222C, 0x81F0: 0x212B, 0x81F1: 0x2030, 0x81F2: 0x266F, 0x81F3: 0x266D, 0x81F4: 0x266A, 0x81F5: 0x2020, 0x81F6: 0x2021, 0x81F7: 0x00B6, 0x81FC: 0x25EF, 0x824F: 0xFF10, 0x8250: 0xFF11, 0x8251: 0xFF12, 0x8252: 0xFF13, 0x8253: 0xFF14, 0x8254: 0xFF15, 0x8255: 0xFF16, 0x8256: 0xFF17, 0x8257: 0xFF18, 0x8258: 0xFF19, 0x8260: 0xFF21, 0x8261: 0xFF22, 0x8262: 0xFF23, 0x8263: 0xFF24, 0x8264: 0xFF25, 0x8265: 0xFF26, 0x8266: 0xFF27, 0x8267: 0xFF28, 0x8268: 0xFF29, 0x8269: 0xFF2A, 0x826A: 0xFF2B, 0x826B: 0xFF2C, 0x826C: 0xFF2D, 0x826D: 0xFF2E, 0x826E: 0xFF2F, 0x826F: 0xFF30, 0x8270: 0xFF31, 0x8271: 0xFF32, 0x8272: 0xFF33, 0x8273: 0xFF34, 0x8274: 0xFF35, 0x8275: 0xFF36, 0x8276: 0xFF37, 0x8277: 0xFF38, 0x8278: 0xFF39, 0x8279: 0xFF3A, 0x8281: 0xFF41, 0x8282: 0xFF42, 0x8283: 0xFF43, 0x8284: 0xFF44, 0x8285: 0xFF45, 0x8286: 0xFF46, 0x8287: 0xFF47, 0x8288: 0xFF48, 0x8289: 0xFF49, 0x828A: 0xFF4A, 0x828B: 0xFF4B, 0x828C: 0xFF4C, 0x828D: 0xFF4D, 0x828E: 0xFF4E, 0x828F: 0xFF4F, 0x8290: 0xFF50, 0x8291: 0xFF51, 0x8292: 0xFF52, 0x8293: 0xFF53, 0x8294: 0xFF54, 0x8295: 0xFF55, 0x8296: 0xFF56, 0x8297: 0xFF57, 0x8298: 0xFF58, 0x8299: 0xFF59, 0x829A: 0xFF5A, 0x829F: 0x3041, 0x82A0: 0x3042, 0x82A1: 0x3043, 0x82A2: 0x3044, 0x82A3: 0x3045, 0x82A4: 0x3046, 0x82A5: 0x3047, 0x82A6: 0x3048, 0x82A7: 0x3049, 0x82A8: 0x304A, 0x82A9: 0x304B, 0x82AA: 0x304C, 0x82AB: 0x304D, 0x82AC: 0x304E, 0x82AD: 0x304F, 0x82AE: 0x3050, 0x82AF: 0x3051, 0x82B0: 0x3052, 0x82B1: 0x3053, 0x82B2: 0x3054, 0x82B3: 0x3055, 0x82B4: 0x3056, 0x82B5: 0x3057, 0x82B6: 0x3058, 0x82B7: 0x3059, 0x82B8: 0x305A, 0x82B9: 0x305B, 0x82BA: 0x305C, 0x82BB: 0x305D, 0x82BC: 0x305E, 0x82BD: 0x305F, 0x82BE: 0x3060, 0x82BF: 0x3061, 0x82C0: 0x3062, 0x82C1: 0x3063, 0x82C2: 0x3064, 0x82C3: 0x3065, 0x82C4: 0x3066, 0x82C5: 0x3067, 0x82C6: 0x3068, 0x82C7: 0x3069, 0x82C8: 0x306A, 0x82C9: 0x306B, 0x82CA: 0x306C, 0x82CB: 0x306D, 0x82CC: 0x306E, 0x82CD: 0x306F, 0x82CE: 0x3070, 0x82CF: 0x3071, 0x82D0: 0x3072, 0x82D1: 0x3073, 0x82D2: 0x3074, 0x82D3: 0x3075, 0x82D4: 0x3076, 0x82D5: 0x3077, 0x82D6: 0x3078, 0x82D7: 0x3079, 0x82D8: 0x307A, 0x82D9: 0x307B, 0x82DA: 0x307C, 0x82DB: 0x307D, 0x82DC: 0x307E, 0x82DD: 0x307F, 0x82DE: 0x3080, 0x82DF: 0x3081, 0x82E0: 0x3082, 0x82E1: 0x3083, 0x82E2: 0x3084, 0x82E3: 0x3085, 0x82E4: 0x3086, 0x82E5: 0x3087, 0x82E6: 0x3088, 0x82E7: 0x3089, 0x82E8: 0x308A, 0x82E9: 0x308B, 0x82EA: 0x308C, 0x82EB: 0x308D, 0x82EC: 0x308E, 0x82ED: 0x308F, 0x82EE: 0x3090, 0x82EF: 0x3091, 0x82F0: 0x3092, 0x82F1: 0x3093, 0x8340: 0x30A1, 0x8341: 0x30A2, 0x8342: 0x30A3, 0x8343: 0x30A4, 0x8344: 0x30A5, 0x8345: 0x30A6, 0x8346: 0x30A7, 0x8347: 0x30A8, 0x8348: 0x30A9, 0x8349: 0x30AA, 0x834A: 0x30AB, 0x834B: 0x30AC, 0x834C: 0x30AD, 0x834D: 0x30AE, 0x834E: 0x30AF, 0x834F: 0x30B0, 0x8350: 0x30B1, 0x8351: 0x30B2, 0x8352: 0x30B3, 0x8353: 0x30B4, 0x8354: 0x30B5, 0x8355: 0x30B6, 0x8356: 0x30B7, 0x8357: 0x30B8, 0x8358: 0x30B9, 0x8359: 0x30BA, 0x835A: 0x30BB, 0x835B: 0x30BC, 0x835C: 0x30BD, 0x835D: 0x30BE, 0x835E: 0x30BF, 0x835F: 0x30C0, 0x8360: 0x30C1, 0x8361: 0x30C2, 0x8362: 0x30C3, 0x8363: 0x30C4, 0x8364: 0x30C5, 0x8365: 0x30C6, 0x8366: 0x30C7, 0x8367: 0x30C8, 0x8368: 0x30C9, 0x8369: 0x30CA, 0x836A: 0x30CB, 0x836B: 0x30CC, 0x836C: 0x30CD, 0x836D: 0x30CE, 0x836E: 0x30CF, 0x836F: 0x30D0, 0x8370: 0x30D1, 0x8371: 0x30D2, 0x8372: 0x30D3, 0x8373: 0x30D4, 0x8374: 0x30D5, 0x8375: 0x30D6, 0x8376: 0x30D7, 0x8377: 0x30D8, 0x8378: 0x30D9, 0x8379: 0x30DA, 0x837A: 0x30DB, 0x837B: 0x30DC, 0x837C: 0x30DD, 0x837D: 0x30DE, 0x837E: 0x30DF, 0x8380: 0x30E0, 0x8381: 0x30E1, 0x8382: 0x30E2, 0x8383: 0x30E3, 0x8384: 0x30E4, 0x8385: 0x30E5, 0x8386: 0x30E6, 0x8387: 0x30E7, 0x8388: 0x30E8, 0x8389: 0x30E9, 0x838A: 0x30EA, 0x838B: 0x30EB, 0x838C: 0x30EC, 0x838D: 0x30ED, 0x838E: 0x30EE, 0x838F: 0x30EF, 0x8390: 0x30F0, 0x8391: 0x30F1, 0x8392: 0x30F2, 0x8393: 0x30F3, 0x8394: 0x30F4, 0x8395: 0x30F5, 0x8396: 0x30F6, 0x839F: 0x0391, 0x83A0: 0x0392, 0x83A1: 0x0393, 0x83A2: 0x0394, 0x83A3: 0x0395, 0x83A4: 0x0396, 0x83A5: 0x0397, 0x83A6: 0x0398, 0x83A7: 0x0399, 0x83A8: 0x039A, 0x83A9: 0x039B, 0x83AA: 0x039C, 0x83AB: 0x039D, 0x83AC: 0x039E, 0x83AD: 0x039F, 0x83AE: 0x03A0, 0x83AF: 0x03A1, 0x83B0: 0x03A3, 0x83B1: 0x03A4, 0x83B2: 0x03A5, 0x83B3: 0x03A6, 0x83B4: 0x03A7, 0x83B5: 0x03A8, 0x83B6: 0x03A9, 0x83BF: 0x03B1, 0x83C0: 0x03B2, 0x83C1: 0x03B3, 0x83C2: 0x03B4, 0x83C3: 0x03B5, 0x83C4: 0x03B6, 0x83C5: 0x03B7, 0x83C6: 0x03B8, 0x83C7: 0x03B9, 0x83C8: 0x03BA, 0x83C9: 0x03BB, 0x83CA: 0x03BC, 0x83CB: 0x03BD, 0x83CC: 0x03BE, 0x83CD: 0x03BF, 0x83CE: 0x03C0, 0x83CF: 0x03C1, 0x83D0: 0x03C3, 0x83D1: 0x03C4, 0x83D2: 0x03C5, 0x83D3: 0x03C6, 0x83D4: 0x03C7, 0x83D5: 0x03C8, 0x83D6: 0x03C9, 0x8440: 0x0410, 0x8441: 0x0411, 0x8442: 0x0412, 0x8443: 0x0413, 0x8444: 0x0414, 0x8445: 0x0415, 0x8446: 0x0401, 0x8447: 0x0416, 0x8448: 0x0417, 0x8449: 0x0418, 0x844A: 0x0419, 0x844B: 0x041A, 0x844C: 0x041B, 0x844D: 0x041C, 0x844E: 0x041D, 0x844F: 0x041E, 0x8450: 0x041F, 0x8451: 0x0420, 0x8452: 0x0421, 0x8453: 0x0422, 0x8454: 0x0423, 0x8455: 0x0424, 0x8456: 0x0425, 0x8457: 0x0426, 0x8458: 0x0427, 0x8459: 0x0428, 0x845A: 0x0429, 0x845B: 0x042A, 0x845C: 0x042B, 0x845D: 0x042C, 0x845E: 0x042D, 0x845F: 0x042E, 0x8460: 0x042F, 0x8470: 0x0430, 0x8471: 0x0431, 0x8472: 0x0432, 0x8473: 0x0433, 0x8474: 0x0434, 0x8475: 0x0435, 0x8476: 0x0451, 0x8477: 0x0436, 0x8478: 0x0437, 0x8479: 0x0438, 0x847A: 0x0439, 0x847B: 0x043A, 0x847C: 0x043B, 0x847D: 0x043C, 0x847E: 0x043D, 0x8480: 0x043E, 0x8481: 0x043F, 0x8482: 0x0440, 0x8483: 0x0441, 0x8484: 0x0442, 0x8485: 0x0443, 0x8486: 0x0444, 0x8487: 0x0445, 0x8488: 0x0446, 0x8489: 0x0447, 0x848A: 0x0448, 0x848B: 0x0449, 0x848C: 0x044A, 0x848D: 0x044B, 0x848E: 0x044C, 0x848F: 0x044D, 0x8490: 0x044E, 0x8491: 0x044F, 0x849F: 0x2500, 0x84A0: 0x2502, 0x84A1: 0x250C, 0x84A2: 0x2510, 0x84A3: 0x2518, 0x84A4: 0x2514, 0x84A5: 0x251C, 0x84A6: 0x252C, 0x84A7: 0x2524, 0x84A8: 0x2534, 0x84A9: 0x253C, 0x84AA: 0x2501, 0x84AB: 0x2503, 0x84AC: 0x250F, 0x84AD: 0x2513, 0x84AE: 0x251B, 0x84AF: 0x2517, 0x84B0: 0x2523, 0x84B1: 0x2533, 0x84B2: 0x252B, 0x84B3: 0x253B, 0x84B4: 0x254B, 0x84B5: 0x2520, 0x84B6: 0x252F, 0x84B7: 0x2528, 0x84B8: 0x2537, 0x84B9: 0x253F, 0x84BA: 0x251D, 0x84BB: 0x2530, 0x84BC: 0x2525, 0x84BD: 0x2538, 0x84BE: 0x2542, 0x889F: 0x4E9C, 0x88A0: 0x5516, 0x88A1: 0x5A03, 0x88A2: 0x963F, 0x88A3: 0x54C0, 0x88A4: 0x611B, 0x88A5: 0x6328, 0x88A6: 0x59F6, 0x88A7: 0x9022, 0x88A8: 0x8475, 0x88A9: 0x831C, 0x88AA: 0x7A50, 0x88AB: 0x60AA, 0x88AC: 0x63E1, 0x88AD: 0x6E25, 0x88AE: 0x65ED, 0x88AF: 0x8466, 0x88B0: 0x82A6, 0x88B1: 0x9BF5, 0x88B2: 0x6893, 0x88B3: 0x5727, 0x88B4: 0x65A1, 0x88B5: 0x6271, 0x88B6: 0x5B9B, 0x88B7: 0x59D0, 0x88B8: 0x867B, 0x88B9: 0x98F4, 0x88BA: 0x7D62, 0x88BB: 0x7DBE, 0x88BC: 0x9B8E, 0x88BD: 0x6216, 0x88BE: 0x7C9F, 0x88BF: 0x88B7, 0x88C0: 0x5B89, 0x88C1: 0x5EB5, 0x88C2: 0x6309, 0x88C3: 0x6697, 0x88C4: 0x6848, 0x88C5: 0x95C7, 0x88C6: 0x978D, 0x88C7: 0x674F, 0x88C8: 0x4EE5, 0x88C9: 0x4F0A, 0x88CA: 0x4F4D, 0x88CB: 0x4F9D, 0x88CC: 0x5049, 0x88CD: 0x56F2, 0x88CE: 0x5937, 0x88CF: 0x59D4, 0x88D0: 0x5A01, 0x88D1: 0x5C09, 0x88D2: 0x60DF, 0x88D3: 0x610F, 0x88D4: 0x6170, 0x88D5: 0x6613, 0x88D6: 0x6905, 0x88D7: 0x70BA, 0x88D8: 0x754F, 0x88D9: 0x7570, 0x88DA: 0x79FB, 0x88DB: 0x7DAD, 0x88DC: 0x7DEF, 0x88DD: 0x80C3, 0x88DE: 0x840E, 0x88DF: 0x8863, 0x88E0: 0x8B02, 0x88E1: 0x9055, 0x88E2: 0x907A, 0x88E3: 0x533B, 0x88E4: 0x4E95, 0x88E5: 0x4EA5, 0x88E6: 0x57DF, 0x88E7: 0x80B2, 0x88E8: 0x90C1, 0x88E9: 0x78EF, 0x88EA: 0x4E00, 0x88EB: 0x58F1, 0x88EC: 0x6EA2, 0x88ED: 0x9038, 0x88EE: 0x7A32, 0x88EF: 0x8328, 0x88F0: 0x828B, 0x88F1: 0x9C2F, 0x88F2: 0x5141, 0x88F3: 0x5370, 0x88F4: 0x54BD, 0x88F5: 0x54E1, 0x88F6: 0x56E0, 0x88F7: 0x59FB, 0x88F8: 0x5F15, 0x88F9: 0x98F2, 0x88FA: 0x6DEB, 0x88FB: 0x80E4, 0x88FC: 0x852D, 0x8940: 0x9662, 0x8941: 0x9670, 0x8942: 0x96A0, 0x8943: 0x97FB, 0x8944: 0x540B, 0x8945: 0x53F3, 0x8946: 0x5B87, 0x8947: 0x70CF, 0x8948: 0x7FBD, 0x8949: 0x8FC2, 0x894A: 0x96E8, 0x894B: 0x536F, 0x894C: 0x9D5C, 0x894D: 0x7ABA, 0x894E: 0x4E11, 0x894F: 0x7893, 0x8950: 0x81FC, 0x8951: 0x6E26, 0x8952: 0x5618, 0x8953: 0x5504, 0x8954: 0x6B1D, 0x8955: 0x851A, 0x8956: 0x9C3B, 0x8957: 0x59E5, 0x8958: 0x53A9, 0x8959: 0x6D66, 0x895A: 0x74DC, 0x895B: 0x958F, 0x895C: 0x5642, 0x895D: 0x4E91, 0x895E: 0x904B, 0x895F: 0x96F2, 0x8960: 0x834F, 0x8961: 0x990C, 0x8962: 0x53E1, 0x8963: 0x55B6, 0x8964: 0x5B30, 0x8965: 0x5F71, 0x8966: 0x6620, 0x8967: 0x66F3, 0x8968: 0x6804, 0x8969: 0x6C38, 0x896A: 0x6CF3, 0x896B: 0x6D29, 0x896C: 0x745B, 0x896D: 0x76C8, 0x896E: 0x7A4E, 0x896F: 0x9834, 0x8970: 0x82F1, 0x8971: 0x885B, 0x8972: 0x8A60, 0x8973: 0x92ED, 0x8974: 0x6DB2, 0x8975: 0x75AB, 0x8976: 0x76CA, 0x8977: 0x99C5, 0x8978: 0x60A6, 0x8979: 0x8B01, 0x897A: 0x8D8A, 0x897B: 0x95B2, 0x897C: 0x698E, 0x897D: 0x53AD, 0x897E: 0x5186, 0x8980: 0x5712, 0x8981: 0x5830, 0x8982: 0x5944, 0x8983: 0x5BB4, 0x8984: 0x5EF6, 0x8985: 0x6028, 0x8986: 0x63A9, 0x8987: 0x63F4, 0x8988: 0x6CBF, 0x8989: 0x6F14, 0x898A: 0x708E, 0x898B: 0x7114, 0x898C: 0x7159, 0x898D: 0x71D5, 0x898E: 0x733F, 0x898F: 0x7E01, 0x8990: 0x8276, 0x8991: 0x82D1, 0x8992: 0x8597, 0x8993: 0x9060, 0x8994: 0x925B, 0x8995: 0x9D1B, 0x8996: 0x5869, 0x8997: 0x65BC, 0x8998: 0x6C5A, 0x8999: 0x7525, 0x899A: 0x51F9, 0x899B: 0x592E, 0x899C: 0x5965, 0x899D: 0x5F80, 0x899E: 0x5FDC, 0x899F: 0x62BC, 0x89A0: 0x65FA, 0x89A1: 0x6A2A, 0x89A2: 0x6B27, 0x89A3: 0x6BB4, 0x89A4: 0x738B, 0x89A5: 0x7FC1, 0x89A6: 0x8956, 0x89A7: 0x9D2C, 0x89A8: 0x9D0E, 0x89A9: 0x9EC4, 0x89AA: 0x5CA1, 0x89AB: 0x6C96, 0x89AC: 0x837B, 0x89AD: 0x5104, 0x89AE: 0x5C4B, 0x89AF: 0x61B6, 0x89B0: 0x81C6, 0x89B1: 0x6876, 0x89B2: 0x7261, 0x89B3: 0x4E59, 0x89B4: 0x4FFA, 0x89B5: 0x5378, 0x89B6: 0x6069, 0x89B7: 0x6E29, 0x89B8: 0x7A4F, 0x89B9: 0x97F3, 0x89BA: 0x4E0B, 0x89BB: 0x5316, 0x89BC: 0x4EEE, 0x89BD: 0x4F55, 0x89BE: 0x4F3D, 0x89BF: 0x4FA1, 0x89C0: 0x4F73, 0x89C1: 0x52A0, 0x89C2: 0x53EF, 0x89C3: 0x5609, 0x89C4: 0x590F, 0x89C5: 0x5AC1, 0x89C6: 0x5BB6, 0x89C7: 0x5BE1, 0x89C8: 0x79D1, 0x89C9: 0x6687, 0x89CA: 0x679C, 0x89CB: 0x67B6, 0x89CC: 0x6B4C, 0x89CD: 0x6CB3, 0x89CE: 0x706B, 0x89CF: 0x73C2, 0x89D0: 0x798D, 0x89D1: 0x79BE, 0x89D2: 0x7A3C, 0x89D3: 0x7B87, 0x89D4: 0x82B1, 0x89D5: 0x82DB, 0x89D6: 0x8304, 0x89D7: 0x8377, 0x89D8: 0x83EF, 0x89D9: 0x83D3, 0x89DA: 0x8766, 0x89DB: 0x8AB2, 0x89DC: 0x5629, 0x89DD: 0x8CA8, 0x89DE: 0x8FE6, 0x89DF: 0x904E, 0x89E0: 0x971E, 0x89E1: 0x868A, 0x89E2: 0x4FC4, 0x89E3: 0x5CE8, 0x89E4: 0x6211, 0x89E5: 0x7259, 0x89E6: 0x753B, 0x89E7: 0x81E5, 0x89E8: 0x82BD, 0x89E9: 0x86FE, 0x89EA: 0x8CC0, 0x89EB: 0x96C5, 0x89EC: 0x9913, 0x89ED: 0x99D5, 0x89EE: 0x4ECB, 0x89EF: 0x4F1A, 0x89F0: 0x89E3, 0x89F1: 0x56DE, 0x89F2: 0x584A, 0x89F3: 0x58CA, 0x89F4: 0x5EFB, 0x89F5: 0x5FEB, 0x89F6: 0x602A, 0x89F7: 0x6094, 0x89F8: 0x6062, 0x89F9: 0x61D0, 0x89FA: 0x6212, 0x89FB: 0x62D0, 0x89FC: 0x6539, 0x8A40: 0x9B41, 0x8A41: 0x6666, 0x8A42: 0x68B0, 0x8A43: 0x6D77, 0x8A44: 0x7070, 0x8A45: 0x754C, 0x8A46: 0x7686, 0x8A47: 0x7D75, 0x8A48: 0x82A5, 0x8A49: 0x87F9, 0x8A4A: 0x958B, 0x8A4B: 0x968E, 0x8A4C: 0x8C9D, 0x8A4D: 0x51F1, 0x8A4E: 0x52BE, 0x8A4F: 0x5916, 0x8A50: 0x54B3, 0x8A51: 0x5BB3, 0x8A52: 0x5D16, 0x8A53: 0x6168, 0x8A54: 0x6982, 0x8A55: 0x6DAF, 0x8A56: 0x788D, 0x8A57: 0x84CB, 0x8A58: 0x8857, 0x8A59: 0x8A72, 0x8A5A: 0x93A7, 0x8A5B: 0x9AB8, 0x8A5C: 0x6D6C, 0x8A5D: 0x99A8, 0x8A5E: 0x86D9, 0x8A5F: 0x57A3, 0x8A60: 0x67FF, 0x8A61: 0x86CE, 0x8A62: 0x920E, 0x8A63: 0x5283, 0x8A64: 0x5687, 0x8A65: 0x5404, 0x8A66: 0x5ED3, 0x8A67: 0x62E1, 0x8A68: 0x64B9, 0x8A69: 0x683C, 0x8A6A: 0x6838, 0x8A6B: 0x6BBB, 0x8A6C: 0x7372, 0x8A6D: 0x78BA, 0x8A6E: 0x7A6B, 0x8A6F: 0x899A, 0x8A70: 0x89D2, 0x8A71: 0x8D6B, 0x8A72: 0x8F03, 0x8A73: 0x90ED, 0x8A74: 0x95A3, 0x8A75: 0x9694, 0x8A76: 0x9769, 0x8A77: 0x5B66, 0x8A78: 0x5CB3, 0x8A79: 0x697D, 0x8A7A: 0x984D, 0x8A7B: 0x984E, 0x8A7C: 0x639B, 0x8A7D: 0x7B20, 0x8A7E: 0x6A2B, 0x8A80: 0x6A7F, 0x8A81: 0x68B6, 0x8A82: 0x9C0D, 0x8A83: 0x6F5F, 0x8A84: 0x5272, 0x8A85: 0x559D, 0x8A86: 0x6070, 0x8A87: 0x62EC, 0x8A88: 0x6D3B, 0x8A89: 0x6E07, 0x8A8A: 0x6ED1, 0x8A8B: 0x845B, 0x8A8C: 0x8910, 0x8A8D: 0x8F44, 0x8A8E: 0x4E14, 0x8A8F: 0x9C39, 0x8A90: 0x53F6, 0x8A91: 0x691B, 0x8A92: 0x6A3A, 0x8A93: 0x9784, 0x8A94: 0x682A, 0x8A95: 0x515C, 0x8A96: 0x7AC3, 0x8A97: 0x84B2, 0x8A98: 0x91DC, 0x8A99: 0x938C, 0x8A9A: 0x565B, 0x8A9B: 0x9D28, 0x8A9C: 0x6822, 0x8A9D: 0x8305, 0x8A9E: 0x8431, 0x8A9F: 0x7CA5, 0x8AA0: 0x5208, 0x8AA1: 0x82C5, 0x8AA2: 0x74E6, 0x8AA3: 0x4E7E, 0x8AA4: 0x4F83, 0x8AA5: 0x51A0, 0x8AA6: 0x5BD2, 0x8AA7: 0x520A, 0x8AA8: 0x52D8, 0x8AA9: 0x52E7, 0x8AAA: 0x5DFB, 0x8AAB: 0x559A, 0x8AAC: 0x582A, 0x8AAD: 0x59E6, 0x8AAE: 0x5B8C, 0x8AAF: 0x5B98, 0x8AB0: 0x5BDB, 0x8AB1: 0x5E72, 0x8AB2: 0x5E79, 0x8AB3: 0x60A3, 0x8AB4: 0x611F, 0x8AB5: 0x6163, 0x8AB6: 0x61BE, 0x8AB7: 0x63DB, 0x8AB8: 0x6562, 0x8AB9: 0x67D1, 0x8ABA: 0x6853, 0x8ABB: 0x68FA, 0x8ABC: 0x6B3E, 0x8ABD: 0x6B53, 0x8ABE: 0x6C57, 0x8ABF: 0x6F22, 0x8AC0: 0x6F97, 0x8AC1: 0x6F45, 0x8AC2: 0x74B0, 0x8AC3: 0x7518, 0x8AC4: 0x76E3, 0x8AC5: 0x770B, 0x8AC6: 0x7AFF, 0x8AC7: 0x7BA1, 0x8AC8: 0x7C21, 0x8AC9: 0x7DE9, 0x8ACA: 0x7F36, 0x8ACB: 0x7FF0, 0x8ACC: 0x809D, 0x8ACD: 0x8266, 0x8ACE: 0x839E, 0x8ACF: 0x89B3, 0x8AD0: 0x8ACC, 0x8AD1: 0x8CAB, 0x8AD2: 0x9084, 0x8AD3: 0x9451, 0x8AD4: 0x9593, 0x8AD5: 0x9591, 0x8AD6: 0x95A2, 0x8AD7: 0x9665, 0x8AD8: 0x97D3, 0x8AD9: 0x9928, 0x8ADA: 0x8218, 0x8ADB: 0x4E38, 0x8ADC: 0x542B, 0x8ADD: 0x5CB8, 0x8ADE: 0x5DCC, 0x8ADF: 0x73A9, 0x8AE0: 0x764C, 0x8AE1: 0x773C, 0x8AE2: 0x5CA9, 0x8AE3: 0x7FEB, 0x8AE4: 0x8D0B, 0x8AE5: 0x96C1, 0x8AE6: 0x9811, 0x8AE7: 0x9854, 0x8AE8: 0x9858, 0x8AE9: 0x4F01, 0x8AEA: 0x4F0E, 0x8AEB: 0x5371, 0x8AEC: 0x559C, 0x8AED: 0x5668, 0x8AEE: 0x57FA, 0x8AEF: 0x5947, 0x8AF0: 0x5B09, 0x8AF1: 0x5BC4, 0x8AF2: 0x5C90, 0x8AF3: 0x5E0C, 0x8AF4: 0x5E7E, 0x8AF5: 0x5FCC, 0x8AF6: 0x63EE, 0x8AF7: 0x673A, 0x8AF8: 0x65D7, 0x8AF9: 0x65E2, 0x8AFA: 0x671F, 0x8AFB: 0x68CB, 0x8AFC: 0x68C4, 0x8B40: 0x6A5F, 0x8B41: 0x5E30, 0x8B42: 0x6BC5, 0x8B43: 0x6C17, 0x8B44: 0x6C7D, 0x8B45: 0x757F, 0x8B46: 0x7948, 0x8B47: 0x5B63, 0x8B48: 0x7A00, 0x8B49: 0x7D00, 0x8B4A: 0x5FBD, 0x8B4B: 0x898F, 0x8B4C: 0x8A18, 0x8B4D: 0x8CB4, 0x8B4E: 0x8D77, 0x8B4F: 0x8ECC, 0x8B50: 0x8F1D, 0x8B51: 0x98E2, 0x8B52: 0x9A0E, 0x8B53: 0x9B3C, 0x8B54: 0x4E80, 0x8B55: 0x507D, 0x8B56: 0x5100, 0x8B57: 0x5993, 0x8B58: 0x5B9C, 0x8B59: 0x622F, 0x8B5A: 0x6280, 0x8B5B: 0x64EC, 0x8B5C: 0x6B3A, 0x8B5D: 0x72A0, 0x8B5E: 0x7591, 0x8B5F: 0x7947, 0x8B60: 0x7FA9, 0x8B61: 0x87FB, 0x8B62: 0x8ABC, 0x8B63: 0x8B70, 0x8B64: 0x63AC, 0x8B65: 0x83CA, 0x8B66: 0x97A0, 0x8B67: 0x5409, 0x8B68: 0x5403, 0x8B69: 0x55AB, 0x8B6A: 0x6854, 0x8B6B: 0x6A58, 0x8B6C: 0x8A70, 0x8B6D: 0x7827, 0x8B6E: 0x6775, 0x8B6F: 0x9ECD, 0x8B70: 0x5374, 0x8B71: 0x5BA2, 0x8B72: 0x811A, 0x8B73: 0x8650, 0x8B74: 0x9006, 0x8B75: 0x4E18, 0x8B76: 0x4E45, 0x8B77: 0x4EC7, 0x8B78: 0x4F11, 0x8B79: 0x53CA, 0x8B7A: 0x5438, 0x8B7B: 0x5BAE, 0x8B7C: 0x5F13, 0x8B7D: 0x6025, 0x8B7E: 0x6551, 0x8B80: 0x673D, 0x8B81: 0x6C42, 0x8B82: 0x6C72, 0x8B83: 0x6CE3, 0x8B84: 0x7078, 0x8B85: 0x7403, 0x8B86: 0x7A76, 0x8B87: 0x7AAE, 0x8B88: 0x7B08, 0x8B89: 0x7D1A, 0x8B8A: 0x7CFE, 0x8B8B: 0x7D66, 0x8B8C: 0x65E7, 0x8B8D: 0x725B, 0x8B8E: 0x53BB, 0x8B8F: 0x5C45, 0x8B90: 0x5DE8, 0x8B91: 0x62D2, 0x8B92: 0x62E0, 0x8B93: 0x6319, 0x8B94: 0x6E20, 0x8B95: 0x865A, 0x8B96: 0x8A31, 0x8B97: 0x8DDD, 0x8B98: 0x92F8, 0x8B99: 0x6F01, 0x8B9A: 0x79A6, 0x8B9B: 0x9B5A, 0x8B9C: 0x4EA8, 0x8B9D: 0x4EAB, 0x8B9E: 0x4EAC, 0x8B9F: 0x4F9B, 0x8BA0: 0x4FA0, 0x8BA1: 0x50D1, 0x8BA2: 0x5147, 0x8BA3: 0x7AF6, 0x8BA4: 0x5171, 0x8BA5: 0x51F6, 0x8BA6: 0x5354, 0x8BA7: 0x5321, 0x8BA8: 0x537F, 0x8BA9: 0x53EB, 0x8BAA: 0x55AC, 0x8BAB: 0x5883, 0x8BAC: 0x5CE1, 0x8BAD: 0x5F37, 0x8BAE: 0x5F4A, 0x8BAF: 0x602F, 0x8BB0: 0x6050, 0x8BB1: 0x606D, 0x8BB2: 0x631F, 0x8BB3: 0x6559, 0x8BB4: 0x6A4B, 0x8BB5: 0x6CC1, 0x8BB6: 0x72C2, 0x8BB7: 0x72ED, 0x8BB8: 0x77EF, 0x8BB9: 0x80F8, 0x8BBA: 0x8105, 0x8BBB: 0x8208, 0x8BBC: 0x854E, 0x8BBD: 0x90F7, 0x8BBE: 0x93E1, 0x8BBF: 0x97FF, 0x8BC0: 0x9957, 0x8BC1: 0x9A5A, 0x8BC2: 0x4EF0, 0x8BC3: 0x51DD, 0x8BC4: 0x5C2D, 0x8BC5: 0x6681, 0x8BC6: 0x696D, 0x8BC7: 0x5C40, 0x8BC8: 0x66F2, 0x8BC9: 0x6975, 0x8BCA: 0x7389, 0x8BCB: 0x6850, 0x8BCC: 0x7C81, 0x8BCD: 0x50C5, 0x8BCE: 0x52E4, 0x8BCF: 0x5747, 0x8BD0: 0x5DFE, 0x8BD1: 0x9326, 0x8BD2: 0x65A4, 0x8BD3: 0x6B23, 0x8BD4: 0x6B3D, 0x8BD5: 0x7434, 0x8BD6: 0x7981, 0x8BD7: 0x79BD, 0x8BD8: 0x7B4B, 0x8BD9: 0x7DCA, 0x8BDA: 0x82B9, 0x8BDB: 0x83CC, 0x8BDC: 0x887F, 0x8BDD: 0x895F, 0x8BDE: 0x8B39, 0x8BDF: 0x8FD1, 0x8BE0: 0x91D1, 0x8BE1: 0x541F, 0x8BE2: 0x9280, 0x8BE3: 0x4E5D, 0x8BE4: 0x5036, 0x8BE5: 0x53E5, 0x8BE6: 0x533A, 0x8BE7: 0x72D7, 0x8BE8: 0x7396, 0x8BE9: 0x77E9, 0x8BEA: 0x82E6, 0x8BEB: 0x8EAF, 0x8BEC: 0x99C6, 0x8BED: 0x99C8, 0x8BEE: 0x99D2, 0x8BEF: 0x5177, 0x8BF0: 0x611A, 0x8BF1: 0x865E, 0x8BF2: 0x55B0, 0x8BF3: 0x7A7A, 0x8BF4: 0x5076, 0x8BF5: 0x5BD3, 0x8BF6: 0x9047, 0x8BF7: 0x9685, 0x8BF8: 0x4E32, 0x8BF9: 0x6ADB, 0x8BFA: 0x91E7, 0x8BFB: 0x5C51, 0x8BFC: 0x5C48, 0x8C40: 0x6398, 0x8C41: 0x7A9F, 0x8C42: 0x6C93, 0x8C43: 0x9774, 0x8C44: 0x8F61, 0x8C45: 0x7AAA, 0x8C46: 0x718A, 0x8C47: 0x9688, 0x8C48: 0x7C82, 0x8C49: 0x6817, 0x8C4A: 0x7E70, 0x8C4B: 0x6851, 0x8C4C: 0x936C, 0x8C4D: 0x52F2, 0x8C4E: 0x541B, 0x8C4F: 0x85AB, 0x8C50: 0x8A13, 0x8C51: 0x7FA4, 0x8C52: 0x8ECD, 0x8C53: 0x90E1, 0x8C54: 0x5366, 0x8C55: 0x8888, 0x8C56: 0x7941, 0x8C57: 0x4FC2, 0x8C58: 0x50BE, 0x8C59: 0x5211, 0x8C5A: 0x5144, 0x8C5B: 0x5553, 0x8C5C: 0x572D, 0x8C5D: 0x73EA, 0x8C5E: 0x578B, 0x8C5F: 0x5951, 0x8C60: 0x5F62, 0x8C61: 0x5F84, 0x8C62: 0x6075, 0x8C63: 0x6176, 0x8C64: 0x6167, 0x8C65: 0x61A9, 0x8C66: 0x63B2, 0x8C67: 0x643A, 0x8C68: 0x656C, 0x8C69: 0x666F, 0x8C6A: 0x6842, 0x8C6B: 0x6E13, 0x8C6C: 0x7566, 0x8C6D: 0x7A3D, 0x8C6E: 0x7CFB, 0x8C6F: 0x7D4C, 0x8C70: 0x7D99, 0x8C71: 0x7E4B, 0x8C72: 0x7F6B, 0x8C73: 0x830E, 0x8C74: 0x834A, 0x8C75: 0x86CD, 0x8C76: 0x8A08, 0x8C77: 0x8A63, 0x8C78: 0x8B66, 0x8C79: 0x8EFD, 0x8C7A: 0x981A, 0x8C7B: 0x9D8F, 0x8C7C: 0x82B8, 0x8C7D: 0x8FCE, 0x8C7E: 0x9BE8, 0x8C80: 0x5287, 0x8C81: 0x621F, 0x8C82: 0x6483, 0x8C83: 0x6FC0, 0x8C84: 0x9699, 0x8C85: 0x6841, 0x8C86: 0x5091, 0x8C87: 0x6B20, 0x8C88: 0x6C7A, 0x8C89: 0x6F54, 0x8C8A: 0x7A74, 0x8C8B: 0x7D50, 0x8C8C: 0x8840, 0x8C8D: 0x8A23, 0x8C8E: 0x6708, 0x8C8F: 0x4EF6, 0x8C90: 0x5039, 0x8C91: 0x5026, 0x8C92: 0x5065, 0x8C93: 0x517C, 0x8C94: 0x5238, 0x8C95: 0x5263, 0x8C96: 0x55A7, 0x8C97: 0x570F, 0x8C98: 0x5805, 0x8C99: 0x5ACC, 0x8C9A: 0x5EFA, 0x8C9B: 0x61B2, 0x8C9C: 0x61F8, 0x8C9D: 0x62F3, 0x8C9E: 0x6372, 0x8C9F: 0x691C, 0x8CA0: 0x6A29, 0x8CA1: 0x727D, 0x8CA2: 0x72AC, 0x8CA3: 0x732E, 0x8CA4: 0x7814, 0x8CA5: 0x786F, 0x8CA6: 0x7D79, 0x8CA7: 0x770C, 0x8CA8: 0x80A9, 0x8CA9: 0x898B, 0x8CAA: 0x8B19, 0x8CAB: 0x8CE2, 0x8CAC: 0x8ED2, 0x8CAD: 0x9063, 0x8CAE: 0x9375, 0x8CAF: 0x967A, 0x8CB0: 0x9855, 0x8CB1: 0x9A13, 0x8CB2: 0x9E78, 0x8CB3: 0x5143, 0x8CB4: 0x539F, 0x8CB5: 0x53B3, 0x8CB6: 0x5E7B, 0x8CB7: 0x5F26, 0x8CB8: 0x6E1B, 0x8CB9: 0x6E90, 0x8CBA: 0x7384, 0x8CBB: 0x73FE, 0x8CBC: 0x7D43, 0x8CBD: 0x8237, 0x8CBE: 0x8A00, 0x8CBF: 0x8AFA, 0x8CC0: 0x9650, 0x8CC1: 0x4E4E, 0x8CC2: 0x500B, 0x8CC3: 0x53E4, 0x8CC4: 0x547C, 0x8CC5: 0x56FA, 0x8CC6: 0x59D1, 0x8CC7: 0x5B64, 0x8CC8: 0x5DF1, 0x8CC9: 0x5EAB, 0x8CCA: 0x5F27, 0x8CCB: 0x6238, 0x8CCC: 0x6545, 0x8CCD: 0x67AF, 0x8CCE: 0x6E56, 0x8CCF: 0x72D0, 0x8CD0: 0x7CCA, 0x8CD1: 0x88B4, 0x8CD2: 0x80A1, 0x8CD3: 0x80E1, 0x8CD4: 0x83F0, 0x8CD5: 0x864E, 0x8CD6: 0x8A87, 0x8CD7: 0x8DE8, 0x8CD8: 0x9237, 0x8CD9: 0x96C7, 0x8CDA: 0x9867, 0x8CDB: 0x9F13, 0x8CDC: 0x4E94, 0x8CDD: 0x4E92, 0x8CDE: 0x4F0D, 0x8CDF: 0x5348, 0x8CE0: 0x5449, 0x8CE1: 0x543E, 0x8CE2: 0x5A2F, 0x8CE3: 0x5F8C, 0x8CE4: 0x5FA1, 0x8CE5: 0x609F, 0x8CE6: 0x68A7, 0x8CE7: 0x6A8E, 0x8CE8: 0x745A, 0x8CE9: 0x7881, 0x8CEA: 0x8A9E, 0x8CEB: 0x8AA4, 0x8CEC: 0x8B77, 0x8CED: 0x9190, 0x8CEE: 0x4E5E, 0x8CEF: 0x9BC9, 0x8CF0: 0x4EA4, 0x8CF1: 0x4F7C, 0x8CF2: 0x4FAF, 0x8CF3: 0x5019, 0x8CF4: 0x5016, 0x8CF5: 0x5149, 0x8CF6: 0x516C, 0x8CF7: 0x529F, 0x8CF8: 0x52B9, 0x8CF9: 0x52FE, 0x8CFA: 0x539A, 0x8CFB: 0x53E3, 0x8CFC: 0x5411, 0x8D40: 0x540E, 0x8D41: 0x5589, 0x8D42: 0x5751, 0x8D43: 0x57A2, 0x8D44: 0x597D, 0x8D45: 0x5B54, 0x8D46: 0x5B5D, 0x8D47: 0x5B8F, 0x8D48: 0x5DE5, 0x8D49: 0x5DE7, 0x8D4A: 0x5DF7, 0x8D4B: 0x5E78, 0x8D4C: 0x5E83, 0x8D4D: 0x5E9A, 0x8D4E: 0x5EB7, 0x8D4F: 0x5F18, 0x8D50: 0x6052, 0x8D51: 0x614C, 0x8D52: 0x6297, 0x8D53: 0x62D8, 0x8D54: 0x63A7, 0x8D55: 0x653B, 0x8D56: 0x6602, 0x8D57: 0x6643, 0x8D58: 0x66F4, 0x8D59: 0x676D, 0x8D5A: 0x6821, 0x8D5B: 0x6897, 0x8D5C: 0x69CB, 0x8D5D: 0x6C5F, 0x8D5E: 0x6D2A, 0x8D5F: 0x6D69, 0x8D60: 0x6E2F, 0x8D61: 0x6E9D, 0x8D62: 0x7532, 0x8D63: 0x7687, 0x8D64: 0x786C, 0x8D65: 0x7A3F, 0x8D66: 0x7CE0, 0x8D67: 0x7D05, 0x8D68: 0x7D18, 0x8D69: 0x7D5E, 0x8D6A: 0x7DB1, 0x8D6B: 0x8015, 0x8D6C: 0x8003, 0x8D6D: 0x80AF, 0x8D6E: 0x80B1, 0x8D6F: 0x8154, 0x8D70: 0x818F, 0x8D71: 0x822A, 0x8D72: 0x8352, 0x8D73: 0x884C, 0x8D74: 0x8861, 0x8D75: 0x8B1B, 0x8D76: 0x8CA2, 0x8D77: 0x8CFC, 0x8D78: 0x90CA, 0x8D79: 0x9175, 0x8D7A: 0x9271, 0x8D7B: 0x783F, 0x8D7C: 0x92FC, 0x8D7D: 0x95A4, 0x8D7E: 0x964D, 0x8D80: 0x9805, 0x8D81: 0x9999, 0x8D82: 0x9AD8, 0x8D83: 0x9D3B, 0x8D84: 0x525B, 0x8D85: 0x52AB, 0x8D86: 0x53F7, 0x8D87: 0x5408, 0x8D88: 0x58D5, 0x8D89: 0x62F7, 0x8D8A: 0x6FE0, 0x8D8B: 0x8C6A, 0x8D8C: 0x8F5F, 0x8D8D: 0x9EB9, 0x8D8E: 0x514B, 0x8D8F: 0x523B, 0x8D90: 0x544A, 0x8D91: 0x56FD, 0x8D92: 0x7A40, 0x8D93: 0x9177, 0x8D94: 0x9D60, 0x8D95: 0x9ED2, 0x8D96: 0x7344, 0x8D97: 0x6F09, 0x8D98: 0x8170, 0x8D99: 0x7511, 0x8D9A: 0x5FFD, 0x8D9B: 0x60DA, 0x8D9C: 0x9AA8, 0x8D9D: 0x72DB, 0x8D9E: 0x8FBC, 0x8D9F: 0x6B64, 0x8DA0: 0x9803, 0x8DA1: 0x4ECA, 0x8DA2: 0x56F0, 0x8DA3: 0x5764, 0x8DA4: 0x58BE, 0x8DA5: 0x5A5A, 0x8DA6: 0x6068, 0x8DA7: 0x61C7, 0x8DA8: 0x660F, 0x8DA9: 0x6606, 0x8DAA: 0x6839, 0x8DAB: 0x68B1, 0x8DAC: 0x6DF7, 0x8DAD: 0x75D5, 0x8DAE: 0x7D3A, 0x8DAF: 0x826E, 0x8DB0: 0x9B42, 0x8DB1: 0x4E9B, 0x8DB2: 0x4F50, 0x8DB3: 0x53C9, 0x8DB4: 0x5506, 0x8DB5: 0x5D6F, 0x8DB6: 0x5DE6, 0x8DB7: 0x5DEE, 0x8DB8: 0x67FB, 0x8DB9: 0x6C99, 0x8DBA: 0x7473, 0x8DBB: 0x7802, 0x8DBC: 0x8A50, 0x8DBD: 0x9396, 0x8DBE: 0x88DF, 0x8DBF: 0x5750, 0x8DC0: 0x5EA7, 0x8DC1: 0x632B, 0x8DC2: 0x50B5, 0x8DC3: 0x50AC, 0x8DC4: 0x518D, 0x8DC5: 0x6700, 0x8DC6: 0x54C9, 0x8DC7: 0x585E, 0x8DC8: 0x59BB, 0x8DC9: 0x5BB0, 0x8DCA: 0x5F69, 0x8DCB: 0x624D, 0x8DCC: 0x63A1, 0x8DCD: 0x683D, 0x8DCE: 0x6B73, 0x8DCF: 0x6E08, 0x8DD0: 0x707D, 0x8DD1: 0x91C7, 0x8DD2: 0x7280, 0x8DD3: 0x7815, 0x8DD4: 0x7826, 0x8DD5: 0x796D, 0x8DD6: 0x658E, 0x8DD7: 0x7D30, 0x8DD8: 0x83DC, 0x8DD9: 0x88C1, 0x8DDA: 0x8F09, 0x8DDB: 0x969B, 0x8DDC: 0x5264, 0x8DDD: 0x5728, 0x8DDE: 0x6750, 0x8DDF: 0x7F6A, 0x8DE0: 0x8CA1, 0x8DE1: 0x51B4, 0x8DE2: 0x5742, 0x8DE3: 0x962A, 0x8DE4: 0x583A, 0x8DE5: 0x698A, 0x8DE6: 0x80B4, 0x8DE7: 0x54B2, 0x8DE8: 0x5D0E, 0x8DE9: 0x57FC, 0x8DEA: 0x7895, 0x8DEB: 0x9DFA, 0x8DEC: 0x4F5C, 0x8DED: 0x524A, 0x8DEE: 0x548B, 0x8DEF: 0x643E, 0x8DF0: 0x6628, 0x8DF1: 0x6714, 0x8DF2: 0x67F5, 0x8DF3: 0x7A84, 0x8DF4: 0x7B56, 0x8DF5: 0x7D22, 0x8DF6: 0x932F, 0x8DF7: 0x685C, 0x8DF8: 0x9BAD, 0x8DF9: 0x7B39, 0x8DFA: 0x5319, 0x8DFB: 0x518A, 0x8DFC: 0x5237, 0x8E40: 0x5BDF, 0x8E41: 0x62F6, 0x8E42: 0x64AE, 0x8E43: 0x64E6, 0x8E44: 0x672D, 0x8E45: 0x6BBA, 0x8E46: 0x85A9, 0x8E47: 0x96D1, 0x8E48: 0x7690, 0x8E49: 0x9BD6, 0x8E4A: 0x634C, 0x8E4B: 0x9306, 0x8E4C: 0x9BAB, 0x8E4D: 0x76BF, 0x8E4E: 0x6652, 0x8E4F: 0x4E09, 0x8E50: 0x5098, 0x8E51: 0x53C2, 0x8E52: 0x5C71, 0x8E53: 0x60E8, 0x8E54: 0x6492, 0x8E55: 0x6563, 0x8E56: 0x685F, 0x8E57: 0x71E6, 0x8E58: 0x73CA, 0x8E59: 0x7523, 0x8E5A: 0x7B97, 0x8E5B: 0x7E82, 0x8E5C: 0x8695, 0x8E5D: 0x8B83, 0x8E5E: 0x8CDB, 0x8E5F: 0x9178, 0x8E60: 0x9910, 0x8E61: 0x65AC, 0x8E62: 0x66AB, 0x8E63: 0x6B8B, 0x8E64: 0x4ED5, 0x8E65: 0x4ED4, 0x8E66: 0x4F3A, 0x8E67: 0x4F7F, 0x8E68: 0x523A, 0x8E69: 0x53F8, 0x8E6A: 0x53F2, 0x8E6B: 0x55E3, 0x8E6C: 0x56DB, 0x8E6D: 0x58EB, 0x8E6E: 0x59CB, 0x8E6F: 0x59C9, 0x8E70: 0x59FF, 0x8E71: 0x5B50, 0x8E72: 0x5C4D, 0x8E73: 0x5E02, 0x8E74: 0x5E2B, 0x8E75: 0x5FD7, 0x8E76: 0x601D, 0x8E77: 0x6307, 0x8E78: 0x652F, 0x8E79: 0x5B5C, 0x8E7A: 0x65AF, 0x8E7B: 0x65BD, 0x8E7C: 0x65E8, 0x8E7D: 0x679D, 0x8E7E: 0x6B62, 0x8E80: 0x6B7B, 0x8E81: 0x6C0F, 0x8E82: 0x7345, 0x8E83: 0x7949, 0x8E84: 0x79C1, 0x8E85: 0x7CF8, 0x8E86: 0x7D19, 0x8E87: 0x7D2B, 0x8E88: 0x80A2, 0x8E89: 0x8102, 0x8E8A: 0x81F3, 0x8E8B: 0x8996, 0x8E8C: 0x8A5E, 0x8E8D: 0x8A69, 0x8E8E: 0x8A66, 0x8E8F: 0x8A8C, 0x8E90: 0x8AEE, 0x8E91: 0x8CC7, 0x8E92: 0x8CDC, 0x8E93: 0x96CC, 0x8E94: 0x98FC, 0x8E95: 0x6B6F, 0x8E96: 0x4E8B, 0x8E97: 0x4F3C, 0x8E98: 0x4F8D, 0x8E99: 0x5150, 0x8E9A: 0x5B57, 0x8E9B: 0x5BFA, 0x8E9C: 0x6148, 0x8E9D: 0x6301, 0x8E9E: 0x6642, 0x8E9F: 0x6B21, 0x8EA0: 0x6ECB, 0x8EA1: 0x6CBB, 0x8EA2: 0x723E, 0x8EA3: 0x74BD, 0x8EA4: 0x75D4, 0x8EA5: 0x78C1, 0x8EA6: 0x793A, 0x8EA7: 0x800C, 0x8EA8: 0x8033, 0x8EA9: 0x81EA, 0x8EAA: 0x8494, 0x8EAB: 0x8F9E, 0x8EAC: 0x6C50, 0x8EAD: 0x9E7F, 0x8EAE: 0x5F0F, 0x8EAF: 0x8B58, 0x8EB0: 0x9D2B, 0x8EB1: 0x7AFA, 0x8EB2: 0x8EF8, 0x8EB3: 0x5B8D, 0x8EB4: 0x96EB, 0x8EB5: 0x4E03, 0x8EB6: 0x53F1, 0x8EB7: 0x57F7, 0x8EB8: 0x5931, 0x8EB9: 0x5AC9, 0x8EBA: 0x5BA4, 0x8EBB: 0x6089, 0x8EBC: 0x6E7F, 0x8EBD: 0x6F06, 0x8EBE: 0x75BE, 0x8EBF: 0x8CEA, 0x8EC0: 0x5B9F, 0x8EC1: 0x8500, 0x8EC2: 0x7BE0, 0x8EC3: 0x5072, 0x8EC4: 0x67F4, 0x8EC5: 0x829D, 0x8EC6: 0x5C61, 0x8EC7: 0x854A, 0x8EC8: 0x7E1E, 0x8EC9: 0x820E, 0x8ECA: 0x5199, 0x8ECB: 0x5C04, 0x8ECC: 0x6368, 0x8ECD: 0x8D66, 0x8ECE: 0x659C, 0x8ECF: 0x716E, 0x8ED0: 0x793E, 0x8ED1: 0x7D17, 0x8ED2: 0x8005, 0x8ED3: 0x8B1D, 0x8ED4: 0x8ECA, 0x8ED5: 0x906E, 0x8ED6: 0x86C7, 0x8ED7: 0x90AA, 0x8ED8: 0x501F, 0x8ED9: 0x52FA, 0x8EDA: 0x5C3A, 0x8EDB: 0x6753, 0x8EDC: 0x707C, 0x8EDD: 0x7235, 0x8EDE: 0x914C, 0x8EDF: 0x91C8, 0x8EE0: 0x932B, 0x8EE1: 0x82E5, 0x8EE2: 0x5BC2, 0x8EE3: 0x5F31, 0x8EE4: 0x60F9, 0x8EE5: 0x4E3B, 0x8EE6: 0x53D6, 0x8EE7: 0x5B88, 0x8EE8: 0x624B, 0x8EE9: 0x6731, 0x8EEA: 0x6B8A, 0x8EEB: 0x72E9, 0x8EEC: 0x73E0, 0x8EED: 0x7A2E, 0x8EEE: 0x816B, 0x8EEF: 0x8DA3, 0x8EF0: 0x9152, 0x8EF1: 0x9996, 0x8EF2: 0x5112, 0x8EF3: 0x53D7, 0x8EF4: 0x546A, 0x8EF5: 0x5BFF, 0x8EF6: 0x6388, 0x8EF7: 0x6A39, 0x8EF8: 0x7DAC, 0x8EF9: 0x9700, 0x8EFA: 0x56DA, 0x8EFB: 0x53CE, 0x8EFC: 0x5468, 0x8F40: 0x5B97, 0x8F41: 0x5C31, 0x8F42: 0x5DDE, 0x8F43: 0x4FEE, 0x8F44: 0x6101, 0x8F45: 0x62FE, 0x8F46: 0x6D32, 0x8F47: 0x79C0, 0x8F48: 0x79CB, 0x8F49: 0x7D42, 0x8F4A: 0x7E4D, 0x8F4B: 0x7FD2, 0x8F4C: 0x81ED, 0x8F4D: 0x821F, 0x8F4E: 0x8490, 0x8F4F: 0x8846, 0x8F50: 0x8972, 0x8F51: 0x8B90, 0x8F52: 0x8E74, 0x8F53: 0x8F2F, 0x8F54: 0x9031, 0x8F55: 0x914B, 0x8F56: 0x916C, 0x8F57: 0x96C6, 0x8F58: 0x919C, 0x8F59: 0x4EC0, 0x8F5A: 0x4F4F, 0x8F5B: 0x5145, 0x8F5C: 0x5341, 0x8F5D: 0x5F93, 0x8F5E: 0x620E, 0x8F5F: 0x67D4, 0x8F60: 0x6C41, 0x8F61: 0x6E0B, 0x8F62: 0x7363, 0x8F63: 0x7E26, 0x8F64: 0x91CD, 0x8F65: 0x9283, 0x8F66: 0x53D4, 0x8F67: 0x5919, 0x8F68: 0x5BBF, 0x8F69: 0x6DD1, 0x8F6A: 0x795D, 0x8F6B: 0x7E2E, 0x8F6C: 0x7C9B, 0x8F6D: 0x587E, 0x8F6E: 0x719F, 0x8F6F: 0x51FA, 0x8F70: 0x8853, 0x8F71: 0x8FF0, 0x8F72: 0x4FCA, 0x8F73: 0x5CFB, 0x8F74: 0x6625, 0x8F75: 0x77AC, 0x8F76: 0x7AE3, 0x8F77: 0x821C, 0x8F78: 0x99FF, 0x8F79: 0x51C6, 0x8F7A: 0x5FAA, 0x8F7B: 0x65EC, 0x8F7C: 0x696F, 0x8F7D: 0x6B89, 0x8F7E: 0x6DF3, 0x8F80: 0x6E96, 0x8F81: 0x6F64, 0x8F82: 0x76FE, 0x8F83: 0x7D14, 0x8F84: 0x5DE1, 0x8F85: 0x9075, 0x8F86: 0x9187, 0x8F87: 0x9806, 0x8F88: 0x51E6, 0x8F89: 0x521D, 0x8F8A: 0x6240, 0x8F8B: 0x6691, 0x8F8C: 0x66D9, 0x8F8D: 0x6E1A, 0x8F8E: 0x5EB6, 0x8F8F: 0x7DD2, 0x8F90: 0x7F72, 0x8F91: 0x66F8, 0x8F92: 0x85AF, 0x8F93: 0x85F7, 0x8F94: 0x8AF8, 0x8F95: 0x52A9, 0x8F96: 0x53D9, 0x8F97: 0x5973, 0x8F98: 0x5E8F, 0x8F99: 0x5F90, 0x8F9A: 0x6055, 0x8F9B: 0x92E4, 0x8F9C: 0x9664, 0x8F9D: 0x50B7, 0x8F9E: 0x511F, 0x8F9F: 0x52DD, 0x8FA0: 0x5320, 0x8FA1: 0x5347, 0x8FA2: 0x53EC, 0x8FA3: 0x54E8, 0x8FA4: 0x5546, 0x8FA5: 0x5531, 0x8FA6: 0x5617, 0x8FA7: 0x5968, 0x8FA8: 0x59BE, 0x8FA9: 0x5A3C, 0x8FAA: 0x5BB5, 0x8FAB: 0x5C06, 0x8FAC: 0x5C0F, 0x8FAD: 0x5C11, 0x8FAE: 0x5C1A, 0x8FAF: 0x5E84, 0x8FB0: 0x5E8A, 0x8FB1: 0x5EE0, 0x8FB2: 0x5F70, 0x8FB3: 0x627F, 0x8FB4: 0x6284, 0x8FB5: 0x62DB, 0x8FB6: 0x638C, 0x8FB7: 0x6377, 0x8FB8: 0x6607, 0x8FB9: 0x660C, 0x8FBA: 0x662D, 0x8FBB: 0x6676, 0x8FBC: 0x677E, 0x8FBD: 0x68A2, 0x8FBE: 0x6A1F, 0x8FBF: 0x6A35, 0x8FC0: 0x6CBC, 0x8FC1: 0x6D88, 0x8FC2: 0x6E09, 0x8FC3: 0x6E58, 0x8FC4: 0x713C, 0x8FC5: 0x7126, 0x8FC6: 0x7167, 0x8FC7: 0x75C7, 0x8FC8: 0x7701, 0x8FC9: 0x785D, 0x8FCA: 0x7901, 0x8FCB: 0x7965, 0x8FCC: 0x79F0, 0x8FCD: 0x7AE0, 0x8FCE: 0x7B11, 0x8FCF: 0x7CA7, 0x8FD0: 0x7D39, 0x8FD1: 0x8096, 0x8FD2: 0x83D6, 0x8FD3: 0x848B, 0x8FD4: 0x8549, 0x8FD5: 0x885D, 0x8FD6: 0x88F3, 0x8FD7: 0x8A1F, 0x8FD8: 0x8A3C, 0x8FD9: 0x8A54, 0x8FDA: 0x8A73, 0x8FDB: 0x8C61, 0x8FDC: 0x8CDE, 0x8FDD: 0x91A4, 0x8FDE: 0x9266, 0x8FDF: 0x937E, 0x8FE0: 0x9418, 0x8FE1: 0x969C, 0x8FE2: 0x9798, 0x8FE3: 0x4E0A, 0x8FE4: 0x4E08, 0x8FE5: 0x4E1E, 0x8FE6: 0x4E57, 0x8FE7: 0x5197, 0x8FE8: 0x5270, 0x8FE9: 0x57CE, 0x8FEA: 0x5834, 0x8FEB: 0x58CC, 0x8FEC: 0x5B22, 0x8FED: 0x5E38, 0x8FEE: 0x60C5, 0x8FEF: 0x64FE, 0x8FF0: 0x6761, 0x8FF1: 0x6756, 0x8FF2: 0x6D44, 0x8FF3: 0x72B6, 0x8FF4: 0x7573, 0x8FF5: 0x7A63, 0x8FF6: 0x84B8, 0x8FF7: 0x8B72, 0x8FF8: 0x91B8, 0x8FF9: 0x9320, 0x8FFA: 0x5631, 0x8FFB: 0x57F4, 0x8FFC: 0x98FE, 0x9040: 0x62ED, 0x9041: 0x690D, 0x9042: 0x6B96, 0x9043: 0x71ED, 0x9044: 0x7E54, 0x9045: 0x8077, 0x9046: 0x8272, 0x9047: 0x89E6, 0x9048: 0x98DF, 0x9049: 0x8755, 0x904A: 0x8FB1, 0x904B: 0x5C3B, 0x904C: 0x4F38, 0x904D: 0x4FE1, 0x904E: 0x4FB5, 0x904F: 0x5507, 0x9050: 0x5A20, 0x9051: 0x5BDD, 0x9052: 0x5BE9, 0x9053: 0x5FC3, 0x9054: 0x614E, 0x9055: 0x632F, 0x9056: 0x65B0, 0x9057: 0x664B, 0x9058: 0x68EE, 0x9059: 0x699B, 0x905A: 0x6D78, 0x905B: 0x6DF1, 0x905C: 0x7533, 0x905D: 0x75B9, 0x905E: 0x771F, 0x905F: 0x795E, 0x9060: 0x79E6, 0x9061: 0x7D33, 0x9062: 0x81E3, 0x9063: 0x82AF, 0x9064: 0x85AA, 0x9065: 0x89AA, 0x9066: 0x8A3A, 0x9067: 0x8EAB, 0x9068: 0x8F9B, 0x9069: 0x9032, 0x906A: 0x91DD, 0x906B: 0x9707, 0x906C: 0x4EBA, 0x906D: 0x4EC1, 0x906E: 0x5203, 0x906F: 0x5875, 0x9070: 0x58EC, 0x9071: 0x5C0B, 0x9072: 0x751A, 0x9073: 0x5C3D, 0x9074: 0x814E, 0x9075: 0x8A0A, 0x9076: 0x8FC5, 0x9077: 0x9663, 0x9078: 0x976D, 0x9079: 0x7B25, 0x907A: 0x8ACF, 0x907B: 0x9808, 0x907C: 0x9162, 0x907D: 0x56F3, 0x907E: 0x53A8, 0x9080: 0x9017, 0x9081: 0x5439, 0x9082: 0x5782, 0x9083: 0x5E25, 0x9084: 0x63A8, 0x9085: 0x6C34, 0x9086: 0x708A, 0x9087: 0x7761, 0x9088: 0x7C8B, 0x9089: 0x7FE0, 0x908A: 0x8870, 0x908B: 0x9042, 0x908C: 0x9154, 0x908D: 0x9310, 0x908E: 0x9318, 0x908F: 0x968F, 0x9090: 0x745E, 0x9091: 0x9AC4, 0x9092: 0x5D07, 0x9093: 0x5D69, 0x9094: 0x6570, 0x9095: 0x67A2, 0x9096: 0x8DA8, 0x9097: 0x96DB, 0x9098: 0x636E, 0x9099: 0x6749, 0x909A: 0x6919, 0x909B: 0x83C5, 0x909C: 0x9817, 0x909D: 0x96C0, 0x909E: 0x88FE, 0x909F: 0x6F84, 0x90A0: 0x647A, 0x90A1: 0x5BF8, 0x90A2: 0x4E16, 0x90A3: 0x702C, 0x90A4: 0x755D, 0x90A5: 0x662F, 0x90A6: 0x51C4, 0x90A7: 0x5236, 0x90A8: 0x52E2, 0x90A9: 0x59D3, 0x90AA: 0x5F81, 0x90AB: 0x6027, 0x90AC: 0x6210, 0x90AD: 0x653F, 0x90AE: 0x6574, 0x90AF: 0x661F, 0x90B0: 0x6674, 0x90B1: 0x68F2, 0x90B2: 0x6816, 0x90B3: 0x6B63, 0x90B4: 0x6E05, 0x90B5: 0x7272, 0x90B6: 0x751F, 0x90B7: 0x76DB, 0x90B8: 0x7CBE, 0x90B9: 0x8056, 0x90BA: 0x58F0, 0x90BB: 0x88FD, 0x90BC: 0x897F, 0x90BD: 0x8AA0, 0x90BE: 0x8A93, 0x90BF: 0x8ACB, 0x90C0: 0x901D, 0x90C1: 0x9192, 0x90C2: 0x9752, 0x90C3: 0x9759, 0x90C4: 0x6589, 0x90C5: 0x7A0E, 0x90C6: 0x8106, 0x90C7: 0x96BB, 0x90C8: 0x5E2D, 0x90C9: 0x60DC, 0x90CA: 0x621A, 0x90CB: 0x65A5, 0x90CC: 0x6614, 0x90CD: 0x6790, 0x90CE: 0x77F3, 0x90CF: 0x7A4D, 0x90D0: 0x7C4D, 0x90D1: 0x7E3E, 0x90D2: 0x810A, 0x90D3: 0x8CAC, 0x90D4: 0x8D64, 0x90D5: 0x8DE1, 0x90D6: 0x8E5F, 0x90D7: 0x78A9, 0x90D8: 0x5207, 0x90D9: 0x62D9, 0x90DA: 0x63A5, 0x90DB: 0x6442, 0x90DC: 0x6298, 0x90DD: 0x8A2D, 0x90DE: 0x7A83, 0x90DF: 0x7BC0, 0x90E0: 0x8AAC, 0x90E1: 0x96EA, 0x90E2: 0x7D76, 0x90E3: 0x820C, 0x90E4: 0x8749, 0x90E5: 0x4ED9, 0x90E6: 0x5148, 0x90E7: 0x5343, 0x90E8: 0x5360, 0x90E9: 0x5BA3, 0x90EA: 0x5C02, 0x90EB: 0x5C16, 0x90EC: 0x5DDD, 0x90ED: 0x6226, 0x90EE: 0x6247, 0x90EF: 0x64B0, 0x90F0: 0x6813, 0x90F1: 0x6834, 0x90F2: 0x6CC9, 0x90F3: 0x6D45, 0x90F4: 0x6D17, 0x90F5: 0x67D3, 0x90F6: 0x6F5C, 0x90F7: 0x714E, 0x90F8: 0x717D, 0x90F9: 0x65CB, 0x90FA: 0x7A7F, 0x90FB: 0x7BAD, 0x90FC: 0x7DDA, 0x9140: 0x7E4A, 0x9141: 0x7FA8, 0x9142: 0x817A, 0x9143: 0x821B, 0x9144: 0x8239, 0x9145: 0x85A6, 0x9146: 0x8A6E, 0x9147: 0x8CCE, 0x9148: 0x8DF5, 0x9149: 0x9078, 0x914A: 0x9077, 0x914B: 0x92AD, 0x914C: 0x9291, 0x914D: 0x9583, 0x914E: 0x9BAE, 0x914F: 0x524D, 0x9150: 0x5584, 0x9151: 0x6F38, 0x9152: 0x7136, 0x9153: 0x5168, 0x9154: 0x7985, 0x9155: 0x7E55, 0x9156: 0x81B3, 0x9157: 0x7CCE, 0x9158: 0x564C, 0x9159: 0x5851, 0x915A: 0x5CA8, 0x915B: 0x63AA, 0x915C: 0x66FE, 0x915D: 0x66FD, 0x915E: 0x695A, 0x915F: 0x72D9, 0x9160: 0x758F, 0x9161: 0x758E, 0x9162: 0x790E, 0x9163: 0x7956, 0x9164: 0x79DF, 0x9165: 0x7C97, 0x9166: 0x7D20, 0x9167: 0x7D44, 0x9168: 0x8607, 0x9169: 0x8A34, 0x916A: 0x963B, 0x916B: 0x9061, 0x916C: 0x9F20, 0x916D: 0x50E7, 0x916E: 0x5275, 0x916F: 0x53CC, 0x9170: 0x53E2, 0x9171: 0x5009, 0x9172: 0x55AA, 0x9173: 0x58EE, 0x9174: 0x594F, 0x9175: 0x723D, 0x9176: 0x5B8B, 0x9177: 0x5C64, 0x9178: 0x531D, 0x9179: 0x60E3, 0x917A: 0x60F3, 0x917B: 0x635C, 0x917C: 0x6383, 0x917D: 0x633F, 0x917E: 0x63BB, 0x9180: 0x64CD, 0x9181: 0x65E9, 0x9182: 0x66F9, 0x9183: 0x5DE3, 0x9184: 0x69CD, 0x9185: 0x69FD, 0x9186: 0x6F15, 0x9187: 0x71E5, 0x9188: 0x4E89, 0x9189: 0x75E9, 0x918A: 0x76F8, 0x918B: 0x7A93, 0x918C: 0x7CDF, 0x918D: 0x7DCF, 0x918E: 0x7D9C, 0x918F: 0x8061, 0x9190: 0x8349, 0x9191: 0x8358, 0x9192: 0x846C, 0x9193: 0x84BC, 0x9194: 0x85FB, 0x9195: 0x88C5, 0x9196: 0x8D70, 0x9197: 0x9001, 0x9198: 0x906D, 0x9199: 0x9397, 0x919A: 0x971C, 0x919B: 0x9A12, 0x919C: 0x50CF, 0x919D: 0x5897, 0x919E: 0x618E, 0x919F: 0x81D3, 0x91A0: 0x8535, 0x91A1: 0x8D08, 0x91A2: 0x9020, 0x91A3: 0x4FC3, 0x91A4: 0x5074, 0x91A5: 0x5247, 0x91A6: 0x5373, 0x91A7: 0x606F, 0x91A8: 0x6349, 0x91A9: 0x675F, 0x91AA: 0x6E2C, 0x91AB: 0x8DB3, 0x91AC: 0x901F, 0x91AD: 0x4FD7, 0x91AE: 0x5C5E, 0x91AF: 0x8CCA, 0x91B0: 0x65CF, 0x91B1: 0x7D9A, 0x91B2: 0x5352, 0x91B3: 0x8896, 0x91B4: 0x5176, 0x91B5: 0x63C3, 0x91B6: 0x5B58, 0x91B7: 0x5B6B, 0x91B8: 0x5C0A, 0x91B9: 0x640D, 0x91BA: 0x6751, 0x91BB: 0x905C, 0x91BC: 0x4ED6, 0x91BD: 0x591A, 0x91BE: 0x592A, 0x91BF: 0x6C70, 0x91C0: 0x8A51, 0x91C1: 0x553E, 0x91C2: 0x5815, 0x91C3: 0x59A5, 0x91C4: 0x60F0, 0x91C5: 0x6253, 0x91C6: 0x67C1, 0x91C7: 0x8235, 0x91C8: 0x6955, 0x91C9: 0x9640, 0x91CA: 0x99C4, 0x91CB: 0x9A28, 0x91CC: 0x4F53, 0x91CD: 0x5806, 0x91CE: 0x5BFE, 0x91CF: 0x8010, 0x91D0: 0x5CB1, 0x91D1: 0x5E2F, 0x91D2: 0x5F85, 0x91D3: 0x6020, 0x91D4: 0x614B, 0x91D5: 0x6234, 0x91D6: 0x66FF, 0x91D7: 0x6CF0, 0x91D8: 0x6EDE, 0x91D9: 0x80CE, 0x91DA: 0x817F, 0x91DB: 0x82D4, 0x91DC: 0x888B, 0x91DD: 0x8CB8, 0x91DE: 0x9000, 0x91DF: 0x902E, 0x91E0: 0x968A, 0x91E1: 0x9EDB, 0x91E2: 0x9BDB, 0x91E3: 0x4EE3, 0x91E4: 0x53F0, 0x91E5: 0x5927, 0x91E6: 0x7B2C, 0x91E7: 0x918D, 0x91E8: 0x984C, 0x91E9: 0x9DF9, 0x91EA: 0x6EDD, 0x91EB: 0x7027, 0x91EC: 0x5353, 0x91ED: 0x5544, 0x91EE: 0x5B85, 0x91EF: 0x6258, 0x91F0: 0x629E, 0x91F1: 0x62D3, 0x91F2: 0x6CA2, 0x91F3: 0x6FEF, 0x91F4: 0x7422, 0x91F5: 0x8A17, 0x91F6: 0x9438, 0x91F7: 0x6FC1, 0x91F8: 0x8AFE, 0x91F9: 0x8338, 0x91FA: 0x51E7, 0x91FB: 0x86F8, 0x91FC: 0x53EA, 0x9240: 0x53E9, 0x9241: 0x4F46, 0x9242: 0x9054, 0x9243: 0x8FB0, 0x9244: 0x596A, 0x9245: 0x8131, 0x9246: 0x5DFD, 0x9247: 0x7AEA, 0x9248: 0x8FBF, 0x9249: 0x68DA, 0x924A: 0x8C37, 0x924B: 0x72F8, 0x924C: 0x9C48, 0x924D: 0x6A3D, 0x924E: 0x8AB0, 0x924F: 0x4E39, 0x9250: 0x5358, 0x9251: 0x5606, 0x9252: 0x5766, 0x9253: 0x62C5, 0x9254: 0x63A2, 0x9255: 0x65E6, 0x9256: 0x6B4E, 0x9257: 0x6DE1, 0x9258: 0x6E5B, 0x9259: 0x70AD, 0x925A: 0x77ED, 0x925B: 0x7AEF, 0x925C: 0x7BAA, 0x925D: 0x7DBB, 0x925E: 0x803D, 0x925F: 0x80C6, 0x9260: 0x86CB, 0x9261: 0x8A95, 0x9262: 0x935B, 0x9263: 0x56E3, 0x9264: 0x58C7, 0x9265: 0x5F3E, 0x9266: 0x65AD, 0x9267: 0x6696, 0x9268: 0x6A80, 0x9269: 0x6BB5, 0x926A: 0x7537, 0x926B: 0x8AC7, 0x926C: 0x5024, 0x926D: 0x77E5, 0x926E: 0x5730, 0x926F: 0x5F1B, 0x9270: 0x6065, 0x9271: 0x667A, 0x9272: 0x6C60, 0x9273: 0x75F4, 0x9274: 0x7A1A, 0x9275: 0x7F6E, 0x9276: 0x81F4, 0x9277: 0x8718, 0x9278: 0x9045, 0x9279: 0x99B3, 0x927A: 0x7BC9, 0x927B: 0x755C, 0x927C: 0x7AF9, 0x927D: 0x7B51, 0x927E: 0x84C4, 0x9280: 0x9010, 0x9281: 0x79E9, 0x9282: 0x7A92, 0x9283: 0x8336, 0x9284: 0x5AE1, 0x9285: 0x7740, 0x9286: 0x4E2D, 0x9287: 0x4EF2, 0x9288: 0x5B99, 0x9289: 0x5FE0, 0x928A: 0x62BD, 0x928B: 0x663C, 0x928C: 0x67F1, 0x928D: 0x6CE8, 0x928E: 0x866B, 0x928F: 0x8877, 0x9290: 0x8A3B, 0x9291: 0x914E, 0x9292: 0x92F3, 0x9293: 0x99D0, 0x9294: 0x6A17, 0x9295: 0x7026, 0x9296: 0x732A, 0x9297: 0x82E7, 0x9298: 0x8457, 0x9299: 0x8CAF, 0x929A: 0x4E01, 0x929B: 0x5146, 0x929C: 0x51CB, 0x929D: 0x558B, 0x929E: 0x5BF5, 0x929F: 0x5E16, 0x92A0: 0x5E33, 0x92A1: 0x5E81, 0x92A2: 0x5F14, 0x92A3: 0x5F35, 0x92A4: 0x5F6B, 0x92A5: 0x5FB4, 0x92A6: 0x61F2, 0x92A7: 0x6311, 0x92A8: 0x66A2, 0x92A9: 0x671D, 0x92AA: 0x6F6E, 0x92AB: 0x7252, 0x92AC: 0x753A, 0x92AD: 0x773A, 0x92AE: 0x8074, 0x92AF: 0x8139, 0x92B0: 0x8178, 0x92B1: 0x8776, 0x92B2: 0x8ABF, 0x92B3: 0x8ADC, 0x92B4: 0x8D85, 0x92B5: 0x8DF3, 0x92B6: 0x929A, 0x92B7: 0x9577, 0x92B8: 0x9802, 0x92B9: 0x9CE5, 0x92BA: 0x52C5, 0x92BB: 0x6357, 0x92BC: 0x76F4, 0x92BD: 0x6715, 0x92BE: 0x6C88, 0x92BF: 0x73CD, 0x92C0: 0x8CC3, 0x92C1: 0x93AE, 0x92C2: 0x9673, 0x92C3: 0x6D25, 0x92C4: 0x589C, 0x92C5: 0x690E, 0x92C6: 0x69CC, 0x92C7: 0x8FFD, 0x92C8: 0x939A, 0x92C9: 0x75DB, 0x92CA: 0x901A, 0x92CB: 0x585A, 0x92CC: 0x6802, 0x92CD: 0x63B4, 0x92CE: 0x69FB, 0x92CF: 0x4F43, 0x92D0: 0x6F2C, 0x92D1: 0x67D8, 0x92D2: 0x8FBB, 0x92D3: 0x8526, 0x92D4: 0x7DB4, 0x92D5: 0x9354, 0x92D6: 0x693F, 0x92D7: 0x6F70, 0x92D8: 0x576A, 0x92D9: 0x58F7, 0x92DA: 0x5B2C, 0x92DB: 0x7D2C, 0x92DC: 0x722A, 0x92DD: 0x540A, 0x92DE: 0x91E3, 0x92DF: 0x9DB4, 0x92E0: 0x4EAD, 0x92E1: 0x4F4E, 0x92E2: 0x505C, 0x92E3: 0x5075, 0x92E4: 0x5243, 0x92E5: 0x8C9E, 0x92E6: 0x5448, 0x92E7: 0x5824, 0x92E8: 0x5B9A, 0x92E9: 0x5E1D, 0x92EA: 0x5E95, 0x92EB: 0x5EAD, 0x92EC: 0x5EF7, 0x92ED: 0x5F1F, 0x92EE: 0x608C, 0x92EF: 0x62B5, 0x92F0: 0x633A, 0x92F1: 0x63D0, 0x92F2: 0x68AF, 0x92F3: 0x6C40, 0x92F4: 0x7887, 0x92F5: 0x798E, 0x92F6: 0x7A0B, 0x92F7: 0x7DE0, 0x92F8: 0x8247, 0x92F9: 0x8A02, 0x92FA: 0x8AE6, 0x92FB: 0x8E44, 0x92FC: 0x9013, 0x9340: 0x90B8, 0x9341: 0x912D, 0x9342: 0x91D8, 0x9343: 0x9F0E, 0x9344: 0x6CE5, 0x9345: 0x6458, 0x9346: 0x64E2, 0x9347: 0x6575, 0x9348: 0x6EF4, 0x9349: 0x7684, 0x934A: 0x7B1B, 0x934B: 0x9069, 0x934C: 0x93D1, 0x934D: 0x6EBA, 0x934E: 0x54F2, 0x934F: 0x5FB9, 0x9350: 0x64A4, 0x9351: 0x8F4D, 0x9352: 0x8FED, 0x9353: 0x9244, 0x9354: 0x5178, 0x9355: 0x586B, 0x9356: 0x5929, 0x9357: 0x5C55, 0x9358: 0x5E97, 0x9359: 0x6DFB, 0x935A: 0x7E8F, 0x935B: 0x751C, 0x935C: 0x8CBC, 0x935D: 0x8EE2, 0x935E: 0x985B, 0x935F: 0x70B9, 0x9360: 0x4F1D, 0x9361: 0x6BBF, 0x9362: 0x6FB1, 0x9363: 0x7530, 0x9364: 0x96FB, 0x9365: 0x514E, 0x9366: 0x5410, 0x9367: 0x5835, 0x9368: 0x5857, 0x9369: 0x59AC, 0x936A: 0x5C60, 0x936B: 0x5F92, 0x936C: 0x6597, 0x936D: 0x675C, 0x936E: 0x6E21, 0x936F: 0x767B, 0x9370: 0x83DF, 0x9371: 0x8CED, 0x9372: 0x9014, 0x9373: 0x90FD, 0x9374: 0x934D, 0x9375: 0x7825, 0x9376: 0x783A, 0x9377: 0x52AA, 0x9378: 0x5EA6, 0x9379: 0x571F, 0x937A: 0x5974, 0x937B: 0x6012, 0x937C: 0x5012, 0x937D: 0x515A, 0x937E: 0x51AC, 0x9380: 0x51CD, 0x9381: 0x5200, 0x9382: 0x5510, 0x9383: 0x5854, 0x9384: 0x5858, 0x9385: 0x5957, 0x9386: 0x5B95, 0x9387: 0x5CF6, 0x9388: 0x5D8B, 0x9389: 0x60BC, 0x938A: 0x6295, 0x938B: 0x642D, 0x938C: 0x6771, 0x938D: 0x6843, 0x938E: 0x68BC, 0x938F: 0x68DF, 0x9390: 0x76D7, 0x9391: 0x6DD8, 0x9392: 0x6E6F, 0x9393: 0x6D9B, 0x9394: 0x706F, 0x9395: 0x71C8, 0x9396: 0x5F53, 0x9397: 0x75D8, 0x9398: 0x7977, 0x9399: 0x7B49, 0x939A: 0x7B54, 0x939B: 0x7B52, 0x939C: 0x7CD6, 0x939D: 0x7D71, 0x939E: 0x5230, 0x939F: 0x8463, 0x93A0: 0x8569, 0x93A1: 0x85E4, 0x93A2: 0x8A0E, 0x93A3: 0x8B04, 0x93A4: 0x8C46, 0x93A5: 0x8E0F, 0x93A6: 0x9003, 0x93A7: 0x900F, 0x93A8: 0x9419, 0x93A9: 0x9676, 0x93AA: 0x982D, 0x93AB: 0x9A30, 0x93AC: 0x95D8, 0x93AD: 0x50CD, 0x93AE: 0x52D5, 0x93AF: 0x540C, 0x93B0: 0x5802, 0x93B1: 0x5C0E, 0x93B2: 0x61A7, 0x93B3: 0x649E, 0x93B4: 0x6D1E, 0x93B5: 0x77B3, 0x93B6: 0x7AE5, 0x93B7: 0x80F4, 0x93B8: 0x8404, 0x93B9: 0x9053, 0x93BA: 0x9285, 0x93BB: 0x5CE0, 0x93BC: 0x9D07, 0x93BD: 0x533F, 0x93BE: 0x5F97, 0x93BF: 0x5FB3, 0x93C0: 0x6D9C, 0x93C1: 0x7279, 0x93C2: 0x7763, 0x93C3: 0x79BF, 0x93C4: 0x7BE4, 0x93C5: 0x6BD2, 0x93C6: 0x72EC, 0x93C7: 0x8AAD, 0x93C8: 0x6803, 0x93C9: 0x6A61, 0x93CA: 0x51F8, 0x93CB: 0x7A81, 0x93CC: 0x6934, 0x93CD: 0x5C4A, 0x93CE: 0x9CF6, 0x93CF: 0x82EB, 0x93D0: 0x5BC5, 0x93D1: 0x9149, 0x93D2: 0x701E, 0x93D3: 0x5678, 0x93D4: 0x5C6F, 0x93D5: 0x60C7, 0x93D6: 0x6566, 0x93D7: 0x6C8C, 0x93D8: 0x8C5A, 0x93D9: 0x9041, 0x93DA: 0x9813, 0x93DB: 0x5451, 0x93DC: 0x66C7, 0x93DD: 0x920D, 0x93DE: 0x5948, 0x93DF: 0x90A3, 0x93E0: 0x5185, 0x93E1: 0x4E4D, 0x93E2: 0x51EA, 0x93E3: 0x8599, 0x93E4: 0x8B0E, 0x93E5: 0x7058, 0x93E6: 0x637A, 0x93E7: 0x934B, 0x93E8: 0x6962, 0x93E9: 0x99B4, 0x93EA: 0x7E04, 0x93EB: 0x7577, 0x93EC: 0x5357, 0x93ED: 0x6960, 0x93EE: 0x8EDF, 0x93EF: 0x96E3, 0x93F0: 0x6C5D, 0x93F1: 0x4E8C, 0x93F2: 0x5C3C, 0x93F3: 0x5F10, 0x93F4: 0x8FE9, 0x93F5: 0x5302, 0x93F6: 0x8CD1, 0x93F7: 0x8089, 0x93F8: 0x8679, 0x93F9: 0x5EFF, 0x93FA: 0x65E5, 0x93FB: 0x4E73, 0x93FC: 0x5165, 0x9440: 0x5982, 0x9441: 0x5C3F, 0x9442: 0x97EE, 0x9443: 0x4EFB, 0x9444: 0x598A, 0x9445: 0x5FCD, 0x9446: 0x8A8D, 0x9447: 0x6FE1, 0x9448: 0x79B0, 0x9449: 0x7962, 0x944A: 0x5BE7, 0x944B: 0x8471, 0x944C: 0x732B, 0x944D: 0x71B1, 0x944E: 0x5E74, 0x944F: 0x5FF5, 0x9450: 0x637B, 0x9451: 0x649A, 0x9452: 0x71C3, 0x9453: 0x7C98, 0x9454: 0x4E43, 0x9455: 0x5EFC, 0x9456: 0x4E4B, 0x9457: 0x57DC, 0x9458: 0x56A2, 0x9459: 0x60A9, 0x945A: 0x6FC3, 0x945B: 0x7D0D, 0x945C: 0x80FD, 0x945D: 0x8133, 0x945E: 0x81BF, 0x945F: 0x8FB2, 0x9460: 0x8997, 0x9461: 0x86A4, 0x9462: 0x5DF4, 0x9463: 0x628A, 0x9464: 0x64AD, 0x9465: 0x8987, 0x9466: 0x6777, 0x9467: 0x6CE2, 0x9468: 0x6D3E, 0x9469: 0x7436, 0x946A: 0x7834, 0x946B: 0x5A46, 0x946C: 0x7F75, 0x946D: 0x82AD, 0x946E: 0x99AC, 0x946F: 0x4FF3, 0x9470: 0x5EC3, 0x9471: 0x62DD, 0x9472: 0x6392, 0x9473: 0x6557, 0x9474: 0x676F, 0x9475: 0x76C3, 0x9476: 0x724C, 0x9477: 0x80CC, 0x9478: 0x80BA, 0x9479: 0x8F29, 0x947A: 0x914D, 0x947B: 0x500D, 0x947C: 0x57F9, 0x947D: 0x5A92, 0x947E: 0x6885, 0x9480: 0x6973, 0x9481: 0x7164, 0x9482: 0x72FD, 0x9483: 0x8CB7, 0x9484: 0x58F2, 0x9485: 0x8CE0, 0x9486: 0x966A, 0x9487: 0x9019, 0x9488: 0x877F, 0x9489: 0x79E4, 0x948A: 0x77E7, 0x948B: 0x8429, 0x948C: 0x4F2F, 0x948D: 0x5265, 0x948E: 0x535A, 0x948F: 0x62CD, 0x9490: 0x67CF, 0x9491: 0x6CCA, 0x9492: 0x767D, 0x9493: 0x7B94, 0x9494: 0x7C95, 0x9495: 0x8236, 0x9496: 0x8584, 0x9497: 0x8FEB, 0x9498: 0x66DD, 0x9499: 0x6F20, 0x949A: 0x7206, 0x949B: 0x7E1B, 0x949C: 0x83AB, 0x949D: 0x99C1, 0x949E: 0x9EA6, 0x949F: 0x51FD, 0x94A0: 0x7BB1, 0x94A1: 0x7872, 0x94A2: 0x7BB8, 0x94A3: 0x8087, 0x94A4: 0x7B48, 0x94A5: 0x6AE8, 0x94A6: 0x5E61, 0x94A7: 0x808C, 0x94A8: 0x7551, 0x94A9: 0x7560, 0x94AA: 0x516B, 0x94AB: 0x9262, 0x94AC: 0x6E8C, 0x94AD: 0x767A, 0x94AE: 0x9197, 0x94AF: 0x9AEA, 0x94B0: 0x4F10, 0x94B1: 0x7F70, 0x94B2: 0x629C, 0x94B3: 0x7B4F, 0x94B4: 0x95A5, 0x94B5: 0x9CE9, 0x94B6: 0x567A, 0x94B7: 0x5859, 0x94B8: 0x86E4, 0x94B9: 0x96BC, 0x94BA: 0x4F34, 0x94BB: 0x5224, 0x94BC: 0x534A, 0x94BD: 0x53CD, 0x94BE: 0x53DB, 0x94BF: 0x5E06, 0x94C0: 0x642C, 0x94C1: 0x6591, 0x94C2: 0x677F, 0x94C3: 0x6C3E, 0x94C4: 0x6C4E, 0x94C5: 0x7248, 0x94C6: 0x72AF, 0x94C7: 0x73ED, 0x94C8: 0x7554, 0x94C9: 0x7E41, 0x94CA: 0x822C, 0x94CB: 0x85E9, 0x94CC: 0x8CA9, 0x94CD: 0x7BC4, 0x94CE: 0x91C6, 0x94CF: 0x7169, 0x94D0: 0x9812, 0x94D1: 0x98EF, 0x94D2: 0x633D, 0x94D3: 0x6669, 0x94D4: 0x756A, 0x94D5: 0x76E4, 0x94D6: 0x78D0, 0x94D7: 0x8543, 0x94D8: 0x86EE, 0x94D9: 0x532A, 0x94DA: 0x5351, 0x94DB: 0x5426, 0x94DC: 0x5983, 0x94DD: 0x5E87, 0x94DE: 0x5F7C, 0x94DF: 0x60B2, 0x94E0: 0x6249, 0x94E1: 0x6279, 0x94E2: 0x62AB, 0x94E3: 0x6590, 0x94E4: 0x6BD4, 0x94E5: 0x6CCC, 0x94E6: 0x75B2, 0x94E7: 0x76AE, 0x94E8: 0x7891, 0x94E9: 0x79D8, 0x94EA: 0x7DCB, 0x94EB: 0x7F77, 0x94EC: 0x80A5, 0x94ED: 0x88AB, 0x94EE: 0x8AB9, 0x94EF: 0x8CBB, 0x94F0: 0x907F, 0x94F1: 0x975E, 0x94F2: 0x98DB, 0x94F3: 0x6A0B, 0x94F4: 0x7C38, 0x94F5: 0x5099, 0x94F6: 0x5C3E, 0x94F7: 0x5FAE, 0x94F8: 0x6787, 0x94F9: 0x6BD8, 0x94FA: 0x7435, 0x94FB: 0x7709, 0x94FC: 0x7F8E, 0x9540: 0x9F3B, 0x9541: 0x67CA, 0x9542: 0x7A17, 0x9543: 0x5339, 0x9544: 0x758B, 0x9545: 0x9AED, 0x9546: 0x5F66, 0x9547: 0x819D, 0x9548: 0x83F1, 0x9549: 0x8098, 0x954A: 0x5F3C, 0x954B: 0x5FC5, 0x954C: 0x7562, 0x954D: 0x7B46, 0x954E: 0x903C, 0x954F: 0x6867, 0x9550: 0x59EB, 0x9551: 0x5A9B, 0x9552: 0x7D10, 0x9553: 0x767E, 0x9554: 0x8B2C, 0x9555: 0x4FF5, 0x9556: 0x5F6A, 0x9557: 0x6A19, 0x9558: 0x6C37, 0x9559: 0x6F02, 0x955A: 0x74E2, 0x955B: 0x7968, 0x955C: 0x8868, 0x955D: 0x8A55, 0x955E: 0x8C79, 0x955F: 0x5EDF, 0x9560: 0x63CF, 0x9561: 0x75C5, 0x9562: 0x79D2, 0x9563: 0x82D7, 0x9564: 0x9328, 0x9565: 0x92F2, 0x9566: 0x849C, 0x9567: 0x86ED, 0x9568: 0x9C2D, 0x9569: 0x54C1, 0x956A: 0x5F6C, 0x956B: 0x658C, 0x956C: 0x6D5C, 0x956D: 0x7015, 0x956E: 0x8CA7, 0x956F: 0x8CD3, 0x9570: 0x983B, 0x9571: 0x654F, 0x9572: 0x74F6, 0x9573: 0x4E0D, 0x9574: 0x4ED8, 0x9575: 0x57E0, 0x9576: 0x592B, 0x9577: 0x5A66, 0x9578: 0x5BCC, 0x9579: 0x51A8, 0x957A: 0x5E03, 0x957B: 0x5E9C, 0x957C: 0x6016, 0x957D: 0x6276, 0x957E: 0x6577, 0x9580: 0x65A7, 0x9581: 0x666E, 0x9582: 0x6D6E, 0x9583: 0x7236, 0x9584: 0x7B26, 0x9585: 0x8150, 0x9586: 0x819A, 0x9587: 0x8299, 0x9588: 0x8B5C, 0x9589: 0x8CA0, 0x958A: 0x8CE6, 0x958B: 0x8D74, 0x958C: 0x961C, 0x958D: 0x9644, 0x958E: 0x4FAE, 0x958F: 0x64AB, 0x9590: 0x6B66, 0x9591: 0x821E, 0x9592: 0x8461, 0x9593: 0x856A, 0x9594: 0x90E8, 0x9595: 0x5C01, 0x9596: 0x6953, 0x9597: 0x98A8, 0x9598: 0x847A, 0x9599: 0x8557, 0x959A: 0x4F0F, 0x959B: 0x526F, 0x959C: 0x5FA9, 0x959D: 0x5E45, 0x959E: 0x670D, 0x959F: 0x798F, 0x95A0: 0x8179, 0x95A1: 0x8907, 0x95A2: 0x8986, 0x95A3: 0x6DF5, 0x95A4: 0x5F17, 0x95A5: 0x6255, 0x95A6: 0x6CB8, 0x95A7: 0x4ECF, 0x95A8: 0x7269, 0x95A9: 0x9B92, 0x95AA: 0x5206, 0x95AB: 0x543B, 0x95AC: 0x5674, 0x95AD: 0x58B3, 0x95AE: 0x61A4, 0x95AF: 0x626E, 0x95B0: 0x711A, 0x95B1: 0x596E, 0x95B2: 0x7C89, 0x95B3: 0x7CDE, 0x95B4: 0x7D1B, 0x95B5: 0x96F0, 0x95B6: 0x6587, 0x95B7: 0x805E, 0x95B8: 0x4E19, 0x95B9: 0x4F75, 0x95BA: 0x5175, 0x95BB: 0x5840, 0x95BC: 0x5E63, 0x95BD: 0x5E73, 0x95BE: 0x5F0A, 0x95BF: 0x67C4, 0x95C0: 0x4E26, 0x95C1: 0x853D, 0x95C2: 0x9589, 0x95C3: 0x965B, 0x95C4: 0x7C73, 0x95C5: 0x9801, 0x95C6: 0x50FB, 0x95C7: 0x58C1, 0x95C8: 0x7656, 0x95C9: 0x78A7, 0x95CA: 0x5225, 0x95CB: 0x77A5, 0x95CC: 0x8511, 0x95CD: 0x7B86, 0x95CE: 0x504F, 0x95CF: 0x5909, 0x95D0: 0x7247, 0x95D1: 0x7BC7, 0x95D2: 0x7DE8, 0x95D3: 0x8FBA, 0x95D4: 0x8FD4, 0x95D5: 0x904D, 0x95D6: 0x4FBF, 0x95D7: 0x52C9, 0x95D8: 0x5A29, 0x95D9: 0x5F01, 0x95DA: 0x97AD, 0x95DB: 0x4FDD, 0x95DC: 0x8217, 0x95DD: 0x92EA, 0x95DE: 0x5703, 0x95DF: 0x6355, 0x95E0: 0x6B69, 0x95E1: 0x752B, 0x95E2: 0x88DC, 0x95E3: 0x8F14, 0x95E4: 0x7A42, 0x95E5: 0x52DF, 0x95E6: 0x5893, 0x95E7: 0x6155, 0x95E8: 0x620A, 0x95E9: 0x66AE, 0x95EA: 0x6BCD, 0x95EB: 0x7C3F, 0x95EC: 0x83E9, 0x95ED: 0x5023, 0x95EE: 0x4FF8, 0x95EF: 0x5305, 0x95F0: 0x5446, 0x95F1: 0x5831, 0x95F2: 0x5949, 0x95F3: 0x5B9D, 0x95F4: 0x5CF0, 0x95F5: 0x5CEF, 0x95F6: 0x5D29, 0x95F7: 0x5E96, 0x95F8: 0x62B1, 0x95F9: 0x6367, 0x95FA: 0x653E, 0x95FB: 0x65B9, 0x95FC: 0x670B, 0x9640: 0x6CD5, 0x9641: 0x6CE1, 0x9642: 0x70F9, 0x9643: 0x7832, 0x9644: 0x7E2B, 0x9645: 0x80DE, 0x9646: 0x82B3, 0x9647: 0x840C, 0x9648: 0x84EC, 0x9649: 0x8702, 0x964A: 0x8912, 0x964B: 0x8A2A, 0x964C: 0x8C4A, 0x964D: 0x90A6, 0x964E: 0x92D2, 0x964F: 0x98FD, 0x9650: 0x9CF3, 0x9651: 0x9D6C, 0x9652: 0x4E4F, 0x9653: 0x4EA1, 0x9654: 0x508D, 0x9655: 0x5256, 0x9656: 0x574A, 0x9657: 0x59A8, 0x9658: 0x5E3D, 0x9659: 0x5FD8, 0x965A: 0x5FD9, 0x965B: 0x623F, 0x965C: 0x66B4, 0x965D: 0x671B, 0x965E: 0x67D0, 0x965F: 0x68D2, 0x9660: 0x5192, 0x9661: 0x7D21, 0x9662: 0x80AA, 0x9663: 0x81A8, 0x9664: 0x8B00, 0x9665: 0x8C8C, 0x9666: 0x8CBF, 0x9667: 0x927E, 0x9668: 0x9632, 0x9669: 0x5420, 0x966A: 0x982C, 0x966B: 0x5317, 0x966C: 0x50D5, 0x966D: 0x535C, 0x966E: 0x58A8, 0x966F: 0x64B2, 0x9670: 0x6734, 0x9671: 0x7267, 0x9672: 0x7766, 0x9673: 0x7A46, 0x9674: 0x91E6, 0x9675: 0x52C3, 0x9676: 0x6CA1, 0x9677: 0x6B86, 0x9678: 0x5800, 0x9679: 0x5E4C, 0x967A: 0x5954, 0x967B: 0x672C, 0x967C: 0x7FFB, 0x967D: 0x51E1, 0x967E: 0x76C6, 0x9680: 0x6469, 0x9681: 0x78E8, 0x9682: 0x9B54, 0x9683: 0x9EBB, 0x9684: 0x57CB, 0x9685: 0x59B9, 0x9686: 0x6627, 0x9687: 0x679A, 0x9688: 0x6BCE, 0x9689: 0x54E9, 0x968A: 0x69D9, 0x968B: 0x5E55, 0x968C: 0x819C, 0x968D: 0x6795, 0x968E: 0x9BAA, 0x968F: 0x67FE, 0x9690: 0x9C52, 0x9691: 0x685D, 0x9692: 0x4EA6, 0x9693: 0x4FE3, 0x9694: 0x53C8, 0x9695: 0x62B9, 0x9696: 0x672B, 0x9697: 0x6CAB, 0x9698: 0x8FC4, 0x9699: 0x4FAD, 0x969A: 0x7E6D, 0x969B: 0x9EBF, 0x969C: 0x4E07, 0x969D: 0x6162, 0x969E: 0x6E80, 0x969F: 0x6F2B, 0x96A0: 0x8513, 0x96A1: 0x5473, 0x96A2: 0x672A, 0x96A3: 0x9B45, 0x96A4: 0x5DF3, 0x96A5: 0x7B95, 0x96A6: 0x5CAC, 0x96A7: 0x5BC6, 0x96A8: 0x871C, 0x96A9: 0x6E4A, 0x96AA: 0x84D1, 0x96AB: 0x7A14, 0x96AC: 0x8108, 0x96AD: 0x5999, 0x96AE: 0x7C8D, 0x96AF: 0x6C11, 0x96B0: 0x7720, 0x96B1: 0x52D9, 0x96B2: 0x5922, 0x96B3: 0x7121, 0x96B4: 0x725F, 0x96B5: 0x77DB, 0x96B6: 0x9727, 0x96B7: 0x9D61, 0x96B8: 0x690B, 0x96B9: 0x5A7F, 0x96BA: 0x5A18, 0x96BB: 0x51A5, 0x96BC: 0x540D, 0x96BD: 0x547D, 0x96BE: 0x660E, 0x96BF: 0x76DF, 0x96C0: 0x8FF7, 0x96C1: 0x9298, 0x96C2: 0x9CF4, 0x96C3: 0x59EA, 0x96C4: 0x725D, 0x96C5: 0x6EC5, 0x96C6: 0x514D, 0x96C7: 0x68C9, 0x96C8: 0x7DBF, 0x96C9: 0x7DEC, 0x96CA: 0x9762, 0x96CB: 0x9EBA, 0x96CC: 0x6478, 0x96CD: 0x6A21, 0x96CE: 0x8302, 0x96CF: 0x5984, 0x96D0: 0x5B5F, 0x96D1: 0x6BDB, 0x96D2: 0x731B, 0x96D3: 0x76F2, 0x96D4: 0x7DB2, 0x96D5: 0x8017, 0x96D6: 0x8499, 0x96D7: 0x5132, 0x96D8: 0x6728, 0x96D9: 0x9ED9, 0x96DA: 0x76EE, 0x96DB: 0x6762, 0x96DC: 0x52FF, 0x96DD: 0x9905, 0x96DE: 0x5C24, 0x96DF: 0x623B, 0x96E0: 0x7C7E, 0x96E1: 0x8CB0, 0x96E2: 0x554F, 0x96E3: 0x60B6, 0x96E4: 0x7D0B, 0x96E5: 0x9580, 0x96E6: 0x5301, 0x96E7: 0x4E5F, 0x96E8: 0x51B6, 0x96E9: 0x591C, 0x96EA: 0x723A, 0x96EB: 0x8036, 0x96EC: 0x91CE, 0x96ED: 0x5F25, 0x96EE: 0x77E2, 0x96EF: 0x5384, 0x96F0: 0x5F79, 0x96F1: 0x7D04, 0x96F2: 0x85AC, 0x96F3: 0x8A33, 0x96F4: 0x8E8D, 0x96F5: 0x9756, 0x96F6: 0x67F3, 0x96F7: 0x85AE, 0x96F8: 0x9453, 0x96F9: 0x6109, 0x96FA: 0x6108, 0x96FB: 0x6CB9, 0x96FC: 0x7652, 0x9740: 0x8AED, 0x9741: 0x8F38, 0x9742: 0x552F, 0x9743: 0x4F51, 0x9744: 0x512A, 0x9745: 0x52C7, 0x9746: 0x53CB, 0x9747: 0x5BA5, 0x9748: 0x5E7D, 0x9749: 0x60A0, 0x974A: 0x6182, 0x974B: 0x63D6, 0x974C: 0x6709, 0x974D: 0x67DA, 0x974E: 0x6E67, 0x974F: 0x6D8C, 0x9750: 0x7336, 0x9751: 0x7337, 0x9752: 0x7531, 0x9753: 0x7950, 0x9754: 0x88D5, 0x9755: 0x8A98, 0x9756: 0x904A, 0x9757: 0x9091, 0x9758: 0x90F5, 0x9759: 0x96C4, 0x975A: 0x878D, 0x975B: 0x5915, 0x975C: 0x4E88, 0x975D: 0x4F59, 0x975E: 0x4E0E, 0x975F: 0x8A89, 0x9760: 0x8F3F, 0x9761: 0x9810, 0x9762: 0x50AD, 0x9763: 0x5E7C, 0x9764: 0x5996, 0x9765: 0x5BB9, 0x9766: 0x5EB8, 0x9767: 0x63DA, 0x9768: 0x63FA, 0x9769: 0x64C1, 0x976A: 0x66DC, 0x976B: 0x694A, 0x976C: 0x69D8, 0x976D: 0x6D0B, 0x976E: 0x6EB6, 0x976F: 0x7194, 0x9770: 0x7528, 0x9771: 0x7AAF, 0x9772: 0x7F8A, 0x9773: 0x8000, 0x9774: 0x8449, 0x9775: 0x84C9, 0x9776: 0x8981, 0x9777: 0x8B21, 0x9778: 0x8E0A, 0x9779: 0x9065, 0x977A: 0x967D, 0x977B: 0x990A, 0x977C: 0x617E, 0x977D: 0x6291, 0x977E: 0x6B32, 0x9780: 0x6C83, 0x9781: 0x6D74, 0x9782: 0x7FCC, 0x9783: 0x7FFC, 0x9784: 0x6DC0, 0x9785: 0x7F85, 0x9786: 0x87BA, 0x9787: 0x88F8, 0x9788: 0x6765, 0x9789: 0x83B1, 0x978A: 0x983C, 0x978B: 0x96F7, 0x978C: 0x6D1B, 0x978D: 0x7D61, 0x978E: 0x843D, 0x978F: 0x916A, 0x9790: 0x4E71, 0x9791: 0x5375, 0x9792: 0x5D50, 0x9793: 0x6B04, 0x9794: 0x6FEB, 0x9795: 0x85CD, 0x9796: 0x862D, 0x9797: 0x89A7, 0x9798: 0x5229, 0x9799: 0x540F, 0x979A: 0x5C65, 0x979B: 0x674E, 0x979C: 0x68A8, 0x979D: 0x7406, 0x979E: 0x7483, 0x979F: 0x75E2, 0x97A0: 0x88CF, 0x97A1: 0x88E1, 0x97A2: 0x91CC, 0x97A3: 0x96E2, 0x97A4: 0x9678, 0x97A5: 0x5F8B, 0x97A6: 0x7387, 0x97A7: 0x7ACB, 0x97A8: 0x844E, 0x97A9: 0x63A0, 0x97AA: 0x7565, 0x97AB: 0x5289, 0x97AC: 0x6D41, 0x97AD: 0x6E9C, 0x97AE: 0x7409, 0x97AF: 0x7559, 0x97B0: 0x786B, 0x97B1: 0x7C92, 0x97B2: 0x9686, 0x97B3: 0x7ADC, 0x97B4: 0x9F8D, 0x97B5: 0x4FB6, 0x97B6: 0x616E, 0x97B7: 0x65C5, 0x97B8: 0x865C, 0x97B9: 0x4E86, 0x97BA: 0x4EAE, 0x97BB: 0x50DA, 0x97BC: 0x4E21, 0x97BD: 0x51CC, 0x97BE: 0x5BEE, 0x97BF: 0x6599, 0x97C0: 0x6881, 0x97C1: 0x6DBC, 0x97C2: 0x731F, 0x97C3: 0x7642, 0x97C4: 0x77AD, 0x97C5: 0x7A1C, 0x97C6: 0x7CE7, 0x97C7: 0x826F, 0x97C8: 0x8AD2, 0x97C9: 0x907C, 0x97CA: 0x91CF, 0x97CB: 0x9675, 0x97CC: 0x9818, 0x97CD: 0x529B, 0x97CE: 0x7DD1, 0x97CF: 0x502B, 0x97D0: 0x5398, 0x97D1: 0x6797, 0x97D2: 0x6DCB, 0x97D3: 0x71D0, 0x97D4: 0x7433, 0x97D5: 0x81E8, 0x97D6: 0x8F2A, 0x97D7: 0x96A3, 0x97D8: 0x9C57, 0x97D9: 0x9E9F, 0x97DA: 0x7460, 0x97DB: 0x5841, 0x97DC: 0x6D99, 0x97DD: 0x7D2F, 0x97DE: 0x985E, 0x97DF: 0x4EE4, 0x97E0: 0x4F36, 0x97E1: 0x4F8B, 0x97E2: 0x51B7, 0x97E3: 0x52B1, 0x97E4: 0x5DBA, 0x97E5: 0x601C, 0x97E6: 0x73B2, 0x97E7: 0x793C, 0x97E8: 0x82D3, 0x97E9: 0x9234, 0x97EA: 0x96B7, 0x97EB: 0x96F6, 0x97EC: 0x970A, 0x97ED: 0x9E97, 0x97EE: 0x9F62, 0x97EF: 0x66A6, 0x97F0: 0x6B74, 0x97F1: 0x5217, 0x97F2: 0x52A3, 0x97F3: 0x70C8, 0x97F4: 0x88C2, 0x97F5: 0x5EC9, 0x97F6: 0x604B, 0x97F7: 0x6190, 0x97F8: 0x6F23, 0x97F9: 0x7149, 0x97FA: 0x7C3E, 0x97FB: 0x7DF4, 0x97FC: 0x806F, 0x9840: 0x84EE, 0x9841: 0x9023, 0x9842: 0x932C, 0x9843: 0x5442, 0x9844: 0x9B6F, 0x9845: 0x6AD3, 0x9846: 0x7089, 0x9847: 0x8CC2, 0x9848: 0x8DEF, 0x9849: 0x9732, 0x984A: 0x52B4, 0x984B: 0x5A41, 0x984C: 0x5ECA, 0x984D: 0x5F04, 0x984E: 0x6717, 0x984F: 0x697C, 0x9850: 0x6994, 0x9851: 0x6D6A, 0x9852: 0x6F0F, 0x9853: 0x7262, 0x9854: 0x72FC, 0x9855: 0x7BED, 0x9856: 0x8001, 0x9857: 0x807E, 0x9858: 0x874B, 0x9859: 0x90CE, 0x985A: 0x516D, 0x985B: 0x9E93, 0x985C: 0x7984, 0x985D: 0x808B, 0x985E: 0x9332, 0x985F: 0x8AD6, 0x9860: 0x502D, 0x9861: 0x548C, 0x9862: 0x8A71, 0x9863: 0x6B6A, 0x9864: 0x8CC4, 0x9865: 0x8107, 0x9866: 0x60D1, 0x9867: 0x67A0, 0x9868: 0x9DF2, 0x9869: 0x4E99, 0x986A: 0x4E98, 0x986B: 0x9C10, 0x986C: 0x8A6B, 0x986D: 0x85C1, 0x986E: 0x8568, 0x986F: 0x6900, 0x9870: 0x6E7E, 0x9871: 0x7897, 0x9872: 0x8155, 0x989F: 0x5F0C, 0x98A0: 0x4E10, 0x98A1: 0x4E15, 0x98A2: 0x4E2A, 0x98A3: 0x4E31, 0x98A4: 0x4E36, 0x98A5: 0x4E3C, 0x98A6: 0x4E3F, 0x98A7: 0x4E42, 0x98A8: 0x4E56, 0x98A9: 0x4E58, 0x98AA: 0x4E82, 0x98AB: 0x4E85, 0x98AC: 0x8C6B, 0x98AD: 0x4E8A, 0x98AE: 0x8212, 0x98AF: 0x5F0D, 0x98B0: 0x4E8E, 0x98B1: 0x4E9E, 0x98B2: 0x4E9F, 0x98B3: 0x4EA0, 0x98B4: 0x4EA2, 0x98B5: 0x4EB0, 0x98B6: 0x4EB3, 0x98B7: 0x4EB6, 0x98B8: 0x4ECE, 0x98B9: 0x4ECD, 0x98BA: 0x4EC4, 0x98BB: 0x4EC6, 0x98BC: 0x4EC2, 0x98BD: 0x4ED7, 0x98BE: 0x4EDE, 0x98BF: 0x4EED, 0x98C0: 0x4EDF, 0x98C1: 0x4EF7, 0x98C2: 0x4F09, 0x98C3: 0x4F5A, 0x98C4: 0x4F30, 0x98C5: 0x4F5B, 0x98C6: 0x4F5D, 0x98C7: 0x4F57, 0x98C8: 0x4F47, 0x98C9: 0x4F76, 0x98CA: 0x4F88, 0x98CB: 0x4F8F, 0x98CC: 0x4F98, 0x98CD: 0x4F7B, 0x98CE: 0x4F69, 0x98CF: 0x4F70, 0x98D0: 0x4F91, 0x98D1: 0x4F6F, 0x98D2: 0x4F86, 0x98D3: 0x4F96, 0x98D4: 0x5118, 0x98D5: 0x4FD4, 0x98D6: 0x4FDF, 0x98D7: 0x4FCE, 0x98D8: 0x4FD8, 0x98D9: 0x4FDB, 0x98DA: 0x4FD1, 0x98DB: 0x4FDA, 0x98DC: 0x4FD0, 0x98DD: 0x4FE4, 0x98DE: 0x4FE5, 0x98DF: 0x501A, 0x98E0: 0x5028, 0x98E1: 0x5014, 0x98E2: 0x502A, 0x98E3: 0x5025, 0x98E4: 0x5005, 0x98E5: 0x4F1C, 0x98E6: 0x4FF6, 0x98E7: 0x5021, 0x98E8: 0x5029, 0x98E9: 0x502C, 0x98EA: 0x4FFE, 0x98EB: 0x4FEF, 0x98EC: 0x5011, 0x98ED: 0x5006, 0x98EE: 0x5043, 0x98EF: 0x5047, 0x98F0: 0x6703, 0x98F1: 0x5055, 0x98F2: 0x5050, 0x98F3: 0x5048, 0x98F4: 0x505A, 0x98F5: 0x5056, 0x98F6: 0x506C, 0x98F7: 0x5078, 0x98F8: 0x5080, 0x98F9: 0x509A, 0x98FA: 0x5085, 0x98FB: 0x50B4, 0x98FC: 0x50B2, 0x9940: 0x50C9, 0x9941: 0x50CA, 0x9942: 0x50B3, 0x9943: 0x50C2, 0x9944: 0x50D6, 0x9945: 0x50DE, 0x9946: 0x50E5, 0x9947: 0x50ED, 0x9948: 0x50E3, 0x9949: 0x50EE, 0x994A: 0x50F9, 0x994B: 0x50F5, 0x994C: 0x5109, 0x994D: 0x5101, 0x994E: 0x5102, 0x994F: 0x5116, 0x9950: 0x5115, 0x9951: 0x5114, 0x9952: 0x511A, 0x9953: 0x5121, 0x9954: 0x513A, 0x9955: 0x5137, 0x9956: 0x513C, 0x9957: 0x513B, 0x9958: 0x513F, 0x9959: 0x5140, 0x995A: 0x5152, 0x995B: 0x514C, 0x995C: 0x5154, 0x995D: 0x5162, 0x995E: 0x7AF8, 0x995F: 0x5169, 0x9960: 0x516A, 0x9961: 0x516E, 0x9962: 0x5180, 0x9963: 0x5182, 0x9964: 0x56D8, 0x9965: 0x518C, 0x9966: 0x5189, 0x9967: 0x518F, 0x9968: 0x5191, 0x9969: 0x5193, 0x996A: 0x5195, 0x996B: 0x5196, 0x996C: 0x51A4, 0x996D: 0x51A6, 0x996E: 0x51A2, 0x996F: 0x51A9, 0x9970: 0x51AA, 0x9971: 0x51AB, 0x9972: 0x51B3, 0x9973: 0x51B1, 0x9974: 0x51B2, 0x9975: 0x51B0, 0x9976: 0x51B5, 0x9977: 0x51BD, 0x9978: 0x51C5, 0x9979: 0x51C9, 0x997A: 0x51DB, 0x997B: 0x51E0, 0x997C: 0x8655, 0x997D: 0x51E9, 0x997E: 0x51ED, 0x9980: 0x51F0, 0x9981: 0x51F5, 0x9982: 0x51FE, 0x9983: 0x5204, 0x9984: 0x520B, 0x9985: 0x5214, 0x9986: 0x520E, 0x9987: 0x5227, 0x9988: 0x522A, 0x9989: 0x522E, 0x998A: 0x5233, 0x998B: 0x5239, 0x998C: 0x524F, 0x998D: 0x5244, 0x998E: 0x524B, 0x998F: 0x524C, 0x9990: 0x525E, 0x9991: 0x5254, 0x9992: 0x526A, 0x9993: 0x5274, 0x9994: 0x5269, 0x9995: 0x5273, 0x9996: 0x527F, 0x9997: 0x527D, 0x9998: 0x528D, 0x9999: 0x5294, 0x999A: 0x5292, 0x999B: 0x5271, 0x999C: 0x5288, 0x999D: 0x5291, 0x999E: 0x8FA8, 0x999F: 0x8FA7, 0x99A0: 0x52AC, 0x99A1: 0x52AD, 0x99A2: 0x52BC, 0x99A3: 0x52B5, 0x99A4: 0x52C1, 0x99A5: 0x52CD, 0x99A6: 0x52D7, 0x99A7: 0x52DE, 0x99A8: 0x52E3, 0x99A9: 0x52E6, 0x99AA: 0x98ED, 0x99AB: 0x52E0, 0x99AC: 0x52F3, 0x99AD: 0x52F5, 0x99AE: 0x52F8, 0x99AF: 0x52F9, 0x99B0: 0x5306, 0x99B1: 0x5308, 0x99B2: 0x7538, 0x99B3: 0x530D, 0x99B4: 0x5310, 0x99B5: 0x530F, 0x99B6: 0x5315, 0x99B7: 0x531A, 0x99B8: 0x5323, 0x99B9: 0x532F, 0x99BA: 0x5331, 0x99BB: 0x5333, 0x99BC: 0x5338, 0x99BD: 0x5340, 0x99BE: 0x5346, 0x99BF: 0x5345, 0x99C0: 0x4E17, 0x99C1: 0x5349, 0x99C2: 0x534D, 0x99C3: 0x51D6, 0x99C4: 0x535E, 0x99C5: 0x5369, 0x99C6: 0x536E, 0x99C7: 0x5918, 0x99C8: 0x537B, 0x99C9: 0x5377, 0x99CA: 0x5382, 0x99CB: 0x5396, 0x99CC: 0x53A0, 0x99CD: 0x53A6, 0x99CE: 0x53A5, 0x99CF: 0x53AE, 0x99D0: 0x53B0, 0x99D1: 0x53B6, 0x99D2: 0x53C3, 0x99D3: 0x7C12, 0x99D4: 0x96D9, 0x99D5: 0x53DF, 0x99D6: 0x66FC, 0x99D7: 0x71EE, 0x99D8: 0x53EE, 0x99D9: 0x53E8, 0x99DA: 0x53ED, 0x99DB: 0x53FA, 0x99DC: 0x5401, 0x99DD: 0x543D, 0x99DE: 0x5440, 0x99DF: 0x542C, 0x99E0: 0x542D, 0x99E1: 0x543C, 0x99E2: 0x542E, 0x99E3: 0x5436, 0x99E4: 0x5429, 0x99E5: 0x541D, 0x99E6: 0x544E, 0x99E7: 0x548F, 0x99E8: 0x5475, 0x99E9: 0x548E, 0x99EA: 0x545F, 0x99EB: 0x5471, 0x99EC: 0x5477, 0x99ED: 0x5470, 0x99EE: 0x5492, 0x99EF: 0x547B, 0x99F0: 0x5480, 0x99F1: 0x5476, 0x99F2: 0x5484, 0x99F3: 0x5490, 0x99F4: 0x5486, 0x99F5: 0x54C7, 0x99F6: 0x54A2, 0x99F7: 0x54B8, 0x99F8: 0x54A5, 0x99F9: 0x54AC, 0x99FA: 0x54C4, 0x99FB: 0x54C8, 0x99FC: 0x54A8, 0x9A40: 0x54AB, 0x9A41: 0x54C2, 0x9A42: 0x54A4, 0x9A43: 0x54BE, 0x9A44: 0x54BC, 0x9A45: 0x54D8, 0x9A46: 0x54E5, 0x9A47: 0x54E6, 0x9A48: 0x550F, 0x9A49: 0x5514, 0x9A4A: 0x54FD, 0x9A4B: 0x54EE, 0x9A4C: 0x54ED, 0x9A4D: 0x54FA, 0x9A4E: 0x54E2, 0x9A4F: 0x5539, 0x9A50: 0x5540, 0x9A51: 0x5563, 0x9A52: 0x554C, 0x9A53: 0x552E, 0x9A54: 0x555C, 0x9A55: 0x5545, 0x9A56: 0x5556, 0x9A57: 0x5557, 0x9A58: 0x5538, 0x9A59: 0x5533, 0x9A5A: 0x555D, 0x9A5B: 0x5599, 0x9A5C: 0x5580, 0x9A5D: 0x54AF, 0x9A5E: 0x558A, 0x9A5F: 0x559F, 0x9A60: 0x557B, 0x9A61: 0x557E, 0x9A62: 0x5598, 0x9A63: 0x559E, 0x9A64: 0x55AE, 0x9A65: 0x557C, 0x9A66: 0x5583, 0x9A67: 0x55A9, 0x9A68: 0x5587, 0x9A69: 0x55A8, 0x9A6A: 0x55DA, 0x9A6B: 0x55C5, 0x9A6C: 0x55DF, 0x9A6D: 0x55C4, 0x9A6E: 0x55DC, 0x9A6F: 0x55E4, 0x9A70: 0x55D4, 0x9A71: 0x5614, 0x9A72: 0x55F7, 0x9A73: 0x5616, 0x9A74: 0x55FE, 0x9A75: 0x55FD, 0x9A76: 0x561B, 0x9A77: 0x55F9, 0x9A78: 0x564E, 0x9A79: 0x5650, 0x9A7A: 0x71DF, 0x9A7B: 0x5634, 0x9A7C: 0x5636, 0x9A7D: 0x5632, 0x9A7E: 0x5638, 0x9A80: 0x566B, 0x9A81: 0x5664, 0x9A82: 0x562F, 0x9A83: 0x566C, 0x9A84: 0x566A, 0x9A85: 0x5686, 0x9A86: 0x5680, 0x9A87: 0x568A, 0x9A88: 0x56A0, 0x9A89: 0x5694, 0x9A8A: 0x568F, 0x9A8B: 0x56A5, 0x9A8C: 0x56AE, 0x9A8D: 0x56B6, 0x9A8E: 0x56B4, 0x9A8F: 0x56C2, 0x9A90: 0x56BC, 0x9A91: 0x56C1, 0x9A92: 0x56C3, 0x9A93: 0x56C0, 0x9A94: 0x56C8, 0x9A95: 0x56CE, 0x9A96: 0x56D1, 0x9A97: 0x56D3, 0x9A98: 0x56D7, 0x9A99: 0x56EE, 0x9A9A: 0x56F9, 0x9A9B: 0x5700, 0x9A9C: 0x56FF, 0x9A9D: 0x5704, 0x9A9E: 0x5709, 0x9A9F: 0x5708, 0x9AA0: 0x570B, 0x9AA1: 0x570D, 0x9AA2: 0x5713, 0x9AA3: 0x5718, 0x9AA4: 0x5716, 0x9AA5: 0x55C7, 0x9AA6: 0x571C, 0x9AA7: 0x5726, 0x9AA8: 0x5737, 0x9AA9: 0x5738, 0x9AAA: 0x574E, 0x9AAB: 0x573B, 0x9AAC: 0x5740, 0x9AAD: 0x574F, 0x9AAE: 0x5769, 0x9AAF: 0x57C0, 0x9AB0: 0x5788, 0x9AB1: 0x5761, 0x9AB2: 0x577F, 0x9AB3: 0x5789, 0x9AB4: 0x5793, 0x9AB5: 0x57A0, 0x9AB6: 0x57B3, 0x9AB7: 0x57A4, 0x9AB8: 0x57AA, 0x9AB9: 0x57B0, 0x9ABA: 0x57C3, 0x9ABB: 0x57C6, 0x9ABC: 0x57D4, 0x9ABD: 0x57D2, 0x9ABE: 0x57D3, 0x9ABF: 0x580A, 0x9AC0: 0x57D6, 0x9AC1: 0x57E3, 0x9AC2: 0x580B, 0x9AC3: 0x5819, 0x9AC4: 0x581D, 0x9AC5: 0x5872, 0x9AC6: 0x5821, 0x9AC7: 0x5862, 0x9AC8: 0x584B, 0x9AC9: 0x5870, 0x9ACA: 0x6BC0, 0x9ACB: 0x5852, 0x9ACC: 0x583D, 0x9ACD: 0x5879, 0x9ACE: 0x5885, 0x9ACF: 0x58B9, 0x9AD0: 0x589F, 0x9AD1: 0x58AB, 0x9AD2: 0x58BA, 0x9AD3: 0x58DE, 0x9AD4: 0x58BB, 0x9AD5: 0x58B8, 0x9AD6: 0x58AE, 0x9AD7: 0x58C5, 0x9AD8: 0x58D3, 0x9AD9: 0x58D1, 0x9ADA: 0x58D7, 0x9ADB: 0x58D9, 0x9ADC: 0x58D8, 0x9ADD: 0x58E5, 0x9ADE: 0x58DC, 0x9ADF: 0x58E4, 0x9AE0: 0x58DF, 0x9AE1: 0x58EF, 0x9AE2: 0x58FA, 0x9AE3: 0x58F9, 0x9AE4: 0x58FB, 0x9AE5: 0x58FC, 0x9AE6: 0x58FD, 0x9AE7: 0x5902, 0x9AE8: 0x590A, 0x9AE9: 0x5910, 0x9AEA: 0x591B, 0x9AEB: 0x68A6, 0x9AEC: 0x5925, 0x9AED: 0x592C, 0x9AEE: 0x592D, 0x9AEF: 0x5932, 0x9AF0: 0x5938, 0x9AF1: 0x593E, 0x9AF2: 0x7AD2, 0x9AF3: 0x5955, 0x9AF4: 0x5950, 0x9AF5: 0x594E, 0x9AF6: 0x595A, 0x9AF7: 0x5958, 0x9AF8: 0x5962, 0x9AF9: 0x5960, 0x9AFA: 0x5967, 0x9AFB: 0x596C, 0x9AFC: 0x5969, 0x9B40: 0x5978, 0x9B41: 0x5981, 0x9B42: 0x599D, 0x9B43: 0x4F5E, 0x9B44: 0x4FAB, 0x9B45: 0x59A3, 0x9B46: 0x59B2, 0x9B47: 0x59C6, 0x9B48: 0x59E8, 0x9B49: 0x59DC, 0x9B4A: 0x598D, 0x9B4B: 0x59D9, 0x9B4C: 0x59DA, 0x9B4D: 0x5A25, 0x9B4E: 0x5A1F, 0x9B4F: 0x5A11, 0x9B50: 0x5A1C, 0x9B51: 0x5A09, 0x9B52: 0x5A1A, 0x9B53: 0x5A40, 0x9B54: 0x5A6C, 0x9B55: 0x5A49, 0x9B56: 0x5A35, 0x9B57: 0x5A36, 0x9B58: 0x5A62, 0x9B59: 0x5A6A, 0x9B5A: 0x5A9A, 0x9B5B: 0x5ABC, 0x9B5C: 0x5ABE, 0x9B5D: 0x5ACB, 0x9B5E: 0x5AC2, 0x9B5F: 0x5ABD, 0x9B60: 0x5AE3, 0x9B61: 0x5AD7, 0x9B62: 0x5AE6, 0x9B63: 0x5AE9, 0x9B64: 0x5AD6, 0x9B65: 0x5AFA, 0x9B66: 0x5AFB, 0x9B67: 0x5B0C, 0x9B68: 0x5B0B, 0x9B69: 0x5B16, 0x9B6A: 0x5B32, 0x9B6B: 0x5AD0, 0x9B6C: 0x5B2A, 0x9B6D: 0x5B36, 0x9B6E: 0x5B3E, 0x9B6F: 0x5B43, 0x9B70: 0x5B45, 0x9B71: 0x5B40, 0x9B72: 0x5B51, 0x9B73: 0x5B55, 0x9B74: 0x5B5A, 0x9B75: 0x5B5B, 0x9B76: 0x5B65, 0x9B77: 0x5B69, 0x9B78: 0x5B70, 0x9B79: 0x5B73, 0x9B7A: 0x5B75, 0x9B7B: 0x5B78, 0x9B7C: 0x6588, 0x9B7D: 0x5B7A, 0x9B7E: 0x5B80, 0x9B80: 0x5B83, 0x9B81: 0x5BA6, 0x9B82: 0x5BB8, 0x9B83: 0x5BC3, 0x9B84: 0x5BC7, 0x9B85: 0x5BC9, 0x9B86: 0x5BD4, 0x9B87: 0x5BD0, 0x9B88: 0x5BE4, 0x9B89: 0x5BE6, 0x9B8A: 0x5BE2, 0x9B8B: 0x5BDE, 0x9B8C: 0x5BE5, 0x9B8D: 0x5BEB, 0x9B8E: 0x5BF0, 0x9B8F: 0x5BF6, 0x9B90: 0x5BF3, 0x9B91: 0x5C05, 0x9B92: 0x5C07, 0x9B93: 0x5C08, 0x9B94: 0x5C0D, 0x9B95: 0x5C13, 0x9B96: 0x5C20, 0x9B97: 0x5C22, 0x9B98: 0x5C28, 0x9B99: 0x5C38, 0x9B9A: 0x5C39, 0x9B9B: 0x5C41, 0x9B9C: 0x5C46, 0x9B9D: 0x5C4E, 0x9B9E: 0x5C53, 0x9B9F: 0x5C50, 0x9BA0: 0x5C4F, 0x9BA1: 0x5B71, 0x9BA2: 0x5C6C, 0x9BA3: 0x5C6E, 0x9BA4: 0x4E62, 0x9BA5: 0x5C76, 0x9BA6: 0x5C79, 0x9BA7: 0x5C8C, 0x9BA8: 0x5C91, 0x9BA9: 0x5C94, 0x9BAA: 0x599B, 0x9BAB: 0x5CAB, 0x9BAC: 0x5CBB, 0x9BAD: 0x5CB6, 0x9BAE: 0x5CBC, 0x9BAF: 0x5CB7, 0x9BB0: 0x5CC5, 0x9BB1: 0x5CBE, 0x9BB2: 0x5CC7, 0x9BB3: 0x5CD9, 0x9BB4: 0x5CE9, 0x9BB5: 0x5CFD, 0x9BB6: 0x5CFA, 0x9BB7: 0x5CED, 0x9BB8: 0x5D8C, 0x9BB9: 0x5CEA, 0x9BBA: 0x5D0B, 0x9BBB: 0x5D15, 0x9BBC: 0x5D17, 0x9BBD: 0x5D5C, 0x9BBE: 0x5D1F, 0x9BBF: 0x5D1B, 0x9BC0: 0x5D11, 0x9BC1: 0x5D14, 0x9BC2: 0x5D22, 0x9BC3: 0x5D1A, 0x9BC4: 0x5D19, 0x9BC5: 0x5D18, 0x9BC6: 0x5D4C, 0x9BC7: 0x5D52, 0x9BC8: 0x5D4E, 0x9BC9: 0x5D4B, 0x9BCA: 0x5D6C, 0x9BCB: 0x5D73, 0x9BCC: 0x5D76, 0x9BCD: 0x5D87, 0x9BCE: 0x5D84, 0x9BCF: 0x5D82, 0x9BD0: 0x5DA2, 0x9BD1: 0x5D9D, 0x9BD2: 0x5DAC, 0x9BD3: 0x5DAE, 0x9BD4: 0x5DBD, 0x9BD5: 0x5D90, 0x9BD6: 0x5DB7, 0x9BD7: 0x5DBC, 0x9BD8: 0x5DC9, 0x9BD9: 0x5DCD, 0x9BDA: 0x5DD3, 0x9BDB: 0x5DD2, 0x9BDC: 0x5DD6, 0x9BDD: 0x5DDB, 0x9BDE: 0x5DEB, 0x9BDF: 0x5DF2, 0x9BE0: 0x5DF5, 0x9BE1: 0x5E0B, 0x9BE2: 0x5E1A, 0x9BE3: 0x5E19, 0x9BE4: 0x5E11, 0x9BE5: 0x5E1B, 0x9BE6: 0x5E36, 0x9BE7: 0x5E37, 0x9BE8: 0x5E44, 0x9BE9: 0x5E43, 0x9BEA: 0x5E40, 0x9BEB: 0x5E4E, 0x9BEC: 0x5E57, 0x9BED: 0x5E54, 0x9BEE: 0x5E5F, 0x9BEF: 0x5E62, 0x9BF0: 0x5E64, 0x9BF1: 0x5E47, 0x9BF2: 0x5E75, 0x9BF3: 0x5E76, 0x9BF4: 0x5E7A, 0x9BF5: 0x9EBC, 0x9BF6: 0x5E7F, 0x9BF7: 0x5EA0, 0x9BF8: 0x5EC1, 0x9BF9: 0x5EC2, 0x9BFA: 0x5EC8, 0x9BFB: 0x5ED0, 0x9BFC: 0x5ECF, 0x9C40: 0x5ED6, 0x9C41: 0x5EE3, 0x9C42: 0x5EDD, 0x9C43: 0x5EDA, 0x9C44: 0x5EDB, 0x9C45: 0x5EE2, 0x9C46: 0x5EE1, 0x9C47: 0x5EE8, 0x9C48: 0x5EE9, 0x9C49: 0x5EEC, 0x9C4A: 0x5EF1, 0x9C4B: 0x5EF3, 0x9C4C: 0x5EF0, 0x9C4D: 0x5EF4, 0x9C4E: 0x5EF8, 0x9C4F: 0x5EFE, 0x9C50: 0x5F03, 0x9C51: 0x5F09, 0x9C52: 0x5F5D, 0x9C53: 0x5F5C, 0x9C54: 0x5F0B, 0x9C55: 0x5F11, 0x9C56: 0x5F16, 0x9C57: 0x5F29, 0x9C58: 0x5F2D, 0x9C59: 0x5F38, 0x9C5A: 0x5F41, 0x9C5B: 0x5F48, 0x9C5C: 0x5F4C, 0x9C5D: 0x5F4E, 0x9C5E: 0x5F2F, 0x9C5F: 0x5F51, 0x9C60: 0x5F56, 0x9C61: 0x5F57, 0x9C62: 0x5F59, 0x9C63: 0x5F61, 0x9C64: 0x5F6D, 0x9C65: 0x5F73, 0x9C66: 0x5F77, 0x9C67: 0x5F83, 0x9C68: 0x5F82, 0x9C69: 0x5F7F, 0x9C6A: 0x5F8A, 0x9C6B: 0x5F88, 0x9C6C: 0x5F91, 0x9C6D: 0x5F87, 0x9C6E: 0x5F9E, 0x9C6F: 0x5F99, 0x9C70: 0x5F98, 0x9C71: 0x5FA0, 0x9C72: 0x5FA8, 0x9C73: 0x5FAD, 0x9C74: 0x5FBC, 0x9C75: 0x5FD6, 0x9C76: 0x5FFB, 0x9C77: 0x5FE4, 0x9C78: 0x5FF8, 0x9C79: 0x5FF1, 0x9C7A: 0x5FDD, 0x9C7B: 0x60B3, 0x9C7C: 0x5FFF, 0x9C7D: 0x6021, 0x9C7E: 0x6060, 0x9C80: 0x6019, 0x9C81: 0x6010, 0x9C82: 0x6029, 0x9C83: 0x600E, 0x9C84: 0x6031, 0x9C85: 0x601B, 0x9C86: 0x6015, 0x9C87: 0x602B, 0x9C88: 0x6026, 0x9C89: 0x600F, 0x9C8A: 0x603A, 0x9C8B: 0x605A, 0x9C8C: 0x6041, 0x9C8D: 0x606A, 0x9C8E: 0x6077, 0x9C8F: 0x605F, 0x9C90: 0x604A, 0x9C91: 0x6046, 0x9C92: 0x604D, 0x9C93: 0x6063, 0x9C94: 0x6043, 0x9C95: 0x6064, 0x9C96: 0x6042, 0x9C97: 0x606C, 0x9C98: 0x606B, 0x9C99: 0x6059, 0x9C9A: 0x6081, 0x9C9B: 0x608D, 0x9C9C: 0x60E7, 0x9C9D: 0x6083, 0x9C9E: 0x609A, 0x9C9F: 0x6084, 0x9CA0: 0x609B, 0x9CA1: 0x6096, 0x9CA2: 0x6097, 0x9CA3: 0x6092, 0x9CA4: 0x60A7, 0x9CA5: 0x608B, 0x9CA6: 0x60E1, 0x9CA7: 0x60B8, 0x9CA8: 0x60E0, 0x9CA9: 0x60D3, 0x9CAA: 0x60B4, 0x9CAB: 0x5FF0, 0x9CAC: 0x60BD, 0x9CAD: 0x60C6, 0x9CAE: 0x60B5, 0x9CAF: 0x60D8, 0x9CB0: 0x614D, 0x9CB1: 0x6115, 0x9CB2: 0x6106, 0x9CB3: 0x60F6, 0x9CB4: 0x60F7, 0x9CB5: 0x6100, 0x9CB6: 0x60F4, 0x9CB7: 0x60FA, 0x9CB8: 0x6103, 0x9CB9: 0x6121, 0x9CBA: 0x60FB, 0x9CBB: 0x60F1, 0x9CBC: 0x610D, 0x9CBD: 0x610E, 0x9CBE: 0x6147, 0x9CBF: 0x613E, 0x9CC0: 0x6128, 0x9CC1: 0x6127, 0x9CC2: 0x614A, 0x9CC3: 0x613F, 0x9CC4: 0x613C, 0x9CC5: 0x612C, 0x9CC6: 0x6134, 0x9CC7: 0x613D, 0x9CC8: 0x6142, 0x9CC9: 0x6144, 0x9CCA: 0x6173, 0x9CCB: 0x6177, 0x9CCC: 0x6158, 0x9CCD: 0x6159, 0x9CCE: 0x615A, 0x9CCF: 0x616B, 0x9CD0: 0x6174, 0x9CD1: 0x616F, 0x9CD2: 0x6165, 0x9CD3: 0x6171, 0x9CD4: 0x615F, 0x9CD5: 0x615D, 0x9CD6: 0x6153, 0x9CD7: 0x6175, 0x9CD8: 0x6199, 0x9CD9: 0x6196, 0x9CDA: 0x6187, 0x9CDB: 0x61AC, 0x9CDC: 0x6194, 0x9CDD: 0x619A, 0x9CDE: 0x618A, 0x9CDF: 0x6191, 0x9CE0: 0x61AB, 0x9CE1: 0x61AE, 0x9CE2: 0x61CC, 0x9CE3: 0x61CA, 0x9CE4: 0x61C9, 0x9CE5: 0x61F7, 0x9CE6: 0x61C8, 0x9CE7: 0x61C3, 0x9CE8: 0x61C6, 0x9CE9: 0x61BA, 0x9CEA: 0x61CB, 0x9CEB: 0x7F79, 0x9CEC: 0x61CD, 0x9CED: 0x61E6, 0x9CEE: 0x61E3, 0x9CEF: 0x61F6, 0x9CF0: 0x61FA, 0x9CF1: 0x61F4, 0x9CF2: 0x61FF, 0x9CF3: 0x61FD, 0x9CF4: 0x61FC, 0x9CF5: 0x61FE, 0x9CF6: 0x6200, 0x9CF7: 0x6208, 0x9CF8: 0x6209, 0x9CF9: 0x620D, 0x9CFA: 0x620C, 0x9CFB: 0x6214, 0x9CFC: 0x621B, 0x9D40: 0x621E, 0x9D41: 0x6221, 0x9D42: 0x622A, 0x9D43: 0x622E, 0x9D44: 0x6230, 0x9D45: 0x6232, 0x9D46: 0x6233, 0x9D47: 0x6241, 0x9D48: 0x624E, 0x9D49: 0x625E, 0x9D4A: 0x6263, 0x9D4B: 0x625B, 0x9D4C: 0x6260, 0x9D4D: 0x6268, 0x9D4E: 0x627C, 0x9D4F: 0x6282, 0x9D50: 0x6289, 0x9D51: 0x627E, 0x9D52: 0x6292, 0x9D53: 0x6293, 0x9D54: 0x6296, 0x9D55: 0x62D4, 0x9D56: 0x6283, 0x9D57: 0x6294, 0x9D58: 0x62D7, 0x9D59: 0x62D1, 0x9D5A: 0x62BB, 0x9D5B: 0x62CF, 0x9D5C: 0x62FF, 0x9D5D: 0x62C6, 0x9D5E: 0x64D4, 0x9D5F: 0x62C8, 0x9D60: 0x62DC, 0x9D61: 0x62CC, 0x9D62: 0x62CA, 0x9D63: 0x62C2, 0x9D64: 0x62C7, 0x9D65: 0x629B, 0x9D66: 0x62C9, 0x9D67: 0x630C, 0x9D68: 0x62EE, 0x9D69: 0x62F1, 0x9D6A: 0x6327, 0x9D6B: 0x6302, 0x9D6C: 0x6308, 0x9D6D: 0x62EF, 0x9D6E: 0x62F5, 0x9D6F: 0x6350, 0x9D70: 0x633E, 0x9D71: 0x634D, 0x9D72: 0x641C, 0x9D73: 0x634F, 0x9D74: 0x6396, 0x9D75: 0x638E, 0x9D76: 0x6380, 0x9D77: 0x63AB, 0x9D78: 0x6376, 0x9D79: 0x63A3, 0x9D7A: 0x638F, 0x9D7B: 0x6389, 0x9D7C: 0x639F, 0x9D7D: 0x63B5, 0x9D7E: 0x636B, 0x9D80: 0x6369, 0x9D81: 0x63BE, 0x9D82: 0x63E9, 0x9D83: 0x63C0, 0x9D84: 0x63C6, 0x9D85: 0x63E3, 0x9D86: 0x63C9, 0x9D87: 0x63D2, 0x9D88: 0x63F6, 0x9D89: 0x63C4, 0x9D8A: 0x6416, 0x9D8B: 0x6434, 0x9D8C: 0x6406, 0x9D8D: 0x6413, 0x9D8E: 0x6426, 0x9D8F: 0x6436, 0x9D90: 0x651D, 0x9D91: 0x6417, 0x9D92: 0x6428, 0x9D93: 0x640F, 0x9D94: 0x6467, 0x9D95: 0x646F, 0x9D96: 0x6476, 0x9D97: 0x644E, 0x9D98: 0x652A, 0x9D99: 0x6495, 0x9D9A: 0x6493, 0x9D9B: 0x64A5, 0x9D9C: 0x64A9, 0x9D9D: 0x6488, 0x9D9E: 0x64BC, 0x9D9F: 0x64DA, 0x9DA0: 0x64D2, 0x9DA1: 0x64C5, 0x9DA2: 0x64C7, 0x9DA3: 0x64BB, 0x9DA4: 0x64D8, 0x9DA5: 0x64C2, 0x9DA6: 0x64F1, 0x9DA7: 0x64E7, 0x9DA8: 0x8209, 0x9DA9: 0x64E0, 0x9DAA: 0x64E1, 0x9DAB: 0x62AC, 0x9DAC: 0x64E3, 0x9DAD: 0x64EF, 0x9DAE: 0x652C, 0x9DAF: 0x64F6, 0x9DB0: 0x64F4, 0x9DB1: 0x64F2, 0x9DB2: 0x64FA, 0x9DB3: 0x6500, 0x9DB4: 0x64FD, 0x9DB5: 0x6518, 0x9DB6: 0x651C, 0x9DB7: 0x6505, 0x9DB8: 0x6524, 0x9DB9: 0x6523, 0x9DBA: 0x652B, 0x9DBB: 0x6534, 0x9DBC: 0x6535, 0x9DBD: 0x6537, 0x9DBE: 0x6536, 0x9DBF: 0x6538, 0x9DC0: 0x754B, 0x9DC1: 0x6548, 0x9DC2: 0x6556, 0x9DC3: 0x6555, 0x9DC4: 0x654D, 0x9DC5: 0x6558, 0x9DC6: 0x655E, 0x9DC7: 0x655D, 0x9DC8: 0x6572, 0x9DC9: 0x6578, 0x9DCA: 0x6582, 0x9DCB: 0x6583, 0x9DCC: 0x8B8A, 0x9DCD: 0x659B, 0x9DCE: 0x659F, 0x9DCF: 0x65AB, 0x9DD0: 0x65B7, 0x9DD1: 0x65C3, 0x9DD2: 0x65C6, 0x9DD3: 0x65C1, 0x9DD4: 0x65C4, 0x9DD5: 0x65CC, 0x9DD6: 0x65D2, 0x9DD7: 0x65DB, 0x9DD8: 0x65D9, 0x9DD9: 0x65E0, 0x9DDA: 0x65E1, 0x9DDB: 0x65F1, 0x9DDC: 0x6772, 0x9DDD: 0x660A, 0x9DDE: 0x6603, 0x9DDF: 0x65FB, 0x9DE0: 0x6773, 0x9DE1: 0x6635, 0x9DE2: 0x6636, 0x9DE3: 0x6634, 0x9DE4: 0x661C, 0x9DE5: 0x664F, 0x9DE6: 0x6644, 0x9DE7: 0x6649, 0x9DE8: 0x6641, 0x9DE9: 0x665E, 0x9DEA: 0x665D, 0x9DEB: 0x6664, 0x9DEC: 0x6667, 0x9DED: 0x6668, 0x9DEE: 0x665F, 0x9DEF: 0x6662, 0x9DF0: 0x6670, 0x9DF1: 0x6683, 0x9DF2: 0x6688, 0x9DF3: 0x668E, 0x9DF4: 0x6689, 0x9DF5: 0x6684, 0x9DF6: 0x6698, 0x9DF7: 0x669D, 0x9DF8: 0x66C1, 0x9DF9: 0x66B9, 0x9DFA: 0x66C9, 0x9DFB: 0x66BE, 0x9DFC: 0x66BC, 0x9E40: 0x66C4, 0x9E41: 0x66B8, 0x9E42: 0x66D6, 0x9E43: 0x66DA, 0x9E44: 0x66E0, 0x9E45: 0x663F, 0x9E46: 0x66E6, 0x9E47: 0x66E9, 0x9E48: 0x66F0, 0x9E49: 0x66F5, 0x9E4A: 0x66F7, 0x9E4B: 0x670F, 0x9E4C: 0x6716, 0x9E4D: 0x671E, 0x9E4E: 0x6726, 0x9E4F: 0x6727, 0x9E50: 0x9738, 0x9E51: 0x672E, 0x9E52: 0x673F, 0x9E53: 0x6736, 0x9E54: 0x6741, 0x9E55: 0x6738, 0x9E56: 0x6737, 0x9E57: 0x6746, 0x9E58: 0x675E, 0x9E59: 0x6760, 0x9E5A: 0x6759, 0x9E5B: 0x6763, 0x9E5C: 0x6764, 0x9E5D: 0x6789, 0x9E5E: 0x6770, 0x9E5F: 0x67A9, 0x9E60: 0x677C, 0x9E61: 0x676A, 0x9E62: 0x678C, 0x9E63: 0x678B, 0x9E64: 0x67A6, 0x9E65: 0x67A1, 0x9E66: 0x6785, 0x9E67: 0x67B7, 0x9E68: 0x67EF, 0x9E69: 0x67B4, 0x9E6A: 0x67EC, 0x9E6B: 0x67B3, 0x9E6C: 0x67E9, 0x9E6D: 0x67B8, 0x9E6E: 0x67E4, 0x9E6F: 0x67DE, 0x9E70: 0x67DD, 0x9E71: 0x67E2, 0x9E72: 0x67EE, 0x9E73: 0x67B9, 0x9E74: 0x67CE, 0x9E75: 0x67C6, 0x9E76: 0x67E7, 0x9E77: 0x6A9C, 0x9E78: 0x681E, 0x9E79: 0x6846, 0x9E7A: 0x6829, 0x9E7B: 0x6840, 0x9E7C: 0x684D, 0x9E7D: 0x6832, 0x9E7E: 0x684E, 0x9E80: 0x68B3, 0x9E81: 0x682B, 0x9E82: 0x6859, 0x9E83: 0x6863, 0x9E84: 0x6877, 0x9E85: 0x687F, 0x9E86: 0x689F, 0x9E87: 0x688F, 0x9E88: 0x68AD, 0x9E89: 0x6894, 0x9E8A: 0x689D, 0x9E8B: 0x689B, 0x9E8C: 0x6883, 0x9E8D: 0x6AAE, 0x9E8E: 0x68B9, 0x9E8F: 0x6874, 0x9E90: 0x68B5, 0x9E91: 0x68A0, 0x9E92: 0x68BA, 0x9E93: 0x690F, 0x9E94: 0x688D, 0x9E95: 0x687E, 0x9E96: 0x6901, 0x9E97: 0x68CA, 0x9E98: 0x6908, 0x9E99: 0x68D8, 0x9E9A: 0x6922, 0x9E9B: 0x6926, 0x9E9C: 0x68E1, 0x9E9D: 0x690C, 0x9E9E: 0x68CD, 0x9E9F: 0x68D4, 0x9EA0: 0x68E7, 0x9EA1: 0x68D5, 0x9EA2: 0x6936, 0x9EA3: 0x6912, 0x9EA4: 0x6904, 0x9EA5: 0x68D7, 0x9EA6: 0x68E3, 0x9EA7: 0x6925, 0x9EA8: 0x68F9, 0x9EA9: 0x68E0, 0x9EAA: 0x68EF, 0x9EAB: 0x6928, 0x9EAC: 0x692A, 0x9EAD: 0x691A, 0x9EAE: 0x6923, 0x9EAF: 0x6921, 0x9EB0: 0x68C6, 0x9EB1: 0x6979, 0x9EB2: 0x6977, 0x9EB3: 0x695C, 0x9EB4: 0x6978, 0x9EB5: 0x696B, 0x9EB6: 0x6954, 0x9EB7: 0x697E, 0x9EB8: 0x696E, 0x9EB9: 0x6939, 0x9EBA: 0x6974, 0x9EBB: 0x693D, 0x9EBC: 0x6959, 0x9EBD: 0x6930, 0x9EBE: 0x6961, 0x9EBF: 0x695E, 0x9EC0: 0x695D, 0x9EC1: 0x6981, 0x9EC2: 0x696A, 0x9EC3: 0x69B2, 0x9EC4: 0x69AE, 0x9EC5: 0x69D0, 0x9EC6: 0x69BF, 0x9EC7: 0x69C1, 0x9EC8: 0x69D3, 0x9EC9: 0x69BE, 0x9ECA: 0x69CE, 0x9ECB: 0x5BE8, 0x9ECC: 0x69CA, 0x9ECD: 0x69DD, 0x9ECE: 0x69BB, 0x9ECF: 0x69C3, 0x9ED0: 0x69A7, 0x9ED1: 0x6A2E, 0x9ED2: 0x6991, 0x9ED3: 0x69A0, 0x9ED4: 0x699C, 0x9ED5: 0x6995, 0x9ED6: 0x69B4, 0x9ED7: 0x69DE, 0x9ED8: 0x69E8, 0x9ED9: 0x6A02, 0x9EDA: 0x6A1B, 0x9EDB: 0x69FF, 0x9EDC: 0x6B0A, 0x9EDD: 0x69F9, 0x9EDE: 0x69F2, 0x9EDF: 0x69E7, 0x9EE0: 0x6A05, 0x9EE1: 0x69B1, 0x9EE2: 0x6A1E, 0x9EE3: 0x69ED, 0x9EE4: 0x6A14, 0x9EE5: 0x69EB, 0x9EE6: 0x6A0A, 0x9EE7: 0x6A12, 0x9EE8: 0x6AC1, 0x9EE9: 0x6A23, 0x9EEA: 0x6A13, 0x9EEB: 0x6A44, 0x9EEC: 0x6A0C, 0x9EED: 0x6A72, 0x9EEE: 0x6A36, 0x9EEF: 0x6A78, 0x9EF0: 0x6A47, 0x9EF1: 0x6A62, 0x9EF2: 0x6A59, 0x9EF3: 0x6A66, 0x9EF4: 0x6A48, 0x9EF5: 0x6A38, 0x9EF6: 0x6A22, 0x9EF7: 0x6A90, 0x9EF8: 0x6A8D, 0x9EF9: 0x6AA0, 0x9EFA: 0x6A84, 0x9EFB: 0x6AA2, 0x9EFC: 0x6AA3, 0x9F40: 0x6A97, 0x9F41: 0x8617, 0x9F42: 0x6ABB, 0x9F43: 0x6AC3, 0x9F44: 0x6AC2, 0x9F45: 0x6AB8, 0x9F46: 0x6AB3, 0x9F47: 0x6AAC, 0x9F48: 0x6ADE, 0x9F49: 0x6AD1, 0x9F4A: 0x6ADF, 0x9F4B: 0x6AAA, 0x9F4C: 0x6ADA, 0x9F4D: 0x6AEA, 0x9F4E: 0x6AFB, 0x9F4F: 0x6B05, 0x9F50: 0x8616, 0x9F51: 0x6AFA, 0x9F52: 0x6B12, 0x9F53: 0x6B16, 0x9F54: 0x9B31, 0x9F55: 0x6B1F, 0x9F56: 0x6B38, 0x9F57: 0x6B37, 0x9F58: 0x76DC, 0x9F59: 0x6B39, 0x9F5A: 0x98EE, 0x9F5B: 0x6B47, 0x9F5C: 0x6B43, 0x9F5D: 0x6B49, 0x9F5E: 0x6B50, 0x9F5F: 0x6B59, 0x9F60: 0x6B54, 0x9F61: 0x6B5B, 0x9F62: 0x6B5F, 0x9F63: 0x6B61, 0x9F64: 0x6B78, 0x9F65: 0x6B79, 0x9F66: 0x6B7F, 0x9F67: 0x6B80, 0x9F68: 0x6B84, 0x9F69: 0x6B83, 0x9F6A: 0x6B8D, 0x9F6B: 0x6B98, 0x9F6C: 0x6B95, 0x9F6D: 0x6B9E, 0x9F6E: 0x6BA4, 0x9F6F: 0x6BAA, 0x9F70: 0x6BAB, 0x9F71: 0x6BAF, 0x9F72: 0x6BB2, 0x9F73: 0x6BB1, 0x9F74: 0x6BB3, 0x9F75: 0x6BB7, 0x9F76: 0x6BBC, 0x9F77: 0x6BC6, 0x9F78: 0x6BCB, 0x9F79: 0x6BD3, 0x9F7A: 0x6BDF, 0x9F7B: 0x6BEC, 0x9F7C: 0x6BEB, 0x9F7D: 0x6BF3, 0x9F7E: 0x6BEF, 0x9F80: 0x9EBE, 0x9F81: 0x6C08, 0x9F82: 0x6C13, 0x9F83: 0x6C14, 0x9F84: 0x6C1B, 0x9F85: 0x6C24, 0x9F86: 0x6C23, 0x9F87: 0x6C5E, 0x9F88: 0x6C55, 0x9F89: 0x6C62, 0x9F8A: 0x6C6A, 0x9F8B: 0x6C82, 0x9F8C: 0x6C8D, 0x9F8D: 0x6C9A, 0x9F8E: 0x6C81, 0x9F8F: 0x6C9B, 0x9F90: 0x6C7E, 0x9F91: 0x6C68, 0x9F92: 0x6C73, 0x9F93: 0x6C92, 0x9F94: 0x6C90, 0x9F95: 0x6CC4, 0x9F96: 0x6CF1, 0x9F97: 0x6CD3, 0x9F98: 0x6CBD, 0x9F99: 0x6CD7, 0x9F9A: 0x6CC5, 0x9F9B: 0x6CDD, 0x9F9C: 0x6CAE, 0x9F9D: 0x6CB1, 0x9F9E: 0x6CBE, 0x9F9F: 0x6CBA, 0x9FA0: 0x6CDB, 0x9FA1: 0x6CEF, 0x9FA2: 0x6CD9, 0x9FA3: 0x6CEA, 0x9FA4: 0x6D1F, 0x9FA5: 0x884D, 0x9FA6: 0x6D36, 0x9FA7: 0x6D2B, 0x9FA8: 0x6D3D, 0x9FA9: 0x6D38, 0x9FAA: 0x6D19, 0x9FAB: 0x6D35, 0x9FAC: 0x6D33, 0x9FAD: 0x6D12, 0x9FAE: 0x6D0C, 0x9FAF: 0x6D63, 0x9FB0: 0x6D93, 0x9FB1: 0x6D64, 0x9FB2: 0x6D5A, 0x9FB3: 0x6D79, 0x9FB4: 0x6D59, 0x9FB5: 0x6D8E, 0x9FB6: 0x6D95, 0x9FB7: 0x6FE4, 0x9FB8: 0x6D85, 0x9FB9: 0x6DF9, 0x9FBA: 0x6E15, 0x9FBB: 0x6E0A, 0x9FBC: 0x6DB5, 0x9FBD: 0x6DC7, 0x9FBE: 0x6DE6, 0x9FBF: 0x6DB8, 0x9FC0: 0x6DC6, 0x9FC1: 0x6DEC, 0x9FC2: 0x6DDE, 0x9FC3: 0x6DCC, 0x9FC4: 0x6DE8, 0x9FC5: 0x6DD2, 0x9FC6: 0x6DC5, 0x9FC7: 0x6DFA, 0x9FC8: 0x6DD9, 0x9FC9: 0x6DE4, 0x9FCA: 0x6DD5, 0x9FCB: 0x6DEA, 0x9FCC: 0x6DEE, 0x9FCD: 0x6E2D, 0x9FCE: 0x6E6E, 0x9FCF: 0x6E2E, 0x9FD0: 0x6E19, 0x9FD1: 0x6E72, 0x9FD2: 0x6E5F, 0x9FD3: 0x6E3E, 0x9FD4: 0x6E23, 0x9FD5: 0x6E6B, 0x9FD6: 0x6E2B, 0x9FD7: 0x6E76, 0x9FD8: 0x6E4D, 0x9FD9: 0x6E1F, 0x9FDA: 0x6E43, 0x9FDB: 0x6E3A, 0x9FDC: 0x6E4E, 0x9FDD: 0x6E24, 0x9FDE: 0x6EFF, 0x9FDF: 0x6E1D, 0x9FE0: 0x6E38, 0x9FE1: 0x6E82, 0x9FE2: 0x6EAA, 0x9FE3: 0x6E98, 0x9FE4: 0x6EC9, 0x9FE5: 0x6EB7, 0x9FE6: 0x6ED3, 0x9FE7: 0x6EBD, 0x9FE8: 0x6EAF, 0x9FE9: 0x6EC4, 0x9FEA: 0x6EB2, 0x9FEB: 0x6ED4, 0x9FEC: 0x6ED5, 0x9FED: 0x6E8F, 0x9FEE: 0x6EA5, 0x9FEF: 0x6EC2, 0x9FF0: 0x6E9F, 0x9FF1: 0x6F41, 0x9FF2: 0x6F11, 0x9FF3: 0x704C, 0x9FF4: 0x6EEC, 0x9FF5: 0x6EF8, 0x9FF6: 0x6EFE, 0x9FF7: 0x6F3F, 0x9FF8: 0x6EF2, 0x9FF9: 0x6F31, 0x9FFA: 0x6EEF, 0x9FFB: 0x6F32, 0x9FFC: 0x6ECC, 0xA1: 0xFF61, 0xA2: 0xFF62, 0xA3: 0xFF63, 0xA4: 0xFF64, 0xA5: 0xFF65, 0xA6: 0xFF66, 0xA7: 0xFF67, 0xA8: 0xFF68, 0xA9: 0xFF69, 0xAA: 0xFF6A, 0xAB: 0xFF6B, 0xAC: 0xFF6C, 0xAD: 0xFF6D, 0xAE: 0xFF6E, 0xAF: 0xFF6F, 0xB0: 0xFF70, 0xB1: 0xFF71, 0xB2: 0xFF72, 0xB3: 0xFF73, 0xB4: 0xFF74, 0xB5: 0xFF75, 0xB6: 0xFF76, 0xB7: 0xFF77, 0xB8: 0xFF78, 0xB9: 0xFF79, 0xBA: 0xFF7A, 0xBB: 0xFF7B, 0xBC: 0xFF7C, 0xBD: 0xFF7D, 0xBE: 0xFF7E, 0xBF: 0xFF7F, 0xC0: 0xFF80, 0xC1: 0xFF81, 0xC2: 0xFF82, 0xC3: 0xFF83, 0xC4: 0xFF84, 0xC5: 0xFF85, 0xC6: 0xFF86, 0xC7: 0xFF87, 0xC8: 0xFF88, 0xC9: 0xFF89, 0xCA: 0xFF8A, 0xCB: 0xFF8B, 0xCC: 0xFF8C, 0xCD: 0xFF8D, 0xCE: 0xFF8E, 0xCF: 0xFF8F, 0xD0: 0xFF90, 0xD1: 0xFF91, 0xD2: 0xFF92, 0xD3: 0xFF93, 0xD4: 0xFF94, 0xD5: 0xFF95, 0xD6: 0xFF96, 0xD7: 0xFF97, 0xD8: 0xFF98, 0xD9: 0xFF99, 0xDA: 0xFF9A, 0xDB: 0xFF9B, 0xDC: 0xFF9C, 0xDD: 0xFF9D, 0xDE: 0xFF9E, 0xDF: 0xFF9F, 0xE040: 0x6F3E, 0xE041: 0x6F13, 0xE042: 0x6EF7, 0xE043: 0x6F86, 0xE044: 0x6F7A, 0xE045: 0x6F78, 0xE046: 0x6F81, 0xE047: 0x6F80, 0xE048: 0x6F6F, 0xE049: 0x6F5B, 0xE04A: 0x6FF3, 0xE04B: 0x6F6D, 0xE04C: 0x6F82, 0xE04D: 0x6F7C, 0xE04E: 0x6F58, 0xE04F: 0x6F8E, 0xE050: 0x6F91, 0xE051: 0x6FC2, 0xE052: 0x6F66, 0xE053: 0x6FB3, 0xE054: 0x6FA3, 0xE055: 0x6FA1, 0xE056: 0x6FA4, 0xE057: 0x6FB9, 0xE058: 0x6FC6, 0xE059: 0x6FAA, 0xE05A: 0x6FDF, 0xE05B: 0x6FD5, 0xE05C: 0x6FEC, 0xE05D: 0x6FD4, 0xE05E: 0x6FD8, 0xE05F: 0x6FF1, 0xE060: 0x6FEE, 0xE061: 0x6FDB, 0xE062: 0x7009, 0xE063: 0x700B, 0xE064: 0x6FFA, 0xE065: 0x7011, 0xE066: 0x7001, 0xE067: 0x700F, 0xE068: 0x6FFE, 0xE069: 0x701B, 0xE06A: 0x701A, 0xE06B: 0x6F74, 0xE06C: 0x701D, 0xE06D: 0x7018, 0xE06E: 0x701F, 0xE06F: 0x7030, 0xE070: 0x703E, 0xE071: 0x7032, 0xE072: 0x7051, 0xE073: 0x7063, 0xE074: 0x7099, 0xE075: 0x7092, 0xE076: 0x70AF, 0xE077: 0x70F1, 0xE078: 0x70AC, 0xE079: 0x70B8, 0xE07A: 0x70B3, 0xE07B: 0x70AE, 0xE07C: 0x70DF, 0xE07D: 0x70CB, 0xE07E: 0x70DD, 0xE080: 0x70D9, 0xE081: 0x7109, 0xE082: 0x70FD, 0xE083: 0x711C, 0xE084: 0x7119, 0xE085: 0x7165, 0xE086: 0x7155, 0xE087: 0x7188, 0xE088: 0x7166, 0xE089: 0x7162, 0xE08A: 0x714C, 0xE08B: 0x7156, 0xE08C: 0x716C, 0xE08D: 0x718F, 0xE08E: 0x71FB, 0xE08F: 0x7184, 0xE090: 0x7195, 0xE091: 0x71A8, 0xE092: 0x71AC, 0xE093: 0x71D7, 0xE094: 0x71B9, 0xE095: 0x71BE, 0xE096: 0x71D2, 0xE097: 0x71C9, 0xE098: 0x71D4, 0xE099: 0x71CE, 0xE09A: 0x71E0, 0xE09B: 0x71EC, 0xE09C: 0x71E7, 0xE09D: 0x71F5, 0xE09E: 0x71FC, 0xE09F: 0x71F9, 0xE0A0: 0x71FF, 0xE0A1: 0x720D, 0xE0A2: 0x7210, 0xE0A3: 0x721B, 0xE0A4: 0x7228, 0xE0A5: 0x722D, 0xE0A6: 0x722C, 0xE0A7: 0x7230, 0xE0A8: 0x7232, 0xE0A9: 0x723B, 0xE0AA: 0x723C, 0xE0AB: 0x723F, 0xE0AC: 0x7240, 0xE0AD: 0x7246, 0xE0AE: 0x724B, 0xE0AF: 0x7258, 0xE0B0: 0x7274, 0xE0B1: 0x727E, 0xE0B2: 0x7282, 0xE0B3: 0x7281, 0xE0B4: 0x7287, 0xE0B5: 0x7292, 0xE0B6: 0x7296, 0xE0B7: 0x72A2, 0xE0B8: 0x72A7, 0xE0B9: 0x72B9, 0xE0BA: 0x72B2, 0xE0BB: 0x72C3, 0xE0BC: 0x72C6, 0xE0BD: 0x72C4, 0xE0BE: 0x72CE, 0xE0BF: 0x72D2, 0xE0C0: 0x72E2, 0xE0C1: 0x72E0, 0xE0C2: 0x72E1, 0xE0C3: 0x72F9, 0xE0C4: 0x72F7, 0xE0C5: 0x500F, 0xE0C6: 0x7317, 0xE0C7: 0x730A, 0xE0C8: 0x731C, 0xE0C9: 0x7316, 0xE0CA: 0x731D, 0xE0CB: 0x7334, 0xE0CC: 0x732F, 0xE0CD: 0x7329, 0xE0CE: 0x7325, 0xE0CF: 0x733E, 0xE0D0: 0x734E, 0xE0D1: 0x734F, 0xE0D2: 0x9ED8, 0xE0D3: 0x7357, 0xE0D4: 0x736A, 0xE0D5: 0x7368, 0xE0D6: 0x7370, 0xE0D7: 0x7378, 0xE0D8: 0x7375, 0xE0D9: 0x737B, 0xE0DA: 0x737A, 0xE0DB: 0x73C8, 0xE0DC: 0x73B3, 0xE0DD: 0x73CE, 0xE0DE: 0x73BB, 0xE0DF: 0x73C0, 0xE0E0: 0x73E5, 0xE0E1: 0x73EE, 0xE0E2: 0x73DE, 0xE0E3: 0x74A2, 0xE0E4: 0x7405, 0xE0E5: 0x746F, 0xE0E6: 0x7425, 0xE0E7: 0x73F8, 0xE0E8: 0x7432, 0xE0E9: 0x743A, 0xE0EA: 0x7455, 0xE0EB: 0x743F, 0xE0EC: 0x745F, 0xE0ED: 0x7459, 0xE0EE: 0x7441, 0xE0EF: 0x745C, 0xE0F0: 0x7469, 0xE0F1: 0x7470, 0xE0F2: 0x7463, 0xE0F3: 0x746A, 0xE0F4: 0x7476, 0xE0F5: 0x747E, 0xE0F6: 0x748B, 0xE0F7: 0x749E, 0xE0F8: 0x74A7, 0xE0F9: 0x74CA, 0xE0FA: 0x74CF, 0xE0FB: 0x74D4, 0xE0FC: 0x73F1, 0xE140: 0x74E0, 0xE141: 0x74E3, 0xE142: 0x74E7, 0xE143: 0x74E9, 0xE144: 0x74EE, 0xE145: 0x74F2, 0xE146: 0x74F0, 0xE147: 0x74F1, 0xE148: 0x74F8, 0xE149: 0x74F7, 0xE14A: 0x7504, 0xE14B: 0x7503, 0xE14C: 0x7505, 0xE14D: 0x750C, 0xE14E: 0x750E, 0xE14F: 0x750D, 0xE150: 0x7515, 0xE151: 0x7513, 0xE152: 0x751E, 0xE153: 0x7526, 0xE154: 0x752C, 0xE155: 0x753C, 0xE156: 0x7544, 0xE157: 0x754D, 0xE158: 0x754A, 0xE159: 0x7549, 0xE15A: 0x755B, 0xE15B: 0x7546, 0xE15C: 0x755A, 0xE15D: 0x7569, 0xE15E: 0x7564, 0xE15F: 0x7567, 0xE160: 0x756B, 0xE161: 0x756D, 0xE162: 0x7578, 0xE163: 0x7576, 0xE164: 0x7586, 0xE165: 0x7587, 0xE166: 0x7574, 0xE167: 0x758A, 0xE168: 0x7589, 0xE169: 0x7582, 0xE16A: 0x7594, 0xE16B: 0x759A, 0xE16C: 0x759D, 0xE16D: 0x75A5, 0xE16E: 0x75A3, 0xE16F: 0x75C2, 0xE170: 0x75B3, 0xE171: 0x75C3, 0xE172: 0x75B5, 0xE173: 0x75BD, 0xE174: 0x75B8, 0xE175: 0x75BC, 0xE176: 0x75B1, 0xE177: 0x75CD, 0xE178: 0x75CA, 0xE179: 0x75D2, 0xE17A: 0x75D9, 0xE17B: 0x75E3, 0xE17C: 0x75DE, 0xE17D: 0x75FE, 0xE17E: 0x75FF, 0xE180: 0x75FC, 0xE181: 0x7601, 0xE182: 0x75F0, 0xE183: 0x75FA, 0xE184: 0x75F2, 0xE185: 0x75F3, 0xE186: 0x760B, 0xE187: 0x760D, 0xE188: 0x7609, 0xE189: 0x761F, 0xE18A: 0x7627, 0xE18B: 0x7620, 0xE18C: 0x7621, 0xE18D: 0x7622, 0xE18E: 0x7624, 0xE18F: 0x7634, 0xE190: 0x7630, 0xE191: 0x763B, 0xE192: 0x7647, 0xE193: 0x7648, 0xE194: 0x7646, 0xE195: 0x765C, 0xE196: 0x7658, 0xE197: 0x7661, 0xE198: 0x7662, 0xE199: 0x7668, 0xE19A: 0x7669, 0xE19B: 0x766A, 0xE19C: 0x7667, 0xE19D: 0x766C, 0xE19E: 0x7670, 0xE19F: 0x7672, 0xE1A0: 0x7676, 0xE1A1: 0x7678, 0xE1A2: 0x767C, 0xE1A3: 0x7680, 0xE1A4: 0x7683, 0xE1A5: 0x7688, 0xE1A6: 0x768B, 0xE1A7: 0x768E, 0xE1A8: 0x7696, 0xE1A9: 0x7693, 0xE1AA: 0x7699, 0xE1AB: 0x769A, 0xE1AC: 0x76B0, 0xE1AD: 0x76B4, 0xE1AE: 0x76B8, 0xE1AF: 0x76B9, 0xE1B0: 0x76BA, 0xE1B1: 0x76C2, 0xE1B2: 0x76CD, 0xE1B3: 0x76D6, 0xE1B4: 0x76D2, 0xE1B5: 0x76DE, 0xE1B6: 0x76E1, 0xE1B7: 0x76E5, 0xE1B8: 0x76E7, 0xE1B9: 0x76EA, 0xE1BA: 0x862F, 0xE1BB: 0x76FB, 0xE1BC: 0x7708, 0xE1BD: 0x7707, 0xE1BE: 0x7704, 0xE1BF: 0x7729, 0xE1C0: 0x7724, 0xE1C1: 0x771E, 0xE1C2: 0x7725, 0xE1C3: 0x7726, 0xE1C4: 0x771B, 0xE1C5: 0x7737, 0xE1C6: 0x7738, 0xE1C7: 0x7747, 0xE1C8: 0x775A, 0xE1C9: 0x7768, 0xE1CA: 0x776B, 0xE1CB: 0x775B, 0xE1CC: 0x7765, 0xE1CD: 0x777F, 0xE1CE: 0x777E, 0xE1CF: 0x7779, 0xE1D0: 0x778E, 0xE1D1: 0x778B, 0xE1D2: 0x7791, 0xE1D3: 0x77A0, 0xE1D4: 0x779E, 0xE1D5: 0x77B0, 0xE1D6: 0x77B6, 0xE1D7: 0x77B9, 0xE1D8: 0x77BF, 0xE1D9: 0x77BC, 0xE1DA: 0x77BD, 0xE1DB: 0x77BB, 0xE1DC: 0x77C7, 0xE1DD: 0x77CD, 0xE1DE: 0x77D7, 0xE1DF: 0x77DA, 0xE1E0: 0x77DC, 0xE1E1: 0x77E3, 0xE1E2: 0x77EE, 0xE1E3: 0x77FC, 0xE1E4: 0x780C, 0xE1E5: 0x7812, 0xE1E6: 0x7926, 0xE1E7: 0x7820, 0xE1E8: 0x792A, 0xE1E9: 0x7845, 0xE1EA: 0x788E, 0xE1EB: 0x7874, 0xE1EC: 0x7886, 0xE1ED: 0x787C, 0xE1EE: 0x789A, 0xE1EF: 0x788C, 0xE1F0: 0x78A3, 0xE1F1: 0x78B5, 0xE1F2: 0x78AA, 0xE1F3: 0x78AF, 0xE1F4: 0x78D1, 0xE1F5: 0x78C6, 0xE1F6: 0x78CB, 0xE1F7: 0x78D4, 0xE1F8: 0x78BE, 0xE1F9: 0x78BC, 0xE1FA: 0x78C5, 0xE1FB: 0x78CA, 0xE1FC: 0x78EC, 0xE240: 0x78E7, 0xE241: 0x78DA, 0xE242: 0x78FD, 0xE243: 0x78F4, 0xE244: 0x7907, 0xE245: 0x7912, 0xE246: 0x7911, 0xE247: 0x7919, 0xE248: 0x792C, 0xE249: 0x792B, 0xE24A: 0x7940, 0xE24B: 0x7960, 0xE24C: 0x7957, 0xE24D: 0x795F, 0xE24E: 0x795A, 0xE24F: 0x7955, 0xE250: 0x7953, 0xE251: 0x797A, 0xE252: 0x797F, 0xE253: 0x798A, 0xE254: 0x799D, 0xE255: 0x79A7, 0xE256: 0x9F4B, 0xE257: 0x79AA, 0xE258: 0x79AE, 0xE259: 0x79B3, 0xE25A: 0x79B9, 0xE25B: 0x79BA, 0xE25C: 0x79C9, 0xE25D: 0x79D5, 0xE25E: 0x79E7, 0xE25F: 0x79EC, 0xE260: 0x79E1, 0xE261: 0x79E3, 0xE262: 0x7A08, 0xE263: 0x7A0D, 0xE264: 0x7A18, 0xE265: 0x7A19, 0xE266: 0x7A20, 0xE267: 0x7A1F, 0xE268: 0x7980, 0xE269: 0x7A31, 0xE26A: 0x7A3B, 0xE26B: 0x7A3E, 0xE26C: 0x7A37, 0xE26D: 0x7A43, 0xE26E: 0x7A57, 0xE26F: 0x7A49, 0xE270: 0x7A61, 0xE271: 0x7A62, 0xE272: 0x7A69, 0xE273: 0x9F9D, 0xE274: 0x7A70, 0xE275: 0x7A79, 0xE276: 0x7A7D, 0xE277: 0x7A88, 0xE278: 0x7A97, 0xE279: 0x7A95, 0xE27A: 0x7A98, 0xE27B: 0x7A96, 0xE27C: 0x7AA9, 0xE27D: 0x7AC8, 0xE27E: 0x7AB0, 0xE280: 0x7AB6, 0xE281: 0x7AC5, 0xE282: 0x7AC4, 0xE283: 0x7ABF, 0xE284: 0x9083, 0xE285: 0x7AC7, 0xE286: 0x7ACA, 0xE287: 0x7ACD, 0xE288: 0x7ACF, 0xE289: 0x7AD5, 0xE28A: 0x7AD3, 0xE28B: 0x7AD9, 0xE28C: 0x7ADA, 0xE28D: 0x7ADD, 0xE28E: 0x7AE1, 0xE28F: 0x7AE2, 0xE290: 0x7AE6, 0xE291: 0x7AED, 0xE292: 0x7AF0, 0xE293: 0x7B02, 0xE294: 0x7B0F, 0xE295: 0x7B0A, 0xE296: 0x7B06, 0xE297: 0x7B33, 0xE298: 0x7B18, 0xE299: 0x7B19, 0xE29A: 0x7B1E, 0xE29B: 0x7B35, 0xE29C: 0x7B28, 0xE29D: 0x7B36, 0xE29E: 0x7B50, 0xE29F: 0x7B7A, 0xE2A0: 0x7B04, 0xE2A1: 0x7B4D, 0xE2A2: 0x7B0B, 0xE2A3: 0x7B4C, 0xE2A4: 0x7B45, 0xE2A5: 0x7B75, 0xE2A6: 0x7B65, 0xE2A7: 0x7B74, 0xE2A8: 0x7B67, 0xE2A9: 0x7B70, 0xE2AA: 0x7B71, 0xE2AB: 0x7B6C, 0xE2AC: 0x7B6E, 0xE2AD: 0x7B9D, 0xE2AE: 0x7B98, 0xE2AF: 0x7B9F, 0xE2B0: 0x7B8D, 0xE2B1: 0x7B9C, 0xE2B2: 0x7B9A, 0xE2B3: 0x7B8B, 0xE2B4: 0x7B92, 0xE2B5: 0x7B8F, 0xE2B6: 0x7B5D, 0xE2B7: 0x7B99, 0xE2B8: 0x7BCB, 0xE2B9: 0x7BC1, 0xE2BA: 0x7BCC, 0xE2BB: 0x7BCF, 0xE2BC: 0x7BB4, 0xE2BD: 0x7BC6, 0xE2BE: 0x7BDD, 0xE2BF: 0x7BE9, 0xE2C0: 0x7C11, 0xE2C1: 0x7C14, 0xE2C2: 0x7BE6, 0xE2C3: 0x7BE5, 0xE2C4: 0x7C60, 0xE2C5: 0x7C00, 0xE2C6: 0x7C07, 0xE2C7: 0x7C13, 0xE2C8: 0x7BF3, 0xE2C9: 0x7BF7, 0xE2CA: 0x7C17, 0xE2CB: 0x7C0D, 0xE2CC: 0x7BF6, 0xE2CD: 0x7C23, 0xE2CE: 0x7C27, 0xE2CF: 0x7C2A, 0xE2D0: 0x7C1F, 0xE2D1: 0x7C37, 0xE2D2: 0x7C2B, 0xE2D3: 0x7C3D, 0xE2D4: 0x7C4C, 0xE2D5: 0x7C43, 0xE2D6: 0x7C54, 0xE2D7: 0x7C4F, 0xE2D8: 0x7C40, 0xE2D9: 0x7C50, 0xE2DA: 0x7C58, 0xE2DB: 0x7C5F, 0xE2DC: 0x7C64, 0xE2DD: 0x7C56, 0xE2DE: 0x7C65, 0xE2DF: 0x7C6C, 0xE2E0: 0x7C75, 0xE2E1: 0x7C83, 0xE2E2: 0x7C90, 0xE2E3: 0x7CA4, 0xE2E4: 0x7CAD, 0xE2E5: 0x7CA2, 0xE2E6: 0x7CAB, 0xE2E7: 0x7CA1, 0xE2E8: 0x7CA8, 0xE2E9: 0x7CB3, 0xE2EA: 0x7CB2, 0xE2EB: 0x7CB1, 0xE2EC: 0x7CAE, 0xE2ED: 0x7CB9, 0xE2EE: 0x7CBD, 0xE2EF: 0x7CC0, 0xE2F0: 0x7CC5, 0xE2F1: 0x7CC2, 0xE2F2: 0x7CD8, 0xE2F3: 0x7CD2, 0xE2F4: 0x7CDC, 0xE2F5: 0x7CE2, 0xE2F6: 0x9B3B, 0xE2F7: 0x7CEF, 0xE2F8: 0x7CF2, 0xE2F9: 0x7CF4, 0xE2FA: 0x7CF6, 0xE2FB: 0x7CFA, 0xE2FC: 0x7D06, 0xE340: 0x7D02, 0xE341: 0x7D1C, 0xE342: 0x7D15, 0xE343: 0x7D0A, 0xE344: 0x7D45, 0xE345: 0x7D4B, 0xE346: 0x7D2E, 0xE347: 0x7D32, 0xE348: 0x7D3F, 0xE349: 0x7D35, 0xE34A: 0x7D46, 0xE34B: 0x7D73, 0xE34C: 0x7D56, 0xE34D: 0x7D4E, 0xE34E: 0x7D72, 0xE34F: 0x7D68, 0xE350: 0x7D6E, 0xE351: 0x7D4F, 0xE352: 0x7D63, 0xE353: 0x7D93, 0xE354: 0x7D89, 0xE355: 0x7D5B, 0xE356: 0x7D8F, 0xE357: 0x7D7D, 0xE358: 0x7D9B, 0xE359: 0x7DBA, 0xE35A: 0x7DAE, 0xE35B: 0x7DA3, 0xE35C: 0x7DB5, 0xE35D: 0x7DC7, 0xE35E: 0x7DBD, 0xE35F: 0x7DAB, 0xE360: 0x7E3D, 0xE361: 0x7DA2, 0xE362: 0x7DAF, 0xE363: 0x7DDC, 0xE364: 0x7DB8, 0xE365: 0x7D9F, 0xE366: 0x7DB0, 0xE367: 0x7DD8, 0xE368: 0x7DDD, 0xE369: 0x7DE4, 0xE36A: 0x7DDE, 0xE36B: 0x7DFB, 0xE36C: 0x7DF2, 0xE36D: 0x7DE1, 0xE36E: 0x7E05, 0xE36F: 0x7E0A, 0xE370: 0x7E23, 0xE371: 0x7E21, 0xE372: 0x7E12, 0xE373: 0x7E31, 0xE374: 0x7E1F, 0xE375: 0x7E09, 0xE376: 0x7E0B, 0xE377: 0x7E22, 0xE378: 0x7E46, 0xE379: 0x7E66, 0xE37A: 0x7E3B, 0xE37B: 0x7E35, 0xE37C: 0x7E39, 0xE37D: 0x7E43, 0xE37E: 0x7E37, 0xE380: 0x7E32, 0xE381: 0x7E3A, 0xE382: 0x7E67, 0xE383: 0x7E5D, 0xE384: 0x7E56, 0xE385: 0x7E5E, 0xE386: 0x7E59, 0xE387: 0x7E5A, 0xE388: 0x7E79, 0xE389: 0x7E6A, 0xE38A: 0x7E69, 0xE38B: 0x7E7C, 0xE38C: 0x7E7B, 0xE38D: 0x7E83, 0xE38E: 0x7DD5, 0xE38F: 0x7E7D, 0xE390: 0x8FAE, 0xE391: 0x7E7F, 0xE392: 0x7E88, 0xE393: 0x7E89, 0xE394: 0x7E8C, 0xE395: 0x7E92, 0xE396: 0x7E90, 0xE397: 0x7E93, 0xE398: 0x7E94, 0xE399: 0x7E96, 0xE39A: 0x7E8E, 0xE39B: 0x7E9B, 0xE39C: 0x7E9C, 0xE39D: 0x7F38, 0xE39E: 0x7F3A, 0xE39F: 0x7F45, 0xE3A0: 0x7F4C, 0xE3A1: 0x7F4D, 0xE3A2: 0x7F4E, 0xE3A3: 0x7F50, 0xE3A4: 0x7F51, 0xE3A5: 0x7F55, 0xE3A6: 0x7F54, 0xE3A7: 0x7F58, 0xE3A8: 0x7F5F, 0xE3A9: 0x7F60, 0xE3AA: 0x7F68, 0xE3AB: 0x7F69, 0xE3AC: 0x7F67, 0xE3AD: 0x7F78, 0xE3AE: 0x7F82, 0xE3AF: 0x7F86, 0xE3B0: 0x7F83, 0xE3B1: 0x7F88, 0xE3B2: 0x7F87, 0xE3B3: 0x7F8C, 0xE3B4: 0x7F94, 0xE3B5: 0x7F9E, 0xE3B6: 0x7F9D, 0xE3B7: 0x7F9A, 0xE3B8: 0x7FA3, 0xE3B9: 0x7FAF, 0xE3BA: 0x7FB2, 0xE3BB: 0x7FB9, 0xE3BC: 0x7FAE, 0xE3BD: 0x7FB6, 0xE3BE: 0x7FB8, 0xE3BF: 0x8B71, 0xE3C0: 0x7FC5, 0xE3C1: 0x7FC6, 0xE3C2: 0x7FCA, 0xE3C3: 0x7FD5, 0xE3C4: 0x7FD4, 0xE3C5: 0x7FE1, 0xE3C6: 0x7FE6, 0xE3C7: 0x7FE9, 0xE3C8: 0x7FF3, 0xE3C9: 0x7FF9, 0xE3CA: 0x98DC, 0xE3CB: 0x8006, 0xE3CC: 0x8004, 0xE3CD: 0x800B, 0xE3CE: 0x8012, 0xE3CF: 0x8018, 0xE3D0: 0x8019, 0xE3D1: 0x801C, 0xE3D2: 0x8021, 0xE3D3: 0x8028, 0xE3D4: 0x803F, 0xE3D5: 0x803B, 0xE3D6: 0x804A, 0xE3D7: 0x8046, 0xE3D8: 0x8052, 0xE3D9: 0x8058, 0xE3DA: 0x805A, 0xE3DB: 0x805F, 0xE3DC: 0x8062, 0xE3DD: 0x8068, 0xE3DE: 0x8073, 0xE3DF: 0x8072, 0xE3E0: 0x8070, 0xE3E1: 0x8076, 0xE3E2: 0x8079, 0xE3E3: 0x807D, 0xE3E4: 0x807F, 0xE3E5: 0x8084, 0xE3E6: 0x8086, 0xE3E7: 0x8085, 0xE3E8: 0x809B, 0xE3E9: 0x8093, 0xE3EA: 0x809A, 0xE3EB: 0x80AD, 0xE3EC: 0x5190, 0xE3ED: 0x80AC, 0xE3EE: 0x80DB, 0xE3EF: 0x80E5, 0xE3F0: 0x80D9, 0xE3F1: 0x80DD, 0xE3F2: 0x80C4, 0xE3F3: 0x80DA, 0xE3F4: 0x80D6, 0xE3F5: 0x8109, 0xE3F6: 0x80EF, 0xE3F7: 0x80F1, 0xE3F8: 0x811B, 0xE3F9: 0x8129, 0xE3FA: 0x8123, 0xE3FB: 0x812F, 0xE3FC: 0x814B, 0xE440: 0x968B, 0xE441: 0x8146, 0xE442: 0x813E, 0xE443: 0x8153, 0xE444: 0x8151, 0xE445: 0x80FC, 0xE446: 0x8171, 0xE447: 0x816E, 0xE448: 0x8165, 0xE449: 0x8166, 0xE44A: 0x8174, 0xE44B: 0x8183, 0xE44C: 0x8188, 0xE44D: 0x818A, 0xE44E: 0x8180, 0xE44F: 0x8182, 0xE450: 0x81A0, 0xE451: 0x8195, 0xE452: 0x81A4, 0xE453: 0x81A3, 0xE454: 0x815F, 0xE455: 0x8193, 0xE456: 0x81A9, 0xE457: 0x81B0, 0xE458: 0x81B5, 0xE459: 0x81BE, 0xE45A: 0x81B8, 0xE45B: 0x81BD, 0xE45C: 0x81C0, 0xE45D: 0x81C2, 0xE45E: 0x81BA, 0xE45F: 0x81C9, 0xE460: 0x81CD, 0xE461: 0x81D1, 0xE462: 0x81D9, 0xE463: 0x81D8, 0xE464: 0x81C8, 0xE465: 0x81DA, 0xE466: 0x81DF, 0xE467: 0x81E0, 0xE468: 0x81E7, 0xE469: 0x81FA, 0xE46A: 0x81FB, 0xE46B: 0x81FE, 0xE46C: 0x8201, 0xE46D: 0x8202, 0xE46E: 0x8205, 0xE46F: 0x8207, 0xE470: 0x820A, 0xE471: 0x820D, 0xE472: 0x8210, 0xE473: 0x8216, 0xE474: 0x8229, 0xE475: 0x822B, 0xE476: 0x8238, 0xE477: 0x8233, 0xE478: 0x8240, 0xE479: 0x8259, 0xE47A: 0x8258, 0xE47B: 0x825D, 0xE47C: 0x825A, 0xE47D: 0x825F, 0xE47E: 0x8264, 0xE480: 0x8262, 0xE481: 0x8268, 0xE482: 0x826A, 0xE483: 0x826B, 0xE484: 0x822E, 0xE485: 0x8271, 0xE486: 0x8277, 0xE487: 0x8278, 0xE488: 0x827E, 0xE489: 0x828D, 0xE48A: 0x8292, 0xE48B: 0x82AB, 0xE48C: 0x829F, 0xE48D: 0x82BB, 0xE48E: 0x82AC, 0xE48F: 0x82E1, 0xE490: 0x82E3, 0xE491: 0x82DF, 0xE492: 0x82D2, 0xE493: 0x82F4, 0xE494: 0x82F3, 0xE495: 0x82FA, 0xE496: 0x8393, 0xE497: 0x8303, 0xE498: 0x82FB, 0xE499: 0x82F9, 0xE49A: 0x82DE, 0xE49B: 0x8306, 0xE49C: 0x82DC, 0xE49D: 0x8309, 0xE49E: 0x82D9, 0xE49F: 0x8335, 0xE4A0: 0x8334, 0xE4A1: 0x8316, 0xE4A2: 0x8332, 0xE4A3: 0x8331, 0xE4A4: 0x8340, 0xE4A5: 0x8339, 0xE4A6: 0x8350, 0xE4A7: 0x8345, 0xE4A8: 0x832F, 0xE4A9: 0x832B, 0xE4AA: 0x8317, 0xE4AB: 0x8318, 0xE4AC: 0x8385, 0xE4AD: 0x839A, 0xE4AE: 0x83AA, 0xE4AF: 0x839F, 0xE4B0: 0x83A2, 0xE4B1: 0x8396, 0xE4B2: 0x8323, 0xE4B3: 0x838E, 0xE4B4: 0x8387, 0xE4B5: 0x838A, 0xE4B6: 0x837C, 0xE4B7: 0x83B5, 0xE4B8: 0x8373, 0xE4B9: 0x8375, 0xE4BA: 0x83A0, 0xE4BB: 0x8389, 0xE4BC: 0x83A8, 0xE4BD: 0x83F4, 0xE4BE: 0x8413, 0xE4BF: 0x83EB, 0xE4C0: 0x83CE, 0xE4C1: 0x83FD, 0xE4C2: 0x8403, 0xE4C3: 0x83D8, 0xE4C4: 0x840B, 0xE4C5: 0x83C1, 0xE4C6: 0x83F7, 0xE4C7: 0x8407, 0xE4C8: 0x83E0, 0xE4C9: 0x83F2, 0xE4CA: 0x840D, 0xE4CB: 0x8422, 0xE4CC: 0x8420, 0xE4CD: 0x83BD, 0xE4CE: 0x8438, 0xE4CF: 0x8506, 0xE4D0: 0x83FB, 0xE4D1: 0x846D, 0xE4D2: 0x842A, 0xE4D3: 0x843C, 0xE4D4: 0x855A, 0xE4D5: 0x8484, 0xE4D6: 0x8477, 0xE4D7: 0x846B, 0xE4D8: 0x84AD, 0xE4D9: 0x846E, 0xE4DA: 0x8482, 0xE4DB: 0x8469, 0xE4DC: 0x8446, 0xE4DD: 0x842C, 0xE4DE: 0x846F, 0xE4DF: 0x8479, 0xE4E0: 0x8435, 0xE4E1: 0x84CA, 0xE4E2: 0x8462, 0xE4E3: 0x84B9, 0xE4E4: 0x84BF, 0xE4E5: 0x849F, 0xE4E6: 0x84D9, 0xE4E7: 0x84CD, 0xE4E8: 0x84BB, 0xE4E9: 0x84DA, 0xE4EA: 0x84D0, 0xE4EB: 0x84C1, 0xE4EC: 0x84C6, 0xE4ED: 0x84D6, 0xE4EE: 0x84A1, 0xE4EF: 0x8521, 0xE4F0: 0x84FF, 0xE4F1: 0x84F4, 0xE4F2: 0x8517, 0xE4F3: 0x8518, 0xE4F4: 0x852C, 0xE4F5: 0x851F, 0xE4F6: 0x8515, 0xE4F7: 0x8514, 0xE4F8: 0x84FC, 0xE4F9: 0x8540, 0xE4FA: 0x8563, 0xE4FB: 0x8558, 0xE4FC: 0x8548, 0xE540: 0x8541, 0xE541: 0x8602, 0xE542: 0x854B, 0xE543: 0x8555, 0xE544: 0x8580, 0xE545: 0x85A4, 0xE546: 0x8588, 0xE547: 0x8591, 0xE548: 0x858A, 0xE549: 0x85A8, 0xE54A: 0x856D, 0xE54B: 0x8594, 0xE54C: 0x859B, 0xE54D: 0x85EA, 0xE54E: 0x8587, 0xE54F: 0x859C, 0xE550: 0x8577, 0xE551: 0x857E, 0xE552: 0x8590, 0xE553: 0x85C9, 0xE554: 0x85BA, 0xE555: 0x85CF, 0xE556: 0x85B9, 0xE557: 0x85D0, 0xE558: 0x85D5, 0xE559: 0x85DD, 0xE55A: 0x85E5, 0xE55B: 0x85DC, 0xE55C: 0x85F9, 0xE55D: 0x860A, 0xE55E: 0x8613, 0xE55F: 0x860B, 0xE560: 0x85FE, 0xE561: 0x85FA, 0xE562: 0x8606, 0xE563: 0x8622, 0xE564: 0x861A, 0xE565: 0x8630, 0xE566: 0x863F, 0xE567: 0x864D, 0xE568: 0x4E55, 0xE569: 0x8654, 0xE56A: 0x865F, 0xE56B: 0x8667, 0xE56C: 0x8671, 0xE56D: 0x8693, 0xE56E: 0x86A3, 0xE56F: 0x86A9, 0xE570: 0x86AA, 0xE571: 0x868B, 0xE572: 0x868C, 0xE573: 0x86B6, 0xE574: 0x86AF, 0xE575: 0x86C4, 0xE576: 0x86C6, 0xE577: 0x86B0, 0xE578: 0x86C9, 0xE579: 0x8823, 0xE57A: 0x86AB, 0xE57B: 0x86D4, 0xE57C: 0x86DE, 0xE57D: 0x86E9, 0xE57E: 0x86EC, 0xE580: 0x86DF, 0xE581: 0x86DB, 0xE582: 0x86EF, 0xE583: 0x8712, 0xE584: 0x8706, 0xE585: 0x8708, 0xE586: 0x8700, 0xE587: 0x8703, 0xE588: 0x86FB, 0xE589: 0x8711, 0xE58A: 0x8709, 0xE58B: 0x870D, 0xE58C: 0x86F9, 0xE58D: 0x870A, 0xE58E: 0x8734, 0xE58F: 0x873F, 0xE590: 0x8737, 0xE591: 0x873B, 0xE592: 0x8725, 0xE593: 0x8729, 0xE594: 0x871A, 0xE595: 0x8760, 0xE596: 0x875F, 0xE597: 0x8778, 0xE598: 0x874C, 0xE599: 0x874E, 0xE59A: 0x8774, 0xE59B: 0x8757, 0xE59C: 0x8768, 0xE59D: 0x876E, 0xE59E: 0x8759, 0xE59F: 0x8753, 0xE5A0: 0x8763, 0xE5A1: 0x876A, 0xE5A2: 0x8805, 0xE5A3: 0x87A2, 0xE5A4: 0x879F, 0xE5A5: 0x8782, 0xE5A6: 0x87AF, 0xE5A7: 0x87CB, 0xE5A8: 0x87BD, 0xE5A9: 0x87C0, 0xE5AA: 0x87D0, 0xE5AB: 0x96D6, 0xE5AC: 0x87AB, 0xE5AD: 0x87C4, 0xE5AE: 0x87B3, 0xE5AF: 0x87C7, 0xE5B0: 0x87C6, 0xE5B1: 0x87BB, 0xE5B2: 0x87EF, 0xE5B3: 0x87F2, 0xE5B4: 0x87E0, 0xE5B5: 0x880F, 0xE5B6: 0x880D, 0xE5B7: 0x87FE, 0xE5B8: 0x87F6, 0xE5B9: 0x87F7, 0xE5BA: 0x880E, 0xE5BB: 0x87D2, 0xE5BC: 0x8811, 0xE5BD: 0x8816, 0xE5BE: 0x8815, 0xE5BF: 0x8822, 0xE5C0: 0x8821, 0xE5C1: 0x8831, 0xE5C2: 0x8836, 0xE5C3: 0x8839, 0xE5C4: 0x8827, 0xE5C5: 0x883B, 0xE5C6: 0x8844, 0xE5C7: 0x8842, 0xE5C8: 0x8852, 0xE5C9: 0x8859, 0xE5CA: 0x885E, 0xE5CB: 0x8862, 0xE5CC: 0x886B, 0xE5CD: 0x8881, 0xE5CE: 0x887E, 0xE5CF: 0x889E, 0xE5D0: 0x8875, 0xE5D1: 0x887D, 0xE5D2: 0x88B5, 0xE5D3: 0x8872, 0xE5D4: 0x8882, 0xE5D5: 0x8897, 0xE5D6: 0x8892, 0xE5D7: 0x88AE, 0xE5D8: 0x8899, 0xE5D9: 0x88A2, 0xE5DA: 0x888D, 0xE5DB: 0x88A4, 0xE5DC: 0x88B0, 0xE5DD: 0x88BF, 0xE5DE: 0x88B1, 0xE5DF: 0x88C3, 0xE5E0: 0x88C4, 0xE5E1: 0x88D4, 0xE5E2: 0x88D8, 0xE5E3: 0x88D9, 0xE5E4: 0x88DD, 0xE5E5: 0x88F9, 0xE5E6: 0x8902, 0xE5E7: 0x88FC, 0xE5E8: 0x88F4, 0xE5E9: 0x88E8, 0xE5EA: 0x88F2, 0xE5EB: 0x8904, 0xE5EC: 0x890C, 0xE5ED: 0x890A, 0xE5EE: 0x8913, 0xE5EF: 0x8943, 0xE5F0: 0x891E, 0xE5F1: 0x8925, 0xE5F2: 0x892A, 0xE5F3: 0x892B, 0xE5F4: 0x8941, 0xE5F5: 0x8944, 0xE5F6: 0x893B, 0xE5F7: 0x8936, 0xE5F8: 0x8938, 0xE5F9: 0x894C, 0xE5FA: 0x891D, 0xE5FB: 0x8960, 0xE5FC: 0x895E, 0xE640: 0x8966, 0xE641: 0x8964, 0xE642: 0x896D, 0xE643: 0x896A, 0xE644: 0x896F, 0xE645: 0x8974, 0xE646: 0x8977, 0xE647: 0x897E, 0xE648: 0x8983, 0xE649: 0x8988, 0xE64A: 0x898A, 0xE64B: 0x8993, 0xE64C: 0x8998, 0xE64D: 0x89A1, 0xE64E: 0x89A9, 0xE64F: 0x89A6, 0xE650: 0x89AC, 0xE651: 0x89AF, 0xE652: 0x89B2, 0xE653: 0x89BA, 0xE654: 0x89BD, 0xE655: 0x89BF, 0xE656: 0x89C0, 0xE657: 0x89DA, 0xE658: 0x89DC, 0xE659: 0x89DD, 0xE65A: 0x89E7, 0xE65B: 0x89F4, 0xE65C: 0x89F8, 0xE65D: 0x8A03, 0xE65E: 0x8A16, 0xE65F: 0x8A10, 0xE660: 0x8A0C, 0xE661: 0x8A1B, 0xE662: 0x8A1D, 0xE663: 0x8A25, 0xE664: 0x8A36, 0xE665: 0x8A41, 0xE666: 0x8A5B, 0xE667: 0x8A52, 0xE668: 0x8A46, 0xE669: 0x8A48, 0xE66A: 0x8A7C, 0xE66B: 0x8A6D, 0xE66C: 0x8A6C, 0xE66D: 0x8A62, 0xE66E: 0x8A85, 0xE66F: 0x8A82, 0xE670: 0x8A84, 0xE671: 0x8AA8, 0xE672: 0x8AA1, 0xE673: 0x8A91, 0xE674: 0x8AA5, 0xE675: 0x8AA6, 0xE676: 0x8A9A, 0xE677: 0x8AA3, 0xE678: 0x8AC4, 0xE679: 0x8ACD, 0xE67A: 0x8AC2, 0xE67B: 0x8ADA, 0xE67C: 0x8AEB, 0xE67D: 0x8AF3, 0xE67E: 0x8AE7, 0xE680: 0x8AE4, 0xE681: 0x8AF1, 0xE682: 0x8B14, 0xE683: 0x8AE0, 0xE684: 0x8AE2, 0xE685: 0x8AF7, 0xE686: 0x8ADE, 0xE687: 0x8ADB, 0xE688: 0x8B0C, 0xE689: 0x8B07, 0xE68A: 0x8B1A, 0xE68B: 0x8AE1, 0xE68C: 0x8B16, 0xE68D: 0x8B10, 0xE68E: 0x8B17, 0xE68F: 0x8B20, 0xE690: 0x8B33, 0xE691: 0x97AB, 0xE692: 0x8B26, 0xE693: 0x8B2B, 0xE694: 0x8B3E, 0xE695: 0x8B28, 0xE696: 0x8B41, 0xE697: 0x8B4C, 0xE698: 0x8B4F, 0xE699: 0x8B4E, 0xE69A: 0x8B49, 0xE69B: 0x8B56, 0xE69C: 0x8B5B, 0xE69D: 0x8B5A, 0xE69E: 0x8B6B, 0xE69F: 0x8B5F, 0xE6A0: 0x8B6C, 0xE6A1: 0x8B6F, 0xE6A2: 0x8B74, 0xE6A3: 0x8B7D, 0xE6A4: 0x8B80, 0xE6A5: 0x8B8C, 0xE6A6: 0x8B8E, 0xE6A7: 0x8B92, 0xE6A8: 0x8B93, 0xE6A9: 0x8B96, 0xE6AA: 0x8B99, 0xE6AB: 0x8B9A, 0xE6AC: 0x8C3A, 0xE6AD: 0x8C41, 0xE6AE: 0x8C3F, 0xE6AF: 0x8C48, 0xE6B0: 0x8C4C, 0xE6B1: 0x8C4E, 0xE6B2: 0x8C50, 0xE6B3: 0x8C55, 0xE6B4: 0x8C62, 0xE6B5: 0x8C6C, 0xE6B6: 0x8C78, 0xE6B7: 0x8C7A, 0xE6B8: 0x8C82, 0xE6B9: 0x8C89, 0xE6BA: 0x8C85, 0xE6BB: 0x8C8A, 0xE6BC: 0x8C8D, 0xE6BD: 0x8C8E, 0xE6BE: 0x8C94, 0xE6BF: 0x8C7C, 0xE6C0: 0x8C98, 0xE6C1: 0x621D, 0xE6C2: 0x8CAD, 0xE6C3: 0x8CAA, 0xE6C4: 0x8CBD, 0xE6C5: 0x8CB2, 0xE6C6: 0x8CB3, 0xE6C7: 0x8CAE, 0xE6C8: 0x8CB6, 0xE6C9: 0x8CC8, 0xE6CA: 0x8CC1, 0xE6CB: 0x8CE4, 0xE6CC: 0x8CE3, 0xE6CD: 0x8CDA, 0xE6CE: 0x8CFD, 0xE6CF: 0x8CFA, 0xE6D0: 0x8CFB, 0xE6D1: 0x8D04, 0xE6D2: 0x8D05, 0xE6D3: 0x8D0A, 0xE6D4: 0x8D07, 0xE6D5: 0x8D0F, 0xE6D6: 0x8D0D, 0xE6D7: 0x8D10, 0xE6D8: 0x9F4E, 0xE6D9: 0x8D13, 0xE6DA: 0x8CCD, 0xE6DB: 0x8D14, 0xE6DC: 0x8D16, 0xE6DD: 0x8D67, 0xE6DE: 0x8D6D, 0xE6DF: 0x8D71, 0xE6E0: 0x8D73, 0xE6E1: 0x8D81, 0xE6E2: 0x8D99, 0xE6E3: 0x8DC2, 0xE6E4: 0x8DBE, 0xE6E5: 0x8DBA, 0xE6E6: 0x8DCF, 0xE6E7: 0x8DDA, 0xE6E8: 0x8DD6, 0xE6E9: 0x8DCC, 0xE6EA: 0x8DDB, 0xE6EB: 0x8DCB, 0xE6EC: 0x8DEA, 0xE6ED: 0x8DEB, 0xE6EE: 0x8DDF, 0xE6EF: 0x8DE3, 0xE6F0: 0x8DFC, 0xE6F1: 0x8E08, 0xE6F2: 0x8E09, 0xE6F3: 0x8DFF, 0xE6F4: 0x8E1D, 0xE6F5: 0x8E1E, 0xE6F6: 0x8E10, 0xE6F7: 0x8E1F, 0xE6F8: 0x8E42, 0xE6F9: 0x8E35, 0xE6FA: 0x8E30, 0xE6FB: 0x8E34, 0xE6FC: 0x8E4A, 0xE740: 0x8E47, 0xE741: 0x8E49, 0xE742: 0x8E4C, 0xE743: 0x8E50, 0xE744: 0x8E48, 0xE745: 0x8E59, 0xE746: 0x8E64, 0xE747: 0x8E60, 0xE748: 0x8E2A, 0xE749: 0x8E63, 0xE74A: 0x8E55, 0xE74B: 0x8E76, 0xE74C: 0x8E72, 0xE74D: 0x8E7C, 0xE74E: 0x8E81, 0xE74F: 0x8E87, 0xE750: 0x8E85, 0xE751: 0x8E84, 0xE752: 0x8E8B, 0xE753: 0x8E8A, 0xE754: 0x8E93, 0xE755: 0x8E91, 0xE756: 0x8E94, 0xE757: 0x8E99, 0xE758: 0x8EAA, 0xE759: 0x8EA1, 0xE75A: 0x8EAC, 0xE75B: 0x8EB0, 0xE75C: 0x8EC6, 0xE75D: 0x8EB1, 0xE75E: 0x8EBE, 0xE75F: 0x8EC5, 0xE760: 0x8EC8, 0xE761: 0x8ECB, 0xE762: 0x8EDB, 0xE763: 0x8EE3, 0xE764: 0x8EFC, 0xE765: 0x8EFB, 0xE766: 0x8EEB, 0xE767: 0x8EFE, 0xE768: 0x8F0A, 0xE769: 0x8F05, 0xE76A: 0x8F15, 0xE76B: 0x8F12, 0xE76C: 0x8F19, 0xE76D: 0x8F13, 0xE76E: 0x8F1C, 0xE76F: 0x8F1F, 0xE770: 0x8F1B, 0xE771: 0x8F0C, 0xE772: 0x8F26, 0xE773: 0x8F33, 0xE774: 0x8F3B, 0xE775: 0x8F39, 0xE776: 0x8F45, 0xE777: 0x8F42, 0xE778: 0x8F3E, 0xE779: 0x8F4C, 0xE77A: 0x8F49, 0xE77B: 0x8F46, 0xE77C: 0x8F4E, 0xE77D: 0x8F57, 0xE77E: 0x8F5C, 0xE780: 0x8F62, 0xE781: 0x8F63, 0xE782: 0x8F64, 0xE783: 0x8F9C, 0xE784: 0x8F9F, 0xE785: 0x8FA3, 0xE786: 0x8FAD, 0xE787: 0x8FAF, 0xE788: 0x8FB7, 0xE789: 0x8FDA, 0xE78A: 0x8FE5, 0xE78B: 0x8FE2, 0xE78C: 0x8FEA, 0xE78D: 0x8FEF, 0xE78E: 0x9087, 0xE78F: 0x8FF4, 0xE790: 0x9005, 0xE791: 0x8FF9, 0xE792: 0x8FFA, 0xE793: 0x9011, 0xE794: 0x9015, 0xE795: 0x9021, 0xE796: 0x900D, 0xE797: 0x901E, 0xE798: 0x9016, 0xE799: 0x900B, 0xE79A: 0x9027, 0xE79B: 0x9036, 0xE79C: 0x9035, 0xE79D: 0x9039, 0xE79E: 0x8FF8, 0xE79F: 0x904F, 0xE7A0: 0x9050, 0xE7A1: 0x9051, 0xE7A2: 0x9052, 0xE7A3: 0x900E, 0xE7A4: 0x9049, 0xE7A5: 0x903E, 0xE7A6: 0x9056, 0xE7A7: 0x9058, 0xE7A8: 0x905E, 0xE7A9: 0x9068, 0xE7AA: 0x906F, 0xE7AB: 0x9076, 0xE7AC: 0x96A8, 0xE7AD: 0x9072, 0xE7AE: 0x9082, 0xE7AF: 0x907D, 0xE7B0: 0x9081, 0xE7B1: 0x9080, 0xE7B2: 0x908A, 0xE7B3: 0x9089, 0xE7B4: 0x908F, 0xE7B5: 0x90A8, 0xE7B6: 0x90AF, 0xE7B7: 0x90B1, 0xE7B8: 0x90B5, 0xE7B9: 0x90E2, 0xE7BA: 0x90E4, 0xE7BB: 0x6248, 0xE7BC: 0x90DB, 0xE7BD: 0x9102, 0xE7BE: 0x9112, 0xE7BF: 0x9119, 0xE7C0: 0x9132, 0xE7C1: 0x9130, 0xE7C2: 0x914A, 0xE7C3: 0x9156, 0xE7C4: 0x9158, 0xE7C5: 0x9163, 0xE7C6: 0x9165, 0xE7C7: 0x9169, 0xE7C8: 0x9173, 0xE7C9: 0x9172, 0xE7CA: 0x918B, 0xE7CB: 0x9189, 0xE7CC: 0x9182, 0xE7CD: 0x91A2, 0xE7CE: 0x91AB, 0xE7CF: 0x91AF, 0xE7D0: 0x91AA, 0xE7D1: 0x91B5, 0xE7D2: 0x91B4, 0xE7D3: 0x91BA, 0xE7D4: 0x91C0, 0xE7D5: 0x91C1, 0xE7D6: 0x91C9, 0xE7D7: 0x91CB, 0xE7D8: 0x91D0, 0xE7D9: 0x91D6, 0xE7DA: 0x91DF, 0xE7DB: 0x91E1, 0xE7DC: 0x91DB, 0xE7DD: 0x91FC, 0xE7DE: 0x91F5, 0xE7DF: 0x91F6, 0xE7E0: 0x921E, 0xE7E1: 0x91FF, 0xE7E2: 0x9214, 0xE7E3: 0x922C, 0xE7E4: 0x9215, 0xE7E5: 0x9211, 0xE7E6: 0x925E, 0xE7E7: 0x9257, 0xE7E8: 0x9245, 0xE7E9: 0x9249, 0xE7EA: 0x9264, 0xE7EB: 0x9248, 0xE7EC: 0x9295, 0xE7ED: 0x923F, 0xE7EE: 0x924B, 0xE7EF: 0x9250, 0xE7F0: 0x929C, 0xE7F1: 0x9296, 0xE7F2: 0x9293, 0xE7F3: 0x929B, 0xE7F4: 0x925A, 0xE7F5: 0x92CF, 0xE7F6: 0x92B9, 0xE7F7: 0x92B7, 0xE7F8: 0x92E9, 0xE7F9: 0x930F, 0xE7FA: 0x92FA, 0xE7FB: 0x9344, 0xE7FC: 0x932E, 0xE840: 0x9319, 0xE841: 0x9322, 0xE842: 0x931A, 0xE843: 0x9323, 0xE844: 0x933A, 0xE845: 0x9335, 0xE846: 0x933B, 0xE847: 0x935C, 0xE848: 0x9360, 0xE849: 0x937C, 0xE84A: 0x936E, 0xE84B: 0x9356, 0xE84C: 0x93B0, 0xE84D: 0x93AC, 0xE84E: 0x93AD, 0xE84F: 0x9394, 0xE850: 0x93B9, 0xE851: 0x93D6, 0xE852: 0x93D7, 0xE853: 0x93E8, 0xE854: 0x93E5, 0xE855: 0x93D8, 0xE856: 0x93C3, 0xE857: 0x93DD, 0xE858: 0x93D0, 0xE859: 0x93C8, 0xE85A: 0x93E4, 0xE85B: 0x941A, 0xE85C: 0x9414, 0xE85D: 0x9413, 0xE85E: 0x9403, 0xE85F: 0x9407, 0xE860: 0x9410, 0xE861: 0x9436, 0xE862: 0x942B, 0xE863: 0x9435, 0xE864: 0x9421, 0xE865: 0x943A, 0xE866: 0x9441, 0xE867: 0x9452, 0xE868: 0x9444, 0xE869: 0x945B, 0xE86A: 0x9460, 0xE86B: 0x9462, 0xE86C: 0x945E, 0xE86D: 0x946A, 0xE86E: 0x9229, 0xE86F: 0x9470, 0xE870: 0x9475, 0xE871: 0x9477, 0xE872: 0x947D, 0xE873: 0x945A, 0xE874: 0x947C, 0xE875: 0x947E, 0xE876: 0x9481, 0xE877: 0x947F, 0xE878: 0x9582, 0xE879: 0x9587, 0xE87A: 0x958A, 0xE87B: 0x9594, 0xE87C: 0x9596, 0xE87D: 0x9598, 0xE87E: 0x9599, 0xE880: 0x95A0, 0xE881: 0x95A8, 0xE882: 0x95A7, 0xE883: 0x95AD, 0xE884: 0x95BC, 0xE885: 0x95BB, 0xE886: 0x95B9, 0xE887: 0x95BE, 0xE888: 0x95CA, 0xE889: 0x6FF6, 0xE88A: 0x95C3, 0xE88B: 0x95CD, 0xE88C: 0x95CC, 0xE88D: 0x95D5, 0xE88E: 0x95D4, 0xE88F: 0x95D6, 0xE890: 0x95DC, 0xE891: 0x95E1, 0xE892: 0x95E5, 0xE893: 0x95E2, 0xE894: 0x9621, 0xE895: 0x9628, 0xE896: 0x962E, 0xE897: 0x962F, 0xE898: 0x9642, 0xE899: 0x964C, 0xE89A: 0x964F, 0xE89B: 0x964B, 0xE89C: 0x9677, 0xE89D: 0x965C, 0xE89E: 0x965E, 0xE89F: 0x965D, 0xE8A0: 0x965F, 0xE8A1: 0x9666, 0xE8A2: 0x9672, 0xE8A3: 0x966C, 0xE8A4: 0x968D, 0xE8A5: 0x9698, 0xE8A6: 0x9695, 0xE8A7: 0x9697, 0xE8A8: 0x96AA, 0xE8A9: 0x96A7, 0xE8AA: 0x96B1, 0xE8AB: 0x96B2, 0xE8AC: 0x96B0, 0xE8AD: 0x96B4, 0xE8AE: 0x96B6, 0xE8AF: 0x96B8, 0xE8B0: 0x96B9, 0xE8B1: 0x96CE, 0xE8B2: 0x96CB, 0xE8B3: 0x96C9, 0xE8B4: 0x96CD, 0xE8B5: 0x894D, 0xE8B6: 0x96DC, 0xE8B7: 0x970D, 0xE8B8: 0x96D5, 0xE8B9: 0x96F9, 0xE8BA: 0x9704, 0xE8BB: 0x9706, 0xE8BC: 0x9708, 0xE8BD: 0x9713, 0xE8BE: 0x970E, 0xE8BF: 0x9711, 0xE8C0: 0x970F, 0xE8C1: 0x9716, 0xE8C2: 0x9719, 0xE8C3: 0x9724, 0xE8C4: 0x972A, 0xE8C5: 0x9730, 0xE8C6: 0x9739, 0xE8C7: 0x973D, 0xE8C8: 0x973E, 0xE8C9: 0x9744, 0xE8CA: 0x9746, 0xE8CB: 0x9748, 0xE8CC: 0x9742, 0xE8CD: 0x9749, 0xE8CE: 0x975C, 0xE8CF: 0x9760, 0xE8D0: 0x9764, 0xE8D1: 0x9766, 0xE8D2: 0x9768, 0xE8D3: 0x52D2, 0xE8D4: 0x976B, 0xE8D5: 0x9771, 0xE8D6: 0x9779, 0xE8D7: 0x9785, 0xE8D8: 0x977C, 0xE8D9: 0x9781, 0xE8DA: 0x977A, 0xE8DB: 0x9786, 0xE8DC: 0x978B, 0xE8DD: 0x978F, 0xE8DE: 0x9790, 0xE8DF: 0x979C, 0xE8E0: 0x97A8, 0xE8E1: 0x97A6, 0xE8E2: 0x97A3, 0xE8E3: 0x97B3, 0xE8E4: 0x97B4, 0xE8E5: 0x97C3, 0xE8E6: 0x97C6, 0xE8E7: 0x97C8, 0xE8E8: 0x97CB, 0xE8E9: 0x97DC, 0xE8EA: 0x97ED, 0xE8EB: 0x9F4F, 0xE8EC: 0x97F2, 0xE8ED: 0x7ADF, 0xE8EE: 0x97F6, 0xE8EF: 0x97F5, 0xE8F0: 0x980F, 0xE8F1: 0x980C, 0xE8F2: 0x9838, 0xE8F3: 0x9824, 0xE8F4: 0x9821, 0xE8F5: 0x9837, 0xE8F6: 0x983D, 0xE8F7: 0x9846, 0xE8F8: 0x984F, 0xE8F9: 0x984B, 0xE8FA: 0x986B, 0xE8FB: 0x986F, 0xE8FC: 0x9870, 0xE940: 0x9871, 0xE941: 0x9874, 0xE942: 0x9873, 0xE943: 0x98AA, 0xE944: 0x98AF, 0xE945: 0x98B1, 0xE946: 0x98B6, 0xE947: 0x98C4, 0xE948: 0x98C3, 0xE949: 0x98C6, 0xE94A: 0x98E9, 0xE94B: 0x98EB, 0xE94C: 0x9903, 0xE94D: 0x9909, 0xE94E: 0x9912, 0xE94F: 0x9914, 0xE950: 0x9918, 0xE951: 0x9921, 0xE952: 0x991D, 0xE953: 0x991E, 0xE954: 0x9924, 0xE955: 0x9920, 0xE956: 0x992C, 0xE957: 0x992E, 0xE958: 0x993D, 0xE959: 0x993E, 0xE95A: 0x9942, 0xE95B: 0x9949, 0xE95C: 0x9945, 0xE95D: 0x9950, 0xE95E: 0x994B, 0xE95F: 0x9951, 0xE960: 0x9952, 0xE961: 0x994C, 0xE962: 0x9955, 0xE963: 0x9997, 0xE964: 0x9998, 0xE965: 0x99A5, 0xE966: 0x99AD, 0xE967: 0x99AE, 0xE968: 0x99BC, 0xE969: 0x99DF, 0xE96A: 0x99DB, 0xE96B: 0x99DD, 0xE96C: 0x99D8, 0xE96D: 0x99D1, 0xE96E: 0x99ED, 0xE96F: 0x99EE, 0xE970: 0x99F1, 0xE971: 0x99F2, 0xE972: 0x99FB, 0xE973: 0x99F8, 0xE974: 0x9A01, 0xE975: 0x9A0F, 0xE976: 0x9A05, 0xE977: 0x99E2, 0xE978: 0x9A19, 0xE979: 0x9A2B, 0xE97A: 0x9A37, 0xE97B: 0x9A45, 0xE97C: 0x9A42, 0xE97D: 0x9A40, 0xE97E: 0x9A43, 0xE980: 0x9A3E, 0xE981: 0x9A55, 0xE982: 0x9A4D, 0xE983: 0x9A5B, 0xE984: 0x9A57, 0xE985: 0x9A5F, 0xE986: 0x9A62, 0xE987: 0x9A65, 0xE988: 0x9A64, 0xE989: 0x9A69, 0xE98A: 0x9A6B, 0xE98B: 0x9A6A, 0xE98C: 0x9AAD, 0xE98D: 0x9AB0, 0xE98E: 0x9ABC, 0xE98F: 0x9AC0, 0xE990: 0x9ACF, 0xE991: 0x9AD1, 0xE992: 0x9AD3, 0xE993: 0x9AD4, 0xE994: 0x9ADE, 0xE995: 0x9ADF, 0xE996: 0x9AE2, 0xE997: 0x9AE3, 0xE998: 0x9AE6, 0xE999: 0x9AEF, 0xE99A: 0x9AEB, 0xE99B: 0x9AEE, 0xE99C: 0x9AF4, 0xE99D: 0x9AF1, 0xE99E: 0x9AF7, 0xE99F: 0x9AFB, 0xE9A0: 0x9B06, 0xE9A1: 0x9B18, 0xE9A2: 0x9B1A, 0xE9A3: 0x9B1F, 0xE9A4: 0x9B22, 0xE9A5: 0x9B23, 0xE9A6: 0x9B25, 0xE9A7: 0x9B27, 0xE9A8: 0x9B28, 0xE9A9: 0x9B29, 0xE9AA: 0x9B2A, 0xE9AB: 0x9B2E, 0xE9AC: 0x9B2F, 0xE9AD: 0x9B32, 0xE9AE: 0x9B44, 0xE9AF: 0x9B43, 0xE9B0: 0x9B4F, 0xE9B1: 0x9B4D, 0xE9B2: 0x9B4E, 0xE9B3: 0x9B51, 0xE9B4: 0x9B58, 0xE9B5: 0x9B74, 0xE9B6: 0x9B93, 0xE9B7: 0x9B83, 0xE9B8: 0x9B91, 0xE9B9: 0x9B96, 0xE9BA: 0x9B97, 0xE9BB: 0x9B9F, 0xE9BC: 0x9BA0, 0xE9BD: 0x9BA8, 0xE9BE: 0x9BB4, 0xE9BF: 0x9BC0, 0xE9C0: 0x9BCA, 0xE9C1: 0x9BB9, 0xE9C2: 0x9BC6, 0xE9C3: 0x9BCF, 0xE9C4: 0x9BD1, 0xE9C5: 0x9BD2, 0xE9C6: 0x9BE3, 0xE9C7: 0x9BE2, 0xE9C8: 0x9BE4, 0xE9C9: 0x9BD4, 0xE9CA: 0x9BE1, 0xE9CB: 0x9C3A, 0xE9CC: 0x9BF2, 0xE9CD: 0x9BF1, 0xE9CE: 0x9BF0, 0xE9CF: 0x9C15, 0xE9D0: 0x9C14, 0xE9D1: 0x9C09, 0xE9D2: 0x9C13, 0xE9D3: 0x9C0C, 0xE9D4: 0x9C06, 0xE9D5: 0x9C08, 0xE9D6: 0x9C12, 0xE9D7: 0x9C0A, 0xE9D8: 0x9C04, 0xE9D9: 0x9C2E, 0xE9DA: 0x9C1B, 0xE9DB: 0x9C25, 0xE9DC: 0x9C24, 0xE9DD: 0x9C21, 0xE9DE: 0x9C30, 0xE9DF: 0x9C47, 0xE9E0: 0x9C32, 0xE9E1: 0x9C46, 0xE9E2: 0x9C3E, 0xE9E3: 0x9C5A, 0xE9E4: 0x9C60, 0xE9E5: 0x9C67, 0xE9E6: 0x9C76, 0xE9E7: 0x9C78, 0xE9E8: 0x9CE7, 0xE9E9: 0x9CEC, 0xE9EA: 0x9CF0, 0xE9EB: 0x9D09, 0xE9EC: 0x9D08, 0xE9ED: 0x9CEB, 0xE9EE: 0x9D03, 0xE9EF: 0x9D06, 0xE9F0: 0x9D2A, 0xE9F1: 0x9D26, 0xE9F2: 0x9DAF, 0xE9F3: 0x9D23, 0xE9F4: 0x9D1F, 0xE9F5: 0x9D44, 0xE9F6: 0x9D15, 0xE9F7: 0x9D12, 0xE9F8: 0x9D41, 0xE9F9: 0x9D3F, 0xE9FA: 0x9D3E, 0xE9FB: 0x9D46, 0xE9FC: 0x9D48, 0xEA40: 0x9D5D, 0xEA41: 0x9D5E, 0xEA42: 0x9D64, 0xEA43: 0x9D51, 0xEA44: 0x9D50, 0xEA45: 0x9D59, 0xEA46: 0x9D72, 0xEA47: 0x9D89, 0xEA48: 0x9D87, 0xEA49: 0x9DAB, 0xEA4A: 0x9D6F, 0xEA4B: 0x9D7A, 0xEA4C: 0x9D9A, 0xEA4D: 0x9DA4, 0xEA4E: 0x9DA9, 0xEA4F: 0x9DB2, 0xEA50: 0x9DC4, 0xEA51: 0x9DC1, 0xEA52: 0x9DBB, 0xEA53: 0x9DB8, 0xEA54: 0x9DBA, 0xEA55: 0x9DC6, 0xEA56: 0x9DCF, 0xEA57: 0x9DC2, 0xEA58: 0x9DD9, 0xEA59: 0x9DD3, 0xEA5A: 0x9DF8, 0xEA5B: 0x9DE6, 0xEA5C: 0x9DED, 0xEA5D: 0x9DEF, 0xEA5E: 0x9DFD, 0xEA5F: 0x9E1A, 0xEA60: 0x9E1B, 0xEA61: 0x9E1E, 0xEA62: 0x9E75, 0xEA63: 0x9E79, 0xEA64: 0x9E7D, 0xEA65: 0x9E81, 0xEA66: 0x9E88, 0xEA67: 0x9E8B, 0xEA68: 0x9E8C, 0xEA69: 0x9E92, 0xEA6A: 0x9E95, 0xEA6B: 0x9E91, 0xEA6C: 0x9E9D, 0xEA6D: 0x9EA5, 0xEA6E: 0x9EA9, 0xEA6F: 0x9EB8, 0xEA70: 0x9EAA, 0xEA71: 0x9EAD, 0xEA72: 0x9761, 0xEA73: 0x9ECC, 0xEA74: 0x9ECE, 0xEA75: 0x9ECF, 0xEA76: 0x9ED0, 0xEA77: 0x9ED4, 0xEA78: 0x9EDC, 0xEA79: 0x9EDE, 0xEA7A: 0x9EDD, 0xEA7B: 0x9EE0, 0xEA7C: 0x9EE5, 0xEA7D: 0x9EE8, 0xEA7E: 0x9EEF, 0xEA80: 0x9EF4, 0xEA81: 0x9EF6, 0xEA82: 0x9EF7, 0xEA83: 0x9EF9, 0xEA84: 0x9EFB, 0xEA85: 0x9EFC, 0xEA86: 0x9EFD, 0xEA87: 0x9F07, 0xEA88: 0x9F08, 0xEA89: 0x76B7, 0xEA8A: 0x9F15, 0xEA8B: 0x9F21, 0xEA8C: 0x9F2C, 0xEA8D: 0x9F3E, 0xEA8E: 0x9F4A, 0xEA8F: 0x9F52, 0xEA90: 0x9F54, 0xEA91: 0x9F63, 0xEA92: 0x9F5F, 0xEA93: 0x9F60, 0xEA94: 0x9F61, 0xEA95: 0x9F66, 0xEA96: 0x9F67, 0xEA97: 0x9F6C, 0xEA98: 0x9F6A, 0xEA99: 0x9F77, 0xEA9A: 0x9F72, 0xEA9B: 0x9F76, 0xEA9C: 0x9F95, 0xEA9D: 0x9F9C, 0xEA9E: 0x9FA0, 0xEA9F: 0x582F, 0xEAA0: 0x69C7, 0xEAA1: 0x9059, 0xEAA2: 0x7464, 0xEAA3: 0x51DC, 0xEAA4: 0x7199, }; /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var GenericGF_1 = __webpack_require__(1); var GenericGFPoly_1 = __webpack_require__(2); function runEuclideanAlgorithm(field, a, b, R) { var _a; // Assume a's degree is >= b's if (a.degree() < b.degree()) { _a = [b, a], a = _a[0], b = _a[1]; } var rLast = a; var r = b; var tLast = field.zero; var t = field.one; // Run Euclidean algorithm until r's degree is less than R/2 while (r.degree() >= R / 2) { var rLastLast = rLast; var tLastLast = tLast; rLast = r; tLast = t; // Divide rLastLast by rLast, with quotient in q and remainder in r if (rLast.isZero()) { // Euclidean algorithm already terminated? return null; } r = rLastLast; var q = field.zero; var denominatorLeadingTerm = rLast.getCoefficient(rLast.degree()); var dltInverse = field.inverse(denominatorLeadingTerm); while (r.degree() >= rLast.degree() && !r.isZero()) { var degreeDiff = r.degree() - rLast.degree(); var scale = field.multiply(r.getCoefficient(r.degree()), dltInverse); q = q.addOrSubtract(field.buildMonomial(degreeDiff, scale)); r = r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff, scale)); } t = q.multiplyPoly(tLast).addOrSubtract(tLastLast); if (r.degree() >= rLast.degree()) { return null; } } var sigmaTildeAtZero = t.getCoefficient(0); if (sigmaTildeAtZero === 0) { return null; } var inverse = field.inverse(sigmaTildeAtZero); return [t.multiply(inverse), r.multiply(inverse)]; } function findErrorLocations(field, errorLocator) { // This is a direct application of Chien's search var numErrors = errorLocator.degree(); if (numErrors === 1) { return [errorLocator.getCoefficient(1)]; } var result = new Array(numErrors); var errorCount = 0; for (var i = 1; i < field.size && errorCount < numErrors; i++) { if (errorLocator.evaluateAt(i) === 0) { result[errorCount] = field.inverse(i); errorCount++; } } if (errorCount !== numErrors) { return null; } return result; } function findErrorMagnitudes(field, errorEvaluator, errorLocations) { // This is directly applying Forney's Formula var s = errorLocations.length; var result = new Array(s); for (var i = 0; i < s; i++) { var xiInverse = field.inverse(errorLocations[i]); var denominator = 1; for (var j = 0; j < s; j++) { if (i !== j) { denominator = field.multiply(denominator, GenericGF_1.addOrSubtractGF(1, field.multiply(errorLocations[j], xiInverse))); } } result[i] = field.multiply(errorEvaluator.evaluateAt(xiInverse), field.inverse(denominator)); if (field.generatorBase !== 0) { result[i] = field.multiply(result[i], xiInverse); } } return result; } function decode(bytes, twoS) { var outputBytes = new Uint8ClampedArray(bytes.length); outputBytes.set(bytes); var field = new GenericGF_1.default(0x011D, 256, 0); // x^8 + x^4 + x^3 + x^2 + 1 var poly = new GenericGFPoly_1.default(field, outputBytes); var syndromeCoefficients = new Uint8ClampedArray(twoS); var error = false; for (var s = 0; s < twoS; s++) { var evaluation = poly.evaluateAt(field.exp(s + field.generatorBase)); syndromeCoefficients[syndromeCoefficients.length - 1 - s] = evaluation; if (evaluation !== 0) { error = true; } } if (!error) { return outputBytes; } var syndrome = new GenericGFPoly_1.default(field, syndromeCoefficients); var sigmaOmega = runEuclideanAlgorithm(field, field.buildMonomial(twoS, 1), syndrome, twoS); if (sigmaOmega === null) { return null; } var errorLocations = findErrorLocations(field, sigmaOmega[0]); if (errorLocations == null) { return null; } var errorMagnitudes = findErrorMagnitudes(field, sigmaOmega[1], errorLocations); for (var i = 0; i < errorLocations.length; i++) { var position = outputBytes.length - 1 - field.log(errorLocations[i]); if (position < 0) { return null; } outputBytes[position] = GenericGF_1.addOrSubtractGF(outputBytes[position], errorMagnitudes[i]); } return outputBytes; } exports.decode = decode; /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.VERSIONS = [ { infoBits: null, versionNumber: 1, alignmentPatternCenters: [], errorCorrectionLevels: [ { ecCodewordsPerBlock: 7, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 19 }], }, { ecCodewordsPerBlock: 10, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }], }, { ecCodewordsPerBlock: 13, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 13 }], }, { ecCodewordsPerBlock: 17, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 9 }], }, ], }, { infoBits: null, versionNumber: 2, alignmentPatternCenters: [6, 18], errorCorrectionLevels: [ { ecCodewordsPerBlock: 10, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 34 }], }, { ecCodewordsPerBlock: 16, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 28 }], }, { ecCodewordsPerBlock: 22, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 22 }], }, { ecCodewordsPerBlock: 28, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }], }, ], }, { infoBits: null, versionNumber: 3, alignmentPatternCenters: [6, 22], errorCorrectionLevels: [ { ecCodewordsPerBlock: 15, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 55 }], }, { ecCodewordsPerBlock: 26, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 44 }], }, { ecCodewordsPerBlock: 18, ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 17 }], }, { ecCodewordsPerBlock: 22, ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 13 }], }, ], }, { infoBits: null, versionNumber: 4, alignmentPatternCenters: [6, 26], errorCorrectionLevels: [ { ecCodewordsPerBlock: 20, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 80 }], }, { ecCodewordsPerBlock: 18, ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 32 }], }, { ecCodewordsPerBlock: 26, ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 24 }], }, { ecCodewordsPerBlock: 16, ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 9 }], }, ], }, { infoBits: null, versionNumber: 5, alignmentPatternCenters: [6, 30], errorCorrectionLevels: [ { ecCodewordsPerBlock: 26, ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 108 }], }, { ecCodewordsPerBlock: 24, ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 43 }], }, { ecCodewordsPerBlock: 18, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 15 }, { numBlocks: 2, dataCodewordsPerBlock: 16 }, ], }, { ecCodewordsPerBlock: 22, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 11 }, { numBlocks: 2, dataCodewordsPerBlock: 12 }, ], }, ], }, { infoBits: null, versionNumber: 6, alignmentPatternCenters: [6, 34], errorCorrectionLevels: [ { ecCodewordsPerBlock: 18, ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 68 }], }, { ecCodewordsPerBlock: 16, ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 27 }], }, { ecCodewordsPerBlock: 24, ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 19 }], }, { ecCodewordsPerBlock: 28, ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 15 }], }, ], }, { infoBits: 0x07C94, versionNumber: 7, alignmentPatternCenters: [6, 22, 38], errorCorrectionLevels: [ { ecCodewordsPerBlock: 20, ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 78 }], }, { ecCodewordsPerBlock: 18, ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 31 }], }, { ecCodewordsPerBlock: 18, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 14 }, { numBlocks: 4, dataCodewordsPerBlock: 15 }, ], }, { ecCodewordsPerBlock: 26, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 13 }, { numBlocks: 1, dataCodewordsPerBlock: 14 }, ], }, ], }, { infoBits: 0x085BC, versionNumber: 8, alignmentPatternCenters: [6, 24, 42], errorCorrectionLevels: [ { ecCodewordsPerBlock: 24, ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 97 }], }, { ecCodewordsPerBlock: 22, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 38 }, { numBlocks: 2, dataCodewordsPerBlock: 39 }, ], }, { ecCodewordsPerBlock: 22, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 18 }, { numBlocks: 2, dataCodewordsPerBlock: 19 }, ], }, { ecCodewordsPerBlock: 26, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 14 }, { numBlocks: 2, dataCodewordsPerBlock: 15 }, ], }, ], }, { infoBits: 0x09A99, versionNumber: 9, alignmentPatternCenters: [6, 26, 46], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 116 }], }, { ecCodewordsPerBlock: 22, ecBlocks: [ { numBlocks: 3, dataCodewordsPerBlock: 36 }, { numBlocks: 2, dataCodewordsPerBlock: 37 }, ], }, { ecCodewordsPerBlock: 20, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 16 }, { numBlocks: 4, dataCodewordsPerBlock: 17 }, ], }, { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 12 }, { numBlocks: 4, dataCodewordsPerBlock: 13 }, ], }, ], }, { infoBits: 0x0A4D3, versionNumber: 10, alignmentPatternCenters: [6, 28, 50], errorCorrectionLevels: [ { ecCodewordsPerBlock: 18, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 68 }, { numBlocks: 2, dataCodewordsPerBlock: 69 }, ], }, { ecCodewordsPerBlock: 26, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 43 }, { numBlocks: 1, dataCodewordsPerBlock: 44 }, ], }, { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 6, dataCodewordsPerBlock: 19 }, { numBlocks: 2, dataCodewordsPerBlock: 20 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 6, dataCodewordsPerBlock: 15 }, { numBlocks: 2, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x0BBF6, versionNumber: 11, alignmentPatternCenters: [6, 30, 54], errorCorrectionLevels: [ { ecCodewordsPerBlock: 20, ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 81 }], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 1, dataCodewordsPerBlock: 50 }, { numBlocks: 4, dataCodewordsPerBlock: 51 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 22 }, { numBlocks: 4, dataCodewordsPerBlock: 23 }, ], }, { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 3, dataCodewordsPerBlock: 12 }, { numBlocks: 8, dataCodewordsPerBlock: 13 }, ], }, ], }, { infoBits: 0x0C762, versionNumber: 12, alignmentPatternCenters: [6, 32, 58], errorCorrectionLevels: [ { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 92 }, { numBlocks: 2, dataCodewordsPerBlock: 93 }, ], }, { ecCodewordsPerBlock: 22, ecBlocks: [ { numBlocks: 6, dataCodewordsPerBlock: 36 }, { numBlocks: 2, dataCodewordsPerBlock: 37 }, ], }, { ecCodewordsPerBlock: 26, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 20 }, { numBlocks: 6, dataCodewordsPerBlock: 21 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 7, dataCodewordsPerBlock: 14 }, { numBlocks: 4, dataCodewordsPerBlock: 15 }, ], }, ], }, { infoBits: 0x0D847, versionNumber: 13, alignmentPatternCenters: [6, 34, 62], errorCorrectionLevels: [ { ecCodewordsPerBlock: 26, ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 107 }], }, { ecCodewordsPerBlock: 22, ecBlocks: [ { numBlocks: 8, dataCodewordsPerBlock: 37 }, { numBlocks: 1, dataCodewordsPerBlock: 38 }, ], }, { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 8, dataCodewordsPerBlock: 20 }, { numBlocks: 4, dataCodewordsPerBlock: 21 }, ], }, { ecCodewordsPerBlock: 22, ecBlocks: [ { numBlocks: 12, dataCodewordsPerBlock: 11 }, { numBlocks: 4, dataCodewordsPerBlock: 12 }, ], }, ], }, { infoBits: 0x0E60D, versionNumber: 14, alignmentPatternCenters: [6, 26, 46, 66], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 3, dataCodewordsPerBlock: 115 }, { numBlocks: 1, dataCodewordsPerBlock: 116 }, ], }, { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 40 }, { numBlocks: 5, dataCodewordsPerBlock: 41 }, ], }, { ecCodewordsPerBlock: 20, ecBlocks: [ { numBlocks: 11, dataCodewordsPerBlock: 16 }, { numBlocks: 5, dataCodewordsPerBlock: 17 }, ], }, { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 11, dataCodewordsPerBlock: 12 }, { numBlocks: 5, dataCodewordsPerBlock: 13 }, ], }, ], }, { infoBits: 0x0F928, versionNumber: 15, alignmentPatternCenters: [6, 26, 48, 70], errorCorrectionLevels: [ { ecCodewordsPerBlock: 22, ecBlocks: [ { numBlocks: 5, dataCodewordsPerBlock: 87 }, { numBlocks: 1, dataCodewordsPerBlock: 88 }, ], }, { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 5, dataCodewordsPerBlock: 41 }, { numBlocks: 5, dataCodewordsPerBlock: 42 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 5, dataCodewordsPerBlock: 24 }, { numBlocks: 7, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 11, dataCodewordsPerBlock: 12 }, { numBlocks: 7, dataCodewordsPerBlock: 13 }, ], }, ], }, { infoBits: 0x10B78, versionNumber: 16, alignmentPatternCenters: [6, 26, 50, 74], errorCorrectionLevels: [ { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 5, dataCodewordsPerBlock: 98 }, { numBlocks: 1, dataCodewordsPerBlock: 99 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 7, dataCodewordsPerBlock: 45 }, { numBlocks: 3, dataCodewordsPerBlock: 46 }, ], }, { ecCodewordsPerBlock: 24, ecBlocks: [ { numBlocks: 15, dataCodewordsPerBlock: 19 }, { numBlocks: 2, dataCodewordsPerBlock: 20 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 3, dataCodewordsPerBlock: 15 }, { numBlocks: 13, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x1145D, versionNumber: 17, alignmentPatternCenters: [6, 30, 54, 78], errorCorrectionLevels: [ { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 1, dataCodewordsPerBlock: 107 }, { numBlocks: 5, dataCodewordsPerBlock: 108 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 10, dataCodewordsPerBlock: 46 }, { numBlocks: 1, dataCodewordsPerBlock: 47 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 1, dataCodewordsPerBlock: 22 }, { numBlocks: 15, dataCodewordsPerBlock: 23 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 14 }, { numBlocks: 17, dataCodewordsPerBlock: 15 }, ], }, ], }, { infoBits: 0x12A17, versionNumber: 18, alignmentPatternCenters: [6, 30, 56, 82], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 5, dataCodewordsPerBlock: 120 }, { numBlocks: 1, dataCodewordsPerBlock: 121 }, ], }, { ecCodewordsPerBlock: 26, ecBlocks: [ { numBlocks: 9, dataCodewordsPerBlock: 43 }, { numBlocks: 4, dataCodewordsPerBlock: 44 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 17, dataCodewordsPerBlock: 22 }, { numBlocks: 1, dataCodewordsPerBlock: 23 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 14 }, { numBlocks: 19, dataCodewordsPerBlock: 15 }, ], }, ], }, { infoBits: 0x13532, versionNumber: 19, alignmentPatternCenters: [6, 30, 58, 86], errorCorrectionLevels: [ { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 3, dataCodewordsPerBlock: 113 }, { numBlocks: 4, dataCodewordsPerBlock: 114 }, ], }, { ecCodewordsPerBlock: 26, ecBlocks: [ { numBlocks: 3, dataCodewordsPerBlock: 44 }, { numBlocks: 11, dataCodewordsPerBlock: 45 }, ], }, { ecCodewordsPerBlock: 26, ecBlocks: [ { numBlocks: 17, dataCodewordsPerBlock: 21 }, { numBlocks: 4, dataCodewordsPerBlock: 22 }, ], }, { ecCodewordsPerBlock: 26, ecBlocks: [ { numBlocks: 9, dataCodewordsPerBlock: 13 }, { numBlocks: 16, dataCodewordsPerBlock: 14 }, ], }, ], }, { infoBits: 0x149A6, versionNumber: 20, alignmentPatternCenters: [6, 34, 62, 90], errorCorrectionLevels: [ { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 3, dataCodewordsPerBlock: 107 }, { numBlocks: 5, dataCodewordsPerBlock: 108 }, ], }, { ecCodewordsPerBlock: 26, ecBlocks: [ { numBlocks: 3, dataCodewordsPerBlock: 41 }, { numBlocks: 13, dataCodewordsPerBlock: 42 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 15, dataCodewordsPerBlock: 24 }, { numBlocks: 5, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 15, dataCodewordsPerBlock: 15 }, { numBlocks: 10, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x15683, versionNumber: 21, alignmentPatternCenters: [6, 28, 50, 72, 94], errorCorrectionLevels: [ { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 116 }, { numBlocks: 4, dataCodewordsPerBlock: 117 }, ], }, { ecCodewordsPerBlock: 26, ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 42 }], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 17, dataCodewordsPerBlock: 22 }, { numBlocks: 6, dataCodewordsPerBlock: 23 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 19, dataCodewordsPerBlock: 16 }, { numBlocks: 6, dataCodewordsPerBlock: 17 }, ], }, ], }, { infoBits: 0x168C9, versionNumber: 22, alignmentPatternCenters: [6, 26, 50, 74, 98], errorCorrectionLevels: [ { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 111 }, { numBlocks: 7, dataCodewordsPerBlock: 112 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 46 }], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 7, dataCodewordsPerBlock: 24 }, { numBlocks: 16, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 24, ecBlocks: [{ numBlocks: 34, dataCodewordsPerBlock: 13 }], }, ], }, { infoBits: 0x177EC, versionNumber: 23, alignmentPatternCenters: [6, 30, 54, 74, 102], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 121 }, { numBlocks: 5, dataCodewordsPerBlock: 122 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 47 }, { numBlocks: 14, dataCodewordsPerBlock: 48 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 11, dataCodewordsPerBlock: 24 }, { numBlocks: 14, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 16, dataCodewordsPerBlock: 15 }, { numBlocks: 14, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x18EC4, versionNumber: 24, alignmentPatternCenters: [6, 28, 54, 80, 106], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 6, dataCodewordsPerBlock: 117 }, { numBlocks: 4, dataCodewordsPerBlock: 118 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 6, dataCodewordsPerBlock: 45 }, { numBlocks: 14, dataCodewordsPerBlock: 46 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 11, dataCodewordsPerBlock: 24 }, { numBlocks: 16, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 30, dataCodewordsPerBlock: 16 }, { numBlocks: 2, dataCodewordsPerBlock: 17 }, ], }, ], }, { infoBits: 0x191E1, versionNumber: 25, alignmentPatternCenters: [6, 32, 58, 84, 110], errorCorrectionLevels: [ { ecCodewordsPerBlock: 26, ecBlocks: [ { numBlocks: 8, dataCodewordsPerBlock: 106 }, { numBlocks: 4, dataCodewordsPerBlock: 107 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 8, dataCodewordsPerBlock: 47 }, { numBlocks: 13, dataCodewordsPerBlock: 48 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 7, dataCodewordsPerBlock: 24 }, { numBlocks: 22, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 22, dataCodewordsPerBlock: 15 }, { numBlocks: 13, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x1AFAB, versionNumber: 26, alignmentPatternCenters: [6, 30, 58, 86, 114], errorCorrectionLevels: [ { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 10, dataCodewordsPerBlock: 114 }, { numBlocks: 2, dataCodewordsPerBlock: 115 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 19, dataCodewordsPerBlock: 46 }, { numBlocks: 4, dataCodewordsPerBlock: 47 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 28, dataCodewordsPerBlock: 22 }, { numBlocks: 6, dataCodewordsPerBlock: 23 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 33, dataCodewordsPerBlock: 16 }, { numBlocks: 4, dataCodewordsPerBlock: 17 }, ], }, ], }, { infoBits: 0x1B08E, versionNumber: 27, alignmentPatternCenters: [6, 34, 62, 90, 118], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 8, dataCodewordsPerBlock: 122 }, { numBlocks: 4, dataCodewordsPerBlock: 123 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 22, dataCodewordsPerBlock: 45 }, { numBlocks: 3, dataCodewordsPerBlock: 46 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 8, dataCodewordsPerBlock: 23 }, { numBlocks: 26, dataCodewordsPerBlock: 24 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 12, dataCodewordsPerBlock: 15 }, { numBlocks: 28, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x1CC1A, versionNumber: 28, alignmentPatternCenters: [6, 26, 50, 74, 98, 122], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 3, dataCodewordsPerBlock: 117 }, { numBlocks: 10, dataCodewordsPerBlock: 118 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 3, dataCodewordsPerBlock: 45 }, { numBlocks: 23, dataCodewordsPerBlock: 46 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 24 }, { numBlocks: 31, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 11, dataCodewordsPerBlock: 15 }, { numBlocks: 31, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x1D33F, versionNumber: 29, alignmentPatternCenters: [6, 30, 54, 78, 102, 126], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 7, dataCodewordsPerBlock: 116 }, { numBlocks: 7, dataCodewordsPerBlock: 117 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 21, dataCodewordsPerBlock: 45 }, { numBlocks: 7, dataCodewordsPerBlock: 46 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 1, dataCodewordsPerBlock: 23 }, { numBlocks: 37, dataCodewordsPerBlock: 24 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 19, dataCodewordsPerBlock: 15 }, { numBlocks: 26, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x1ED75, versionNumber: 30, alignmentPatternCenters: [6, 26, 52, 78, 104, 130], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 5, dataCodewordsPerBlock: 115 }, { numBlocks: 10, dataCodewordsPerBlock: 116 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 19, dataCodewordsPerBlock: 47 }, { numBlocks: 10, dataCodewordsPerBlock: 48 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 15, dataCodewordsPerBlock: 24 }, { numBlocks: 25, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 23, dataCodewordsPerBlock: 15 }, { numBlocks: 25, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x1F250, versionNumber: 31, alignmentPatternCenters: [6, 30, 56, 82, 108, 134], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 13, dataCodewordsPerBlock: 115 }, { numBlocks: 3, dataCodewordsPerBlock: 116 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 46 }, { numBlocks: 29, dataCodewordsPerBlock: 47 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 42, dataCodewordsPerBlock: 24 }, { numBlocks: 1, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 23, dataCodewordsPerBlock: 15 }, { numBlocks: 28, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x209D5, versionNumber: 32, alignmentPatternCenters: [6, 34, 60, 86, 112, 138], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 115 }], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 10, dataCodewordsPerBlock: 46 }, { numBlocks: 23, dataCodewordsPerBlock: 47 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 10, dataCodewordsPerBlock: 24 }, { numBlocks: 35, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 19, dataCodewordsPerBlock: 15 }, { numBlocks: 35, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x216F0, versionNumber: 33, alignmentPatternCenters: [6, 30, 58, 86, 114, 142], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 17, dataCodewordsPerBlock: 115 }, { numBlocks: 1, dataCodewordsPerBlock: 116 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 14, dataCodewordsPerBlock: 46 }, { numBlocks: 21, dataCodewordsPerBlock: 47 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 29, dataCodewordsPerBlock: 24 }, { numBlocks: 19, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 11, dataCodewordsPerBlock: 15 }, { numBlocks: 46, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x228BA, versionNumber: 34, alignmentPatternCenters: [6, 34, 62, 90, 118, 146], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 13, dataCodewordsPerBlock: 115 }, { numBlocks: 6, dataCodewordsPerBlock: 116 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 14, dataCodewordsPerBlock: 46 }, { numBlocks: 23, dataCodewordsPerBlock: 47 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 44, dataCodewordsPerBlock: 24 }, { numBlocks: 7, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 59, dataCodewordsPerBlock: 16 }, { numBlocks: 1, dataCodewordsPerBlock: 17 }, ], }, ], }, { infoBits: 0x2379F, versionNumber: 35, alignmentPatternCenters: [6, 30, 54, 78, 102, 126, 150], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 12, dataCodewordsPerBlock: 121 }, { numBlocks: 7, dataCodewordsPerBlock: 122 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 12, dataCodewordsPerBlock: 47 }, { numBlocks: 26, dataCodewordsPerBlock: 48 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 39, dataCodewordsPerBlock: 24 }, { numBlocks: 14, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 22, dataCodewordsPerBlock: 15 }, { numBlocks: 41, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x24B0B, versionNumber: 36, alignmentPatternCenters: [6, 24, 50, 76, 102, 128, 154], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 6, dataCodewordsPerBlock: 121 }, { numBlocks: 14, dataCodewordsPerBlock: 122 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 6, dataCodewordsPerBlock: 47 }, { numBlocks: 34, dataCodewordsPerBlock: 48 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 46, dataCodewordsPerBlock: 24 }, { numBlocks: 10, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 2, dataCodewordsPerBlock: 15 }, { numBlocks: 64, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x2542E, versionNumber: 37, alignmentPatternCenters: [6, 28, 54, 80, 106, 132, 158], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 17, dataCodewordsPerBlock: 122 }, { numBlocks: 4, dataCodewordsPerBlock: 123 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 29, dataCodewordsPerBlock: 46 }, { numBlocks: 14, dataCodewordsPerBlock: 47 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 49, dataCodewordsPerBlock: 24 }, { numBlocks: 10, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 24, dataCodewordsPerBlock: 15 }, { numBlocks: 46, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x26A64, versionNumber: 38, alignmentPatternCenters: [6, 32, 58, 84, 110, 136, 162], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 4, dataCodewordsPerBlock: 122 }, { numBlocks: 18, dataCodewordsPerBlock: 123 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 13, dataCodewordsPerBlock: 46 }, { numBlocks: 32, dataCodewordsPerBlock: 47 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 48, dataCodewordsPerBlock: 24 }, { numBlocks: 14, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 42, dataCodewordsPerBlock: 15 }, { numBlocks: 32, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x27541, versionNumber: 39, alignmentPatternCenters: [6, 26, 54, 82, 110, 138, 166], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 20, dataCodewordsPerBlock: 117 }, { numBlocks: 4, dataCodewordsPerBlock: 118 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 40, dataCodewordsPerBlock: 47 }, { numBlocks: 7, dataCodewordsPerBlock: 48 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 43, dataCodewordsPerBlock: 24 }, { numBlocks: 22, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 10, dataCodewordsPerBlock: 15 }, { numBlocks: 67, dataCodewordsPerBlock: 16 }, ], }, ], }, { infoBits: 0x28C69, versionNumber: 40, alignmentPatternCenters: [6, 30, 58, 86, 114, 142, 170], errorCorrectionLevels: [ { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 19, dataCodewordsPerBlock: 118 }, { numBlocks: 6, dataCodewordsPerBlock: 119 }, ], }, { ecCodewordsPerBlock: 28, ecBlocks: [ { numBlocks: 18, dataCodewordsPerBlock: 47 }, { numBlocks: 31, dataCodewordsPerBlock: 48 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 34, dataCodewordsPerBlock: 24 }, { numBlocks: 34, dataCodewordsPerBlock: 25 }, ], }, { ecCodewordsPerBlock: 30, ecBlocks: [ { numBlocks: 20, dataCodewordsPerBlock: 15 }, { numBlocks: 61, dataCodewordsPerBlock: 16 }, ], }, ], }, ]; /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var BitMatrix_1 = __webpack_require__(0); function squareToQuadrilateral(p1, p2, p3, p4) { var dx3 = p1.x - p2.x + p3.x - p4.x; var dy3 = p1.y - p2.y + p3.y - p4.y; if (dx3 === 0 && dy3 === 0) { // Affine return { a11: p2.x - p1.x, a12: p2.y - p1.y, a13: 0, a21: p3.x - p2.x, a22: p3.y - p2.y, a23: 0, a31: p1.x, a32: p1.y, a33: 1, }; } else { var dx1 = p2.x - p3.x; var dx2 = p4.x - p3.x; var dy1 = p2.y - p3.y; var dy2 = p4.y - p3.y; var denominator = dx1 * dy2 - dx2 * dy1; var a13 = (dx3 * dy2 - dx2 * dy3) / denominator; var a23 = (dx1 * dy3 - dx3 * dy1) / denominator; return { a11: p2.x - p1.x + a13 * p2.x, a12: p2.y - p1.y + a13 * p2.y, a13: a13, a21: p4.x - p1.x + a23 * p4.x, a22: p4.y - p1.y + a23 * p4.y, a23: a23, a31: p1.x, a32: p1.y, a33: 1, }; } } function quadrilateralToSquare(p1, p2, p3, p4) { // Here, the adjoint serves as the inverse: var sToQ = squareToQuadrilateral(p1, p2, p3, p4); return { a11: sToQ.a22 * sToQ.a33 - sToQ.a23 * sToQ.a32, a12: sToQ.a13 * sToQ.a32 - sToQ.a12 * sToQ.a33, a13: sToQ.a12 * sToQ.a23 - sToQ.a13 * sToQ.a22, a21: sToQ.a23 * sToQ.a31 - sToQ.a21 * sToQ.a33, a22: sToQ.a11 * sToQ.a33 - sToQ.a13 * sToQ.a31, a23: sToQ.a13 * sToQ.a21 - sToQ.a11 * sToQ.a23, a31: sToQ.a21 * sToQ.a32 - sToQ.a22 * sToQ.a31, a32: sToQ.a12 * sToQ.a31 - sToQ.a11 * sToQ.a32, a33: sToQ.a11 * sToQ.a22 - sToQ.a12 * sToQ.a21, }; } function times(a, b) { return { a11: a.a11 * b.a11 + a.a21 * b.a12 + a.a31 * b.a13, a12: a.a12 * b.a11 + a.a22 * b.a12 + a.a32 * b.a13, a13: a.a13 * b.a11 + a.a23 * b.a12 + a.a33 * b.a13, a21: a.a11 * b.a21 + a.a21 * b.a22 + a.a31 * b.a23, a22: a.a12 * b.a21 + a.a22 * b.a22 + a.a32 * b.a23, a23: a.a13 * b.a21 + a.a23 * b.a22 + a.a33 * b.a23, a31: a.a11 * b.a31 + a.a21 * b.a32 + a.a31 * b.a33, a32: a.a12 * b.a31 + a.a22 * b.a32 + a.a32 * b.a33, a33: a.a13 * b.a31 + a.a23 * b.a32 + a.a33 * b.a33, }; } function extract(image, location) { var qToS = quadrilateralToSquare({ x: 3.5, y: 3.5 }, { x: location.dimension - 3.5, y: 3.5 }, { x: location.dimension - 6.5, y: location.dimension - 6.5 }, { x: 3.5, y: location.dimension - 3.5 }); var sToQ = squareToQuadrilateral(location.topLeft, location.topRight, location.alignmentPattern, location.bottomLeft); var transform = times(sToQ, qToS); var matrix = BitMatrix_1.BitMatrix.createEmpty(location.dimension, location.dimension); var mappingFunction = function (x, y) { var denominator = transform.a13 * x + transform.a23 * y + transform.a33; return { x: (transform.a11 * x + transform.a21 * y + transform.a31) / denominator, y: (transform.a12 * x + transform.a22 * y + transform.a32) / denominator, }; }; for (var y = 0; y < location.dimension; y++) { for (var x = 0; x < location.dimension; x++) { var xValue = x + 0.5; var yValue = y + 0.5; var sourcePixel = mappingFunction(xValue, yValue); matrix.set(x, y, image.get(Math.floor(sourcePixel.x), Math.floor(sourcePixel.y))); } } return { matrix: matrix, mappingFunction: mappingFunction, }; } exports.extract = extract; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var MAX_FINDERPATTERNS_TO_SEARCH = 4; var MIN_QUAD_RATIO = 0.5; var MAX_QUAD_RATIO = 1.5; var distance = function (a, b) { return Math.sqrt(Math.pow((b.x - a.x), 2) + Math.pow((b.y - a.y), 2)); }; function sum(values) { return values.reduce(function (a, b) { return a + b; }); } // Takes three finder patterns and organizes them into topLeft, topRight, etc function reorderFinderPatterns(pattern1, pattern2, pattern3) { var _a, _b, _c, _d; // Find distances between pattern centers var oneTwoDistance = distance(pattern1, pattern2); var twoThreeDistance = distance(pattern2, pattern3); var oneThreeDistance = distance(pattern1, pattern3); var bottomLeft; var topLeft; var topRight; // Assume one closest to other two is B; A and C will just be guesses at first if (twoThreeDistance >= oneTwoDistance && twoThreeDistance >= oneThreeDistance) { _a = [pattern2, pattern1, pattern3], bottomLeft = _a[0], topLeft = _a[1], topRight = _a[2]; } else if (oneThreeDistance >= twoThreeDistance && oneThreeDistance >= oneTwoDistance) { _b = [pattern1, pattern2, pattern3], bottomLeft = _b[0], topLeft = _b[1], topRight = _b[2]; } else { _c = [pattern1, pattern3, pattern2], bottomLeft = _c[0], topLeft = _c[1], topRight = _c[2]; } // Use cross product to figure out whether bottomLeft (A) and topRight (C) are correct or flipped in relation to topLeft (B) // This asks whether BC x BA has a positive z component, which is the arrangement we want. If it's negative, then // we've got it flipped around and should swap topRight and bottomLeft. if (((topRight.x - topLeft.x) * (bottomLeft.y - topLeft.y)) - ((topRight.y - topLeft.y) * (bottomLeft.x - topLeft.x)) < 0) { _d = [topRight, bottomLeft], bottomLeft = _d[0], topRight = _d[1]; } return { bottomLeft: bottomLeft, topLeft: topLeft, topRight: topRight }; } // Computes the dimension (number of modules on a side) of the QR Code based on the position of the finder patterns function computeDimension(topLeft, topRight, bottomLeft, matrix) { var moduleSize = (sum(countBlackWhiteRun(topLeft, bottomLeft, matrix, 5)) / 7 + // Divide by 7 since the ratio is 1:1:3:1:1 sum(countBlackWhiteRun(topLeft, topRight, matrix, 5)) / 7 + sum(countBlackWhiteRun(bottomLeft, topLeft, matrix, 5)) / 7 + sum(countBlackWhiteRun(topRight, topLeft, matrix, 5)) / 7) / 4; if (moduleSize < 1) { throw new Error("Invalid module size"); } var topDimension = Math.round(distance(topLeft, topRight) / moduleSize); var sideDimension = Math.round(distance(topLeft, bottomLeft) / moduleSize); var dimension = Math.floor((topDimension + sideDimension) / 2) + 7; switch (dimension % 4) { case 0: dimension++; break; case 2: dimension--; break; } return { dimension: dimension, moduleSize: moduleSize }; } // Takes an origin point and an end point and counts the sizes of the black white run from the origin towards the end point. // Returns an array of elements, representing the pixel size of the black white run. // Uses a variant of http://en.wikipedia.org/wiki/Bresenham's_line_algorithm function countBlackWhiteRunTowardsPoint(origin, end, matrix, length) { var switchPoints = [{ x: Math.floor(origin.x), y: Math.floor(origin.y) }]; var steep = Math.abs(end.y - origin.y) > Math.abs(end.x - origin.x); var fromX; var fromY; var toX; var toY; if (steep) { fromX = Math.floor(origin.y); fromY = Math.floor(origin.x); toX = Math.floor(end.y); toY = Math.floor(end.x); } else { fromX = Math.floor(origin.x); fromY = Math.floor(origin.y); toX = Math.floor(end.x); toY = Math.floor(end.y); } var dx = Math.abs(toX - fromX); var dy = Math.abs(toY - fromY); var error = Math.floor(-dx / 2); var xStep = fromX < toX ? 1 : -1; var yStep = fromY < toY ? 1 : -1; var currentPixel = true; // Loop up until x == toX, but not beyond for (var x = fromX, y = fromY; x !== toX + xStep; x += xStep) { // Does current pixel mean we have moved white to black or vice versa? // Scanning black in state 0,2 and white in state 1, so if we find the wrong // color, advance to next state or end if we are in state 2 already var realX = steep ? y : x; var realY = steep ? x : y; if (matrix.get(realX, realY) !== currentPixel) { currentPixel = !currentPixel; switchPoints.push({ x: realX, y: realY }); if (switchPoints.length === length + 1) { break; } } error += dy; if (error > 0) { if (y === toY) { break; } y += yStep; error -= dx; } } var distances = []; for (var i = 0; i < length; i++) { if (switchPoints[i] && switchPoints[i + 1]) { distances.push(distance(switchPoints[i], switchPoints[i + 1])); } else { distances.push(0); } } return distances; } // Takes an origin point and an end point and counts the sizes of the black white run in the origin point // along the line that intersects with the end point. Returns an array of elements, representing the pixel sizes // of the black white run. Takes a length which represents the number of switches from black to white to look for. function countBlackWhiteRun(origin, end, matrix, length) { var _a; var rise = end.y - origin.y; var run = end.x - origin.x; var towardsEnd = countBlackWhiteRunTowardsPoint(origin, end, matrix, Math.ceil(length / 2)); var awayFromEnd = countBlackWhiteRunTowardsPoint(origin, { x: origin.x - run, y: origin.y - rise }, matrix, Math.ceil(length / 2)); var middleValue = towardsEnd.shift() + awayFromEnd.shift() - 1; // Substract one so we don't double count a pixel return (_a = awayFromEnd.concat(middleValue)).concat.apply(_a, towardsEnd); } // Takes in a black white run and an array of expected ratios. Returns the average size of the run as well as the "error" - // that is the amount the run diverges from the expected ratio function scoreBlackWhiteRun(sequence, ratios) { var averageSize = sum(sequence) / sum(ratios); var error = 0; ratios.forEach(function (ratio, i) { error += Math.pow((sequence[i] - ratio * averageSize), 2); }); return { averageSize: averageSize, error: error }; } // Takes an X,Y point and an array of sizes and scores the point against those ratios. // For example for a finder pattern takes the ratio list of 1:1:3:1:1 and checks horizontal, vertical and diagonal ratios // against that. function scorePattern(point, ratios, matrix) { try { var horizontalRun = countBlackWhiteRun(point, { x: -1, y: point.y }, matrix, ratios.length); var verticalRun = countBlackWhiteRun(point, { x: point.x, y: -1 }, matrix, ratios.length); var topLeftPoint = { x: Math.max(0, point.x - point.y) - 1, y: Math.max(0, point.y - point.x) - 1, }; var topLeftBottomRightRun = countBlackWhiteRun(point, topLeftPoint, matrix, ratios.length); var bottomLeftPoint = { x: Math.min(matrix.width, point.x + point.y) + 1, y: Math.min(matrix.height, point.y + point.x) + 1, }; var bottomLeftTopRightRun = countBlackWhiteRun(point, bottomLeftPoint, matrix, ratios.length); var horzError = scoreBlackWhiteRun(horizontalRun, ratios); var vertError = scoreBlackWhiteRun(verticalRun, ratios); var diagDownError = scoreBlackWhiteRun(topLeftBottomRightRun, ratios); var diagUpError = scoreBlackWhiteRun(bottomLeftTopRightRun, ratios); var ratioError = Math.sqrt(horzError.error * horzError.error + vertError.error * vertError.error + diagDownError.error * diagDownError.error + diagUpError.error * diagUpError.error); var avgSize = (horzError.averageSize + vertError.averageSize + diagDownError.averageSize + diagUpError.averageSize) / 4; var sizeError = (Math.pow((horzError.averageSize - avgSize), 2) + Math.pow((vertError.averageSize - avgSize), 2) + Math.pow((diagDownError.averageSize - avgSize), 2) + Math.pow((diagUpError.averageSize - avgSize), 2)) / avgSize; return ratioError + sizeError; } catch (_a) { return Infinity; } } function recenterLocation(matrix, p) { var leftX = Math.round(p.x); while (matrix.get(leftX, Math.round(p.y))) { leftX--; } var rightX = Math.round(p.x); while (matrix.get(rightX, Math.round(p.y))) { rightX++; } var x = (leftX + rightX) / 2; var topY = Math.round(p.y); while (matrix.get(Math.round(x), topY)) { topY--; } var bottomY = Math.round(p.y); while (matrix.get(Math.round(x), bottomY)) { bottomY++; } var y = (topY + bottomY) / 2; return { x: x, y: y }; } function locate(matrix) { var finderPatternQuads = []; var activeFinderPatternQuads = []; var alignmentPatternQuads = []; var activeAlignmentPatternQuads = []; var _loop_1 = function (y) { var length_1 = 0; var lastBit = false; var scans = [0, 0, 0, 0, 0]; var _loop_2 = function (x) { var v = matrix.get(x, y); if (v === lastBit) { length_1++; } else { scans = [scans[1], scans[2], scans[3], scans[4], length_1]; length_1 = 1; lastBit = v; // Do the last 5 color changes ~ match the expected ratio for a finder pattern? 1:1:3:1:1 of b:w:b:w:b var averageFinderPatternBlocksize = sum(scans) / 7; var validFinderPattern = Math.abs(scans[0] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize && Math.abs(scans[1] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize && Math.abs(scans[2] - 3 * averageFinderPatternBlocksize) < 3 * averageFinderPatternBlocksize && Math.abs(scans[3] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize && Math.abs(scans[4] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize && !v; // And make sure the current pixel is white since finder patterns are bordered in white // Do the last 3 color changes ~ match the expected ratio for an alignment pattern? 1:1:1 of w:b:w var averageAlignmentPatternBlocksize = sum(scans.slice(-3)) / 3; var validAlignmentPattern = Math.abs(scans[2] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize && Math.abs(scans[3] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize && Math.abs(scans[4] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize && v; // Is the current pixel black since alignment patterns are bordered in black if (validFinderPattern) { // Compute the start and end x values of the large center black square var endX_1 = x - scans[3] - scans[4]; var startX_1 = endX_1 - scans[2]; var line = { startX: startX_1, endX: endX_1, y: y }; // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with // that line as the starting point. var matchingQuads = activeFinderPatternQuads.filter(function (q) { return (startX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) || (endX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) || (startX_1 <= q.bottom.startX && endX_1 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO && (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO)); }); if (matchingQuads.length > 0) { matchingQuads[0].bottom = line; } else { activeFinderPatternQuads.push({ top: line, bottom: line }); } } if (validAlignmentPattern) { // Compute the start and end x values of the center black square var endX_2 = x - scans[4]; var startX_2 = endX_2 - scans[3]; var line = { startX: startX_2, y: y, endX: endX_2 }; // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with // that line as the starting point. var matchingQuads = activeAlignmentPatternQuads.filter(function (q) { return (startX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) || (endX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) || (startX_2 <= q.bottom.startX && endX_2 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO && (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO)); }); if (matchingQuads.length > 0) { matchingQuads[0].bottom = line; } else { activeAlignmentPatternQuads.push({ top: line, bottom: line }); } } } }; for (var x = -1; x <= matrix.width; x++) { _loop_2(x); } finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y !== y && q.bottom.y - q.top.y >= 2; })); activeFinderPatternQuads = activeFinderPatternQuads.filter(function (q) { return q.bottom.y === y; }); alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y !== y; })); activeAlignmentPatternQuads = activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y === y; }); }; for (var y = 0; y <= matrix.height; y++) { _loop_1(y); } finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y - q.top.y >= 2; })); alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads); var finderPatternGroups = finderPatternQuads .filter(function (q) { return q.bottom.y - q.top.y >= 2; }) // All quads must be at least 2px tall since the center square is larger than a block .map(function (q) { var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4; var y = (q.top.y + q.bottom.y + 1) / 2; if (!matrix.get(Math.round(x), Math.round(y))) { return; } var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, q.bottom.y - q.top.y + 1]; var size = sum(lengths) / lengths.length; var score = scorePattern({ x: Math.round(x), y: Math.round(y) }, [1, 1, 3, 1, 1], matrix); return { score: score, x: x, y: y, size: size }; }) .filter(function (q) { return !!q; }) // Filter out any rejected quads from above .sort(function (a, b) { return a.score - b.score; }) // Now take the top finder pattern options and try to find 2 other options with a similar size. .map(function (point, i, finderPatterns) { if (i > MAX_FINDERPATTERNS_TO_SEARCH) { return null; } var otherPoints = finderPatterns .filter(function (p, ii) { return i !== ii; }) .map(function (p) { return ({ x: p.x, y: p.y, score: p.score + (Math.pow((p.size - point.size), 2)) / point.size, size: p.size }); }) .sort(function (a, b) { return a.score - b.score; }); if (otherPoints.length < 2) { return null; } var score = point.score + otherPoints[0].score + otherPoints[1].score; return { points: [point].concat(otherPoints.slice(0, 2)), score: score }; }) .filter(function (q) { return !!q; }) // Filter out any rejected finder patterns from above .sort(function (a, b) { return a.score - b.score; }); if (finderPatternGroups.length === 0) { return null; } var _a = reorderFinderPatterns(finderPatternGroups[0].points[0], finderPatternGroups[0].points[1], finderPatternGroups[0].points[2]), topRight = _a.topRight, topLeft = _a.topLeft, bottomLeft = _a.bottomLeft; var alignment = findAlignmentPattern(matrix, alignmentPatternQuads, topRight, topLeft, bottomLeft); var result = []; if (alignment) { result.push({ alignmentPattern: { x: alignment.alignmentPattern.x, y: alignment.alignmentPattern.y }, bottomLeft: { x: bottomLeft.x, y: bottomLeft.y }, dimension: alignment.dimension, topLeft: { x: topLeft.x, y: topLeft.y }, topRight: { x: topRight.x, y: topRight.y }, }); } // We normally use the center of the quads as the location of the tracking points, which is optimal for most cases and will account // for a skew in the image. However, In some cases, a slight skew might not be real and instead be caused by image compression // errors and/or low resolution. For those cases, we'd be better off centering the point exactly in the middle of the black area. We // compute and return the location data for the naively centered points as it is little additional work and allows for multiple // attempts at decoding harder images. var midTopRight = recenterLocation(matrix, topRight); var midTopLeft = recenterLocation(matrix, topLeft); var midBottomLeft = recenterLocation(matrix, bottomLeft); var centeredAlignment = findAlignmentPattern(matrix, alignmentPatternQuads, midTopRight, midTopLeft, midBottomLeft); if (centeredAlignment) { result.push({ alignmentPattern: { x: centeredAlignment.alignmentPattern.x, y: centeredAlignment.alignmentPattern.y }, bottomLeft: { x: midBottomLeft.x, y: midBottomLeft.y }, topLeft: { x: midTopLeft.x, y: midTopLeft.y }, topRight: { x: midTopRight.x, y: midTopRight.y }, dimension: centeredAlignment.dimension, }); } if (result.length === 0) { return null; } return result; } exports.locate = locate; function findAlignmentPattern(matrix, alignmentPatternQuads, topRight, topLeft, bottomLeft) { var _a; // Now that we've found the three finder patterns we can determine the blockSize and the size of the QR code. // We'll use these to help find the alignment pattern but also later when we do the extraction. var dimension; var moduleSize; try { (_a = computeDimension(topLeft, topRight, bottomLeft, matrix), dimension = _a.dimension, moduleSize = _a.moduleSize); } catch (e) { return null; } // Now find the alignment pattern var bottomRightFinderPattern = { x: topRight.x - topLeft.x + bottomLeft.x, y: topRight.y - topLeft.y + bottomLeft.y, }; var modulesBetweenFinderPatterns = ((distance(topLeft, bottomLeft) + distance(topLeft, topRight)) / 2 / moduleSize); var correctionToTopLeft = 1 - (3 / modulesBetweenFinderPatterns); var expectedAlignmentPattern = { x: topLeft.x + correctionToTopLeft * (bottomRightFinderPattern.x - topLeft.x), y: topLeft.y + correctionToTopLeft * (bottomRightFinderPattern.y - topLeft.y), }; var alignmentPatterns = alignmentPatternQuads .map(function (q) { var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4; var y = (q.top.y + q.bottom.y + 1) / 2; if (!matrix.get(Math.floor(x), Math.floor(y))) { return; } var sizeScore = scorePattern({ x: Math.floor(x), y: Math.floor(y) }, [1, 1, 1], matrix); var score = sizeScore + distance({ x: x, y: y }, expectedAlignmentPattern); return { x: x, y: y, score: score }; }) .filter(function (v) { return !!v; }) .sort(function (a, b) { return a.score - b.score; }); // If there are less than 15 modules between finder patterns it's a version 1 QR code and as such has no alignmemnt pattern // so we can only use our best guess. var alignmentPattern = modulesBetweenFinderPatterns >= 15 && alignmentPatterns.length ? alignmentPatterns[0] : expectedAlignmentPattern; return { alignmentPattern: alignmentPattern, dimension: dimension }; } /***/ }) /******/ ])["default"]; });