UNPKG

romaji-to-kana-ng

Version:

Angular module providing a pipe for converting romaji to kana

122 lines 23.5 kB
import { Pipe } from '@angular/core'; const kanaMap = { // standard hiragana 'nn': 'ん', 'wa': 'わ', 'ra': 'ら', 'ya': 'や', 'ma': 'ま', 'ba': 'ば', 'ha': 'は', 'na': 'な', 'da': 'だ', 'ta': 'た', 'za': 'ざ', 'sa': 'さ', 'ga': 'が', 'ka': 'か', 'a': 'あ', 'ri': 'り', 'mi': 'み', 'bi': 'び', 'hi': 'ひ', 'ni': 'に', 'di': 'ぢ', 'chi': 'ち', 'ji': 'じ', 'shi': 'し', 'gi': 'ぎ', 'ki': 'き', 'i': 'い', 'ru': 'る', 'yu': 'ゆ', 'mu': 'む', 'bu': 'ぶ', 'fu': 'ふ', 'nu': 'ぬ', 'du': 'づ', 'tsu': 'つ', 'zu': 'ず', 'su': 'す', 'gu': 'ぐ', 'ku': 'く', 'u': 'う', 're': 'れ', 'me': 'め', 'be': 'べ', 'he': 'へ', 'ne': 'ね', 'de': 'で', 'te': 'て', 'ze': 'ぜ', 'se': 'せ', 'ge': 'げ', 'ke': 'け', 'e': 'え', 'wo': 'を', 'ro': 'ろ', 'yo': 'よ', 'mo': 'も', 'bo': 'ぼ', 'ho': 'ほ', 'no': 'の', 'do': 'ど', 'to': 'と', 'zo': 'ぞ', 'so': 'そ', 'go': 'ご', 'ko': 'こ', 'o': 'お', // little ya, yu, and yo 'kya': 'きゃ', 'kyu': 'きゅ', 'kyo': 'きょ', 'gya': 'ぎゃ', 'gyu': 'ぎゅ', 'gyo': 'ぎょ', 'sya': 'しゃ', 'syu': 'しゅ', 'syo': 'しょ', 'jya': 'じゃ', 'jyu': 'じゅ', 'jyo': 'じょ', 'cya': 'ちゃ', 'cyu': 'ちゅ', 'cyo': 'ちょ', 'nya': 'にゃ', 'nyu': 'にゅ', 'nyo': 'にょ', 'hya': 'ひゃ', 'hyu': 'ひゅ', 'hyo': 'ひょ', 'bya': 'びゃ', 'byu': 'びゅ', 'byo': 'びょ', 'mya': 'みゃ', 'myu': 'みゅ', 'myo': 'みょ', 'pya': 'ぴゃ', 'pyu': 'ぴゅ', 'pyo': 'ぴょ', 'rya': 'りゃ', 'ryu': 'りゅ', 'ryo': 'りょ', // standard katakana 'NN': 'ン', 'WA': 'ワ', 'RA': 'ラ', 'YA': 'ヤ', 'MA': 'マ', 'BA': 'バ', 'HA': 'ハ', 'NA': 'ナ', 'DA': 'ダ', 'TA': 'タ', 'ZA': 'ザ', 'SA': 'サ', 'GA': 'ガ', 'KA': 'カ', 'A': 'ア', 'RI': 'リ', 'MI': 'ミ', 'BI': 'ビ', 'HI': 'ヒ', 'NI': 'ニ', 'DI': 'ヂ', 'CHI': 'チ', 'JI': 'ジ', 'SHI': 'シ', 'GI': 'ギ', 'KI': 'キ', 'I': 'イ', 'RU': 'ル', 'YU': 'ユ', 'MU': 'ム', 'BU': 'ブ', 'FU': 'フ', 'NU': 'ヌ', 'DU': 'ヅ', 'TSU': 'ツ', 'ZU': 'ズ', 'SU': 'ス', 'GU': 'グ', 'KU': 'ク', 'U': 'ウ', 'RE': 'レ', 'ME': 'メ', 'BE': 'ベ', 'HE': 'ヘ', 'NE': 'ネ', 'DE': 'デ', 'TE': 'テ', 'ZE': 'ゼ', 'SE': 'セ', 'GE': 'ゲ', 'KE': 'ケ', 'E': 'エ', 'WO': 'ヲ', 'RO': 'ロ', 'YO': 'ヨ', 'MO': 'モ', 'BO': 'ボ', 'HO': 'ホ', 'NO': 'ノ', 'DO': 'ド', 'TO': 'ト', 'ZO': 'ゾ', 'SO': 'ソ', 'GO': 'ゴ', 'KO': 'コ', 'O': 'オ', // little ya yu and yo katakana 'KYA': 'キャ', 'KYU': 'キュ', 'KYO': 'キョ', 'GYA': 'ギャ', 'GYU': 'ギュ', 'GYO': 'ギョ', 'SYA': 'シャ', 'SYU': 'シュ', 'SYO': 'ショ', 'JYA': 'ジャ', 'JYU': 'ジュ', 'JYO': 'ジョ', 'CYA': 'チャ', 'CYU': 'チュ', 'CYO': 'チョ', 'NYA': 'ニャ', 'NYU': 'ニュ', 'NYO': 'ニョ', 'HYA': 'ヒャ', 'HYU': 'ヒュ', 'HYO': 'ヒョ', 'BYA': 'ビャ', 'BYU': 'ビュ', 'BYO': 'ビョ', 'MYA': 'ミャ', 'MYU': 'ミュ', 'MYO': 'ミョ', 'PYA': 'ピャ', 'PYU': 'ピュ', 'PYO': 'ピョ', 'RYA': 'リャ', 'RYU': 'リュ', 'RYO': 'リョ', // others '-': 'ー' // long vowel }; const katakanaRegExp = /[\u30a0-\u30ff]/g; // matches only katakana characters const specialCharAndKanaRegExp = /[!@#$%^&*(),.?":{}|<>\ _\u3040-\u30ff]/g; // matches kana and special characters export class RomajiToKanaPipe { transform(value, ...args) { if (!value) return; let acc = ''; let valueArr = value.split(''); let result = ''; while (valueArr.length) { acc += valueArr.shift(); // if the acc contains a kana character or a special character reset acc and continue if (acc.match(specialCharAndKanaRegExp)) { result += acc; acc = ''; continue; } // check if there is mixed casing if (acc.match(/[a-z]/g) && acc.match(/[A-Z]/g)) { result += acc[0]; acc = acc.slice(1); } const mappedValue = kanaMap[acc]; if (!!mappedValue) { result += mappedValue; acc = ''; } else if (acc.length == 3) { // logic for a double consonant // check if the top is equal to the next char if (acc[0] == acc[1]) { const mappedTail = kanaMap[acc.slice(1)]; if (!!mappedTail) { result += this.makeDoubleConsonant(mappedTail); acc = ''; continue; } else { // peek at the next character const nextChar = valueArr.slice(0, 1); // using a slice since we don't know if there actually is another character const fourCharMatch = kanaMap[acc.slice(1).concat(...nextChar)]; // we found something like jjya or ggya if (!!fourCharMatch) { result += this.makeDoubleConsonant(fourCharMatch); acc = ''; valueArr.shift(); // remove the character we peeked at continue; } } } // attempt one last match before giving up on these 3 const match = kanaMap[acc.slice(1)]; // this will occur if we have something like kga result += acc[0]; if (!!match) { result += match; acc = ''; continue; } else { // remove the first character and allow this set to go through another pass // we might have a 3 character match like gya coming up acc = acc.slice(1); continue; } } } // add any leftovers to the result and return it return result + acc; } makeDoubleConsonant(kana) { // choose which little tsu to use based on if it is katakana return kana.match(katakanaRegExp) ? `ッ${kana}` : `っ${kana}`; } } RomajiToKanaPipe.decorators = [ { type: Pipe, args: [{ name: 'romajiToKana' },] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9tYWppLXRvLWthbmEucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3JvbWFqaS10by1rYW5hLW5nL3NyYy9saWIvcm9tYWppLXRvLWthbmEucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUVwRCxNQUFNLE9BQU8sR0FBRztJQUNkLG9CQUFvQjtJQUNwQixJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDN0ksSUFBSSxFQUFFLEdBQUcsRUFBYSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlJLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlJLElBQUksRUFBRSxHQUFHLEVBQWEsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUMxSixJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBRXJLLHdCQUF3QjtJQUN4QixLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUk7SUFDckMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO0lBQ3JDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSTtJQUNyQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUk7SUFDckMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO0lBQ3JDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSTtJQUNyQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUk7SUFDckMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO0lBQ3JDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSTtJQUNyQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUk7SUFDckMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO0lBRXJDLG9CQUFvQjtJQUNwQixJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7SUFDNUksSUFBSSxFQUFFLEdBQUcsRUFBYSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlJLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBQzlJLElBQUksRUFBRSxHQUFHLEVBQWEsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztJQUMxSixJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0lBRXJLLCtCQUEr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LG1CQUFtQixDQUFDLElBQVk7UUFDOUIsNERBQTREO1FBQzVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQSxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUM3RCxDQUFDOzs7WUE5RUYsSUFBSSxTQUFDO2dCQUNKLElBQUksRUFBRSxjQUFjO2FBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5jb25zdCBrYW5hTWFwID0ge1xuICAvLyBzdGFuZGFyZCBoaXJhZ2FuYVxuICAnbm4nOiAn44KTJywgJ3dhJzogJ+OCjycsICAncmEnOiAn44KJJywgJ3lhJzogJ+OChCcsICdtYSc6ICfjgb4nLCAnYmEnOiAn44GwJywgJ2hhJzogJ+OBrycsICduYSc6ICfjgaonLCAnZGEnOiAn44GgJywgJ3RhJzogICfjgZ8nLCAnemEnOiAn44GWJywgJ3NhJzogICfjgZUnLCAnZ2EnOiAn44GMJywgJ2thJzogJ+OBiycsICdhJzogJ+OBgicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdyaSc6ICfjgoonLCAgICAgICAgICAg44CAJ21pJzogJ+OBvycsICdiaSc6ICfjgbMnLCAnaGknOiAn44GyJywgJ25pJzogJ+OBqycsICdkaSc6ICfjgaInLCAnY2hpJzogJ+OBoScsICdqaSc6ICfjgZgnLCAnc2hpJzogJ+OBlycsICdnaSc6ICfjgY4nLCAna2knOiAn44GNJywgJ2knOiAn44GEJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1JzogJ+OCiycsICd5dSc6ICfjgoYnLCAnbXUnOiAn44KAJywgJ2J1JzogJ+OBticsICdmdSc6ICfjgbUnLCAnbnUnOiAn44GsJywgJ2R1JzogJ+OBpScsICd0c3UnOiAn44GkJywgJ3p1JzogJ+OBmicsICdzdSc6ICAn44GZJywgJ2d1JzogJ+OBkCcsICdrdSc6ICfjgY8nLCAndSc6ICfjgYYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAncmUnOiAn44KMJywgICAgICAgICAgIOOAgCdtZSc6ICfjgoEnLCAnYmUnOiAn44G5JywgJ2hlJzogJ+OBuCcsICduZSc6ICfjga0nLCAnZGUnOiAn44GnJywgJ3RlJzogICfjgaYnLCAnemUnOiAn44GcJywgJ3NlJzogICfjgZsnLCAnZ2UnOiAn44GSJywgJ2tlJzogJ+OBkScsICdlJzogJ+OBiCcsXG4gICAgICAgICAgICAgICd3byc6ICfjgpInLCAncm8nOiAn44KNJywgJ3lvJzogJ+OCiCcsICdtbyc6ICfjgoInLCAnYm8nOiAn44G8JywgJ2hvJzogJ+OBuycsICdubyc6ICfjga4nLCAnZG8nOiAn44GpJywgJ3RvJzogICfjgagnLCAnem8nOiAn44GeJywgJ3NvJzogICfjgZ0nLCAnZ28nOiAn44GUJywgJ2tvJzogJ+OBkycsICdvJzogJ+OBiicsXG4gIFxuICAvLyBsaXR0bGUgeWEsIHl1LCBhbmQgeW9cbiAgJ2t5YSc6ICfjgY3jgoMnLCAna3l1JzogJ+OBjeOChScsICdreW8nOiAn44GN44KHJyxcbiAgJ2d5YSc6ICfjgY7jgoMnLCAnZ3l1JzogJ+OBjuOChScsICdneW8nOiAn44GO44KHJyxcbiAgJ3N5YSc6ICfjgZfjgoMnLCAnc3l1JzogJ+OBl+OChScsICdzeW8nOiAn44GX44KHJyxcbiAgJ2p5YSc6ICfjgZjjgoMnLCAnanl1JzogJ+OBmOOChScsICdqeW8nOiAn44GY44KHJyxcbiAgJ2N5YSc6ICfjgaHjgoMnLCAnY3l1JzogJ+OBoeOChScsICdjeW8nOiAn44Gh44KHJyxcbiAgJ255YSc6ICfjgavjgoMnLCAnbnl1JzogJ+OBq+OChScsICdueW8nOiAn44Gr44KHJyxcbiAgJ2h5YSc6ICfjgbLjgoMnLCAnaHl1JzogJ+OBsuOChScsICdoeW8nOiAn44Gy44KHJyxcbiAgJ2J5YSc6ICfjgbPjgoMnLCAnYnl1JzogJ+OBs+OChScsICdieW8nOiAn44Gz44KHJyxcbiAgJ215YSc6ICfjgb/jgoMnLCAnbXl1JzogJ+OBv+OChScsICdteW8nOiAn44G/44KHJyxcbiAgJ3B5YSc6ICfjgbTjgoMnLCAncHl1JzogJ+OBtOOChScsICdweW8nOiAn44G044KHJyxcbiAgJ3J5YSc6ICfjgorjgoMnLCAncnl1JzogJ+OCiuOChScsICdyeW8nOiAn44KK44KHJyxcblxuICAvLyBzdGFuZGFyZCBrYXRha2FuYVxuICAnTk4nOiAn44OzJywgJ1dBJzogJ+ODrycsICdSQSc6ICfjg6knLCAnWUEnOiAn44OkJywgJ01BJzogJ+ODnicsICdCQSc6ICfjg5AnLCAnSEEnOiAn44OPJywgJ05BJzogJ+ODiicsICdEQSc6ICfjg4AnLCAnVEEnOiAgJ+OCvycsICdaQSc6ICfjgrYnLCAnU0EnOiAgJ+OCtScsICdHQSc6ICfjgqwnLCAnS0EnOiAn44KrJywgJ0EnOiAn44KiJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JJJzogJ+ODqicsICAgICAgICAgICDjgIAnTUknOiAn44OfJywgJ0JJJzogJ+ODkycsICdISSc6ICfjg5InLCAnTkknOiAn44OLJywgJ0RJJzogJ+ODgicsICdDSEknOiAn44OBJywgJ0pJJzogJ+OCuCcsICdTSEknOiAn44K3JywgJ0dJJzogJ+OCricsICdLSSc6ICfjgq0nLCAnSSc6ICfjgqQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUlUnOiAn44OrJywgJ1lVJzogJ+ODpicsICdNVSc6ICfjg6AnLCAnQlUnOiAn44OWJywgJ0ZVJzogJ+ODlScsICdOVSc6ICfjg4wnLCAnRFUnOiAn44OFJywgJ1RTVSc6ICfjg4QnLCAnWlUnOiAn44K6JywgJ1NVJzogICfjgrknLCAnR1UnOiAn44KwJywgJ0tVJzogJ+OCrycsICdVJzogJ+OCpicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdSRSc6ICfjg6wnLCAgICAgICAgICAg44CAJ01FJzogJ+ODoScsICdCRSc6ICfjg5knLCAnSEUnOiAn44OYJywgJ05FJzogJ+ODjScsICdERSc6ICfjg4cnLCAnVEUnOiAgJ+ODhicsICdaRSc6ICfjgrwnLCAnU0UnOiAgJ+OCuycsICdHRSc6ICfjgrInLCAnS0UnOiAn44KxJywgJ0UnOiAn44KoJyxcbiAgICAgICAgICAgICAgJ1dPJzogJ+ODsicsICdSTyc6ICfjg60nLCAnWU8nOiAn44OoJywgJ01PJzogJ+ODoicsICdCTyc6ICfjg5wnLCAnSE8nOiAn44ObJywgJ05PJzogJ+ODjicsICdETyc6ICfjg4knLCAnVE8nOiAgJ+ODiCcsICdaTyc6ICfjgr4nLCAnU08nOiAgJ+OCvScsICdHTyc6ICfjgrQnLCAnS08nOiAn44KzJywgJ08nOiAn44KqJyxcblxuICAvLyBsaXR0bGUgeWEgeXUgYW5kIHlvIGthdGFrYW5hXG4gICdLWUEnOiAn44Kt44OjJywgJ0tZVSc6ICfjgq3jg6UnLCAnS1lPJzogJ+OCreODpycsXG4gICdHWUEnOiAn44Ku44OjJywgJ0dZVSc6ICfjgq7jg6UnLCAnR1lPJzogJ+OCruODpycsXG4gICdTWUEnOiAn44K344OjJywgJ1NZVSc6ICfjgrfjg6UnLCAnU1lPJzogJ+OCt+ODpycsXG4gICdKWUEnOiAn44K444OjJywgJ0pZVSc6ICfjgrjjg6UnLCAnSllPJzogJ+OCuOODpycsXG4gICdDWUEnOiAn44OB44OjJywgJ0NZVSc6ICfjg4Hjg6UnLCAnQ1lPJzogJ+ODgeODpycsXG4gICdOWUEnOiAn44OL44OjJywgJ05ZVSc6ICfjg4vjg6UnLCAnTllPJzogJ+ODi+ODpycsXG4gICdIWUEnOiAn44OS44OjJywgJ0hZVSc6ICfjg5Ljg6UnLCAnSFlPJzogJ+ODkuODpycsXG4gICdCWUEnOiAn44OT44OjJywgJ0JZVSc6ICfjg5Pjg6UnLCAnQllPJzogJ+ODk+ODpycsXG4gICdNWUEnOiAn44Of44OjJywgJ01ZVSc6ICfjg5/jg6UnLCAnTVlPJzogJ+ODn+ODpycsXG4gICdQWUEnOiAn44OU44OjJywgJ1BZVSc6ICfjg5Tjg6UnLCAnUFlPJzogJ+ODlOODpycsXG4gICdSWUEnOiAn44Oq44OjJywgJ1JZVSc6ICfjg6rjg6UnLCAnUllPJzogJ+ODquODpycsXG5cbiAgLy8gb3RoZXJzXG4gICctJzogJ+ODvCcgLy8gbG9uZyB2b3dlbFxufVxuXG5jb25zdCBrYXRha2FuYVJlZ0V4cCA9L1tcXHUzMGEwLVxcdTMwZmZdL2c7IC8vIG1hdGNoZXMgb25seSBrYXRha2FuYSBjaGFyYWN0ZXJzXG5jb25zdCBzcGVjaWFsQ2hhckFuZEthbmFSZWdFeHAgPSAvWyFAIyQlXiYqKCksLj9cIjp7fXw8PlxcIF9cXHUzMDQwLVxcdTMwZmZdL2c7IC8vIG1hdGNoZXMga2FuYSBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzXG5cbkBQaXBlKHtcbiAgbmFtZTogJ3JvbWFqaVRvS2FuYSdcbn0pXG5leHBvcnQgY2xhc3MgUm9tYWppVG9LYW5hUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgbGV0IGFjYyA9ICcnO1xuICAgIGxldCB2YWx1ZUFyciA9IHZhbHVlLnNwbGl0KCcnKVxuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICB3aGlsZSAodmFsdWVBcnIubGVuZ3RoKSB7XG4gICAgICBhY2MgKz0gdmFsdWVBcnIuc2hpZnQoKTtcbiAgICAgIFxuICAgICAgLy8gaWYgdGhlIGFjYyBjb250YWlucyBhIGthbmEgY2hhcmFjdGVyIG9yIGEgc3BlY2lhbCBjaGFyYWN0ZXIgcmVzZXQgYWNjIGFuZCBjb250aW51ZVxuICAgICAgaWYgKGFjYy5tYXRjaChzcGVjaWFsQ2hhckFuZEthbmFSZWdFeHApKSB7XG4gICAgICAgIHJlc3VsdCArPSBhY2M7XG4gICAgICAgIGFjYyA9ICcnO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgbWl4ZWQgY2FzaW5nXG4gICAgICBpZiAoYWNjLm1hdGNoKC9bYS16XS9nKSAmJiBhY2MubWF0Y2goL1tBLVpdL2cpKSB7XG4gICAgICAgIHJlc3VsdCArPSBhY2NbMF07XG4gICAgICAgIGFjYyA9IGFjYy5zbGljZSgxKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBrYW5hTWFwW2FjY107XG4gICAgICBpZiAoISFtYXBwZWRWYWx1ZSkge1xuICAgICAgICByZXN1bHQgKz0gbWFwcGVkVmFsdWU7XG4gICAgICAgIGFjYyA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChhY2MubGVuZ3RoID09IDMpIHtcbiAgICAgICAgLy8gbG9naWMgZm9yIGEgZG91YmxlIGNvbnNvbmFudFxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgdG9wIGlzIGVxdWFsIHRvIHRoZSBuZXh0IGNoYXJcbiAgICAgICAgaWYgKGFjY1swXSA9PSBhY2NbMV0pIHtcbiAgICAgICAgICBjb25zdCBtYXBwZWRUYWlsID0ga2FuYU1hcFthY2Muc2xpY2UoMSldO1xuICAgICAgICAgIGlmICghIW1hcHBlZFRhaWwpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLm1ha2VEb3VibGVDb25zb25hbnQobWFwcGVkVGFpbCk7XG4gICAgICAgICAgICBhY2MgPSAnJztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwZWVrIGF0IHRoZSBuZXh0IGNoYXJhY3RlclxuICAgICAgICAgICAgY29uc3QgbmV4dENoYXIgPSB2YWx1ZUFyci5zbGljZSgwLCAxKTsgLy8gdXNpbmcgYSBzbGljZSBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIGFjdHVhbGx5IGlzIGFub3RoZXIgY2hhcmFjdGVyXG4gICAgICAgICAgICBjb25zdCBmb3VyQ2hhck1hdGNoID0ga2FuYU1hcFthY2Muc2xpY2UoMSkuY29uY2F0KC4uLm5leHRDaGFyKV07XG5cbiAgICAgICAgICAgIC8vIHdlIGZvdW5kIHNvbWV0aGluZyBsaWtlIGpqeWEgb3IgZ2d5YVxuICAgICAgICAgICAgaWYgKCEhZm91ckNoYXJNYXRjaCkge1xuICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5tYWtlRG91YmxlQ29uc29uYW50KGZvdXJDaGFyTWF0Y2gpO1xuICAgICAgICAgICAgICBhY2MgPSAnJztcbiAgICAgICAgICAgICAgdmFsdWVBcnIuc2hpZnQoKTsgLy8gcmVtb3ZlIHRoZSBjaGFyYWN0ZXIgd2UgcGVla2VkIGF0XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF0dGVtcHQgb25lIGxhc3QgbWF0Y2ggYmVmb3JlIGdpdmluZyB1cCBvbiB0aGVzZSAzXG4gICAgICAgIGNvbnN0IG1hdGNoID0ga2FuYU1hcFthY2Muc2xpY2UoMSldO1xuICAgICAgICAvLyB0aGlzIHdpbGwgb2NjdXIgaWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBrZ2FcbiAgICAgICAgcmVzdWx0ICs9IGFjY1swXTtcbiAgICAgICAgaWYgKCEhbWF0Y2gpIHtcbiAgICAgICAgICByZXN1bHQgKz0gbWF0Y2g7XG4gICAgICAgICAgYWNjID0gJyc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYW5kIGFsbG93IHRoaXMgc2V0IHRvIGdvIHRocm91Z2ggYW5vdGhlciBwYXNzXG4gICAgICAgICAgLy8gd2UgbWlnaHQgaGF2ZSBhIDMgY2hhcmFjdGVyIG1hdGNoIGxpa2UgZ3lhIGNvbWluZyB1cFxuICAgICAgICAgIGFjYyA9IGFjYy5zbGljZSgxKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgYW55IGxlZnRvdmVycyB0byB0aGUgcmVzdWx0IGFuZCByZXR1cm4gaXRcbiAgICByZXR1cm4gcmVzdWx0ICsgYWNjO1xuICB9XG5cbiAgbWFrZURvdWJsZUNvbnNvbmFudChrYW5hOiBzdHJpbmcpIHtcbiAgICAvLyBjaG9vc2Ugd2hpY2ggbGl0dGxlIHRzdSB0byB1c2UgYmFzZWQgb24gaWYgaXQgaXMga2F0YWthbmFcbiAgICByZXR1cm4ga2FuYS5tYXRjaChrYXRha2FuYVJlZ0V4cCkgPyBg44ODJHtrYW5hfWA6IGDjgaMke2thbmF9YDtcbiAgfVxufVxuIl19