From eed374d48b3097d225a5a1dd4dfa5efc74cee6a6 Mon Sep 17 00:00:00 2001 From: Livio <193267+javalc6@users.noreply.github.com> Date: Fri, 2 Jun 2023 16:02:04 +0200 Subject: [PATCH] initial release initial release --- LICENSE.md | 67 + bzip2/BZip2CompressorInputStream.java | 944 ++ bzip2/BZip2Constants.java | 22 + bzip2/BitInputStream.java | 187 + bzip2/CRC.java | 114 + bzip2/CloseShieldFilterInputStream.java | 25 + bzip2/CompressorInputStream.java | 81 + bzip2/CountingInputStream.java | 61 + bzip2/InputStreamStatistics.java | 16 + bzip2/Rand.java | 74 + .../scribunto/ScribuntoException.java | 11 + .../engine/lua/ScribuntoLuaEngine.java | 647 ++ .../engine/lua/interfaces/Languages.java | 25 + .../engine/lua/interfaces/MwHtml.java | 44 + .../engine/lua/interfaces/MwInit.java | 18 + .../engine/lua/interfaces/MwInterface.java | 36 + .../engine/lua/interfaces/MwLanguage.java | 195 + .../engine/lua/interfaces/MwMessage.java | 103 + .../engine/lua/interfaces/MwSite.java | 170 + .../engine/lua/interfaces/MwText.java | 146 + .../engine/lua/interfaces/MwTitle.java | 221 + .../engine/lua/interfaces/MwUri.java | 113 + .../engine/lua/interfaces/MwUstring.java | 26 + .../extensions/scribunto/template/Frame.java | 106 + info/bliki/wiki/template/dates/PHPDate.java | 189 + .../wiki/template/dates/StringToTime.java | 729 ++ .../template/dates/StringToTimeException.java | 17 + lib/StringLib.java | 1225 +++ lib/luaj-jse-3.0.2p.jar | Bin 0 -> 472927 bytes lib/readme.txt | 3 + luabit/bit.lua | 264 + luabit/bit32.lua | 209 + luabit/hex.lua | 99 + luabit/readme.txt | 143 + lualib/libraryUtil.lua | 71 + lualib/mw.hash.lua | 30 + lualib/mw.html.lua | 433 + lualib/mw.language.lua | 189 + lualib/mw.lua | 784 ++ lualib/mw.message.lua | 198 + lualib/mw.site.lua | 86 + lualib/mw.text.lua | 331 + lualib/mw.title.lua | 337 + lualib/mw.uri.lua | 623 ++ lualib/mw.ustring.lua | 108 + lualib/mwInit.lua | 143 + lualib/package.lua | 127 + ustring/README | 51 + ustring/charsets.lua | 3117 ++++++ ustring/lower.lua | 679 ++ ustring/normalization-data.lua | 9450 +++++++++++++++++ ustring/string.lua | 15 + ustring/upper.lua | 715 ++ ustring/ustring.lua | 1260 +++ wiki.html | 1 + wiki/MagicWords.java | 371 + wiki/NameSpaces.java | 200 + wiki/TemplateParser.java | 336 + wiki/TestSuite.java | 334 + wiki/WikiFind.java | 127 + wiki/WikiSplitter.java | 432 + wiki/parserfunctions/Expr.java | 57 + wiki/parserfunctions/FormatDate.java | 47 + wiki/parserfunctions/Formatnum.java | 64 + wiki/parserfunctions/Fullurl.java | 52 + wiki/parserfunctions/Fullurle.java | 52 + wiki/parserfunctions/If.java | 51 + wiki/parserfunctions/Ifeq.java | 58 + wiki/parserfunctions/Iferror.java | 51 + wiki/parserfunctions/Ifexist.java | 51 + wiki/parserfunctions/Ifexpr.java | 65 + wiki/parserfunctions/Invoke.java | 83 + wiki/parserfunctions/Localurl.java | 51 + wiki/parserfunctions/Localurle.java | 51 + wiki/parserfunctions/Padleft.java | 68 + wiki/parserfunctions/Padright.java | 69 + wiki/parserfunctions/ParserFunction.java | 38 + wiki/parserfunctions/ParserFunctions.java | 70 + wiki/parserfunctions/Plural.java | 51 + wiki/parserfunctions/Switch.java | 77 + wiki/parserfunctions/Tag.java | 67 + wiki/parserfunctions/Time.java | 262 + wiki/parserfunctions/Titleparts.java | 112 + wiki/parserfunctions/expr/ExprParser.java | 729 ++ wiki/tools/Utilities.java | 240 + wiki/tools/WikiFormatter.java | 565 + wiki/tools/WikiPage.java | 118 + wiki/tools/WikiScanner.java | 366 + 88 files changed, 30443 insertions(+) create mode 100644 LICENSE.md create mode 100644 bzip2/BZip2CompressorInputStream.java create mode 100644 bzip2/BZip2Constants.java create mode 100644 bzip2/BitInputStream.java create mode 100644 bzip2/CRC.java create mode 100644 bzip2/CloseShieldFilterInputStream.java create mode 100644 bzip2/CompressorInputStream.java create mode 100644 bzip2/CountingInputStream.java create mode 100644 bzip2/InputStreamStatistics.java create mode 100644 bzip2/Rand.java create mode 100644 info/bliki/extensions/scribunto/ScribuntoException.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/ScribuntoLuaEngine.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/Languages.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/MwHtml.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/MwInit.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/MwInterface.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/MwLanguage.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/MwMessage.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/MwSite.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/MwText.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/MwTitle.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/MwUri.java create mode 100644 info/bliki/extensions/scribunto/engine/lua/interfaces/MwUstring.java create mode 100644 info/bliki/extensions/scribunto/template/Frame.java create mode 100644 info/bliki/wiki/template/dates/PHPDate.java create mode 100644 info/bliki/wiki/template/dates/StringToTime.java create mode 100644 info/bliki/wiki/template/dates/StringToTimeException.java create mode 100644 lib/StringLib.java create mode 100644 lib/luaj-jse-3.0.2p.jar create mode 100644 lib/readme.txt create mode 100644 luabit/bit.lua create mode 100644 luabit/bit32.lua create mode 100644 luabit/hex.lua create mode 100644 luabit/readme.txt create mode 100644 lualib/libraryUtil.lua create mode 100644 lualib/mw.hash.lua create mode 100644 lualib/mw.html.lua create mode 100644 lualib/mw.language.lua create mode 100644 lualib/mw.lua create mode 100644 lualib/mw.message.lua create mode 100644 lualib/mw.site.lua create mode 100644 lualib/mw.text.lua create mode 100644 lualib/mw.title.lua create mode 100644 lualib/mw.uri.lua create mode 100644 lualib/mw.ustring.lua create mode 100644 lualib/mwInit.lua create mode 100644 lualib/package.lua create mode 100644 ustring/README create mode 100644 ustring/charsets.lua create mode 100644 ustring/lower.lua create mode 100644 ustring/normalization-data.lua create mode 100644 ustring/string.lua create mode 100644 ustring/upper.lua create mode 100644 ustring/ustring.lua create mode 100644 wiki.html create mode 100644 wiki/MagicWords.java create mode 100644 wiki/NameSpaces.java create mode 100644 wiki/TemplateParser.java create mode 100644 wiki/TestSuite.java create mode 100644 wiki/WikiFind.java create mode 100644 wiki/WikiSplitter.java create mode 100644 wiki/parserfunctions/Expr.java create mode 100644 wiki/parserfunctions/FormatDate.java create mode 100644 wiki/parserfunctions/Formatnum.java create mode 100644 wiki/parserfunctions/Fullurl.java create mode 100644 wiki/parserfunctions/Fullurle.java create mode 100644 wiki/parserfunctions/If.java create mode 100644 wiki/parserfunctions/Ifeq.java create mode 100644 wiki/parserfunctions/Iferror.java create mode 100644 wiki/parserfunctions/Ifexist.java create mode 100644 wiki/parserfunctions/Ifexpr.java create mode 100644 wiki/parserfunctions/Invoke.java create mode 100644 wiki/parserfunctions/Localurl.java create mode 100644 wiki/parserfunctions/Localurle.java create mode 100644 wiki/parserfunctions/Padleft.java create mode 100644 wiki/parserfunctions/Padright.java create mode 100644 wiki/parserfunctions/ParserFunction.java create mode 100644 wiki/parserfunctions/ParserFunctions.java create mode 100644 wiki/parserfunctions/Plural.java create mode 100644 wiki/parserfunctions/Switch.java create mode 100644 wiki/parserfunctions/Tag.java create mode 100644 wiki/parserfunctions/Time.java create mode 100644 wiki/parserfunctions/Titleparts.java create mode 100644 wiki/parserfunctions/expr/ExprParser.java create mode 100644 wiki/tools/Utilities.java create mode 100644 wiki/tools/WikiFormatter.java create mode 100644 wiki/tools/WikiPage.java create mode 100644 wiki/tools/WikiScanner.java diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..afcec2a --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,67 @@ +License Information, 2023 Livio (javalc6) + +Feel free to modify, re-use this software, please give appropriate +credit by referencing this Github repository. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +IMPORTANT NOTICE +Note that this software is freeware and it is not designed, licensed or +intended for use in mission critical, life support and military purposes. +The use of this software is at the risk of the user. + +DO NOT USE THIS SOFTWARE IF YOU DON'T AGREE WITH STATED CONDITIONS. +==================================================================== +This software includes software from other open source projects, here are related references. + +A) Java lua interpreter luaj: https://github.com/luaj/luaj + +Software is licensed with MIT license +For more information see: +https://github.com/luaj/luaj/blob/master/LICENSE + +B) Wikimedia lua scripts: https://github.com/wikimedia/mediawiki-extensions-Scribunto/tree/master/includes/Engines/LuaCommon + +Software is licensed with GPL-2.0+ and MIT licenses +For more information see: +https://www.mediawiki.org/wiki/Extension:Scribunto + +C) Java scribunto engine: https://github.com/axkr/info.bliki.wikipedia_parser/tree/master/bliki-core/src/main/java/info/bliki/extensions/scribunto + +Software is licensed under the terms of two licenses: + +1) the Eclipse Public License - v 1.0 +http://www.opensource.org/licenses/eclipse-1.0.php +2) the GNU Lesser General Public License - v 2.1 or later +http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + +For more information see: +https://github.com/axkr/info.bliki.wikipedia_parser/blob/master/licenses.txt + +D) Java strtotime function: https://github.com/axkr/info.bliki.wikipedia_parser/tree/master/bliki-core/src/main/java/info/bliki/wiki/template/dates/ +Software is licensed with following license: + +Copyright (c) 2012 Clutch, Inc. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +For more information see: +https://github.com/collegeman/stringtotime \ No newline at end of file diff --git a/bzip2/BZip2CompressorInputStream.java b/bzip2/BZip2CompressorInputStream.java new file mode 100644 index 0000000..22e61e3 --- /dev/null +++ b/bzip2/BZip2CompressorInputStream.java @@ -0,0 +1,944 @@ +package bzip2; +/* included in https://commons.apache.org/proper/commons-compress + reused under Apache License version 2.0 +*/ + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteOrder; +import java.util.Arrays; + +/** + * An input stream that decompresses from the BZip2 format to be read as any other stream. + * + * @NotThreadSafe + */ +public class BZip2CompressorInputStream extends CompressorInputStream + implements BZip2Constants, InputStreamStatistics { + + /** + * Index of the last char in the block, so the block size == last + 1. + */ + private int last; + + /** + * Index in zptr[] of original string after sorting. + */ + private int origPtr; + + /** + * always: in the range 0 .. 9. The current block size is 100000 * this + * number. + */ + private int blockSize100k; + + private boolean blockRandomised; + + private final CRC crc = new CRC(); + + private int nInUse; + + private BitInputStream bin; + private final boolean decompressConcatenated; + + private static final int EOF = 0; + private static final int START_BLOCK_STATE = 1; + private static final int RAND_PART_A_STATE = 2; + private static final int RAND_PART_B_STATE = 3; + private static final int RAND_PART_C_STATE = 4; + private static final int NO_RAND_PART_A_STATE = 5; + private static final int NO_RAND_PART_B_STATE = 6; + private static final int NO_RAND_PART_C_STATE = 7; + + private int currentState = START_BLOCK_STATE; + + private int storedBlockCRC, storedCombinedCRC; + private int computedBlockCRC, computedCombinedCRC; + + // Variables used by setup* methods exclusively + + private int su_count; + private int su_ch2; + private int su_chPrev; + private int su_i2; + private int su_j2; + private int su_rNToGo; + private int su_rTPos; + private int su_tPos; + private char su_z; + + /** + * All memory intensive stuff. This field is initialized by initBlock(). + */ + private BZip2CompressorInputStream.Data data; + + /** + * Constructs a new BZip2CompressorInputStream which decompresses bytes + * read from the specified stream. This doesn't suppprt decompressing + * concatenated .bz2 files. + * + * @param in the InputStream from which this object should be created + * @throws IOException + * if the stream content is malformed or an I/O error occurs. + * @throws NullPointerException + * if {@code in == null} + */ + public BZip2CompressorInputStream(final InputStream in) throws IOException { + this(in, false); + } + + /** + * Constructs a new BZip2CompressorInputStream which decompresses bytes + * read from the specified stream. + * + * @param in the InputStream from which this object should be created + * @param decompressConcatenated + * if true, decompress until the end of the input; + * if false, stop after the first .bz2 stream and + * leave the input position to point to the next + * byte after the .bz2 stream + * + * @throws IOException + * if {@code in == null}, the stream content is malformed, or an I/O error occurs. + */ + public BZip2CompressorInputStream(final InputStream in, final boolean decompressConcatenated) throws IOException { + this.bin = new BitInputStream(in == System.in ? new CloseShieldFilterInputStream(in) : in, + ByteOrder.BIG_ENDIAN); + this.decompressConcatenated = decompressConcatenated; + + init(true); + initBlock(); + } + + @Override + public int read() throws IOException { + if (this.bin != null) { + final int r = read0(); + count(r < 0 ? -1 : 1); + return r; + } + throw new IOException("stream closed"); + } + + /* + * (non-Javadoc) + * + * @see java.io.InputStream#read(byte[], int, int) + */ + @Override + public int read(final byte[] dest, final int offs, final int len) + throws IOException { + if (offs < 0) { + throw new IndexOutOfBoundsException("offs(" + offs + ") < 0."); + } + if (len < 0) { + throw new IndexOutOfBoundsException("len(" + len + ") < 0."); + } + if (offs + len > dest.length) { + throw new IndexOutOfBoundsException("offs(" + offs + ") + len(" + + len + ") > dest.length(" + dest.length + ")."); + } + if (this.bin == null) { + throw new IOException("stream closed"); + } + if (len == 0) { + return 0; + } + + final int hi = offs + len; + int destOffs = offs; + int b; + while (destOffs < hi && ((b = read0()) >= 0)) { + dest[destOffs++] = (byte) b; + count(1); + } + + return (destOffs == offs) ? -1 : (destOffs - offs); + } + + /** + * @since 1.17 + */ + @Override + public long getCompressedCount() { + return bin.getBytesRead(); + } + + private void makeMaps() { + final boolean[] inUse = this.data.inUse; + final byte[] seqToUnseq = this.data.seqToUnseq; + + int nInUseShadow = 0; + + for (int i = 0; i < 256; i++) { + if (inUse[i]) { + seqToUnseq[nInUseShadow++] = (byte) i; + } + } + + this.nInUse = nInUseShadow; + } + + private int read0() throws IOException { + switch (currentState) { + case EOF: + return -1; + + case START_BLOCK_STATE: + return setupBlock(); + + case RAND_PART_A_STATE: + throw new IllegalStateException(); + + case RAND_PART_B_STATE: + return setupRandPartB(); + + case RAND_PART_C_STATE: + return setupRandPartC(); + + case NO_RAND_PART_A_STATE: + throw new IllegalStateException(); + + case NO_RAND_PART_B_STATE: + return setupNoRandPartB(); + + case NO_RAND_PART_C_STATE: + return setupNoRandPartC(); + + default: + throw new IllegalStateException(); + } + } + + private int readNextByte(BitInputStream in) throws IOException { + long b = in.readBits(8); + return (int) b; + } + + private boolean init(final boolean isFirstStream) throws IOException { + if (null == bin) { + throw new IOException("No InputStream"); + } + + if (!isFirstStream) { + bin.clearBitCache(); + } + + final int magic0 = readNextByte(this.bin); + if (magic0 == -1 && !isFirstStream) { + return false; + } + final int magic1 = readNextByte(this.bin); + final int magic2 = readNextByte(this.bin); + + if (magic0 != 'B' || magic1 != 'Z' || magic2 != 'h') { + throw new IOException(isFirstStream + ? "Stream is not in the BZip2 format" + : "Garbage after a valid BZip2 stream"); + } + + final int blockSize = readNextByte(this.bin); + if ((blockSize < '1') || (blockSize > '9')) { + throw new IOException("BZip2 block size is invalid"); + } + + this.blockSize100k = blockSize - '0'; + + this.computedCombinedCRC = 0; + + return true; + } + + private void initBlock() throws IOException { + BitInputStream bin = this.bin; + char magic0; + char magic1; + char magic2; + char magic3; + char magic4; + char magic5; + + while (true) { + // Get the block magic bytes. + magic0 = bsGetUByte(bin); + magic1 = bsGetUByte(bin); + magic2 = bsGetUByte(bin); + magic3 = bsGetUByte(bin); + magic4 = bsGetUByte(bin); + magic5 = bsGetUByte(bin); + + // If isn't end of stream magic, break out of the loop. + if (magic0 != 0x17 || magic1 != 0x72 || magic2 != 0x45 + || magic3 != 0x38 || magic4 != 0x50 || magic5 != 0x90) { + break; + } + + // End of stream was reached. Check the combined CRC and + // advance to the next .bz2 stream if decoding concatenated + // streams. + if (complete()) { + return; + } + } + + if (magic0 != 0x31 || // '1' + magic1 != 0x41 || // ')' + magic2 != 0x59 || // 'Y' + magic3 != 0x26 || // '&' + magic4 != 0x53 || // 'S' + magic5 != 0x59 // 'Y' + ) { + this.currentState = EOF; + throw new IOException("bad block header"); + } + this.storedBlockCRC = bsGetInt(bin); + this.blockRandomised = bsR(bin, 1) == 1; + + /** + * Allocate data here instead in constructor, so we do not allocate + * it if the input file is empty. + */ + if (this.data == null) { + this.data = new Data(this.blockSize100k); + } + + // currBlockNo++; + getAndMoveToFrontDecode(); + + this.crc.initialiseCRC(); + this.currentState = START_BLOCK_STATE; + } + + private void endBlock() throws IOException { + this.computedBlockCRC = this.crc.getFinalCRC(); + + // A bad CRC is considered a fatal error. + if (this.storedBlockCRC != this.computedBlockCRC) { + // make next blocks readable without error + // (repair feature, not yet documented, not tested) + this.computedCombinedCRC = (this.storedCombinedCRC << 1) + | (this.storedCombinedCRC >>> 31); + this.computedCombinedCRC ^= this.storedBlockCRC; + + throw new IOException("BZip2 CRC error"); + } + + this.computedCombinedCRC = (this.computedCombinedCRC << 1) + | (this.computedCombinedCRC >>> 31); + this.computedCombinedCRC ^= this.computedBlockCRC; + } + + private boolean complete() throws IOException { + this.storedCombinedCRC = bsGetInt(bin); + this.currentState = EOF; + this.data = null; + + if (this.storedCombinedCRC != this.computedCombinedCRC) { + throw new IOException("BZip2 CRC error"); + } + + // Look for the next .bz2 stream if decompressing + // concatenated files. + return !decompressConcatenated || !init(false); + } + + @Override + public void close() throws IOException { + final BitInputStream inShadow = this.bin; + if (inShadow != null) { + try { + inShadow.close(); + } finally { + this.data = null; + this.bin = null; + } + } + } + + /** + * read bits from the input stream + * @param n the number of bits to read, must not exceed 32? + * @return the requested bits combined into an int + * @throws IOException + */ + private static int bsR(BitInputStream bin, final int n) throws IOException { + long thech = bin.readBits(n); + if (thech < 0) { + throw new IOException("unexpected end of stream"); + } + return (int) thech; + } + + private static boolean bsGetBit(BitInputStream bin) throws IOException { + return bsR(bin, 1) != 0; + } + + private static char bsGetUByte(BitInputStream bin) throws IOException { + return (char) bsR(bin, 8); + } + + private static int bsGetInt(BitInputStream bin) throws IOException { + return bsR(bin, 32); + } + + private static void checkBounds(final int checkVal, final int limitExclusive, String name) + throws IOException { + if (checkVal < 0) { + throw new IOException("Corrupted input, " + name + " value negative"); + } + if (checkVal >= limitExclusive) { + throw new IOException("Corrupted input, " + name + " value too big"); + } + } + + /** + * Called by createHuffmanDecodingTables() exclusively. + */ + private static void hbCreateDecodeTables(final int[] limit, + final int[] base, final int[] perm, final char[] length, + final int minLen, final int maxLen, final int alphaSize) + throws IOException { + for (int i = minLen, pp = 0; i <= maxLen; i++) { + for (int j = 0; j < alphaSize; j++) { + if (length[j] == i) { + perm[pp++] = j; + } + } + } + + for (int i = MAX_CODE_LEN; --i > 0;) { + base[i] = 0; + limit[i] = 0; + } + + for (int i = 0; i < alphaSize; i++) { + final int l = length[i]; + checkBounds(l, MAX_ALPHA_SIZE, "length"); + base[l + 1]++; + } + + for (int i = 1, b = base[0]; i < MAX_CODE_LEN; i++) { + b += base[i]; + base[i] = b; + } + + for (int i = minLen, vec = 0, b = base[i]; i <= maxLen; i++) { + final int nb = base[i + 1]; + vec += nb - b; + b = nb; + limit[i] = vec - 1; + vec <<= 1; + } + + for (int i = minLen + 1; i <= maxLen; i++) { + base[i] = ((limit[i - 1] + 1) << 1) - base[i]; + } + } + + private void recvDecodingTables() throws IOException { + final BitInputStream bin = this.bin; + final Data dataShadow = this.data; + final boolean[] inUse = dataShadow.inUse; + final byte[] pos = dataShadow.recvDecodingTables_pos; + final byte[] selector = dataShadow.selector; + final byte[] selectorMtf = dataShadow.selectorMtf; + + int inUse16 = 0; + + /* Receive the mapping table */ + for (int i = 0; i < 16; i++) { + if (bsGetBit(bin)) { + inUse16 |= 1 << i; + } + } + + Arrays.fill(inUse, false); + for (int i = 0; i < 16; i++) { + if ((inUse16 & (1 << i)) != 0) { + final int i16 = i << 4; + for (int j = 0; j < 16; j++) { + if (bsGetBit(bin)) { + inUse[i16 + j] = true; + } + } + } + } + + makeMaps(); + final int alphaSize = this.nInUse + 2; + /* Now the selectors */ + final int nGroups = bsR(bin, 3); + final int nSelectors = bsR(bin, 15); + checkBounds(alphaSize, MAX_ALPHA_SIZE + 1, "alphaSize"); + checkBounds(nGroups, N_GROUPS + 1, "nGroups"); + checkBounds(nSelectors, MAX_SELECTORS + 1, "nSelectors"); + + for (int i = 0; i < nSelectors; i++) { + int j = 0; + while (bsGetBit(bin)) { + j++; + } + selectorMtf[i] = (byte) j; + } + + /* Undo the MTF values for the selectors. */ + for (int v = nGroups; --v >= 0;) { + pos[v] = (byte) v; + } + + for (int i = 0; i < nSelectors; i++) { + int v = selectorMtf[i] & 0xff; + checkBounds(v, N_GROUPS, "selectorMtf"); + final byte tmp = pos[v]; + while (v > 0) { + // nearly all times v is zero, 4 in most other cases + pos[v] = pos[v - 1]; + v--; + } + pos[0] = tmp; + selector[i] = tmp; + } + + final char[][] len = dataShadow.temp_charArray2d; + + /* Now the coding tables */ + for (int t = 0; t < nGroups; t++) { + int curr = bsR(bin, 5); + final char[] len_t = len[t]; + for (int i = 0; i < alphaSize; i++) { + while (bsGetBit(bin)) { + curr += bsGetBit(bin) ? -1 : 1; + } + len_t[i] = (char) curr; + } + } + + // finally create the Huffman tables + createHuffmanDecodingTables(alphaSize, nGroups); + } + + /** + * Called by recvDecodingTables() exclusively. + */ + private void createHuffmanDecodingTables(final int alphaSize, + final int nGroups) throws IOException { + final Data dataShadow = this.data; + final char[][] len = dataShadow.temp_charArray2d; + final int[] minLens = dataShadow.minLens; + final int[][] limit = dataShadow.limit; + final int[][] base = dataShadow.base; + final int[][] perm = dataShadow.perm; + + for (int t = 0; t < nGroups; t++) { + int minLen = 32; + int maxLen = 0; + final char[] len_t = len[t]; + for (int i = alphaSize; --i >= 0;) { + final char lent = len_t[i]; + if (lent > maxLen) { + maxLen = lent; + } + if (lent < minLen) { + minLen = lent; + } + } + hbCreateDecodeTables(limit[t], base[t], perm[t], len[t], minLen, + maxLen, alphaSize); + minLens[t] = minLen; + } + } + + private void getAndMoveToFrontDecode() throws IOException { + final BitInputStream bin = this.bin; + this.origPtr = bsR(bin, 24); + recvDecodingTables(); + + final Data dataShadow = this.data; + final byte[] ll8 = dataShadow.ll8; + final int[] unzftab = dataShadow.unzftab; + final byte[] selector = dataShadow.selector; + final byte[] seqToUnseq = dataShadow.seqToUnseq; + final char[] yy = dataShadow.getAndMoveToFrontDecode_yy; + final int[] minLens = dataShadow.minLens; + final int[][] limit = dataShadow.limit; + final int[][] base = dataShadow.base; + final int[][] perm = dataShadow.perm; + final int limitLast = this.blockSize100k * 100000; + + /* + * Setting up the unzftab entries here is not strictly necessary, but it + * does save having to do it later in a separate pass, and so saves a + * block's worth of cache misses. + */ + for (int i = 256; --i >= 0;) { + yy[i] = (char) i; + unzftab[i] = 0; + } + + int groupNo = 0; + int groupPos = G_SIZE - 1; + final int eob = this.nInUse + 1; + int nextSym = getAndMoveToFrontDecode0(); + int lastShadow = -1; + int zt = selector[groupNo] & 0xff; + checkBounds(zt, N_GROUPS, "zt"); + int[] base_zt = base[zt]; + int[] limit_zt = limit[zt]; + int[] perm_zt = perm[zt]; + int minLens_zt = minLens[zt]; + + while (nextSym != eob) { + if ((nextSym == RUNA) || (nextSym == RUNB)) { + int s = -1; + + for (int n = 1; true; n <<= 1) { + if (nextSym == RUNA) { + s += n; + } else if (nextSym == RUNB) { + s += n << 1; + } else { + break; + } + + if (groupPos == 0) { + groupPos = G_SIZE - 1; + checkBounds(++groupNo, MAX_SELECTORS, "groupNo"); + zt = selector[groupNo] & 0xff; + checkBounds(zt, N_GROUPS, "zt"); + base_zt = base[zt]; + limit_zt = limit[zt]; + perm_zt = perm[zt]; + minLens_zt = minLens[zt]; + } else { + groupPos--; + } + + int zn = minLens_zt; + checkBounds(zn, MAX_ALPHA_SIZE, "zn"); + int zvec = bsR(bin, zn); + while(zvec > limit_zt[zn]) { + checkBounds(++zn, MAX_ALPHA_SIZE, "zn"); + zvec = (zvec << 1) | bsR(bin, 1); + } + final int tmp = zvec - base_zt[zn]; + checkBounds(tmp, MAX_ALPHA_SIZE, "zvec"); + nextSym = perm_zt[tmp]; + } + + final int yy0 = yy[0]; + checkBounds(yy0, 256, "yy"); + final byte ch = seqToUnseq[yy0]; + unzftab[ch & 0xff] += s + 1; + + final int from = ++lastShadow; + lastShadow += s; + Arrays.fill(ll8, from, lastShadow + 1, ch); + + if (lastShadow >= limitLast) { + throw new IOException("block overrun while expanding RLE in MTF, " + + lastShadow + " exceeds " + limitLast); + } + } else { + if (++lastShadow >= limitLast) { + throw new IOException("block overrun in MTF, " + + lastShadow + " exceeds " + limitLast); + } + checkBounds(nextSym, 256 + 1, "nextSym"); + + final char tmp = yy[nextSym - 1]; + checkBounds(tmp, 256, "yy"); + unzftab[seqToUnseq[tmp] & 0xff]++; + ll8[lastShadow] = seqToUnseq[tmp]; + + /* + * This loop is hammered during decompression, hence avoid + * native method call overhead of System.arraycopy for very + * small ranges to copy. + */ + if (nextSym <= 16) { + for (int j = nextSym - 1; j > 0;) { + yy[j] = yy[--j]; + } + } else { + System.arraycopy(yy, 0, yy, 1, nextSym - 1); + } + + yy[0] = tmp; + + if (groupPos == 0) { + groupPos = G_SIZE - 1; + checkBounds(++groupNo, MAX_SELECTORS, "groupNo"); + zt = selector[groupNo] & 0xff; + checkBounds(zt, N_GROUPS, "zt"); + base_zt = base[zt]; + limit_zt = limit[zt]; + perm_zt = perm[zt]; + minLens_zt = minLens[zt]; + } else { + groupPos--; + } + + int zn = minLens_zt; + checkBounds(zn, MAX_ALPHA_SIZE, "zn"); + int zvec = bsR(bin, zn); + while(zvec > limit_zt[zn]) { + checkBounds(++zn, MAX_ALPHA_SIZE, "zn"); + zvec = (zvec << 1) | bsR(bin, 1); + } + final int idx = zvec - base_zt[zn]; + checkBounds(idx, MAX_ALPHA_SIZE, "zvec"); + nextSym = perm_zt[idx]; + } + } + + this.last = lastShadow; + } + + private int getAndMoveToFrontDecode0() throws IOException { + final Data dataShadow = this.data; + final int zt = dataShadow.selector[0] & 0xff; + checkBounds(zt, N_GROUPS, "zt"); + final int[] limit_zt = dataShadow.limit[zt]; + int zn = dataShadow.minLens[zt]; + checkBounds(zn, MAX_ALPHA_SIZE, "zn"); + int zvec = bsR(bin, zn); + while (zvec > limit_zt[zn]) { + checkBounds(++zn, MAX_ALPHA_SIZE, "zn"); + zvec = (zvec << 1) | bsR(bin, 1); + } + final int tmp = zvec - dataShadow.base[zt][zn]; + checkBounds(tmp, MAX_ALPHA_SIZE, "zvec"); + + return dataShadow.perm[zt][tmp]; + } + + private int setupBlock() throws IOException { + if (currentState == EOF || this.data == null) { + return -1; + } + + final int[] cftab = this.data.cftab; + final int ttLen = this.last + 1; + final int[] tt = this.data.initTT(ttLen); + final byte[] ll8 = this.data.ll8; + cftab[0] = 0; + System.arraycopy(this.data.unzftab, 0, cftab, 1, 256); + + for (int i = 1, c = cftab[0]; i <= 256; i++) { + c += cftab[i]; + cftab[i] = c; + } + + for (int i = 0, lastShadow = this.last; i <= lastShadow; i++) { + final int tmp = cftab[ll8[i] & 0xff]++; + checkBounds(tmp, ttLen, "tt index"); + tt[tmp] = i; + } + + if ((this.origPtr < 0) || (this.origPtr >= tt.length)) { + throw new IOException("stream corrupted"); + } + + this.su_tPos = tt[this.origPtr]; + this.su_count = 0; + this.su_i2 = 0; + this.su_ch2 = 256; /* not a char and not EOF */ + + if (this.blockRandomised) { + this.su_rNToGo = 0; + this.su_rTPos = 0; + return setupRandPartA(); + } + return setupNoRandPartA(); + } + + private int setupRandPartA() throws IOException { + if (this.su_i2 <= this.last) { + this.su_chPrev = this.su_ch2; + int su_ch2Shadow = this.data.ll8[this.su_tPos] & 0xff; + checkBounds(this.su_tPos, this.data.tt.length, "su_tPos"); + this.su_tPos = this.data.tt[this.su_tPos]; + if (this.su_rNToGo == 0) { + this.su_rNToGo = Rand.rNums(this.su_rTPos) - 1; + if (++this.su_rTPos == 512) { + this.su_rTPos = 0; + } + } else { + this.su_rNToGo--; + } + this.su_ch2 = su_ch2Shadow ^= (this.su_rNToGo == 1) ? 1 : 0; + this.su_i2++; + this.currentState = RAND_PART_B_STATE; + this.crc.updateCRC(su_ch2Shadow); + return su_ch2Shadow; + } + endBlock(); + initBlock(); + return setupBlock(); + } + + private int setupNoRandPartA() throws IOException { + if (this.su_i2 <= this.last) { + this.su_chPrev = this.su_ch2; + final int su_ch2Shadow = this.data.ll8[this.su_tPos] & 0xff; + this.su_ch2 = su_ch2Shadow; + checkBounds(this.su_tPos, this.data.tt.length, "su_tPos"); + this.su_tPos = this.data.tt[this.su_tPos]; + this.su_i2++; + this.currentState = NO_RAND_PART_B_STATE; + this.crc.updateCRC(su_ch2Shadow); + return su_ch2Shadow; + } + this.currentState = NO_RAND_PART_A_STATE; + endBlock(); + initBlock(); + return setupBlock(); + } + + private int setupRandPartB() throws IOException { + if (this.su_ch2 != this.su_chPrev) { + this.currentState = RAND_PART_A_STATE; + this.su_count = 1; + return setupRandPartA(); + } else if (++this.su_count >= 4) { + this.su_z = (char) (this.data.ll8[this.su_tPos] & 0xff); + checkBounds(this.su_tPos, this.data.tt.length, "su_tPos"); + this.su_tPos = this.data.tt[this.su_tPos]; + if (this.su_rNToGo == 0) { + this.su_rNToGo = Rand.rNums(this.su_rTPos) - 1; + if (++this.su_rTPos == 512) { + this.su_rTPos = 0; + } + } else { + this.su_rNToGo--; + } + this.su_j2 = 0; + this.currentState = RAND_PART_C_STATE; + if (this.su_rNToGo == 1) { + this.su_z ^= 1; + } + return setupRandPartC(); + } else { + this.currentState = RAND_PART_A_STATE; + return setupRandPartA(); + } + } + + private int setupRandPartC() throws IOException { + if (this.su_j2 < this.su_z) { + this.crc.updateCRC(this.su_ch2); + this.su_j2++; + return this.su_ch2; + } + this.currentState = RAND_PART_A_STATE; + this.su_i2++; + this.su_count = 0; + return setupRandPartA(); + } + + private int setupNoRandPartB() throws IOException { + if (this.su_ch2 != this.su_chPrev) { + this.su_count = 1; + return setupNoRandPartA(); + } else if (++this.su_count >= 4) { + checkBounds(this.su_tPos, this.data.ll8.length, "su_tPos"); + this.su_z = (char) (this.data.ll8[this.su_tPos] & 0xff); + this.su_tPos = this.data.tt[this.su_tPos]; + this.su_j2 = 0; + return setupNoRandPartC(); + } else { + return setupNoRandPartA(); + } + } + + private int setupNoRandPartC() throws IOException { + if (this.su_j2 < this.su_z) { + final int su_ch2Shadow = this.su_ch2; + this.crc.updateCRC(su_ch2Shadow); + this.su_j2++; + this.currentState = NO_RAND_PART_C_STATE; + return su_ch2Shadow; + } + this.su_i2++; + this.su_count = 0; + return setupNoRandPartA(); + } + + private static final class Data { + + // (with blockSize 900k) + final boolean[] inUse = new boolean[256]; // 256 byte + + final byte[] seqToUnseq = new byte[256]; // 256 byte + final byte[] selector = new byte[MAX_SELECTORS]; // 18002 byte + final byte[] selectorMtf = new byte[MAX_SELECTORS]; // 18002 byte + + /** + * Freq table collected to save a pass over the data during + * decompression. + */ + final int[] unzftab = new int[256]; // 1024 byte + + final int[][] limit = new int[N_GROUPS][MAX_ALPHA_SIZE]; // 6192 byte + final int[][] base = new int[N_GROUPS][MAX_ALPHA_SIZE]; // 6192 byte + final int[][] perm = new int[N_GROUPS][MAX_ALPHA_SIZE]; // 6192 byte + final int[] minLens = new int[N_GROUPS]; // 24 byte + + final int[] cftab = new int[257]; // 1028 byte + final char[] getAndMoveToFrontDecode_yy = new char[256]; // 512 byte + final char[][] temp_charArray2d = new char[N_GROUPS][MAX_ALPHA_SIZE]; // 3096 + // byte + final byte[] recvDecodingTables_pos = new byte[N_GROUPS]; // 6 byte + // --------------- + // 60798 byte + + int[] tt; // 3600000 byte + byte[] ll8; // 900000 byte + + // --------------- + // 4560782 byte + // =============== + + Data(final int blockSize100k) { + this.ll8 = new byte[blockSize100k * BZip2Constants.BASEBLOCKSIZE]; + } + + /** + * Initializes the {@link #tt} array. + * + * This method is called when the required length of the array is known. + * I don't initialize it at construction time to avoid unneccessary + * memory allocation when compressing small files. + */ + int[] initTT(final int length) { + int[] ttShadow = this.tt; + + // tt.length should always be >= length, but theoretically + // it can happen, if the compressor mixed small and large + // blocks. Normally only the last block will be smaller + // than others. + if ((ttShadow == null) || (ttShadow.length < length)) { + this.tt = ttShadow = new int[length]; + } + + return ttShadow; + } + + } + + /** + * Checks if the signature matches what is expected for a bzip2 file. + * + * @param signature + * the bytes to check + * @param length + * the number of bytes to check + * @return true, if this stream is a bzip2 compressed stream, false otherwise + * + * @since 1.1 + */ + public static boolean matches(final byte[] signature, final int length) { + return length >= 3 && signature[0] == 'B' && + signature[1] == 'Z' && signature[2] == 'h'; + } +} diff --git a/bzip2/BZip2Constants.java b/bzip2/BZip2Constants.java new file mode 100644 index 0000000..d2e60bf --- /dev/null +++ b/bzip2/BZip2Constants.java @@ -0,0 +1,22 @@ +package bzip2; +/* included in https://commons.apache.org/proper/commons-compress + reused under Apache License version 2.0 +*/ + +/** + * Constants for both the compress and decompress BZip2 classes. + */ +interface BZip2Constants { + + int BASEBLOCKSIZE = 100000; + int MAX_ALPHA_SIZE = 258; + int MAX_CODE_LEN = 23; + int RUNA = 0; + int RUNB = 1; + int N_GROUPS = 6; + int G_SIZE = 50; + int N_ITERS = 4; + int MAX_SELECTORS = (2 + (900000 / G_SIZE)); + int NUM_OVERSHOOT_BYTES = 20; + +} \ No newline at end of file diff --git a/bzip2/BitInputStream.java b/bzip2/BitInputStream.java new file mode 100644 index 0000000..c84f6b5 --- /dev/null +++ b/bzip2/BitInputStream.java @@ -0,0 +1,187 @@ +package bzip2; +/* included in https://commons.apache.org/proper/commons-compress + reused under Apache License version 2.0 +*/ +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteOrder; + +/** + * Reads bits from an InputStream. + * @since 1.10 + * @NotThreadSafe + */ +public class BitInputStream implements Closeable { + private static final int MAXIMUM_CACHE_SIZE = 63; // bits in long minus sign bit + private static final long[] MASKS = new long[MAXIMUM_CACHE_SIZE + 1]; + + static { + for (int i = 1; i <= MAXIMUM_CACHE_SIZE; i++) { + MASKS[i] = (MASKS[i - 1] << 1) + 1; + } + } + + private final CountingInputStream in; + private final ByteOrder byteOrder; + private long bitsCached = 0; + private int bitsCachedSize = 0; + + /** + * Constructor taking an InputStream and its bit arrangement. + * @param in the InputStream + * @param byteOrder the bit arrangement across byte boundaries, + * either BIG_ENDIAN (aaaaabbb bb000000) or LITTLE_ENDIAN (bbbaaaaa 000000bb) + */ + public BitInputStream(final InputStream in, final ByteOrder byteOrder) { + this.in = new CountingInputStream(in); + this.byteOrder = byteOrder; + } + + @Override + public void close() throws IOException { + in.close(); + } + + /** + * Clears the cache of bits that have been read from the + * underlying stream but not yet provided via {@link #readBits}. + */ + public void clearBitCache() { + bitsCached = 0; + bitsCachedSize = 0; + } + + /** + * Returns at most 63 bits read from the underlying stream. + * + * @param count the number of bits to read, must be a positive + * number not bigger than 63. + * @return the bits concatenated as a long using the stream's byte order. + * -1 if the end of the underlying stream has been reached before reading + * the requested number of bits + * @throws IOException on error + */ + public long readBits(final int count) throws IOException { + if (count < 0 || count > MAXIMUM_CACHE_SIZE) { + throw new IllegalArgumentException("count must not be negative or greater than " + MAXIMUM_CACHE_SIZE); + } + if (ensureCache(count)) { + return -1; + } + + if (bitsCachedSize < count) { + return processBitsGreater57(count); + } + return readCachedBits(count); + } + + /** + * Returns the number of bits that can be read from this input + * stream without reading from the underlying input stream at all. + * @return estimate of the number of bits that can be read without reading from the underlying stream + * @since 1.16 + */ + public int bitsCached() { + return bitsCachedSize; + } + + /** + * Returns an estimate of the number of bits that can be read from + * this input stream without blocking by the next invocation of a + * method for this input stream. + * @throws IOException if the underlying stream throws one when calling available + * @return estimate of the number of bits that can be read without blocking + * @since 1.16 + */ + public long bitsAvailable() throws IOException { + return bitsCachedSize + ((long) Byte.SIZE) * in.available(); + } + + /** + * Drops bits until the next bits will be read from a byte boundary. + * @since 1.16 + */ + public void alignWithByteBoundary() { + int toSkip = bitsCachedSize % Byte.SIZE; + if (toSkip > 0) { + readCachedBits(toSkip); + } + } + + /** + * Returns the number of bytes read from the underlying stream. + * + *

This includes the bytes read to fill the current cache and + * not read as bits so far.

+ * @return the number of bytes read from the underlying stream + * @since 1.17 + */ + public long getBytesRead() { + return in.getBytesRead(); + } + + private long processBitsGreater57(final int count) throws IOException { + final long bitsOut; + int overflowBits = 0; + long overflow = 0L; + + // bitsCachedSize >= 57 and left-shifting it 8 bits would cause an overflow + int bitsToAddCount = count - bitsCachedSize; + overflowBits = Byte.SIZE - bitsToAddCount; + final long nextByte = in.read(); + if (nextByte < 0) { + return nextByte; + } + if (byteOrder == ByteOrder.LITTLE_ENDIAN) { + long bitsToAdd = nextByte & MASKS[bitsToAddCount]; + bitsCached |= (bitsToAdd << bitsCachedSize); + overflow = (nextByte >>> bitsToAddCount) & MASKS[overflowBits]; + } else { + bitsCached <<= bitsToAddCount; + long bitsToAdd = (nextByte >>> (overflowBits)) & MASKS[bitsToAddCount]; + bitsCached |= bitsToAdd; + overflow = nextByte & MASKS[overflowBits]; + } + bitsOut = bitsCached & MASKS[count]; + bitsCached = overflow; + bitsCachedSize = overflowBits; + return bitsOut; + } + + private long readCachedBits(int count) { + final long bitsOut; + if (byteOrder == ByteOrder.LITTLE_ENDIAN) { + bitsOut = (bitsCached & MASKS[count]); + bitsCached >>>= count; + } else { + bitsOut = (bitsCached >> (bitsCachedSize - count)) & MASKS[count]; + } + bitsCachedSize -= count; + return bitsOut; + } + + /** + * Fills the cache up to 56 bits + * @param count + * @return return true, when EOF + * @throws IOException + */ + private boolean ensureCache(final int count) throws IOException { + while (bitsCachedSize < count && bitsCachedSize < 57) { + final long nextByte = in.read(); + if (nextByte < 0) { + return true; + } + if (byteOrder == ByteOrder.LITTLE_ENDIAN) { + bitsCached |= (nextByte << bitsCachedSize); + } else { + bitsCached <<= Byte.SIZE; + bitsCached |= nextByte; + } + bitsCachedSize += Byte.SIZE; + } + return false; + } + +} diff --git a/bzip2/CRC.java b/bzip2/CRC.java new file mode 100644 index 0000000..8d1d5a3 --- /dev/null +++ b/bzip2/CRC.java @@ -0,0 +1,114 @@ +package bzip2; +/* included in https://commons.apache.org/proper/commons-compress + reused under Apache License version 2.0 +*/ + +class CRC { + private static final int crc32Table[] = { + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, + 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, + 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, + 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, + 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, + 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, + 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, + 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, + 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, + 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, + 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, + 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, + 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, + 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, + 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, + 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, + 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, + 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, + 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, + 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, + 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, + 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, + 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, + 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, + 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, + 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, + 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, + 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, + 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, + 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, + 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, + 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, + 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, + 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, + 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, + 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, + 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, + 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, + 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, + 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, + 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, + 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, + 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, + 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, + 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, + 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, + 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, + 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, + 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, + 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, + 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, + 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 + }; + + CRC() { + initialiseCRC(); + } + + void initialiseCRC() { + globalCrc = 0xffffffff; + } + + int getFinalCRC() { + return ~globalCrc; + } + + int getGlobalCRC() { + return globalCrc; + } + + void setGlobalCRC(final int newCrc) { + globalCrc = newCrc; + } + + void updateCRC(final int inCh) { + int temp = (globalCrc >> 24) ^ inCh; + if (temp < 0) { + temp = 256 + temp; + } + globalCrc = (globalCrc << 8) ^ CRC.crc32Table[temp]; + } + + void updateCRC(final int inCh, int repeat) { + int globalCrcShadow = this.globalCrc; + while (repeat-- > 0) { + final int temp = (globalCrcShadow >> 24) ^ inCh; + globalCrcShadow = (globalCrcShadow << 8) ^ crc32Table[(temp >= 0) + ? temp + : (temp + 256)]; + } + this.globalCrc = globalCrcShadow; + } + + private int globalCrc; +} \ No newline at end of file diff --git a/bzip2/CloseShieldFilterInputStream.java b/bzip2/CloseShieldFilterInputStream.java new file mode 100644 index 0000000..4c20f7e --- /dev/null +++ b/bzip2/CloseShieldFilterInputStream.java @@ -0,0 +1,25 @@ +package bzip2; +/* included in https://commons.apache.org/proper/commons-compress + reused under Apache License version 2.0 +*/ + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Re-implements {@link FilterInputStream#close()} to do nothing. + * @since 1.14 + */ +public class CloseShieldFilterInputStream extends FilterInputStream { + + public CloseShieldFilterInputStream(InputStream in) { + super(in); + } + + @Override + public void close() throws IOException { + // NO IMPLEMENTATION. + } + +} diff --git a/bzip2/CompressorInputStream.java b/bzip2/CompressorInputStream.java new file mode 100644 index 0000000..4ab9428 --- /dev/null +++ b/bzip2/CompressorInputStream.java @@ -0,0 +1,81 @@ +package bzip2; +/* included in https://commons.apache.org/proper/commons-compress + reused under Apache License version 2.0 +*/ + +import java.io.InputStream; + +public abstract class CompressorInputStream extends InputStream { + private long bytesRead = 0; + + /** + * Increments the counter of already read bytes. + * Doesn't increment if the EOF has been hit (read == -1) + * + * @param read the number of bytes read + * + * @since 1.1 + */ + protected void count(final int read) { + count((long) read); + } + + /** + * Increments the counter of already read bytes. + * Doesn't increment if the EOF has been hit (read == -1) + * + * @param read the number of bytes read + */ + protected void count(final long read) { + if (read != -1) { + bytesRead = bytesRead + read; + } + } + + /** + * Decrements the counter of already read bytes. + * + * @param pushedBack the number of bytes pushed back. + * @since 1.7 + */ + protected void pushedBackBytes(final long pushedBack) { + bytesRead -= pushedBack; + } + + /** + * Returns the current number of bytes read from this stream. + * @return the number of read bytes + * @deprecated this method may yield wrong results for large + * archives, use #getBytesRead instead + */ + @Deprecated + public int getCount() { + return (int) bytesRead; + } + + /** + * Returns the current number of bytes read from this stream. + * @return the number of read bytes + * + * @since 1.1 + */ + public long getBytesRead() { + return bytesRead; + } + + /** + * Returns the amount of raw or compressed bytes read by the stream. + * + *

This implementation invokes {@link #getBytesRead}.

+ * + *

Provides half of {@link + * org.apache.commons.compress.utils.InputStreamStatistics} + * without forcing subclasses to implement the other half.

+ * + * @return the amount of decompressed bytes returned by the stream + * @since 1.17 + */ + public long getUncompressedCount() { + return getBytesRead(); + } +} diff --git a/bzip2/CountingInputStream.java b/bzip2/CountingInputStream.java new file mode 100644 index 0000000..0b531f5 --- /dev/null +++ b/bzip2/CountingInputStream.java @@ -0,0 +1,61 @@ +package bzip2; +/* included in https://commons.apache.org/proper/commons-compress + reused under Apache License version 2.0 +*/ + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Stream that tracks the number of bytes read. + * @since 1.3 + * @NotThreadSafe + */ +public class CountingInputStream extends FilterInputStream { + private long bytesRead; + + public CountingInputStream(final InputStream in) { + super(in); + } + + @Override + public int read() throws IOException { + final int r = in.read(); + if (r >= 0) { + count(1); + } + return r; + } + @Override + public int read(final byte[] b) throws IOException { + return read(b, 0, b.length); + } + @Override + public int read(final byte[] b, final int off, final int len) throws IOException { + final int r = in.read(b, off, len); + if (r >= 0) { + count(r); + } + return r; + } + /** + * Increments the counter of already read bytes. + * Doesn't increment if the EOF has been hit (read == -1) + * + * @param read the number of bytes read + */ + protected final void count(final long read) { + if (read != -1) { + bytesRead += read; + } + } + + /** + * Returns the current number of bytes read from this stream. + * @return the number of read bytes + */ + public long getBytesRead() { + return bytesRead; + } +} diff --git a/bzip2/InputStreamStatistics.java b/bzip2/InputStreamStatistics.java new file mode 100644 index 0000000..c1ff9e9 --- /dev/null +++ b/bzip2/InputStreamStatistics.java @@ -0,0 +1,16 @@ +package bzip2; +/* included in https://commons.apache.org/proper/commons-compress + reused under Apache License version 2.0 +*/ + +public interface InputStreamStatistics { + /** + * @return the amount of raw or compressed bytes read by the stream + */ + long getCompressedCount(); + + /** + * @return the amount of decompressed bytes returned by the stream + */ + long getUncompressedCount(); +} diff --git a/bzip2/Rand.java b/bzip2/Rand.java new file mode 100644 index 0000000..8246ae0 --- /dev/null +++ b/bzip2/Rand.java @@ -0,0 +1,74 @@ +package bzip2; +/* included in https://commons.apache.org/proper/commons-compress + reused under Apache License version 2.0 +*/ +/** + * Random numbers for both the compress and decompress BZip2 classes. + */ +final class Rand { + + private static final int[] RNUMS = { + 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, + 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, + 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, + 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, + 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, + 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, + 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, + 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, + 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, + 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, + 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, + 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, + 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, + 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, + 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, + 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, + 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, + 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, + 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, + 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, + 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, + 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, + 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, + 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, + 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, + 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, + 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, + 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, + 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, + 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, + 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, + 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, + 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, + 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, + 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, + 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, + 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, + 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, + 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, + 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, + 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, + 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, + 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, + 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, + 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, + 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, + 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, + 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, + 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, + 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, + 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, + 936, 638 + }; + + /** + * Return the random number at a specific index. + * + * @param i the index + * @return the random number + */ + static int rNums(final int i){ + return RNUMS[i]; + } +} \ No newline at end of file diff --git a/info/bliki/extensions/scribunto/ScribuntoException.java b/info/bliki/extensions/scribunto/ScribuntoException.java new file mode 100644 index 0000000..643c4ef --- /dev/null +++ b/info/bliki/extensions/scribunto/ScribuntoException.java @@ -0,0 +1,11 @@ +package info.bliki.extensions.scribunto; + +public final class ScribuntoException extends Exception { + public ScribuntoException(Exception e) { + super(e); + } + + public ScribuntoException(String s) { + super(s); + } +} diff --git a/info/bliki/extensions/scribunto/engine/lua/ScribuntoLuaEngine.java b/info/bliki/extensions/scribunto/engine/lua/ScribuntoLuaEngine.java new file mode 100644 index 0000000..491cd78 --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/ScribuntoLuaEngine.java @@ -0,0 +1,647 @@ +/* Scribunto interface with Luaj based on Axel Kramer Scribunto engine: https://github.com/axkr/info.bliki.wikipedia_parser/tree/master/bliki-core/src/main/java/info/bliki/extensions/scribunto + +references: +https://www.mediawiki.org/wiki/Extension:Scribunto +https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual + +php & lua code: +https://github.com/wikimedia/mediawiki-extensions-Scribunto/tree/master/includes/Engines/LuaCommon + +*/ +package info.bliki.extensions.scribunto.engine.lua; + +import info.bliki.extensions.scribunto.ScribuntoException; +import info.bliki.extensions.scribunto.engine.lua.interfaces.MwHtml; +import info.bliki.extensions.scribunto.engine.lua.interfaces.MwInit; +import info.bliki.extensions.scribunto.engine.lua.interfaces.MwInterface; +import info.bliki.extensions.scribunto.engine.lua.interfaces.MwLanguage; +import info.bliki.extensions.scribunto.engine.lua.interfaces.MwMessage; +import info.bliki.extensions.scribunto.engine.lua.interfaces.MwSite; +import info.bliki.extensions.scribunto.engine.lua.interfaces.MwText; +import info.bliki.extensions.scribunto.engine.lua.interfaces.MwTitle; +import info.bliki.extensions.scribunto.engine.lua.interfaces.MwUri; +import info.bliki.extensions.scribunto.engine.lua.interfaces.MwUstring; +import info.bliki.extensions.scribunto.template.Frame; + +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaClosure; +import org.luaj.vm2.LuaError; +import org.luaj.vm2.LuaFunction; +import org.luaj.vm2.LuaString; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Prototype; +import org.luaj.vm2.Varargs; +import org.luaj.vm2.lib.OneArgFunction; +import org.luaj.vm2.lib.ResourceFinder; +import org.luaj.vm2.lib.ThreeArgFunction; +import org.luaj.vm2.lib.TwoArgFunction; +import org.luaj.vm2.lib.VarArgFunction; +import org.luaj.vm2.lib.ZeroArgFunction; +import org.luaj.vm2.lib.jse.JsePlatform; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import wiki.parserfunctions.ParserFunction; +import wiki.parserfunctions.ParserFunctions; +import wiki.MagicWords; +import wiki.tools.WikiPage; + +public final class ScribuntoLuaEngine implements MwInterface { + private static final int MAX_EXPENSIVE_CALLS = 10; + private static final boolean ENABLE_LUA_DEBUG_LIBRARY = false; + private final Globals globals; + private Frame currentFrame; + private final Map childFrames = new HashMap<>(); + private int expensiveFunctionCount; + + private final Map compileCache = new HashMap<>(); + private final MwInterface[] interfaces; + + private final WikiPage wp; + + private final static String module_label = "Module:"; + + private final boolean debug = false; + + public ScribuntoLuaEngine(WikiPage wp) { + this.wp = wp; + globals = ENABLE_LUA_DEBUG_LIBRARY ? JsePlatform.debugGlobals() : JsePlatform.standardGlobals(); + globals.finder = new LuaResourceFinder(globals.finder); + + extendGlobals(globals); + + this.interfaces = new MwInterface[] { + new MwSite(wp), + new MwUstring(), + new MwTitle(wp), + new MwText(), + new MwUri(), + new MwMessage(), + new MwHtml(), + new MwLanguage(wp), + }; + + try { + load(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public String invoke(String moduleName, String functionName, Frame parent, Map params, boolean trace_calls) throws ScribuntoException { + if (debug || trace_calls) { + System.out.println("invoke, moduleName="+moduleName+", functionName="+functionName); + for(Map.Entry entry : params.entrySet()) { + System.out.println(entry.getKey() + " => " + entry.getValue()); + } + } + Prototype prototype = compileCache.get(moduleName); + if (prototype == null) { + try { + prototype = globals.compilePrototype(new ByteArrayInputStream(getRawWikiContent(moduleName).getBytes(StandardCharsets.UTF_8)), moduleName); + compileCache.put(moduleName, prototype); + } catch (LuaError | IOException e) { + throw new ScribuntoException(e); + } + } + final Frame frame = new Frame(module_label + moduleName, params, parent, true); + final LuaValue function = loadFunction(functionName, prototype, frame); + + return executeFunctionChunk(function, frame); + } + + + @Override + public String name() { + return "mw"; + } + + protected Globals getGlobals() { + return globals; + } + + LuaValue loadFunction(String functionName, Prototype prototype, Frame frame) throws ScribuntoException { + try { + currentFrame = frame; + LuaValue function = new LuaClosure(prototype, globals).checkfunction().call().get(functionName); + if (function.isnil()) { + throw new ScribuntoException("no such function '"+functionName+"'"); + } + return function; + } catch (LuaError e) { + throw new ScribuntoException(e); + } finally { + currentFrame = null; + } + } + + String executeFunctionChunk(LuaValue luaFunction, Frame frame) { + try { + currentFrame = frame; + LuaValue executeFunction = globals.get("mw").get("executeFunction"); + + final LuaString result = executeFunction.call(luaFunction).checkstring(); + return new String(result.m_bytes, result.m_offset, result.m_length, StandardCharsets.UTF_8); + } finally { + currentFrame = null; + } + } + + private void load() throws IOException { + load(new MwInit()); + load(this); + for (MwInterface iface : interfaces) { + load(iface); + } + + stubTitleBlacklist(); + stubExecuteModule(); + stubWikiBase(); + } + + private void stubTitleBlacklist() { + // TODO move to separate file + final LuaValue mw = globals.get("mw"); + LuaValue ext = mw.get("ext"); + if (ext.isnil()) { + ext = new LuaTable(); + mw.set("ext", ext); + } + LuaTable blacklist = new LuaTable(); + blacklist.set("test", new TwoArgFunction() { + @Override + public LuaValue call(LuaValue action, LuaValue title) { + return NIL; + } + }); + ext.set("TitleBlacklist", blacklist); + } + + + private void stubExecuteModule() { + // don't need module isolation + final LuaValue mw = globals.get("mw"); + mw.set("executeModule", new VarArgFunction() { + @Override public Varargs invoke(Varargs args) { + LuaFunction chunk = args.arg(1).checkfunction(); + LuaValue name = args.arg(2); + + final LuaValue res = chunk.call(); + + if (name.isnil()) { + return LuaValue.varargsOf(new LuaValue[]{LuaValue.TRUE, res}); + } else { + if (!res.istable()) { + return LuaValue.varargsOf(new LuaValue[]{FALSE, toLuaString(res.typename())}); + } else { + return LuaValue.varargsOf(new LuaValue[]{LuaValue.TRUE, res.checktable().get(name)}); + } + } + } + }); + } + + private void stubWikiBase() { + // fake https://www.mediawiki.org/wiki/Extension:Wikibase + // https://github.com/wikimedia/mediawiki-extensions-Wikibase/blob/master/client/includes/DataAccess/Scribunto/mw.wikibase.lua + final LuaValue mw = globals.get("mw"); + final LuaTable wikibase = new LuaTable(); + wikibase.set("getEntity", new ZeroArgFunction() { + @Override public LuaValue call() { + return NIL; + } + }); + wikibase.set("getEntityObject", new ZeroArgFunction() { + @Override + public LuaValue call() { + return NIL; + } + }); + wikibase.set("getBestStatements", new TwoArgFunction() { + @Override public LuaValue call(LuaValue id, LuaValue property) { + return new LuaTable(); + } + }); + wikibase.set("sitelink", new TwoArgFunction() { + @Override + public LuaValue call(LuaValue itemId, LuaValue siteId) { + return NIL; + } + }); + wikibase.set("getEntityIdForCurrentPage", new ZeroArgFunction() { + @Override + public LuaValue call() { + return NIL; + } + }); + wikibase.set("getDescription", new OneArgFunction() { + @Override public LuaValue call(LuaValue id) { + return id;//fake + } + }); + wikibase.set("getLabel", new OneArgFunction() { + @Override public LuaValue call(LuaValue id) { + return id;//fake + } + }); + mw.set("wikibase", wikibase); + } + + private void load(MwInterface luaInterface) throws IOException { + final String filename = fileNameForInterface(luaInterface); + + try (InputStream is = globals.finder.findResource(filename)) { + if (is == null) { + throw new FileNotFoundException("could not find '"+filename+"'. Make sure it is on the classpath."); + } + final LuaValue pkg = globals.load(is, "@"+filename, "bt", globals).call(); + final LuaValue setupInterface = pkg.get("setupInterface"); + + if (!setupInterface.isnil()) { + globals.set("mw_interface", luaInterface.getInterface()); + setupInterface.call(luaInterface.getSetupOptions()); + } + } + } + + @Override + public LuaTable getInterface() { + final LuaTable table = new LuaTable(); + table.set("loadPackage", loadPackage()); + table.set("loadPHPLibrary", loadPHPLibrary()); + table.set("frameExists", frameExists()); + table.set("newChildFrame", newChildFrame()); + table.set("getExpandedArgument", getExpandedArgument()); + table.set("getAllExpandedArguments", getAllExpandedArguments()); + table.set("getFrameTitle", getFrameTitle());//reference: ??? + table.set("expandTemplate", expandTemplate()); + table.set("callParserFunction", callParserFunction()); + table.set("preprocess", preprocess()); + table.set("incrementExpensiveFunctionCount", incrementExpensiveFunctionCount()); + table.set("isSubsting", isSubsting()); + return table; + } + + private LuaValue callParserFunction() { + return new ThreeArgFunction() { + @Override + public LuaValue call(LuaValue frameId, LuaValue function, LuaValue args) { + final String functionName = function.checkjstring(); + int idx = functionName.indexOf(":"); + String name = idx != -1 ? functionName.substring(0, idx) : functionName; + String param0 = idx != -1 ? functionName.substring(idx + 1) : null; + + ParserFunction pf = ParserFunctions.get(name); + if (debug) + System.out.println("callParserFunction: "+name); + + if (pf != null) { + ArrayList parameters = new ArrayList<>(); + if (param0 != null) + parameters.add(param0.trim()); + LuaTable arguments = args.checktable(); + for (int i = 1; i <= arguments.length(); i++) { +//System.out.println("arguments("+i+"):" + arguments.get(i).checkjstring()); + parameters.add(arguments.get(i).checkjstring()); + } + + Frame parent = null; + final String ret = pf.evaluate(wp, parameters, parent); + return ret == null ? NIL : LuaString.valueOf(ret); + + } else { + MagicWords.MagicWord mw = MagicWords.get(name); + if (mw != null) { + final LuaTable arguments = args.checktable(); + final String argument = arguments.get(1).checkjstring(); + final String processed = MagicWords.evaluate(mw, argument, wp.getPagename(), wp.getRevision()); + return processed == null ? NIL : toLuaString(processed); + } else { + System.out.println("unknown name:" + name); + } + } + return NIL; + } + }; + } + + private LuaValue isSubsting() { + return new ZeroArgFunction() { + @Override public LuaValue call() { + return LuaValue.valueOf(true); + } + }; + } + + private LuaValue incrementExpensiveFunctionCount() { + return new ZeroArgFunction() { + @Override public LuaValue call() { + if (++expensiveFunctionCount > MAX_EXPENSIVE_CALLS) { + error("too many expensive function calls"); + } + return NIL; + } + }; + } + + private LuaValue preprocess() { + return new TwoArgFunction() { + @Override public LuaValue call(LuaValue frameId, LuaValue text) { + if (debug) + System.out.println("preprocess: " + text); + return toLuaString(wp.getTemplateParser().parse(text.checkjstring(), wp)); + } + }; + } + + private LuaValue expandTemplate() { + return new ThreeArgFunction() { + @Override + public LuaValue call(LuaValue frameId, LuaValue title, LuaValue args) { + if (debug) + System.out.println("expandTemplate: " + title); + Map parameterMap = luaParams(args); + + if (debug) + parameterMap.forEach((name, value) -> System.out.print(name + (value.isEmpty() ? "" : " = " + value) + ", ")); + + Frame parent = null; + return toLuaString(wp.getTemplateParser().getParsedTemplate(title.tojstring(), wp, parameterMap, parent)); + } + }; + } + + private LuaValue getExpandedArgument() { + return new TwoArgFunction() { + @Override + public LuaValue call(LuaValue frameId, LuaValue name) { + return getFrameById(frameId).getArgument(name.tojstring()); + } + }; + } + + private Frame getFrameById(LuaValue luaFrameId) { + final String frameId = luaFrameId.checkjstring(); + Frame frame = null; + if (frameId.equals("parent")) { + frame = currentFrame.getParent(); + } else if (frameId.equals("current")) { + frame = currentFrame; + } else if (childFrames.containsKey(frameId)) { + frame = childFrames.get(frameId); + } + if (frame == null) { + throw new AssertionError("No frame set: "+ luaFrameId); + } + return frame; + } + + private LuaValue getFrameTitle() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + return toLuaString(getFrameById(arg).getTitle()); + } + }; + } + + private LuaValue getAllExpandedArguments() { + return new OneArgFunction() { + @Override public LuaValue call(LuaValue frameId) { + return getFrameById(frameId).getAllArguments(); + } + }; + } + + private LuaValue newChildFrame() { + return new ThreeArgFunction() { + /** + * Creates a new frame + * @return the new frame id + */ + @Override + public LuaValue call(LuaValue frameId, LuaValue title, LuaValue args) { + String ns = currentFrame.getNamespace(); + final Frame childFrame = + currentFrame.newChild( + (ns.isEmpty() ? "" : ns + ":") + title.checkjstring(), + luaParams(args), + currentFrame.isSubsting()); + + childFrames.put(childFrame.getFrameId(), childFrame); + return toLuaString(childFrame.getFrameId()); + } + }; + } + + private LuaValue frameExists() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + return TRUE; + } + }; + } + + private OneArgFunction loadPackage() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue packageName) { + return loadModule(packageName.tojstring()); + } + }; + } + + private LuaValue loadModule(String chunkName) throws LuaError { + Prototype prototype = compileCache.get(chunkName); + if (prototype != null) { + return new LuaClosure(prototype, globals); + } else { + try (InputStream is = findPackage(chunkName)) { + return new LuaClosure( + loadAndCache(is, chunkName), + globals); + } catch (ScribuntoException | IOException e) { + throw new LuaError(e); + } + } + } + + private Prototype loadAndCache(InputStream code, String chunkName) throws ScribuntoException { + try { + Prototype prototype = globals.compilePrototype(code, chunkName); + compileCache.put(chunkName, prototype); + + return prototype; + } catch (LuaError | IOException e) { + throw new ScribuntoException(e); + } + } + + private OneArgFunction loadPHPLibrary() { + return new OneArgFunction() { + @Override public LuaValue call(LuaValue arg) { + return LuaValue.NIL; + } + }; + } + + private String fileNameForInterface(MwInterface luaInterface) { + return luaInterface.name() + (luaInterface.name().endsWith(".lua") ? "" : ".lua"); + } + + private InputStream findPackage(String name) throws IOException { + if (name.startsWith(module_label)) {//TODO: handle also alias and language localizations + return findModule(name.substring(module_label.length())); + } else { + InputStream is = globals.finder.findResource(name+".lua"); + if (is != null) { + return is; + } else { + throw new IOException("package "+name+" not found"); + } + } + } + + private InputStream findModule(final String moduleName) throws IOException { +//System.out.println("findModule, name: " + moduleName); + try { + return new ByteArrayInputStream(getRawWikiContent(moduleName).getBytes(StandardCharsets.UTF_8)); + } catch (FileNotFoundException e) { + // fall back to local files + final String name = moduleName.replaceAll("[/:]", "_"); + InputStream is = globals.finder.findResource(name+".lua"); + if (is != null) { + return is; + } else { + throw e; + } + } + } + + protected String getRawWikiContent(String pageName) throws FileNotFoundException { + final String content = wp.getModule(pageName); + if (content == null) { + throw new FileNotFoundException("could not find module \"" + pageName + "\""); + } + return content; + } + + @Override + public LuaValue getSetupOptions() { + return new LuaTable(); + } + + private void extendGlobals(final Globals globals) { + globals.set("setfenv", new TwoArgFunction() { + @Override + public LuaValue call(LuaValue f, LuaValue env) { + return f; + } + }); + globals.set("gefenv", new OneArgFunction() { + public LuaValue call(LuaValue f) { + return globals; + } + }); + globals.set("unpack", new unpack()); + + // math.log10 got removed in 5.2 + LuaValue math = globals.get("math"); + math.set("log10", new OneArgFunction() { + @Override + public LuaValue call(LuaValue luaValue) { + return valueOf(Math.log10(luaValue.checkdouble())); + } + }); + + // math.mod was renamed to fmod + math.set("mod", math.get("modf")); + + // table.maxn got removed in 5.2 + LuaValue table = globals.get("table"); + table.set("maxn", new OneArgFunction() { + @Override public LuaValue call(LuaValue arg) { + // TODO: is this correct? + return arg.checktable().len(); + } + }); + + // table.getn got removed in 5.2 + table.set("getn", new OneArgFunction() { + @Override public LuaValue call(LuaValue arg) { + if (arg.isnil()) { + return LuaValue.error("bad argument #1 to 'getn' (table expected, got nil)"); + } else { + return arg.checktable().len(); + } + } + }); + } + + public static LuaString toLuaString(String string) { + return LuaString.valueOf(string.getBytes(StandardCharsets.UTF_8)); + } + + private static Map luaParams(LuaValue args) { + Map parameters = new HashMap<>(); + final LuaTable table = args.checktable(); + LuaValue key = LuaValue.NIL; + while (true) { + Varargs next = table.next(key); + if ((key = next.arg1()).isnil()) + break; + + LuaValue value = next.arg(2); + parameters.put(key.checkjstring(), value.checkjstring()); + } + return parameters; + } + + private static class unpack extends VarArgFunction { + public Varargs invoke(Varargs args) { + LuaTable t = args.checktable(1); + switch (args.narg()) { + case 1: return t.unpack(); + case 2: return t.unpack(args.checkint(2)); + default: return t.unpack(args.checkint(2), args.checkint(3)); + } + } + } + + + static class LuaResourceFinder implements ResourceFinder { + private static final String[] LIBRARY_PATH = new String[] { + "", + "luabit", + "lualib", + "ustring", + }; + + private final ResourceFinder delegate; + + LuaResourceFinder(ResourceFinder delegate) { + this.delegate = delegate; + } + + @Override + public InputStream findResource(String filename) { + for (String path : LIBRARY_PATH) { + InputStream is = delegate.findResource(path + "/" + filename); + if (is != null) { + return is; + } + } + return null; + } + } + +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/Languages.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/Languages.java new file mode 100644 index 0000000..8f872d7 --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/Languages.java @@ -0,0 +1,25 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + + +import java.util.HashMap; +import java.util.Map; + +final class Languages { + private final Map codes = new HashMap<>(); + { + codes.put("de", "Deutsch"); + codes.put("en", "English"); + codes.put("es", "Español"); + codes.put("fr", "Français"); + codes.put("it", "Italiano"); + codes.put("pt", "Português"); + } + + /** + * @param code string: The code of the language for which to get the name + * @return string: Language name or empty + */ + public String getName(String code) { + return codes.get(code); + } +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/MwHtml.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwHtml.java new file mode 100644 index 0000000..c023040 --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwHtml.java @@ -0,0 +1,44 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; + +public class MwHtml implements MwInterface { + /** + * string Prefix and suffix for temporary replacement strings + * for the multipass parser. + * + * \x7f should never appear in input as it's disallowed in XML. + * Using it at the front also gives us a little extra robustness + * since it shouldn't match when butted up against identifier-like + * string constructs. + * + * Must not consist of all title characters, or else it will change + * the behavior of in a link. + * + * Must have a character that needs escaping in attributes, otherwise + * someone could put a strip marker in an attribute, to get around + * escaping quote marks, and break out of the attribute. Thus we add + * `'". + */ + public static final String MARKER_SUFFIX = "-QINU`\"'\u007f"; + public static final String MARKER_PREFIX = "\u007f'\"`UNIQ-"; + + @Override + public String name() { + return "mw.html"; + } + + @Override + public LuaTable getInterface() { + return new LuaTable(); + } + + @Override + public LuaValue getSetupOptions() { + LuaTable opts = new LuaTable(); + opts.set("uniqPrefix", MARKER_PREFIX); + opts.set("uniqSuffix", MARKER_SUFFIX); + return opts; + } +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/MwInit.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwInit.java new file mode 100644 index 0000000..a6b9032 --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwInit.java @@ -0,0 +1,18 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; + +public class MwInit implements MwInterface { + @Override public String name() { + return "mwInit"; + } + + @Override public LuaTable getInterface() { + return null; + } + + @Override public LuaValue getSetupOptions() { + return null; + } +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/MwInterface.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwInterface.java new file mode 100644 index 0000000..167a3df --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwInterface.java @@ -0,0 +1,36 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.OneArgFunction; + +public interface MwInterface { + + /** + * @return the name of this interface + */ + String name(); + + /** + * @return a table with all methods exposed + */ + LuaTable getInterface(); + + + /** + * @return options needed for setup + */ + LuaValue getSetupOptions(); + + class DefaultFunction { + static OneArgFunction defaultFunction() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + // logger.warn("defaultFunction " + argName + " called"); + return LuaValue.NIL; + } + }; + } + } +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/MwLanguage.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwLanguage.java new file mode 100644 index 0000000..28bc157 --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwLanguage.java @@ -0,0 +1,195 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + +import org.luaj.vm2.LuaError; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.OneArgFunction; +import org.luaj.vm2.lib.ThreeArgFunction; +import org.luaj.vm2.lib.TwoArgFunction; +import org.luaj.vm2.lib.ZeroArgFunction; + +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; +import java.util.Locale; + +import wiki.tools.WikiPage; + +import info.bliki.wiki.template.dates.PHPDate; +import info.bliki.wiki.template.dates.StringToTime; + +import static info.bliki.extensions.scribunto.template.Frame.toLuaString; +import static info.bliki.extensions.scribunto.engine.lua.interfaces.MwInterface.DefaultFunction.defaultFunction; + +public class MwLanguage implements MwInterface { + private final Languages languages = new Languages(); + private final WikiPage wp; + private final PHPDate phpDate; + + public MwLanguage(WikiPage wp) { + this.wp = wp; + this.phpDate = new PHPDate(); + } + + @Override + public String name() { + return "mw.language"; + } + + @Override + public LuaTable getInterface() { + LuaTable table = new LuaTable(); + table.set("isSupportedLanguage", defaultFunction()); + table.set("isKnownLanguageTag", isKnownLanguageTag()); + table.set("isValidCode", defaultFunction()); + table.set("isValidBuiltInCode", defaultFunction()); + table.set("fetchLanguageName", fetchLanguageName()); + table.set("fetchLanguageNames", fetchLanguageNames()); + table.set("getFallbacksFor", defaultFunction()); + table.set("getContLangCode", getContLangCode()); + table.set("formatDate", formatDate()); + table.set("lc", lc()); + table.set("uc", uc()); + table.set("lcfirst", lcfirst()); + table.set("ucfirst", ucfirst()); + /* + // TODO + caseFold + formatNum + formatDate + formatDuration + getDurationIntervals + convertPlural + convertGrammar + gender + */ + return table; + } + + private LuaValue lcfirst() { + return new TwoArgFunction() { + @Override + public LuaValue call(LuaValue lang, LuaValue string) { + final Locale locale = getLocale(lang); + final String input = string.checkjstring(); + switch (input.length()) { + case 0: return string; + case 1: return toLuaString(input.toLowerCase(locale)); + default: return toLuaString(input.substring(0, 1).toLowerCase(locale) + input.substring(1)); + } + } + }; + } + + private LuaValue ucfirst() { + return new TwoArgFunction() { + @Override + public LuaValue call(LuaValue lang, LuaValue string) { + final Locale locale = getLocale(lang); + final String input = string.checkjstring(); + switch (input.length()) { + case 0: return string; + case 1: return toLuaString(input.toUpperCase(locale)); + default: return toLuaString(input.substring(0, 1).toUpperCase(locale) + input.substring(1)); + } + } + }; + } + + private LuaValue formatDate() { + return new ThreeArgFunction() { + @Override public LuaValue call(LuaValue lang, LuaValue format, LuaValue date) { + // https://php.net/manual/en/function.date.php + final String formatString = format.checkjstring(); + final String dateString = date.checkjstring(); + final Date time; + if (dateString.isEmpty()) { + time = new Date(System.currentTimeMillis()); + } else { + Object parseDate = StringToTime.date(dateString); + if (parseDate instanceof Date) { + time = (Date) parseDate; + } else { + throw new LuaError("Could not parse date '"+dateString+"'"); + } + } + return toLuaString(phpDate.format(formatString, + ZonedDateTime.ofInstant(time.toInstant(), ZoneId.systemDefault()))); + } + }; + } + + private LuaValue lc() { + return new TwoArgFunction() { + @Override public LuaValue call(LuaValue code, LuaValue string) { + return toLuaString(string.checkjstring().toLowerCase(getLocale(code))); + } + }; + } + + private LuaValue uc() { + return new TwoArgFunction() { + @Override public LuaValue call(LuaValue code, LuaValue string) { + return toLuaString(string.checkjstring().toUpperCase(getLocale(code))); + } + }; + } + + private LuaValue isKnownLanguageTag() { + return new OneArgFunction() { + @Override public LuaValue call(LuaValue code) { + return LuaValue.TRUE; + } + }; + } + + private LuaValue fetchLanguageNames() { + return new TwoArgFunction() { + /** + * Get an array of language names, indexed by code. + * + * @param inLanguage null|string: Code of language in which to return the names + * Use null for autonyms (native names) + * @param include string: + * 'all' all available languages + * 'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames (default) + * 'mwfile' only if the language is in 'mw' *and* has a message file + * @return array: language code => language name + */ + @Override public LuaValue call(LuaValue inLanguage, LuaValue include) { + return new LuaTable(); + } + }; + } + + private LuaValue fetchLanguageName() { + return new TwoArgFunction() { + @Override public LuaValue call(LuaValue code, LuaValue inLanguage) { + final String name = languages.getName(code.checkjstring()); + return name == null ? NIL : toLuaString(name); + } + }; + } + + private LuaValue getContLangCode() { + return new ZeroArgFunction() { + @Override + public LuaValue call() { + return toLuaString("en"); + } + }; + } + + @Override + public LuaValue getSetupOptions() { + return null; + } + + private static Locale getLocale(LuaValue value) { + Locale locale = Locale.forLanguageTag(value.checkjstring()); + if (locale.getLanguage().isEmpty()) { + LuaValue.error(String.format("language code '%s' is invalid", value.checkstring())); + } + return locale; + } +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/MwMessage.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwMessage.java new file mode 100644 index 0000000..c6b7d6d --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwMessage.java @@ -0,0 +1,103 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + +import org.luaj.vm2.LuaNumber; +import org.luaj.vm2.LuaString; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.OneArgFunction; +import org.luaj.vm2.lib.TwoArgFunction; + +import java.text.NumberFormat; +import java.util.Locale; + +import static info.bliki.extensions.scribunto.template.Frame.toLuaString; + + +public class MwMessage implements MwInterface { + @Override + public String name() { + return "mw.message"; + } + + @Override + public LuaTable getInterface() { + LuaTable iface = new LuaTable(); + iface.set("plain", messagePlain()); + iface.set("check", messageCheck()); + return iface; + } + + private LuaValue messageCheck() { + return new TwoArgFunction() { + @Override + public LuaValue call(LuaValue what, LuaValue data) { + return FALSE; + } + }; + } + + private LuaValue messagePlain() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue data) { + return new Message(data).plain(); + } + }; + } + + @Override + public LuaValue getSetupOptions() { + LuaTable options = new LuaTable(); + + options.set("lang", "en"); + return options; + } + + private static class Message { + final boolean useDB; + final String lang; + final LuaTable params; + final LuaTable keys; + final LuaString rawMessage; + + Message(LuaValue data) { + useDB = data.get("useDB").optboolean(false); + lang = data.get("lang").optjstring("en"); + keys = data.get("keys").opttable(new LuaTable()); + params = data.get("params").opttable(new LuaTable()); + rawMessage = data.get("rawMessage").optstring(LuaString.valueOf("")); + } + + LuaValue plain() { + String msg = rawMessage.tojstring(); + return toLuaString(replace(msg, params)); + } + + private String replace(String msg, LuaTable params) { + for (int i=params.length(); i>0; i--) { + LuaValue param = params.get(i); + String actualParam; + if (param.istable()) { + + if (!param.get("raw").isnil()) { + actualParam = param.get("raw").checkjstring(); + } else if (!param.get("num").isnil()) { + if (param.get("num").isnumber()) { + LuaNumber number = param.get("num").checknumber(); + NumberFormat nf = NumberFormat.getInstance(Locale.forLanguageTag(lang)); + actualParam = nf.format(number.todouble()); + } else { + actualParam = param.get("num").tojstring(); + } + } else { + actualParam = "unknown"; + } + } else { + actualParam = param.checkjstring(); + } + msg = msg.replace("$"+i, actualParam); + } + return msg; + } + } +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/MwSite.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwSite.java new file mode 100644 index 0000000..a890595 --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwSite.java @@ -0,0 +1,170 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + +import java.util.HashMap; +import java.util.Map.Entry; + +import org.luaj.vm2.LuaError; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.OneArgFunction; +import org.luaj.vm2.lib.TwoArgFunction; + +import wiki.tools.WikiPage; +import wiki.NameSpaces.NameSpace; +import static wiki.NameSpaces.getNameSpaces; +import static wiki.NameSpaces.getNameSpaceNumber; + +import static info.bliki.extensions.scribunto.template.Frame.toLuaString; + +import static org.luaj.vm2.LuaValue.NIL; + +public class MwSite implements MwInterface { + private final WikiPage wp; + + public MwSite(WikiPage wp) { + this.wp = wp; + } + + @Override + public String name() { + return "mw.site"; + } + + @Override + public LuaTable getInterface() { + LuaTable table = new LuaTable(); + table.set("getNsIndex", getNsIndex()); + table.set("pagesInCategory", pagesInCategory()); + table.set("pagesInNamespace", pagesInNamespace()); + table.set("usersInGroup", usersInGroup()); + table.set("interwikiMap", interwikiMap()); + return table; + } + + private LuaValue interwikiMap() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue luaValue) { + if (luaValue.isnil() || "string".equals(luaValue.typename())) { + return new LuaTable(); + } else { + throw new LuaError("bad argument #1 to 'interwikiMap' (string expected, got " + luaValue.typename() + ")"); + } + } + }; + } + + private LuaValue usersInGroup() { + return new OneArgFunction() { + @Override public LuaValue call(LuaValue group) { + return LuaValue.valueOf(0); + } + }; + } + + private LuaValue pagesInNamespace() { + return new OneArgFunction() { + @Override public LuaValue call(LuaValue ns) { + return LuaValue.valueOf(0); + } + }; + } + + private LuaValue pagesInCategory() { + return new TwoArgFunction() { + @Override public LuaValue call(LuaValue category, LuaValue which) { + return LuaValue.valueOf(0); + } + }; + } + + private LuaValue getNsIndex() { + return new OneArgFunction() { + @Override + /** + * Get a namespace key by value, case insensitive. Canonical namespace + * names override custom ones defined for the current language. + * + * @param name String + * @return mixed An integer if $text is a valid value otherwise false + */ + public LuaValue call(LuaValue name) { + Integer ns = getNameSpaceNumber(name.tojstring()); + if (ns != null) { + return LuaValue.valueOf(ns); + } else { + return FALSE; + } + } + }; + } + + @Override + public LuaValue getSetupOptions() { + LuaTable table = new LuaTable(); + table.set("siteName", "test"); // $GLOBALS['wgSitename'], + table.set("server", "server"); // $GLOBALS['wgServer'], + table.set("scriptPath", ""); // $GLOBALS['wgScriptPath'], + table.set("stylePath", ""); // $GLOBALS['wgStylePath'], + table.set("currentVersion", "1.0"); // SpecialVersion::getVersion(), + table.set("stats", stats()); + table.set("namespaces", namespaces()); + return table; + } + + private LuaTable stats() { + LuaTable stats = new LuaTable(); + + stats.set("pages", 0); // (int)SiteStats::pages(), + stats.set("articles", 0); // (int)SiteStats::articles(), + stats.set("files", 0); // (int)SiteStats::images(), + stats.set("edits", 0); // (int)SiteStats::edits(), + stats.set("views", NIL); // $wgDisableCounters ? null : (int)SiteStats::views(), + stats.set("users", 0); // (int)SiteStats::users(), + stats.set("activeUsers", 0); // (int)SiteStats::activeUsers(), + stats.set("admins", 0); // (int)SiteStats::numberingroup( 'sysop' ), + return stats; + } + + private LuaTable namespaces() { + LuaTable table = new LuaTable(); + HashMap namespaces = getNameSpaces(); + for (Entry entry : namespaces.entrySet()) { + table.set(entry.getKey(), luaDataForNamespace(entry.getValue())); + } + return table; + } + + private LuaTable luaDataForNamespace(NameSpace namespaceValue) { + LuaTable ns = new LuaTable(); + ns.set("id", namespaceValue.get_id()); + ns.set("name", namespaceValue.get_name().replace('_', ' ')); + ns.set("canonicalName", namespaceValue.get_canonicalName().replace('_', ' ')); + ns.set("hasSubpages", LuaValue.valueOf(namespaceValue.get_hasSubpages())); + ns.set("hasGenderDistinction", LuaValue.valueOf(namespaceValue.get_hasGenderDistinction())); + ns.set("isCapitalized", LuaValue.valueOf(namespaceValue.get_isCapitalized())); + ns.set("isContent", LuaValue.valueOf(namespaceValue.get_isContent())); + ns.set("isIncludable", LuaValue.valueOf(namespaceValue.get_isIncludable())); + ns.set("isMovable", LuaValue.valueOf(namespaceValue.get_isMovable())); + ns.set("isSubject", LuaValue.valueOf(namespaceValue.get_isSubject())); + ns.set("isTalk", LuaValue.valueOf(namespaceValue.get_isTalk())); + + LuaValue[] aliases = new LuaValue[namespaceValue.get_aliases() == null ? 0 : namespaceValue.get_aliases().size()]; + if (namespaceValue.get_aliases() != null) + for (int i = 0; i < namespaceValue.get_aliases().size(); i++) { + aliases[i] = toLuaString(namespaceValue.get_aliases().get(i)); + } + ns.set("aliases", LuaValue.listOf(aliases)); + ns.set("subject", namespaceValue.get_subject()); + if (namespaceValue.get_talk() != null) + ns.set("talk", namespaceValue.get_talk()); + if (namespaceValue.get_associated() != null) + ns.set("associated", namespaceValue.get_associated()); + else ns.set("associated", NIL); + + ns.set("defaultContentModel", NIL);//<--a che serve ? + + return ns; + } + +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/MwText.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwText.java new file mode 100644 index 0000000..2f268db --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwText.java @@ -0,0 +1,146 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.OneArgFunction; +import org.luaj.vm2.lib.TwoArgFunction; +import org.luaj.vm2.lib.ZeroArgFunction; + +import static info.bliki.extensions.scribunto.template.Frame.toLuaString; + +// https://github.com/wikimedia/mediawiki-extensions-Scribunto/blob/master/includes/Engines/LuaCommon/TextLibrary.php +public class MwText implements MwInterface { + @Override + public String name() { + return "mw.text"; + } + + @Override + public LuaTable getInterface() { + LuaTable table = new LuaTable(); + + table.set("unstrip", unstrip()); + table.set("unstripNoWiki", unstripNoWiki()); + table.set("killMarkers", killMarkers()); + table.set("getEntityTable", getEntityTable()); + table.set("jsonEncode", jsonEncode()); + table.set("jsonDecode", jsonDecode()); + return table; + } + + // Replaces MediaWiki strip markers with the corresponding text. + // Other types of strip markers are not changed. + private LuaValue unstripNoWiki() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + return toLuaString(unstripNoWiki(arg.tojstring())); + } + }; + } + public static String unstripTag(String str, String tag) { + StringBuilder sb = new StringBuilder(); + int length = str.length(); + int i = 0, marker; + + String nowiki_marker = MwHtml.MARKER_PREFIX + "-" + tag; + while (i < length && ((marker = str.indexOf(nowiki_marker, i)) != -1)) { + sb.append(str, i, marker); + i = marker + nowiki_marker.length(); + int end = str.indexOf(MwHtml.MARKER_SUFFIX, i); + if (end != -1) { + sb.append("<"); + sb.append(tag); + sb.append(">"); + i = end + MwHtml.MARKER_SUFFIX.length(); + } else break; + } + if (i < length) + sb.append(str, i, length); + + return sb.toString(); + } + public static String unstripNoWiki(String str) { + return str.contains("nowiki") ? unstripTag(unstripTag(str, "nowiki"), "/nowiki") : str; + } + + // Removes all MediaWiki strip markers from a string. \127'"`UNIQ--tagname-8 hex digits-QINU`"'\127 + private LuaValue killMarkers() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + return toLuaString(killMarkers(arg.tojstring())); + } + }; + } + + private static String killMarkers(String str) { + StringBuilder sb = new StringBuilder(); + int length = str.length(); + int i = 0, marker; + + while (i < length && ((marker = str.indexOf(MwHtml.MARKER_PREFIX, i)) != -1)) { + sb.append(str, i, marker); + i = marker + MwHtml.MARKER_PREFIX.length(); + int end = str.indexOf(MwHtml.MARKER_SUFFIX, i); + if (end != -1) { + i = end + MwHtml.MARKER_SUFFIX.length(); + } else break; + } + if (i < length) + sb.append(str, i, length); + + return sb.toString(); + } + + // includes/json/FormatJson.php, mostly wrapper around PHP's json_encode + private LuaValue jsonEncode() { + return new TwoArgFunction() { + @Override + public LuaValue call(LuaValue value, LuaValue flags) { + System.out.println("warning: jsonEncode was called, but it is not implemented"); + return null; + } + }; + } + + // includes/json/FormatJson.php + private LuaValue jsonDecode() { + return new TwoArgFunction() { + @Override + public LuaValue call(LuaValue json, LuaValue flags) { + System.out.println("warning: jsonDecode was called, but it is not implemented"); + return null; + } + }; + } + + private LuaValue getEntityTable() { + return new ZeroArgFunction() { + @Override + public LuaValue call() { + System.out.println("warning: getEntityTable was called, but it is not implemented"); + return NIL; + } + }; + } + + private LuaValue unstrip() {//killMarkers(unstripNoWiki(s)) + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + return toLuaString(killMarkers(unstripNoWiki(arg.tojstring()))); + } + }; + } + + @Override + public LuaValue getSetupOptions() { + LuaTable table = new LuaTable(); + table.set("nowiki_protocols", new LuaTable()); + table.set("comma", ", "); + table.set("and", " and "); + table.set("ellipsis", "..."); + return table; + } +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/MwTitle.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwTitle.java new file mode 100644 index 0000000..b4f8bf8 --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwTitle.java @@ -0,0 +1,221 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Varargs; +import org.luaj.vm2.lib.LibFunction; +import org.luaj.vm2.lib.OneArgFunction; +import org.luaj.vm2.lib.TwoArgFunction; + +import wiki.tools.WikiPage; + +import static info.bliki.extensions.scribunto.template.Frame.toLuaString; + +import static org.luaj.vm2.LuaValue.EMPTYSTRING; + +// https://github.com/wikimedia/mediawiki-extensions-Scribunto/blob/master/includes/Engines/LuaCommon/TitleLibrary.php +public class MwTitle implements MwInterface { + private final WikiPage wp; + + public MwTitle(WikiPage wp) { + this.wp = wp; + } + + @Override + public String name() { + return "mw.title"; + } + + @Override + public LuaTable getInterface() { + LuaTable table = new LuaTable(); + table.set("newTitle", newTitle()); + table.set("makeTitle", makeTitle()); + table.set("getExpensiveData", getExpensiveData()); + table.set("getUrl", getUrl()); + table.set("getContent", getContent()); + table.set("fileExists", fileExists()); + table.set("getFileInfo", getFileInfo()); + table.set("protectionLevels", protectionLevels()); + table.set("cascadingProtection", cascadingProtection()); + return table; + } + + @Override + public LuaValue getSetupOptions() { + LuaTable table = new LuaTable(); + table.set("thisTitle", title("", wp.getPagename())); + table.set("NS_MEDIA", -2); + return table; + } + + private LuaValue getFileInfo() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + return LuaValue.NIL; + } + }; + } + + private LuaValue getExpensiveData() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + return new LuaTable(); + } + }; + } + + private LuaValue getUrl() { + return new LibFunction() { + /** + * $text, $which, $query = null, $proto = null + */ + @Override public Varargs invoke(Varargs args) { + return LuaValue.EMPTYSTRING; + } + }; + } + + private LuaValue fileExists() { + return new OneArgFunction() { + /** + * @param page + * @return Whether the file exists. For File- and Media-namespace titles, this is + * expensive. It will also be recorded as an image usage for File- and Media-namespace titles. + */ + @Override public LuaValue call(LuaValue page) { + return NIL; + } + }; + } + + private LuaValue protectionLevels() { + return new OneArgFunction() { + @Override public LuaValue call(LuaValue action) { + return new LuaTable(); + } + }; + } + + private LuaValue cascadingProtection() { + return new OneArgFunction() { + @Override public LuaValue call(LuaValue action) { + LuaTable table = new LuaTable(); + table.set("restrictions", new LuaTable()); + return table; + } + }; + } + + private LuaValue getContent() { + return new OneArgFunction() { + /** + * @param page the title of the page to fetch + * @return the (unparsed) content of the page, or nil if there is no page. + * The page will be recorded as a transclusion. + */ + @Override public LuaValue call(LuaValue page) { + return toLuaString(wp.getContent(page.tojstring())); + } + }; + } + + private LuaValue newTitle() { + return new TwoArgFunction() { + /** + * Handler for title.new + * + * @param text_or_id string|int Title or page_id to fetch + * @param defaultNamespace string|int Namespace name or number to use if $text_or_id doesn't override + * @return array Lua data + */ + @Override + public LuaValue call(LuaValue text_or_id, LuaValue defaultNamespace) { + if (text_or_id.isnumber()) { + // no database lookup + return NIL; + } else if (text_or_id.isstring()) { + if (isValidTitle(text_or_id, defaultNamespace)) { + return title( + defaultNamespace, + text_or_id, + toLuaString("fragment"), + toLuaString("interwiki")); + } else { + return NIL; + } + } else { + return NIL; + } + } + }; + } + + private boolean isValidTitle(LuaValue title, LuaValue defaultNamespace) { + // To be complete, this method would have to replicate the logic in + // MediaWikiTitleCodec.php#splitTitleString + // + // https://github.com/wikimedia/mediawiki/blob/c13fee87d42bdd6fdf6764edb6f6475c14c27749/includes/title/MediaWikiTitleCodec.php#L252 + return !title.checkjstring().trim().isEmpty(); + } + + /** + * Creates a title object with title title in namespace namespace, optionally with the + * specified fragment and interwiki prefix. namespace may be any key found in mw.site.namespaces. + * + * @param $ns string|int Namespace + * @param $text string Title text + * @param $fragment string URI fragment + * @param $interwiki string Interwiki code + * + * @return if the resulting title is not valid, returns nil. + */ + private LuaValue makeTitle() { + return new LibFunction() { + @Override + public Varargs invoke(Varargs args) { + LuaValue ns = args.arg(1); + LuaValue title = args.arg(2); + LuaValue fragment = args.arg(3); + LuaValue interwiki = args.arg(4); + + if (isValidTitle(title, ns)) { + return title(ns, title, fragment, interwiki); + } else { + return NIL; + } + } + }; + } + + + private LuaValue title(String namespace, String pageName) { + return title( + toLuaString(namespace != null ? namespace : ""), + toLuaString(pageName != null ? pageName : ""), + LuaValue.NIL, + LuaValue.NIL + ); + } + + private LuaValue title(LuaValue ns, LuaValue title, LuaValue fragment, LuaValue interwiki) { + LuaTable table = new LuaTable(); + table.set("isLocal", EMPTYSTRING); + table.set("isRedirect", EMPTYSTRING); + table.set("subjectNsText", EMPTYSTRING); + table.set("interwiki", interwiki.isnil() ? EMPTYSTRING : interwiki); + table.set("namespace", LuaValue.valueOf(0)); + table.set("nsText", ns.isnil() ? LuaValue.EMPTYSTRING : ns); + table.set("text", title); + table.set("id", title); + table.set("fragment", fragment.isnil() ? EMPTYSTRING : fragment); + table.set("contentModel", EMPTYSTRING); + table.set("thePartialUrl", EMPTYSTRING); + table.set("exists", LuaValue.TRUE); + + + return table; + } +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/MwUri.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwUri.java new file mode 100644 index 0000000..d8b91f1 --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwUri.java @@ -0,0 +1,113 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.lib.OneArgFunction; +import org.luaj.vm2.lib.TwoArgFunction; + +import static info.bliki.extensions.scribunto.template.Frame.toLuaString; + + +public class MwUri implements MwInterface { + private final String wgServer; + private final String wgCanonicalServer; + private final String wgScript; + private final String wgArticlePath; + + public MwUri() { + wgServer = "//wiki.local"; + wgCanonicalServer = "http://wiki.local"; + boolean wgUsePathInfo = true; + wgScript = "/w/index.php"; + String wgScriptPath = "/w"; + wgArticlePath = "/wiki/$1"; + } + + @Override + public String name() { + return "mw.uri"; + } + + @Override + public LuaTable getInterface() { + LuaTable iface = new LuaTable(); + iface.set("anchorEncode", anchorEncode()); + iface.set("localUrl", localUrl()); + iface.set("fullUrl", fullUrl()); + iface.set("canonicalUrl", canonicalUrl()); + return iface; + } + + private LuaValue anchorEncode() { + return new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + return LuaValue.EMPTYSTRING; + } + }; + } + + private LuaValue canonicalUrl() { + return new TwoArgFunction() { + @Override + public LuaValue call(LuaValue page, LuaValue query) { + if (query.isnil()) { + return toLuaString(wgCanonicalServer + pagePath(page)); + } else { + return toLuaString(wgCanonicalServer + formatQuery(page, query)); + } + } + }; + } + + private LuaValue fullUrl() { + return new TwoArgFunction() { + @Override + public LuaValue call(LuaValue page, LuaValue query) { + if (query.isnil()) { + return toLuaString(wgServer + pagePath(page)); + } else { + return toLuaString(wgServer + formatQuery(page, query)); + } + } + }; + } + + private LuaValue localUrl() { + return new TwoArgFunction() { + @Override + public LuaValue call(LuaValue page, LuaValue query) { + if (query.isnil()) { + return toLuaString(pagePath(page)); + } else { + return toLuaString(formatQuery(page, query)); + } + } + }; + } + + @Override + public LuaValue getSetupOptions() { + return new LuaTable(); + } + + private String pagePath(LuaValue page) { + return wgArticlePath.replace("$1", page.tojstring()); + } + + private String formatQuery(LuaValue page, LuaValue query) { + if (query.isstring()) { + return wgScript + "?title="+page.checkstring()+"&"+query.checkjstring(); + } else if (query.istable()) { + LuaTable params = query.checktable(); + + StringBuilder base = new StringBuilder(wgScript + "?title=" + page.checkstring() + "&"); + for (LuaValue key : params.keys()) { + base.append(key.tojstring()).append("=").append(params.get(key).tojstring()); + } + return base.toString(); + } else { + throw new AssertionError("unexpected type: "+query); + } + } +} diff --git a/info/bliki/extensions/scribunto/engine/lua/interfaces/MwUstring.java b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwUstring.java new file mode 100644 index 0000000..f531aaf --- /dev/null +++ b/info/bliki/extensions/scribunto/engine/lua/interfaces/MwUstring.java @@ -0,0 +1,26 @@ +package info.bliki.extensions.scribunto.engine.lua.interfaces; + +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; + +public class MwUstring implements MwInterface { + @Override + public String name() { + return "mw.ustring"; + } + + @Override + public LuaTable getInterface() { + return new LuaTable(); + } + + @Override + public LuaValue getSetupOptions() { + LuaTable table = new LuaTable(); + // https://www.mediawiki.org/wiki/Manual:$wgMaxArticleSize + // stringLengthLimit = $wgMaxArticleSize * 1024; + table.set("stringLengthLimit", 2048 * 1024); + table.set("patternLengthLimit", 10000); + return table; + } +} diff --git a/info/bliki/extensions/scribunto/template/Frame.java b/info/bliki/extensions/scribunto/template/Frame.java new file mode 100644 index 0000000..f161ce7 --- /dev/null +++ b/info/bliki/extensions/scribunto/template/Frame.java @@ -0,0 +1,106 @@ +package info.bliki.extensions.scribunto.template; + +import org.luaj.vm2.LuaString; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; + +import java.util.HashMap; +import java.util.Map; + +import java.nio.charset.StandardCharsets; + +import static wiki.NameSpaces.isNameSpace; +import static wiki.tools.Utilities.normaliseTitle; + +/*reference: +https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#mw.getCurrentFrame +https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#frame-object +*/ + +public final class Frame { + private final String page; + private final Map templateParameters; + private final Frame parent; + private final boolean isSubst; + + public Frame(String page, Map templateParameters, Frame parent, boolean isSubst) { + this.templateParameters = templateParameters; + this.page = page; + this.parent = parent; + this.isSubst = isSubst; + } + + public Frame newChild(String pageName, Map templateParameters, boolean isSubst) { + return new Frame(pageName, templateParameters, this, isSubst); + } + + public LuaValue getArgument(String name) { + String value = templateParameters != null ? templateParameters.get(name) : null; + if (value != null) { + return toLuaString(value); + } else { + return LuaValue.NIL; + } + } + + public Map getTemplateParameters() { + return new HashMap<>(templateParameters); + } + + public String getTemplateParameter(String name) { + return templateParameters.get(name); + } + + public LuaValue getAllArguments() { + LuaTable table = new LuaTable(); + for (Map.Entry entry: templateParameters.entrySet()) { + try { + final int numberedParam = Integer.parseInt(entry.getKey()); + table.set(LuaValue.valueOf(numberedParam), toLuaString(entry.getValue())); + } catch (NumberFormatException e) { + table.set(toLuaString(entry.getKey()), toLuaString(entry.getValue())); + } + } + return table; + } + + public static LuaString toLuaString(String string) { + return LuaString.valueOf(string.getBytes(StandardCharsets.UTF_8)); + } + + public Frame getParent() { + return parent; + } + + public String getTitle() {//fullPagename + return page; + } + + public String getPage() {//page name without namespace + int idx = page.indexOf(':'); + if (idx != -1) { + String namespace = normaliseTitle(page.substring(0, idx), true); + if (namespace.length() > 0 && isNameSpace(namespace)) + return page.substring(idx + 1); + } + return page; + } + + public String getNamespace() { + int idx = page.indexOf(':'); + if (idx != -1) { + String namespace = normaliseTitle(page.substring(0, idx), true); + if (namespace.length() > 0 && isNameSpace(namespace)) + return namespace; + } + return ""; + } + + public boolean isSubsting() { + return isSubst; + } + + public String getFrameId() { + return getClass().getName() + "@" + Integer.toHexString(hashCode()); + } +} diff --git a/info/bliki/wiki/template/dates/PHPDate.java b/info/bliki/wiki/template/dates/PHPDate.java new file mode 100644 index 0000000..225c848 --- /dev/null +++ b/info/bliki/wiki/template/dates/PHPDate.java @@ -0,0 +1,189 @@ +package info.bliki.wiki.template.dates; +/* +code cloned from https://github.com/axkr/info.bliki.wikipedia_parser/tree/master/bliki-core/src/main/java/info/bliki/wiki/template/dates/PHPDate.java +*/ +import java.time.DayOfWeek; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +import static java.time.DayOfWeek.SUNDAY; +import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME; +import static java.util.Locale.ENGLISH; + +/** + * https://secure.php.net/manual/en/function.date.php + */ +public final class PHPDate { + private static final DateTimeFormatter RFC_2822 = DateTimeFormatter.RFC_1123_DATE_TIME; + private final Map formatMapping; + + public PHPDate() { + this.formatMapping = new HashMap<>(); + + // Day of the month, 2 digits with leading zeros, 01 to 31 + formatMapping.put('d', "dd"); + + // A textual representation of a day, three letters, Mon through Sun + formatMapping.put('D', "E"); + + // Day of the month without leading zeros, 1 to 31 + formatMapping.put('j', "d"); + + // A full textual representation of the day of the week, Sunday through Saturday + formatMapping.put('l', "EEEE"); + + // ISO-8601 numeric representation of the day of the week, 1 (for Monday) through 7 (for Sunday) + formatMapping.put('N', null); + + // English ordinal suffix for the day of the month, 2 characters, st, nd, rd or th. + formatMapping.put('S', null); + + // Numeric representation of the day of the week, 0 (for Sunday) through 6 (for Saturday) + formatMapping.put('w', null); + + // The day of the year (starting from 0), 0 through 365 + formatMapping.put('z', "D"); + + // ISO-8601 week number of year, weeks starting on Monday, Example: 42 (the 42nd week in the year) + formatMapping.put('W', "w"); + + // A full textual representation of a month, such as January or March + formatMapping.put('F', "MMMM"); + + // Numeric representation of a month, with leading zeros, 01 through 12 + formatMapping.put('m', "MM"); + + // A short textual representation of a month, three letters, Jan through Dec + formatMapping.put('M', "MMM"); + + // Numeric representation of a month, without leading zeros, 1 through 12 + formatMapping.put('n', "M"); + + // Number of days in the given month, 28 through 31 + formatMapping.put('t', null); + + // Whether it's a leap year, 1 if it is a leap year, 0 otherwise. + formatMapping.put('L', null); + + // ISO-8601 week-numbering year. Examples: 1999 or 2003 + formatMapping.put('o', "y"); + + // A full numeric representation of a year, 4 digits. Examples: 1999 or 2003 + formatMapping.put('Y', "yyyy"); + + // A two digit representation of a year + formatMapping.put('y', "yy"); + + // Lowercase Ante meridiem and Post meridiem. am or pm + formatMapping.put('a', null); + + // Uppercase Ante meridiem and Post meridiem. AM or PM + formatMapping.put('A', "a"); + + // Swatch Internet time. 000 through 999 + formatMapping.put('B', null); + + // 12-hour format of an hour without leading zeros + formatMapping.put('g', "h"); + + // 24-hour format of an hour without leading zeros + formatMapping.put('G', "H"); + + // 12-hour format of an hour with leading zeros + formatMapping.put('h', "hh"); + + // 24-hour format of an hour with leading zeros + formatMapping.put('H', "HH"); + + // Minutes with leading zeros + formatMapping.put('i', "mm"); + + // Seconds, with leading zeros + formatMapping.put('s', "ss"); + + // Microseconds + formatMapping.put('u', "SSS"); + + // Milliseconds + formatMapping.put('v', "e"); + + // Timezone identifier. Examples: UTC, GMT, Atlantic/Azores + formatMapping.put('e', "VV"); + + // Whether or not the date is in daylight saving time. 1 if Daylight Saving Time, 0 otherwise. + formatMapping.put('I', null); + + // Difference to Greenwich time (GMT) in hours. Example: +0200 + formatMapping.put('O', "ZZ"); + + // Difference to Greenwich time (GMT) with colon between hours and minutes. Example: +02:00 + formatMapping.put('P', "xxx"); + + // Timezone abbreviation. Examples: EST, MDT ... + formatMapping.put('T', "zzzz"); + + // Timezone offset in seconds. -43200 through 50400 + formatMapping.put('Z', null); + + // ISO 8601 date. 2004-02-12T15:19:21+00:00 + formatMapping.put('c', null); + + // RFC 2822 formatted date + formatMapping.put('r', null); + + // Seconds since the Unix Epoch. + formatMapping.put('U', null); + } + + public String format(String format, ZonedDateTime time) { + StringBuilder builder = new StringBuilder(); + for (int i=0; iString format, and instantiates a + * {@link Date} object. + * + *

+ * There are two ways to use StringToTime to parse dates: + *

    + *
  • static methods ({@link #time(Object)}, {@link #date(Object)}, + * {@link #cal(Object)})
  • + *
  • creating an instance of StringToTime with + * {@link #StringToTime(Object)}
  • + *
+ *

+ * + *

+ * The static methods provide a UNIX-style timestamp, a {@link Date} + * instance, or a {@link Calendar} instance. In the event the time + * expression provided is invalid, these methods return + * Boolean.FALSE. + *

+ * + *

+ * Instances of StringToTime inherit from {@link Date}; + * so, when instantiated with an expression that the algorithm recognizes, the + * resulting instance of StringToTime can be passed to any method + * or caller requiring a {@link Date} object. Unlike the static + * methods, attempting to create a StringToTime instance with an + * invalid expression of time results in a {@link StringToTimeException}. + *

+ * + *

Valid expressions of time

+ * + *

+ * All expressions are case-insensitive. + *

+ * + *
    + *
  • now (equal to new Date())
  • + *
  • today (equal to StringToTime("00:00:00.000"))
  • + *
  • midnight (equal to + * StringToTime("00:00:00.000 +24 hours"))
  • + *
  • morning or this morning (by default, equal to + * StringToTime("07:00:00.000"))
  • + *
  • noon (by default, equal to + * StringToTime("12:00:00.000")
  • + *
  • afternoon or this afternoon (by default, equal + * to StringToTime("13:00:00.000")
  • + *
  • evening or this evening (by default, equal to + * StringToTime("17:00:00.000")
  • + *
  • tonight (by default, equal to + * StringToTime("20:00:00.000")
  • + *
  • tomorrow (by default, equal to + * StringToTime("now +24 hours"))
  • + *
  • tomorrow morning (by default, equal to + * StringToTime("morning +24 hours"))
  • + *
  • noon tomorrow or tomorrow noon (by default, + * equal to StringToTime("noon +24 hours"))
  • + *
  • tomorrow afternoon (by default, equal to + * StringToTime("afternoon +24 hours"))
  • + *
  • yesterday (by default, equal to + * StringToTime("now -24 hours"))
  • + *
  • all the permutations of yesterday and morning, + * noon, afternoon, and evening
  • + *
  • October 26, 1981 or Oct 26, 1981
  • + *
  • October 26 or Oct 26
  • + *
  • 26 October 1981
  • + *
  • 26 Oct 1981
  • + *
  • 26 Oct 81
  • + *
  • 10/26/1981 or 10-26-1981
  • + *
  • 10/26/81 or 10-26-81
  • + *
  • 1981/10/26 or 1981-10-26
  • + *
  • 10/26 or 10-26
  • + *
+ * + *

+ * Copied from github.com/collegeman/stringtotime + *

+ * + * @author Aaron Collegeman acollegeman@clutch-inc.com + * @since JRE 1.5.0 + * @see "https://us3.php.net/manual/en/function.strtotime.php" + */ +public final class StringToTime extends Date { + + private static final long serialVersionUID = 7889493424407815134L; + + // default SimpleDateFormat string is the standard MySQL date format + private static final String defaultSimpleDateFormat = "yyyy-MM-dd HH:mm:ss.SSS"; + private static final Locale DEFAULT_LOCALE = Locale.ENGLISH; + + // An expression of time (hour)(:(minute))?((:(second))(.(millisecond))?)?( + // *(am?|pm?))?(RFC 822 time zone|general time zone)? + private static final String timeExpr = "(\\d{1,2})(:(\\d{1,2}))?(:(\\d{1,2})(\\.(\\d{1,3}))?)?( *(am?|pm?))?( *\\-\\d{4})?"; + + /** + * Patterns and formats recognized by the algorithm; first match wins, so + * insert most specific patterns first. + */ + private static final PatternAndFormat[] known = { + + // TODO: ISO 8601 and derivatives + + // just the year + new PatternAndFormat(Pattern.compile("\\d{4}"), new Format(FormatType.YEAR)), + + // decrement, e.g., -1 day + new PatternAndFormat(Pattern.compile("-( *\\d+ +[^ ]+)+", Pattern.CASE_INSENSITIVE), new Format(FormatType.DECREMENT)), + + // increment, e.g., +1 day + new PatternAndFormat( + Pattern.compile("\\+( *\\d+ +[^ ]+)+", Pattern.CASE_INSENSITIVE),//patch x bliki, removed ? that caused problems parsing "31 July 1711 +11 days" + new Format(FormatType.INCREMENT) + ), + + + // e.g., October 26 and Oct 26 + new PatternAndFormat(Pattern.compile("([a-z]+) +(\\d{1,2})", Pattern.CASE_INSENSITIVE), new Format(FormatType.MONTH_AND_DATE)), + + // e.g., 26 October 1981, or 26 Oct 1981, or 26 Oct 81 + new PatternAndFormat(Pattern.compile("\\d{1,2} +[a-z]+ +(\\d{2}|\\d{4})", Pattern.CASE_INSENSITIVE), new Format("d MMM y")), + + // e.g., October 1981 + new PatternAndFormat(Pattern.compile("[a-z]+ +\\d{4}", Pattern.CASE_INSENSITIVE), new Format("MMM yyyy")), + + // now or today + new PatternAndFormat( + Pattern + .compile( + "(midnight|now|today|(this +)?(morning|afternoon|evening)|tonight|noon( +tomorrow)?|tomorrow|tomorrow +(morning|afternoon|evening|night|noon)?|yesterday|yesterday +(morning|afternoon|evening|night)?)", + Pattern.CASE_INSENSITIVE), new Format(FormatType.WORD)), + + // time, 24-hour and 12-hour + new PatternAndFormat(Pattern.compile(timeExpr, Pattern.CASE_INSENSITIVE), new Format(FormatType.TIME)), + + // e.g., 1997, March 14 + new PatternAndFormat(Pattern.compile("(\\d{2}|\\d{4}) *, *[a-z]+ +\\d{1,2}", Pattern.CASE_INSENSITIVE), + new Format("y, MMM d")), + + // e.g., October 26, 1981 or Oct 26, 1981 + new PatternAndFormat(Pattern.compile("[a-z]+ +\\d{1,2} *, *(\\d{2}|\\d{4})", Pattern.CASE_INSENSITIVE), + new Format("MMM d, y")), + + // e.g., October 26 1981 or Oct 26 1981 + new PatternAndFormat(Pattern.compile("[a-z]+ +\\d{1,2} +(\\d{2}|\\d{4})", Pattern.CASE_INSENSITIVE), + new Format("MMM d y")), + + // e.g., 10/26/1981 or 10/26/81 + new PatternAndFormat(Pattern.compile("\\d{1,2}/\\d{1,2}/\\d{2,4}"), new Format("M/d/y")), + + // e.g., 10-26-1981 or 10-26-81 + new PatternAndFormat(Pattern.compile("\\d{1,2}-\\d{1,2}-\\d{2,4}"), new Format("M-d-y")), + + // e.g., 10/26 or 10-26 + new PatternAndFormat(Pattern.compile("(\\d{1,2})([/\\-])(\\d{1,2})"), new Format(FormatType.MONTH_AND_DATE_WITH_SLASHES)), + + // e.g., 1981/10/26 + new PatternAndFormat(Pattern.compile("\\d{4}/\\d{1,2}/\\d{1,2}"), new Format("y/M/d")), + + // e.g., 19811026 + new PatternAndFormat(Pattern.compile("\\d{4}\\d{2}\\d{2}"), new Format("yyyyMMdd")), + + // e.g., 1981-10-26 + new PatternAndFormat(Pattern.compile("\\d{4}-\\d{1,2}-\\d{1,2}"), new Format("y-M-d")), + + // e.g., 1981-10 + new PatternAndFormat(Pattern.compile("\\d{4}-\\d{2}"), new Format("yyyy-MM")), + + // e.g., October or Oct + new PatternAndFormat( + Pattern + .compile( + "(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)", + Pattern.CASE_INSENSITIVE), new Format(FormatType.MONTH)), + + // e.g., Tuesday or Tue + new PatternAndFormat(Pattern.compile("(Sun(day)?|Mon(day)?|Tue(sday)?|Wed(nesday)?|Thu(rsday)?|Fri(day)?|Sat(urday)?)", + Pattern.CASE_INSENSITIVE), new Format(FormatType.DAY_OF_WEEK)), + + // next, e.g., next Tuesday + new PatternAndFormat(Pattern.compile("next +(.*)", Pattern.CASE_INSENSITIVE), new Format(FormatType.NEXT)), + + // last, e.g., last Tuesday + new PatternAndFormat(Pattern.compile("last +(.*)", Pattern.CASE_INSENSITIVE), new Format(FormatType.LAST)), + + // compound statement + new PatternAndFormat( + Pattern.compile("(.*) *((([+\\-]).*)| "+timeExpr+")$", Pattern.CASE_INSENSITIVE), + new Format(FormatType.COMPOUND) + ) + + + }; + + /** The format to use in {@link #toString()} */ + private final String simpleDateFormat; + + public StringToTime(Object dateTimeString) { + this(dateTimeString, new Date(), defaultSimpleDateFormat); + } + + private StringToTime(Object dateTimeString, Date now) { + this(dateTimeString, now, defaultSimpleDateFormat); + } + + private StringToTime(Object dateTimeString, Date now, String simpleDateFormat) { + super(0); + assert dateTimeString != null; + assert now != null; + assert simpleDateFormat != null; + + /** Date/Time string parsed */ + this.simpleDateFormat = simpleDateFormat; + + /* + The {@link Date} interpreted from {@link #dateTimeString}, or + {@link Boolean} false + */ /** + * The {@link Date} interpreted from {@link #dateTimeString}, or + * {@link Boolean} false + */Object date = StringToTime.date(dateTimeString, now); + if (!Boolean.FALSE.equals(date)) + setTime(((Date) date).getTime()); + else { + throw new StringToTimeException(dateTimeString); + } + } + + /** + * @return Calendar set to timestamp {@link Date#getTime()} + */ + public Calendar getCal() { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(super.getTime()); + return cal; + } + + /** + * @param simpleDateFormat + * @see SimpleDateFormat + * @return Date formatted according to simpleDateFormat + */ + public String format(String simpleDateFormat) { + return new SimpleDateFormat(simpleDateFormat, DEFAULT_LOCALE).format(this); + } + + /** + * @return If {@link #simpleDateFormat} provided in constructor, then attempts + * to format date accordingly; otherwise, returns the + * String value of {@link Date#getTime()}. + */ + @Override + public String toString() { + if (simpleDateFormat != null) + return new SimpleDateFormat(simpleDateFormat, DEFAULT_LOCALE).format(this); + else + return new SimpleDateFormat("yyyy/dd/MM", DEFAULT_LOCALE).format(this); // String.valueOf(super.getTime()); + } + + /** + * A single parameter version of {@link #time(Object, Date)}, passing a new + * instance of {@link Date} as the second parameter. + * + * @param dateTimeString + * @return A {@link Long} timestamp representative of + * dateTimeString, or {@link Boolean} + * false. + * @see #time(Object, Date) + */ + public static Object time(Object dateTimeString) { + return time(dateTimeString, new Date()); + } + + /** + * Parse dateTimeString and produce a timestamp. + * + * @param dateTimeString + * @param now + * @return
    + *
  • If equal to "now", return the number of milliseconds + * since January 1, 1970 or the value of now.
  • + *
  • If an incremental or decremental statement, e.g., +1 hour or -1 + * week, or a composite thereof, e.g., +1 hour 1 minute 1 second, + * returns a date equal to the increment/decrement plus the value of + * now. + *
+ */ + private static Object time(Object dateTimeString, Date now) { + try { + if (dateTimeString != null) { + String trimmed = String.valueOf(dateTimeString).trim(); + for (PatternAndFormat paf : known) { + Matcher m = paf.matches(trimmed); + if (m.matches()) { + // System.out.println(String.format("[%s] triggered format [%s]: %s", + // dateTimeString, paf.f, new Date(time))); + return paf.parse(trimmed, now, m); + } + } + + // no match + } + return Boolean.FALSE; + } catch (Exception e) { // thrown by various features of the parser + if (!Boolean.parseBoolean(System.getProperty(StringToTime.class + ".EXCEPTION_ON_PARSE_FAILURE", "false"))) { + return Boolean.FALSE; + } else { + throw new StringToTimeException(dateTimeString, e); + } + } + } + + private static ParserResult getParserResult(String trimmedDateTimeString, Date now) throws ParseException { + for (PatternAndFormat paf : known) { + Matcher m = paf.matches(trimmedDateTimeString); + if (m.matches()) { + return new ParserResult(paf.parse(trimmedDateTimeString, now, m), paf.f.type); + } + } + + return null; + } + + public static Object date(Object dateTimeString) { + return date(dateTimeString, new Date()); + } + + private static Object date(Object dateTimeString, Date now) { + Object time = time(dateTimeString, now); + return (Boolean.FALSE.equals(time)) ? Boolean.FALSE : new Date((Long) time); + } + + public static Object cal(Object dateTimeString) { + return cal(dateTimeString, new Date()); + } + + private static Object cal(Object dateTimeString, Date now) { + Object date = date(dateTimeString, now); + if (Boolean.FALSE.equals(date)) + return Boolean.FALSE; + else { + Calendar cal = Calendar.getInstance(); + cal.setTime((Date) date); + return cal; + } + } + + private static class PatternAndFormat { + final Pattern p; + final Format f; + + PatternAndFormat(Pattern p, Format f) { + this.p = p; + this.f = f; + } + + Matcher matches(String dateTimeString) { + return p.matcher(dateTimeString); + } + + Long parse(String dateTimeString, Date now, Matcher m) throws ParseException { + return f.parse(dateTimeString, now, m).getTime(); + } + } + + private static class ParserResult { + final FormatType type; + final Long timestamp; + + ParserResult(Long timestamp, FormatType type) { + this.timestamp = timestamp; + this.type = type; + } + } + + private static class Format { + + private static final Pattern unit = Pattern + .compile("(\\d+) +(s(ec(ond)?)?|mo(n(th)?)?|(hour|hr?)|d(ay)?|(w(eek)?|wk)|m(in(ute)?)?|(y(ear)?|yr))s?"); + + private static final Pattern removeExtraSpaces = Pattern.compile(" +"); + + private static final Map translateDayOfWeek = new HashMap<>(); + + static { + translateDayOfWeek.put("sunday", 1); + translateDayOfWeek.put("sun", 1); + translateDayOfWeek.put("monday", 2); + translateDayOfWeek.put("mon", 2); + translateDayOfWeek.put("tuesday", 3); + translateDayOfWeek.put("tue", 3); + translateDayOfWeek.put("wednesday", 4); + translateDayOfWeek.put("wed", 4); + translateDayOfWeek.put("thursday", 5); + translateDayOfWeek.put("thu", 5); + translateDayOfWeek.put("friday", 6); + translateDayOfWeek.put("fri", 6); + translateDayOfWeek.put("saturday", 7); + translateDayOfWeek.put("sat", 7); + } + + private String sdf; + + private FormatType type; + + Format(FormatType type) { + this.type = type; + } + + Format(String sdf) { + this.sdf = sdf; + } + + @Override + public String toString() { + if (sdf != null) + return sdf; + else + return type.toString(); + } + + Date parse(String dateTimeString, Date now, Matcher m) throws ParseException { + if (sdf != null) + return new SimpleDateFormat(sdf, DEFAULT_LOCALE).parse(dateTimeString); + else { + dateTimeString = removeExtraSpaces.matcher(dateTimeString).replaceAll(" ").toLowerCase(); + + try { + Calendar cal = Calendar.getInstance(); + cal.setTime(now); + + // word expressions, e.g., "now" and "today" and "tonight" + if (type == FormatType.WORD) { + switch (dateTimeString) { + case "now": + return now; + case "today": + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + return new Date(cal.getTimeInMillis()); + case "morning": + case "this morning": + // by default, this morning begins at 07:00:00.000 + int thisMorningBeginsAt = Integer.parseInt(System.getProperty(StringToTime.class + ".THIS_MORNING_BEGINS_AT", "7")); + cal.set(Calendar.HOUR_OF_DAY, thisMorningBeginsAt); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + return new Date(cal.getTimeInMillis()); + case "noon": + // noon is 12:00:00.000 + cal.set(Calendar.HOUR_OF_DAY, 12); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + return new Date(cal.getTimeInMillis()); + case "afternoon": + case "this afternoon": + // by default, this afternoon begins at 13:00:00.000 + int thisAfternoonBeginsAt = Integer.parseInt(System.getProperty(StringToTime.class + ".THIS_AFTERNOON_BEGINS_AT", + "13")); + cal.set(Calendar.HOUR_OF_DAY, thisAfternoonBeginsAt); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + return new Date(cal.getTimeInMillis()); + case "evening": + case "this evening": + // by default, this evening begins at 17:00:00.000 + int thisEveningBeginsAt = Integer.parseInt(System.getProperty(StringToTime.class + ".THIS_EVENING_BEGINS_AT", "17")); + cal.set(Calendar.HOUR_OF_DAY, thisEveningBeginsAt); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + return new Date(cal.getTimeInMillis()); + case "tonight": + // by default, tonight begins at 20:00:00.000 + int tonightBeginsAt = Integer.parseInt(System.getProperty(StringToTime.class + ".TONIGHT_BEGINS_AT", "20")); + cal.set(Calendar.HOUR_OF_DAY, tonightBeginsAt); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + return new Date(cal.getTimeInMillis()); + case "midnight": + return new StringToTime("00:00:00 +24 hours", now); + case "tomorrow": + return new StringToTime("now +24 hours", now); + case "tomorrow morning": + return new StringToTime("morning +24 hours", now); + case "tomorrow noon": + case "noon tomorrow": + return new StringToTime("noon +24 hours", now); + case "tomorrow afternoon": + return new StringToTime("afternoon +24 hours", now); + case "tomorrow evening": + return new StringToTime("evening +24 hours", now); + case "tomorrow night": + return new StringToTime("tonight +24 hours", now); + case "yesterday": + return new StringToTime("now -24 hours", now); + case "yesterday morning": + return new StringToTime("morning -24 hours", now); + case "yesterday noon": + case "noon yesterday": + return new StringToTime("noon -24 hours", now); + case "yesterday afternoon": + return new StringToTime("afternoon -24 hours", now); + case "yesterday evening": + return new StringToTime("evening -24 hours", now); + case "yesterday night": + return new StringToTime("tonight -24 hours", now); + default: + throw new ParseException(String.format("Unrecognized date word: %s", dateTimeString), 0); + } + } + + // time expressions, 24-hour and 12-hour + else if (type == FormatType.TIME) { + // An expression of time + // (hour)(:(minute))?((:(second))(.(millisecond))?)?( + // *(am?|pm?))?(RFC 822 time zone|general time zone)? + String hour = m.group(1); + String min = m.group(3); + String sec = m.group(5); + String ms = m.group(7); + String amOrPm = m.group(8); + + if (hour != null) { + if (amOrPm != null) + cal.set(Calendar.HOUR, Integer.parseInt(hour)); + else + cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour)); + } else + cal.set(Calendar.HOUR, 0); + + cal.set(Calendar.MINUTE, (min != null ? Integer.parseInt(min) : 0)); + cal.set(Calendar.SECOND, (sec != null ? Integer.parseInt(sec) : 0)); + cal.set(Calendar.MILLISECOND, (ms != null ? Integer.parseInt(ms) : 0)); + + if (amOrPm != null) + cal.set(Calendar.AM_PM, (amOrPm.equals("a") || amOrPm.equals("am") ? Calendar.AM : Calendar.PM)); + + return new Date(cal.getTimeInMillis()); + } + + // increments + else if (type == FormatType.INCREMENT || type == FormatType.DECREMENT) { + Matcher units = unit.matcher(dateTimeString); + while (units.find()) { + int val = Integer.parseInt(units.group(1)) * (type == FormatType.DECREMENT ? -1 : 1); + String u = units.group(2); + + // second + if ("s".equals(u) || "sec".equals(u) || "second".equals(u)) + cal.set(Calendar.SECOND, cal.get(Calendar.SECOND) + val); + + // minute + else if ("m".equals(u) || "min".equals(u) || "minute".equals(u)) + cal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE) + val); + + // hour + else if ("h".equals(u) || "hr".equals(u) || "hour".equals(u)) + cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY) + val); + + // day + else if ("d".equals(u) || "day".equals(u)) + cal.set(Calendar.DATE, cal.get(Calendar.DATE) + val); + + // week + else if ("w".equals(u) || "wk".equals(u) || "week".equals(u)) + cal.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR) + val); + + // month + else if ("mo".equals(u) || "mon".equals(u) || "month".equals(u)) + cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + val); + + // year + else if ("y".equals(u) || "yr".equals(u) || "year".equals(u)) + cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) + val); + + else + throw new IllegalArgumentException(String.format("Unrecognized %s unit: [%s]", type, u)); + } + + return new Date(cal.getTimeInMillis()); + } + + // compound expressions + else if (type == FormatType.COMPOUND) { + Object date = StringToTime.date(m.group(1), now); + if (!Boolean.FALSE.equals(date)) + return (Date) StringToTime.date(m.group(2), (Date) date); + else + throw new IllegalArgumentException(String.format("Couldn't parse %s, so couldn't compound with %s", m.group(1), m + .group(2))); + } + + // month of the year + else if (type == FormatType.MONTH) { + Calendar ref = Calendar.getInstance(); + ref.setTime(new SimpleDateFormat("MMM d, y", DEFAULT_LOCALE).parse(String.format("%s 1, 1970", m.group(1)))); + cal.set(Calendar.MONTH, ref.get(Calendar.MONTH)); + + return new Date(cal.getTimeInMillis()); + } + + // day of week + else if (type == FormatType.DAY_OF_WEEK) { + Integer ref = translateDayOfWeek.get(dateTimeString); + if (cal.get(Calendar.DAY_OF_WEEK) >= ref) + cal.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR) + 1); + cal.set(Calendar.DAY_OF_WEEK, ref); + + return new Date(cal.getTimeInMillis()); + } + + // month and day with slashes + else if (type == FormatType.MONTH_AND_DATE_WITH_SLASHES) { + Calendar ref = Calendar.getInstance(); + ref.setTime(new SimpleDateFormat("M/d/y", DEFAULT_LOCALE).parse(String.format("%s/%s/1970", m.group(1), m.group(3)))); + cal.set(Calendar.MONTH, ref.get(Calendar.MONTH)); + cal.set(Calendar.DATE, ref.get(Calendar.DATE)); + + return new Date(cal.getTimeInMillis()); + } + + // month and day long-hand + else if (type == FormatType.MONTH_AND_DATE) { + Calendar ref = Calendar.getInstance(); + ref.setTime(new SimpleDateFormat("MMM d, y", DEFAULT_LOCALE).parse(String.format("%s %s, 1970", m.group(1), m.group(2)))); + cal.set(Calendar.MONTH, ref.get(Calendar.MONTH)); + cal.set(Calendar.DATE, ref.get(Calendar.DATE)); + + return new Date(cal.getTimeInMillis()); + } + + // next X + else if (type == FormatType.NEXT) { + // Format types MONTH and DAY_OF_WEEK both return future dates, so + // no additional processing is needed + String expr = m.group(1); + ParserResult parsed = StringToTime.getParserResult(expr, now); + + if (parsed != null + && (FormatType.MONTH.equals(parsed.type) || FormatType.DAY_OF_WEEK.equals(parsed.type) || FormatType.MONTH_AND_DATE + .equals(parsed.type))) + return new Date(parsed.timestamp); + else { + if ("week".equals(expr)) + cal.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR) + 1); + else if ("month".equals(expr)) + cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + 1); + else if ("year".equals(expr)) + cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) + 1); + else + throw new IllegalArgumentException(String.format("Invalid expression of time: %s", dateTimeString)); + + return new Date(cal.getTimeInMillis()); + } + } + + // last X + else if (type == FormatType.LAST) { + String expr = m.group(1); + ParserResult parsed = StringToTime.getParserResult(expr, now); + + if (parsed != null && (FormatType.MONTH.equals(parsed.type) || FormatType.MONTH_AND_DATE.equals(parsed.type))) { + return new StringToTime("-1 year", new Date(parsed.timestamp)); + } + + else if (parsed != null && FormatType.DAY_OF_WEEK.equals(parsed.type)) { + return new StringToTime("-1 week", new Date(parsed.timestamp)); + } + + else { + if ("week".equals(expr)) + cal.set(Calendar.WEEK_OF_YEAR, cal.get(Calendar.WEEK_OF_YEAR) - 1); + else if ("month".equals(expr)) + cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - 1); + else if ("year".equals(expr)) + cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) - 1); + else + throw new IllegalArgumentException(String.format("Invalid expression of time: %s", dateTimeString)); + + return new Date(cal.getTimeInMillis()); + } + } + + // year + else if (type == FormatType.YEAR) { + cal.set(Calendar.YEAR, Integer.parseInt(m.group(0))); + return new Date(cal.getTimeInMillis()); + } + + // unimplemented format type + else + throw new IllegalStateException(String.format("Unimplemented FormatType: %s", type)); + } catch (ParseException | IllegalStateException | IllegalArgumentException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(String.format("Unknown failure in string-to-time conversion: %s", e.getMessage()), e); + } + } + } + } + + private enum FormatType { + COMPOUND, MONTH_AND_DATE_WITH_SLASHES, MONTH_AND_DATE, MONTH, DAY_OF_WEEK, NEXT, LAST, INCREMENT, DECREMENT, WORD, TIME, YEAR + } + +} diff --git a/info/bliki/wiki/template/dates/StringToTimeException.java b/info/bliki/wiki/template/dates/StringToTimeException.java new file mode 100644 index 0000000..ca6a53a --- /dev/null +++ b/info/bliki/wiki/template/dates/StringToTimeException.java @@ -0,0 +1,17 @@ +package info.bliki.wiki.template.dates; +/* +code cloned from https://github.com/collegeman/stringtotime/blob/master/src/main/java/com/clutch/dates/StringToTimeException.java +*/ +public final class StringToTimeException extends RuntimeException { + + private static final long serialVersionUID = -3777846121104246071L; + + public StringToTimeException(Object dateTimeString) { + super(String.format("Failed to parse [%s] into a java.util.Date", dateTimeString)); + } + + public StringToTimeException(Object dateTimeString, Throwable cause) { + super(String.format("Failed to parse [%s] into a java.util.Date", dateTimeString), cause); + } + +} diff --git a/lib/StringLib.java b/lib/StringLib.java new file mode 100644 index 0000000..15e3abd --- /dev/null +++ b/lib/StringLib.java @@ -0,0 +1,1225 @@ +/******************************************************************************* +* Copyright (c) 2009-2011 Luaj.org. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +******************************************************************************/ +package org.luaj.vm2.lib; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import org.luaj.vm2.Buffer; +import org.luaj.vm2.LuaClosure; +import org.luaj.vm2.LuaString; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Varargs; +import org.luaj.vm2.compiler.DumpState; + +/** + * Subclass of {@link LibFunction} which implements the lua standard {@code string} + * library. + *

+ * Typically, this library is included as part of a call to either + * {@link org.luaj.vm2.lib.jse.JsePlatform#standardGlobals()} or {@link org.luaj.vm2.lib.jme.JmePlatform#standardGlobals()} + *

 {@code
+ * Globals globals = JsePlatform.standardGlobals();
+ * System.out.println( globals.get("string").get("upper").call( LuaValue.valueOf("abcde") ) );
+ * } 
+ *

+ * To instantiate and use it directly, + * link it into your globals table via {@link LuaValue#load(LuaValue)} using code such as: + *

 {@code
+ * Globals globals = new Globals();
+ * globals.load(new JseBaseLib());
+ * globals.load(new PackageLib());
+ * globals.load(new JseStringLib());
+ * System.out.println( globals.get("string").get("upper").call( LuaValue.valueOf("abcde") ) );
+ * } 
+ *

+ * This is a direct port of the corresponding library in C. + * @see LibFunction + * @see org.luaj.vm2.lib.jse.JsePlatform + * @see org.luaj.vm2.lib.jme.JmePlatform + * @see Lua 5.2 String Lib Reference + */ +public class StringLib extends TwoArgFunction { + + /** Construct a StringLib, which can be initialized by calling it with a + * modname string, and a global environment table as arguments using + * {@link #call(LuaValue, LuaValue)}. */ + public StringLib() { + } + + /** Perform one-time initialization on the library by creating a table + * containing the library functions, adding that table to the supplied environment, + * adding the table to package.loaded, and returning table as the return value. + * Creates a metatable that uses __INDEX to fall back on itself to support string + * method operations. + * If the shared strings metatable instance is null, will set the metatable as + * the global shared metatable for strings. + *

+ * All tables and metatables are read-write by default so if this will be used in + * a server environment, sandboxing should be used. In particular, the + * {@link LuaString#s_metatable} table should probably be made read-only. + * @param modname the module name supplied if this is loaded via 'require'. + * @param env the environment to load into, typically a Globals instance. + */ + public LuaValue call(LuaValue modname, LuaValue env) { + LuaTable string = new LuaTable(); + string.set("byte", new _byte()); + string.set("char", new _char()); + string.set("dump", new dump()); + string.set("find", new find()); + string.set("format", new format()); + string.set("gmatch", new gmatch()); + string.set("gsub", new gsub()); + string.set("len", new len()); + string.set("lower", new lower()); + string.set("match", new match()); + string.set("rep", new rep()); + string.set("reverse", new reverse()); + string.set("sub", new sub()); + string.set("upper", new upper()); + + env.set("string", string); + if (!env.get("package").isnil()) env.get("package").get("loaded").set("string", string); + if (LuaString.s_metatable == null) { + LuaString.s_metatable = LuaValue.tableOf(new LuaValue[] { INDEX, string }); + } + return string; + } + + /** + * string.byte (s [, i [, j]]) + * + * Returns the internal numerical codes of the + * characters s[i], s[i+1], ..., s[j]. The default value for i is 1; the + * default value for j is i. + * + * Note that numerical codes are not necessarily portable across platforms. + * + * @param args the calling args + */ + static final class _byte extends VarArgFunction { + public Varargs invoke(Varargs args) { + LuaString s = args.checkstring(1); + int l = s.m_length; + int posi = posrelat( args.optint(2,1), l ); + int pose = posrelat( args.optint(3,posi), l ); + int n,i; + if (posi <= 0) posi = 1; + if (pose > l) pose = l; + if (posi > pose) return NONE; /* empty interval; return no values */ + n = (int)(pose - posi + 1); + if (posi + n <= pose) /* overflow? */ + error("string slice too long"); + LuaValue[] v = new LuaValue[n]; + for (i=0; i=256) argerror(a, "invalid value for string.char [0; 255]: " + c); + bytes[i] = (byte) c; + } + return LuaString.valueUsing( bytes ); + } + } + + /** + * string.dump (function[, stripDebug]) + * + * Returns a string containing a binary representation of the given function, + * so that a later loadstring on this string returns a copy of the function. + * function must be a Lua function without upvalues. + * Boolean param stripDebug - true to strip debugging info, false otherwise. + * The default value for stripDebug is true. + * + * TODO: port dumping code as optional add-on + */ + static final class dump extends VarArgFunction { + public Varargs invoke(Varargs args) { + LuaValue f = args.checkfunction(1); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + DumpState.dump( ((LuaClosure)f).p, baos, args.optboolean(2, true) ); + return LuaString.valueUsing(baos.toByteArray()); + } catch (IOException e) { + return error( e.getMessage() ); + } + } + } + + /** + * string.find (s, pattern [, init [, plain]]) + * + * Looks for the first match of pattern in the string s. + * If it finds a match, then find returns the indices of s + * where this occurrence starts and ends; otherwise, it returns nil. + * A third, optional numerical argument init specifies where to start the search; + * its default value is 1 and may be negative. A value of true as a fourth, + * optional argument plain turns off the pattern matching facilities, + * so the function does a plain "find substring" operation, + * with no characters in pattern being considered "magic". + * Note that if plain is given, then init must be given as well. + * + * If the pattern has captures, then in a successful match the captured values + * are also returned, after the two indices. + */ + static final class find extends VarArgFunction { + public Varargs invoke(Varargs args) { + return str_find_aux( args, true ); + } + } + + /** + * string.format (formatstring, ...) + * + * Returns a formatted version of its variable number of arguments following + * the description given in its first argument (which must be a string). + * The format string follows the same rules as the printf family of standard C functions. + * The only differences are that the options/modifiers *, l, L, n, p, and h are not supported + * and that there is an extra option, q. The q option formats a string in a form suitable + * to be safely read back by the Lua interpreter: the string is written between double quotes, + * and all double quotes, newlines, embedded zeros, and backslashes in the string are correctly + * escaped when written. For instance, the call + * string.format('%q', 'a string with "quotes" and \n new line') + * + * will produce the string: + * "a string with \"quotes\" and \ + * new line" + * + * The options c, d, E, e, f, g, G, i, o, u, X, and x all expect a number as argument, + * whereas q and s expect a string. + * + * This function does not accept string values containing embedded zeros, + * except as arguments to the q option. + */ + final class format extends VarArgFunction { + public Varargs invoke(Varargs args) { + LuaString fmt = args.checkstring( 1 ); + final int n = fmt.length(); + Buffer result = new Buffer(n); + int arg = 1; + int c; + + for ( int i = 0; i < n; ) { + switch ( c = fmt.luaByte( i++ ) ) { + case '\n': + result.append( "\n" ); + break; + default: + result.append( (byte) c ); + break; + case L_ESC: + if ( i < n ) { + if ( ( c = fmt.luaByte( i ) ) == L_ESC ) { + ++i; + result.append( (byte)L_ESC ); + } else { + arg++; + FormatDesc fdsc = new FormatDesc(args, fmt, i ); + i += fdsc.length; + switch ( fdsc.conversion ) { + case 'c': + fdsc.format( result, (byte)args.checkint( arg ) ); + break; + case 'i': + case 'd': + fdsc.format( result, args.checklong( arg ) ); + break; + case 'o': + case 'u': + case 'x': + case 'X': + fdsc.format( result, args.checklong( arg ) ); + break; + case 'e': + case 'E': + case 'f': + case 'g': + case 'G': + fdsc.format( result, args.checkdouble( arg ) ); + break; + case 'q': + addquoted( result, args.checkstring( arg ) ); + break; + case 's': { + LuaString s = args.checkstring( arg ); + if ( fdsc.precision == -1 && s.length() >= 100 ) { + result.append( s ); + } else { + fdsc.format( result, s ); + } + } break; + default: + error("invalid option '%"+(char)fdsc.conversion+"' to 'format'"); + break; + } + } + } + } + } + + return result.tostring(); + } + } + + static void addquoted(Buffer buf, LuaString s) { + int c; + buf.append( (byte) '"' ); + for ( int i = 0, n = s.length(); i < n; i++ ) { + switch ( c = s.luaByte( i ) ) { + case '"': case '\\': case '\n': + buf.append( (byte)'\\' ); + buf.append( (byte)c ); + break; + default: + if (c <= 0x1F || c == 0x7F) { + buf.append( (byte) '\\' ); + if (i+1 == n || s.luaByte(i+1) < '0' || s.luaByte(i+1) > '9') { + buf.append(Integer.toString(c)); + } else { + buf.append( (byte) '0' ); + buf.append( (byte) (char) ('0' + c / 10) ); + buf.append( (byte) (char) ('0' + c % 10) ); + } + } else { + buf.append((byte) c); + } + break; + } + } + buf.append( (byte) '"' ); + } + + private static final String FLAGS = "-+ #0"; + + class FormatDesc { + + private boolean leftAdjust; + private boolean zeroPad; + private boolean explicitPlus; + private boolean space; + private boolean alternateForm; + private static final int MAX_FLAGS = 5; + + private int width; + int precision; + + public final int conversion; + public final int length; + + public final String src; + + public FormatDesc(Varargs args, LuaString strfrmt, final int start) { + int p = start, n = strfrmt.length(); + int c = 0; + + boolean moreFlags = true; + while ( moreFlags ) { + switch ( c = ( (p < n) ? strfrmt.luaByte( p++ ) : 0 ) ) { + case '-': leftAdjust = true; break; + case '+': explicitPlus = true; break; + case ' ': space = true; break; + case '#': alternateForm = true; break; + case '0': zeroPad = true; break; + default: moreFlags = false; break; + } + } + if ( p - start > MAX_FLAGS ) + error("invalid format (repeated flags)"); + + width = -1; + if ( Character.isDigit( (char)c ) ) { + width = c - '0'; + c = ( (p < n) ? strfrmt.luaByte( p++ ) : 0 ); + if ( Character.isDigit( (char) c ) ) { + width = width * 10 + (c - '0'); + c = ( (p < n) ? strfrmt.luaByte( p++ ) : 0 ); + } + } + + precision = -1; + if ( c == '.' ) { + c = ( (p < n) ? strfrmt.luaByte( p++ ) : 0 ); + if ( Character.isDigit( (char) c ) ) { + precision = c - '0'; + c = ( (p < n) ? strfrmt.luaByte( p++ ) : 0 ); + if ( Character.isDigit( (char) c ) ) { + precision = precision * 10 + (c - '0'); + c = ( (p < n) ? strfrmt.luaByte( p++ ) : 0 ); + } + } + } + + if ( Character.isDigit( (char) c ) ) + error("invalid format (width or precision too long)"); + + zeroPad &= !leftAdjust; // '-' overrides '0' + conversion = c; + length = p - start; + src = strfrmt.substring(start - 1, p).tojstring(); + } + + public void format(Buffer buf, byte c) { + // TODO: not clear that any of width, precision, or flags apply here. + buf.append(c); + } + + public void format(Buffer buf, long number) { + String digits; + + if ( number == 0 && precision == 0 ) { + digits = ""; + } else { + int radix; + switch ( conversion ) { + case 'x': + case 'X': + radix = 16; + break; + case 'o': + radix = 8; + break; + default: + radix = 10; + break; + } + digits = Long.toString( number, radix ); + if ( conversion == 'X' ) + digits = digits.toUpperCase(); + } + + int minwidth = digits.length(); + int ndigits = minwidth; + int nzeros; + + if ( number < 0 ) { + ndigits--; + } else if ( explicitPlus || space ) { + minwidth++; + } + + if ( precision > ndigits ) + nzeros = precision - ndigits; + else if ( precision == -1 && zeroPad && width > minwidth ) + nzeros = width - minwidth; + else + nzeros = 0; + + minwidth += nzeros; + int nspaces = width > minwidth ? width - minwidth : 0; + + if ( !leftAdjust ) + pad( buf, ' ', nspaces ); + + if ( number < 0 ) { + if ( nzeros > 0 ) { + buf.append( (byte)'-' ); + digits = digits.substring( 1 ); + } + } else if ( explicitPlus ) { + buf.append( (byte)'+' ); + } else if ( space ) { + buf.append( (byte)' ' ); + } + + if ( nzeros > 0 ) + pad( buf, '0', nzeros ); + + buf.append( digits ); + + if ( leftAdjust ) + pad( buf, ' ', nspaces ); + } + + public void format(Buffer buf, double x) { + buf.append( StringLib.this.format(src, x) ); + } + + public void format(Buffer buf, LuaString s) { + int nullindex = s.indexOf( (byte)'\0', 0 ); + if ( nullindex != -1 ) + s = s.substring( 0, nullindex ); + buf.append(s); + } + + public final void pad(Buffer buf, char c, int n) { + byte b = (byte)c; + while ( n-- > 0 ) + buf.append(b); + } + } + + protected String format(String src, double x) { + return String.valueOf(x); + } + + /** + * string.gmatch (s, pattern) + * + * Returns an iterator function that, each time it is called, returns the next captures + * from pattern over string s. If pattern specifies no captures, then the + * whole match is produced in each call. + * + * As an example, the following loop + * s = "hello world from Lua" + * for w in string.gmatch(s, "%a+") do + * print(w) + * end + * + * will iterate over all the words from string s, printing one per line. + * The next example collects all pairs key=value from the given string into a table: + * t = {} + * s = "from=world, to=Lua" + * for k, v in string.gmatch(s, "(%w+)=(%w+)") do + * t[k] = v + * end + * + * For this function, a '^' at the start of a pattern does not work as an anchor, + * as this would prevent the iteration. + */ + static final class gmatch extends VarArgFunction { + public Varargs invoke(Varargs args) { + LuaString src = args.checkstring( 1 ); + LuaString pat = args.checkstring( 2 ); + return new GMatchAux(args, src, pat); + } + } + + static class GMatchAux extends VarArgFunction { + private final int srclen; + private final MatchState ms; + private int soffset; + private int lastmatch; + public GMatchAux(Varargs args, LuaString src, LuaString pat) { + this.srclen = src.length(); + this.ms = new MatchState(args, src, pat); + this.soffset = 0; + this.lastmatch = -1; + } + public Varargs invoke(Varargs args) { + for ( ; soffset<=srclen; soffset++ ) { + ms.reset(); + int res = ms.match(soffset, 0); + if ( res >=0 && res != lastmatch ) { + int soff = soffset; + lastmatch = soffset = res; + return ms.push_captures( true, soff, res ); + } + } + return NIL; + } + } + + + /** + * string.gsub (s, pattern, repl [, n]) + * Returns a copy of s in which all (or the first n, if given) occurrences of the + * pattern have been replaced by a replacement string specified by repl, which + * may be a string, a table, or a function. gsub also returns, as its second value, + * the total number of matches that occurred. + * + * If repl is a string, then its value is used for replacement. + * The character % works as an escape character: any sequence in repl of the form %n, + * with n between 1 and 9, stands for the value of the n-th captured substring (see below). + * The sequence %0 stands for the whole match. The sequence %% stands for a single %. + * + * If repl is a table, then the table is queried for every match, using the first capture + * as the key; if the pattern specifies no captures, then the whole match is used as the key. + * + * If repl is a function, then this function is called every time a match occurs, + * with all captured substrings passed as arguments, in order; if the pattern specifies + * no captures, then the whole match is passed as a sole argument. + * + * If the value returned by the table query or by the function call is a string or a number, + * then it is used as the replacement string; otherwise, if it is false or nil, + * then there is no replacement (that is, the original match is kept in the string). + * + * Here are some examples: + * x = string.gsub("hello world", "(%w+)", "%1 %1") + * --> x="hello hello world world" + * + * x = string.gsub("hello world", "%w+", "%0 %0", 1) + * --> x="hello hello world" + * + * x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1") + * --> x="world hello Lua from" + * + * x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv) + * --> x="home = /home/roberto, user = roberto" + * + * x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s) + * return loadstring(s)() + * end) + * --> x="4+5 = 9" + * + * local t = {name="lua", version="5.1"} + * x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t) + * --> x="lua-5.1.tar.gz" + */ + static final class gsub extends VarArgFunction { + public Varargs invoke(Varargs args) { + LuaString src = args.checkstring( 1 ); + final int srclen = src.length(); + LuaString p = args.checkstring( 2 ); + int lastmatch = -1; /* end of last match */ + LuaValue repl = args.arg( 3 ); + int max_s = args.optint( 4, srclen + 1 ); + final boolean anchor = p.length() > 0 && p.charAt( 0 ) == '^'; + + Buffer lbuf = new Buffer( srclen ); + MatchState ms = new MatchState( args, src, p ); + + int soffset = 0; + int n = 0; + while ( n < max_s ) { + ms.reset(); + int res = ms.match( soffset, anchor ? 1 : 0 ); + if ( res != -1 && res != lastmatch ) { /* match? */ + n++; + ms.add_value( lbuf, soffset, res, repl ); /* add replacement to buffer */ + soffset = lastmatch = res; + } + else if ( soffset < srclen ) /* otherwise, skip one character */ + lbuf.append( (byte) src.luaByte( soffset++ ) ); + else break; /* end of subject */ + if ( anchor ) break; + } + lbuf.append( src.substring( soffset, srclen ) ); + return varargsOf(lbuf.tostring(), valueOf(n)); + } + } + + /** + * string.len (s) + * + * Receives a string and returns its length. The empty string "" has length 0. + * Embedded zeros are counted, so "a\000bc\000" has length 5. + */ + static final class len extends OneArgFunction { + public LuaValue call(LuaValue arg) { + return arg.checkstring().len(); + } + } + + /** + * string.lower (s) + * + * Receives a string and returns a copy of this string with all uppercase letters + * changed to lowercase. All other characters are left unchanged. + * The definition of what an uppercase letter is depends on the current locale. + */ + static final class lower extends OneArgFunction { + public LuaValue call(LuaValue arg) { + return valueOf( arg.checkjstring().toLowerCase() ); + } + } + + /** + * string.match (s, pattern [, init]) + * + * Looks for the first match of pattern in the string s. If it finds one, + * then match returns the captures from the pattern; otherwise it returns + * nil. If pattern specifies no captures, then the whole match is returned. + * A third, optional numerical argument init specifies where to start the + * search; its default value is 1 and may be negative. + */ + static final class match extends VarArgFunction { + public Varargs invoke(Varargs args) { + return str_find_aux( args, false ); + } + } + + /** + * string.rep (s, n) + * + * Returns a string that is the concatenation of n copies of the string s. + */ + static final class rep extends VarArgFunction { + public Varargs invoke(Varargs args) { + LuaString s = args.checkstring( 1 ); + int n = args.checkint( 2 ); + final byte[] bytes = new byte[ s.length() * n ]; + int len = s.length(); + for ( int offset = 0; offset < bytes.length; offset += len ) { + s.copyInto( 0, bytes, offset, len ); + } + return LuaString.valueUsing( bytes ); + } + } + + /** + * string.reverse (s) + * + * Returns a string that is the string s reversed. + */ + static final class reverse extends OneArgFunction { + public LuaValue call(LuaValue arg) { + LuaString s = arg.checkstring(); + int n = s.length(); + byte[] b = new byte[n]; + for ( int i=0, j=n-1; i l ) + end = l; + + if ( start <= end ) { + return s.substring( start-1 , end ); + } else { + return EMPTYSTRING; + } + } + } + + /** + * string.upper (s) + * + * Receives a string and returns a copy of this string with all lowercase letters + * changed to uppercase. All other characters are left unchanged. + * The definition of what a lowercase letter is depends on the current locale. + */ + static final class upper extends OneArgFunction { + public LuaValue call(LuaValue arg) { + return valueOf(arg.checkjstring().toUpperCase()); + } + } + + /** + * This utility method implements both string.find and string.match. + */ + static Varargs str_find_aux( Varargs args, boolean find ) { + LuaString s = args.checkstring( 1 ); + LuaString pat = args.checkstring( 2 ); + int init = args.optint( 3, 1 ); + + if ( init > 0 ) { + init = Math.min( init - 1, s.length() ); + } else if ( init < 0 ) { + init = Math.max( 0, s.length() + init ); + } + + boolean fastMatch = find && ( args.arg(4).toboolean() || pat.indexOfAny( SPECIALS ) == -1 ); + + if ( fastMatch ) { + int result = s.indexOf( pat, init ); + if ( result != -1 ) { + return varargsOf( valueOf(result+1), valueOf(result+pat.length()) ); + } + } else { + MatchState ms = new MatchState( args, s, pat ); + + boolean anchor = false; + int poff = 0; + if ( pat.length() > 0 && pat.luaByte( 0 ) == '^' ) { + anchor = true; + poff = 1; + } + + int soff = init; + do { + int res; + ms.reset(); + if ( ( res = ms.match( soff, poff ) ) != -1 ) { + if ( find ) { + return varargsOf( valueOf(soff+1), valueOf(res), ms.push_captures( false, soff, res )); + } else { + return ms.push_captures( true, soff, res ); + } + } + } while ( soff++ < s.length() && !anchor ); + } + return NIL; + } + + static int posrelat( int pos, int len ) { + return ( pos >= 0 ) ? pos : len + pos + 1; + } + + // Pattern matching implementation + + private static final int L_ESC = '%'; + private static final LuaString SPECIALS = valueOf("^$*+?.([%-"); + private static final int MAX_CAPTURES = 32; + + private static final int MAXCCALLS = 200; + + private static final int CAP_UNFINISHED = -1; + private static final int CAP_POSITION = -2; + + private static final byte MASK_ALPHA = 0x01; + private static final byte MASK_LOWERCASE = 0x02; + private static final byte MASK_UPPERCASE = 0x04; + private static final byte MASK_DIGIT = 0x08; + private static final byte MASK_PUNCT = 0x10; + private static final byte MASK_SPACE = 0x20; + private static final byte MASK_CONTROL = 0x40; + private static final byte MASK_HEXDIGIT = (byte)0x80; + + static final byte[] CHAR_TABLE; + + static { + CHAR_TABLE = new byte[256]; + + for ( int i = 0; i < 128; ++i ) { + final char c = (char) i; + CHAR_TABLE[i] = (byte)( ( Character.isDigit( c ) ? MASK_DIGIT : 0 ) | + ( Character.isLowerCase( c ) ? MASK_LOWERCASE : 0 ) | + ( Character.isUpperCase( c ) ? MASK_UPPERCASE : 0 ) | + ( ( c < ' ' || c == 0x7F ) ? MASK_CONTROL : 0 ) ); + if ( ( c >= 'a' && c <= 'f' ) || ( c >= 'A' && c <= 'F' ) || ( c >= '0' && c <= '9' ) ) { + CHAR_TABLE[i] |= MASK_HEXDIGIT; + } + if ( ( c >= '!' && c <= '/' ) || ( c >= ':' && c <= '@' ) || ( c >= '[' && c <= '`' ) || ( c >= '{' && c <= '~' ) ) { + CHAR_TABLE[i] |= MASK_PUNCT; + } + if ( ( CHAR_TABLE[i] & ( MASK_LOWERCASE | MASK_UPPERCASE ) ) != 0 ) { + CHAR_TABLE[i] |= MASK_ALPHA; + } + } + + CHAR_TABLE[' '] = MASK_SPACE; + CHAR_TABLE['\r'] |= MASK_SPACE; + CHAR_TABLE['\n'] |= MASK_SPACE; + CHAR_TABLE['\t'] |= MASK_SPACE; + CHAR_TABLE[0x0B /* '\v' */ ] |= MASK_SPACE; + CHAR_TABLE['\f'] |= MASK_SPACE; + }; + + static class MatchState { + int matchdepth; /* control for recursive depth (to avoid C stack overflow) */ + final LuaString s; + final LuaString p; + final Varargs args; + int level; + int[] cinit; + int[] clen; + + MatchState( Varargs args, LuaString s, LuaString pattern ) { + this.s = s; + this.p = pattern; + this.args = args; + this.level = 0; + this.cinit = new int[ MAX_CAPTURES ]; + this.clen = new int[ MAX_CAPTURES ]; + this.matchdepth = MAXCCALLS; + } + + void reset() { + level = 0; + this.matchdepth = MAXCCALLS; + } + + private void add_s( Buffer lbuf, LuaString news, int soff, int e ) { + int l = news.length(); + for ( int i = 0; i < l; ++i ) { + byte b = (byte) news.luaByte( i ); + if ( b != L_ESC ) { + lbuf.append( (byte) b ); + } else { + ++i; // skip ESC + b = (byte)(i < l ? news.luaByte( i ) : 0); + if ( !Character.isDigit( (char) b ) ) { +/* disabled: incompatible with wiki, it may raise error "invalid use of '%' in replacement string: after '%' must be '0'-'9' or '%'" + if (b != L_ESC) error( "invalid use of '" + (char)L_ESC + + "' in replacement string: after '" + (char)L_ESC + + "' must be '0'-'9' or '" + (char)L_ESC + + "', but found " + (i < l ? "symbol '" + (char)b + "' with code " + b + + " at pos " + (i + 1) : + "end of string")); +*/ + lbuf.append( b ); + } else if ( b == '0' ) { + lbuf.append( s.substring( soff, e ) ); + } else { + lbuf.append( push_onecapture( b - '1', soff, e ).strvalue() ); + } + } + } + } + + public void add_value( Buffer lbuf, int soffset, int end, LuaValue repl ) { + switch ( repl.type() ) { + case LuaValue.TSTRING: + case LuaValue.TNUMBER: + add_s( lbuf, repl.strvalue(), soffset, end ); + return; + + case LuaValue.TFUNCTION: + repl = repl.invoke( push_captures( true, soffset, end ) ).arg1(); + break; + + case LuaValue.TTABLE: + // Need to call push_onecapture here for the error checking + repl = repl.get( push_onecapture( 0, soffset, end ) ); + break; + + default: + error( "bad argument: string/function/table expected" ); + return; + } + + if ( !repl.toboolean() ) { + repl = s.substring( soffset, end ); + } else if ( ! repl.isstring() ) { + error( "invalid replacement value (a "+repl.typename()+")" ); + } + lbuf.append( repl.strvalue() ); + } + + Varargs push_captures( boolean wholeMatch, int soff, int end ) { + int nlevels = ( this.level == 0 && wholeMatch ) ? 1 : this.level; + switch ( nlevels ) { + case 0: return NONE; + case 1: return push_onecapture( 0, soff, end ); + } + LuaValue[] v = new LuaValue[nlevels]; + for ( int i = 0; i < nlevels; ++i ) + v[i] = push_onecapture( i, soff, end ); + return varargsOf(v); + } + + private LuaValue push_onecapture( int i, int soff, int end ) { + if ( i >= this.level ) { + if ( i == 0 ) { + return s.substring( soff, end ); + } else { + return error( "invalid capture index %" + (i + 1) ); + } + } else { + int l = clen[i]; + if ( l == CAP_UNFINISHED ) { + return error( "unfinished capture" ); + } + if ( l == CAP_POSITION ) { + return valueOf( cinit[i] + 1 ); + } else { + int begin = cinit[i]; + return s.substring( begin, begin + l ); + } + } + } + + private int check_capture( int l ) { + l -= '1'; + if ( l < 0 || l >= level || this.clen[l] == CAP_UNFINISHED ) { + error("invalid capture index %" + (l + 1)); + } + return l; + } + + private int capture_to_close() { + int level = this.level; + for ( level--; level >= 0; level-- ) + if ( clen[level] == CAP_UNFINISHED ) + return level; + error("invalid pattern capture"); + return 0; + } + + int classend( int poffset ) { + switch ( p.luaByte( poffset++ ) ) { + case L_ESC: + if ( poffset == p.length() ) { + error( "malformed pattern (ends with '%')" ); + } + return poffset + 1; + + case '[': + if ( poffset != p.length() && p.luaByte( poffset ) == '^' ) poffset++; + do { + if ( poffset == p.length() ) { + error( "malformed pattern (missing ']')" ); + } + if ( p.luaByte( poffset++ ) == L_ESC && poffset < p.length() ) + poffset++; /* skip escapes (e.g. '%]') */ + } while ( poffset == p.length() || p.luaByte( poffset ) != ']' ); + return poffset + 1; + default: + return poffset; + } + } + + static boolean match_class( int c, int cl ) { + final char lcl = Character.toLowerCase( (char) cl ); + int cdata = CHAR_TABLE[c]; + + boolean res; + switch ( lcl ) { + case 'a': res = ( cdata & MASK_ALPHA ) != 0; break; + case 'd': res = ( cdata & MASK_DIGIT ) != 0; break; + case 'l': res = ( cdata & MASK_LOWERCASE ) != 0; break; + case 'u': res = ( cdata & MASK_UPPERCASE ) != 0; break; + case 'c': res = ( cdata & MASK_CONTROL ) != 0; break; + case 'p': res = ( cdata & MASK_PUNCT ) != 0; break; + case 's': res = ( cdata & MASK_SPACE ) != 0; break; + case 'g': res = ( cdata & ( MASK_ALPHA | MASK_DIGIT | MASK_PUNCT ) ) != 0; break; + case 'w': res = ( cdata & ( MASK_ALPHA | MASK_DIGIT ) ) != 0; break; + case 'x': res = ( cdata & MASK_HEXDIGIT ) != 0; break; + case 'z': res = ( c == 0 ); break; /* deprecated option */ + default: return cl == c; + } + return ( lcl == cl ) ? res : !res; + } + + boolean matchbracketclass( int c, int poff, int ec ) { + boolean sig = true; + if ( p.luaByte( poff + 1 ) == '^' ) { + sig = false; + poff++; + } + while ( ++poff < ec ) { + if ( p.luaByte( poff ) == L_ESC ) { + poff++; + if ( match_class( c, p.luaByte( poff ) ) ) + return sig; + } + else if ( ( p.luaByte( poff + 1 ) == '-' ) && ( poff + 2 < ec ) ) { + poff += 2; + if ( p.luaByte( poff - 2 ) <= c && c <= p.luaByte( poff ) ) + return sig; + } + else if ( p.luaByte( poff ) == c ) return sig; + } + return !sig; + } + + boolean singlematch( int c, int poff, int ep ) { + switch ( p.luaByte( poff ) ) { + case '.': return true; + case L_ESC: return match_class( c, p.luaByte( poff + 1 ) ); + case '[': return matchbracketclass( c, poff, ep - 1 ); + default: return p.luaByte( poff ) == c; + } + } + + /** + * Perform pattern matching. If there is a match, returns offset into s + * where match ends, otherwise returns -1. + */ + int match( int soffset, int poffset ) { + if (matchdepth-- == 0) error("pattern too complex"); + try { + while ( true ) { + // Check if we are at the end of the pattern - + // equivalent to the '\0' case in the C version, but our pattern + // string is not NUL-terminated. + if ( poffset == p.length() ) + return soffset; + switch ( p.luaByte( poffset ) ) { + case '(': + if ( ++poffset < p.length() && p.luaByte( poffset ) == ')' ) + return start_capture( soffset, poffset + 1, CAP_POSITION ); + else + return start_capture( soffset, poffset, CAP_UNFINISHED ); + case ')': + return end_capture( soffset, poffset + 1 ); + case L_ESC: + if ( poffset + 1 == p.length() ) + error("malformed pattern (ends with '%')"); + switch ( p.luaByte( poffset + 1 ) ) { + case 'b': + soffset = matchbalance( soffset, poffset + 2 ); + if ( soffset == -1 ) return -1; + poffset += 4; + continue; + case 'f': { + poffset += 2; + if ( poffset == p.length() || p.luaByte( poffset ) != '[' ) { + error("missing '[' after '%f' in pattern"); + } + int ep = classend( poffset ); + int previous = ( soffset == 0 ) ? '\0' : s.luaByte( soffset - 1 ); + int next = ( soffset == s.length() ) ? '\0' : s.luaByte( soffset ); + if ( matchbracketclass( previous, poffset, ep - 1 ) || + !matchbracketclass( next, poffset, ep - 1 ) ) + return -1; + poffset = ep; + continue; + } + default: { + int c = p.luaByte( poffset + 1 ); + if ( Character.isDigit( (char) c ) ) { + soffset = match_capture( soffset, c ); + if ( soffset == -1 ) + return -1; + return match( soffset, poffset + 2 ); + } + } + } + case '$': + if ( poffset + 1 == p.length() ) + return ( soffset == s.length() ) ? soffset : -1; + } + int ep = classend( poffset ); + boolean m = soffset < s.length() && singlematch( s.luaByte( soffset ), poffset, ep ); + int pc = ( ep < p.length() ) ? p.luaByte( ep ) : '\0'; + + switch ( pc ) { + case '?': + int res; + if ( m && ( ( res = match( soffset + 1, ep + 1 ) ) != -1 ) ) + return res; + poffset = ep + 1; + continue; + case '*': + return max_expand( soffset, poffset, ep ); + case '+': + return ( m ? max_expand( soffset + 1, poffset, ep ) : -1 ); + case '-': + return min_expand( soffset, poffset, ep ); + default: + if ( !m ) + return -1; + soffset++; + poffset = ep; + continue; + } + } + } finally { + matchdepth++; + } + } + + int max_expand( int soff, int poff, int ep ) { + int i = 0; + while ( soff + i < s.length() && + singlematch( s.luaByte( soff + i ), poff, ep ) ) + i++; + while ( i >= 0 ) { + int res = match( soff + i, ep + 1 ); + if ( res != -1 ) + return res; + i--; + } + return -1; + } + + int min_expand( int soff, int poff, int ep ) { + for ( ;; ) { + int res = match( soff, ep + 1 ); + if ( res != -1 ) + return res; + else if ( soff < s.length() && singlematch( s.luaByte( soff ), poff, ep ) ) + soff++; + else return -1; + } + } + + int start_capture( int soff, int poff, int what ) { + int res; + int level = this.level; + if ( level >= MAX_CAPTURES ) { + error( "too many captures" ); + } + cinit[ level ] = soff; + clen[ level ] = what; + this.level = level + 1; + if ( ( res = match( soff, poff ) ) == -1 ) + this.level--; + return res; + } + + int end_capture( int soff, int poff ) { + int l = capture_to_close(); + int res; + clen[l] = soff - cinit[l]; + if ( ( res = match( soff, poff ) ) == -1 ) + clen[l] = CAP_UNFINISHED; + return res; + } + + int match_capture( int soff, int l ) { + l = check_capture( l ); + int len = clen[ l ]; + if ( ( s.length() - soff ) >= len && + LuaString.equals( s, cinit[l], s, soff, len ) ) + return soff + len; + else + return -1; + } + + int matchbalance( int soff, int poff ) { + final int plen = p.length(); + if ( poff == plen || poff + 1 == plen ) { + error( "malformed pattern (missing arguments to '%b')" ); + } + final int slen = s.length(); + if ( soff >= slen ) + return -1; + final int b = p.luaByte( poff ); + if ( s.luaByte( soff ) != b ) + return -1; + final int e = p.luaByte( poff + 1 ); + int cont = 1; + while ( ++soff < slen ) { + if ( s.luaByte( soff ) == e ) { + if ( --cont == 0 ) return soff + 1; + } + else if ( s.luaByte( soff ) == b ) cont++; + } + return -1; + } + } +} diff --git a/lib/luaj-jse-3.0.2p.jar b/lib/luaj-jse-3.0.2p.jar new file mode 100644 index 0000000000000000000000000000000000000000..ce5746cf49d66ed12bebbeedd19fb6164d9b0d92 GIT binary patch literal 472927 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

WylIllw3#-S}nt5Tf>3lO1P6 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�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

9`Kl1Sb7Cl`hjwDqE= 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 bits) + bit.blshift(n, bits) -- left shift (n << bits) + bit.blogic_rshift(n, bits) -- logic right shift(zero fill >>>) + +Please note that bit.brshift and bit.blshift only support number within +32 bits. + +2 utility functions are provided too: + bit.tobits(n) -- convert n into a bit table(which is a 1/0 sequence) + -- high bits first + bit.tonumb(bit_tbl) -- convert a bit table into a number +------------------- + +Under the MIT license. + +copyright(c) 2006~2007 hanzhao (abrash_han@hotmail.com) + +2013-02-20: Brad Jorsch: Fix to not try messing with globals, doesn't work in Scribunto +--]]--------------- + +do + +------------------------ +-- bit lib implementions + +local function check_int(n) + -- checking not float + if(n - math.floor(n) > 0) then + error("trying to use bitwise operation on non-integer!") + end +end + +local function to_bits(n) + check_int(n) + if(n < 0) then + -- negative + return to_bits(bit.bnot(math.abs(n)) + 1) + end + -- to bits table + local tbl = {} + local cnt = 1 + while (n > 0) do + local last = math.mod(n,2) + if(last == 1) then + tbl[cnt] = 1 + else + tbl[cnt] = 0 + end + n = (n-last)/2 + cnt = cnt + 1 + end + + return tbl +end + +local function tbl_to_number(tbl) + local n = table.getn(tbl) + + local rslt = 0 + local power = 1 + for i = 1, n do + rslt = rslt + tbl[i]*power + power = power*2 + end + + return rslt +end + +local function expand(tbl_m, tbl_n) + local big = {} + local small = {} + if(table.getn(tbl_m) > table.getn(tbl_n)) then + big = tbl_m + small = tbl_n + else + big = tbl_n + small = tbl_m + end + -- expand small + for i = table.getn(small) + 1, table.getn(big) do + small[i] = 0 + end + +end + +local function bit_or(m, n) + local tbl_m = to_bits(m) + local tbl_n = to_bits(n) + expand(tbl_m, tbl_n) + + local tbl = {} + local rslt = math.max(table.getn(tbl_m), table.getn(tbl_n)) + for i = 1, rslt do + if(tbl_m[i]== 0 and tbl_n[i] == 0) then + tbl[i] = 0 + else + tbl[i] = 1 + end + end + + return tbl_to_number(tbl) +end + +local function bit_and(m, n) + local tbl_m = to_bits(m) + local tbl_n = to_bits(n) + expand(tbl_m, tbl_n) + + local tbl = {} + local rslt = math.max(table.getn(tbl_m), table.getn(tbl_n)) + for i = 1, rslt do + if(tbl_m[i]== 0 or tbl_n[i] == 0) then + tbl[i] = 0 + else + tbl[i] = 1 + end + end + + return tbl_to_number(tbl) +end + +local function bit_not(n) + + local tbl = to_bits(n) + local size = math.max(table.getn(tbl), 32) + for i = 1, size do + if(tbl[i] == 1) then + tbl[i] = 0 + else + tbl[i] = 1 + end + end + return tbl_to_number(tbl) +end + +local function bit_xor(m, n) + local tbl_m = to_bits(m) + local tbl_n = to_bits(n) + expand(tbl_m, tbl_n) + + local tbl = {} + local rslt = math.max(table.getn(tbl_m), table.getn(tbl_n)) + for i = 1, rslt do + if(tbl_m[i] ~= tbl_n[i]) then + tbl[i] = 1 + else + tbl[i] = 0 + end + end + + --table.foreach(tbl, print) + + return tbl_to_number(tbl) +end + +local function bit_rshift(n, bits) + check_int(n) + + local high_bit = 0 + if(n < 0) then + -- negative + n = bit_not(math.abs(n)) + 1 + high_bit = 2147483648 -- 0x80000000 + end + + for i=1, bits do + n = n/2 + n = bit_or(math.floor(n), high_bit) + end + return math.floor(n) +end + +-- logic rightshift assures zero filling shift +local function bit_logic_rshift(n, bits) + check_int(n) + if(n < 0) then + -- negative + n = bit_not(math.abs(n)) + 1 + end + for i=1, bits do + n = n/2 + end + return math.floor(n) +end + +local function bit_lshift(n, bits) + check_int(n) + + if(n < 0) then + -- negative + n = bit_not(math.abs(n)) + 1 + end + + for i=1, bits do + n = n*2 + end + return bit_and(n, 4294967295) -- 0xFFFFFFFF +end + +local function bit_xor2(m, n) + local rhs = bit_or(bit_not(m), bit_not(n)) + local lhs = bit_or(m, n) + local rslt = bit_and(lhs, rhs) + return rslt +end + +-------------------- +-- bit lib interface + +local bit = { + -- bit operations + bnot = bit_not, + band = bit_and, + bor = bit_or, + bxor = bit_xor, + brshift = bit_rshift, + blshift = bit_lshift, + bxor2 = bit_xor2, + blogic_rshift = bit_logic_rshift, + + -- utility func + tobits = to_bits, + tonumb = tbl_to_number, +} + +return bit + +end + +--[[ +for i = 1, 100 do + for j = 1, 100 do + if(bit.bxor(i, j) ~= bit.bxor2(i, j)) then + error("bit.xor failed.") + end + end +end +--]] + + + + + + + + + + + + + diff --git a/luabit/bit32.lua b/luabit/bit32.lua new file mode 100644 index 0000000..3063bfd --- /dev/null +++ b/luabit/bit32.lua @@ -0,0 +1,209 @@ +--- +-- An implementation of the lua 5.2 bit32 library, in pure Lua + +-- Note that in Lua, "x % n" is defined such that will always return a number +-- between 0 and n-1 for positive n. We take advantage of that a lot here. + +local bit32 = {} + +local function checkint( name, argidx, x, level ) + local n = tonumber( x ) + if not n then + error( string.format( + "bad argument #%d to '%s' (number expected, got %s)", + argidx, name, type( x ) + ), level + 1 ) + end + return math.floor( n ) +end + +local function checkint32( name, argidx, x, level ) + local n = tonumber( x ) + if not n then + error( string.format( + "bad argument #%d to '%s' (number expected, got %s)", + argidx, name, type( x ) + ), level + 1 ) + end + return math.floor( n ) % 0x100000000 +end + + +function bit32.bnot( x ) + x = checkint32( 'bnot', 1, x, 2 ) + + -- In two's complement, -x = not(x) + 1 + -- So not(x) = -x - 1 + return ( -x - 1 ) % 0x100000000 +end + + +--- +-- Logic tables for and/or/xor. We do pairs of bits here as a tradeoff between +-- table space and speed. If you change the number of bits, also change the +-- constants 2 and 4 in comb() below, and the initial value in bit32.band and +-- bit32.btest +local logic_and = { + [0] = { [0] = 0, 0, 0, 0}, + [1] = { [0] = 0, 1, 0, 1}, + [2] = { [0] = 0, 0, 2, 2}, + [3] = { [0] = 0, 1, 2, 3}, +} +local logic_or = { + [0] = { [0] = 0, 1, 2, 3}, + [1] = { [0] = 1, 1, 3, 3}, + [2] = { [0] = 2, 3, 2, 3}, + [3] = { [0] = 3, 3, 3, 3}, +} +local logic_xor = { + [0] = { [0] = 0, 1, 2, 3}, + [1] = { [0] = 1, 0, 3, 2}, + [2] = { [0] = 2, 3, 0, 1}, + [3] = { [0] = 3, 2, 1, 0}, +} + +--- +-- @param name string Function name +-- @param args table Function args +-- @param nargs number Arg count +-- @param s number Start value, 0-3 +-- @param t table Logic table +-- @return number result +local function comb( name, args, nargs, s, t ) + for i = 1, nargs do + args[i] = checkint32( name, i, args[i], 3 ) + end + + local pow = 1 + local ret = 0 + for b = 0, 31, 2 do + local c = s + for i = 1, nargs do + c = t[c][args[i] % 4] + args[i] = math.floor( args[i] / 4 ) + end + ret = ret + c * pow + pow = pow * 4 + end + return ret +end + +function bit32.band( ... ) + return comb( 'band', { ... }, select( '#', ... ), 3, logic_and ) +end + +function bit32.bor( ... ) + return comb( 'bor', { ... }, select( '#', ... ), 0, logic_or ) +end + +function bit32.bxor( ... ) + return comb( 'bxor', { ... }, select( '#', ... ), 0, logic_xor ) +end + +function bit32.btest( ... ) + return comb( 'btest', { ... }, select( '#', ... ), 3, logic_and ) ~= 0 +end + + +function bit32.extract( n, field, width ) + n = checkint32( 'extract', 1, n, 2 ) + field = checkint( 'extract', 2, field, 2 ) + width = checkint( 'extract', 3, width or 1, 2 ) + if field < 0 then + error( "bad argument #2 to 'extract' (field cannot be negative)", 2 ) + end + if width <= 0 then + error( "bad argument #3 to 'extract' (width must be positive)", 2 ) + end + if field + width > 32 then + error( 'trying to access non-existent bits', 2 ) + end + + return math.floor( n / 2^field ) % 2^width +end + +function bit32.replace( n, v, field, width ) + n = checkint32( 'replace', 1, n, 2 ) + v = checkint32( 'replace', 2, v, 2 ) + field = checkint( 'replace', 3, field, 2 ) + width = checkint( 'replace', 4, width or 1, 2 ) + if field < 0 then + error( "bad argument #3 to 'replace' (field cannot be negative)", 2 ) + end + if width <= 0 then + error( "bad argument #4 to 'replace' (width must be positive)", 2 ) + end + if field + width > 32 then + error( 'trying to access non-existent bits', 2 ) + end + + local f = 2^field + local w = 2^width + local fw = f * w + return ( n % f ) + ( v % w ) * f + math.floor( n / fw ) * fw +end + + +-- For the shifting functions, anything over 32 is the same as 32 +-- and limiting to 32 prevents overflow/underflow +local function checkdisp( name, x ) + x = checkint( name, 2, x, 3 ) + return math.min( math.max( -32, x ), 32 ) +end + +function bit32.lshift( x, disp ) + x = checkint32( 'lshift', 1, x, 2 ) + disp = checkdisp( 'lshift', disp ) + + return math.floor( x * 2^disp ) % 0x100000000 +end + +function bit32.rshift( x, disp ) + x = checkint32( 'rshift', 1, x, 2 ) + disp = checkdisp( 'rshift', disp ) + + return math.floor( x / 2^disp ) % 0x100000000 +end + +function bit32.arshift( x, disp ) + x = checkint32( 'arshift', 1, x, 2 ) + disp = checkdisp( 'arshift', disp ) + + if disp <= 0 then + -- Non-positive displacement == left shift + -- (since exponent is non-negative, the multipication can never result + -- in a fractional part) + return ( x * 2^-disp ) % 0x100000000 + elseif x < 0x80000000 then + -- High bit is 0 == right shift + -- (since exponent is positive, the division will never increase x) + return math.floor( x / 2^disp ) + elseif disp > 31 then + -- Shifting off all bits + return 0xffffffff + else + -- 0x100000000 - 2 ^ ( 32 - disp ) creates a number with the high disp + -- bits set. So shift right then add that number. + return math.floor( x / 2^disp ) + ( 0x100000000 - 2 ^ ( 32 - disp ) ) + end +end + +-- For the rotation functions, disp works mod 32. +-- Note that lrotate( x, disp ) == rrotate( x, -disp ). +function bit32.lrotate( x, disp ) + x = checkint32( 'lrotate', 1, x, 2 ) + disp = checkint( 'lrotate', 2, disp, 2 ) % 32 + + local x = x * 2^disp + return ( x % 0x100000000 ) + math.floor( x / 0x100000000 ) +end + +function bit32.rrotate( x, disp ) + x = checkint32( 'rrotate', 1, x, 2 ) + disp = -checkint( 'rrotate', 2, disp, 2 ) % 32 + + local x = x * 2^disp + return ( x % 0x100000000 ) + math.floor( x / 0x100000000 ) +end + +return bit32 diff --git a/luabit/hex.lua b/luabit/hex.lua new file mode 100644 index 0000000..0c87a8d --- /dev/null +++ b/luabit/hex.lua @@ -0,0 +1,99 @@ +--[[--------------- +Hex v0.4 +------------------- +Hex conversion lib for lua. + +How to use: + hex.to_hex(n) -- convert a number to a hex string + hex.to_dec(hex) -- convert a hex string(prefix with '0x' or '0X') to number + +Part of LuaBit(http://luaforge.net/projects/bit/). + +Under the MIT license. + +copyright(c) 2006~2007 hanzhao (abrash_han@hotmail.com) + +2013-02-20: Brad Jorsch: Fix to not try messing with globals, doesn't work in Scribunto +--]]--------------- + +local bit = require 'bit' + +do + +local function to_hex(n) + if(type(n) ~= "number") then + error("non-number type passed in.") + end + + -- checking not float + if(n - math.floor(n) > 0) then + error("trying to apply bitwise operation on non-integer!") + end + + if(n < 0) then + -- negative + n = bit.tobits(bit.bnot(math.abs(n)) + 1) + n = bit.tonumb(n) + end + + hex_tbl = {'A', 'B', 'C', 'D', 'E', 'F'} + hex_str = "" + + while(n ~= 0) do + last = math.mod(n, 16) + if(last < 10) then + hex_str = tostring(last) .. hex_str + else + hex_str = hex_tbl[last-10+1] .. hex_str + end + n = math.floor(n/16) + end + if(hex_str == "") then + hex_str = "0" + end + return "0x" .. hex_str +end + +local function to_dec(hex) + if(type(hex) ~= "string") then + error("non-string type passed in.") + end + + head = string.sub(hex, 1, 2) + + if( head ~= "0x" and head ~= "0X") then + error("wrong hex format, should lead by 0x or 0X.") + end + + v = tonumber(string.sub(hex, 3), 16) + + return v; +end + +-------------------- +-- hex lib interface +local hex = { + to_dec = to_dec, + to_hex = to_hex, +} + +return hex + +end + +--[[ +-- test +d = 4341688 +h = to_hex(d) +print(h) +print(to_dec(h)) + + +for i = 1, 100000 do + h = hex.to_hex(i) + d = hex.to_dec(h) + if(d ~= i) then + error("failed " .. i .. ", " .. h) + end +end +--]] diff --git a/luabit/readme.txt b/luabit/readme.txt new file mode 100644 index 0000000..7a0a24e --- /dev/null +++ b/luabit/readme.txt @@ -0,0 +1,143 @@ +LuaBit +------ +LuaBit is a bitwise operation lib completely written in Lua. It's +written in the belief that Lua is self-contained. + +The supported operations are: not, and, or, xor, right shift, logic +right shift and left shift. + +Several utilities are designed to leverage the power of bit operation: + 1. hex: a dec <-> hex number converter + 2. utf8: convert utf8 string to ucs2 + 3. noki: convert nokia pc suite backuped SMS file to .txt + +Under the MIT license. + +Visit http://luaforge.net/projects/bit/ to get latest version. + +Status +------ +Now LuaBit is in v0.4. +Release date: Mar 18, 2007 + +Content +------- +3 files are there for LuaBit: + 1) bit.lua + is the bitwise operation lib, all operations are implemented here. + + 2) hex.lua + is a helper lib for ease of using hex numbers with bitwise + operation. + + 3) noki.lua + a utility(based on bit and hex) to convert Nokia PC Suite backuped + SMS to a unicode .txt file, which is more accessible than the + original .nfb or .nfc file. + + 4) utf8.lua + convert utf8 string to ucs2 string + +How to use +---------- +Bit +--- +Just require 'bit' in your project and the bit lib will be +available: + bit.bnot(n) -- bitwise not (~n) + bit.band(m, n) -- bitwise and (m & n) + bit.bor(m, n) -- bitwise or (m | n) + bit.bxor(m, n) -- bitwise xor (m ^ n) + bit.brshift(n, bits) -- right shift (n >> bits) + bit.blshift(n, bits) -- left shift (n << bits) + bit.blogic_rshift(n, bits) -- logic right shift(zero fill >>>) + +Please note that bit.brshift and bit.blshift only support number within +32 bits. + +2 utility functions are provided too: + bit.tobits(n) -- convert n into a bit table(which is a 1/0 sequence) + -- high bits first + bit.tonumb(bit_tbl) -- convert a bit table into a number + +Hex +--- +For ease of using hex numbers, a utility hex lib is also included in +LuaBit. You can require 'hex' to use them: + hex.to_hex(n) -- convert a number to a hex string + hex.to_dec(hex) -- convert a hex string(prefix with '0x' or '0X') to number + +With hex, you can write code like: + bit.band(258, hex.to_dec('0xFF')) +to get the lower 8 bits of 258, that's 2. + +Noki +---- +require 'noki', to save your sms to .txt file: + noki.save_sms('nokia.nfb', 'sms.txt') +and you can view the output sms.txt in notepad or other editor which +support unicode. + +Utf8 +---- +require 'utf8', to convert a utf8 string: + ucs2_string = utf8.utf_to_uni(utf8_string) + +History +------- +v0.4 +* utf8 to ucs2 converter(utf8.lua). +* clean up for compatible with Lua5.1 and 5.0. +* add 'How to use' section for bit.lua and hex.lua. + +v0.3 +* noki added as an application of bit. +* typo correction. + +v0.2 +* add logic right shift(>>>) support: bit.blogic_rshift. +* add 2 utility functions: bit.tobits and bit.tonumb. +* update hex.to_hex(in hex.lua) to support negative number. + +v0.1 +LuaBit is written when I do my own game project(Fio at http://fio.edithis.info). +When loading resources, I have to do some bit operation. And I do not +like the embedded way of bit operation. So I decide to implement those +ops in lua. And that's LuaBit. It's not as fast as the embedded one, but +it works. And Lua is self-contained :-) + +To-Do List +--------- +v0.1 +It'll be useful if LuaBit support those bitwise op like: + bit.band(258, '0xFF') +ease to type and use. This will be supported in next release. + +v0.2 +I decide to delay this feature to later version for it'll mess up the +interface of LuaBit. + +v0.3 +May more utility functions add to Noki - phonebook might be a nice candidate. + +v0.4 +There's no UCS2 -> UTF8 convertion now, this feature may add in next release +or when the project need. + +Noki'll be be exluded from LuaBit in next release; I decide to let Noki grow +into a powerful tool to support more Nokia PC Suite backup format(.nfb, +.nfc and .nbu). + +Trial Noki demo at http://nokisms.googlepages.com/(in Chinese) + +Known issues +------------ +LuaBit doesn't play very well with negative number. The return value of the +bitwise operations might change to positive when applied on negative numbers +though the bit sequence is correct. So if you want do some arithmetic with +the result of bit operation, be careful. + +Feedback +-------- +Please send your comments, bugs, patches or change request to +hanzhao(abrash_han@hotmail.com). diff --git a/lualib/libraryUtil.lua b/lualib/libraryUtil.lua new file mode 100644 index 0000000..f14a795 --- /dev/null +++ b/lualib/libraryUtil.lua @@ -0,0 +1,71 @@ +local libraryUtil = {} + +function libraryUtil.checkType( name, argIdx, arg, expectType, nilOk ) + if arg == nil and nilOk then + return + end + if type( arg ) ~= expectType then + local msg = string.format( "bad argument #%d to '%s' (%s expected, got %s)", + argIdx, name, expectType, type( arg ) + ) + error( msg, 3 ) + end +end + +function libraryUtil.checkTypeMulti( name, argIdx, arg, expectTypes ) + local argType = type( arg ) + for _, expectType in ipairs( expectTypes ) do + if argType == expectType then + return + end + end + local n = #expectTypes + local typeList + if n > 1 then + typeList = table.concat( expectTypes, ', ', 1, n - 1 ) .. ' or ' .. expectTypes[n] + else + typeList = expectTypes[1] + end + local msg = string.format( "bad argument #%d to '%s' (%s expected, got %s)", + argIdx, + name, + typeList, + type( arg ) + ) + error( msg, 3 ) +end + +function libraryUtil.checkTypeForIndex( index, value, expectType ) + if type( value ) ~= expectType then + local msg = string.format( "value for index '%s' must be %s, %s given", + index, expectType, type( value ) + ) + error( msg, 3 ) + end +end + +function libraryUtil.checkTypeForNamedArg( name, argName, arg, expectType, nilOk ) + if arg == nil and nilOk then + return + end + if type( arg ) ~= expectType then + local msg = string.format( "bad named argument %s to '%s' (%s expected, got %s)", + argName, name, expectType, type( arg ) + ) + error( msg, 3 ) + end +end + +function libraryUtil.makeCheckSelfFunction( libraryName, varName, selfObj, selfObjDesc ) + return function ( self, method ) + if self ~= selfObj then + error( string.format( + "%s: invalid %s. Did you call %s with a dot instead of a colon, i.e. " .. + "%s.%s() instead of %s:%s()?", + libraryName, selfObjDesc, method, varName, method, varName, method + ), 3 ) + end + end +end + +return libraryUtil diff --git a/lualib/mw.hash.lua b/lualib/mw.hash.lua new file mode 100644 index 0000000..95026e3 --- /dev/null +++ b/lualib/mw.hash.lua @@ -0,0 +1,30 @@ +local hash = {} +local php + +local util = require 'libraryUtil' +local checkType = util.checkType + +function hash.listAlgorithms() + return php.listAlgorithms() +end + +function hash.hashValue( algo, value ) + checkType( 'hashValue', 1, algo, 'string' ) + checkType( 'hashValue', 2, value, 'string' ) + + return php.hashValue( algo, value ) +end + +function hash.setupInterface() + -- Boilerplate + php = mw_interface + mw_interface = nil + + -- Register this library in the "mw" global + mw = mw or {} + mw.hash = hash + + package.loaded['mw.hash'] = hash +end + +return hash diff --git a/lualib/mw.html.lua b/lualib/mw.html.lua new file mode 100644 index 0000000..9baf50c --- /dev/null +++ b/lualib/mw.html.lua @@ -0,0 +1,433 @@ +--[[ + A module for building complex HTML from Lua using a + fluent interface. + + Originally written on the English Wikipedia by + Toohool and Mr. Stradivarius. + + Code released under the GPL v2+ as per: + https://en.wikipedia.org/w/index.php?diff=next&oldid=581399786 + https://en.wikipedia.org/w/index.php?diff=next&oldid=581403025 + + @license GNU GPL v2+ + @author Marius Hoch < hoo@online.de > +]] + +local HtmlBuilder = {} +local options + +local util = require 'libraryUtil' +local checkType = util.checkType +local checkTypeMulti = util.checkTypeMulti + +local metatable = {} +local methodtable = {} + +local selfClosingTags = { + area = true, + base = true, + br = true, + col = true, + command = true, + embed = true, + hr = true, + img = true, + input = true, + keygen = true, + link = true, + meta = true, + param = true, + source = true, + track = true, + wbr = true, +} + +local htmlencodeMap = { + ['>'] = '>', + ['<'] = '<', + ['&'] = '&', + ['"'] = '"', +} + +metatable.__index = methodtable + +metatable.__tostring = function( t ) + local ret = {} + t:_build( ret ) + return table.concat( ret ) +end + +-- Get an attribute table (name, value) and its index +-- +-- @param name +local function getAttr( t, name ) + for i, attr in ipairs( t.attributes ) do + if attr.name == name then + return attr, i + end + end +end + +-- Is this a valid attribute name? +-- +-- @param s +local function isValidAttributeName( s ) + -- Good estimate: http://www.w3.org/TR/2000/REC-xml-20001006#NT-Name + return s:match( '^[a-zA-Z_:][a-zA-Z0-9_.:-]*$' ) +end + +-- Is this a valid tag name? +-- +-- @param s +local function isValidTag( s ) + return s:match( '^[a-zA-Z0-9]+$' ) +end + +-- Escape a value, for use in HTML +-- +-- @param s +local function htmlEncode( s ) + -- The parentheses ensure that there is only one return value + local tmp = string.gsub( s, '[<>&"]', htmlencodeMap ); + -- Don't encode strip markers here (T110143) + tmp = string.gsub( tmp, options.encodedUniqPrefixPat, options.uniqPrefixRepl ) + tmp = string.gsub( tmp, options.encodedUniqSuffixPat, options.uniqSuffixRepl ) + return tmp +end + +local function cssEncode( s ) + -- mw.ustring is so slow that it's worth searching the whole string + -- for non-ASCII characters to avoid it if possible + return ( string.find( s, '[^%z\1-\127]' ) and mw.ustring or string ) + -- XXX: I'm not sure this character set is complete. + -- bug #68011: allow delete character (\127) + .gsub( s, '[^\32-\57\60-\127]', function ( m ) + return string.format( '\\%X ', mw.ustring.codepoint( m ) ) + end ) +end + +-- Create a builder object. This is a separate function so that we can show the +-- correct error levels in both HtmlBuilder.create and metatable.tag. +-- +-- @param tagName +-- @param args +local function createBuilder( tagName, args ) + if tagName ~= nil and tagName ~= '' and not isValidTag( tagName ) then + error( string.format( "invalid tag name '%s'", tagName ), 3 ) + end + + args = args or {} + local builder = {} + setmetatable( builder, metatable ) + builder.nodes = {} + builder.attributes = {} + builder.styles = {} + + if tagName ~= '' then + builder.tagName = tagName + end + + builder.parent = args.parent + builder.selfClosing = selfClosingTags[tagName] or args.selfClosing or false + return builder +end + +-- Append a builder to the current node. This is separate from methodtable.node +-- so that we can show the correct error level in both methodtable.node and +-- methodtable.wikitext. +-- +-- @param builder +local function appendBuilder( t, builder ) + if t.selfClosing then + error( "self-closing tags can't have child nodes", 3 ) + end + + if builder then + table.insert( t.nodes, builder ) + end + return t +end + +methodtable._build = function( t, ret ) + if t.tagName then + table.insert( ret, '<' .. t.tagName ) + for i, attr in ipairs( t.attributes ) do + table.insert( + ret, + -- Note: Attribute names have already been validated + ' ' .. attr.name .. '="' .. htmlEncode( attr.val ) .. '"' + ) + end + if #t.styles > 0 then + table.insert( ret, ' style="' ) + local css = {} + for i, prop in ipairs( t.styles ) do + if type( prop ) ~= 'table' then -- added with cssText() + table.insert( css, htmlEncode( prop ) ) + else -- added with css() + table.insert( + css, + htmlEncode( cssEncode( prop.name ) .. ':' .. cssEncode( prop.val ) ) + ) + end + end + table.insert( ret, table.concat( css, ';' ) ) + table.insert( ret, '"' ) + end + if t.selfClosing then + table.insert( ret, ' />' ) + return + end + table.insert( ret, '>' ) + end + for i, node in ipairs( t.nodes ) do + if node then + if type( node ) == 'table' then + node:_build( ret ) + else + table.insert( ret, tostring( node ) ) + end + end + end + if t.tagName then + table.insert( ret, '' ) + end +end + +-- Append a builder to the current node +-- +-- @param builder +methodtable.node = function( t, builder ) + return appendBuilder( t, builder ) +end + +-- Appends some markup to the node. This will be treated as wikitext. +methodtable.wikitext = function( t, ... ) + for k,v in ipairs{...} do + checkTypeMulti( 'wikitext', k, v, { 'string', 'number' } ) + appendBuilder( t, v ) + end + return t +end + +-- Appends a newline character to the node. +methodtable.newline = function( t ) + return t:wikitext( '\n' ) +end + +-- Appends a new child node to the builder, and returns an HtmlBuilder instance +-- representing that new node. +-- +-- @param tagName +-- @param args +methodtable.tag = function( t, tagName, args ) + checkType( 'tag', 1, tagName, 'string' ) + checkType( 'tag', 2, args, 'table', true ) + args = args or {} + + args.parent = t + local builder = createBuilder( tagName, args ) + t:node( builder ) + return builder +end + +-- Get the value of an html attribute +-- +-- @param name +methodtable.getAttr = function( t, name ) + checkType( 'getAttr', 1, name, 'string' ) + + local attr = getAttr( t, name ) + return attr and attr.val +end + +-- Set an HTML attribute on the node. +-- +-- @param name Attribute to set, alternative table of name-value pairs +-- @param val Value of the attribute. Nil causes the attribute to be unset +methodtable.attr = function( t, name, val ) + if type( name ) == 'table' then + if val ~= nil then + error( + "bad argument #2 to 'attr' " .. + '(if argument #1 is a table, argument #2 must be left empty)', + 2 + ) + end + + local callForTable = function() + for attrName, attrValue in pairs( name ) do + t:attr( attrName, attrValue ) + end + end + + if not pcall( callForTable ) then + error( + "bad argument #1 to 'attr' " .. + '(table keys must be strings, and values must be strings or numbers)', + 2 + ) + end + + return t + end + + checkType( 'attr', 1, name, 'string' ) + checkTypeMulti( 'attr', 2, val, { 'string', 'number', 'nil' } ) + + -- if caller sets the style attribute explicitly, then replace all styles + -- previously added with css() and cssText() + if name == 'style' then + t.styles = { val } + return t + end + + if not isValidAttributeName( name ) then + error( string.format( + "bad argument #1 to 'attr' (invalid attribute name '%s')", + name + ), 2 ) + end + + local attr, i = getAttr( t, name ) + if attr then + if val ~= nil then + attr.val = val + else + table.remove( t.attributes, i ) + end + elseif val ~= nil then + table.insert( t.attributes, { name = name, val = val } ) + end + + return t +end + +-- Adds a class name to the node's class attribute. Spaces will be +-- automatically added to delimit each added class name. +-- +-- @param class +methodtable.addClass = function( t, class ) + checkTypeMulti( 'addClass', 1, class, { 'string', 'number', 'nil' } ) + + if class ~= nil then + local attr = getAttr( t, 'class' ) + if attr then + attr.val = attr.val .. ' ' .. class + else + t:attr( 'class', class ) + end + end + return t +end + +-- Set a CSS property to be added to the node's style attribute. +-- +-- @param name CSS attribute to set, alternative table of name-value pairs +-- @param val The value to set. Nil causes it to be unset +methodtable.css = function( t, name, val ) + if type( name ) == 'table' then + if val ~= nil then + error( + "bad argument #2 to 'css' " .. + '(if argument #1 is a table, argument #2 must be left empty)', + 2 + ) + end + + local callForTable = function() + for attrName, attrValue in pairs( name ) do + t:css( attrName, attrValue ) + end + end + + if not pcall( callForTable ) then + error( + "bad argument #1 to 'css' " .. + '(table keys and values must be strings or numbers)', + 2 + ) + end + + return t + end + + checkTypeMulti( 'css', 1, name, { 'string', 'number' } ) + checkTypeMulti( 'css', 2, val, { 'string', 'number', 'nil' } ) + + for i, prop in ipairs( t.styles ) do + if prop.name == name then + if val ~= nil then + prop.val = val + else + table.remove( t.styles, i ) + end + return t + end + end + + if val ~= nil then + table.insert( t.styles, { name = name, val = val } ) + end + + return t +end + +-- Add some raw CSS to the node's style attribute. This is typically used +-- when a template allows some CSS to be passed in as a parameter +-- +-- @param css +methodtable.cssText = function( t, css ) + checkTypeMulti( 'cssText', 1, css, { 'string', 'number', 'nil' } ) + table.insert( t.styles, css ) + return t +end + +-- Returns the parent node under which the current node was created. Like +-- jQuery.end, this is a convenience function to allow the construction of +-- several child nodes to be chained together into a single statement. +methodtable.done = function( t ) + return t.parent or t +end + +-- Like .done(), but traverses all the way to the root node of the tree and +-- returns it. +methodtable.allDone = function( t ) + while t.parent do + t = t.parent + end + return t +end + +-- Create a new instance +-- +-- @param tagName +-- @param args +function HtmlBuilder.create( tagName, args ) + checkType( 'mw.html.create', 1, tagName, 'string', true ) + checkType( 'mw.html.create', 2, args, 'table', true ) + return createBuilder( tagName, args ) +end + +function HtmlBuilder.setupInterface( opts ) + -- Boilerplate + HtmlBuilder.setupInterface = nil + mw_interface = nil + options = opts + + -- Prepare patterns for unencoding strip markers + options.encodedUniqPrefixPat = string.gsub( options.uniqPrefix, '[<>&"]', htmlencodeMap ); + options.encodedUniqPrefixPat = string.gsub( options.encodedUniqPrefixPat, '%p', '%%%0' ); + options.uniqPrefixRepl = string.gsub( options.uniqPrefix, '%%', '%%%0' ); + options.encodedUniqSuffixPat = string.gsub( options.uniqSuffix, '[<>&"]', htmlencodeMap ); + options.encodedUniqSuffixPat = string.gsub( options.encodedUniqSuffixPat, '%p', '%%%0' ); + options.uniqSuffixRepl = string.gsub( options.uniqSuffix, '%%', '%%%0' ); + + -- Register this library in the "mw" global + mw = mw or {} + mw.html = HtmlBuilder + + package.loaded['mw.html'] = HtmlBuilder +end + +return HtmlBuilder diff --git a/lualib/mw.language.lua b/lualib/mw.language.lua new file mode 100644 index 0000000..edd7110 --- /dev/null +++ b/lualib/mw.language.lua @@ -0,0 +1,189 @@ +local language = {} +local php +local util = require 'libraryUtil' + +function language.setupInterface() + -- Boilerplate + language.setupInterface = nil + php = mw_interface + mw_interface = nil + + -- Register this library in the "mw" global + mw = mw or {} + mw.language = language + mw.getContentLanguage = language.getContentLanguage + mw.getLanguage = mw.language.new + + local lang = mw.getContentLanguage(); + + -- Extend ustring + if mw.ustring then + mw.ustring.upper = function ( s ) + return lang:uc( s ) + end + mw.ustring.lower = function ( s ) + return lang:lc( s ) + end + string.uupper = mw.ustring.upper + string.ulower = mw.ustring.lower + end + + package.loaded['mw.language'] = language +end + +function language.isSupportedLanguage( code ) + return php.isSupportedLanguage( code ) +end + +function language.isKnownLanguageTag( code ) + return php.isKnownLanguageTag( code ) +end + +function language.isValidCode( code ) + return php.isValidCode( code ) +end + +function language.isValidBuiltInCode( code ) + return php.isValidBuiltInCode( code ) +end + +function language.fetchLanguageName( code, inLanguage ) + return php.fetchLanguageName( code, inLanguage ) +end + +function language.fetchLanguageNames( inLanguage, include ) + return php.fetchLanguageNames( inLanguage, include ) +end + +function language.getFallbacksFor( code ) + return php.getFallbacksFor( code ) +end + +function language.new( code ) + if code == nil then + error( "too few arguments to mw.language.new()", 2 ) + end + + local lang = { code = code } + + local checkSelf = util.makeCheckSelfFunction( 'mw.language', 'lang', lang, 'language object' ) + + local wrappers = { + lcfirst = 1, + ucfirst = 1, + lc = 1, + uc = 1, + caseFold = 1, + formatNum = 1, + formatDate = 1, + formatDuration = 1, + getDurationIntervals = 1, + convertPlural = 2, + convertGrammar = 2, + gender = 2, + } + + for name, numArgs in pairs( wrappers ) do + lang[name] = function ( self, ... ) + checkSelf( self, name ) + if select( '#', ... ) < numArgs then + error( "too few arguments to mw.language:" .. name, 2 ) + end + return php[name]( self.code, ... ) + end + end + + -- This one could use caching + function lang:isRTL() + checkSelf( self, 'isRTL' ) + local rtl = php.isRTL( self.code ) + self.isRTL = function () + return rtl + end + return rtl + end + + -- Fix semantics + function lang:parseFormattedNumber( ... ) + checkSelf( self, 'parseFormattedNumber' ) + if select( '#', ... ) < 1 then + error( "too few arguments to mw.language:parseFormattedNumber", 2 ) + end + return tonumber( php.parseFormattedNumber( self.code, ... ) ) + end + + -- Alias + lang.plural = lang.convertPlural + + -- Parser function compat + function lang:grammar( case, word ) + checkSelf( self, name ) + return self:convertGrammar( word, case ) + end + + -- Other functions + function lang:getCode() + checkSelf( self, 'getCode' ) + return self.code + end + + function lang:getDir() + checkSelf( self, 'getDir' ) + return self:isRTL() and 'rtl' or 'ltr' + end + + function lang:getDirMark( opposite ) + checkSelf( self, 'getDirMark' ) + local b = self:isRTL() + if opposite then + b = not b + end + return b and '\226\128\143' or '\226\128\142' + end + + function lang:getDirMarkEntity( opposite ) + checkSelf( self, 'getDirMarkEntity' ) + local b = self:isRTL() + if opposite then + b = not b + end + return b and '‏' or '‎' + end + + function lang:getArrow( direction ) + checkSelf( self, 'getArrow' ) + direction = direction or 'forwards' + util.checkType( 'getArrow', 1, direction, 'string' ) + if direction == 'forwards' then + return self:isRTL() and '←' or '→' + elseif direction == 'backwards' then + return self:isRTL() and '→' or '←' + elseif direction == 'left' then + return '←' + elseif direction == 'right' then + return '→' + elseif direction == 'up' then + return '↑' + elseif direction == 'down' then + return '↓' + end + end + + function lang:getFallbackLanguages() + checkSelf( self, 'getFallbackLanguages' ) + return language.getFallbacksFor( self.code ) + end + + return lang +end + +local contLangCode + +function language.getContentLanguage() + if contLangCode == nil then + contLangCode = php.getContLangCode() + end + return language.new( contLangCode ) +end + +return language diff --git a/lualib/mw.lua b/lualib/mw.lua new file mode 100644 index 0000000..3110278 --- /dev/null +++ b/lualib/mw.lua @@ -0,0 +1,784 @@ +mw = mw or {} + +local packageCache +local packageModuleFunc +local php +local allowEnvFuncs = false +local logBuffer = '' +local currentFrame +local loadedData = {} +local executeFunctionDepth = 0 + +--- Put an isolation-friendly package module into the specified environment +-- table. The package module will have an empty cache, because caching of +-- module functions from other cloned environments would break module isolation. +-- +-- @param env The cloned environment +local function makePackageModule( env ) + -- Remove loaders from env, we don't want it inheriting our loadPackage. + if env.package then + env.package.loaders = nil + end + + -- Create the package globals in the given environment + setfenv( packageModuleFunc, env )() + + -- Make a loader function + local function loadPackage( modName ) + local init + if packageCache[modName] == 'missing' then + return nil + elseif packageCache[modName] == nil then + local lib = php.loadPHPLibrary( modName ) + if lib ~= nil then + init = function () + return mw.clone( lib ) + end + else + init = php.loadPackage( modName ) + if init == nil then + packageCache[modName] = 'missing' + return nil + end + end + packageCache[modName] = init + else + init = packageCache[modName] + end + + setfenv( init, env ) + return init + end + + table.insert( env.package.loaders, loadPackage ) +end + +--- Set up the base environment. The PHP host calls this function after any +-- necessary host-side initialisation has been done. +function mw.setupInterface( options ) + -- Don't allow any more calls + mw.setupInterface = nil + + -- Don't allow getmetatable() on a non-table, since if you can get the metatable, + -- you can set values in it, breaking isolation + local old_getmetatable = getmetatable + function getmetatable(obj) + if type(obj) == 'table' then + return old_getmetatable(obj) + else + return nil + end + end + + if options.allowEnvFuncs then + allowEnvFuncs = true + end + + -- Store the interface table + -- + -- mw_interface.loadPackage() returns function values with their environment + -- set to the base environment, which would violate module isolation if they + -- were run from a cloned environment. We can only allow access to + -- mw_interface.loadPackage via our environment-setting wrapper. + -- + php = mw_interface + mw_interface = nil + + packageModuleFunc = php.loadPackage( 'package' ) + makePackageModule( _G ) + package.loaded.mw = mw + packageCache = {} +end + +--- Create a table like the one os.date() returns, but with a metatable that sets TTLs as the values are looked at. +local function wrapDateTable( now ) + return setmetatable( {}, { + __index = function( t, k ) + if k == 'sec' then + php.setTTL( 1 ) + elseif k == 'min' then + php.setTTL( 60 - now.sec ) + elseif k == 'hour' then + php.setTTL( 3600 - now.min * 60 - now.sec ) + elseif now[k] ~= nil then + php.setTTL( 86400 - now.hour * 3600 - now.min * 60 - now.sec ) + end + t[k] = now[k] + return now[k] + end + } ) +end + +--- Wrappers for os.date() and os.time() that set the TTL of the output, if necessary +local function ttlDate( format, time ) + if time == nil and ( format == nil or type( format ) == 'string' ) then + local now = os.date( format and format:sub( 1, 1 ) == '!' and '!*t' or '*t' ) + if format == '!*t' or format == '*t' then + return wrapDateTable( now ) + end + local cleanedFormat = format and format:gsub( '%%%%', '' ) + if not format or cleanedFormat:find( '%%[EO]?[crsSTX+]' ) then + php.setTTL( 1 ) -- second + elseif cleanedFormat:find( '%%[EO]?[MR]' ) then + php.setTTL( 60 - now.sec ) -- minute + elseif cleanedFormat:find( '%%[EO]?[HIkl]' ) then + php.setTTL( 3600 - now.min * 60 - now.sec ) -- hour + elseif cleanedFormat:find( '%%[EO]?[pP]' ) then + php.setTTL( 43200 - ( now.hour % 12 ) * 3600 - now.min * 60 - now.sec ) -- am/pm + else + -- It's not worth the complexity to figure out the exact TTL of larger units than days. + -- If they haven't used anything shorter than days, then just set the TTL to expire at + -- the end of today. + php.setTTL( 86400 - now.hour * 3600 - now.min * 60 - now.sec ) + end + end + return os.date( format, time ) +end + +local function ttlTime( t ) + if t == nil then + php.setTTL( 1 ) + end + return os.time( t ) +end + +local function newFrame( frameId, ... ) + if not php.frameExists( frameId ) then + return nil + end + + local frame = {} + local parentFrameIds = { ... } + local argCache = {} + local argNames + local args_mt = {} + + local function checkSelf( self, method ) + if self ~= frame then + error( "frame:" .. method .. ": invalid frame object. " .. + "Did you call " .. method .. " with a dot instead of a colon, i.e. " .. + "frame." .. method .. "() instead of frame:" .. method .. "()?", + 3 ) + end + end + + -- Getter for args + local function getExpandedArgument( dummy, name ) + name = tostring( name ) + if argCache[name] == nil then + local arg = php.getExpandedArgument( frameId, name ) + if arg == nil then + argCache[name] = false + else + argCache[name] = arg + end + end + if argCache[name] == false then + return nil + else + return argCache[name] + end + end + + args_mt.__index = getExpandedArgument + + -- pairs handler for args + args_mt.__pairs = function () + if not argNames then + local arguments = php.getAllExpandedArguments( frameId ) + argNames = {} + for name, value in pairs( arguments ) do + table.insert( argNames, name ) + argCache[name] = value + end + end + + local index = 0 + return function () + index = index + 1 + if argNames[index] then + return argNames[index], argCache[argNames[index]] + end + end + end + + -- ipairs 'next' function for args + local function argsInext( dummy, i ) + local value = getExpandedArgument( dummy, i + 1 ) + if value then + return i + 1, value + end + end + + args_mt.__ipairs = function () return argsInext, nil, 0 end + + frame.args = {} + setmetatable( frame.args, args_mt ) + + local function newCallbackParserValue( callback ) + local value = {} + local cache + + function value:expand() + if not cache then + cache = callback() + end + return cache + end + + return value + end + + function frame:getArgument( opt ) + checkSelf( self, 'getArgument' ) + + local name + if type( opt ) == 'table' then + name = opt.name + else + name = opt + end + + return newCallbackParserValue( + function () + return getExpandedArgument( nil, name ) + end + ) + end + + function frame:getParent() + checkSelf( self, 'getParent' ) + + return newFrame( unpack( parentFrameIds ) ) + end + + local function checkArgs( name, args ) + local ret = {} + for k, v in pairs( args ) do + local tp = type( k ) + if tp ~= 'string' and tp ~= 'number' then + error( name .. ": arg keys must be strings or numbers, " .. tp .. " given", 3 ) + end + tp = type( v ) + if tp == 'boolean' then + ret[k] = v and '1' or '' + elseif tp == 'string' or tp == 'number' then + ret[k] = tostring( v ) + else + error( name .. ": invalid type " .. tp .. " for arg '" .. k .. "'", 3 ) + end + end + return ret + end + + function frame:newChild( opt ) + checkSelf( self, 'newChild' ) + + if type( opt ) ~= 'table' then + error( "frame:newChild: the first parameter must be a table", 2 ) + end + + local title, args + if opt.title == nil then + title = false + else + title = tostring( opt.title ) + end + if opt.args == nil then + args = {} + elseif type( opt.args ) ~= 'table' then + error( "frame:newChild: args must be a table", 2 ) + else + args = checkArgs( 'frame:newChild', opt.args ) + end + + local newFrameId = php.newChildFrame( frameId, title, args ) + return newFrame( newFrameId, frameId, unpack( parentFrameIds ) ) + end + + function frame:expandTemplate( opt ) + checkSelf( self, 'expandTemplate' ) + + local title + + if type( opt ) ~= 'table' then + error( "frame:expandTemplate: the first parameter must be a table" ) + end + if opt.title == nil then + error( "frame:expandTemplate: a title is required" ) + else + if type( opt.title ) == 'table' and opt.title.namespace == 0 then + title = ':' .. tostring( opt.title ) + else + title = tostring( opt.title ) + end + end + local args + if opt.args == nil then + args = {} + elseif type( opt.args ) ~= 'table' then + error( "frame:expandTemplate: args must be a table" ) + else + args = checkArgs( 'frame:expandTemplate', opt.args ) + end + + return php.expandTemplate( frameId, title, args ) + end + + function frame:callParserFunction( name, args, ... ) + checkSelf( self, 'callParserFunction' ) + + if type( name ) == 'table' then + name, args = name.name, name.args + if type( args ) ~= 'table' then + args = { args } + end + elseif type( args ) ~= 'table' then + args = { args, ... } + end + + if name == nil then + error( "frame:callParserFunction: a function name is required", 2 ) + elseif type( name ) == 'string' or type( name ) == 'number' then + name = tostring( name ) + else + error( "frame:callParserFunction: function name must be a string or number", 2 ) + end + + args = checkArgs( 'frame:callParserFunction', args ) + + return php.callParserFunction( frameId, name, args ) + end + + function frame:extensionTag( name, content, args ) + checkSelf( self, 'extensionTag' ) + + if type( name ) == 'table' then + name, content, args = name.name, name.content, name.args + end + + if name == nil then + error( "frame:extensionTag: a function name is required", 2 ) + elseif type( name ) == 'string' or type( name ) == 'number' then + name = tostring( name ) + else + error( "frame:extensionTag: tag name must be a string or number", 2 ) + end + + if content == nil then + content = '' + elseif type( content ) == 'string' or type( content ) == 'number' then + content = tostring( content ) + else + error( "frame:extensionTag: content must be a string or number", 2 ) + end + + if args == nil then + args = { content } + elseif type( args ) == 'string' or type( args ) == 'number' then + args = { content, args } + elseif type( args ) == 'table' then + args = checkArgs( 'frame:extensionTag', args ) + table.insert( args, 1, content ) + else + error( "frame:extensionTag: args must be a string, number, or table", 2 ) + end + + return php.callParserFunction( frameId, '#tag:' .. name, args ) + end + + function frame:preprocess( opt ) + checkSelf( self, 'preprocess' ) + + local text + if type( opt ) == 'table' then + text = opt.text + else + text = opt + end + text = tostring( text ) + return php.preprocess( frameId, text ) + end + + function frame:newParserValue( opt ) + checkSelf( self, 'newParserValue' ) + + local text + if type( opt ) == 'table' then + text = opt.text + else + text = opt + end + + return newCallbackParserValue( + function () + return self:preprocess( text ) + end + ) + end + + function frame:newTemplateParserValue( opt ) + checkSelf( self, 'newTemplateParserValue' ) + + if type( opt ) ~= 'table' then + error( "frame:newTemplateParserValue: the first parameter must be a table" ) + end + if opt.title == nil then + error( "frame:newTemplateParserValue: a title is required" ) + end + return newCallbackParserValue( + function () + return self:expandTemplate( opt ) + end + ) + end + + function frame:getTitle() + checkSelf( self, 'getTitle' ) + return php.getFrameTitle( frameId ) + end + + -- For backwards compat + function frame:argumentPairs() + checkSelf( self, 'argumentPairs' ) + return pairs( self.args ) + end + + return frame +end + +--- Set up a cloned environment for execution of a module chunk, then execute +-- the module in that environment. This is called by the host to implement +-- {{#invoke}}. +-- +-- @param chunk The module chunk +-- @param name The name of the function to be returned. Nil or false causes the entire export table to be returned +-- @return boolean Whether the requested value was able to be returned +-- @return table|function|string The requested value, or if that was unable to be returned, the type of the value returned by the module +function mw.executeModule( chunk, name ) + local env = mw.clone( _G ) + makePackageModule( env ) + + -- These are unsafe + env.mw.makeProtectedEnvFuncs = nil + env.mw.executeModule = nil + if name ~= false then -- console sets name to false when evaluating its code and nil when evaluating a module's + env.mw.getLogBuffer = nil + env.mw.clearLogBuffer = nil + end + + if allowEnvFuncs then + env.setfenv, env.getfenv = mw.makeProtectedEnvFuncs( {[_G] = true}, {} ) + else + env.setfenv = nil + env.getfenv = nil + end + + env.os.date = ttlDate + env.os.time = ttlTime + + setfenv( chunk, env ) + + local oldFrame = currentFrame + if not currentFrame then + currentFrame = newFrame( 'current', 'parent' ) + end + local res = chunk() + currentFrame = oldFrame + + if not name then -- catch console whether it's evaluating its own code or a module's + return true, res + end + if type(res) ~= 'table' then + return false, type(res) + end + return true, res[name] +end + +function mw.executeFunction( chunk ) + local frame = newFrame( 'current', 'parent' ) + local oldFrame = currentFrame + + if executeFunctionDepth == 0 then + -- math.random is defined as using C's rand(), and C's rand() uses 1 as + -- a seed if not explicitly seeded. So reseed with 1 for each top-level + -- #invoke to avoid people passing state via the RNG. + math.randomseed( 1 ) + end + executeFunctionDepth = executeFunctionDepth + 1 + + currentFrame = frame + local results = { chunk( frame ) } + currentFrame = oldFrame + + local stringResults = {} + for i, result in ipairs( results ) do + stringResults[i] = tostring( result ) + end + + executeFunctionDepth = executeFunctionDepth - 1 + + return table.concat( stringResults ) +end + +function mw.allToString( ... ) + local t = { ... } + for i = 1, select( '#', ... ) do + t[i] = tostring( t[i] ) + end + return table.concat( t, '\t' ) +end + +function mw.log( ... ) + logBuffer = logBuffer .. mw.allToString( ... ) .. '\n' +end + +function mw.dumpObject( object ) + local doneTable = {} + local doneObj = {} + local ct = {} + local function sorter( a, b ) + local ta, tb = type( a ), type( b ) + if ta ~= tb then + return ta < tb + end + if ta == 'string' or ta == 'number' then + return a < b + end + if ta == 'boolean' then + return tostring( a ) < tostring( b ) + end + return false -- Incomparable + end + local function _dumpObject( object, indent, expandTable ) + local tp = type( object ) + if tp == 'number' or tp == 'nil' or tp == 'boolean' then + return tostring( object ) + elseif tp == 'string' then + return string.format( "%q", object ) + elseif tp == 'table' then + if not doneObj[object] then + local s = tostring( object ) + if s == 'table' then + ct[tp] = ( ct[tp] or 0 ) + 1 + doneObj[object] = 'table#' .. ct[tp] + else + doneObj[object] = s + doneTable[object] = true + end + end + if doneTable[object] or not expandTable then + return doneObj[object] + end + doneTable[object] = true + + local ret = { doneObj[object], ' {\n' } + local mt = getmetatable( object ) + if mt then + ret[#ret + 1] = string.rep( " ", indent + 2 ) + ret[#ret + 1] = 'metatable = ' + ret[#ret + 1] = _dumpObject( mt, indent + 2, false ) + ret[#ret + 1] = "\n" + end + + local doneKeys = {} + for key, value in ipairs( object ) do + doneKeys[key] = true + ret[#ret + 1] = string.rep( " ", indent + 2 ) + ret[#ret + 1] = _dumpObject( value, indent + 2, true ) + ret[#ret + 1] = ',\n' + end + local keys = {} + for key in pairs( object ) do + if not doneKeys[key] then + keys[#keys + 1] = key + end + end + table.sort( keys, sorter ) + for i = 1, #keys do + local key = keys[i] + ret[#ret + 1] = string.rep( " ", indent + 2 ) + ret[#ret + 1] = '[' + ret[#ret + 1] = _dumpObject( key, indent + 3, false ) + ret[#ret + 1] = '] = ' + ret[#ret + 1] = _dumpObject( object[key], indent + 2, true ) + ret[#ret + 1] = ",\n" + end + ret[#ret + 1] = string.rep( " ", indent ) + ret[#ret + 1] = '}' + return table.concat( ret ) + else + if not doneObj[object] then + ct[tp] = ( ct[tp] or 0 ) + 1 + doneObj[object] = tostring( object ) .. '#' .. ct[tp] + end + return doneObj[object] + end + end + return _dumpObject( object, 0, true ) +end + +function mw.logObject( object, prefix ) + if prefix and prefix ~= '' then + logBuffer = logBuffer .. prefix .. ' = ' + end + logBuffer = logBuffer .. mw.dumpObject( object ) .. '\n' +end + +function mw.clearLogBuffer() + logBuffer = '' +end + +function mw.getLogBuffer() + return logBuffer +end + +function mw.getCurrentFrame() + if not currentFrame then + currentFrame = newFrame( 'current', 'parent' ) + end + return currentFrame +end + +function mw.isSubsting() + return php.isSubsting() +end + +function mw.incrementExpensiveFunctionCount() + php.incrementExpensiveFunctionCount() +end + +function mw.addWarning( text ) + php.addWarning( text ) +end + +--- +-- Wrapper for mw.loadData. This creates the read-only dummy table for +-- accessing the real data. +-- +-- @param data table Data to access +-- @param seen table|nil Table of already-seen tables. +-- @return table +local function dataWrapper( data, seen ) + local t = {} + seen = seen or { [data] = t } + + local function pairsfunc( s, k ) + k = next( data, k ) + if k ~= nil then + return k, t[k] + end + return nil + end + + local function ipairsfunc( s, i ) + i = i + 1 + if data[i] ~= nil then + return i, t[i] + end + return -- no nil to match default ipairs() + end + + local mt = { + mw_loadData = true, + __index = function ( tt, k ) + assert( t == tt ) + local v = data[k] + if type( v ) == 'table' then + seen[v] = seen[v] or dataWrapper( v, seen ) + return seen[v] + end + return v + end, + __newindex = function ( t, k, v ) + error( "table from mw.loadData is read-only", 2 ) + end, + __pairs = function ( tt ) + assert( t == tt ) + return pairsfunc, t, nil + end, + __ipairs = function ( tt ) + assert( t == tt ) + return ipairsfunc, t, 0 + end, + } + -- This is just to make setmetatable() fail + mt.__metatable = mt + + return setmetatable( t, mt ) +end + +--- +-- Validator for mw.loadData. This scans through the data looking for things +-- that are not supported, e.g. functions (which may be closures). +-- +-- @param d table Data to access. +-- @param seen table|nil Table of already-seen tables. +-- @return string|nil Error message, if any +local function validateData( d, seen ) + seen = seen or {} + local tp = type( d ) + if tp == 'nil' or tp == 'boolean' or tp == 'number' or tp == 'string' then + return nil + elseif tp == 'table' then + if seen[d] then + return nil + end + seen[d] = true + if getmetatable( d ) ~= nil then + return "data for mw.loadData contains a table with a metatable" + end + for k, v in pairs( d ) do + if type( k ) == 'table' then + return "data for mw.loadData contains a table as a key" + end + local err = validateData( k, seen ) or validateData( v, seen ) + if err then + return err + end + end + return nil + else + return "data for mw.loadData contains unsupported data type '" .. tp .. "'" + end +end + +function mw.loadData( module ) + local data = loadedData[module] + if type( data ) == 'string' then + -- No point in re-validating + error( data, 2 ) + end + if not data then + -- Don't allow accessing the current frame's info (bug 65687) + local oldFrame = currentFrame + currentFrame = newFrame( 'empty' ) + + -- The point of this is to load big data, so don't save it in package.loaded + -- where it will have to be copied for all future modules. + local l = package.loaded[module] + local _ + + _, data = mw.executeModule( function() return require( module ) end ) + + package.loaded[module] = l + currentFrame = oldFrame + + -- Validate data + local err + if type( data ) == 'table' then + err = validateData( data ) + else + err = module .. ' returned ' .. type( data ) .. ', table expected' + end + if err then + loadedData[module] = err + error( err, 2 ) + end + loadedData[module] = data + end + + return dataWrapper( data ) +end + +return mw diff --git a/lualib/mw.message.lua b/lualib/mw.message.lua new file mode 100644 index 0000000..b80c931 --- /dev/null +++ b/lualib/mw.message.lua @@ -0,0 +1,198 @@ +local message = {} +local php + +local util = require 'libraryUtil' +local checkType = util.checkType + +local valuemt = { + __tostring = function ( t ) + return tostring( t.raw or t.num ) + end +} + +local function checkScalar( name, argIdx, arg, level, valuemtOk ) + local tp = type( arg ) + + -- If special params are ok, detect them + if valuemtOk and tp == 'table' and getmetatable( arg ) == valuemt then + return arg + end + + -- If it's a table with a custom __tostring function, use that string + if tp == 'table' and getmetatable( arg ) and getmetatable( arg ).__tostring then + return tostring( arg ) + end + + if tp ~= 'string' and tp ~= 'number' then + error( string.format( + "bad argument #%d to '%s' (string or number expected, got %s)", + argIdx, name, tp + ), level + 1 ) + end + + return arg +end + +local function checkParams( name, valueOk, ... ) + -- Accept an array of params, or params as individual command line arguments + local params, nparams + local first = select( 1, ... ) + if type( first ) == 'table' and + not ( getmetatable( first ) and getmetatable( first ).__tostring ) + then + if select( '#', ... ) == 1 then + params = first + nparams = table.maxn( params ) + else + error( + "bad arguments to '" .. name .. "' (pass either a table of params or params as individual arguments)", + 3 + ) + end + else + params = { ... } + nparams = select( '#', ... ) + end + for i = 1, nparams do + params[i] = checkScalar( 'params', i, params[i], 3, valueOk ) + end + return params +end + +function message.setupInterface( options ) + -- Boilerplate + message.setupInterface = nil + php = mw_interface + mw_interface = nil + php.options = options + + -- Register this library in the "mw" global + mw = mw or {} + mw.message = message + + package.loaded['mw.message'] = message +end + +local function makeMessage( options ) + local obj = {} + local checkSelf = util.makeCheckSelfFunction( 'mw.message', 'msg', obj, 'message object' ) + + local data = { + keys = options.keys, + rawMessage = options.rawMessage, + params = {}, + lang = php.options.lang, + useDB = true, + } + + function obj:params( ... ) + checkSelf( self, 'params' ) + local params = checkParams( 'params', true, ... ) + local j = #data.params + for i = 1, #params do + data.params[j + i] = params[i] + end + return self + end + + function obj:rawParams( ... ) + checkSelf( self, 'rawParams' ) + local params = checkParams( 'rawParams', false, ... ) + local j = #data.params + for i = 1, #params do + data.params[j + i] = setmetatable( { raw = params[i] }, valuemt ) + end + return self + end + + function obj:numParams( ... ) + checkSelf( self, 'numParams' ) + local params = checkParams( 'numParams', false, ... ) + local j = #data.params + for i = 1, #params do + data.params[j + i] = setmetatable( { num = params[i] }, valuemt ) + end + return self + end + + function obj:inLanguage( lang ) + checkSelf( self, 'inLanguage' ) + if type( lang ) == 'table' and lang.getCode then + -- probably a mw.language object + lang = lang:getCode() + end + checkType( 'inLanguage', 1, lang, 'string' ) + data.lang = lang + return self + end + + function obj:useDatabase( value ) + checkSelf( self, 'useDatabase' ) + checkType( 'useDatabase', 1, value, 'boolean' ) + data.useDB = value + return self + end + + function obj:plain() + checkSelf( self, 'plain' ) + return php.plain( data ) + end + + function obj:exists() + checkSelf( self, 'exists' ) + return php.check( 'exists', data ) + end + + function obj:isBlank() + checkSelf( self, 'isBlank' ) + return php.check( 'isBlank', data ) + end + + function obj:isDisabled() + checkSelf( self, 'isDisabled' ) + return php.check( 'isDisabled', data ) + end + + return setmetatable( obj, { + __tostring = function ( t ) + return t:plain() + end + } ) +end + +function message.new( key, ... ) + checkType( 'message.new', 1, key, 'string' ) + return makeMessage{ keys = { key } }:params( ... ) +end + +function message.newFallbackSequence( ... ) + for i = 1, math.max( 1, select( '#', ... ) ) do + checkType( 'message.newFallbackSequence', i, select( i, ... ), 'string' ) + end + return makeMessage{ keys = { ... } } +end + +function message.newRawMessage( msg, ... ) + checkType( 'message.newRawMessage', 1, msg, 'string' ) + return makeMessage{ rawMessage = msg }:params( ... ) +end + +function message.rawParam( value ) + value = checkScalar( 'message.rawParam', 1, value ) + return setmetatable( { raw = value }, valuemt ) +end + +function message.numParam( value ) + value = checkScalar( 'message.numParam', 1, value ) + return setmetatable( { num = value }, valuemt ) +end + +function message.getDefaultLanguage() + if mw.language then + return mw.language.new( php.options.lang ) + else + return php.options.lang + end +end + +return message diff --git a/lualib/mw.site.lua b/lualib/mw.site.lua new file mode 100644 index 0000000..09943a8 --- /dev/null +++ b/lualib/mw.site.lua @@ -0,0 +1,86 @@ +local site = {} + +function site.setupInterface( info ) + -- Boilerplate + site.setupInterface = nil + local php = mw_interface + mw_interface = nil + + site.siteName = info.siteName + site.server = info.server + site.scriptPath = info.scriptPath + site.stylePath = info.stylePath + site.currentVersion = info.currentVersion + site.stats = info.stats + site.stats.pagesInCategory = php.pagesInCategory + site.stats.pagesInNamespace = php.pagesInNamespace + site.stats.usersInGroup = php.usersInGroup + site.interwikiMap = php.interwikiMap + + -- Process namespace list into more useful tables + site.namespaces = {} + local namespacesByName = {} + site.subjectNamespaces = {} + site.talkNamespaces = {} + site.contentNamespaces = {} + for ns, data in pairs( info.namespaces ) do + data.subject = info.namespaces[data.subject] + data.talk = info.namespaces[data.talk] + data.associated = info.namespaces[data.associated] + + site.namespaces[ns] = data + + namespacesByName[data.name] = data + if data.canonicalName then + namespacesByName[data.canonicalName] = data + end + for i = 1, #data.aliases do + namespacesByName[data.aliases[i]] = data + end + + if data.isSubject then + site.subjectNamespaces[ns] = data + end + if data.isTalk then + site.talkNamespaces[ns] = data + end + if data.isContent then + site.contentNamespaces[ns] = data + end + end + + -- Set __index for namespacesByName to handle names-with-underscores + -- and non-standard case + local getNsIndex = php.getNsIndex + setmetatable( namespacesByName, { + __index = function ( t, k ) + if type( k ) == 'string' then + -- Try with fixed underscores + k = string.gsub( k, '_', ' ' ) + if rawget( t, k ) then + return rawget( t, k ) + end + + -- Ask PHP, because names are case-insensitive + local ns = getNsIndex( k ) + if ns then + rawset( t, k, site.namespaces[ns] ) + end + end + return rawget( t, k ) + end + } ) + + -- Set namespacesByName as the lookup table for site.namespaces, so + -- something like site.namespaces.Wikipedia works without having + -- pairs( site.namespaces ) iterate all those names. + setmetatable( site.namespaces, { __index = namespacesByName } ) + + -- Register this library in the "mw" global + mw = mw or {} + mw.site = site + + package.loaded['mw.site'] = site +end + +return site diff --git a/lualib/mw.text.lua b/lualib/mw.text.lua new file mode 100644 index 0000000..0a1cd4f --- /dev/null +++ b/lualib/mw.text.lua @@ -0,0 +1,331 @@ +local mwtext = {} +local php +local options + +local util = require 'libraryUtil' +local checkType = util.checkType +local checkTypeForNamedArg = util.checkTypeForNamedArg + +function mwtext.setupInterface( opts ) + -- Boilerplate + mwtext.setupInterface = nil + php = mw_interface + mw_interface = nil + options = opts + + -- Register this library in the "mw" global + mw = mw or {} + mw.text = mwtext + + package.loaded['mw.text'] = mwtext +end + +function mwtext.trim( s, charset ) + charset = charset or '\t\r\n\f ' + s = mw.ustring.gsub( s, '^[' .. charset .. ']*(.-)[' .. charset .. ']*$', '%1' ) + return s +end + +local htmlencode_map = { + ['>'] = '>', + ['<'] = '<', + ['&'] = '&', + ['"'] = '"', + ["'"] = ''', + ['\194\160'] = ' ', +} +local htmldecode_map = {} +for k, v in pairs( htmlencode_map ) do + htmldecode_map[v] = k +end +local decode_named_entities = nil + +function mwtext.encode( s, charset ) + charset = charset or '<>&"\'\194\160' + s = mw.ustring.gsub( s, '[' .. charset .. ']', function ( m ) + if not htmlencode_map[m] then + local e = string.format( '&#%d;', mw.ustring.codepoint( m ) ) + htmlencode_map[m] = e + htmldecode_map[e] = m + end + return htmlencode_map[m] + end ) + return s +end + +function mwtext.decode( s, decodeNamedEntities ) + local dec + decodeNamedEntities = false -- hack to bypass missing implementation of getEntityTable() in MwText.java + if decodeNamedEntities then + if decode_named_entities == nil then + decode_named_entities = php.getEntityTable() + setmetatable( decode_named_entities, { __index = htmldecode_map } ) + end + dec = decode_named_entities + else + dec = htmldecode_map + end + -- string.gsub is safe here, because only ASCII chars are in the pattern + s = string.gsub( s, '(&(#?x?)([a-zA-Z0-9]+);)', function ( m, flg, name ) + if not dec[m] then + local n = nil + if flg == '#' then + n = tonumber( name, 10 ) + elseif flg == '#x' then + n = tonumber( name, 16 ) + end + if n and n <= 0x10ffff then + n = mw.ustring.char( n ) + if n then + htmldecode_map[m] = n + htmlencode_map[n] = m + end + end + end + return dec[m] + end ) + return s +end + +local nowikiRepl1 = { + ['"'] = '"', + ['&'] = '&', + ["'"] = ''', + ['<'] = '<', + ['='] = '=', + ['>'] = '>', + ['['] = '[', + [']'] = ']', + ['{'] = '{', + ['|'] = '|', + ['}'] = '}', +} + +local nowikiRepl2 = { + ["\n#"] = "\n#", ["\r#"] = "\r#", + ["\n*"] = "\n*", ["\r*"] = "\r*", + ["\n:"] = "\n:", ["\r:"] = "\r:", + ["\n;"] = "\n;", ["\r;"] = "\r;", + ["\n "] = "\n ", ["\r "] = "\r ", + ["\n\n"] = "\n ", ["\r\n"] = " \n", + ["\n\r"] = "\n ", ["\r\r"] = "\r ", + ["\n\t"] = "\n ", ["\r\t"] = "\r ", +} + +local nowikiReplMagic = {} +for sp, esc in pairs( { + [' '] = ' ', + ['\t'] = ' ', + ['\r'] = ' ', + ['\n'] = ' ', + ['\f'] = ' ', +} ) do + nowikiReplMagic['ISBN' .. sp] = 'ISBN' .. esc + nowikiReplMagic['RFC' .. sp] = 'RFC' .. esc + nowikiReplMagic['PMID' .. sp] = 'PMID' .. esc +end + +function mwtext.nowiki( s ) + -- string.gsub is safe here, because we're only caring about ASCII chars + s = string.gsub( s, '["&\'<=>%[%]{|}]', nowikiRepl1 ) + s = '\n' .. s + s = string.gsub( s, '[\r\n][#*:; \n\r\t]', nowikiRepl2 ) + s = string.gsub( s, '([\r\n])%-%-%-%-', '%1----' ) + s = string.sub( s, 2 ) + s = string.gsub( s, '__', '__' ) + s = string.gsub( s, '://', '://' ) + s = string.gsub( s, 'ISBN%s', nowikiReplMagic ) + s = string.gsub( s, 'RFC%s', nowikiReplMagic ) + s = string.gsub( s, 'PMID%s', nowikiReplMagic ) + for k, v in pairs( options.nowiki_protocols ) do + s = string.gsub( s, k, v ) + end + + return s +end + +function mwtext.tag( name, attrs, content ) + local named = false + if type( name ) == 'table' then + named = true + name, attrs, content = name.name, name.attrs, name.content + checkTypeForNamedArg( 'tag', 'name', name, 'string' ) + checkTypeForNamedArg( 'tag', 'attrs', attrs, 'table', true ) + else + checkType( 'tag', 1, name, 'string' ) + checkType( 'tag', 2, attrs, 'table', true ) + end + + local ret = { '<' .. name } + for k, v in pairs( attrs or {} ) do + if type( k ) ~= 'string' then + error( "bad named argument attrs to 'tag' (keys must be strings, found " .. type( k ) .. ")", 2 ) + end + if string.match( k, '[\t\r\n\f /<>"\'=]' ) then + error( "bad named argument attrs to 'tag' (invalid key '" .. k .. "')", 2 ) + end + local tp = type( v ) + if tp == 'boolean' then + if v then + ret[#ret+1] = ' ' .. k + end + elseif tp == 'string' or tp == 'number' then + ret[#ret+1] = string.format( ' %s="%s"', k, mwtext.encode( tostring( v ) ) ) + else + error( "bad named argument attrs to 'tag' (value for key '" .. k .. "' may not be " .. tp .. ")", 2 ) + end + end + + local tp = type( content ) + if content == nil then + ret[#ret+1] = '>' + elseif content == false then + ret[#ret+1] = ' />' + elseif tp == 'string' or tp == 'number' then + ret[#ret+1] = '>' + ret[#ret+1] = content + ret[#ret+1] = '' + else + if named then + checkTypeForNamedArg( 'tag', 'content', content, 'string, number, nil, or false' ) + else + checkType( 'tag', 3, content, 'string, number, nil, or false' ) + end + end + + return table.concat( ret ) +end + +function mwtext.unstrip( s ) + return php.unstrip( s ) +end + +function mwtext.unstripNoWiki( s ) + return php.unstripNoWiki( s ) +end + +function mwtext.killMarkers( s ) + return php.killMarkers( s ) +end + +function mwtext.split( text, pattern, plain ) + local ret = {} + for m in mwtext.gsplit( text, pattern, plain ) do + ret[#ret+1] = m + end + return ret +end + +function mwtext.gsplit( text, pattern, plain ) + local s, l = 1, mw.ustring.len( text ) + return function () + if s then + local e, n = mw.ustring.find( text, pattern, s, plain ) + local ret + if not e then + ret = mw.ustring.sub( text, s ) + s = nil + elseif n < e then + -- Empty separator! + ret = mw.ustring.sub( text, s, e ) + if e < l then + s = e + 1 + else + s = nil + end + else + ret = e > s and mw.ustring.sub( text, s, e - 1 ) or '' + s = n + 1 + end + return ret + end + end, nil, nil +end + +function mwtext.listToText( list, separator, conjunction ) + separator = separator or options.comma + conjunction = conjunction or options['and'] + local n = #list + + local ret + if n > 1 then + ret = table.concat( list, separator, 1, n - 1 ) .. conjunction .. list[n] + else + ret = tostring( list[1] or '' ) + end + + return ret +end + +function mwtext.truncate( text, length, ellipsis, adjustLength ) + local l = mw.ustring.len( text ) + if l <= math.abs( length ) then + return text + end + + ellipsis = ellipsis or options.ellipsis + local elen = 0 + if adjustLength then + elen = mw.ustring.len( ellipsis ) + end + + local ret + if math.abs( length ) <= elen then + ret = ellipsis + elseif length > 0 then + ret = mw.ustring.sub( text, 1, length - elen ) .. ellipsis + else + ret = ellipsis .. mw.ustring.sub( text, length + elen ) + end + + if mw.ustring.len( ret ) < l then + return ret + else + return text + end +end + +-- Check for stuff that can't even be passed to PHP properly and other stuff +-- that gives different error messages in different versions of PHP +local function checkForJsonEncode( t, seen, lvl ) + local tp = type( t ) + if tp == 'table' then + if seen[t] then + error( "mw.text.jsonEncode: Cannot use recursive tables", lvl ) + end + seen[t] = 1 + for k, v in pairs( t ) do + if type( k ) == 'number' then + if k >= math.huge or k <= -math.huge then + error( string.format( "mw.text.jsonEncode: Cannot use 'inf' as a table key", type( k ) ), lvl ) + end + elseif type( k ) ~= 'string' then + error( string.format( "mw.text.jsonEncode: Cannot use type '%s' as a table key", type( k ) ), lvl ) + end + checkForJsonEncode( v, seen, lvl + 1 ) + end + seen[t] = nil + elseif tp == 'number' then + if t ~= t or t >= math.huge or t <= -math.huge then + error( "mw.text.jsonEncode: Cannot encode non-finite numbers", lvl ) + end + elseif tp ~= 'boolean' and tp ~= 'string' and tp ~= 'nil' then + error( string.format( "mw.text.jsonEncode: Cannot encode type '%s'", tp ), lvl ) + end +end + +function mwtext.jsonEncode( value, flags ) + checkForJsonEncode( value, {}, 3 ) + return php.jsonEncode( value, flags ) +end + +function mwtext.jsonDecode( json, flags ) + return php.jsonDecode( json, flags ) +end + +-- Matches PHP Scribunto_LuaTextLibrary constants +mwtext.JSON_PRESERVE_KEYS = 1 +mwtext.JSON_TRY_FIXING = 2 +mwtext.JSON_PRETTY = 4 + +return mwtext diff --git a/lualib/mw.title.lua b/lualib/mw.title.lua new file mode 100644 index 0000000..5cd72ab --- /dev/null +++ b/lualib/mw.title.lua @@ -0,0 +1,337 @@ +local title = {} +local php +local NS_MEDIA = -2 + +local util = require 'libraryUtil' +local checkType = util.checkType +local checkTypeForIndex = util.checkTypeForIndex + +local function checkNamespace( name, argIdx, arg ) + if type( arg ) == 'string' and tostring( tonumber( arg ) ) == arg then + arg = tonumber( arg ) + end + if type( arg ) == 'number' then + arg = math.floor( arg + 0.5 ) + if not mw.site.namespaces[arg] then + local msg = string.format( "bad argument #%d to '%s' (unrecognized namespace number '%s')", + argIdx, name, arg + ) + error( msg, 3 ) + end + elseif type( arg ) == 'string' then + local ns = mw.site.namespaces[arg] + if not ns then + local msg = string.format( "bad argument #%d to '%s' (unrecognized namespace name '%s')", + argIdx, name, arg + ) + error( msg, 3 ) + end + arg = ns.id + else + local msg = string.format( "bad argument #%d to '%s' (string or number expected, got %s)", + argIdx, name, type( arg ) + ) + error( msg, 3 ) + end + return arg +end + + +local function lt( a, b ) + if a.interwiki ~= b.interwiki then + return a.interwiki < b.interwiki + end + if a.namespace ~= b.namespace then + return a.namespace < b.namespace + end + return a.text < b.text +end + +local function makeTitleObject( data ) + if not data then + return nil + end + + local obj = {} + local checkSelf = util.makeCheckSelfFunction( 'mw.title', 'title', obj, 'title object' ); + local ns = mw.site.namespaces[data.namespace] + + data.isContentPage = ns.isContent + data.isExternal = data.interwiki ~= '' + data.isSpecialPage = data.namespace == mw.site.namespaces.Special.id + data.isTalkPage = ns.isTalk + data.subjectNsText = ns.subject.name + data.canTalk = ns.talk ~= nil + + data.prefixedText = data.text + if data.nsText ~= '' then + data.prefixedText = string.gsub( data.nsText .. ':' .. data.prefixedText, '_', ' ' ) + end + if data.interwiki ~= '' then + data.prefixedText = data.interwiki .. ':' .. data.prefixedText + end + + local firstSlash, lastSlash + if ns.hasSubpages then + firstSlash, lastSlash = string.match( data.text, '^[^/]*().*()/[^/]*$' ) + end + if firstSlash then + data.isSubpage = true + data.rootText = string.sub( data.text, 1, firstSlash - 1 ) + data.baseText = string.sub( data.text, 1, lastSlash - 1 ) + data.subpageText = string.sub( data.text, lastSlash + 1 ) + else + data.isSubpage = false + data.rootText = data.text + data.baseText = data.text + data.subpageText = data.text + end + + function data:inNamespace( ns ) + checkSelf( self, 'inNamespace' ) + ns = checkNamespace( 'inNamespace', 1, ns ) + return ns == self.namespace + end + + function data:inNamespaces( ... ) + checkSelf( self, 'inNamespaces' ) + for i = 1, select( '#', ... ) do + local ns = checkNamespace( 'inNamespaces', i, select( i, ... ) ) + if ns == self.namespace then + return true + end + end + return false + end + + function data:hasSubjectNamespace( ns ) + checkSelf( self, 'hasSubjectNamespace' ) + ns = checkNamespace( 'hasSubjectNamespace', 1, ns ) + return ns == mw.site.namespaces[self.namespace].subject.id + end + + function data:isSubpageOf( title ) + checkSelf( self, 'isSubpageOf' ) + checkType( 'isSubpageOf', 1, title, 'table' ) + return self.interwiki == title.interwiki and + self.namespace == title.namespace and + title.text .. '/' == string.sub( self.text, 1, #title.text + 1 ) + end + + function data:subPageTitle( text ) + checkSelf( self, 'subpageTitle' ) + checkType( 'subpageTitle', 1, text, 'string' ) + return title.makeTitle( data.namespace, data.text .. '/' .. text ) + end + + function data:partialUrl() + checkSelf( self, 'partialUrl' ) + return data.thePartialUrl + end + + function data:fullUrl( query, proto ) + checkSelf( self, 'fullUrl' ) + return php.getUrl( self.fullText, 'fullUrl', query, proto ) + end + + function data:localUrl( query ) + checkSelf( self, 'localUrl' ) + return php.getUrl( self.fullText, 'localUrl', query ) + end + + function data:canonicalUrl( query ) + checkSelf( self, 'canonicalUrl' ) + return php.getUrl( self.fullText, 'canonicalUrl', query ) + end + + function data:getContent() + checkSelf( self, 'getContent' ) + local content = php.getContent( self.fullText ) + data.getContent = function ( self ) + checkSelf( self, 'getContent' ) + return content + end + return content + end + + -- Known fields, both those defined above and any dynamically handled in + -- __index. Truthy values represent read-only, and falsey values represent + -- read-write. If the value is the string 'e', expensive data will be loaded + -- if the field is read. + local readOnlyFields = { + fragment = false, + fullText = true, + rootPageTitle = true, + basePageTitle = true, + talkPageTitle = true, + subjectPageTitle = true, + fileExists = true, + file = true, + protectionLevels = true, + cascadingProtection = true, + exists = 'e', + isRedirect = 'e', + contentModel = 'e', + id = 'e', + redirectTarget = true, + } + for k in pairs( data ) do + readOnlyFields[k] = true + end + + local function pairsfunc( t, k ) + local v + repeat + k = next( readOnlyFields, k ) + if k == nil then + return nil + end + v = t[k] + until v ~= nil + return k, v + end + + return setmetatable( obj, { + __eq = title.equals, + __lt = lt, + __pairs = function ( t ) + return pairsfunc, t, nil + end, + __index = function ( t, k ) + if k == 'exists' and data.namespace == NS_MEDIA then + k = 'fileExists' + end + + if readOnlyFields[k] == 'e' and data[k] == nil then + for k,v in pairs( php.getExpensiveData( t.fullText ) ) do + data[k] = v + end + end + + if k == 'fullText' then + if data.fragment ~= '' then + return data.prefixedText .. '#' .. data.fragment + else + return data.prefixedText + end + end + + if k == 'rootPageTitle' then + return title.makeTitle( data.namespace, data.rootText ) + end + if k == 'basePageTitle' then + return title.makeTitle( data.namespace, data.baseText ) + end + if k == 'talkPageTitle' then + local ns = mw.site.namespaces[data.namespace].talk + if not ns then + return nil + end + if ns.id == data.namespace then + return obj + end + return title.makeTitle( ns.id, data.text ) + end + if k == 'subjectPageTitle' then + local ns = mw.site.namespaces[data.namespace].subject + if ns.id == data.namespace then + return obj + end + return title.makeTitle( ns.id, data.text ) + end + if k == 'file' then + if data.file == nil then + data.file = php.getFileInfo( data.prefixedText ) + end + return data.file or nil + end + if k == 'fileExists' then -- Kept for backward compatibility. Since 1.25, file.exists is preferred over this + return t.file and t.file.exists + end + if k == 'protectionLevels' then + if data.protectionLevels == nil then + data.protectionLevels = php.protectionLevels( data.prefixedText ) + end + return data.protectionLevels + end + if k == 'cascadingProtection' then + if data.cascadingProtection == nil then + data.cascadingProtection = php.cascadingProtection( data.prefixedText ) + end + return data.cascadingProtection + end + if k == 'redirectTarget' then + if data.redirectTarget == nil then + data.redirectTarget = makeTitleObject( php.redirectTarget( data.prefixedText ) ) or false + end + return data.redirectTarget + end + + return data[k] + end, + __newindex = function ( t, k, v ) + if k == 'fragment' then + checkTypeForIndex( k, v, 'string' ) + v = string.gsub( v, '[%s_]+', ' ' ) + v = string.gsub( v, '^(.-) ?$', '%1' ) + data[k] = v + elseif readOnlyFields[k] then + error( "index '" .. k .. "' is read only", 2 ) + else + readOnlyFields[k] = v and false -- assigns nil if v == nil, false otherwise + rawset( t, k, v ) + end + end, + __tostring = function ( t ) + return t.prefixedText + end + } ) +end + +function title.setupInterface( options ) + -- Boilerplate + title.setupInterface = nil + php = mw_interface + mw_interface = nil + NS_MEDIA = options.NS_MEDIA + + -- Set current title + title.getCurrentTitle = function () + return makeTitleObject( mw.clone( options.thisTitle ) ) + end + + -- Register this library in the "mw" global + mw = mw or {} + mw.title = title + + package.loaded['mw.title'] = title +end + +function title.new( text_or_id, defaultNamespace ) + return makeTitleObject( php.newTitle( text_or_id, defaultNamespace ) ) +end + +function title.makeTitle( ns, title, fragment, interwiki ) + return makeTitleObject( php.makeTitle( ns, title, fragment, interwiki ) ) +end + +function title.equals( a, b ) + return a.interwiki == b.interwiki and + a.namespace == b.namespace and + a.text == b.text +end + +function title.compare( a, b ) + if a.interwiki ~= b.interwiki then + return a.interwiki < b.interwiki and -1 or 1 + end + if a.namespace ~= b.namespace then + return a.namespace < b.namespace and -1 or 1 + end + if a.text ~= b.text then + return a.text < b.text and -1 or 1 + end + return 0 +end + +return title diff --git a/lualib/mw.uri.lua b/lualib/mw.uri.lua new file mode 100644 index 0000000..ff00eae --- /dev/null +++ b/lualib/mw.uri.lua @@ -0,0 +1,623 @@ +local uri = {} +local urifuncs = {} +local urimt = {} +local php + +local util = require 'libraryUtil' +local checkType = util.checkType +local checkTypeForIndex = util.checkTypeForIndex + +function uri.setupInterface( options ) + -- Boilerplate + uri.setupInterface = nil + php = mw_interface + mw_interface = nil + + -- Store options + php.options = options + + -- Register this library in the "mw" global + mw = mw or {} + mw.uri = uri + + package.loaded['mw.uri'] = uri +end + +local function rawencode( s, space ) + space = space or '%20' + local ret = string.gsub( s, '([^a-zA-Z0-9_.~-])', function ( c ) + if c == ' ' then + return space + else + return string.format( '%%%02X', string.byte( c, 1, 1 ) ) + end + end ); + return ret +end + +local function wikiencode( s ) + local ret = string.gsub( s, '([^a-zA-Z0-9!$()*,./:;@~_-])', function ( c ) + if c == ' ' then + return '_' + else + return string.format( '%%%02X', string.byte( c, 1, 1 ) ) + end + end ); + return ret +end + +local function rawdecode( s ) + local ret = string.gsub( s, '%%(%x%x)', function ( hex ) + return string.char( tonumber( hex, 16 ) ) + end ); + return ret +end + +function uri.encode( s, enctype ) + checkType( 'encode', 1, s, 'string' ) + + enctype = string.upper( enctype or 'QUERY' ) + if enctype == 'QUERY' then + return rawencode( s, '+' ) + elseif enctype == 'PATH' then + return rawencode( s, '%20' ) + elseif enctype == 'WIKI' then + return wikiencode( s ) + else + error( "bad argument #2 to 'encode' (expected QUERY, PATH, or WIKI)", 2 ) + end +end + +function uri.decode( s, enctype ) + checkType( 'decode', 1, s, 'string' ) + + enctype = string.upper( enctype or 'QUERY' ) + if enctype == 'QUERY' then + return rawdecode( string.gsub( s, '%+', ' ' ) ) + elseif enctype == 'PATH' then + return rawdecode( s ) + elseif enctype == 'WIKI' then + return rawdecode( string.gsub( s, '_', ' ' ) ) + else + error( "bad argument #2 to 'decode' (expected QUERY, PATH, or WIKI)", 2 ) + end +end + +function uri.anchorEncode( s ) + checkType( 'anchorEncode', 1, s, 'string' ) + return php.anchorEncode( s ) +end + +function uri.localUrl( page, query ) + checkType( 'localurl', 1, page, 'string' ) + if query ~= nil and type( query ) ~= 'string' and type( query ) ~= 'table' then + checkType( 'localurl', 2, query, 'string or table' ) + end + local url = php.localUrl( page, query ) + if not url then + return nil + end + return uri.new( url ) +end + +function uri.fullUrl( page, query ) + checkType( 'fullurl', 1, page, 'string' ) + if query ~= nil and type( query ) ~= 'string' and type( query ) ~= 'table' then + checkType( 'fullurl', 2, query, 'string or table' ) + end + local url = php.fullUrl( page, query ) + if not url then + return nil + end + return uri.new( url ) +end + +function uri.canonicalUrl( page, query ) + checkType( 'canonicalurl', 1, page, 'string' ) + if query ~= nil and type( query ) ~= 'string' and type( query ) ~= 'table' then + checkType( 'canonicalurl', 2, query, 'string or table' ) + end + local url = php.canonicalUrl( page, query ) + if not url then + return nil + end + return uri.new( url ) +end + + +function uri.new( s ) + if s == nil or type( s ) == 'string' then + local obj = { + -- Yes, technically all this does nothing. + protocol = nil, + user = nil, + password = nil, + host = nil, + port = nil, + path = nil, + query = nil, + fragment = nil, + } + setmetatable( obj, urimt ) + obj:parse( s or php.options.defaultUrl ) + return obj + elseif type( s ) == 'table' then + local obj = { + protocol = s.protocol, + user = s.user, + password = s.password, + host = s.host, + port = s.port, + path = s.path, + query = mw.clone( s.query ), + fragment = s.fragment, + } + setmetatable( obj, urimt ) + return obj + else + checkType( 'new', 1, s, 'string or table or nil' ) + end +end + +function uri.validate( obj ) + checkType( 'validate', 1, obj, 'table' ) + + local err = {} + + if obj.protocol then + if type( obj.protocol ) ~= 'string' then + err[#err+1] = '.protocol must be a string, not ' .. type( obj.protocol ) + elseif not string.match( obj.protocol, '^[^:/?#]+$' ) then + err[#err+1] = 'invalid .protocol' + end + end + + if obj.user then + if type( obj.user ) ~= 'string' then + err[#err+1] = '.user must be a string, not ' .. type( obj.user ) + elseif not string.match( obj.user, '^[^:@/?#]*$' ) then + err[#err+1] = 'invalid .user' + end + end + + if obj.password then + if type( obj.password ) ~= 'string' then + err[#err+1] = '.password must be a string, not ' .. type( obj.password ) + elseif not string.match( obj.password, '^[^:@/?#]*$' ) then + err[#err+1] = 'invalid .password' + end + end + + if obj.host then + if type( obj.host ) ~= 'string' then + err[#err+1] = '.host must be a string, not ' .. type( obj.host ) + elseif not string.match( obj.host, '^[^:/?#]*$' ) then + err[#err+1] = 'invalid .host' + end + end + + if obj.port then + if type( obj.port ) ~= 'number' or math.floor( obj.port ) ~= obj.port then + err[#err+1] = '.port must be an integer, not ' .. type( obj.port ) + elseif obj.port < 1 or obj.port > 65535 then + err[#err+1] = 'invalid .port' + end + end + + local authority = obj.user or obj.password or obj.host or obj.port + if not obj.path then + err[#err+1] = 'missing .path' + elseif type( obj.path ) ~= 'string' then + err[#err+1] = '.path must be a string, not ' .. type( obj.path ) + elseif authority and not ( obj.path == '' or string.match( obj.path, '^/[^?#]*$' ) ) then + err[#err+1] = 'invalid .path' + elseif not authority and not ( + obj.path == '' or + obj.path == '/' or + string.match( obj.path, '^/[^?#/][^?#]*$' ) or + obj.protocol and string.match( obj.path, '^[^?#/][^?#]*$' ) or + not obj.protocol and string.match( obj.path, '^[^?#/:]+$' ) or + not obj.protocol and string.match( obj.path, '^[^?#/:]+/[^?#]*$' ) + ) then + err[#err+1] = 'invalid .path' + end + + if obj.query and type( obj.query ) ~= 'table' then + err[#err+1] = '.query must be a table, not ' .. type( obj.query ) + end + + if obj.fragment and type( obj.fragment ) ~= 'string' then + err[#err+1] = '.fragment must be a string, not ' .. type( obj.fragment ) + end + + return #err == 0, table.concat( err, '; ' ) +end + +-- Lua tables are unsorted, but we want to preserve the insertion order. +-- So, track the insertion order explicitly. +local function makeQueryTable() + local ret = {} + local keys = {} + local seenkeys = {} + + setmetatable( ret, { + __newindex = function ( t, k, v ) + if seenkeys[k] and not t[k] then + for i = 1, #keys do + if keys[i] == k then + table.remove( keys, i ) + break + end + end + end + seenkeys[k] = 1 + keys[#keys+1] = k + rawset( t, k, v ) + end, + __pairs = function ( t ) + local i, l = 0, #keys + return function () + while i < l do + i = i + 1 + local k = keys[i] + if t[k] ~= nil then + return k, t[k] + end + end + return nil + end + end + } ) + + return ret +end + +function uri.parseQueryString( s, i, j ) + checkType( 'parseQueryString', 1, s, 'string' ) + checkType( 'parseQueryString', 2, i, 'number', true ) + checkType( 'parseQueryString', 3, j, 'number', true ) + + s = string.gsub( string.sub( s, i or 1, j or -1 ), '%+', ' ' ) + i = 1 + j = string.len( s ) + + local qs = makeQueryTable() + if string.sub( s, i, 1 ) == '?' then + i = i + 1 + end + while i <= j do + local amp = string.find( s, '&', i, true ) + if not amp or amp > j then + amp = j + 1 + end + local eq = string.find( s, '=', i, true ) + local k, v + if not eq or eq > amp then + k = rawdecode( string.sub( s, i, amp - 1 ) ) + v = false + else + k = rawdecode( string.sub( s, i, eq - 1 ) ) + v = rawdecode( string.sub( s, eq + 1, amp - 1 ) ) + end + if qs[k] then + if type( qs[k] ) ~= 'table' then + qs[k] = { qs[k], v } + else + table.insert( qs[k], v ) + end + else + qs[k] = v + end + i = amp + 1 + end + return qs +end + +function uri.buildQueryString( qs ) + checkType( 'buildQueryString', 1, qs, 'table' ) + + local t = {} + for k, v in pairs( qs ) do + if type( v ) ~= 'table' then + v = { v } + end + for i = 1, #v do + t[#t+1] = '&' + t[#t+1] = rawencode( k, '+' ) + if v[i] then + t[#t+1] = '=' + t[#t+1] = rawencode( v[i], '+' ) + end + end + end + return table.concat( t, '', 2 ) +end + +-- Fields mapped to whether they're handled by __index +local knownFields = { + protocol = false, + user = false, + password = false, + host = false, + port = false, + path = false, + query = false, + fragment = false, + userInfo = true, + hostPort = true, + authority = true, + queryString = true, + relativePath = true, +} + +local function pairsfunc( t, k ) + local v, f + repeat + k, f = next( knownFields, k ) + if k == nil then + return nil + end + if f then + v = t[k] + else + v = rawget( t, k ) + end + until v ~= nil + return k, v +end +function urimt:__pairs() + return pairsfunc, self, nil +end + +function urimt:__index( key ) + if urifuncs[key] then + return urifuncs[key] + end + + if key == 'userInfo' then + local user = rawget( self, 'user' ) + local password = rawget( self, 'password' ) + if user and password then + return user .. ':' .. password + else + return user + end + end + + if key == 'hostPort' then + local host = rawget( self, 'host' ) + local port = rawget( self, 'port' ) + if port then + return ( host or '' ) .. ':' .. port + else + return host + end + end + + if key == 'authority' then + local info = self.userInfo + local hostPort = self.hostPort + if info then + return info .. '@' .. ( hostPort or '' ) + else + return hostPort + end + end + + if key == 'queryString' then + local query = rawget( self, 'query' ) + if not query then + return nil + end + return uri.buildQueryString( query ) + end + + if key == 'relativePath' then + local ret = rawget( self, 'path' ) or '' + local qs = self.queryString + if qs then + ret = ret .. '?' .. qs + end + local fragment = rawget( self, 'fragment' ) + if fragment then + ret = ret .. '#' .. fragment + end + return ret + end + + return nil +end + +function urimt:__newindex( key, value ) + if key == 'userInfo' then + local user, password = nil, nil + if value then + checkTypeForIndex( key, value, 'string' ) + local i = string.find( value, ':', 1, true ) + if i then + user = string.sub( value, 1, i - 1 ) + password = string.sub( value, i + 1 ) + else + user = value + end + end + rawset( self, 'user', user ) + rawset( self, 'password', password ) + return + end + + if key == 'hostPort' then + local host, port = nil, nil + if value then + checkTypeForIndex( key, value, 'string' ) + local i = string.find( value, ':', 1, true ) + if i then + host = string.sub( value, 1, i - 1 ) + port = tonumber( string.sub( value, i + 1 ) ) + if not port then + error( string.format( "Invalid port in '%s'", value ), 2 ) + end + else + host = value + end + end + rawset( self, 'host', host ) + rawset( self, 'port', port ) + return + end + + if key == 'authority' then + if value then + checkTypeForIndex( key, value, 'string' ) + local i = string.find( value, '@', 1, true ) + if i then + self.userInfo = string.sub( value, 1, i - 1 ) + self.hostPort = string.sub( value, i + 1 ) + else + self.userInfo = nil + self.hostPort = value + end + else + self.userInfo = nil + self.hostPort = nil + end + return + end + + if key == 'queryString' then + if value then + checkTypeForIndex( key, value, 'string' ) + rawset( self, 'query', uri.parseQueryString( value ) ) + else + rawset( self, 'query', nil ) + end + return + end + + if key == 'relativePath' then + local path, query, fragment = nil, nil, nil + if value then + checkTypeForIndex( key, value, 'string' ) + local i, j = nil, string.len( value ) + i = string.find( value, '#', 1, true ) + if i and i <= j then + fragment = string.sub( value, i + 1, j ) + j = i - 1 + end + i = string.find( value, '?', 1, true ) + if i and i <= j then + query = uri.parseQueryString( string.sub( value, i + 1, j ) ) + j = i - 1 + end + path = string.sub( value, 1, j ) + end + rawset( self, 'path', path ) + rawset( self, 'query', query ) + rawset( self, 'fragment', fragment ) + return + end + + if knownFields[key] then + error( "index '" .. key .. "' is read only", 2 ) + end + + -- Default behavior + knownFields[key] = false + rawset( self, key, value ) +end + +function urimt:__tostring() + local ret = '' + local protocol = self.protocol + local authority = self.authority + if protocol then + ret = protocol .. ':' + end + if authority then + ret = ret .. '//' .. authority + end + return ret .. self.relativePath +end + +urifuncs.validate = uri.validate + +function urifuncs:parse( s ) + checkType( 'uri:parse', 1, s, 'string' ) + + -- Since Lua's patterns can't do (...)?, we have to try with and without each part. + local protocol, authority, relativePath = string.match( s, '^([^:/?#]+)://([^/?#]*)(.*)$' ) + if not ( protocol or authority or relativePath ) then + authority, relativePath = string.match( s, '^//([^/?#]*)(.*)$' ) + end + if not ( protocol or authority or relativePath ) then + protocol, relativePath = string.match( s, '^([^:/?#]+):(.*)$' ) + end + if not ( protocol or authority or relativePath ) then + relativePath = s + end + + -- Parse it into a temporary object, so if there's an error we didn't break the real one + local tmp = { protocol = protocol } + setmetatable( tmp, urimt ) + if not pcall( urimt.__newindex, tmp, 'authority', authority ) then + error( 'Invalid port number in string', 2 ) + end + tmp.relativePath = relativePath + + -- Check for validity + local ok, err = uri.validate( tmp ) + if not ok then + error( err, 2 ) + end + + -- Merge in fields + if tmp.protocol then + self.protocol = tmp.protocol + end + if tmp.user or tmp.password then + self.user, self.password = tmp.user, tmp.password + end + if tmp.host then + self.host = tmp.host + end + if tmp.port then + self.port = tmp.port + end + if tmp.path then + self.path = tmp.path + end + if tmp.query then + self.query = tmp.query + end + if tmp.fragment then + self.fragment = tmp.fragment + end + + return self +end + +function urifuncs:clone() + return uri.new( self ) +end + +function urifuncs:extend( parameters ) + checkType( 'uri:extend', 1, parameters, 'table' ) + + local query = self.query + if not query then + query = makeQueryTable() + self.query = query + end + for k, v in pairs( parameters ) do + query[k] = v + end + + return self +end + +-- Add all urifuncs as known fields +for k in pairs( urifuncs ) do + knownFields[k] = true +end + +return uri diff --git a/lualib/mw.ustring.lua b/lualib/mw.ustring.lua new file mode 100644 index 0000000..0825a73 --- /dev/null +++ b/lualib/mw.ustring.lua @@ -0,0 +1,108 @@ +-- Get a fresh copy of the basic ustring +local old_ustring = package.loaded.ustring +package.loaded.ustring = nil +local ustring = require( 'ustring' ) +package.loaded.ustring = old_ustring +old_ustring = nil + +local util = require 'libraryUtil' +local checkType = util.checkType + +local gmatch_init = nil +local gmatch_callback = nil +local function php_gmatch( s, pattern ) + checkType( 'gmatch', 1, s, 'string' ) + checkType( 'gmatch', 2, pattern, 'string' ) + + local re, capt = gmatch_init( s, pattern ) + local pos = 0 + return function() + local ret + pos, ret = gmatch_callback( s, re, capt, pos ) + return unpack( ret ) + end, nil, nil +end + +local gcodepoint_init = nil +local function php_gcodepoint( s, i, j ) + checkType( 'gcodepoint', 1, s, 'string' ) + checkType( 'gcodepoint', 2, i, 'number', true ) + checkType( 'gcodepoint', 3, j, 'number', true ) + local cp = gcodepoint_init( s, i, j or -1 ) + local pos, len = 1, #cp + return function () + if pos <= len then + local tmp = cp[pos] + pos = pos + 1 + return tmp + end + end +end + +function ustring.setupInterface( opt ) + -- Boilerplate + ustring.setupInterface = nil + + -- Set string limits + ustring.maxStringLength = opt.stringLengthLimit + ustring.maxPatternLength = opt.patternLengthLimit + + -- Gmatch + if mw_interface.gmatch_callback and mw_interface.gmatch_init then + gmatch_init = mw_interface.gmatch_init + gmatch_callback = mw_interface.gmatch_callback + ustring.gmatch = php_gmatch + end + mw_interface.gmatch_init = nil + mw_interface.gmatch_callback = nil + + -- codepoint and gcodepoint + if mw_interface.gcodepoint_init then + gcodepoint_init = mw_interface.gcodepoint_init + ustring.gcodepoint = php_gcodepoint + end + mw_interface.gcodepoint_init = nil + + -- Replace pure-lua implementation with php callbacks + local nargs = { + char = 0, + find = 2, + match = 2, + gsub = 3, + } + for k, v in pairs( mw_interface ) do + local n = nargs[k] or 1 + if n == 0 then + ustring[k] = v + else + -- Avoid PHP warnings for missing arguments by checking before + -- calling PHP. + ustring[k] = function ( ... ) + if select( '#', ... ) < n then + error( "too few arguments to mw.ustring." .. k, 2 ) + end + return v( ... ) + end + end + end + mw_interface = nil + + -- Replace upper/lower with mw.language versions if available + if mw and mw.language then + local lang = mw.language.getContentLanguage() + ustring.upper = function ( s ) + return lang:uc( s ) + end + ustring.lower = function ( s ) + return lang:lc( s ) + end + end + + -- Register this library in the "mw" global + mw = mw or {} + mw.ustring = ustring + + package.loaded['mw.ustring'] = ustring +end + +return ustring diff --git a/lualib/mwInit.lua b/lualib/mwInit.lua new file mode 100644 index 0000000..c1667ef --- /dev/null +++ b/lualib/mwInit.lua @@ -0,0 +1,143 @@ +-- This file is for anything that needs to be set up before a Lua engine can +-- start. Things in this file may run more than once, so avoid putting anything +-- other than function definitions in it. Also, because this can run before +-- PHP can do anything, mw_interface is unavailable here. + +mw = mw or {} + +-- Extend pairs and ipairs to recognize __pairs and __ipairs, if they don't already +do + local t = {} + setmetatable( t, { __pairs = function() return 1, 2, 3 end } ) + local f = pairs( t ) + if f ~= 1 then + local old_pairs = pairs + pairs = function ( t ) + local mt = getmetatable( t ) + local f, s, var = ( mt and mt.__pairs or old_pairs )( t ) + return f, s, var + end + local old_ipairs = ipairs + ipairs = function ( t ) + local mt = getmetatable( t ) + local f, s, var = ( mt and mt.__ipairs or old_ipairs )( t ) + return f, s, var + end + end +end + +-- Reduce precision on os.clock to mitigate timing attacks +do + local old_clock = os.clock + os.clock = function () + local v = old_clock() + return math.floor( v * 50000 + 0.5 ) / 50000 + end +end + +--- Do a "deep copy" of a table or other value. +function mw.clone( val ) + local tableRefs = {} + local function recursiveClone( val ) + if type( val ) == 'table' then + -- Encode circular references correctly + if tableRefs[val] ~= nil then + return tableRefs[val] + end + + local retVal + retVal = {} + tableRefs[val] = retVal + + -- Copy metatable + if getmetatable( val ) then + setmetatable( retVal, recursiveClone( getmetatable( val ) ) ) + end + + for key, elt in pairs( val ) do + retVal[key] = recursiveClone( elt ) + end + return retVal + else + return val + end + end + return recursiveClone( val ) +end + +--- Make isolation-safe setfenv and getfenv functions +-- +-- @param protectedEnvironments A table where the keys are protected environment +-- tables. These environments cannot be accessed with getfenv(), and +-- functions with these environments cannot be modified or accessed using +-- integer indexes to setfenv(). However, functions with these environments +-- can have their environment set with setfenv() with a function value +-- argument. +-- +-- @param protectedFunctions A table where the keys are protected functions, +-- which cannot have their environments set by setfenv() with a function +-- value argument. +-- +-- @return setfenv +-- @return getfenv +function mw.makeProtectedEnvFuncs( protectedEnvironments, protectedFunctions ) + local old_setfenv = setfenv + local old_getfenv = getfenv + + local function my_setfenv( func, newEnv ) + if type( func ) == 'number' then + local stackIndex = math.floor( func ) + if stackIndex <= 0 then + error( "'setfenv' cannot set the global environment, it is protected", 2 ) + end + if stackIndex > 10 then + error( "'setfenv' cannot set an environment at a level greater than 10", 2 ) + end + + -- Add one because we are still in Lua and 1 is right here + stackIndex = stackIndex + 1 + + local env = old_getfenv( stackIndex ) + if env == nil or protectedEnvironments[ env ] then + error( "'setfenv' cannot set the requested environment, it is protected", 2 ) + end + func = old_setfenv( stackIndex, newEnv ) + elseif type( func ) == 'function' then + if protectedFunctions[func] then + error( "'setfenv' cannot be called on a protected function", 2 ) + end + local env = old_getfenv( func ) + if env == nil or protectedEnvironments[ env ] then + error( "'setfenv' cannot set the requested environment, it is protected", 2 ) + end + old_setfenv( func, newEnv ) + else + error( "'setfenv' can only be called with a function or integer as the first argument", 2 ) + end + return func + end + + local function my_getfenv( func ) + local env + if type( func ) == 'number' then + if func <= 0 then + error( "'getfenv' cannot get the global environment" ) + end + env = old_getfenv( func + 1 ) + elseif type( func ) == 'function' then + env = old_getfenv( func ) + else + error( "'getfenv' cannot get the global environment" ) + end + + if protectedEnvironments[env] then + return nil + else + return env + end + end + + return my_setfenv, my_getfenv +end + +return mw diff --git a/lualib/package.lua b/lualib/package.lua new file mode 100644 index 0000000..572e593 --- /dev/null +++ b/lualib/package.lua @@ -0,0 +1,127 @@ +--[[ +-- A package library similar to the one that comes with Lua 5.1, but without +-- the local filesystem access. Based on Compat-5.1 which comes with the +-- following license notice: +-- +-- Copyright © 2004-2006 The Kepler Project. +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of +-- this software and associated documentation files (the "Software"), to deal in +-- the Software without restriction, including without limitation the rights to +-- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +-- the Software, and to permit persons to whom the Software is furnished to do so, +-- subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all +-- copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +-- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +-- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +-- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +-- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--]] + + +local assert, error, ipairs, setmetatable, type = assert, error, ipairs, setmetatable, type +local format = string.format + +-- +-- avoid overwriting the package table if it's already there +-- +package = package or {} +local _PACKAGE = package + +package.loaded = package.loaded or {} +package.loaded.debug = debug +package.loaded.string = string +package.loaded.math = math +package.loaded.io = io +package.loaded.os = os +package.loaded.table = table +package.loaded._G = _G +package.loaded.coroutine = coroutine +package.loaded.package = package +local _LOADED = package.loaded + +-- +-- avoid overwriting the package.preload table if it's already there +-- +package.preload = package.preload or {} +local _PRELOAD = package.preload + +-- +-- check whether library is already loaded +-- +local function loader_preload (name) + assert (type(name) == "string", format ( + "bad argument #1 to 'require' (string expected, got %s)", type(name))) + assert (type(_PRELOAD) == "table", "'package.preload' must be a table") + return _PRELOAD[name] +end + +-- create 'loaders' table +package.loaders = package.loaders or { loader_preload } +local _LOADERS = package.loaders + +-- +-- iterate over available loaders +-- +local function load (name, loaders) + -- iterate over available loaders + assert (type (loaders) == "table", "'package.loaders' must be a table") + for i, loader in ipairs (loaders) do + local f = loader (name) + if f then + return f + end + end + error (format ("module '%s' not found", name)) +end + +-- sentinel +local sentinel = function () end + +-- +-- require +-- +function _G.require (modname) + assert (type(modname) == "string", format ( + "bad argument #1 to 'require' (string expected, got %s)", type(modname))) + local p = _LOADED[modname] + if p then -- is it there? + if p == sentinel then + error (format ("loop or previous error loading module '%s'", modname)) + end + return p -- package is already loaded + end + local init = load (modname, _LOADERS) + _LOADED[modname] = sentinel + local actual_arg = _G.arg + _G.arg = { modname } + local res = init (modname) + if res then + _LOADED[modname] = res + end + _G.arg = actual_arg + if _LOADED[modname] == sentinel then + _LOADED[modname] = true + end + return _LOADED[modname] +end + + +-- +-- package.seeall function +-- +function _PACKAGE.seeall (module) + local t = type(module) + assert (t == "table", "bad argument #1 to package.seeall (table expected, got "..t..")") + local meta = getmetatable (module) + if not meta then + meta = {} + setmetatable (module, meta) + end + meta.__index = _G +end diff --git a/ustring/README b/ustring/README new file mode 100644 index 0000000..d211589 --- /dev/null +++ b/ustring/README @@ -0,0 +1,51 @@ +This is ustring, a pure-Lua library to handle UTF-8 strings. + +It implements generally the same interface as the standard string library, with +the following differences: +* Most functions work on codepoints rather than bytes or characters. Yes, this + means that even though "á" and "á" should appear identical and represent the + same character, the former is one codepoint (U+00E1) while the latter is two + (U+0061 U+0301). +* Added functions isutf8, byteoffset, codepoint, gcodepoint, toNFC, toNFD. +* No workalike for string.reverse is provided. + +Contents: +* README - This file. +* ustring.lua - The main file for the library. +* string.lua - Extend the string metatable with methods from this library. +* upper.lua - Data table for ustring.upper. +* lower.lua - Data table for ustring.lower. +* charsets.lua - Data tables for pattern matching functions. +* make-tables.php - Regenerate upper.lua and lower.lua using PHP's multibyte + string library, and charsets.lua using PCRE. +* normalization-data.lua - Data tables for toNFC and toNFD. +* make-normalization-table.php - Regenerate normalization-data.lua based on the + file includes/libs/normal/UtfNormalData.inc from MediaWiki core. + + +This library (consisting of the files described above) is released under the MIT +License: + +Copyright (C) 2012 Brad Jorsch + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + diff --git a/ustring/charsets.lua b/ustring/charsets.lua new file mode 100644 index 0000000..7c0d98d --- /dev/null +++ b/ustring/charsets.lua @@ -0,0 +1,3117 @@ +-- This file is automatically generated by make-tables.php +local pats = { + [0x61] = { + [0x0000aa] = 1, + [0x0000ba] = 1, + [0x0001bb] = 1, + [0x0001c0] = 1, + [0x0001c1] = 1, + [0x0001c2] = 1, + [0x0001c3] = 1, + [0x0001c5] = 1, + [0x0001c8] = 1, + [0x0001cb] = 1, + [0x0001f2] = 1, + [0x000294] = 1, + [0x0002e0] = 1, + [0x0002e1] = 1, + [0x0002e2] = 1, + [0x0002e3] = 1, + [0x0002e4] = 1, + [0x0002ec] = 1, + [0x0002ee] = 1, + [0x000374] = 1, + [0x00037a] = 1, + [0x000559] = 1, + [0x0005f0] = 1, + [0x0005f1] = 1, + [0x0005f2] = 1, + [0x00066e] = 1, + [0x00066f] = 1, + [0x0006d5] = 1, + [0x0006e5] = 1, + [0x0006e6] = 1, + [0x0006ee] = 1, + [0x0006ef] = 1, + [0x0006fa] = 1, + [0x0006fb] = 1, + [0x0006fc] = 1, + [0x0006ff] = 1, + [0x000710] = 1, + [0x0007b1] = 1, + [0x0007f4] = 1, + [0x0007f5] = 1, + [0x0007fa] = 1, + [0x00081a] = 1, + [0x000824] = 1, + [0x000828] = 1, + [0x0008a0] = 1, + [0x00093d] = 1, + [0x000950] = 1, + [0x000971] = 1, + [0x000972] = 1, + [0x000973] = 1, + [0x000974] = 1, + [0x000975] = 1, + [0x000976] = 1, + [0x000977] = 1, + [0x000979] = 1, + [0x00097a] = 1, + [0x00097b] = 1, + [0x00097c] = 1, + [0x00097d] = 1, + [0x00097e] = 1, + [0x00097f] = 1, + [0x000985] = 1, + [0x000986] = 1, + [0x000987] = 1, + [0x000988] = 1, + [0x000989] = 1, + [0x00098a] = 1, + [0x00098b] = 1, + [0x00098c] = 1, + [0x00098f] = 1, + [0x000990] = 1, + [0x0009aa] = 1, + [0x0009ab] = 1, + [0x0009ac] = 1, + [0x0009ad] = 1, + [0x0009ae] = 1, + [0x0009af] = 1, + [0x0009b0] = 1, + [0x0009b2] = 1, + [0x0009b6] = 1, + [0x0009b7] = 1, + [0x0009b8] = 1, + [0x0009b9] = 1, + [0x0009bd] = 1, + [0x0009ce] = 1, + [0x0009dc] = 1, + [0x0009dd] = 1, + [0x0009df] = 1, + [0x0009e0] = 1, + [0x0009e1] = 1, + [0x0009f0] = 1, + [0x0009f1] = 1, + [0x000a05] = 1, + [0x000a06] = 1, + [0x000a07] = 1, + [0x000a08] = 1, + [0x000a09] = 1, + [0x000a0a] = 1, + [0x000a0f] = 1, + [0x000a10] = 1, + [0x000a2a] = 1, + [0x000a2b] = 1, + [0x000a2c] = 1, + [0x000a2d] = 1, + [0x000a2e] = 1, + [0x000a2f] = 1, + [0x000a30] = 1, + [0x000a32] = 1, + [0x000a33] = 1, + [0x000a35] = 1, + [0x000a36] = 1, + [0x000a38] = 1, + [0x000a39] = 1, + [0x000a59] = 1, + [0x000a5a] = 1, + [0x000a5b] = 1, + [0x000a5c] = 1, + [0x000a5e] = 1, + [0x000a72] = 1, + [0x000a73] = 1, + [0x000a74] = 1, + [0x000a85] = 1, + [0x000a86] = 1, + [0x000a87] = 1, + [0x000a88] = 1, + [0x000a89] = 1, + [0x000a8a] = 1, + [0x000a8b] = 1, + [0x000a8c] = 1, + [0x000a8d] = 1, + [0x000a8f] = 1, + [0x000a90] = 1, + [0x000a91] = 1, + [0x000aaa] = 1, + [0x000aab] = 1, + [0x000aac] = 1, + [0x000aad] = 1, + [0x000aae] = 1, + [0x000aaf] = 1, + [0x000ab0] = 1, + [0x000ab2] = 1, + [0x000ab3] = 1, + [0x000ab5] = 1, + [0x000ab6] = 1, + [0x000ab7] = 1, + [0x000ab8] = 1, + [0x000ab9] = 1, + [0x000abd] = 1, + [0x000ad0] = 1, + [0x000ae0] = 1, + [0x000ae1] = 1, + [0x000b05] = 1, + [0x000b06] = 1, + [0x000b07] = 1, + [0x000b08] = 1, + [0x000b09] = 1, + [0x000b0a] = 1, + [0x000b0b] = 1, + [0x000b0c] = 1, + [0x000b0f] = 1, + [0x000b10] = 1, + [0x000b2a] = 1, + [0x000b2b] = 1, + [0x000b2c] = 1, + [0x000b2d] = 1, + [0x000b2e] = 1, + [0x000b2f] = 1, + [0x000b30] = 1, + [0x000b32] = 1, + [0x000b33] = 1, + [0x000b35] = 1, + [0x000b36] = 1, + [0x000b37] = 1, + [0x000b38] = 1, + [0x000b39] = 1, + [0x000b3d] = 1, + [0x000b5c] = 1, + [0x000b5d] = 1, + [0x000b5f] = 1, + [0x000b60] = 1, + [0x000b61] = 1, + [0x000b71] = 1, + [0x000b83] = 1, + [0x000b85] = 1, + [0x000b86] = 1, + [0x000b87] = 1, + [0x000b88] = 1, + [0x000b89] = 1, + [0x000b8a] = 1, + [0x000b8e] = 1, + [0x000b8f] = 1, + [0x000b90] = 1, + [0x000b92] = 1, + [0x000b93] = 1, + [0x000b94] = 1, + [0x000b95] = 1, + [0x000b99] = 1, + [0x000b9a] = 1, + [0x000b9c] = 1, + [0x000b9e] = 1, + [0x000b9f] = 1, + [0x000ba3] = 1, + [0x000ba4] = 1, + [0x000ba8] = 1, + [0x000ba9] = 1, + [0x000baa] = 1, + [0x000bd0] = 1, + [0x000c05] = 1, + [0x000c06] = 1, + [0x000c07] = 1, + [0x000c08] = 1, + [0x000c09] = 1, + [0x000c0a] = 1, + [0x000c0b] = 1, + [0x000c0c] = 1, + [0x000c0e] = 1, + [0x000c0f] = 1, + [0x000c10] = 1, + [0x000c35] = 1, + [0x000c36] = 1, + [0x000c37] = 1, + [0x000c38] = 1, + [0x000c39] = 1, + [0x000c3d] = 1, + [0x000c58] = 1, + [0x000c59] = 1, + [0x000c60] = 1, + [0x000c61] = 1, + [0x000c85] = 1, + [0x000c86] = 1, + [0x000c87] = 1, + [0x000c88] = 1, + [0x000c89] = 1, + [0x000c8a] = 1, + [0x000c8b] = 1, + [0x000c8c] = 1, + [0x000c8e] = 1, + [0x000c8f] = 1, + [0x000c90] = 1, + [0x000cb5] = 1, + [0x000cb6] = 1, + [0x000cb7] = 1, + [0x000cb8] = 1, + [0x000cb9] = 1, + [0x000cbd] = 1, + [0x000cde] = 1, + [0x000ce0] = 1, + [0x000ce1] = 1, + [0x000cf1] = 1, + [0x000cf2] = 1, + [0x000d05] = 1, + [0x000d06] = 1, + [0x000d07] = 1, + [0x000d08] = 1, + [0x000d09] = 1, + [0x000d0a] = 1, + [0x000d0b] = 1, + [0x000d0c] = 1, + [0x000d0e] = 1, + [0x000d0f] = 1, + [0x000d10] = 1, + [0x000d3d] = 1, + [0x000d4e] = 1, + [0x000d60] = 1, + [0x000d61] = 1, + [0x000d7a] = 1, + [0x000d7b] = 1, + [0x000d7c] = 1, + [0x000d7d] = 1, + [0x000d7e] = 1, + [0x000d7f] = 1, + [0x000db3] = 1, + [0x000db4] = 1, + [0x000db5] = 1, + [0x000db6] = 1, + [0x000db7] = 1, + [0x000db8] = 1, + [0x000db9] = 1, + [0x000dba] = 1, + [0x000dbb] = 1, + [0x000dbd] = 1, + [0x000dc0] = 1, + [0x000dc1] = 1, + [0x000dc2] = 1, + [0x000dc3] = 1, + [0x000dc4] = 1, + [0x000dc5] = 1, + [0x000dc6] = 1, + [0x000e32] = 1, + [0x000e33] = 1, + [0x000e40] = 1, + [0x000e41] = 1, + [0x000e42] = 1, + [0x000e43] = 1, + [0x000e44] = 1, + [0x000e45] = 1, + [0x000e46] = 1, + [0x000e81] = 1, + [0x000e82] = 1, + [0x000e84] = 1, + [0x000e87] = 1, + [0x000e88] = 1, + [0x000e8a] = 1, + [0x000e8d] = 1, + [0x000e94] = 1, + [0x000e95] = 1, + [0x000e96] = 1, + [0x000e97] = 1, + [0x000e99] = 1, + [0x000e9a] = 1, + [0x000e9b] = 1, + [0x000e9c] = 1, + [0x000e9d] = 1, + [0x000e9e] = 1, + [0x000e9f] = 1, + [0x000ea1] = 1, + [0x000ea2] = 1, + [0x000ea3] = 1, + [0x000ea5] = 1, + [0x000ea7] = 1, + [0x000eaa] = 1, + [0x000eab] = 1, + [0x000ead] = 1, + [0x000eae] = 1, + [0x000eaf] = 1, + [0x000eb0] = 1, + [0x000eb2] = 1, + [0x000eb3] = 1, + [0x000ebd] = 1, + [0x000ec0] = 1, + [0x000ec1] = 1, + [0x000ec2] = 1, + [0x000ec3] = 1, + [0x000ec4] = 1, + [0x000ec6] = 1, + [0x000edc] = 1, + [0x000edd] = 1, + [0x000ede] = 1, + [0x000edf] = 1, + [0x000f00] = 1, + [0x000f40] = 1, + [0x000f41] = 1, + [0x000f42] = 1, + [0x000f43] = 1, + [0x000f44] = 1, + [0x000f45] = 1, + [0x000f46] = 1, + [0x000f47] = 1, + [0x000f88] = 1, + [0x000f89] = 1, + [0x000f8a] = 1, + [0x000f8b] = 1, + [0x000f8c] = 1, + [0x00103f] = 1, + [0x001050] = 1, + [0x001051] = 1, + [0x001052] = 1, + [0x001053] = 1, + [0x001054] = 1, + [0x001055] = 1, + [0x00105a] = 1, + [0x00105b] = 1, + [0x00105c] = 1, + [0x00105d] = 1, + [0x001061] = 1, + [0x001065] = 1, + [0x001066] = 1, + [0x00106e] = 1, + [0x00106f] = 1, + [0x001070] = 1, + [0x00108e] = 1, + [0x00124a] = 1, + [0x00124b] = 1, + [0x00124c] = 1, + [0x00124d] = 1, + [0x001250] = 1, + [0x001251] = 1, + [0x001252] = 1, + [0x001253] = 1, + [0x001254] = 1, + [0x001255] = 1, + [0x001256] = 1, + [0x001258] = 1, + [0x00125a] = 1, + [0x00125b] = 1, + [0x00125c] = 1, + [0x00125d] = 1, + [0x00128a] = 1, + [0x00128b] = 1, + [0x00128c] = 1, + [0x00128d] = 1, + [0x0012b2] = 1, + [0x0012b3] = 1, + [0x0012b4] = 1, + [0x0012b5] = 1, + [0x0012b8] = 1, + [0x0012b9] = 1, + [0x0012ba] = 1, + [0x0012bb] = 1, + [0x0012bc] = 1, + [0x0012bd] = 1, + [0x0012be] = 1, + [0x0012c0] = 1, + [0x0012c2] = 1, + [0x0012c3] = 1, + [0x0012c4] = 1, + [0x0012c5] = 1, + [0x001312] = 1, + [0x001313] = 1, + [0x001314] = 1, + [0x001315] = 1, + [0x00170e] = 1, + [0x00170f] = 1, + [0x001710] = 1, + [0x001711] = 1, + [0x00176e] = 1, + [0x00176f] = 1, + [0x001770] = 1, + [0x0017d7] = 1, + [0x0017dc] = 1, + [0x0018aa] = 1, + [0x001970] = 1, + [0x001971] = 1, + [0x001972] = 1, + [0x001973] = 1, + [0x001974] = 1, + [0x0019c1] = 1, + [0x0019c2] = 1, + [0x0019c3] = 1, + [0x0019c4] = 1, + [0x0019c5] = 1, + [0x0019c6] = 1, + [0x0019c7] = 1, + [0x001aa7] = 1, + [0x001b45] = 1, + [0x001b46] = 1, + [0x001b47] = 1, + [0x001b48] = 1, + [0x001b49] = 1, + [0x001b4a] = 1, + [0x001b4b] = 1, + [0x001bae] = 1, + [0x001baf] = 1, + [0x001c4d] = 1, + [0x001c4e] = 1, + [0x001c4f] = 1, + [0x001ce9] = 1, + [0x001cea] = 1, + [0x001ceb] = 1, + [0x001cec] = 1, + [0x001cee] = 1, + [0x001cef] = 1, + [0x001cf0] = 1, + [0x001cf1] = 1, + [0x001cf5] = 1, + [0x001cf6] = 1, + [0x001d78] = 1, + [0x001f88] = 1, + [0x001f89] = 1, + [0x001f8a] = 1, + [0x001f8b] = 1, + [0x001f8c] = 1, + [0x001f8d] = 1, + [0x001f8e] = 1, + [0x001f8f] = 1, + [0x001f98] = 1, + [0x001f99] = 1, + [0x001f9a] = 1, + [0x001f9b] = 1, + [0x001f9c] = 1, + [0x001f9d] = 1, + [0x001f9e] = 1, + [0x001f9f] = 1, + [0x001fa8] = 1, + [0x001fa9] = 1, + [0x001faa] = 1, + [0x001fab] = 1, + [0x001fac] = 1, + [0x001fad] = 1, + [0x001fae] = 1, + [0x001faf] = 1, + [0x001fbc] = 1, + [0x001fcc] = 1, + [0x001ffc] = 1, + [0x002071] = 1, + [0x00207f] = 1, + [0x002135] = 1, + [0x002136] = 1, + [0x002137] = 1, + [0x002138] = 1, + [0x002c7c] = 1, + [0x002c7d] = 1, + [0x002d6f] = 1, + [0x002da0] = 1, + [0x002da1] = 1, + [0x002da2] = 1, + [0x002da3] = 1, + [0x002da4] = 1, + [0x002da5] = 1, + [0x002da6] = 1, + [0x002da8] = 1, + [0x002da9] = 1, + [0x002daa] = 1, + [0x002dab] = 1, + [0x002dac] = 1, + [0x002dad] = 1, + [0x002dae] = 1, + [0x002db0] = 1, + [0x002db1] = 1, + [0x002db2] = 1, + [0x002db3] = 1, + [0x002db4] = 1, + [0x002db5] = 1, + [0x002db6] = 1, + [0x002db8] = 1, + [0x002db9] = 1, + [0x002dba] = 1, + [0x002dbb] = 1, + [0x002dbc] = 1, + [0x002dbd] = 1, + [0x002dbe] = 1, + [0x002dc0] = 1, + [0x002dc1] = 1, + [0x002dc2] = 1, + [0x002dc3] = 1, + [0x002dc4] = 1, + [0x002dc5] = 1, + [0x002dc6] = 1, + [0x002dc8] = 1, + [0x002dc9] = 1, + [0x002dca] = 1, + [0x002dcb] = 1, + [0x002dcc] = 1, + [0x002dcd] = 1, + [0x002dce] = 1, + [0x002dd0] = 1, + [0x002dd1] = 1, + [0x002dd2] = 1, + [0x002dd3] = 1, + [0x002dd4] = 1, + [0x002dd5] = 1, + [0x002dd6] = 1, + [0x002dd8] = 1, + [0x002dd9] = 1, + [0x002dda] = 1, + [0x002ddb] = 1, + [0x002ddc] = 1, + [0x002ddd] = 1, + [0x002dde] = 1, + [0x002e2f] = 1, + [0x003005] = 1, + [0x003006] = 1, + [0x003031] = 1, + [0x003032] = 1, + [0x003033] = 1, + [0x003034] = 1, + [0x003035] = 1, + [0x00303b] = 1, + [0x00303c] = 1, + [0x00309d] = 1, + [0x00309e] = 1, + [0x00309f] = 1, + [0x0030fc] = 1, + [0x0030fd] = 1, + [0x0030fe] = 1, + [0x0030ff] = 1, + [0x00a62a] = 1, + [0x00a62b] = 1, + [0x00a66e] = 1, + [0x00a67f] = 1, + [0x00a717] = 1, + [0x00a718] = 1, + [0x00a719] = 1, + [0x00a71a] = 1, + [0x00a71b] = 1, + [0x00a71c] = 1, + [0x00a71d] = 1, + [0x00a71e] = 1, + [0x00a71f] = 1, + [0x00a770] = 1, + [0x00a788] = 1, + [0x00a7f8] = 1, + [0x00a7f9] = 1, + [0x00a7fb] = 1, + [0x00a7fc] = 1, + [0x00a7fd] = 1, + [0x00a7fe] = 1, + [0x00a7ff] = 1, + [0x00a800] = 1, + [0x00a801] = 1, + [0x00a803] = 1, + [0x00a804] = 1, + [0x00a805] = 1, + [0x00a807] = 1, + [0x00a808] = 1, + [0x00a809] = 1, + [0x00a80a] = 1, + [0x00a8f2] = 1, + [0x00a8f3] = 1, + [0x00a8f4] = 1, + [0x00a8f5] = 1, + [0x00a8f6] = 1, + [0x00a8f7] = 1, + [0x00a8fb] = 1, + [0x00a9cf] = 1, + [0x00aa40] = 1, + [0x00aa41] = 1, + [0x00aa42] = 1, + [0x00aa44] = 1, + [0x00aa45] = 1, + [0x00aa46] = 1, + [0x00aa47] = 1, + [0x00aa48] = 1, + [0x00aa49] = 1, + [0x00aa4a] = 1, + [0x00aa4b] = 1, + [0x00aa7a] = 1, + [0x00aab1] = 1, + [0x00aab5] = 1, + [0x00aab6] = 1, + [0x00aab9] = 1, + [0x00aaba] = 1, + [0x00aabb] = 1, + [0x00aabc] = 1, + [0x00aabd] = 1, + [0x00aac0] = 1, + [0x00aac2] = 1, + [0x00aadb] = 1, + [0x00aadc] = 1, + [0x00aadd] = 1, + [0x00aaf2] = 1, + [0x00aaf3] = 1, + [0x00aaf4] = 1, + [0x00ab01] = 1, + [0x00ab02] = 1, + [0x00ab03] = 1, + [0x00ab04] = 1, + [0x00ab05] = 1, + [0x00ab06] = 1, + [0x00ab09] = 1, + [0x00ab0a] = 1, + [0x00ab0b] = 1, + [0x00ab0c] = 1, + [0x00ab0d] = 1, + [0x00ab0e] = 1, + [0x00ab11] = 1, + [0x00ab12] = 1, + [0x00ab13] = 1, + [0x00ab14] = 1, + [0x00ab15] = 1, + [0x00ab16] = 1, + [0x00ab20] = 1, + [0x00ab21] = 1, + [0x00ab22] = 1, + [0x00ab23] = 1, + [0x00ab24] = 1, + [0x00ab25] = 1, + [0x00ab26] = 1, + [0x00ab28] = 1, + [0x00ab29] = 1, + [0x00ab2a] = 1, + [0x00ab2b] = 1, + [0x00ab2c] = 1, + [0x00ab2d] = 1, + [0x00ab2e] = 1, + [0x00fb1d] = 1, + [0x00fb38] = 1, + [0x00fb39] = 1, + [0x00fb3a] = 1, + [0x00fb3b] = 1, + [0x00fb3c] = 1, + [0x00fb3e] = 1, + [0x00fb40] = 1, + [0x00fb41] = 1, + [0x00fb43] = 1, + [0x00fb44] = 1, + [0x00fe70] = 1, + [0x00fe71] = 1, + [0x00fe72] = 1, + [0x00fe73] = 1, + [0x00fe74] = 1, + [0x00ffc2] = 1, + [0x00ffc3] = 1, + [0x00ffc4] = 1, + [0x00ffc5] = 1, + [0x00ffc6] = 1, + [0x00ffc7] = 1, + [0x00ffca] = 1, + [0x00ffcb] = 1, + [0x00ffcc] = 1, + [0x00ffcd] = 1, + [0x00ffce] = 1, + [0x00ffcf] = 1, + [0x00ffd2] = 1, + [0x00ffd3] = 1, + [0x00ffd4] = 1, + [0x00ffd5] = 1, + [0x00ffd6] = 1, + [0x00ffd7] = 1, + [0x00ffda] = 1, + [0x00ffdb] = 1, + [0x00ffdc] = 1, + [0x01003c] = 1, + [0x01003d] = 1, + [0x010342] = 1, + [0x010343] = 1, + [0x010344] = 1, + [0x010345] = 1, + [0x010346] = 1, + [0x010347] = 1, + [0x010348] = 1, + [0x010349] = 1, + [0x0103c8] = 1, + [0x0103c9] = 1, + [0x0103ca] = 1, + [0x0103cb] = 1, + [0x0103cc] = 1, + [0x0103cd] = 1, + [0x0103ce] = 1, + [0x0103cf] = 1, + [0x010800] = 1, + [0x010801] = 1, + [0x010802] = 1, + [0x010803] = 1, + [0x010804] = 1, + [0x010805] = 1, + [0x010808] = 1, + [0x010837] = 1, + [0x010838] = 1, + [0x01083c] = 1, + [0x0109be] = 1, + [0x0109bf] = 1, + [0x010a00] = 1, + [0x010a10] = 1, + [0x010a11] = 1, + [0x010a12] = 1, + [0x010a13] = 1, + [0x010a15] = 1, + [0x010a16] = 1, + [0x010a17] = 1, + [0x0111c1] = 1, + [0x0111c2] = 1, + [0x0111c3] = 1, + [0x0111c4] = 1, + [0x016f50] = 1, + [0x01b000] = 1, + [0x01b001] = 1, + [0x01ee00] = 1, + [0x01ee01] = 1, + [0x01ee02] = 1, + [0x01ee03] = 1, + [0x01ee21] = 1, + [0x01ee22] = 1, + [0x01ee24] = 1, + [0x01ee27] = 1, + [0x01ee34] = 1, + [0x01ee35] = 1, + [0x01ee36] = 1, + [0x01ee37] = 1, + [0x01ee39] = 1, + [0x01ee3b] = 1, + [0x01ee42] = 1, + [0x01ee47] = 1, + [0x01ee49] = 1, + [0x01ee4b] = 1, + [0x01ee4d] = 1, + [0x01ee4e] = 1, + [0x01ee4f] = 1, + [0x01ee51] = 1, + [0x01ee52] = 1, + [0x01ee54] = 1, + [0x01ee57] = 1, + [0x01ee59] = 1, + [0x01ee5b] = 1, + [0x01ee5d] = 1, + [0x01ee5f] = 1, + [0x01ee61] = 1, + [0x01ee62] = 1, + [0x01ee64] = 1, + [0x01ee67] = 1, + [0x01ee68] = 1, + [0x01ee69] = 1, + [0x01ee6a] = 1, + [0x01ee6c] = 1, + [0x01ee6d] = 1, + [0x01ee6e] = 1, + [0x01ee6f] = 1, + [0x01ee70] = 1, + [0x01ee71] = 1, + [0x01ee72] = 1, + [0x01ee74] = 1, + [0x01ee75] = 1, + [0x01ee76] = 1, + [0x01ee77] = 1, + [0x01ee79] = 1, + [0x01ee7a] = 1, + [0x01ee7b] = 1, + [0x01ee7c] = 1, + [0x01ee7e] = 1, + [0x01eea1] = 1, + [0x01eea2] = 1, + [0x01eea3] = 1, + [0x01eea5] = 1, + [0x01eea6] = 1, + [0x01eea7] = 1, + [0x01eea8] = 1, + [0x01eea9] = 1, + }, + [0x63] = { + }, + [0x64] = { + [0x000030] = 1, + [0x000031] = 1, + [0x000032] = 1, + [0x000033] = 1, + [0x000034] = 1, + [0x000035] = 1, + [0x000036] = 1, + [0x000037] = 1, + [0x000038] = 1, + [0x000039] = 1, + }, + [0x6c] = { + [0x000061] = 1, + [0x000062] = 1, + [0x000063] = 1, + [0x000064] = 1, + [0x000065] = 1, + [0x000066] = 1, + [0x000067] = 1, + [0x000068] = 1, + [0x000069] = 1, + [0x00006a] = 1, + [0x00006b] = 1, + [0x00006c] = 1, + [0x00006d] = 1, + [0x00006e] = 1, + [0x00006f] = 1, + [0x000070] = 1, + [0x000071] = 1, + [0x000072] = 1, + [0x000073] = 1, + [0x000074] = 1, + [0x000075] = 1, + [0x000076] = 1, + [0x000077] = 1, + [0x000078] = 1, + [0x000079] = 1, + [0x00007a] = 1, + [0x0000b5] = 1, + [0x0000f8] = 1, + [0x0000f9] = 1, + [0x0000fa] = 1, + [0x0000fb] = 1, + [0x0000fc] = 1, + [0x0000fd] = 1, + [0x0000fe] = 1, + [0x0000ff] = 1, + [0x000101] = 1, + [0x000103] = 1, + [0x000105] = 1, + [0x000107] = 1, + [0x000109] = 1, + [0x00010b] = 1, + [0x00010d] = 1, + [0x00010f] = 1, + [0x000111] = 1, + [0x000113] = 1, + [0x000115] = 1, + [0x000117] = 1, + [0x000119] = 1, + [0x00011b] = 1, + [0x00011d] = 1, + [0x00011f] = 1, + [0x000121] = 1, + [0x000123] = 1, + [0x000125] = 1, + [0x000127] = 1, + [0x000129] = 1, + [0x00012b] = 1, + [0x00012d] = 1, + [0x00012f] = 1, + [0x000131] = 1, + [0x000133] = 1, + [0x000135] = 1, + [0x000137] = 1, + [0x000138] = 1, + [0x00013a] = 1, + [0x00013c] = 1, + [0x00013e] = 1, + [0x000140] = 1, + [0x000142] = 1, + [0x000144] = 1, + [0x000146] = 1, + [0x000148] = 1, + [0x000149] = 1, + [0x00014b] = 1, + [0x00014d] = 1, + [0x00014f] = 1, + [0x000151] = 1, + [0x000153] = 1, + [0x000155] = 1, + [0x000157] = 1, + [0x000159] = 1, + [0x00015b] = 1, + [0x00015d] = 1, + [0x00015f] = 1, + [0x000161] = 1, + [0x000163] = 1, + [0x000165] = 1, + [0x000167] = 1, + [0x000169] = 1, + [0x00016b] = 1, + [0x00016d] = 1, + [0x00016f] = 1, + [0x000171] = 1, + [0x000173] = 1, + [0x000175] = 1, + [0x000177] = 1, + [0x00017a] = 1, + [0x00017c] = 1, + [0x00017e] = 1, + [0x00017f] = 1, + [0x000180] = 1, + [0x000183] = 1, + [0x000185] = 1, + [0x000188] = 1, + [0x00018c] = 1, + [0x00018d] = 1, + [0x000192] = 1, + [0x000195] = 1, + [0x000199] = 1, + [0x00019a] = 1, + [0x00019b] = 1, + [0x00019e] = 1, + [0x0001a1] = 1, + [0x0001a3] = 1, + [0x0001a5] = 1, + [0x0001a8] = 1, + [0x0001aa] = 1, + [0x0001ab] = 1, + [0x0001ad] = 1, + [0x0001b0] = 1, + [0x0001b4] = 1, + [0x0001b6] = 1, + [0x0001b9] = 1, + [0x0001ba] = 1, + [0x0001bd] = 1, + [0x0001be] = 1, + [0x0001bf] = 1, + [0x0001c6] = 1, + [0x0001c9] = 1, + [0x0001cc] = 1, + [0x0001ce] = 1, + [0x0001d0] = 1, + [0x0001d2] = 1, + [0x0001d4] = 1, + [0x0001d6] = 1, + [0x0001d8] = 1, + [0x0001da] = 1, + [0x0001dc] = 1, + [0x0001dd] = 1, + [0x0001df] = 1, + [0x0001e1] = 1, + [0x0001e3] = 1, + [0x0001e5] = 1, + [0x0001e7] = 1, + [0x0001e9] = 1, + [0x0001eb] = 1, + [0x0001ed] = 1, + [0x0001ef] = 1, + [0x0001f0] = 1, + [0x0001f3] = 1, + [0x0001f5] = 1, + [0x0001f9] = 1, + [0x0001fb] = 1, + [0x0001fd] = 1, + [0x0001ff] = 1, + [0x000201] = 1, + [0x000203] = 1, + [0x000205] = 1, + [0x000207] = 1, + [0x000209] = 1, + [0x00020b] = 1, + [0x00020d] = 1, + [0x00020f] = 1, + [0x000211] = 1, + [0x000213] = 1, + [0x000215] = 1, + [0x000217] = 1, + [0x000219] = 1, + [0x00021b] = 1, + [0x00021d] = 1, + [0x00021f] = 1, + [0x000221] = 1, + [0x000223] = 1, + [0x000225] = 1, + [0x000227] = 1, + [0x000229] = 1, + [0x00022b] = 1, + [0x00022d] = 1, + [0x00022f] = 1, + [0x000231] = 1, + [0x000233] = 1, + [0x000234] = 1, + [0x000235] = 1, + [0x000236] = 1, + [0x000237] = 1, + [0x000238] = 1, + [0x000239] = 1, + [0x00023c] = 1, + [0x00023f] = 1, + [0x000240] = 1, + [0x000242] = 1, + [0x000247] = 1, + [0x000249] = 1, + [0x00024b] = 1, + [0x00024d] = 1, + [0x000371] = 1, + [0x000373] = 1, + [0x000377] = 1, + [0x00037b] = 1, + [0x00037c] = 1, + [0x00037d] = 1, + [0x000390] = 1, + [0x0003d0] = 1, + [0x0003d1] = 1, + [0x0003d5] = 1, + [0x0003d6] = 1, + [0x0003d7] = 1, + [0x0003d9] = 1, + [0x0003db] = 1, + [0x0003dd] = 1, + [0x0003df] = 1, + [0x0003e1] = 1, + [0x0003e3] = 1, + [0x0003e5] = 1, + [0x0003e7] = 1, + [0x0003e9] = 1, + [0x0003eb] = 1, + [0x0003ed] = 1, + [0x0003ef] = 1, + [0x0003f0] = 1, + [0x0003f1] = 1, + [0x0003f2] = 1, + [0x0003f3] = 1, + [0x0003f5] = 1, + [0x0003f8] = 1, + [0x0003fb] = 1, + [0x0003fc] = 1, + [0x000461] = 1, + [0x000463] = 1, + [0x000465] = 1, + [0x000467] = 1, + [0x000469] = 1, + [0x00046b] = 1, + [0x00046d] = 1, + [0x00046f] = 1, + [0x000471] = 1, + [0x000473] = 1, + [0x000475] = 1, + [0x000477] = 1, + [0x000479] = 1, + [0x00047b] = 1, + [0x00047d] = 1, + [0x00047f] = 1, + [0x000481] = 1, + [0x00048b] = 1, + [0x00048d] = 1, + [0x00048f] = 1, + [0x000491] = 1, + [0x000493] = 1, + [0x000495] = 1, + [0x000497] = 1, + [0x000499] = 1, + [0x00049b] = 1, + [0x00049d] = 1, + [0x00049f] = 1, + [0x0004a1] = 1, + [0x0004a3] = 1, + [0x0004a5] = 1, + [0x0004a7] = 1, + [0x0004a9] = 1, + [0x0004ab] = 1, + [0x0004ad] = 1, + [0x0004af] = 1, + [0x0004b1] = 1, + [0x0004b3] = 1, + [0x0004b5] = 1, + [0x0004b7] = 1, + [0x0004b9] = 1, + [0x0004bb] = 1, + [0x0004bd] = 1, + [0x0004bf] = 1, + [0x0004c2] = 1, + [0x0004c4] = 1, + [0x0004c6] = 1, + [0x0004c8] = 1, + [0x0004ca] = 1, + [0x0004cc] = 1, + [0x0004ce] = 1, + [0x0004cf] = 1, + [0x0004d1] = 1, + [0x0004d3] = 1, + [0x0004d5] = 1, + [0x0004d7] = 1, + [0x0004d9] = 1, + [0x0004db] = 1, + [0x0004dd] = 1, + [0x0004df] = 1, + [0x0004e1] = 1, + [0x0004e3] = 1, + [0x0004e5] = 1, + [0x0004e7] = 1, + [0x0004e9] = 1, + [0x0004eb] = 1, + [0x0004ed] = 1, + [0x0004ef] = 1, + [0x0004f1] = 1, + [0x0004f3] = 1, + [0x0004f5] = 1, + [0x0004f7] = 1, + [0x0004f9] = 1, + [0x0004fb] = 1, + [0x0004fd] = 1, + [0x0004ff] = 1, + [0x000501] = 1, + [0x000503] = 1, + [0x000505] = 1, + [0x000507] = 1, + [0x000509] = 1, + [0x00050b] = 1, + [0x00050d] = 1, + [0x00050f] = 1, + [0x000511] = 1, + [0x000513] = 1, + [0x000515] = 1, + [0x000517] = 1, + [0x000519] = 1, + [0x00051b] = 1, + [0x00051d] = 1, + [0x00051f] = 1, + [0x000521] = 1, + [0x000523] = 1, + [0x000525] = 1, + [0x000527] = 1, + [0x001e01] = 1, + [0x001e03] = 1, + [0x001e05] = 1, + [0x001e07] = 1, + [0x001e09] = 1, + [0x001e0b] = 1, + [0x001e0d] = 1, + [0x001e0f] = 1, + [0x001e11] = 1, + [0x001e13] = 1, + [0x001e15] = 1, + [0x001e17] = 1, + [0x001e19] = 1, + [0x001e1b] = 1, + [0x001e1d] = 1, + [0x001e1f] = 1, + [0x001e21] = 1, + [0x001e23] = 1, + [0x001e25] = 1, + [0x001e27] = 1, + [0x001e29] = 1, + [0x001e2b] = 1, + [0x001e2d] = 1, + [0x001e2f] = 1, + [0x001e31] = 1, + [0x001e33] = 1, + [0x001e35] = 1, + [0x001e37] = 1, + [0x001e39] = 1, + [0x001e3b] = 1, + [0x001e3d] = 1, + [0x001e3f] = 1, + [0x001e41] = 1, + [0x001e43] = 1, + [0x001e45] = 1, + [0x001e47] = 1, + [0x001e49] = 1, + [0x001e4b] = 1, + [0x001e4d] = 1, + [0x001e4f] = 1, + [0x001e51] = 1, + [0x001e53] = 1, + [0x001e55] = 1, + [0x001e57] = 1, + [0x001e59] = 1, + [0x001e5b] = 1, + [0x001e5d] = 1, + [0x001e5f] = 1, + [0x001e61] = 1, + [0x001e63] = 1, + [0x001e65] = 1, + [0x001e67] = 1, + [0x001e69] = 1, + [0x001e6b] = 1, + [0x001e6d] = 1, + [0x001e6f] = 1, + [0x001e71] = 1, + [0x001e73] = 1, + [0x001e75] = 1, + [0x001e77] = 1, + [0x001e79] = 1, + [0x001e7b] = 1, + [0x001e7d] = 1, + [0x001e7f] = 1, + [0x001e81] = 1, + [0x001e83] = 1, + [0x001e85] = 1, + [0x001e87] = 1, + [0x001e89] = 1, + [0x001e8b] = 1, + [0x001e8d] = 1, + [0x001e8f] = 1, + [0x001e91] = 1, + [0x001e93] = 1, + [0x001e95] = 1, + [0x001e96] = 1, + [0x001e97] = 1, + [0x001e98] = 1, + [0x001e99] = 1, + [0x001e9a] = 1, + [0x001e9b] = 1, + [0x001e9c] = 1, + [0x001e9d] = 1, + [0x001e9f] = 1, + [0x001ea1] = 1, + [0x001ea3] = 1, + [0x001ea5] = 1, + [0x001ea7] = 1, + [0x001ea9] = 1, + [0x001eab] = 1, + [0x001ead] = 1, + [0x001eaf] = 1, + [0x001eb1] = 1, + [0x001eb3] = 1, + [0x001eb5] = 1, + [0x001eb7] = 1, + [0x001eb9] = 1, + [0x001ebb] = 1, + [0x001ebd] = 1, + [0x001ebf] = 1, + [0x001ec1] = 1, + [0x001ec3] = 1, + [0x001ec5] = 1, + [0x001ec7] = 1, + [0x001ec9] = 1, + [0x001ecb] = 1, + [0x001ecd] = 1, + [0x001ecf] = 1, + [0x001ed1] = 1, + [0x001ed3] = 1, + [0x001ed5] = 1, + [0x001ed7] = 1, + [0x001ed9] = 1, + [0x001edb] = 1, + [0x001edd] = 1, + [0x001edf] = 1, + [0x001ee1] = 1, + [0x001ee3] = 1, + [0x001ee5] = 1, + [0x001ee7] = 1, + [0x001ee9] = 1, + [0x001eeb] = 1, + [0x001eed] = 1, + [0x001eef] = 1, + [0x001ef1] = 1, + [0x001ef3] = 1, + [0x001ef5] = 1, + [0x001ef7] = 1, + [0x001ef9] = 1, + [0x001efb] = 1, + [0x001efd] = 1, + [0x001eff] = 1, + [0x001f00] = 1, + [0x001f01] = 1, + [0x001f02] = 1, + [0x001f03] = 1, + [0x001f04] = 1, + [0x001f05] = 1, + [0x001f06] = 1, + [0x001f07] = 1, + [0x001f10] = 1, + [0x001f11] = 1, + [0x001f12] = 1, + [0x001f13] = 1, + [0x001f14] = 1, + [0x001f15] = 1, + [0x001f20] = 1, + [0x001f21] = 1, + [0x001f22] = 1, + [0x001f23] = 1, + [0x001f24] = 1, + [0x001f25] = 1, + [0x001f26] = 1, + [0x001f27] = 1, + [0x001f30] = 1, + [0x001f31] = 1, + [0x001f32] = 1, + [0x001f33] = 1, + [0x001f34] = 1, + [0x001f35] = 1, + [0x001f36] = 1, + [0x001f37] = 1, + [0x001f40] = 1, + [0x001f41] = 1, + [0x001f42] = 1, + [0x001f43] = 1, + [0x001f44] = 1, + [0x001f45] = 1, + [0x001f50] = 1, + [0x001f51] = 1, + [0x001f52] = 1, + [0x001f53] = 1, + [0x001f54] = 1, + [0x001f55] = 1, + [0x001f56] = 1, + [0x001f57] = 1, + [0x001f60] = 1, + [0x001f61] = 1, + [0x001f62] = 1, + [0x001f63] = 1, + [0x001f64] = 1, + [0x001f65] = 1, + [0x001f66] = 1, + [0x001f67] = 1, + [0x001f80] = 1, + [0x001f81] = 1, + [0x001f82] = 1, + [0x001f83] = 1, + [0x001f84] = 1, + [0x001f85] = 1, + [0x001f86] = 1, + [0x001f87] = 1, + [0x001f90] = 1, + [0x001f91] = 1, + [0x001f92] = 1, + [0x001f93] = 1, + [0x001f94] = 1, + [0x001f95] = 1, + [0x001f96] = 1, + [0x001f97] = 1, + [0x001fa0] = 1, + [0x001fa1] = 1, + [0x001fa2] = 1, + [0x001fa3] = 1, + [0x001fa4] = 1, + [0x001fa5] = 1, + [0x001fa6] = 1, + [0x001fa7] = 1, + [0x001fb0] = 1, + [0x001fb1] = 1, + [0x001fb2] = 1, + [0x001fb3] = 1, + [0x001fb4] = 1, + [0x001fb6] = 1, + [0x001fb7] = 1, + [0x001fbe] = 1, + [0x001fc2] = 1, + [0x001fc3] = 1, + [0x001fc4] = 1, + [0x001fc6] = 1, + [0x001fc7] = 1, + [0x001fd0] = 1, + [0x001fd1] = 1, + [0x001fd2] = 1, + [0x001fd3] = 1, + [0x001fd6] = 1, + [0x001fd7] = 1, + [0x001fe0] = 1, + [0x001fe1] = 1, + [0x001fe2] = 1, + [0x001fe3] = 1, + [0x001fe4] = 1, + [0x001fe5] = 1, + [0x001fe6] = 1, + [0x001fe7] = 1, + [0x001ff2] = 1, + [0x001ff3] = 1, + [0x001ff4] = 1, + [0x001ff6] = 1, + [0x001ff7] = 1, + [0x00210a] = 1, + [0x00210e] = 1, + [0x00210f] = 1, + [0x002113] = 1, + [0x00212f] = 1, + [0x002134] = 1, + [0x002139] = 1, + [0x00213c] = 1, + [0x00213d] = 1, + [0x002146] = 1, + [0x002147] = 1, + [0x002148] = 1, + [0x002149] = 1, + [0x00214e] = 1, + [0x002184] = 1, + [0x002c61] = 1, + [0x002c65] = 1, + [0x002c66] = 1, + [0x002c68] = 1, + [0x002c6a] = 1, + [0x002c6c] = 1, + [0x002c71] = 1, + [0x002c73] = 1, + [0x002c74] = 1, + [0x002c76] = 1, + [0x002c77] = 1, + [0x002c78] = 1, + [0x002c79] = 1, + [0x002c7a] = 1, + [0x002c7b] = 1, + [0x002c81] = 1, + [0x002c83] = 1, + [0x002c85] = 1, + [0x002c87] = 1, + [0x002c89] = 1, + [0x002c8b] = 1, + [0x002c8d] = 1, + [0x002c8f] = 1, + [0x002c91] = 1, + [0x002c93] = 1, + [0x002c95] = 1, + [0x002c97] = 1, + [0x002c99] = 1, + [0x002c9b] = 1, + [0x002c9d] = 1, + [0x002c9f] = 1, + [0x002ca1] = 1, + [0x002ca3] = 1, + [0x002ca5] = 1, + [0x002ca7] = 1, + [0x002ca9] = 1, + [0x002cab] = 1, + [0x002cad] = 1, + [0x002caf] = 1, + [0x002cb1] = 1, + [0x002cb3] = 1, + [0x002cb5] = 1, + [0x002cb7] = 1, + [0x002cb9] = 1, + [0x002cbb] = 1, + [0x002cbd] = 1, + [0x002cbf] = 1, + [0x002cc1] = 1, + [0x002cc3] = 1, + [0x002cc5] = 1, + [0x002cc7] = 1, + [0x002cc9] = 1, + [0x002ccb] = 1, + [0x002ccd] = 1, + [0x002ccf] = 1, + [0x002cd1] = 1, + [0x002cd3] = 1, + [0x002cd5] = 1, + [0x002cd7] = 1, + [0x002cd9] = 1, + [0x002cdb] = 1, + [0x002cdd] = 1, + [0x002cdf] = 1, + [0x002ce1] = 1, + [0x002ce3] = 1, + [0x002ce4] = 1, + [0x002cec] = 1, + [0x002cee] = 1, + [0x002cf3] = 1, + [0x002d27] = 1, + [0x002d2d] = 1, + [0x00a641] = 1, + [0x00a643] = 1, + [0x00a645] = 1, + [0x00a647] = 1, + [0x00a649] = 1, + [0x00a64b] = 1, + [0x00a64d] = 1, + [0x00a64f] = 1, + [0x00a651] = 1, + [0x00a653] = 1, + [0x00a655] = 1, + [0x00a657] = 1, + [0x00a659] = 1, + [0x00a65b] = 1, + [0x00a65d] = 1, + [0x00a65f] = 1, + [0x00a661] = 1, + [0x00a663] = 1, + [0x00a665] = 1, + [0x00a667] = 1, + [0x00a669] = 1, + [0x00a66b] = 1, + [0x00a66d] = 1, + [0x00a681] = 1, + [0x00a683] = 1, + [0x00a685] = 1, + [0x00a687] = 1, + [0x00a689] = 1, + [0x00a68b] = 1, + [0x00a68d] = 1, + [0x00a68f] = 1, + [0x00a691] = 1, + [0x00a693] = 1, + [0x00a695] = 1, + [0x00a697] = 1, + [0x00a723] = 1, + [0x00a725] = 1, + [0x00a727] = 1, + [0x00a729] = 1, + [0x00a72b] = 1, + [0x00a72d] = 1, + [0x00a72f] = 1, + [0x00a730] = 1, + [0x00a731] = 1, + [0x00a733] = 1, + [0x00a735] = 1, + [0x00a737] = 1, + [0x00a739] = 1, + [0x00a73b] = 1, + [0x00a73d] = 1, + [0x00a73f] = 1, + [0x00a741] = 1, + [0x00a743] = 1, + [0x00a745] = 1, + [0x00a747] = 1, + [0x00a749] = 1, + [0x00a74b] = 1, + [0x00a74d] = 1, + [0x00a74f] = 1, + [0x00a751] = 1, + [0x00a753] = 1, + [0x00a755] = 1, + [0x00a757] = 1, + [0x00a759] = 1, + [0x00a75b] = 1, + [0x00a75d] = 1, + [0x00a75f] = 1, + [0x00a761] = 1, + [0x00a763] = 1, + [0x00a765] = 1, + [0x00a767] = 1, + [0x00a769] = 1, + [0x00a76b] = 1, + [0x00a76d] = 1, + [0x00a76f] = 1, + [0x00a771] = 1, + [0x00a772] = 1, + [0x00a773] = 1, + [0x00a774] = 1, + [0x00a775] = 1, + [0x00a776] = 1, + [0x00a777] = 1, + [0x00a778] = 1, + [0x00a77a] = 1, + [0x00a77c] = 1, + [0x00a77f] = 1, + [0x00a781] = 1, + [0x00a783] = 1, + [0x00a785] = 1, + [0x00a787] = 1, + [0x00a78c] = 1, + [0x00a78e] = 1, + [0x00a791] = 1, + [0x00a793] = 1, + [0x00a7a1] = 1, + [0x00a7a3] = 1, + [0x00a7a5] = 1, + [0x00a7a7] = 1, + [0x00a7a9] = 1, + [0x00a7fa] = 1, + [0x00fb00] = 1, + [0x00fb01] = 1, + [0x00fb02] = 1, + [0x00fb03] = 1, + [0x00fb04] = 1, + [0x00fb05] = 1, + [0x00fb06] = 1, + [0x00fb13] = 1, + [0x00fb14] = 1, + [0x00fb15] = 1, + [0x00fb16] = 1, + [0x00fb17] = 1, + [0x01d44e] = 1, + [0x01d44f] = 1, + [0x01d450] = 1, + [0x01d451] = 1, + [0x01d452] = 1, + [0x01d453] = 1, + [0x01d454] = 1, + [0x01d4b6] = 1, + [0x01d4b7] = 1, + [0x01d4b8] = 1, + [0x01d4b9] = 1, + [0x01d4bb] = 1, + [0x01d4bd] = 1, + [0x01d4be] = 1, + [0x01d4bf] = 1, + [0x01d4c0] = 1, + [0x01d4c1] = 1, + [0x01d4c2] = 1, + [0x01d4c3] = 1, + [0x01d6dc] = 1, + [0x01d6dd] = 1, + [0x01d6de] = 1, + [0x01d6df] = 1, + [0x01d6e0] = 1, + [0x01d6e1] = 1, + [0x01d716] = 1, + [0x01d717] = 1, + [0x01d718] = 1, + [0x01d719] = 1, + [0x01d71a] = 1, + [0x01d71b] = 1, + [0x01d750] = 1, + [0x01d751] = 1, + [0x01d752] = 1, + [0x01d753] = 1, + [0x01d754] = 1, + [0x01d755] = 1, + [0x01d78a] = 1, + [0x01d78b] = 1, + [0x01d78c] = 1, + [0x01d78d] = 1, + [0x01d78e] = 1, + [0x01d78f] = 1, + [0x01d7c4] = 1, + [0x01d7c5] = 1, + [0x01d7c6] = 1, + [0x01d7c7] = 1, + [0x01d7c8] = 1, + [0x01d7c9] = 1, + [0x01d7cb] = 1, + }, + [0x70] = { + [0x000021] = 1, + [0x000022] = 1, + [0x000023] = 1, + [0x000025] = 1, + [0x000026] = 1, + [0x000027] = 1, + [0x000028] = 1, + [0x000029] = 1, + [0x00002a] = 1, + [0x00002c] = 1, + [0x00002d] = 1, + [0x00002e] = 1, + [0x00002f] = 1, + [0x00003a] = 1, + [0x00003b] = 1, + [0x00003f] = 1, + [0x000040] = 1, + [0x00005b] = 1, + [0x00005c] = 1, + [0x00005d] = 1, + [0x00005f] = 1, + [0x00007b] = 1, + [0x00007d] = 1, + [0x0000a1] = 1, + [0x0000a7] = 1, + [0x0000ab] = 1, + [0x0000b6] = 1, + [0x0000b7] = 1, + [0x0000bb] = 1, + [0x0000bf] = 1, + [0x00037e] = 1, + [0x000387] = 1, + [0x00055a] = 1, + [0x00055b] = 1, + [0x00055c] = 1, + [0x00055d] = 1, + [0x00055e] = 1, + [0x00055f] = 1, + [0x000589] = 1, + [0x00058a] = 1, + [0x0005be] = 1, + [0x0005c0] = 1, + [0x0005c3] = 1, + [0x0005c6] = 1, + [0x0005f3] = 1, + [0x0005f4] = 1, + [0x000609] = 1, + [0x00060a] = 1, + [0x00060c] = 1, + [0x00060d] = 1, + [0x00061b] = 1, + [0x00061e] = 1, + [0x00061f] = 1, + [0x00066a] = 1, + [0x00066b] = 1, + [0x00066c] = 1, + [0x00066d] = 1, + [0x0006d4] = 1, + [0x0007f7] = 1, + [0x0007f8] = 1, + [0x0007f9] = 1, + [0x00085e] = 1, + [0x000964] = 1, + [0x000965] = 1, + [0x000970] = 1, + [0x000af0] = 1, + [0x000df4] = 1, + [0x000e4f] = 1, + [0x000e5a] = 1, + [0x000e5b] = 1, + [0x000f14] = 1, + [0x000f3a] = 1, + [0x000f3b] = 1, + [0x000f3c] = 1, + [0x000f3d] = 1, + [0x000f85] = 1, + [0x000fd0] = 1, + [0x000fd1] = 1, + [0x000fd2] = 1, + [0x000fd3] = 1, + [0x000fd4] = 1, + [0x000fd9] = 1, + [0x000fda] = 1, + [0x00104a] = 1, + [0x00104b] = 1, + [0x00104c] = 1, + [0x00104d] = 1, + [0x00104e] = 1, + [0x00104f] = 1, + [0x0010fb] = 1, + [0x001360] = 1, + [0x001361] = 1, + [0x001362] = 1, + [0x001363] = 1, + [0x001364] = 1, + [0x001365] = 1, + [0x001366] = 1, + [0x001367] = 1, + [0x001368] = 1, + [0x001400] = 1, + [0x00166d] = 1, + [0x00166e] = 1, + [0x00169b] = 1, + [0x00169c] = 1, + [0x0016eb] = 1, + [0x0016ec] = 1, + [0x0016ed] = 1, + [0x001735] = 1, + [0x001736] = 1, + [0x0017d4] = 1, + [0x0017d5] = 1, + [0x0017d6] = 1, + [0x0017d8] = 1, + [0x0017d9] = 1, + [0x0017da] = 1, + [0x001944] = 1, + [0x001945] = 1, + [0x001a1e] = 1, + [0x001a1f] = 1, + [0x001aa0] = 1, + [0x001aa1] = 1, + [0x001aa2] = 1, + [0x001aa3] = 1, + [0x001aa4] = 1, + [0x001aa5] = 1, + [0x001aa6] = 1, + [0x001aa8] = 1, + [0x001aa9] = 1, + [0x001aaa] = 1, + [0x001aab] = 1, + [0x001aac] = 1, + [0x001aad] = 1, + [0x001b5a] = 1, + [0x001b5b] = 1, + [0x001b5c] = 1, + [0x001b5d] = 1, + [0x001b5e] = 1, + [0x001b5f] = 1, + [0x001b60] = 1, + [0x001bfc] = 1, + [0x001bfd] = 1, + [0x001bfe] = 1, + [0x001bff] = 1, + [0x001c3b] = 1, + [0x001c3c] = 1, + [0x001c3d] = 1, + [0x001c3e] = 1, + [0x001c3f] = 1, + [0x001c7e] = 1, + [0x001c7f] = 1, + [0x001cc0] = 1, + [0x001cc1] = 1, + [0x001cc2] = 1, + [0x001cc3] = 1, + [0x001cc4] = 1, + [0x001cc5] = 1, + [0x001cc6] = 1, + [0x001cc7] = 1, + [0x001cd3] = 1, + [0x00207d] = 1, + [0x00207e] = 1, + [0x00208d] = 1, + [0x00208e] = 1, + [0x002308] = 1, + [0x002309] = 1, + [0x00230a] = 1, + [0x00230b] = 1, + [0x002329] = 1, + [0x00232a] = 1, + [0x0027c5] = 1, + [0x0027c6] = 1, + [0x0029d8] = 1, + [0x0029d9] = 1, + [0x0029da] = 1, + [0x0029db] = 1, + [0x0029fc] = 1, + [0x0029fd] = 1, + [0x002cf9] = 1, + [0x002cfa] = 1, + [0x002cfb] = 1, + [0x002cfc] = 1, + [0x002cfe] = 1, + [0x002cff] = 1, + [0x002d70] = 1, + [0x003001] = 1, + [0x003002] = 1, + [0x003003] = 1, + [0x003030] = 1, + [0x00303d] = 1, + [0x0030a0] = 1, + [0x0030fb] = 1, + [0x00a4fe] = 1, + [0x00a4ff] = 1, + [0x00a60d] = 1, + [0x00a60e] = 1, + [0x00a60f] = 1, + [0x00a673] = 1, + [0x00a67e] = 1, + [0x00a6f2] = 1, + [0x00a6f3] = 1, + [0x00a6f4] = 1, + [0x00a6f5] = 1, + [0x00a6f6] = 1, + [0x00a6f7] = 1, + [0x00a874] = 1, + [0x00a875] = 1, + [0x00a876] = 1, + [0x00a877] = 1, + [0x00a8ce] = 1, + [0x00a8cf] = 1, + [0x00a8f8] = 1, + [0x00a8f9] = 1, + [0x00a8fa] = 1, + [0x00a92e] = 1, + [0x00a92f] = 1, + [0x00a95f] = 1, + [0x00a9de] = 1, + [0x00a9df] = 1, + [0x00aa5c] = 1, + [0x00aa5d] = 1, + [0x00aa5e] = 1, + [0x00aa5f] = 1, + [0x00aade] = 1, + [0x00aadf] = 1, + [0x00aaf0] = 1, + [0x00aaf1] = 1, + [0x00abeb] = 1, + [0x00fd3e] = 1, + [0x00fd3f] = 1, + [0x00fe63] = 1, + [0x00fe68] = 1, + [0x00fe6a] = 1, + [0x00fe6b] = 1, + [0x00ff01] = 1, + [0x00ff02] = 1, + [0x00ff03] = 1, + [0x00ff05] = 1, + [0x00ff06] = 1, + [0x00ff07] = 1, + [0x00ff08] = 1, + [0x00ff09] = 1, + [0x00ff0a] = 1, + [0x00ff0c] = 1, + [0x00ff0d] = 1, + [0x00ff0e] = 1, + [0x00ff0f] = 1, + [0x00ff1a] = 1, + [0x00ff1b] = 1, + [0x00ff1f] = 1, + [0x00ff20] = 1, + [0x00ff3b] = 1, + [0x00ff3c] = 1, + [0x00ff3d] = 1, + [0x00ff3f] = 1, + [0x00ff5b] = 1, + [0x00ff5d] = 1, + [0x00ff5f] = 1, + [0x00ff60] = 1, + [0x00ff61] = 1, + [0x00ff62] = 1, + [0x00ff63] = 1, + [0x00ff64] = 1, + [0x00ff65] = 1, + [0x010100] = 1, + [0x010101] = 1, + [0x010102] = 1, + [0x01039f] = 1, + [0x0103d0] = 1, + [0x010857] = 1, + [0x01091f] = 1, + [0x01093f] = 1, + [0x010a50] = 1, + [0x010a51] = 1, + [0x010a52] = 1, + [0x010a53] = 1, + [0x010a54] = 1, + [0x010a55] = 1, + [0x010a56] = 1, + [0x010a57] = 1, + [0x010a58] = 1, + [0x010a7f] = 1, + [0x010b39] = 1, + [0x010b3a] = 1, + [0x010b3b] = 1, + [0x010b3c] = 1, + [0x010b3d] = 1, + [0x010b3e] = 1, + [0x010b3f] = 1, + [0x011047] = 1, + [0x011048] = 1, + [0x011049] = 1, + [0x01104a] = 1, + [0x01104b] = 1, + [0x01104c] = 1, + [0x01104d] = 1, + [0x0110bb] = 1, + [0x0110bc] = 1, + [0x0110be] = 1, + [0x0110bf] = 1, + [0x0110c0] = 1, + [0x0110c1] = 1, + [0x011140] = 1, + [0x011141] = 1, + [0x011142] = 1, + [0x011143] = 1, + [0x0111c5] = 1, + [0x0111c6] = 1, + [0x0111c7] = 1, + [0x0111c8] = 1, + [0x012470] = 1, + [0x012471] = 1, + [0x012472] = 1, + [0x012473] = 1, + }, + [0x73] = { + [0x000009] = 1, + [0x00000a] = 1, + [0x00000b] = 1, + [0x00000c] = 1, + [0x00000d] = 1, + [0x000020] = 1, + [0x000085] = 1, + [0x0000a0] = 1, + [0x001680] = 1, + [0x00180e] = 1, + [0x002028] = 1, + [0x002029] = 1, + [0x00202f] = 1, + [0x00205f] = 1, + [0x003000] = 1, + }, + [0x75] = { + [0x000041] = 1, + [0x000042] = 1, + [0x000043] = 1, + [0x000044] = 1, + [0x000045] = 1, + [0x000046] = 1, + [0x000047] = 1, + [0x000048] = 1, + [0x000049] = 1, + [0x00004a] = 1, + [0x00004b] = 1, + [0x00004c] = 1, + [0x00004d] = 1, + [0x00004e] = 1, + [0x00004f] = 1, + [0x000050] = 1, + [0x000051] = 1, + [0x000052] = 1, + [0x000053] = 1, + [0x000054] = 1, + [0x000055] = 1, + [0x000056] = 1, + [0x000057] = 1, + [0x000058] = 1, + [0x000059] = 1, + [0x00005a] = 1, + [0x0000d8] = 1, + [0x0000d9] = 1, + [0x0000da] = 1, + [0x0000db] = 1, + [0x0000dc] = 1, + [0x0000dd] = 1, + [0x0000de] = 1, + [0x000100] = 1, + [0x000102] = 1, + [0x000104] = 1, + [0x000106] = 1, + [0x000108] = 1, + [0x00010a] = 1, + [0x00010c] = 1, + [0x00010e] = 1, + [0x000110] = 1, + [0x000112] = 1, + [0x000114] = 1, + [0x000116] = 1, + [0x000118] = 1, + [0x00011a] = 1, + [0x00011c] = 1, + [0x00011e] = 1, + [0x000120] = 1, + [0x000122] = 1, + [0x000124] = 1, + [0x000126] = 1, + [0x000128] = 1, + [0x00012a] = 1, + [0x00012c] = 1, + [0x00012e] = 1, + [0x000130] = 1, + [0x000132] = 1, + [0x000134] = 1, + [0x000136] = 1, + [0x000139] = 1, + [0x00013b] = 1, + [0x00013d] = 1, + [0x00013f] = 1, + [0x000141] = 1, + [0x000143] = 1, + [0x000145] = 1, + [0x000147] = 1, + [0x00014a] = 1, + [0x00014c] = 1, + [0x00014e] = 1, + [0x000150] = 1, + [0x000152] = 1, + [0x000154] = 1, + [0x000156] = 1, + [0x000158] = 1, + [0x00015a] = 1, + [0x00015c] = 1, + [0x00015e] = 1, + [0x000160] = 1, + [0x000162] = 1, + [0x000164] = 1, + [0x000166] = 1, + [0x000168] = 1, + [0x00016a] = 1, + [0x00016c] = 1, + [0x00016e] = 1, + [0x000170] = 1, + [0x000172] = 1, + [0x000174] = 1, + [0x000176] = 1, + [0x000178] = 1, + [0x000179] = 1, + [0x00017b] = 1, + [0x00017d] = 1, + [0x000181] = 1, + [0x000182] = 1, + [0x000184] = 1, + [0x000186] = 1, + [0x000187] = 1, + [0x000189] = 1, + [0x00018a] = 1, + [0x00018b] = 1, + [0x00018e] = 1, + [0x00018f] = 1, + [0x000190] = 1, + [0x000191] = 1, + [0x000193] = 1, + [0x000194] = 1, + [0x000196] = 1, + [0x000197] = 1, + [0x000198] = 1, + [0x00019c] = 1, + [0x00019d] = 1, + [0x00019f] = 1, + [0x0001a0] = 1, + [0x0001a2] = 1, + [0x0001a4] = 1, + [0x0001a6] = 1, + [0x0001a7] = 1, + [0x0001a9] = 1, + [0x0001ac] = 1, + [0x0001ae] = 1, + [0x0001af] = 1, + [0x0001b1] = 1, + [0x0001b2] = 1, + [0x0001b3] = 1, + [0x0001b5] = 1, + [0x0001b7] = 1, + [0x0001b8] = 1, + [0x0001bc] = 1, + [0x0001c4] = 1, + [0x0001c7] = 1, + [0x0001ca] = 1, + [0x0001cd] = 1, + [0x0001cf] = 1, + [0x0001d1] = 1, + [0x0001d3] = 1, + [0x0001d5] = 1, + [0x0001d7] = 1, + [0x0001d9] = 1, + [0x0001db] = 1, + [0x0001de] = 1, + [0x0001e0] = 1, + [0x0001e2] = 1, + [0x0001e4] = 1, + [0x0001e6] = 1, + [0x0001e8] = 1, + [0x0001ea] = 1, + [0x0001ec] = 1, + [0x0001ee] = 1, + [0x0001f1] = 1, + [0x0001f4] = 1, + [0x0001f6] = 1, + [0x0001f7] = 1, + [0x0001f8] = 1, + [0x0001fa] = 1, + [0x0001fc] = 1, + [0x0001fe] = 1, + [0x000200] = 1, + [0x000202] = 1, + [0x000204] = 1, + [0x000206] = 1, + [0x000208] = 1, + [0x00020a] = 1, + [0x00020c] = 1, + [0x00020e] = 1, + [0x000210] = 1, + [0x000212] = 1, + [0x000214] = 1, + [0x000216] = 1, + [0x000218] = 1, + [0x00021a] = 1, + [0x00021c] = 1, + [0x00021e] = 1, + [0x000220] = 1, + [0x000222] = 1, + [0x000224] = 1, + [0x000226] = 1, + [0x000228] = 1, + [0x00022a] = 1, + [0x00022c] = 1, + [0x00022e] = 1, + [0x000230] = 1, + [0x000232] = 1, + [0x00023a] = 1, + [0x00023b] = 1, + [0x00023d] = 1, + [0x00023e] = 1, + [0x000241] = 1, + [0x000243] = 1, + [0x000244] = 1, + [0x000245] = 1, + [0x000246] = 1, + [0x000248] = 1, + [0x00024a] = 1, + [0x00024c] = 1, + [0x00024e] = 1, + [0x000370] = 1, + [0x000372] = 1, + [0x000376] = 1, + [0x000386] = 1, + [0x000388] = 1, + [0x000389] = 1, + [0x00038a] = 1, + [0x00038c] = 1, + [0x00038e] = 1, + [0x00038f] = 1, + [0x0003a3] = 1, + [0x0003a4] = 1, + [0x0003a5] = 1, + [0x0003a6] = 1, + [0x0003a7] = 1, + [0x0003a8] = 1, + [0x0003a9] = 1, + [0x0003aa] = 1, + [0x0003ab] = 1, + [0x0003cf] = 1, + [0x0003d2] = 1, + [0x0003d3] = 1, + [0x0003d4] = 1, + [0x0003d8] = 1, + [0x0003da] = 1, + [0x0003dc] = 1, + [0x0003de] = 1, + [0x0003e0] = 1, + [0x0003e2] = 1, + [0x0003e4] = 1, + [0x0003e6] = 1, + [0x0003e8] = 1, + [0x0003ea] = 1, + [0x0003ec] = 1, + [0x0003ee] = 1, + [0x0003f4] = 1, + [0x0003f7] = 1, + [0x0003f9] = 1, + [0x0003fa] = 1, + [0x000460] = 1, + [0x000462] = 1, + [0x000464] = 1, + [0x000466] = 1, + [0x000468] = 1, + [0x00046a] = 1, + [0x00046c] = 1, + [0x00046e] = 1, + [0x000470] = 1, + [0x000472] = 1, + [0x000474] = 1, + [0x000476] = 1, + [0x000478] = 1, + [0x00047a] = 1, + [0x00047c] = 1, + [0x00047e] = 1, + [0x000480] = 1, + [0x00048a] = 1, + [0x00048c] = 1, + [0x00048e] = 1, + [0x000490] = 1, + [0x000492] = 1, + [0x000494] = 1, + [0x000496] = 1, + [0x000498] = 1, + [0x00049a] = 1, + [0x00049c] = 1, + [0x00049e] = 1, + [0x0004a0] = 1, + [0x0004a2] = 1, + [0x0004a4] = 1, + [0x0004a6] = 1, + [0x0004a8] = 1, + [0x0004aa] = 1, + [0x0004ac] = 1, + [0x0004ae] = 1, + [0x0004b0] = 1, + [0x0004b2] = 1, + [0x0004b4] = 1, + [0x0004b6] = 1, + [0x0004b8] = 1, + [0x0004ba] = 1, + [0x0004bc] = 1, + [0x0004be] = 1, + [0x0004c0] = 1, + [0x0004c1] = 1, + [0x0004c3] = 1, + [0x0004c5] = 1, + [0x0004c7] = 1, + [0x0004c9] = 1, + [0x0004cb] = 1, + [0x0004cd] = 1, + [0x0004d0] = 1, + [0x0004d2] = 1, + [0x0004d4] = 1, + [0x0004d6] = 1, + [0x0004d8] = 1, + [0x0004da] = 1, + [0x0004dc] = 1, + [0x0004de] = 1, + [0x0004e0] = 1, + [0x0004e2] = 1, + [0x0004e4] = 1, + [0x0004e6] = 1, + [0x0004e8] = 1, + [0x0004ea] = 1, + [0x0004ec] = 1, + [0x0004ee] = 1, + [0x0004f0] = 1, + [0x0004f2] = 1, + [0x0004f4] = 1, + [0x0004f6] = 1, + [0x0004f8] = 1, + [0x0004fa] = 1, + [0x0004fc] = 1, + [0x0004fe] = 1, + [0x000500] = 1, + [0x000502] = 1, + [0x000504] = 1, + [0x000506] = 1, + [0x000508] = 1, + [0x00050a] = 1, + [0x00050c] = 1, + [0x00050e] = 1, + [0x000510] = 1, + [0x000512] = 1, + [0x000514] = 1, + [0x000516] = 1, + [0x000518] = 1, + [0x00051a] = 1, + [0x00051c] = 1, + [0x00051e] = 1, + [0x000520] = 1, + [0x000522] = 1, + [0x000524] = 1, + [0x000526] = 1, + [0x0010c7] = 1, + [0x0010cd] = 1, + [0x001e00] = 1, + [0x001e02] = 1, + [0x001e04] = 1, + [0x001e06] = 1, + [0x001e08] = 1, + [0x001e0a] = 1, + [0x001e0c] = 1, + [0x001e0e] = 1, + [0x001e10] = 1, + [0x001e12] = 1, + [0x001e14] = 1, + [0x001e16] = 1, + [0x001e18] = 1, + [0x001e1a] = 1, + [0x001e1c] = 1, + [0x001e1e] = 1, + [0x001e20] = 1, + [0x001e22] = 1, + [0x001e24] = 1, + [0x001e26] = 1, + [0x001e28] = 1, + [0x001e2a] = 1, + [0x001e2c] = 1, + [0x001e2e] = 1, + [0x001e30] = 1, + [0x001e32] = 1, + [0x001e34] = 1, + [0x001e36] = 1, + [0x001e38] = 1, + [0x001e3a] = 1, + [0x001e3c] = 1, + [0x001e3e] = 1, + [0x001e40] = 1, + [0x001e42] = 1, + [0x001e44] = 1, + [0x001e46] = 1, + [0x001e48] = 1, + [0x001e4a] = 1, + [0x001e4c] = 1, + [0x001e4e] = 1, + [0x001e50] = 1, + [0x001e52] = 1, + [0x001e54] = 1, + [0x001e56] = 1, + [0x001e58] = 1, + [0x001e5a] = 1, + [0x001e5c] = 1, + [0x001e5e] = 1, + [0x001e60] = 1, + [0x001e62] = 1, + [0x001e64] = 1, + [0x001e66] = 1, + [0x001e68] = 1, + [0x001e6a] = 1, + [0x001e6c] = 1, + [0x001e6e] = 1, + [0x001e70] = 1, + [0x001e72] = 1, + [0x001e74] = 1, + [0x001e76] = 1, + [0x001e78] = 1, + [0x001e7a] = 1, + [0x001e7c] = 1, + [0x001e7e] = 1, + [0x001e80] = 1, + [0x001e82] = 1, + [0x001e84] = 1, + [0x001e86] = 1, + [0x001e88] = 1, + [0x001e8a] = 1, + [0x001e8c] = 1, + [0x001e8e] = 1, + [0x001e90] = 1, + [0x001e92] = 1, + [0x001e94] = 1, + [0x001e9e] = 1, + [0x001ea0] = 1, + [0x001ea2] = 1, + [0x001ea4] = 1, + [0x001ea6] = 1, + [0x001ea8] = 1, + [0x001eaa] = 1, + [0x001eac] = 1, + [0x001eae] = 1, + [0x001eb0] = 1, + [0x001eb2] = 1, + [0x001eb4] = 1, + [0x001eb6] = 1, + [0x001eb8] = 1, + [0x001eba] = 1, + [0x001ebc] = 1, + [0x001ebe] = 1, + [0x001ec0] = 1, + [0x001ec2] = 1, + [0x001ec4] = 1, + [0x001ec6] = 1, + [0x001ec8] = 1, + [0x001eca] = 1, + [0x001ecc] = 1, + [0x001ece] = 1, + [0x001ed0] = 1, + [0x001ed2] = 1, + [0x001ed4] = 1, + [0x001ed6] = 1, + [0x001ed8] = 1, + [0x001eda] = 1, + [0x001edc] = 1, + [0x001ede] = 1, + [0x001ee0] = 1, + [0x001ee2] = 1, + [0x001ee4] = 1, + [0x001ee6] = 1, + [0x001ee8] = 1, + [0x001eea] = 1, + [0x001eec] = 1, + [0x001eee] = 1, + [0x001ef0] = 1, + [0x001ef2] = 1, + [0x001ef4] = 1, + [0x001ef6] = 1, + [0x001ef8] = 1, + [0x001efa] = 1, + [0x001efc] = 1, + [0x001efe] = 1, + [0x001f08] = 1, + [0x001f09] = 1, + [0x001f0a] = 1, + [0x001f0b] = 1, + [0x001f0c] = 1, + [0x001f0d] = 1, + [0x001f0e] = 1, + [0x001f0f] = 1, + [0x001f18] = 1, + [0x001f19] = 1, + [0x001f1a] = 1, + [0x001f1b] = 1, + [0x001f1c] = 1, + [0x001f1d] = 1, + [0x001f28] = 1, + [0x001f29] = 1, + [0x001f2a] = 1, + [0x001f2b] = 1, + [0x001f2c] = 1, + [0x001f2d] = 1, + [0x001f2e] = 1, + [0x001f2f] = 1, + [0x001f38] = 1, + [0x001f39] = 1, + [0x001f3a] = 1, + [0x001f3b] = 1, + [0x001f3c] = 1, + [0x001f3d] = 1, + [0x001f3e] = 1, + [0x001f3f] = 1, + [0x001f48] = 1, + [0x001f49] = 1, + [0x001f4a] = 1, + [0x001f4b] = 1, + [0x001f4c] = 1, + [0x001f4d] = 1, + [0x001f59] = 1, + [0x001f5b] = 1, + [0x001f5d] = 1, + [0x001f5f] = 1, + [0x001f68] = 1, + [0x001f69] = 1, + [0x001f6a] = 1, + [0x001f6b] = 1, + [0x001f6c] = 1, + [0x001f6d] = 1, + [0x001f6e] = 1, + [0x001f6f] = 1, + [0x001fb8] = 1, + [0x001fb9] = 1, + [0x001fba] = 1, + [0x001fbb] = 1, + [0x001fc8] = 1, + [0x001fc9] = 1, + [0x001fca] = 1, + [0x001fcb] = 1, + [0x001fd8] = 1, + [0x001fd9] = 1, + [0x001fda] = 1, + [0x001fdb] = 1, + [0x001fe8] = 1, + [0x001fe9] = 1, + [0x001fea] = 1, + [0x001feb] = 1, + [0x001fec] = 1, + [0x001ff8] = 1, + [0x001ff9] = 1, + [0x001ffa] = 1, + [0x001ffb] = 1, + [0x002102] = 1, + [0x002107] = 1, + [0x00210b] = 1, + [0x00210c] = 1, + [0x00210d] = 1, + [0x002110] = 1, + [0x002111] = 1, + [0x002112] = 1, + [0x002115] = 1, + [0x002119] = 1, + [0x00211a] = 1, + [0x00211b] = 1, + [0x00211c] = 1, + [0x00211d] = 1, + [0x002124] = 1, + [0x002126] = 1, + [0x002128] = 1, + [0x00212a] = 1, + [0x00212b] = 1, + [0x00212c] = 1, + [0x00212d] = 1, + [0x002130] = 1, + [0x002131] = 1, + [0x002132] = 1, + [0x002133] = 1, + [0x00213e] = 1, + [0x00213f] = 1, + [0x002145] = 1, + [0x002183] = 1, + [0x002c60] = 1, + [0x002c62] = 1, + [0x002c63] = 1, + [0x002c64] = 1, + [0x002c67] = 1, + [0x002c69] = 1, + [0x002c6b] = 1, + [0x002c6d] = 1, + [0x002c6e] = 1, + [0x002c6f] = 1, + [0x002c70] = 1, + [0x002c72] = 1, + [0x002c75] = 1, + [0x002c7e] = 1, + [0x002c7f] = 1, + [0x002c80] = 1, + [0x002c82] = 1, + [0x002c84] = 1, + [0x002c86] = 1, + [0x002c88] = 1, + [0x002c8a] = 1, + [0x002c8c] = 1, + [0x002c8e] = 1, + [0x002c90] = 1, + [0x002c92] = 1, + [0x002c94] = 1, + [0x002c96] = 1, + [0x002c98] = 1, + [0x002c9a] = 1, + [0x002c9c] = 1, + [0x002c9e] = 1, + [0x002ca0] = 1, + [0x002ca2] = 1, + [0x002ca4] = 1, + [0x002ca6] = 1, + [0x002ca8] = 1, + [0x002caa] = 1, + [0x002cac] = 1, + [0x002cae] = 1, + [0x002cb0] = 1, + [0x002cb2] = 1, + [0x002cb4] = 1, + [0x002cb6] = 1, + [0x002cb8] = 1, + [0x002cba] = 1, + [0x002cbc] = 1, + [0x002cbe] = 1, + [0x002cc0] = 1, + [0x002cc2] = 1, + [0x002cc4] = 1, + [0x002cc6] = 1, + [0x002cc8] = 1, + [0x002cca] = 1, + [0x002ccc] = 1, + [0x002cce] = 1, + [0x002cd0] = 1, + [0x002cd2] = 1, + [0x002cd4] = 1, + [0x002cd6] = 1, + [0x002cd8] = 1, + [0x002cda] = 1, + [0x002cdc] = 1, + [0x002cde] = 1, + [0x002ce0] = 1, + [0x002ce2] = 1, + [0x002ceb] = 1, + [0x002ced] = 1, + [0x002cf2] = 1, + [0x00a640] = 1, + [0x00a642] = 1, + [0x00a644] = 1, + [0x00a646] = 1, + [0x00a648] = 1, + [0x00a64a] = 1, + [0x00a64c] = 1, + [0x00a64e] = 1, + [0x00a650] = 1, + [0x00a652] = 1, + [0x00a654] = 1, + [0x00a656] = 1, + [0x00a658] = 1, + [0x00a65a] = 1, + [0x00a65c] = 1, + [0x00a65e] = 1, + [0x00a660] = 1, + [0x00a662] = 1, + [0x00a664] = 1, + [0x00a666] = 1, + [0x00a668] = 1, + [0x00a66a] = 1, + [0x00a66c] = 1, + [0x00a680] = 1, + [0x00a682] = 1, + [0x00a684] = 1, + [0x00a686] = 1, + [0x00a688] = 1, + [0x00a68a] = 1, + [0x00a68c] = 1, + [0x00a68e] = 1, + [0x00a690] = 1, + [0x00a692] = 1, + [0x00a694] = 1, + [0x00a696] = 1, + [0x00a722] = 1, + [0x00a724] = 1, + [0x00a726] = 1, + [0x00a728] = 1, + [0x00a72a] = 1, + [0x00a72c] = 1, + [0x00a72e] = 1, + [0x00a732] = 1, + [0x00a734] = 1, + [0x00a736] = 1, + [0x00a738] = 1, + [0x00a73a] = 1, + [0x00a73c] = 1, + [0x00a73e] = 1, + [0x00a740] = 1, + [0x00a742] = 1, + [0x00a744] = 1, + [0x00a746] = 1, + [0x00a748] = 1, + [0x00a74a] = 1, + [0x00a74c] = 1, + [0x00a74e] = 1, + [0x00a750] = 1, + [0x00a752] = 1, + [0x00a754] = 1, + [0x00a756] = 1, + [0x00a758] = 1, + [0x00a75a] = 1, + [0x00a75c] = 1, + [0x00a75e] = 1, + [0x00a760] = 1, + [0x00a762] = 1, + [0x00a764] = 1, + [0x00a766] = 1, + [0x00a768] = 1, + [0x00a76a] = 1, + [0x00a76c] = 1, + [0x00a76e] = 1, + [0x00a779] = 1, + [0x00a77b] = 1, + [0x00a77d] = 1, + [0x00a77e] = 1, + [0x00a780] = 1, + [0x00a782] = 1, + [0x00a784] = 1, + [0x00a786] = 1, + [0x00a78b] = 1, + [0x00a78d] = 1, + [0x00a790] = 1, + [0x00a792] = 1, + [0x00a7a0] = 1, + [0x00a7a2] = 1, + [0x00a7a4] = 1, + [0x00a7a6] = 1, + [0x00a7a8] = 1, + [0x00a7aa] = 1, + [0x01d49c] = 1, + [0x01d49e] = 1, + [0x01d49f] = 1, + [0x01d4a2] = 1, + [0x01d4a5] = 1, + [0x01d4a6] = 1, + [0x01d4a9] = 1, + [0x01d4aa] = 1, + [0x01d4ab] = 1, + [0x01d4ac] = 1, + [0x01d4ae] = 1, + [0x01d4af] = 1, + [0x01d4b0] = 1, + [0x01d4b1] = 1, + [0x01d4b2] = 1, + [0x01d4b3] = 1, + [0x01d4b4] = 1, + [0x01d4b5] = 1, + [0x01d504] = 1, + [0x01d505] = 1, + [0x01d507] = 1, + [0x01d508] = 1, + [0x01d509] = 1, + [0x01d50a] = 1, + [0x01d50d] = 1, + [0x01d50e] = 1, + [0x01d50f] = 1, + [0x01d510] = 1, + [0x01d511] = 1, + [0x01d512] = 1, + [0x01d513] = 1, + [0x01d514] = 1, + [0x01d516] = 1, + [0x01d517] = 1, + [0x01d518] = 1, + [0x01d519] = 1, + [0x01d51a] = 1, + [0x01d51b] = 1, + [0x01d51c] = 1, + [0x01d538] = 1, + [0x01d539] = 1, + [0x01d53b] = 1, + [0x01d53c] = 1, + [0x01d53d] = 1, + [0x01d53e] = 1, + [0x01d540] = 1, + [0x01d541] = 1, + [0x01d542] = 1, + [0x01d543] = 1, + [0x01d544] = 1, + [0x01d546] = 1, + [0x01d54a] = 1, + [0x01d54b] = 1, + [0x01d54c] = 1, + [0x01d54d] = 1, + [0x01d54e] = 1, + [0x01d54f] = 1, + [0x01d550] = 1, + [0x01d7ca] = 1, + }, + [0x77] = {}, + [0x78] = { + [0x000030] = 1, + [0x000031] = 1, + [0x000032] = 1, + [0x000033] = 1, + [0x000034] = 1, + [0x000035] = 1, + [0x000036] = 1, + [0x000037] = 1, + [0x000038] = 1, + [0x000039] = 1, + [0x000041] = 1, + [0x000042] = 1, + [0x000043] = 1, + [0x000044] = 1, + [0x000045] = 1, + [0x000046] = 1, + [0x000061] = 1, + [0x000062] = 1, + [0x000063] = 1, + [0x000064] = 1, + [0x000065] = 1, + [0x000066] = 1, + [0x00ff21] = 1, + [0x00ff22] = 1, + [0x00ff23] = 1, + [0x00ff24] = 1, + [0x00ff25] = 1, + [0x00ff26] = 1, + [0x00ff41] = 1, + [0x00ff42] = 1, + [0x00ff43] = 1, + [0x00ff44] = 1, + [0x00ff45] = 1, + [0x00ff46] = 1, + }, + [0x7a] = { + [0x000000] = 1, + }, + [0x41] = {}, + [0x43] = {}, + [0x44] = {}, + [0x4c] = {}, + [0x50] = {}, + [0x53] = {}, + [0x55] = {}, + [0x57] = {}, + [0x58] = {}, + [0x5a] = {}, +} +setmetatable( pats[0x61], { __index = function ( t, k ) + local c = tonumber( k ) or 0/0; + return pats[0x6c][k] or + pats[0x75][k] or + c >= 0x0002b0 and c < 0x0002c2 or + c >= 0x0002c6 and c < 0x0002d2 or + c >= 0x0005d0 and c < 0x0005eb or + c >= 0x000620 and c < 0x00064b or + c >= 0x000671 and c < 0x0006d4 or + c >= 0x000712 and c < 0x000730 or + c >= 0x00074d and c < 0x0007a6 or + c >= 0x0007ca and c < 0x0007eb or + c >= 0x000800 and c < 0x000816 or + c >= 0x000840 and c < 0x000859 or + c >= 0x0008a2 and c < 0x0008ad or + c >= 0x000904 and c < 0x00093a or + c >= 0x000958 and c < 0x000962 or + c >= 0x000993 and c < 0x0009a9 or + c >= 0x000a13 and c < 0x000a29 or + c >= 0x000a93 and c < 0x000aa9 or + c >= 0x000b13 and c < 0x000b29 or + c >= 0x000bae and c < 0x000bba or + c >= 0x000c12 and c < 0x000c29 or + c >= 0x000c2a and c < 0x000c34 or + c >= 0x000c92 and c < 0x000ca9 or + c >= 0x000caa and c < 0x000cb4 or + c >= 0x000d12 and c < 0x000d3b or + c >= 0x000d85 and c < 0x000d97 or + c >= 0x000d9a and c < 0x000db2 or + c >= 0x000e01 and c < 0x000e31 or + c >= 0x000f49 and c < 0x000f6d or + c >= 0x001000 and c < 0x00102b or + c >= 0x001075 and c < 0x001082 or + c >= 0x0010d0 and c < 0x0010fb or + c >= 0x0010fc and c < 0x001249 or + c >= 0x001260 and c < 0x001289 or + c >= 0x001290 and c < 0x0012b1 or + c >= 0x0012c8 and c < 0x0012d7 or + c >= 0x0012d8 and c < 0x001311 or + c >= 0x001318 and c < 0x00135b or + c >= 0x001380 and c < 0x001390 or + c >= 0x0013a0 and c < 0x0013f5 or + c >= 0x001401 and c < 0x00166d or + c >= 0x00166f and c < 0x001680 or + c >= 0x001681 and c < 0x00169b or + c >= 0x0016a0 and c < 0x0016eb or + c >= 0x001700 and c < 0x00170d or + c >= 0x001720 and c < 0x001732 or + c >= 0x001740 and c < 0x001752 or + c >= 0x001760 and c < 0x00176d or + c >= 0x001780 and c < 0x0017b4 or + c >= 0x001820 and c < 0x001878 or + c >= 0x001880 and c < 0x0018a9 or + c >= 0x0018b0 and c < 0x0018f6 or + c >= 0x001900 and c < 0x00191d or + c >= 0x001950 and c < 0x00196e or + c >= 0x001980 and c < 0x0019ac or + c >= 0x001a00 and c < 0x001a17 or + c >= 0x001a20 and c < 0x001a55 or + c >= 0x001b05 and c < 0x001b34 or + c >= 0x001b83 and c < 0x001ba1 or + c >= 0x001bba and c < 0x001be6 or + c >= 0x001c00 and c < 0x001c24 or + c >= 0x001c5a and c < 0x001c7e or + c >= 0x001d2c and c < 0x001d6b or + c >= 0x001d9b and c < 0x001dc0 or + c >= 0x002090 and c < 0x00209d or + c >= 0x002d30 and c < 0x002d68 or + c >= 0x002d80 and c < 0x002d97 or + c >= 0x003041 and c < 0x003097 or + c >= 0x0030a1 and c < 0x0030fb or + c >= 0x003105 and c < 0x00312e or + c >= 0x003131 and c < 0x00318f or + c >= 0x0031a0 and c < 0x0031bb or + c >= 0x0031f0 and c < 0x003200 or + c >= 0x003400 and c < 0x004db6 or + c >= 0x004e00 and c < 0x009fcd or + c >= 0x00a000 and c < 0x00a48d or + c >= 0x00a4d0 and c < 0x00a4fe or + c >= 0x00a500 and c < 0x00a60d or + c >= 0x00a610 and c < 0x00a620 or + c >= 0x00a6a0 and c < 0x00a6e6 or + c >= 0x00a80c and c < 0x00a823 or + c >= 0x00a840 and c < 0x00a874 or + c >= 0x00a882 and c < 0x00a8b4 or + c >= 0x00a90a and c < 0x00a926 or + c >= 0x00a930 and c < 0x00a947 or + c >= 0x00a960 and c < 0x00a97d or + c >= 0x00a984 and c < 0x00a9b3 or + c >= 0x00aa00 and c < 0x00aa29 or + c >= 0x00aa60 and c < 0x00aa77 or + c >= 0x00aa80 and c < 0x00aab0 or + c >= 0x00aae0 and c < 0x00aaeb or + c >= 0x00abc0 and c < 0x00abe3 or + c >= 0x00ac00 and c < 0x00d7a4 or + c >= 0x00d7b0 and c < 0x00d7c7 or + c >= 0x00d7cb and c < 0x00d7fc or + c >= 0x00f900 and c < 0x00fa6e or + c >= 0x00fa70 and c < 0x00fada or + c >= 0x00fb1f and c < 0x00fb29 or + c >= 0x00fb2a and c < 0x00fb37 or + c >= 0x00fb46 and c < 0x00fbb2 or + c >= 0x00fbd3 and c < 0x00fd3e or + c >= 0x00fd50 and c < 0x00fd90 or + c >= 0x00fd92 and c < 0x00fdc8 or + c >= 0x00fdf0 and c < 0x00fdfc or + c >= 0x00fe76 and c < 0x00fefd or + c >= 0x00ff66 and c < 0x00ffbf or + c >= 0x010000 and c < 0x01000c or + c >= 0x01000d and c < 0x010027 or + c >= 0x010028 and c < 0x01003b or + c >= 0x01003f and c < 0x01004e or + c >= 0x010050 and c < 0x01005e or + c >= 0x010080 and c < 0x0100fb or + c >= 0x010280 and c < 0x01029d or + c >= 0x0102a0 and c < 0x0102d1 or + c >= 0x010300 and c < 0x01031f or + c >= 0x010330 and c < 0x010341 or + c >= 0x010380 and c < 0x01039e or + c >= 0x0103a0 and c < 0x0103c4 or + c >= 0x010450 and c < 0x01049e or + c >= 0x01080a and c < 0x010836 or + c >= 0x01083f and c < 0x010856 or + c >= 0x010900 and c < 0x010916 or + c >= 0x010920 and c < 0x01093a or + c >= 0x010980 and c < 0x0109b8 or + c >= 0x010a19 and c < 0x010a34 or + c >= 0x010a60 and c < 0x010a7d or + c >= 0x010b00 and c < 0x010b36 or + c >= 0x010b40 and c < 0x010b56 or + c >= 0x010b60 and c < 0x010b73 or + c >= 0x010c00 and c < 0x010c49 or + c >= 0x011003 and c < 0x011038 or + c >= 0x011083 and c < 0x0110b0 or + c >= 0x0110d0 and c < 0x0110e9 or + c >= 0x011103 and c < 0x011127 or + c >= 0x011183 and c < 0x0111b3 or + c >= 0x011680 and c < 0x0116ab or + c >= 0x012000 and c < 0x01236f or + c >= 0x013000 and c < 0x01342f or + c >= 0x016800 and c < 0x016a39 or + c >= 0x016f00 and c < 0x016f45 or + c >= 0x016f93 and c < 0x016fa0 or + c >= 0x01ee05 and c < 0x01ee20 or + c >= 0x01ee29 and c < 0x01ee33 or + c >= 0x01ee80 and c < 0x01ee8a or + c >= 0x01ee8b and c < 0x01ee9c or + c >= 0x01eeab and c < 0x01eebc or + c >= 0x020000 and c < 0x02a6d7 or + c >= 0x02a700 and c < 0x02b735 or + c >= 0x02b740 and c < 0x02b81e or + c >= 0x02f800 and c < 0x02fa1e +end } ) +setmetatable( pats[0x63], { __index = function ( t, k ) + local c = tonumber( k ) or 0/0; + return c >= 0x000000 and c < 0x000020 or + c >= 0x00007f and c < 0x0000a0 +end } ) +setmetatable( pats[0x64], { __index = function ( t, k ) + local c = tonumber( k ) or 0/0; + return c >= 0x000660 and c < 0x00066a or + c >= 0x0006f0 and c < 0x0006fa or + c >= 0x0007c0 and c < 0x0007ca or + c >= 0x000966 and c < 0x000970 or + c >= 0x0009e6 and c < 0x0009f0 or + c >= 0x000a66 and c < 0x000a70 or + c >= 0x000ae6 and c < 0x000af0 or + c >= 0x000b66 and c < 0x000b70 or + c >= 0x000be6 and c < 0x000bf0 or + c >= 0x000c66 and c < 0x000c70 or + c >= 0x000ce6 and c < 0x000cf0 or + c >= 0x000d66 and c < 0x000d70 or + c >= 0x000e50 and c < 0x000e5a or + c >= 0x000ed0 and c < 0x000eda or + c >= 0x000f20 and c < 0x000f2a or + c >= 0x001040 and c < 0x00104a or + c >= 0x001090 and c < 0x00109a or + c >= 0x0017e0 and c < 0x0017ea or + c >= 0x001810 and c < 0x00181a or + c >= 0x001946 and c < 0x001950 or + c >= 0x0019d0 and c < 0x0019da or + c >= 0x001a80 and c < 0x001a8a or + c >= 0x001a90 and c < 0x001a9a or + c >= 0x001b50 and c < 0x001b5a or + c >= 0x001bb0 and c < 0x001bba or + c >= 0x001c40 and c < 0x001c4a or + c >= 0x001c50 and c < 0x001c5a or + c >= 0x00a620 and c < 0x00a62a or + c >= 0x00a8d0 and c < 0x00a8da or + c >= 0x00a900 and c < 0x00a90a or + c >= 0x00a9d0 and c < 0x00a9da or + c >= 0x00aa50 and c < 0x00aa5a or + c >= 0x00abf0 and c < 0x00abfa or + c >= 0x00ff10 and c < 0x00ff1a or + c >= 0x0104a0 and c < 0x0104aa or + c >= 0x011066 and c < 0x011070 or + c >= 0x0110f0 and c < 0x0110fa or + c >= 0x011136 and c < 0x011140 or + c >= 0x0111d0 and c < 0x0111da or + c >= 0x0116c0 and c < 0x0116ca or + c >= 0x01d7ce and c < 0x01d800 +end } ) +setmetatable( pats[0x6c], { __index = function ( t, k ) + local c = tonumber( k ) or 0/0; + return c >= 0x0000df and c < 0x0000f7 or + c >= 0x00024f and c < 0x000294 or + c >= 0x000295 and c < 0x0002b0 or + c >= 0x0003ac and c < 0x0003cf or + c >= 0x000430 and c < 0x000460 or + c >= 0x000561 and c < 0x000588 or + c >= 0x001d00 and c < 0x001d2c or + c >= 0x001d6b and c < 0x001d78 or + c >= 0x001d79 and c < 0x001d9b or + c >= 0x001f70 and c < 0x001f7e or + c >= 0x002c30 and c < 0x002c5f or + c >= 0x002d00 and c < 0x002d26 or + c >= 0x00ff41 and c < 0x00ff5b or + c >= 0x010428 and c < 0x010450 or + c >= 0x01d41a and c < 0x01d434 or + c >= 0x01d456 and c < 0x01d468 or + c >= 0x01d482 and c < 0x01d49c or + c >= 0x01d4c5 and c < 0x01d4d0 or + c >= 0x01d4ea and c < 0x01d504 or + c >= 0x01d51e and c < 0x01d538 or + c >= 0x01d552 and c < 0x01d56c or + c >= 0x01d586 and c < 0x01d5a0 or + c >= 0x01d5ba and c < 0x01d5d4 or + c >= 0x01d5ee and c < 0x01d608 or + c >= 0x01d622 and c < 0x01d63c or + c >= 0x01d656 and c < 0x01d670 or + c >= 0x01d68a and c < 0x01d6a6 or + c >= 0x01d6c2 and c < 0x01d6db or + c >= 0x01d6fc and c < 0x01d715 or + c >= 0x01d736 and c < 0x01d74f or + c >= 0x01d770 and c < 0x01d789 or + c >= 0x01d7aa and c < 0x01d7c3 +end } ) +setmetatable( pats[0x70], { __index = function ( t, k ) + local c = tonumber( k ) or 0/0; + return c >= 0x000700 and c < 0x00070e or + c >= 0x000830 and c < 0x00083f or + c >= 0x000f04 and c < 0x000f13 or + c >= 0x001800 and c < 0x00180b or + c >= 0x002010 and c < 0x002028 or + c >= 0x002030 and c < 0x002044 or + c >= 0x002045 and c < 0x002052 or + c >= 0x002053 and c < 0x00205f or + c >= 0x002768 and c < 0x002776 or + c >= 0x0027e6 and c < 0x0027f0 or + c >= 0x002983 and c < 0x002999 or + c >= 0x002e00 and c < 0x002e2f or + c >= 0x002e30 and c < 0x002e3c or + c >= 0x003008 and c < 0x003012 or + c >= 0x003014 and c < 0x003020 or + c >= 0x00a9c1 and c < 0x00a9ce or + c >= 0x00fe10 and c < 0x00fe1a or + c >= 0x00fe30 and c < 0x00fe53 or + c >= 0x00fe54 and c < 0x00fe62 +end } ) +setmetatable( pats[0x73], { __index = function ( t, k ) + local c = tonumber( k ) or 0/0; + return c >= 0x002000 and c < 0x00200b +end } ) +setmetatable( pats[0x75], { __index = function ( t, k ) + local c = tonumber( k ) or 0/0; + return c >= 0x0000c0 and c < 0x0000d7 or + c >= 0x000391 and c < 0x0003a2 or + c >= 0x0003fd and c < 0x000430 or + c >= 0x000531 and c < 0x000557 or + c >= 0x0010a0 and c < 0x0010c6 or + c >= 0x002c00 and c < 0x002c2f or + c >= 0x00ff21 and c < 0x00ff3b or + c >= 0x010400 and c < 0x010428 or + c >= 0x01d400 and c < 0x01d41a or + c >= 0x01d434 and c < 0x01d44e or + c >= 0x01d468 and c < 0x01d482 or + c >= 0x01d4d0 and c < 0x01d4ea or + c >= 0x01d56c and c < 0x01d586 or + c >= 0x01d5a0 and c < 0x01d5ba or + c >= 0x01d5d4 and c < 0x01d5ee or + c >= 0x01d608 and c < 0x01d622 or + c >= 0x01d63c and c < 0x01d656 or + c >= 0x01d670 and c < 0x01d68a or + c >= 0x01d6a8 and c < 0x01d6c1 or + c >= 0x01d6e2 and c < 0x01d6fb or + c >= 0x01d71c and c < 0x01d735 or + c >= 0x01d756 and c < 0x01d76f or + c >= 0x01d790 and c < 0x01d7a9 +end } ) +setmetatable( pats[0x77], { __index = function ( t, k ) + return pats[0x64][k] or + pats[0x61][k] +end } ) +setmetatable( pats[0x78], { __index = function ( t, k ) + local c = tonumber( k ) or 0/0; + return c >= 0x00ff10 and c < 0x00ff1a +end } ) +setmetatable( pats[0x41], { __index = function ( t, k ) return k and not pats[0x61][k] end } ) +setmetatable( pats[0x43], { __index = function ( t, k ) return k and not pats[0x63][k] end } ) +setmetatable( pats[0x44], { __index = function ( t, k ) return k and not pats[0x64][k] end } ) +setmetatable( pats[0x4c], { __index = function ( t, k ) return k and not pats[0x6c][k] end } ) +setmetatable( pats[0x50], { __index = function ( t, k ) return k and not pats[0x70][k] end } ) +setmetatable( pats[0x53], { __index = function ( t, k ) return k and not pats[0x73][k] end } ) +setmetatable( pats[0x55], { __index = function ( t, k ) return k and not pats[0x75][k] end } ) +setmetatable( pats[0x57], { __index = function ( t, k ) return k and not pats[0x77][k] end } ) +setmetatable( pats[0x58], { __index = function ( t, k ) return k and not pats[0x78][k] end } ) +setmetatable( pats[0x5a], { __index = function ( t, k ) return k and not pats[0x7a][k] end } ) + +-- For speed, cache printable ASCII characters in main tables +for k, t in pairs( pats ) do + if k >= 0x61 then + for i = 0x20, 0x7e do + t[i] = t[i] or false + end + end +end + +return pats diff --git a/ustring/lower.lua b/ustring/lower.lua new file mode 100644 index 0000000..c5678d3 --- /dev/null +++ b/ustring/lower.lua @@ -0,0 +1,679 @@ +-- This file is automatically generated by make-tables.php +return { + ["A"] = "a", + ["B"] = "b", + ["C"] = "c", + ["D"] = "d", + ["E"] = "e", + ["F"] = "f", + ["G"] = "g", + ["H"] = "h", + ["I"] = "i", + ["J"] = "j", + ["K"] = "k", + ["L"] = "l", + ["M"] = "m", + ["N"] = "n", + ["O"] = "o", + ["P"] = "p", + ["Q"] = "q", + ["R"] = "r", + ["S"] = "s", + ["T"] = "t", + ["U"] = "u", + ["V"] = "v", + ["W"] = "w", + ["X"] = "x", + ["Y"] = "y", + ["Z"] = "z", + ["À"] = "à", + ["Á"] = "á", + ["Â"] = "â", + ["Ã"] = "ã", + ["Ä"] = "ä", + ["Å"] = "å", + ["Æ"] = "æ", + ["Ç"] = "ç", + ["È"] = "è", + ["É"] = "é", + ["Ê"] = "ê", + ["Ë"] = "ë", + ["Ì"] = "ì", + ["Í"] = "í", + ["Î"] = "î", + ["Ï"] = "ï", + ["Ð"] = "ð", + ["Ñ"] = "ñ", + ["Ò"] = "ò", + ["Ó"] = "ó", + ["Ô"] = "ô", + ["Õ"] = "õ", + ["Ö"] = "ö", + ["Ø"] = "ø", + ["Ù"] = "ù", + ["Ú"] = "ú", + ["Û"] = "û", + ["Ü"] = "ü", + ["Ý"] = "ý", + ["Þ"] = "þ", + ["Ā"] = "ā", + ["Ă"] = "ă", + ["Ą"] = "ą", + ["Ć"] = "ć", + ["Ĉ"] = "ĉ", + ["Ċ"] = "ċ", + ["Č"] = "č", + ["Ď"] = "ď", + ["Đ"] = "đ", + ["Ē"] = "ē", + ["Ĕ"] = "ĕ", + ["Ė"] = "ė", + ["Ę"] = "ę", + ["Ě"] = "ě", + ["Ĝ"] = "ĝ", + ["Ğ"] = "ğ", + ["Ġ"] = "ġ", + ["Ģ"] = "ģ", + ["Ĥ"] = "ĥ", + ["Ħ"] = "ħ", + ["Ĩ"] = "ĩ", + ["Ī"] = "ī", + ["Ĭ"] = "ĭ", + ["Į"] = "į", + ["İ"] = "i", + ["IJ"] = "ij", + ["Ĵ"] = "ĵ", + ["Ķ"] = "ķ", + ["Ĺ"] = "ĺ", + ["Ļ"] = "ļ", + ["Ľ"] = "ľ", + ["Ŀ"] = "ŀ", + ["Ł"] = "ł", + ["Ń"] = "ń", + ["Ņ"] = "ņ", + ["Ň"] = "ň", + ["Ŋ"] = "ŋ", + ["Ō"] = "ō", + ["Ŏ"] = "ŏ", + ["Ő"] = "ő", + ["Œ"] = "œ", + ["Ŕ"] = "ŕ", + ["Ŗ"] = "ŗ", + ["Ř"] = "ř", + ["Ś"] = "ś", + ["Ŝ"] = "ŝ", + ["Ş"] = "ş", + ["Š"] = "š", + ["Ţ"] = "ţ", + ["Ť"] = "ť", + ["Ŧ"] = "ŧ", + ["Ũ"] = "ũ", + ["Ū"] = "ū", + ["Ŭ"] = "ŭ", + ["Ů"] = "ů", + ["Ű"] = "ű", + ["Ų"] = "ų", + ["Ŵ"] = "ŵ", + ["Ŷ"] = "ŷ", + ["Ÿ"] = "ÿ", + ["Ź"] = "ź", + ["Ż"] = "ż", + ["Ž"] = "ž", + ["Ɓ"] = "ɓ", + ["Ƃ"] = "ƃ", + ["Ƅ"] = "ƅ", + ["Ɔ"] = "ɔ", + ["Ƈ"] = "ƈ", + ["Ɖ"] = "ɖ", + ["Ɗ"] = "ɗ", + ["Ƌ"] = "ƌ", + ["Ǝ"] = "ǝ", + ["Ə"] = "ə", + ["Ɛ"] = "ɛ", + ["Ƒ"] = "ƒ", + ["Ɠ"] = "ɠ", + ["Ɣ"] = "ɣ", + ["Ɩ"] = "ɩ", + ["Ɨ"] = "ɨ", + ["Ƙ"] = "ƙ", + ["Ɯ"] = "ɯ", + ["Ɲ"] = "ɲ", + ["Ɵ"] = "ɵ", + ["Ơ"] = "ơ", + ["Ƣ"] = "ƣ", + ["Ƥ"] = "ƥ", + ["Ʀ"] = "ʀ", + ["Ƨ"] = "ƨ", + ["Ʃ"] = "ʃ", + ["Ƭ"] = "ƭ", + ["Ʈ"] = "ʈ", + ["Ư"] = "ư", + ["Ʊ"] = "ʊ", + ["Ʋ"] = "ʋ", + ["Ƴ"] = "ƴ", + ["Ƶ"] = "ƶ", + ["Ʒ"] = "ʒ", + ["Ƹ"] = "ƹ", + ["Ƽ"] = "ƽ", + ["DŽ"] = "dž", + ["LJ"] = "lj", + ["NJ"] = "nj", + ["Ǎ"] = "ǎ", + ["Ǐ"] = "ǐ", + ["Ǒ"] = "ǒ", + ["Ǔ"] = "ǔ", + ["Ǖ"] = "ǖ", + ["Ǘ"] = "ǘ", + ["Ǚ"] = "ǚ", + ["Ǜ"] = "ǜ", + ["Ǟ"] = "ǟ", + ["Ǡ"] = "ǡ", + ["Ǣ"] = "ǣ", + ["Ǥ"] = "ǥ", + ["Ǧ"] = "ǧ", + ["Ǩ"] = "ǩ", + ["Ǫ"] = "ǫ", + ["Ǭ"] = "ǭ", + ["Ǯ"] = "ǯ", + ["DZ"] = "dz", + ["Ǵ"] = "ǵ", + ["Ƕ"] = "ƕ", + ["Ƿ"] = "ƿ", + ["Ǹ"] = "ǹ", + ["Ǻ"] = "ǻ", + ["Ǽ"] = "ǽ", + ["Ǿ"] = "ǿ", + ["Ȁ"] = "ȁ", + ["Ȃ"] = "ȃ", + ["Ȅ"] = "ȅ", + ["Ȇ"] = "ȇ", + ["Ȉ"] = "ȉ", + ["Ȋ"] = "ȋ", + ["Ȍ"] = "ȍ", + ["Ȏ"] = "ȏ", + ["Ȑ"] = "ȑ", + ["Ȓ"] = "ȓ", + ["Ȕ"] = "ȕ", + ["Ȗ"] = "ȗ", + ["Ș"] = "ș", + ["Ț"] = "ț", + ["Ȝ"] = "ȝ", + ["Ȟ"] = "ȟ", + ["Ƞ"] = "ƞ", + ["Ȣ"] = "ȣ", + ["Ȥ"] = "ȥ", + ["Ȧ"] = "ȧ", + ["Ȩ"] = "ȩ", + ["Ȫ"] = "ȫ", + ["Ȭ"] = "ȭ", + ["Ȯ"] = "ȯ", + ["Ȱ"] = "ȱ", + ["Ȳ"] = "ȳ", + ["Ά"] = "ά", + ["Έ"] = "έ", + ["Ή"] = "ή", + ["Ί"] = "ί", + ["Ό"] = "ό", + ["Ύ"] = "ύ", + ["Ώ"] = "ώ", + ["Α"] = "α", + ["Β"] = "β", + ["Γ"] = "γ", + ["Δ"] = "δ", + ["Ε"] = "ε", + ["Ζ"] = "ζ", + ["Η"] = "η", + ["Θ"] = "θ", + ["Ι"] = "ι", + ["Κ"] = "κ", + ["Λ"] = "λ", + ["Μ"] = "μ", + ["Ν"] = "ν", + ["Ξ"] = "ξ", + ["Ο"] = "ο", + ["Π"] = "π", + ["Ρ"] = "ρ", + ["Σ"] = "σ", + ["Τ"] = "τ", + ["Υ"] = "υ", + ["Φ"] = "φ", + ["Χ"] = "χ", + ["Ψ"] = "ψ", + ["Ω"] = "ω", + ["Ϊ"] = "ϊ", + ["Ϋ"] = "ϋ", + ["Ϙ"] = "ϙ", + ["Ϛ"] = "ϛ", + ["Ϝ"] = "ϝ", + ["Ϟ"] = "ϟ", + ["Ϡ"] = "ϡ", + ["Ϣ"] = "ϣ", + ["Ϥ"] = "ϥ", + ["Ϧ"] = "ϧ", + ["Ϩ"] = "ϩ", + ["Ϫ"] = "ϫ", + ["Ϭ"] = "ϭ", + ["Ϯ"] = "ϯ", + ["ϴ"] = "θ", + ["Ѐ"] = "ѐ", + ["Ё"] = "ё", + ["Ђ"] = "ђ", + ["Ѓ"] = "ѓ", + ["Є"] = "є", + ["Ѕ"] = "ѕ", + ["І"] = "і", + ["Ї"] = "ї", + ["Ј"] = "ј", + ["Љ"] = "љ", + ["Њ"] = "њ", + ["Ћ"] = "ћ", + ["Ќ"] = "ќ", + ["Ѝ"] = "ѝ", + ["Ў"] = "ў", + ["Џ"] = "џ", + ["А"] = "а", + ["Б"] = "б", + ["В"] = "в", + ["Г"] = "г", + ["Д"] = "д", + ["Е"] = "е", + ["Ж"] = "ж", + ["З"] = "з", + ["И"] = "и", + ["Й"] = "й", + ["К"] = "к", + ["Л"] = "л", + ["М"] = "м", + ["Н"] = "н", + ["О"] = "о", + ["П"] = "п", + ["Р"] = "р", + ["С"] = "с", + ["Т"] = "т", + ["У"] = "у", + ["Ф"] = "ф", + ["Х"] = "х", + ["Ц"] = "ц", + ["Ч"] = "ч", + ["Ш"] = "ш", + ["Щ"] = "щ", + ["Ъ"] = "ъ", + ["Ы"] = "ы", + ["Ь"] = "ь", + ["Э"] = "э", + ["Ю"] = "ю", + ["Я"] = "я", + ["Ѡ"] = "ѡ", + ["Ѣ"] = "ѣ", + ["Ѥ"] = "ѥ", + ["Ѧ"] = "ѧ", + ["Ѩ"] = "ѩ", + ["Ѫ"] = "ѫ", + ["Ѭ"] = "ѭ", + ["Ѯ"] = "ѯ", + ["Ѱ"] = "ѱ", + ["Ѳ"] = "ѳ", + ["Ѵ"] = "ѵ", + ["Ѷ"] = "ѷ", + ["Ѹ"] = "ѹ", + ["Ѻ"] = "ѻ", + ["Ѽ"] = "ѽ", + ["Ѿ"] = "ѿ", + ["Ҁ"] = "ҁ", + ["Ҋ"] = "ҋ", + ["Ҍ"] = "ҍ", + ["Ҏ"] = "ҏ", + ["Ґ"] = "ґ", + ["Ғ"] = "ғ", + ["Ҕ"] = "ҕ", + ["Җ"] = "җ", + ["Ҙ"] = "ҙ", + ["Қ"] = "қ", + ["Ҝ"] = "ҝ", + ["Ҟ"] = "ҟ", + ["Ҡ"] = "ҡ", + ["Ң"] = "ң", + ["Ҥ"] = "ҥ", + ["Ҧ"] = "ҧ", + ["Ҩ"] = "ҩ", + ["Ҫ"] = "ҫ", + ["Ҭ"] = "ҭ", + ["Ү"] = "ү", + ["Ұ"] = "ұ", + ["Ҳ"] = "ҳ", + ["Ҵ"] = "ҵ", + ["Ҷ"] = "ҷ", + ["Ҹ"] = "ҹ", + ["Һ"] = "һ", + ["Ҽ"] = "ҽ", + ["Ҿ"] = "ҿ", + ["Ӂ"] = "ӂ", + ["Ӄ"] = "ӄ", + ["Ӆ"] = "ӆ", + ["Ӈ"] = "ӈ", + ["Ӊ"] = "ӊ", + ["Ӌ"] = "ӌ", + ["Ӎ"] = "ӎ", + ["Ӑ"] = "ӑ", + ["Ӓ"] = "ӓ", + ["Ӕ"] = "ӕ", + ["Ӗ"] = "ӗ", + ["Ә"] = "ә", + ["Ӛ"] = "ӛ", + ["Ӝ"] = "ӝ", + ["Ӟ"] = "ӟ", + ["Ӡ"] = "ӡ", + ["Ӣ"] = "ӣ", + ["Ӥ"] = "ӥ", + ["Ӧ"] = "ӧ", + ["Ө"] = "ө", + ["Ӫ"] = "ӫ", + ["Ӭ"] = "ӭ", + ["Ӯ"] = "ӯ", + ["Ӱ"] = "ӱ", + ["Ӳ"] = "ӳ", + ["Ӵ"] = "ӵ", + ["Ӹ"] = "ӹ", + ["Ԁ"] = "ԁ", + ["Ԃ"] = "ԃ", + ["Ԅ"] = "ԅ", + ["Ԇ"] = "ԇ", + ["Ԉ"] = "ԉ", + ["Ԋ"] = "ԋ", + ["Ԍ"] = "ԍ", + ["Ԏ"] = "ԏ", + ["Ա"] = "ա", + ["Բ"] = "բ", + ["Գ"] = "գ", + ["Դ"] = "դ", + ["Ե"] = "ե", + ["Զ"] = "զ", + ["Է"] = "է", + ["Ը"] = "ը", + ["Թ"] = "թ", + ["Ժ"] = "ժ", + ["Ի"] = "ի", + ["Լ"] = "լ", + ["Խ"] = "խ", + ["Ծ"] = "ծ", + ["Կ"] = "կ", + ["Հ"] = "հ", + ["Ձ"] = "ձ", + ["Ղ"] = "ղ", + ["Ճ"] = "ճ", + ["Մ"] = "մ", + ["Յ"] = "յ", + ["Ն"] = "ն", + ["Շ"] = "շ", + ["Ո"] = "ո", + ["Չ"] = "չ", + ["Պ"] = "պ", + ["Ջ"] = "ջ", + ["Ռ"] = "ռ", + ["Ս"] = "ս", + ["Վ"] = "վ", + ["Տ"] = "տ", + ["Ր"] = "ր", + ["Ց"] = "ց", + ["Ւ"] = "ւ", + ["Փ"] = "փ", + ["Ք"] = "ք", + ["Օ"] = "օ", + ["Ֆ"] = "ֆ", + ["Ḁ"] = "ḁ", + ["Ḃ"] = "ḃ", + ["Ḅ"] = "ḅ", + ["Ḇ"] = "ḇ", + ["Ḉ"] = "ḉ", + ["Ḋ"] = "ḋ", + ["Ḍ"] = "ḍ", + ["Ḏ"] = "ḏ", + ["Ḑ"] = "ḑ", + ["Ḓ"] = "ḓ", + ["Ḕ"] = "ḕ", + ["Ḗ"] = "ḗ", + ["Ḙ"] = "ḙ", + ["Ḛ"] = "ḛ", + ["Ḝ"] = "ḝ", + ["Ḟ"] = "ḟ", + ["Ḡ"] = "ḡ", + ["Ḣ"] = "ḣ", + ["Ḥ"] = "ḥ", + ["Ḧ"] = "ḧ", + ["Ḩ"] = "ḩ", + ["Ḫ"] = "ḫ", + ["Ḭ"] = "ḭ", + ["Ḯ"] = "ḯ", + ["Ḱ"] = "ḱ", + ["Ḳ"] = "ḳ", + ["Ḵ"] = "ḵ", + ["Ḷ"] = "ḷ", + ["Ḹ"] = "ḹ", + ["Ḻ"] = "ḻ", + ["Ḽ"] = "ḽ", + ["Ḿ"] = "ḿ", + ["Ṁ"] = "ṁ", + ["Ṃ"] = "ṃ", + ["Ṅ"] = "ṅ", + ["Ṇ"] = "ṇ", + ["Ṉ"] = "ṉ", + ["Ṋ"] = "ṋ", + ["Ṍ"] = "ṍ", + ["Ṏ"] = "ṏ", + ["Ṑ"] = "ṑ", + ["Ṓ"] = "ṓ", + ["Ṕ"] = "ṕ", + ["Ṗ"] = "ṗ", + ["Ṙ"] = "ṙ", + ["Ṛ"] = "ṛ", + ["Ṝ"] = "ṝ", + ["Ṟ"] = "ṟ", + ["Ṡ"] = "ṡ", + ["Ṣ"] = "ṣ", + ["Ṥ"] = "ṥ", + ["Ṧ"] = "ṧ", + ["Ṩ"] = "ṩ", + ["Ṫ"] = "ṫ", + ["Ṭ"] = "ṭ", + ["Ṯ"] = "ṯ", + ["Ṱ"] = "ṱ", + ["Ṳ"] = "ṳ", + ["Ṵ"] = "ṵ", + ["Ṷ"] = "ṷ", + ["Ṹ"] = "ṹ", + ["Ṻ"] = "ṻ", + ["Ṽ"] = "ṽ", + ["Ṿ"] = "ṿ", + ["Ẁ"] = "ẁ", + ["Ẃ"] = "ẃ", + ["Ẅ"] = "ẅ", + ["Ẇ"] = "ẇ", + ["Ẉ"] = "ẉ", + ["Ẋ"] = "ẋ", + ["Ẍ"] = "ẍ", + ["Ẏ"] = "ẏ", + ["Ẑ"] = "ẑ", + ["Ẓ"] = "ẓ", + ["Ẕ"] = "ẕ", + ["Ạ"] = "ạ", + ["Ả"] = "ả", + ["Ấ"] = "ấ", + ["Ầ"] = "ầ", + ["Ẩ"] = "ẩ", + ["Ẫ"] = "ẫ", + ["Ậ"] = "ậ", + ["Ắ"] = "ắ", + ["Ằ"] = "ằ", + ["Ẳ"] = "ẳ", + ["Ẵ"] = "ẵ", + ["Ặ"] = "ặ", + ["Ẹ"] = "ẹ", + ["Ẻ"] = "ẻ", + ["Ẽ"] = "ẽ", + ["Ế"] = "ế", + ["Ề"] = "ề", + ["Ể"] = "ể", + ["Ễ"] = "ễ", + ["Ệ"] = "ệ", + ["Ỉ"] = "ỉ", + ["Ị"] = "ị", + ["Ọ"] = "ọ", + ["Ỏ"] = "ỏ", + ["Ố"] = "ố", + ["Ồ"] = "ồ", + ["Ổ"] = "ổ", + ["Ỗ"] = "ỗ", + ["Ộ"] = "ộ", + ["Ớ"] = "ớ", + ["Ờ"] = "ờ", + ["Ở"] = "ở", + ["Ỡ"] = "ỡ", + ["Ợ"] = "ợ", + ["Ụ"] = "ụ", + ["Ủ"] = "ủ", + ["Ứ"] = "ứ", + ["Ừ"] = "ừ", + ["Ử"] = "ử", + ["Ữ"] = "ữ", + ["Ự"] = "ự", + ["Ỳ"] = "ỳ", + ["Ỵ"] = "ỵ", + ["Ỷ"] = "ỷ", + ["Ỹ"] = "ỹ", + ["Ἀ"] = "ἀ", + ["Ἁ"] = "ἁ", + ["Ἂ"] = "ἂ", + ["Ἃ"] = "ἃ", + ["Ἄ"] = "ἄ", + ["Ἅ"] = "ἅ", + ["Ἆ"] = "ἆ", + ["Ἇ"] = "ἇ", + ["Ἐ"] = "ἐ", + ["Ἑ"] = "ἑ", + ["Ἒ"] = "ἒ", + ["Ἓ"] = "ἓ", + ["Ἔ"] = "ἔ", + ["Ἕ"] = "ἕ", + ["Ἠ"] = "ἠ", + ["Ἡ"] = "ἡ", + ["Ἢ"] = "ἢ", + ["Ἣ"] = "ἣ", + ["Ἤ"] = "ἤ", + ["Ἥ"] = "ἥ", + ["Ἦ"] = "ἦ", + ["Ἧ"] = "ἧ", + ["Ἰ"] = "ἰ", + ["Ἱ"] = "ἱ", + ["Ἲ"] = "ἲ", + ["Ἳ"] = "ἳ", + ["Ἴ"] = "ἴ", + ["Ἵ"] = "ἵ", + ["Ἶ"] = "ἶ", + ["Ἷ"] = "ἷ", + ["Ὀ"] = "ὀ", + ["Ὁ"] = "ὁ", + ["Ὂ"] = "ὂ", + ["Ὃ"] = "ὃ", + ["Ὄ"] = "ὄ", + ["Ὅ"] = "ὅ", + ["Ὑ"] = "ὑ", + ["Ὓ"] = "ὓ", + ["Ὕ"] = "ὕ", + ["Ὗ"] = "ὗ", + ["Ὠ"] = "ὠ", + ["Ὡ"] = "ὡ", + ["Ὢ"] = "ὢ", + ["Ὣ"] = "ὣ", + ["Ὤ"] = "ὤ", + ["Ὥ"] = "ὥ", + ["Ὦ"] = "ὦ", + ["Ὧ"] = "ὧ", + ["Ᾰ"] = "ᾰ", + ["Ᾱ"] = "ᾱ", + ["Ὰ"] = "ὰ", + ["Ά"] = "ά", + ["Ὲ"] = "ὲ", + ["Έ"] = "έ", + ["Ὴ"] = "ὴ", + ["Ή"] = "ή", + ["Ῐ"] = "ῐ", + ["Ῑ"] = "ῑ", + ["Ὶ"] = "ὶ", + ["Ί"] = "ί", + ["Ῠ"] = "ῠ", + ["Ῡ"] = "ῡ", + ["Ὺ"] = "ὺ", + ["Ύ"] = "ύ", + ["Ῥ"] = "ῥ", + ["Ὸ"] = "ὸ", + ["Ό"] = "ό", + ["Ὼ"] = "ὼ", + ["Ώ"] = "ώ", + ["Ω"] = "ω", + ["K"] = "k", + ["Å"] = "å", + ["A"] = "a", + ["B"] = "b", + ["C"] = "c", + ["D"] = "d", + ["E"] = "e", + ["F"] = "f", + ["G"] = "g", + ["H"] = "h", + ["I"] = "i", + ["J"] = "j", + ["K"] = "k", + ["L"] = "l", + ["M"] = "m", + ["N"] = "n", + ["O"] = "o", + ["P"] = "p", + ["Q"] = "q", + ["R"] = "r", + ["S"] = "s", + ["T"] = "t", + ["U"] = "u", + ["V"] = "v", + ["W"] = "w", + ["X"] = "x", + ["Y"] = "y", + ["Z"] = "z", + ["𐐀"] = "𐐨", + ["𐐁"] = "𐐩", + ["𐐂"] = "𐐪", + ["𐐃"] = "𐐫", + ["𐐄"] = "𐐬", + ["𐐅"] = "𐐭", + ["𐐆"] = "𐐮", + ["𐐇"] = "𐐯", + ["𐐈"] = "𐐰", + ["𐐉"] = "𐐱", + ["𐐊"] = "𐐲", + ["𐐋"] = "𐐳", + ["𐐌"] = "𐐴", + ["𐐍"] = "𐐵", + ["𐐎"] = "𐐶", + ["𐐏"] = "𐐷", + ["𐐐"] = "𐐸", + ["𐐑"] = "𐐹", + ["𐐒"] = "𐐺", + ["𐐓"] = "𐐻", + ["𐐔"] = "𐐼", + ["𐐕"] = "𐐽", + ["𐐖"] = "𐐾", + ["𐐗"] = "𐐿", + ["𐐘"] = "𐑀", + ["𐐙"] = "𐑁", + ["𐐚"] = "𐑂", + ["𐐛"] = "𐑃", + ["𐐜"] = "𐑄", + ["𐐝"] = "𐑅", + ["𐐞"] = "𐑆", + ["𐐟"] = "𐑇", + ["𐐠"] = "𐑈", + ["𐐡"] = "𐑉", + ["𐐢"] = "𐑊", + ["𐐣"] = "𐑋", + ["𐐤"] = "𐑌", + ["𐐥"] = "𐑍", +} diff --git a/ustring/normalization-data.lua b/ustring/normalization-data.lua new file mode 100644 index 0000000..5d110c4 --- /dev/null +++ b/ustring/normalization-data.lua @@ -0,0 +1,9450 @@ +-- This file is automatically generated by make-normalization-table.php +local normal = { + -- Characters that might change depending on the following combiner + -- (minus any that are themselves combiners, those are added later) + check = { + [0x000374] = 1, + [0x00037e] = 1, + [0x000387] = 1, + [0x000958] = 1, + [0x000959] = 1, + [0x00095a] = 1, + [0x00095b] = 1, + [0x00095c] = 1, + [0x00095d] = 1, + [0x00095e] = 1, + [0x00095f] = 1, + [0x0009dc] = 1, + [0x0009dd] = 1, + [0x0009df] = 1, + [0x000a33] = 1, + [0x000a36] = 1, + [0x000a59] = 1, + [0x000a5a] = 1, + [0x000a5b] = 1, + [0x000a5e] = 1, + [0x000b5c] = 1, + [0x000b5d] = 1, + [0x000f43] = 1, + [0x000f4d] = 1, + [0x000f52] = 1, + [0x000f57] = 1, + [0x000f5c] = 1, + [0x000f69] = 1, + [0x000f73] = 1, + [0x000f75] = 1, + [0x000f76] = 1, + [0x000f78] = 1, + [0x000f81] = 1, + [0x000f93] = 1, + [0x000f9d] = 1, + [0x000fa2] = 1, + [0x000fa7] = 1, + [0x000fac] = 1, + [0x000fb9] = 1, + [0x001f71] = 1, + [0x001f73] = 1, + [0x001f75] = 1, + [0x001f77] = 1, + [0x001f79] = 1, + [0x001f7b] = 1, + [0x001f7d] = 1, + [0x001fbb] = 1, + [0x001fbe] = 1, + [0x001fc9] = 1, + [0x001fcb] = 1, + [0x001fd3] = 1, + [0x001fdb] = 1, + [0x001fe3] = 1, + [0x001feb] = 1, + [0x001fee] = 1, + [0x001fef] = 1, + [0x001ff9] = 1, + [0x001ffb] = 1, + [0x001ffd] = 1, + [0x002000] = 1, + [0x002001] = 1, + [0x002126] = 1, + [0x00212a] = 1, + [0x00212b] = 1, + [0x002329] = 1, + [0x00232a] = 1, + [0x002adc] = 1, + [0x00f900] = 1, + [0x00f901] = 1, + [0x00f902] = 1, + [0x00f903] = 1, + [0x00f904] = 1, + [0x00f905] = 1, + [0x00f906] = 1, + [0x00f907] = 1, + [0x00f908] = 1, + [0x00f909] = 1, + [0x00f90a] = 1, + [0x00f90b] = 1, + [0x00f90c] = 1, + [0x00f90d] = 1, + [0x00f90e] = 1, + [0x00f90f] = 1, + [0x00f910] = 1, + [0x00f911] = 1, + [0x00f912] = 1, + [0x00f913] = 1, + [0x00f914] = 1, + [0x00f915] = 1, + [0x00f916] = 1, + [0x00f917] = 1, + [0x00f918] = 1, + [0x00f919] = 1, + [0x00f91a] = 1, + [0x00f91b] = 1, + [0x00f91c] = 1, + [0x00f91d] = 1, + [0x00f91e] = 1, + [0x00f91f] = 1, + [0x00f920] = 1, + [0x00f921] = 1, + [0x00f922] = 1, + [0x00f923] = 1, + [0x00f924] = 1, + [0x00f925] = 1, + [0x00f926] = 1, + [0x00f927] = 1, + [0x00f928] = 1, + [0x00f929] = 1, + [0x00f92a] = 1, + [0x00f92b] = 1, + [0x00f92c] = 1, + [0x00f92d] = 1, + [0x00f92e] = 1, + [0x00f92f] = 1, + [0x00f930] = 1, + [0x00f931] = 1, + [0x00f932] = 1, + [0x00f933] = 1, + [0x00f934] = 1, + [0x00f935] = 1, + [0x00f936] = 1, + [0x00f937] = 1, + [0x00f938] = 1, + [0x00f939] = 1, + [0x00f93a] = 1, + [0x00f93b] = 1, + [0x00f93c] = 1, + [0x00f93d] = 1, + [0x00f93e] = 1, + [0x00f93f] = 1, + [0x00f940] = 1, + [0x00f941] = 1, + [0x00f942] = 1, + [0x00f943] = 1, + [0x00f944] = 1, + [0x00f945] = 1, + [0x00f946] = 1, + [0x00f947] = 1, + [0x00f948] = 1, + [0x00f949] = 1, + [0x00f94a] = 1, + [0x00f94b] = 1, + [0x00f94c] = 1, + [0x00f94d] = 1, + [0x00f94e] = 1, + [0x00f94f] = 1, + [0x00f950] = 1, + [0x00f951] = 1, + [0x00f952] = 1, + [0x00f953] = 1, + [0x00f954] = 1, + [0x00f955] = 1, + [0x00f956] = 1, + [0x00f957] = 1, + [0x00f958] = 1, + [0x00f959] = 1, + [0x00f95a] = 1, + [0x00f95b] = 1, + [0x00f95c] = 1, + [0x00f95d] = 1, + [0x00f95e] = 1, + [0x00f95f] = 1, + [0x00f960] = 1, + [0x00f961] = 1, + [0x00f962] = 1, + [0x00f963] = 1, + [0x00f964] = 1, + [0x00f965] = 1, + [0x00f966] = 1, + [0x00f967] = 1, + [0x00f968] = 1, + [0x00f969] = 1, + [0x00f96a] = 1, + [0x00f96b] = 1, + [0x00f96c] = 1, + [0x00f96d] = 1, + [0x00f96e] = 1, + [0x00f96f] = 1, + [0x00f970] = 1, + [0x00f971] = 1, + [0x00f972] = 1, + [0x00f973] = 1, + [0x00f974] = 1, + [0x00f975] = 1, + [0x00f976] = 1, + [0x00f977] = 1, + [0x00f978] = 1, + [0x00f979] = 1, + [0x00f97a] = 1, + [0x00f97b] = 1, + [0x00f97c] = 1, + [0x00f97d] = 1, + [0x00f97e] = 1, + [0x00f97f] = 1, + [0x00f980] = 1, + [0x00f981] = 1, + [0x00f982] = 1, + [0x00f983] = 1, + [0x00f984] = 1, + [0x00f985] = 1, + [0x00f986] = 1, + [0x00f987] = 1, + [0x00f988] = 1, + [0x00f989] = 1, + [0x00f98a] = 1, + [0x00f98b] = 1, + [0x00f98c] = 1, + [0x00f98d] = 1, + [0x00f98e] = 1, + [0x00f98f] = 1, + [0x00f990] = 1, + [0x00f991] = 1, + [0x00f992] = 1, + [0x00f993] = 1, + [0x00f994] = 1, + [0x00f995] = 1, + [0x00f996] = 1, + [0x00f997] = 1, + [0x00f998] = 1, + [0x00f999] = 1, + [0x00f99a] = 1, + [0x00f99b] = 1, + [0x00f99c] = 1, + [0x00f99d] = 1, + [0x00f99e] = 1, + [0x00f99f] = 1, + [0x00f9a0] = 1, + [0x00f9a1] = 1, + [0x00f9a2] = 1, + [0x00f9a3] = 1, + [0x00f9a4] = 1, + [0x00f9a5] = 1, + [0x00f9a6] = 1, + [0x00f9a7] = 1, + [0x00f9a8] = 1, + [0x00f9a9] = 1, + [0x00f9aa] = 1, + [0x00f9ab] = 1, + [0x00f9ac] = 1, + [0x00f9ad] = 1, + [0x00f9ae] = 1, + [0x00f9af] = 1, + [0x00f9b0] = 1, + [0x00f9b1] = 1, + [0x00f9b2] = 1, + [0x00f9b3] = 1, + [0x00f9b4] = 1, + [0x00f9b5] = 1, + [0x00f9b6] = 1, + [0x00f9b7] = 1, + [0x00f9b8] = 1, + [0x00f9b9] = 1, + [0x00f9ba] = 1, + [0x00f9bb] = 1, + [0x00f9bc] = 1, + [0x00f9bd] = 1, + [0x00f9be] = 1, + [0x00f9bf] = 1, + [0x00f9c0] = 1, + [0x00f9c1] = 1, + [0x00f9c2] = 1, + [0x00f9c3] = 1, + [0x00f9c4] = 1, + [0x00f9c5] = 1, + [0x00f9c6] = 1, + [0x00f9c7] = 1, + [0x00f9c8] = 1, + [0x00f9c9] = 1, + [0x00f9ca] = 1, + [0x00f9cb] = 1, + [0x00f9cc] = 1, + [0x00f9cd] = 1, + [0x00f9ce] = 1, + [0x00f9cf] = 1, + [0x00f9d0] = 1, + [0x00f9d1] = 1, + [0x00f9d2] = 1, + [0x00f9d3] = 1, + [0x00f9d4] = 1, + [0x00f9d5] = 1, + [0x00f9d6] = 1, + [0x00f9d7] = 1, + [0x00f9d8] = 1, + [0x00f9d9] = 1, + [0x00f9da] = 1, + [0x00f9db] = 1, + [0x00f9dc] = 1, + [0x00f9dd] = 1, + [0x00f9de] = 1, + [0x00f9df] = 1, + [0x00f9e0] = 1, + [0x00f9e1] = 1, + [0x00f9e2] = 1, + [0x00f9e3] = 1, + [0x00f9e4] = 1, + [0x00f9e5] = 1, + [0x00f9e6] = 1, + [0x00f9e7] = 1, + [0x00f9e8] = 1, + [0x00f9e9] = 1, + [0x00f9ea] = 1, + [0x00f9eb] = 1, + [0x00f9ec] = 1, + [0x00f9ed] = 1, + [0x00f9ee] = 1, + [0x00f9ef] = 1, + [0x00f9f0] = 1, + [0x00f9f1] = 1, + [0x00f9f2] = 1, + [0x00f9f3] = 1, + [0x00f9f4] = 1, + [0x00f9f5] = 1, + [0x00f9f6] = 1, + [0x00f9f7] = 1, + [0x00f9f8] = 1, + [0x00f9f9] = 1, + [0x00f9fa] = 1, + [0x00f9fb] = 1, + [0x00f9fc] = 1, + [0x00f9fd] = 1, + [0x00f9fe] = 1, + [0x00f9ff] = 1, + [0x00fa00] = 1, + [0x00fa01] = 1, + [0x00fa02] = 1, + [0x00fa03] = 1, + [0x00fa04] = 1, + [0x00fa05] = 1, + [0x00fa06] = 1, + [0x00fa07] = 1, + [0x00fa08] = 1, + [0x00fa09] = 1, + [0x00fa0a] = 1, + [0x00fa0b] = 1, + [0x00fa0c] = 1, + [0x00fa0d] = 1, + [0x00fa10] = 1, + [0x00fa12] = 1, + [0x00fa15] = 1, + [0x00fa16] = 1, + [0x00fa17] = 1, + [0x00fa18] = 1, + [0x00fa19] = 1, + [0x00fa1a] = 1, + [0x00fa1b] = 1, + [0x00fa1c] = 1, + [0x00fa1d] = 1, + [0x00fa1e] = 1, + [0x00fa20] = 1, + [0x00fa22] = 1, + [0x00fa25] = 1, + [0x00fa26] = 1, + [0x00fa2a] = 1, + [0x00fa2b] = 1, + [0x00fa2c] = 1, + [0x00fa2d] = 1, + [0x00fa2e] = 1, + [0x00fa2f] = 1, + [0x00fa30] = 1, + [0x00fa31] = 1, + [0x00fa32] = 1, + [0x00fa33] = 1, + [0x00fa34] = 1, + [0x00fa35] = 1, + [0x00fa36] = 1, + [0x00fa37] = 1, + [0x00fa38] = 1, + [0x00fa39] = 1, + [0x00fa3a] = 1, + [0x00fa3b] = 1, + [0x00fa3c] = 1, + [0x00fa3d] = 1, + [0x00fa3e] = 1, + [0x00fa3f] = 1, + [0x00fa40] = 1, + [0x00fa41] = 1, + [0x00fa42] = 1, + [0x00fa43] = 1, + [0x00fa44] = 1, + [0x00fa45] = 1, + [0x00fa46] = 1, + [0x00fa47] = 1, + [0x00fa48] = 1, + [0x00fa49] = 1, + [0x00fa4a] = 1, + [0x00fa4b] = 1, + [0x00fa4c] = 1, + [0x00fa4d] = 1, + [0x00fa4e] = 1, + [0x00fa4f] = 1, + [0x00fa50] = 1, + [0x00fa51] = 1, + [0x00fa52] = 1, + [0x00fa53] = 1, + [0x00fa54] = 1, + [0x00fa55] = 1, + [0x00fa56] = 1, + [0x00fa57] = 1, + [0x00fa58] = 1, + [0x00fa59] = 1, + [0x00fa5a] = 1, + [0x00fa5b] = 1, + [0x00fa5c] = 1, + [0x00fa5d] = 1, + [0x00fa5e] = 1, + [0x00fa5f] = 1, + [0x00fa60] = 1, + [0x00fa61] = 1, + [0x00fa62] = 1, + [0x00fa63] = 1, + [0x00fa64] = 1, + [0x00fa65] = 1, + [0x00fa66] = 1, + [0x00fa67] = 1, + [0x00fa68] = 1, + [0x00fa69] = 1, + [0x00fa6a] = 1, + [0x00fa6b] = 1, + [0x00fa6c] = 1, + [0x00fa6d] = 1, + [0x00fa70] = 1, + [0x00fa71] = 1, + [0x00fa72] = 1, + [0x00fa73] = 1, + [0x00fa74] = 1, + [0x00fa75] = 1, + [0x00fa76] = 1, + [0x00fa77] = 1, + [0x00fa78] = 1, + [0x00fa79] = 1, + [0x00fa7a] = 1, + [0x00fa7b] = 1, + [0x00fa7c] = 1, + [0x00fa7d] = 1, + [0x00fa7e] = 1, + [0x00fa7f] = 1, + [0x00fa80] = 1, + [0x00fa81] = 1, + [0x00fa82] = 1, + [0x00fa83] = 1, + [0x00fa84] = 1, + [0x00fa85] = 1, + [0x00fa86] = 1, + [0x00fa87] = 1, + [0x00fa88] = 1, + [0x00fa89] = 1, + [0x00fa8a] = 1, + [0x00fa8b] = 1, + [0x00fa8c] = 1, + [0x00fa8d] = 1, + [0x00fa8e] = 1, + [0x00fa8f] = 1, + [0x00fa90] = 1, + [0x00fa91] = 1, + [0x00fa92] = 1, + [0x00fa93] = 1, + [0x00fa94] = 1, + [0x00fa95] = 1, + [0x00fa96] = 1, + [0x00fa97] = 1, + [0x00fa98] = 1, + [0x00fa99] = 1, + [0x00fa9a] = 1, + [0x00fa9b] = 1, + [0x00fa9c] = 1, + [0x00fa9d] = 1, + [0x00fa9e] = 1, + [0x00fa9f] = 1, + [0x00faa0] = 1, + [0x00faa1] = 1, + [0x00faa2] = 1, + [0x00faa3] = 1, + [0x00faa4] = 1, + [0x00faa5] = 1, + [0x00faa6] = 1, + [0x00faa7] = 1, + [0x00faa8] = 1, + [0x00faa9] = 1, + [0x00faaa] = 1, + [0x00faab] = 1, + [0x00faac] = 1, + [0x00faad] = 1, + [0x00faae] = 1, + [0x00faaf] = 1, + [0x00fab0] = 1, + [0x00fab1] = 1, + [0x00fab2] = 1, + [0x00fab3] = 1, + [0x00fab4] = 1, + [0x00fab5] = 1, + [0x00fab6] = 1, + [0x00fab7] = 1, + [0x00fab8] = 1, + [0x00fab9] = 1, + [0x00faba] = 1, + [0x00fabb] = 1, + [0x00fabc] = 1, + [0x00fabd] = 1, + [0x00fabe] = 1, + [0x00fabf] = 1, + [0x00fac0] = 1, + [0x00fac1] = 1, + [0x00fac2] = 1, + [0x00fac3] = 1, + [0x00fac4] = 1, + [0x00fac5] = 1, + [0x00fac6] = 1, + [0x00fac7] = 1, + [0x00fac8] = 1, + [0x00fac9] = 1, + [0x00faca] = 1, + [0x00facb] = 1, + [0x00facc] = 1, + [0x00facd] = 1, + [0x00face] = 1, + [0x00facf] = 1, + [0x00fad0] = 1, + [0x00fad1] = 1, + [0x00fad2] = 1, + [0x00fad3] = 1, + [0x00fad4] = 1, + [0x00fad5] = 1, + [0x00fad6] = 1, + [0x00fad7] = 1, + [0x00fad8] = 1, + [0x00fad9] = 1, + [0x00fb1d] = 1, + [0x00fb1f] = 1, + [0x00fb2a] = 1, + [0x00fb2b] = 1, + [0x00fb2c] = 1, + [0x00fb2d] = 1, + [0x00fb2e] = 1, + [0x00fb2f] = 1, + [0x00fb30] = 1, + [0x00fb31] = 1, + [0x00fb32] = 1, + [0x00fb33] = 1, + [0x00fb34] = 1, + [0x00fb35] = 1, + [0x00fb36] = 1, + [0x00fb38] = 1, + [0x00fb39] = 1, + [0x00fb3a] = 1, + [0x00fb3b] = 1, + [0x00fb3c] = 1, + [0x00fb3e] = 1, + [0x00fb40] = 1, + [0x00fb41] = 1, + [0x00fb43] = 1, + [0x00fb44] = 1, + [0x00fb46] = 1, + [0x00fb47] = 1, + [0x00fb48] = 1, + [0x00fb49] = 1, + [0x00fb4a] = 1, + [0x00fb4b] = 1, + [0x00fb4c] = 1, + [0x00fb4d] = 1, + [0x00fb4e] = 1, + [0x01d15e] = 1, + [0x01d15f] = 1, + [0x01d160] = 1, + [0x01d161] = 1, + [0x01d162] = 1, + [0x01d163] = 1, + [0x01d164] = 1, + [0x01d1bb] = 1, + [0x01d1bc] = 1, + [0x01d1bd] = 1, + [0x01d1be] = 1, + [0x01d1bf] = 1, + [0x01d1c0] = 1, + [0x02f800] = 1, + [0x02f801] = 1, + [0x02f802] = 1, + [0x02f803] = 1, + [0x02f804] = 1, + [0x02f805] = 1, + [0x02f806] = 1, + [0x02f807] = 1, + [0x02f808] = 1, + [0x02f809] = 1, + [0x02f80a] = 1, + [0x02f80b] = 1, + [0x02f80c] = 1, + [0x02f80d] = 1, + [0x02f80e] = 1, + [0x02f80f] = 1, + [0x02f810] = 1, + [0x02f811] = 1, + [0x02f812] = 1, + [0x02f813] = 1, + [0x02f814] = 1, + [0x02f815] = 1, + [0x02f816] = 1, + [0x02f817] = 1, + [0x02f818] = 1, + [0x02f819] = 1, + [0x02f81a] = 1, + [0x02f81b] = 1, + [0x02f81c] = 1, + [0x02f81d] = 1, + [0x02f81e] = 1, + [0x02f81f] = 1, + [0x02f820] = 1, + [0x02f821] = 1, + [0x02f822] = 1, + [0x02f823] = 1, + [0x02f824] = 1, + [0x02f825] = 1, + [0x02f826] = 1, + [0x02f827] = 1, + [0x02f828] = 1, + [0x02f829] = 1, + [0x02f82a] = 1, + [0x02f82b] = 1, + [0x02f82c] = 1, + [0x02f82d] = 1, + [0x02f82e] = 1, + [0x02f82f] = 1, + [0x02f830] = 1, + [0x02f831] = 1, + [0x02f832] = 1, + [0x02f833] = 1, + [0x02f834] = 1, + [0x02f835] = 1, + [0x02f836] = 1, + [0x02f837] = 1, + [0x02f838] = 1, + [0x02f839] = 1, + [0x02f83a] = 1, + [0x02f83b] = 1, + [0x02f83c] = 1, + [0x02f83d] = 1, + [0x02f83e] = 1, + [0x02f83f] = 1, + [0x02f840] = 1, + [0x02f841] = 1, + [0x02f842] = 1, + [0x02f843] = 1, + [0x02f844] = 1, + [0x02f845] = 1, + [0x02f846] = 1, + [0x02f847] = 1, + [0x02f848] = 1, + [0x02f849] = 1, + [0x02f84a] = 1, + [0x02f84b] = 1, + [0x02f84c] = 1, + [0x02f84d] = 1, + [0x02f84e] = 1, + [0x02f84f] = 1, + [0x02f850] = 1, + [0x02f851] = 1, + [0x02f852] = 1, + [0x02f853] = 1, + [0x02f854] = 1, + [0x02f855] = 1, + [0x02f856] = 1, + [0x02f857] = 1, + [0x02f858] = 1, + [0x02f859] = 1, + [0x02f85a] = 1, + [0x02f85b] = 1, + [0x02f85c] = 1, + [0x02f85d] = 1, + [0x02f85e] = 1, + [0x02f85f] = 1, + [0x02f860] = 1, + [0x02f861] = 1, + [0x02f862] = 1, + [0x02f863] = 1, + [0x02f864] = 1, + [0x02f865] = 1, + [0x02f866] = 1, + [0x02f867] = 1, + [0x02f868] = 1, + [0x02f869] = 1, + [0x02f86a] = 1, + [0x02f86b] = 1, + [0x02f86c] = 1, + [0x02f86d] = 1, + [0x02f86e] = 1, + [0x02f86f] = 1, + [0x02f870] = 1, + [0x02f871] = 1, + [0x02f872] = 1, + [0x02f873] = 1, + [0x02f874] = 1, + [0x02f875] = 1, + [0x02f876] = 1, + [0x02f877] = 1, + [0x02f878] = 1, + [0x02f879] = 1, + [0x02f87a] = 1, + [0x02f87b] = 1, + [0x02f87c] = 1, + [0x02f87d] = 1, + [0x02f87e] = 1, + [0x02f87f] = 1, + [0x02f880] = 1, + [0x02f881] = 1, + [0x02f882] = 1, + [0x02f883] = 1, + [0x02f884] = 1, + [0x02f885] = 1, + [0x02f886] = 1, + [0x02f887] = 1, + [0x02f888] = 1, + [0x02f889] = 1, + [0x02f88a] = 1, + [0x02f88b] = 1, + [0x02f88c] = 1, + [0x02f88d] = 1, + [0x02f88e] = 1, + [0x02f88f] = 1, + [0x02f890] = 1, + [0x02f891] = 1, + [0x02f892] = 1, + [0x02f893] = 1, + [0x02f894] = 1, + [0x02f895] = 1, + [0x02f896] = 1, + [0x02f897] = 1, + [0x02f898] = 1, + [0x02f899] = 1, + [0x02f89a] = 1, + [0x02f89b] = 1, + [0x02f89c] = 1, + [0x02f89d] = 1, + [0x02f89e] = 1, + [0x02f89f] = 1, + [0x02f8a0] = 1, + [0x02f8a1] = 1, + [0x02f8a2] = 1, + [0x02f8a3] = 1, + [0x02f8a4] = 1, + [0x02f8a5] = 1, + [0x02f8a6] = 1, + [0x02f8a7] = 1, + [0x02f8a8] = 1, + [0x02f8a9] = 1, + [0x02f8aa] = 1, + [0x02f8ab] = 1, + [0x02f8ac] = 1, + [0x02f8ad] = 1, + [0x02f8ae] = 1, + [0x02f8af] = 1, + [0x02f8b0] = 1, + [0x02f8b1] = 1, + [0x02f8b2] = 1, + [0x02f8b3] = 1, + [0x02f8b4] = 1, + [0x02f8b5] = 1, + [0x02f8b6] = 1, + [0x02f8b7] = 1, + [0x02f8b8] = 1, + [0x02f8b9] = 1, + [0x02f8ba] = 1, + [0x02f8bb] = 1, + [0x02f8bc] = 1, + [0x02f8bd] = 1, + [0x02f8be] = 1, + [0x02f8bf] = 1, + [0x02f8c0] = 1, + [0x02f8c1] = 1, + [0x02f8c2] = 1, + [0x02f8c3] = 1, + [0x02f8c4] = 1, + [0x02f8c5] = 1, + [0x02f8c6] = 1, + [0x02f8c7] = 1, + [0x02f8c8] = 1, + [0x02f8c9] = 1, + [0x02f8ca] = 1, + [0x02f8cb] = 1, + [0x02f8cc] = 1, + [0x02f8cd] = 1, + [0x02f8ce] = 1, + [0x02f8cf] = 1, + [0x02f8d0] = 1, + [0x02f8d1] = 1, + [0x02f8d2] = 1, + [0x02f8d3] = 1, + [0x02f8d4] = 1, + [0x02f8d5] = 1, + [0x02f8d6] = 1, + [0x02f8d7] = 1, + [0x02f8d8] = 1, + [0x02f8d9] = 1, + [0x02f8da] = 1, + [0x02f8db] = 1, + [0x02f8dc] = 1, + [0x02f8dd] = 1, + [0x02f8de] = 1, + [0x02f8df] = 1, + [0x02f8e0] = 1, + [0x02f8e1] = 1, + [0x02f8e2] = 1, + [0x02f8e3] = 1, + [0x02f8e4] = 1, + [0x02f8e5] = 1, + [0x02f8e6] = 1, + [0x02f8e7] = 1, + [0x02f8e8] = 1, + [0x02f8e9] = 1, + [0x02f8ea] = 1, + [0x02f8eb] = 1, + [0x02f8ec] = 1, + [0x02f8ed] = 1, + [0x02f8ee] = 1, + [0x02f8ef] = 1, + [0x02f8f0] = 1, + [0x02f8f1] = 1, + [0x02f8f2] = 1, + [0x02f8f3] = 1, + [0x02f8f4] = 1, + [0x02f8f5] = 1, + [0x02f8f6] = 1, + [0x02f8f7] = 1, + [0x02f8f8] = 1, + [0x02f8f9] = 1, + [0x02f8fa] = 1, + [0x02f8fb] = 1, + [0x02f8fc] = 1, + [0x02f8fd] = 1, + [0x02f8fe] = 1, + [0x02f8ff] = 1, + [0x02f900] = 1, + [0x02f901] = 1, + [0x02f902] = 1, + [0x02f903] = 1, + [0x02f904] = 1, + [0x02f905] = 1, + [0x02f906] = 1, + [0x02f907] = 1, + [0x02f908] = 1, + [0x02f909] = 1, + [0x02f90a] = 1, + [0x02f90b] = 1, + [0x02f90c] = 1, + [0x02f90d] = 1, + [0x02f90e] = 1, + [0x02f90f] = 1, + [0x02f910] = 1, + [0x02f911] = 1, + [0x02f912] = 1, + [0x02f913] = 1, + [0x02f914] = 1, + [0x02f915] = 1, + [0x02f916] = 1, + [0x02f917] = 1, + [0x02f918] = 1, + [0x02f919] = 1, + [0x02f91a] = 1, + [0x02f91b] = 1, + [0x02f91c] = 1, + [0x02f91d] = 1, + [0x02f91e] = 1, + [0x02f91f] = 1, + [0x02f920] = 1, + [0x02f921] = 1, + [0x02f922] = 1, + [0x02f923] = 1, + [0x02f924] = 1, + [0x02f925] = 1, + [0x02f926] = 1, + [0x02f927] = 1, + [0x02f928] = 1, + [0x02f929] = 1, + [0x02f92a] = 1, + [0x02f92b] = 1, + [0x02f92c] = 1, + [0x02f92d] = 1, + [0x02f92e] = 1, + [0x02f92f] = 1, + [0x02f930] = 1, + [0x02f931] = 1, + [0x02f932] = 1, + [0x02f933] = 1, + [0x02f934] = 1, + [0x02f935] = 1, + [0x02f936] = 1, + [0x02f937] = 1, + [0x02f938] = 1, + [0x02f939] = 1, + [0x02f93a] = 1, + [0x02f93b] = 1, + [0x02f93c] = 1, + [0x02f93d] = 1, + [0x02f93e] = 1, + [0x02f93f] = 1, + [0x02f940] = 1, + [0x02f941] = 1, + [0x02f942] = 1, + [0x02f943] = 1, + [0x02f944] = 1, + [0x02f945] = 1, + [0x02f946] = 1, + [0x02f947] = 1, + [0x02f948] = 1, + [0x02f949] = 1, + [0x02f94a] = 1, + [0x02f94b] = 1, + [0x02f94c] = 1, + [0x02f94d] = 1, + [0x02f94e] = 1, + [0x02f94f] = 1, + [0x02f950] = 1, + [0x02f951] = 1, + [0x02f952] = 1, + [0x02f953] = 1, + [0x02f954] = 1, + [0x02f955] = 1, + [0x02f956] = 1, + [0x02f957] = 1, + [0x02f958] = 1, + [0x02f959] = 1, + [0x02f95a] = 1, + [0x02f95b] = 1, + [0x02f95c] = 1, + [0x02f95d] = 1, + [0x02f95e] = 1, + [0x02f95f] = 1, + [0x02f960] = 1, + [0x02f961] = 1, + [0x02f962] = 1, + [0x02f963] = 1, + [0x02f964] = 1, + [0x02f965] = 1, + [0x02f966] = 1, + [0x02f967] = 1, + [0x02f968] = 1, + [0x02f969] = 1, + [0x02f96a] = 1, + [0x02f96b] = 1, + [0x02f96c] = 1, + [0x02f96d] = 1, + [0x02f96e] = 1, + [0x02f96f] = 1, + [0x02f970] = 1, + [0x02f971] = 1, + [0x02f972] = 1, + [0x02f973] = 1, + [0x02f974] = 1, + [0x02f975] = 1, + [0x02f976] = 1, + [0x02f977] = 1, + [0x02f978] = 1, + [0x02f979] = 1, + [0x02f97a] = 1, + [0x02f97b] = 1, + [0x02f97c] = 1, + [0x02f97d] = 1, + [0x02f97e] = 1, + [0x02f97f] = 1, + [0x02f980] = 1, + [0x02f981] = 1, + [0x02f982] = 1, + [0x02f983] = 1, + [0x02f984] = 1, + [0x02f985] = 1, + [0x02f986] = 1, + [0x02f987] = 1, + [0x02f988] = 1, + [0x02f989] = 1, + [0x02f98a] = 1, + [0x02f98b] = 1, + [0x02f98c] = 1, + [0x02f98d] = 1, + [0x02f98e] = 1, + [0x02f98f] = 1, + [0x02f990] = 1, + [0x02f991] = 1, + [0x02f992] = 1, + [0x02f993] = 1, + [0x02f994] = 1, + [0x02f995] = 1, + [0x02f996] = 1, + [0x02f997] = 1, + [0x02f998] = 1, + [0x02f999] = 1, + [0x02f99a] = 1, + [0x02f99b] = 1, + [0x02f99c] = 1, + [0x02f99d] = 1, + [0x02f99e] = 1, + [0x02f99f] = 1, + [0x02f9a0] = 1, + [0x02f9a1] = 1, + [0x02f9a2] = 1, + [0x02f9a3] = 1, + [0x02f9a4] = 1, + [0x02f9a5] = 1, + [0x02f9a6] = 1, + [0x02f9a7] = 1, + [0x02f9a8] = 1, + [0x02f9a9] = 1, + [0x02f9aa] = 1, + [0x02f9ab] = 1, + [0x02f9ac] = 1, + [0x02f9ad] = 1, + [0x02f9ae] = 1, + [0x02f9af] = 1, + [0x02f9b0] = 1, + [0x02f9b1] = 1, + [0x02f9b2] = 1, + [0x02f9b3] = 1, + [0x02f9b4] = 1, + [0x02f9b5] = 1, + [0x02f9b6] = 1, + [0x02f9b7] = 1, + [0x02f9b8] = 1, + [0x02f9b9] = 1, + [0x02f9ba] = 1, + [0x02f9bb] = 1, + [0x02f9bc] = 1, + [0x02f9bd] = 1, + [0x02f9be] = 1, + [0x02f9bf] = 1, + [0x02f9c0] = 1, + [0x02f9c1] = 1, + [0x02f9c2] = 1, + [0x02f9c3] = 1, + [0x02f9c4] = 1, + [0x02f9c5] = 1, + [0x02f9c6] = 1, + [0x02f9c7] = 1, + [0x02f9c8] = 1, + [0x02f9c9] = 1, + [0x02f9ca] = 1, + [0x02f9cb] = 1, + [0x02f9cc] = 1, + [0x02f9cd] = 1, + [0x02f9ce] = 1, + [0x02f9cf] = 1, + [0x02f9d0] = 1, + [0x02f9d1] = 1, + [0x02f9d2] = 1, + [0x02f9d3] = 1, + [0x02f9d4] = 1, + [0x02f9d5] = 1, + [0x02f9d6] = 1, + [0x02f9d7] = 1, + [0x02f9d8] = 1, + [0x02f9d9] = 1, + [0x02f9da] = 1, + [0x02f9db] = 1, + [0x02f9dc] = 1, + [0x02f9dd] = 1, + [0x02f9de] = 1, + [0x02f9df] = 1, + [0x02f9e0] = 1, + [0x02f9e1] = 1, + [0x02f9e2] = 1, + [0x02f9e3] = 1, + [0x02f9e4] = 1, + [0x02f9e5] = 1, + [0x02f9e6] = 1, + [0x02f9e7] = 1, + [0x02f9e8] = 1, + [0x02f9e9] = 1, + [0x02f9ea] = 1, + [0x02f9eb] = 1, + [0x02f9ec] = 1, + [0x02f9ed] = 1, + [0x02f9ee] = 1, + [0x02f9ef] = 1, + [0x02f9f0] = 1, + [0x02f9f1] = 1, + [0x02f9f2] = 1, + [0x02f9f3] = 1, + [0x02f9f4] = 1, + [0x02f9f5] = 1, + [0x02f9f6] = 1, + [0x02f9f7] = 1, + [0x02f9f8] = 1, + [0x02f9f9] = 1, + [0x02f9fa] = 1, + [0x02f9fb] = 1, + [0x02f9fc] = 1, + [0x02f9fd] = 1, + [0x02f9fe] = 1, + [0x02f9ff] = 1, + [0x02fa00] = 1, + [0x02fa01] = 1, + [0x02fa02] = 1, + [0x02fa03] = 1, + [0x02fa04] = 1, + [0x02fa05] = 1, + [0x02fa06] = 1, + [0x02fa07] = 1, + [0x02fa08] = 1, + [0x02fa09] = 1, + [0x02fa0a] = 1, + [0x02fa0b] = 1, + [0x02fa0c] = 1, + [0x02fa0d] = 1, + [0x02fa0e] = 1, + [0x02fa0f] = 1, + [0x02fa10] = 1, + [0x02fa11] = 1, + [0x02fa12] = 1, + [0x02fa13] = 1, + [0x02fa14] = 1, + [0x02fa15] = 1, + [0x02fa16] = 1, + [0x02fa17] = 1, + [0x02fa18] = 1, + [0x02fa19] = 1, + [0x02fa1a] = 1, + [0x02fa1b] = 1, + [0x02fa1c] = 1, + [0x02fa1d] = 1, + [0x0009be] = 1, + [0x0009d7] = 1, + [0x000b3e] = 1, + [0x000b56] = 1, + [0x000b57] = 1, + [0x000bbe] = 1, + [0x000bd7] = 1, + [0x000cc2] = 1, + [0x000cd5] = 1, + [0x000cd6] = 1, + [0x000d3e] = 1, + [0x000d57] = 1, + [0x000dcf] = 1, + [0x000ddf] = 1, + [0x00102e] = 1, + [0x001161] = 1, + [0x001162] = 1, + [0x001163] = 1, + [0x001164] = 1, + [0x001165] = 1, + [0x001166] = 1, + [0x001167] = 1, + [0x001168] = 1, + [0x001169] = 1, + [0x00116a] = 1, + [0x00116b] = 1, + [0x00116c] = 1, + [0x00116d] = 1, + [0x00116e] = 1, + [0x00116f] = 1, + [0x001170] = 1, + [0x001171] = 1, + [0x001172] = 1, + [0x001173] = 1, + [0x001174] = 1, + [0x001175] = 1, + [0x0011a8] = 1, + [0x0011a9] = 1, + [0x0011aa] = 1, + [0x0011ab] = 1, + [0x0011ac] = 1, + [0x0011ad] = 1, + [0x0011ae] = 1, + [0x0011af] = 1, + [0x0011b0] = 1, + [0x0011b1] = 1, + [0x0011b2] = 1, + [0x0011b3] = 1, + [0x0011b4] = 1, + [0x0011b5] = 1, + [0x0011b6] = 1, + [0x0011b7] = 1, + [0x0011b8] = 1, + [0x0011b9] = 1, + [0x0011ba] = 1, + [0x0011bb] = 1, + [0x0011bc] = 1, + [0x0011bd] = 1, + [0x0011be] = 1, + [0x0011bf] = 1, + [0x0011c0] = 1, + [0x0011c1] = 1, + [0x0011c2] = 1, + [0x001b35] = 1, + [0x011127] = 1, + [0x01133e] = 1, + [0x011357] = 1, + [0x0114b0] = 1, + [0x0114ba] = 1, + [0x0114bd] = 1, + [0x0115af] = 1, + }, + + -- Combining characters, mapped to combining class + combclass = { + [0x000300] = 230, + [0x000301] = 230, + [0x000302] = 230, + [0x000303] = 230, + [0x000304] = 230, + [0x000305] = 230, + [0x000306] = 230, + [0x000307] = 230, + [0x000308] = 230, + [0x000309] = 230, + [0x00030a] = 230, + [0x00030b] = 230, + [0x00030c] = 230, + [0x00030d] = 230, + [0x00030e] = 230, + [0x00030f] = 230, + [0x000310] = 230, + [0x000311] = 230, + [0x000312] = 230, + [0x000313] = 230, + [0x000314] = 230, + [0x000315] = 232, + [0x000316] = 220, + [0x000317] = 220, + [0x000318] = 220, + [0x000319] = 220, + [0x00031a] = 232, + [0x00031b] = 216, + [0x00031c] = 220, + [0x00031d] = 220, + [0x00031e] = 220, + [0x00031f] = 220, + [0x000320] = 220, + [0x000321] = 202, + [0x000322] = 202, + [0x000323] = 220, + [0x000324] = 220, + [0x000325] = 220, + [0x000326] = 220, + [0x000327] = 202, + [0x000328] = 202, + [0x000329] = 220, + [0x00032a] = 220, + [0x00032b] = 220, + [0x00032c] = 220, + [0x00032d] = 220, + [0x00032e] = 220, + [0x00032f] = 220, + [0x000330] = 220, + [0x000331] = 220, + [0x000332] = 220, + [0x000333] = 220, + [0x000334] = 1, + [0x000335] = 1, + [0x000336] = 1, + [0x000337] = 1, + [0x000338] = 1, + [0x000339] = 220, + [0x00033a] = 220, + [0x00033b] = 220, + [0x00033c] = 220, + [0x00033d] = 230, + [0x00033e] = 230, + [0x00033f] = 230, + [0x000340] = 230, + [0x000341] = 230, + [0x000342] = 230, + [0x000343] = 230, + [0x000344] = 230, + [0x000345] = 240, + [0x000346] = 230, + [0x000347] = 220, + [0x000348] = 220, + [0x000349] = 220, + [0x00034a] = 230, + [0x00034b] = 230, + [0x00034c] = 230, + [0x00034d] = 220, + [0x00034e] = 220, + [0x000350] = 230, + [0x000351] = 230, + [0x000352] = 230, + [0x000353] = 220, + [0x000354] = 220, + [0x000355] = 220, + [0x000356] = 220, + [0x000357] = 230, + [0x000358] = 232, + [0x000359] = 220, + [0x00035a] = 220, + [0x00035b] = 230, + [0x00035c] = 233, + [0x00035d] = 234, + [0x00035e] = 234, + [0x00035f] = 233, + [0x000360] = 234, + [0x000361] = 234, + [0x000362] = 233, + [0x000363] = 230, + [0x000364] = 230, + [0x000365] = 230, + [0x000366] = 230, + [0x000367] = 230, + [0x000368] = 230, + [0x000369] = 230, + [0x00036a] = 230, + [0x00036b] = 230, + [0x00036c] = 230, + [0x00036d] = 230, + [0x00036e] = 230, + [0x00036f] = 230, + [0x000483] = 230, + [0x000484] = 230, + [0x000485] = 230, + [0x000486] = 230, + [0x000487] = 230, + [0x000591] = 220, + [0x000592] = 230, + [0x000593] = 230, + [0x000594] = 230, + [0x000595] = 230, + [0x000596] = 220, + [0x000597] = 230, + [0x000598] = 230, + [0x000599] = 230, + [0x00059a] = 222, + [0x00059b] = 220, + [0x00059c] = 230, + [0x00059d] = 230, + [0x00059e] = 230, + [0x00059f] = 230, + [0x0005a0] = 230, + [0x0005a1] = 230, + [0x0005a2] = 220, + [0x0005a3] = 220, + [0x0005a4] = 220, + [0x0005a5] = 220, + [0x0005a6] = 220, + [0x0005a7] = 220, + [0x0005a8] = 230, + [0x0005a9] = 230, + [0x0005aa] = 220, + [0x0005ab] = 230, + [0x0005ac] = 230, + [0x0005ad] = 222, + [0x0005ae] = 228, + [0x0005af] = 230, + [0x0005b0] = 10, + [0x0005b1] = 11, + [0x0005b2] = 12, + [0x0005b3] = 13, + [0x0005b4] = 14, + [0x0005b5] = 15, + [0x0005b6] = 16, + [0x0005b7] = 17, + [0x0005b8] = 18, + [0x0005b9] = 19, + [0x0005ba] = 19, + [0x0005bb] = 20, + [0x0005bc] = 21, + [0x0005bd] = 22, + [0x0005bf] = 23, + [0x0005c1] = 24, + [0x0005c2] = 25, + [0x0005c4] = 230, + [0x0005c5] = 220, + [0x0005c7] = 18, + [0x000610] = 230, + [0x000611] = 230, + [0x000612] = 230, + [0x000613] = 230, + [0x000614] = 230, + [0x000615] = 230, + [0x000616] = 230, + [0x000617] = 230, + [0x000618] = 30, + [0x000619] = 31, + [0x00061a] = 32, + [0x00064b] = 27, + [0x00064c] = 28, + [0x00064d] = 29, + [0x00064e] = 30, + [0x00064f] = 31, + [0x000650] = 32, + [0x000651] = 33, + [0x000652] = 34, + [0x000653] = 230, + [0x000654] = 230, + [0x000655] = 220, + [0x000656] = 220, + [0x000657] = 230, + [0x000658] = 230, + [0x000659] = 230, + [0x00065a] = 230, + [0x00065b] = 230, + [0x00065c] = 220, + [0x00065d] = 230, + [0x00065e] = 230, + [0x00065f] = 220, + [0x000670] = 35, + [0x0006d6] = 230, + [0x0006d7] = 230, + [0x0006d8] = 230, + [0x0006d9] = 230, + [0x0006da] = 230, + [0x0006db] = 230, + [0x0006dc] = 230, + [0x0006df] = 230, + [0x0006e0] = 230, + [0x0006e1] = 230, + [0x0006e2] = 230, + [0x0006e3] = 220, + [0x0006e4] = 230, + [0x0006e7] = 230, + [0x0006e8] = 230, + [0x0006ea] = 220, + [0x0006eb] = 230, + [0x0006ec] = 230, + [0x0006ed] = 220, + [0x000711] = 36, + [0x000730] = 230, + [0x000731] = 220, + [0x000732] = 230, + [0x000733] = 230, + [0x000734] = 220, + [0x000735] = 230, + [0x000736] = 230, + [0x000737] = 220, + [0x000738] = 220, + [0x000739] = 220, + [0x00073a] = 230, + [0x00073b] = 220, + [0x00073c] = 220, + [0x00073d] = 230, + [0x00073e] = 220, + [0x00073f] = 230, + [0x000740] = 230, + [0x000741] = 230, + [0x000742] = 220, + [0x000743] = 230, + [0x000744] = 220, + [0x000745] = 230, + [0x000746] = 220, + [0x000747] = 230, + [0x000748] = 220, + [0x000749] = 230, + [0x00074a] = 230, + [0x0007eb] = 230, + [0x0007ec] = 230, + [0x0007ed] = 230, + [0x0007ee] = 230, + [0x0007ef] = 230, + [0x0007f0] = 230, + [0x0007f1] = 230, + [0x0007f2] = 220, + [0x0007f3] = 230, + [0x000816] = 230, + [0x000817] = 230, + [0x000818] = 230, + [0x000819] = 230, + [0x00081b] = 230, + [0x00081c] = 230, + [0x00081d] = 230, + [0x00081e] = 230, + [0x00081f] = 230, + [0x000820] = 230, + [0x000821] = 230, + [0x000822] = 230, + [0x000823] = 230, + [0x000825] = 230, + [0x000826] = 230, + [0x000827] = 230, + [0x000829] = 230, + [0x00082a] = 230, + [0x00082b] = 230, + [0x00082c] = 230, + [0x00082d] = 230, + [0x000859] = 220, + [0x00085a] = 220, + [0x00085b] = 220, + [0x0008e3] = 220, + [0x0008e4] = 230, + [0x0008e5] = 230, + [0x0008e6] = 220, + [0x0008e7] = 230, + [0x0008e8] = 230, + [0x0008e9] = 220, + [0x0008ea] = 230, + [0x0008eb] = 230, + [0x0008ec] = 230, + [0x0008ed] = 220, + [0x0008ee] = 220, + [0x0008ef] = 220, + [0x0008f0] = 27, + [0x0008f1] = 28, + [0x0008f2] = 29, + [0x0008f3] = 230, + [0x0008f4] = 230, + [0x0008f5] = 230, + [0x0008f6] = 220, + [0x0008f7] = 230, + [0x0008f8] = 230, + [0x0008f9] = 220, + [0x0008fa] = 220, + [0x0008fb] = 230, + [0x0008fc] = 230, + [0x0008fd] = 230, + [0x0008fe] = 230, + [0x0008ff] = 230, + [0x00093c] = 7, + [0x00094d] = 9, + [0x000951] = 230, + [0x000952] = 220, + [0x000953] = 230, + [0x000954] = 230, + [0x0009bc] = 7, + [0x0009cd] = 9, + [0x000a3c] = 7, + [0x000a4d] = 9, + [0x000abc] = 7, + [0x000acd] = 9, + [0x000b3c] = 7, + [0x000b4d] = 9, + [0x000bcd] = 9, + [0x000c4d] = 9, + [0x000c55] = 84, + [0x000c56] = 91, + [0x000cbc] = 7, + [0x000ccd] = 9, + [0x000d4d] = 9, + [0x000dca] = 9, + [0x000e38] = 103, + [0x000e39] = 103, + [0x000e3a] = 9, + [0x000e48] = 107, + [0x000e49] = 107, + [0x000e4a] = 107, + [0x000e4b] = 107, + [0x000eb8] = 118, + [0x000eb9] = 118, + [0x000ec8] = 122, + [0x000ec9] = 122, + [0x000eca] = 122, + [0x000ecb] = 122, + [0x000f18] = 220, + [0x000f19] = 220, + [0x000f35] = 220, + [0x000f37] = 220, + [0x000f39] = 216, + [0x000f71] = 129, + [0x000f72] = 130, + [0x000f74] = 132, + [0x000f7a] = 130, + [0x000f7b] = 130, + [0x000f7c] = 130, + [0x000f7d] = 130, + [0x000f80] = 130, + [0x000f82] = 230, + [0x000f83] = 230, + [0x000f84] = 9, + [0x000f86] = 230, + [0x000f87] = 230, + [0x000fc6] = 220, + [0x001037] = 7, + [0x001039] = 9, + [0x00103a] = 9, + [0x00108d] = 220, + [0x00135d] = 230, + [0x00135e] = 230, + [0x00135f] = 230, + [0x001714] = 9, + [0x001734] = 9, + [0x0017d2] = 9, + [0x0017dd] = 230, + [0x0018a9] = 228, + [0x001939] = 222, + [0x00193a] = 230, + [0x00193b] = 220, + [0x001a17] = 230, + [0x001a18] = 220, + [0x001a60] = 9, + [0x001a75] = 230, + [0x001a76] = 230, + [0x001a77] = 230, + [0x001a78] = 230, + [0x001a79] = 230, + [0x001a7a] = 230, + [0x001a7b] = 230, + [0x001a7c] = 230, + [0x001a7f] = 220, + [0x001ab0] = 230, + [0x001ab1] = 230, + [0x001ab2] = 230, + [0x001ab3] = 230, + [0x001ab4] = 230, + [0x001ab5] = 220, + [0x001ab6] = 220, + [0x001ab7] = 220, + [0x001ab8] = 220, + [0x001ab9] = 220, + [0x001aba] = 220, + [0x001abb] = 230, + [0x001abc] = 230, + [0x001abd] = 220, + [0x001b34] = 7, + [0x001b44] = 9, + [0x001b6b] = 230, + [0x001b6c] = 220, + [0x001b6d] = 230, + [0x001b6e] = 230, + [0x001b6f] = 230, + [0x001b70] = 230, + [0x001b71] = 230, + [0x001b72] = 230, + [0x001b73] = 230, + [0x001baa] = 9, + [0x001bab] = 9, + [0x001be6] = 7, + [0x001bf2] = 9, + [0x001bf3] = 9, + [0x001c37] = 7, + [0x001cd0] = 230, + [0x001cd1] = 230, + [0x001cd2] = 230, + [0x001cd4] = 1, + [0x001cd5] = 220, + [0x001cd6] = 220, + [0x001cd7] = 220, + [0x001cd8] = 220, + [0x001cd9] = 220, + [0x001cda] = 230, + [0x001cdb] = 230, + [0x001cdc] = 220, + [0x001cdd] = 220, + [0x001cde] = 220, + [0x001cdf] = 220, + [0x001ce0] = 230, + [0x001ce2] = 1, + [0x001ce3] = 1, + [0x001ce4] = 1, + [0x001ce5] = 1, + [0x001ce6] = 1, + [0x001ce7] = 1, + [0x001ce8] = 1, + [0x001ced] = 220, + [0x001cf4] = 230, + [0x001cf8] = 230, + [0x001cf9] = 230, + [0x001dc0] = 230, + [0x001dc1] = 230, + [0x001dc2] = 220, + [0x001dc3] = 230, + [0x001dc4] = 230, + [0x001dc5] = 230, + [0x001dc6] = 230, + [0x001dc7] = 230, + [0x001dc8] = 230, + [0x001dc9] = 230, + [0x001dca] = 220, + [0x001dcb] = 230, + [0x001dcc] = 230, + [0x001dcd] = 234, + [0x001dce] = 214, + [0x001dcf] = 220, + [0x001dd0] = 202, + [0x001dd1] = 230, + [0x001dd2] = 230, + [0x001dd3] = 230, + [0x001dd4] = 230, + [0x001dd5] = 230, + [0x001dd6] = 230, + [0x001dd7] = 230, + [0x001dd8] = 230, + [0x001dd9] = 230, + [0x001dda] = 230, + [0x001ddb] = 230, + [0x001ddc] = 230, + [0x001ddd] = 230, + [0x001dde] = 230, + [0x001ddf] = 230, + [0x001de0] = 230, + [0x001de1] = 230, + [0x001de2] = 230, + [0x001de3] = 230, + [0x001de4] = 230, + [0x001de5] = 230, + [0x001de6] = 230, + [0x001de7] = 230, + [0x001de8] = 230, + [0x001de9] = 230, + [0x001dea] = 230, + [0x001deb] = 230, + [0x001dec] = 230, + [0x001ded] = 230, + [0x001dee] = 230, + [0x001def] = 230, + [0x001df0] = 230, + [0x001df1] = 230, + [0x001df2] = 230, + [0x001df3] = 230, + [0x001df4] = 230, + [0x001df5] = 230, + [0x001dfc] = 233, + [0x001dfd] = 220, + [0x001dfe] = 230, + [0x001dff] = 220, + [0x0020d0] = 230, + [0x0020d1] = 230, + [0x0020d2] = 1, + [0x0020d3] = 1, + [0x0020d4] = 230, + [0x0020d5] = 230, + [0x0020d6] = 230, + [0x0020d7] = 230, + [0x0020d8] = 1, + [0x0020d9] = 1, + [0x0020da] = 1, + [0x0020db] = 230, + [0x0020dc] = 230, + [0x0020e1] = 230, + [0x0020e5] = 1, + [0x0020e6] = 1, + [0x0020e7] = 230, + [0x0020e8] = 220, + [0x0020e9] = 230, + [0x0020ea] = 1, + [0x0020eb] = 1, + [0x0020ec] = 220, + [0x0020ed] = 220, + [0x0020ee] = 220, + [0x0020ef] = 220, + [0x0020f0] = 230, + [0x002cef] = 230, + [0x002cf0] = 230, + [0x002cf1] = 230, + [0x002d7f] = 9, + [0x002de0] = 230, + [0x002de1] = 230, + [0x002de2] = 230, + [0x002de3] = 230, + [0x002de4] = 230, + [0x002de5] = 230, + [0x002de6] = 230, + [0x002de7] = 230, + [0x002de8] = 230, + [0x002de9] = 230, + [0x002dea] = 230, + [0x002deb] = 230, + [0x002dec] = 230, + [0x002ded] = 230, + [0x002dee] = 230, + [0x002def] = 230, + [0x002df0] = 230, + [0x002df1] = 230, + [0x002df2] = 230, + [0x002df3] = 230, + [0x002df4] = 230, + [0x002df5] = 230, + [0x002df6] = 230, + [0x002df7] = 230, + [0x002df8] = 230, + [0x002df9] = 230, + [0x002dfa] = 230, + [0x002dfb] = 230, + [0x002dfc] = 230, + [0x002dfd] = 230, + [0x002dfe] = 230, + [0x002dff] = 230, + [0x00302a] = 218, + [0x00302b] = 228, + [0x00302c] = 232, + [0x00302d] = 222, + [0x00302e] = 224, + [0x00302f] = 224, + [0x003099] = 8, + [0x00309a] = 8, + [0x00a66f] = 230, + [0x00a674] = 230, + [0x00a675] = 230, + [0x00a676] = 230, + [0x00a677] = 230, + [0x00a678] = 230, + [0x00a679] = 230, + [0x00a67a] = 230, + [0x00a67b] = 230, + [0x00a67c] = 230, + [0x00a67d] = 230, + [0x00a69e] = 230, + [0x00a69f] = 230, + [0x00a6f0] = 230, + [0x00a6f1] = 230, + [0x00a806] = 9, + [0x00a8c4] = 9, + [0x00a8e0] = 230, + [0x00a8e1] = 230, + [0x00a8e2] = 230, + [0x00a8e3] = 230, + [0x00a8e4] = 230, + [0x00a8e5] = 230, + [0x00a8e6] = 230, + [0x00a8e7] = 230, + [0x00a8e8] = 230, + [0x00a8e9] = 230, + [0x00a8ea] = 230, + [0x00a8eb] = 230, + [0x00a8ec] = 230, + [0x00a8ed] = 230, + [0x00a8ee] = 230, + [0x00a8ef] = 230, + [0x00a8f0] = 230, + [0x00a8f1] = 230, + [0x00a92b] = 220, + [0x00a92c] = 220, + [0x00a92d] = 220, + [0x00a953] = 9, + [0x00a9b3] = 7, + [0x00a9c0] = 9, + [0x00aab0] = 230, + [0x00aab2] = 230, + [0x00aab3] = 230, + [0x00aab4] = 220, + [0x00aab7] = 230, + [0x00aab8] = 230, + [0x00aabe] = 230, + [0x00aabf] = 230, + [0x00aac1] = 230, + [0x00aaf6] = 9, + [0x00abed] = 9, + [0x00fb1e] = 26, + [0x00fe20] = 230, + [0x00fe21] = 230, + [0x00fe22] = 230, + [0x00fe23] = 230, + [0x00fe24] = 230, + [0x00fe25] = 230, + [0x00fe26] = 230, + [0x00fe27] = 220, + [0x00fe28] = 220, + [0x00fe29] = 220, + [0x00fe2a] = 220, + [0x00fe2b] = 220, + [0x00fe2c] = 220, + [0x00fe2d] = 220, + [0x00fe2e] = 230, + [0x00fe2f] = 230, + [0x0101fd] = 220, + [0x0102e0] = 220, + [0x010376] = 230, + [0x010377] = 230, + [0x010378] = 230, + [0x010379] = 230, + [0x01037a] = 230, + [0x010a0d] = 220, + [0x010a0f] = 230, + [0x010a38] = 230, + [0x010a39] = 1, + [0x010a3a] = 220, + [0x010a3f] = 9, + [0x010ae5] = 230, + [0x010ae6] = 220, + [0x011046] = 9, + [0x01107f] = 9, + [0x0110b9] = 9, + [0x0110ba] = 7, + [0x011100] = 230, + [0x011101] = 230, + [0x011102] = 230, + [0x011133] = 9, + [0x011134] = 9, + [0x011173] = 7, + [0x0111c0] = 9, + [0x0111ca] = 7, + [0x011235] = 9, + [0x011236] = 7, + [0x0112e9] = 7, + [0x0112ea] = 9, + [0x01133c] = 7, + [0x01134d] = 9, + [0x011366] = 230, + [0x011367] = 230, + [0x011368] = 230, + [0x011369] = 230, + [0x01136a] = 230, + [0x01136b] = 230, + [0x01136c] = 230, + [0x011370] = 230, + [0x011371] = 230, + [0x011372] = 230, + [0x011373] = 230, + [0x011374] = 230, + [0x0114c2] = 9, + [0x0114c3] = 7, + [0x0115bf] = 9, + [0x0115c0] = 7, + [0x01163f] = 9, + [0x0116b6] = 9, + [0x0116b7] = 7, + [0x01172b] = 9, + [0x016af0] = 1, + [0x016af1] = 1, + [0x016af2] = 1, + [0x016af3] = 1, + [0x016af4] = 1, + [0x016b30] = 230, + [0x016b31] = 230, + [0x016b32] = 230, + [0x016b33] = 230, + [0x016b34] = 230, + [0x016b35] = 230, + [0x016b36] = 230, + [0x01bc9e] = 1, + [0x01d165] = 216, + [0x01d166] = 216, + [0x01d167] = 1, + [0x01d168] = 1, + [0x01d169] = 1, + [0x01d16d] = 226, + [0x01d16e] = 216, + [0x01d16f] = 216, + [0x01d170] = 216, + [0x01d171] = 216, + [0x01d172] = 216, + [0x01d17b] = 220, + [0x01d17c] = 220, + [0x01d17d] = 220, + [0x01d17e] = 220, + [0x01d17f] = 220, + [0x01d180] = 220, + [0x01d181] = 220, + [0x01d182] = 220, + [0x01d185] = 230, + [0x01d186] = 230, + [0x01d187] = 230, + [0x01d188] = 230, + [0x01d189] = 230, + [0x01d18a] = 220, + [0x01d18b] = 220, + [0x01d1aa] = 230, + [0x01d1ab] = 230, + [0x01d1ac] = 230, + [0x01d1ad] = 230, + [0x01d242] = 230, + [0x01d243] = 230, + [0x01d244] = 230, + [0x01e8d0] = 220, + [0x01e8d1] = 220, + [0x01e8d2] = 220, + [0x01e8d3] = 220, + [0x01e8d4] = 220, + [0x01e8d5] = 220, + [0x01e8d6] = 220, + }, + + -- Characters mapped to what they decompose to + -- Note Hangul to Jamo is done separately below + decomp = { + [0x0000c0] = { 0x000041, 0x000300 }, + [0x0000c1] = { 0x000041, 0x000301 }, + [0x0000c2] = { 0x000041, 0x000302 }, + [0x0000c3] = { 0x000041, 0x000303 }, + [0x0000c4] = { 0x000041, 0x000308 }, + [0x0000c5] = { 0x000041, 0x00030a }, + [0x0000c7] = { 0x000043, 0x000327 }, + [0x0000c8] = { 0x000045, 0x000300 }, + [0x0000c9] = { 0x000045, 0x000301 }, + [0x0000ca] = { 0x000045, 0x000302 }, + [0x0000cb] = { 0x000045, 0x000308 }, + [0x0000cc] = { 0x000049, 0x000300 }, + [0x0000cd] = { 0x000049, 0x000301 }, + [0x0000ce] = { 0x000049, 0x000302 }, + [0x0000cf] = { 0x000049, 0x000308 }, + [0x0000d1] = { 0x00004e, 0x000303 }, + [0x0000d2] = { 0x00004f, 0x000300 }, + [0x0000d3] = { 0x00004f, 0x000301 }, + [0x0000d4] = { 0x00004f, 0x000302 }, + [0x0000d5] = { 0x00004f, 0x000303 }, + [0x0000d6] = { 0x00004f, 0x000308 }, + [0x0000d9] = { 0x000055, 0x000300 }, + [0x0000da] = { 0x000055, 0x000301 }, + [0x0000db] = { 0x000055, 0x000302 }, + [0x0000dc] = { 0x000055, 0x000308 }, + [0x0000dd] = { 0x000059, 0x000301 }, + [0x0000e0] = { 0x000061, 0x000300 }, + [0x0000e1] = { 0x000061, 0x000301 }, + [0x0000e2] = { 0x000061, 0x000302 }, + [0x0000e3] = { 0x000061, 0x000303 }, + [0x0000e4] = { 0x000061, 0x000308 }, + [0x0000e5] = { 0x000061, 0x00030a }, + [0x0000e7] = { 0x000063, 0x000327 }, + [0x0000e8] = { 0x000065, 0x000300 }, + [0x0000e9] = { 0x000065, 0x000301 }, + [0x0000ea] = { 0x000065, 0x000302 }, + [0x0000eb] = { 0x000065, 0x000308 }, + [0x0000ec] = { 0x000069, 0x000300 }, + [0x0000ed] = { 0x000069, 0x000301 }, + [0x0000ee] = { 0x000069, 0x000302 }, + [0x0000ef] = { 0x000069, 0x000308 }, + [0x0000f1] = { 0x00006e, 0x000303 }, + [0x0000f2] = { 0x00006f, 0x000300 }, + [0x0000f3] = { 0x00006f, 0x000301 }, + [0x0000f4] = { 0x00006f, 0x000302 }, + [0x0000f5] = { 0x00006f, 0x000303 }, + [0x0000f6] = { 0x00006f, 0x000308 }, + [0x0000f9] = { 0x000075, 0x000300 }, + [0x0000fa] = { 0x000075, 0x000301 }, + [0x0000fb] = { 0x000075, 0x000302 }, + [0x0000fc] = { 0x000075, 0x000308 }, + [0x0000fd] = { 0x000079, 0x000301 }, + [0x0000ff] = { 0x000079, 0x000308 }, + [0x000100] = { 0x000041, 0x000304 }, + [0x000101] = { 0x000061, 0x000304 }, + [0x000102] = { 0x000041, 0x000306 }, + [0x000103] = { 0x000061, 0x000306 }, + [0x000104] = { 0x000041, 0x000328 }, + [0x000105] = { 0x000061, 0x000328 }, + [0x000106] = { 0x000043, 0x000301 }, + [0x000107] = { 0x000063, 0x000301 }, + [0x000108] = { 0x000043, 0x000302 }, + [0x000109] = { 0x000063, 0x000302 }, + [0x00010a] = { 0x000043, 0x000307 }, + [0x00010b] = { 0x000063, 0x000307 }, + [0x00010c] = { 0x000043, 0x00030c }, + [0x00010d] = { 0x000063, 0x00030c }, + [0x00010e] = { 0x000044, 0x00030c }, + [0x00010f] = { 0x000064, 0x00030c }, + [0x000112] = { 0x000045, 0x000304 }, + [0x000113] = { 0x000065, 0x000304 }, + [0x000114] = { 0x000045, 0x000306 }, + [0x000115] = { 0x000065, 0x000306 }, + [0x000116] = { 0x000045, 0x000307 }, + [0x000117] = { 0x000065, 0x000307 }, + [0x000118] = { 0x000045, 0x000328 }, + [0x000119] = { 0x000065, 0x000328 }, + [0x00011a] = { 0x000045, 0x00030c }, + [0x00011b] = { 0x000065, 0x00030c }, + [0x00011c] = { 0x000047, 0x000302 }, + [0x00011d] = { 0x000067, 0x000302 }, + [0x00011e] = { 0x000047, 0x000306 }, + [0x00011f] = { 0x000067, 0x000306 }, + [0x000120] = { 0x000047, 0x000307 }, + [0x000121] = { 0x000067, 0x000307 }, + [0x000122] = { 0x000047, 0x000327 }, + [0x000123] = { 0x000067, 0x000327 }, + [0x000124] = { 0x000048, 0x000302 }, + [0x000125] = { 0x000068, 0x000302 }, + [0x000128] = { 0x000049, 0x000303 }, + [0x000129] = { 0x000069, 0x000303 }, + [0x00012a] = { 0x000049, 0x000304 }, + [0x00012b] = { 0x000069, 0x000304 }, + [0x00012c] = { 0x000049, 0x000306 }, + [0x00012d] = { 0x000069, 0x000306 }, + [0x00012e] = { 0x000049, 0x000328 }, + [0x00012f] = { 0x000069, 0x000328 }, + [0x000130] = { 0x000049, 0x000307 }, + [0x000134] = { 0x00004a, 0x000302 }, + [0x000135] = { 0x00006a, 0x000302 }, + [0x000136] = { 0x00004b, 0x000327 }, + [0x000137] = { 0x00006b, 0x000327 }, + [0x000139] = { 0x00004c, 0x000301 }, + [0x00013a] = { 0x00006c, 0x000301 }, + [0x00013b] = { 0x00004c, 0x000327 }, + [0x00013c] = { 0x00006c, 0x000327 }, + [0x00013d] = { 0x00004c, 0x00030c }, + [0x00013e] = { 0x00006c, 0x00030c }, + [0x000143] = { 0x00004e, 0x000301 }, + [0x000144] = { 0x00006e, 0x000301 }, + [0x000145] = { 0x00004e, 0x000327 }, + [0x000146] = { 0x00006e, 0x000327 }, + [0x000147] = { 0x00004e, 0x00030c }, + [0x000148] = { 0x00006e, 0x00030c }, + [0x00014c] = { 0x00004f, 0x000304 }, + [0x00014d] = { 0x00006f, 0x000304 }, + [0x00014e] = { 0x00004f, 0x000306 }, + [0x00014f] = { 0x00006f, 0x000306 }, + [0x000150] = { 0x00004f, 0x00030b }, + [0x000151] = { 0x00006f, 0x00030b }, + [0x000154] = { 0x000052, 0x000301 }, + [0x000155] = { 0x000072, 0x000301 }, + [0x000156] = { 0x000052, 0x000327 }, + [0x000157] = { 0x000072, 0x000327 }, + [0x000158] = { 0x000052, 0x00030c }, + [0x000159] = { 0x000072, 0x00030c }, + [0x00015a] = { 0x000053, 0x000301 }, + [0x00015b] = { 0x000073, 0x000301 }, + [0x00015c] = { 0x000053, 0x000302 }, + [0x00015d] = { 0x000073, 0x000302 }, + [0x00015e] = { 0x000053, 0x000327 }, + [0x00015f] = { 0x000073, 0x000327 }, + [0x000160] = { 0x000053, 0x00030c }, + [0x000161] = { 0x000073, 0x00030c }, + [0x000162] = { 0x000054, 0x000327 }, + [0x000163] = { 0x000074, 0x000327 }, + [0x000164] = { 0x000054, 0x00030c }, + [0x000165] = { 0x000074, 0x00030c }, + [0x000168] = { 0x000055, 0x000303 }, + [0x000169] = { 0x000075, 0x000303 }, + [0x00016a] = { 0x000055, 0x000304 }, + [0x00016b] = { 0x000075, 0x000304 }, + [0x00016c] = { 0x000055, 0x000306 }, + [0x00016d] = { 0x000075, 0x000306 }, + [0x00016e] = { 0x000055, 0x00030a }, + [0x00016f] = { 0x000075, 0x00030a }, + [0x000170] = { 0x000055, 0x00030b }, + [0x000171] = { 0x000075, 0x00030b }, + [0x000172] = { 0x000055, 0x000328 }, + [0x000173] = { 0x000075, 0x000328 }, + [0x000174] = { 0x000057, 0x000302 }, + [0x000175] = { 0x000077, 0x000302 }, + [0x000176] = { 0x000059, 0x000302 }, + [0x000177] = { 0x000079, 0x000302 }, + [0x000178] = { 0x000059, 0x000308 }, + [0x000179] = { 0x00005a, 0x000301 }, + [0x00017a] = { 0x00007a, 0x000301 }, + [0x00017b] = { 0x00005a, 0x000307 }, + [0x00017c] = { 0x00007a, 0x000307 }, + [0x00017d] = { 0x00005a, 0x00030c }, + [0x00017e] = { 0x00007a, 0x00030c }, + [0x0001a0] = { 0x00004f, 0x00031b }, + [0x0001a1] = { 0x00006f, 0x00031b }, + [0x0001af] = { 0x000055, 0x00031b }, + [0x0001b0] = { 0x000075, 0x00031b }, + [0x0001cd] = { 0x000041, 0x00030c }, + [0x0001ce] = { 0x000061, 0x00030c }, + [0x0001cf] = { 0x000049, 0x00030c }, + [0x0001d0] = { 0x000069, 0x00030c }, + [0x0001d1] = { 0x00004f, 0x00030c }, + [0x0001d2] = { 0x00006f, 0x00030c }, + [0x0001d3] = { 0x000055, 0x00030c }, + [0x0001d4] = { 0x000075, 0x00030c }, + [0x0001d5] = { 0x000055, 0x000308, 0x000304 }, + [0x0001d6] = { 0x000075, 0x000308, 0x000304 }, + [0x0001d7] = { 0x000055, 0x000308, 0x000301 }, + [0x0001d8] = { 0x000075, 0x000308, 0x000301 }, + [0x0001d9] = { 0x000055, 0x000308, 0x00030c }, + [0x0001da] = { 0x000075, 0x000308, 0x00030c }, + [0x0001db] = { 0x000055, 0x000308, 0x000300 }, + [0x0001dc] = { 0x000075, 0x000308, 0x000300 }, + [0x0001de] = { 0x000041, 0x000308, 0x000304 }, + [0x0001df] = { 0x000061, 0x000308, 0x000304 }, + [0x0001e0] = { 0x000041, 0x000307, 0x000304 }, + [0x0001e1] = { 0x000061, 0x000307, 0x000304 }, + [0x0001e2] = { 0x0000c6, 0x000304 }, + [0x0001e3] = { 0x0000e6, 0x000304 }, + [0x0001e6] = { 0x000047, 0x00030c }, + [0x0001e7] = { 0x000067, 0x00030c }, + [0x0001e8] = { 0x00004b, 0x00030c }, + [0x0001e9] = { 0x00006b, 0x00030c }, + [0x0001ea] = { 0x00004f, 0x000328 }, + [0x0001eb] = { 0x00006f, 0x000328 }, + [0x0001ec] = { 0x00004f, 0x000328, 0x000304 }, + [0x0001ed] = { 0x00006f, 0x000328, 0x000304 }, + [0x0001ee] = { 0x0001b7, 0x00030c }, + [0x0001ef] = { 0x000292, 0x00030c }, + [0x0001f0] = { 0x00006a, 0x00030c }, + [0x0001f4] = { 0x000047, 0x000301 }, + [0x0001f5] = { 0x000067, 0x000301 }, + [0x0001f8] = { 0x00004e, 0x000300 }, + [0x0001f9] = { 0x00006e, 0x000300 }, + [0x0001fa] = { 0x000041, 0x00030a, 0x000301 }, + [0x0001fb] = { 0x000061, 0x00030a, 0x000301 }, + [0x0001fc] = { 0x0000c6, 0x000301 }, + [0x0001fd] = { 0x0000e6, 0x000301 }, + [0x0001fe] = { 0x0000d8, 0x000301 }, + [0x0001ff] = { 0x0000f8, 0x000301 }, + [0x000200] = { 0x000041, 0x00030f }, + [0x000201] = { 0x000061, 0x00030f }, + [0x000202] = { 0x000041, 0x000311 }, + [0x000203] = { 0x000061, 0x000311 }, + [0x000204] = { 0x000045, 0x00030f }, + [0x000205] = { 0x000065, 0x00030f }, + [0x000206] = { 0x000045, 0x000311 }, + [0x000207] = { 0x000065, 0x000311 }, + [0x000208] = { 0x000049, 0x00030f }, + [0x000209] = { 0x000069, 0x00030f }, + [0x00020a] = { 0x000049, 0x000311 }, + [0x00020b] = { 0x000069, 0x000311 }, + [0x00020c] = { 0x00004f, 0x00030f }, + [0x00020d] = { 0x00006f, 0x00030f }, + [0x00020e] = { 0x00004f, 0x000311 }, + [0x00020f] = { 0x00006f, 0x000311 }, + [0x000210] = { 0x000052, 0x00030f }, + [0x000211] = { 0x000072, 0x00030f }, + [0x000212] = { 0x000052, 0x000311 }, + [0x000213] = { 0x000072, 0x000311 }, + [0x000214] = { 0x000055, 0x00030f }, + [0x000215] = { 0x000075, 0x00030f }, + [0x000216] = { 0x000055, 0x000311 }, + [0x000217] = { 0x000075, 0x000311 }, + [0x000218] = { 0x000053, 0x000326 }, + [0x000219] = { 0x000073, 0x000326 }, + [0x00021a] = { 0x000054, 0x000326 }, + [0x00021b] = { 0x000074, 0x000326 }, + [0x00021e] = { 0x000048, 0x00030c }, + [0x00021f] = { 0x000068, 0x00030c }, + [0x000226] = { 0x000041, 0x000307 }, + [0x000227] = { 0x000061, 0x000307 }, + [0x000228] = { 0x000045, 0x000327 }, + [0x000229] = { 0x000065, 0x000327 }, + [0x00022a] = { 0x00004f, 0x000308, 0x000304 }, + [0x00022b] = { 0x00006f, 0x000308, 0x000304 }, + [0x00022c] = { 0x00004f, 0x000303, 0x000304 }, + [0x00022d] = { 0x00006f, 0x000303, 0x000304 }, + [0x00022e] = { 0x00004f, 0x000307 }, + [0x00022f] = { 0x00006f, 0x000307 }, + [0x000230] = { 0x00004f, 0x000307, 0x000304 }, + [0x000231] = { 0x00006f, 0x000307, 0x000304 }, + [0x000232] = { 0x000059, 0x000304 }, + [0x000233] = { 0x000079, 0x000304 }, + [0x000340] = { 0x000300 }, + [0x000341] = { 0x000301 }, + [0x000343] = { 0x000313 }, + [0x000344] = { 0x000308, 0x000301 }, + [0x000374] = { 0x0002b9 }, + [0x00037e] = { 0x00003b }, + [0x000385] = { 0x0000a8, 0x000301 }, + [0x000386] = { 0x000391, 0x000301 }, + [0x000387] = { 0x0000b7 }, + [0x000388] = { 0x000395, 0x000301 }, + [0x000389] = { 0x000397, 0x000301 }, + [0x00038a] = { 0x000399, 0x000301 }, + [0x00038c] = { 0x00039f, 0x000301 }, + [0x00038e] = { 0x0003a5, 0x000301 }, + [0x00038f] = { 0x0003a9, 0x000301 }, + [0x000390] = { 0x0003b9, 0x000308, 0x000301 }, + [0x0003aa] = { 0x000399, 0x000308 }, + [0x0003ab] = { 0x0003a5, 0x000308 }, + [0x0003ac] = { 0x0003b1, 0x000301 }, + [0x0003ad] = { 0x0003b5, 0x000301 }, + [0x0003ae] = { 0x0003b7, 0x000301 }, + [0x0003af] = { 0x0003b9, 0x000301 }, + [0x0003b0] = { 0x0003c5, 0x000308, 0x000301 }, + [0x0003ca] = { 0x0003b9, 0x000308 }, + [0x0003cb] = { 0x0003c5, 0x000308 }, + [0x0003cc] = { 0x0003bf, 0x000301 }, + [0x0003cd] = { 0x0003c5, 0x000301 }, + [0x0003ce] = { 0x0003c9, 0x000301 }, + [0x0003d3] = { 0x0003d2, 0x000301 }, + [0x0003d4] = { 0x0003d2, 0x000308 }, + [0x000400] = { 0x000415, 0x000300 }, + [0x000401] = { 0x000415, 0x000308 }, + [0x000403] = { 0x000413, 0x000301 }, + [0x000407] = { 0x000406, 0x000308 }, + [0x00040c] = { 0x00041a, 0x000301 }, + [0x00040d] = { 0x000418, 0x000300 }, + [0x00040e] = { 0x000423, 0x000306 }, + [0x000419] = { 0x000418, 0x000306 }, + [0x000439] = { 0x000438, 0x000306 }, + [0x000450] = { 0x000435, 0x000300 }, + [0x000451] = { 0x000435, 0x000308 }, + [0x000453] = { 0x000433, 0x000301 }, + [0x000457] = { 0x000456, 0x000308 }, + [0x00045c] = { 0x00043a, 0x000301 }, + [0x00045d] = { 0x000438, 0x000300 }, + [0x00045e] = { 0x000443, 0x000306 }, + [0x000476] = { 0x000474, 0x00030f }, + [0x000477] = { 0x000475, 0x00030f }, + [0x0004c1] = { 0x000416, 0x000306 }, + [0x0004c2] = { 0x000436, 0x000306 }, + [0x0004d0] = { 0x000410, 0x000306 }, + [0x0004d1] = { 0x000430, 0x000306 }, + [0x0004d2] = { 0x000410, 0x000308 }, + [0x0004d3] = { 0x000430, 0x000308 }, + [0x0004d6] = { 0x000415, 0x000306 }, + [0x0004d7] = { 0x000435, 0x000306 }, + [0x0004da] = { 0x0004d8, 0x000308 }, + [0x0004db] = { 0x0004d9, 0x000308 }, + [0x0004dc] = { 0x000416, 0x000308 }, + [0x0004dd] = { 0x000436, 0x000308 }, + [0x0004de] = { 0x000417, 0x000308 }, + [0x0004df] = { 0x000437, 0x000308 }, + [0x0004e2] = { 0x000418, 0x000304 }, + [0x0004e3] = { 0x000438, 0x000304 }, + [0x0004e4] = { 0x000418, 0x000308 }, + [0x0004e5] = { 0x000438, 0x000308 }, + [0x0004e6] = { 0x00041e, 0x000308 }, + [0x0004e7] = { 0x00043e, 0x000308 }, + [0x0004ea] = { 0x0004e8, 0x000308 }, + [0x0004eb] = { 0x0004e9, 0x000308 }, + [0x0004ec] = { 0x00042d, 0x000308 }, + [0x0004ed] = { 0x00044d, 0x000308 }, + [0x0004ee] = { 0x000423, 0x000304 }, + [0x0004ef] = { 0x000443, 0x000304 }, + [0x0004f0] = { 0x000423, 0x000308 }, + [0x0004f1] = { 0x000443, 0x000308 }, + [0x0004f2] = { 0x000423, 0x00030b }, + [0x0004f3] = { 0x000443, 0x00030b }, + [0x0004f4] = { 0x000427, 0x000308 }, + [0x0004f5] = { 0x000447, 0x000308 }, + [0x0004f8] = { 0x00042b, 0x000308 }, + [0x0004f9] = { 0x00044b, 0x000308 }, + [0x000622] = { 0x000627, 0x000653 }, + [0x000623] = { 0x000627, 0x000654 }, + [0x000624] = { 0x000648, 0x000654 }, + [0x000625] = { 0x000627, 0x000655 }, + [0x000626] = { 0x00064a, 0x000654 }, + [0x0006c0] = { 0x0006d5, 0x000654 }, + [0x0006c2] = { 0x0006c1, 0x000654 }, + [0x0006d3] = { 0x0006d2, 0x000654 }, + [0x000929] = { 0x000928, 0x00093c }, + [0x000931] = { 0x000930, 0x00093c }, + [0x000934] = { 0x000933, 0x00093c }, + [0x000958] = { 0x000915, 0x00093c }, + [0x000959] = { 0x000916, 0x00093c }, + [0x00095a] = { 0x000917, 0x00093c }, + [0x00095b] = { 0x00091c, 0x00093c }, + [0x00095c] = { 0x000921, 0x00093c }, + [0x00095d] = { 0x000922, 0x00093c }, + [0x00095e] = { 0x00092b, 0x00093c }, + [0x00095f] = { 0x00092f, 0x00093c }, + [0x0009cb] = { 0x0009c7, 0x0009be }, + [0x0009cc] = { 0x0009c7, 0x0009d7 }, + [0x0009dc] = { 0x0009a1, 0x0009bc }, + [0x0009dd] = { 0x0009a2, 0x0009bc }, + [0x0009df] = { 0x0009af, 0x0009bc }, + [0x000a33] = { 0x000a32, 0x000a3c }, + [0x000a36] = { 0x000a38, 0x000a3c }, + [0x000a59] = { 0x000a16, 0x000a3c }, + [0x000a5a] = { 0x000a17, 0x000a3c }, + [0x000a5b] = { 0x000a1c, 0x000a3c }, + [0x000a5e] = { 0x000a2b, 0x000a3c }, + [0x000b48] = { 0x000b47, 0x000b56 }, + [0x000b4b] = { 0x000b47, 0x000b3e }, + [0x000b4c] = { 0x000b47, 0x000b57 }, + [0x000b5c] = { 0x000b21, 0x000b3c }, + [0x000b5d] = { 0x000b22, 0x000b3c }, + [0x000b94] = { 0x000b92, 0x000bd7 }, + [0x000bca] = { 0x000bc6, 0x000bbe }, + [0x000bcb] = { 0x000bc7, 0x000bbe }, + [0x000bcc] = { 0x000bc6, 0x000bd7 }, + [0x000c48] = { 0x000c46, 0x000c56 }, + [0x000cc0] = { 0x000cbf, 0x000cd5 }, + [0x000cc7] = { 0x000cc6, 0x000cd5 }, + [0x000cc8] = { 0x000cc6, 0x000cd6 }, + [0x000cca] = { 0x000cc6, 0x000cc2 }, + [0x000ccb] = { 0x000cc6, 0x000cc2, 0x000cd5 }, + [0x000d4a] = { 0x000d46, 0x000d3e }, + [0x000d4b] = { 0x000d47, 0x000d3e }, + [0x000d4c] = { 0x000d46, 0x000d57 }, + [0x000dda] = { 0x000dd9, 0x000dca }, + [0x000ddc] = { 0x000dd9, 0x000dcf }, + [0x000ddd] = { 0x000dd9, 0x000dcf, 0x000dca }, + [0x000dde] = { 0x000dd9, 0x000ddf }, + [0x000f43] = { 0x000f42, 0x000fb7 }, + [0x000f4d] = { 0x000f4c, 0x000fb7 }, + [0x000f52] = { 0x000f51, 0x000fb7 }, + [0x000f57] = { 0x000f56, 0x000fb7 }, + [0x000f5c] = { 0x000f5b, 0x000fb7 }, + [0x000f69] = { 0x000f40, 0x000fb5 }, + [0x000f73] = { 0x000f71, 0x000f72 }, + [0x000f75] = { 0x000f71, 0x000f74 }, + [0x000f76] = { 0x000fb2, 0x000f80 }, + [0x000f78] = { 0x000fb3, 0x000f80 }, + [0x000f81] = { 0x000f71, 0x000f80 }, + [0x000f93] = { 0x000f92, 0x000fb7 }, + [0x000f9d] = { 0x000f9c, 0x000fb7 }, + [0x000fa2] = { 0x000fa1, 0x000fb7 }, + [0x000fa7] = { 0x000fa6, 0x000fb7 }, + [0x000fac] = { 0x000fab, 0x000fb7 }, + [0x000fb9] = { 0x000f90, 0x000fb5 }, + [0x001026] = { 0x001025, 0x00102e }, + [0x001b06] = { 0x001b05, 0x001b35 }, + [0x001b08] = { 0x001b07, 0x001b35 }, + [0x001b0a] = { 0x001b09, 0x001b35 }, + [0x001b0c] = { 0x001b0b, 0x001b35 }, + [0x001b0e] = { 0x001b0d, 0x001b35 }, + [0x001b12] = { 0x001b11, 0x001b35 }, + [0x001b3b] = { 0x001b3a, 0x001b35 }, + [0x001b3d] = { 0x001b3c, 0x001b35 }, + [0x001b40] = { 0x001b3e, 0x001b35 }, + [0x001b41] = { 0x001b3f, 0x001b35 }, + [0x001b43] = { 0x001b42, 0x001b35 }, + [0x001e00] = { 0x000041, 0x000325 }, + [0x001e01] = { 0x000061, 0x000325 }, + [0x001e02] = { 0x000042, 0x000307 }, + [0x001e03] = { 0x000062, 0x000307 }, + [0x001e04] = { 0x000042, 0x000323 }, + [0x001e05] = { 0x000062, 0x000323 }, + [0x001e06] = { 0x000042, 0x000331 }, + [0x001e07] = { 0x000062, 0x000331 }, + [0x001e08] = { 0x000043, 0x000327, 0x000301 }, + [0x001e09] = { 0x000063, 0x000327, 0x000301 }, + [0x001e0a] = { 0x000044, 0x000307 }, + [0x001e0b] = { 0x000064, 0x000307 }, + [0x001e0c] = { 0x000044, 0x000323 }, + [0x001e0d] = { 0x000064, 0x000323 }, + [0x001e0e] = { 0x000044, 0x000331 }, + [0x001e0f] = { 0x000064, 0x000331 }, + [0x001e10] = { 0x000044, 0x000327 }, + [0x001e11] = { 0x000064, 0x000327 }, + [0x001e12] = { 0x000044, 0x00032d }, + [0x001e13] = { 0x000064, 0x00032d }, + [0x001e14] = { 0x000045, 0x000304, 0x000300 }, + [0x001e15] = { 0x000065, 0x000304, 0x000300 }, + [0x001e16] = { 0x000045, 0x000304, 0x000301 }, + [0x001e17] = { 0x000065, 0x000304, 0x000301 }, + [0x001e18] = { 0x000045, 0x00032d }, + [0x001e19] = { 0x000065, 0x00032d }, + [0x001e1a] = { 0x000045, 0x000330 }, + [0x001e1b] = { 0x000065, 0x000330 }, + [0x001e1c] = { 0x000045, 0x000327, 0x000306 }, + [0x001e1d] = { 0x000065, 0x000327, 0x000306 }, + [0x001e1e] = { 0x000046, 0x000307 }, + [0x001e1f] = { 0x000066, 0x000307 }, + [0x001e20] = { 0x000047, 0x000304 }, + [0x001e21] = { 0x000067, 0x000304 }, + [0x001e22] = { 0x000048, 0x000307 }, + [0x001e23] = { 0x000068, 0x000307 }, + [0x001e24] = { 0x000048, 0x000323 }, + [0x001e25] = { 0x000068, 0x000323 }, + [0x001e26] = { 0x000048, 0x000308 }, + [0x001e27] = { 0x000068, 0x000308 }, + [0x001e28] = { 0x000048, 0x000327 }, + [0x001e29] = { 0x000068, 0x000327 }, + [0x001e2a] = { 0x000048, 0x00032e }, + [0x001e2b] = { 0x000068, 0x00032e }, + [0x001e2c] = { 0x000049, 0x000330 }, + [0x001e2d] = { 0x000069, 0x000330 }, + [0x001e2e] = { 0x000049, 0x000308, 0x000301 }, + [0x001e2f] = { 0x000069, 0x000308, 0x000301 }, + [0x001e30] = { 0x00004b, 0x000301 }, + [0x001e31] = { 0x00006b, 0x000301 }, + [0x001e32] = { 0x00004b, 0x000323 }, + [0x001e33] = { 0x00006b, 0x000323 }, + [0x001e34] = { 0x00004b, 0x000331 }, + [0x001e35] = { 0x00006b, 0x000331 }, + [0x001e36] = { 0x00004c, 0x000323 }, + [0x001e37] = { 0x00006c, 0x000323 }, + [0x001e38] = { 0x00004c, 0x000323, 0x000304 }, + [0x001e39] = { 0x00006c, 0x000323, 0x000304 }, + [0x001e3a] = { 0x00004c, 0x000331 }, + [0x001e3b] = { 0x00006c, 0x000331 }, + [0x001e3c] = { 0x00004c, 0x00032d }, + [0x001e3d] = { 0x00006c, 0x00032d }, + [0x001e3e] = { 0x00004d, 0x000301 }, + [0x001e3f] = { 0x00006d, 0x000301 }, + [0x001e40] = { 0x00004d, 0x000307 }, + [0x001e41] = { 0x00006d, 0x000307 }, + [0x001e42] = { 0x00004d, 0x000323 }, + [0x001e43] = { 0x00006d, 0x000323 }, + [0x001e44] = { 0x00004e, 0x000307 }, + [0x001e45] = { 0x00006e, 0x000307 }, + [0x001e46] = { 0x00004e, 0x000323 }, + [0x001e47] = { 0x00006e, 0x000323 }, + [0x001e48] = { 0x00004e, 0x000331 }, + [0x001e49] = { 0x00006e, 0x000331 }, + [0x001e4a] = { 0x00004e, 0x00032d }, + [0x001e4b] = { 0x00006e, 0x00032d }, + [0x001e4c] = { 0x00004f, 0x000303, 0x000301 }, + [0x001e4d] = { 0x00006f, 0x000303, 0x000301 }, + [0x001e4e] = { 0x00004f, 0x000303, 0x000308 }, + [0x001e4f] = { 0x00006f, 0x000303, 0x000308 }, + [0x001e50] = { 0x00004f, 0x000304, 0x000300 }, + [0x001e51] = { 0x00006f, 0x000304, 0x000300 }, + [0x001e52] = { 0x00004f, 0x000304, 0x000301 }, + [0x001e53] = { 0x00006f, 0x000304, 0x000301 }, + [0x001e54] = { 0x000050, 0x000301 }, + [0x001e55] = { 0x000070, 0x000301 }, + [0x001e56] = { 0x000050, 0x000307 }, + [0x001e57] = { 0x000070, 0x000307 }, + [0x001e58] = { 0x000052, 0x000307 }, + [0x001e59] = { 0x000072, 0x000307 }, + [0x001e5a] = { 0x000052, 0x000323 }, + [0x001e5b] = { 0x000072, 0x000323 }, + [0x001e5c] = { 0x000052, 0x000323, 0x000304 }, + [0x001e5d] = { 0x000072, 0x000323, 0x000304 }, + [0x001e5e] = { 0x000052, 0x000331 }, + [0x001e5f] = { 0x000072, 0x000331 }, + [0x001e60] = { 0x000053, 0x000307 }, + [0x001e61] = { 0x000073, 0x000307 }, + [0x001e62] = { 0x000053, 0x000323 }, + [0x001e63] = { 0x000073, 0x000323 }, + [0x001e64] = { 0x000053, 0x000301, 0x000307 }, + [0x001e65] = { 0x000073, 0x000301, 0x000307 }, + [0x001e66] = { 0x000053, 0x00030c, 0x000307 }, + [0x001e67] = { 0x000073, 0x00030c, 0x000307 }, + [0x001e68] = { 0x000053, 0x000323, 0x000307 }, + [0x001e69] = { 0x000073, 0x000323, 0x000307 }, + [0x001e6a] = { 0x000054, 0x000307 }, + [0x001e6b] = { 0x000074, 0x000307 }, + [0x001e6c] = { 0x000054, 0x000323 }, + [0x001e6d] = { 0x000074, 0x000323 }, + [0x001e6e] = { 0x000054, 0x000331 }, + [0x001e6f] = { 0x000074, 0x000331 }, + [0x001e70] = { 0x000054, 0x00032d }, + [0x001e71] = { 0x000074, 0x00032d }, + [0x001e72] = { 0x000055, 0x000324 }, + [0x001e73] = { 0x000075, 0x000324 }, + [0x001e74] = { 0x000055, 0x000330 }, + [0x001e75] = { 0x000075, 0x000330 }, + [0x001e76] = { 0x000055, 0x00032d }, + [0x001e77] = { 0x000075, 0x00032d }, + [0x001e78] = { 0x000055, 0x000303, 0x000301 }, + [0x001e79] = { 0x000075, 0x000303, 0x000301 }, + [0x001e7a] = { 0x000055, 0x000304, 0x000308 }, + [0x001e7b] = { 0x000075, 0x000304, 0x000308 }, + [0x001e7c] = { 0x000056, 0x000303 }, + [0x001e7d] = { 0x000076, 0x000303 }, + [0x001e7e] = { 0x000056, 0x000323 }, + [0x001e7f] = { 0x000076, 0x000323 }, + [0x001e80] = { 0x000057, 0x000300 }, + [0x001e81] = { 0x000077, 0x000300 }, + [0x001e82] = { 0x000057, 0x000301 }, + [0x001e83] = { 0x000077, 0x000301 }, + [0x001e84] = { 0x000057, 0x000308 }, + [0x001e85] = { 0x000077, 0x000308 }, + [0x001e86] = { 0x000057, 0x000307 }, + [0x001e87] = { 0x000077, 0x000307 }, + [0x001e88] = { 0x000057, 0x000323 }, + [0x001e89] = { 0x000077, 0x000323 }, + [0x001e8a] = { 0x000058, 0x000307 }, + [0x001e8b] = { 0x000078, 0x000307 }, + [0x001e8c] = { 0x000058, 0x000308 }, + [0x001e8d] = { 0x000078, 0x000308 }, + [0x001e8e] = { 0x000059, 0x000307 }, + [0x001e8f] = { 0x000079, 0x000307 }, + [0x001e90] = { 0x00005a, 0x000302 }, + [0x001e91] = { 0x00007a, 0x000302 }, + [0x001e92] = { 0x00005a, 0x000323 }, + [0x001e93] = { 0x00007a, 0x000323 }, + [0x001e94] = { 0x00005a, 0x000331 }, + [0x001e95] = { 0x00007a, 0x000331 }, + [0x001e96] = { 0x000068, 0x000331 }, + [0x001e97] = { 0x000074, 0x000308 }, + [0x001e98] = { 0x000077, 0x00030a }, + [0x001e99] = { 0x000079, 0x00030a }, + [0x001e9b] = { 0x00017f, 0x000307 }, + [0x001ea0] = { 0x000041, 0x000323 }, + [0x001ea1] = { 0x000061, 0x000323 }, + [0x001ea2] = { 0x000041, 0x000309 }, + [0x001ea3] = { 0x000061, 0x000309 }, + [0x001ea4] = { 0x000041, 0x000302, 0x000301 }, + [0x001ea5] = { 0x000061, 0x000302, 0x000301 }, + [0x001ea6] = { 0x000041, 0x000302, 0x000300 }, + [0x001ea7] = { 0x000061, 0x000302, 0x000300 }, + [0x001ea8] = { 0x000041, 0x000302, 0x000309 }, + [0x001ea9] = { 0x000061, 0x000302, 0x000309 }, + [0x001eaa] = { 0x000041, 0x000302, 0x000303 }, + [0x001eab] = { 0x000061, 0x000302, 0x000303 }, + [0x001eac] = { 0x000041, 0x000323, 0x000302 }, + [0x001ead] = { 0x000061, 0x000323, 0x000302 }, + [0x001eae] = { 0x000041, 0x000306, 0x000301 }, + [0x001eaf] = { 0x000061, 0x000306, 0x000301 }, + [0x001eb0] = { 0x000041, 0x000306, 0x000300 }, + [0x001eb1] = { 0x000061, 0x000306, 0x000300 }, + [0x001eb2] = { 0x000041, 0x000306, 0x000309 }, + [0x001eb3] = { 0x000061, 0x000306, 0x000309 }, + [0x001eb4] = { 0x000041, 0x000306, 0x000303 }, + [0x001eb5] = { 0x000061, 0x000306, 0x000303 }, + [0x001eb6] = { 0x000041, 0x000323, 0x000306 }, + [0x001eb7] = { 0x000061, 0x000323, 0x000306 }, + [0x001eb8] = { 0x000045, 0x000323 }, + [0x001eb9] = { 0x000065, 0x000323 }, + [0x001eba] = { 0x000045, 0x000309 }, + [0x001ebb] = { 0x000065, 0x000309 }, + [0x001ebc] = { 0x000045, 0x000303 }, + [0x001ebd] = { 0x000065, 0x000303 }, + [0x001ebe] = { 0x000045, 0x000302, 0x000301 }, + [0x001ebf] = { 0x000065, 0x000302, 0x000301 }, + [0x001ec0] = { 0x000045, 0x000302, 0x000300 }, + [0x001ec1] = { 0x000065, 0x000302, 0x000300 }, + [0x001ec2] = { 0x000045, 0x000302, 0x000309 }, + [0x001ec3] = { 0x000065, 0x000302, 0x000309 }, + [0x001ec4] = { 0x000045, 0x000302, 0x000303 }, + [0x001ec5] = { 0x000065, 0x000302, 0x000303 }, + [0x001ec6] = { 0x000045, 0x000323, 0x000302 }, + [0x001ec7] = { 0x000065, 0x000323, 0x000302 }, + [0x001ec8] = { 0x000049, 0x000309 }, + [0x001ec9] = { 0x000069, 0x000309 }, + [0x001eca] = { 0x000049, 0x000323 }, + [0x001ecb] = { 0x000069, 0x000323 }, + [0x001ecc] = { 0x00004f, 0x000323 }, + [0x001ecd] = { 0x00006f, 0x000323 }, + [0x001ece] = { 0x00004f, 0x000309 }, + [0x001ecf] = { 0x00006f, 0x000309 }, + [0x001ed0] = { 0x00004f, 0x000302, 0x000301 }, + [0x001ed1] = { 0x00006f, 0x000302, 0x000301 }, + [0x001ed2] = { 0x00004f, 0x000302, 0x000300 }, + [0x001ed3] = { 0x00006f, 0x000302, 0x000300 }, + [0x001ed4] = { 0x00004f, 0x000302, 0x000309 }, + [0x001ed5] = { 0x00006f, 0x000302, 0x000309 }, + [0x001ed6] = { 0x00004f, 0x000302, 0x000303 }, + [0x001ed7] = { 0x00006f, 0x000302, 0x000303 }, + [0x001ed8] = { 0x00004f, 0x000323, 0x000302 }, + [0x001ed9] = { 0x00006f, 0x000323, 0x000302 }, + [0x001eda] = { 0x00004f, 0x00031b, 0x000301 }, + [0x001edb] = { 0x00006f, 0x00031b, 0x000301 }, + [0x001edc] = { 0x00004f, 0x00031b, 0x000300 }, + [0x001edd] = { 0x00006f, 0x00031b, 0x000300 }, + [0x001ede] = { 0x00004f, 0x00031b, 0x000309 }, + [0x001edf] = { 0x00006f, 0x00031b, 0x000309 }, + [0x001ee0] = { 0x00004f, 0x00031b, 0x000303 }, + [0x001ee1] = { 0x00006f, 0x00031b, 0x000303 }, + [0x001ee2] = { 0x00004f, 0x00031b, 0x000323 }, + [0x001ee3] = { 0x00006f, 0x00031b, 0x000323 }, + [0x001ee4] = { 0x000055, 0x000323 }, + [0x001ee5] = { 0x000075, 0x000323 }, + [0x001ee6] = { 0x000055, 0x000309 }, + [0x001ee7] = { 0x000075, 0x000309 }, + [0x001ee8] = { 0x000055, 0x00031b, 0x000301 }, + [0x001ee9] = { 0x000075, 0x00031b, 0x000301 }, + [0x001eea] = { 0x000055, 0x00031b, 0x000300 }, + [0x001eeb] = { 0x000075, 0x00031b, 0x000300 }, + [0x001eec] = { 0x000055, 0x00031b, 0x000309 }, + [0x001eed] = { 0x000075, 0x00031b, 0x000309 }, + [0x001eee] = { 0x000055, 0x00031b, 0x000303 }, + [0x001eef] = { 0x000075, 0x00031b, 0x000303 }, + [0x001ef0] = { 0x000055, 0x00031b, 0x000323 }, + [0x001ef1] = { 0x000075, 0x00031b, 0x000323 }, + [0x001ef2] = { 0x000059, 0x000300 }, + [0x001ef3] = { 0x000079, 0x000300 }, + [0x001ef4] = { 0x000059, 0x000323 }, + [0x001ef5] = { 0x000079, 0x000323 }, + [0x001ef6] = { 0x000059, 0x000309 }, + [0x001ef7] = { 0x000079, 0x000309 }, + [0x001ef8] = { 0x000059, 0x000303 }, + [0x001ef9] = { 0x000079, 0x000303 }, + [0x001f00] = { 0x0003b1, 0x000313 }, + [0x001f01] = { 0x0003b1, 0x000314 }, + [0x001f02] = { 0x0003b1, 0x000313, 0x000300 }, + [0x001f03] = { 0x0003b1, 0x000314, 0x000300 }, + [0x001f04] = { 0x0003b1, 0x000313, 0x000301 }, + [0x001f05] = { 0x0003b1, 0x000314, 0x000301 }, + [0x001f06] = { 0x0003b1, 0x000313, 0x000342 }, + [0x001f07] = { 0x0003b1, 0x000314, 0x000342 }, + [0x001f08] = { 0x000391, 0x000313 }, + [0x001f09] = { 0x000391, 0x000314 }, + [0x001f0a] = { 0x000391, 0x000313, 0x000300 }, + [0x001f0b] = { 0x000391, 0x000314, 0x000300 }, + [0x001f0c] = { 0x000391, 0x000313, 0x000301 }, + [0x001f0d] = { 0x000391, 0x000314, 0x000301 }, + [0x001f0e] = { 0x000391, 0x000313, 0x000342 }, + [0x001f0f] = { 0x000391, 0x000314, 0x000342 }, + [0x001f10] = { 0x0003b5, 0x000313 }, + [0x001f11] = { 0x0003b5, 0x000314 }, + [0x001f12] = { 0x0003b5, 0x000313, 0x000300 }, + [0x001f13] = { 0x0003b5, 0x000314, 0x000300 }, + [0x001f14] = { 0x0003b5, 0x000313, 0x000301 }, + [0x001f15] = { 0x0003b5, 0x000314, 0x000301 }, + [0x001f18] = { 0x000395, 0x000313 }, + [0x001f19] = { 0x000395, 0x000314 }, + [0x001f1a] = { 0x000395, 0x000313, 0x000300 }, + [0x001f1b] = { 0x000395, 0x000314, 0x000300 }, + [0x001f1c] = { 0x000395, 0x000313, 0x000301 }, + [0x001f1d] = { 0x000395, 0x000314, 0x000301 }, + [0x001f20] = { 0x0003b7, 0x000313 }, + [0x001f21] = { 0x0003b7, 0x000314 }, + [0x001f22] = { 0x0003b7, 0x000313, 0x000300 }, + [0x001f23] = { 0x0003b7, 0x000314, 0x000300 }, + [0x001f24] = { 0x0003b7, 0x000313, 0x000301 }, + [0x001f25] = { 0x0003b7, 0x000314, 0x000301 }, + [0x001f26] = { 0x0003b7, 0x000313, 0x000342 }, + [0x001f27] = { 0x0003b7, 0x000314, 0x000342 }, + [0x001f28] = { 0x000397, 0x000313 }, + [0x001f29] = { 0x000397, 0x000314 }, + [0x001f2a] = { 0x000397, 0x000313, 0x000300 }, + [0x001f2b] = { 0x000397, 0x000314, 0x000300 }, + [0x001f2c] = { 0x000397, 0x000313, 0x000301 }, + [0x001f2d] = { 0x000397, 0x000314, 0x000301 }, + [0x001f2e] = { 0x000397, 0x000313, 0x000342 }, + [0x001f2f] = { 0x000397, 0x000314, 0x000342 }, + [0x001f30] = { 0x0003b9, 0x000313 }, + [0x001f31] = { 0x0003b9, 0x000314 }, + [0x001f32] = { 0x0003b9, 0x000313, 0x000300 }, + [0x001f33] = { 0x0003b9, 0x000314, 0x000300 }, + [0x001f34] = { 0x0003b9, 0x000313, 0x000301 }, + [0x001f35] = { 0x0003b9, 0x000314, 0x000301 }, + [0x001f36] = { 0x0003b9, 0x000313, 0x000342 }, + [0x001f37] = { 0x0003b9, 0x000314, 0x000342 }, + [0x001f38] = { 0x000399, 0x000313 }, + [0x001f39] = { 0x000399, 0x000314 }, + [0x001f3a] = { 0x000399, 0x000313, 0x000300 }, + [0x001f3b] = { 0x000399, 0x000314, 0x000300 }, + [0x001f3c] = { 0x000399, 0x000313, 0x000301 }, + [0x001f3d] = { 0x000399, 0x000314, 0x000301 }, + [0x001f3e] = { 0x000399, 0x000313, 0x000342 }, + [0x001f3f] = { 0x000399, 0x000314, 0x000342 }, + [0x001f40] = { 0x0003bf, 0x000313 }, + [0x001f41] = { 0x0003bf, 0x000314 }, + [0x001f42] = { 0x0003bf, 0x000313, 0x000300 }, + [0x001f43] = { 0x0003bf, 0x000314, 0x000300 }, + [0x001f44] = { 0x0003bf, 0x000313, 0x000301 }, + [0x001f45] = { 0x0003bf, 0x000314, 0x000301 }, + [0x001f48] = { 0x00039f, 0x000313 }, + [0x001f49] = { 0x00039f, 0x000314 }, + [0x001f4a] = { 0x00039f, 0x000313, 0x000300 }, + [0x001f4b] = { 0x00039f, 0x000314, 0x000300 }, + [0x001f4c] = { 0x00039f, 0x000313, 0x000301 }, + [0x001f4d] = { 0x00039f, 0x000314, 0x000301 }, + [0x001f50] = { 0x0003c5, 0x000313 }, + [0x001f51] = { 0x0003c5, 0x000314 }, + [0x001f52] = { 0x0003c5, 0x000313, 0x000300 }, + [0x001f53] = { 0x0003c5, 0x000314, 0x000300 }, + [0x001f54] = { 0x0003c5, 0x000313, 0x000301 }, + [0x001f55] = { 0x0003c5, 0x000314, 0x000301 }, + [0x001f56] = { 0x0003c5, 0x000313, 0x000342 }, + [0x001f57] = { 0x0003c5, 0x000314, 0x000342 }, + [0x001f59] = { 0x0003a5, 0x000314 }, + [0x001f5b] = { 0x0003a5, 0x000314, 0x000300 }, + [0x001f5d] = { 0x0003a5, 0x000314, 0x000301 }, + [0x001f5f] = { 0x0003a5, 0x000314, 0x000342 }, + [0x001f60] = { 0x0003c9, 0x000313 }, + [0x001f61] = { 0x0003c9, 0x000314 }, + [0x001f62] = { 0x0003c9, 0x000313, 0x000300 }, + [0x001f63] = { 0x0003c9, 0x000314, 0x000300 }, + [0x001f64] = { 0x0003c9, 0x000313, 0x000301 }, + [0x001f65] = { 0x0003c9, 0x000314, 0x000301 }, + [0x001f66] = { 0x0003c9, 0x000313, 0x000342 }, + [0x001f67] = { 0x0003c9, 0x000314, 0x000342 }, + [0x001f68] = { 0x0003a9, 0x000313 }, + [0x001f69] = { 0x0003a9, 0x000314 }, + [0x001f6a] = { 0x0003a9, 0x000313, 0x000300 }, + [0x001f6b] = { 0x0003a9, 0x000314, 0x000300 }, + [0x001f6c] = { 0x0003a9, 0x000313, 0x000301 }, + [0x001f6d] = { 0x0003a9, 0x000314, 0x000301 }, + [0x001f6e] = { 0x0003a9, 0x000313, 0x000342 }, + [0x001f6f] = { 0x0003a9, 0x000314, 0x000342 }, + [0x001f70] = { 0x0003b1, 0x000300 }, + [0x001f71] = { 0x0003b1, 0x000301 }, + [0x001f72] = { 0x0003b5, 0x000300 }, + [0x001f73] = { 0x0003b5, 0x000301 }, + [0x001f74] = { 0x0003b7, 0x000300 }, + [0x001f75] = { 0x0003b7, 0x000301 }, + [0x001f76] = { 0x0003b9, 0x000300 }, + [0x001f77] = { 0x0003b9, 0x000301 }, + [0x001f78] = { 0x0003bf, 0x000300 }, + [0x001f79] = { 0x0003bf, 0x000301 }, + [0x001f7a] = { 0x0003c5, 0x000300 }, + [0x001f7b] = { 0x0003c5, 0x000301 }, + [0x001f7c] = { 0x0003c9, 0x000300 }, + [0x001f7d] = { 0x0003c9, 0x000301 }, + [0x001f80] = { 0x0003b1, 0x000313, 0x000345 }, + [0x001f81] = { 0x0003b1, 0x000314, 0x000345 }, + [0x001f82] = { 0x0003b1, 0x000313, 0x000300, 0x000345 }, + [0x001f83] = { 0x0003b1, 0x000314, 0x000300, 0x000345 }, + [0x001f84] = { 0x0003b1, 0x000313, 0x000301, 0x000345 }, + [0x001f85] = { 0x0003b1, 0x000314, 0x000301, 0x000345 }, + [0x001f86] = { 0x0003b1, 0x000313, 0x000342, 0x000345 }, + [0x001f87] = { 0x0003b1, 0x000314, 0x000342, 0x000345 }, + [0x001f88] = { 0x000391, 0x000313, 0x000345 }, + [0x001f89] = { 0x000391, 0x000314, 0x000345 }, + [0x001f8a] = { 0x000391, 0x000313, 0x000300, 0x000345 }, + [0x001f8b] = { 0x000391, 0x000314, 0x000300, 0x000345 }, + [0x001f8c] = { 0x000391, 0x000313, 0x000301, 0x000345 }, + [0x001f8d] = { 0x000391, 0x000314, 0x000301, 0x000345 }, + [0x001f8e] = { 0x000391, 0x000313, 0x000342, 0x000345 }, + [0x001f8f] = { 0x000391, 0x000314, 0x000342, 0x000345 }, + [0x001f90] = { 0x0003b7, 0x000313, 0x000345 }, + [0x001f91] = { 0x0003b7, 0x000314, 0x000345 }, + [0x001f92] = { 0x0003b7, 0x000313, 0x000300, 0x000345 }, + [0x001f93] = { 0x0003b7, 0x000314, 0x000300, 0x000345 }, + [0x001f94] = { 0x0003b7, 0x000313, 0x000301, 0x000345 }, + [0x001f95] = { 0x0003b7, 0x000314, 0x000301, 0x000345 }, + [0x001f96] = { 0x0003b7, 0x000313, 0x000342, 0x000345 }, + [0x001f97] = { 0x0003b7, 0x000314, 0x000342, 0x000345 }, + [0x001f98] = { 0x000397, 0x000313, 0x000345 }, + [0x001f99] = { 0x000397, 0x000314, 0x000345 }, + [0x001f9a] = { 0x000397, 0x000313, 0x000300, 0x000345 }, + [0x001f9b] = { 0x000397, 0x000314, 0x000300, 0x000345 }, + [0x001f9c] = { 0x000397, 0x000313, 0x000301, 0x000345 }, + [0x001f9d] = { 0x000397, 0x000314, 0x000301, 0x000345 }, + [0x001f9e] = { 0x000397, 0x000313, 0x000342, 0x000345 }, + [0x001f9f] = { 0x000397, 0x000314, 0x000342, 0x000345 }, + [0x001fa0] = { 0x0003c9, 0x000313, 0x000345 }, + [0x001fa1] = { 0x0003c9, 0x000314, 0x000345 }, + [0x001fa2] = { 0x0003c9, 0x000313, 0x000300, 0x000345 }, + [0x001fa3] = { 0x0003c9, 0x000314, 0x000300, 0x000345 }, + [0x001fa4] = { 0x0003c9, 0x000313, 0x000301, 0x000345 }, + [0x001fa5] = { 0x0003c9, 0x000314, 0x000301, 0x000345 }, + [0x001fa6] = { 0x0003c9, 0x000313, 0x000342, 0x000345 }, + [0x001fa7] = { 0x0003c9, 0x000314, 0x000342, 0x000345 }, + [0x001fa8] = { 0x0003a9, 0x000313, 0x000345 }, + [0x001fa9] = { 0x0003a9, 0x000314, 0x000345 }, + [0x001faa] = { 0x0003a9, 0x000313, 0x000300, 0x000345 }, + [0x001fab] = { 0x0003a9, 0x000314, 0x000300, 0x000345 }, + [0x001fac] = { 0x0003a9, 0x000313, 0x000301, 0x000345 }, + [0x001fad] = { 0x0003a9, 0x000314, 0x000301, 0x000345 }, + [0x001fae] = { 0x0003a9, 0x000313, 0x000342, 0x000345 }, + [0x001faf] = { 0x0003a9, 0x000314, 0x000342, 0x000345 }, + [0x001fb0] = { 0x0003b1, 0x000306 }, + [0x001fb1] = { 0x0003b1, 0x000304 }, + [0x001fb2] = { 0x0003b1, 0x000300, 0x000345 }, + [0x001fb3] = { 0x0003b1, 0x000345 }, + [0x001fb4] = { 0x0003b1, 0x000301, 0x000345 }, + [0x001fb6] = { 0x0003b1, 0x000342 }, + [0x001fb7] = { 0x0003b1, 0x000342, 0x000345 }, + [0x001fb8] = { 0x000391, 0x000306 }, + [0x001fb9] = { 0x000391, 0x000304 }, + [0x001fba] = { 0x000391, 0x000300 }, + [0x001fbb] = { 0x000391, 0x000301 }, + [0x001fbc] = { 0x000391, 0x000345 }, + [0x001fbe] = { 0x0003b9 }, + [0x001fc1] = { 0x0000a8, 0x000342 }, + [0x001fc2] = { 0x0003b7, 0x000300, 0x000345 }, + [0x001fc3] = { 0x0003b7, 0x000345 }, + [0x001fc4] = { 0x0003b7, 0x000301, 0x000345 }, + [0x001fc6] = { 0x0003b7, 0x000342 }, + [0x001fc7] = { 0x0003b7, 0x000342, 0x000345 }, + [0x001fc8] = { 0x000395, 0x000300 }, + [0x001fc9] = { 0x000395, 0x000301 }, + [0x001fca] = { 0x000397, 0x000300 }, + [0x001fcb] = { 0x000397, 0x000301 }, + [0x001fcc] = { 0x000397, 0x000345 }, + [0x001fcd] = { 0x001fbf, 0x000300 }, + [0x001fce] = { 0x001fbf, 0x000301 }, + [0x001fcf] = { 0x001fbf, 0x000342 }, + [0x001fd0] = { 0x0003b9, 0x000306 }, + [0x001fd1] = { 0x0003b9, 0x000304 }, + [0x001fd2] = { 0x0003b9, 0x000308, 0x000300 }, + [0x001fd3] = { 0x0003b9, 0x000308, 0x000301 }, + [0x001fd6] = { 0x0003b9, 0x000342 }, + [0x001fd7] = { 0x0003b9, 0x000308, 0x000342 }, + [0x001fd8] = { 0x000399, 0x000306 }, + [0x001fd9] = { 0x000399, 0x000304 }, + [0x001fda] = { 0x000399, 0x000300 }, + [0x001fdb] = { 0x000399, 0x000301 }, + [0x001fdd] = { 0x001ffe, 0x000300 }, + [0x001fde] = { 0x001ffe, 0x000301 }, + [0x001fdf] = { 0x001ffe, 0x000342 }, + [0x001fe0] = { 0x0003c5, 0x000306 }, + [0x001fe1] = { 0x0003c5, 0x000304 }, + [0x001fe2] = { 0x0003c5, 0x000308, 0x000300 }, + [0x001fe3] = { 0x0003c5, 0x000308, 0x000301 }, + [0x001fe4] = { 0x0003c1, 0x000313 }, + [0x001fe5] = { 0x0003c1, 0x000314 }, + [0x001fe6] = { 0x0003c5, 0x000342 }, + [0x001fe7] = { 0x0003c5, 0x000308, 0x000342 }, + [0x001fe8] = { 0x0003a5, 0x000306 }, + [0x001fe9] = { 0x0003a5, 0x000304 }, + [0x001fea] = { 0x0003a5, 0x000300 }, + [0x001feb] = { 0x0003a5, 0x000301 }, + [0x001fec] = { 0x0003a1, 0x000314 }, + [0x001fed] = { 0x0000a8, 0x000300 }, + [0x001fee] = { 0x0000a8, 0x000301 }, + [0x001fef] = { 0x000060 }, + [0x001ff2] = { 0x0003c9, 0x000300, 0x000345 }, + [0x001ff3] = { 0x0003c9, 0x000345 }, + [0x001ff4] = { 0x0003c9, 0x000301, 0x000345 }, + [0x001ff6] = { 0x0003c9, 0x000342 }, + [0x001ff7] = { 0x0003c9, 0x000342, 0x000345 }, + [0x001ff8] = { 0x00039f, 0x000300 }, + [0x001ff9] = { 0x00039f, 0x000301 }, + [0x001ffa] = { 0x0003a9, 0x000300 }, + [0x001ffb] = { 0x0003a9, 0x000301 }, + [0x001ffc] = { 0x0003a9, 0x000345 }, + [0x001ffd] = { 0x0000b4 }, + [0x002000] = { 0x002002 }, + [0x002001] = { 0x002003 }, + [0x002126] = { 0x0003a9 }, + [0x00212a] = { 0x00004b }, + [0x00212b] = { 0x000041, 0x00030a }, + [0x00219a] = { 0x002190, 0x000338 }, + [0x00219b] = { 0x002192, 0x000338 }, + [0x0021ae] = { 0x002194, 0x000338 }, + [0x0021cd] = { 0x0021d0, 0x000338 }, + [0x0021ce] = { 0x0021d4, 0x000338 }, + [0x0021cf] = { 0x0021d2, 0x000338 }, + [0x002204] = { 0x002203, 0x000338 }, + [0x002209] = { 0x002208, 0x000338 }, + [0x00220c] = { 0x00220b, 0x000338 }, + [0x002224] = { 0x002223, 0x000338 }, + [0x002226] = { 0x002225, 0x000338 }, + [0x002241] = { 0x00223c, 0x000338 }, + [0x002244] = { 0x002243, 0x000338 }, + [0x002247] = { 0x002245, 0x000338 }, + [0x002249] = { 0x002248, 0x000338 }, + [0x002260] = { 0x00003d, 0x000338 }, + [0x002262] = { 0x002261, 0x000338 }, + [0x00226d] = { 0x00224d, 0x000338 }, + [0x00226e] = { 0x00003c, 0x000338 }, + [0x00226f] = { 0x00003e, 0x000338 }, + [0x002270] = { 0x002264, 0x000338 }, + [0x002271] = { 0x002265, 0x000338 }, + [0x002274] = { 0x002272, 0x000338 }, + [0x002275] = { 0x002273, 0x000338 }, + [0x002278] = { 0x002276, 0x000338 }, + [0x002279] = { 0x002277, 0x000338 }, + [0x002280] = { 0x00227a, 0x000338 }, + [0x002281] = { 0x00227b, 0x000338 }, + [0x002284] = { 0x002282, 0x000338 }, + [0x002285] = { 0x002283, 0x000338 }, + [0x002288] = { 0x002286, 0x000338 }, + [0x002289] = { 0x002287, 0x000338 }, + [0x0022ac] = { 0x0022a2, 0x000338 }, + [0x0022ad] = { 0x0022a8, 0x000338 }, + [0x0022ae] = { 0x0022a9, 0x000338 }, + [0x0022af] = { 0x0022ab, 0x000338 }, + [0x0022e0] = { 0x00227c, 0x000338 }, + [0x0022e1] = { 0x00227d, 0x000338 }, + [0x0022e2] = { 0x002291, 0x000338 }, + [0x0022e3] = { 0x002292, 0x000338 }, + [0x0022ea] = { 0x0022b2, 0x000338 }, + [0x0022eb] = { 0x0022b3, 0x000338 }, + [0x0022ec] = { 0x0022b4, 0x000338 }, + [0x0022ed] = { 0x0022b5, 0x000338 }, + [0x002329] = { 0x003008 }, + [0x00232a] = { 0x003009 }, + [0x002adc] = { 0x002add, 0x000338 }, + [0x00304c] = { 0x00304b, 0x003099 }, + [0x00304e] = { 0x00304d, 0x003099 }, + [0x003050] = { 0x00304f, 0x003099 }, + [0x003052] = { 0x003051, 0x003099 }, + [0x003054] = { 0x003053, 0x003099 }, + [0x003056] = { 0x003055, 0x003099 }, + [0x003058] = { 0x003057, 0x003099 }, + [0x00305a] = { 0x003059, 0x003099 }, + [0x00305c] = { 0x00305b, 0x003099 }, + [0x00305e] = { 0x00305d, 0x003099 }, + [0x003060] = { 0x00305f, 0x003099 }, + [0x003062] = { 0x003061, 0x003099 }, + [0x003065] = { 0x003064, 0x003099 }, + [0x003067] = { 0x003066, 0x003099 }, + [0x003069] = { 0x003068, 0x003099 }, + [0x003070] = { 0x00306f, 0x003099 }, + [0x003071] = { 0x00306f, 0x00309a }, + [0x003073] = { 0x003072, 0x003099 }, + [0x003074] = { 0x003072, 0x00309a }, + [0x003076] = { 0x003075, 0x003099 }, + [0x003077] = { 0x003075, 0x00309a }, + [0x003079] = { 0x003078, 0x003099 }, + [0x00307a] = { 0x003078, 0x00309a }, + [0x00307c] = { 0x00307b, 0x003099 }, + [0x00307d] = { 0x00307b, 0x00309a }, + [0x003094] = { 0x003046, 0x003099 }, + [0x00309e] = { 0x00309d, 0x003099 }, + [0x0030ac] = { 0x0030ab, 0x003099 }, + [0x0030ae] = { 0x0030ad, 0x003099 }, + [0x0030b0] = { 0x0030af, 0x003099 }, + [0x0030b2] = { 0x0030b1, 0x003099 }, + [0x0030b4] = { 0x0030b3, 0x003099 }, + [0x0030b6] = { 0x0030b5, 0x003099 }, + [0x0030b8] = { 0x0030b7, 0x003099 }, + [0x0030ba] = { 0x0030b9, 0x003099 }, + [0x0030bc] = { 0x0030bb, 0x003099 }, + [0x0030be] = { 0x0030bd, 0x003099 }, + [0x0030c0] = { 0x0030bf, 0x003099 }, + [0x0030c2] = { 0x0030c1, 0x003099 }, + [0x0030c5] = { 0x0030c4, 0x003099 }, + [0x0030c7] = { 0x0030c6, 0x003099 }, + [0x0030c9] = { 0x0030c8, 0x003099 }, + [0x0030d0] = { 0x0030cf, 0x003099 }, + [0x0030d1] = { 0x0030cf, 0x00309a }, + [0x0030d3] = { 0x0030d2, 0x003099 }, + [0x0030d4] = { 0x0030d2, 0x00309a }, + [0x0030d6] = { 0x0030d5, 0x003099 }, + [0x0030d7] = { 0x0030d5, 0x00309a }, + [0x0030d9] = { 0x0030d8, 0x003099 }, + [0x0030da] = { 0x0030d8, 0x00309a }, + [0x0030dc] = { 0x0030db, 0x003099 }, + [0x0030dd] = { 0x0030db, 0x00309a }, + [0x0030f4] = { 0x0030a6, 0x003099 }, + [0x0030f7] = { 0x0030ef, 0x003099 }, + [0x0030f8] = { 0x0030f0, 0x003099 }, + [0x0030f9] = { 0x0030f1, 0x003099 }, + [0x0030fa] = { 0x0030f2, 0x003099 }, + [0x0030fe] = { 0x0030fd, 0x003099 }, + [0x00f900] = { 0x008c48 }, + [0x00f901] = { 0x0066f4 }, + [0x00f902] = { 0x008eca }, + [0x00f903] = { 0x008cc8 }, + [0x00f904] = { 0x006ed1 }, + [0x00f905] = { 0x004e32 }, + [0x00f906] = { 0x0053e5 }, + [0x00f907] = { 0x009f9c }, + [0x00f908] = { 0x009f9c }, + [0x00f909] = { 0x005951 }, + [0x00f90a] = { 0x0091d1 }, + [0x00f90b] = { 0x005587 }, + [0x00f90c] = { 0x005948 }, + [0x00f90d] = { 0x0061f6 }, + [0x00f90e] = { 0x007669 }, + [0x00f90f] = { 0x007f85 }, + [0x00f910] = { 0x00863f }, + [0x00f911] = { 0x0087ba }, + [0x00f912] = { 0x0088f8 }, + [0x00f913] = { 0x00908f }, + [0x00f914] = { 0x006a02 }, + [0x00f915] = { 0x006d1b }, + [0x00f916] = { 0x0070d9 }, + [0x00f917] = { 0x0073de }, + [0x00f918] = { 0x00843d }, + [0x00f919] = { 0x00916a }, + [0x00f91a] = { 0x0099f1 }, + [0x00f91b] = { 0x004e82 }, + [0x00f91c] = { 0x005375 }, + [0x00f91d] = { 0x006b04 }, + [0x00f91e] = { 0x00721b }, + [0x00f91f] = { 0x00862d }, + [0x00f920] = { 0x009e1e }, + [0x00f921] = { 0x005d50 }, + [0x00f922] = { 0x006feb }, + [0x00f923] = { 0x0085cd }, + [0x00f924] = { 0x008964 }, + [0x00f925] = { 0x0062c9 }, + [0x00f926] = { 0x0081d8 }, + [0x00f927] = { 0x00881f }, + [0x00f928] = { 0x005eca }, + [0x00f929] = { 0x006717 }, + [0x00f92a] = { 0x006d6a }, + [0x00f92b] = { 0x0072fc }, + [0x00f92c] = { 0x0090ce }, + [0x00f92d] = { 0x004f86 }, + [0x00f92e] = { 0x0051b7 }, + [0x00f92f] = { 0x0052de }, + [0x00f930] = { 0x0064c4 }, + [0x00f931] = { 0x006ad3 }, + [0x00f932] = { 0x007210 }, + [0x00f933] = { 0x0076e7 }, + [0x00f934] = { 0x008001 }, + [0x00f935] = { 0x008606 }, + [0x00f936] = { 0x00865c }, + [0x00f937] = { 0x008def }, + [0x00f938] = { 0x009732 }, + [0x00f939] = { 0x009b6f }, + [0x00f93a] = { 0x009dfa }, + [0x00f93b] = { 0x00788c }, + [0x00f93c] = { 0x00797f }, + [0x00f93d] = { 0x007da0 }, + [0x00f93e] = { 0x0083c9 }, + [0x00f93f] = { 0x009304 }, + [0x00f940] = { 0x009e7f }, + [0x00f941] = { 0x008ad6 }, + [0x00f942] = { 0x0058df }, + [0x00f943] = { 0x005f04 }, + [0x00f944] = { 0x007c60 }, + [0x00f945] = { 0x00807e }, + [0x00f946] = { 0x007262 }, + [0x00f947] = { 0x0078ca }, + [0x00f948] = { 0x008cc2 }, + [0x00f949] = { 0x0096f7 }, + [0x00f94a] = { 0x0058d8 }, + [0x00f94b] = { 0x005c62 }, + [0x00f94c] = { 0x006a13 }, + [0x00f94d] = { 0x006dda }, + [0x00f94e] = { 0x006f0f }, + [0x00f94f] = { 0x007d2f }, + [0x00f950] = { 0x007e37 }, + [0x00f951] = { 0x00964b }, + [0x00f952] = { 0x0052d2 }, + [0x00f953] = { 0x00808b }, + [0x00f954] = { 0x0051dc }, + [0x00f955] = { 0x0051cc }, + [0x00f956] = { 0x007a1c }, + [0x00f957] = { 0x007dbe }, + [0x00f958] = { 0x0083f1 }, + [0x00f959] = { 0x009675 }, + [0x00f95a] = { 0x008b80 }, + [0x00f95b] = { 0x0062cf }, + [0x00f95c] = { 0x006a02 }, + [0x00f95d] = { 0x008afe }, + [0x00f95e] = { 0x004e39 }, + [0x00f95f] = { 0x005be7 }, + [0x00f960] = { 0x006012 }, + [0x00f961] = { 0x007387 }, + [0x00f962] = { 0x007570 }, + [0x00f963] = { 0x005317 }, + [0x00f964] = { 0x0078fb }, + [0x00f965] = { 0x004fbf }, + [0x00f966] = { 0x005fa9 }, + [0x00f967] = { 0x004e0d }, + [0x00f968] = { 0x006ccc }, + [0x00f969] = { 0x006578 }, + [0x00f96a] = { 0x007d22 }, + [0x00f96b] = { 0x0053c3 }, + [0x00f96c] = { 0x00585e }, + [0x00f96d] = { 0x007701 }, + [0x00f96e] = { 0x008449 }, + [0x00f96f] = { 0x008aaa }, + [0x00f970] = { 0x006bba }, + [0x00f971] = { 0x008fb0 }, + [0x00f972] = { 0x006c88 }, + [0x00f973] = { 0x0062fe }, + [0x00f974] = { 0x0082e5 }, + [0x00f975] = { 0x0063a0 }, + [0x00f976] = { 0x007565 }, + [0x00f977] = { 0x004eae }, + [0x00f978] = { 0x005169 }, + [0x00f979] = { 0x0051c9 }, + [0x00f97a] = { 0x006881 }, + [0x00f97b] = { 0x007ce7 }, + [0x00f97c] = { 0x00826f }, + [0x00f97d] = { 0x008ad2 }, + [0x00f97e] = { 0x0091cf }, + [0x00f97f] = { 0x0052f5 }, + [0x00f980] = { 0x005442 }, + [0x00f981] = { 0x005973 }, + [0x00f982] = { 0x005eec }, + [0x00f983] = { 0x0065c5 }, + [0x00f984] = { 0x006ffe }, + [0x00f985] = { 0x00792a }, + [0x00f986] = { 0x0095ad }, + [0x00f987] = { 0x009a6a }, + [0x00f988] = { 0x009e97 }, + [0x00f989] = { 0x009ece }, + [0x00f98a] = { 0x00529b }, + [0x00f98b] = { 0x0066c6 }, + [0x00f98c] = { 0x006b77 }, + [0x00f98d] = { 0x008f62 }, + [0x00f98e] = { 0x005e74 }, + [0x00f98f] = { 0x006190 }, + [0x00f990] = { 0x006200 }, + [0x00f991] = { 0x00649a }, + [0x00f992] = { 0x006f23 }, + [0x00f993] = { 0x007149 }, + [0x00f994] = { 0x007489 }, + [0x00f995] = { 0x0079ca }, + [0x00f996] = { 0x007df4 }, + [0x00f997] = { 0x00806f }, + [0x00f998] = { 0x008f26 }, + [0x00f999] = { 0x0084ee }, + [0x00f99a] = { 0x009023 }, + [0x00f99b] = { 0x00934a }, + [0x00f99c] = { 0x005217 }, + [0x00f99d] = { 0x0052a3 }, + [0x00f99e] = { 0x0054bd }, + [0x00f99f] = { 0x0070c8 }, + [0x00f9a0] = { 0x0088c2 }, + [0x00f9a1] = { 0x008aaa }, + [0x00f9a2] = { 0x005ec9 }, + [0x00f9a3] = { 0x005ff5 }, + [0x00f9a4] = { 0x00637b }, + [0x00f9a5] = { 0x006bae }, + [0x00f9a6] = { 0x007c3e }, + [0x00f9a7] = { 0x007375 }, + [0x00f9a8] = { 0x004ee4 }, + [0x00f9a9] = { 0x0056f9 }, + [0x00f9aa] = { 0x005be7 }, + [0x00f9ab] = { 0x005dba }, + [0x00f9ac] = { 0x00601c }, + [0x00f9ad] = { 0x0073b2 }, + [0x00f9ae] = { 0x007469 }, + [0x00f9af] = { 0x007f9a }, + [0x00f9b0] = { 0x008046 }, + [0x00f9b1] = { 0x009234 }, + [0x00f9b2] = { 0x0096f6 }, + [0x00f9b3] = { 0x009748 }, + [0x00f9b4] = { 0x009818 }, + [0x00f9b5] = { 0x004f8b }, + [0x00f9b6] = { 0x0079ae }, + [0x00f9b7] = { 0x0091b4 }, + [0x00f9b8] = { 0x0096b8 }, + [0x00f9b9] = { 0x0060e1 }, + [0x00f9ba] = { 0x004e86 }, + [0x00f9bb] = { 0x0050da }, + [0x00f9bc] = { 0x005bee }, + [0x00f9bd] = { 0x005c3f }, + [0x00f9be] = { 0x006599 }, + [0x00f9bf] = { 0x006a02 }, + [0x00f9c0] = { 0x0071ce }, + [0x00f9c1] = { 0x007642 }, + [0x00f9c2] = { 0x0084fc }, + [0x00f9c3] = { 0x00907c }, + [0x00f9c4] = { 0x009f8d }, + [0x00f9c5] = { 0x006688 }, + [0x00f9c6] = { 0x00962e }, + [0x00f9c7] = { 0x005289 }, + [0x00f9c8] = { 0x00677b }, + [0x00f9c9] = { 0x0067f3 }, + [0x00f9ca] = { 0x006d41 }, + [0x00f9cb] = { 0x006e9c }, + [0x00f9cc] = { 0x007409 }, + [0x00f9cd] = { 0x007559 }, + [0x00f9ce] = { 0x00786b }, + [0x00f9cf] = { 0x007d10 }, + [0x00f9d0] = { 0x00985e }, + [0x00f9d1] = { 0x00516d }, + [0x00f9d2] = { 0x00622e }, + [0x00f9d3] = { 0x009678 }, + [0x00f9d4] = { 0x00502b }, + [0x00f9d5] = { 0x005d19 }, + [0x00f9d6] = { 0x006dea }, + [0x00f9d7] = { 0x008f2a }, + [0x00f9d8] = { 0x005f8b }, + [0x00f9d9] = { 0x006144 }, + [0x00f9da] = { 0x006817 }, + [0x00f9db] = { 0x007387 }, + [0x00f9dc] = { 0x009686 }, + [0x00f9dd] = { 0x005229 }, + [0x00f9de] = { 0x00540f }, + [0x00f9df] = { 0x005c65 }, + [0x00f9e0] = { 0x006613 }, + [0x00f9e1] = { 0x00674e }, + [0x00f9e2] = { 0x0068a8 }, + [0x00f9e3] = { 0x006ce5 }, + [0x00f9e4] = { 0x007406 }, + [0x00f9e5] = { 0x0075e2 }, + [0x00f9e6] = { 0x007f79 }, + [0x00f9e7] = { 0x0088cf }, + [0x00f9e8] = { 0x0088e1 }, + [0x00f9e9] = { 0x0091cc }, + [0x00f9ea] = { 0x0096e2 }, + [0x00f9eb] = { 0x00533f }, + [0x00f9ec] = { 0x006eba }, + [0x00f9ed] = { 0x00541d }, + [0x00f9ee] = { 0x0071d0 }, + [0x00f9ef] = { 0x007498 }, + [0x00f9f0] = { 0x0085fa }, + [0x00f9f1] = { 0x0096a3 }, + [0x00f9f2] = { 0x009c57 }, + [0x00f9f3] = { 0x009e9f }, + [0x00f9f4] = { 0x006797 }, + [0x00f9f5] = { 0x006dcb }, + [0x00f9f6] = { 0x0081e8 }, + [0x00f9f7] = { 0x007acb }, + [0x00f9f8] = { 0x007b20 }, + [0x00f9f9] = { 0x007c92 }, + [0x00f9fa] = { 0x0072c0 }, + [0x00f9fb] = { 0x007099 }, + [0x00f9fc] = { 0x008b58 }, + [0x00f9fd] = { 0x004ec0 }, + [0x00f9fe] = { 0x008336 }, + [0x00f9ff] = { 0x00523a }, + [0x00fa00] = { 0x005207 }, + [0x00fa01] = { 0x005ea6 }, + [0x00fa02] = { 0x0062d3 }, + [0x00fa03] = { 0x007cd6 }, + [0x00fa04] = { 0x005b85 }, + [0x00fa05] = { 0x006d1e }, + [0x00fa06] = { 0x0066b4 }, + [0x00fa07] = { 0x008f3b }, + [0x00fa08] = { 0x00884c }, + [0x00fa09] = { 0x00964d }, + [0x00fa0a] = { 0x00898b }, + [0x00fa0b] = { 0x005ed3 }, + [0x00fa0c] = { 0x005140 }, + [0x00fa0d] = { 0x0055c0 }, + [0x00fa10] = { 0x00585a }, + [0x00fa12] = { 0x006674 }, + [0x00fa15] = { 0x0051de }, + [0x00fa16] = { 0x00732a }, + [0x00fa17] = { 0x0076ca }, + [0x00fa18] = { 0x00793c }, + [0x00fa19] = { 0x00795e }, + [0x00fa1a] = { 0x007965 }, + [0x00fa1b] = { 0x00798f }, + [0x00fa1c] = { 0x009756 }, + [0x00fa1d] = { 0x007cbe }, + [0x00fa1e] = { 0x007fbd }, + [0x00fa20] = { 0x008612 }, + [0x00fa22] = { 0x008af8 }, + [0x00fa25] = { 0x009038 }, + [0x00fa26] = { 0x0090fd }, + [0x00fa2a] = { 0x0098ef }, + [0x00fa2b] = { 0x0098fc }, + [0x00fa2c] = { 0x009928 }, + [0x00fa2d] = { 0x009db4 }, + [0x00fa2e] = { 0x0090de }, + [0x00fa2f] = { 0x0096b7 }, + [0x00fa30] = { 0x004fae }, + [0x00fa31] = { 0x0050e7 }, + [0x00fa32] = { 0x00514d }, + [0x00fa33] = { 0x0052c9 }, + [0x00fa34] = { 0x0052e4 }, + [0x00fa35] = { 0x005351 }, + [0x00fa36] = { 0x00559d }, + [0x00fa37] = { 0x005606 }, + [0x00fa38] = { 0x005668 }, + [0x00fa39] = { 0x005840 }, + [0x00fa3a] = { 0x0058a8 }, + [0x00fa3b] = { 0x005c64 }, + [0x00fa3c] = { 0x005c6e }, + [0x00fa3d] = { 0x006094 }, + [0x00fa3e] = { 0x006168 }, + [0x00fa3f] = { 0x00618e }, + [0x00fa40] = { 0x0061f2 }, + [0x00fa41] = { 0x00654f }, + [0x00fa42] = { 0x0065e2 }, + [0x00fa43] = { 0x006691 }, + [0x00fa44] = { 0x006885 }, + [0x00fa45] = { 0x006d77 }, + [0x00fa46] = { 0x006e1a }, + [0x00fa47] = { 0x006f22 }, + [0x00fa48] = { 0x00716e }, + [0x00fa49] = { 0x00722b }, + [0x00fa4a] = { 0x007422 }, + [0x00fa4b] = { 0x007891 }, + [0x00fa4c] = { 0x00793e }, + [0x00fa4d] = { 0x007949 }, + [0x00fa4e] = { 0x007948 }, + [0x00fa4f] = { 0x007950 }, + [0x00fa50] = { 0x007956 }, + [0x00fa51] = { 0x00795d }, + [0x00fa52] = { 0x00798d }, + [0x00fa53] = { 0x00798e }, + [0x00fa54] = { 0x007a40 }, + [0x00fa55] = { 0x007a81 }, + [0x00fa56] = { 0x007bc0 }, + [0x00fa57] = { 0x007df4 }, + [0x00fa58] = { 0x007e09 }, + [0x00fa59] = { 0x007e41 }, + [0x00fa5a] = { 0x007f72 }, + [0x00fa5b] = { 0x008005 }, + [0x00fa5c] = { 0x0081ed }, + [0x00fa5d] = { 0x008279 }, + [0x00fa5e] = { 0x008279 }, + [0x00fa5f] = { 0x008457 }, + [0x00fa60] = { 0x008910 }, + [0x00fa61] = { 0x008996 }, + [0x00fa62] = { 0x008b01 }, + [0x00fa63] = { 0x008b39 }, + [0x00fa64] = { 0x008cd3 }, + [0x00fa65] = { 0x008d08 }, + [0x00fa66] = { 0x008fb6 }, + [0x00fa67] = { 0x009038 }, + [0x00fa68] = { 0x0096e3 }, + [0x00fa69] = { 0x0097ff }, + [0x00fa6a] = { 0x00983b }, + [0x00fa6b] = { 0x006075 }, + [0x00fa6c] = { 0x0242ee }, + [0x00fa6d] = { 0x008218 }, + [0x00fa70] = { 0x004e26 }, + [0x00fa71] = { 0x0051b5 }, + [0x00fa72] = { 0x005168 }, + [0x00fa73] = { 0x004f80 }, + [0x00fa74] = { 0x005145 }, + [0x00fa75] = { 0x005180 }, + [0x00fa76] = { 0x0052c7 }, + [0x00fa77] = { 0x0052fa }, + [0x00fa78] = { 0x00559d }, + [0x00fa79] = { 0x005555 }, + [0x00fa7a] = { 0x005599 }, + [0x00fa7b] = { 0x0055e2 }, + [0x00fa7c] = { 0x00585a }, + [0x00fa7d] = { 0x0058b3 }, + [0x00fa7e] = { 0x005944 }, + [0x00fa7f] = { 0x005954 }, + [0x00fa80] = { 0x005a62 }, + [0x00fa81] = { 0x005b28 }, + [0x00fa82] = { 0x005ed2 }, + [0x00fa83] = { 0x005ed9 }, + [0x00fa84] = { 0x005f69 }, + [0x00fa85] = { 0x005fad }, + [0x00fa86] = { 0x0060d8 }, + [0x00fa87] = { 0x00614e }, + [0x00fa88] = { 0x006108 }, + [0x00fa89] = { 0x00618e }, + [0x00fa8a] = { 0x006160 }, + [0x00fa8b] = { 0x0061f2 }, + [0x00fa8c] = { 0x006234 }, + [0x00fa8d] = { 0x0063c4 }, + [0x00fa8e] = { 0x00641c }, + [0x00fa8f] = { 0x006452 }, + [0x00fa90] = { 0x006556 }, + [0x00fa91] = { 0x006674 }, + [0x00fa92] = { 0x006717 }, + [0x00fa93] = { 0x00671b }, + [0x00fa94] = { 0x006756 }, + [0x00fa95] = { 0x006b79 }, + [0x00fa96] = { 0x006bba }, + [0x00fa97] = { 0x006d41 }, + [0x00fa98] = { 0x006edb }, + [0x00fa99] = { 0x006ecb }, + [0x00fa9a] = { 0x006f22 }, + [0x00fa9b] = { 0x00701e }, + [0x00fa9c] = { 0x00716e }, + [0x00fa9d] = { 0x0077a7 }, + [0x00fa9e] = { 0x007235 }, + [0x00fa9f] = { 0x0072af }, + [0x00faa0] = { 0x00732a }, + [0x00faa1] = { 0x007471 }, + [0x00faa2] = { 0x007506 }, + [0x00faa3] = { 0x00753b }, + [0x00faa4] = { 0x00761d }, + [0x00faa5] = { 0x00761f }, + [0x00faa6] = { 0x0076ca }, + [0x00faa7] = { 0x0076db }, + [0x00faa8] = { 0x0076f4 }, + [0x00faa9] = { 0x00774a }, + [0x00faaa] = { 0x007740 }, + [0x00faab] = { 0x0078cc }, + [0x00faac] = { 0x007ab1 }, + [0x00faad] = { 0x007bc0 }, + [0x00faae] = { 0x007c7b }, + [0x00faaf] = { 0x007d5b }, + [0x00fab0] = { 0x007df4 }, + [0x00fab1] = { 0x007f3e }, + [0x00fab2] = { 0x008005 }, + [0x00fab3] = { 0x008352 }, + [0x00fab4] = { 0x0083ef }, + [0x00fab5] = { 0x008779 }, + [0x00fab6] = { 0x008941 }, + [0x00fab7] = { 0x008986 }, + [0x00fab8] = { 0x008996 }, + [0x00fab9] = { 0x008abf }, + [0x00faba] = { 0x008af8 }, + [0x00fabb] = { 0x008acb }, + [0x00fabc] = { 0x008b01 }, + [0x00fabd] = { 0x008afe }, + [0x00fabe] = { 0x008aed }, + [0x00fabf] = { 0x008b39 }, + [0x00fac0] = { 0x008b8a }, + [0x00fac1] = { 0x008d08 }, + [0x00fac2] = { 0x008f38 }, + [0x00fac3] = { 0x009072 }, + [0x00fac4] = { 0x009199 }, + [0x00fac5] = { 0x009276 }, + [0x00fac6] = { 0x00967c }, + [0x00fac7] = { 0x0096e3 }, + [0x00fac8] = { 0x009756 }, + [0x00fac9] = { 0x0097db }, + [0x00faca] = { 0x0097ff }, + [0x00facb] = { 0x00980b }, + [0x00facc] = { 0x00983b }, + [0x00facd] = { 0x009b12 }, + [0x00face] = { 0x009f9c }, + [0x00facf] = { 0x02284a }, + [0x00fad0] = { 0x022844 }, + [0x00fad1] = { 0x0233d5 }, + [0x00fad2] = { 0x003b9d }, + [0x00fad3] = { 0x004018 }, + [0x00fad4] = { 0x004039 }, + [0x00fad5] = { 0x025249 }, + [0x00fad6] = { 0x025cd0 }, + [0x00fad7] = { 0x027ed3 }, + [0x00fad8] = { 0x009f43 }, + [0x00fad9] = { 0x009f8e }, + [0x00fb1d] = { 0x0005d9, 0x0005b4 }, + [0x00fb1f] = { 0x0005f2, 0x0005b7 }, + [0x00fb2a] = { 0x0005e9, 0x0005c1 }, + [0x00fb2b] = { 0x0005e9, 0x0005c2 }, + [0x00fb2c] = { 0x0005e9, 0x0005bc, 0x0005c1 }, + [0x00fb2d] = { 0x0005e9, 0x0005bc, 0x0005c2 }, + [0x00fb2e] = { 0x0005d0, 0x0005b7 }, + [0x00fb2f] = { 0x0005d0, 0x0005b8 }, + [0x00fb30] = { 0x0005d0, 0x0005bc }, + [0x00fb31] = { 0x0005d1, 0x0005bc }, + [0x00fb32] = { 0x0005d2, 0x0005bc }, + [0x00fb33] = { 0x0005d3, 0x0005bc }, + [0x00fb34] = { 0x0005d4, 0x0005bc }, + [0x00fb35] = { 0x0005d5, 0x0005bc }, + [0x00fb36] = { 0x0005d6, 0x0005bc }, + [0x00fb38] = { 0x0005d8, 0x0005bc }, + [0x00fb39] = { 0x0005d9, 0x0005bc }, + [0x00fb3a] = { 0x0005da, 0x0005bc }, + [0x00fb3b] = { 0x0005db, 0x0005bc }, + [0x00fb3c] = { 0x0005dc, 0x0005bc }, + [0x00fb3e] = { 0x0005de, 0x0005bc }, + [0x00fb40] = { 0x0005e0, 0x0005bc }, + [0x00fb41] = { 0x0005e1, 0x0005bc }, + [0x00fb43] = { 0x0005e3, 0x0005bc }, + [0x00fb44] = { 0x0005e4, 0x0005bc }, + [0x00fb46] = { 0x0005e6, 0x0005bc }, + [0x00fb47] = { 0x0005e7, 0x0005bc }, + [0x00fb48] = { 0x0005e8, 0x0005bc }, + [0x00fb49] = { 0x0005e9, 0x0005bc }, + [0x00fb4a] = { 0x0005ea, 0x0005bc }, + [0x00fb4b] = { 0x0005d5, 0x0005b9 }, + [0x00fb4c] = { 0x0005d1, 0x0005bf }, + [0x00fb4d] = { 0x0005db, 0x0005bf }, + [0x00fb4e] = { 0x0005e4, 0x0005bf }, + [0x01109a] = { 0x011099, 0x0110ba }, + [0x01109c] = { 0x01109b, 0x0110ba }, + [0x0110ab] = { 0x0110a5, 0x0110ba }, + [0x01112e] = { 0x011131, 0x011127 }, + [0x01112f] = { 0x011132, 0x011127 }, + [0x01134b] = { 0x011347, 0x01133e }, + [0x01134c] = { 0x011347, 0x011357 }, + [0x0114bb] = { 0x0114b9, 0x0114ba }, + [0x0114bc] = { 0x0114b9, 0x0114b0 }, + [0x0114be] = { 0x0114b9, 0x0114bd }, + [0x0115ba] = { 0x0115b8, 0x0115af }, + [0x0115bb] = { 0x0115b9, 0x0115af }, + [0x01d15e] = { 0x01d157, 0x01d165 }, + [0x01d15f] = { 0x01d158, 0x01d165 }, + [0x01d160] = { 0x01d158, 0x01d165, 0x01d16e }, + [0x01d161] = { 0x01d158, 0x01d165, 0x01d16f }, + [0x01d162] = { 0x01d158, 0x01d165, 0x01d170 }, + [0x01d163] = { 0x01d158, 0x01d165, 0x01d171 }, + [0x01d164] = { 0x01d158, 0x01d165, 0x01d172 }, + [0x01d1bb] = { 0x01d1b9, 0x01d165 }, + [0x01d1bc] = { 0x01d1ba, 0x01d165 }, + [0x01d1bd] = { 0x01d1b9, 0x01d165, 0x01d16e }, + [0x01d1be] = { 0x01d1ba, 0x01d165, 0x01d16e }, + [0x01d1bf] = { 0x01d1b9, 0x01d165, 0x01d16f }, + [0x01d1c0] = { 0x01d1ba, 0x01d165, 0x01d16f }, + [0x02f800] = { 0x004e3d }, + [0x02f801] = { 0x004e38 }, + [0x02f802] = { 0x004e41 }, + [0x02f803] = { 0x020122 }, + [0x02f804] = { 0x004f60 }, + [0x02f805] = { 0x004fae }, + [0x02f806] = { 0x004fbb }, + [0x02f807] = { 0x005002 }, + [0x02f808] = { 0x00507a }, + [0x02f809] = { 0x005099 }, + [0x02f80a] = { 0x0050e7 }, + [0x02f80b] = { 0x0050cf }, + [0x02f80c] = { 0x00349e }, + [0x02f80d] = { 0x02063a }, + [0x02f80e] = { 0x00514d }, + [0x02f80f] = { 0x005154 }, + [0x02f810] = { 0x005164 }, + [0x02f811] = { 0x005177 }, + [0x02f812] = { 0x02051c }, + [0x02f813] = { 0x0034b9 }, + [0x02f814] = { 0x005167 }, + [0x02f815] = { 0x00518d }, + [0x02f816] = { 0x02054b }, + [0x02f817] = { 0x005197 }, + [0x02f818] = { 0x0051a4 }, + [0x02f819] = { 0x004ecc }, + [0x02f81a] = { 0x0051ac }, + [0x02f81b] = { 0x0051b5 }, + [0x02f81c] = { 0x0291df }, + [0x02f81d] = { 0x0051f5 }, + [0x02f81e] = { 0x005203 }, + [0x02f81f] = { 0x0034df }, + [0x02f820] = { 0x00523b }, + [0x02f821] = { 0x005246 }, + [0x02f822] = { 0x005272 }, + [0x02f823] = { 0x005277 }, + [0x02f824] = { 0x003515 }, + [0x02f825] = { 0x0052c7 }, + [0x02f826] = { 0x0052c9 }, + [0x02f827] = { 0x0052e4 }, + [0x02f828] = { 0x0052fa }, + [0x02f829] = { 0x005305 }, + [0x02f82a] = { 0x005306 }, + [0x02f82b] = { 0x005317 }, + [0x02f82c] = { 0x005349 }, + [0x02f82d] = { 0x005351 }, + [0x02f82e] = { 0x00535a }, + [0x02f82f] = { 0x005373 }, + [0x02f830] = { 0x00537d }, + [0x02f831] = { 0x00537f }, + [0x02f832] = { 0x00537f }, + [0x02f833] = { 0x00537f }, + [0x02f834] = { 0x020a2c }, + [0x02f835] = { 0x007070 }, + [0x02f836] = { 0x0053ca }, + [0x02f837] = { 0x0053df }, + [0x02f838] = { 0x020b63 }, + [0x02f839] = { 0x0053eb }, + [0x02f83a] = { 0x0053f1 }, + [0x02f83b] = { 0x005406 }, + [0x02f83c] = { 0x00549e }, + [0x02f83d] = { 0x005438 }, + [0x02f83e] = { 0x005448 }, + [0x02f83f] = { 0x005468 }, + [0x02f840] = { 0x0054a2 }, + [0x02f841] = { 0x0054f6 }, + [0x02f842] = { 0x005510 }, + [0x02f843] = { 0x005553 }, + [0x02f844] = { 0x005563 }, + [0x02f845] = { 0x005584 }, + [0x02f846] = { 0x005584 }, + [0x02f847] = { 0x005599 }, + [0x02f848] = { 0x0055ab }, + [0x02f849] = { 0x0055b3 }, + [0x02f84a] = { 0x0055c2 }, + [0x02f84b] = { 0x005716 }, + [0x02f84c] = { 0x005606 }, + [0x02f84d] = { 0x005717 }, + [0x02f84e] = { 0x005651 }, + [0x02f84f] = { 0x005674 }, + [0x02f850] = { 0x005207 }, + [0x02f851] = { 0x0058ee }, + [0x02f852] = { 0x0057ce }, + [0x02f853] = { 0x0057f4 }, + [0x02f854] = { 0x00580d }, + [0x02f855] = { 0x00578b }, + [0x02f856] = { 0x005832 }, + [0x02f857] = { 0x005831 }, + [0x02f858] = { 0x0058ac }, + [0x02f859] = { 0x0214e4 }, + [0x02f85a] = { 0x0058f2 }, + [0x02f85b] = { 0x0058f7 }, + [0x02f85c] = { 0x005906 }, + [0x02f85d] = { 0x00591a }, + [0x02f85e] = { 0x005922 }, + [0x02f85f] = { 0x005962 }, + [0x02f860] = { 0x0216a8 }, + [0x02f861] = { 0x0216ea }, + [0x02f862] = { 0x0059ec }, + [0x02f863] = { 0x005a1b }, + [0x02f864] = { 0x005a27 }, + [0x02f865] = { 0x0059d8 }, + [0x02f866] = { 0x005a66 }, + [0x02f867] = { 0x0036ee }, + [0x02f868] = { 0x0036fc }, + [0x02f869] = { 0x005b08 }, + [0x02f86a] = { 0x005b3e }, + [0x02f86b] = { 0x005b3e }, + [0x02f86c] = { 0x0219c8 }, + [0x02f86d] = { 0x005bc3 }, + [0x02f86e] = { 0x005bd8 }, + [0x02f86f] = { 0x005be7 }, + [0x02f870] = { 0x005bf3 }, + [0x02f871] = { 0x021b18 }, + [0x02f872] = { 0x005bff }, + [0x02f873] = { 0x005c06 }, + [0x02f874] = { 0x005f53 }, + [0x02f875] = { 0x005c22 }, + [0x02f876] = { 0x003781 }, + [0x02f877] = { 0x005c60 }, + [0x02f878] = { 0x005c6e }, + [0x02f879] = { 0x005cc0 }, + [0x02f87a] = { 0x005c8d }, + [0x02f87b] = { 0x021de4 }, + [0x02f87c] = { 0x005d43 }, + [0x02f87d] = { 0x021de6 }, + [0x02f87e] = { 0x005d6e }, + [0x02f87f] = { 0x005d6b }, + [0x02f880] = { 0x005d7c }, + [0x02f881] = { 0x005de1 }, + [0x02f882] = { 0x005de2 }, + [0x02f883] = { 0x00382f }, + [0x02f884] = { 0x005dfd }, + [0x02f885] = { 0x005e28 }, + [0x02f886] = { 0x005e3d }, + [0x02f887] = { 0x005e69 }, + [0x02f888] = { 0x003862 }, + [0x02f889] = { 0x022183 }, + [0x02f88a] = { 0x00387c }, + [0x02f88b] = { 0x005eb0 }, + [0x02f88c] = { 0x005eb3 }, + [0x02f88d] = { 0x005eb6 }, + [0x02f88e] = { 0x005eca }, + [0x02f88f] = { 0x02a392 }, + [0x02f890] = { 0x005efe }, + [0x02f891] = { 0x022331 }, + [0x02f892] = { 0x022331 }, + [0x02f893] = { 0x008201 }, + [0x02f894] = { 0x005f22 }, + [0x02f895] = { 0x005f22 }, + [0x02f896] = { 0x0038c7 }, + [0x02f897] = { 0x0232b8 }, + [0x02f898] = { 0x0261da }, + [0x02f899] = { 0x005f62 }, + [0x02f89a] = { 0x005f6b }, + [0x02f89b] = { 0x0038e3 }, + [0x02f89c] = { 0x005f9a }, + [0x02f89d] = { 0x005fcd }, + [0x02f89e] = { 0x005fd7 }, + [0x02f89f] = { 0x005ff9 }, + [0x02f8a0] = { 0x006081 }, + [0x02f8a1] = { 0x00393a }, + [0x02f8a2] = { 0x00391c }, + [0x02f8a3] = { 0x006094 }, + [0x02f8a4] = { 0x0226d4 }, + [0x02f8a5] = { 0x0060c7 }, + [0x02f8a6] = { 0x006148 }, + [0x02f8a7] = { 0x00614c }, + [0x02f8a8] = { 0x00614e }, + [0x02f8a9] = { 0x00614c }, + [0x02f8aa] = { 0x00617a }, + [0x02f8ab] = { 0x00618e }, + [0x02f8ac] = { 0x0061b2 }, + [0x02f8ad] = { 0x0061a4 }, + [0x02f8ae] = { 0x0061af }, + [0x02f8af] = { 0x0061de }, + [0x02f8b0] = { 0x0061f2 }, + [0x02f8b1] = { 0x0061f6 }, + [0x02f8b2] = { 0x006210 }, + [0x02f8b3] = { 0x00621b }, + [0x02f8b4] = { 0x00625d }, + [0x02f8b5] = { 0x0062b1 }, + [0x02f8b6] = { 0x0062d4 }, + [0x02f8b7] = { 0x006350 }, + [0x02f8b8] = { 0x022b0c }, + [0x02f8b9] = { 0x00633d }, + [0x02f8ba] = { 0x0062fc }, + [0x02f8bb] = { 0x006368 }, + [0x02f8bc] = { 0x006383 }, + [0x02f8bd] = { 0x0063e4 }, + [0x02f8be] = { 0x022bf1 }, + [0x02f8bf] = { 0x006422 }, + [0x02f8c0] = { 0x0063c5 }, + [0x02f8c1] = { 0x0063a9 }, + [0x02f8c2] = { 0x003a2e }, + [0x02f8c3] = { 0x006469 }, + [0x02f8c4] = { 0x00647e }, + [0x02f8c5] = { 0x00649d }, + [0x02f8c6] = { 0x006477 }, + [0x02f8c7] = { 0x003a6c }, + [0x02f8c8] = { 0x00654f }, + [0x02f8c9] = { 0x00656c }, + [0x02f8ca] = { 0x02300a }, + [0x02f8cb] = { 0x0065e3 }, + [0x02f8cc] = { 0x0066f8 }, + [0x02f8cd] = { 0x006649 }, + [0x02f8ce] = { 0x003b19 }, + [0x02f8cf] = { 0x006691 }, + [0x02f8d0] = { 0x003b08 }, + [0x02f8d1] = { 0x003ae4 }, + [0x02f8d2] = { 0x005192 }, + [0x02f8d3] = { 0x005195 }, + [0x02f8d4] = { 0x006700 }, + [0x02f8d5] = { 0x00669c }, + [0x02f8d6] = { 0x0080ad }, + [0x02f8d7] = { 0x0043d9 }, + [0x02f8d8] = { 0x006717 }, + [0x02f8d9] = { 0x00671b }, + [0x02f8da] = { 0x006721 }, + [0x02f8db] = { 0x00675e }, + [0x02f8dc] = { 0x006753 }, + [0x02f8dd] = { 0x0233c3 }, + [0x02f8de] = { 0x003b49 }, + [0x02f8df] = { 0x0067fa }, + [0x02f8e0] = { 0x006785 }, + [0x02f8e1] = { 0x006852 }, + [0x02f8e2] = { 0x006885 }, + [0x02f8e3] = { 0x02346d }, + [0x02f8e4] = { 0x00688e }, + [0x02f8e5] = { 0x00681f }, + [0x02f8e6] = { 0x006914 }, + [0x02f8e7] = { 0x003b9d }, + [0x02f8e8] = { 0x006942 }, + [0x02f8e9] = { 0x0069a3 }, + [0x02f8ea] = { 0x0069ea }, + [0x02f8eb] = { 0x006aa8 }, + [0x02f8ec] = { 0x0236a3 }, + [0x02f8ed] = { 0x006adb }, + [0x02f8ee] = { 0x003c18 }, + [0x02f8ef] = { 0x006b21 }, + [0x02f8f0] = { 0x0238a7 }, + [0x02f8f1] = { 0x006b54 }, + [0x02f8f2] = { 0x003c4e }, + [0x02f8f3] = { 0x006b72 }, + [0x02f8f4] = { 0x006b9f }, + [0x02f8f5] = { 0x006bba }, + [0x02f8f6] = { 0x006bbb }, + [0x02f8f7] = { 0x023a8d }, + [0x02f8f8] = { 0x021d0b }, + [0x02f8f9] = { 0x023afa }, + [0x02f8fa] = { 0x006c4e }, + [0x02f8fb] = { 0x023cbc }, + [0x02f8fc] = { 0x006cbf }, + [0x02f8fd] = { 0x006ccd }, + [0x02f8fe] = { 0x006c67 }, + [0x02f8ff] = { 0x006d16 }, + [0x02f900] = { 0x006d3e }, + [0x02f901] = { 0x006d77 }, + [0x02f902] = { 0x006d41 }, + [0x02f903] = { 0x006d69 }, + [0x02f904] = { 0x006d78 }, + [0x02f905] = { 0x006d85 }, + [0x02f906] = { 0x023d1e }, + [0x02f907] = { 0x006d34 }, + [0x02f908] = { 0x006e2f }, + [0x02f909] = { 0x006e6e }, + [0x02f90a] = { 0x003d33 }, + [0x02f90b] = { 0x006ecb }, + [0x02f90c] = { 0x006ec7 }, + [0x02f90d] = { 0x023ed1 }, + [0x02f90e] = { 0x006df9 }, + [0x02f90f] = { 0x006f6e }, + [0x02f910] = { 0x023f5e }, + [0x02f911] = { 0x023f8e }, + [0x02f912] = { 0x006fc6 }, + [0x02f913] = { 0x007039 }, + [0x02f914] = { 0x00701e }, + [0x02f915] = { 0x00701b }, + [0x02f916] = { 0x003d96 }, + [0x02f917] = { 0x00704a }, + [0x02f918] = { 0x00707d }, + [0x02f919] = { 0x007077 }, + [0x02f91a] = { 0x0070ad }, + [0x02f91b] = { 0x020525 }, + [0x02f91c] = { 0x007145 }, + [0x02f91d] = { 0x024263 }, + [0x02f91e] = { 0x00719c }, + [0x02f91f] = { 0x0243ab }, + [0x02f920] = { 0x007228 }, + [0x02f921] = { 0x007235 }, + [0x02f922] = { 0x007250 }, + [0x02f923] = { 0x024608 }, + [0x02f924] = { 0x007280 }, + [0x02f925] = { 0x007295 }, + [0x02f926] = { 0x024735 }, + [0x02f927] = { 0x024814 }, + [0x02f928] = { 0x00737a }, + [0x02f929] = { 0x00738b }, + [0x02f92a] = { 0x003eac }, + [0x02f92b] = { 0x0073a5 }, + [0x02f92c] = { 0x003eb8 }, + [0x02f92d] = { 0x003eb8 }, + [0x02f92e] = { 0x007447 }, + [0x02f92f] = { 0x00745c }, + [0x02f930] = { 0x007471 }, + [0x02f931] = { 0x007485 }, + [0x02f932] = { 0x0074ca }, + [0x02f933] = { 0x003f1b }, + [0x02f934] = { 0x007524 }, + [0x02f935] = { 0x024c36 }, + [0x02f936] = { 0x00753e }, + [0x02f937] = { 0x024c92 }, + [0x02f938] = { 0x007570 }, + [0x02f939] = { 0x02219f }, + [0x02f93a] = { 0x007610 }, + [0x02f93b] = { 0x024fa1 }, + [0x02f93c] = { 0x024fb8 }, + [0x02f93d] = { 0x025044 }, + [0x02f93e] = { 0x003ffc }, + [0x02f93f] = { 0x004008 }, + [0x02f940] = { 0x0076f4 }, + [0x02f941] = { 0x0250f3 }, + [0x02f942] = { 0x0250f2 }, + [0x02f943] = { 0x025119 }, + [0x02f944] = { 0x025133 }, + [0x02f945] = { 0x00771e }, + [0x02f946] = { 0x00771f }, + [0x02f947] = { 0x00771f }, + [0x02f948] = { 0x00774a }, + [0x02f949] = { 0x004039 }, + [0x02f94a] = { 0x00778b }, + [0x02f94b] = { 0x004046 }, + [0x02f94c] = { 0x004096 }, + [0x02f94d] = { 0x02541d }, + [0x02f94e] = { 0x00784e }, + [0x02f94f] = { 0x00788c }, + [0x02f950] = { 0x0078cc }, + [0x02f951] = { 0x0040e3 }, + [0x02f952] = { 0x025626 }, + [0x02f953] = { 0x007956 }, + [0x02f954] = { 0x02569a }, + [0x02f955] = { 0x0256c5 }, + [0x02f956] = { 0x00798f }, + [0x02f957] = { 0x0079eb }, + [0x02f958] = { 0x00412f }, + [0x02f959] = { 0x007a40 }, + [0x02f95a] = { 0x007a4a }, + [0x02f95b] = { 0x007a4f }, + [0x02f95c] = { 0x02597c }, + [0x02f95d] = { 0x025aa7 }, + [0x02f95e] = { 0x025aa7 }, + [0x02f95f] = { 0x007aee }, + [0x02f960] = { 0x004202 }, + [0x02f961] = { 0x025bab }, + [0x02f962] = { 0x007bc6 }, + [0x02f963] = { 0x007bc9 }, + [0x02f964] = { 0x004227 }, + [0x02f965] = { 0x025c80 }, + [0x02f966] = { 0x007cd2 }, + [0x02f967] = { 0x0042a0 }, + [0x02f968] = { 0x007ce8 }, + [0x02f969] = { 0x007ce3 }, + [0x02f96a] = { 0x007d00 }, + [0x02f96b] = { 0x025f86 }, + [0x02f96c] = { 0x007d63 }, + [0x02f96d] = { 0x004301 }, + [0x02f96e] = { 0x007dc7 }, + [0x02f96f] = { 0x007e02 }, + [0x02f970] = { 0x007e45 }, + [0x02f971] = { 0x004334 }, + [0x02f972] = { 0x026228 }, + [0x02f973] = { 0x026247 }, + [0x02f974] = { 0x004359 }, + [0x02f975] = { 0x0262d9 }, + [0x02f976] = { 0x007f7a }, + [0x02f977] = { 0x02633e }, + [0x02f978] = { 0x007f95 }, + [0x02f979] = { 0x007ffa }, + [0x02f97a] = { 0x008005 }, + [0x02f97b] = { 0x0264da }, + [0x02f97c] = { 0x026523 }, + [0x02f97d] = { 0x008060 }, + [0x02f97e] = { 0x0265a8 }, + [0x02f97f] = { 0x008070 }, + [0x02f980] = { 0x02335f }, + [0x02f981] = { 0x0043d5 }, + [0x02f982] = { 0x0080b2 }, + [0x02f983] = { 0x008103 }, + [0x02f984] = { 0x00440b }, + [0x02f985] = { 0x00813e }, + [0x02f986] = { 0x005ab5 }, + [0x02f987] = { 0x0267a7 }, + [0x02f988] = { 0x0267b5 }, + [0x02f989] = { 0x023393 }, + [0x02f98a] = { 0x02339c }, + [0x02f98b] = { 0x008201 }, + [0x02f98c] = { 0x008204 }, + [0x02f98d] = { 0x008f9e }, + [0x02f98e] = { 0x00446b }, + [0x02f98f] = { 0x008291 }, + [0x02f990] = { 0x00828b }, + [0x02f991] = { 0x00829d }, + [0x02f992] = { 0x0052b3 }, + [0x02f993] = { 0x0082b1 }, + [0x02f994] = { 0x0082b3 }, + [0x02f995] = { 0x0082bd }, + [0x02f996] = { 0x0082e6 }, + [0x02f997] = { 0x026b3c }, + [0x02f998] = { 0x0082e5 }, + [0x02f999] = { 0x00831d }, + [0x02f99a] = { 0x008363 }, + [0x02f99b] = { 0x0083ad }, + [0x02f99c] = { 0x008323 }, + [0x02f99d] = { 0x0083bd }, + [0x02f99e] = { 0x0083e7 }, + [0x02f99f] = { 0x008457 }, + [0x02f9a0] = { 0x008353 }, + [0x02f9a1] = { 0x0083ca }, + [0x02f9a2] = { 0x0083cc }, + [0x02f9a3] = { 0x0083dc }, + [0x02f9a4] = { 0x026c36 }, + [0x02f9a5] = { 0x026d6b }, + [0x02f9a6] = { 0x026cd5 }, + [0x02f9a7] = { 0x00452b }, + [0x02f9a8] = { 0x0084f1 }, + [0x02f9a9] = { 0x0084f3 }, + [0x02f9aa] = { 0x008516 }, + [0x02f9ab] = { 0x0273ca }, + [0x02f9ac] = { 0x008564 }, + [0x02f9ad] = { 0x026f2c }, + [0x02f9ae] = { 0x00455d }, + [0x02f9af] = { 0x004561 }, + [0x02f9b0] = { 0x026fb1 }, + [0x02f9b1] = { 0x0270d2 }, + [0x02f9b2] = { 0x00456b }, + [0x02f9b3] = { 0x008650 }, + [0x02f9b4] = { 0x00865c }, + [0x02f9b5] = { 0x008667 }, + [0x02f9b6] = { 0x008669 }, + [0x02f9b7] = { 0x0086a9 }, + [0x02f9b8] = { 0x008688 }, + [0x02f9b9] = { 0x00870e }, + [0x02f9ba] = { 0x0086e2 }, + [0x02f9bb] = { 0x008779 }, + [0x02f9bc] = { 0x008728 }, + [0x02f9bd] = { 0x00876b }, + [0x02f9be] = { 0x008786 }, + [0x02f9bf] = { 0x0045d7 }, + [0x02f9c0] = { 0x0087e1 }, + [0x02f9c1] = { 0x008801 }, + [0x02f9c2] = { 0x0045f9 }, + [0x02f9c3] = { 0x008860 }, + [0x02f9c4] = { 0x008863 }, + [0x02f9c5] = { 0x027667 }, + [0x02f9c6] = { 0x0088d7 }, + [0x02f9c7] = { 0x0088de }, + [0x02f9c8] = { 0x004635 }, + [0x02f9c9] = { 0x0088fa }, + [0x02f9ca] = { 0x0034bb }, + [0x02f9cb] = { 0x0278ae }, + [0x02f9cc] = { 0x027966 }, + [0x02f9cd] = { 0x0046be }, + [0x02f9ce] = { 0x0046c7 }, + [0x02f9cf] = { 0x008aa0 }, + [0x02f9d0] = { 0x008aed }, + [0x02f9d1] = { 0x008b8a }, + [0x02f9d2] = { 0x008c55 }, + [0x02f9d3] = { 0x027ca8 }, + [0x02f9d4] = { 0x008cab }, + [0x02f9d5] = { 0x008cc1 }, + [0x02f9d6] = { 0x008d1b }, + [0x02f9d7] = { 0x008d77 }, + [0x02f9d8] = { 0x027f2f }, + [0x02f9d9] = { 0x020804 }, + [0x02f9da] = { 0x008dcb }, + [0x02f9db] = { 0x008dbc }, + [0x02f9dc] = { 0x008df0 }, + [0x02f9dd] = { 0x0208de }, + [0x02f9de] = { 0x008ed4 }, + [0x02f9df] = { 0x008f38 }, + [0x02f9e0] = { 0x0285d2 }, + [0x02f9e1] = { 0x0285ed }, + [0x02f9e2] = { 0x009094 }, + [0x02f9e3] = { 0x0090f1 }, + [0x02f9e4] = { 0x009111 }, + [0x02f9e5] = { 0x02872e }, + [0x02f9e6] = { 0x00911b }, + [0x02f9e7] = { 0x009238 }, + [0x02f9e8] = { 0x0092d7 }, + [0x02f9e9] = { 0x0092d8 }, + [0x02f9ea] = { 0x00927c }, + [0x02f9eb] = { 0x0093f9 }, + [0x02f9ec] = { 0x009415 }, + [0x02f9ed] = { 0x028bfa }, + [0x02f9ee] = { 0x00958b }, + [0x02f9ef] = { 0x004995 }, + [0x02f9f0] = { 0x0095b7 }, + [0x02f9f1] = { 0x028d77 }, + [0x02f9f2] = { 0x0049e6 }, + [0x02f9f3] = { 0x0096c3 }, + [0x02f9f4] = { 0x005db2 }, + [0x02f9f5] = { 0x009723 }, + [0x02f9f6] = { 0x029145 }, + [0x02f9f7] = { 0x02921a }, + [0x02f9f8] = { 0x004a6e }, + [0x02f9f9] = { 0x004a76 }, + [0x02f9fa] = { 0x0097e0 }, + [0x02f9fb] = { 0x02940a }, + [0x02f9fc] = { 0x004ab2 }, + [0x02f9fd] = { 0x029496 }, + [0x02f9fe] = { 0x00980b }, + [0x02f9ff] = { 0x00980b }, + [0x02fa00] = { 0x009829 }, + [0x02fa01] = { 0x0295b6 }, + [0x02fa02] = { 0x0098e2 }, + [0x02fa03] = { 0x004b33 }, + [0x02fa04] = { 0x009929 }, + [0x02fa05] = { 0x0099a7 }, + [0x02fa06] = { 0x0099c2 }, + [0x02fa07] = { 0x0099fe }, + [0x02fa08] = { 0x004bce }, + [0x02fa09] = { 0x029b30 }, + [0x02fa0a] = { 0x009b12 }, + [0x02fa0b] = { 0x009c40 }, + [0x02fa0c] = { 0x009cfd }, + [0x02fa0d] = { 0x004cce }, + [0x02fa0e] = { 0x004ced }, + [0x02fa0f] = { 0x009d67 }, + [0x02fa10] = { 0x02a0ce }, + [0x02fa11] = { 0x004cf8 }, + [0x02fa12] = { 0x02a105 }, + [0x02fa13] = { 0x02a20e }, + [0x02fa14] = { 0x02a291 }, + [0x02fa15] = { 0x009ebb }, + [0x02fa16] = { 0x004d56 }, + [0x02fa17] = { 0x009ef9 }, + [0x02fa18] = { 0x009efe }, + [0x02fa19] = { 0x009f05 }, + [0x02fa1a] = { 0x009f0f }, + [0x02fa1b] = { 0x009f16 }, + [0x02fa1c] = { 0x009f3b }, + [0x02fa1d] = { 0x02a600 }, + }, + + decompK = { + [0x0000a0] = { 0x000020 }, + [0x0000a8] = { 0x000020, 0x000308 }, + [0x0000aa] = { 0x000061 }, + [0x0000af] = { 0x000020, 0x000304 }, + [0x0000b2] = { 0x000032 }, + [0x0000b3] = { 0x000033 }, + [0x0000b4] = { 0x000020, 0x000301 }, + [0x0000b5] = { 0x0003bc }, + [0x0000b8] = { 0x000020, 0x000327 }, + [0x0000b9] = { 0x000031 }, + [0x0000ba] = { 0x00006f }, + [0x0000bc] = { 0x000031, 0x002044, 0x000034 }, + [0x0000bd] = { 0x000031, 0x002044, 0x000032 }, + [0x0000be] = { 0x000033, 0x002044, 0x000034 }, + [0x000132] = { 0x000049, 0x00004a }, + [0x000133] = { 0x000069, 0x00006a }, + [0x00013f] = { 0x00004c, 0x0000b7 }, + [0x000140] = { 0x00006c, 0x0000b7 }, + [0x000149] = { 0x0002bc, 0x00006e }, + [0x00017f] = { 0x000073 }, + [0x0001c4] = { 0x000044, 0x00005a, 0x00030c }, + [0x0001c5] = { 0x000044, 0x00007a, 0x00030c }, + [0x0001c6] = { 0x000064, 0x00007a, 0x00030c }, + [0x0001c7] = { 0x00004c, 0x00004a }, + [0x0001c8] = { 0x00004c, 0x00006a }, + [0x0001c9] = { 0x00006c, 0x00006a }, + [0x0001ca] = { 0x00004e, 0x00004a }, + [0x0001cb] = { 0x00004e, 0x00006a }, + [0x0001cc] = { 0x00006e, 0x00006a }, + [0x0001f1] = { 0x000044, 0x00005a }, + [0x0001f2] = { 0x000044, 0x00007a }, + [0x0001f3] = { 0x000064, 0x00007a }, + [0x0002b0] = { 0x000068 }, + [0x0002b1] = { 0x000266 }, + [0x0002b2] = { 0x00006a }, + [0x0002b3] = { 0x000072 }, + [0x0002b4] = { 0x000279 }, + [0x0002b5] = { 0x00027b }, + [0x0002b6] = { 0x000281 }, + [0x0002b7] = { 0x000077 }, + [0x0002b8] = { 0x000079 }, + [0x0002d8] = { 0x000020, 0x000306 }, + [0x0002d9] = { 0x000020, 0x000307 }, + [0x0002da] = { 0x000020, 0x00030a }, + [0x0002db] = { 0x000020, 0x000328 }, + [0x0002dc] = { 0x000020, 0x000303 }, + [0x0002dd] = { 0x000020, 0x00030b }, + [0x0002e0] = { 0x000263 }, + [0x0002e1] = { 0x00006c }, + [0x0002e2] = { 0x000073 }, + [0x0002e3] = { 0x000078 }, + [0x0002e4] = { 0x000295 }, + [0x00037a] = { 0x000020, 0x000345 }, + [0x000384] = { 0x000020, 0x000301 }, + [0x000385] = { 0x000020, 0x000308, 0x000301 }, + [0x0003d0] = { 0x0003b2 }, + [0x0003d1] = { 0x0003b8 }, + [0x0003d2] = { 0x0003a5 }, + [0x0003d3] = { 0x0003a5, 0x000301 }, + [0x0003d4] = { 0x0003a5, 0x000308 }, + [0x0003d5] = { 0x0003c6 }, + [0x0003d6] = { 0x0003c0 }, + [0x0003f0] = { 0x0003ba }, + [0x0003f1] = { 0x0003c1 }, + [0x0003f2] = { 0x0003c2 }, + [0x0003f4] = { 0x000398 }, + [0x0003f5] = { 0x0003b5 }, + [0x0003f9] = { 0x0003a3 }, + [0x000587] = { 0x000565, 0x000582 }, + [0x000675] = { 0x000627, 0x000674 }, + [0x000676] = { 0x000648, 0x000674 }, + [0x000677] = { 0x0006c7, 0x000674 }, + [0x000678] = { 0x00064a, 0x000674 }, + [0x000e33] = { 0x000e4d, 0x000e32 }, + [0x000eb3] = { 0x000ecd, 0x000eb2 }, + [0x000edc] = { 0x000eab, 0x000e99 }, + [0x000edd] = { 0x000eab, 0x000ea1 }, + [0x000f0c] = { 0x000f0b }, + [0x000f77] = { 0x000fb2, 0x000f71, 0x000f80 }, + [0x000f79] = { 0x000fb3, 0x000f71, 0x000f80 }, + [0x0010fc] = { 0x0010dc }, + [0x001d2c] = { 0x000041 }, + [0x001d2d] = { 0x0000c6 }, + [0x001d2e] = { 0x000042 }, + [0x001d30] = { 0x000044 }, + [0x001d31] = { 0x000045 }, + [0x001d32] = { 0x00018e }, + [0x001d33] = { 0x000047 }, + [0x001d34] = { 0x000048 }, + [0x001d35] = { 0x000049 }, + [0x001d36] = { 0x00004a }, + [0x001d37] = { 0x00004b }, + [0x001d38] = { 0x00004c }, + [0x001d39] = { 0x00004d }, + [0x001d3a] = { 0x00004e }, + [0x001d3c] = { 0x00004f }, + [0x001d3d] = { 0x000222 }, + [0x001d3e] = { 0x000050 }, + [0x001d3f] = { 0x000052 }, + [0x001d40] = { 0x000054 }, + [0x001d41] = { 0x000055 }, + [0x001d42] = { 0x000057 }, + [0x001d43] = { 0x000061 }, + [0x001d44] = { 0x000250 }, + [0x001d45] = { 0x000251 }, + [0x001d46] = { 0x001d02 }, + [0x001d47] = { 0x000062 }, + [0x001d48] = { 0x000064 }, + [0x001d49] = { 0x000065 }, + [0x001d4a] = { 0x000259 }, + [0x001d4b] = { 0x00025b }, + [0x001d4c] = { 0x00025c }, + [0x001d4d] = { 0x000067 }, + [0x001d4f] = { 0x00006b }, + [0x001d50] = { 0x00006d }, + [0x001d51] = { 0x00014b }, + [0x001d52] = { 0x00006f }, + [0x001d53] = { 0x000254 }, + [0x001d54] = { 0x001d16 }, + [0x001d55] = { 0x001d17 }, + [0x001d56] = { 0x000070 }, + [0x001d57] = { 0x000074 }, + [0x001d58] = { 0x000075 }, + [0x001d59] = { 0x001d1d }, + [0x001d5a] = { 0x00026f }, + [0x001d5b] = { 0x000076 }, + [0x001d5c] = { 0x001d25 }, + [0x001d5d] = { 0x0003b2 }, + [0x001d5e] = { 0x0003b3 }, + [0x001d5f] = { 0x0003b4 }, + [0x001d60] = { 0x0003c6 }, + [0x001d61] = { 0x0003c7 }, + [0x001d62] = { 0x000069 }, + [0x001d63] = { 0x000072 }, + [0x001d64] = { 0x000075 }, + [0x001d65] = { 0x000076 }, + [0x001d66] = { 0x0003b2 }, + [0x001d67] = { 0x0003b3 }, + [0x001d68] = { 0x0003c1 }, + [0x001d69] = { 0x0003c6 }, + [0x001d6a] = { 0x0003c7 }, + [0x001d78] = { 0x00043d }, + [0x001d9b] = { 0x000252 }, + [0x001d9c] = { 0x000063 }, + [0x001d9d] = { 0x000255 }, + [0x001d9e] = { 0x0000f0 }, + [0x001d9f] = { 0x00025c }, + [0x001da0] = { 0x000066 }, + [0x001da1] = { 0x00025f }, + [0x001da2] = { 0x000261 }, + [0x001da3] = { 0x000265 }, + [0x001da4] = { 0x000268 }, + [0x001da5] = { 0x000269 }, + [0x001da6] = { 0x00026a }, + [0x001da7] = { 0x001d7b }, + [0x001da8] = { 0x00029d }, + [0x001da9] = { 0x00026d }, + [0x001daa] = { 0x001d85 }, + [0x001dab] = { 0x00029f }, + [0x001dac] = { 0x000271 }, + [0x001dad] = { 0x000270 }, + [0x001dae] = { 0x000272 }, + [0x001daf] = { 0x000273 }, + [0x001db0] = { 0x000274 }, + [0x001db1] = { 0x000275 }, + [0x001db2] = { 0x000278 }, + [0x001db3] = { 0x000282 }, + [0x001db4] = { 0x000283 }, + [0x001db5] = { 0x0001ab }, + [0x001db6] = { 0x000289 }, + [0x001db7] = { 0x00028a }, + [0x001db8] = { 0x001d1c }, + [0x001db9] = { 0x00028b }, + [0x001dba] = { 0x00028c }, + [0x001dbb] = { 0x00007a }, + [0x001dbc] = { 0x000290 }, + [0x001dbd] = { 0x000291 }, + [0x001dbe] = { 0x000292 }, + [0x001dbf] = { 0x0003b8 }, + [0x001e9a] = { 0x000061, 0x0002be }, + [0x001e9b] = { 0x000073, 0x000307 }, + [0x001fbd] = { 0x000020, 0x000313 }, + [0x001fbf] = { 0x000020, 0x000313 }, + [0x001fc0] = { 0x000020, 0x000342 }, + [0x001fc1] = { 0x000020, 0x000308, 0x000342 }, + [0x001fcd] = { 0x000020, 0x000313, 0x000300 }, + [0x001fce] = { 0x000020, 0x000313, 0x000301 }, + [0x001fcf] = { 0x000020, 0x000313, 0x000342 }, + [0x001fdd] = { 0x000020, 0x000314, 0x000300 }, + [0x001fde] = { 0x000020, 0x000314, 0x000301 }, + [0x001fdf] = { 0x000020, 0x000314, 0x000342 }, + [0x001fed] = { 0x000020, 0x000308, 0x000300 }, + [0x001fee] = { 0x000020, 0x000308, 0x000301 }, + [0x001ffd] = { 0x000020, 0x000301 }, + [0x001ffe] = { 0x000020, 0x000314 }, + [0x002000] = { 0x000020 }, + [0x002001] = { 0x000020 }, + [0x002002] = { 0x000020 }, + [0x002003] = { 0x000020 }, + [0x002004] = { 0x000020 }, + [0x002005] = { 0x000020 }, + [0x002006] = { 0x000020 }, + [0x002007] = { 0x000020 }, + [0x002008] = { 0x000020 }, + [0x002009] = { 0x000020 }, + [0x00200a] = { 0x000020 }, + [0x002011] = { 0x002010 }, + [0x002017] = { 0x000020, 0x000333 }, + [0x002024] = { 0x00002e }, + [0x002025] = { 0x00002e, 0x00002e }, + [0x002026] = { 0x00002e, 0x00002e, 0x00002e }, + [0x00202f] = { 0x000020 }, + [0x002033] = { 0x002032, 0x002032 }, + [0x002034] = { 0x002032, 0x002032, 0x002032 }, + [0x002036] = { 0x002035, 0x002035 }, + [0x002037] = { 0x002035, 0x002035, 0x002035 }, + [0x00203c] = { 0x000021, 0x000021 }, + [0x00203e] = { 0x000020, 0x000305 }, + [0x002047] = { 0x00003f, 0x00003f }, + [0x002048] = { 0x00003f, 0x000021 }, + [0x002049] = { 0x000021, 0x00003f }, + [0x002057] = { 0x002032, 0x002032, 0x002032, 0x002032 }, + [0x00205f] = { 0x000020 }, + [0x002070] = { 0x000030 }, + [0x002071] = { 0x000069 }, + [0x002074] = { 0x000034 }, + [0x002075] = { 0x000035 }, + [0x002076] = { 0x000036 }, + [0x002077] = { 0x000037 }, + [0x002078] = { 0x000038 }, + [0x002079] = { 0x000039 }, + [0x00207a] = { 0x00002b }, + [0x00207b] = { 0x002212 }, + [0x00207c] = { 0x00003d }, + [0x00207d] = { 0x000028 }, + [0x00207e] = { 0x000029 }, + [0x00207f] = { 0x00006e }, + [0x002080] = { 0x000030 }, + [0x002081] = { 0x000031 }, + [0x002082] = { 0x000032 }, + [0x002083] = { 0x000033 }, + [0x002084] = { 0x000034 }, + [0x002085] = { 0x000035 }, + [0x002086] = { 0x000036 }, + [0x002087] = { 0x000037 }, + [0x002088] = { 0x000038 }, + [0x002089] = { 0x000039 }, + [0x00208a] = { 0x00002b }, + [0x00208b] = { 0x002212 }, + [0x00208c] = { 0x00003d }, + [0x00208d] = { 0x000028 }, + [0x00208e] = { 0x000029 }, + [0x002090] = { 0x000061 }, + [0x002091] = { 0x000065 }, + [0x002092] = { 0x00006f }, + [0x002093] = { 0x000078 }, + [0x002094] = { 0x000259 }, + [0x002095] = { 0x000068 }, + [0x002096] = { 0x00006b }, + [0x002097] = { 0x00006c }, + [0x002098] = { 0x00006d }, + [0x002099] = { 0x00006e }, + [0x00209a] = { 0x000070 }, + [0x00209b] = { 0x000073 }, + [0x00209c] = { 0x000074 }, + [0x0020a8] = { 0x000052, 0x000073 }, + [0x002100] = { 0x000061, 0x00002f, 0x000063 }, + [0x002101] = { 0x000061, 0x00002f, 0x000073 }, + [0x002102] = { 0x000043 }, + [0x002103] = { 0x0000b0, 0x000043 }, + [0x002105] = { 0x000063, 0x00002f, 0x00006f }, + [0x002106] = { 0x000063, 0x00002f, 0x000075 }, + [0x002107] = { 0x000190 }, + [0x002109] = { 0x0000b0, 0x000046 }, + [0x00210a] = { 0x000067 }, + [0x00210b] = { 0x000048 }, + [0x00210c] = { 0x000048 }, + [0x00210d] = { 0x000048 }, + [0x00210e] = { 0x000068 }, + [0x00210f] = { 0x000127 }, + [0x002110] = { 0x000049 }, + [0x002111] = { 0x000049 }, + [0x002112] = { 0x00004c }, + [0x002113] = { 0x00006c }, + [0x002115] = { 0x00004e }, + [0x002116] = { 0x00004e, 0x00006f }, + [0x002119] = { 0x000050 }, + [0x00211a] = { 0x000051 }, + [0x00211b] = { 0x000052 }, + [0x00211c] = { 0x000052 }, + [0x00211d] = { 0x000052 }, + [0x002120] = { 0x000053, 0x00004d }, + [0x002121] = { 0x000054, 0x000045, 0x00004c }, + [0x002122] = { 0x000054, 0x00004d }, + [0x002124] = { 0x00005a }, + [0x002128] = { 0x00005a }, + [0x00212c] = { 0x000042 }, + [0x00212d] = { 0x000043 }, + [0x00212f] = { 0x000065 }, + [0x002130] = { 0x000045 }, + [0x002131] = { 0x000046 }, + [0x002133] = { 0x00004d }, + [0x002134] = { 0x00006f }, + [0x002135] = { 0x0005d0 }, + [0x002136] = { 0x0005d1 }, + [0x002137] = { 0x0005d2 }, + [0x002138] = { 0x0005d3 }, + [0x002139] = { 0x000069 }, + [0x00213b] = { 0x000046, 0x000041, 0x000058 }, + [0x00213c] = { 0x0003c0 }, + [0x00213d] = { 0x0003b3 }, + [0x00213e] = { 0x000393 }, + [0x00213f] = { 0x0003a0 }, + [0x002140] = { 0x002211 }, + [0x002145] = { 0x000044 }, + [0x002146] = { 0x000064 }, + [0x002147] = { 0x000065 }, + [0x002148] = { 0x000069 }, + [0x002149] = { 0x00006a }, + [0x002150] = { 0x000031, 0x002044, 0x000037 }, + [0x002151] = { 0x000031, 0x002044, 0x000039 }, + [0x002152] = { 0x000031, 0x002044, 0x000031, 0x000030 }, + [0x002153] = { 0x000031, 0x002044, 0x000033 }, + [0x002154] = { 0x000032, 0x002044, 0x000033 }, + [0x002155] = { 0x000031, 0x002044, 0x000035 }, + [0x002156] = { 0x000032, 0x002044, 0x000035 }, + [0x002157] = { 0x000033, 0x002044, 0x000035 }, + [0x002158] = { 0x000034, 0x002044, 0x000035 }, + [0x002159] = { 0x000031, 0x002044, 0x000036 }, + [0x00215a] = { 0x000035, 0x002044, 0x000036 }, + [0x00215b] = { 0x000031, 0x002044, 0x000038 }, + [0x00215c] = { 0x000033, 0x002044, 0x000038 }, + [0x00215d] = { 0x000035, 0x002044, 0x000038 }, + [0x00215e] = { 0x000037, 0x002044, 0x000038 }, + [0x00215f] = { 0x000031, 0x002044 }, + [0x002160] = { 0x000049 }, + [0x002161] = { 0x000049, 0x000049 }, + [0x002162] = { 0x000049, 0x000049, 0x000049 }, + [0x002163] = { 0x000049, 0x000056 }, + [0x002164] = { 0x000056 }, + [0x002165] = { 0x000056, 0x000049 }, + [0x002166] = { 0x000056, 0x000049, 0x000049 }, + [0x002167] = { 0x000056, 0x000049, 0x000049, 0x000049 }, + [0x002168] = { 0x000049, 0x000058 }, + [0x002169] = { 0x000058 }, + [0x00216a] = { 0x000058, 0x000049 }, + [0x00216b] = { 0x000058, 0x000049, 0x000049 }, + [0x00216c] = { 0x00004c }, + [0x00216d] = { 0x000043 }, + [0x00216e] = { 0x000044 }, + [0x00216f] = { 0x00004d }, + [0x002170] = { 0x000069 }, + [0x002171] = { 0x000069, 0x000069 }, + [0x002172] = { 0x000069, 0x000069, 0x000069 }, + [0x002173] = { 0x000069, 0x000076 }, + [0x002174] = { 0x000076 }, + [0x002175] = { 0x000076, 0x000069 }, + [0x002176] = { 0x000076, 0x000069, 0x000069 }, + [0x002177] = { 0x000076, 0x000069, 0x000069, 0x000069 }, + [0x002178] = { 0x000069, 0x000078 }, + [0x002179] = { 0x000078 }, + [0x00217a] = { 0x000078, 0x000069 }, + [0x00217b] = { 0x000078, 0x000069, 0x000069 }, + [0x00217c] = { 0x00006c }, + [0x00217d] = { 0x000063 }, + [0x00217e] = { 0x000064 }, + [0x00217f] = { 0x00006d }, + [0x002189] = { 0x000030, 0x002044, 0x000033 }, + [0x00222c] = { 0x00222b, 0x00222b }, + [0x00222d] = { 0x00222b, 0x00222b, 0x00222b }, + [0x00222f] = { 0x00222e, 0x00222e }, + [0x002230] = { 0x00222e, 0x00222e, 0x00222e }, + [0x002460] = { 0x000031 }, + [0x002461] = { 0x000032 }, + [0x002462] = { 0x000033 }, + [0x002463] = { 0x000034 }, + [0x002464] = { 0x000035 }, + [0x002465] = { 0x000036 }, + [0x002466] = { 0x000037 }, + [0x002467] = { 0x000038 }, + [0x002468] = { 0x000039 }, + [0x002469] = { 0x000031, 0x000030 }, + [0x00246a] = { 0x000031, 0x000031 }, + [0x00246b] = { 0x000031, 0x000032 }, + [0x00246c] = { 0x000031, 0x000033 }, + [0x00246d] = { 0x000031, 0x000034 }, + [0x00246e] = { 0x000031, 0x000035 }, + [0x00246f] = { 0x000031, 0x000036 }, + [0x002470] = { 0x000031, 0x000037 }, + [0x002471] = { 0x000031, 0x000038 }, + [0x002472] = { 0x000031, 0x000039 }, + [0x002473] = { 0x000032, 0x000030 }, + [0x002474] = { 0x000028, 0x000031, 0x000029 }, + [0x002475] = { 0x000028, 0x000032, 0x000029 }, + [0x002476] = { 0x000028, 0x000033, 0x000029 }, + [0x002477] = { 0x000028, 0x000034, 0x000029 }, + [0x002478] = { 0x000028, 0x000035, 0x000029 }, + [0x002479] = { 0x000028, 0x000036, 0x000029 }, + [0x00247a] = { 0x000028, 0x000037, 0x000029 }, + [0x00247b] = { 0x000028, 0x000038, 0x000029 }, + [0x00247c] = { 0x000028, 0x000039, 0x000029 }, + [0x00247d] = { 0x000028, 0x000031, 0x000030, 0x000029 }, + [0x00247e] = { 0x000028, 0x000031, 0x000031, 0x000029 }, + [0x00247f] = { 0x000028, 0x000031, 0x000032, 0x000029 }, + [0x002480] = { 0x000028, 0x000031, 0x000033, 0x000029 }, + [0x002481] = { 0x000028, 0x000031, 0x000034, 0x000029 }, + [0x002482] = { 0x000028, 0x000031, 0x000035, 0x000029 }, + [0x002483] = { 0x000028, 0x000031, 0x000036, 0x000029 }, + [0x002484] = { 0x000028, 0x000031, 0x000037, 0x000029 }, + [0x002485] = { 0x000028, 0x000031, 0x000038, 0x000029 }, + [0x002486] = { 0x000028, 0x000031, 0x000039, 0x000029 }, + [0x002487] = { 0x000028, 0x000032, 0x000030, 0x000029 }, + [0x002488] = { 0x000031, 0x00002e }, + [0x002489] = { 0x000032, 0x00002e }, + [0x00248a] = { 0x000033, 0x00002e }, + [0x00248b] = { 0x000034, 0x00002e }, + [0x00248c] = { 0x000035, 0x00002e }, + [0x00248d] = { 0x000036, 0x00002e }, + [0x00248e] = { 0x000037, 0x00002e }, + [0x00248f] = { 0x000038, 0x00002e }, + [0x002490] = { 0x000039, 0x00002e }, + [0x002491] = { 0x000031, 0x000030, 0x00002e }, + [0x002492] = { 0x000031, 0x000031, 0x00002e }, + [0x002493] = { 0x000031, 0x000032, 0x00002e }, + [0x002494] = { 0x000031, 0x000033, 0x00002e }, + [0x002495] = { 0x000031, 0x000034, 0x00002e }, + [0x002496] = { 0x000031, 0x000035, 0x00002e }, + [0x002497] = { 0x000031, 0x000036, 0x00002e }, + [0x002498] = { 0x000031, 0x000037, 0x00002e }, + [0x002499] = { 0x000031, 0x000038, 0x00002e }, + [0x00249a] = { 0x000031, 0x000039, 0x00002e }, + [0x00249b] = { 0x000032, 0x000030, 0x00002e }, + [0x00249c] = { 0x000028, 0x000061, 0x000029 }, + [0x00249d] = { 0x000028, 0x000062, 0x000029 }, + [0x00249e] = { 0x000028, 0x000063, 0x000029 }, + [0x00249f] = { 0x000028, 0x000064, 0x000029 }, + [0x0024a0] = { 0x000028, 0x000065, 0x000029 }, + [0x0024a1] = { 0x000028, 0x000066, 0x000029 }, + [0x0024a2] = { 0x000028, 0x000067, 0x000029 }, + [0x0024a3] = { 0x000028, 0x000068, 0x000029 }, + [0x0024a4] = { 0x000028, 0x000069, 0x000029 }, + [0x0024a5] = { 0x000028, 0x00006a, 0x000029 }, + [0x0024a6] = { 0x000028, 0x00006b, 0x000029 }, + [0x0024a7] = { 0x000028, 0x00006c, 0x000029 }, + [0x0024a8] = { 0x000028, 0x00006d, 0x000029 }, + [0x0024a9] = { 0x000028, 0x00006e, 0x000029 }, + [0x0024aa] = { 0x000028, 0x00006f, 0x000029 }, + [0x0024ab] = { 0x000028, 0x000070, 0x000029 }, + [0x0024ac] = { 0x000028, 0x000071, 0x000029 }, + [0x0024ad] = { 0x000028, 0x000072, 0x000029 }, + [0x0024ae] = { 0x000028, 0x000073, 0x000029 }, + [0x0024af] = { 0x000028, 0x000074, 0x000029 }, + [0x0024b0] = { 0x000028, 0x000075, 0x000029 }, + [0x0024b1] = { 0x000028, 0x000076, 0x000029 }, + [0x0024b2] = { 0x000028, 0x000077, 0x000029 }, + [0x0024b3] = { 0x000028, 0x000078, 0x000029 }, + [0x0024b4] = { 0x000028, 0x000079, 0x000029 }, + [0x0024b5] = { 0x000028, 0x00007a, 0x000029 }, + [0x0024b6] = { 0x000041 }, + [0x0024b7] = { 0x000042 }, + [0x0024b8] = { 0x000043 }, + [0x0024b9] = { 0x000044 }, + [0x0024ba] = { 0x000045 }, + [0x0024bb] = { 0x000046 }, + [0x0024bc] = { 0x000047 }, + [0x0024bd] = { 0x000048 }, + [0x0024be] = { 0x000049 }, + [0x0024bf] = { 0x00004a }, + [0x0024c0] = { 0x00004b }, + [0x0024c1] = { 0x00004c }, + [0x0024c2] = { 0x00004d }, + [0x0024c3] = { 0x00004e }, + [0x0024c4] = { 0x00004f }, + [0x0024c5] = { 0x000050 }, + [0x0024c6] = { 0x000051 }, + [0x0024c7] = { 0x000052 }, + [0x0024c8] = { 0x000053 }, + [0x0024c9] = { 0x000054 }, + [0x0024ca] = { 0x000055 }, + [0x0024cb] = { 0x000056 }, + [0x0024cc] = { 0x000057 }, + [0x0024cd] = { 0x000058 }, + [0x0024ce] = { 0x000059 }, + [0x0024cf] = { 0x00005a }, + [0x0024d0] = { 0x000061 }, + [0x0024d1] = { 0x000062 }, + [0x0024d2] = { 0x000063 }, + [0x0024d3] = { 0x000064 }, + [0x0024d4] = { 0x000065 }, + [0x0024d5] = { 0x000066 }, + [0x0024d6] = { 0x000067 }, + [0x0024d7] = { 0x000068 }, + [0x0024d8] = { 0x000069 }, + [0x0024d9] = { 0x00006a }, + [0x0024da] = { 0x00006b }, + [0x0024db] = { 0x00006c }, + [0x0024dc] = { 0x00006d }, + [0x0024dd] = { 0x00006e }, + [0x0024de] = { 0x00006f }, + [0x0024df] = { 0x000070 }, + [0x0024e0] = { 0x000071 }, + [0x0024e1] = { 0x000072 }, + [0x0024e2] = { 0x000073 }, + [0x0024e3] = { 0x000074 }, + [0x0024e4] = { 0x000075 }, + [0x0024e5] = { 0x000076 }, + [0x0024e6] = { 0x000077 }, + [0x0024e7] = { 0x000078 }, + [0x0024e8] = { 0x000079 }, + [0x0024e9] = { 0x00007a }, + [0x0024ea] = { 0x000030 }, + [0x002a0c] = { 0x00222b, 0x00222b, 0x00222b, 0x00222b }, + [0x002a74] = { 0x00003a, 0x00003a, 0x00003d }, + [0x002a75] = { 0x00003d, 0x00003d }, + [0x002a76] = { 0x00003d, 0x00003d, 0x00003d }, + [0x002c7c] = { 0x00006a }, + [0x002c7d] = { 0x000056 }, + [0x002d6f] = { 0x002d61 }, + [0x002e9f] = { 0x006bcd }, + [0x002ef3] = { 0x009f9f }, + [0x002f00] = { 0x004e00 }, + [0x002f01] = { 0x004e28 }, + [0x002f02] = { 0x004e36 }, + [0x002f03] = { 0x004e3f }, + [0x002f04] = { 0x004e59 }, + [0x002f05] = { 0x004e85 }, + [0x002f06] = { 0x004e8c }, + [0x002f07] = { 0x004ea0 }, + [0x002f08] = { 0x004eba }, + [0x002f09] = { 0x00513f }, + [0x002f0a] = { 0x005165 }, + [0x002f0b] = { 0x00516b }, + [0x002f0c] = { 0x005182 }, + [0x002f0d] = { 0x005196 }, + [0x002f0e] = { 0x0051ab }, + [0x002f0f] = { 0x0051e0 }, + [0x002f10] = { 0x0051f5 }, + [0x002f11] = { 0x005200 }, + [0x002f12] = { 0x00529b }, + [0x002f13] = { 0x0052f9 }, + [0x002f14] = { 0x005315 }, + [0x002f15] = { 0x00531a }, + [0x002f16] = { 0x005338 }, + [0x002f17] = { 0x005341 }, + [0x002f18] = { 0x00535c }, + [0x002f19] = { 0x005369 }, + [0x002f1a] = { 0x005382 }, + [0x002f1b] = { 0x0053b6 }, + [0x002f1c] = { 0x0053c8 }, + [0x002f1d] = { 0x0053e3 }, + [0x002f1e] = { 0x0056d7 }, + [0x002f1f] = { 0x00571f }, + [0x002f20] = { 0x0058eb }, + [0x002f21] = { 0x005902 }, + [0x002f22] = { 0x00590a }, + [0x002f23] = { 0x005915 }, + [0x002f24] = { 0x005927 }, + [0x002f25] = { 0x005973 }, + [0x002f26] = { 0x005b50 }, + [0x002f27] = { 0x005b80 }, + [0x002f28] = { 0x005bf8 }, + [0x002f29] = { 0x005c0f }, + [0x002f2a] = { 0x005c22 }, + [0x002f2b] = { 0x005c38 }, + [0x002f2c] = { 0x005c6e }, + [0x002f2d] = { 0x005c71 }, + [0x002f2e] = { 0x005ddb }, + [0x002f2f] = { 0x005de5 }, + [0x002f30] = { 0x005df1 }, + [0x002f31] = { 0x005dfe }, + [0x002f32] = { 0x005e72 }, + [0x002f33] = { 0x005e7a }, + [0x002f34] = { 0x005e7f }, + [0x002f35] = { 0x005ef4 }, + [0x002f36] = { 0x005efe }, + [0x002f37] = { 0x005f0b }, + [0x002f38] = { 0x005f13 }, + [0x002f39] = { 0x005f50 }, + [0x002f3a] = { 0x005f61 }, + [0x002f3b] = { 0x005f73 }, + [0x002f3c] = { 0x005fc3 }, + [0x002f3d] = { 0x006208 }, + [0x002f3e] = { 0x006236 }, + [0x002f3f] = { 0x00624b }, + [0x002f40] = { 0x00652f }, + [0x002f41] = { 0x006534 }, + [0x002f42] = { 0x006587 }, + [0x002f43] = { 0x006597 }, + [0x002f44] = { 0x0065a4 }, + [0x002f45] = { 0x0065b9 }, + [0x002f46] = { 0x0065e0 }, + [0x002f47] = { 0x0065e5 }, + [0x002f48] = { 0x0066f0 }, + [0x002f49] = { 0x006708 }, + [0x002f4a] = { 0x006728 }, + [0x002f4b] = { 0x006b20 }, + [0x002f4c] = { 0x006b62 }, + [0x002f4d] = { 0x006b79 }, + [0x002f4e] = { 0x006bb3 }, + [0x002f4f] = { 0x006bcb }, + [0x002f50] = { 0x006bd4 }, + [0x002f51] = { 0x006bdb }, + [0x002f52] = { 0x006c0f }, + [0x002f53] = { 0x006c14 }, + [0x002f54] = { 0x006c34 }, + [0x002f55] = { 0x00706b }, + [0x002f56] = { 0x00722a }, + [0x002f57] = { 0x007236 }, + [0x002f58] = { 0x00723b }, + [0x002f59] = { 0x00723f }, + [0x002f5a] = { 0x007247 }, + [0x002f5b] = { 0x007259 }, + [0x002f5c] = { 0x00725b }, + [0x002f5d] = { 0x0072ac }, + [0x002f5e] = { 0x007384 }, + [0x002f5f] = { 0x007389 }, + [0x002f60] = { 0x0074dc }, + [0x002f61] = { 0x0074e6 }, + [0x002f62] = { 0x007518 }, + [0x002f63] = { 0x00751f }, + [0x002f64] = { 0x007528 }, + [0x002f65] = { 0x007530 }, + [0x002f66] = { 0x00758b }, + [0x002f67] = { 0x007592 }, + [0x002f68] = { 0x007676 }, + [0x002f69] = { 0x00767d }, + [0x002f6a] = { 0x0076ae }, + [0x002f6b] = { 0x0076bf }, + [0x002f6c] = { 0x0076ee }, + [0x002f6d] = { 0x0077db }, + [0x002f6e] = { 0x0077e2 }, + [0x002f6f] = { 0x0077f3 }, + [0x002f70] = { 0x00793a }, + [0x002f71] = { 0x0079b8 }, + [0x002f72] = { 0x0079be }, + [0x002f73] = { 0x007a74 }, + [0x002f74] = { 0x007acb }, + [0x002f75] = { 0x007af9 }, + [0x002f76] = { 0x007c73 }, + [0x002f77] = { 0x007cf8 }, + [0x002f78] = { 0x007f36 }, + [0x002f79] = { 0x007f51 }, + [0x002f7a] = { 0x007f8a }, + [0x002f7b] = { 0x007fbd }, + [0x002f7c] = { 0x008001 }, + [0x002f7d] = { 0x00800c }, + [0x002f7e] = { 0x008012 }, + [0x002f7f] = { 0x008033 }, + [0x002f80] = { 0x00807f }, + [0x002f81] = { 0x008089 }, + [0x002f82] = { 0x0081e3 }, + [0x002f83] = { 0x0081ea }, + [0x002f84] = { 0x0081f3 }, + [0x002f85] = { 0x0081fc }, + [0x002f86] = { 0x00820c }, + [0x002f87] = { 0x00821b }, + [0x002f88] = { 0x00821f }, + [0x002f89] = { 0x00826e }, + [0x002f8a] = { 0x008272 }, + [0x002f8b] = { 0x008278 }, + [0x002f8c] = { 0x00864d }, + [0x002f8d] = { 0x00866b }, + [0x002f8e] = { 0x008840 }, + [0x002f8f] = { 0x00884c }, + [0x002f90] = { 0x008863 }, + [0x002f91] = { 0x00897e }, + [0x002f92] = { 0x00898b }, + [0x002f93] = { 0x0089d2 }, + [0x002f94] = { 0x008a00 }, + [0x002f95] = { 0x008c37 }, + [0x002f96] = { 0x008c46 }, + [0x002f97] = { 0x008c55 }, + [0x002f98] = { 0x008c78 }, + [0x002f99] = { 0x008c9d }, + [0x002f9a] = { 0x008d64 }, + [0x002f9b] = { 0x008d70 }, + [0x002f9c] = { 0x008db3 }, + [0x002f9d] = { 0x008eab }, + [0x002f9e] = { 0x008eca }, + [0x002f9f] = { 0x008f9b }, + [0x002fa0] = { 0x008fb0 }, + [0x002fa1] = { 0x008fb5 }, + [0x002fa2] = { 0x009091 }, + [0x002fa3] = { 0x009149 }, + [0x002fa4] = { 0x0091c6 }, + [0x002fa5] = { 0x0091cc }, + [0x002fa6] = { 0x0091d1 }, + [0x002fa7] = { 0x009577 }, + [0x002fa8] = { 0x009580 }, + [0x002fa9] = { 0x00961c }, + [0x002faa] = { 0x0096b6 }, + [0x002fab] = { 0x0096b9 }, + [0x002fac] = { 0x0096e8 }, + [0x002fad] = { 0x009751 }, + [0x002fae] = { 0x00975e }, + [0x002faf] = { 0x009762 }, + [0x002fb0] = { 0x009769 }, + [0x002fb1] = { 0x0097cb }, + [0x002fb2] = { 0x0097ed }, + [0x002fb3] = { 0x0097f3 }, + [0x002fb4] = { 0x009801 }, + [0x002fb5] = { 0x0098a8 }, + [0x002fb6] = { 0x0098db }, + [0x002fb7] = { 0x0098df }, + [0x002fb8] = { 0x009996 }, + [0x002fb9] = { 0x009999 }, + [0x002fba] = { 0x0099ac }, + [0x002fbb] = { 0x009aa8 }, + [0x002fbc] = { 0x009ad8 }, + [0x002fbd] = { 0x009adf }, + [0x002fbe] = { 0x009b25 }, + [0x002fbf] = { 0x009b2f }, + [0x002fc0] = { 0x009b32 }, + [0x002fc1] = { 0x009b3c }, + [0x002fc2] = { 0x009b5a }, + [0x002fc3] = { 0x009ce5 }, + [0x002fc4] = { 0x009e75 }, + [0x002fc5] = { 0x009e7f }, + [0x002fc6] = { 0x009ea5 }, + [0x002fc7] = { 0x009ebb }, + [0x002fc8] = { 0x009ec3 }, + [0x002fc9] = { 0x009ecd }, + [0x002fca] = { 0x009ed1 }, + [0x002fcb] = { 0x009ef9 }, + [0x002fcc] = { 0x009efd }, + [0x002fcd] = { 0x009f0e }, + [0x002fce] = { 0x009f13 }, + [0x002fcf] = { 0x009f20 }, + [0x002fd0] = { 0x009f3b }, + [0x002fd1] = { 0x009f4a }, + [0x002fd2] = { 0x009f52 }, + [0x002fd3] = { 0x009f8d }, + [0x002fd4] = { 0x009f9c }, + [0x002fd5] = { 0x009fa0 }, + [0x003000] = { 0x000020 }, + [0x003036] = { 0x003012 }, + [0x003038] = { 0x005341 }, + [0x003039] = { 0x005344 }, + [0x00303a] = { 0x005345 }, + [0x00309b] = { 0x000020, 0x003099 }, + [0x00309c] = { 0x000020, 0x00309a }, + [0x00309f] = { 0x003088, 0x00308a }, + [0x0030ff] = { 0x0030b3, 0x0030c8 }, + [0x003131] = { 0x001100 }, + [0x003132] = { 0x001101 }, + [0x003133] = { 0x0011aa }, + [0x003134] = { 0x001102 }, + [0x003135] = { 0x0011ac }, + [0x003136] = { 0x0011ad }, + [0x003137] = { 0x001103 }, + [0x003138] = { 0x001104 }, + [0x003139] = { 0x001105 }, + [0x00313a] = { 0x0011b0 }, + [0x00313b] = { 0x0011b1 }, + [0x00313c] = { 0x0011b2 }, + [0x00313d] = { 0x0011b3 }, + [0x00313e] = { 0x0011b4 }, + [0x00313f] = { 0x0011b5 }, + [0x003140] = { 0x00111a }, + [0x003141] = { 0x001106 }, + [0x003142] = { 0x001107 }, + [0x003143] = { 0x001108 }, + [0x003144] = { 0x001121 }, + [0x003145] = { 0x001109 }, + [0x003146] = { 0x00110a }, + [0x003147] = { 0x00110b }, + [0x003148] = { 0x00110c }, + [0x003149] = { 0x00110d }, + [0x00314a] = { 0x00110e }, + [0x00314b] = { 0x00110f }, + [0x00314c] = { 0x001110 }, + [0x00314d] = { 0x001111 }, + [0x00314e] = { 0x001112 }, + [0x00314f] = { 0x001161 }, + [0x003150] = { 0x001162 }, + [0x003151] = { 0x001163 }, + [0x003152] = { 0x001164 }, + [0x003153] = { 0x001165 }, + [0x003154] = { 0x001166 }, + [0x003155] = { 0x001167 }, + [0x003156] = { 0x001168 }, + [0x003157] = { 0x001169 }, + [0x003158] = { 0x00116a }, + [0x003159] = { 0x00116b }, + [0x00315a] = { 0x00116c }, + [0x00315b] = { 0x00116d }, + [0x00315c] = { 0x00116e }, + [0x00315d] = { 0x00116f }, + [0x00315e] = { 0x001170 }, + [0x00315f] = { 0x001171 }, + [0x003160] = { 0x001172 }, + [0x003161] = { 0x001173 }, + [0x003162] = { 0x001174 }, + [0x003163] = { 0x001175 }, + [0x003164] = { 0x001160 }, + [0x003165] = { 0x001114 }, + [0x003166] = { 0x001115 }, + [0x003167] = { 0x0011c7 }, + [0x003168] = { 0x0011c8 }, + [0x003169] = { 0x0011cc }, + [0x00316a] = { 0x0011ce }, + [0x00316b] = { 0x0011d3 }, + [0x00316c] = { 0x0011d7 }, + [0x00316d] = { 0x0011d9 }, + [0x00316e] = { 0x00111c }, + [0x00316f] = { 0x0011dd }, + [0x003170] = { 0x0011df }, + [0x003171] = { 0x00111d }, + [0x003172] = { 0x00111e }, + [0x003173] = { 0x001120 }, + [0x003174] = { 0x001122 }, + [0x003175] = { 0x001123 }, + [0x003176] = { 0x001127 }, + [0x003177] = { 0x001129 }, + [0x003178] = { 0x00112b }, + [0x003179] = { 0x00112c }, + [0x00317a] = { 0x00112d }, + [0x00317b] = { 0x00112e }, + [0x00317c] = { 0x00112f }, + [0x00317d] = { 0x001132 }, + [0x00317e] = { 0x001136 }, + [0x00317f] = { 0x001140 }, + [0x003180] = { 0x001147 }, + [0x003181] = { 0x00114c }, + [0x003182] = { 0x0011f1 }, + [0x003183] = { 0x0011f2 }, + [0x003184] = { 0x001157 }, + [0x003185] = { 0x001158 }, + [0x003186] = { 0x001159 }, + [0x003187] = { 0x001184 }, + [0x003188] = { 0x001185 }, + [0x003189] = { 0x001188 }, + [0x00318a] = { 0x001191 }, + [0x00318b] = { 0x001192 }, + [0x00318c] = { 0x001194 }, + [0x00318d] = { 0x00119e }, + [0x00318e] = { 0x0011a1 }, + [0x003192] = { 0x004e00 }, + [0x003193] = { 0x004e8c }, + [0x003194] = { 0x004e09 }, + [0x003195] = { 0x0056db }, + [0x003196] = { 0x004e0a }, + [0x003197] = { 0x004e2d }, + [0x003198] = { 0x004e0b }, + [0x003199] = { 0x007532 }, + [0x00319a] = { 0x004e59 }, + [0x00319b] = { 0x004e19 }, + [0x00319c] = { 0x004e01 }, + [0x00319d] = { 0x005929 }, + [0x00319e] = { 0x005730 }, + [0x00319f] = { 0x004eba }, + [0x003200] = { 0x000028, 0x001100, 0x000029 }, + [0x003201] = { 0x000028, 0x001102, 0x000029 }, + [0x003202] = { 0x000028, 0x001103, 0x000029 }, + [0x003203] = { 0x000028, 0x001105, 0x000029 }, + [0x003204] = { 0x000028, 0x001106, 0x000029 }, + [0x003205] = { 0x000028, 0x001107, 0x000029 }, + [0x003206] = { 0x000028, 0x001109, 0x000029 }, + [0x003207] = { 0x000028, 0x00110b, 0x000029 }, + [0x003208] = { 0x000028, 0x00110c, 0x000029 }, + [0x003209] = { 0x000028, 0x00110e, 0x000029 }, + [0x00320a] = { 0x000028, 0x00110f, 0x000029 }, + [0x00320b] = { 0x000028, 0x001110, 0x000029 }, + [0x00320c] = { 0x000028, 0x001111, 0x000029 }, + [0x00320d] = { 0x000028, 0x001112, 0x000029 }, + [0x00320e] = { 0x000028, 0x001100, 0x001161, 0x000029 }, + [0x00320f] = { 0x000028, 0x001102, 0x001161, 0x000029 }, + [0x003210] = { 0x000028, 0x001103, 0x001161, 0x000029 }, + [0x003211] = { 0x000028, 0x001105, 0x001161, 0x000029 }, + [0x003212] = { 0x000028, 0x001106, 0x001161, 0x000029 }, + [0x003213] = { 0x000028, 0x001107, 0x001161, 0x000029 }, + [0x003214] = { 0x000028, 0x001109, 0x001161, 0x000029 }, + [0x003215] = { 0x000028, 0x00110b, 0x001161, 0x000029 }, + [0x003216] = { 0x000028, 0x00110c, 0x001161, 0x000029 }, + [0x003217] = { 0x000028, 0x00110e, 0x001161, 0x000029 }, + [0x003218] = { 0x000028, 0x00110f, 0x001161, 0x000029 }, + [0x003219] = { 0x000028, 0x001110, 0x001161, 0x000029 }, + [0x00321a] = { 0x000028, 0x001111, 0x001161, 0x000029 }, + [0x00321b] = { 0x000028, 0x001112, 0x001161, 0x000029 }, + [0x00321c] = { 0x000028, 0x00110c, 0x00116e, 0x000029 }, + [0x00321d] = { 0x000028, 0x00110b, 0x001169, 0x00110c, 0x001165, 0x0011ab, 0x000029 }, + [0x00321e] = { 0x000028, 0x00110b, 0x001169, 0x001112, 0x00116e, 0x000029 }, + [0x003220] = { 0x000028, 0x004e00, 0x000029 }, + [0x003221] = { 0x000028, 0x004e8c, 0x000029 }, + [0x003222] = { 0x000028, 0x004e09, 0x000029 }, + [0x003223] = { 0x000028, 0x0056db, 0x000029 }, + [0x003224] = { 0x000028, 0x004e94, 0x000029 }, + [0x003225] = { 0x000028, 0x00516d, 0x000029 }, + [0x003226] = { 0x000028, 0x004e03, 0x000029 }, + [0x003227] = { 0x000028, 0x00516b, 0x000029 }, + [0x003228] = { 0x000028, 0x004e5d, 0x000029 }, + [0x003229] = { 0x000028, 0x005341, 0x000029 }, + [0x00322a] = { 0x000028, 0x006708, 0x000029 }, + [0x00322b] = { 0x000028, 0x00706b, 0x000029 }, + [0x00322c] = { 0x000028, 0x006c34, 0x000029 }, + [0x00322d] = { 0x000028, 0x006728, 0x000029 }, + [0x00322e] = { 0x000028, 0x0091d1, 0x000029 }, + [0x00322f] = { 0x000028, 0x00571f, 0x000029 }, + [0x003230] = { 0x000028, 0x0065e5, 0x000029 }, + [0x003231] = { 0x000028, 0x00682a, 0x000029 }, + [0x003232] = { 0x000028, 0x006709, 0x000029 }, + [0x003233] = { 0x000028, 0x00793e, 0x000029 }, + [0x003234] = { 0x000028, 0x00540d, 0x000029 }, + [0x003235] = { 0x000028, 0x007279, 0x000029 }, + [0x003236] = { 0x000028, 0x008ca1, 0x000029 }, + [0x003237] = { 0x000028, 0x00795d, 0x000029 }, + [0x003238] = { 0x000028, 0x0052b4, 0x000029 }, + [0x003239] = { 0x000028, 0x004ee3, 0x000029 }, + [0x00323a] = { 0x000028, 0x00547c, 0x000029 }, + [0x00323b] = { 0x000028, 0x005b66, 0x000029 }, + [0x00323c] = { 0x000028, 0x0076e3, 0x000029 }, + [0x00323d] = { 0x000028, 0x004f01, 0x000029 }, + [0x00323e] = { 0x000028, 0x008cc7, 0x000029 }, + [0x00323f] = { 0x000028, 0x005354, 0x000029 }, + [0x003240] = { 0x000028, 0x00796d, 0x000029 }, + [0x003241] = { 0x000028, 0x004f11, 0x000029 }, + [0x003242] = { 0x000028, 0x0081ea, 0x000029 }, + [0x003243] = { 0x000028, 0x0081f3, 0x000029 }, + [0x003244] = { 0x00554f }, + [0x003245] = { 0x005e7c }, + [0x003246] = { 0x006587 }, + [0x003247] = { 0x007b8f }, + [0x003250] = { 0x000050, 0x000054, 0x000045 }, + [0x003251] = { 0x000032, 0x000031 }, + [0x003252] = { 0x000032, 0x000032 }, + [0x003253] = { 0x000032, 0x000033 }, + [0x003254] = { 0x000032, 0x000034 }, + [0x003255] = { 0x000032, 0x000035 }, + [0x003256] = { 0x000032, 0x000036 }, + [0x003257] = { 0x000032, 0x000037 }, + [0x003258] = { 0x000032, 0x000038 }, + [0x003259] = { 0x000032, 0x000039 }, + [0x00325a] = { 0x000033, 0x000030 }, + [0x00325b] = { 0x000033, 0x000031 }, + [0x00325c] = { 0x000033, 0x000032 }, + [0x00325d] = { 0x000033, 0x000033 }, + [0x00325e] = { 0x000033, 0x000034 }, + [0x00325f] = { 0x000033, 0x000035 }, + [0x003260] = { 0x001100 }, + [0x003261] = { 0x001102 }, + [0x003262] = { 0x001103 }, + [0x003263] = { 0x001105 }, + [0x003264] = { 0x001106 }, + [0x003265] = { 0x001107 }, + [0x003266] = { 0x001109 }, + [0x003267] = { 0x00110b }, + [0x003268] = { 0x00110c }, + [0x003269] = { 0x00110e }, + [0x00326a] = { 0x00110f }, + [0x00326b] = { 0x001110 }, + [0x00326c] = { 0x001111 }, + [0x00326d] = { 0x001112 }, + [0x00326e] = { 0x001100, 0x001161 }, + [0x00326f] = { 0x001102, 0x001161 }, + [0x003270] = { 0x001103, 0x001161 }, + [0x003271] = { 0x001105, 0x001161 }, + [0x003272] = { 0x001106, 0x001161 }, + [0x003273] = { 0x001107, 0x001161 }, + [0x003274] = { 0x001109, 0x001161 }, + [0x003275] = { 0x00110b, 0x001161 }, + [0x003276] = { 0x00110c, 0x001161 }, + [0x003277] = { 0x00110e, 0x001161 }, + [0x003278] = { 0x00110f, 0x001161 }, + [0x003279] = { 0x001110, 0x001161 }, + [0x00327a] = { 0x001111, 0x001161 }, + [0x00327b] = { 0x001112, 0x001161 }, + [0x00327c] = { 0x00110e, 0x001161, 0x0011b7, 0x001100, 0x001169 }, + [0x00327d] = { 0x00110c, 0x00116e, 0x00110b, 0x001174 }, + [0x00327e] = { 0x00110b, 0x00116e }, + [0x003280] = { 0x004e00 }, + [0x003281] = { 0x004e8c }, + [0x003282] = { 0x004e09 }, + [0x003283] = { 0x0056db }, + [0x003284] = { 0x004e94 }, + [0x003285] = { 0x00516d }, + [0x003286] = { 0x004e03 }, + [0x003287] = { 0x00516b }, + [0x003288] = { 0x004e5d }, + [0x003289] = { 0x005341 }, + [0x00328a] = { 0x006708 }, + [0x00328b] = { 0x00706b }, + [0x00328c] = { 0x006c34 }, + [0x00328d] = { 0x006728 }, + [0x00328e] = { 0x0091d1 }, + [0x00328f] = { 0x00571f }, + [0x003290] = { 0x0065e5 }, + [0x003291] = { 0x00682a }, + [0x003292] = { 0x006709 }, + [0x003293] = { 0x00793e }, + [0x003294] = { 0x00540d }, + [0x003295] = { 0x007279 }, + [0x003296] = { 0x008ca1 }, + [0x003297] = { 0x00795d }, + [0x003298] = { 0x0052b4 }, + [0x003299] = { 0x0079d8 }, + [0x00329a] = { 0x007537 }, + [0x00329b] = { 0x005973 }, + [0x00329c] = { 0x009069 }, + [0x00329d] = { 0x00512a }, + [0x00329e] = { 0x005370 }, + [0x00329f] = { 0x006ce8 }, + [0x0032a0] = { 0x009805 }, + [0x0032a1] = { 0x004f11 }, + [0x0032a2] = { 0x005199 }, + [0x0032a3] = { 0x006b63 }, + [0x0032a4] = { 0x004e0a }, + [0x0032a5] = { 0x004e2d }, + [0x0032a6] = { 0x004e0b }, + [0x0032a7] = { 0x005de6 }, + [0x0032a8] = { 0x0053f3 }, + [0x0032a9] = { 0x00533b }, + [0x0032aa] = { 0x005b97 }, + [0x0032ab] = { 0x005b66 }, + [0x0032ac] = { 0x0076e3 }, + [0x0032ad] = { 0x004f01 }, + [0x0032ae] = { 0x008cc7 }, + [0x0032af] = { 0x005354 }, + [0x0032b0] = { 0x00591c }, + [0x0032b1] = { 0x000033, 0x000036 }, + [0x0032b2] = { 0x000033, 0x000037 }, + [0x0032b3] = { 0x000033, 0x000038 }, + [0x0032b4] = { 0x000033, 0x000039 }, + [0x0032b5] = { 0x000034, 0x000030 }, + [0x0032b6] = { 0x000034, 0x000031 }, + [0x0032b7] = { 0x000034, 0x000032 }, + [0x0032b8] = { 0x000034, 0x000033 }, + [0x0032b9] = { 0x000034, 0x000034 }, + [0x0032ba] = { 0x000034, 0x000035 }, + [0x0032bb] = { 0x000034, 0x000036 }, + [0x0032bc] = { 0x000034, 0x000037 }, + [0x0032bd] = { 0x000034, 0x000038 }, + [0x0032be] = { 0x000034, 0x000039 }, + [0x0032bf] = { 0x000035, 0x000030 }, + [0x0032c0] = { 0x000031, 0x006708 }, + [0x0032c1] = { 0x000032, 0x006708 }, + [0x0032c2] = { 0x000033, 0x006708 }, + [0x0032c3] = { 0x000034, 0x006708 }, + [0x0032c4] = { 0x000035, 0x006708 }, + [0x0032c5] = { 0x000036, 0x006708 }, + [0x0032c6] = { 0x000037, 0x006708 }, + [0x0032c7] = { 0x000038, 0x006708 }, + [0x0032c8] = { 0x000039, 0x006708 }, + [0x0032c9] = { 0x000031, 0x000030, 0x006708 }, + [0x0032ca] = { 0x000031, 0x000031, 0x006708 }, + [0x0032cb] = { 0x000031, 0x000032, 0x006708 }, + [0x0032cc] = { 0x000048, 0x000067 }, + [0x0032cd] = { 0x000065, 0x000072, 0x000067 }, + [0x0032ce] = { 0x000065, 0x000056 }, + [0x0032cf] = { 0x00004c, 0x000054, 0x000044 }, + [0x0032d0] = { 0x0030a2 }, + [0x0032d1] = { 0x0030a4 }, + [0x0032d2] = { 0x0030a6 }, + [0x0032d3] = { 0x0030a8 }, + [0x0032d4] = { 0x0030aa }, + [0x0032d5] = { 0x0030ab }, + [0x0032d6] = { 0x0030ad }, + [0x0032d7] = { 0x0030af }, + [0x0032d8] = { 0x0030b1 }, + [0x0032d9] = { 0x0030b3 }, + [0x0032da] = { 0x0030b5 }, + [0x0032db] = { 0x0030b7 }, + [0x0032dc] = { 0x0030b9 }, + [0x0032dd] = { 0x0030bb }, + [0x0032de] = { 0x0030bd }, + [0x0032df] = { 0x0030bf }, + [0x0032e0] = { 0x0030c1 }, + [0x0032e1] = { 0x0030c4 }, + [0x0032e2] = { 0x0030c6 }, + [0x0032e3] = { 0x0030c8 }, + [0x0032e4] = { 0x0030ca }, + [0x0032e5] = { 0x0030cb }, + [0x0032e6] = { 0x0030cc }, + [0x0032e7] = { 0x0030cd }, + [0x0032e8] = { 0x0030ce }, + [0x0032e9] = { 0x0030cf }, + [0x0032ea] = { 0x0030d2 }, + [0x0032eb] = { 0x0030d5 }, + [0x0032ec] = { 0x0030d8 }, + [0x0032ed] = { 0x0030db }, + [0x0032ee] = { 0x0030de }, + [0x0032ef] = { 0x0030df }, + [0x0032f0] = { 0x0030e0 }, + [0x0032f1] = { 0x0030e1 }, + [0x0032f2] = { 0x0030e2 }, + [0x0032f3] = { 0x0030e4 }, + [0x0032f4] = { 0x0030e6 }, + [0x0032f5] = { 0x0030e8 }, + [0x0032f6] = { 0x0030e9 }, + [0x0032f7] = { 0x0030ea }, + [0x0032f8] = { 0x0030eb }, + [0x0032f9] = { 0x0030ec }, + [0x0032fa] = { 0x0030ed }, + [0x0032fb] = { 0x0030ef }, + [0x0032fc] = { 0x0030f0 }, + [0x0032fd] = { 0x0030f1 }, + [0x0032fe] = { 0x0030f2 }, + [0x003300] = { 0x0030a2, 0x0030cf, 0x00309a, 0x0030fc, 0x0030c8 }, + [0x003301] = { 0x0030a2, 0x0030eb, 0x0030d5, 0x0030a1 }, + [0x003302] = { 0x0030a2, 0x0030f3, 0x0030d8, 0x00309a, 0x0030a2 }, + [0x003303] = { 0x0030a2, 0x0030fc, 0x0030eb }, + [0x003304] = { 0x0030a4, 0x0030cb, 0x0030f3, 0x0030af, 0x003099 }, + [0x003305] = { 0x0030a4, 0x0030f3, 0x0030c1 }, + [0x003306] = { 0x0030a6, 0x0030a9, 0x0030f3 }, + [0x003307] = { 0x0030a8, 0x0030b9, 0x0030af, 0x0030fc, 0x0030c8, 0x003099 }, + [0x003308] = { 0x0030a8, 0x0030fc, 0x0030ab, 0x0030fc }, + [0x003309] = { 0x0030aa, 0x0030f3, 0x0030b9 }, + [0x00330a] = { 0x0030aa, 0x0030fc, 0x0030e0 }, + [0x00330b] = { 0x0030ab, 0x0030a4, 0x0030ea }, + [0x00330c] = { 0x0030ab, 0x0030e9, 0x0030c3, 0x0030c8 }, + [0x00330d] = { 0x0030ab, 0x0030ed, 0x0030ea, 0x0030fc }, + [0x00330e] = { 0x0030ab, 0x003099, 0x0030ed, 0x0030f3 }, + [0x00330f] = { 0x0030ab, 0x003099, 0x0030f3, 0x0030de }, + [0x003310] = { 0x0030ad, 0x003099, 0x0030ab, 0x003099 }, + [0x003311] = { 0x0030ad, 0x003099, 0x0030cb, 0x0030fc }, + [0x003312] = { 0x0030ad, 0x0030e5, 0x0030ea, 0x0030fc }, + [0x003313] = { 0x0030ad, 0x003099, 0x0030eb, 0x0030bf, 0x003099, 0x0030fc }, + [0x003314] = { 0x0030ad, 0x0030ed }, + [0x003315] = { 0x0030ad, 0x0030ed, 0x0030af, 0x003099, 0x0030e9, 0x0030e0 }, + [0x003316] = { 0x0030ad, 0x0030ed, 0x0030e1, 0x0030fc, 0x0030c8, 0x0030eb }, + [0x003317] = { 0x0030ad, 0x0030ed, 0x0030ef, 0x0030c3, 0x0030c8 }, + [0x003318] = { 0x0030af, 0x003099, 0x0030e9, 0x0030e0 }, + [0x003319] = { 0x0030af, 0x003099, 0x0030e9, 0x0030e0, 0x0030c8, 0x0030f3 }, + [0x00331a] = { 0x0030af, 0x0030eb, 0x0030bb, 0x003099, 0x0030a4, 0x0030ed }, + [0x00331b] = { 0x0030af, 0x0030ed, 0x0030fc, 0x0030cd }, + [0x00331c] = { 0x0030b1, 0x0030fc, 0x0030b9 }, + [0x00331d] = { 0x0030b3, 0x0030eb, 0x0030ca }, + [0x00331e] = { 0x0030b3, 0x0030fc, 0x0030db, 0x00309a }, + [0x00331f] = { 0x0030b5, 0x0030a4, 0x0030af, 0x0030eb }, + [0x003320] = { 0x0030b5, 0x0030f3, 0x0030c1, 0x0030fc, 0x0030e0 }, + [0x003321] = { 0x0030b7, 0x0030ea, 0x0030f3, 0x0030af, 0x003099 }, + [0x003322] = { 0x0030bb, 0x0030f3, 0x0030c1 }, + [0x003323] = { 0x0030bb, 0x0030f3, 0x0030c8 }, + [0x003324] = { 0x0030bf, 0x003099, 0x0030fc, 0x0030b9 }, + [0x003325] = { 0x0030c6, 0x003099, 0x0030b7 }, + [0x003326] = { 0x0030c8, 0x003099, 0x0030eb }, + [0x003327] = { 0x0030c8, 0x0030f3 }, + [0x003328] = { 0x0030ca, 0x0030ce }, + [0x003329] = { 0x0030ce, 0x0030c3, 0x0030c8 }, + [0x00332a] = { 0x0030cf, 0x0030a4, 0x0030c4 }, + [0x00332b] = { 0x0030cf, 0x00309a, 0x0030fc, 0x0030bb, 0x0030f3, 0x0030c8 }, + [0x00332c] = { 0x0030cf, 0x00309a, 0x0030fc, 0x0030c4 }, + [0x00332d] = { 0x0030cf, 0x003099, 0x0030fc, 0x0030ec, 0x0030eb }, + [0x00332e] = { 0x0030d2, 0x00309a, 0x0030a2, 0x0030b9, 0x0030c8, 0x0030eb }, + [0x00332f] = { 0x0030d2, 0x00309a, 0x0030af, 0x0030eb }, + [0x003330] = { 0x0030d2, 0x00309a, 0x0030b3 }, + [0x003331] = { 0x0030d2, 0x003099, 0x0030eb }, + [0x003332] = { 0x0030d5, 0x0030a1, 0x0030e9, 0x0030c3, 0x0030c8, 0x003099 }, + [0x003333] = { 0x0030d5, 0x0030a3, 0x0030fc, 0x0030c8 }, + [0x003334] = { 0x0030d5, 0x003099, 0x0030c3, 0x0030b7, 0x0030a7, 0x0030eb }, + [0x003335] = { 0x0030d5, 0x0030e9, 0x0030f3 }, + [0x003336] = { 0x0030d8, 0x0030af, 0x0030bf, 0x0030fc, 0x0030eb }, + [0x003337] = { 0x0030d8, 0x00309a, 0x0030bd }, + [0x003338] = { 0x0030d8, 0x00309a, 0x0030cb, 0x0030d2 }, + [0x003339] = { 0x0030d8, 0x0030eb, 0x0030c4 }, + [0x00333a] = { 0x0030d8, 0x00309a, 0x0030f3, 0x0030b9 }, + [0x00333b] = { 0x0030d8, 0x00309a, 0x0030fc, 0x0030b7, 0x003099 }, + [0x00333c] = { 0x0030d8, 0x003099, 0x0030fc, 0x0030bf }, + [0x00333d] = { 0x0030db, 0x00309a, 0x0030a4, 0x0030f3, 0x0030c8 }, + [0x00333e] = { 0x0030db, 0x003099, 0x0030eb, 0x0030c8 }, + [0x00333f] = { 0x0030db, 0x0030f3 }, + [0x003340] = { 0x0030db, 0x00309a, 0x0030f3, 0x0030c8, 0x003099 }, + [0x003341] = { 0x0030db, 0x0030fc, 0x0030eb }, + [0x003342] = { 0x0030db, 0x0030fc, 0x0030f3 }, + [0x003343] = { 0x0030de, 0x0030a4, 0x0030af, 0x0030ed }, + [0x003344] = { 0x0030de, 0x0030a4, 0x0030eb }, + [0x003345] = { 0x0030de, 0x0030c3, 0x0030cf }, + [0x003346] = { 0x0030de, 0x0030eb, 0x0030af }, + [0x003347] = { 0x0030de, 0x0030f3, 0x0030b7, 0x0030e7, 0x0030f3 }, + [0x003348] = { 0x0030df, 0x0030af, 0x0030ed, 0x0030f3 }, + [0x003349] = { 0x0030df, 0x0030ea }, + [0x00334a] = { 0x0030df, 0x0030ea, 0x0030cf, 0x003099, 0x0030fc, 0x0030eb }, + [0x00334b] = { 0x0030e1, 0x0030ab, 0x003099 }, + [0x00334c] = { 0x0030e1, 0x0030ab, 0x003099, 0x0030c8, 0x0030f3 }, + [0x00334d] = { 0x0030e1, 0x0030fc, 0x0030c8, 0x0030eb }, + [0x00334e] = { 0x0030e4, 0x0030fc, 0x0030c8, 0x003099 }, + [0x00334f] = { 0x0030e4, 0x0030fc, 0x0030eb }, + [0x003350] = { 0x0030e6, 0x0030a2, 0x0030f3 }, + [0x003351] = { 0x0030ea, 0x0030c3, 0x0030c8, 0x0030eb }, + [0x003352] = { 0x0030ea, 0x0030e9 }, + [0x003353] = { 0x0030eb, 0x0030d2, 0x00309a, 0x0030fc }, + [0x003354] = { 0x0030eb, 0x0030fc, 0x0030d5, 0x003099, 0x0030eb }, + [0x003355] = { 0x0030ec, 0x0030e0 }, + [0x003356] = { 0x0030ec, 0x0030f3, 0x0030c8, 0x0030b1, 0x003099, 0x0030f3 }, + [0x003357] = { 0x0030ef, 0x0030c3, 0x0030c8 }, + [0x003358] = { 0x000030, 0x0070b9 }, + [0x003359] = { 0x000031, 0x0070b9 }, + [0x00335a] = { 0x000032, 0x0070b9 }, + [0x00335b] = { 0x000033, 0x0070b9 }, + [0x00335c] = { 0x000034, 0x0070b9 }, + [0x00335d] = { 0x000035, 0x0070b9 }, + [0x00335e] = { 0x000036, 0x0070b9 }, + [0x00335f] = { 0x000037, 0x0070b9 }, + [0x003360] = { 0x000038, 0x0070b9 }, + [0x003361] = { 0x000039, 0x0070b9 }, + [0x003362] = { 0x000031, 0x000030, 0x0070b9 }, + [0x003363] = { 0x000031, 0x000031, 0x0070b9 }, + [0x003364] = { 0x000031, 0x000032, 0x0070b9 }, + [0x003365] = { 0x000031, 0x000033, 0x0070b9 }, + [0x003366] = { 0x000031, 0x000034, 0x0070b9 }, + [0x003367] = { 0x000031, 0x000035, 0x0070b9 }, + [0x003368] = { 0x000031, 0x000036, 0x0070b9 }, + [0x003369] = { 0x000031, 0x000037, 0x0070b9 }, + [0x00336a] = { 0x000031, 0x000038, 0x0070b9 }, + [0x00336b] = { 0x000031, 0x000039, 0x0070b9 }, + [0x00336c] = { 0x000032, 0x000030, 0x0070b9 }, + [0x00336d] = { 0x000032, 0x000031, 0x0070b9 }, + [0x00336e] = { 0x000032, 0x000032, 0x0070b9 }, + [0x00336f] = { 0x000032, 0x000033, 0x0070b9 }, + [0x003370] = { 0x000032, 0x000034, 0x0070b9 }, + [0x003371] = { 0x000068, 0x000050, 0x000061 }, + [0x003372] = { 0x000064, 0x000061 }, + [0x003373] = { 0x000041, 0x000055 }, + [0x003374] = { 0x000062, 0x000061, 0x000072 }, + [0x003375] = { 0x00006f, 0x000056 }, + [0x003376] = { 0x000070, 0x000063 }, + [0x003377] = { 0x000064, 0x00006d }, + [0x003378] = { 0x000064, 0x00006d, 0x000032 }, + [0x003379] = { 0x000064, 0x00006d, 0x000033 }, + [0x00337a] = { 0x000049, 0x000055 }, + [0x00337b] = { 0x005e73, 0x006210 }, + [0x00337c] = { 0x00662d, 0x00548c }, + [0x00337d] = { 0x005927, 0x006b63 }, + [0x00337e] = { 0x00660e, 0x006cbb }, + [0x00337f] = { 0x00682a, 0x005f0f, 0x004f1a, 0x00793e }, + [0x003380] = { 0x000070, 0x000041 }, + [0x003381] = { 0x00006e, 0x000041 }, + [0x003382] = { 0x0003bc, 0x000041 }, + [0x003383] = { 0x00006d, 0x000041 }, + [0x003384] = { 0x00006b, 0x000041 }, + [0x003385] = { 0x00004b, 0x000042 }, + [0x003386] = { 0x00004d, 0x000042 }, + [0x003387] = { 0x000047, 0x000042 }, + [0x003388] = { 0x000063, 0x000061, 0x00006c }, + [0x003389] = { 0x00006b, 0x000063, 0x000061, 0x00006c }, + [0x00338a] = { 0x000070, 0x000046 }, + [0x00338b] = { 0x00006e, 0x000046 }, + [0x00338c] = { 0x0003bc, 0x000046 }, + [0x00338d] = { 0x0003bc, 0x000067 }, + [0x00338e] = { 0x00006d, 0x000067 }, + [0x00338f] = { 0x00006b, 0x000067 }, + [0x003390] = { 0x000048, 0x00007a }, + [0x003391] = { 0x00006b, 0x000048, 0x00007a }, + [0x003392] = { 0x00004d, 0x000048, 0x00007a }, + [0x003393] = { 0x000047, 0x000048, 0x00007a }, + [0x003394] = { 0x000054, 0x000048, 0x00007a }, + [0x003395] = { 0x0003bc, 0x00006c }, + [0x003396] = { 0x00006d, 0x00006c }, + [0x003397] = { 0x000064, 0x00006c }, + [0x003398] = { 0x00006b, 0x00006c }, + [0x003399] = { 0x000066, 0x00006d }, + [0x00339a] = { 0x00006e, 0x00006d }, + [0x00339b] = { 0x0003bc, 0x00006d }, + [0x00339c] = { 0x00006d, 0x00006d }, + [0x00339d] = { 0x000063, 0x00006d }, + [0x00339e] = { 0x00006b, 0x00006d }, + [0x00339f] = { 0x00006d, 0x00006d, 0x000032 }, + [0x0033a0] = { 0x000063, 0x00006d, 0x000032 }, + [0x0033a1] = { 0x00006d, 0x000032 }, + [0x0033a2] = { 0x00006b, 0x00006d, 0x000032 }, + [0x0033a3] = { 0x00006d, 0x00006d, 0x000033 }, + [0x0033a4] = { 0x000063, 0x00006d, 0x000033 }, + [0x0033a5] = { 0x00006d, 0x000033 }, + [0x0033a6] = { 0x00006b, 0x00006d, 0x000033 }, + [0x0033a7] = { 0x00006d, 0x002215, 0x000073 }, + [0x0033a8] = { 0x00006d, 0x002215, 0x000073, 0x000032 }, + [0x0033a9] = { 0x000050, 0x000061 }, + [0x0033aa] = { 0x00006b, 0x000050, 0x000061 }, + [0x0033ab] = { 0x00004d, 0x000050, 0x000061 }, + [0x0033ac] = { 0x000047, 0x000050, 0x000061 }, + [0x0033ad] = { 0x000072, 0x000061, 0x000064 }, + [0x0033ae] = { 0x000072, 0x000061, 0x000064, 0x002215, 0x000073 }, + [0x0033af] = { 0x000072, 0x000061, 0x000064, 0x002215, 0x000073, 0x000032 }, + [0x0033b0] = { 0x000070, 0x000073 }, + [0x0033b1] = { 0x00006e, 0x000073 }, + [0x0033b2] = { 0x0003bc, 0x000073 }, + [0x0033b3] = { 0x00006d, 0x000073 }, + [0x0033b4] = { 0x000070, 0x000056 }, + [0x0033b5] = { 0x00006e, 0x000056 }, + [0x0033b6] = { 0x0003bc, 0x000056 }, + [0x0033b7] = { 0x00006d, 0x000056 }, + [0x0033b8] = { 0x00006b, 0x000056 }, + [0x0033b9] = { 0x00004d, 0x000056 }, + [0x0033ba] = { 0x000070, 0x000057 }, + [0x0033bb] = { 0x00006e, 0x000057 }, + [0x0033bc] = { 0x0003bc, 0x000057 }, + [0x0033bd] = { 0x00006d, 0x000057 }, + [0x0033be] = { 0x00006b, 0x000057 }, + [0x0033bf] = { 0x00004d, 0x000057 }, + [0x0033c0] = { 0x00006b, 0x0003a9 }, + [0x0033c1] = { 0x00004d, 0x0003a9 }, + [0x0033c2] = { 0x000061, 0x00002e, 0x00006d, 0x00002e }, + [0x0033c3] = { 0x000042, 0x000071 }, + [0x0033c4] = { 0x000063, 0x000063 }, + [0x0033c5] = { 0x000063, 0x000064 }, + [0x0033c6] = { 0x000043, 0x002215, 0x00006b, 0x000067 }, + [0x0033c7] = { 0x000043, 0x00006f, 0x00002e }, + [0x0033c8] = { 0x000064, 0x000042 }, + [0x0033c9] = { 0x000047, 0x000079 }, + [0x0033ca] = { 0x000068, 0x000061 }, + [0x0033cb] = { 0x000048, 0x000050 }, + [0x0033cc] = { 0x000069, 0x00006e }, + [0x0033cd] = { 0x00004b, 0x00004b }, + [0x0033ce] = { 0x00004b, 0x00004d }, + [0x0033cf] = { 0x00006b, 0x000074 }, + [0x0033d0] = { 0x00006c, 0x00006d }, + [0x0033d1] = { 0x00006c, 0x00006e }, + [0x0033d2] = { 0x00006c, 0x00006f, 0x000067 }, + [0x0033d3] = { 0x00006c, 0x000078 }, + [0x0033d4] = { 0x00006d, 0x000062 }, + [0x0033d5] = { 0x00006d, 0x000069, 0x00006c }, + [0x0033d6] = { 0x00006d, 0x00006f, 0x00006c }, + [0x0033d7] = { 0x000050, 0x000048 }, + [0x0033d8] = { 0x000070, 0x00002e, 0x00006d, 0x00002e }, + [0x0033d9] = { 0x000050, 0x000050, 0x00004d }, + [0x0033da] = { 0x000050, 0x000052 }, + [0x0033db] = { 0x000073, 0x000072 }, + [0x0033dc] = { 0x000053, 0x000076 }, + [0x0033dd] = { 0x000057, 0x000062 }, + [0x0033de] = { 0x000056, 0x002215, 0x00006d }, + [0x0033df] = { 0x000041, 0x002215, 0x00006d }, + [0x0033e0] = { 0x000031, 0x0065e5 }, + [0x0033e1] = { 0x000032, 0x0065e5 }, + [0x0033e2] = { 0x000033, 0x0065e5 }, + [0x0033e3] = { 0x000034, 0x0065e5 }, + [0x0033e4] = { 0x000035, 0x0065e5 }, + [0x0033e5] = { 0x000036, 0x0065e5 }, + [0x0033e6] = { 0x000037, 0x0065e5 }, + [0x0033e7] = { 0x000038, 0x0065e5 }, + [0x0033e8] = { 0x000039, 0x0065e5 }, + [0x0033e9] = { 0x000031, 0x000030, 0x0065e5 }, + [0x0033ea] = { 0x000031, 0x000031, 0x0065e5 }, + [0x0033eb] = { 0x000031, 0x000032, 0x0065e5 }, + [0x0033ec] = { 0x000031, 0x000033, 0x0065e5 }, + [0x0033ed] = { 0x000031, 0x000034, 0x0065e5 }, + [0x0033ee] = { 0x000031, 0x000035, 0x0065e5 }, + [0x0033ef] = { 0x000031, 0x000036, 0x0065e5 }, + [0x0033f0] = { 0x000031, 0x000037, 0x0065e5 }, + [0x0033f1] = { 0x000031, 0x000038, 0x0065e5 }, + [0x0033f2] = { 0x000031, 0x000039, 0x0065e5 }, + [0x0033f3] = { 0x000032, 0x000030, 0x0065e5 }, + [0x0033f4] = { 0x000032, 0x000031, 0x0065e5 }, + [0x0033f5] = { 0x000032, 0x000032, 0x0065e5 }, + [0x0033f6] = { 0x000032, 0x000033, 0x0065e5 }, + [0x0033f7] = { 0x000032, 0x000034, 0x0065e5 }, + [0x0033f8] = { 0x000032, 0x000035, 0x0065e5 }, + [0x0033f9] = { 0x000032, 0x000036, 0x0065e5 }, + [0x0033fa] = { 0x000032, 0x000037, 0x0065e5 }, + [0x0033fb] = { 0x000032, 0x000038, 0x0065e5 }, + [0x0033fc] = { 0x000032, 0x000039, 0x0065e5 }, + [0x0033fd] = { 0x000033, 0x000030, 0x0065e5 }, + [0x0033fe] = { 0x000033, 0x000031, 0x0065e5 }, + [0x0033ff] = { 0x000067, 0x000061, 0x00006c }, + [0x00a69c] = { 0x00044a }, + [0x00a69d] = { 0x00044c }, + [0x00a770] = { 0x00a76f }, + [0x00a7f8] = { 0x000126 }, + [0x00a7f9] = { 0x000153 }, + [0x00ab5c] = { 0x00a727 }, + [0x00ab5d] = { 0x00ab37 }, + [0x00ab5e] = { 0x00026b }, + [0x00ab5f] = { 0x00ab52 }, + [0x00fb00] = { 0x000066, 0x000066 }, + [0x00fb01] = { 0x000066, 0x000069 }, + [0x00fb02] = { 0x000066, 0x00006c }, + [0x00fb03] = { 0x000066, 0x000066, 0x000069 }, + [0x00fb04] = { 0x000066, 0x000066, 0x00006c }, + [0x00fb05] = { 0x000073, 0x000074 }, + [0x00fb06] = { 0x000073, 0x000074 }, + [0x00fb13] = { 0x000574, 0x000576 }, + [0x00fb14] = { 0x000574, 0x000565 }, + [0x00fb15] = { 0x000574, 0x00056b }, + [0x00fb16] = { 0x00057e, 0x000576 }, + [0x00fb17] = { 0x000574, 0x00056d }, + [0x00fb20] = { 0x0005e2 }, + [0x00fb21] = { 0x0005d0 }, + [0x00fb22] = { 0x0005d3 }, + [0x00fb23] = { 0x0005d4 }, + [0x00fb24] = { 0x0005db }, + [0x00fb25] = { 0x0005dc }, + [0x00fb26] = { 0x0005dd }, + [0x00fb27] = { 0x0005e8 }, + [0x00fb28] = { 0x0005ea }, + [0x00fb29] = { 0x00002b }, + [0x00fb4f] = { 0x0005d0, 0x0005dc }, + [0x00fb50] = { 0x000671 }, + [0x00fb51] = { 0x000671 }, + [0x00fb52] = { 0x00067b }, + [0x00fb53] = { 0x00067b }, + [0x00fb54] = { 0x00067b }, + [0x00fb55] = { 0x00067b }, + [0x00fb56] = { 0x00067e }, + [0x00fb57] = { 0x00067e }, + [0x00fb58] = { 0x00067e }, + [0x00fb59] = { 0x00067e }, + [0x00fb5a] = { 0x000680 }, + [0x00fb5b] = { 0x000680 }, + [0x00fb5c] = { 0x000680 }, + [0x00fb5d] = { 0x000680 }, + [0x00fb5e] = { 0x00067a }, + [0x00fb5f] = { 0x00067a }, + [0x00fb60] = { 0x00067a }, + [0x00fb61] = { 0x00067a }, + [0x00fb62] = { 0x00067f }, + [0x00fb63] = { 0x00067f }, + [0x00fb64] = { 0x00067f }, + [0x00fb65] = { 0x00067f }, + [0x00fb66] = { 0x000679 }, + [0x00fb67] = { 0x000679 }, + [0x00fb68] = { 0x000679 }, + [0x00fb69] = { 0x000679 }, + [0x00fb6a] = { 0x0006a4 }, + [0x00fb6b] = { 0x0006a4 }, + [0x00fb6c] = { 0x0006a4 }, + [0x00fb6d] = { 0x0006a4 }, + [0x00fb6e] = { 0x0006a6 }, + [0x00fb6f] = { 0x0006a6 }, + [0x00fb70] = { 0x0006a6 }, + [0x00fb71] = { 0x0006a6 }, + [0x00fb72] = { 0x000684 }, + [0x00fb73] = { 0x000684 }, + [0x00fb74] = { 0x000684 }, + [0x00fb75] = { 0x000684 }, + [0x00fb76] = { 0x000683 }, + [0x00fb77] = { 0x000683 }, + [0x00fb78] = { 0x000683 }, + [0x00fb79] = { 0x000683 }, + [0x00fb7a] = { 0x000686 }, + [0x00fb7b] = { 0x000686 }, + [0x00fb7c] = { 0x000686 }, + [0x00fb7d] = { 0x000686 }, + [0x00fb7e] = { 0x000687 }, + [0x00fb7f] = { 0x000687 }, + [0x00fb80] = { 0x000687 }, + [0x00fb81] = { 0x000687 }, + [0x00fb82] = { 0x00068d }, + [0x00fb83] = { 0x00068d }, + [0x00fb84] = { 0x00068c }, + [0x00fb85] = { 0x00068c }, + [0x00fb86] = { 0x00068e }, + [0x00fb87] = { 0x00068e }, + [0x00fb88] = { 0x000688 }, + [0x00fb89] = { 0x000688 }, + [0x00fb8a] = { 0x000698 }, + [0x00fb8b] = { 0x000698 }, + [0x00fb8c] = { 0x000691 }, + [0x00fb8d] = { 0x000691 }, + [0x00fb8e] = { 0x0006a9 }, + [0x00fb8f] = { 0x0006a9 }, + [0x00fb90] = { 0x0006a9 }, + [0x00fb91] = { 0x0006a9 }, + [0x00fb92] = { 0x0006af }, + [0x00fb93] = { 0x0006af }, + [0x00fb94] = { 0x0006af }, + [0x00fb95] = { 0x0006af }, + [0x00fb96] = { 0x0006b3 }, + [0x00fb97] = { 0x0006b3 }, + [0x00fb98] = { 0x0006b3 }, + [0x00fb99] = { 0x0006b3 }, + [0x00fb9a] = { 0x0006b1 }, + [0x00fb9b] = { 0x0006b1 }, + [0x00fb9c] = { 0x0006b1 }, + [0x00fb9d] = { 0x0006b1 }, + [0x00fb9e] = { 0x0006ba }, + [0x00fb9f] = { 0x0006ba }, + [0x00fba0] = { 0x0006bb }, + [0x00fba1] = { 0x0006bb }, + [0x00fba2] = { 0x0006bb }, + [0x00fba3] = { 0x0006bb }, + [0x00fba4] = { 0x0006d5, 0x000654 }, + [0x00fba5] = { 0x0006d5, 0x000654 }, + [0x00fba6] = { 0x0006c1 }, + [0x00fba7] = { 0x0006c1 }, + [0x00fba8] = { 0x0006c1 }, + [0x00fba9] = { 0x0006c1 }, + [0x00fbaa] = { 0x0006be }, + [0x00fbab] = { 0x0006be }, + [0x00fbac] = { 0x0006be }, + [0x00fbad] = { 0x0006be }, + [0x00fbae] = { 0x0006d2 }, + [0x00fbaf] = { 0x0006d2 }, + [0x00fbb0] = { 0x0006d2, 0x000654 }, + [0x00fbb1] = { 0x0006d2, 0x000654 }, + [0x00fbd3] = { 0x0006ad }, + [0x00fbd4] = { 0x0006ad }, + [0x00fbd5] = { 0x0006ad }, + [0x00fbd6] = { 0x0006ad }, + [0x00fbd7] = { 0x0006c7 }, + [0x00fbd8] = { 0x0006c7 }, + [0x00fbd9] = { 0x0006c6 }, + [0x00fbda] = { 0x0006c6 }, + [0x00fbdb] = { 0x0006c8 }, + [0x00fbdc] = { 0x0006c8 }, + [0x00fbdd] = { 0x0006c7, 0x000674 }, + [0x00fbde] = { 0x0006cb }, + [0x00fbdf] = { 0x0006cb }, + [0x00fbe0] = { 0x0006c5 }, + [0x00fbe1] = { 0x0006c5 }, + [0x00fbe2] = { 0x0006c9 }, + [0x00fbe3] = { 0x0006c9 }, + [0x00fbe4] = { 0x0006d0 }, + [0x00fbe5] = { 0x0006d0 }, + [0x00fbe6] = { 0x0006d0 }, + [0x00fbe7] = { 0x0006d0 }, + [0x00fbe8] = { 0x000649 }, + [0x00fbe9] = { 0x000649 }, + [0x00fbea] = { 0x00064a, 0x000654, 0x000627 }, + [0x00fbeb] = { 0x00064a, 0x000654, 0x000627 }, + [0x00fbec] = { 0x00064a, 0x000654, 0x0006d5 }, + [0x00fbed] = { 0x00064a, 0x000654, 0x0006d5 }, + [0x00fbee] = { 0x00064a, 0x000654, 0x000648 }, + [0x00fbef] = { 0x00064a, 0x000654, 0x000648 }, + [0x00fbf0] = { 0x00064a, 0x000654, 0x0006c7 }, + [0x00fbf1] = { 0x00064a, 0x000654, 0x0006c7 }, + [0x00fbf2] = { 0x00064a, 0x000654, 0x0006c6 }, + [0x00fbf3] = { 0x00064a, 0x000654, 0x0006c6 }, + [0x00fbf4] = { 0x00064a, 0x000654, 0x0006c8 }, + [0x00fbf5] = { 0x00064a, 0x000654, 0x0006c8 }, + [0x00fbf6] = { 0x00064a, 0x000654, 0x0006d0 }, + [0x00fbf7] = { 0x00064a, 0x000654, 0x0006d0 }, + [0x00fbf8] = { 0x00064a, 0x000654, 0x0006d0 }, + [0x00fbf9] = { 0x00064a, 0x000654, 0x000649 }, + [0x00fbfa] = { 0x00064a, 0x000654, 0x000649 }, + [0x00fbfb] = { 0x00064a, 0x000654, 0x000649 }, + [0x00fbfc] = { 0x0006cc }, + [0x00fbfd] = { 0x0006cc }, + [0x00fbfe] = { 0x0006cc }, + [0x00fbff] = { 0x0006cc }, + [0x00fc00] = { 0x00064a, 0x000654, 0x00062c }, + [0x00fc01] = { 0x00064a, 0x000654, 0x00062d }, + [0x00fc02] = { 0x00064a, 0x000654, 0x000645 }, + [0x00fc03] = { 0x00064a, 0x000654, 0x000649 }, + [0x00fc04] = { 0x00064a, 0x000654, 0x00064a }, + [0x00fc05] = { 0x000628, 0x00062c }, + [0x00fc06] = { 0x000628, 0x00062d }, + [0x00fc07] = { 0x000628, 0x00062e }, + [0x00fc08] = { 0x000628, 0x000645 }, + [0x00fc09] = { 0x000628, 0x000649 }, + [0x00fc0a] = { 0x000628, 0x00064a }, + [0x00fc0b] = { 0x00062a, 0x00062c }, + [0x00fc0c] = { 0x00062a, 0x00062d }, + [0x00fc0d] = { 0x00062a, 0x00062e }, + [0x00fc0e] = { 0x00062a, 0x000645 }, + [0x00fc0f] = { 0x00062a, 0x000649 }, + [0x00fc10] = { 0x00062a, 0x00064a }, + [0x00fc11] = { 0x00062b, 0x00062c }, + [0x00fc12] = { 0x00062b, 0x000645 }, + [0x00fc13] = { 0x00062b, 0x000649 }, + [0x00fc14] = { 0x00062b, 0x00064a }, + [0x00fc15] = { 0x00062c, 0x00062d }, + [0x00fc16] = { 0x00062c, 0x000645 }, + [0x00fc17] = { 0x00062d, 0x00062c }, + [0x00fc18] = { 0x00062d, 0x000645 }, + [0x00fc19] = { 0x00062e, 0x00062c }, + [0x00fc1a] = { 0x00062e, 0x00062d }, + [0x00fc1b] = { 0x00062e, 0x000645 }, + [0x00fc1c] = { 0x000633, 0x00062c }, + [0x00fc1d] = { 0x000633, 0x00062d }, + [0x00fc1e] = { 0x000633, 0x00062e }, + [0x00fc1f] = { 0x000633, 0x000645 }, + [0x00fc20] = { 0x000635, 0x00062d }, + [0x00fc21] = { 0x000635, 0x000645 }, + [0x00fc22] = { 0x000636, 0x00062c }, + [0x00fc23] = { 0x000636, 0x00062d }, + [0x00fc24] = { 0x000636, 0x00062e }, + [0x00fc25] = { 0x000636, 0x000645 }, + [0x00fc26] = { 0x000637, 0x00062d }, + [0x00fc27] = { 0x000637, 0x000645 }, + [0x00fc28] = { 0x000638, 0x000645 }, + [0x00fc29] = { 0x000639, 0x00062c }, + [0x00fc2a] = { 0x000639, 0x000645 }, + [0x00fc2b] = { 0x00063a, 0x00062c }, + [0x00fc2c] = { 0x00063a, 0x000645 }, + [0x00fc2d] = { 0x000641, 0x00062c }, + [0x00fc2e] = { 0x000641, 0x00062d }, + [0x00fc2f] = { 0x000641, 0x00062e }, + [0x00fc30] = { 0x000641, 0x000645 }, + [0x00fc31] = { 0x000641, 0x000649 }, + [0x00fc32] = { 0x000641, 0x00064a }, + [0x00fc33] = { 0x000642, 0x00062d }, + [0x00fc34] = { 0x000642, 0x000645 }, + [0x00fc35] = { 0x000642, 0x000649 }, + [0x00fc36] = { 0x000642, 0x00064a }, + [0x00fc37] = { 0x000643, 0x000627 }, + [0x00fc38] = { 0x000643, 0x00062c }, + [0x00fc39] = { 0x000643, 0x00062d }, + [0x00fc3a] = { 0x000643, 0x00062e }, + [0x00fc3b] = { 0x000643, 0x000644 }, + [0x00fc3c] = { 0x000643, 0x000645 }, + [0x00fc3d] = { 0x000643, 0x000649 }, + [0x00fc3e] = { 0x000643, 0x00064a }, + [0x00fc3f] = { 0x000644, 0x00062c }, + [0x00fc40] = { 0x000644, 0x00062d }, + [0x00fc41] = { 0x000644, 0x00062e }, + [0x00fc42] = { 0x000644, 0x000645 }, + [0x00fc43] = { 0x000644, 0x000649 }, + [0x00fc44] = { 0x000644, 0x00064a }, + [0x00fc45] = { 0x000645, 0x00062c }, + [0x00fc46] = { 0x000645, 0x00062d }, + [0x00fc47] = { 0x000645, 0x00062e }, + [0x00fc48] = { 0x000645, 0x000645 }, + [0x00fc49] = { 0x000645, 0x000649 }, + [0x00fc4a] = { 0x000645, 0x00064a }, + [0x00fc4b] = { 0x000646, 0x00062c }, + [0x00fc4c] = { 0x000646, 0x00062d }, + [0x00fc4d] = { 0x000646, 0x00062e }, + [0x00fc4e] = { 0x000646, 0x000645 }, + [0x00fc4f] = { 0x000646, 0x000649 }, + [0x00fc50] = { 0x000646, 0x00064a }, + [0x00fc51] = { 0x000647, 0x00062c }, + [0x00fc52] = { 0x000647, 0x000645 }, + [0x00fc53] = { 0x000647, 0x000649 }, + [0x00fc54] = { 0x000647, 0x00064a }, + [0x00fc55] = { 0x00064a, 0x00062c }, + [0x00fc56] = { 0x00064a, 0x00062d }, + [0x00fc57] = { 0x00064a, 0x00062e }, + [0x00fc58] = { 0x00064a, 0x000645 }, + [0x00fc59] = { 0x00064a, 0x000649 }, + [0x00fc5a] = { 0x00064a, 0x00064a }, + [0x00fc5b] = { 0x000630, 0x000670 }, + [0x00fc5c] = { 0x000631, 0x000670 }, + [0x00fc5d] = { 0x000649, 0x000670 }, + [0x00fc5e] = { 0x000020, 0x00064c, 0x000651 }, + [0x00fc5f] = { 0x000020, 0x00064d, 0x000651 }, + [0x00fc60] = { 0x000020, 0x00064e, 0x000651 }, + [0x00fc61] = { 0x000020, 0x00064f, 0x000651 }, + [0x00fc62] = { 0x000020, 0x000650, 0x000651 }, + [0x00fc63] = { 0x000020, 0x000651, 0x000670 }, + [0x00fc64] = { 0x00064a, 0x000654, 0x000631 }, + [0x00fc65] = { 0x00064a, 0x000654, 0x000632 }, + [0x00fc66] = { 0x00064a, 0x000654, 0x000645 }, + [0x00fc67] = { 0x00064a, 0x000654, 0x000646 }, + [0x00fc68] = { 0x00064a, 0x000654, 0x000649 }, + [0x00fc69] = { 0x00064a, 0x000654, 0x00064a }, + [0x00fc6a] = { 0x000628, 0x000631 }, + [0x00fc6b] = { 0x000628, 0x000632 }, + [0x00fc6c] = { 0x000628, 0x000645 }, + [0x00fc6d] = { 0x000628, 0x000646 }, + [0x00fc6e] = { 0x000628, 0x000649 }, + [0x00fc6f] = { 0x000628, 0x00064a }, + [0x00fc70] = { 0x00062a, 0x000631 }, + [0x00fc71] = { 0x00062a, 0x000632 }, + [0x00fc72] = { 0x00062a, 0x000645 }, + [0x00fc73] = { 0x00062a, 0x000646 }, + [0x00fc74] = { 0x00062a, 0x000649 }, + [0x00fc75] = { 0x00062a, 0x00064a }, + [0x00fc76] = { 0x00062b, 0x000631 }, + [0x00fc77] = { 0x00062b, 0x000632 }, + [0x00fc78] = { 0x00062b, 0x000645 }, + [0x00fc79] = { 0x00062b, 0x000646 }, + [0x00fc7a] = { 0x00062b, 0x000649 }, + [0x00fc7b] = { 0x00062b, 0x00064a }, + [0x00fc7c] = { 0x000641, 0x000649 }, + [0x00fc7d] = { 0x000641, 0x00064a }, + [0x00fc7e] = { 0x000642, 0x000649 }, + [0x00fc7f] = { 0x000642, 0x00064a }, + [0x00fc80] = { 0x000643, 0x000627 }, + [0x00fc81] = { 0x000643, 0x000644 }, + [0x00fc82] = { 0x000643, 0x000645 }, + [0x00fc83] = { 0x000643, 0x000649 }, + [0x00fc84] = { 0x000643, 0x00064a }, + [0x00fc85] = { 0x000644, 0x000645 }, + [0x00fc86] = { 0x000644, 0x000649 }, + [0x00fc87] = { 0x000644, 0x00064a }, + [0x00fc88] = { 0x000645, 0x000627 }, + [0x00fc89] = { 0x000645, 0x000645 }, + [0x00fc8a] = { 0x000646, 0x000631 }, + [0x00fc8b] = { 0x000646, 0x000632 }, + [0x00fc8c] = { 0x000646, 0x000645 }, + [0x00fc8d] = { 0x000646, 0x000646 }, + [0x00fc8e] = { 0x000646, 0x000649 }, + [0x00fc8f] = { 0x000646, 0x00064a }, + [0x00fc90] = { 0x000649, 0x000670 }, + [0x00fc91] = { 0x00064a, 0x000631 }, + [0x00fc92] = { 0x00064a, 0x000632 }, + [0x00fc93] = { 0x00064a, 0x000645 }, + [0x00fc94] = { 0x00064a, 0x000646 }, + [0x00fc95] = { 0x00064a, 0x000649 }, + [0x00fc96] = { 0x00064a, 0x00064a }, + [0x00fc97] = { 0x00064a, 0x000654, 0x00062c }, + [0x00fc98] = { 0x00064a, 0x000654, 0x00062d }, + [0x00fc99] = { 0x00064a, 0x000654, 0x00062e }, + [0x00fc9a] = { 0x00064a, 0x000654, 0x000645 }, + [0x00fc9b] = { 0x00064a, 0x000654, 0x000647 }, + [0x00fc9c] = { 0x000628, 0x00062c }, + [0x00fc9d] = { 0x000628, 0x00062d }, + [0x00fc9e] = { 0x000628, 0x00062e }, + [0x00fc9f] = { 0x000628, 0x000645 }, + [0x00fca0] = { 0x000628, 0x000647 }, + [0x00fca1] = { 0x00062a, 0x00062c }, + [0x00fca2] = { 0x00062a, 0x00062d }, + [0x00fca3] = { 0x00062a, 0x00062e }, + [0x00fca4] = { 0x00062a, 0x000645 }, + [0x00fca5] = { 0x00062a, 0x000647 }, + [0x00fca6] = { 0x00062b, 0x000645 }, + [0x00fca7] = { 0x00062c, 0x00062d }, + [0x00fca8] = { 0x00062c, 0x000645 }, + [0x00fca9] = { 0x00062d, 0x00062c }, + [0x00fcaa] = { 0x00062d, 0x000645 }, + [0x00fcab] = { 0x00062e, 0x00062c }, + [0x00fcac] = { 0x00062e, 0x000645 }, + [0x00fcad] = { 0x000633, 0x00062c }, + [0x00fcae] = { 0x000633, 0x00062d }, + [0x00fcaf] = { 0x000633, 0x00062e }, + [0x00fcb0] = { 0x000633, 0x000645 }, + [0x00fcb1] = { 0x000635, 0x00062d }, + [0x00fcb2] = { 0x000635, 0x00062e }, + [0x00fcb3] = { 0x000635, 0x000645 }, + [0x00fcb4] = { 0x000636, 0x00062c }, + [0x00fcb5] = { 0x000636, 0x00062d }, + [0x00fcb6] = { 0x000636, 0x00062e }, + [0x00fcb7] = { 0x000636, 0x000645 }, + [0x00fcb8] = { 0x000637, 0x00062d }, + [0x00fcb9] = { 0x000638, 0x000645 }, + [0x00fcba] = { 0x000639, 0x00062c }, + [0x00fcbb] = { 0x000639, 0x000645 }, + [0x00fcbc] = { 0x00063a, 0x00062c }, + [0x00fcbd] = { 0x00063a, 0x000645 }, + [0x00fcbe] = { 0x000641, 0x00062c }, + [0x00fcbf] = { 0x000641, 0x00062d }, + [0x00fcc0] = { 0x000641, 0x00062e }, + [0x00fcc1] = { 0x000641, 0x000645 }, + [0x00fcc2] = { 0x000642, 0x00062d }, + [0x00fcc3] = { 0x000642, 0x000645 }, + [0x00fcc4] = { 0x000643, 0x00062c }, + [0x00fcc5] = { 0x000643, 0x00062d }, + [0x00fcc6] = { 0x000643, 0x00062e }, + [0x00fcc7] = { 0x000643, 0x000644 }, + [0x00fcc8] = { 0x000643, 0x000645 }, + [0x00fcc9] = { 0x000644, 0x00062c }, + [0x00fcca] = { 0x000644, 0x00062d }, + [0x00fccb] = { 0x000644, 0x00062e }, + [0x00fccc] = { 0x000644, 0x000645 }, + [0x00fccd] = { 0x000644, 0x000647 }, + [0x00fcce] = { 0x000645, 0x00062c }, + [0x00fccf] = { 0x000645, 0x00062d }, + [0x00fcd0] = { 0x000645, 0x00062e }, + [0x00fcd1] = { 0x000645, 0x000645 }, + [0x00fcd2] = { 0x000646, 0x00062c }, + [0x00fcd3] = { 0x000646, 0x00062d }, + [0x00fcd4] = { 0x000646, 0x00062e }, + [0x00fcd5] = { 0x000646, 0x000645 }, + [0x00fcd6] = { 0x000646, 0x000647 }, + [0x00fcd7] = { 0x000647, 0x00062c }, + [0x00fcd8] = { 0x000647, 0x000645 }, + [0x00fcd9] = { 0x000647, 0x000670 }, + [0x00fcda] = { 0x00064a, 0x00062c }, + [0x00fcdb] = { 0x00064a, 0x00062d }, + [0x00fcdc] = { 0x00064a, 0x00062e }, + [0x00fcdd] = { 0x00064a, 0x000645 }, + [0x00fcde] = { 0x00064a, 0x000647 }, + [0x00fcdf] = { 0x00064a, 0x000654, 0x000645 }, + [0x00fce0] = { 0x00064a, 0x000654, 0x000647 }, + [0x00fce1] = { 0x000628, 0x000645 }, + [0x00fce2] = { 0x000628, 0x000647 }, + [0x00fce3] = { 0x00062a, 0x000645 }, + [0x00fce4] = { 0x00062a, 0x000647 }, + [0x00fce5] = { 0x00062b, 0x000645 }, + [0x00fce6] = { 0x00062b, 0x000647 }, + [0x00fce7] = { 0x000633, 0x000645 }, + [0x00fce8] = { 0x000633, 0x000647 }, + [0x00fce9] = { 0x000634, 0x000645 }, + [0x00fcea] = { 0x000634, 0x000647 }, + [0x00fceb] = { 0x000643, 0x000644 }, + [0x00fcec] = { 0x000643, 0x000645 }, + [0x00fced] = { 0x000644, 0x000645 }, + [0x00fcee] = { 0x000646, 0x000645 }, + [0x00fcef] = { 0x000646, 0x000647 }, + [0x00fcf0] = { 0x00064a, 0x000645 }, + [0x00fcf1] = { 0x00064a, 0x000647 }, + [0x00fcf2] = { 0x000640, 0x00064e, 0x000651 }, + [0x00fcf3] = { 0x000640, 0x00064f, 0x000651 }, + [0x00fcf4] = { 0x000640, 0x000650, 0x000651 }, + [0x00fcf5] = { 0x000637, 0x000649 }, + [0x00fcf6] = { 0x000637, 0x00064a }, + [0x00fcf7] = { 0x000639, 0x000649 }, + [0x00fcf8] = { 0x000639, 0x00064a }, + [0x00fcf9] = { 0x00063a, 0x000649 }, + [0x00fcfa] = { 0x00063a, 0x00064a }, + [0x00fcfb] = { 0x000633, 0x000649 }, + [0x00fcfc] = { 0x000633, 0x00064a }, + [0x00fcfd] = { 0x000634, 0x000649 }, + [0x00fcfe] = { 0x000634, 0x00064a }, + [0x00fcff] = { 0x00062d, 0x000649 }, + [0x00fd00] = { 0x00062d, 0x00064a }, + [0x00fd01] = { 0x00062c, 0x000649 }, + [0x00fd02] = { 0x00062c, 0x00064a }, + [0x00fd03] = { 0x00062e, 0x000649 }, + [0x00fd04] = { 0x00062e, 0x00064a }, + [0x00fd05] = { 0x000635, 0x000649 }, + [0x00fd06] = { 0x000635, 0x00064a }, + [0x00fd07] = { 0x000636, 0x000649 }, + [0x00fd08] = { 0x000636, 0x00064a }, + [0x00fd09] = { 0x000634, 0x00062c }, + [0x00fd0a] = { 0x000634, 0x00062d }, + [0x00fd0b] = { 0x000634, 0x00062e }, + [0x00fd0c] = { 0x000634, 0x000645 }, + [0x00fd0d] = { 0x000634, 0x000631 }, + [0x00fd0e] = { 0x000633, 0x000631 }, + [0x00fd0f] = { 0x000635, 0x000631 }, + [0x00fd10] = { 0x000636, 0x000631 }, + [0x00fd11] = { 0x000637, 0x000649 }, + [0x00fd12] = { 0x000637, 0x00064a }, + [0x00fd13] = { 0x000639, 0x000649 }, + [0x00fd14] = { 0x000639, 0x00064a }, + [0x00fd15] = { 0x00063a, 0x000649 }, + [0x00fd16] = { 0x00063a, 0x00064a }, + [0x00fd17] = { 0x000633, 0x000649 }, + [0x00fd18] = { 0x000633, 0x00064a }, + [0x00fd19] = { 0x000634, 0x000649 }, + [0x00fd1a] = { 0x000634, 0x00064a }, + [0x00fd1b] = { 0x00062d, 0x000649 }, + [0x00fd1c] = { 0x00062d, 0x00064a }, + [0x00fd1d] = { 0x00062c, 0x000649 }, + [0x00fd1e] = { 0x00062c, 0x00064a }, + [0x00fd1f] = { 0x00062e, 0x000649 }, + [0x00fd20] = { 0x00062e, 0x00064a }, + [0x00fd21] = { 0x000635, 0x000649 }, + [0x00fd22] = { 0x000635, 0x00064a }, + [0x00fd23] = { 0x000636, 0x000649 }, + [0x00fd24] = { 0x000636, 0x00064a }, + [0x00fd25] = { 0x000634, 0x00062c }, + [0x00fd26] = { 0x000634, 0x00062d }, + [0x00fd27] = { 0x000634, 0x00062e }, + [0x00fd28] = { 0x000634, 0x000645 }, + [0x00fd29] = { 0x000634, 0x000631 }, + [0x00fd2a] = { 0x000633, 0x000631 }, + [0x00fd2b] = { 0x000635, 0x000631 }, + [0x00fd2c] = { 0x000636, 0x000631 }, + [0x00fd2d] = { 0x000634, 0x00062c }, + [0x00fd2e] = { 0x000634, 0x00062d }, + [0x00fd2f] = { 0x000634, 0x00062e }, + [0x00fd30] = { 0x000634, 0x000645 }, + [0x00fd31] = { 0x000633, 0x000647 }, + [0x00fd32] = { 0x000634, 0x000647 }, + [0x00fd33] = { 0x000637, 0x000645 }, + [0x00fd34] = { 0x000633, 0x00062c }, + [0x00fd35] = { 0x000633, 0x00062d }, + [0x00fd36] = { 0x000633, 0x00062e }, + [0x00fd37] = { 0x000634, 0x00062c }, + [0x00fd38] = { 0x000634, 0x00062d }, + [0x00fd39] = { 0x000634, 0x00062e }, + [0x00fd3a] = { 0x000637, 0x000645 }, + [0x00fd3b] = { 0x000638, 0x000645 }, + [0x00fd3c] = { 0x000627, 0x00064b }, + [0x00fd3d] = { 0x000627, 0x00064b }, + [0x00fd50] = { 0x00062a, 0x00062c, 0x000645 }, + [0x00fd51] = { 0x00062a, 0x00062d, 0x00062c }, + [0x00fd52] = { 0x00062a, 0x00062d, 0x00062c }, + [0x00fd53] = { 0x00062a, 0x00062d, 0x000645 }, + [0x00fd54] = { 0x00062a, 0x00062e, 0x000645 }, + [0x00fd55] = { 0x00062a, 0x000645, 0x00062c }, + [0x00fd56] = { 0x00062a, 0x000645, 0x00062d }, + [0x00fd57] = { 0x00062a, 0x000645, 0x00062e }, + [0x00fd58] = { 0x00062c, 0x000645, 0x00062d }, + [0x00fd59] = { 0x00062c, 0x000645, 0x00062d }, + [0x00fd5a] = { 0x00062d, 0x000645, 0x00064a }, + [0x00fd5b] = { 0x00062d, 0x000645, 0x000649 }, + [0x00fd5c] = { 0x000633, 0x00062d, 0x00062c }, + [0x00fd5d] = { 0x000633, 0x00062c, 0x00062d }, + [0x00fd5e] = { 0x000633, 0x00062c, 0x000649 }, + [0x00fd5f] = { 0x000633, 0x000645, 0x00062d }, + [0x00fd60] = { 0x000633, 0x000645, 0x00062d }, + [0x00fd61] = { 0x000633, 0x000645, 0x00062c }, + [0x00fd62] = { 0x000633, 0x000645, 0x000645 }, + [0x00fd63] = { 0x000633, 0x000645, 0x000645 }, + [0x00fd64] = { 0x000635, 0x00062d, 0x00062d }, + [0x00fd65] = { 0x000635, 0x00062d, 0x00062d }, + [0x00fd66] = { 0x000635, 0x000645, 0x000645 }, + [0x00fd67] = { 0x000634, 0x00062d, 0x000645 }, + [0x00fd68] = { 0x000634, 0x00062d, 0x000645 }, + [0x00fd69] = { 0x000634, 0x00062c, 0x00064a }, + [0x00fd6a] = { 0x000634, 0x000645, 0x00062e }, + [0x00fd6b] = { 0x000634, 0x000645, 0x00062e }, + [0x00fd6c] = { 0x000634, 0x000645, 0x000645 }, + [0x00fd6d] = { 0x000634, 0x000645, 0x000645 }, + [0x00fd6e] = { 0x000636, 0x00062d, 0x000649 }, + [0x00fd6f] = { 0x000636, 0x00062e, 0x000645 }, + [0x00fd70] = { 0x000636, 0x00062e, 0x000645 }, + [0x00fd71] = { 0x000637, 0x000645, 0x00062d }, + [0x00fd72] = { 0x000637, 0x000645, 0x00062d }, + [0x00fd73] = { 0x000637, 0x000645, 0x000645 }, + [0x00fd74] = { 0x000637, 0x000645, 0x00064a }, + [0x00fd75] = { 0x000639, 0x00062c, 0x000645 }, + [0x00fd76] = { 0x000639, 0x000645, 0x000645 }, + [0x00fd77] = { 0x000639, 0x000645, 0x000645 }, + [0x00fd78] = { 0x000639, 0x000645, 0x000649 }, + [0x00fd79] = { 0x00063a, 0x000645, 0x000645 }, + [0x00fd7a] = { 0x00063a, 0x000645, 0x00064a }, + [0x00fd7b] = { 0x00063a, 0x000645, 0x000649 }, + [0x00fd7c] = { 0x000641, 0x00062e, 0x000645 }, + [0x00fd7d] = { 0x000641, 0x00062e, 0x000645 }, + [0x00fd7e] = { 0x000642, 0x000645, 0x00062d }, + [0x00fd7f] = { 0x000642, 0x000645, 0x000645 }, + [0x00fd80] = { 0x000644, 0x00062d, 0x000645 }, + [0x00fd81] = { 0x000644, 0x00062d, 0x00064a }, + [0x00fd82] = { 0x000644, 0x00062d, 0x000649 }, + [0x00fd83] = { 0x000644, 0x00062c, 0x00062c }, + [0x00fd84] = { 0x000644, 0x00062c, 0x00062c }, + [0x00fd85] = { 0x000644, 0x00062e, 0x000645 }, + [0x00fd86] = { 0x000644, 0x00062e, 0x000645 }, + [0x00fd87] = { 0x000644, 0x000645, 0x00062d }, + [0x00fd88] = { 0x000644, 0x000645, 0x00062d }, + [0x00fd89] = { 0x000645, 0x00062d, 0x00062c }, + [0x00fd8a] = { 0x000645, 0x00062d, 0x000645 }, + [0x00fd8b] = { 0x000645, 0x00062d, 0x00064a }, + [0x00fd8c] = { 0x000645, 0x00062c, 0x00062d }, + [0x00fd8d] = { 0x000645, 0x00062c, 0x000645 }, + [0x00fd8e] = { 0x000645, 0x00062e, 0x00062c }, + [0x00fd8f] = { 0x000645, 0x00062e, 0x000645 }, + [0x00fd92] = { 0x000645, 0x00062c, 0x00062e }, + [0x00fd93] = { 0x000647, 0x000645, 0x00062c }, + [0x00fd94] = { 0x000647, 0x000645, 0x000645 }, + [0x00fd95] = { 0x000646, 0x00062d, 0x000645 }, + [0x00fd96] = { 0x000646, 0x00062d, 0x000649 }, + [0x00fd97] = { 0x000646, 0x00062c, 0x000645 }, + [0x00fd98] = { 0x000646, 0x00062c, 0x000645 }, + [0x00fd99] = { 0x000646, 0x00062c, 0x000649 }, + [0x00fd9a] = { 0x000646, 0x000645, 0x00064a }, + [0x00fd9b] = { 0x000646, 0x000645, 0x000649 }, + [0x00fd9c] = { 0x00064a, 0x000645, 0x000645 }, + [0x00fd9d] = { 0x00064a, 0x000645, 0x000645 }, + [0x00fd9e] = { 0x000628, 0x00062e, 0x00064a }, + [0x00fd9f] = { 0x00062a, 0x00062c, 0x00064a }, + [0x00fda0] = { 0x00062a, 0x00062c, 0x000649 }, + [0x00fda1] = { 0x00062a, 0x00062e, 0x00064a }, + [0x00fda2] = { 0x00062a, 0x00062e, 0x000649 }, + [0x00fda3] = { 0x00062a, 0x000645, 0x00064a }, + [0x00fda4] = { 0x00062a, 0x000645, 0x000649 }, + [0x00fda5] = { 0x00062c, 0x000645, 0x00064a }, + [0x00fda6] = { 0x00062c, 0x00062d, 0x000649 }, + [0x00fda7] = { 0x00062c, 0x000645, 0x000649 }, + [0x00fda8] = { 0x000633, 0x00062e, 0x000649 }, + [0x00fda9] = { 0x000635, 0x00062d, 0x00064a }, + [0x00fdaa] = { 0x000634, 0x00062d, 0x00064a }, + [0x00fdab] = { 0x000636, 0x00062d, 0x00064a }, + [0x00fdac] = { 0x000644, 0x00062c, 0x00064a }, + [0x00fdad] = { 0x000644, 0x000645, 0x00064a }, + [0x00fdae] = { 0x00064a, 0x00062d, 0x00064a }, + [0x00fdaf] = { 0x00064a, 0x00062c, 0x00064a }, + [0x00fdb0] = { 0x00064a, 0x000645, 0x00064a }, + [0x00fdb1] = { 0x000645, 0x000645, 0x00064a }, + [0x00fdb2] = { 0x000642, 0x000645, 0x00064a }, + [0x00fdb3] = { 0x000646, 0x00062d, 0x00064a }, + [0x00fdb4] = { 0x000642, 0x000645, 0x00062d }, + [0x00fdb5] = { 0x000644, 0x00062d, 0x000645 }, + [0x00fdb6] = { 0x000639, 0x000645, 0x00064a }, + [0x00fdb7] = { 0x000643, 0x000645, 0x00064a }, + [0x00fdb8] = { 0x000646, 0x00062c, 0x00062d }, + [0x00fdb9] = { 0x000645, 0x00062e, 0x00064a }, + [0x00fdba] = { 0x000644, 0x00062c, 0x000645 }, + [0x00fdbb] = { 0x000643, 0x000645, 0x000645 }, + [0x00fdbc] = { 0x000644, 0x00062c, 0x000645 }, + [0x00fdbd] = { 0x000646, 0x00062c, 0x00062d }, + [0x00fdbe] = { 0x00062c, 0x00062d, 0x00064a }, + [0x00fdbf] = { 0x00062d, 0x00062c, 0x00064a }, + [0x00fdc0] = { 0x000645, 0x00062c, 0x00064a }, + [0x00fdc1] = { 0x000641, 0x000645, 0x00064a }, + [0x00fdc2] = { 0x000628, 0x00062d, 0x00064a }, + [0x00fdc3] = { 0x000643, 0x000645, 0x000645 }, + [0x00fdc4] = { 0x000639, 0x00062c, 0x000645 }, + [0x00fdc5] = { 0x000635, 0x000645, 0x000645 }, + [0x00fdc6] = { 0x000633, 0x00062e, 0x00064a }, + [0x00fdc7] = { 0x000646, 0x00062c, 0x00064a }, + [0x00fdf0] = { 0x000635, 0x000644, 0x0006d2 }, + [0x00fdf1] = { 0x000642, 0x000644, 0x0006d2 }, + [0x00fdf2] = { 0x000627, 0x000644, 0x000644, 0x000647 }, + [0x00fdf3] = { 0x000627, 0x000643, 0x000628, 0x000631 }, + [0x00fdf4] = { 0x000645, 0x00062d, 0x000645, 0x00062f }, + [0x00fdf5] = { 0x000635, 0x000644, 0x000639, 0x000645 }, + [0x00fdf6] = { 0x000631, 0x000633, 0x000648, 0x000644 }, + [0x00fdf7] = { 0x000639, 0x000644, 0x00064a, 0x000647 }, + [0x00fdf8] = { 0x000648, 0x000633, 0x000644, 0x000645 }, + [0x00fdf9] = { 0x000635, 0x000644, 0x000649 }, + [0x00fdfa] = { 0x000635, 0x000644, 0x000649, 0x000020, 0x000627, 0x000644, 0x000644, 0x000647, 0x000020, 0x000639, 0x000644, 0x00064a, 0x000647, 0x000020, 0x000648, 0x000633, 0x000644, 0x000645 }, + [0x00fdfb] = { 0x00062c, 0x000644, 0x000020, 0x00062c, 0x000644, 0x000627, 0x000644, 0x000647 }, + [0x00fdfc] = { 0x000631, 0x0006cc, 0x000627, 0x000644 }, + [0x00fe10] = { 0x00002c }, + [0x00fe11] = { 0x003001 }, + [0x00fe12] = { 0x003002 }, + [0x00fe13] = { 0x00003a }, + [0x00fe14] = { 0x00003b }, + [0x00fe15] = { 0x000021 }, + [0x00fe16] = { 0x00003f }, + [0x00fe17] = { 0x003016 }, + [0x00fe18] = { 0x003017 }, + [0x00fe19] = { 0x00002e, 0x00002e, 0x00002e }, + [0x00fe30] = { 0x00002e, 0x00002e }, + [0x00fe31] = { 0x002014 }, + [0x00fe32] = { 0x002013 }, + [0x00fe33] = { 0x00005f }, + [0x00fe34] = { 0x00005f }, + [0x00fe35] = { 0x000028 }, + [0x00fe36] = { 0x000029 }, + [0x00fe37] = { 0x00007b }, + [0x00fe38] = { 0x00007d }, + [0x00fe39] = { 0x003014 }, + [0x00fe3a] = { 0x003015 }, + [0x00fe3b] = { 0x003010 }, + [0x00fe3c] = { 0x003011 }, + [0x00fe3d] = { 0x00300a }, + [0x00fe3e] = { 0x00300b }, + [0x00fe3f] = { 0x003008 }, + [0x00fe40] = { 0x003009 }, + [0x00fe41] = { 0x00300c }, + [0x00fe42] = { 0x00300d }, + [0x00fe43] = { 0x00300e }, + [0x00fe44] = { 0x00300f }, + [0x00fe47] = { 0x00005b }, + [0x00fe48] = { 0x00005d }, + [0x00fe49] = { 0x000020, 0x000305 }, + [0x00fe4a] = { 0x000020, 0x000305 }, + [0x00fe4b] = { 0x000020, 0x000305 }, + [0x00fe4c] = { 0x000020, 0x000305 }, + [0x00fe4d] = { 0x00005f }, + [0x00fe4e] = { 0x00005f }, + [0x00fe4f] = { 0x00005f }, + [0x00fe50] = { 0x00002c }, + [0x00fe51] = { 0x003001 }, + [0x00fe52] = { 0x00002e }, + [0x00fe54] = { 0x00003b }, + [0x00fe55] = { 0x00003a }, + [0x00fe56] = { 0x00003f }, + [0x00fe57] = { 0x000021 }, + [0x00fe58] = { 0x002014 }, + [0x00fe59] = { 0x000028 }, + [0x00fe5a] = { 0x000029 }, + [0x00fe5b] = { 0x00007b }, + [0x00fe5c] = { 0x00007d }, + [0x00fe5d] = { 0x003014 }, + [0x00fe5e] = { 0x003015 }, + [0x00fe5f] = { 0x000023 }, + [0x00fe60] = { 0x000026 }, + [0x00fe61] = { 0x00002a }, + [0x00fe62] = { 0x00002b }, + [0x00fe63] = { 0x00002d }, + [0x00fe64] = { 0x00003c }, + [0x00fe65] = { 0x00003e }, + [0x00fe66] = { 0x00003d }, + [0x00fe68] = { 0x00005c }, + [0x00fe69] = { 0x000024 }, + [0x00fe6a] = { 0x000025 }, + [0x00fe6b] = { 0x000040 }, + [0x00fe70] = { 0x000020, 0x00064b }, + [0x00fe71] = { 0x000640, 0x00064b }, + [0x00fe72] = { 0x000020, 0x00064c }, + [0x00fe74] = { 0x000020, 0x00064d }, + [0x00fe76] = { 0x000020, 0x00064e }, + [0x00fe77] = { 0x000640, 0x00064e }, + [0x00fe78] = { 0x000020, 0x00064f }, + [0x00fe79] = { 0x000640, 0x00064f }, + [0x00fe7a] = { 0x000020, 0x000650 }, + [0x00fe7b] = { 0x000640, 0x000650 }, + [0x00fe7c] = { 0x000020, 0x000651 }, + [0x00fe7d] = { 0x000640, 0x000651 }, + [0x00fe7e] = { 0x000020, 0x000652 }, + [0x00fe7f] = { 0x000640, 0x000652 }, + [0x00fe80] = { 0x000621 }, + [0x00fe81] = { 0x000627, 0x000653 }, + [0x00fe82] = { 0x000627, 0x000653 }, + [0x00fe83] = { 0x000627, 0x000654 }, + [0x00fe84] = { 0x000627, 0x000654 }, + [0x00fe85] = { 0x000648, 0x000654 }, + [0x00fe86] = { 0x000648, 0x000654 }, + [0x00fe87] = { 0x000627, 0x000655 }, + [0x00fe88] = { 0x000627, 0x000655 }, + [0x00fe89] = { 0x00064a, 0x000654 }, + [0x00fe8a] = { 0x00064a, 0x000654 }, + [0x00fe8b] = { 0x00064a, 0x000654 }, + [0x00fe8c] = { 0x00064a, 0x000654 }, + [0x00fe8d] = { 0x000627 }, + [0x00fe8e] = { 0x000627 }, + [0x00fe8f] = { 0x000628 }, + [0x00fe90] = { 0x000628 }, + [0x00fe91] = { 0x000628 }, + [0x00fe92] = { 0x000628 }, + [0x00fe93] = { 0x000629 }, + [0x00fe94] = { 0x000629 }, + [0x00fe95] = { 0x00062a }, + [0x00fe96] = { 0x00062a }, + [0x00fe97] = { 0x00062a }, + [0x00fe98] = { 0x00062a }, + [0x00fe99] = { 0x00062b }, + [0x00fe9a] = { 0x00062b }, + [0x00fe9b] = { 0x00062b }, + [0x00fe9c] = { 0x00062b }, + [0x00fe9d] = { 0x00062c }, + [0x00fe9e] = { 0x00062c }, + [0x00fe9f] = { 0x00062c }, + [0x00fea0] = { 0x00062c }, + [0x00fea1] = { 0x00062d }, + [0x00fea2] = { 0x00062d }, + [0x00fea3] = { 0x00062d }, + [0x00fea4] = { 0x00062d }, + [0x00fea5] = { 0x00062e }, + [0x00fea6] = { 0x00062e }, + [0x00fea7] = { 0x00062e }, + [0x00fea8] = { 0x00062e }, + [0x00fea9] = { 0x00062f }, + [0x00feaa] = { 0x00062f }, + [0x00feab] = { 0x000630 }, + [0x00feac] = { 0x000630 }, + [0x00fead] = { 0x000631 }, + [0x00feae] = { 0x000631 }, + [0x00feaf] = { 0x000632 }, + [0x00feb0] = { 0x000632 }, + [0x00feb1] = { 0x000633 }, + [0x00feb2] = { 0x000633 }, + [0x00feb3] = { 0x000633 }, + [0x00feb4] = { 0x000633 }, + [0x00feb5] = { 0x000634 }, + [0x00feb6] = { 0x000634 }, + [0x00feb7] = { 0x000634 }, + [0x00feb8] = { 0x000634 }, + [0x00feb9] = { 0x000635 }, + [0x00feba] = { 0x000635 }, + [0x00febb] = { 0x000635 }, + [0x00febc] = { 0x000635 }, + [0x00febd] = { 0x000636 }, + [0x00febe] = { 0x000636 }, + [0x00febf] = { 0x000636 }, + [0x00fec0] = { 0x000636 }, + [0x00fec1] = { 0x000637 }, + [0x00fec2] = { 0x000637 }, + [0x00fec3] = { 0x000637 }, + [0x00fec4] = { 0x000637 }, + [0x00fec5] = { 0x000638 }, + [0x00fec6] = { 0x000638 }, + [0x00fec7] = { 0x000638 }, + [0x00fec8] = { 0x000638 }, + [0x00fec9] = { 0x000639 }, + [0x00feca] = { 0x000639 }, + [0x00fecb] = { 0x000639 }, + [0x00fecc] = { 0x000639 }, + [0x00fecd] = { 0x00063a }, + [0x00fece] = { 0x00063a }, + [0x00fecf] = { 0x00063a }, + [0x00fed0] = { 0x00063a }, + [0x00fed1] = { 0x000641 }, + [0x00fed2] = { 0x000641 }, + [0x00fed3] = { 0x000641 }, + [0x00fed4] = { 0x000641 }, + [0x00fed5] = { 0x000642 }, + [0x00fed6] = { 0x000642 }, + [0x00fed7] = { 0x000642 }, + [0x00fed8] = { 0x000642 }, + [0x00fed9] = { 0x000643 }, + [0x00feda] = { 0x000643 }, + [0x00fedb] = { 0x000643 }, + [0x00fedc] = { 0x000643 }, + [0x00fedd] = { 0x000644 }, + [0x00fede] = { 0x000644 }, + [0x00fedf] = { 0x000644 }, + [0x00fee0] = { 0x000644 }, + [0x00fee1] = { 0x000645 }, + [0x00fee2] = { 0x000645 }, + [0x00fee3] = { 0x000645 }, + [0x00fee4] = { 0x000645 }, + [0x00fee5] = { 0x000646 }, + [0x00fee6] = { 0x000646 }, + [0x00fee7] = { 0x000646 }, + [0x00fee8] = { 0x000646 }, + [0x00fee9] = { 0x000647 }, + [0x00feea] = { 0x000647 }, + [0x00feeb] = { 0x000647 }, + [0x00feec] = { 0x000647 }, + [0x00feed] = { 0x000648 }, + [0x00feee] = { 0x000648 }, + [0x00feef] = { 0x000649 }, + [0x00fef0] = { 0x000649 }, + [0x00fef1] = { 0x00064a }, + [0x00fef2] = { 0x00064a }, + [0x00fef3] = { 0x00064a }, + [0x00fef4] = { 0x00064a }, + [0x00fef5] = { 0x000644, 0x000627, 0x000653 }, + [0x00fef6] = { 0x000644, 0x000627, 0x000653 }, + [0x00fef7] = { 0x000644, 0x000627, 0x000654 }, + [0x00fef8] = { 0x000644, 0x000627, 0x000654 }, + [0x00fef9] = { 0x000644, 0x000627, 0x000655 }, + [0x00fefa] = { 0x000644, 0x000627, 0x000655 }, + [0x00fefb] = { 0x000644, 0x000627 }, + [0x00fefc] = { 0x000644, 0x000627 }, + [0x00ff01] = { 0x000021 }, + [0x00ff02] = { 0x000022 }, + [0x00ff03] = { 0x000023 }, + [0x00ff04] = { 0x000024 }, + [0x00ff05] = { 0x000025 }, + [0x00ff06] = { 0x000026 }, + [0x00ff07] = { 0x000027 }, + [0x00ff08] = { 0x000028 }, + [0x00ff09] = { 0x000029 }, + [0x00ff0a] = { 0x00002a }, + [0x00ff0b] = { 0x00002b }, + [0x00ff0c] = { 0x00002c }, + [0x00ff0d] = { 0x00002d }, + [0x00ff0e] = { 0x00002e }, + [0x00ff0f] = { 0x00002f }, + [0x00ff10] = { 0x000030 }, + [0x00ff11] = { 0x000031 }, + [0x00ff12] = { 0x000032 }, + [0x00ff13] = { 0x000033 }, + [0x00ff14] = { 0x000034 }, + [0x00ff15] = { 0x000035 }, + [0x00ff16] = { 0x000036 }, + [0x00ff17] = { 0x000037 }, + [0x00ff18] = { 0x000038 }, + [0x00ff19] = { 0x000039 }, + [0x00ff1a] = { 0x00003a }, + [0x00ff1b] = { 0x00003b }, + [0x00ff1c] = { 0x00003c }, + [0x00ff1d] = { 0x00003d }, + [0x00ff1e] = { 0x00003e }, + [0x00ff1f] = { 0x00003f }, + [0x00ff20] = { 0x000040 }, + [0x00ff21] = { 0x000041 }, + [0x00ff22] = { 0x000042 }, + [0x00ff23] = { 0x000043 }, + [0x00ff24] = { 0x000044 }, + [0x00ff25] = { 0x000045 }, + [0x00ff26] = { 0x000046 }, + [0x00ff27] = { 0x000047 }, + [0x00ff28] = { 0x000048 }, + [0x00ff29] = { 0x000049 }, + [0x00ff2a] = { 0x00004a }, + [0x00ff2b] = { 0x00004b }, + [0x00ff2c] = { 0x00004c }, + [0x00ff2d] = { 0x00004d }, + [0x00ff2e] = { 0x00004e }, + [0x00ff2f] = { 0x00004f }, + [0x00ff30] = { 0x000050 }, + [0x00ff31] = { 0x000051 }, + [0x00ff32] = { 0x000052 }, + [0x00ff33] = { 0x000053 }, + [0x00ff34] = { 0x000054 }, + [0x00ff35] = { 0x000055 }, + [0x00ff36] = { 0x000056 }, + [0x00ff37] = { 0x000057 }, + [0x00ff38] = { 0x000058 }, + [0x00ff39] = { 0x000059 }, + [0x00ff3a] = { 0x00005a }, + [0x00ff3b] = { 0x00005b }, + [0x00ff3c] = { 0x00005c }, + [0x00ff3d] = { 0x00005d }, + [0x00ff3e] = { 0x00005e }, + [0x00ff3f] = { 0x00005f }, + [0x00ff40] = { 0x000060 }, + [0x00ff41] = { 0x000061 }, + [0x00ff42] = { 0x000062 }, + [0x00ff43] = { 0x000063 }, + [0x00ff44] = { 0x000064 }, + [0x00ff45] = { 0x000065 }, + [0x00ff46] = { 0x000066 }, + [0x00ff47] = { 0x000067 }, + [0x00ff48] = { 0x000068 }, + [0x00ff49] = { 0x000069 }, + [0x00ff4a] = { 0x00006a }, + [0x00ff4b] = { 0x00006b }, + [0x00ff4c] = { 0x00006c }, + [0x00ff4d] = { 0x00006d }, + [0x00ff4e] = { 0x00006e }, + [0x00ff4f] = { 0x00006f }, + [0x00ff50] = { 0x000070 }, + [0x00ff51] = { 0x000071 }, + [0x00ff52] = { 0x000072 }, + [0x00ff53] = { 0x000073 }, + [0x00ff54] = { 0x000074 }, + [0x00ff55] = { 0x000075 }, + [0x00ff56] = { 0x000076 }, + [0x00ff57] = { 0x000077 }, + [0x00ff58] = { 0x000078 }, + [0x00ff59] = { 0x000079 }, + [0x00ff5a] = { 0x00007a }, + [0x00ff5b] = { 0x00007b }, + [0x00ff5c] = { 0x00007c }, + [0x00ff5d] = { 0x00007d }, + [0x00ff5e] = { 0x00007e }, + [0x00ff5f] = { 0x002985 }, + [0x00ff60] = { 0x002986 }, + [0x00ff61] = { 0x003002 }, + [0x00ff62] = { 0x00300c }, + [0x00ff63] = { 0x00300d }, + [0x00ff64] = { 0x003001 }, + [0x00ff65] = { 0x0030fb }, + [0x00ff66] = { 0x0030f2 }, + [0x00ff67] = { 0x0030a1 }, + [0x00ff68] = { 0x0030a3 }, + [0x00ff69] = { 0x0030a5 }, + [0x00ff6a] = { 0x0030a7 }, + [0x00ff6b] = { 0x0030a9 }, + [0x00ff6c] = { 0x0030e3 }, + [0x00ff6d] = { 0x0030e5 }, + [0x00ff6e] = { 0x0030e7 }, + [0x00ff6f] = { 0x0030c3 }, + [0x00ff70] = { 0x0030fc }, + [0x00ff71] = { 0x0030a2 }, + [0x00ff72] = { 0x0030a4 }, + [0x00ff73] = { 0x0030a6 }, + [0x00ff74] = { 0x0030a8 }, + [0x00ff75] = { 0x0030aa }, + [0x00ff76] = { 0x0030ab }, + [0x00ff77] = { 0x0030ad }, + [0x00ff78] = { 0x0030af }, + [0x00ff79] = { 0x0030b1 }, + [0x00ff7a] = { 0x0030b3 }, + [0x00ff7b] = { 0x0030b5 }, + [0x00ff7c] = { 0x0030b7 }, + [0x00ff7d] = { 0x0030b9 }, + [0x00ff7e] = { 0x0030bb }, + [0x00ff7f] = { 0x0030bd }, + [0x00ff80] = { 0x0030bf }, + [0x00ff81] = { 0x0030c1 }, + [0x00ff82] = { 0x0030c4 }, + [0x00ff83] = { 0x0030c6 }, + [0x00ff84] = { 0x0030c8 }, + [0x00ff85] = { 0x0030ca }, + [0x00ff86] = { 0x0030cb }, + [0x00ff87] = { 0x0030cc }, + [0x00ff88] = { 0x0030cd }, + [0x00ff89] = { 0x0030ce }, + [0x00ff8a] = { 0x0030cf }, + [0x00ff8b] = { 0x0030d2 }, + [0x00ff8c] = { 0x0030d5 }, + [0x00ff8d] = { 0x0030d8 }, + [0x00ff8e] = { 0x0030db }, + [0x00ff8f] = { 0x0030de }, + [0x00ff90] = { 0x0030df }, + [0x00ff91] = { 0x0030e0 }, + [0x00ff92] = { 0x0030e1 }, + [0x00ff93] = { 0x0030e2 }, + [0x00ff94] = { 0x0030e4 }, + [0x00ff95] = { 0x0030e6 }, + [0x00ff96] = { 0x0030e8 }, + [0x00ff97] = { 0x0030e9 }, + [0x00ff98] = { 0x0030ea }, + [0x00ff99] = { 0x0030eb }, + [0x00ff9a] = { 0x0030ec }, + [0x00ff9b] = { 0x0030ed }, + [0x00ff9c] = { 0x0030ef }, + [0x00ff9d] = { 0x0030f3 }, + [0x00ff9e] = { 0x003099 }, + [0x00ff9f] = { 0x00309a }, + [0x00ffa0] = { 0x001160 }, + [0x00ffa1] = { 0x001100 }, + [0x00ffa2] = { 0x001101 }, + [0x00ffa3] = { 0x0011aa }, + [0x00ffa4] = { 0x001102 }, + [0x00ffa5] = { 0x0011ac }, + [0x00ffa6] = { 0x0011ad }, + [0x00ffa7] = { 0x001103 }, + [0x00ffa8] = { 0x001104 }, + [0x00ffa9] = { 0x001105 }, + [0x00ffaa] = { 0x0011b0 }, + [0x00ffab] = { 0x0011b1 }, + [0x00ffac] = { 0x0011b2 }, + [0x00ffad] = { 0x0011b3 }, + [0x00ffae] = { 0x0011b4 }, + [0x00ffaf] = { 0x0011b5 }, + [0x00ffb0] = { 0x00111a }, + [0x00ffb1] = { 0x001106 }, + [0x00ffb2] = { 0x001107 }, + [0x00ffb3] = { 0x001108 }, + [0x00ffb4] = { 0x001121 }, + [0x00ffb5] = { 0x001109 }, + [0x00ffb6] = { 0x00110a }, + [0x00ffb7] = { 0x00110b }, + [0x00ffb8] = { 0x00110c }, + [0x00ffb9] = { 0x00110d }, + [0x00ffba] = { 0x00110e }, + [0x00ffbb] = { 0x00110f }, + [0x00ffbc] = { 0x001110 }, + [0x00ffbd] = { 0x001111 }, + [0x00ffbe] = { 0x001112 }, + [0x00ffc2] = { 0x001161 }, + [0x00ffc3] = { 0x001162 }, + [0x00ffc4] = { 0x001163 }, + [0x00ffc5] = { 0x001164 }, + [0x00ffc6] = { 0x001165 }, + [0x00ffc7] = { 0x001166 }, + [0x00ffca] = { 0x001167 }, + [0x00ffcb] = { 0x001168 }, + [0x00ffcc] = { 0x001169 }, + [0x00ffcd] = { 0x00116a }, + [0x00ffce] = { 0x00116b }, + [0x00ffcf] = { 0x00116c }, + [0x00ffd2] = { 0x00116d }, + [0x00ffd3] = { 0x00116e }, + [0x00ffd4] = { 0x00116f }, + [0x00ffd5] = { 0x001170 }, + [0x00ffd6] = { 0x001171 }, + [0x00ffd7] = { 0x001172 }, + [0x00ffda] = { 0x001173 }, + [0x00ffdb] = { 0x001174 }, + [0x00ffdc] = { 0x001175 }, + [0x00ffe0] = { 0x0000a2 }, + [0x00ffe1] = { 0x0000a3 }, + [0x00ffe2] = { 0x0000ac }, + [0x00ffe3] = { 0x000020, 0x000304 }, + [0x00ffe4] = { 0x0000a6 }, + [0x00ffe5] = { 0x0000a5 }, + [0x00ffe6] = { 0x0020a9 }, + [0x00ffe8] = { 0x002502 }, + [0x00ffe9] = { 0x002190 }, + [0x00ffea] = { 0x002191 }, + [0x00ffeb] = { 0x002192 }, + [0x00ffec] = { 0x002193 }, + [0x00ffed] = { 0x0025a0 }, + [0x00ffee] = { 0x0025cb }, + [0x01d400] = { 0x000041 }, + [0x01d401] = { 0x000042 }, + [0x01d402] = { 0x000043 }, + [0x01d403] = { 0x000044 }, + [0x01d404] = { 0x000045 }, + [0x01d405] = { 0x000046 }, + [0x01d406] = { 0x000047 }, + [0x01d407] = { 0x000048 }, + [0x01d408] = { 0x000049 }, + [0x01d409] = { 0x00004a }, + [0x01d40a] = { 0x00004b }, + [0x01d40b] = { 0x00004c }, + [0x01d40c] = { 0x00004d }, + [0x01d40d] = { 0x00004e }, + [0x01d40e] = { 0x00004f }, + [0x01d40f] = { 0x000050 }, + [0x01d410] = { 0x000051 }, + [0x01d411] = { 0x000052 }, + [0x01d412] = { 0x000053 }, + [0x01d413] = { 0x000054 }, + [0x01d414] = { 0x000055 }, + [0x01d415] = { 0x000056 }, + [0x01d416] = { 0x000057 }, + [0x01d417] = { 0x000058 }, + [0x01d418] = { 0x000059 }, + [0x01d419] = { 0x00005a }, + [0x01d41a] = { 0x000061 }, + [0x01d41b] = { 0x000062 }, + [0x01d41c] = { 0x000063 }, + [0x01d41d] = { 0x000064 }, + [0x01d41e] = { 0x000065 }, + [0x01d41f] = { 0x000066 }, + [0x01d420] = { 0x000067 }, + [0x01d421] = { 0x000068 }, + [0x01d422] = { 0x000069 }, + [0x01d423] = { 0x00006a }, + [0x01d424] = { 0x00006b }, + [0x01d425] = { 0x00006c }, + [0x01d426] = { 0x00006d }, + [0x01d427] = { 0x00006e }, + [0x01d428] = { 0x00006f }, + [0x01d429] = { 0x000070 }, + [0x01d42a] = { 0x000071 }, + [0x01d42b] = { 0x000072 }, + [0x01d42c] = { 0x000073 }, + [0x01d42d] = { 0x000074 }, + [0x01d42e] = { 0x000075 }, + [0x01d42f] = { 0x000076 }, + [0x01d430] = { 0x000077 }, + [0x01d431] = { 0x000078 }, + [0x01d432] = { 0x000079 }, + [0x01d433] = { 0x00007a }, + [0x01d434] = { 0x000041 }, + [0x01d435] = { 0x000042 }, + [0x01d436] = { 0x000043 }, + [0x01d437] = { 0x000044 }, + [0x01d438] = { 0x000045 }, + [0x01d439] = { 0x000046 }, + [0x01d43a] = { 0x000047 }, + [0x01d43b] = { 0x000048 }, + [0x01d43c] = { 0x000049 }, + [0x01d43d] = { 0x00004a }, + [0x01d43e] = { 0x00004b }, + [0x01d43f] = { 0x00004c }, + [0x01d440] = { 0x00004d }, + [0x01d441] = { 0x00004e }, + [0x01d442] = { 0x00004f }, + [0x01d443] = { 0x000050 }, + [0x01d444] = { 0x000051 }, + [0x01d445] = { 0x000052 }, + [0x01d446] = { 0x000053 }, + [0x01d447] = { 0x000054 }, + [0x01d448] = { 0x000055 }, + [0x01d449] = { 0x000056 }, + [0x01d44a] = { 0x000057 }, + [0x01d44b] = { 0x000058 }, + [0x01d44c] = { 0x000059 }, + [0x01d44d] = { 0x00005a }, + [0x01d44e] = { 0x000061 }, + [0x01d44f] = { 0x000062 }, + [0x01d450] = { 0x000063 }, + [0x01d451] = { 0x000064 }, + [0x01d452] = { 0x000065 }, + [0x01d453] = { 0x000066 }, + [0x01d454] = { 0x000067 }, + [0x01d456] = { 0x000069 }, + [0x01d457] = { 0x00006a }, + [0x01d458] = { 0x00006b }, + [0x01d459] = { 0x00006c }, + [0x01d45a] = { 0x00006d }, + [0x01d45b] = { 0x00006e }, + [0x01d45c] = { 0x00006f }, + [0x01d45d] = { 0x000070 }, + [0x01d45e] = { 0x000071 }, + [0x01d45f] = { 0x000072 }, + [0x01d460] = { 0x000073 }, + [0x01d461] = { 0x000074 }, + [0x01d462] = { 0x000075 }, + [0x01d463] = { 0x000076 }, + [0x01d464] = { 0x000077 }, + [0x01d465] = { 0x000078 }, + [0x01d466] = { 0x000079 }, + [0x01d467] = { 0x00007a }, + [0x01d468] = { 0x000041 }, + [0x01d469] = { 0x000042 }, + [0x01d46a] = { 0x000043 }, + [0x01d46b] = { 0x000044 }, + [0x01d46c] = { 0x000045 }, + [0x01d46d] = { 0x000046 }, + [0x01d46e] = { 0x000047 }, + [0x01d46f] = { 0x000048 }, + [0x01d470] = { 0x000049 }, + [0x01d471] = { 0x00004a }, + [0x01d472] = { 0x00004b }, + [0x01d473] = { 0x00004c }, + [0x01d474] = { 0x00004d }, + [0x01d475] = { 0x00004e }, + [0x01d476] = { 0x00004f }, + [0x01d477] = { 0x000050 }, + [0x01d478] = { 0x000051 }, + [0x01d479] = { 0x000052 }, + [0x01d47a] = { 0x000053 }, + [0x01d47b] = { 0x000054 }, + [0x01d47c] = { 0x000055 }, + [0x01d47d] = { 0x000056 }, + [0x01d47e] = { 0x000057 }, + [0x01d47f] = { 0x000058 }, + [0x01d480] = { 0x000059 }, + [0x01d481] = { 0x00005a }, + [0x01d482] = { 0x000061 }, + [0x01d483] = { 0x000062 }, + [0x01d484] = { 0x000063 }, + [0x01d485] = { 0x000064 }, + [0x01d486] = { 0x000065 }, + [0x01d487] = { 0x000066 }, + [0x01d488] = { 0x000067 }, + [0x01d489] = { 0x000068 }, + [0x01d48a] = { 0x000069 }, + [0x01d48b] = { 0x00006a }, + [0x01d48c] = { 0x00006b }, + [0x01d48d] = { 0x00006c }, + [0x01d48e] = { 0x00006d }, + [0x01d48f] = { 0x00006e }, + [0x01d490] = { 0x00006f }, + [0x01d491] = { 0x000070 }, + [0x01d492] = { 0x000071 }, + [0x01d493] = { 0x000072 }, + [0x01d494] = { 0x000073 }, + [0x01d495] = { 0x000074 }, + [0x01d496] = { 0x000075 }, + [0x01d497] = { 0x000076 }, + [0x01d498] = { 0x000077 }, + [0x01d499] = { 0x000078 }, + [0x01d49a] = { 0x000079 }, + [0x01d49b] = { 0x00007a }, + [0x01d49c] = { 0x000041 }, + [0x01d49e] = { 0x000043 }, + [0x01d49f] = { 0x000044 }, + [0x01d4a2] = { 0x000047 }, + [0x01d4a5] = { 0x00004a }, + [0x01d4a6] = { 0x00004b }, + [0x01d4a9] = { 0x00004e }, + [0x01d4aa] = { 0x00004f }, + [0x01d4ab] = { 0x000050 }, + [0x01d4ac] = { 0x000051 }, + [0x01d4ae] = { 0x000053 }, + [0x01d4af] = { 0x000054 }, + [0x01d4b0] = { 0x000055 }, + [0x01d4b1] = { 0x000056 }, + [0x01d4b2] = { 0x000057 }, + [0x01d4b3] = { 0x000058 }, + [0x01d4b4] = { 0x000059 }, + [0x01d4b5] = { 0x00005a }, + [0x01d4b6] = { 0x000061 }, + [0x01d4b7] = { 0x000062 }, + [0x01d4b8] = { 0x000063 }, + [0x01d4b9] = { 0x000064 }, + [0x01d4bb] = { 0x000066 }, + [0x01d4bd] = { 0x000068 }, + [0x01d4be] = { 0x000069 }, + [0x01d4bf] = { 0x00006a }, + [0x01d4c0] = { 0x00006b }, + [0x01d4c1] = { 0x00006c }, + [0x01d4c2] = { 0x00006d }, + [0x01d4c3] = { 0x00006e }, + [0x01d4c5] = { 0x000070 }, + [0x01d4c6] = { 0x000071 }, + [0x01d4c7] = { 0x000072 }, + [0x01d4c8] = { 0x000073 }, + [0x01d4c9] = { 0x000074 }, + [0x01d4ca] = { 0x000075 }, + [0x01d4cb] = { 0x000076 }, + [0x01d4cc] = { 0x000077 }, + [0x01d4cd] = { 0x000078 }, + [0x01d4ce] = { 0x000079 }, + [0x01d4cf] = { 0x00007a }, + [0x01d4d0] = { 0x000041 }, + [0x01d4d1] = { 0x000042 }, + [0x01d4d2] = { 0x000043 }, + [0x01d4d3] = { 0x000044 }, + [0x01d4d4] = { 0x000045 }, + [0x01d4d5] = { 0x000046 }, + [0x01d4d6] = { 0x000047 }, + [0x01d4d7] = { 0x000048 }, + [0x01d4d8] = { 0x000049 }, + [0x01d4d9] = { 0x00004a }, + [0x01d4da] = { 0x00004b }, + [0x01d4db] = { 0x00004c }, + [0x01d4dc] = { 0x00004d }, + [0x01d4dd] = { 0x00004e }, + [0x01d4de] = { 0x00004f }, + [0x01d4df] = { 0x000050 }, + [0x01d4e0] = { 0x000051 }, + [0x01d4e1] = { 0x000052 }, + [0x01d4e2] = { 0x000053 }, + [0x01d4e3] = { 0x000054 }, + [0x01d4e4] = { 0x000055 }, + [0x01d4e5] = { 0x000056 }, + [0x01d4e6] = { 0x000057 }, + [0x01d4e7] = { 0x000058 }, + [0x01d4e8] = { 0x000059 }, + [0x01d4e9] = { 0x00005a }, + [0x01d4ea] = { 0x000061 }, + [0x01d4eb] = { 0x000062 }, + [0x01d4ec] = { 0x000063 }, + [0x01d4ed] = { 0x000064 }, + [0x01d4ee] = { 0x000065 }, + [0x01d4ef] = { 0x000066 }, + [0x01d4f0] = { 0x000067 }, + [0x01d4f1] = { 0x000068 }, + [0x01d4f2] = { 0x000069 }, + [0x01d4f3] = { 0x00006a }, + [0x01d4f4] = { 0x00006b }, + [0x01d4f5] = { 0x00006c }, + [0x01d4f6] = { 0x00006d }, + [0x01d4f7] = { 0x00006e }, + [0x01d4f8] = { 0x00006f }, + [0x01d4f9] = { 0x000070 }, + [0x01d4fa] = { 0x000071 }, + [0x01d4fb] = { 0x000072 }, + [0x01d4fc] = { 0x000073 }, + [0x01d4fd] = { 0x000074 }, + [0x01d4fe] = { 0x000075 }, + [0x01d4ff] = { 0x000076 }, + [0x01d500] = { 0x000077 }, + [0x01d501] = { 0x000078 }, + [0x01d502] = { 0x000079 }, + [0x01d503] = { 0x00007a }, + [0x01d504] = { 0x000041 }, + [0x01d505] = { 0x000042 }, + [0x01d507] = { 0x000044 }, + [0x01d508] = { 0x000045 }, + [0x01d509] = { 0x000046 }, + [0x01d50a] = { 0x000047 }, + [0x01d50d] = { 0x00004a }, + [0x01d50e] = { 0x00004b }, + [0x01d50f] = { 0x00004c }, + [0x01d510] = { 0x00004d }, + [0x01d511] = { 0x00004e }, + [0x01d512] = { 0x00004f }, + [0x01d513] = { 0x000050 }, + [0x01d514] = { 0x000051 }, + [0x01d516] = { 0x000053 }, + [0x01d517] = { 0x000054 }, + [0x01d518] = { 0x000055 }, + [0x01d519] = { 0x000056 }, + [0x01d51a] = { 0x000057 }, + [0x01d51b] = { 0x000058 }, + [0x01d51c] = { 0x000059 }, + [0x01d51e] = { 0x000061 }, + [0x01d51f] = { 0x000062 }, + [0x01d520] = { 0x000063 }, + [0x01d521] = { 0x000064 }, + [0x01d522] = { 0x000065 }, + [0x01d523] = { 0x000066 }, + [0x01d524] = { 0x000067 }, + [0x01d525] = { 0x000068 }, + [0x01d526] = { 0x000069 }, + [0x01d527] = { 0x00006a }, + [0x01d528] = { 0x00006b }, + [0x01d529] = { 0x00006c }, + [0x01d52a] = { 0x00006d }, + [0x01d52b] = { 0x00006e }, + [0x01d52c] = { 0x00006f }, + [0x01d52d] = { 0x000070 }, + [0x01d52e] = { 0x000071 }, + [0x01d52f] = { 0x000072 }, + [0x01d530] = { 0x000073 }, + [0x01d531] = { 0x000074 }, + [0x01d532] = { 0x000075 }, + [0x01d533] = { 0x000076 }, + [0x01d534] = { 0x000077 }, + [0x01d535] = { 0x000078 }, + [0x01d536] = { 0x000079 }, + [0x01d537] = { 0x00007a }, + [0x01d538] = { 0x000041 }, + [0x01d539] = { 0x000042 }, + [0x01d53b] = { 0x000044 }, + [0x01d53c] = { 0x000045 }, + [0x01d53d] = { 0x000046 }, + [0x01d53e] = { 0x000047 }, + [0x01d540] = { 0x000049 }, + [0x01d541] = { 0x00004a }, + [0x01d542] = { 0x00004b }, + [0x01d543] = { 0x00004c }, + [0x01d544] = { 0x00004d }, + [0x01d546] = { 0x00004f }, + [0x01d54a] = { 0x000053 }, + [0x01d54b] = { 0x000054 }, + [0x01d54c] = { 0x000055 }, + [0x01d54d] = { 0x000056 }, + [0x01d54e] = { 0x000057 }, + [0x01d54f] = { 0x000058 }, + [0x01d550] = { 0x000059 }, + [0x01d552] = { 0x000061 }, + [0x01d553] = { 0x000062 }, + [0x01d554] = { 0x000063 }, + [0x01d555] = { 0x000064 }, + [0x01d556] = { 0x000065 }, + [0x01d557] = { 0x000066 }, + [0x01d558] = { 0x000067 }, + [0x01d559] = { 0x000068 }, + [0x01d55a] = { 0x000069 }, + [0x01d55b] = { 0x00006a }, + [0x01d55c] = { 0x00006b }, + [0x01d55d] = { 0x00006c }, + [0x01d55e] = { 0x00006d }, + [0x01d55f] = { 0x00006e }, + [0x01d560] = { 0x00006f }, + [0x01d561] = { 0x000070 }, + [0x01d562] = { 0x000071 }, + [0x01d563] = { 0x000072 }, + [0x01d564] = { 0x000073 }, + [0x01d565] = { 0x000074 }, + [0x01d566] = { 0x000075 }, + [0x01d567] = { 0x000076 }, + [0x01d568] = { 0x000077 }, + [0x01d569] = { 0x000078 }, + [0x01d56a] = { 0x000079 }, + [0x01d56b] = { 0x00007a }, + [0x01d56c] = { 0x000041 }, + [0x01d56d] = { 0x000042 }, + [0x01d56e] = { 0x000043 }, + [0x01d56f] = { 0x000044 }, + [0x01d570] = { 0x000045 }, + [0x01d571] = { 0x000046 }, + [0x01d572] = { 0x000047 }, + [0x01d573] = { 0x000048 }, + [0x01d574] = { 0x000049 }, + [0x01d575] = { 0x00004a }, + [0x01d576] = { 0x00004b }, + [0x01d577] = { 0x00004c }, + [0x01d578] = { 0x00004d }, + [0x01d579] = { 0x00004e }, + [0x01d57a] = { 0x00004f }, + [0x01d57b] = { 0x000050 }, + [0x01d57c] = { 0x000051 }, + [0x01d57d] = { 0x000052 }, + [0x01d57e] = { 0x000053 }, + [0x01d57f] = { 0x000054 }, + [0x01d580] = { 0x000055 }, + [0x01d581] = { 0x000056 }, + [0x01d582] = { 0x000057 }, + [0x01d583] = { 0x000058 }, + [0x01d584] = { 0x000059 }, + [0x01d585] = { 0x00005a }, + [0x01d586] = { 0x000061 }, + [0x01d587] = { 0x000062 }, + [0x01d588] = { 0x000063 }, + [0x01d589] = { 0x000064 }, + [0x01d58a] = { 0x000065 }, + [0x01d58b] = { 0x000066 }, + [0x01d58c] = { 0x000067 }, + [0x01d58d] = { 0x000068 }, + [0x01d58e] = { 0x000069 }, + [0x01d58f] = { 0x00006a }, + [0x01d590] = { 0x00006b }, + [0x01d591] = { 0x00006c }, + [0x01d592] = { 0x00006d }, + [0x01d593] = { 0x00006e }, + [0x01d594] = { 0x00006f }, + [0x01d595] = { 0x000070 }, + [0x01d596] = { 0x000071 }, + [0x01d597] = { 0x000072 }, + [0x01d598] = { 0x000073 }, + [0x01d599] = { 0x000074 }, + [0x01d59a] = { 0x000075 }, + [0x01d59b] = { 0x000076 }, + [0x01d59c] = { 0x000077 }, + [0x01d59d] = { 0x000078 }, + [0x01d59e] = { 0x000079 }, + [0x01d59f] = { 0x00007a }, + [0x01d5a0] = { 0x000041 }, + [0x01d5a1] = { 0x000042 }, + [0x01d5a2] = { 0x000043 }, + [0x01d5a3] = { 0x000044 }, + [0x01d5a4] = { 0x000045 }, + [0x01d5a5] = { 0x000046 }, + [0x01d5a6] = { 0x000047 }, + [0x01d5a7] = { 0x000048 }, + [0x01d5a8] = { 0x000049 }, + [0x01d5a9] = { 0x00004a }, + [0x01d5aa] = { 0x00004b }, + [0x01d5ab] = { 0x00004c }, + [0x01d5ac] = { 0x00004d }, + [0x01d5ad] = { 0x00004e }, + [0x01d5ae] = { 0x00004f }, + [0x01d5af] = { 0x000050 }, + [0x01d5b0] = { 0x000051 }, + [0x01d5b1] = { 0x000052 }, + [0x01d5b2] = { 0x000053 }, + [0x01d5b3] = { 0x000054 }, + [0x01d5b4] = { 0x000055 }, + [0x01d5b5] = { 0x000056 }, + [0x01d5b6] = { 0x000057 }, + [0x01d5b7] = { 0x000058 }, + [0x01d5b8] = { 0x000059 }, + [0x01d5b9] = { 0x00005a }, + [0x01d5ba] = { 0x000061 }, + [0x01d5bb] = { 0x000062 }, + [0x01d5bc] = { 0x000063 }, + [0x01d5bd] = { 0x000064 }, + [0x01d5be] = { 0x000065 }, + [0x01d5bf] = { 0x000066 }, + [0x01d5c0] = { 0x000067 }, + [0x01d5c1] = { 0x000068 }, + [0x01d5c2] = { 0x000069 }, + [0x01d5c3] = { 0x00006a }, + [0x01d5c4] = { 0x00006b }, + [0x01d5c5] = { 0x00006c }, + [0x01d5c6] = { 0x00006d }, + [0x01d5c7] = { 0x00006e }, + [0x01d5c8] = { 0x00006f }, + [0x01d5c9] = { 0x000070 }, + [0x01d5ca] = { 0x000071 }, + [0x01d5cb] = { 0x000072 }, + [0x01d5cc] = { 0x000073 }, + [0x01d5cd] = { 0x000074 }, + [0x01d5ce] = { 0x000075 }, + [0x01d5cf] = { 0x000076 }, + [0x01d5d0] = { 0x000077 }, + [0x01d5d1] = { 0x000078 }, + [0x01d5d2] = { 0x000079 }, + [0x01d5d3] = { 0x00007a }, + [0x01d5d4] = { 0x000041 }, + [0x01d5d5] = { 0x000042 }, + [0x01d5d6] = { 0x000043 }, + [0x01d5d7] = { 0x000044 }, + [0x01d5d8] = { 0x000045 }, + [0x01d5d9] = { 0x000046 }, + [0x01d5da] = { 0x000047 }, + [0x01d5db] = { 0x000048 }, + [0x01d5dc] = { 0x000049 }, + [0x01d5dd] = { 0x00004a }, + [0x01d5de] = { 0x00004b }, + [0x01d5df] = { 0x00004c }, + [0x01d5e0] = { 0x00004d }, + [0x01d5e1] = { 0x00004e }, + [0x01d5e2] = { 0x00004f }, + [0x01d5e3] = { 0x000050 }, + [0x01d5e4] = { 0x000051 }, + [0x01d5e5] = { 0x000052 }, + [0x01d5e6] = { 0x000053 }, + [0x01d5e7] = { 0x000054 }, + [0x01d5e8] = { 0x000055 }, + [0x01d5e9] = { 0x000056 }, + [0x01d5ea] = { 0x000057 }, + [0x01d5eb] = { 0x000058 }, + [0x01d5ec] = { 0x000059 }, + [0x01d5ed] = { 0x00005a }, + [0x01d5ee] = { 0x000061 }, + [0x01d5ef] = { 0x000062 }, + [0x01d5f0] = { 0x000063 }, + [0x01d5f1] = { 0x000064 }, + [0x01d5f2] = { 0x000065 }, + [0x01d5f3] = { 0x000066 }, + [0x01d5f4] = { 0x000067 }, + [0x01d5f5] = { 0x000068 }, + [0x01d5f6] = { 0x000069 }, + [0x01d5f7] = { 0x00006a }, + [0x01d5f8] = { 0x00006b }, + [0x01d5f9] = { 0x00006c }, + [0x01d5fa] = { 0x00006d }, + [0x01d5fb] = { 0x00006e }, + [0x01d5fc] = { 0x00006f }, + [0x01d5fd] = { 0x000070 }, + [0x01d5fe] = { 0x000071 }, + [0x01d5ff] = { 0x000072 }, + [0x01d600] = { 0x000073 }, + [0x01d601] = { 0x000074 }, + [0x01d602] = { 0x000075 }, + [0x01d603] = { 0x000076 }, + [0x01d604] = { 0x000077 }, + [0x01d605] = { 0x000078 }, + [0x01d606] = { 0x000079 }, + [0x01d607] = { 0x00007a }, + [0x01d608] = { 0x000041 }, + [0x01d609] = { 0x000042 }, + [0x01d60a] = { 0x000043 }, + [0x01d60b] = { 0x000044 }, + [0x01d60c] = { 0x000045 }, + [0x01d60d] = { 0x000046 }, + [0x01d60e] = { 0x000047 }, + [0x01d60f] = { 0x000048 }, + [0x01d610] = { 0x000049 }, + [0x01d611] = { 0x00004a }, + [0x01d612] = { 0x00004b }, + [0x01d613] = { 0x00004c }, + [0x01d614] = { 0x00004d }, + [0x01d615] = { 0x00004e }, + [0x01d616] = { 0x00004f }, + [0x01d617] = { 0x000050 }, + [0x01d618] = { 0x000051 }, + [0x01d619] = { 0x000052 }, + [0x01d61a] = { 0x000053 }, + [0x01d61b] = { 0x000054 }, + [0x01d61c] = { 0x000055 }, + [0x01d61d] = { 0x000056 }, + [0x01d61e] = { 0x000057 }, + [0x01d61f] = { 0x000058 }, + [0x01d620] = { 0x000059 }, + [0x01d621] = { 0x00005a }, + [0x01d622] = { 0x000061 }, + [0x01d623] = { 0x000062 }, + [0x01d624] = { 0x000063 }, + [0x01d625] = { 0x000064 }, + [0x01d626] = { 0x000065 }, + [0x01d627] = { 0x000066 }, + [0x01d628] = { 0x000067 }, + [0x01d629] = { 0x000068 }, + [0x01d62a] = { 0x000069 }, + [0x01d62b] = { 0x00006a }, + [0x01d62c] = { 0x00006b }, + [0x01d62d] = { 0x00006c }, + [0x01d62e] = { 0x00006d }, + [0x01d62f] = { 0x00006e }, + [0x01d630] = { 0x00006f }, + [0x01d631] = { 0x000070 }, + [0x01d632] = { 0x000071 }, + [0x01d633] = { 0x000072 }, + [0x01d634] = { 0x000073 }, + [0x01d635] = { 0x000074 }, + [0x01d636] = { 0x000075 }, + [0x01d637] = { 0x000076 }, + [0x01d638] = { 0x000077 }, + [0x01d639] = { 0x000078 }, + [0x01d63a] = { 0x000079 }, + [0x01d63b] = { 0x00007a }, + [0x01d63c] = { 0x000041 }, + [0x01d63d] = { 0x000042 }, + [0x01d63e] = { 0x000043 }, + [0x01d63f] = { 0x000044 }, + [0x01d640] = { 0x000045 }, + [0x01d641] = { 0x000046 }, + [0x01d642] = { 0x000047 }, + [0x01d643] = { 0x000048 }, + [0x01d644] = { 0x000049 }, + [0x01d645] = { 0x00004a }, + [0x01d646] = { 0x00004b }, + [0x01d647] = { 0x00004c }, + [0x01d648] = { 0x00004d }, + [0x01d649] = { 0x00004e }, + [0x01d64a] = { 0x00004f }, + [0x01d64b] = { 0x000050 }, + [0x01d64c] = { 0x000051 }, + [0x01d64d] = { 0x000052 }, + [0x01d64e] = { 0x000053 }, + [0x01d64f] = { 0x000054 }, + [0x01d650] = { 0x000055 }, + [0x01d651] = { 0x000056 }, + [0x01d652] = { 0x000057 }, + [0x01d653] = { 0x000058 }, + [0x01d654] = { 0x000059 }, + [0x01d655] = { 0x00005a }, + [0x01d656] = { 0x000061 }, + [0x01d657] = { 0x000062 }, + [0x01d658] = { 0x000063 }, + [0x01d659] = { 0x000064 }, + [0x01d65a] = { 0x000065 }, + [0x01d65b] = { 0x000066 }, + [0x01d65c] = { 0x000067 }, + [0x01d65d] = { 0x000068 }, + [0x01d65e] = { 0x000069 }, + [0x01d65f] = { 0x00006a }, + [0x01d660] = { 0x00006b }, + [0x01d661] = { 0x00006c }, + [0x01d662] = { 0x00006d }, + [0x01d663] = { 0x00006e }, + [0x01d664] = { 0x00006f }, + [0x01d665] = { 0x000070 }, + [0x01d666] = { 0x000071 }, + [0x01d667] = { 0x000072 }, + [0x01d668] = { 0x000073 }, + [0x01d669] = { 0x000074 }, + [0x01d66a] = { 0x000075 }, + [0x01d66b] = { 0x000076 }, + [0x01d66c] = { 0x000077 }, + [0x01d66d] = { 0x000078 }, + [0x01d66e] = { 0x000079 }, + [0x01d66f] = { 0x00007a }, + [0x01d670] = { 0x000041 }, + [0x01d671] = { 0x000042 }, + [0x01d672] = { 0x000043 }, + [0x01d673] = { 0x000044 }, + [0x01d674] = { 0x000045 }, + [0x01d675] = { 0x000046 }, + [0x01d676] = { 0x000047 }, + [0x01d677] = { 0x000048 }, + [0x01d678] = { 0x000049 }, + [0x01d679] = { 0x00004a }, + [0x01d67a] = { 0x00004b }, + [0x01d67b] = { 0x00004c }, + [0x01d67c] = { 0x00004d }, + [0x01d67d] = { 0x00004e }, + [0x01d67e] = { 0x00004f }, + [0x01d67f] = { 0x000050 }, + [0x01d680] = { 0x000051 }, + [0x01d681] = { 0x000052 }, + [0x01d682] = { 0x000053 }, + [0x01d683] = { 0x000054 }, + [0x01d684] = { 0x000055 }, + [0x01d685] = { 0x000056 }, + [0x01d686] = { 0x000057 }, + [0x01d687] = { 0x000058 }, + [0x01d688] = { 0x000059 }, + [0x01d689] = { 0x00005a }, + [0x01d68a] = { 0x000061 }, + [0x01d68b] = { 0x000062 }, + [0x01d68c] = { 0x000063 }, + [0x01d68d] = { 0x000064 }, + [0x01d68e] = { 0x000065 }, + [0x01d68f] = { 0x000066 }, + [0x01d690] = { 0x000067 }, + [0x01d691] = { 0x000068 }, + [0x01d692] = { 0x000069 }, + [0x01d693] = { 0x00006a }, + [0x01d694] = { 0x00006b }, + [0x01d695] = { 0x00006c }, + [0x01d696] = { 0x00006d }, + [0x01d697] = { 0x00006e }, + [0x01d698] = { 0x00006f }, + [0x01d699] = { 0x000070 }, + [0x01d69a] = { 0x000071 }, + [0x01d69b] = { 0x000072 }, + [0x01d69c] = { 0x000073 }, + [0x01d69d] = { 0x000074 }, + [0x01d69e] = { 0x000075 }, + [0x01d69f] = { 0x000076 }, + [0x01d6a0] = { 0x000077 }, + [0x01d6a1] = { 0x000078 }, + [0x01d6a2] = { 0x000079 }, + [0x01d6a3] = { 0x00007a }, + [0x01d6a4] = { 0x000131 }, + [0x01d6a5] = { 0x000237 }, + [0x01d6a8] = { 0x000391 }, + [0x01d6a9] = { 0x000392 }, + [0x01d6aa] = { 0x000393 }, + [0x01d6ab] = { 0x000394 }, + [0x01d6ac] = { 0x000395 }, + [0x01d6ad] = { 0x000396 }, + [0x01d6ae] = { 0x000397 }, + [0x01d6af] = { 0x000398 }, + [0x01d6b0] = { 0x000399 }, + [0x01d6b1] = { 0x00039a }, + [0x01d6b2] = { 0x00039b }, + [0x01d6b3] = { 0x00039c }, + [0x01d6b4] = { 0x00039d }, + [0x01d6b5] = { 0x00039e }, + [0x01d6b6] = { 0x00039f }, + [0x01d6b7] = { 0x0003a0 }, + [0x01d6b8] = { 0x0003a1 }, + [0x01d6b9] = { 0x000398 }, + [0x01d6ba] = { 0x0003a3 }, + [0x01d6bb] = { 0x0003a4 }, + [0x01d6bc] = { 0x0003a5 }, + [0x01d6bd] = { 0x0003a6 }, + [0x01d6be] = { 0x0003a7 }, + [0x01d6bf] = { 0x0003a8 }, + [0x01d6c0] = { 0x0003a9 }, + [0x01d6c1] = { 0x002207 }, + [0x01d6c2] = { 0x0003b1 }, + [0x01d6c3] = { 0x0003b2 }, + [0x01d6c4] = { 0x0003b3 }, + [0x01d6c5] = { 0x0003b4 }, + [0x01d6c6] = { 0x0003b5 }, + [0x01d6c7] = { 0x0003b6 }, + [0x01d6c8] = { 0x0003b7 }, + [0x01d6c9] = { 0x0003b8 }, + [0x01d6ca] = { 0x0003b9 }, + [0x01d6cb] = { 0x0003ba }, + [0x01d6cc] = { 0x0003bb }, + [0x01d6cd] = { 0x0003bc }, + [0x01d6ce] = { 0x0003bd }, + [0x01d6cf] = { 0x0003be }, + [0x01d6d0] = { 0x0003bf }, + [0x01d6d1] = { 0x0003c0 }, + [0x01d6d2] = { 0x0003c1 }, + [0x01d6d3] = { 0x0003c2 }, + [0x01d6d4] = { 0x0003c3 }, + [0x01d6d5] = { 0x0003c4 }, + [0x01d6d6] = { 0x0003c5 }, + [0x01d6d7] = { 0x0003c6 }, + [0x01d6d8] = { 0x0003c7 }, + [0x01d6d9] = { 0x0003c8 }, + [0x01d6da] = { 0x0003c9 }, + [0x01d6db] = { 0x002202 }, + [0x01d6dc] = { 0x0003b5 }, + [0x01d6dd] = { 0x0003b8 }, + [0x01d6de] = { 0x0003ba }, + [0x01d6df] = { 0x0003c6 }, + [0x01d6e0] = { 0x0003c1 }, + [0x01d6e1] = { 0x0003c0 }, + [0x01d6e2] = { 0x000391 }, + [0x01d6e3] = { 0x000392 }, + [0x01d6e4] = { 0x000393 }, + [0x01d6e5] = { 0x000394 }, + [0x01d6e6] = { 0x000395 }, + [0x01d6e7] = { 0x000396 }, + [0x01d6e8] = { 0x000397 }, + [0x01d6e9] = { 0x000398 }, + [0x01d6ea] = { 0x000399 }, + [0x01d6eb] = { 0x00039a }, + [0x01d6ec] = { 0x00039b }, + [0x01d6ed] = { 0x00039c }, + [0x01d6ee] = { 0x00039d }, + [0x01d6ef] = { 0x00039e }, + [0x01d6f0] = { 0x00039f }, + [0x01d6f1] = { 0x0003a0 }, + [0x01d6f2] = { 0x0003a1 }, + [0x01d6f3] = { 0x000398 }, + [0x01d6f4] = { 0x0003a3 }, + [0x01d6f5] = { 0x0003a4 }, + [0x01d6f6] = { 0x0003a5 }, + [0x01d6f7] = { 0x0003a6 }, + [0x01d6f8] = { 0x0003a7 }, + [0x01d6f9] = { 0x0003a8 }, + [0x01d6fa] = { 0x0003a9 }, + [0x01d6fb] = { 0x002207 }, + [0x01d6fc] = { 0x0003b1 }, + [0x01d6fd] = { 0x0003b2 }, + [0x01d6fe] = { 0x0003b3 }, + [0x01d6ff] = { 0x0003b4 }, + [0x01d700] = { 0x0003b5 }, + [0x01d701] = { 0x0003b6 }, + [0x01d702] = { 0x0003b7 }, + [0x01d703] = { 0x0003b8 }, + [0x01d704] = { 0x0003b9 }, + [0x01d705] = { 0x0003ba }, + [0x01d706] = { 0x0003bb }, + [0x01d707] = { 0x0003bc }, + [0x01d708] = { 0x0003bd }, + [0x01d709] = { 0x0003be }, + [0x01d70a] = { 0x0003bf }, + [0x01d70b] = { 0x0003c0 }, + [0x01d70c] = { 0x0003c1 }, + [0x01d70d] = { 0x0003c2 }, + [0x01d70e] = { 0x0003c3 }, + [0x01d70f] = { 0x0003c4 }, + [0x01d710] = { 0x0003c5 }, + [0x01d711] = { 0x0003c6 }, + [0x01d712] = { 0x0003c7 }, + [0x01d713] = { 0x0003c8 }, + [0x01d714] = { 0x0003c9 }, + [0x01d715] = { 0x002202 }, + [0x01d716] = { 0x0003b5 }, + [0x01d717] = { 0x0003b8 }, + [0x01d718] = { 0x0003ba }, + [0x01d719] = { 0x0003c6 }, + [0x01d71a] = { 0x0003c1 }, + [0x01d71b] = { 0x0003c0 }, + [0x01d71c] = { 0x000391 }, + [0x01d71d] = { 0x000392 }, + [0x01d71e] = { 0x000393 }, + [0x01d71f] = { 0x000394 }, + [0x01d720] = { 0x000395 }, + [0x01d721] = { 0x000396 }, + [0x01d722] = { 0x000397 }, + [0x01d723] = { 0x000398 }, + [0x01d724] = { 0x000399 }, + [0x01d725] = { 0x00039a }, + [0x01d726] = { 0x00039b }, + [0x01d727] = { 0x00039c }, + [0x01d728] = { 0x00039d }, + [0x01d729] = { 0x00039e }, + [0x01d72a] = { 0x00039f }, + [0x01d72b] = { 0x0003a0 }, + [0x01d72c] = { 0x0003a1 }, + [0x01d72d] = { 0x000398 }, + [0x01d72e] = { 0x0003a3 }, + [0x01d72f] = { 0x0003a4 }, + [0x01d730] = { 0x0003a5 }, + [0x01d731] = { 0x0003a6 }, + [0x01d732] = { 0x0003a7 }, + [0x01d733] = { 0x0003a8 }, + [0x01d734] = { 0x0003a9 }, + [0x01d735] = { 0x002207 }, + [0x01d736] = { 0x0003b1 }, + [0x01d737] = { 0x0003b2 }, + [0x01d738] = { 0x0003b3 }, + [0x01d739] = { 0x0003b4 }, + [0x01d73a] = { 0x0003b5 }, + [0x01d73b] = { 0x0003b6 }, + [0x01d73c] = { 0x0003b7 }, + [0x01d73d] = { 0x0003b8 }, + [0x01d73e] = { 0x0003b9 }, + [0x01d73f] = { 0x0003ba }, + [0x01d740] = { 0x0003bb }, + [0x01d741] = { 0x0003bc }, + [0x01d742] = { 0x0003bd }, + [0x01d743] = { 0x0003be }, + [0x01d744] = { 0x0003bf }, + [0x01d745] = { 0x0003c0 }, + [0x01d746] = { 0x0003c1 }, + [0x01d747] = { 0x0003c2 }, + [0x01d748] = { 0x0003c3 }, + [0x01d749] = { 0x0003c4 }, + [0x01d74a] = { 0x0003c5 }, + [0x01d74b] = { 0x0003c6 }, + [0x01d74c] = { 0x0003c7 }, + [0x01d74d] = { 0x0003c8 }, + [0x01d74e] = { 0x0003c9 }, + [0x01d74f] = { 0x002202 }, + [0x01d750] = { 0x0003b5 }, + [0x01d751] = { 0x0003b8 }, + [0x01d752] = { 0x0003ba }, + [0x01d753] = { 0x0003c6 }, + [0x01d754] = { 0x0003c1 }, + [0x01d755] = { 0x0003c0 }, + [0x01d756] = { 0x000391 }, + [0x01d757] = { 0x000392 }, + [0x01d758] = { 0x000393 }, + [0x01d759] = { 0x000394 }, + [0x01d75a] = { 0x000395 }, + [0x01d75b] = { 0x000396 }, + [0x01d75c] = { 0x000397 }, + [0x01d75d] = { 0x000398 }, + [0x01d75e] = { 0x000399 }, + [0x01d75f] = { 0x00039a }, + [0x01d760] = { 0x00039b }, + [0x01d761] = { 0x00039c }, + [0x01d762] = { 0x00039d }, + [0x01d763] = { 0x00039e }, + [0x01d764] = { 0x00039f }, + [0x01d765] = { 0x0003a0 }, + [0x01d766] = { 0x0003a1 }, + [0x01d767] = { 0x000398 }, + [0x01d768] = { 0x0003a3 }, + [0x01d769] = { 0x0003a4 }, + [0x01d76a] = { 0x0003a5 }, + [0x01d76b] = { 0x0003a6 }, + [0x01d76c] = { 0x0003a7 }, + [0x01d76d] = { 0x0003a8 }, + [0x01d76e] = { 0x0003a9 }, + [0x01d76f] = { 0x002207 }, + [0x01d770] = { 0x0003b1 }, + [0x01d771] = { 0x0003b2 }, + [0x01d772] = { 0x0003b3 }, + [0x01d773] = { 0x0003b4 }, + [0x01d774] = { 0x0003b5 }, + [0x01d775] = { 0x0003b6 }, + [0x01d776] = { 0x0003b7 }, + [0x01d777] = { 0x0003b8 }, + [0x01d778] = { 0x0003b9 }, + [0x01d779] = { 0x0003ba }, + [0x01d77a] = { 0x0003bb }, + [0x01d77b] = { 0x0003bc }, + [0x01d77c] = { 0x0003bd }, + [0x01d77d] = { 0x0003be }, + [0x01d77e] = { 0x0003bf }, + [0x01d77f] = { 0x0003c0 }, + [0x01d780] = { 0x0003c1 }, + [0x01d781] = { 0x0003c2 }, + [0x01d782] = { 0x0003c3 }, + [0x01d783] = { 0x0003c4 }, + [0x01d784] = { 0x0003c5 }, + [0x01d785] = { 0x0003c6 }, + [0x01d786] = { 0x0003c7 }, + [0x01d787] = { 0x0003c8 }, + [0x01d788] = { 0x0003c9 }, + [0x01d789] = { 0x002202 }, + [0x01d78a] = { 0x0003b5 }, + [0x01d78b] = { 0x0003b8 }, + [0x01d78c] = { 0x0003ba }, + [0x01d78d] = { 0x0003c6 }, + [0x01d78e] = { 0x0003c1 }, + [0x01d78f] = { 0x0003c0 }, + [0x01d790] = { 0x000391 }, + [0x01d791] = { 0x000392 }, + [0x01d792] = { 0x000393 }, + [0x01d793] = { 0x000394 }, + [0x01d794] = { 0x000395 }, + [0x01d795] = { 0x000396 }, + [0x01d796] = { 0x000397 }, + [0x01d797] = { 0x000398 }, + [0x01d798] = { 0x000399 }, + [0x01d799] = { 0x00039a }, + [0x01d79a] = { 0x00039b }, + [0x01d79b] = { 0x00039c }, + [0x01d79c] = { 0x00039d }, + [0x01d79d] = { 0x00039e }, + [0x01d79e] = { 0x00039f }, + [0x01d79f] = { 0x0003a0 }, + [0x01d7a0] = { 0x0003a1 }, + [0x01d7a1] = { 0x000398 }, + [0x01d7a2] = { 0x0003a3 }, + [0x01d7a3] = { 0x0003a4 }, + [0x01d7a4] = { 0x0003a5 }, + [0x01d7a5] = { 0x0003a6 }, + [0x01d7a6] = { 0x0003a7 }, + [0x01d7a7] = { 0x0003a8 }, + [0x01d7a8] = { 0x0003a9 }, + [0x01d7a9] = { 0x002207 }, + [0x01d7aa] = { 0x0003b1 }, + [0x01d7ab] = { 0x0003b2 }, + [0x01d7ac] = { 0x0003b3 }, + [0x01d7ad] = { 0x0003b4 }, + [0x01d7ae] = { 0x0003b5 }, + [0x01d7af] = { 0x0003b6 }, + [0x01d7b0] = { 0x0003b7 }, + [0x01d7b1] = { 0x0003b8 }, + [0x01d7b2] = { 0x0003b9 }, + [0x01d7b3] = { 0x0003ba }, + [0x01d7b4] = { 0x0003bb }, + [0x01d7b5] = { 0x0003bc }, + [0x01d7b6] = { 0x0003bd }, + [0x01d7b7] = { 0x0003be }, + [0x01d7b8] = { 0x0003bf }, + [0x01d7b9] = { 0x0003c0 }, + [0x01d7ba] = { 0x0003c1 }, + [0x01d7bb] = { 0x0003c2 }, + [0x01d7bc] = { 0x0003c3 }, + [0x01d7bd] = { 0x0003c4 }, + [0x01d7be] = { 0x0003c5 }, + [0x01d7bf] = { 0x0003c6 }, + [0x01d7c0] = { 0x0003c7 }, + [0x01d7c1] = { 0x0003c8 }, + [0x01d7c2] = { 0x0003c9 }, + [0x01d7c3] = { 0x002202 }, + [0x01d7c4] = { 0x0003b5 }, + [0x01d7c5] = { 0x0003b8 }, + [0x01d7c6] = { 0x0003ba }, + [0x01d7c7] = { 0x0003c6 }, + [0x01d7c8] = { 0x0003c1 }, + [0x01d7c9] = { 0x0003c0 }, + [0x01d7ca] = { 0x0003dc }, + [0x01d7cb] = { 0x0003dd }, + [0x01d7ce] = { 0x000030 }, + [0x01d7cf] = { 0x000031 }, + [0x01d7d0] = { 0x000032 }, + [0x01d7d1] = { 0x000033 }, + [0x01d7d2] = { 0x000034 }, + [0x01d7d3] = { 0x000035 }, + [0x01d7d4] = { 0x000036 }, + [0x01d7d5] = { 0x000037 }, + [0x01d7d6] = { 0x000038 }, + [0x01d7d7] = { 0x000039 }, + [0x01d7d8] = { 0x000030 }, + [0x01d7d9] = { 0x000031 }, + [0x01d7da] = { 0x000032 }, + [0x01d7db] = { 0x000033 }, + [0x01d7dc] = { 0x000034 }, + [0x01d7dd] = { 0x000035 }, + [0x01d7de] = { 0x000036 }, + [0x01d7df] = { 0x000037 }, + [0x01d7e0] = { 0x000038 }, + [0x01d7e1] = { 0x000039 }, + [0x01d7e2] = { 0x000030 }, + [0x01d7e3] = { 0x000031 }, + [0x01d7e4] = { 0x000032 }, + [0x01d7e5] = { 0x000033 }, + [0x01d7e6] = { 0x000034 }, + [0x01d7e7] = { 0x000035 }, + [0x01d7e8] = { 0x000036 }, + [0x01d7e9] = { 0x000037 }, + [0x01d7ea] = { 0x000038 }, + [0x01d7eb] = { 0x000039 }, + [0x01d7ec] = { 0x000030 }, + [0x01d7ed] = { 0x000031 }, + [0x01d7ee] = { 0x000032 }, + [0x01d7ef] = { 0x000033 }, + [0x01d7f0] = { 0x000034 }, + [0x01d7f1] = { 0x000035 }, + [0x01d7f2] = { 0x000036 }, + [0x01d7f3] = { 0x000037 }, + [0x01d7f4] = { 0x000038 }, + [0x01d7f5] = { 0x000039 }, + [0x01d7f6] = { 0x000030 }, + [0x01d7f7] = { 0x000031 }, + [0x01d7f8] = { 0x000032 }, + [0x01d7f9] = { 0x000033 }, + [0x01d7fa] = { 0x000034 }, + [0x01d7fb] = { 0x000035 }, + [0x01d7fc] = { 0x000036 }, + [0x01d7fd] = { 0x000037 }, + [0x01d7fe] = { 0x000038 }, + [0x01d7ff] = { 0x000039 }, + [0x01ee00] = { 0x000627 }, + [0x01ee01] = { 0x000628 }, + [0x01ee02] = { 0x00062c }, + [0x01ee03] = { 0x00062f }, + [0x01ee05] = { 0x000648 }, + [0x01ee06] = { 0x000632 }, + [0x01ee07] = { 0x00062d }, + [0x01ee08] = { 0x000637 }, + [0x01ee09] = { 0x00064a }, + [0x01ee0a] = { 0x000643 }, + [0x01ee0b] = { 0x000644 }, + [0x01ee0c] = { 0x000645 }, + [0x01ee0d] = { 0x000646 }, + [0x01ee0e] = { 0x000633 }, + [0x01ee0f] = { 0x000639 }, + [0x01ee10] = { 0x000641 }, + [0x01ee11] = { 0x000635 }, + [0x01ee12] = { 0x000642 }, + [0x01ee13] = { 0x000631 }, + [0x01ee14] = { 0x000634 }, + [0x01ee15] = { 0x00062a }, + [0x01ee16] = { 0x00062b }, + [0x01ee17] = { 0x00062e }, + [0x01ee18] = { 0x000630 }, + [0x01ee19] = { 0x000636 }, + [0x01ee1a] = { 0x000638 }, + [0x01ee1b] = { 0x00063a }, + [0x01ee1c] = { 0x00066e }, + [0x01ee1d] = { 0x0006ba }, + [0x01ee1e] = { 0x0006a1 }, + [0x01ee1f] = { 0x00066f }, + [0x01ee21] = { 0x000628 }, + [0x01ee22] = { 0x00062c }, + [0x01ee24] = { 0x000647 }, + [0x01ee27] = { 0x00062d }, + [0x01ee29] = { 0x00064a }, + [0x01ee2a] = { 0x000643 }, + [0x01ee2b] = { 0x000644 }, + [0x01ee2c] = { 0x000645 }, + [0x01ee2d] = { 0x000646 }, + [0x01ee2e] = { 0x000633 }, + [0x01ee2f] = { 0x000639 }, + [0x01ee30] = { 0x000641 }, + [0x01ee31] = { 0x000635 }, + [0x01ee32] = { 0x000642 }, + [0x01ee34] = { 0x000634 }, + [0x01ee35] = { 0x00062a }, + [0x01ee36] = { 0x00062b }, + [0x01ee37] = { 0x00062e }, + [0x01ee39] = { 0x000636 }, + [0x01ee3b] = { 0x00063a }, + [0x01ee42] = { 0x00062c }, + [0x01ee47] = { 0x00062d }, + [0x01ee49] = { 0x00064a }, + [0x01ee4b] = { 0x000644 }, + [0x01ee4d] = { 0x000646 }, + [0x01ee4e] = { 0x000633 }, + [0x01ee4f] = { 0x000639 }, + [0x01ee51] = { 0x000635 }, + [0x01ee52] = { 0x000642 }, + [0x01ee54] = { 0x000634 }, + [0x01ee57] = { 0x00062e }, + [0x01ee59] = { 0x000636 }, + [0x01ee5b] = { 0x00063a }, + [0x01ee5d] = { 0x0006ba }, + [0x01ee5f] = { 0x00066f }, + [0x01ee61] = { 0x000628 }, + [0x01ee62] = { 0x00062c }, + [0x01ee64] = { 0x000647 }, + [0x01ee67] = { 0x00062d }, + [0x01ee68] = { 0x000637 }, + [0x01ee69] = { 0x00064a }, + [0x01ee6a] = { 0x000643 }, + [0x01ee6c] = { 0x000645 }, + [0x01ee6d] = { 0x000646 }, + [0x01ee6e] = { 0x000633 }, + [0x01ee6f] = { 0x000639 }, + [0x01ee70] = { 0x000641 }, + [0x01ee71] = { 0x000635 }, + [0x01ee72] = { 0x000642 }, + [0x01ee74] = { 0x000634 }, + [0x01ee75] = { 0x00062a }, + [0x01ee76] = { 0x00062b }, + [0x01ee77] = { 0x00062e }, + [0x01ee79] = { 0x000636 }, + [0x01ee7a] = { 0x000638 }, + [0x01ee7b] = { 0x00063a }, + [0x01ee7c] = { 0x00066e }, + [0x01ee7e] = { 0x0006a1 }, + [0x01ee80] = { 0x000627 }, + [0x01ee81] = { 0x000628 }, + [0x01ee82] = { 0x00062c }, + [0x01ee83] = { 0x00062f }, + [0x01ee84] = { 0x000647 }, + [0x01ee85] = { 0x000648 }, + [0x01ee86] = { 0x000632 }, + [0x01ee87] = { 0x00062d }, + [0x01ee88] = { 0x000637 }, + [0x01ee89] = { 0x00064a }, + [0x01ee8b] = { 0x000644 }, + [0x01ee8c] = { 0x000645 }, + [0x01ee8d] = { 0x000646 }, + [0x01ee8e] = { 0x000633 }, + [0x01ee8f] = { 0x000639 }, + [0x01ee90] = { 0x000641 }, + [0x01ee91] = { 0x000635 }, + [0x01ee92] = { 0x000642 }, + [0x01ee93] = { 0x000631 }, + [0x01ee94] = { 0x000634 }, + [0x01ee95] = { 0x00062a }, + [0x01ee96] = { 0x00062b }, + [0x01ee97] = { 0x00062e }, + [0x01ee98] = { 0x000630 }, + [0x01ee99] = { 0x000636 }, + [0x01ee9a] = { 0x000638 }, + [0x01ee9b] = { 0x00063a }, + [0x01eea1] = { 0x000628 }, + [0x01eea2] = { 0x00062c }, + [0x01eea3] = { 0x00062f }, + [0x01eea5] = { 0x000648 }, + [0x01eea6] = { 0x000632 }, + [0x01eea7] = { 0x00062d }, + [0x01eea8] = { 0x000637 }, + [0x01eea9] = { 0x00064a }, + [0x01eeab] = { 0x000644 }, + [0x01eeac] = { 0x000645 }, + [0x01eead] = { 0x000646 }, + [0x01eeae] = { 0x000633 }, + [0x01eeaf] = { 0x000639 }, + [0x01eeb0] = { 0x000641 }, + [0x01eeb1] = { 0x000635 }, + [0x01eeb2] = { 0x000642 }, + [0x01eeb3] = { 0x000631 }, + [0x01eeb4] = { 0x000634 }, + [0x01eeb5] = { 0x00062a }, + [0x01eeb6] = { 0x00062b }, + [0x01eeb7] = { 0x00062e }, + [0x01eeb8] = { 0x000630 }, + [0x01eeb9] = { 0x000636 }, + [0x01eeba] = { 0x000638 }, + [0x01eebb] = { 0x00063a }, + [0x01f100] = { 0x000030, 0x00002e }, + [0x01f101] = { 0x000030, 0x00002c }, + [0x01f102] = { 0x000031, 0x00002c }, + [0x01f103] = { 0x000032, 0x00002c }, + [0x01f104] = { 0x000033, 0x00002c }, + [0x01f105] = { 0x000034, 0x00002c }, + [0x01f106] = { 0x000035, 0x00002c }, + [0x01f107] = { 0x000036, 0x00002c }, + [0x01f108] = { 0x000037, 0x00002c }, + [0x01f109] = { 0x000038, 0x00002c }, + [0x01f10a] = { 0x000039, 0x00002c }, + [0x01f110] = { 0x000028, 0x000041, 0x000029 }, + [0x01f111] = { 0x000028, 0x000042, 0x000029 }, + [0x01f112] = { 0x000028, 0x000043, 0x000029 }, + [0x01f113] = { 0x000028, 0x000044, 0x000029 }, + [0x01f114] = { 0x000028, 0x000045, 0x000029 }, + [0x01f115] = { 0x000028, 0x000046, 0x000029 }, + [0x01f116] = { 0x000028, 0x000047, 0x000029 }, + [0x01f117] = { 0x000028, 0x000048, 0x000029 }, + [0x01f118] = { 0x000028, 0x000049, 0x000029 }, + [0x01f119] = { 0x000028, 0x00004a, 0x000029 }, + [0x01f11a] = { 0x000028, 0x00004b, 0x000029 }, + [0x01f11b] = { 0x000028, 0x00004c, 0x000029 }, + [0x01f11c] = { 0x000028, 0x00004d, 0x000029 }, + [0x01f11d] = { 0x000028, 0x00004e, 0x000029 }, + [0x01f11e] = { 0x000028, 0x00004f, 0x000029 }, + [0x01f11f] = { 0x000028, 0x000050, 0x000029 }, + [0x01f120] = { 0x000028, 0x000051, 0x000029 }, + [0x01f121] = { 0x000028, 0x000052, 0x000029 }, + [0x01f122] = { 0x000028, 0x000053, 0x000029 }, + [0x01f123] = { 0x000028, 0x000054, 0x000029 }, + [0x01f124] = { 0x000028, 0x000055, 0x000029 }, + [0x01f125] = { 0x000028, 0x000056, 0x000029 }, + [0x01f126] = { 0x000028, 0x000057, 0x000029 }, + [0x01f127] = { 0x000028, 0x000058, 0x000029 }, + [0x01f128] = { 0x000028, 0x000059, 0x000029 }, + [0x01f129] = { 0x000028, 0x00005a, 0x000029 }, + [0x01f12a] = { 0x003014, 0x000053, 0x003015 }, + [0x01f12b] = { 0x000043 }, + [0x01f12c] = { 0x000052 }, + [0x01f12d] = { 0x000043, 0x000044 }, + [0x01f12e] = { 0x000057, 0x00005a }, + [0x01f130] = { 0x000041 }, + [0x01f131] = { 0x000042 }, + [0x01f132] = { 0x000043 }, + [0x01f133] = { 0x000044 }, + [0x01f134] = { 0x000045 }, + [0x01f135] = { 0x000046 }, + [0x01f136] = { 0x000047 }, + [0x01f137] = { 0x000048 }, + [0x01f138] = { 0x000049 }, + [0x01f139] = { 0x00004a }, + [0x01f13a] = { 0x00004b }, + [0x01f13b] = { 0x00004c }, + [0x01f13c] = { 0x00004d }, + [0x01f13d] = { 0x00004e }, + [0x01f13e] = { 0x00004f }, + [0x01f13f] = { 0x000050 }, + [0x01f140] = { 0x000051 }, + [0x01f141] = { 0x000052 }, + [0x01f142] = { 0x000053 }, + [0x01f143] = { 0x000054 }, + [0x01f144] = { 0x000055 }, + [0x01f145] = { 0x000056 }, + [0x01f146] = { 0x000057 }, + [0x01f147] = { 0x000058 }, + [0x01f148] = { 0x000059 }, + [0x01f149] = { 0x00005a }, + [0x01f14a] = { 0x000048, 0x000056 }, + [0x01f14b] = { 0x00004d, 0x000056 }, + [0x01f14c] = { 0x000053, 0x000044 }, + [0x01f14d] = { 0x000053, 0x000053 }, + [0x01f14e] = { 0x000050, 0x000050, 0x000056 }, + [0x01f14f] = { 0x000057, 0x000043 }, + [0x01f16a] = { 0x00004d, 0x000043 }, + [0x01f16b] = { 0x00004d, 0x000044 }, + [0x01f190] = { 0x000044, 0x00004a }, + [0x01f200] = { 0x00307b, 0x00304b }, + [0x01f201] = { 0x0030b3, 0x0030b3 }, + [0x01f202] = { 0x0030b5 }, + [0x01f210] = { 0x00624b }, + [0x01f211] = { 0x005b57 }, + [0x01f212] = { 0x0053cc }, + [0x01f213] = { 0x0030c6, 0x003099 }, + [0x01f214] = { 0x004e8c }, + [0x01f215] = { 0x00591a }, + [0x01f216] = { 0x0089e3 }, + [0x01f217] = { 0x005929 }, + [0x01f218] = { 0x004ea4 }, + [0x01f219] = { 0x006620 }, + [0x01f21a] = { 0x007121 }, + [0x01f21b] = { 0x006599 }, + [0x01f21c] = { 0x00524d }, + [0x01f21d] = { 0x005f8c }, + [0x01f21e] = { 0x00518d }, + [0x01f21f] = { 0x0065b0 }, + [0x01f220] = { 0x00521d }, + [0x01f221] = { 0x007d42 }, + [0x01f222] = { 0x00751f }, + [0x01f223] = { 0x008ca9 }, + [0x01f224] = { 0x0058f0 }, + [0x01f225] = { 0x005439 }, + [0x01f226] = { 0x006f14 }, + [0x01f227] = { 0x006295 }, + [0x01f228] = { 0x006355 }, + [0x01f229] = { 0x004e00 }, + [0x01f22a] = { 0x004e09 }, + [0x01f22b] = { 0x00904a }, + [0x01f22c] = { 0x005de6 }, + [0x01f22d] = { 0x004e2d }, + [0x01f22e] = { 0x0053f3 }, + [0x01f22f] = { 0x006307 }, + [0x01f230] = { 0x008d70 }, + [0x01f231] = { 0x006253 }, + [0x01f232] = { 0x007981 }, + [0x01f233] = { 0x007a7a }, + [0x01f234] = { 0x005408 }, + [0x01f235] = { 0x006e80 }, + [0x01f236] = { 0x006709 }, + [0x01f237] = { 0x006708 }, + [0x01f238] = { 0x007533 }, + [0x01f239] = { 0x005272 }, + [0x01f23a] = { 0x0055b6 }, + [0x01f240] = { 0x003014, 0x00672c, 0x003015 }, + [0x01f241] = { 0x003014, 0x004e09, 0x003015 }, + [0x01f242] = { 0x003014, 0x004e8c, 0x003015 }, + [0x01f243] = { 0x003014, 0x005b89, 0x003015 }, + [0x01f244] = { 0x003014, 0x0070b9, 0x003015 }, + [0x01f245] = { 0x003014, 0x006253, 0x003015 }, + [0x01f246] = { 0x003014, 0x0076d7, 0x003015 }, + [0x01f247] = { 0x003014, 0x0052dd, 0x003015 }, + [0x01f248] = { 0x003014, 0x006557, 0x003015 }, + [0x01f250] = { 0x005f97 }, + [0x01f251] = { 0x0053ef }, + }, + + -- Character-pairs mapped to what they compose to + -- Note Jamo to Hangul is done separately below + comp = { + [0x00003c] = { + [0x000338] = 0x00226e, + }, + [0x00003d] = { + [0x000338] = 0x002260, + }, + [0x00003e] = { + [0x000338] = 0x00226f, + }, + [0x000041] = { + [0x000300] = 0x0000c0, + [0x000301] = 0x0000c1, + [0x000302] = 0x0000c2, + [0x000303] = 0x0000c3, + [0x000304] = 0x000100, + [0x000306] = 0x000102, + [0x000307] = 0x000226, + [0x000308] = 0x0000c4, + [0x000309] = 0x001ea2, + [0x00030a] = 0x0000c5, + [0x00030c] = 0x0001cd, + [0x00030f] = 0x000200, + [0x000311] = 0x000202, + [0x000323] = 0x001ea0, + [0x000325] = 0x001e00, + [0x000328] = 0x000104, + }, + [0x000042] = { + [0x000307] = 0x001e02, + [0x000323] = 0x001e04, + [0x000331] = 0x001e06, + }, + [0x000043] = { + [0x000301] = 0x000106, + [0x000302] = 0x000108, + [0x000307] = 0x00010a, + [0x00030c] = 0x00010c, + [0x000327] = 0x0000c7, + }, + [0x000044] = { + [0x000307] = 0x001e0a, + [0x00030c] = 0x00010e, + [0x000323] = 0x001e0c, + [0x000327] = 0x001e10, + [0x00032d] = 0x001e12, + [0x000331] = 0x001e0e, + }, + [0x000045] = { + [0x000300] = 0x0000c8, + [0x000301] = 0x0000c9, + [0x000302] = 0x0000ca, + [0x000303] = 0x001ebc, + [0x000304] = 0x000112, + [0x000306] = 0x000114, + [0x000307] = 0x000116, + [0x000308] = 0x0000cb, + [0x000309] = 0x001eba, + [0x00030c] = 0x00011a, + [0x00030f] = 0x000204, + [0x000311] = 0x000206, + [0x000323] = 0x001eb8, + [0x000327] = 0x000228, + [0x000328] = 0x000118, + [0x00032d] = 0x001e18, + [0x000330] = 0x001e1a, + }, + [0x000046] = { + [0x000307] = 0x001e1e, + }, + [0x000047] = { + [0x000301] = 0x0001f4, + [0x000302] = 0x00011c, + [0x000304] = 0x001e20, + [0x000306] = 0x00011e, + [0x000307] = 0x000120, + [0x00030c] = 0x0001e6, + [0x000327] = 0x000122, + }, + [0x000048] = { + [0x000302] = 0x000124, + [0x000307] = 0x001e22, + [0x000308] = 0x001e26, + [0x00030c] = 0x00021e, + [0x000323] = 0x001e24, + [0x000327] = 0x001e28, + [0x00032e] = 0x001e2a, + }, + [0x000049] = { + [0x000300] = 0x0000cc, + [0x000301] = 0x0000cd, + [0x000302] = 0x0000ce, + [0x000303] = 0x000128, + [0x000304] = 0x00012a, + [0x000306] = 0x00012c, + [0x000307] = 0x000130, + [0x000308] = 0x0000cf, + [0x000309] = 0x001ec8, + [0x00030c] = 0x0001cf, + [0x00030f] = 0x000208, + [0x000311] = 0x00020a, + [0x000323] = 0x001eca, + [0x000328] = 0x00012e, + [0x000330] = 0x001e2c, + }, + [0x00004a] = { + [0x000302] = 0x000134, + }, + [0x00004b] = { + [0x000301] = 0x001e30, + [0x00030c] = 0x0001e8, + [0x000323] = 0x001e32, + [0x000327] = 0x000136, + [0x000331] = 0x001e34, + }, + [0x00004c] = { + [0x000301] = 0x000139, + [0x00030c] = 0x00013d, + [0x000323] = 0x001e36, + [0x000327] = 0x00013b, + [0x00032d] = 0x001e3c, + [0x000331] = 0x001e3a, + }, + [0x00004d] = { + [0x000301] = 0x001e3e, + [0x000307] = 0x001e40, + [0x000323] = 0x001e42, + }, + [0x00004e] = { + [0x000300] = 0x0001f8, + [0x000301] = 0x000143, + [0x000303] = 0x0000d1, + [0x000307] = 0x001e44, + [0x00030c] = 0x000147, + [0x000323] = 0x001e46, + [0x000327] = 0x000145, + [0x00032d] = 0x001e4a, + [0x000331] = 0x001e48, + }, + [0x00004f] = { + [0x000300] = 0x0000d2, + [0x000301] = 0x0000d3, + [0x000302] = 0x0000d4, + [0x000303] = 0x0000d5, + [0x000304] = 0x00014c, + [0x000306] = 0x00014e, + [0x000307] = 0x00022e, + [0x000308] = 0x0000d6, + [0x000309] = 0x001ece, + [0x00030b] = 0x000150, + [0x00030c] = 0x0001d1, + [0x00030f] = 0x00020c, + [0x000311] = 0x00020e, + [0x00031b] = 0x0001a0, + [0x000323] = 0x001ecc, + [0x000328] = 0x0001ea, + }, + [0x000050] = { + [0x000301] = 0x001e54, + [0x000307] = 0x001e56, + }, + [0x000052] = { + [0x000301] = 0x000154, + [0x000307] = 0x001e58, + [0x00030c] = 0x000158, + [0x00030f] = 0x000210, + [0x000311] = 0x000212, + [0x000323] = 0x001e5a, + [0x000327] = 0x000156, + [0x000331] = 0x001e5e, + }, + [0x000053] = { + [0x000301] = 0x00015a, + [0x000302] = 0x00015c, + [0x000307] = 0x001e60, + [0x00030c] = 0x000160, + [0x000323] = 0x001e62, + [0x000326] = 0x000218, + [0x000327] = 0x00015e, + }, + [0x000054] = { + [0x000307] = 0x001e6a, + [0x00030c] = 0x000164, + [0x000323] = 0x001e6c, + [0x000326] = 0x00021a, + [0x000327] = 0x000162, + [0x00032d] = 0x001e70, + [0x000331] = 0x001e6e, + }, + [0x000055] = { + [0x000300] = 0x0000d9, + [0x000301] = 0x0000da, + [0x000302] = 0x0000db, + [0x000303] = 0x000168, + [0x000304] = 0x00016a, + [0x000306] = 0x00016c, + [0x000308] = 0x0000dc, + [0x000309] = 0x001ee6, + [0x00030a] = 0x00016e, + [0x00030b] = 0x000170, + [0x00030c] = 0x0001d3, + [0x00030f] = 0x000214, + [0x000311] = 0x000216, + [0x00031b] = 0x0001af, + [0x000323] = 0x001ee4, + [0x000324] = 0x001e72, + [0x000328] = 0x000172, + [0x00032d] = 0x001e76, + [0x000330] = 0x001e74, + }, + [0x000056] = { + [0x000303] = 0x001e7c, + [0x000323] = 0x001e7e, + }, + [0x000057] = { + [0x000300] = 0x001e80, + [0x000301] = 0x001e82, + [0x000302] = 0x000174, + [0x000307] = 0x001e86, + [0x000308] = 0x001e84, + [0x000323] = 0x001e88, + }, + [0x000058] = { + [0x000307] = 0x001e8a, + [0x000308] = 0x001e8c, + }, + [0x000059] = { + [0x000300] = 0x001ef2, + [0x000301] = 0x0000dd, + [0x000302] = 0x000176, + [0x000303] = 0x001ef8, + [0x000304] = 0x000232, + [0x000307] = 0x001e8e, + [0x000308] = 0x000178, + [0x000309] = 0x001ef6, + [0x000323] = 0x001ef4, + }, + [0x00005a] = { + [0x000301] = 0x000179, + [0x000302] = 0x001e90, + [0x000307] = 0x00017b, + [0x00030c] = 0x00017d, + [0x000323] = 0x001e92, + [0x000331] = 0x001e94, + }, + [0x000061] = { + [0x000300] = 0x0000e0, + [0x000301] = 0x0000e1, + [0x000302] = 0x0000e2, + [0x000303] = 0x0000e3, + [0x000304] = 0x000101, + [0x000306] = 0x000103, + [0x000307] = 0x000227, + [0x000308] = 0x0000e4, + [0x000309] = 0x001ea3, + [0x00030a] = 0x0000e5, + [0x00030c] = 0x0001ce, + [0x00030f] = 0x000201, + [0x000311] = 0x000203, + [0x000323] = 0x001ea1, + [0x000325] = 0x001e01, + [0x000328] = 0x000105, + }, + [0x000062] = { + [0x000307] = 0x001e03, + [0x000323] = 0x001e05, + [0x000331] = 0x001e07, + }, + [0x000063] = { + [0x000301] = 0x000107, + [0x000302] = 0x000109, + [0x000307] = 0x00010b, + [0x00030c] = 0x00010d, + [0x000327] = 0x0000e7, + }, + [0x000064] = { + [0x000307] = 0x001e0b, + [0x00030c] = 0x00010f, + [0x000323] = 0x001e0d, + [0x000327] = 0x001e11, + [0x00032d] = 0x001e13, + [0x000331] = 0x001e0f, + }, + [0x000065] = { + [0x000300] = 0x0000e8, + [0x000301] = 0x0000e9, + [0x000302] = 0x0000ea, + [0x000303] = 0x001ebd, + [0x000304] = 0x000113, + [0x000306] = 0x000115, + [0x000307] = 0x000117, + [0x000308] = 0x0000eb, + [0x000309] = 0x001ebb, + [0x00030c] = 0x00011b, + [0x00030f] = 0x000205, + [0x000311] = 0x000207, + [0x000323] = 0x001eb9, + [0x000327] = 0x000229, + [0x000328] = 0x000119, + [0x00032d] = 0x001e19, + [0x000330] = 0x001e1b, + }, + [0x000066] = { + [0x000307] = 0x001e1f, + }, + [0x000067] = { + [0x000301] = 0x0001f5, + [0x000302] = 0x00011d, + [0x000304] = 0x001e21, + [0x000306] = 0x00011f, + [0x000307] = 0x000121, + [0x00030c] = 0x0001e7, + [0x000327] = 0x000123, + }, + [0x000068] = { + [0x000302] = 0x000125, + [0x000307] = 0x001e23, + [0x000308] = 0x001e27, + [0x00030c] = 0x00021f, + [0x000323] = 0x001e25, + [0x000327] = 0x001e29, + [0x00032e] = 0x001e2b, + [0x000331] = 0x001e96, + }, + [0x000069] = { + [0x000300] = 0x0000ec, + [0x000301] = 0x0000ed, + [0x000302] = 0x0000ee, + [0x000303] = 0x000129, + [0x000304] = 0x00012b, + [0x000306] = 0x00012d, + [0x000308] = 0x0000ef, + [0x000309] = 0x001ec9, + [0x00030c] = 0x0001d0, + [0x00030f] = 0x000209, + [0x000311] = 0x00020b, + [0x000323] = 0x001ecb, + [0x000328] = 0x00012f, + [0x000330] = 0x001e2d, + }, + [0x00006a] = { + [0x000302] = 0x000135, + [0x00030c] = 0x0001f0, + }, + [0x00006b] = { + [0x000301] = 0x001e31, + [0x00030c] = 0x0001e9, + [0x000323] = 0x001e33, + [0x000327] = 0x000137, + [0x000331] = 0x001e35, + }, + [0x00006c] = { + [0x000301] = 0x00013a, + [0x00030c] = 0x00013e, + [0x000323] = 0x001e37, + [0x000327] = 0x00013c, + [0x00032d] = 0x001e3d, + [0x000331] = 0x001e3b, + }, + [0x00006d] = { + [0x000301] = 0x001e3f, + [0x000307] = 0x001e41, + [0x000323] = 0x001e43, + }, + [0x00006e] = { + [0x000300] = 0x0001f9, + [0x000301] = 0x000144, + [0x000303] = 0x0000f1, + [0x000307] = 0x001e45, + [0x00030c] = 0x000148, + [0x000323] = 0x001e47, + [0x000327] = 0x000146, + [0x00032d] = 0x001e4b, + [0x000331] = 0x001e49, + }, + [0x00006f] = { + [0x000300] = 0x0000f2, + [0x000301] = 0x0000f3, + [0x000302] = 0x0000f4, + [0x000303] = 0x0000f5, + [0x000304] = 0x00014d, + [0x000306] = 0x00014f, + [0x000307] = 0x00022f, + [0x000308] = 0x0000f6, + [0x000309] = 0x001ecf, + [0x00030b] = 0x000151, + [0x00030c] = 0x0001d2, + [0x00030f] = 0x00020d, + [0x000311] = 0x00020f, + [0x00031b] = 0x0001a1, + [0x000323] = 0x001ecd, + [0x000328] = 0x0001eb, + }, + [0x000070] = { + [0x000301] = 0x001e55, + [0x000307] = 0x001e57, + }, + [0x000072] = { + [0x000301] = 0x000155, + [0x000307] = 0x001e59, + [0x00030c] = 0x000159, + [0x00030f] = 0x000211, + [0x000311] = 0x000213, + [0x000323] = 0x001e5b, + [0x000327] = 0x000157, + [0x000331] = 0x001e5f, + }, + [0x000073] = { + [0x000301] = 0x00015b, + [0x000302] = 0x00015d, + [0x000307] = 0x001e61, + [0x00030c] = 0x000161, + [0x000323] = 0x001e63, + [0x000326] = 0x000219, + [0x000327] = 0x00015f, + }, + [0x000074] = { + [0x000307] = 0x001e6b, + [0x000308] = 0x001e97, + [0x00030c] = 0x000165, + [0x000323] = 0x001e6d, + [0x000326] = 0x00021b, + [0x000327] = 0x000163, + [0x00032d] = 0x001e71, + [0x000331] = 0x001e6f, + }, + [0x000075] = { + [0x000300] = 0x0000f9, + [0x000301] = 0x0000fa, + [0x000302] = 0x0000fb, + [0x000303] = 0x000169, + [0x000304] = 0x00016b, + [0x000306] = 0x00016d, + [0x000308] = 0x0000fc, + [0x000309] = 0x001ee7, + [0x00030a] = 0x00016f, + [0x00030b] = 0x000171, + [0x00030c] = 0x0001d4, + [0x00030f] = 0x000215, + [0x000311] = 0x000217, + [0x00031b] = 0x0001b0, + [0x000323] = 0x001ee5, + [0x000324] = 0x001e73, + [0x000328] = 0x000173, + [0x00032d] = 0x001e77, + [0x000330] = 0x001e75, + }, + [0x000076] = { + [0x000303] = 0x001e7d, + [0x000323] = 0x001e7f, + }, + [0x000077] = { + [0x000300] = 0x001e81, + [0x000301] = 0x001e83, + [0x000302] = 0x000175, + [0x000307] = 0x001e87, + [0x000308] = 0x001e85, + [0x00030a] = 0x001e98, + [0x000323] = 0x001e89, + }, + [0x000078] = { + [0x000307] = 0x001e8b, + [0x000308] = 0x001e8d, + }, + [0x000079] = { + [0x000300] = 0x001ef3, + [0x000301] = 0x0000fd, + [0x000302] = 0x000177, + [0x000303] = 0x001ef9, + [0x000304] = 0x000233, + [0x000307] = 0x001e8f, + [0x000308] = 0x0000ff, + [0x000309] = 0x001ef7, + [0x00030a] = 0x001e99, + [0x000323] = 0x001ef5, + }, + [0x00007a] = { + [0x000301] = 0x00017a, + [0x000302] = 0x001e91, + [0x000307] = 0x00017c, + [0x00030c] = 0x00017e, + [0x000323] = 0x001e93, + [0x000331] = 0x001e95, + }, + [0x0000a8] = { + [0x000300] = 0x001fed, + [0x000301] = 0x000385, + [0x000342] = 0x001fc1, + }, + [0x0000c2] = { + [0x000300] = 0x001ea6, + [0x000301] = 0x001ea4, + [0x000303] = 0x001eaa, + [0x000309] = 0x001ea8, + }, + [0x0000c4] = { + [0x000304] = 0x0001de, + }, + [0x0000c5] = { + [0x000301] = 0x0001fa, + }, + [0x0000c6] = { + [0x000301] = 0x0001fc, + [0x000304] = 0x0001e2, + }, + [0x0000c7] = { + [0x000301] = 0x001e08, + }, + [0x0000ca] = { + [0x000300] = 0x001ec0, + [0x000301] = 0x001ebe, + [0x000303] = 0x001ec4, + [0x000309] = 0x001ec2, + }, + [0x0000cf] = { + [0x000301] = 0x001e2e, + }, + [0x0000d4] = { + [0x000300] = 0x001ed2, + [0x000301] = 0x001ed0, + [0x000303] = 0x001ed6, + [0x000309] = 0x001ed4, + }, + [0x0000d5] = { + [0x000301] = 0x001e4c, + [0x000304] = 0x00022c, + [0x000308] = 0x001e4e, + }, + [0x0000d6] = { + [0x000304] = 0x00022a, + }, + [0x0000d8] = { + [0x000301] = 0x0001fe, + }, + [0x0000dc] = { + [0x000300] = 0x0001db, + [0x000301] = 0x0001d7, + [0x000304] = 0x0001d5, + [0x00030c] = 0x0001d9, + }, + [0x0000e2] = { + [0x000300] = 0x001ea7, + [0x000301] = 0x001ea5, + [0x000303] = 0x001eab, + [0x000309] = 0x001ea9, + }, + [0x0000e4] = { + [0x000304] = 0x0001df, + }, + [0x0000e5] = { + [0x000301] = 0x0001fb, + }, + [0x0000e6] = { + [0x000301] = 0x0001fd, + [0x000304] = 0x0001e3, + }, + [0x0000e7] = { + [0x000301] = 0x001e09, + }, + [0x0000ea] = { + [0x000300] = 0x001ec1, + [0x000301] = 0x001ebf, + [0x000303] = 0x001ec5, + [0x000309] = 0x001ec3, + }, + [0x0000ef] = { + [0x000301] = 0x001e2f, + }, + [0x0000f4] = { + [0x000300] = 0x001ed3, + [0x000301] = 0x001ed1, + [0x000303] = 0x001ed7, + [0x000309] = 0x001ed5, + }, + [0x0000f5] = { + [0x000301] = 0x001e4d, + [0x000304] = 0x00022d, + [0x000308] = 0x001e4f, + }, + [0x0000f6] = { + [0x000304] = 0x00022b, + }, + [0x0000f8] = { + [0x000301] = 0x0001ff, + }, + [0x0000fc] = { + [0x000300] = 0x0001dc, + [0x000301] = 0x0001d8, + [0x000304] = 0x0001d6, + [0x00030c] = 0x0001da, + }, + [0x000102] = { + [0x000300] = 0x001eb0, + [0x000301] = 0x001eae, + [0x000303] = 0x001eb4, + [0x000309] = 0x001eb2, + }, + [0x000103] = { + [0x000300] = 0x001eb1, + [0x000301] = 0x001eaf, + [0x000303] = 0x001eb5, + [0x000309] = 0x001eb3, + }, + [0x000112] = { + [0x000300] = 0x001e14, + [0x000301] = 0x001e16, + }, + [0x000113] = { + [0x000300] = 0x001e15, + [0x000301] = 0x001e17, + }, + [0x00014c] = { + [0x000300] = 0x001e50, + [0x000301] = 0x001e52, + }, + [0x00014d] = { + [0x000300] = 0x001e51, + [0x000301] = 0x001e53, + }, + [0x00015a] = { + [0x000307] = 0x001e64, + }, + [0x00015b] = { + [0x000307] = 0x001e65, + }, + [0x000160] = { + [0x000307] = 0x001e66, + }, + [0x000161] = { + [0x000307] = 0x001e67, + }, + [0x000168] = { + [0x000301] = 0x001e78, + }, + [0x000169] = { + [0x000301] = 0x001e79, + }, + [0x00016a] = { + [0x000308] = 0x001e7a, + }, + [0x00016b] = { + [0x000308] = 0x001e7b, + }, + [0x00017f] = { + [0x000307] = 0x001e9b, + }, + [0x0001a0] = { + [0x000300] = 0x001edc, + [0x000301] = 0x001eda, + [0x000303] = 0x001ee0, + [0x000309] = 0x001ede, + [0x000323] = 0x001ee2, + }, + [0x0001a1] = { + [0x000300] = 0x001edd, + [0x000301] = 0x001edb, + [0x000303] = 0x001ee1, + [0x000309] = 0x001edf, + [0x000323] = 0x001ee3, + }, + [0x0001af] = { + [0x000300] = 0x001eea, + [0x000301] = 0x001ee8, + [0x000303] = 0x001eee, + [0x000309] = 0x001eec, + [0x000323] = 0x001ef0, + }, + [0x0001b0] = { + [0x000300] = 0x001eeb, + [0x000301] = 0x001ee9, + [0x000303] = 0x001eef, + [0x000309] = 0x001eed, + [0x000323] = 0x001ef1, + }, + [0x0001b7] = { + [0x00030c] = 0x0001ee, + }, + [0x0001ea] = { + [0x000304] = 0x0001ec, + }, + [0x0001eb] = { + [0x000304] = 0x0001ed, + }, + [0x000226] = { + [0x000304] = 0x0001e0, + }, + [0x000227] = { + [0x000304] = 0x0001e1, + }, + [0x000228] = { + [0x000306] = 0x001e1c, + }, + [0x000229] = { + [0x000306] = 0x001e1d, + }, + [0x00022e] = { + [0x000304] = 0x000230, + }, + [0x00022f] = { + [0x000304] = 0x000231, + }, + [0x000292] = { + [0x00030c] = 0x0001ef, + }, + [0x000391] = { + [0x000300] = 0x001fba, + [0x000301] = 0x000386, + [0x000304] = 0x001fb9, + [0x000306] = 0x001fb8, + [0x000313] = 0x001f08, + [0x000314] = 0x001f09, + [0x000345] = 0x001fbc, + }, + [0x000395] = { + [0x000300] = 0x001fc8, + [0x000301] = 0x000388, + [0x000313] = 0x001f18, + [0x000314] = 0x001f19, + }, + [0x000397] = { + [0x000300] = 0x001fca, + [0x000301] = 0x000389, + [0x000313] = 0x001f28, + [0x000314] = 0x001f29, + [0x000345] = 0x001fcc, + }, + [0x000399] = { + [0x000300] = 0x001fda, + [0x000301] = 0x00038a, + [0x000304] = 0x001fd9, + [0x000306] = 0x001fd8, + [0x000308] = 0x0003aa, + [0x000313] = 0x001f38, + [0x000314] = 0x001f39, + }, + [0x00039f] = { + [0x000300] = 0x001ff8, + [0x000301] = 0x00038c, + [0x000313] = 0x001f48, + [0x000314] = 0x001f49, + }, + [0x0003a1] = { + [0x000314] = 0x001fec, + }, + [0x0003a5] = { + [0x000300] = 0x001fea, + [0x000301] = 0x00038e, + [0x000304] = 0x001fe9, + [0x000306] = 0x001fe8, + [0x000308] = 0x0003ab, + [0x000314] = 0x001f59, + }, + [0x0003a9] = { + [0x000300] = 0x001ffa, + [0x000301] = 0x00038f, + [0x000313] = 0x001f68, + [0x000314] = 0x001f69, + [0x000345] = 0x001ffc, + }, + [0x0003ac] = { + [0x000345] = 0x001fb4, + }, + [0x0003ae] = { + [0x000345] = 0x001fc4, + }, + [0x0003b1] = { + [0x000300] = 0x001f70, + [0x000301] = 0x0003ac, + [0x000304] = 0x001fb1, + [0x000306] = 0x001fb0, + [0x000313] = 0x001f00, + [0x000314] = 0x001f01, + [0x000342] = 0x001fb6, + [0x000345] = 0x001fb3, + }, + [0x0003b5] = { + [0x000300] = 0x001f72, + [0x000301] = 0x0003ad, + [0x000313] = 0x001f10, + [0x000314] = 0x001f11, + }, + [0x0003b7] = { + [0x000300] = 0x001f74, + [0x000301] = 0x0003ae, + [0x000313] = 0x001f20, + [0x000314] = 0x001f21, + [0x000342] = 0x001fc6, + [0x000345] = 0x001fc3, + }, + [0x0003b9] = { + [0x000300] = 0x001f76, + [0x000301] = 0x0003af, + [0x000304] = 0x001fd1, + [0x000306] = 0x001fd0, + [0x000308] = 0x0003ca, + [0x000313] = 0x001f30, + [0x000314] = 0x001f31, + [0x000342] = 0x001fd6, + }, + [0x0003bf] = { + [0x000300] = 0x001f78, + [0x000301] = 0x0003cc, + [0x000313] = 0x001f40, + [0x000314] = 0x001f41, + }, + [0x0003c1] = { + [0x000313] = 0x001fe4, + [0x000314] = 0x001fe5, + }, + [0x0003c5] = { + [0x000300] = 0x001f7a, + [0x000301] = 0x0003cd, + [0x000304] = 0x001fe1, + [0x000306] = 0x001fe0, + [0x000308] = 0x0003cb, + [0x000313] = 0x001f50, + [0x000314] = 0x001f51, + [0x000342] = 0x001fe6, + }, + [0x0003c9] = { + [0x000300] = 0x001f7c, + [0x000301] = 0x0003ce, + [0x000313] = 0x001f60, + [0x000314] = 0x001f61, + [0x000342] = 0x001ff6, + [0x000345] = 0x001ff3, + }, + [0x0003ca] = { + [0x000300] = 0x001fd2, + [0x000301] = 0x000390, + [0x000342] = 0x001fd7, + }, + [0x0003cb] = { + [0x000300] = 0x001fe2, + [0x000301] = 0x0003b0, + [0x000342] = 0x001fe7, + }, + [0x0003ce] = { + [0x000345] = 0x001ff4, + }, + [0x0003d2] = { + [0x000301] = 0x0003d3, + [0x000308] = 0x0003d4, + }, + [0x000406] = { + [0x000308] = 0x000407, + }, + [0x000410] = { + [0x000306] = 0x0004d0, + [0x000308] = 0x0004d2, + }, + [0x000413] = { + [0x000301] = 0x000403, + }, + [0x000415] = { + [0x000300] = 0x000400, + [0x000306] = 0x0004d6, + [0x000308] = 0x000401, + }, + [0x000416] = { + [0x000306] = 0x0004c1, + [0x000308] = 0x0004dc, + }, + [0x000417] = { + [0x000308] = 0x0004de, + }, + [0x000418] = { + [0x000300] = 0x00040d, + [0x000304] = 0x0004e2, + [0x000306] = 0x000419, + [0x000308] = 0x0004e4, + }, + [0x00041a] = { + [0x000301] = 0x00040c, + }, + [0x00041e] = { + [0x000308] = 0x0004e6, + }, + [0x000423] = { + [0x000304] = 0x0004ee, + [0x000306] = 0x00040e, + [0x000308] = 0x0004f0, + [0x00030b] = 0x0004f2, + }, + [0x000427] = { + [0x000308] = 0x0004f4, + }, + [0x00042b] = { + [0x000308] = 0x0004f8, + }, + [0x00042d] = { + [0x000308] = 0x0004ec, + }, + [0x000430] = { + [0x000306] = 0x0004d1, + [0x000308] = 0x0004d3, + }, + [0x000433] = { + [0x000301] = 0x000453, + }, + [0x000435] = { + [0x000300] = 0x000450, + [0x000306] = 0x0004d7, + [0x000308] = 0x000451, + }, + [0x000436] = { + [0x000306] = 0x0004c2, + [0x000308] = 0x0004dd, + }, + [0x000437] = { + [0x000308] = 0x0004df, + }, + [0x000438] = { + [0x000300] = 0x00045d, + [0x000304] = 0x0004e3, + [0x000306] = 0x000439, + [0x000308] = 0x0004e5, + }, + [0x00043a] = { + [0x000301] = 0x00045c, + }, + [0x00043e] = { + [0x000308] = 0x0004e7, + }, + [0x000443] = { + [0x000304] = 0x0004ef, + [0x000306] = 0x00045e, + [0x000308] = 0x0004f1, + [0x00030b] = 0x0004f3, + }, + [0x000447] = { + [0x000308] = 0x0004f5, + }, + [0x00044b] = { + [0x000308] = 0x0004f9, + }, + [0x00044d] = { + [0x000308] = 0x0004ed, + }, + [0x000456] = { + [0x000308] = 0x000457, + }, + [0x000474] = { + [0x00030f] = 0x000476, + }, + [0x000475] = { + [0x00030f] = 0x000477, + }, + [0x0004d8] = { + [0x000308] = 0x0004da, + }, + [0x0004d9] = { + [0x000308] = 0x0004db, + }, + [0x0004e8] = { + [0x000308] = 0x0004ea, + }, + [0x0004e9] = { + [0x000308] = 0x0004eb, + }, + [0x000627] = { + [0x000653] = 0x000622, + [0x000654] = 0x000623, + [0x000655] = 0x000625, + }, + [0x000648] = { + [0x000654] = 0x000624, + }, + [0x00064a] = { + [0x000654] = 0x000626, + }, + [0x0006c1] = { + [0x000654] = 0x0006c2, + }, + [0x0006d2] = { + [0x000654] = 0x0006d3, + }, + [0x0006d5] = { + [0x000654] = 0x0006c0, + }, + [0x000928] = { + [0x00093c] = 0x000929, + }, + [0x000930] = { + [0x00093c] = 0x000931, + }, + [0x000933] = { + [0x00093c] = 0x000934, + }, + [0x0009c7] = { + [0x0009be] = 0x0009cb, + [0x0009d7] = 0x0009cc, + }, + [0x000b47] = { + [0x000b3e] = 0x000b4b, + [0x000b56] = 0x000b48, + [0x000b57] = 0x000b4c, + }, + [0x000b92] = { + [0x000bd7] = 0x000b94, + }, + [0x000bc6] = { + [0x000bbe] = 0x000bca, + [0x000bd7] = 0x000bcc, + }, + [0x000bc7] = { + [0x000bbe] = 0x000bcb, + }, + [0x000c46] = { + [0x000c56] = 0x000c48, + }, + [0x000cbf] = { + [0x000cd5] = 0x000cc0, + }, + [0x000cc6] = { + [0x000cc2] = 0x000cca, + [0x000cd5] = 0x000cc7, + [0x000cd6] = 0x000cc8, + }, + [0x000cca] = { + [0x000cd5] = 0x000ccb, + }, + [0x000d46] = { + [0x000d3e] = 0x000d4a, + [0x000d57] = 0x000d4c, + }, + [0x000d47] = { + [0x000d3e] = 0x000d4b, + }, + [0x000dd9] = { + [0x000dca] = 0x000dda, + [0x000dcf] = 0x000ddc, + [0x000ddf] = 0x000dde, + }, + [0x000ddc] = { + [0x000dca] = 0x000ddd, + }, + [0x001025] = { + [0x00102e] = 0x001026, + }, + [0x001b05] = { + [0x001b35] = 0x001b06, + }, + [0x001b07] = { + [0x001b35] = 0x001b08, + }, + [0x001b09] = { + [0x001b35] = 0x001b0a, + }, + [0x001b0b] = { + [0x001b35] = 0x001b0c, + }, + [0x001b0d] = { + [0x001b35] = 0x001b0e, + }, + [0x001b11] = { + [0x001b35] = 0x001b12, + }, + [0x001b3a] = { + [0x001b35] = 0x001b3b, + }, + [0x001b3c] = { + [0x001b35] = 0x001b3d, + }, + [0x001b3e] = { + [0x001b35] = 0x001b40, + }, + [0x001b3f] = { + [0x001b35] = 0x001b41, + }, + [0x001b42] = { + [0x001b35] = 0x001b43, + }, + [0x001e36] = { + [0x000304] = 0x001e38, + }, + [0x001e37] = { + [0x000304] = 0x001e39, + }, + [0x001e5a] = { + [0x000304] = 0x001e5c, + }, + [0x001e5b] = { + [0x000304] = 0x001e5d, + }, + [0x001e62] = { + [0x000307] = 0x001e68, + }, + [0x001e63] = { + [0x000307] = 0x001e69, + }, + [0x001ea0] = { + [0x000302] = 0x001eac, + [0x000306] = 0x001eb6, + }, + [0x001ea1] = { + [0x000302] = 0x001ead, + [0x000306] = 0x001eb7, + }, + [0x001eb8] = { + [0x000302] = 0x001ec6, + }, + [0x001eb9] = { + [0x000302] = 0x001ec7, + }, + [0x001ecc] = { + [0x000302] = 0x001ed8, + }, + [0x001ecd] = { + [0x000302] = 0x001ed9, + }, + [0x001f00] = { + [0x000300] = 0x001f02, + [0x000301] = 0x001f04, + [0x000342] = 0x001f06, + [0x000345] = 0x001f80, + }, + [0x001f01] = { + [0x000300] = 0x001f03, + [0x000301] = 0x001f05, + [0x000342] = 0x001f07, + [0x000345] = 0x001f81, + }, + [0x001f02] = { + [0x000345] = 0x001f82, + }, + [0x001f03] = { + [0x000345] = 0x001f83, + }, + [0x001f04] = { + [0x000345] = 0x001f84, + }, + [0x001f05] = { + [0x000345] = 0x001f85, + }, + [0x001f06] = { + [0x000345] = 0x001f86, + }, + [0x001f07] = { + [0x000345] = 0x001f87, + }, + [0x001f08] = { + [0x000300] = 0x001f0a, + [0x000301] = 0x001f0c, + [0x000342] = 0x001f0e, + [0x000345] = 0x001f88, + }, + [0x001f09] = { + [0x000300] = 0x001f0b, + [0x000301] = 0x001f0d, + [0x000342] = 0x001f0f, + [0x000345] = 0x001f89, + }, + [0x001f0a] = { + [0x000345] = 0x001f8a, + }, + [0x001f0b] = { + [0x000345] = 0x001f8b, + }, + [0x001f0c] = { + [0x000345] = 0x001f8c, + }, + [0x001f0d] = { + [0x000345] = 0x001f8d, + }, + [0x001f0e] = { + [0x000345] = 0x001f8e, + }, + [0x001f0f] = { + [0x000345] = 0x001f8f, + }, + [0x001f10] = { + [0x000300] = 0x001f12, + [0x000301] = 0x001f14, + }, + [0x001f11] = { + [0x000300] = 0x001f13, + [0x000301] = 0x001f15, + }, + [0x001f18] = { + [0x000300] = 0x001f1a, + [0x000301] = 0x001f1c, + }, + [0x001f19] = { + [0x000300] = 0x001f1b, + [0x000301] = 0x001f1d, + }, + [0x001f20] = { + [0x000300] = 0x001f22, + [0x000301] = 0x001f24, + [0x000342] = 0x001f26, + [0x000345] = 0x001f90, + }, + [0x001f21] = { + [0x000300] = 0x001f23, + [0x000301] = 0x001f25, + [0x000342] = 0x001f27, + [0x000345] = 0x001f91, + }, + [0x001f22] = { + [0x000345] = 0x001f92, + }, + [0x001f23] = { + [0x000345] = 0x001f93, + }, + [0x001f24] = { + [0x000345] = 0x001f94, + }, + [0x001f25] = { + [0x000345] = 0x001f95, + }, + [0x001f26] = { + [0x000345] = 0x001f96, + }, + [0x001f27] = { + [0x000345] = 0x001f97, + }, + [0x001f28] = { + [0x000300] = 0x001f2a, + [0x000301] = 0x001f2c, + [0x000342] = 0x001f2e, + [0x000345] = 0x001f98, + }, + [0x001f29] = { + [0x000300] = 0x001f2b, + [0x000301] = 0x001f2d, + [0x000342] = 0x001f2f, + [0x000345] = 0x001f99, + }, + [0x001f2a] = { + [0x000345] = 0x001f9a, + }, + [0x001f2b] = { + [0x000345] = 0x001f9b, + }, + [0x001f2c] = { + [0x000345] = 0x001f9c, + }, + [0x001f2d] = { + [0x000345] = 0x001f9d, + }, + [0x001f2e] = { + [0x000345] = 0x001f9e, + }, + [0x001f2f] = { + [0x000345] = 0x001f9f, + }, + [0x001f30] = { + [0x000300] = 0x001f32, + [0x000301] = 0x001f34, + [0x000342] = 0x001f36, + }, + [0x001f31] = { + [0x000300] = 0x001f33, + [0x000301] = 0x001f35, + [0x000342] = 0x001f37, + }, + [0x001f38] = { + [0x000300] = 0x001f3a, + [0x000301] = 0x001f3c, + [0x000342] = 0x001f3e, + }, + [0x001f39] = { + [0x000300] = 0x001f3b, + [0x000301] = 0x001f3d, + [0x000342] = 0x001f3f, + }, + [0x001f40] = { + [0x000300] = 0x001f42, + [0x000301] = 0x001f44, + }, + [0x001f41] = { + [0x000300] = 0x001f43, + [0x000301] = 0x001f45, + }, + [0x001f48] = { + [0x000300] = 0x001f4a, + [0x000301] = 0x001f4c, + }, + [0x001f49] = { + [0x000300] = 0x001f4b, + [0x000301] = 0x001f4d, + }, + [0x001f50] = { + [0x000300] = 0x001f52, + [0x000301] = 0x001f54, + [0x000342] = 0x001f56, + }, + [0x001f51] = { + [0x000300] = 0x001f53, + [0x000301] = 0x001f55, + [0x000342] = 0x001f57, + }, + [0x001f59] = { + [0x000300] = 0x001f5b, + [0x000301] = 0x001f5d, + [0x000342] = 0x001f5f, + }, + [0x001f60] = { + [0x000300] = 0x001f62, + [0x000301] = 0x001f64, + [0x000342] = 0x001f66, + [0x000345] = 0x001fa0, + }, + [0x001f61] = { + [0x000300] = 0x001f63, + [0x000301] = 0x001f65, + [0x000342] = 0x001f67, + [0x000345] = 0x001fa1, + }, + [0x001f62] = { + [0x000345] = 0x001fa2, + }, + [0x001f63] = { + [0x000345] = 0x001fa3, + }, + [0x001f64] = { + [0x000345] = 0x001fa4, + }, + [0x001f65] = { + [0x000345] = 0x001fa5, + }, + [0x001f66] = { + [0x000345] = 0x001fa6, + }, + [0x001f67] = { + [0x000345] = 0x001fa7, + }, + [0x001f68] = { + [0x000300] = 0x001f6a, + [0x000301] = 0x001f6c, + [0x000342] = 0x001f6e, + [0x000345] = 0x001fa8, + }, + [0x001f69] = { + [0x000300] = 0x001f6b, + [0x000301] = 0x001f6d, + [0x000342] = 0x001f6f, + [0x000345] = 0x001fa9, + }, + [0x001f6a] = { + [0x000345] = 0x001faa, + }, + [0x001f6b] = { + [0x000345] = 0x001fab, + }, + [0x001f6c] = { + [0x000345] = 0x001fac, + }, + [0x001f6d] = { + [0x000345] = 0x001fad, + }, + [0x001f6e] = { + [0x000345] = 0x001fae, + }, + [0x001f6f] = { + [0x000345] = 0x001faf, + }, + [0x001f70] = { + [0x000345] = 0x001fb2, + }, + [0x001f74] = { + [0x000345] = 0x001fc2, + }, + [0x001f7c] = { + [0x000345] = 0x001ff2, + }, + [0x001fb6] = { + [0x000345] = 0x001fb7, + }, + [0x001fbf] = { + [0x000300] = 0x001fcd, + [0x000301] = 0x001fce, + [0x000342] = 0x001fcf, + }, + [0x001fc6] = { + [0x000345] = 0x001fc7, + }, + [0x001ff6] = { + [0x000345] = 0x001ff7, + }, + [0x001ffe] = { + [0x000300] = 0x001fdd, + [0x000301] = 0x001fde, + [0x000342] = 0x001fdf, + }, + [0x002190] = { + [0x000338] = 0x00219a, + }, + [0x002192] = { + [0x000338] = 0x00219b, + }, + [0x002194] = { + [0x000338] = 0x0021ae, + }, + [0x0021d0] = { + [0x000338] = 0x0021cd, + }, + [0x0021d2] = { + [0x000338] = 0x0021cf, + }, + [0x0021d4] = { + [0x000338] = 0x0021ce, + }, + [0x002203] = { + [0x000338] = 0x002204, + }, + [0x002208] = { + [0x000338] = 0x002209, + }, + [0x00220b] = { + [0x000338] = 0x00220c, + }, + [0x002223] = { + [0x000338] = 0x002224, + }, + [0x002225] = { + [0x000338] = 0x002226, + }, + [0x00223c] = { + [0x000338] = 0x002241, + }, + [0x002243] = { + [0x000338] = 0x002244, + }, + [0x002245] = { + [0x000338] = 0x002247, + }, + [0x002248] = { + [0x000338] = 0x002249, + }, + [0x00224d] = { + [0x000338] = 0x00226d, + }, + [0x002261] = { + [0x000338] = 0x002262, + }, + [0x002264] = { + [0x000338] = 0x002270, + }, + [0x002265] = { + [0x000338] = 0x002271, + }, + [0x002272] = { + [0x000338] = 0x002274, + }, + [0x002273] = { + [0x000338] = 0x002275, + }, + [0x002276] = { + [0x000338] = 0x002278, + }, + [0x002277] = { + [0x000338] = 0x002279, + }, + [0x00227a] = { + [0x000338] = 0x002280, + }, + [0x00227b] = { + [0x000338] = 0x002281, + }, + [0x00227c] = { + [0x000338] = 0x0022e0, + }, + [0x00227d] = { + [0x000338] = 0x0022e1, + }, + [0x002282] = { + [0x000338] = 0x002284, + }, + [0x002283] = { + [0x000338] = 0x002285, + }, + [0x002286] = { + [0x000338] = 0x002288, + }, + [0x002287] = { + [0x000338] = 0x002289, + }, + [0x002291] = { + [0x000338] = 0x0022e2, + }, + [0x002292] = { + [0x000338] = 0x0022e3, + }, + [0x0022a2] = { + [0x000338] = 0x0022ac, + }, + [0x0022a8] = { + [0x000338] = 0x0022ad, + }, + [0x0022a9] = { + [0x000338] = 0x0022ae, + }, + [0x0022ab] = { + [0x000338] = 0x0022af, + }, + [0x0022b2] = { + [0x000338] = 0x0022ea, + }, + [0x0022b3] = { + [0x000338] = 0x0022eb, + }, + [0x0022b4] = { + [0x000338] = 0x0022ec, + }, + [0x0022b5] = { + [0x000338] = 0x0022ed, + }, + [0x003046] = { + [0x003099] = 0x003094, + }, + [0x00304b] = { + [0x003099] = 0x00304c, + }, + [0x00304d] = { + [0x003099] = 0x00304e, + }, + [0x00304f] = { + [0x003099] = 0x003050, + }, + [0x003051] = { + [0x003099] = 0x003052, + }, + [0x003053] = { + [0x003099] = 0x003054, + }, + [0x003055] = { + [0x003099] = 0x003056, + }, + [0x003057] = { + [0x003099] = 0x003058, + }, + [0x003059] = { + [0x003099] = 0x00305a, + }, + [0x00305b] = { + [0x003099] = 0x00305c, + }, + [0x00305d] = { + [0x003099] = 0x00305e, + }, + [0x00305f] = { + [0x003099] = 0x003060, + }, + [0x003061] = { + [0x003099] = 0x003062, + }, + [0x003064] = { + [0x003099] = 0x003065, + }, + [0x003066] = { + [0x003099] = 0x003067, + }, + [0x003068] = { + [0x003099] = 0x003069, + }, + [0x00306f] = { + [0x003099] = 0x003070, + [0x00309a] = 0x003071, + }, + [0x003072] = { + [0x003099] = 0x003073, + [0x00309a] = 0x003074, + }, + [0x003075] = { + [0x003099] = 0x003076, + [0x00309a] = 0x003077, + }, + [0x003078] = { + [0x003099] = 0x003079, + [0x00309a] = 0x00307a, + }, + [0x00307b] = { + [0x003099] = 0x00307c, + [0x00309a] = 0x00307d, + }, + [0x00309d] = { + [0x003099] = 0x00309e, + }, + [0x0030a6] = { + [0x003099] = 0x0030f4, + }, + [0x0030ab] = { + [0x003099] = 0x0030ac, + }, + [0x0030ad] = { + [0x003099] = 0x0030ae, + }, + [0x0030af] = { + [0x003099] = 0x0030b0, + }, + [0x0030b1] = { + [0x003099] = 0x0030b2, + }, + [0x0030b3] = { + [0x003099] = 0x0030b4, + }, + [0x0030b5] = { + [0x003099] = 0x0030b6, + }, + [0x0030b7] = { + [0x003099] = 0x0030b8, + }, + [0x0030b9] = { + [0x003099] = 0x0030ba, + }, + [0x0030bb] = { + [0x003099] = 0x0030bc, + }, + [0x0030bd] = { + [0x003099] = 0x0030be, + }, + [0x0030bf] = { + [0x003099] = 0x0030c0, + }, + [0x0030c1] = { + [0x003099] = 0x0030c2, + }, + [0x0030c4] = { + [0x003099] = 0x0030c5, + }, + [0x0030c6] = { + [0x003099] = 0x0030c7, + }, + [0x0030c8] = { + [0x003099] = 0x0030c9, + }, + [0x0030cf] = { + [0x003099] = 0x0030d0, + [0x00309a] = 0x0030d1, + }, + [0x0030d2] = { + [0x003099] = 0x0030d3, + [0x00309a] = 0x0030d4, + }, + [0x0030d5] = { + [0x003099] = 0x0030d6, + [0x00309a] = 0x0030d7, + }, + [0x0030d8] = { + [0x003099] = 0x0030d9, + [0x00309a] = 0x0030da, + }, + [0x0030db] = { + [0x003099] = 0x0030dc, + [0x00309a] = 0x0030dd, + }, + [0x0030ef] = { + [0x003099] = 0x0030f7, + }, + [0x0030f0] = { + [0x003099] = 0x0030f8, + }, + [0x0030f1] = { + [0x003099] = 0x0030f9, + }, + [0x0030f2] = { + [0x003099] = 0x0030fa, + }, + [0x0030fd] = { + [0x003099] = 0x0030fe, + }, + [0x011099] = { + [0x0110ba] = 0x01109a, + }, + [0x01109b] = { + [0x0110ba] = 0x01109c, + }, + [0x0110a5] = { + [0x0110ba] = 0x0110ab, + }, + [0x011131] = { + [0x011127] = 0x01112e, + }, + [0x011132] = { + [0x011127] = 0x01112f, + }, + [0x011347] = { + [0x01133e] = 0x01134b, + [0x011357] = 0x01134c, + }, + [0x0114b9] = { + [0x0114b0] = 0x0114bc, + [0x0114ba] = 0x0114bb, + [0x0114bd] = 0x0114be, + }, + [0x0115b8] = { + [0x0115af] = 0x0115ba, + }, + [0x0115b9] = { + [0x0115af] = 0x0115bb, + }, + }, +} + +-- All combining characters need to be checked, so just do that +setmetatable( normal.check, { __index = normal.combclass } ) + +-- Handle Hangul to Jamo decomposition +setmetatable( normal.decomp, { __index = function ( _, k ) + if k >= 0xac00 and k <= 0xd7a3 then + -- Decompose a Hangul syllable into Jamo + k = k - 0xac00 + local ret = { + 0x1100 + math.floor( k / 588 ), + 0x1161 + math.floor( ( k % 588 ) / 28 ) + } + if k % 28 ~= 0 then + ret[3] = 0x11a7 + ( k % 28 ) + end + return ret + end + return nil +end } ) + +-- Handle Jamo to Hangul composition +local jamo_l_v_mt = { __index = function ( t, k ) + if k >= 0x1161 and k <= 0x1175 then + -- Jamo leading + Jamo vowel + return t.base + 28 * ( k - 0x1161 ) + end + return nil +end } +local hangul_jamo_mt = { __index = function ( t, k ) + if k >= 0x11a7 and k <= 0x11c2 then + -- Hangul + jamo final + return t.base + k - 0x11a7 + end + return nil +end } +setmetatable( normal.comp, { __index = function ( t, k ) + if k >= 0x1100 and k <= 0x1112 then + -- Jamo leading, return a second table that combines with a Jamo vowel + local t2 = { base = 0xac00 + 588 * ( k - 0x1100 ) } + setmetatable( t2, jamo_l_v_mt ) + t[k] = t2 -- cache it + return t2 + elseif k >= 0xac00 and k <= 0xd7a3 and k % 28 == 16 then + -- Hangul. "k % 28 == 16" picks out just the ones that are + -- Jamo leading + vowel, no final. Return a second table that combines + -- with a Jamo final. + local t2 = { base = k } + setmetatable( t2, hangul_jamo_mt ) + t[k] = t2 -- cache it + return t2 + end + return nil +end } ) + +-- Compatibility decomposition falls back to the normal decomposition +setmetatable( normal.decompK, { __index = normal.decomp } ) + +return normal diff --git a/ustring/string.lua b/ustring/string.lua new file mode 100644 index 0000000..1319e34 --- /dev/null +++ b/ustring/string.lua @@ -0,0 +1,15 @@ +string.isutf8 = ustring.isutf8 +string.byteoffset = ustring.byteoffset +string.codepoint = ustring.codepoint +string.gcodepoint = ustring.gcodepoint +string.toNFC = ustring.toNFC +string.toNFD = ustring.toNFD +string.uchar = ustring.char +string.ulen = ustring.len +string.usub = ustring.sub +string.uupper = ustring.upper +string.ulower = ustring.lower +string.ufind = ustring.find +string.umatch = ustring.match +string.ugmatch = ustring.gmatch +string.ugsub = ustring.gsub diff --git a/ustring/upper.lua b/ustring/upper.lua new file mode 100644 index 0000000..cfb0e15 --- /dev/null +++ b/ustring/upper.lua @@ -0,0 +1,715 @@ +-- This file is automatically generated by make-tables.php +return { + ["a"] = "A", + ["b"] = "B", + ["c"] = "C", + ["d"] = "D", + ["e"] = "E", + ["f"] = "F", + ["g"] = "G", + ["h"] = "H", + ["i"] = "I", + ["j"] = "J", + ["k"] = "K", + ["l"] = "L", + ["m"] = "M", + ["n"] = "N", + ["o"] = "O", + ["p"] = "P", + ["q"] = "Q", + ["r"] = "R", + ["s"] = "S", + ["t"] = "T", + ["u"] = "U", + ["v"] = "V", + ["w"] = "W", + ["x"] = "X", + ["y"] = "Y", + ["z"] = "Z", + ["µ"] = "Μ", + ["à"] = "À", + ["á"] = "Á", + ["â"] = "Â", + ["ã"] = "Ã", + ["ä"] = "Ä", + ["å"] = "Å", + ["æ"] = "Æ", + ["ç"] = "Ç", + ["è"] = "È", + ["é"] = "É", + ["ê"] = "Ê", + ["ë"] = "Ë", + ["ì"] = "Ì", + ["í"] = "Í", + ["î"] = "Î", + ["ï"] = "Ï", + ["ð"] = "Ð", + ["ñ"] = "Ñ", + ["ò"] = "Ò", + ["ó"] = "Ó", + ["ô"] = "Ô", + ["õ"] = "Õ", + ["ö"] = "Ö", + ["ø"] = "Ø", + ["ù"] = "Ù", + ["ú"] = "Ú", + ["û"] = "Û", + ["ü"] = "Ü", + ["ý"] = "Ý", + ["þ"] = "Þ", + ["ÿ"] = "Ÿ", + ["ā"] = "Ā", + ["ă"] = "Ă", + ["ą"] = "Ą", + ["ć"] = "Ć", + ["ĉ"] = "Ĉ", + ["ċ"] = "Ċ", + ["č"] = "Č", + ["ď"] = "Ď", + ["đ"] = "Đ", + ["ē"] = "Ē", + ["ĕ"] = "Ĕ", + ["ė"] = "Ė", + ["ę"] = "Ę", + ["ě"] = "Ě", + ["ĝ"] = "Ĝ", + ["ğ"] = "Ğ", + ["ġ"] = "Ġ", + ["ģ"] = "Ģ", + ["ĥ"] = "Ĥ", + ["ħ"] = "Ħ", + ["ĩ"] = "Ĩ", + ["ī"] = "Ī", + ["ĭ"] = "Ĭ", + ["į"] = "Į", + ["ı"] = "I", + ["ij"] = "IJ", + ["ĵ"] = "Ĵ", + ["ķ"] = "Ķ", + ["ĺ"] = "Ĺ", + ["ļ"] = "Ļ", + ["ľ"] = "Ľ", + ["ŀ"] = "Ŀ", + ["ł"] = "Ł", + ["ń"] = "Ń", + ["ņ"] = "Ņ", + ["ň"] = "Ň", + ["ŋ"] = "Ŋ", + ["ō"] = "Ō", + ["ŏ"] = "Ŏ", + ["ő"] = "Ő", + ["œ"] = "Œ", + ["ŕ"] = "Ŕ", + ["ŗ"] = "Ŗ", + ["ř"] = "Ř", + ["ś"] = "Ś", + ["ŝ"] = "Ŝ", + ["ş"] = "Ş", + ["š"] = "Š", + ["ţ"] = "Ţ", + ["ť"] = "Ť", + ["ŧ"] = "Ŧ", + ["ũ"] = "Ũ", + ["ū"] = "Ū", + ["ŭ"] = "Ŭ", + ["ů"] = "Ů", + ["ű"] = "Ű", + ["ų"] = "Ų", + ["ŵ"] = "Ŵ", + ["ŷ"] = "Ŷ", + ["ź"] = "Ź", + ["ż"] = "Ż", + ["ž"] = "Ž", + ["ſ"] = "S", + ["ƃ"] = "Ƃ", + ["ƅ"] = "Ƅ", + ["ƈ"] = "Ƈ", + ["ƌ"] = "Ƌ", + ["ƒ"] = "Ƒ", + ["ƕ"] = "Ƕ", + ["ƙ"] = "Ƙ", + ["ƞ"] = "Ƞ", + ["ơ"] = "Ơ", + ["ƣ"] = "Ƣ", + ["ƥ"] = "Ƥ", + ["ƨ"] = "Ƨ", + ["ƭ"] = "Ƭ", + ["ư"] = "Ư", + ["ƴ"] = "Ƴ", + ["ƶ"] = "Ƶ", + ["ƹ"] = "Ƹ", + ["ƽ"] = "Ƽ", + ["ƿ"] = "Ƿ", + ["dž"] = "Dž", + ["lj"] = "Lj", + ["nj"] = "Nj", + ["ǎ"] = "Ǎ", + ["ǐ"] = "Ǐ", + ["ǒ"] = "Ǒ", + ["ǔ"] = "Ǔ", + ["ǖ"] = "Ǖ", + ["ǘ"] = "Ǘ", + ["ǚ"] = "Ǚ", + ["ǜ"] = "Ǜ", + ["ǝ"] = "Ǝ", + ["ǟ"] = "Ǟ", + ["ǡ"] = "Ǡ", + ["ǣ"] = "Ǣ", + ["ǥ"] = "Ǥ", + ["ǧ"] = "Ǧ", + ["ǩ"] = "Ǩ", + ["ǫ"] = "Ǫ", + ["ǭ"] = "Ǭ", + ["ǯ"] = "Ǯ", + ["dz"] = "Dz", + ["ǵ"] = "Ǵ", + ["ǹ"] = "Ǹ", + ["ǻ"] = "Ǻ", + ["ǽ"] = "Ǽ", + ["ǿ"] = "Ǿ", + ["ȁ"] = "Ȁ", + ["ȃ"] = "Ȃ", + ["ȅ"] = "Ȅ", + ["ȇ"] = "Ȇ", + ["ȉ"] = "Ȉ", + ["ȋ"] = "Ȋ", + ["ȍ"] = "Ȍ", + ["ȏ"] = "Ȏ", + ["ȑ"] = "Ȑ", + ["ȓ"] = "Ȓ", + ["ȕ"] = "Ȕ", + ["ȗ"] = "Ȗ", + ["ș"] = "Ș", + ["ț"] = "Ț", + ["ȝ"] = "Ȝ", + ["ȟ"] = "Ȟ", + ["ȣ"] = "Ȣ", + ["ȥ"] = "Ȥ", + ["ȧ"] = "Ȧ", + ["ȩ"] = "Ȩ", + ["ȫ"] = "Ȫ", + ["ȭ"] = "Ȭ", + ["ȯ"] = "Ȯ", + ["ȱ"] = "Ȱ", + ["ȳ"] = "Ȳ", + ["ɓ"] = "Ɓ", + ["ɔ"] = "Ɔ", + ["ɖ"] = "Ɖ", + ["ɗ"] = "Ɗ", + ["ə"] = "Ə", + ["ɛ"] = "Ɛ", + ["ɠ"] = "Ɠ", + ["ɣ"] = "Ɣ", + ["ɨ"] = "Ɨ", + ["ɩ"] = "Ɩ", + ["ɯ"] = "Ɯ", + ["ɲ"] = "Ɲ", + ["ɵ"] = "Ɵ", + ["ʀ"] = "Ʀ", + ["ʃ"] = "Ʃ", + ["ʈ"] = "Ʈ", + ["ʊ"] = "Ʊ", + ["ʋ"] = "Ʋ", + ["ʒ"] = "Ʒ", + ["ά"] = "Ά", + ["έ"] = "Έ", + ["ή"] = "Ή", + ["ί"] = "Ί", + ["α"] = "Α", + ["β"] = "Β", + ["γ"] = "Γ", + ["δ"] = "Δ", + ["ε"] = "Ε", + ["ζ"] = "Ζ", + ["η"] = "Η", + ["θ"] = "Θ", + ["ι"] = "Ι", + ["κ"] = "Κ", + ["λ"] = "Λ", + ["μ"] = "Μ", + ["ν"] = "Ν", + ["ξ"] = "Ξ", + ["ο"] = "Ο", + ["π"] = "Π", + ["ρ"] = "Ρ", + ["ς"] = "Σ", + ["σ"] = "Σ", + ["τ"] = "Τ", + ["υ"] = "Υ", + ["φ"] = "Φ", + ["χ"] = "Χ", + ["ψ"] = "Ψ", + ["ω"] = "Ω", + ["ϊ"] = "Ϊ", + ["ϋ"] = "Ϋ", + ["ό"] = "Ό", + ["ύ"] = "Ύ", + ["ώ"] = "Ώ", + ["ϐ"] = "Β", + ["ϑ"] = "Θ", + ["ϕ"] = "Φ", + ["ϖ"] = "Π", + ["ϙ"] = "Ϙ", + ["ϛ"] = "Ϛ", + ["ϝ"] = "Ϝ", + ["ϟ"] = "Ϟ", + ["ϡ"] = "Ϡ", + ["ϣ"] = "Ϣ", + ["ϥ"] = "Ϥ", + ["ϧ"] = "Ϧ", + ["ϩ"] = "Ϩ", + ["ϫ"] = "Ϫ", + ["ϭ"] = "Ϭ", + ["ϯ"] = "Ϯ", + ["ϰ"] = "Κ", + ["ϱ"] = "Ρ", + ["ϲ"] = "Σ", + ["ϵ"] = "Ε", + ["а"] = "А", + ["б"] = "Б", + ["в"] = "В", + ["г"] = "Г", + ["д"] = "Д", + ["е"] = "Е", + ["ж"] = "Ж", + ["з"] = "З", + ["и"] = "И", + ["й"] = "Й", + ["к"] = "К", + ["л"] = "Л", + ["м"] = "М", + ["н"] = "Н", + ["о"] = "О", + ["п"] = "П", + ["р"] = "Р", + ["с"] = "С", + ["т"] = "Т", + ["у"] = "У", + ["ф"] = "Ф", + ["х"] = "Х", + ["ц"] = "Ц", + ["ч"] = "Ч", + ["ш"] = "Ш", + ["щ"] = "Щ", + ["ъ"] = "Ъ", + ["ы"] = "Ы", + ["ь"] = "Ь", + ["э"] = "Э", + ["ю"] = "Ю", + ["я"] = "Я", + ["ѐ"] = "Ѐ", + ["ё"] = "Ё", + ["ђ"] = "Ђ", + ["ѓ"] = "Ѓ", + ["є"] = "Є", + ["ѕ"] = "Ѕ", + ["і"] = "І", + ["ї"] = "Ї", + ["ј"] = "Ј", + ["љ"] = "Љ", + ["њ"] = "Њ", + ["ћ"] = "Ћ", + ["ќ"] = "Ќ", + ["ѝ"] = "Ѝ", + ["ў"] = "Ў", + ["џ"] = "Џ", + ["ѡ"] = "Ѡ", + ["ѣ"] = "Ѣ", + ["ѥ"] = "Ѥ", + ["ѧ"] = "Ѧ", + ["ѩ"] = "Ѩ", + ["ѫ"] = "Ѫ", + ["ѭ"] = "Ѭ", + ["ѯ"] = "Ѯ", + ["ѱ"] = "Ѱ", + ["ѳ"] = "Ѳ", + ["ѵ"] = "Ѵ", + ["ѷ"] = "Ѷ", + ["ѹ"] = "Ѹ", + ["ѻ"] = "Ѻ", + ["ѽ"] = "Ѽ", + ["ѿ"] = "Ѿ", + ["ҁ"] = "Ҁ", + ["ҋ"] = "Ҋ", + ["ҍ"] = "Ҍ", + ["ҏ"] = "Ҏ", + ["ґ"] = "Ґ", + ["ғ"] = "Ғ", + ["ҕ"] = "Ҕ", + ["җ"] = "Җ", + ["ҙ"] = "Ҙ", + ["қ"] = "Қ", + ["ҝ"] = "Ҝ", + ["ҟ"] = "Ҟ", + ["ҡ"] = "Ҡ", + ["ң"] = "Ң", + ["ҥ"] = "Ҥ", + ["ҧ"] = "Ҧ", + ["ҩ"] = "Ҩ", + ["ҫ"] = "Ҫ", + ["ҭ"] = "Ҭ", + ["ү"] = "Ү", + ["ұ"] = "Ұ", + ["ҳ"] = "Ҳ", + ["ҵ"] = "Ҵ", + ["ҷ"] = "Ҷ", + ["ҹ"] = "Ҹ", + ["һ"] = "Һ", + ["ҽ"] = "Ҽ", + ["ҿ"] = "Ҿ", + ["ӂ"] = "Ӂ", + ["ӄ"] = "Ӄ", + ["ӆ"] = "Ӆ", + ["ӈ"] = "Ӈ", + ["ӊ"] = "Ӊ", + ["ӌ"] = "Ӌ", + ["ӎ"] = "Ӎ", + ["ӑ"] = "Ӑ", + ["ӓ"] = "Ӓ", + ["ӕ"] = "Ӕ", + ["ӗ"] = "Ӗ", + ["ә"] = "Ә", + ["ӛ"] = "Ӛ", + ["ӝ"] = "Ӝ", + ["ӟ"] = "Ӟ", + ["ӡ"] = "Ӡ", + ["ӣ"] = "Ӣ", + ["ӥ"] = "Ӥ", + ["ӧ"] = "Ӧ", + ["ө"] = "Ө", + ["ӫ"] = "Ӫ", + ["ӭ"] = "Ӭ", + ["ӯ"] = "Ӯ", + ["ӱ"] = "Ӱ", + ["ӳ"] = "Ӳ", + ["ӵ"] = "Ӵ", + ["ӹ"] = "Ӹ", + ["ԁ"] = "Ԁ", + ["ԃ"] = "Ԃ", + ["ԅ"] = "Ԅ", + ["ԇ"] = "Ԇ", + ["ԉ"] = "Ԉ", + ["ԋ"] = "Ԋ", + ["ԍ"] = "Ԍ", + ["ԏ"] = "Ԏ", + ["ա"] = "Ա", + ["բ"] = "Բ", + ["գ"] = "Գ", + ["դ"] = "Դ", + ["ե"] = "Ե", + ["զ"] = "Զ", + ["է"] = "Է", + ["ը"] = "Ը", + ["թ"] = "Թ", + ["ժ"] = "Ժ", + ["ի"] = "Ի", + ["լ"] = "Լ", + ["խ"] = "Խ", + ["ծ"] = "Ծ", + ["կ"] = "Կ", + ["հ"] = "Հ", + ["ձ"] = "Ձ", + ["ղ"] = "Ղ", + ["ճ"] = "Ճ", + ["մ"] = "Մ", + ["յ"] = "Յ", + ["ն"] = "Ն", + ["շ"] = "Շ", + ["ո"] = "Ո", + ["չ"] = "Չ", + ["պ"] = "Պ", + ["ջ"] = "Ջ", + ["ռ"] = "Ռ", + ["ս"] = "Ս", + ["վ"] = "Վ", + ["տ"] = "Տ", + ["ր"] = "Ր", + ["ց"] = "Ց", + ["ւ"] = "Ւ", + ["փ"] = "Փ", + ["ք"] = "Ք", + ["օ"] = "Օ", + ["ֆ"] = "Ֆ", + ["ḁ"] = "Ḁ", + ["ḃ"] = "Ḃ", + ["ḅ"] = "Ḅ", + ["ḇ"] = "Ḇ", + ["ḉ"] = "Ḉ", + ["ḋ"] = "Ḋ", + ["ḍ"] = "Ḍ", + ["ḏ"] = "Ḏ", + ["ḑ"] = "Ḑ", + ["ḓ"] = "Ḓ", + ["ḕ"] = "Ḕ", + ["ḗ"] = "Ḗ", + ["ḙ"] = "Ḙ", + ["ḛ"] = "Ḛ", + ["ḝ"] = "Ḝ", + ["ḟ"] = "Ḟ", + ["ḡ"] = "Ḡ", + ["ḣ"] = "Ḣ", + ["ḥ"] = "Ḥ", + ["ḧ"] = "Ḧ", + ["ḩ"] = "Ḩ", + ["ḫ"] = "Ḫ", + ["ḭ"] = "Ḭ", + ["ḯ"] = "Ḯ", + ["ḱ"] = "Ḱ", + ["ḳ"] = "Ḳ", + ["ḵ"] = "Ḵ", + ["ḷ"] = "Ḷ", + ["ḹ"] = "Ḹ", + ["ḻ"] = "Ḻ", + ["ḽ"] = "Ḽ", + ["ḿ"] = "Ḿ", + ["ṁ"] = "Ṁ", + ["ṃ"] = "Ṃ", + ["ṅ"] = "Ṅ", + ["ṇ"] = "Ṇ", + ["ṉ"] = "Ṉ", + ["ṋ"] = "Ṋ", + ["ṍ"] = "Ṍ", + ["ṏ"] = "Ṏ", + ["ṑ"] = "Ṑ", + ["ṓ"] = "Ṓ", + ["ṕ"] = "Ṕ", + ["ṗ"] = "Ṗ", + ["ṙ"] = "Ṙ", + ["ṛ"] = "Ṛ", + ["ṝ"] = "Ṝ", + ["ṟ"] = "Ṟ", + ["ṡ"] = "Ṡ", + ["ṣ"] = "Ṣ", + ["ṥ"] = "Ṥ", + ["ṧ"] = "Ṧ", + ["ṩ"] = "Ṩ", + ["ṫ"] = "Ṫ", + ["ṭ"] = "Ṭ", + ["ṯ"] = "Ṯ", + ["ṱ"] = "Ṱ", + ["ṳ"] = "Ṳ", + ["ṵ"] = "Ṵ", + ["ṷ"] = "Ṷ", + ["ṹ"] = "Ṹ", + ["ṻ"] = "Ṻ", + ["ṽ"] = "Ṽ", + ["ṿ"] = "Ṿ", + ["ẁ"] = "Ẁ", + ["ẃ"] = "Ẃ", + ["ẅ"] = "Ẅ", + ["ẇ"] = "Ẇ", + ["ẉ"] = "Ẉ", + ["ẋ"] = "Ẋ", + ["ẍ"] = "Ẍ", + ["ẏ"] = "Ẏ", + ["ẑ"] = "Ẑ", + ["ẓ"] = "Ẓ", + ["ẕ"] = "Ẕ", + ["ẛ"] = "Ṡ", + ["ạ"] = "Ạ", + ["ả"] = "Ả", + ["ấ"] = "Ấ", + ["ầ"] = "Ầ", + ["ẩ"] = "Ẩ", + ["ẫ"] = "Ẫ", + ["ậ"] = "Ậ", + ["ắ"] = "Ắ", + ["ằ"] = "Ằ", + ["ẳ"] = "Ẳ", + ["ẵ"] = "Ẵ", + ["ặ"] = "Ặ", + ["ẹ"] = "Ẹ", + ["ẻ"] = "Ẻ", + ["ẽ"] = "Ẽ", + ["ế"] = "Ế", + ["ề"] = "Ề", + ["ể"] = "Ể", + ["ễ"] = "Ễ", + ["ệ"] = "Ệ", + ["ỉ"] = "Ỉ", + ["ị"] = "Ị", + ["ọ"] = "Ọ", + ["ỏ"] = "Ỏ", + ["ố"] = "Ố", + ["ồ"] = "Ồ", + ["ổ"] = "Ổ", + ["ỗ"] = "Ỗ", + ["ộ"] = "Ộ", + ["ớ"] = "Ớ", + ["ờ"] = "Ờ", + ["ở"] = "Ở", + ["ỡ"] = "Ỡ", + ["ợ"] = "Ợ", + ["ụ"] = "Ụ", + ["ủ"] = "Ủ", + ["ứ"] = "Ứ", + ["ừ"] = "Ừ", + ["ử"] = "Ử", + ["ữ"] = "Ữ", + ["ự"] = "Ự", + ["ỳ"] = "Ỳ", + ["ỵ"] = "Ỵ", + ["ỷ"] = "Ỷ", + ["ỹ"] = "Ỹ", + ["ἀ"] = "Ἀ", + ["ἁ"] = "Ἁ", + ["ἂ"] = "Ἂ", + ["ἃ"] = "Ἃ", + ["ἄ"] = "Ἄ", + ["ἅ"] = "Ἅ", + ["ἆ"] = "Ἆ", + ["ἇ"] = "Ἇ", + ["ἐ"] = "Ἐ", + ["ἑ"] = "Ἑ", + ["ἒ"] = "Ἒ", + ["ἓ"] = "Ἓ", + ["ἔ"] = "Ἔ", + ["ἕ"] = "Ἕ", + ["ἠ"] = "Ἠ", + ["ἡ"] = "Ἡ", + ["ἢ"] = "Ἢ", + ["ἣ"] = "Ἣ", + ["ἤ"] = "Ἤ", + ["ἥ"] = "Ἥ", + ["ἦ"] = "Ἦ", + ["ἧ"] = "Ἧ", + ["ἰ"] = "Ἰ", + ["ἱ"] = "Ἱ", + ["ἲ"] = "Ἲ", + ["ἳ"] = "Ἳ", + ["ἴ"] = "Ἴ", + ["ἵ"] = "Ἵ", + ["ἶ"] = "Ἶ", + ["ἷ"] = "Ἷ", + ["ὀ"] = "Ὀ", + ["ὁ"] = "Ὁ", + ["ὂ"] = "Ὂ", + ["ὃ"] = "Ὃ", + ["ὄ"] = "Ὄ", + ["ὅ"] = "Ὅ", + ["ὑ"] = "Ὑ", + ["ὓ"] = "Ὓ", + ["ὕ"] = "Ὕ", + ["ὗ"] = "Ὗ", + ["ὠ"] = "Ὠ", + ["ὡ"] = "Ὡ", + ["ὢ"] = "Ὢ", + ["ὣ"] = "Ὣ", + ["ὤ"] = "Ὤ", + ["ὥ"] = "Ὥ", + ["ὦ"] = "Ὦ", + ["ὧ"] = "Ὧ", + ["ὰ"] = "Ὰ", + ["ά"] = "Ά", + ["ὲ"] = "Ὲ", + ["έ"] = "Έ", + ["ὴ"] = "Ὴ", + ["ή"] = "Ή", + ["ὶ"] = "Ὶ", + ["ί"] = "Ί", + ["ὸ"] = "Ὸ", + ["ό"] = "Ό", + ["ὺ"] = "Ὺ", + ["ύ"] = "Ύ", + ["ὼ"] = "Ὼ", + ["ώ"] = "Ώ", + ["ᾀ"] = "ᾈ", + ["ᾁ"] = "ᾉ", + ["ᾂ"] = "ᾊ", + ["ᾃ"] = "ᾋ", + ["ᾄ"] = "ᾌ", + ["ᾅ"] = "ᾍ", + ["ᾆ"] = "ᾎ", + ["ᾇ"] = "ᾏ", + ["ᾐ"] = "ᾘ", + ["ᾑ"] = "ᾙ", + ["ᾒ"] = "ᾚ", + ["ᾓ"] = "ᾛ", + ["ᾔ"] = "ᾜ", + ["ᾕ"] = "ᾝ", + ["ᾖ"] = "ᾞ", + ["ᾗ"] = "ᾟ", + ["ᾠ"] = "ᾨ", + ["ᾡ"] = "ᾩ", + ["ᾢ"] = "ᾪ", + ["ᾣ"] = "ᾫ", + ["ᾤ"] = "ᾬ", + ["ᾥ"] = "ᾭ", + ["ᾦ"] = "ᾮ", + ["ᾧ"] = "ᾯ", + ["ᾰ"] = "Ᾰ", + ["ᾱ"] = "Ᾱ", + ["ᾳ"] = "ᾼ", + ["ι"] = "Ι", + ["ῃ"] = "ῌ", + ["ῐ"] = "Ῐ", + ["ῑ"] = "Ῑ", + ["ῠ"] = "Ῠ", + ["ῡ"] = "Ῡ", + ["ῥ"] = "Ῥ", + ["ῳ"] = "ῼ", + ["a"] = "A", + ["b"] = "B", + ["c"] = "C", + ["d"] = "D", + ["e"] = "E", + ["f"] = "F", + ["g"] = "G", + ["h"] = "H", + ["i"] = "I", + ["j"] = "J", + ["k"] = "K", + ["l"] = "L", + ["m"] = "M", + ["n"] = "N", + ["o"] = "O", + ["p"] = "P", + ["q"] = "Q", + ["r"] = "R", + ["s"] = "S", + ["t"] = "T", + ["u"] = "U", + ["v"] = "V", + ["w"] = "W", + ["x"] = "X", + ["y"] = "Y", + ["z"] = "Z", + ["𐐨"] = "𐐀", + ["𐐩"] = "𐐁", + ["𐐪"] = "𐐂", + ["𐐫"] = "𐐃", + ["𐐬"] = "𐐄", + ["𐐭"] = "𐐅", + ["𐐮"] = "𐐆", + ["𐐯"] = "𐐇", + ["𐐰"] = "𐐈", + ["𐐱"] = "𐐉", + ["𐐲"] = "𐐊", + ["𐐳"] = "𐐋", + ["𐐴"] = "𐐌", + ["𐐵"] = "𐐍", + ["𐐶"] = "𐐎", + ["𐐷"] = "𐐏", + ["𐐸"] = "𐐐", + ["𐐹"] = "𐐑", + ["𐐺"] = "𐐒", + ["𐐻"] = "𐐓", + ["𐐼"] = "𐐔", + ["𐐽"] = "𐐕", + ["𐐾"] = "𐐖", + ["𐐿"] = "𐐗", + ["𐑀"] = "𐐘", + ["𐑁"] = "𐐙", + ["𐑂"] = "𐐚", + ["𐑃"] = "𐐛", + ["𐑄"] = "𐐜", + ["𐑅"] = "𐐝", + ["𐑆"] = "𐐞", + ["𐑇"] = "𐐟", + ["𐑈"] = "𐐠", + ["𐑉"] = "𐐡", + ["𐑊"] = "𐐢", + ["𐑋"] = "𐐣", + ["𐑌"] = "𐐤", + ["𐑍"] = "𐐥", +} diff --git a/ustring/ustring.lua b/ustring/ustring.lua new file mode 100644 index 0000000..6b86e48 --- /dev/null +++ b/ustring/ustring.lua @@ -0,0 +1,1260 @@ +local ustring = {} + +-- Copy these, just in case +local S = { + byte = string.byte, + char = string.char, + len = string.len, + sub = string.sub, + find = string.find, + match = string.match, + gmatch = string.gmatch, + gsub = string.gsub, + format = string.format, +} + +---- Configuration ---- +-- To limit the length of strings or patterns processed, set these +ustring.maxStringLength = math.huge +ustring.maxPatternLength = math.huge + +---- Utility functions ---- + +local function checkType( name, argidx, arg, expecttype, nilok ) + if arg == nil and nilok then + return + end + if type( arg ) ~= expecttype then + local msg = S.format( "bad argument #%d to '%s' (%s expected, got %s)", + argidx, name, expecttype, type( arg ) + ) + error( msg, 3 ) + end +end + +local function checkString( name, s ) + if type( s ) == 'number' then + s = tostring( s ) + end + if type( s ) ~= 'string' then + local msg = S.format( "bad argument #1 to '%s' (string expected, got %s)", + name, type( s ) + ) + error( msg, 3 ) + end + if S.len( s ) > ustring.maxStringLength then + local msg = S.format( "bad argument #1 to '%s' (string is longer than %d bytes)", + name, ustring.maxStringLength + ) + error( msg, 3 ) + end +end + +local function checkPattern( name, pattern ) + if type( pattern ) == 'number' then + pattern = tostring( pattern ) + end + if type( pattern ) ~= 'string' then + local msg = S.format( "bad argument #2 to '%s' (string expected, got %s)", + name, type( pattern ) + ) + error( msg, 3 ) + end + if S.len( pattern ) > ustring.maxPatternLength then + local msg = S.format( "bad argument #2 to '%s' (pattern is longer than %d bytes)", + name, ustring.maxPatternLength + ) + error( msg, 3 ) + end +end + +local utf8_explode_cache_string = nil; -- 09-12-2022: cache string +local utf8_explode_cache_table = nil; -- 09-12-2022: cache table +-- A private helper that splits a string into codepoints, and also collects the +-- starting position of each character and the total length in codepoints. +-- +-- @param s string utf8-encoded string to decode +-- @return table +local function utf8_explode( s )-- 09-12-2022: improved performance by using variable bytes set with all bytes of the string in one shot and last string/table cache + if (s == utf8_explode_cache_string) then -- 09-12-2022: same as last string? + return utf8_explode_cache_table; -- 09-12-2022: reuse last table + end + + local ret = { + len = 0, + codepoints = {}, + bytepos = {}, + } + + local i = 1 + local bytes = {S.byte(s, 1, -1)} -- 09-12-2022: bytes is set with all bytes of the string in one shot + local l = #bytes + local cp, b, b2, trail + local min + while i <= l do + b = bytes[i] -- 09-12-2022: retrieve byte in position i + if b < 0x80 then + -- 1-byte code point, 00-7F + cp = b + trail = 0 + min = 0 + elseif b < 0xc2 then + -- Either a non-initial code point (invalid here) or + -- an overlong encoding for a 1-byte code point + return nil + elseif b < 0xe0 then + -- 2-byte code point, C2-DF + trail = 1 + cp = b - 0xc0 + min = 0x80 + elseif b < 0xf0 then + -- 3-byte code point, E0-EF + trail = 2 + cp = b - 0xe0 + min = 0x800 + elseif b < 0xf4 then + -- 4-byte code point, F0-F3 + trail = 3 + cp = b - 0xf0 + min = 0x10000 + elseif b == 0xf4 then + -- 4-byte code point, F4 + -- Make sure it doesn't decode to over U+10FFFF + if bytes[i + 1] > 0x8f then -- 09-12-2022: retrieve byte in position i + 1 + return nil + end + trail = 3 + cp = 4 + min = 0x100000 + else + -- Code point over U+10FFFF, or invalid byte + return nil + end + + -- Check subsequent bytes for multibyte code points + for j = i + 1, i + trail do + b = bytes[j] -- 09-12-2022: retrieve byte in position j + if not b or b < 0x80 or b > 0xbf then + return nil + end + cp = cp * 0x40 + b - 0x80 + end + if cp < min then + -- Overlong encoding + return nil + end + + ret.codepoints[#ret.codepoints + 1] = cp + ret.bytepos[#ret.bytepos + 1] = i + ret.len = ret.len + 1 + i = i + 1 + trail + end + + -- Two past the end (for sub with empty string) + ret.bytepos[#ret.bytepos + 1] = l + 1 + ret.bytepos[#ret.bytepos + 1] = l + 1 + + utf8_explode_cache_string = s; -- 09-12-2022: store last string + utf8_explode_cache_table = ret; -- 09-12-2022: store last table + return ret +end + +-- A private helper that finds the character offset for a byte offset. +-- +-- @param cps table from utf8_explode +-- @param i int byte offset +-- @return int +local function cpoffset( cps, i ) + local min, max, p = 0, cps.len + 1 + if i == 0 then + return 0 + end + while min + 1 < max do + p = math.floor( ( min + max ) / 2 ) + 1 + if cps.bytepos[p] <= i then + min = p - 1 + end + if cps.bytepos[p] >= i then + max = p - 1 + end + end + return min + 1 +end + +---- Trivial functions ---- +-- These functions are the same as the standard string versions + +ustring.byte = string.byte +ustring.format = string.format +ustring.rep = string.rep + +---- Non-trivial functions ---- +-- These functions actually have to be UTF-8 aware + + +-- Determine if a string is valid UTF-8 +-- +-- @param s string +-- @return boolean +function ustring.isutf8( s ) + checkString( 'isutf8', s ) + return utf8_explode( s ) ~= nil +end + +-- Return the byte offset of a character in a string +-- +-- @param s string +-- @param l int codepoint number [default 1] +-- @param i int starting byte offset [default 1] +-- @return int|nil +function ustring.byteoffset( s, l, i ) + checkString( 'byteoffset', s ) + checkType( 'byteoffset', 2, l, 'number', true ) + checkType( 'byteoffset', 3, i, 'number', true ) + local cps = utf8_explode( s ) + if cps == nil then + error( "bad argument #1 for 'byteoffset' (string is not UTF-8)", 2 ) + end + + i = i or 1 + if i < 0 then + i = S.len( s ) + i + 1 + end + if i < 1 or i > S.len( s ) then + return nil + end + local p = cpoffset( cps, i ) + if l > 0 and cps.bytepos[p] == i then + l = l - 1 + end + if p + l > cps.len then + return nil + end + return cps.bytepos[p + l] +end + +-- Return codepoints from a string +-- +-- @see string.byte +-- @param s string +-- @param i int Starting character [default 1] +-- @param j int Ending character [default i] +-- @return int* Zero or more codepoints +function ustring.codepoint( s, i, j ) + checkString( 'codepoint', s ) + checkType( 'codepoint', 2, i, 'number', true ) + checkType( 'codepoint', 3, j, 'number', true ) + local cps = utf8_explode( s ) + if cps == nil then + error( "bad argument #1 for 'codepoint' (string is not UTF-8)", 2 ) + end + i = i or 1 + if i < 0 then + i = cps.len + i + 1 + end + j = j or i + if j < 0 then + j = cps.len + j + 1 + end + if j < i then + return -- empty result set + end + i = math.max( 1, math.min( i, cps.len + 1 ) ) + j = math.max( 1, math.min( j, cps.len + 1 ) ) + return unpack( cps.codepoints, i, j ) +end + +-- Return an iterator over the codepoint (as integers) +-- for cp in ustring.gcodepoint( s ) do ... end +-- +-- @param s string +-- @param i int Starting character [default 1] +-- @param j int Ending character [default -1] +-- @return function +-- @return nil +-- @return nil +function ustring.gcodepoint( s, i, j ) + checkString( 'gcodepoint', s ) + checkType( 'gcodepoint', 2, i, 'number', true ) + checkType( 'gcodepoint', 3, j, 'number', true ) + local cps = utf8_explode( s ) + if cps == nil then + error( "bad argument #1 for 'gcodepoint' (string is not UTF-8)", 2 ) + end + i = i or 1 + if i < 0 then + i = cps.len + i + 1 + end + j = j or -1 + if j < 0 then + j = cps.len + j + 1 + end + if j < i then + return function () + return nil + end + end + i = math.max( 1, math.min( i, cps.len + 1 ) ) + j = math.max( 1, math.min( j, cps.len + 1 ) ) + return function () + if i <= j then + local ret = cps.codepoints[i] + i = i + 1 + return ret + end + return nil + end +end + +-- Convert codepoints to a string +-- +-- @see string.char +-- @param ... int List of codepoints +-- @return string +local function internalChar( t, s, e ) + local ret = {} + for i = s, e do + local v = t[i] + if type( v ) ~= 'number' then + checkType( 'char', i, v, 'number' ) + end + v = math.floor( v ) + if v < 0 or v > 0x10ffff then + error( S.format( "bad argument #%d to 'char' (value out of range)", i ), 2 ) + elseif v < 0x80 then + ret[#ret + 1] = v + elseif v < 0x800 then + ret[#ret + 1] = 0xc0 + math.floor( v / 0x40 ) % 0x20 + ret[#ret + 1] = 0x80 + v % 0x40 + elseif v < 0x10000 then + ret[#ret + 1] = 0xe0 + math.floor( v / 0x1000 ) % 0x10 + ret[#ret + 1] = 0x80 + math.floor( v / 0x40 ) % 0x40 + ret[#ret + 1] = 0x80 + v % 0x40 + else + ret[#ret + 1] = 0xf0 + math.floor( v / 0x40000 ) % 0x08 + ret[#ret + 1] = 0x80 + math.floor( v / 0x1000 ) % 0x40 + ret[#ret + 1] = 0x80 + math.floor( v / 0x40 ) % 0x40 + ret[#ret + 1] = 0x80 + v % 0x40 + end + end + return S.char( unpack( ret ) ) +end +function ustring.char( ... ) + return internalChar( { ... }, 1, select( '#', ... ) ) +end + +-- Return the length of a string in codepoints, or +-- nil if the string is not valid UTF-8. +-- +-- @see string.len +-- @param string +-- @return int|nil +function ustring.len( s ) + checkString( 'len', s ) + local cps = utf8_explode( s ) + if cps == nil then + return nil + else + return cps.len + end +end + +-- Private function to return a substring of a string +-- +-- @param s string +-- @param cps table Exploded string +-- @param i int Starting character [default 1] +-- @param j int Ending character [default -1] +-- @return string +local function sub( s, cps, i, j ) + return S.sub( s, cps.bytepos[i], cps.bytepos[j+1] - 1 ) +end + +-- Return a substring of a string +-- +-- @see string.sub +-- @param s string +-- @param i int Starting character [default 1] +-- @param j int Ending character [default -1] +-- @return string +function ustring.sub( s, i, j ) + checkString( 'sub', s ) + checkType( 'sub', 2, i, 'number', true ) + checkType( 'sub', 3, j, 'number', true ) + local cps = utf8_explode( s ) + if cps == nil then + error( "bad argument #1 for 'sub' (string is not UTF-8)", 2 ) + end + i = i or 1 + if i < 0 then + i = cps.len + i + 1 + end + j = j or -1 + if j < 0 then + j = cps.len + j + 1 + end + if j < i then + return '' + end + i = math.max( 1, math.min( i, cps.len + 1 ) ) + j = math.max( 1, math.min( j, cps.len + 1 ) ) + return sub( s, cps, i, j ) +end + +---- Table-driven functions ---- +-- These functions load a conversion table when called + +-- Convert a string to uppercase +-- +-- @see string.upper +-- @param s string +-- @return string +function ustring.upper( s ) + checkString( 'upper', s ) + local map = require 'ustring/upper'; + local ret = S.gsub( s, '([^\128-\191][\128-\191]*)', map ) + return ret +end + +-- Convert a string to lowercase +-- +-- @see string.lower +-- @param s string +-- @return string +function ustring.lower( s ) + checkString( 'lower', s ) + local map = require 'ustring/lower'; + local ret = S.gsub( s, '([^\128-\191][\128-\191]*)', map ) + return ret +end + +---- Pattern functions ---- +-- Ugh. Just ugh. + +-- Cache for character sets (e.g. [a-z]) +local charset_cache = {} +setmetatable( charset_cache, { __weak = 'kv' } ) + +-- Private function to find a pattern in a string +-- Yes, this basically reimplements the whole of Lua's pattern matching, in +-- Lua. +-- +-- @see ustring.find +-- @param s string +-- @param cps table Exploded string +-- @param rawpat string Pattern +-- @param pattern table Exploded pattern +-- @param init int Starting index +-- @param noAnchor boolean True to ignore '^' +-- @return int starting index of the match +-- @return int ending index of the match +-- @return string|int* captures +local function find( s, cps, rawpat, pattern, init, noAnchor ) + local charsets = require 'ustring/charsets' + local anchor = false + local ncapt, captures + local captparen = {} + + -- Extract the value of a capture from the + -- upvalues ncapt and capture. + local function getcapt( n, err, errl ) + if n > ncapt then + error( err, errl + 1 ) + elseif type( captures[n] ) == 'table' then + if captures[n][2] == '' then + error( err, errl + 1 ) + end + return sub( s, cps, captures[n][1], captures[n][2] ), captures[n][2] - captures[n][1] + 1 + else + return captures[n], math.floor( math.log10( captures[n] ) ) + 1 + end + end + + local match, match_charset, parse_charset + + -- Main matching function. Uses tail recursion where possible. + -- Returns the position of the character after the match, and updates the + -- upvalues ncapt and captures. + match = function ( sp, pp ) + local c = pattern.codepoints[pp] + if c == 0x28 then -- '(': starts capture group + ncapt = ncapt + 1 + captparen[ncapt] = pp + local ret + if pattern.codepoints[pp + 1] == 0x29 then -- ')': Pattern is '()', capture position + captures[ncapt] = sp + ret = match( sp, pp + 2 ) + else + -- Start capture group + captures[ncapt] = { sp, '' } + ret = match( sp, pp + 1 ) + end + if ret then + return ret + else + -- Failed, rollback + ncapt = ncapt - 1 + return nil + end + elseif c == 0x29 then -- ')': ends capture group, pop current capture index from stack + for n = ncapt, 1, -1 do + if type( captures[n] ) == 'table' and captures[n][2] == '' then + captures[n][2] = sp - 1 + local ret = match( sp, pp + 1 ) + if ret then + return ret + else + -- Failed, rollback + captures[n][2] = '' + return nil + end + end + end + error( 'Unmatched close-paren at pattern character ' .. pp, 3 ) + elseif c == 0x5b then -- '[': starts character set + return match_charset( sp, parse_charset( pp ) ) + elseif c == 0x5d then -- ']' + error( 'Unmatched close-bracket at pattern character ' .. pp, 3 ) + elseif c == 0x25 then -- '%' + c = pattern.codepoints[pp + 1] + if charsets[c] then -- A character set like '%a' + return match_charset( sp, pp + 2, charsets[c] ) + elseif c == 0x62 then -- '%b': balanced delimiter match + local d1 = pattern.codepoints[pp + 2] + local d2 = pattern.codepoints[pp + 3] + if not d1 or not d2 then + error( 'malformed pattern (missing arguments to \'%b\')', 3 ) + end + if cps.codepoints[sp] ~= d1 then + return nil + end + sp = sp + 1 + local ct = 1 + while true do + c = cps.codepoints[sp] + sp = sp + 1 + if not c then + return nil + elseif c == d2 then + if ct == 1 then + return match( sp, pp + 4 ) + end + ct = ct - 1 + elseif c == d1 then + ct = ct + 1 + end + end + elseif c == 0x66 then -- '%f': frontier pattern match + if pattern.codepoints[pp + 2] ~= 0x5b then + error( 'missing \'[\' after %f in pattern at pattern character ' .. pp, 3 ) + end + local pp, charset = parse_charset( pp + 2 ) + local c1 = cps.codepoints[sp - 1] or 0 + local c2 = cps.codepoints[sp] or 0 + if not charset[c1] and charset[c2] then + return match( sp, pp ) + else + return nil + end + elseif c >= 0x30 and c <= 0x39 then -- '%0' to '%9': backreference + local m, l = getcapt( c - 0x30, 'invalid capture index %' .. c .. ' at pattern character ' .. pp, 3 ) + local ep = math.min( cps.len + 1, sp + l ) + if sub( s, cps, sp, ep - 1 ) == m then + return match( ep, pp + 2 ) + else + return nil + end + elseif not c then -- percent at the end of the pattern + error( 'malformed pattern (ends with \'%\')', 3 ) + else -- something else, treat as a literal + return match_charset( sp, pp + 2, { [c] = 1 } ) + end + elseif c == 0x2e then -- '.': match anything + if not charset_cache['.'] then + local t = {} + setmetatable( t, { __index = function ( t, k ) return k end } ) + charset_cache['.'] = { 1, t } + end + return match_charset( sp, pp + 1, charset_cache['.'][2] ) + elseif c == nil then -- end of pattern + return sp + elseif c == 0x24 and pattern.len == pp then -- '$': assert end of string + return ( sp == cps.len + 1 ) and sp or nil + else + -- Any other character matches itself + return match_charset( sp, pp + 1, { [c] = 1 } ) + end + end + + -- Parse a bracketed character set (e.g. [a-z]) + -- Returns the position after the set and a table holding the matching characters + parse_charset = function ( pp ) + local _, ep + local epp = pattern.bytepos[pp] + 1 + if S.sub( rawpat, epp, epp ) == '^' then + epp = epp + 1 + end + if S.sub( rawpat, epp, epp ) == ']' then + -- Lua's string module effectively does this + epp = epp + 1 + end + repeat + _, ep = S.find( rawpat, ']', epp, true ) + if not ep then + error( 'Missing close-bracket for character set beginning at pattern character ' .. pp, 3 ) + end + epp = ep + 1 + until S.byte( rawpat, ep - 1 ) ~= 0x25 or S.byte( rawpat, ep - 2 ) == 0x25 + local key = S.sub( rawpat, pattern.bytepos[pp], ep ) + if charset_cache[key] then + local pl, cs = unpack( charset_cache[key] ) + return pp + pl, cs + end + + local p0 = pp + local cs = {} + local csrefs = { cs } + local invert = false + pp = pp + 1 + if pattern.codepoints[pp] == 0x5e then -- '^' + invert = true + pp = pp + 1 + end + local first = true + while true do + local c = pattern.codepoints[pp] + if not first and c == 0x5d then -- closing ']' + pp = pp + 1 + break + elseif c == 0x25 then -- '%' + c = pattern.codepoints[pp + 1] + if charsets[c] then + csrefs[#csrefs + 1] = charsets[c] + else + cs[c] = 1 + end + pp = pp + 2 + elseif pattern.codepoints[pp + 1] == 0x2d and pattern.codepoints[pp + 2] and pattern.codepoints[pp + 2] ~= 0x5d then -- '-' followed by another char (not ']'), it's a range + for i = c, pattern.codepoints[pp + 2] do + cs[i] = 1 + end + pp = pp + 3 + elseif not c then -- Should never get here, but Just In Case... + error( 'Missing close-bracket', 3 ) + else + cs[c] = 1 + pp = pp + 1 + end + first = false + end + + local ret + if not csrefs[2] then + if not invert then + -- If there's only the one charset table, we can use it directly + ret = cs + else + -- Simple invert + ret = {} + setmetatable( ret, { __index = function ( t, k ) return k and not cs[k] end } ) + end + else + -- Ok, we have to iterate over multiple charset tables + ret = {} + setmetatable( ret, { __index = function ( t, k ) + if not k then + return nil + end + for i = 1, #csrefs do + if csrefs[i][k] then + return not invert + end + end + return invert + end } ) + end + + charset_cache[key] = { pp - p0, ret } + return pp, ret + end + + -- Match a character set table with optional quantifier, followed by + -- the rest of the pattern. + -- Returns same as 'match' above. + match_charset = function ( sp, pp, charset ) + local q = pattern.codepoints[pp] + if q == 0x2a then -- '*', 0 or more matches + pp = pp + 1 + local i = 0 + while charset[cps.codepoints[sp + i]] do + i = i + 1 + end + while i >= 0 do + local ret = match( sp + i, pp ) + if ret then + return ret + end + i = i - 1 + end + return nil + elseif q == 0x2b then -- '+', 1 or more matches + pp = pp + 1 + local i = 0 + while charset[cps.codepoints[sp + i]] do + i = i + 1 + end + while i > 0 do + local ret = match( sp + i, pp ) + if ret then + return ret + end + i = i - 1 + end + return nil + elseif q == 0x2d then -- '-', 0 or more matches non-greedy + pp = pp + 1 + while true do + local ret = match( sp, pp ) + if ret then + return ret + end + if not charset[cps.codepoints[sp]] then + return nil + end + sp = sp + 1 + end + elseif q == 0x3f then -- '?', 0 or 1 match + pp = pp + 1 + if charset[cps.codepoints[sp]] then + local ret = match( sp + 1, pp ) + if ret then + return ret + end + end + return match( sp, pp ) + else -- no suffix, must match 1 + if charset[cps.codepoints[sp]] then + return match( sp + 1, pp ) + else + return nil + end + end + end + + init = init or 1 + if init < 0 then + init = cps.len + init + 1 + end + init = math.max( 1, math.min( init, cps.len + 1 ) ) + + -- Here is the actual match loop. It just calls 'match' on successive + -- starting positions (or not, if the pattern is anchored) until it finds a + -- match. + local sp = init + local pp = 1 + if not noAnchor and pattern.codepoints[1] == 0x5e then -- '^': Pattern is anchored + anchor = true + pp = 2 + end + + repeat + ncapt, captures = 0, {} + local ep = match( sp, pp ) + if ep then + for i = 1, ncapt do + captures[i] = getcapt( i, 'Unclosed capture beginning at pattern character ' .. captparen[i], 2 ) + end + return sp, ep - 1, unpack( captures ) + end + sp = sp + 1 + until anchor or sp > cps.len + 1 + return nil +end + +-- Private function to decide if a pattern looks simple enough to use +-- Lua's built-in string library. The following make a pattern not simple: +-- * If it contains any bytes over 0x7f. We could skip these if they're not +-- inside brackets and aren't followed by quantifiers and aren't part of a +-- '%b', but that's too complicated to check. +-- * If it contains a negated character set. +-- * If it contains "%a" or any of the other %-prefixed character sets except %z. +-- * If it contains a '.' not followed by '*', '+', '-'. A bare '.' or '.?' +-- matches a partial UTF-8 character, but the others will happily enough +-- match a whole UTF-8 character thinking it's 2, 3 or 4. +-- * If it contains position-captures. +-- * If it matches the empty string +-- +-- @param string pattern +-- @return boolean +local function patternIsSimple( pattern ) + local findWithPcall = function ( ... ) + local ok, ret = pcall( S.find, ... ) + return ok and ret + end + + return not ( + S.find( pattern, '[\128-\255]' ) or + S.find( pattern, '%[%^' ) or + S.find( pattern, '%%[acdlpsuwxACDLPSUWXZ]' ) or + S.find( pattern, '%.[^*+-]' ) or S.find( pattern, '%.$' ) or + S.find( pattern, '()', 1, true ) or + pattern == '' or findWithPcall( '', pattern ) + ) +end + +-- Find a pattern in a string +-- +-- This works just like string.find, with the following changes: +-- * Everything works on UTF-8 characters rather than bytes +-- * Character classes are redefined in terms of Unicode properties: +-- * %a - Letter +-- * %c - Control +-- * %d - Decimal Number +-- * %l - Lower case letter +-- * %p - Punctuation +-- * %s - Separator, plus HT, LF, FF, CR, and VT +-- * %u - Upper case letter +-- * %w - Letter or Decimal Number +-- * %x - [0-9A-Fa-f0-9A-Fa-f] +-- +-- @see string.find +-- @param s string +-- @param pattern string Pattern +-- @param init int Starting index +-- @param plain boolean Literal match, no pattern matching +-- @return int starting index of the match +-- @return int ending index of the match +-- @return string|int* captures +function ustring.find( s, pattern, init, plain ) + checkString( 'find', s ) + checkPattern( 'find', pattern ) + checkType( 'find', 3, init, 'number', true ) + checkType( 'find', 4, plain, 'boolean', true ) + local cps = utf8_explode( s ) + if cps == nil then + error( "bad argument #1 for 'find' (string is not UTF-8)", 2 ) + end + local pat = utf8_explode( pattern ) + if pat == nil then + error( "bad argument #2 for 'find' (string is not UTF-8)", 2 ) + end + + if plain or patternIsSimple( pattern ) then + if init and init > cps.len + 1 then + init = cps.len + 1 + end + local m + if plain then + m = { true, S.find( s, pattern, cps.bytepos[init], plain ) } + else + m = { pcall( S.find, s, pattern, cps.bytepos[init], plain ) } + end + if m[1] then + if m[2] then + m[2] = cpoffset( cps, m[2] ) + m[3] = cpoffset( cps, m[3] ) + end + return unpack( m, 2 ) + end + end + + return find( s, cps, pattern, pat, init ) +end + +-- Match a string against a pattern +-- +-- @see ustring.find +-- @see string.match +-- @param s string +-- @param pattern string +-- @param init int Starting offset for match +-- @return string|int* captures, or the whole match if there are none +function ustring.match( s, pattern, init ) + checkString( 'match', s ) + checkPattern( 'match', pattern ) + checkType( 'match', 3, init, 'number', true ) + local cps = utf8_explode( s ) + if cps == nil then + error( "bad argument #1 for 'match' (string is not UTF-8)", 2 ) + end + local pat = utf8_explode( pattern ) + if pat == nil then + error( "bad argument #2 for 'match' (string is not UTF-8)", 2 ) + end + + if patternIsSimple( pattern ) then + local ret = { pcall( S.match, s, pattern, cps.bytepos[init] ) } + if ret[1] then + return unpack( ret, 2 ) + end + end + + local m = { find( s, cps, pattern, pat, init ) } + if not m[1] then + return nil + end + if m[3] then + return unpack( m, 3 ) + end + return sub( s, cps, m[1], m[2] ) +end + +-- Return an iterator function over the matches for a pattern +-- +-- @see ustring.find +-- @see string.gmatch +-- @param s string +-- @param pattern string +-- @return function +-- @return nil +-- @return nil +function ustring.gmatch( s, pattern ) + checkString( 'gmatch', s ) + checkPattern( 'gmatch', pattern ) + if patternIsSimple( pattern ) then + local ret = { pcall( S.gmatch, s, pattern ) } + if ret[1] then + return unpack( ret, 2 ) + end + end + + local cps = utf8_explode( s ) + if cps == nil then + error( "bad argument #1 for 'gmatch' (string is not UTF-8)", 2 ) + end + local pat = utf8_explode( pattern ) + if pat == nil then + error( "bad argument #2 for 'gmatch' (string is not UTF-8)", 2 ) + end + local init = 1 + + return function () + local m = { find( s, cps, pattern, pat, init, true ) } + if not m[1] then + return nil + end + init = m[2] + 1 + if m[3] then + return unpack( m, 3 ) + end + return sub( s, cps, m[1], m[2] ) + end +end + +-- Replace pattern matches in a string +-- +-- @see ustring.find +-- @see string.gsub +-- @param s string +-- @param pattern string +-- @param repl string|function|table +-- @param int n +-- @return string +-- @return int +function ustring.gsub( s, pattern, repl, n ) + checkString( 'gsub', s ) + checkPattern( 'gsub', pattern ) + checkType( 'gsub', 4, n, 'number', true ) + if patternIsSimple( pattern ) then + local ret = { pcall( S.gsub, s, pattern, repl, n ) } + if ret[1] then + return unpack( ret, 2 ) + end + end + + if n == nil then + n = 1e100 + end + if n < 1 then + -- No replacement + return s, 0 + end + + local cps = utf8_explode( s ) + if cps == nil then + error( "bad argument #1 for 'gsub' (string is not UTF-8)", 2 ) + end + local pat = utf8_explode( pattern ) + if pat == nil then + error( "bad argument #2 for 'gsub' (string is not UTF-8)", 2 ) + end + + if pat.codepoints[1] == 0x5e then -- '^': Pattern is anchored + -- There can be only the one match, so make that explicit + n = 1 + end + + local tp + if type( repl ) == 'function' then + tp = 1 + elseif type( repl ) == 'table' then + tp = 2 + elseif type( repl ) == 'string' then + tp = 3 + elseif type( repl ) == 'number' then + repl = tostring( repl ) + tp = 3 + else + checkType( 'gsub', 3, repl, 'function or table or string' ) + end + + local init = 1 + local ct = 0 + local ret = {} + local zeroAdjustment = 0 + repeat + local m = { find( s, cps, pattern, pat, init + zeroAdjustment ) } + if not m[1] then + break + end + if init < m[1] then + ret[#ret + 1] = sub( s, cps, init, m[1] - 1 ) + end + local mm = sub( s, cps, m[1], m[2] ) + + -- This simplifies the code for the function and table cases (tp == 1 and tp == 2) when there are + -- no captures in the pattern. As documented it would be incorrect for the string case by making + -- %1 act like %0 instead of raising an "invalid capture index" error, but Lua in fact does + -- exactly that for string.gsub. + if #m < 3 then + m[3] = mm + end + + local val, valType + if tp == 1 then + val = repl( unpack( m, 3 ) ) + elseif tp == 2 then + val = repl[m[3]] + elseif tp == 3 then + if ct == 0 and #m < 11 then + local ss = S.gsub( repl, '%%[%%0-' .. ( #m - 2 ) .. ']', 'x' ) + ss = S.match( ss, '%%[0-9]' ) + if ss then + error( 'invalid capture index ' .. ss .. ' in replacement string', 2 ) + end + end + local t = { + ["%0"] = mm, + ["%1"] = m[3], + ["%2"] = m[4], + ["%3"] = m[5], + ["%4"] = m[6], + ["%5"] = m[7], + ["%6"] = m[8], + ["%7"] = m[9], + ["%8"] = m[10], + ["%9"] = m[11], + ["%%"] = "%" + } + val = S.gsub( repl, '%%[%%0-9]', t ) + end + valType = type( val ) + if valType ~= 'nil' and valType ~= 'string' and valType ~= 'number' then + error( 'invalid replacement value (a ' .. valType .. ')', 2 ) + end + ret[#ret + 1] = val or mm + init = m[2] + 1 + ct = ct + 1 + zeroAdjustment = m[2] < m[1] and 1 or 0 + until init > cps.len or ct >= n + if init <= cps.len then + ret[#ret + 1] = sub( s, cps, init, cps.len ) + end + return table.concat( ret ), ct +end + +---- Unicode Normalization ---- +-- These functions load a conversion table when called + +local function internalDecompose( cps, decomp ) + local cp = {} + local normal = require 'ustring/normalization-data' + + -- Decompose into cp, using the lookup table and logic for hangul + for i = 1, cps.len do + local c = cps.codepoints[i] + local m = decomp[c] + if m then + for j = 0, #m do + cp[#cp + 1] = m[j] + end + else + cp[#cp + 1] = c + end + end + + -- Now sort combiners by class + local i, l = 1, #cp + while i < l do + local cc1 = normal.combclass[cp[i]] + local cc2 = normal.combclass[cp[i+1]] + if cc1 and cc2 and cc1 > cc2 then + cp[i], cp[i+1] = cp[i+1], cp[i] + if i > 1 then + i = i - 1 + else + i = i + 1 + end + else + i = i + 1 + end + end + + return cp, 1, l +end + +local function internalCompose( cp, _, l ) + local normal = require 'ustring/normalization-data' + + -- Since NFD->NFC can never expand a character sequence, we can do this + -- in-place. + local comp = normal.comp[cp[1]] + local sc = 1 + local j = 1 + local lastclass = 0 + for i = 2, l do + local c = cp[i] + local ccc = normal.combclass[c] + if ccc then + -- Trying a combiner with the starter + if comp and lastclass < ccc and comp[c] then + -- Yes! + c = comp[c] + cp[sc] = c + comp = normal.comp[c] + else + -- No, copy it to the right place for output + j = j + 1 + cp[j] = c + lastclass = ccc + end + elseif comp and lastclass == 0 and comp[c] then + -- Combining two adjacent starters + c = comp[c] + cp[sc] = c + comp = normal.comp[c] + else + -- New starter, doesn't combine + j = j + 1 + cp[j] = c + comp = normal.comp[c] + sc = j + lastclass = 0 + end + end + + return cp, 1, j +end + +-- Normalize a string to NFC +-- +-- Based on MediaWiki's UtfNormal class. Returns nil if the string is not valid +-- UTF-8. +-- +-- @param s string +-- @return string|nil +function ustring.toNFC( s ) + checkString( 'toNFC', s ) + + -- ASCII is always NFC + if not S.find( s, '[\128-\255]' ) then + return s + end + + local cps = utf8_explode( s ) + if cps == nil then + return nil + end + local normal = require 'ustring/normalization-data' + + -- First, scan through to see if the string is definitely already NFC + local ok = true + for i = 1, cps.len do + local c = cps.codepoints[i] + if normal.check[c] then + ok = false + break + end + end + if ok then + return s + end + + -- Next, expand to NFD then recompose + return internalChar( internalCompose( internalDecompose( cps, normal.decomp ) ) ) +end + +-- Normalize a string to NFD +-- +-- Based on MediaWiki's UtfNormal class. Returns nil if the string is not valid +-- UTF-8. +-- +-- @param s string +-- @return string|nil +function ustring.toNFD( s ) + checkString( 'toNFD', s ) + + -- ASCII is always NFD + if not S.find( s, '[\128-\255]' ) then + return s + end + + local cps = utf8_explode( s ) + if cps == nil then + return nil + end + + local normal = require 'ustring/normalization-data' + return internalChar( internalDecompose( cps, normal.decomp ) ) +end + +-- Normalize a string to NFKC +-- +-- Based on MediaWiki's UtfNormal class. Returns nil if the string is not valid +-- UTF-8. +-- +-- @param s string +-- @return string|nil +function ustring.toNFKC( s ) + checkString( 'toNFKC', s ) + + -- ASCII is always NFKC + if not S.find( s, '[\128-\255]' ) then + return s + end + + local cps = utf8_explode( s ) + if cps == nil then + return nil + end + local normal = require 'ustring/normalization-data' + + -- Next, expand to NFKD then recompose + return internalChar( internalCompose( internalDecompose( cps, normal.decompK ) ) ) +end + +-- Normalize a string to NFKD +-- +-- Based on MediaWiki's UtfNormal class. Returns nil if the string is not valid +-- UTF-8. +-- +-- @param s string +-- @return string|nil +function ustring.toNFKD( s ) + checkString( 'toNFKD', s ) + + -- ASCII is always NFKD + if not S.find( s, '[\128-\255]' ) then + return s + end + + local cps = utf8_explode( s ) + if cps == nil then + return nil + end + + local normal = require 'ustring/normalization-data' + return internalChar( internalDecompose( cps, normal.decompK ) ) +end + +return ustring diff --git a/wiki.html b/wiki.html new file mode 100644 index 0000000..6cb3968 --- /dev/null +++ b/wiki.html @@ -0,0 +1 @@ +

English

Alternative forms

Etymology

From Middle English tyme, time, from Old English tīma (time, period, space of time, season, lifetime, fixed time, favourable time, opportunity), from Proto-West Germanic *tīmō, from Proto-Germanic *tīmô (time), from Proto-Indo-European *deh₂imō, from Proto-Indo-European *deh₂y- (to divide). Cognate with Scots tym, tyme (time), Alemannic German Zimen, Zīmmän (time, time of the year, opportune time, opportunity), Danish time (hour, lesson), Swedish timme (hour), Norwegian time (time, hour), Faroese tími (hour, lesson, time), Icelandic tími (time, season). Related to tide. Not related to Latin tempus.

Pronunciation

Noun

time (countable and uncountable, plural times)

  1. (uncountable) The inevitable progression into the future with the passing of present and past events.
    Time stops for nobody.   the ebb and flow of time
    Synonyms: see Thesaurus:time
    1. (physics, usually uncountable) A dimension of spacetime with the opposite metric signature to space dimensions; the fourth dimension.
      Both science-fiction writers and physicists have written about travel through time.
      • 1895 May 7, H[erbert] G[eorge] Wells, The Time Machine: An Invention, New York, N.Y.: Henry Holt and Company, →OCLC, page 35:
        So long as I travelled at a high velocity through time, this scarcely mattered; I was, so to speak, attenuated — was slipping like a vapour through the interstices of intervening substances!
      • 2010, Brian Greene, The Elegant Universe: Superstrings, Hidden Dimensions, and the Quest for the Ultimate Theory, W. W. Norton & Company, →ISBN, page 204:
        We all have a visceral understanding of what it means for the universe to have multiple space dimensions, since we live in a world in which we constantly deal with a plurality — three. But what would it mean to have multiple times? Would one align with time as we presently experience it psychologically while the other would somehow be "different"?
    2. (physics, uncountable) Change associated with the second law of thermodynamics; the physical and psychological result of increasing entropy.
      Time slows down when you approach the speed of light.
      • 2012, Robert Zwilling, Natural Sciences and Human Thought, Springer Science & Business Media, →ISBN, page 80:
        Eventually time would also die because no processes would continue, no light would flow.
      • 2015, Highfield, Arrow Of Time, Random House →ISBN
        Given the connection between increasing entropy and the arrow of time, does the Big Crunch mean that time would run backwards as soon as collapse began?
    3. (physics, uncountable, reductionist definition) The property of a system which allows it to have more than one distinct configuration.
      An essential definition of time should entail neither speed nor direction, just change.
  2. A duration of time.
    1. (uncountable) A quantity of availability of duration.
      More time is needed to complete the project.   You had plenty of time, but you waited until the last minute.   Are you finished yet? Time’s up!
      • 1661, John Fell, The Life of the most learned, reverend and pious Dr. H. Hammond:
        During the whole time of his abode in the university he generally spent thirteen hours of the day in study; by which assiduity besides an exact dispatch of the whole course of philosophy, he read over in a manner all classic authors that are extant []
        Category:Quotation templates to be cleaned
    2. (countable) A measurement of a quantity of time; a numerical or general indication of a length of progression.
      a long time;  Record the individual times for the processes in each batch.   Only your best time is compared with the other competitors.   The algorithm runs in O(n2) time.
    3. (uncountable, slang) The serving of a prison sentence.
      • 1994, Dana Stabenow, A Cold-Blooded Business, →ISBN, page 64:
        Arrested on duty at Fort Richardson, both parents had worked hard at blaming the other for their son's death, but Kate's meticulous recording of the detail of the bruising found on the child's body and the physical evidence surrounding the scene, plus patient, painstaking interviews with neighbors above and below stairs had resulted in time for both.
      The judge leniently granted a sentence with no hard time.   He is not living at home because he is doing time.
    4. (countable) An experience.
      We had a wonderful time at the party.
    5. (countable) An era; (with the, sometimes in plural) the current era, the current state of affairs.
      Roman times;  the time of the dinosaurs;  how things were at that time;  how things were in those times
      • 63 BC, (Can we date this quote by Cicero and provide title, author’s full name, and other details?), First Oration against Catiline (translation)
        O the times, O the customs!
      • c. 1599–1602 (date written), William Shakespeare, “The Tragedie of Hamlet, Prince of Denmarke”, in Mr. William Shakespeares Comedies, Histories, & Tragedies [] (First Folio), London: [] Isaac Iaggard, and Ed[ward] Blount, published 1623, →OCLC, (please specify the act number in uppercase Roman numerals, and the scene number in lowercase Roman numerals):
        The time is out of joint
      • 2008, BioWare, Mass Effect (Science Fiction), Redwood City: Electronic Arts, →ISBN, →OCLC, PC, scene: Eden Prime:
        Dr. Manuel: You're wasting your time. The age of humanity is over. Our extinction is inevitable.[...]
        Shepard: I don't have time for this.
        Dr. Manuel: Time? Our time is over.
    6. (uncountable, with possessive) A person's youth or young adulthood, as opposed to the present day.
      In my time, we respected our elders.
    7. (only in singular, sports and figuratively) Time out; temporary, limited suspension of play.
  3. An instant of time.
    1. (uncountable) How much of a day has passed; the moment, as indicated by a clock or similar device.
      Excuse me, have you got the time?   What time is it, do you guess? Ten o’clock?   A computer keeps time using a clock battery.
      • 2013 July 19, Ian Sample, “Irregular bedtimes may affect children's brains”, in The Guardian Weekly, volume 189, number 6, page 34:
        Irregular bedtimes may disrupt healthy brain development in young children, according to a study of intelligence and sleeping habits.  &para; Going to bed at a different time each night affected girls more than boys, but both fared worse on mental tasks than children who had a set bedtime, researchers found.
    2. (countable) A particular moment or hour; the appropriate moment or hour for something (especially with prepositional phrase or imperfect subjunctive).
      it’s time for bed;  it’s time to sleep;  we must wait for the right time;  it's time we were going
      • 1897 December (indicated as 1898), Winston Churchill, chapter VIII, in The Celebrity: An Episode, New York, N.Y.: The Macmillan Company; London: Macmillan & Co., Ltd., →OCLC:
        The humor of my proposition appealed more strongly to Miss Trevor than I had looked for, and from that time forward she became her old self again; for, even after she had conquered her love for the Celebrity, the mortification of having been jilted by him remained.
      • 2013 June 7, Joseph Stiglitz, “Globalisation is about taxes too”, in The Guardian Weekly, volume 188, number 26, page 19:
        It is time the international community faced the reality: we have an unmanageable, unfair, distortionary global tax regime. It is a tax system that is pivotal in creating the increasing inequality that marks most advanced countries today – with America standing out in the forefront and the UK not far behind.
    3. (countable) A numerical indication of a particular moment.
      at what times do the trains arrive?;  these times were erroneously converted between zones
    4. (countable) An instance or occurrence.
      When was the last time we went out? I don’t remember.
      see you another time;  that’s three times he’s made the same mistake
      Okay, but this is the last time. No more after that!
      • 1898, Winston Churchill, chapter 2, in The Celebrity:
        Sunning himself on the board steps, I saw for the first time Mr. Farquhar Fenelon Cooke. He was dressed out in broad gaiters and bright tweeds, like an English tourist, and his face might have belonged to Dagon, idol of the Philistines.
      • 2016, VOA Learning English (public domain)
        One more time.
        noicon|175px(file)
    5. (UK, in public houses) Closing time.
      Last call: it's almost time.
    6. The hour of childbirth.
    7. (as someone's time) The end of someone's life, conceived by the speaker as having been predestined.
      It was his time.
  4. (countable) The measurement under some system of region of day or moment.
    Let's synchronize our watches so we're not on different time.
  5. (countable) Ratio of comparison.
    your car runs three times faster than mine;  that is four times as heavy as this
  6. (grammar, dated) Tense.
    the time of a verb
    • 1823, Lindley Murray, Key to the Exercises Adapted to Murray's English Grammar, Fortland, page 53f.:
      Though we have, in the notes under the thirteenth rule of the Grammar, explained in general the principles, on which the time of a verb in the infinitive mood may be ascertained, and its form determined; [...]
    • 1829, Benjamin A. Gould, Adam's Latin Grammar, Boston, page 153:
      The participles of the future time active, and perfect passive, when joined with the verb esse, were sometimes used as indeclinable; thus, [...]
      Category:Quotation templates to be cleaned
  7. (music) The measured duration of sounds; measure; tempo; rate of movement; rhythmical division.
    common or triple time;   the musician keeps good time.
  8. (slang, MLE) Clipping of a long time.
    • 2022 March 18, Ronan Bennett, Gerry Jackson, Tyrone Rashard, Sagirah Gammon; Brady Hood, director, chapter 1, in Top Boy(Good Morals) (4), spoken by girl called B, 00:38:33 from the start:
      Ats' mum is looking for him, says he ain't been back in time
      2023 January 15, Layton Williams; Freddy Syborn, director, chapter 3, in Bad Education(Prison) (4), spoken by Inchez (Anthony J. Abraham), 12:51 from the start:
      INCHEZ:Man this is long! We've been in here for time!
    Synonyms: ages, long

Usage notes

For the number of occurrences and the ratio of comparison, once and twice are typically used instead of one time and two times. Thrice is uncommon but not obsolescent, and is still common in Indian English.James Lambert, 2012, 'Diachronic stability in Indian English lexis' World Englishes Vol. 31, issue 1, page 112-127.

Typical collocations with time or time expressions.

  • spend - To talk about the length of time of an activity.
- We spent a long time driving along the motorway.
- I've spent most of my life working here. (Time expression)
  • take - To talk about the length of time of an activity.
- It took a long time to get to the front of the queue. See also - take one's time
- It only takes five minutes to get to the shop from here. (Time expression)
- How long does it take to do that? (Time expression)

Quotations

Hyponyms

Hyponyms of time (proper names)
Other hyponyms of time

Derived terms

Related terms

Terms related to time that are not nouns

Descendants

  • Sranan Tongo: ten

Translations

Verb

time (third-person singular simple present times, present participle timing, simple past and past participle timed)

  1. To measure or record the time, duration, or rate of.
    I used a stopwatch to time myself running around the block.
  2. To choose when something begins or how long it lasts.
    The President timed his speech badly, coinciding with the Super Bowl.
    The bomb was timed to explode at 9:20 p.m.
    • 1625, Francis [Bacon], “(please specify the chapter)”, in The Essayes [], 3rd edition, London: [] Iohn Haviland for Hanna Barret, →OCLC:
      There is surely no greater wisdom than well to time the beginnings and onsets of things.
  3. (obsolete) To keep or beat time; to proceed or move in time.
  4. (obsolete) To pass time; to delay.
  5. To regulate as to time; to accompany, or agree with, in time of movement.
  6. To measure, as in music or harmony.

Synonyms

  • (to measure time): clock
  • (to choose the time for): set

Derived terms

Descendants

Translations

The translations below need to be checked and inserted above into the appropriate translation tables. See instructions at Wiktionary:Entry layout § Translations.

Interjection

time

  1. (tennis) Reminder by the umpire for the players to continue playing after their pause.
  2. The umpire's call in prizefights, etc.
  3. A call by a bartender to warn patrons that the establishment is closing and no more drinks will be served.

See also

References

Further reading

Anagrams

Category:en:Physical quantities

Category:English terms derived from the Proto-Indo-European root *deh₂-

Category:en:Time

Danish

Etymology 1

From Old Norse tími, from Proto-Germanic *tīmô (time), cognate with Swedish timme, English time. From Proto-Indo-European *deh₂y-, specifically Proto-Indo-European *deh₂imō. The Germanic noun *tīdiz (time) is derived from the same root.

Pronunciation

  • IPA(key): /ˈtiːmə/, [ˈtˢiːmə], [ˈtsʰiːm̩]

Noun

time c (singular definite timen, plural indefinite timer)

  1. hour
  2. lesson, class
Declension