UNPKG

subslate

Version:

configurable template string replacement

1 lines 18.1 kB
{"version":3,"file":"subslate.cjs","sources":["../src/lib/utils.ts","../src/lib/context.ts","../src/lib/escapes.ts","../src/lib/index.ts"],"sourcesContent":["import type { strPairs, obj } from './typing';\n\nexport function iter<F extends(...args:unknown[])=>ReturnType<F>>(fn: F, inputs: unknown[],endFn?: CallableFunction): Iterable<ReturnType<F>> {return {\n\t[Symbol.iterator]() {return {\n\t\tnext() {\n\t\t\tconst result = fn(...inputs);\n\t\t\tif (result) {\n\t\t\t\treturn {done: false, value: result};\n\t\t\t}\n\t\t\tif (endFn) endFn();\n\t\t\treturn {done: true, value: undefined};\n\t\t},\n\t};},\n};}\nconst isNonEmptyArray = (v: unknown): v is unknown[] => Array.isArray(v) && v.length > 0;\nconst isStrArr = (v: unknown): v is string[] => isNonEmptyArray(v) && v.every(x => typeof x === 'string');\nconst isStrPair = (v: unknown): v is strPairs => isStrArr(v) && v.length === 2;\nconst isArrStrArr = (v: unknown): v is strPairs[] => isNonEmptyArray(v) && v.every(x => isStrPair(x));\nconst isMixedStrArr = (v: unknown): v is (strPairs | string)[] => isNonEmptyArray(v) && v.every(x => isStrPair(x) || typeof x === 'string');\nexport const defaulted = (v: unknown,d: strPairs,errMsg='Missing Provided Input'): strPairs[] => {\n\tif (typeof v === 'undefined') return [d];\n\tif (typeof v === 'string') return [[v,v]];\n\tif (isStrPair(v)) return [v];\n\tif (isStrArr(v)) return v.map(x => [x,x]);\n\tif (isArrStrArr(v)) return v;\n\tif (isMixedStrArr(v)) return v.map(x => isStrPair(x) ? x : [x,x]);\n\tthrow Error(errMsg);\n};\nexport function escapeRegExp(text:string): string {\n\treturn text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n}\nexport function regReset(reg: RegExp): void {\n\treg.lastIndex = 0;\n}\nexport const isObj = (obj: unknown): obj is obj => !!obj && typeof obj === 'object' && obj !== null && Object.keys(obj).every(v => typeof v !== 'symbol');\n\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function hasOwnProperty<X extends object, Y extends PropertyKey>(obj: X, prop: Y): obj is X & Record<Y, unknown> {\n\treturn Object.prototype.hasOwnProperty.call(obj,prop);\n}\n","import type { ContextOptions, cacheObj, obj, separators } from './typing';\nimport { escapeRegExp, isObj } from './utils';\n\nconst isBlank = Symbol('Blank Value');\nexport class Context {\n\tcontext: obj;\n\tconstructor(context: obj){\n\t\tthis.context = context;\n\t}\n\tgetContextVal(item: cacheObj,separators: separators, options:ContextOptions):string {\n\t\tconst id = item.content;\n\t\tconst con = this.context;\n\t\tconst {allowRootBracket,allowUnquotedProps,sanitizer} =options;\n\t\tconst {per,opBracket,clBracket,quote,apostrophe,backtick} = separators;\n\t\tconst quotes = [quote,apostrophe,backtick].flat().filter(v => id?.includes(v)).map(v => escapeRegExp(v));\n\t\tconst nextSep = [per,opBracket].flat().filter(v => id?.includes(v)).map(v => escapeRegExp(v));\n\n\t\tfunction getRelative(funId: string, localContext: obj, startIndex = 0): [symbol|unknown,number]{\n\t\t\tlet result: unknown = isBlank;\n\t\t\tlet foundLength = 0;\n\t\t\tconst base = Object.keys(localContext);\n\n\t\t\tfunction keysInId(newInd: number, prefix = '') {\n\t\t\t\tfor (const rootKey of base) {\n\t\t\t\t\tconst baseStr = prefix + rootKey;\n\t\t\t\t\tif (RegExp(`^[\\\\s\\\\S]{${newInd}}(${escapeRegExp(baseStr)})(?:[${nextSep.join('')}]|$)`).test(funId)) {\n\t\t\t\t\t\tresult = localContext[rootKey];\n\t\t\t\t\t\tfoundLength = baseStr.length;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tFindRoot: {\n\t\t\t\tif (startIndex === 0) {\n\t\t\t\t\tif (keysInId(startIndex)) break FindRoot;\n\t\t\t\t}\n\t\t\t\tif (startIndex !== 0) {\n\t\t\t\t\tfor (const period of per) {\n\t\t\t\t\t\tif (keysInId(startIndex,period)) break FindRoot;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (startIndex !== 0 || allowRootBracket) {\n\t\t\t\t\tconst filteredBrackets = opBracket.map((v,i) => [v,clBracket[i]]).filter(v => funId.includes(v[0]) && funId.includes(v[1]));\n\t\t\t\t\tlet currentBrackets: [string,string] | null = null;\n\t\t\t\t\tfor (const [open, close] of filteredBrackets) {\n\t\t\t\t\t\tif (funId.startsWith(open,startIndex)) {\n\t\t\t\t\t\t\tcurrentBrackets = [open, close];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (currentBrackets === null) break FindRoot;\n\t\t\t\t\tconst [open, close] = currentBrackets.map(v => escapeRegExp(v));\n\t\t\t\t\tfor (const quote of [...quotes,...(allowUnquotedProps ? [''] : [])]) {\n\t\t\t\t\t\tfor (const rk of base) {\n\t\t\t\t\t\t\tconst rootKey = escapeRegExp(rk);\n\t\t\t\t\t\t\tconst getInnerReg = RegExp(`^[\\\\s\\\\S]{${startIndex}}(${open}\\\\s*${quote}(${rootKey})${quote}\\\\s*${close})`);\n\t\t\t\t\t\t\tgetInnerReg.lastIndex = startIndex;\n\t\t\t\t\t\t\tconst match = getInnerReg.exec(id);\n\t\t\t\t\t\t\tif (match && match[2]) {\n\t\t\t\t\t\t\t\tresult = localContext[rk];\n\t\t\t\t\t\t\t\tfoundLength = match[1].length;\n\t\t\t\t\t\t\t\tbreak FindRoot;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [result,foundLength];\n\t\t}\n\t\tlet finResult: typeof isBlank | unknown = isBlank;\n\n\t\tlet curInd = 0;\n\t\tfor (;id?.length > curInd;) {\n\t\t\tconst localContext: obj | unknown = finResult === isBlank ? con : finResult;\n\t\t\tif (!isObj(localContext)) break;\n\t\t\tconst [newFinResult,foundLength] = getRelative(id,localContext,curInd);\n\t\t\tif (foundLength === 0) break;\n\t\t\tcurInd += foundLength;\n\t\t\tfinResult = newFinResult;\n\t\t}\n\n\t\tif (finResult === isBlank) {\n\t\t\tfinResult = sanitizer({\n\t\t\t\tisEmpty: true,\n\t\t\t\tid,\n\t\t\t\tat: curInd,\n\t\t\t});\n\t\t} else {\n\t\t\tfinResult = sanitizer({\n\t\t\t\tisEmpty: false,\n\t\t\t\tvalue: finResult,\n\t\t\t\tid,\n\t\t\t});\n\t\t}\n\t\tif (typeof finResult !== 'string') throw Error('Sanitizer did not provide string');\n\t\treturn finResult;\n\t}\n}\n\n","import type { EscapeTypeFlags, escapeNames} from './typing';\nimport { hasOwnProperty } from './utils';\n\nconst JS_DICT = {\n\t'\\'': '\\'',\n\t'\"': '\"',\n\t'\\\\': '\\\\',\n\t'`':'`',\n\t'[':'[',\n\t']':']',\n};\nconst jsonDef = (v: (keyof typeof JS_DICT) | string) => hasOwnProperty(JS_DICT,v) ? JS_DICT[v] : v;\nconst HTML_DICT = {\n\t// cSpell:disable\n\t'.': ['&period;'],\n\t'\\\\':['&#x27;'],\n\t'\\'': ['&apos;'],\n\t'\"': ['&quot;'],\n\t'[': ['&lsqb;'],\n\t']': ['&rsqb;'],\n\t// cSpell:enable\n};\nconst htmlDef = (v: (keyof typeof HTML_DICT) | string) => hasOwnProperty(HTML_DICT,v) ? HTML_DICT[v] : v;\nconst toJsUni = (code: number) => `\\\\u${Number.prototype.toString.call(code,16).toUpperCase()}`;\nconst toHTMLUni = (code: number) => `&#x${Number.prototype.toString.call(code,16).toUpperCase()};`;\nconst getUnicode = (str: string,type: 'js' | 'html') => [...str].map(v => v.split('').map(x => ({\n\tjs: toJsUni,\n\thtml: toHTMLUni,\n}[type](String.prototype.charCodeAt.call(x,0)))).join('')).join('');\n\nexport const toEscapes: {\n\t[K in escapeNames]: (str: string) => string[];\n} = {\n\turl: (str: string) => [encodeURIComponent(str)],\n\thtml: (str: string) => [[...str].map(v => getUnicode(v,'html')).join(''),[...str].map(v => htmlDef(v)).join('')],\n\tjs: (str: string) => [[...str].map(v => jsonDef(v)).join(''),[...str].map(v => getUnicode(v,'js')).join('')],\n\tjson: (str: string) => [[...str].map(v => jsonDef(v)).join(''),[...str].map(v => getUnicode(v,'js')).join('')],\n};\n\nexport const toAllEscapes = (identifier: string, flags: EscapeTypeFlags): string[] => {\n\tconst escaped = new Set<string>();\n\tfor (const k in flags) {\n\t\tif (Object.prototype.hasOwnProperty.call(toEscapes,k)) toEscapes[k](identifier).forEach((v:string) => escaped.add(v));\n\t}\n\treturn Array.from(escaped);\n};\n\n","import { Context } from './context';\nimport { toAllEscapes } from './escapes';\nimport type { Options,cacheObj, strPairs, separators } from './typing';\nimport { iter, defaulted,regReset, escapeRegExp, isObj } from './utils';\ninterface DefaultedOptions extends Options {\n\tstartStopPairs: strPairs[]\n}\nexport const getDefaultOptions = (options: Partial<Options>): DefaultedOptions => ({\n\tstartStopPairs: defaulted(options.startStopPairs,['${','}'],'Invalid startStopPairs'),\n\tescapeSep: typeof options.escapeSep === 'undefined' ? false : options.escapeSep,\n\tallowUnquotedProps: !!options.allowUnquotedProps,\n\tallowRootBracket: !!options.allowRootBracket,\n\tsanitizer: options.sanitizer || ((v) =>\n\t\tv.isEmpty === true ? 'undefined' : String(v.value)),\n\tmaxNameLength: options.maxNameLength || 256,\n});\nexport const createEscapes = toAllEscapes;\nexport const getSeparators = (escapeSep: Options['escapeSep']): separators => {\n\tconst [per,opBracket,clBracket,quote,apostrophe,backtick] = ['.','[',']','\"',\"'\",'`'].map(v => escapeSep ? toAllEscapes(v,escapeSep): [v]);\n\tconst separators = {per,opBracket,clBracket,quote,apostrophe,backtick};\n\treturn separators;\n};\n\nexport const subslate = (text: string,context: Record<string|number,unknown>, options?: Partial<Options> | undefined): string => {\n\tconst localOpts = isObj(options) ? options : {};\n\tconst defaultedOptions = getDefaultOptions(localOpts);\n\tconst {\n\t\tstartStopPairs,\n\t\tescapeSep,\n\t\tmaxNameLength,\n\t} = defaultedOptions;\n\tconst filteredPairs = startStopPairs.filter(v => text.includes(v[0]) && text.includes(v[1])).map(v =>\n\t\t[escapeRegExp(v[0]),escapeRegExp(v[1])]).map(([v1,v2]) =>\n\t\t`(?:${v1}\\\\s*([\\\\s\\\\S]{0,${maxNameLength}}?)\\\\s*${v2})`);\n\tconst cache = new Map<string,cacheObj>();\n\tconst valueCache = new Map<string,string>();\n\tconst searcher = RegExp(filteredPairs.join('|'),'g');\n\tconst reset = () => regReset(searcher);\n\tconst execSearcher = () => searcher.exec(text);\n\tfor (const res of iter(execSearcher,[],reset)) {\n\t\tif (res !== null) {\n\t\t\tconst {index} = res;\n\t\t\tconst [match, content] = res.filter(v => typeof v === 'string');\n\t\t\tif (!match && !searcher.lastIndex) break;\n\t\t\tif(!cache.has(match)) {\n\t\t\t\tcache.set(match, {\n\t\t\t\t\tcontent,\n\t\t\t\t\tindexes: [index],\n\t\t\t\t\tget value() {\n\t\t\t\t\t\treturn valueCache.get(this.content);\n\t\t\t\t\t},\n\t\t\t\t\tset value(val) {\n\t\t\t\t\t\tvalueCache.set(this.content,val);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst temp = cache.get(match);\n\t\t\t\tif (temp) temp.indexes.push(index);\n\t\t\t}\n\t\t}\n\t}\n\tconst lContext = new Context(context);\n\tlet indexOffset = 0;\n\tconst localStr = [...text];\n\tconst separators = getSeparators(escapeSep);\n\tfor (const [match, item] of cache) {\n\t\tif (item.value === undefined) {\n\t\t\titem.value = lContext.getContextVal(item,separators,defaultedOptions);\n\t\t}\n\t\tfor (const ind of item.indexes) {\n\t\t\tconst value = String(item.value || '');\n\t\t\tlocalStr.splice(ind + indexOffset,match.length, ...value);\n\t\t\tindexOffset += (value.length - match.length);\n\t\t}\n\t}\n\treturn localStr.join('');\n};\nexport default subslate;\n"],"names":["isNonEmptyArray","v","Array","isArray","length","isStrArr","every","x","isStrPair","defaulted","d","errMsg","map","isArrStrArr","isMixedStrArr","Error","escapeRegExp","text","replace","isObj","obj","Object","keys","hasOwnProperty","prop","prototype","call","isBlank","Symbol","Context","[object Object]","context","item","separators","options","id","content","con","this","allowRootBracket","allowUnquotedProps","sanitizer","per","opBracket","clBracket","quote","apostrophe","backtick","quotes","flat","filter","includes","nextSep","getRelative","funId","localContext","startIndex","result","foundLength","base","keysInId","newInd","prefix","rootKey","baseStr","RegExp","join","test","FindRoot","period","filteredBrackets","i","currentBrackets","open","close","startsWith","rk","getInnerReg","lastIndex","match","exec","finResult","curInd","newFinResult","isEmpty","at","value","JS_DICT","jsonDef","HTML_DICT","toJsUni","code","Number","toString","toUpperCase","toHTMLUni","getUnicode","str","type","split","js","html","String","charCodeAt","toEscapes","url","encodeURIComponent","htmlDef","json","toAllEscapes","identifier","flags","escaped","Set","k","forEach","add","from","getDefaultOptions","startStopPairs","escapeSep","maxNameLength","createEscapes","getSeparators","subslate","localOpts","defaultedOptions","filteredPairs","v1","v2","cache","Map","valueCache","searcher","reset","execSearcher","res","fn","inputs","endFn","iterator","done","undefined","iter","index","has","temp","get","indexes","push","set","val","lContext","indexOffset","localStr","getContextVal","ind","splice"],"mappings":"oEAcA,MAAMA,EAAmBC,GAA+BC,MAAMC,QAAQF,IAAMA,EAAEG,OAAS,EACjFC,EAAYJ,GAA8BD,EAAgBC,IAAMA,EAAEK,OAAMC,GAAkB,iBAANA,IACpFC,EAAaP,GAA8BI,EAASJ,IAAmB,IAAbA,EAAEG,OAGrDK,EAAY,CAACR,EAAWS,EAAYC,EAAO,oCACtC,IAANV,EAAmB,MAAO,CAACS,MACrB,iBAANT,EAAgB,MAAO,CAAC,CAACA,EAAEA,OAClCO,EAAUP,GAAI,MAAO,CAACA,MACtBI,EAASJ,GAAI,OAAOA,EAAEW,KAAIL,GAAK,CAACA,EAAEA,QANlBN,CAAAA,GAAgCD,EAAgBC,IAAMA,EAAEK,OAAMC,GAAKC,EAAUD,KAO7FM,CAAYZ,GAAI,OAAOA,KANLA,CAAAA,GAA2CD,EAAgBC,IAAMA,EAAEK,OAAMC,GAAKC,EAAUD,IAAmB,iBAANA,IAOvHO,CAAcb,GAAI,OAAOA,EAAEW,KAAIL,GAAKC,EAAUD,GAAKA,EAAI,CAACA,EAAEA,WACxDQ,MAAMJ,IAEP,SAAUK,EAAaC,UACrBA,EAAKC,QAAQ,2BAA4B,QAK1C,MAAMC,EAASC,KAA+BA,GAAsB,iBAARA,GAA4B,OAARA,GAAgBC,OAAOC,KAAKF,GAAKd,OAAML,GAAkB,iBAANA,IAIpI,SAAUsB,EAAwDH,EAAQI,UACxEH,OAAOI,UAAUF,eAAeG,KAAKN,EAAII,GCpCjD,MAAMG,EAAUC,OAAO,eACjB,MAAOC,EAEZC,YAAYC,QACNA,QAAUA,EAEhBD,cAAcE,EAAeC,EAAwBC,SAC9CC,EAAKH,EAAKI,QACVC,EAAMC,KAAKP,SACXQ,iBAACA,EAADC,mBAAkBA,EAAlBC,UAAqCA,GAAYP,GACjDQ,IAACA,EAADC,UAAKA,EAALC,UAAeA,EAAfC,MAAyBA,EAAzBC,WAA+BA,EAA/BC,SAA0CA,GAAYd,EACtDe,EAAS,CAACH,EAAMC,EAAWC,GAAUE,OAAOC,QAAOjD,GAAKkC,GAAIgB,SAASlD,KAAIW,KAAIX,GAAKe,EAAaf,KAC/FmD,EAAU,CAACV,EAAIC,GAAWM,OAAOC,QAAOjD,GAAKkC,GAAIgB,SAASlD,KAAIW,KAAIX,GAAKe,EAAaf,cAEjFoD,EAAYC,EAAeC,EAAmBC,EAAa,OAC/DC,EAAkB9B,EAClB+B,EAAc,QACZC,EAAOtC,OAAOC,KAAKiC,YAEhBK,EAASC,EAAgBC,EAAS,QACrC,MAAMC,KAAWJ,EAAM,OACrBK,EAAUF,EAASC,KACrBE,OAAO,aAAaJ,MAAW7C,EAAagD,UAAgBZ,EAAQc,KAAK,WAAWC,KAAKb,UAC5FG,EAASF,EAAaQ,GACtBL,EAAcM,EAAQ5D,QACf,SAGF,EAGRgE,KACoB,IAAfZ,IACCI,EAASJ,OAEK,IAAfA,MACE,MAAMa,KAAU3B,KAChBkB,EAASJ,EAAWa,GAAS,MAAMD,KAGtB,IAAfZ,GAAoBjB,EAAkB,OACnC+B,EAAmB3B,EAAU/B,KAAI,CAACX,EAAEsE,IAAM,CAACtE,EAAE2C,EAAU2B,MAAKrB,QAAOjD,GAAKqD,EAAMH,SAASlD,EAAE,KAAOqD,EAAMH,SAASlD,EAAE,UACnHuE,EAA0C,SACzC,MAAOC,EAAMC,KAAUJ,KACvBhB,EAAMqB,WAAWF,EAAKjB,GAAa,CACtCgB,EAAkB,CAACC,EAAMC,YAIH,OAApBF,EAA0B,MAAMJ,QAC7BK,EAAMC,GAASF,EAAgB5D,KAAIX,GAAKe,EAAaf,SACvD,MAAM4C,IAAS,IAAIG,KAAWR,EAAqB,CAAC,IAAM,QACzD,MAAMoC,KAAMjB,EAAM,OAChBI,EAAU/C,EAAa4D,GACvBC,EAAcZ,OAAO,aAAaT,MAAeiB,QAAW5B,KAASkB,KAAWlB,QAAY6B,MAClGG,EAAYC,UAAYtB,QAClBuB,EAAQF,EAAYG,KAAK7C,MAC3B4C,GAASA,EAAM,GAAI,CACtBtB,EAASF,EAAaqB,GACtBlB,EAAcqB,EAAM,GAAG3E,aACjBgE,WAMJ,CAACX,EAAOC,OAEZuB,EAAsCtD,EAEtCuD,EAAS,OACP/C,GAAI/B,OAAS8E,GAAS,OACrB3B,EAA8B0B,IAActD,EAAUU,EAAM4C,MAC7D9D,EAAMoC,GAAe,YACnB4B,EAAazB,GAAeL,EAAYlB,EAAGoB,EAAa2B,MAC3C,IAAhBxB,EAAmB,MACvBwB,GAAUxB,EACVuB,EAAYE,KAIZF,EAAYxC,EADTwC,IAActD,EACK,CACrByD,SAAS,EACTjD,GAAAA,EACAkD,GAAIH,GAGiB,CACrBE,SAAS,EACTE,MAAOL,EACP9C,GAAAA,IAGuB,iBAAd8C,EAAwB,MAAMlE,MAAM,2CACxCkE,GC9FT,MAAMM,EAAU,KACT,QACD,SACC,SACF,QACA,QACA,KAECC,EAAWvF,GAAuCsB,EAAegE,EAAQtF,GAAKsF,EAAQtF,GAAKA,EAC3FwF,EAAY,KAEZ,CAAC,iBACD,CAAC,cACA,CAAC,cACF,CAAC,cACD,CAAC,cACD,CAAC,WAIDC,EAAWC,GAAiB,MAAMC,OAAOnE,UAAUoE,SAASnE,KAAKiE,EAAK,IAAIG,gBAC1EC,EAAaJ,GAAiB,MAAMC,OAAOnE,UAAUoE,SAASnE,KAAKiE,EAAK,IAAIG,iBAC5EE,EAAa,CAACC,EAAYC,IAAwB,IAAID,GAAKrF,KAAIX,GAAKA,EAAEkG,MAAM,IAAIvF,KAAIL,IAAM,CAC/F6F,GAAIV,EACJW,KAAMN,GACLG,GAAMI,OAAO7E,UAAU8E,WAAW7E,KAAKnB,EAAE,OAAM2D,KAAK,MAAKA,KAAK,IAEnDsC,EAET,CACHC,IAAMR,GAAgB,CAACS,mBAAmBT,IAC1CI,KAAOJ,GAAgB,CAAC,IAAIA,GAAKrF,KAAIX,GAAK+F,EAAW/F,EAAE,UAASiE,KAAK,IAAI,IAAI+B,GAAKrF,KAAIX,GAZtEA,CAAAA,GAAyCsB,EAAekE,EAAUxF,GAAKwF,EAAUxF,GAAKA,EAYX0G,CAAQ1G,KAAIiE,KAAK,KAC5GkC,GAAKH,GAAgB,CAAC,IAAIA,GAAKrF,KAAIX,GAAKuF,EAAQvF,KAAIiE,KAAK,IAAI,IAAI+B,GAAKrF,KAAIX,GAAK+F,EAAW/F,EAAE,QAAOiE,KAAK,KACxG0C,KAAOX,GAAgB,CAAC,IAAIA,GAAKrF,KAAIX,GAAKuF,EAAQvF,KAAIiE,KAAK,IAAI,IAAI+B,GAAKrF,KAAIX,GAAK+F,EAAW/F,EAAE,QAAOiE,KAAK,MAG9F2C,EAAe,CAACC,EAAoBC,WAC1CC,EAAU,IAAIC,QACf,MAAMC,KAAKH,EACX1F,OAAOI,UAAUF,eAAeG,KAAK8E,EAAUU,IAAIV,EAAUU,GAAGJ,GAAYK,SAASlH,GAAa+G,EAAQI,IAAInH,YAE5GC,MAAMmH,KAAKL,ICrCNM,EAAqBpF,KACjCqF,eAAgB9G,EAAUyB,EAAQqF,eAAe,CAAC,KAAK,KAAK,0BAC5DC,eAAwC,IAAtBtF,EAAQsF,WAAoCtF,EAAQsF,UACtEhF,qBAAsBN,EAAQM,mBAC9BD,mBAAoBL,EAAQK,iBAC5BE,UAAWP,EAAQO,YAAexC,IACnB,IAAdA,EAAEmF,QAAmB,YAAckB,OAAOrG,EAAEqF,QAC7CmC,cAAevF,EAAQuF,eAAiB,MAE5BC,EAAgBb,EAChBc,EAAiBH,UACtB9E,EAAIC,EAAUC,EAAUC,EAAMC,EAAWC,GAAY,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,KAAKnC,KAAIX,GAAKuH,EAAYX,EAAa5G,EAAEuH,GAAY,CAACvH,WACpH,CAACyC,IAAAA,EAAIC,UAAAA,EAAUC,UAAAA,EAAUC,MAAAA,EAAMC,WAAAA,EAAWC,SAAAA,IAIjD6E,EAAW,CAAC3G,EAAac,EAAwCG,WACvE2F,EAAY1G,EAAMe,GAAWA,EAAU,GACvC4F,EAAmBR,EAAkBO,IACrCN,eACLA,EADKC,UAELA,EAFKC,cAGLA,GACGK,EACEC,EAAgBR,EAAerE,QAAOjD,GAAKgB,EAAKkC,SAASlD,EAAE,KAAOgB,EAAKkC,SAASlD,EAAE,MAAKW,KAAIX,GAChG,CAACe,EAAaf,EAAE,IAAIe,EAAaf,EAAE,OAAMW,KAAI,EAAEoH,EAAGC,KAClD,MAAMD,oBAAqBP,WAAuBQ,OAC7CC,EAAQ,IAAIC,IACZC,EAAa,IAAID,IACjBE,EAAWpE,OAAO8D,EAAc7D,KAAK,KAAK,KAC1CoE,EAAQ,KAAeD,EHLzBvD,UAAY,GGMVyD,EAAe,IAAMF,EAASrD,KAAK/D,OACpC,MAAMuH,KHrCN,SAA4DC,EAAOC,EAAkBC,SAA2D,EACpJ/G,OAAOgH,eAAoB,CAC3B9G,aACO2B,EAASgF,KAAMC,UACjBjF,EACI,CAACoF,MAAM,EAAOvD,MAAO7B,IAEzBkF,GAAOA,IACJ,CAACE,MAAM,EAAMvD,WAAOwD,QG6BXC,CAAKR,EAAa,GAAGD,MAC1B,OAARE,EAAc,OACXQ,MAACA,GAASR,GACTzD,EAAO3C,GAAWoG,EAAItF,QAAOjD,GAAkB,iBAANA,QAC3C8E,IAAUsD,EAASvD,UAAW,SAC/BoD,EAAMe,IAAIlE,GAWP,OACAmE,EAAOhB,EAAMiB,IAAIpE,GACnBmE,GAAMA,EAAKE,QAAQC,KAAKL,QAZ5Bd,EAAMoB,IAAIvE,EAAO,CAChB3C,QAAAA,EACAgH,QAAS,CAACJ,sBAEFZ,EAAWe,IAAI7G,KAAKF,oBAElBmH,GACTnB,EAAWkB,IAAIhH,KAAKF,QAAQmH,YAS3BC,EAAW,IAAI3H,EAAQE,OACzB0H,EAAc,QACZC,EAAW,IAAIzI,GACfgB,EAAa0F,EAAcH,OAC5B,MAAOzC,EAAO/C,KAASkG,EAAO,MACfY,IAAf9G,EAAKsD,QACRtD,EAAKsD,MAAQkE,EAASG,cAAc3H,EAAKC,EAAW6F,QAEhD,MAAM8B,KAAO5H,EAAKoH,QAAS,OACzB9D,EAAQgB,OAAOtE,EAAKsD,OAAS,IACnCoE,EAASG,OAAOD,EAAMH,EAAY1E,EAAM3E,UAAWkF,GACnDmE,GAAgBnE,EAAMlF,OAAS2E,EAAM3E,eAGhCsJ,EAASxF,KAAK"}