package.dist.esm.index.js.map Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of unicode-variants Show documentation
Show all versions of unicode-variants Show documentation
Unicode variant string matching
The newest version!
{"version":3,"file":"index.js","sources":["../../lib/index.mjs"],"sourcesContent":["\n/**\n * @typedef {{[key:string]:string}} TUnicodeMap\n * @typedef {{[key:string]:Set}} TUnicodeSets\n * @typedef {[[number,number]]} TCodePoints\n * @typedef {{folded:string,composed:string,code_point:number}} TCodePointObj\n * @typedef {{start:number,end:number,length:number,substr:string}} TSequencePart\n */\n\n\nimport { setToPattern, arrayToPattern, escape_regex, sequencePattern, toArray } from './regex.mjs';\nimport { allSubstrings } from './strings.mjs';\n\n\n/** @type {TCodePoints} */\nexport const code_points = [[ 0, 65535 ]];\n\nconst accent_pat = '[\\u0300-\\u036F\\u{b7}\\u{2be}\\u{2bc}]';\n\n/** @type {TUnicodeMap} */\nexport let unicode_map;\n\n/** @type {RegExp} */\nlet multi_char_reg;\n\nconst max_char_length = 3;\n\n/** @type {TUnicodeMap} */\nconst latin_convert = {}\n\n/** @type {TUnicodeMap} */\nconst latin_condensed = {\n\t'/': '⁄∕',\n\t'0': '߀',\n\t\"a\": \"ⱥɐɑ\",\n\t\"aa\": \"ꜳ\",\n\t\"ae\": \"æǽǣ\",\n\t\"ao\": \"ꜵ\",\n\t\"au\": \"ꜷ\",\n\t\"av\": \"ꜹꜻ\",\n\t\"ay\": \"ꜽ\",\n\t\"b\": \"ƀɓƃ\",\n\t\"c\": \"ꜿƈȼↄ\",\n\t\"d\": \"đɗɖᴅƌꮷԁɦ\",\n\t\"e\": \"ɛǝᴇɇ\",\n\t\"f\": \"ꝼƒ\",\n\t\"g\": \"ǥɠꞡᵹꝿɢ\",\n\t\"h\": \"ħⱨⱶɥ\",\n\t\"i\": \"ɨı\",\n\t\"j\": \"ɉȷ\",\n\t\"k\": \"ƙⱪꝁꝃꝅꞣ\",\n\t\"l\": \"łƚɫⱡꝉꝇꞁɭ\",\n\t\"m\": \"ɱɯϻ\",\n\t\"n\": \"ꞥƞɲꞑᴎлԉ\",\n\t\"o\": \"øǿɔɵꝋꝍᴑ\",\n\t\"oe\": \"œ\",\n\t\"oi\": \"ƣ\",\n\t\"oo\": \"ꝏ\",\n\t\"ou\": \"ȣ\",\n\t\"p\": \"ƥᵽꝑꝓꝕρ\",\n\t\"q\": \"ꝗꝙɋ\",\n\t\"r\": \"ɍɽꝛꞧꞃ\",\n\t\"s\": \"ßȿꞩꞅʂ\",\n\t\"t\": \"ŧƭʈⱦꞇ\",\n\t\"th\": \"þ\",\n\t\"tz\": \"ꜩ\",\n\t\"u\": \"ʉ\",\n\t\"v\": \"ʋꝟʌ\",\n\t\"vy\": \"ꝡ\",\n\t\"w\": \"ⱳ\",\n\t\"y\": \"ƴɏỿ\",\n\t\"z\": \"ƶȥɀⱬꝣ\",\n\t\"hv\": \"ƕ\"\n}\n\n\nfor( let latin in latin_condensed ){\n\tlet unicode = latin_condensed[latin] || '';\n\tfor( let i = 0; i < unicode.length; i++){\n\t\tlet char\t= unicode.substring(i,i+1);\n\t\tlatin_convert[char] = latin;\n\t}\n}\n\n\nconst convert_pat = new RegExp(Object.keys(latin_convert).join('|')+'|'+accent_pat,'gu');\n\n\n\n/**\n * Initialize the unicode_map from the give code point ranges\n *\n * @param {TCodePoints=} _code_points\n */\nexport const initialize = (_code_points) => {\n\tif( unicode_map !== undefined ) return;\n\tunicode_map = generateMap(_code_points || code_points );\n}\n\n\n/**\n * Helper method for normalize a string\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n * @param {string} str\n * @param {string} form\n */\nexport const normalize = (str,form='NFKD') => str.normalize(form);\n\n\n\n/**\n * Remove accents without reordering string\n * calling str.normalize('NFKD') on \\u{594}\\u{595}\\u{596} becomes \\u{596}\\u{594}\\u{595}\n * via https://github.com/krisk/Fuse/issues/133#issuecomment-318692703\n * @param {string} str\n * @return {string}\n */\nexport const asciifold = (str) => {\n\n\treturn toArray(str).reduce(\n\t\t/**\n\t\t * @param {string} result\n\t\t * @param {string} char\n\t\t */\n\t\t(result, char) =>{\n\t\t\treturn result + _asciifold(char)\n\t\t},\n\t\t''\n\t);\n};\n\n/**\n * @param {string} str\n * @return {string}\n */\nexport const _asciifold = (str) => {\n\tstr = normalize(str)\n\t\t.toLowerCase()\n\t\t.replace(convert_pat,(/** @type {string} */ char) => {\n\t\t\treturn latin_convert[char] || '';\n\t\t})\n\n\t//return str;\n\treturn normalize(str,'NFC')\n};\n\n\n\n\n\n\n/**\n * Generate a list of unicode variants from the list of code points\n * @param {TCodePoints} code_points\n * @yield {TCodePointObj}\n */\nexport function* generator(code_points){\n\n\tfor(const [code_point_min, code_point_max] of code_points){\n\t\tfor(let i = code_point_min; i <= code_point_max; i++){\n\n\t\t\tlet composed\t\t= String.fromCharCode(i);\n\t\t\tlet folded\t\t\t= asciifold(composed);\n\n\n\t\t\tif( folded == composed.toLowerCase() ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// skip when folded is a string longer than 3 characters long\n\t\t\t// bc the resulting regex patterns will be long\n\t\t\t// eg:\n\t\t\t// folded صلى الله عليه وسلم length 18 code point 65018\n\t\t\t// folded جل جلاله length 8 code point 65019\n\t\t\tif( folded.length > max_char_length ){\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif( folded.length == 0 ){\n\t\t\t\tcontinue\n\t\t\t}\n\n\n\t\t\tyield {folded:folded,composed:composed,code_point:i};\n\t\t}\n\t}\n}\n\n\n/**\n * Generate a unicode map from the list of code points\n * @param {TCodePoints} code_points\n * @return {TUnicodeSets}\n */\nexport const generateSets = (code_points) => {\n\n\t/** @type {{[key:string]:Set}} */\n\tconst unicode_sets = {};\n\n\n\t/**\n\t * @param {string} folded\n\t * @param {string} to_add\n\t */\n\tconst addMatching = (folded,to_add) => {\n\n\t\t/** @type {Set} */\n\t\tconst folded_set = unicode_sets[folded] || new Set();\n\n\t\tconst patt = new RegExp( '^'+setToPattern(folded_set)+'$','iu');\n\t\tif( to_add.match(patt) ){\n\t\t\treturn;\n\t\t}\n\n\t\tfolded_set.add(escape_regex(to_add));\n\t\tunicode_sets[folded] = folded_set;\n\t}\n\n\n\tfor( let value of generator(code_points) ){\n\t\taddMatching(value.folded,value.folded);\n\t\taddMatching(value.folded,value.composed);\n\t}\n\n\treturn unicode_sets;\n}\n\n/**\n * Generate a unicode map from the list of code points\n * ae => (?:(?:ae|Æ|Ǽ|Ǣ)|(?:A|Ⓐ|A...)(?:E|ɛ|Ⓔ...))\n *\n * @param {TCodePoints} code_points\n * @return {TUnicodeMap}\n */\nexport const generateMap = (code_points) => {\n\n\t/** @type {TUnicodeSets} */\n\tconst unicode_sets = generateSets(code_points);\n\n\t/** @type {TUnicodeMap} */\n\tconst unicode_map = {};\n\n\t/** @type {string[]} */\n\tlet multi_char = [];\n\n\tfor( let folded in unicode_sets ){\n\n\t\tlet set = unicode_sets[folded];\n\t\tif( set ){\n\t\t\tunicode_map[folded] = setToPattern(set);\n\t\t}\n\n\t\tif( folded.length > 1 ){\n\t\t\tmulti_char.push(escape_regex(folded));\n\t\t}\n\t}\n\n\tmulti_char.sort((a, b) => b.length - a.length );\n\tconst multi_char_patt = arrayToPattern(multi_char);\n\tmulti_char_reg = new RegExp('^'+multi_char_patt,'u');\n\n\treturn unicode_map;\n}\n\n\n/**\n * Map each element of an array from it's folded value to all possible unicode matches\n * @param {string[]} strings\n * @param {number} min_replacement\n * @return {string}\n */\nexport const mapSequence = (strings,min_replacement=1) =>{\n\tlet chars_replaced = 0;\n\n\n\tstrings = strings.map((str)=>{\n\t\tif( unicode_map[str] ){\n\t\t\tchars_replaced += str.length;\n\t\t}\n\t\treturn unicode_map[str] || str;\n\t});\n\n\tif( chars_replaced >= min_replacement ){\n\t\treturn sequencePattern(strings);\n\t}\n\n\treturn '';\n}\n\n/**\n * Convert a short string and split it into all possible patterns\n * Keep a pattern only if min_replacement is met\n *\n * 'abc'\n * \t\t=> [['abc'],['ab','c'],['a','bc'],['a','b','c']]\n *\t\t=> ['abc-pattern','ab-c-pattern'...]\n *\n *\n * @param {string} str\n * @param {number} min_replacement\n * @return {string}\n */\nexport const substringsToPattern = (str,min_replacement=1) => {\n\n\tmin_replacement = Math.max(min_replacement,str.length-1);\n\n\treturn arrayToPattern(\n\t\tallSubstrings(str).map( (sub_pat) =>{\n\t\t\treturn mapSequence(sub_pat,min_replacement)\n\t\t})\n\t);\n}\n\n/**\n * Convert an array of sequences into a pattern\n * [{start:0,end:3,length:3,substr:'iii'}...] => (?:iii...)\n *\n * @param {Sequence[]} sequences\n * @param {boolean} all\n */\nconst sequencesToPattern = (sequences,all=true) => {\n\n\tlet min_replacement = sequences.length > 1 ? 1 : 0;\n\treturn arrayToPattern(\n\t\tsequences.map( (sequence) =>{\n\t\t\tlet seq = [];\n\t\t\tconst len = all ? sequence.length() : sequence.length() - 1;\n\t\t\tfor( let j = 0; j < len; j++){\n\t\t\t\tseq.push(substringsToPattern(sequence.substrs[j]||'',min_replacement));\n\t\t\t}\n\n\t\t\treturn sequencePattern(seq);\n\t\t})\n\t);\n}\n\n/**\n * Return true if the sequence is already in the sequences\n * @param {Sequence} needle_seq\n * @param {Sequence[]} sequences\n */\nconst inSequences = (needle_seq, sequences) => {\n\n\tfor(const seq of sequences){\n\n\t\tif( seq.start != needle_seq.start || seq.end != needle_seq.end ){\n\t\t\tcontinue;\n\t\t}\n\n\t\tif( seq.substrs.join('') !== needle_seq.substrs.join('') ){\n\t\t\tcontinue;\n\t\t}\n\n\n\t\tlet needle_parts\t= needle_seq.parts;\n\n\t\t/**\n\t\t * @param {TSequencePart} part\n\t\t */\n\t\tconst filter = (part) =>{\n\n\t\t\tfor(const needle_part of needle_parts){\n\n\t\t\t\tif( needle_part.start === part.start && needle_part.substr === part.substr ){\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif( part.length == 1 || needle_part.length == 1 ){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\n\t\t\t\t// check for overlapping parts\n\t\t\t\t// a = ['::=','==']\n\t\t\t\t// b = ['::','===']\n\t\t\t\t// a = ['r','sm']\n\t\t\t\t// b = ['rs','m']\n\t\t\t\tif( part.start < needle_part.start && part.end > needle_part.start ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif( needle_part.start < part.start && needle_part.end > part.start ){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn false;\n\t\t};\n\n\t\tlet filtered = seq.parts.filter(filter);\n\n\t\tif( filtered.length > 0 ){\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nclass Sequence{\n\n\tconstructor(){\n\n\t\t/** @type {TSequencePart[]} */\n\t\tthis.parts\t\t= [];\n\n\t\t/** @type {string[]} */\n\t\tthis.substrs\t= [];\n\t\tthis.start\t\t= 0;\n\t\tthis.end\t\t= 0;\n\t}\n\n\t/**\n\t * @param {TSequencePart|undefined} part\n\t */\n\tadd(part){\n\t\tif( part ){\n\t\t\tthis.parts.push(part);\n\t\t\tthis.substrs.push(part.substr);\n\t\t\tthis.start\t= Math.min(part.start,this.start);\n\t\t\tthis.end\t= Math.max(part.end,this.end);\n\t\t}\n\t}\n\n\tlast(){\n\t\treturn this.parts[this.parts.length-1];\n\t}\n\n\tlength(){\n\t\treturn this.parts.length;\n\t}\n\n\t/**\n\t * @param {number} position\n\t * @param {TSequencePart} last_piece\n\t */\n\tclone(position, last_piece){\n\t\tlet clone = new Sequence();\n\n\t\tlet parts = JSON.parse(JSON.stringify(this.parts));\n\t\tlet last_part = parts.pop();\n\t\tfor( const part of parts ){\n\t\t\tclone.add(part);\n\t\t}\n\n\t\tlet last_substr = last_piece.substr.substring(0,position-last_part.start);\n\t\tlet clone_last_len = last_substr.length;\n\t\tclone.add({start:last_part.start,end:last_part.start+clone_last_len,length:clone_last_len,substr:last_substr});\n\n\t\treturn clone;\n\t}\n\n}\n\n/**\n * Expand a regular expression pattern to include unicode variants\n * \teg /a/ becomes /aⓐaẚàáâầấẫẩãāăằắẵẳȧǡäǟảåǻǎȁȃạậặḁąⱥɐɑAⒶAÀÁÂẦẤẪẨÃĀĂẰẮẴẲȦǠÄǞẢÅǺǍȀȂẠẬẶḀĄȺⱯ/\n *\n * Issue:\n * ﺊﺋ [ 'ﺊ = \\\\u{fe8a}', 'ﺋ = \\\\u{fe8b}' ]\n *\tbecomes:\tئئ [ 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}', 'ي = \\\\u{64a}', 'ٔ = \\\\u{654}' ]\n *\n *\tİIJ = IIJ = ⅡJ\n *\n * \t1/2/4\n *\n * @param {string} str\n * @return {string|undefined}\n */\nexport const getPattern = (str) => {\n\tinitialize();\n\n\tstr\t\t\t\t\t= asciifold(str);\n\n\tlet pattern\t\t\t= '';\n\tlet sequences\t\t= [new Sequence()];\n\n\tfor( let i = 0; i < str.length; i++ ){\n\n\t\tlet substr\t= str.substring(i);\n\t\tlet match\t= substr.match(multi_char_reg);\n\t\tconst char\t= str.substring(i,i+1);\n\t\tconst match_str = match ? match[0] : null;\n\n\n\t\t// loop through sequences\n\t\t// add either the char or multi_match\n\t\tlet overlapping\t\t= [];\n\t\tlet added_types\t\t= new Set();\n\t\tfor(const sequence of sequences){\n\n\t\t\tconst last_piece\t= sequence.last();\n\n\n\t\t\tif( !last_piece || last_piece.length == 1 || last_piece.end <= i ){\n\n\t\t\t\t// if we have a multi match\n\t\t\t\tif( match_str ){\n\t\t\t\t\tconst len = match_str.length;\n\t\t\t\t\tsequence.add({start:i,end:i+len,length:len,substr:match_str});\n\t\t\t\t\tadded_types.add('1');\n\t\t\t\t}else{\n\t\t\t\t\tsequence.add({start:i,end:i+1,length:1,substr:char});\n\t\t\t\t\tadded_types.add('2');\n\t\t\t\t}\n\n\t\t\t}else if( match_str ){\n\n\t\t\t\tlet clone = sequence.clone(i,last_piece);\n\n\t\t\t\tconst len = match_str.length;\n\t\t\t\tclone.add({start:i,end:i+len,length:len,substr:match_str});\n\n\t\t\t\toverlapping.push(clone);\n\n\t\t\t}else{\n\t\t\t\t// don't add char\n\t\t\t\t// adding would create invalid patterns: 234 => [2,34,4]\n\t\t\t\tadded_types.add('3');\n\t\t\t}\n\n\t\t}\n\n\n\t\t// if we have overlapping\n\t\tif( overlapping.length > 0 ){\n\n\t\t\t// ['ii','iii'] before ['i','i','iii']\n\t\t\toverlapping = overlapping.sort((a,b)=>{\n\t\t\t\treturn a.length() - b.length();\n\t\t\t});\n\n\t\t\tfor( let clone of overlapping){\n\n\t\t\t\t// don't add if we already have an equivalent sequence\n\t\t\t\tif( inSequences(clone, sequences) ){\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tsequences.push(clone);\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\n\t\t// if we haven't done anything unique\n\t\t// clean up the patterns\n\t\t// helps keep patterns smaller\n\t\t// if str = 'r₨㎧aarss', pattern will be 446 instead of 655\n\t\tif( i > 0 && added_types.size == 1 && !added_types.has('3') ){\n\t\t\tpattern += sequencesToPattern(sequences,false);\n\t\t\tlet new_seq = new Sequence();\n\t\t\tconst old_seq = sequences[0];\n\t\t\tif( old_seq ){\n\t\t\t\tnew_seq.add(old_seq.last());\n\t\t\t}\n\t\t\tsequences = [new_seq];\n\t\t}\n\n\t}\n\n\tpattern += sequencesToPattern(sequences,true);\n\n\treturn pattern;\n}\n\n\nexport { escape_regex };\n"],"names":["code_points","accent_pat","unicode_map","multi_char_reg","max_char_length","latin_convert","latin_condensed","latin","unicode","i","length","char","substring","convert_pat","RegExp","Object","keys","join","initialize","_code_points","undefined","generateMap","normalize","str","form","asciifold","toArray","reduce","result","_asciifold","toLowerCase","replace","generator","code_point_min","code_point_max","composed","String","fromCharCode","folded","code_point","generateSets","unicode_sets","addMatching","to_add","folded_set","Set","patt","setToPattern","match","add","escape_regex","value","multi_char","set","push","sort","a","b","multi_char_patt","arrayToPattern","mapSequence","strings","min_replacement","chars_replaced","map","sequencePattern","substringsToPattern","Math","max","allSubstrings","sub_pat","sequencesToPattern","sequences","all","sequence","seq","len","j","substrs","inSequences","needle_seq","start","end","needle_parts","parts","filter","part","needle_part","substr","filtered","Sequence","constructor","min","last","clone","position","last_piece","JSON","parse","stringify","last_part","pop","last_substr","clone_last_len","getPattern","pattern","match_str","overlapping","added_types","size","has","new_seq","old_seq"],"mappings":";;;;;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAOA;;AACO,MAAMA,WAAW,GAAG,CAAC,CAAE,CAAF,EAAK,KAAL,CAAD,EAApB;AAEP,MAAMC,UAAU,GAAG,qCAAnB,CAAA;AAEA;;IACWC,YAAJ;AAEP;;AACA,IAAIC,cAAJ,CAAA;AAEA,MAAMC,eAAe,GAAG,CAAxB,CAAA;AAEA;;AACA,MAAMC,aAAa,GAAG,EAAtB,CAAA;AAEA;;AACA,MAAMC,eAAe,GAAG;AACvB,EAAA,GAAA,EAAK,IADkB;AAEvB,EAAA,GAAA,EAAK,GAFkB;AAGvB,EAAA,GAAA,EAAK,KAHkB;AAIvB,EAAA,IAAA,EAAM,GAJiB;AAKvB,EAAA,IAAA,EAAM,KALiB;AAMvB,EAAA,IAAA,EAAM,GANiB;AAOvB,EAAA,IAAA,EAAM,GAPiB;AAQvB,EAAA,IAAA,EAAM,IARiB;AASvB,EAAA,IAAA,EAAM,GATiB;AAUvB,EAAA,GAAA,EAAK,KAVkB;AAWvB,EAAA,GAAA,EAAK,MAXkB;AAYvB,EAAA,GAAA,EAAK,UAZkB;AAavB,EAAA,GAAA,EAAK,MAbkB;AAcvB,EAAA,GAAA,EAAK,IAdkB;AAevB,EAAA,GAAA,EAAK,QAfkB;AAgBvB,EAAA,GAAA,EAAK,MAhBkB;AAiBvB,EAAA,GAAA,EAAK,IAjBkB;AAkBvB,EAAA,GAAA,EAAK,IAlBkB;AAmBvB,EAAA,GAAA,EAAK,QAnBkB;AAoBvB,EAAA,GAAA,EAAK,UApBkB;AAqBvB,EAAA,GAAA,EAAK,KArBkB;AAsBvB,EAAA,GAAA,EAAK,SAtBkB;AAuBvB,EAAA,GAAA,EAAK,SAvBkB;AAwBvB,EAAA,IAAA,EAAM,GAxBiB;AAyBvB,EAAA,IAAA,EAAM,GAzBiB;AA0BvB,EAAA,IAAA,EAAM,GA1BiB;AA2BvB,EAAA,IAAA,EAAM,GA3BiB;AA4BvB,EAAA,GAAA,EAAK,QA5BkB;AA6BvB,EAAA,GAAA,EAAK,KA7BkB;AA8BvB,EAAA,GAAA,EAAK,OA9BkB;AA+BvB,EAAA,GAAA,EAAK,OA/BkB;AAgCvB,EAAA,GAAA,EAAK,OAhCkB;AAiCvB,EAAA,IAAA,EAAM,GAjCiB;AAkCvB,EAAA,IAAA,EAAM,GAlCiB;AAmCvB,EAAA,GAAA,EAAK,GAnCkB;AAoCvB,EAAA,GAAA,EAAK,KApCkB;AAqCvB,EAAA,IAAA,EAAM,GArCiB;AAsCvB,EAAA,GAAA,EAAK,GAtCkB;AAuCvB,EAAA,GAAA,EAAK,KAvCkB;AAwCvB,EAAA,GAAA,EAAK,OAxCkB;EAyCvB,IAAM,EAAA,GAAA;AAzCiB,CAAxB,CAAA;;AA6CA,KAAK,IAAIC,KAAT,IAAkBD,eAAlB,EAAmC;AAClC,EAAA,IAAIE,OAAO,GAAGF,eAAe,CAACC,KAAD,CAAf,IAA0B,EAAxC,CAAA;;AACA,EAAA,KAAK,IAAIE,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGD,OAAO,CAACE,MAA5B,EAAoCD,CAAC,EAArC,EAAwC;IACvC,IAAIE,IAAI,GAAGH,OAAO,CAACI,SAAR,CAAkBH,CAAlB,EAAoBA,CAAC,GAAC,CAAtB,CAAX,CAAA;AACAJ,IAAAA,aAAa,CAACM,IAAD,CAAb,GAAsBJ,KAAtB,CAAA;AACA,GAAA;AACD,CAAA;;AAGD,MAAMM,WAAW,GAAG,IAAIC,MAAJ,CAAWC,MAAM,CAACC,IAAP,CAAYX,aAAZ,EAA2BY,IAA3B,CAAgC,GAAhC,CAAqC,GAAA,GAArC,GAAyChB,UAApD,EAA+D,IAA/D,CAApB,CAAA;AAIA;AACA;AACA;AACA;AACA;;AACaiB,MAAAA,UAAU,GAAIC,YAAD,IAAkB;EAC3C,IAAIjB,WAAW,KAAKkB,SAApB,EAAgC,OAAA;AAChClB,EAAAA,WAAW,GAAGmB,WAAW,CAACF,YAAY,IAAInB,WAAjB,CAAzB,CAAA;AACA,EAHM;AAMP;AACA;AACA;AACA;AACA;AACA;;AACasB,MAAAA,SAAS,GAAG,CAACC,GAAD,EAAKC,IAAI,GAAC,MAAV,KAAqBD,GAAG,CAACD,SAAJ,CAAcE,IAAd,EAAvC;AAIP;AACA;AACA;AACA;AACA;AACA;AACA;;AACaC,MAAAA,SAAS,GAAIF,GAAD,IAAS;AAEjC,EAAA,OAAOG,OAAO,CAACH,GAAD,CAAP,CAAaI,MAAb;AACN;AACF;AACA;AACA;EACE,CAACC,MAAD,EAASjB,IAAT,KAAiB;AAChB,IAAA,OAAOiB,MAAM,GAAGC,UAAU,CAAClB,IAAD,CAA1B,CAAA;GANK,EAQN,EARM,CAAP,CAAA;AAUA,EAZM;AAcP;AACA;AACA;AACA;;AACakB,MAAAA,UAAU,GAAIN,GAAD,IAAS;EAClCA,GAAG,GAAGD,SAAS,CAACC,GAAD,CAAT,CACJO,WADI,EAEJC,CAAAA,OAFI,CAEIlB,WAFJ,EAEgB;AAAC;AAAsBF,EAAAA,IAAvB,KAAgC;AACpD,IAAA,OAAON,aAAa,CAACM,IAAD,CAAb,IAAuB,EAA9B,CAAA;GAHI,CAAN,CADkC;;AAQlC,EAAA,OAAOW,SAAS,CAACC,GAAD,EAAK,KAAL,CAAhB,CAAA;AACA,EATM;AAgBP;AACA;AACA;AACA;AACA;;AACO,UAAUS,SAAV,CAAoBhC,WAApB,EAAgC;EAEtC,KAAI,MAAM,CAACiC,cAAD,EAAiBC,cAAjB,CAAV,IAA8ClC,WAA9C,EAA0D;IACzD,KAAI,IAAIS,CAAC,GAAGwB,cAAZ,EAA4BxB,CAAC,IAAIyB,cAAjC,EAAiDzB,CAAC,EAAlD,EAAqD;AAEpD,MAAA,IAAI0B,QAAQ,GAAIC,MAAM,CAACC,YAAP,CAAoB5B,CAApB,CAAhB,CAAA;AACA,MAAA,IAAI6B,MAAM,GAAKb,SAAS,CAACU,QAAD,CAAxB,CAAA;;AAGA,MAAA,IAAIG,MAAM,IAAIH,QAAQ,CAACL,WAAT,EAAd,EAAsC;AACrC,QAAA,SAAA;AACA,OARmD;AAWpD;AACA;AACA;AACA;;;AACA,MAAA,IAAIQ,MAAM,CAAC5B,MAAP,GAAgBN,eAApB,EAAqC;AACpC,QAAA,SAAA;AACA,OAAA;;AAED,MAAA,IAAIkC,MAAM,CAAC5B,MAAP,IAAiB,CAArB,EAAwB;AACvB,QAAA,SAAA;AACA,OAAA;;MAGD,MAAM;AAAC4B,QAAAA,MAAM,EAACA,MAAR;AAAeH,QAAAA,QAAQ,EAACA,QAAxB;AAAiCI,QAAAA,UAAU,EAAC9B,CAAAA;OAAlD,CAAA;AACA,KAAA;AACD,GAAA;AACD,CAAA;AAGD;AACA;AACA;AACA;AACA;;AACa+B,MAAAA,YAAY,GAAIxC,WAAD,IAAiB;AAE5C;EACA,MAAMyC,YAAY,GAAG,EAArB,CAAA;AAGA;AACD;AACA;AACA;;AACC,EAAA,MAAMC,WAAW,GAAG,CAACJ,MAAD,EAAQK,MAAR,KAAmB;AAEtC;IACA,MAAMC,UAAU,GAAGH,YAAY,CAACH,MAAD,CAAZ,IAAwB,IAAIO,GAAJ,EAA3C,CAAA;AAEA,IAAA,MAAMC,IAAI,GAAG,IAAIhC,MAAJ,CAAY,GAAIiC,GAAAA,YAAY,CAACH,UAAD,CAAhB,GAA6B,GAAzC,EAA6C,IAA7C,CAAb,CAAA;;AACA,IAAA,IAAID,MAAM,CAACK,KAAP,CAAaF,IAAb,CAAJ,EAAwB;AACvB,MAAA,OAAA;AACA,KAAA;;AAEDF,IAAAA,UAAU,CAACK,GAAX,CAAeC,YAAY,CAACP,MAAD,CAA3B,CAAA,CAAA;AACAF,IAAAA,YAAY,CAACH,MAAD,CAAZ,GAAuBM,UAAvB,CAAA;GAXD,CAAA;;AAeA,EAAA,KAAK,IAAIO,KAAT,IAAkBnB,SAAS,CAAChC,WAAD,CAA3B,EAA0C;IACzC0C,WAAW,CAACS,KAAK,CAACb,MAAP,EAAca,KAAK,CAACb,MAApB,CAAX,CAAA;IACAI,WAAW,CAACS,KAAK,CAACb,MAAP,EAAca,KAAK,CAAChB,QAApB,CAAX,CAAA;AACA,GAAA;;AAED,EAAA,OAAOM,YAAP,CAAA;AACA,EA/BM;AAiCP;AACA;AACA;AACA;AACA;AACA;AACA;;AACapB,MAAAA,WAAW,GAAIrB,WAAD,IAAiB;AAE3C;AACA,EAAA,MAAMyC,YAAY,GAAGD,YAAY,CAACxC,WAAD,CAAjC,CAAA;AAEA;;EACA,MAAME,WAAW,GAAG,EAApB,CAAA;AAEA;;EACA,IAAIkD,UAAU,GAAG,EAAjB,CAAA;;AAEA,EAAA,KAAK,IAAId,MAAT,IAAmBG,YAAnB,EAAiC;AAEhC,IAAA,IAAIY,GAAG,GAAGZ,YAAY,CAACH,MAAD,CAAtB,CAAA;;AACA,IAAA,IAAIe,GAAJ,EAAS;AACRnD,MAAAA,WAAW,CAACoC,MAAD,CAAX,GAAsBS,YAAY,CAACM,GAAD,CAAlC,CAAA;AACA,KAAA;;AAED,IAAA,IAAIf,MAAM,CAAC5B,MAAP,GAAgB,CAApB,EAAuB;AACtB0C,MAAAA,UAAU,CAACE,IAAX,CAAgBJ,YAAY,CAACZ,MAAD,CAA5B,CAAA,CAAA;AACA,KAAA;AACD,GAAA;;AAEDc,EAAAA,UAAU,CAACG,IAAX,CAAgB,CAACC,CAAD,EAAIC,CAAJ,KAAUA,CAAC,CAAC/C,MAAF,GAAW8C,CAAC,CAAC9C,MAAvC,CAAA,CAAA;AACA,EAAA,MAAMgD,eAAe,GAAGC,cAAc,CAACP,UAAD,CAAtC,CAAA;EACAjD,cAAc,GAAG,IAAIW,MAAJ,CAAW,MAAI4C,eAAf,EAA+B,GAA/B,CAAjB,CAAA;AAEA,EAAA,OAAOxD,WAAP,CAAA;AACA,EA5BM;AA+BP;AACA;AACA;AACA;AACA;AACA;;AACO,MAAM0D,WAAW,GAAG,CAACC,OAAD,EAASC,eAAe,GAAC,CAAzB,KAA8B;EACxD,IAAIC,cAAc,GAAG,CAArB,CAAA;AAGAF,EAAAA,OAAO,GAAGA,OAAO,CAACG,GAAR,CAAazC,GAAD,IAAO;AAC5B,IAAA,IAAIrB,WAAW,CAACqB,GAAD,CAAf,EAAsB;MACrBwC,cAAc,IAAIxC,GAAG,CAACb,MAAtB,CAAA;AACA,KAAA;;AACD,IAAA,OAAOR,WAAW,CAACqB,GAAD,CAAX,IAAoBA,GAA3B,CAAA;AACA,GALS,CAAV,CAAA;;EAOA,IAAIwC,cAAc,IAAID,eAAtB,EAAuC;IACtC,OAAOG,eAAe,CAACJ,OAAD,CAAtB,CAAA;AACA,GAAA;;AAED,EAAA,OAAO,EAAP,CAAA;AACA,EAhBM;AAkBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACO,MAAMK,mBAAmB,GAAG,CAAC3C,GAAD,EAAKuC,eAAe,GAAC,CAArB,KAA2B;AAE7DA,EAAAA,eAAe,GAAGK,IAAI,CAACC,GAAL,CAASN,eAAT,EAAyBvC,GAAG,CAACb,MAAJ,GAAW,CAApC,CAAlB,CAAA;EAEA,OAAOiD,cAAc,CACpBU,aAAa,CAAC9C,GAAD,CAAb,CAAmByC,GAAnB,CAAyBM,OAAD,IAAY;AACnC,IAAA,OAAOV,WAAW,CAACU,OAAD,EAASR,eAAT,CAAlB,CAAA;AACA,GAFD,CADoB,CAArB,CAAA;AAKA,EATM;AAWP;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,MAAMS,kBAAkB,GAAG,CAACC,SAAD,EAAWC,GAAG,GAAC,IAAf,KAAwB;EAElD,IAAIX,eAAe,GAAGU,SAAS,CAAC9D,MAAV,GAAmB,CAAnB,GAAuB,CAAvB,GAA2B,CAAjD,CAAA;AACA,EAAA,OAAOiD,cAAc,CACpBa,SAAS,CAACR,GAAV,CAAgBU,QAAD,IAAa;IAC3B,IAAIC,GAAG,GAAG,EAAV,CAAA;AACA,IAAA,MAAMC,GAAG,GAAGH,GAAG,GAAGC,QAAQ,CAAChE,MAAT,EAAH,GAAuBgE,QAAQ,CAAChE,MAAT,KAAoB,CAA1D,CAAA;;IACA,KAAK,IAAImE,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGD,GAApB,EAAyBC,CAAC,EAA1B,EAA6B;AAC5BF,MAAAA,GAAG,CAACrB,IAAJ,CAASY,mBAAmB,CAACQ,QAAQ,CAACI,OAAT,CAAiBD,CAAjB,CAAA,IAAqB,EAAtB,EAAyBf,eAAzB,CAA5B,CAAA,CAAA;AACA,KAAA;;IAED,OAAOG,eAAe,CAACU,GAAD,CAAtB,CAAA;AACA,GARD,CADoB,CAArB,CAAA;AAWA,CAdD,CAAA;AAgBA;AACA;AACA;AACA;AACA;;;AACA,MAAMI,WAAW,GAAG,CAACC,UAAD,EAAaR,SAAb,KAA2B;AAE9C,EAAA,KAAI,MAAMG,GAAV,IAAiBH,SAAjB,EAA2B;AAE1B,IAAA,IAAIG,GAAG,CAACM,KAAJ,IAAaD,UAAU,CAACC,KAAxB,IAAiCN,GAAG,CAACO,GAAJ,IAAWF,UAAU,CAACE,GAA3D,EAAgE;AAC/D,MAAA,SAAA;AACA,KAAA;;AAED,IAAA,IAAIP,GAAG,CAACG,OAAJ,CAAY7D,IAAZ,CAAiB,EAAjB,CAAA,KAAyB+D,UAAU,CAACF,OAAX,CAAmB7D,IAAnB,CAAwB,EAAxB,CAA7B,EAA0D;AACzD,MAAA,SAAA;AACA,KAAA;;AAGD,IAAA,IAAIkE,YAAY,GAAGH,UAAU,CAACI,KAA9B,CAAA;AAEA;AACF;AACA;;IACE,MAAMC,MAAM,GAAIC,IAAD,IAAS;AAEvB,MAAA,KAAI,MAAMC,WAAV,IAAyBJ,YAAzB,EAAsC;AAErC,QAAA,IAAII,WAAW,CAACN,KAAZ,KAAsBK,IAAI,CAACL,KAA3B,IAAoCM,WAAW,CAACC,MAAZ,KAAuBF,IAAI,CAACE,MAApE,EAA4E;AAC3E,UAAA,OAAO,KAAP,CAAA;AACA,SAAA;;QAED,IAAIF,IAAI,CAAC5E,MAAL,IAAe,CAAf,IAAoB6E,WAAW,CAAC7E,MAAZ,IAAsB,CAA9C,EAAiD;AAChD,UAAA,SAAA;AACA,SARoC;AAYrC;AACA;AACA;AACA;;;AACA,QAAA,IAAI4E,IAAI,CAACL,KAAL,GAAaM,WAAW,CAACN,KAAzB,IAAkCK,IAAI,CAACJ,GAAL,GAAWK,WAAW,CAACN,KAA7D,EAAoE;AACnE,UAAA,OAAO,IAAP,CAAA;AACA,SAAA;;AAED,QAAA,IAAIM,WAAW,CAACN,KAAZ,GAAoBK,IAAI,CAACL,KAAzB,IAAkCM,WAAW,CAACL,GAAZ,GAAkBI,IAAI,CAACL,KAA7D,EAAoE;AACnE,UAAA,OAAO,IAAP,CAAA;AACA,SAAA;AAED,OAAA;;AAED,MAAA,OAAO,KAAP,CAAA;KA5BD,CAAA;;IA+BA,IAAIQ,QAAQ,GAAGd,GAAG,CAACS,KAAJ,CAAUC,MAAV,CAAiBA,MAAjB,CAAf,CAAA;;AAEA,IAAA,IAAII,QAAQ,CAAC/E,MAAT,GAAkB,CAAtB,EAAyB;AACxB,MAAA,SAAA;AACA,KAAA;;AAED,IAAA,OAAO,IAAP,CAAA;AACA,GAAA;;AAED,EAAA,OAAO,KAAP,CAAA;AACA,CA3DD,CAAA;;AA6DA,MAAMgF,QAAN,CAAc;AAEbC,EAAAA,WAAW,GAAE;AAEZ;IACA,IAAKP,CAAAA,KAAL,GAAc,EAAd,CAAA;AAEA;;IACA,IAAKN,CAAAA,OAAL,GAAe,EAAf,CAAA;IACA,IAAKG,CAAAA,KAAL,GAAc,CAAd,CAAA;IACA,IAAKC,CAAAA,GAAL,GAAY,CAAZ,CAAA;AACA,GAAA;AAED;AACD;AACA;;;EACCjC,GAAG,CAACqC,IAAD,EAAM;AACR,IAAA,IAAIA,IAAJ,EAAU;AACT,MAAA,IAAA,CAAKF,KAAL,CAAW9B,IAAX,CAAgBgC,IAAhB,CAAA,CAAA;AACA,MAAA,IAAA,CAAKR,OAAL,CAAaxB,IAAb,CAAkBgC,IAAI,CAACE,MAAvB,CAAA,CAAA;AACA,MAAA,IAAA,CAAKP,KAAL,GAAad,IAAI,CAACyB,GAAL,CAASN,IAAI,CAACL,KAAd,EAAoB,IAAKA,CAAAA,KAAzB,CAAb,CAAA;AACA,MAAA,IAAA,CAAKC,GAAL,GAAWf,IAAI,CAACC,GAAL,CAASkB,IAAI,CAACJ,GAAd,EAAkB,IAAKA,CAAAA,GAAvB,CAAX,CAAA;AACA,KAAA;AACD,GAAA;;AAEDW,EAAAA,IAAI,GAAE;IACL,OAAO,IAAA,CAAKT,KAAL,CAAW,IAAA,CAAKA,KAAL,CAAW1E,MAAX,GAAkB,CAA7B,CAAP,CAAA;AACA,GAAA;;AAEDA,EAAAA,MAAM,GAAE;IACP,OAAO,IAAA,CAAK0E,KAAL,CAAW1E,MAAlB,CAAA;AACA,GAAA;AAED;AACD;AACA;AACA;;;AACCoF,EAAAA,KAAK,CAACC,QAAD,EAAWC,UAAX,EAAsB;AAC1B,IAAA,IAAIF,KAAK,GAAG,IAAIJ,QAAJ,EAAZ,CAAA;AAEA,IAAA,IAAIN,KAAK,GAAGa,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAe,IAAKf,CAAAA,KAApB,CAAX,CAAZ,CAAA;AACA,IAAA,IAAIgB,SAAS,GAAGhB,KAAK,CAACiB,GAAN,EAAhB,CAAA;;AACA,IAAA,KAAK,MAAMf,IAAX,IAAmBF,KAAnB,EAA0B;MACzBU,KAAK,CAAC7C,GAAN,CAAUqC,IAAV,CAAA,CAAA;AACA,KAAA;;AAED,IAAA,IAAIgB,WAAW,GAAGN,UAAU,CAACR,MAAX,CAAkB5E,SAAlB,CAA4B,CAA5B,EAA8BmF,QAAQ,GAACK,SAAS,CAACnB,KAAjD,CAAlB,CAAA;AACA,IAAA,IAAIsB,cAAc,GAAGD,WAAW,CAAC5F,MAAjC,CAAA;IACAoF,KAAK,CAAC7C,GAAN,CAAU;MAACgC,KAAK,EAACmB,SAAS,CAACnB,KAAjB;AAAuBC,MAAAA,GAAG,EAACkB,SAAS,CAACnB,KAAV,GAAgBsB,cAA3C;AAA0D7F,MAAAA,MAAM,EAAC6F,cAAjE;AAAgFf,MAAAA,MAAM,EAACc,WAAAA;KAAjG,CAAA,CAAA;AAEA,IAAA,OAAOR,KAAP,CAAA;AACA,GAAA;;AAnDY,CAAA;AAuDd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACaU,MAAAA,UAAU,GAAIjF,GAAD,IAAS;EAClCL,UAAU,EAAA,CAAA;AAEVK,EAAAA,GAAG,GAAOE,SAAS,CAACF,GAAD,CAAnB,CAAA;EAEA,IAAIkF,OAAO,GAAK,EAAhB,CAAA;AACA,EAAA,IAAIjC,SAAS,GAAI,CAAC,IAAIkB,QAAJ,EAAD,CAAjB,CAAA;;AAEA,EAAA,KAAK,IAAIjF,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGc,GAAG,CAACb,MAAxB,EAAgCD,CAAC,EAAjC,EAAqC;AAEpC,IAAA,IAAI+E,MAAM,GAAGjE,GAAG,CAACX,SAAJ,CAAcH,CAAd,CAAb,CAAA;AACA,IAAA,IAAIuC,KAAK,GAAGwC,MAAM,CAACxC,KAAP,CAAa7C,cAAb,CAAZ,CAAA;IACA,MAAMQ,IAAI,GAAGY,GAAG,CAACX,SAAJ,CAAcH,CAAd,EAAgBA,CAAC,GAAC,CAAlB,CAAb,CAAA;IACA,MAAMiG,SAAS,GAAG1D,KAAK,GAAGA,KAAK,CAAC,CAAD,CAAR,GAAc,IAArC,CALoC;AASpC;;IACA,IAAI2D,WAAW,GAAI,EAAnB,CAAA;AACA,IAAA,IAAIC,WAAW,GAAI,IAAI/D,GAAJ,EAAnB,CAAA;;AACA,IAAA,KAAI,MAAM6B,QAAV,IAAsBF,SAAtB,EAAgC;AAE/B,MAAA,MAAMwB,UAAU,GAAGtB,QAAQ,CAACmB,IAAT,EAAnB,CAAA;;AAGA,MAAA,IAAI,CAACG,UAAD,IAAeA,UAAU,CAACtF,MAAX,IAAqB,CAApC,IAAyCsF,UAAU,CAACd,GAAX,IAAkBzE,CAA/D,EAAkE;AAEjE;AACA,QAAA,IAAIiG,SAAJ,EAAe;AACd,UAAA,MAAM9B,GAAG,GAAG8B,SAAS,CAAChG,MAAtB,CAAA;UACAgE,QAAQ,CAACzB,GAAT,CAAa;AAACgC,YAAAA,KAAK,EAACxE,CAAP;YAASyE,GAAG,EAACzE,CAAC,GAACmE,GAAf;AAAmBlE,YAAAA,MAAM,EAACkE,GAA1B;AAA8BY,YAAAA,MAAM,EAACkB,SAAAA;WAAlD,CAAA,CAAA;UACAE,WAAW,CAAC3D,GAAZ,CAAgB,GAAhB,CAAA,CAAA;AACA,SAJD,MAIK;UACJyB,QAAQ,CAACzB,GAAT,CAAa;AAACgC,YAAAA,KAAK,EAACxE,CAAP;YAASyE,GAAG,EAACzE,CAAC,GAAC,CAAf;AAAiBC,YAAAA,MAAM,EAAC,CAAxB;AAA0B8E,YAAAA,MAAM,EAAC7E,IAAAA;WAA9C,CAAA,CAAA;UACAiG,WAAW,CAAC3D,GAAZ,CAAgB,GAAhB,CAAA,CAAA;AACA,SAAA;OAVF,MAYM,IAAIyD,SAAJ,EAAe;QAEpB,IAAIZ,KAAK,GAAGpB,QAAQ,CAACoB,KAAT,CAAerF,CAAf,EAAiBuF,UAAjB,CAAZ,CAAA;AAEA,QAAA,MAAMpB,GAAG,GAAG8B,SAAS,CAAChG,MAAtB,CAAA;QACAoF,KAAK,CAAC7C,GAAN,CAAU;AAACgC,UAAAA,KAAK,EAACxE,CAAP;UAASyE,GAAG,EAACzE,CAAC,GAACmE,GAAf;AAAmBlE,UAAAA,MAAM,EAACkE,GAA1B;AAA8BY,UAAAA,MAAM,EAACkB,SAAAA;SAA/C,CAAA,CAAA;QAEAC,WAAW,CAACrD,IAAZ,CAAiBwC,KAAjB,CAAA,CAAA;AAEA,OATK,MASD;AACJ;AACA;QACAc,WAAW,CAAC3D,GAAZ,CAAgB,GAAhB,CAAA,CAAA;AACA,OAAA;AAED,KA5CmC;;;AAgDpC,IAAA,IAAI0D,WAAW,CAACjG,MAAZ,GAAqB,CAAzB,EAA4B;AAE3B;MACAiG,WAAW,GAAGA,WAAW,CAACpD,IAAZ,CAAiB,CAACC,CAAD,EAAGC,CAAH,KAAO;AACrC,QAAA,OAAOD,CAAC,CAAC9C,MAAF,KAAa+C,CAAC,CAAC/C,MAAF,EAApB,CAAA;AACA,OAFa,CAAd,CAAA;;AAIA,MAAA,KAAK,IAAIoF,KAAT,IAAkBa,WAAlB,EAA8B;AAE7B;AACA,QAAA,IAAI5B,WAAW,CAACe,KAAD,EAAQtB,SAAR,CAAf,EAAmC;AAClC,UAAA,SAAA;AACA,SAAA;;QAEDA,SAAS,CAAClB,IAAV,CAAewC,KAAf,CAAA,CAAA;AACA,OAAA;;AAED,MAAA,SAAA;AACA,KAlEmC;AAsEpC;AACA;AACA;;;AACA,IAAA,IAAIrF,CAAC,GAAG,CAAJ,IAASmG,WAAW,CAACC,IAAZ,IAAoB,CAA7B,IAAkC,CAACD,WAAW,CAACE,GAAZ,CAAgB,GAAhB,CAAvC,EAA6D;AAC5DL,MAAAA,OAAO,IAAIlC,kBAAkB,CAACC,SAAD,EAAW,KAAX,CAA7B,CAAA;AACA,MAAA,IAAIuC,OAAO,GAAG,IAAIrB,QAAJ,EAAd,CAAA;AACA,MAAA,MAAMsB,OAAO,GAAGxC,SAAS,CAAC,CAAD,CAAzB,CAAA;;AACA,MAAA,IAAIwC,OAAJ,EAAa;AACZD,QAAAA,OAAO,CAAC9D,GAAR,CAAY+D,OAAO,CAACnB,IAAR,EAAZ,CAAA,CAAA;AACA,OAAA;;MACDrB,SAAS,GAAG,CAACuC,OAAD,CAAZ,CAAA;AACA,KAAA;AAED,GAAA;;AAEDN,EAAAA,OAAO,IAAIlC,kBAAkB,CAACC,SAAD,EAAW,IAAX,CAA7B,CAAA;AAEA,EAAA,OAAOiC,OAAP,CAAA;AACA;;;;"}