{"version":3,"file":"jsmigemo.mjs","names":[],"sources":["../src/BitList.ts","../src/utils.ts","../src/BitVector.ts","../src/CharacterConverter.ts","../src/LOUDSTrie.ts","../src/CompactHiraganaString.ts","../src/CompactDictionary.ts","../src/LOUDSTrieBuilder.ts","../src/CompactDictionaryBuilder.ts","../src/DoubleArray.ts","../src/TernaryRegexGenerator.ts","../src/RomajiProcessor.ts","../src/RomajiProcessor2.ts","../src/Migemo.ts","../src/RomajiProcessor1.ts"],"sourcesContent":["export class BitList {\r\n    words: Uint32Array;\r\n    size: number;\r\n    constructor(size?: number) {\r\n        if (size == undefined) {\r\n            this.words = new Uint32Array(8);\r\n            this.size = 0;\r\n        } else {\r\n            this.words = new Uint32Array((size + 31) >> 5);\r\n            this.size = size;\r\n        }\r\n    }\r\n    add(value: boolean) {\r\n        const pos = this.size;\r\n        if (this.words.length < (pos + 1 + 31) >> 5) {\r\n            const newWords = new Uint32Array(this.words.length * 2);\r\n            newWords.set(this.words, 0);\r\n            this.words = newWords;\r\n        }\r\n        this.size = pos + 1;\r\n        this.set(pos, value);\r\n    }\r\n\r\n    set(pos: number, value: boolean) {\r\n        if (0 > pos || pos >= this.size) {\r\n            throw new RangeError();\r\n        }\r\n        if (value) {\r\n            this.words[pos >> 5] |= 1 << (pos & 31);\r\n        } else {\r\n            this.words[pos >> 5] &= ~(1 << (pos & 31));\r\n        }\r\n    }\r\n\r\n    get(pos: number): boolean {\r\n        if (0 > pos || pos >= this.size) {\r\n            throw new RangeError();\r\n        }\r\n        return ((this.words[pos >> 5] >> (pos & 31)) & 1) == 1;\r\n    }\r\n}\r\n","/**\r\n * 配列ライクな構造に対して二分探索を実行します。\r\n * @param a 検索対象の配列ライクな構造\r\n * @param fromIndex 開始インデックス（含む）\r\n * @param toIndex 終了インデックス（含まない）\r\n * @param key 検索する値\r\n * @returns キーが見つかった場合はそのインデックス、見つからなかった場合は-(挿入位置 + 1)\r\n */\r\nexport function binarySearch<T>(a: ArrayLike<T>, fromIndex: number, toIndex: number, key: T): number {\r\n    let low = fromIndex;\r\n    let high = toIndex - 1;\r\n    while (low <= high) {\r\n        const mid = (low + high) >>> 1;\r\n        const midVal = a[mid];\r\n        if (midVal < key)\r\n            low = mid + 1;\r\n        else if (midVal > key)\r\n            high = mid - 1;\r\n        else\r\n            return mid;\r\n    }\r\n    return -(low + 1);\r\n}\r\n\r\n/**\r\n * 32ビット整数内のセットされたビット数を数えます。\r\n * 効率的なカウントのためにビット操作技術を使用します。\r\n * @param i ビットを数える対象の整数\r\n * @returns セットされたビット数（0-32）\r\n */\r\nexport function bitCount(i: number): number {\r\n    i = i - ((i >>> 1) & 0x55555555);\r\n    i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);\r\n    i = (i + (i >>> 4)) & 0x0f0f0f0f;\r\n    i = i + (i >>> 8);\r\n    i = i + (i >>> 16);\r\n    return i & 0x3f;\r\n}\r\n\r\n/**\r\n * 32ビット整数内の末尾の0ビット数を返します。\r\n * 入力が0の場合は64を返します。\r\n * @param i 分析する整数\r\n * @returns 末尾の0の数\r\n */\r\nexport function numberOfTrailingZeros(i: number): number {\r\n    let x, y: number;\r\n    if (i == 0) return 64;\r\n    let n = 63;\r\n    y = i; if (y != 0) { n = n -32; x = y; } else x = (i>>>32);\r\n    y = x <<16; if (y != 0) { n = n -16; x = y; }\r\n    y = x << 8; if (y != 0) { n = n - 8; x = y; }\r\n    y = x << 4; if (y != 0) { n = n - 4; x = y; }\r\n    y = x << 2; if (y != 0) { n = n - 2; x = y; }\r\n    return n - ((x << 1) >>> 31);\r\n}","import { bitCount, numberOfTrailingZeros } from \"./utils\";\r\nexport class BitVector {\r\n    words: Uint32Array;\r\n    sizeInBits: number;\r\n    lb: Uint32Array;\r\n    sb: Uint16Array;\r\n    constructor(words: Uint32Array, sizeInBits: number) {\r\n        const expectedWordsLength = ((sizeInBits + 63) >> 6) * 2;\r\n        if (expectedWordsLength != words.length) {\r\n            throw new Error(`expected: ${expectedWordsLength} actual: ${words.length}`);\r\n        }\r\n        this.words = words;\r\n        this.sizeInBits = sizeInBits;\r\n        this.lb = new Uint32Array((sizeInBits + 511) >>> 9);\r\n        this.sb = new Uint16Array(this.lb.length * 8);\r\n        let sum = 0;\r\n        let sumInLb = 0;\r\n        for (let i = 0; i < this.sb.length; i++) {\r\n            const bc = i < (this.words.length >>> 1) ? bitCount(this.words[i * 2]) + bitCount(this.words[i * 2 + 1]) : 0;\r\n            this.sb[i] = sumInLb;\r\n            sumInLb += bc;\r\n            if ((i & 7) == 7) {\r\n                this.lb[i >>> 3] = sum;\r\n                sum += sumInLb;\r\n                sumInLb = 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    rank(pos: number, b: boolean): number {\r\n        if (pos < 0 || this.sizeInBits + 1 < pos) {\r\n            throw new RangeError();\r\n        }\r\n        let count1 = this.sb[pos >>> 6] + this.lb[pos >>> 9];\r\n        const posInDWord = pos & 63;\r\n        if (posInDWord >= 32) {\r\n            count1 += bitCount(this.words[(pos >>> 5) & 0xFFFFFFFE]);\r\n        }\r\n        const posInWord = pos & 31;\r\n        const mask = 0x7FFFFFFF >>> (31 - posInWord);\r\n        count1 += bitCount(this.words[pos >>> 5] & mask);\r\n        return b ? count1 : (pos - count1);\r\n    }\r\n\r\n    select(count: number, b: boolean): number {\r\n        const lbIndex = this.lowerBoundBinarySearchLB(count, b) - 1;\r\n        if (lbIndex == -1) {\r\n            return 0\r\n        }\r\n        const countInLb = count - (b ? this.lb[lbIndex] : (512 * lbIndex - this.lb[lbIndex]));\r\n        const sbIndex = this.lowerBoundBinarySearchSB(countInLb, lbIndex * 8, lbIndex * 8 + 8, b) - 1;\r\n        let countInSb = countInLb - (b ? this.sb[sbIndex] : (64 * (sbIndex % 8) - this.sb[sbIndex]));\r\n        let wordL = this.words[sbIndex * 2];\r\n        let wordU = this.words[sbIndex * 2 + 1];\r\n        if (!b) {\r\n            wordL = ~wordL;\r\n            wordU = ~wordU;\r\n        }\r\n        const lowerBitCount = bitCount(wordL);\r\n        let i = 0;\r\n        if (countInSb > lowerBitCount) {\r\n            wordL = wordU;\r\n            countInSb -= lowerBitCount;\r\n            i = 32;\r\n        }\r\n        while (countInSb > 0) {\r\n            countInSb -= wordL & 1;\r\n            wordL >>>= 1;\r\n            i++;\r\n        }\r\n        return sbIndex * 64 + (i - 1);\r\n    }\r\n\r\n    private lowerBoundBinarySearchLB(key: number, b: boolean): number {\r\n        let high = this.lb.length;\r\n        let low = -1;\r\n        if (b) {\r\n            while (high - low > 1) {\r\n                let mid = (high + low) >>> 1;\r\n                if (this.lb[mid] < key) {\r\n                    low = mid;\r\n                } else {\r\n                    high = mid;\r\n                }\r\n            }\r\n        } else {\r\n            while (high - low > 1) {\r\n                let mid = (high + low) >>> 1;\r\n                if (512 * mid - this.lb[mid] < key) {\r\n                    low = mid;\r\n                } else {\r\n                    high = mid;\r\n                }\r\n            }\r\n        }\r\n        return high;\r\n    }\r\n\r\n    private lowerBoundBinarySearchSB(key: number, fromIndex: number, toIndex: number, b: boolean): number {\r\n        let high = toIndex;\r\n        let low = fromIndex - 1;\r\n        if (b) {\r\n            while (high - low > 1) {\r\n                const mid = (high + low) >>> 1;\r\n                if (this.sb[mid] < key) {\r\n                    low = mid;\r\n                } else {\r\n                    high = mid;\r\n                }\r\n            }\r\n        } else {\r\n            while (high - low > 1) {\r\n                const mid = (high + low) >>> 1;\r\n                if (64 * (mid & 7) - this.sb[mid] < key) {\r\n                    low = mid;\r\n                } else {\r\n                    high = mid;\r\n                }\r\n            }\r\n        }\r\n        return high;\r\n    }\r\n\r\n    nextClearBit(fromIndex: number): number {\r\n        let u = fromIndex >> 5;\r\n        let word = ~this.words[u] & (0xffffffff << fromIndex);\r\n        while (true) {\r\n            if (word != 0)\r\n                return (u * 32) + numberOfTrailingZeros(word);\r\n            if (++u == this.words.length)\r\n                return -1;\r\n            word = ~this.words[u];\r\n        }\r\n    }\r\n\r\n    size(): number {\r\n        return this.sizeInBits;\r\n    }\r\n\r\n    get(pos: number): boolean {\r\n        if (pos < 0 || this.sizeInBits < pos) {\r\n            throw new RangeError();\r\n        }\r\n        return ((this.words[pos >>> 5] >>> (pos & 31)) & 1) == 1;\r\n    }\r\n\r\n    public toString() {\r\n        let s = \"\";\r\n        for (let i = 0; i < this.sizeInBits; i++) {\r\n            const bit = ((this.words[i >>> 5] >>> (i & 31)) & 1) == 1;\r\n            s += bit ? '1' : '0';\r\n            if ((i & 63) == 63) {\r\n                s += ' ';\r\n            }\r\n        }\r\n        return s;\r\n    }\r\n}\r\n","const han2zenEntries: [string, string][] = [\r\n    ['!', '！'],\r\n    ['\"', '”'],\r\n    ['#', '＃'],\r\n    ['$', '＄'],\r\n    ['%', '％'],\r\n    ['&', '＆'],\r\n    ['\\'', '’'],\r\n    ['(', '（'],\r\n    [')', '）'],\r\n    ['*', '＊'],\r\n    ['+', '＋'],\r\n    [',', '，'],\r\n    ['-', '－'],\r\n    ['.', '．'],\r\n    ['/', '／'],\r\n    ['0', '０'],\r\n    ['1', '１'],\r\n    ['2', '２'],\r\n    ['3', '３'],\r\n    ['4', '４'],\r\n    ['5', '５'],\r\n    ['6', '６'],\r\n    ['7', '７'],\r\n    ['8', '８'],\r\n    ['9', '９'],\r\n    [':', '：'],\r\n    [';', '；'],\r\n    ['<', '＜'],\r\n    ['=', '＝'],\r\n    ['>', '＞'],\r\n    ['?', '？'],\r\n    ['@', '＠'],\r\n    ['A', 'Ａ'],\r\n    ['B', 'Ｂ'],\r\n    ['C', 'Ｃ'],\r\n    ['D', 'Ｄ'],\r\n    ['E', 'Ｅ'],\r\n    ['F', 'Ｆ'],\r\n    ['G', 'Ｇ'],\r\n    ['H', 'Ｈ'],\r\n    ['I', 'Ｉ'],\r\n    ['J', 'Ｊ'],\r\n    ['K', 'Ｋ'],\r\n    ['L', 'Ｌ'],\r\n    ['M', 'Ｍ'],\r\n    ['N', 'Ｎ'],\r\n    ['O', 'Ｏ'],\r\n    ['P', 'Ｐ'],\r\n    ['Q', 'Ｑ'],\r\n    ['R', 'Ｒ'],\r\n    ['S', 'Ｓ'],\r\n    ['T', 'Ｔ'],\r\n    ['U', 'Ｕ'],\r\n    ['V', 'Ｖ'],\r\n    ['W', 'Ｗ'],\r\n    ['X', 'Ｘ'],\r\n    ['Y', 'Ｙ'],\r\n    ['Z', 'Ｚ'],\r\n    ['[', '［'],\r\n    ['\\\\', '￥'],\r\n    [']', '］'],\r\n    ['^', '＾'],\r\n    ['_', '＿'],\r\n    ['`', '‘'],\r\n    ['a', 'ａ'],\r\n    ['b', 'ｂ'],\r\n    ['c', 'ｃ'],\r\n    ['d', 'ｄ'],\r\n    ['e', 'ｅ'],\r\n    ['f', 'ｆ'],\r\n    ['g', 'ｇ'],\r\n    ['h', 'ｈ'],\r\n    ['i', 'ｉ'],\r\n    ['j', 'ｊ'],\r\n    ['k', 'ｋ'],\r\n    ['l', 'ｌ'],\r\n    ['m', 'ｍ'],\r\n    ['n', 'ｎ'],\r\n    ['o', 'ｏ'],\r\n    ['p', 'ｐ'],\r\n    ['q', 'ｑ'],\r\n    ['r', 'ｒ'],\r\n    ['s', 'ｓ'],\r\n    ['t', 'ｔ'],\r\n    ['u', 'ｕ'],\r\n    ['v', 'ｖ'],\r\n    ['w', 'ｗ'],\r\n    ['x', 'ｘ'],\r\n    ['y', 'ｙ'],\r\n    ['z', 'ｚ'],\r\n    ['{', '｛'],\r\n    ['|', '｜'],\r\n    ['}', '｝'],\r\n    ['~', '～'],\r\n    ['｡', '。'],\r\n    ['｢', '「'],\r\n    ['｣', '」'],\r\n    ['､', '、'],\r\n    ['･', '・'],\r\n    ['ｦ', 'ヲ'],\r\n    ['ｧ', 'ァ'],\r\n    ['ｨ', 'ィ'],\r\n    ['ｩ', 'ゥ'],\r\n    ['ｪ', 'ェ'],\r\n    ['ｫ', 'ォ'],\r\n    ['ｬ', 'ャ'],\r\n    ['ｭ', 'ュ'],\r\n    ['ｮ', 'ョ'],\r\n    ['ｯ', 'ッ'],\r\n    ['ｰ', 'ー'],\r\n    ['ｱ', 'ア'],\r\n    ['ｲ', 'イ'],\r\n    ['ｳ', 'ウ'],\r\n    ['ｴ', 'エ'],\r\n    ['ｵ', 'オ'],\r\n    ['ｶ', 'カ'],\r\n    ['ｷ', 'キ'],\r\n    ['ｸ', 'ク'],\r\n    ['ｹ', 'ケ'],\r\n    ['ｺ', 'コ'],\r\n    ['ｻ', 'サ'],\r\n    ['ｼ', 'シ'],\r\n    ['ｽ', 'ス'],\r\n    ['ｾ', 'セ'],\r\n    ['ｿ', 'ソ'],\r\n    ['ﾀ', 'タ'],\r\n    ['ﾁ', 'チ'],\r\n    ['ﾂ', 'ツ'],\r\n    ['ﾃ', 'テ'],\r\n    ['ﾄ', 'ト'],\r\n    ['ﾅ', 'ナ'],\r\n    ['ﾆ', 'ニ'],\r\n    ['ﾇ', 'ヌ'],\r\n    ['ﾈ', 'ネ'],\r\n    ['ﾉ', 'ノ'],\r\n    ['ﾊ', 'ハ'],\r\n    ['ﾋ', 'ヒ'],\r\n    ['ﾌ', 'フ'],\r\n    ['ﾍ', 'ヘ'],\r\n    ['ﾎ', 'ホ'],\r\n    ['ﾏ', 'マ'],\r\n    ['ﾐ', 'ミ'],\r\n    ['ﾑ', 'ム'],\r\n    ['ﾒ', 'メ'],\r\n    ['ﾓ', 'モ'],\r\n    ['ﾔ', 'ヤ'],\r\n    ['ﾕ', 'ユ'],\r\n    ['ﾖ', 'ヨ'],\r\n    ['ﾗ', 'ラ'],\r\n    ['ﾘ', 'リ'],\r\n    ['ﾙ', 'ル'],\r\n    ['ﾚ', 'レ'],\r\n    ['ﾛ', 'ロ'],\r\n    ['ﾜ', 'ワ'],\r\n    ['ﾝ', 'ン'],\r\n    ['ﾞ', '゛'],\r\n    ['ﾟ', '゜'],\r\n];\r\n\r\nconst han2zen = new Map<string, string>(han2zenEntries);\r\n\r\nconst zen2hanEntries: [string, string][] = [\r\n    ...han2zenEntries.map(([han, zen]): [string, string] => [zen, han]),\r\n    ['ヴ', \"ｳﾞ\"],\r\n    ['ガ', \"ｶﾞ\"],\r\n    ['ギ', \"ｷﾞ\"],\r\n    ['グ', \"ｸﾞ\"],\r\n    ['ゲ', \"ｹﾞ\"],\r\n    ['ゴ', \"ｺﾞ\"],\r\n    ['ザ', \"ｻﾞ\"],\r\n    ['ジ', \"ｼﾞ\"],\r\n    ['ズ', \"ｽﾞ\"],\r\n    ['ゼ', \"ｾﾞ\"],\r\n    ['ゾ', \"ｿﾞ\"],\r\n    ['ダ', \"ﾀﾞ\"],\r\n    ['ヂ', \"ﾁﾞ\"],\r\n    ['ヅ', \"ﾂﾞ\"],\r\n    ['デ', \"ﾃﾞ\"],\r\n    ['ド', \"ﾄﾞ\"],\r\n    ['バ', \"ﾊﾞ\"],\r\n    ['ビ', \"ﾋﾞ\"],\r\n    ['ブ', \"ﾌﾞ\"],\r\n    ['ベ', \"ﾍﾞ\"],\r\n    ['ボ', \"ﾎﾞ\"],\r\n    ['パ', \"ﾊﾟ\"],\r\n    ['ピ', \"ﾋﾟ\"],\r\n    ['プ', \"ﾌﾟ\"],\r\n    ['ペ', \"ﾍﾟ\"],\r\n    ['ポ', \"ﾎﾟ\"],\r\n];\r\n\r\nconst zen2han = new Map<string, string>(zen2hanEntries);\r\n\r\nexport function han2zen_conv(source: string): string {\r\n    let sb = \"\";\r\n    for (let c of source) {\r\n        let a = han2zen.get(c);\r\n        if (a==undefined) {\r\n            sb += c;\r\n        } else {\r\n            sb += a;\r\n        }\r\n    }\r\n    return sb;\r\n}\r\n\r\nexport function zen2han_conv(source: string): string {\r\n    let sb = \"\";\r\n    for (let c of source) {\r\n        let a = zen2han.get(c);\r\n        if (a==undefined) {\r\n            sb += c;\r\n        } else {\r\n            sb += a;\r\n        }\r\n    }\r\n    return sb;\r\n}\r\n\r\nexport function hira2kata_conv(source: string): string {\r\n    let sb = \"\";\r\n    for (let i = 0; i < source.length; i++) {\r\n        const c = source.charCodeAt(i);\r\n        if ('ぁ'.charCodeAt(0) <= c && c <= 'ん'.charCodeAt(0)) {\r\n            sb += String.fromCharCode((c - 'ぁ'.charCodeAt(0) + 'ァ'.charCodeAt(0)));\r\n        } else {\r\n            sb += String.fromCharCode(c);\r\n        }\r\n    }\r\n    return sb;\r\n}\r\n","import { binarySearch } from \"./utils\";\r\nimport { BitVector } from \"./BitVector\";\r\n\r\nexport class LOUDSTrie {\r\n    bitVector: BitVector;\r\n    edges: Uint16Array;\r\n\r\n    constructor(bitVector: BitVector, edges: Uint16Array) {\r\n        this.bitVector = bitVector;\r\n        this.edges = edges;\r\n    }\r\n\r\n    reverseLookup(index: number): string {\r\n        if (index <= 0 || this.edges.length <= index) {\r\n            throw new RangeError();\r\n        }\r\n        const sb = new Array<number>();\r\n        while (index > 1) {\r\n            sb.push(this.edges[index]);\r\n            index = this.parent(index);\r\n        }\r\n        return String.fromCharCode(...sb.reverse())\r\n    }\r\n\r\n    parent(x: number): number {\r\n        return this.bitVector.rank(this.bitVector.select(x, true), false);\r\n    }\r\n\r\n    firstChild(x: number): number {\r\n        const y = this.bitVector.select(x, false) + 1;\r\n        if (this.bitVector.get(y)) {\r\n            return this.bitVector.rank(y, true) + 1;\r\n        } else {\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    traverse(index: number, c: number): number {\r\n        const firstChild = this.firstChild(index);\r\n        if (firstChild == -1) {\r\n            return -1;\r\n        }\r\n        const childStartBit = this.bitVector.select(firstChild, true);\r\n        const childEndBit = this.bitVector.nextClearBit(childStartBit);\r\n        const childSize = childEndBit - childStartBit;\r\n        const result = binarySearch(this.edges, firstChild, firstChild + childSize, c);\r\n        return result >= 0 ? result : -1;\r\n    }\r\n\r\n    lookup(key: string): number {\r\n        let nodeIndex = 1;\r\n        for (let i = 0; i < key.length; i++) {\r\n            const c = key.charCodeAt(i);\r\n            nodeIndex = this.traverse(nodeIndex, c);\r\n            if (nodeIndex == -1) {\r\n                break;\r\n            }\r\n        }\r\n        return (nodeIndex >= 0) ? nodeIndex : -1;\r\n    }\r\n\r\n    *predictiveSearch(index: number): IterableIterator<number> {\r\n        let lower = index;\r\n        let upper = index + 1;\r\n        while (upper - lower > 0) {\r\n            for (let i = lower; i < upper; i++) {\r\n                yield i;\r\n            }\r\n            lower = this.bitVector.rank(this.bitVector.select(lower, false) + 1, true) + 1;\r\n            upper = this.bitVector.rank(this.bitVector.select(upper, false) + 1, true) + 1;\r\n        }\r\n    }\r\n\r\n    size(): number {\r\n        return this.edges.length - 2;\r\n    }\r\n}","\r\nexport class CompactHiraganaString {\r\n    public static decodeBytes(bytes: Uint8Array): string {\r\n        let result = \"\";\r\n        for (let i = 0; i < bytes.length; i++) {\r\n            result += String.fromCharCode(CompactHiraganaString.decodeByte(bytes[i]));\r\n        }\r\n        return result;\r\n    }\r\n\r\n    public static decodeByte(c: number): number {\r\n        if (0x00 === c) {\r\n            return 0;\r\n        }\r\n        if (0x20 <= c && c <= 0x7e) {\r\n            return c;\r\n        }\r\n        if (0xa1 <= c && c <= 0xf6) {\r\n            return c + 0x3040 - 0xa0;\r\n        }\r\n        if (0xf7 === c) {\r\n            return 0x30fc;\r\n        }\r\n        throw new RangeError();\r\n    }\r\n\r\n    public static encodeString(str: string): Uint8Array {\r\n        const result = new Uint8Array(str.length);\r\n        for (let i = 0; i < str.length; i++) {\r\n            result[i] = CompactHiraganaString.encodeChar(str.charCodeAt(i));\r\n        }\r\n        return result;\r\n    }\r\n\r\n    public static encodeChar(b: number): number {\r\n        if (b === 0) {\r\n            return 0;\r\n        }\r\n        if (0x20 <= b && b <= 0x7e) {\r\n            return b;\r\n        }\r\n        if (0x3041 <= b && b <= 0x3096) {\r\n            return b - 0x3040 + 0xa0;\r\n        }\r\n        if (0x30fc === b) {\r\n            return 0xf7;\r\n        }\r\n        throw new RangeError('unknown character to encode: ' + b);\r\n    }\r\n}","import { LOUDSTrie } from \"./LOUDSTrie\";\r\nimport { BitVector } from \"./BitVector\";\r\nimport { BitList } from \"./BitList\";\r\nimport { CompactHiraganaString } from \"./CompactHiraganaString\";\r\n\r\nexport class CompactDictionary {\r\n    keyTrie: LOUDSTrie;\r\n    valueTrie: LOUDSTrie;\r\n    mappingBitVector: BitVector;\r\n    mapping: Int32Array;\r\n    hasMappingBitList: BitList;\r\n\r\n    constructor(buffer: ArrayBuffer) {\r\n        const dv = new DataView(buffer);\r\n        let offset = 0;\r\n        [this.keyTrie, offset] = CompactDictionary.readTrie(dv, offset, true);\r\n        [this.valueTrie, offset] = CompactDictionary.readTrie(dv, offset, false);\r\n        const mappingBitVectorSize = dv.getUint32(offset);\r\n        offset += 4;\r\n        const mappingBitVectorWords = new Uint32Array(((mappingBitVectorSize + 63) >> 6) * 2);\r\n        for (let i = 0; i < mappingBitVectorWords.length >> 1; i++) {\r\n            mappingBitVectorWords[i * 2 + 1] = dv.getUint32(offset);\r\n            offset += 4;\r\n            mappingBitVectorWords[i * 2] = dv.getUint32(offset);\r\n            offset += 4;\r\n        }\r\n        this.mappingBitVector = new BitVector(mappingBitVectorWords, mappingBitVectorSize);\r\n        const mappingSize = dv.getUint32(offset);\r\n        offset += 4;\r\n        this.mapping = new Int32Array(mappingSize);\r\n        for (let i = 0; i < mappingSize; i++) {\r\n            this.mapping[i] = dv.getInt32(offset);\r\n            offset += 4;\r\n        }\r\n        if (offset != buffer.byteLength) {\r\n            throw new Error();\r\n        }\r\n        this.hasMappingBitList = CompactDictionary.createHasMappingBitList(this.mappingBitVector);\r\n    }\r\n\r\n    private static readTrie(dv: DataView, offset: number, compactHiragana: boolean): [LOUDSTrie, number] {\r\n        const keyTrieEdgeSize = dv.getInt32(offset);\r\n        offset += 4;\r\n        const keyTrieEdges = new Uint16Array(keyTrieEdgeSize);\r\n        for (let i = 0; i < keyTrieEdgeSize; i++) {\r\n            let c: number;\r\n            if (compactHiragana) {\r\n                c = this.decode(dv.getUint8(offset));\r\n                offset += 1;\r\n            } else {\r\n                c = dv.getUint16(offset);\r\n                offset += 2;\r\n            }\r\n            keyTrieEdges[i] = c;\r\n        }\r\n        const keyTrieBitVectorSize = dv.getUint32(offset);\r\n        offset += 4;\r\n        const keyTrieBitVectorWords = new Uint32Array(((keyTrieBitVectorSize + 63) >> 6) * 2);\r\n        for (let i = 0; i < keyTrieBitVectorWords.length >>> 1; i++) {\r\n            keyTrieBitVectorWords[i * 2 + 1] = dv.getUint32(offset);\r\n            offset += 4;\r\n            keyTrieBitVectorWords[i * 2] = dv.getUint32(offset);\r\n            offset += 4;\r\n        }\r\n        return [new LOUDSTrie(new BitVector(keyTrieBitVectorWords, keyTrieBitVectorSize), keyTrieEdges), offset];\r\n    }\r\n\r\n    private static decode(c: number): number {\r\n        return CompactHiraganaString.decodeByte(c);\r\n    }\r\n\r\n    private static createHasMappingBitList(mappingBitVector: BitVector) {\r\n        const numOfNodes = mappingBitVector.rank(mappingBitVector.size() + 1, false);\r\n        const bitList = new BitList(numOfNodes);\r\n        let bitPosition = 0;\r\n        for (let node = 1; node < numOfNodes; node++) {\r\n            let hasMapping = mappingBitVector.get(bitPosition + 1);\r\n            bitList.set(node, hasMapping);\r\n            bitPosition = mappingBitVector.nextClearBit(bitPosition + 1);\r\n        }\r\n        return bitList;\r\n    }\r\n\r\n    *search(key: string): IterableIterator<string> {\r\n        const keyIndex = this.keyTrie.lookup(key);\r\n        if (keyIndex != -1 && this.hasMappingBitList.get(keyIndex)) {\r\n            const valueStartPos = this.mappingBitVector.select(keyIndex, false);\r\n            const valueEndPos = this.mappingBitVector.nextClearBit(valueStartPos + 1);\r\n            const size = valueEndPos - valueStartPos - 1;\r\n            if (size > 0) {\r\n                const offset = this.mappingBitVector.rank(valueStartPos, false);\r\n                for (let i = 0; i < size; i++) {\r\n                    yield this.valueTrie.reverseLookup(this.mapping[valueStartPos - offset + i]);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    *predictiveSearch(key: string): IterableIterator<string> {\r\n        const keyIndex = this.keyTrie.lookup(key);\r\n        if (keyIndex > 1) {\r\n            for (let i of this.keyTrie.predictiveSearch(keyIndex)) {\r\n                if (this.hasMappingBitList.get(i)) {\r\n                    const valueStartPos = this.mappingBitVector.select(i, false);\r\n                    const valueEndPos = this.mappingBitVector.nextClearBit(valueStartPos + 1);\r\n                    const size = valueEndPos - valueStartPos - 1;\r\n                    const offset = this.mappingBitVector.rank(valueStartPos, false);\r\n                    for (let j = 0; j < size; j++) {\r\n                        yield this.valueTrie.reverseLookup(this.mapping[valueStartPos - offset + j]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}","import { LOUDSTrie } from \"./LOUDSTrie\";\r\nimport { BitVector } from \"./BitVector\";\r\nimport { BitList } from \"./BitList\";\r\n\r\nexport class LOUDSTrieBuilder {\r\n    static build(keys: string[]): [LOUDSTrie, Uint32Array] {\r\n        for (let i = 0; i < keys.length; i++) {\r\n            if (keys[i] == null) {\r\n                throw new Error();\r\n            }\r\n            if (i > 0 && keys[i - 1] > keys[i]) {\r\n                throw new Error();\r\n            }\r\n        }\r\n        const nodes = new Uint32Array(keys.length)\r\n        for (let i = 0; i < nodes.length; i++) {\r\n            nodes[i] = 1;\r\n        }\r\n        let cursor = 0;\r\n        let currentNode = 1;\r\n        let edges = \"  \";\r\n        const louds = new BitList();\r\n        louds.add(true);\r\n        while (true) {\r\n            let lastChar = 0;\r\n            let lastParent = 0;\r\n            let restKeys = 0;\r\n            for (let i = 0; i < keys.length; i++) {\r\n                if (keys[i].length < cursor) {\r\n                    continue;\r\n                }\r\n                if (keys[i].length == cursor) {\r\n                    louds.add(false);\r\n                    lastParent = nodes[i];\r\n                    lastChar = 0;\r\n                    continue;\r\n                }\r\n                const currentChar = keys[i].charCodeAt(cursor);\r\n                const currentParent = nodes[i];\r\n                if (lastParent != currentParent) {\r\n                    louds.add(false);\r\n                    louds.add(true);\r\n                    edges += String.fromCharCode(currentChar);\r\n                    currentNode = currentNode + 1;\r\n                } else if (lastChar != currentChar) {\r\n                    louds.add(true);\r\n                    edges += String.fromCharCode(currentChar);\r\n                    currentNode = currentNode + 1;\r\n                }\r\n                nodes[i] = currentNode;\r\n                lastChar = currentChar;\r\n                lastParent = currentParent;\r\n                restKeys++;\r\n            }\r\n            if (restKeys == 0) {\r\n                break;\r\n            }\r\n            cursor++;\r\n        }\r\n        const bitVectorWords = new Uint32Array(louds.words.buffer, 0, ((louds.size + 63) >> 6) * 2);\r\n        const bitVector = new BitVector(bitVectorWords, louds.size);\r\n        const uint16Edges = new Uint16Array(edges.length);\r\n        for (let i = 0; i< edges.length; i++) {\r\n            uint16Edges[i] = edges.charCodeAt(i);\r\n        }\r\n        return [new LOUDSTrie(bitVector, uint16Edges), nodes];\r\n    }\r\n}","import { LOUDSTrieBuilder } from \"./LOUDSTrieBuilder\";\r\nimport { CompactHiraganaString } from \"./CompactHiraganaString\";\r\nimport { BitList } from \"./BitList\";\r\n\r\nexport class CompactDictionaryBuilder {\r\n    public static build(dict: Map<string, string[]>): ArrayBuffer {\r\n        // remove some keys\r\n        const keysToRemove = new Array<string>();\r\n        for (const key of dict.keys()) {\r\n            try {\r\n                CompactHiraganaString.encodeString(key);\r\n            } catch (e) {\r\n                keysToRemove.push(key);\r\n                console.log(\"skipped the world: \" + key);\r\n            }\r\n        }\r\n        for (const key of keysToRemove) {\r\n            dict.delete(key);\r\n        }\r\n\r\n        // build key trie\r\n        const keys = Array.from(dict.keys()).sort();\r\n        const keyTrie = LOUDSTrieBuilder.build(keys)[0];\r\n\r\n        // build value trie\r\n        const valuesSet = new Set<string>();\r\n        for (const value of dict.values()) {\r\n            for (const v of value) {\r\n                valuesSet.add(v);\r\n            }\r\n        }\r\n        const values = Array.from(valuesSet.values()).sort();\r\n        const valueTrie = LOUDSTrieBuilder.build(values)[0];\r\n\r\n        // build trie mapping\r\n        let mappingCount = 0;\r\n        for (const i of dict.values()) {\r\n            mappingCount += i.length;\r\n        }\r\n        const mapping = new Uint32Array(mappingCount);\r\n        let mappingIndex = 0;\r\n        const mappingBitList = new BitList();\r\n        for (let i = 1; i <= keyTrie.size()+1; i++) {\r\n            let key = keyTrie.reverseLookup(i);\r\n            mappingBitList.add(false);\r\n            let values = dict.get(key);\r\n            if (values != undefined) {\r\n                for (let j = 0; j < values.length; j++) {\r\n                    mappingBitList.add(true);\r\n                    mapping[mappingIndex] = valueTrie.lookup(values[j]);\r\n                    mappingIndex++;\r\n                }\r\n            }\r\n        }\r\n\r\n        // calculate output size\r\n        const keyTrieDataSize = 8 + keyTrie.edges.length + ((keyTrie.bitVector.size() + 63) >>> 6) * 8;\r\n        const valueTrieDataSize = 8 + valueTrie.edges.length * 2 + ((valueTrie.bitVector.size() + 63) >>> 6) * 8;\r\n        const mappingDataSize = 8 + ((mappingBitList.size + 63) >>> 6) * 8 + mapping.length * 4;\r\n        const outputDataSize = keyTrieDataSize + valueTrieDataSize + mappingDataSize;\r\n\r\n        // ready output\r\n        const arrayBuffer = new ArrayBuffer(outputDataSize);\r\n        const dataView = new DataView(arrayBuffer);\r\n        let dataViewIndex = 0;\r\n\r\n        // output key trie\r\n        dataView.setInt32(dataViewIndex, keyTrie.edges.length);\r\n        dataViewIndex += 4;\r\n        for (let i = 0; i < keyTrie.edges.length; i++) {\r\n            const compactChar = CompactHiraganaString.encodeChar(keyTrie.edges[i]);\r\n            dataView.setUint8(dataViewIndex, compactChar);\r\n            dataViewIndex += 1;\r\n        }\r\n        dataView.setInt32(dataViewIndex, keyTrie.bitVector.size());\r\n        dataViewIndex += 4;\r\n        const keyTrieBitVectorWords = keyTrie.bitVector.words;\r\n        for (let i = 0; i < keyTrieBitVectorWords.length >>> 1; i++) {\r\n            dataView.setUint32(dataViewIndex, keyTrieBitVectorWords[i * 2 + 1]);\r\n            dataViewIndex += 4;\r\n            dataView.setUint32(dataViewIndex, keyTrieBitVectorWords[i * 2]);\r\n            dataViewIndex += 4;\r\n        }\r\n\r\n        // output value trie\r\n        dataView.setInt32(dataViewIndex, valueTrie.edges.length);\r\n        dataViewIndex += 4;\r\n        for (let i = 0; i < valueTrie.edges.length; i++) {\r\n            dataView.setUint16(dataViewIndex, valueTrie.edges[i]);\r\n            dataViewIndex += 2;\r\n        }\r\n        dataView.setInt32(dataViewIndex, valueTrie.bitVector.size());\r\n        dataViewIndex += 4;\r\n        const valueTrieBitVectorWords = valueTrie.bitVector.words;\r\n        for (let i = 0; i < valueTrieBitVectorWords.length >>> 1; i++) {\r\n            dataView.setUint32(dataViewIndex, valueTrieBitVectorWords[i * 2 + 1]);\r\n            dataViewIndex += 4;\r\n            dataView.setUint32(dataViewIndex, valueTrieBitVectorWords[i * 2]);\r\n            dataViewIndex += 4;\r\n        }\r\n        \r\n        // output mapping\r\n        dataView.setInt32(dataViewIndex, mappingBitList.size);\r\n        dataViewIndex += 4;\r\n        const mappingWordsLen = (mappingBitList.size + 63) >> 6;\r\n        for (let i = 0; i < mappingWordsLen; i++) {\r\n            dataView.setUint32(dataViewIndex, mappingBitList.words[i * 2 + 1]);\r\n            dataViewIndex += 4;\r\n            dataView.setUint32(dataViewIndex, mappingBitList.words[i * 2]);\r\n            dataViewIndex += 4;\r\n        }\r\n        // TODO: padding to 64bit words\r\n        dataView.setInt32(dataViewIndex, mapping.length);\r\n        dataViewIndex += 4;\r\n        for (let i = 0; i < mapping.length; i++) {\r\n            dataView.setUint32(dataViewIndex, mapping[i]);\r\n            dataViewIndex += 4;\r\n        }\r\n\r\n        // check data size\r\n        if (dataViewIndex !== outputDataSize) {\r\n            throw new Error(`file size is not valid: expected=${outputDataSize} actual=${dataViewIndex}`);\r\n        }\r\n\r\n        return arrayBuffer;\r\n    }\r\n}","export class DoubleArray {\r\n    base: Int16Array;\r\n    check: Int16Array;\r\n    charConverter: (arg: number)=>number;\r\n    charSize: number;\r\n\r\n    constructor(base: Int16Array, check: Int16Array, charConverter: (arg: number)=>number, charSize: number) {\r\n        this.base = base;\r\n        this.check = check;\r\n        this.charConverter = charConverter;\r\n        this.charSize = charSize;\r\n    }\r\n\r\n    public traverse(n: number, k: number): number {\r\n        const m = this.base[n] + k;\r\n        if (this.check[m] == n) {\r\n            return m;\r\n        } else {\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    public lookup(str: string): number {\r\n        if (str.length == 0) {\r\n            return 0;\r\n        }\r\n        let n = 0;\r\n        for (let i = 0; i < str.length; i++) {\r\n            const c = this.charConverter(str.charCodeAt(i))\r\n            if (c < 1) {\r\n                throw new Error();\r\n            }\r\n            n = this.traverse(n, c);\r\n            if (n == -1) {\r\n                return -1;\r\n            }\r\n        }\r\n        return n;\r\n    }\r\n\r\n    public *commonPrefixSearch(key: string): IterableIterator<number> {\r\n        let index = 0;\r\n        let offset = 0;\r\n        while (index != -1) {\r\n            const lastIndex = index;\r\n            if (offset == key.length) {\r\n                index = -1;\r\n            } else {\r\n                const c = this.charConverter(key.charCodeAt(offset));\r\n                index = this.traverse(index, c);\r\n                offset++;\r\n            }\r\n            yield lastIndex;\r\n        }\r\n    }\r\n\r\n    public *predictiveSearch(key: string): IterableIterator<number> {\r\n        const n = this.lookup(key);\r\n        if (n == -1) {\r\n            return;\r\n        }\r\n        yield *this.visitRecursive(n);\r\n    }\r\n\r\n    public *visitRecursive(n: number): IterableIterator<number> {\r\n        yield n;\r\n        for (let i = 0; i < this.charSize; i++) {\r\n            const m = this.base[n] + i + 1;\r\n            if (m >= this.check.length) {\r\n                return;\r\n            }\r\n            if (this.check[m] == n) {\r\n                yield *this.visitRecursive(m);\r\n            }\r\n        }\r\n    }\r\n\r\n}","import { BitList } from \"./BitList\";\r\n\r\nclass TernaryRegexNode {\r\n    value: number = 0;\r\n    child: TernaryRegexNode | null = null;\r\n    left: TernaryRegexNode | null = null;\r\n    right: TernaryRegexNode | null = null;\r\n    level: number = 0;\r\n    successor(): TernaryRegexNode {\r\n        let t = this.right!;\r\n        while (t.left != null) {\r\n            t = t.left;\r\n        }\r\n        return t;\r\n    }\r\n    predecessor(): TernaryRegexNode {\r\n        let t = this.left!;\r\n        while (t.left != null) {\r\n            t = t.left;\r\n        }\r\n        while (t.right != null) {\r\n            t = t.right;\r\n        }\r\n        return t;\r\n    }\r\n}\r\n\r\nfunction skew(t: TernaryRegexNode | null): TernaryRegexNode | null {\r\n    if (t == null) {\r\n        return null;\r\n    } else if (t.left == null) {\r\n        return t;\r\n    } else if (t.left.level == t.level) {\r\n        let l = t.left;\r\n        t.left = l.right;\r\n        l.right = t;\r\n        return l;\r\n    } else {\r\n        return t;\r\n    }\r\n}\r\n\r\nfunction split(t: TernaryRegexNode | null): TernaryRegexNode | null {\r\n    if (t == null) {\r\n        return null;\r\n    } else if (t.right == null || t.right.right == null) {\r\n        return t;\r\n    } else if (t.level == t.right.right.level) {\r\n        let r = t.right;\r\n        t.right = r.left;\r\n        r.left = t;\r\n        r.level = r.level + 1;\r\n        return r;\r\n    } else {\r\n        return t;\r\n    }\r\n}\r\n\r\nfunction add(node: TernaryRegexNode | null, word: string, offset: number): TernaryRegexNode | null {\r\n    if (offset < word.length) {\r\n        let [node_, target, inserted] = insert(word.charCodeAt(offset), node);\r\n        if (inserted || target.child != null) {\r\n            target.child = add(target.child, word, offset + 1);\r\n        }\r\n        return node_;\r\n    } else {\r\n        return null;\r\n    }\r\n}\r\n\r\nfunction* traverseSiblings(node: TernaryRegexNode | null): IterableIterator<TernaryRegexNode> {\r\n    if (node != null) {\r\n        yield* traverseSiblings(node.left);\r\n        yield node;\r\n        yield* traverseSiblings(node.right);\r\n    }\r\n}\r\n\r\nfunction insert(x: number, t: TernaryRegexNode | null): [TernaryRegexNode | null, TernaryRegexNode, boolean] {\r\n    let r: TernaryRegexNode | null;\r\n    let inserted = false;\r\n    if (t == null) {\r\n        r = new TernaryRegexNode();\r\n        r.value = x;\r\n        r.level = 1;\r\n        r.left = null;\r\n        r.right = null;\r\n        return [r, r, true];\r\n    } else if (x < t.value) {\r\n        [t.left, r, inserted] = insert(x, t.left);\r\n    } else if (x > t.value) {\r\n        [t.right, r, inserted] = insert(x, t.right);\r\n    } else {\r\n        return [t, t, false];\r\n    }\r\n    t = skew(t);\r\n    t = split(t);\r\n    return [t, r, inserted];\r\n}\r\n\r\nexport class TernaryRegexGenerator {\r\n    or: string;\r\n    beginGroup: string;\r\n    endGroup: string;\r\n    beginClass: string;\r\n    endClass: string;\r\n    newline: string;\r\n    root: TernaryRegexNode | null;\r\n    escapedCharacters: BitList;\r\n\r\n    constructor(or: string, beginGroup: string, endGroup: string, beginClass: string, endClass: string, newline: string, escape: string) {\r\n        this.or = or;\r\n        this.beginGroup = beginGroup;\r\n        this.endGroup = endGroup;\r\n        this.beginClass = beginClass;\r\n        this.endClass = endClass;\r\n        this.newline = newline;\r\n        this.root = null;\r\n        this.escapedCharacters = TernaryRegexGenerator.initializeEscapeCharacters(escape);\r\n    }\r\n\r\n    static getDEFAULT(): TernaryRegexGenerator {\r\n        const ESCAPE = \"\\\\.[]{}()*+-?^$|\";\r\n\t\treturn new TernaryRegexGenerator(\"|\", \"(\", \")\", \"[\", \"]\", \"\", ESCAPE);\r\n\t}\r\n\r\n    static initializeEscapeCharacters(escape: string): BitList {\r\n        const bits = new BitList(128);\r\n        for (let i = 0; i < escape.length; i++) {\r\n            const c = escape.charCodeAt(i)\r\n            if (c < 128) {\r\n                bits.set(c, true);\r\n            } else {\r\n                throw new Error(\"アスキー文字のみエスケープできます\")\r\n            }\r\n        }\r\n        return bits;\r\n    }\r\n\r\n    add(word: string) {\r\n        if (word.length == 0) {\r\n            return;\r\n        }\r\n        this.root = add(this.root, word, 0);\r\n    }\r\n\r\n    generateStub(node: TernaryRegexNode | null): string {\r\n        let buf = \"\";\r\n        let brother = 0;\r\n        let haschild = 0;\r\n        for (let n of traverseSiblings(node)) {\r\n            brother++;\r\n            if (n.child != null) {\r\n                haschild++;\r\n            }\r\n        }\r\n        const nochild = brother - haschild;\r\n\r\n        if (brother > 1 && haschild > 0) {\r\n            buf += this.beginGroup;\r\n        }\r\n\r\n        if (nochild > 0) {\r\n            if (nochild > 1) {\r\n                buf += this.beginClass;\r\n            }\r\n            for (let n of traverseSiblings(node)) {\r\n                if (n.child != null) {\r\n                    continue;\r\n                }\r\n                if (n.value < 128 && this.escapedCharacters.get(n.value)) {\r\n                    buf += '\\\\';\r\n                }\r\n                buf += String.fromCharCode(n.value);\r\n            }\r\n            if (nochild > 1) {\r\n                buf += this.endClass;\r\n            }\r\n        }\r\n\r\n        if (haschild > 0) {\r\n            if (nochild > 0) {\r\n                buf += this.or;\r\n            }\r\n            for (let n of traverseSiblings(node)) {\r\n                if (n.child != null) {\r\n                    if (n.value < 128 && this.escapedCharacters.get(n.value)) {\r\n                        buf += '\\\\';\r\n                    }\r\n                    buf += String.fromCharCode(n.value)\r\n                    if (this.newline != null) { // TODO: always true\r\n                        buf += this.newline;\r\n                    }\r\n                    buf += this.generateStub(n.child)\r\n                    if (haschild > 1) {\r\n                        buf += this.or;\r\n                    }\r\n                }\r\n            }\r\n            if (haschild > 1) {\r\n                buf = buf.substring(0, buf.length - this.or.length);\r\n            }\r\n        }\r\n        if (brother > 1 && haschild > 0) {\r\n            buf += this.endGroup;\r\n        }\r\n        return buf;\r\n    }\r\n\r\n    generate(): string {\r\n        if (this.root == null) {\r\n            return \"\";\r\n        } else {\r\n            return this.generateStub(this.root);\r\n        }\r\n    }\r\n}","export class RomajiPredictiveResult {\r\n    prefix: string;\r\n    suffixes: string[];\r\n    constructor(prefix: string, suffixes: string[]) {\r\n        this.prefix = prefix;\r\n        this.suffixes = suffixes;\r\n    }\r\n}\r\n\r\nexport interface RomajiProcessor {\r\n    romajiToHiragana(romaji: string): string;\r\n    romajiToHiraganaPredictively(romaji: string): RomajiPredictiveResult;\r\n}","import { DoubleArray } from \"./DoubleArray\";\r\nimport { RomajiProcessor, RomajiPredictiveResult } from \"./RomajiProcessor\";\r\n\r\nexport class RomajiProcessor2 implements RomajiProcessor {\r\n    trie: DoubleArray;\r\n    hiraganaList: Array<string>;\r\n    remainList: Int8Array;\r\n\r\n    constructor(trie: DoubleArray, hiraganaList: string[], remainList: Int8Array) {\r\n        this.trie = trie;\r\n        this.hiraganaList = hiraganaList;\r\n        this.remainList = remainList;\r\n    }\r\n\r\n    public static build() {\r\n        const base = new Int16Array([0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, 31, 95, -1, 100, 121, 147, -1, 175, 182, 203, 229, 251, -1, 266, 284, 291, 302, 334, -1, 379, 401, 420, 432, 464, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 28, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, -1, -1, -1, -1, -1, -1, -1, 34, -1, -1, -1, -1, -1, -1, 76, -1, 93, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 118, -1, 136, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 149, -1, 158, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 160, -1, -1, -1, -1, 177, -1, 201, -1, -1, -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, 47, -1, 212, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 248, 86, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 269, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 317, -1, -1, -1, -1, -1, 293, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 319, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 343, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 360, -1, -1, -1, 361, -1, 362, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 384, -1, -1, -1, -1, 402, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, -1, 74, -1, -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, 83, -1, 427, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 445, -1]);\r\n        const check = new Int16Array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 98, 147, 0, 98, 99, 147, 99, 98, 99, 147, 100, 99, 99, 98, 171, 147, 270, 159, 99, 98, 322, 147, 135, 98, 99, 152, 135, 207, 99, 152, 135, 134, 221, 152, 310, 319, 135, 319, 310, 152, 199, 520, 135, 134, 199, 152, 221, 134, 199, 214, 183, 522, 221, 214, 199, 522, 539, 214, 527, 536, 199, 536, 527, 214, -1, -1, 216, 373, 100, 214, 216, 100, 100, 102, 216, 100, 100, 102, 102, 373, 216, 102, 100, 373, -1, -1, 216, 102, 100, -1, 100, 240, 100, 102, 103, 240, -1, 102, 103, 240, 103, -1, 103, -1, -1, 240, -1, -1, 103, 242, -1, 240, -1, 242, 103, -1, 103, 242, 103, -1, 104, -1, 266, 242, 104, -1, 266, 104, 104, 242, 266, 268, -1, 296, 104, 268, 266, 296, -1, 268, 104, 296, 104, -1, 104, 268, 266, 296, 106, -1, 301, 268, 106, 296, 301, 107, 106, 106, 301, 107, -1, -1, 106, 107, 301, 107, 110, -1, 106, 107, 301, -1, 106, -1, 303, 107, 108, 107, 303, 107, 108, -1, 303, -1, 108, 324, 108, 108, 303, 324, 108, -1, -1, 324, 303, 108, 108, -1, 108, 324, 108, -1, 109, 350, -1, 324, 109, 350, -1, -1, 109, 350, -1, -1, 109, -1, 109, 350, -1, -1, -1, 372, 109, 350, 110, 372, 109, -1, 110, 372, -1, -1, 110, -1, -1, 372, -1, 110, 110, 112, -1, 372, 387, 112, 110, -1, 387, 112, 110, 116, 387, -1, -1, 112, 112, -1, 387, 113, -1, 112, -1, 113, 387, 112, 114, 113, 412, -1, 114, -1, 412, 113, 114, 113, 412, 115, -1, 113, 114, 115, 412, 114, 115, 115, 114, -1, 412, -1, 114, 115, 406, -1, 423, 115, 406, 115, 423, -1, 406, 115, 423, -1, -1, -1, 406, -1, 423, 116, -1, -1, 406, 116, 423, -1, 116, 116, 438, -1, -1, -1, 438, 116, -1, -1, 438, 116, 116, 116, -1, 116, 438, 116, -1, 449, 453, 455, 438, 449, 453, 455, -1, 449, 453, 455, -1, -1, -1, 449, 453, 455, -1, -1, 118, 449, 453, 455, 118, 500, -1, -1, 118, 500, -1, -1, -1, 500, 118, -1, -1, -1, -1, 500, 118, 118, 119, 505, 118, 500, 119, 505, -1, 119, 119, 505, 122, 122, 122, 122, 119, 505, -1, -1, -1, 120, 119, 505, 119, 120, 119, -1, 541, 120, -1, 120, 541, 121, 120, 120, 541, 121, -1, -1, 120, 120, 541, 120, 120, 120, 585, 121, 541, -1, 585, -1, -1, 121, 585, -1, -1, 121, -1, 122, 585, 122, -1, -1, -1, 122, 585, -1, -1, 122, -1, -1, 122, 122, 122, 122, 122, -1, -1, 122, -1, -1, -1, -1, -1, 122, -1, -1, -1, 122, 122]);\r\n        const remainList = new Int8Array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, -1, 0, 0, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, -1, -1, 0, -1, 0, 0, 0, -1, -1, 0, 0, 1, -1, 0, -1, -1, 0, -1, -1, 0, 0, -1, 0, -1, 0, 0, -1, -1, 0, -1, -1, 0, -1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, -1, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 0, 0, 1, 0, -1, 0, 0, 0, -1, -1, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 1, 0, 0, 0, -1, -1, 0, 0, -1, 0, -1, -1, 0, -1, -1, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, -1, -1, 1, -1, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, -1, -1, 0, 0, -1, -1, 0, -1, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, -1, -1, 0, -1, -1, 0, 1, -1, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 1, -1, 0, 0, -1, 0, -1, -1, 0, 0, -1, 0, 1, 0, 0, 0, -1, 0, -1, 0, -1, -1, -1, 0, -1, 0, 0, -1, -1, 0, 0, 0, -1, -1, 0, 0, -1, -1, -1, 0, 0, -1, -1, 0, -1, 1, 0, -1, -1, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, -1, -1, -1, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 1, 0, -1, -1, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, -1, 1, -1, 0, 0, 0, -1, 0, -1, -1, 0, 0, -1, -1, 1, -1, 0, 0, 0, -1, -1, -1, 0, 0, -1, -1, 0, -1, -1, 0, 0, 0, 0, 0, -1, -1, 0, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, 1]);\r\n        const hiraganaList: Array<string> = [\"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"、\", \"ー\", \"。\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"「\", \"\", \"」\", \"\", \"\", \"\", \"あ\", \"\", \"\", \"\", \"え\", \"\", \"\", \"\", \"い\", \"\", \"\", \"\", \"\", \"ん\", \"お\", \"\", \"\", \"\", \"\", \"\", \"う\", \"\", \"\", \"\", \"\", \"\", \"ば\", \"っ\", \"びゃ\", \"〜\", \"べ\", \"か\", \"びぇ\", \"っ\", \"び\", \"せ\", \"びぃ\", \"\", \"\", \"し\", \"ぼ\", \"でゅ\", \"びょ\", \"ふゅ\", \"っ\", \"こ\", \"ぶ\", \"ゎ\", \"びゅ\", \"ちゃ\", \"\", \"く\", \"ちゃ\", \"ちぇ\", \"てゅ\", \"\", \"ちぇ\", \"ち\", \"でぃ\", \"ふゃ\", \"ちぃ\", \"ヵ\", \"\", \"ちょ\", \"っ\", \"ヶ\", \"ちょ\", \"でゃ\", \"w\", \"ちゅ\", \"どぅ\", \"でぇ\", \"ちゅ\", \"ふょ\", \"\", \"でぃ\", \"どぁ\", \"っ\", \"ゑ\", \"ふゅ\", \"どぇ\", \"でょ\", \"ゐ\", \"ゎ\", \"どぃ\", \"ヵ\", \"\", \"でゅ\", \"っ\", \"ヶ\", \"どぉ\", \"\", \"\", \"ぢゃ\", \"てぃ\", \"だ\", \"どぅ\", \"ぢぇ\", \"っ\", \"で\", \"ふぁ\", \"ぢぃ\", \"\", \"ぢ\", \"ふぇ\", \"っ\", \"とぅ\", \"ぢょ\", \"ふぃ\", \"ど\", \"\", \"\", \"\", \"ぢゅ\", \"ふぉ\", \"づ\", \"\", \"\", \"ぐぁ\", \"\", \"ふ\", \"が\", \"ぐぇ\", \"\", \"\", \"げ\", \"ぐぃ\", \"っ\", \"\", \"ぎ\", \"\", \"\", \"ぐぉ\", \"\", \"\", \"ご\", \"ぎゃ\", \"\", \"ぐぅ\", \"\", \"ぎぇ\", \"ぐ\", \"\", \"\", \"ぎぃ\", \"\", \"\", \"は\", \"\", \"ふぁ\", \"ぎょ\", \"へ\", \"\", \"ふぇ\", \"っ\", \"ひ\", \"ぎゅ\", \"ふぃ\", \"ひゃ\", \"\", \"じゃ\", \"ほ\", \"ひぇ\", \"ふぉ\", \"じぇ\", \"\", \"ひぃ\", \"ふ\", \"じぃ\", \"\", \"\", \"\", \"ひょ\", \"\", \"じょ\", \"じゃ\", \"\", \"くぁ\", \"ひゅ\", \"じぇ\", \"じゅ\", \"くぇ\", \"か\", \"じ\", \"っ\", \"くぃ\", \"け\", \"\", \"\", \"じょ\", \"き\", \"くぉ\", \"っ\", \"ん\", \"\", \"じゅ\", \"こ\", \"くぅ\", \"\", \"\", \"\", \"きゃ\", \"く\", \"ぁ\", \"\", \"きぇ\", \"\", \"ぇ\", \"\", \"きぃ\", \"\", \"ぃ\", \"ゃ\", \"\", \"っ\", \"きょ\", \"ぇ\", \"ぉ\", \"\", \"\", \"ぃ\", \"きゅ\", \"\", \"ぅ\", \"\", \"\", \"ょ\", \"\", \"\", \"ま\", \"みゃ\", \"\", \"ゅ\", \"め\", \"みぇ\", \"\", \"\", \"み\", \"みぃ\", \"\", \"\", \"っ\", \"\", \"も\", \"みょ\", \"\", \"\", \"\", \"にゃ\", \"む\", \"みゅ\", \"な\", \"にぇ\", \"\", \"\", \"ね\", \"にぃ\", \"\", \"\", \"に\", \"\", \"\", \"にょ\", \"\", \"ん\", \"の\", \"ぱ\", \"\", \"にゅ\", \"ぴゃ\", \"ぺ\", \"ぬ\", \"\", \"ぴぇ\", \"ぴ\", \"\", \"\", \"ぴぃ\", \"\", \"\", \"ぽ\", \"っ\", \"\", \"ぴょ\", \"くぁ\", \"\", \"ぷ\", \"\", \"くぇ\", \"ぴゅ\", \"\", \"ら\", \"くぃ\", \"りゃ\", \"\", \"れ\", \"\", \"りぇ\", \"くぉ\", \"り\", \"っ\", \"りぃ\", \"さ\", \"\", \"く\", \"ろ\", \"せ\", \"りょ\", \"っ\", \"\", \"し\", \"る\", \"\", \"りゅ\", \"\", \"\", \"そ\", \"しゃ\", \"\", \"しゃ\", \"っ\", \"しぇ\", \"す\", \"しぇ\", \"\", \"し\", \"\", \"しぃ\", \"\", \"\", \"\", \"しょ\", \"\", \"しょ\", \"た\", \"\", \"\", \"しゅ\", \"て\", \"しゅ\", \"\", \"\", \"ち\", \"てゃ\", \"\", \"\", \"\", \"てぇ\", \"と\", \"\", \"\", \"てぃ\", \"\", \"っ\", \"つ\", \"\", \"\", \"てょ\", \"\", \"\", \"つぁ\", \"とぁ\", \"ちゃ\", \"てゅ\", \"つぇ\", \"とぇ\", \"ちぇ\", \"\", \"つぃ\", \"とぃ\", \"ちぃ\", \"\", \"\", \"\", \"つぉ\", \"とぉ\", \"ちょ\", \"\", \"\", \"ゔぁ\", \"つ\", \"とぅ\", \"ちゅ\", \"ゔぇ\", \"ゔゃ\", \"\", \"\", \"ゔぃ\", \"ゔぇ\", \"\", \"\", \"\", \"ゔぃ\", \"ゔぉ\", \"\", \"\", \"\", \"\", \"ゔょ\", \"ゔ\", \"っ\", \"わ\", \"うぁ\", \"\", \"ゔゅ\", \"うぇ\", \"うぇ\", \"\", \"\", \"うぃ\", \"うぃ\", \"‥\", \"〜\", \"…\", \"・\", \"を\", \"うぉ\", \"\", \"\", \"\", \"ぁ\", \"う\", \"う\", \"っ\", \"ぇ\", \"\", \"\", \"ゃ\", \"ぃ\", \"\", \"\", \"ぇ\", \"や\", \"ん\", \"ぉ\", \"ぃ\", \"いぇ\", \"\", \"\", \"\", \"ぅ\", \"ょ\", \"\", \"っ\", \"\", \"じゃ\", \"よ\", \"ゅ\", \"\", \"じぇ\", \"\", \"\", \"ゆ\", \"じぃ\", \"\", \"\", \"っ\", \"\", \"『\", \"じょ\", \"』\", \"\", \"\", \"\", \"ざ\", \"じゅ\", \"\", \"\", \"ぜ\", \"\", \"\", \"←\", \"じ\", \"↓\", \"↑\", \"→\", \"\", \"\", \"ぞ\", \"\", \"\", \"\", \"\", \"\", \"ず\", \"\", \"\", \"\", \"\", \"っ\"];\r\n        const code = function (c: number): number {\r\n            return c;\r\n        }\r\n        const trie = new DoubleArray(base, check, code, 128);\r\n        return new RomajiProcessor2(trie, hiraganaList, remainList);\r\n    }\r\n\r\n    public romajiToHiragana(romaji: string): string {\r\n        let buffer = \"\";\r\n        let cursor = 0;\r\n        while (cursor < romaji.length) {\r\n            let longestNode = -1;\r\n            let length = -1;\r\n            for (let i of this.trie.commonPrefixSearch(romaji.substring(cursor))) {\r\n                if (this.remainList[i] != -1) {\r\n                    longestNode = i;\r\n                }\r\n                length++;\r\n            }\r\n            if (longestNode == -1) {\r\n                buffer = buffer + romaji.charAt(cursor);\r\n                cursor++;\r\n            } else {\r\n                buffer = buffer + this.hiraganaList[longestNode];\r\n                cursor = cursor + length - this.remainList[longestNode];\r\n            }\r\n        }\r\n        return buffer;\r\n    }\r\n\r\n    public romajiToHiraganaPredictively(romaji: string): RomajiPredictiveResult {\r\n        let builder = \"\";\r\n        let cursor = 0;\r\n        while (cursor < romaji.length) {\r\n            let longestNode = -1;\r\n            let length = 0;\r\n            for (let node of this.trie.commonPrefixSearch(romaji.substring(cursor))) {\r\n                if (this.remainList[node] != -1) {\r\n                    longestNode = node;\r\n                }\r\n                length++;\r\n            }\r\n            if (length+cursor-1 == romaji.length) {\r\n                let set = new Set<string>();\r\n                for (let node of this.trie.predictiveSearch(romaji.substring(cursor))) {\r\n                    if (this.remainList[node] != -1) {\r\n                        set.add(this.hiraganaList[node]);\r\n                    }\r\n                }\r\n                let list = new Array<string>();\r\n                for (let e of set) {\r\n                    list.push(e);\r\n                }\r\n                if (list.length == 1) {\r\n                    builder = builder + list[0];\r\n                    return new RomajiPredictiveResult(builder, [\"\"]);\r\n                } else {\r\n                    return new RomajiPredictiveResult(builder, list);\r\n                }\r\n            } else if (longestNode >= 0) {\r\n                builder = builder + this.hiraganaList[longestNode];\r\n                cursor = cursor + length - 1 - this.remainList[longestNode];\r\n            } else {\r\n                builder = builder + romaji[cursor];\r\n                cursor++;\r\n            }\r\n        }\r\n        return new RomajiPredictiveResult(builder, [\"\"]);\r\n    }\r\n}","import { CompactDictionary } from \"./CompactDictionary\";\r\nimport {zen2han_conv, han2zen_conv, hira2kata_conv} from \"./CharacterConverter\";\r\nimport { TernaryRegexGenerator } from \"./TernaryRegexGenerator\";\r\nimport { RomajiProcessor2 } from \"./RomajiProcessor2\";\r\nimport { RomajiProcessor } from \"./RomajiProcessor\";\r\nexport type Rxop = [string, string, string, string, string, string, string]\r\nexport class Migemo {\r\n    dict: CompactDictionary | null;\r\n    rxop: Rxop | null;\r\n    processor: RomajiProcessor;\r\n    constructor() {\r\n        this.dict = null;\r\n        this.rxop = null;\r\n        this.processor = RomajiProcessor2.build();\r\n    }\r\n    queryAWord(word: string): string {\r\n        const generator = this.rxop === null ? TernaryRegexGenerator.getDEFAULT() : new TernaryRegexGenerator(this.rxop[0], this.rxop[1], this.rxop[2], this.rxop[3], this.rxop[4], this.rxop[5], this.rxop[6]);\r\n        // query自信はもちろん候補に加える\r\n        generator.add(word);\r\n        // queryそのものでの辞書引き\r\n        const lower = word.toLowerCase();\r\n        if (this.dict != null) {\r\n            for (const word of this.dict.predictiveSearch(lower)) {\r\n                generator.add(word);\r\n            }\r\n        }\r\n        // queryを全角にして候補に加える\r\n        const zen = han2zen_conv(word);\r\n        generator.add(zen);\r\n        // queryを半角にして候補に加える\r\n        const han = zen2han_conv(word);\r\n        generator.add(han);\r\n\r\n        // 平仮名、カタカナ、及びそれによる辞書引き追加\r\n        const hiraganaResult = this.processor.romajiToHiraganaPredictively(lower);\r\n        for (const a of hiraganaResult.suffixes) {\r\n            const hira = hiraganaResult.prefix + a;\r\n            generator.add(hira);\r\n            // 平仮名による辞書引き\r\n            if (this.dict != null) {\r\n                for (const b of this.dict.predictiveSearch(hira)) {\r\n                    generator.add(b);\r\n                }\r\n            }\r\n            // 片仮名文字列を生成し候補に加える\r\n            const kata = hira2kata_conv(hira);\r\n            generator.add(kata);\r\n            // 半角カナを生成し候補に加える\r\n            generator.add(zen2han_conv(kata));\r\n        }\r\n        return generator.generate();\r\n    }\r\n\r\n    query(word: string): string {\r\n        if (word == \"\") {\r\n            return \"\";\r\n        }\r\n        const words = this.parseQuery(word);\r\n        let result = \"\";\r\n        for (const w of words) {\r\n            result += this.queryAWord(w);\r\n        }\r\n        return result;\r\n    }\r\n\r\n    setDict(dict: CompactDictionary | null) {\r\n        this.dict = dict;\r\n    }\r\n\r\n    setRxop(rxop: Rxop | null) {\r\n        this.rxop = rxop;\r\n    }\r\n\r\n    setRomajiProcessor(processor: RomajiProcessor) {\r\n        this.processor = processor;\r\n    }\r\n\r\n    *parseQuery(query: string): IterableIterator<string> {\r\n        const re = /[^A-Z\\s]+|[A-Z]{2,}|([A-Z][^A-Z\\s]+)|([A-Z]\\s*$)/g;\r\n        let myArray: RegExpExecArray|null;\r\n        while ((myArray = re.exec(query)) !== null) {\r\n            yield myArray[0];\r\n        }\r\n    }\r\n}","import {binarySearch} from \"./utils\";\r\nimport { RomajiPredictiveResult, RomajiProcessor } from \"./RomajiProcessor\";\r\n\r\nexport class RomanEntry {\r\n    roman: string;\r\n    hiragana: string;\r\n    remain: number;\r\n    index: number;\r\n    public constructor(roman: string, hiragana: string, remain: number) {\r\n        this.roman = roman;\r\n        this.hiragana = hiragana;\r\n        this.remain = remain;\r\n        this.index = RomanEntry.calculateIndex(roman);\r\n    }\r\n    static _calculateIndex(roman: string, start:number, end:number):number {\r\n        let result = 0;\r\n        for (let i = 0; i < 4; i++) {\r\n            const index = i + start;\r\n            const c = index < roman.length && index < end ? roman.charCodeAt(index) : 0;\r\n            result |= c;\r\n            if (i < 3) {\r\n                result <<= 8;\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n    static calculateIndex(roman: string): number {\r\n        return RomanEntry._calculateIndex(roman, 0, 4);\r\n    }\r\n\r\n}\r\n\r\nconst ROMAN_ENTRIES: RomanEntry[] = [\r\n    new RomanEntry(\"-\", \"ー\", 0),\r\n    new RomanEntry(\"~\", \"〜\", 0),\r\n    new RomanEntry(\".\", \"。\", 0),\r\n    new RomanEntry(\",\", \"、\", 0),\r\n    new RomanEntry(\"z/\", \"・\", 0),\r\n    new RomanEntry(\"z.\", \"…\", 0),\r\n    new RomanEntry(\"z,\", \"‥\", 0),\r\n    new RomanEntry(\"zh\", \"←\", 0),\r\n    new RomanEntry(\"zj\", \"↓\", 0),\r\n    new RomanEntry(\"zk\", \"↑\", 0),\r\n    new RomanEntry(\"zl\", \"→\", 0),\r\n    new RomanEntry(\"z-\", \"〜\", 0),\r\n    new RomanEntry(\"z[\", \"『\", 0),\r\n    new RomanEntry(\"z]\", \"』\", 0),\r\n    new RomanEntry(\"[\", \"「\", 0),\r\n    new RomanEntry(\"]\", \"」\", 0),\r\n    new RomanEntry(\"va\", \"ゔぁ\", 0),\r\n    new RomanEntry(\"vi\", \"ゔぃ\", 0),\r\n    new RomanEntry(\"vu\", \"ゔ\", 0),\r\n    new RomanEntry(\"ve\", \"ゔぇ\", 0),\r\n    new RomanEntry(\"vo\", \"ゔぉ\", 0),\r\n    new RomanEntry(\"vya\", \"ゔゃ\", 0),\r\n    new RomanEntry(\"vyi\", \"ゔぃ\", 0),\r\n    new RomanEntry(\"vyu\", \"ゔゅ\", 0),\r\n    new RomanEntry(\"vye\", \"ゔぇ\", 0),\r\n    new RomanEntry(\"vyo\", \"ゔょ\", 0),\r\n    new RomanEntry(\"qq\", \"っ\", 1),\r\n    new RomanEntry(\"vv\", \"っ\", 1),\r\n    new RomanEntry(\"ll\", \"っ\", 1),\r\n    new RomanEntry(\"xx\", \"っ\", 1),\r\n    new RomanEntry(\"kk\", \"っ\", 1),\r\n    new RomanEntry(\"gg\", \"っ\", 1),\r\n    new RomanEntry(\"ss\", \"っ\", 1),\r\n    new RomanEntry(\"zz\", \"っ\", 1),\r\n    new RomanEntry(\"jj\", \"っ\", 1),\r\n    new RomanEntry(\"tt\", \"っ\", 1),\r\n    new RomanEntry(\"dd\", \"っ\", 1),\r\n    new RomanEntry(\"hh\", \"っ\", 1),\r\n    new RomanEntry(\"ff\", \"っ\", 1),\r\n    new RomanEntry(\"bb\", \"っ\", 1),\r\n    new RomanEntry(\"pp\", \"っ\", 1),\r\n    new RomanEntry(\"mm\", \"っ\", 1),\r\n    new RomanEntry(\"yy\", \"っ\", 1),\r\n    new RomanEntry(\"rr\", \"っ\", 1),\r\n    new RomanEntry(\"ww\", \"っ\", 1),\r\n    new RomanEntry(\"www\", \"w\", 2),\r\n    new RomanEntry(\"cc\", \"っ\", 1),\r\n    new RomanEntry(\"kya\", \"きゃ\", 0),\r\n    new RomanEntry(\"kyi\", \"きぃ\", 0),\r\n    new RomanEntry(\"kyu\", \"きゅ\", 0),\r\n    new RomanEntry(\"kye\", \"きぇ\", 0),\r\n    new RomanEntry(\"kyo\", \"きょ\", 0),\r\n    new RomanEntry(\"gya\", \"ぎゃ\", 0),\r\n    new RomanEntry(\"gyi\", \"ぎぃ\", 0),\r\n    new RomanEntry(\"gyu\", \"ぎゅ\", 0),\r\n    new RomanEntry(\"gye\", \"ぎぇ\", 0),\r\n    new RomanEntry(\"gyo\", \"ぎょ\", 0),\r\n    new RomanEntry(\"sya\", \"しゃ\", 0),\r\n    new RomanEntry(\"syi\", \"しぃ\", 0),\r\n    new RomanEntry(\"syu\", \"しゅ\", 0),\r\n    new RomanEntry(\"sye\", \"しぇ\", 0),\r\n    new RomanEntry(\"syo\", \"しょ\", 0),\r\n    new RomanEntry(\"sha\", \"しゃ\", 0),\r\n    new RomanEntry(\"shi\", \"し\", 0),\r\n    new RomanEntry(\"shu\", \"しゅ\", 0),\r\n    new RomanEntry(\"she\", \"しぇ\", 0),\r\n    new RomanEntry(\"sho\", \"しょ\", 0),\r\n    new RomanEntry(\"zya\", \"じゃ\", 0),\r\n    new RomanEntry(\"zyi\", \"じぃ\", 0),\r\n    new RomanEntry(\"zyu\", \"じゅ\", 0),\r\n    new RomanEntry(\"zye\", \"じぇ\", 0),\r\n    new RomanEntry(\"zyo\", \"じょ\", 0),\r\n    new RomanEntry(\"tya\", \"ちゃ\", 0),\r\n    new RomanEntry(\"tyi\", \"ちぃ\", 0),\r\n    new RomanEntry(\"tyu\", \"ちゅ\", 0),\r\n    new RomanEntry(\"tye\", \"ちぇ\", 0),\r\n    new RomanEntry(\"tyo\", \"ちょ\", 0),\r\n    new RomanEntry(\"cha\", \"ちゃ\", 0),\r\n    new RomanEntry(\"chi\", \"ち\", 0),\r\n    new RomanEntry(\"chu\", \"ちゅ\", 0),\r\n    new RomanEntry(\"che\", \"ちぇ\", 0),\r\n    new RomanEntry(\"cho\", \"ちょ\", 0),\r\n    new RomanEntry(\"cya\", \"ちゃ\", 0),\r\n    new RomanEntry(\"cyi\", \"ちぃ\", 0),\r\n    new RomanEntry(\"cyu\", \"ちゅ\", 0),\r\n    new RomanEntry(\"cye\", \"ちぇ\", 0),\r\n    new RomanEntry(\"cyo\", \"ちょ\", 0),\r\n    new RomanEntry(\"dya\", \"ぢゃ\", 0),\r\n    new RomanEntry(\"dyi\", \"ぢぃ\", 0),\r\n    new RomanEntry(\"dyu\", \"ぢゅ\", 0),\r\n    new RomanEntry(\"dye\", \"ぢぇ\", 0),\r\n    new RomanEntry(\"dyo\", \"ぢょ\", 0),\r\n    new RomanEntry(\"tsa\", \"つぁ\", 0),\r\n    new RomanEntry(\"tsi\", \"つぃ\", 0),\r\n    new RomanEntry(\"tse\", \"つぇ\", 0),\r\n    new RomanEntry(\"tso\", \"つぉ\", 0),\r\n    new RomanEntry(\"tha\", \"てゃ\", 0),\r\n    new RomanEntry(\"thi\", \"てぃ\", 0),\r\n    new RomanEntry(\"t'i\", \"てぃ\", 0),\r\n    new RomanEntry(\"thu\", \"てゅ\", 0),\r\n    new RomanEntry(\"the\", \"てぇ\", 0),\r\n    new RomanEntry(\"tho\", \"てょ\", 0),\r\n    new RomanEntry(\"t'yu\", \"てゅ\", 0),\r\n    new RomanEntry(\"dha\", \"でゃ\", 0),\r\n    new RomanEntry(\"dhi\", \"でぃ\", 0),\r\n    new RomanEntry(\"d'i\", \"でぃ\", 0),\r\n    new RomanEntry(\"dhu\", \"でゅ\", 0),\r\n    new RomanEntry(\"dhe\", \"でぇ\", 0),\r\n    new RomanEntry(\"dho\", \"でょ\", 0),\r\n    new RomanEntry(\"d'yu\", \"でゅ\", 0),\r\n    new RomanEntry(\"twa\", \"とぁ\", 0),\r\n    new RomanEntry(\"twi\", \"とぃ\", 0),\r\n    new RomanEntry(\"twu\", \"とぅ\", 0),\r\n    new RomanEntry(\"twe\", \"とぇ\", 0),\r\n    new RomanEntry(\"two\", \"とぉ\", 0),\r\n    new RomanEntry(\"t'u\", \"とぅ\", 0),\r\n    new RomanEntry(\"dwa\", \"どぁ\", 0),\r\n    new RomanEntry(\"dwi\", \"どぃ\", 0),\r\n    new RomanEntry(\"dwu\", \"どぅ\", 0),\r\n    new RomanEntry(\"dwe\", \"どぇ\", 0),\r\n    new RomanEntry(\"dwo\", \"どぉ\", 0),\r\n    new RomanEntry(\"d'u\", \"どぅ\", 0),\r\n    new RomanEntry(\"nya\", \"にゃ\", 0),\r\n    new RomanEntry(\"nyi\", \"にぃ\", 0),\r\n    new RomanEntry(\"nyu\", \"にゅ\", 0),\r\n    new RomanEntry(\"nye\", \"にぇ\", 0),\r\n    new RomanEntry(\"nyo\", \"にょ\", 0),\r\n    new RomanEntry(\"hya\", \"ひゃ\", 0),\r\n    new RomanEntry(\"hyi\", \"ひぃ\", 0),\r\n    new RomanEntry(\"hyu\", \"ひゅ\", 0),\r\n    new RomanEntry(\"hye\", \"ひぇ\", 0),\r\n    new RomanEntry(\"hyo\", \"ひょ\", 0),\r\n    new RomanEntry(\"bya\", \"びゃ\", 0),\r\n    new RomanEntry(\"byi\", \"びぃ\", 0),\r\n    new RomanEntry(\"byu\", \"びゅ\", 0),\r\n    new RomanEntry(\"bye\", \"びぇ\", 0),\r\n    new RomanEntry(\"byo\", \"びょ\", 0),\r\n    new RomanEntry(\"pya\", \"ぴゃ\", 0),\r\n    new RomanEntry(\"pyi\", \"ぴぃ\", 0),\r\n    new RomanEntry(\"pyu\", \"ぴゅ\", 0),\r\n    new RomanEntry(\"pye\", \"ぴぇ\", 0),\r\n    new RomanEntry(\"pyo\", \"ぴょ\", 0),\r\n    new RomanEntry(\"fa\", \"ふぁ\", 0),\r\n    new RomanEntry(\"fi\", \"ふぃ\", 0),\r\n    new RomanEntry(\"fu\", \"ふ\", 0),\r\n    new RomanEntry(\"fe\", \"ふぇ\", 0),\r\n    new RomanEntry(\"fo\", \"ふぉ\", 0),\r\n    new RomanEntry(\"fya\", \"ふゃ\", 0),\r\n    new RomanEntry(\"fyu\", \"ふゅ\", 0),\r\n    new RomanEntry(\"fyo\", \"ふょ\", 0),\r\n    new RomanEntry(\"hwa\", \"ふぁ\", 0),\r\n    new RomanEntry(\"hwi\", \"ふぃ\", 0),\r\n    new RomanEntry(\"hwe\", \"ふぇ\", 0),\r\n    new RomanEntry(\"hwo\", \"ふぉ\", 0),\r\n    new RomanEntry(\"hwyu\", \"ふゅ\", 0),\r\n    new RomanEntry(\"mya\", \"みゃ\", 0),\r\n    new RomanEntry(\"myi\", \"みぃ\", 0),\r\n    new RomanEntry(\"myu\", \"みゅ\", 0),\r\n    new RomanEntry(\"mye\", \"みぇ\", 0),\r\n    new RomanEntry(\"myo\", \"みょ\", 0),\r\n    new RomanEntry(\"rya\", \"りゃ\", 0),\r\n    new RomanEntry(\"ryi\", \"りぃ\", 0),\r\n    new RomanEntry(\"ryu\", \"りゅ\", 0),\r\n    new RomanEntry(\"rye\", \"りぇ\", 0),\r\n    new RomanEntry(\"ryo\", \"りょ\", 0),\r\n    new RomanEntry(\"n'\", \"ん\", 0),\r\n    new RomanEntry(\"nn\", \"ん\", 0),\r\n    new RomanEntry(\"n\", \"ん\", 0),\r\n    new RomanEntry(\"xn\", \"ん\", 0),\r\n    new RomanEntry(\"a\", \"あ\", 0),\r\n    new RomanEntry(\"i\", \"い\", 0),\r\n    new RomanEntry(\"u\", \"う\", 0),\r\n    new RomanEntry(\"wu\", \"う\", 0),\r\n    new RomanEntry(\"e\", \"え\", 0),\r\n    new RomanEntry(\"o\", \"お\", 0),\r\n    new RomanEntry(\"xa\", \"ぁ\", 0),\r\n    new RomanEntry(\"xi\", \"ぃ\", 0),\r\n    new RomanEntry(\"xu\", \"ぅ\", 0),\r\n    new RomanEntry(\"xe\", \"ぇ\", 0),\r\n    new RomanEntry(\"xo\", \"ぉ\", 0),\r\n    new RomanEntry(\"la\", \"ぁ\", 0),\r\n    new RomanEntry(\"li\", \"ぃ\", 0),\r\n    new RomanEntry(\"lu\", \"ぅ\", 0),\r\n    new RomanEntry(\"le\", \"ぇ\", 0),\r\n    new RomanEntry(\"lo\", \"ぉ\", 0),\r\n    new RomanEntry(\"lyi\", \"ぃ\", 0),\r\n    new RomanEntry(\"xyi\", \"ぃ\", 0),\r\n    new RomanEntry(\"lye\", \"ぇ\", 0),\r\n    new RomanEntry(\"xye\", \"ぇ\", 0),\r\n    new RomanEntry(\"ye\", \"いぇ\", 0),\r\n    new RomanEntry(\"ka\", \"か\", 0),\r\n    new RomanEntry(\"ki\", \"き\", 0),\r\n    new RomanEntry(\"ku\", \"く\", 0),\r\n    new RomanEntry(\"ke\", \"け\", 0),\r\n    new RomanEntry(\"ko\", \"こ\", 0),\r\n    new RomanEntry(\"xka\", \"ヵ\", 0),\r\n    new RomanEntry(\"xke\", \"ヶ\", 0),\r\n    new RomanEntry(\"lka\", \"ヵ\", 0),\r\n    new RomanEntry(\"lke\", \"ヶ\", 0),\r\n    new RomanEntry(\"ga\", \"が\", 0),\r\n    new RomanEntry(\"gi\", \"ぎ\", 0),\r\n    new RomanEntry(\"gu\", \"ぐ\", 0),\r\n    new RomanEntry(\"ge\", \"げ\", 0),\r\n    new RomanEntry(\"go\", \"ご\", 0),\r\n    new RomanEntry(\"sa\", \"さ\", 0),\r\n    new RomanEntry(\"si\", \"し\", 0),\r\n    new RomanEntry(\"su\", \"す\", 0),\r\n    new RomanEntry(\"se\", \"せ\", 0),\r\n    new RomanEntry(\"so\", \"そ\", 0),\r\n    new RomanEntry(\"ca\", \"か\", 0),\r\n    new RomanEntry(\"ci\", \"し\", 0),\r\n    new RomanEntry(\"cu\", \"く\", 0),\r\n    new RomanEntry(\"ce\", \"せ\", 0),\r\n    new RomanEntry(\"co\", \"こ\", 0),\r\n    new RomanEntry(\"qa\", \"くぁ\", 0),\r\n    new RomanEntry(\"qi\", \"くぃ\", 0),\r\n    new RomanEntry(\"qu\", \"く\", 0),\r\n    new RomanEntry(\"qe\", \"くぇ\", 0),\r\n    new RomanEntry(\"qo\", \"くぉ\", 0),\r\n    new RomanEntry(\"kwa\", \"くぁ\", 0),\r\n    new RomanEntry(\"kwi\", \"くぃ\", 0),\r\n    new RomanEntry(\"kwu\", \"くぅ\", 0),\r\n    new RomanEntry(\"kwe\", \"くぇ\", 0),\r\n    new RomanEntry(\"kwo\", \"くぉ\", 0),\r\n    new RomanEntry(\"gwa\", \"ぐぁ\", 0),\r\n    new RomanEntry(\"gwi\", \"ぐぃ\", 0),\r\n    new RomanEntry(\"gwu\", \"ぐぅ\", 0),\r\n    new RomanEntry(\"gwe\", \"ぐぇ\", 0),\r\n    new RomanEntry(\"gwo\", \"ぐぉ\", 0),\r\n    new RomanEntry(\"za\", \"ざ\", 0),\r\n    new RomanEntry(\"zi\", \"じ\", 0),\r\n    new RomanEntry(\"zu\", \"ず\", 0),\r\n    new RomanEntry(\"ze\", \"ぜ\", 0),\r\n    new RomanEntry(\"zo\", \"ぞ\", 0),\r\n    new RomanEntry(\"ja\", \"じゃ\", 0),\r\n    new RomanEntry(\"ji\", \"じ\", 0),\r\n    new RomanEntry(\"ju\", \"じゅ\", 0),\r\n    new RomanEntry(\"je\", \"じぇ\", 0),\r\n    new RomanEntry(\"jo\", \"じょ\", 0),\r\n    new RomanEntry(\"jya\", \"じゃ\", 0),\r\n    new RomanEntry(\"jyi\", \"じぃ\", 0),\r\n    new RomanEntry(\"jyu\", \"じゅ\", 0),\r\n    new RomanEntry(\"jye\", \"じぇ\", 0),\r\n    new RomanEntry(\"jyo\", \"じょ\", 0),\r\n    new RomanEntry(\"ta\", \"た\", 0),\r\n    new RomanEntry(\"ti\", \"ち\", 0),\r\n    new RomanEntry(\"tu\", \"つ\", 0),\r\n    new RomanEntry(\"tsu\", \"つ\", 0),\r\n    new RomanEntry(\"te\", \"て\", 0),\r\n    new RomanEntry(\"to\", \"と\", 0),\r\n    new RomanEntry(\"da\", \"だ\", 0),\r\n    new RomanEntry(\"di\", \"ぢ\", 0),\r\n    new RomanEntry(\"du\", \"づ\", 0),\r\n    new RomanEntry(\"de\", \"で\", 0),\r\n    new RomanEntry(\"do\", \"ど\", 0),\r\n    new RomanEntry(\"xtu\", \"っ\", 0),\r\n    new RomanEntry(\"xtsu\", \"っ\", 0),\r\n    new RomanEntry(\"ltu\", \"っ\", 0),\r\n    new RomanEntry(\"ltsu\", \"っ\", 0),\r\n    new RomanEntry(\"na\", \"な\", 0),\r\n    new RomanEntry(\"ni\", \"に\", 0),\r\n    new RomanEntry(\"nu\", \"ぬ\", 0),\r\n    new RomanEntry(\"ne\", \"ね\", 0),\r\n    new RomanEntry(\"no\", \"の\", 0),\r\n    new RomanEntry(\"ha\", \"は\", 0),\r\n    new RomanEntry(\"hi\", \"ひ\", 0),\r\n    new RomanEntry(\"hu\", \"ふ\", 0),\r\n    new RomanEntry(\"fu\", \"ふ\", 0),\r\n    new RomanEntry(\"he\", \"へ\", 0),\r\n    new RomanEntry(\"ho\", \"ほ\", 0),\r\n    new RomanEntry(\"ba\", \"ば\", 0),\r\n    new RomanEntry(\"bi\", \"び\", 0),\r\n    new RomanEntry(\"bu\", \"ぶ\", 0),\r\n    new RomanEntry(\"be\", \"べ\", 0),\r\n    new RomanEntry(\"bo\", \"ぼ\", 0),\r\n    new RomanEntry(\"pa\", \"ぱ\", 0),\r\n    new RomanEntry(\"pi\", \"ぴ\", 0),\r\n    new RomanEntry(\"pu\", \"ぷ\", 0),\r\n    new RomanEntry(\"pe\", \"ぺ\", 0),\r\n    new RomanEntry(\"po\", \"ぽ\", 0),\r\n    new RomanEntry(\"ma\", \"ま\", 0),\r\n    new RomanEntry(\"mi\", \"み\", 0),\r\n    new RomanEntry(\"mu\", \"む\", 0),\r\n    new RomanEntry(\"me\", \"め\", 0),\r\n    new RomanEntry(\"mo\", \"も\", 0),\r\n    new RomanEntry(\"xya\", \"ゃ\", 0),\r\n    new RomanEntry(\"lya\", \"ゃ\", 0),\r\n    new RomanEntry(\"ya\", \"や\", 0),\r\n    new RomanEntry(\"wyi\", \"ゐ\", 0),\r\n    new RomanEntry(\"xyu\", \"ゅ\", 0),\r\n    new RomanEntry(\"lyu\", \"ゅ\", 0),\r\n    new RomanEntry(\"yu\", \"ゆ\", 0),\r\n    new RomanEntry(\"wye\", \"ゑ\", 0),\r\n    new RomanEntry(\"xyo\", \"ょ\", 0),\r\n    new RomanEntry(\"lyo\", \"ょ\", 0),\r\n    new RomanEntry(\"yo\", \"よ\", 0),\r\n    new RomanEntry(\"ra\", \"ら\", 0),\r\n    new RomanEntry(\"ri\", \"り\", 0),\r\n    new RomanEntry(\"ru\", \"る\", 0),\r\n    new RomanEntry(\"re\", \"れ\", 0),\r\n    new RomanEntry(\"ro\", \"ろ\", 0),\r\n    new RomanEntry(\"xwa\", \"ゎ\", 0),\r\n    new RomanEntry(\"lwa\", \"ゎ\", 0),\r\n    new RomanEntry(\"wa\", \"わ\", 0),\r\n    new RomanEntry(\"wi\", \"うぃ\", 0),\r\n    new RomanEntry(\"we\", \"うぇ\", 0),\r\n    new RomanEntry(\"wo\", \"を\", 0),\r\n    new RomanEntry(\"wha\", \"うぁ\", 0),\r\n    new RomanEntry(\"whi\", \"うぃ\", 0),\r\n    new RomanEntry(\"whu\", \"う\", 0),\r\n    new RomanEntry(\"whe\", \"うぇ\", 0),\r\n    new RomanEntry(\"who\", \"うぉ\", 0)]\r\n    .sort((a,b)=>a.index - b.index);\r\n\r\nexport class RomajiProcessor1 implements RomajiProcessor {\r\n    private roman_indexes: number[] = []\r\n    private roman_entries: RomanEntry[] = []\r\n\r\n    public constructor(entries: RomanEntry[]) {\r\n        this.roman_entries = entries.sort((a,b)=>a.index - b.index);\r\n        this.roman_indexes = this.roman_entries.map(e => e.index);\r\n    }\r\n\r\n    public static build(): RomajiProcessor1 {\r\n        return new RomajiProcessor1(ROMAN_ENTRIES)\r\n    }\r\n\r\n    public romajiToHiragana(romaji: string): string {\r\n        if (romaji.length == 0) {\r\n            return \"\";\r\n        }\r\n        let hiragana = \"\";\r\n        let start = 0;\r\n        let end = 1;\r\n        while (start < romaji.length) {\r\n            let lastFound = -1;\r\n            let lower = 0;\r\n            let upper = this.roman_indexes.length;\r\n            while (upper - lower > 1 && end <= romaji.length) {\r\n                const lowerKey = RomanEntry._calculateIndex(romaji, start, end);\r\n                lower = binarySearch(this.roman_indexes, lower, upper, lowerKey);\r\n                if (lower >= 0) {\r\n                    lastFound = lower;\r\n                } else {\r\n                    lower = -lower - 1;\r\n                }\r\n                const upperKey = lowerKey + (1 << (32 - 8 * (end - start)));\r\n                upper = binarySearch(this.roman_indexes, lower, upper, upperKey);\r\n                if (upper < 0) {\r\n                    upper = -upper - 1;\r\n                }\r\n                end++;\r\n            }\r\n            if (lastFound >= 0) {\r\n                const entry = this.roman_entries[lastFound];\r\n                hiragana = hiragana + entry.hiragana;\r\n                start = start + entry.roman.length - entry.remain;\r\n                end = start + 1;\r\n            } else {\r\n                hiragana = hiragana + romaji.charAt(start);\r\n                start++;\r\n                end = start + 1;\r\n            }\r\n        }\r\n        return hiragana;\r\n    }\r\n\r\n    public findRomanEntryPredicatively(roman: string, offset: number): Set<RomanEntry>  {\r\n        let lastFound = -1;\r\n        let startIndex = 0;\r\n        let endIndex = this.roman_indexes.length;\r\n        for (let i = 0; i < 4; i++) {\r\n            if (roman.length <= offset + i) {\r\n                break;\r\n            }\r\n            const startKey = RomanEntry._calculateIndex(roman, offset, offset + i + 1);\r\n            startIndex = binarySearch(this.roman_indexes, startIndex, endIndex, startKey);\r\n            if (startIndex >= 0) {\r\n                lastFound = startIndex;\r\n            } else {\r\n                startIndex = -startIndex - 1;\r\n            }\r\n            const endKey = startKey + (1 << (24 - 8 * i));\r\n            endIndex = binarySearch(this.roman_indexes, startIndex, endIndex, endKey);\r\n            if (endIndex < 0) {\r\n                endIndex = -endIndex - 1;\r\n            }\r\n            if (endIndex - startIndex == 1) {\r\n                return new Set([this.roman_entries[startIndex]]);\r\n            }\r\n        }\r\n        const result = new Set<RomanEntry>();\r\n        for (let i = startIndex; i < endIndex; i++) {\r\n            result.add(this.roman_entries[i]);\r\n        }\r\n        return result;\r\n    }\r\n\r\n    public romajiToHiraganaPredictively(romaji: string): RomajiPredictiveResult {\r\n        if (romaji.length == 0) {\r\n            return new RomajiPredictiveResult(\"\", [\"\"]);\r\n        }\r\n        let hiragana = \"\";\r\n        let start = 0;\r\n        let end = 1;\r\n        while (start < romaji.length) {\r\n            let lastFound = -1;\r\n            let lower = 0;\r\n            let upper = this.roman_indexes.length;\r\n            while (upper - lower > 1 && end <= romaji.length) {\r\n                const lowerKey = RomanEntry._calculateIndex(romaji, start, end);\r\n                lower = binarySearch(this.roman_indexes, lower, upper, lowerKey);\r\n                if (lower >= 0) {\r\n                    lastFound = lower;\r\n                } else {\r\n                    lower = -lower - 1;\r\n                }\r\n                const upperKey = lowerKey + (1 << (32 - 8 * (end - start)));\r\n                upper = binarySearch(this.roman_indexes, lower, upper, upperKey);\r\n                if (upper < 0) {\r\n                    upper = -upper - 1;\r\n                }\r\n                end++;\r\n            }\r\n            if (end > romaji.length && upper - lower > 1) {\r\n                const set = new Set<string>();\r\n                for (let i = lower; i < upper; i++) {\r\n                    const re = this.roman_entries[i];\r\n                    if (re.remain > 0) {\r\n                        let set2 = this.findRomanEntryPredicatively(romaji, end - 1 - re.remain);\r\n                        for (let re2 of set2) {\r\n                            if (re2.remain == 0) {\r\n                                set.add(re.hiragana + re2.hiragana);\r\n                            }\r\n                        }\r\n                    } else {\r\n                        set.add(re.hiragana);\r\n                    }\r\n                }\r\n                let list = new Array<string>();\r\n                for (let e of set) {\r\n                    list.push(e);\r\n                }\r\n                if (list.length == 1) {\r\n                    return new RomajiPredictiveResult(hiragana + list[0], [\"\"]);\r\n                } else {\r\n                    return new RomajiPredictiveResult(hiragana, list);\r\n                }\r\n            }\r\n            if (lastFound >= 0) {\r\n                const entry = this.roman_entries[lastFound];\r\n                hiragana = hiragana + entry.hiragana;\r\n                start = start + entry.roman.length - entry.remain;\r\n                end = start + 1;\r\n            } else {\r\n                hiragana = hiragana + romaji.charAt(start);\r\n                start++;\r\n                end = start + 1;\r\n            }\r\n        }\r\n        return new RomajiPredictiveResult(hiragana, [\"\"] );\r\n    }\r\n}"],"mappings":"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IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,MAAM,IAAI;CACX,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,IAAI;CACV,CAAC,KAAK,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AAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAK;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAG,CAAC;EACh3E,MAAM,QAAQ,IAAI,WAAW;GAAC;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAI;GAAG;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAK;GAAG;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAK;GAAK;GAAI;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAI;GAAI;GAAK;GAAI;GAAI;GAAK;GAAK;GAAI;GAAK;GAAI;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAI;GAAI;GAAK;GAAI;GAAK;GAAK;GAAI;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAI;GAAI;GAAK;GAAI;GAAI;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAI;GAAK;GAAK;GAAI;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAI;GAAI;GAAK;GAAI;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAI;GAAI;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAI;GAAI;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAI;GAAI;GAAI;GAAK;GAAK;GAAI;GAAI;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAK;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAK;GAAI;GAAI;GAAK;GAAK;GAAI;GAAI;GAAK;GAAI;GAAK;GAAK;GAAK;GAAI;GAAI;GAAI;GAAK;GAAK;GAAI;GAAI;GAAK;GAAI;GAAI;GAAK;GAAK;GAAK;GAAK;GAAK;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAK;GAAI,CAAC;EACjnF,MAAM,aAAa,IAAI,UAAU;GAAC;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAI;GAAG;GAAI;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAI;GAAG;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAG;GAAI;GAAG;GAAI;GAAI;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAG;GAAI;GAAG;GAAG;GAAI;GAAI;GAAG;GAAI;GAAI;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAI;GAAG;GAAI;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAI;GAAG;GAAI;GAAG;GAAI;GAAG;GAAI;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAG;GAAI;GAAI;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAI;GAAG;GAAI;GAAG;GAAG;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAI;GAAG;GAAI;GAAI;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAI;GAAI;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAG;GAAG;GAAI;GAAG;GAAI;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAI;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAI;GAAG;GAAI;GAAI;GAAI;GAAG;GAAI;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAI;GAAI;GAAG;GAAG;GAAI;GAAI;GAAG;GAAI;GAAG;GAAG;GAAI;GAAI;GAAG;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAI;GAAI;GAAG;GAAG;GAAI;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAI;GAAG;GAAG;GAAI;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAG;GAAI;GAAI;GAAG;GAAG;GAAI;GAAI;GAAG;GAAI;GAAG;GAAG;GAAG;GAAI;GAAI;GAAI;GAAG;GAAG;GAAI;GAAI;GAAG;GAAI;GAAI;GAAG;GAAG;GAAG;GAAG;GAAG;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAI;GAAI;GAAG;GAAI;GAAI;GAAI;GAAI;GAAE,CAAC;EACvhE,MAAM,eAA8B;GAAC;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAK;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAK;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAK;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAI;GAAI;GAAI;GAAI;GAAI;GAAK;GAAK;GAAM;GAAK;GAAK;GAAK;GAAM;GAAK;GAAK;GAAK;GAAM;GAAI;GAAI;GAAK;GAAK;GAAM;GAAM;GAAM;GAAK;GAAK;GAAK;GAAK;GAAM;GAAM;GAAI;GAAK;GAAM;GAAM;GAAM;GAAI;GAAM;GAAK;GAAM;GAAM;GAAM;GAAK;GAAI;GAAM;GAAK;GAAK;GAAM;GAAM;GAAK;GAAM;GAAM;GAAM;GAAM;GAAM;GAAI;GAAM;GAAM;GAAK;GAAK;GAAM;GAAM;GAAM;GAAK;GAAK;GAAM;GAAK;GAAI;GAAM;GAAK;GAAK;GAAM;GAAI;GAAI;GAAM;GAAM;GAAK;GAAM;GAAM;GAAK;GAAK;GAAM;GAAM;GAAI;GAAK;GAAM;GAAK;GAAM;GAAM;GAAM;GAAK;GAAI;GAAI;GAAI;GAAM;GAAM;GAAK;GAAI;GAAI;GAAM;GAAI;GAAK;GAAK;GAAM;GAAI;GAAI;GAAK;GAAM;GAAK;GAAI;GAAK;GAAI;GAAI;GAAM;GAAI;GAAI;GAAK;GAAM;GAAI;GAAM;GAAI;GAAM;GAAK;GAAI;GAAI;GAAM;GAAI;GAAI;GAAK;GAAI;GAAM;GAAM;GAAK;GAAI;GAAM;GAAK;GAAK;GAAM;GAAM;GAAM;GAAI;GAAM;GAAK;GAAM;GAAM;GAAM;GAAI;GAAM;GAAK;GAAM;GAAI;GAAI;GAAI;GAAM;GAAI;GAAM;GAAM;GAAI;GAAM;GAAM;GAAM;GAAM;GAAM;GAAK;GAAK;GAAK;GAAM;GAAK;GAAI;GAAI;GAAM;GAAK;GAAM;GAAK;GAAK;GAAI;GAAM;GAAK;GAAM;GAAI;GAAI;GAAI;GAAM;GAAK;GAAK;GAAI;GAAM;GAAI;GAAK;GAAI;GAAM;GAAI;GAAK;GAAK;GAAI;GAAK;GAAM;GAAK;GAAK;GAAI;GAAI;GAAK;GAAM;GAAI;GAAK;GAAI;GAAI;GAAK;GAAI;GAAI;GAAK;GAAM;GAAI;GAAK;GAAK;GAAM;GAAI;GAAI;GAAK;GAAM;GAAI;GAAI;GAAK;GAAI;GAAK;GAAM;GAAI;GAAI;GAAI;GAAM;GAAK;GAAM;GAAK;GAAM;GAAI;GAAI;GAAK;GAAM;GAAI;GAAI;GAAK;GAAI;GAAI;GAAM;GAAI;GAAK;GAAK;GAAK;GAAI;GAAM;GAAM;GAAK;GAAK;GAAI;GAAM;GAAK;GAAI;GAAI;GAAM;GAAI;GAAI;GAAK;GAAK;GAAI;GAAM;GAAM;GAAI;GAAK;GAAI;GAAM;GAAM;GAAI;GAAK;GAAM;GAAM;GAAI;GAAK;GAAI;GAAM;GAAM;GAAK;GAAK;GAAM;GAAK;GAAI;GAAK;GAAK;GAAK;GAAM;GAAK;GAAI;GAAK;GAAK;GAAI;GAAM;GAAI;GAAI;GAAK;GAAM;GAAI;GAAM;GAAK;GAAM;GAAK;GAAM;GAAI;GAAK;GAAI;GAAM;GAAI;GAAI;GAAI;GAAM;GAAI;GAAM;GAAK;GAAI;GAAI;GAAM;GAAK;GAAM;GAAI;GAAI;GAAK;GAAM;GAAI;GAAI;GAAI;GAAM;GAAK;GAAI;GAAI;GAAM;GAAI;GAAK;GAAK;GAAI;GAAI;GAAM;GAAI;GAAI;GAAM;GAAM;GAAM;GAAM;GAAM;GAAM;GAAM;GAAI;GAAM;GAAM;GAAM;GAAI;GAAI;GAAI;GAAM;GAAM;GAAM;GAAI;GAAI;GAAM;GAAK;GAAM;GAAM;GAAM;GAAM;GAAI;GAAI;GAAM;GAAM;GAAI;GAAI;GAAI;GAAM;GAAM;GAAI;GAAI;GAAI;GAAI;GAAM;GAAK;GAAK;GAAK;GAAM;GAAI;GAAM;GAAM;GAAM;GAAI;GAAI;GAAM;GAAM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,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,KAAK,EAAE;CAC7B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,KAAK,EAAE;CAC7B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,QAAQ,MAAM,EAAE;CAC/B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,QAAQ,MAAM,EAAE;CAC/B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,QAAQ,MAAM,EAAE;CAC/B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,KAAK,KAAK,EAAE;CAC3B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,KAAK,KAAK,EAAE;CAC3B,IAAI,WAAW,KAAK,KAAK,EAAE;CAC3B,IAAI,WAAW,KAAK,KAAK,EAAE;CAC3B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,KAAK,KAAK,EAAE;CAC3B,IAAI,WAAW,KAAK,KAAK,EAAE;CAC3B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,OAAO,KAAK,EAAE;CAC7B,IAAI,WAAW,OAAO,KAAK,EAAE;CAC7B,IAAI,WAAW,OAAO,KAAK,EAAE;CAC7B,IAAI,WAAW,OAAO,KAAK,EAAE;CAC7B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,OAAO,KAAK,EAAE;CAC7B,IAAI,WAAW,OAAO,KAAK,EAAE;CAC7B,IAAI,WAAW,OAAO,KAAK,EAAE;CAC7B,IAAI,WAAW,OAAO,KAAK,EAAE;CAC7B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,MAAM,KAAK,EAAE;CAC5B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,MAAM,MAAM,EAAE;CAC7B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,WAAW,OAAO,MAAM,EAAE;CAC9B,IAAI,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"}