UNPKG

207 kBSource Map (JSON)View Raw
1{"version":3,"file":"liquid.browser.min.js","sources":["../src/drop/drop.ts","../src/util/underscore.ts","../src/cache/lru.ts","../src/fs/browser.ts","../src/drop/comparable.ts","../src/render/boolean.ts","../src/render/operator.ts","../src/util/character.ts","../src/util/operator-trie.ts","../src/liquid-options.ts","../src/util/error.ts","../src/fs/loader.ts","../src/context/context.ts","../src/util/assert.ts","../src/emitters/simple-emitter.ts","../src/emitters/streamed-emitter-browser.ts","../src/util/async.ts","../src/emitters/keeping-type-emitter.ts","../src/render/render.ts","../src/parser/token-kind.ts","../src/util/type-guards.ts","../src/parser/parse-stream.ts","../src/template/template-impl.ts","../src/drop/null-drop.ts","../src/drop/empty-drop.ts","../src/drop/blank-drop.ts","../src/util/literal.ts","../src/parser/parse-string-literal.ts","../src/render/expression.ts","../src/tokens/token.ts","../src/tokens/delimited-token.ts","../src/parser/whitespace-ctrl.ts","../src/tokens/number-token.ts","../src/tokens/identifier-token.ts","../src/tokens/literal-token.ts","../src/tokens/operator-token.ts","../src/tokens/property-access-token.ts","../src/tokens/filter-token.ts","../src/tokens/hash-token.ts","../src/tokens/quoted-token.ts","../src/tokens/html-token.ts","../src/tokens/range-token.ts","../src/tokens/output-token.ts","../src/tokens/liquid-tag-token.ts","../src/parser/tokenizer.ts","../src/parser/match-operator.ts","../src/tokens/tag-token.ts","../src/template/tag/hash.ts","../src/template/filter/filter.ts","../src/parser/filter-arg.ts","../src/template/value.ts","../src/template/tag/tag.ts","../src/template/output.ts","../src/template/html.ts","../src/parser/parser.ts","../src/builtin/tags/assign.ts","../src/util/collection.ts","../src/drop/forloop-drop.ts","../src/builtin/tags/for.ts","../src/builtin/tags/capture.ts","../src/context/block-mode.ts","../src/builtin/tags/case.ts","../src/builtin/tags/comment.ts","../src/builtin/tags/render.ts","../src/builtin/tags/include.ts","../src/builtin/tags/decrement.ts","../src/builtin/tags/cycle.ts","../src/builtin/tags/if.ts","../src/builtin/tags/increment.ts","../src/builtin/tags/layout.ts","../src/drop/block-drop.ts","../src/builtin/tags/block.ts","../src/builtin/tags/raw.ts","../src/drop/tablerowloop-drop.ts","../src/builtin/tags/index.ts","../src/builtin/tags/tablerow.ts","../src/builtin/tags/unless.ts","../src/builtin/tags/break.ts","../src/builtin/tags/continue.ts","../src/builtin/tags/echo.ts","../src/builtin/tags/liquid.ts","../src/builtin/filters/html.ts","../src/builtin/filters/math.ts","../src/util/strftime.ts","../src/util/timezone-date.ts","../src/builtin/filters/url.ts","../src/builtin/filters/array.ts","../src/builtin/filters/date.ts","../src/builtin/filters/object.ts","../src/builtin/filters/string.ts","../src/template/tag/tag-map.ts","../src/template/filter/filter-map.ts","../src/liquid.ts"],"sourcesContent":["export abstract class Drop {\n public valueOf (): any {\n return undefined\n }\n\n public liquidMethodMissing (key: string): Promise<string | undefined> | string | undefined {\n return undefined\n }\n}\n","import { Drop } from '../drop/drop'\n\nconst toStr = Object.prototype.toString\nconst toLowerCase = String.prototype.toLowerCase\n\nexport function isString (value: any): value is string {\n return typeof value === 'string'\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isFunction (value: any): value is Function {\n return typeof value === 'function'\n}\n\nexport function escapeRegex (str: string) {\n return str.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n}\n\nexport function promisify<T1, T2> (fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise<T2>;\nexport function promisify<T1, T2, T3> (fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void): (arg1: T1, arg2: T2) => Promise<T3>;\nexport function promisify (fn: any) {\n return function (...args: any[]) {\n return new Promise((resolve, reject) => {\n fn(...args, (err: Error, result: any) => {\n err ? reject(err) : resolve(result)\n })\n })\n }\n}\n\nexport function stringify (value: any): string {\n value = toValue(value)\n if (isString(value)) return value\n if (isNil(value)) return ''\n return String(value)\n}\n\nexport function toValue (value: any): any {\n return value instanceof Drop ? value.valueOf() : value\n}\n\nexport function isNumber (value: any): value is number {\n return typeof value === 'number'\n}\n\nexport function toLiquid (value: any): any {\n if (value && isFunction(value.toLiquid)) return toLiquid(value.toLiquid())\n return value\n}\n\nexport function isNil (value: any): boolean {\n return value == null\n}\n\nexport function isArray (value: any): value is any[] {\n // be compatible with IE 8\n return toStr.call(value) === '[object Array]'\n}\n\n/*\n * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property.\n * The iteratee is invoked with three arguments: (value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning false.\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @return {Object} Returns object.\n */\nexport function forOwn <T> (\n obj: {[key: string]: T} | undefined,\n iteratee: ((val: T, key: string, obj: {[key: string]: T}) => boolean | void)\n) {\n obj = obj || {}\n for (const k in obj) {\n if (Object.hasOwnProperty.call(obj, k)) {\n if (iteratee(obj[k], k, obj) === false) break\n }\n }\n return obj\n}\n\nexport function last <T>(arr: T[]): T;\nexport function last (arr: string): string;\nexport function last (arr: any[] | string): any | string {\n return arr[arr.length - 1]\n}\n\n/*\n * Checks if value is the language type of Object.\n * (e.g. arrays, functions, objects, regexes, new Number(0), and new String(''))\n * @param {any} value The value to check.\n * @return {Boolean} Returns true if value is an object, else false.\n */\nexport function isObject (value: any): value is object {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nexport function range (start: number, stop: number, step = 1) {\n const arr: number[] = []\n for (let i = start; i < stop; i += step) {\n arr.push(i)\n }\n return arr\n}\n\nexport function padStart (str: any, length: number, ch = ' ') {\n return pad(str, length, ch, (str, ch) => ch + str)\n}\n\nexport function padEnd (str: any, length: number, ch = ' ') {\n return pad(str, length, ch, (str, ch) => str + ch)\n}\n\nexport function pad (str: any, length: number, ch: string, add: (str: string, ch: string) => string) {\n str = String(str)\n let n = length - str.length\n while (n-- > 0) str = add(str, ch)\n return str\n}\n\nexport function identify<T> (val: T): T {\n return val\n}\n\nexport function snakeCase (str: string) {\n return str.replace(\n /(\\w?)([A-Z])/g,\n (_, a, b) => (a ? a + '_' : '') + b.toLowerCase()\n )\n}\n\nexport function changeCase (str: string): string {\n const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z')\n return hasLowerCase ? str.toUpperCase() : str.toLowerCase()\n}\n\nexport function ellipsis (str: string, N: number): string {\n return str.length > N ? str.substr(0, N - 3) + '...' : str\n}\n\n// compare string in case-insensitive way, undefined values to the tail\nexport function caseInsensitiveCompare (a: any, b: any) {\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n a = toLowerCase.call(a)\n b = toLowerCase.call(b)\n if (a < b) return -1\n if (a > b) return 1\n return 0\n}\n","import { Cache } from './cache'\n\nclass Node<T> {\n constructor (\n public key: string,\n public value: T,\n public next: Node<T>,\n public prev: Node<T>\n ) {}\n}\n\nexport class LRU<T> implements Cache<T> {\n private cache: { [key: string]: Node<T> } = {}\n private head: Node<T>\n private tail: Node<T>\n\n constructor (\n public limit: number,\n public size = 0\n ) {\n this.head = new Node<T>('HEAD', null as any, null as any, null as any)\n this.tail = new Node<T>('TAIL', null as any, null as any, null as any)\n this.head.next = this.tail\n this.tail.prev = this.head\n }\n\n write (key: string, value: T) {\n if (this.cache[key]) {\n this.cache[key].value = value\n } else {\n const node = new Node(key, value, this.head.next, this.head)\n this.head.next.prev = node\n this.head.next = node\n\n this.cache[key] = node\n this.size++\n this.ensureLimit()\n }\n }\n\n read (key: string): T | undefined {\n if (!this.cache[key]) return\n const { value } = this.cache[key]\n this.remove(key)\n this.write(key, value)\n return value\n }\n\n remove (key: string) {\n const node = this.cache[key]\n node.prev.next = node.next\n node.next.prev = node.prev\n delete this.cache[key]\n this.size--\n }\n\n clear () {\n this.head.next = this.tail\n this.tail.prev = this.head\n this.size = 0\n this.cache = {}\n }\n\n private ensureLimit () {\n if (this.size > this.limit) this.remove(this.tail.prev.key)\n }\n}\n","import { last } from '../util/underscore'\n\nfunction domResolve (root: string, path: string) {\n const base = document.createElement('base')\n base.href = root\n\n const head = document.getElementsByTagName('head')[0]\n head.insertBefore(base, head.firstChild)\n\n const a = document.createElement('a')\n a.href = path\n const resolved = a.href\n head.removeChild(base)\n\n return resolved\n}\n\nexport function resolve (root: string, filepath: string, ext: string) {\n if (root.length && last(root) !== '/') root += '/'\n const url = domResolve(root, filepath)\n return url.replace(/^(\\w+:\\/\\/[^/]+)(\\/[^?]+)/, (str, origin, path) => {\n const last = path.split('/').pop()\n if (/\\.\\w+$/.test(last)) return str\n return origin + path + ext\n })\n}\n\nexport async function readFile (url: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText as string)\n } else {\n reject(new Error(xhr.statusText))\n }\n }\n xhr.onerror = () => {\n reject(new Error('An error occurred whilst receiving the response.'))\n }\n xhr.open('GET', url)\n xhr.send()\n })\n}\n\nexport function readFileSync (url: string): string {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, false)\n xhr.send()\n if (xhr.status < 200 || xhr.status >= 300) {\n throw new Error(xhr.statusText)\n }\n return xhr.responseText as string\n}\n\nexport async function exists (filepath: string) {\n return true\n}\n\nexport function existsSync (filepath: string) {\n return true\n}\n\nexport function dirname (filepath: string) {\n return domResolve(filepath, '.')\n}\n\nexport const sep = '/'\n","import { isFunction } from '../util/underscore'\n\nexport interface Comparable {\n equals: (rhs: any) => boolean;\n gt: (rhs: any) => boolean;\n geq: (rhs: any) => boolean;\n lt: (rhs: any) => boolean;\n leq: (rhs: any) => boolean;\n}\n\nexport function isComparable (arg: any): arg is Comparable {\n return arg && isFunction(arg.equals)\n}\n","import { Context } from '../context/context'\n\nexport function isTruthy (val: any, ctx: Context): boolean {\n return !isFalsy(val, ctx)\n}\n\nexport function isFalsy (val: any, ctx: Context): boolean {\n if (ctx.opts.jsTruthy) {\n return !val\n } else {\n return val === false || undefined === val || val === null\n }\n}\n","import { isComparable } from '../drop/comparable'\nimport { Context } from '../context/context'\nimport { isFunction } from '../util/underscore'\nimport { isTruthy } from '../render/boolean'\n\nexport interface Operators {\n [key: string]: (lhs: any, rhs: any, ctx: Context) => boolean;\n}\n\nexport const defaultOperators: Operators = {\n '==': (l: any, r: any) => {\n if (isComparable(l)) return l.equals(r)\n if (isComparable(r)) return r.equals(l)\n return l === r\n },\n '!=': (l: any, r: any) => {\n if (isComparable(l)) return !l.equals(r)\n if (isComparable(r)) return !r.equals(l)\n return l !== r\n },\n '>': (l: any, r: any) => {\n if (isComparable(l)) return l.gt(r)\n if (isComparable(r)) return r.lt(l)\n return l > r\n },\n '<': (l: any, r: any) => {\n if (isComparable(l)) return l.lt(r)\n if (isComparable(r)) return r.gt(l)\n return l < r\n },\n '>=': (l: any, r: any) => {\n if (isComparable(l)) return l.geq(r)\n if (isComparable(r)) return r.leq(l)\n return l >= r\n },\n '<=': (l: any, r: any) => {\n if (isComparable(l)) return l.leq(r)\n if (isComparable(r)) return r.geq(l)\n return l <= r\n },\n 'contains': (l: any, r: any) => {\n return l && isFunction(l.indexOf) ? l.indexOf(r) > -1 : false\n },\n 'and': (l: any, r: any, ctx: Context) => isTruthy(l, ctx) && isTruthy(r, ctx),\n 'or': (l: any, r: any, ctx: Context) => isTruthy(l, ctx) || isTruthy(r, ctx)\n}\n","// **DO NOT CHANGE THIS FILE**\n//\n// This file is generated by bin/character-gen.js\n// bitmask character types to boost performance\nexport const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 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, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0]\nexport const IDENTIFIER = 1\nexport const OPERATOR = 2\nexport const BLANK = 4\nexport const QUOTE = 8\nexport const INLINE_BLANK = 16\nexport const NUMBER = 32\nexport const SIGN = 64\nTYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK\n","import { Operators } from '../render/operator'\nimport { IDENTIFIER, TYPES } from '../util/character'\n\nexport interface Trie {\n [key: string]: any;\n}\n\nexport function createTrie (operators: Operators): Trie {\n const trie: Trie = {}\n for (const [name, handler] of Object.entries(operators)) {\n let node = trie\n\n for (let i = 0; i < name.length; i++) {\n const c = name[i]\n node[c] = node[c] || {}\n\n if (i === name.length - 1 && (TYPES[name.charCodeAt(i)] & IDENTIFIER)) {\n node[c].needBoundary = true\n }\n\n node = node[c]\n }\n\n node.handler = handler\n node.end = true\n }\n return trie\n}\n","import * as _ from './util/underscore'\nimport { Template } from './template/template'\nimport { Cache } from './cache/cache'\nimport { LRU } from './cache/lru'\nimport { FS } from './fs/fs'\nimport * as fs from './fs/node'\nimport { defaultOperators, Operators } from './render/operator'\nimport { createTrie, Trie } from './util/operator-trie'\nimport { Thenable } from './util/async'\n\nexport interface LiquidOptions {\n /** A directory or an array of directories from where to resolve layout and include templates, and the filename passed to `.renderFile()`. If it's an array, the files are looked up in the order they occur in the array. Defaults to `[\".\"]` */\n root?: string | string[];\n /** A directory or an array of directories from where to resolve included templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */\n partials?: string | string[];\n /** A directory or an array of directories from where to resolve layout templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */\n layouts?: string | string[];\n /** Allow refer to layouts/partials by relative pathname. To avoid arbitrary filesystem read, paths been referenced also need to be within corresponding root, partials, layouts. Defaults to `true`. */\n relativeReference?: boolean;\n /** Use jekyll style include, pass parameters to `include` variable of current scope. Defaults to `false`. */\n jekyllInclude?: boolean;\n /** Add a extname (if filepath doesn't include one) before template file lookup. Eg: setting to `\".html\"` will allow including file by basename. Defaults to `\"\"`. */\n extname?: string;\n /** Whether or not to cache resolved templates. Defaults to `false`. */\n cache?: boolean | number | Cache<Thenable<Template[]>>;\n /** Use Javascript Truthiness. Defaults to `false`. */\n jsTruthy?: boolean;\n /** If set, treat the `filepath` parameter in `{%include filepath %}` and `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */\n dynamicPartials?: boolean;\n /** Whether or not to assert filter existence. If set to `false`, undefined filters will be skipped. Otherwise, undefined filters will cause an exception. Defaults to `false`. */\n strictFilters?: boolean;\n /** Whether or not to assert variable existence. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */\n strictVariables?: boolean;\n /** Modifies the behavior of `strictVariables`. If set, a single undefined variable will *not* cause an exception in the context of the `if`/`elsif`/`unless` tag and the `default` filter. Instead, it will evaluate to `false` and `null`, respectively. Irrelevant if `strictVariables` is not set. Defaults to `false`. **/\n lenientIf?: boolean;\n /** JavaScript timezoneOffset for `date` filter, default to local time. That means if you're in Australia (UTC+10), it'll default to -600 */\n timezoneOffset?: number;\n /** Strip blank characters (including ` `, `\\t`, and `\\r`) from the right of tags (`{% %}`) until `\\n` (inclusive). Defaults to `false`. */\n trimTagRight?: boolean;\n /** Similar to `trimTagRight`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trimTagLeft?: boolean;\n /** Strip blank characters (including ` `, `\\t`, and `\\r`) from the right of values (`{{ }}`) until `\\n` (inclusive). Defaults to `false`. */\n trimOutputRight?: boolean;\n /** Similar to `trimOutputRight`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trimOutputLeft?: boolean;\n /** The left delimiter for liquid tags. **/\n tagDelimiterLeft?: string;\n /** The right delimiter for liquid tags. **/\n tagDelimiterRight?: string;\n /** The left delimiter for liquid outputs. **/\n outputDelimiterLeft?: string;\n /** The right delimiter for liquid outputs. **/\n outputDelimiterRight?: string;\n /** Whether input strings to date filter preserve the given timezone **/\n preserveTimezones?: boolean;\n /** Whether `trim*Left`/`trim*Right` is greedy. When set to `true`, all consecutive blank characters including `\\n` will be trimed regardless of line breaks. Defaults to `true`. */\n greedy?: boolean;\n /** `fs` is used to override the default file-system module with a custom implementation. */\n fs?: FS;\n /** the global scope passed down to all partial and layout templates, i.e. templates included by `include`, `layout` and `render` tags. */\n globals?: object;\n /** Whether or not to keep value type when writing the Output, not working for streamed rendering. Defaults to `false`. */\n keepOutputType?: boolean;\n /** An object of operators for conditional statements. Defaults to the regular Liquid operators. */\n operators?: Operators;\n /** Respect parameter order when using filters like \"for ... reversed limit\", Defaults to `false`. */\n orderedFilterParameters?: boolean;\n}\n\nexport interface RenderOptions {\n /**\n * This call is sync or async? It's used by Liquid internal methods, you'll not need this.\n */\n sync?: boolean;\n /**\n * Same as `globals` on LiquidOptions, but only for current render() call\n */\n globals?: object;\n /**\n * Same as `strictVariables` on LiquidOptions, but only for current render() call\n */\n strictVariables?: boolean;\n}\n\ninterface NormalizedOptions extends LiquidOptions {\n root?: string[];\n partials?: string[];\n layouts?: string[];\n cache?: Cache<Thenable<Template[]>>;\n operatorsTrie?: Trie;\n}\n\nexport interface NormalizedFullOptions extends NormalizedOptions {\n root: string[];\n partials: string[];\n layouts: string[];\n relativeReference: boolean;\n jekyllInclude: boolean;\n extname: string;\n cache: undefined | Cache<Thenable<Template[]>>;\n jsTruthy: boolean;\n dynamicPartials: boolean;\n fs: FS;\n strictFilters: boolean;\n strictVariables: boolean;\n lenientIf: boolean;\n trimTagRight: boolean;\n trimTagLeft: boolean;\n trimOutputRight: boolean;\n trimOutputLeft: boolean;\n tagDelimiterLeft: string;\n tagDelimiterRight: string;\n outputDelimiterLeft: string;\n outputDelimiterRight: string;\n preserveTimezones: boolean;\n greedy: boolean;\n globals: object;\n keepOutputType: boolean;\n operators: Operators;\n operatorsTrie: Trie;\n}\n\nexport const defaultOptions: NormalizedFullOptions = {\n root: ['.'],\n layouts: ['.'],\n partials: ['.'],\n relativeReference: true,\n jekyllInclude: false,\n cache: undefined,\n extname: '',\n fs: fs,\n dynamicPartials: true,\n jsTruthy: false,\n trimTagRight: false,\n trimTagLeft: false,\n trimOutputRight: false,\n trimOutputLeft: false,\n greedy: true,\n tagDelimiterLeft: '{%',\n tagDelimiterRight: '%}',\n outputDelimiterLeft: '{{',\n outputDelimiterRight: '}}',\n preserveTimezones: false,\n strictFilters: false,\n strictVariables: false,\n lenientIf: false,\n globals: {},\n keepOutputType: false,\n operators: defaultOperators,\n operatorsTrie: createTrie(defaultOperators)\n}\n\nexport function normalize (options: LiquidOptions): NormalizedFullOptions {\n if (options.hasOwnProperty('operators')) {\n (options as NormalizedOptions).operatorsTrie = createTrie(options.operators!)\n }\n if (options.hasOwnProperty('root')) {\n if (!options.hasOwnProperty('partials')) options.partials = options.root\n if (!options.hasOwnProperty('layouts')) options.layouts = options.root\n }\n if (options.hasOwnProperty('cache')) {\n let cache: Cache<Thenable<Template[]>> | undefined\n if (typeof options.cache === 'number') cache = options.cache > 0 ? new LRU(options.cache) : undefined\n else if (typeof options.cache === 'object') cache = options.cache\n else cache = options.cache ? new LRU(1024) : undefined\n options.cache = cache\n }\n options = { ...defaultOptions, ...(options.jekyllInclude ? { dynamicPartials: false } : {}), ...options }\n if (!options.fs!.dirname && options.relativeReference) {\n console.warn('[LiquidJS] `fs.dirname` is required for relativeReference, set relativeReference to `false` to suppress this warning, or provide implementation for `fs.dirname`')\n options.relativeReference = false\n }\n options.root = normalizeDirectoryList(options.root)\n options.partials = normalizeDirectoryList(options.partials)\n options.layouts = normalizeDirectoryList(options.layouts)\n return options as NormalizedFullOptions\n}\n\nexport function normalizeDirectoryList (value: any): string[] {\n let list: string[] = []\n if (_.isArray(value)) list = value\n if (_.isString(value)) list = [value]\n return list\n}\n","import * as _ from './underscore'\nimport { Token } from '../tokens/token'\nimport { Template } from '../template/template'\n\nexport abstract class LiquidError extends Error {\n private token: Token\n public context: string\n private originalError: Error\n public constructor (err: Error, token: Token) {\n super(err.message)\n this.originalError = err\n this.token = token\n this.context = ''\n }\n protected update () {\n const err = this.originalError\n this.context = mkContext(this.token)\n this.message = mkMessage(err.message, this.token)\n this.stack = this.message + '\\n' + this.context +\n '\\n' + this.stack + '\\nFrom ' + err.stack\n }\n}\n\nexport class TokenizationError extends LiquidError {\n public constructor (message: string, token: Token) {\n super(new Error(message), token)\n this.name = 'TokenizationError'\n super.update()\n }\n}\n\nexport class ParseError extends LiquidError {\n public constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'ParseError'\n this.message = err.message\n super.update()\n }\n}\n\nexport class RenderError extends LiquidError {\n public constructor (err: Error, tpl: Template) {\n super(err, tpl.token)\n this.name = 'RenderError'\n this.message = err.message\n super.update()\n }\n public static is (obj: any): obj is RenderError {\n return obj.name === 'RenderError'\n }\n}\n\nexport class UndefinedVariableError extends LiquidError {\n public constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'UndefinedVariableError'\n this.message = err.message\n super.update()\n }\n}\n\n// only used internally; raised where we don't have token information,\n// so it can't be an UndefinedVariableError.\nexport class InternalUndefinedVariableError extends Error {\n variableName: string\n\n public constructor (variableName: string) {\n super(`undefined variable: ${variableName}`)\n this.name = 'InternalUndefinedVariableError'\n this.variableName = variableName\n }\n}\n\nexport class AssertionError extends Error {\n public constructor (message: string) {\n super(message)\n this.name = 'AssertionError'\n this.message = message + ''\n }\n}\n\nfunction mkContext (token: Token) {\n const [line] = token.getPosition()\n const lines = token.input.split('\\n')\n const begin = Math.max(line - 2, 1)\n const end = Math.min(line + 3, lines.length)\n\n const context = _\n .range(begin, end + 1)\n .map(lineNumber => {\n const indicator = (lineNumber === line) ? '>> ' : ' '\n const num = _.padStart(String(lineNumber), String(end).length)\n const text = lines[lineNumber - 1]\n return `${indicator}${num}| ${text}`\n })\n .join('\\n')\n\n return context\n}\n\nfunction mkMessage (msg: string, token: Token) {\n if (token.file) msg += `, file:${token.file}`\n const [line, col] = token.getPosition()\n msg += `, line:${line}, col:${col}`\n return msg\n}\n","import { FS } from './fs'\nimport { escapeRegex } from '../util/underscore'\nimport { assert } from '../util/assert'\n\nexport interface LoaderOptions {\n fs: FS;\n extname: string;\n root: string[];\n partials: string[];\n layouts: string[];\n relativeReference: boolean;\n}\nexport enum LookupType {\n Partials = 'partials',\n Layouts = 'layouts',\n Root = 'root'\n}\nexport class Loader {\n public shouldLoadRelative: (referencedFile: string) => boolean\n private options: LoaderOptions\n private contains: (root: string, file: string) => boolean\n\n constructor (options: LoaderOptions) {\n this.options = options\n if (options.relativeReference) {\n const sep = options.fs.sep\n assert(sep, '`fs.sep` is required for relative reference')\n const rRelativePath = new RegExp(['.' + sep, '..' + sep, './', '../'].map(prefix => escapeRegex(prefix)).join('|'))\n this.shouldLoadRelative = (referencedFile: string) => rRelativePath.test(referencedFile)\n } else {\n this.shouldLoadRelative = (referencedFile: string) => false\n }\n this.contains = this.options.fs.contains || (() => true)\n }\n\n public * lookup (file: string, type: LookupType, sync?: boolean, currentFile?: string): Generator<unknown, string, string> {\n const { fs } = this.options\n const dirs = this.options[type]\n for (const filepath of this.candidates(file, dirs, currentFile, type !== LookupType.Root)) {\n if (sync ? fs.existsSync(filepath) : yield fs.exists(filepath)) return filepath\n }\n throw this.lookupError(file, dirs)\n }\n\n public * candidates (file: string, dirs: string[], currentFile?: string, enforceRoot?: boolean) {\n const { fs, extname } = this.options\n if (this.shouldLoadRelative(file) && currentFile) {\n const referenced = fs.resolve(this.dirname(currentFile), file, extname)\n for (const dir of dirs) {\n if (!enforceRoot || this.contains(dir, referenced)) {\n // the relatively referenced file is within one of root dirs\n yield referenced\n break\n }\n }\n }\n for (const dir of dirs) {\n const referenced = fs.resolve(dir, file, extname)\n if (!enforceRoot || this.contains(dir, referenced)) {\n yield referenced\n }\n }\n if (fs.fallback !== undefined) {\n const filepath = fs.fallback(file)\n if (filepath !== undefined) yield filepath\n }\n }\n\n private dirname (path: string) {\n const fs = this.options.fs\n assert(fs.dirname, '`fs.dirname` is required for relative reference')\n return fs.dirname!(path)\n }\n\n private lookupError (file: string, roots: string[]) {\n const err = new Error('ENOENT') as any\n err.message = `ENOENT: Failed to lookup \"${file}\" in \"${roots}\"`\n err.code = 'ENOENT'\n return err\n }\n}\n","import { Drop } from '../drop/drop'\nimport { __assign } from 'tslib'\nimport { NormalizedFullOptions, defaultOptions, RenderOptions } from '../liquid-options'\nimport { Scope } from './scope'\nimport { isArray, isNil, isString, isFunction, toLiquid } from '../util/underscore'\nimport { InternalUndefinedVariableError } from '../util/error'\n\nexport class Context {\n /**\n * insert a Context-level empty scope,\n * for tags like {% capture %} {% assign %} to operate\n */\n private scopes: Scope[] = [{}]\n private registers = {}\n /**\n * user passed in scope\n * {% increment %}, {% decrement %} changes this scope,\n * whereas {% capture %}, {% assign %} only hide this scope\n */\n public environments: Scope\n /**\n * global scope used as fallback for missing variables\n */\n public globals: Scope\n public sync: boolean\n /**\n * The normalized liquid options object\n */\n public opts: NormalizedFullOptions\n /**\n * Throw when accessing undefined variable?\n */\n public strictVariables: boolean;\n public constructor (env: object = {}, opts: NormalizedFullOptions = defaultOptions, renderOptions: RenderOptions = {}) {\n this.sync = !!renderOptions.sync\n this.opts = opts\n this.globals = renderOptions.globals ?? opts.globals\n this.environments = env\n this.strictVariables = renderOptions.strictVariables ?? this.opts.strictVariables\n }\n public getRegister (key: string) {\n return (this.registers[key] = this.registers[key] || {})\n }\n public setRegister (key: string, value: any) {\n return (this.registers[key] = value)\n }\n public saveRegister (...keys: string[]): [string, any][] {\n return keys.map(key => [key, this.getRegister(key)])\n }\n public restoreRegister (keyValues: [string, any][]) {\n return keyValues.forEach(([key, value]) => this.setRegister(key, value))\n }\n public getAll () {\n return [this.globals, this.environments, ...this.scopes]\n .reduce((ctx, val) => __assign(ctx, val), {})\n }\n public get (paths: string[]) {\n const scope = this.findScope(paths[0])\n return this.getFromScope(scope, paths)\n }\n public getFromScope (scope: object, paths: string[] | string) {\n if (typeof paths === 'string') paths = paths.split('.')\n return paths.reduce((scope, path) => {\n scope = readProperty(scope, path)\n if (isNil(scope) && this.strictVariables) {\n throw new InternalUndefinedVariableError(path)\n }\n return scope\n }, scope)\n }\n public push (ctx: object) {\n return this.scopes.push(ctx)\n }\n public pop () {\n return this.scopes.pop()\n }\n public bottom () {\n return this.scopes[0]\n }\n private findScope (key: string) {\n for (let i = this.scopes.length - 1; i >= 0; i--) {\n const candidate = this.scopes[i]\n if (key in candidate) return candidate\n }\n if (key in this.environments) return this.environments\n return this.globals\n }\n}\n\nexport function readProperty (obj: Scope, key: string) {\n if (isNil(obj)) return obj\n obj = toLiquid(obj)\n if (isFunction(obj[key])) return obj[key]()\n if (obj instanceof Drop) {\n if (obj.hasOwnProperty(key)) return obj[key]\n return obj.liquidMethodMissing(key)\n }\n if (key === 'size') return readSize(obj)\n if (key === 'first') return readFirst(obj)\n if (key === 'last') return readLast(obj)\n return obj[key]\n}\n\nfunction readFirst (obj: Scope) {\n if (isArray(obj)) return obj[0]\n return obj['first']\n}\n\nfunction readLast (obj: Scope) {\n if (isArray(obj)) return obj[obj.length - 1]\n return obj['last']\n}\n\nfunction readSize (obj: Scope) {\n if (obj.hasOwnProperty('size') || obj['size'] !== undefined) return obj['size']\n if (isArray(obj) || isString(obj)) return obj.length\n if (typeof obj === 'object') return Object.keys(obj).length\n}\n","import { AssertionError } from './error'\n\nexport function assert <T> (predicate: T | null | undefined, message?: string | (() => string)) {\n if (!predicate) {\n const msg = typeof message === 'function'\n ? message()\n : (message || `expect ${predicate} to be true`)\n throw new AssertionError(msg)\n }\n}\n","import { stringify } from '../util/underscore'\nimport { Emitter } from './emitter'\n\nexport class SimpleEmitter implements Emitter {\n public buffer = '';\n\n public write (html: any) {\n this.buffer += stringify(html)\n }\n}\n","import { Emitter } from './emitter'\n\nexport class StreamedEmitter implements Emitter {\n public buffer = '';\n public stream: NodeJS.ReadableStream = null as any\n constructor () {\n throw new Error('streaming not supported in browser')\n }\n public write: (html: any) => void\n public error: (err: Error) => void\n public end: () => void\n}\n","import { isFunction } from './underscore'\n\ntype resolver = (x?: any) => any\n\nexport interface Thenable<T> {\n then (resolve: resolver, reject?: resolver): Thenable<T>;\n catch (reject: resolver): Thenable<T>;\n}\n\nfunction createResolvedThenable<T> (value: T): Thenable<T> {\n const ret = {\n then: (resolve: resolver) => resolve(value),\n catch: () => ret\n }\n return ret\n}\n\nfunction createRejectedThenable<T> (err: Error): Thenable<T> {\n const ret = {\n then: (resolve: resolver, reject?: resolver) => {\n if (reject) return reject(err)\n return ret\n },\n catch: (reject: resolver) => reject(err)\n }\n return ret\n}\n\nfunction isThenable<T> (val: any): val is Thenable<T> {\n return val && isFunction(val.then)\n}\n\nfunction isAsyncIterator (val: any): val is IterableIterator<any> {\n return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return)\n}\n\n// convert an async iterator to a thenable (Promise compatible)\nexport function toThenable<T> (val: IteratorResult<unknown, T> | Thenable<T> | any): Thenable<T> {\n if (isThenable(val)) return val\n if (isAsyncIterator(val)) return reduce()\n return createResolvedThenable(val)\n\n function reduce<T> (prev?: T): Thenable<T> {\n let state\n try {\n state = val.next(prev)\n } catch (err) {\n return createRejectedThenable(err as Error)\n }\n\n if (state.done) return createResolvedThenable(state.value)\n return toThenable(state.value!).then(reduce, err => {\n let state\n try {\n state = val.throw!(err)\n } catch (e) {\n return createRejectedThenable(e as Error)\n }\n if (state.done) return createResolvedThenable(state.value)\n return reduce(state.value)\n })\n }\n}\n\nexport function toPromise<T> (val: Generator<unknown, T, unknown> | Thenable<T> | T): Promise<T> {\n return Promise.resolve(toThenable(val))\n}\n\n// get the value of async iterator in synchronous manner\nexport function toValue<T> (val: Generator<unknown, T, unknown> | Thenable<T> | T): T {\n let ret: T\n toThenable(val)\n .then((x: any) => {\n ret = x\n return createResolvedThenable(ret)\n })\n .catch((err: Error) => {\n throw err\n })\n return ret!\n}\n","import { stringify, toValue } from '../util/underscore'\nimport { Emitter } from '../types'\n\nexport class KeepingTypeEmitter implements Emitter {\n public buffer: any = '';\n\n public write (html: any) {\n html = toValue(html)\n // This will only preserve the type if the value is isolated.\n // I.E:\n // {{ my-port }} -> 42\n // {{ my-host }}:{{ my-port }} -> 'host:42'\n if (typeof html !== 'string' && this.buffer === '') {\n this.buffer = html\n } else {\n this.buffer = stringify(this.buffer) + stringify(html)\n }\n }\n}\n","import { RenderError } from '../util/error'\nimport { Context } from '../context/context'\nimport { Template } from '../template/template'\nimport { Emitter } from '../emitters/emitter'\nimport { SimpleEmitter } from '../emitters/simple-emitter'\nimport { StreamedEmitter } from '../emitters/streamed-emitter'\nimport { toThenable } from '../util/async'\nimport { KeepingTypeEmitter } from '../emitters/keeping-type-emitter'\n\nexport class Render {\n public renderTemplatesToNodeStream (templates: Template[], ctx: Context): NodeJS.ReadableStream {\n const emitter = new StreamedEmitter()\n Promise.resolve().then(() => toThenable(this.renderTemplates(templates, ctx, emitter)))\n .then(() => emitter.end(), err => emitter.error(err))\n return emitter.stream\n }\n public * renderTemplates (templates: Template[], ctx: Context, emitter?: Emitter): IterableIterator<any> {\n if (!emitter) {\n emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter()\n }\n for (const tpl of templates) {\n try {\n // if tpl.render supports emitter, it'll return empty `html`\n const html = yield tpl.render(ctx, emitter)\n // if not, it'll return an `html`, write to the emitter for it\n html && emitter.write(html)\n if (emitter['break'] || emitter['continue']) break\n } catch (e) {\n const err = RenderError.is(e) ? e : new RenderError(e as Error, tpl)\n throw err\n }\n }\n return emitter.buffer\n }\n}\n","export enum TokenKind {\n Number = 1,\n Literal = 2,\n Tag = 4,\n Output = 8,\n HTML = 16,\n Filter = 32,\n Hash = 64,\n PropertyAccess = 128,\n Word = 256,\n Range = 512,\n Quoted = 1024,\n Operator = 2048,\n Delimited = Tag | Output\n}\n","import { OperatorToken } from '../tokens/operator-token'\nimport { DelimitedToken } from '../tokens/delimited-token'\nimport { IdentifierToken } from '../tokens/identifier-token'\nimport { TagToken } from '../tokens/tag-token'\nimport { HTMLToken } from '../tokens/html-token'\nimport { OutputToken } from '../tokens/output-token'\nimport { PropertyAccessToken } from '../tokens/property-access-token'\nimport { LiteralToken } from '../tokens/literal-token'\nimport { QuotedToken } from '../tokens/quoted-token'\nimport { NumberToken } from '../tokens/number-token'\nimport { RangeToken } from '../tokens/range-token'\nimport { TokenKind } from '../parser/token-kind'\n\nexport function isDelimitedToken (val: any): val is DelimitedToken {\n return !!(getKind(val) & TokenKind.Delimited)\n}\n\nexport function isOperatorToken (val: any): val is OperatorToken {\n return getKind(val) === TokenKind.Operator\n}\n\nexport function isHTMLToken (val: any): val is HTMLToken {\n return getKind(val) === TokenKind.HTML\n}\n\nexport function isOutputToken (val: any): val is OutputToken {\n return getKind(val) === TokenKind.Output\n}\n\nexport function isTagToken (val: any): val is TagToken {\n return getKind(val) === TokenKind.Tag\n}\n\nexport function isQuotedToken (val: any): val is QuotedToken {\n return getKind(val) === TokenKind.Quoted\n}\n\nexport function isLiteralToken (val: any): val is LiteralToken {\n return getKind(val) === TokenKind.Literal\n}\n\nexport function isNumberToken (val: any): val is NumberToken {\n return getKind(val) === TokenKind.Number\n}\n\nexport function isPropertyAccessToken (val: any): val is PropertyAccessToken {\n return getKind(val) === TokenKind.PropertyAccess\n}\n\nexport function isWordToken (val: any): val is IdentifierToken {\n return getKind(val) === TokenKind.Word\n}\n\nexport function isRangeToken (val: any): val is RangeToken {\n return getKind(val) === TokenKind.Range\n}\n\nfunction getKind (val: any) {\n return val ? val.kind : -1\n}\n","import { Token } from '../tokens/token'\nimport { Template } from '../template/template'\nimport { isTagToken } from '../util/type-guards'\nimport { TopLevelToken } from '../tokens/toplevel-token'\n\ntype ParseToken<T extends Token> = ((token: T, remainTokens: T[]) => Template)\n\nexport class ParseStream<T extends Token = TopLevelToken> {\n private tokens: T[]\n private handlers: {[key: string]: (arg: any) => void} = {}\n private stopRequested = false\n private parseToken: ParseToken<T>\n\n public constructor (tokens: T[], parseToken: ParseToken<T>) {\n this.tokens = tokens\n this.parseToken = parseToken\n }\n public on<T2 extends Template | T | undefined> (name: string, cb: (this: ParseStream, arg: T2) => void): ParseStream<T> {\n this.handlers[name] = cb\n return this\n }\n private trigger <T extends Token | Template> (event: string, arg?: T) {\n const h = this.handlers[event]\n return h ? (h.call(this, arg), true) : false\n }\n public start () {\n this.trigger('start')\n let token: T | undefined\n while (!this.stopRequested && (token = this.tokens.shift())) {\n if (this.trigger('token', token)) continue\n if (isTagToken(token) && this.trigger(`tag:${token.name}`, token)) {\n continue\n }\n const template = this.parseToken(token, this.tokens)\n this.trigger('template', template)\n }\n if (!this.stopRequested) this.trigger('end')\n return this\n }\n public stop () {\n this.stopRequested = true\n return this\n }\n}\n","export abstract class TemplateImpl<T> {\n public token: T;\n public constructor (token: T) {\n this.token = token\n }\n}\n","import { Drop } from './drop'\nimport { Comparable } from './comparable'\nimport { isNil, toValue } from '../util/underscore'\n\nexport class NullDrop extends Drop implements Comparable {\n public equals (value: any) {\n return isNil(toValue(value))\n }\n public gt () {\n return false\n }\n public geq () {\n return false\n }\n public lt () {\n return false\n }\n public leq () {\n return false\n }\n public valueOf () {\n return null\n }\n}\n","import { Drop } from './drop'\nimport { Comparable } from './comparable'\nimport { isObject, isString, isArray, toValue } from '../util/underscore'\n\nexport class EmptyDrop extends Drop implements Comparable {\n public equals (value: any) {\n if (value instanceof EmptyDrop) return false\n value = toValue(value)\n if (isString(value) || isArray(value)) return value.length === 0\n if (isObject(value)) return Object.keys(value).length === 0\n return false\n }\n public gt () {\n return false\n }\n public geq () {\n return false\n }\n public lt () {\n return false\n }\n public leq () {\n return false\n }\n public valueOf () {\n return ''\n }\n}\n","import { isNil, isString, toValue } from '../util/underscore'\nimport { EmptyDrop } from '../drop/empty-drop'\n\nexport class BlankDrop extends EmptyDrop {\n public equals (value: any) {\n if (value === false) return true\n if (isNil(toValue(value))) return true\n if (isString(value)) return /^\\s*$/.test(value)\n return super.equals(value)\n }\n}\n","import { NullDrop } from '../drop/null-drop'\nimport { EmptyDrop } from '../drop/empty-drop'\nimport { BlankDrop } from '../drop/blank-drop'\n\nconst nil = new NullDrop()\nexport const literalValues = {\n 'true': true,\n 'false': false,\n 'nil': nil,\n 'null': nil,\n 'empty': new EmptyDrop(),\n 'blank': new BlankDrop()\n}\n","const rHex = /[\\da-fA-F]/\nconst rOct = /[0-7]/\nconst escapeChar = {\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t',\n v: '\\x0B'\n}\n\nfunction hexVal (c: string) {\n const code = c.charCodeAt(0)\n if (code >= 97) return code - 87\n if (code >= 65) return code - 55\n return code - 48\n}\n\nexport function parseStringLiteral (str: string): string {\n let ret = ''\n for (let i = 1; i < str.length - 1; i++) {\n if (str[i] !== '\\\\') {\n ret += str[i]\n continue\n }\n if (escapeChar[str[i + 1]] !== undefined) {\n ret += escapeChar[str[++i]]\n } else if (str[i + 1] === 'u') {\n let val = 0\n let j = i + 2\n while (j <= i + 5 && rHex.test(str[j])) {\n val = val * 16 + hexVal(str[j++])\n }\n i = j - 1\n ret += String.fromCharCode(val)\n } else if (!rOct.test(str[i + 1])) {\n ret += str[++i]\n } else {\n let j = i + 1\n let val = 0\n while (j <= i + 3 && rOct.test(str[j])) {\n val = val * 8 + hexVal(str[j++])\n }\n i = j - 1\n ret += String.fromCharCode(val)\n }\n }\n return ret\n}\n","import { QuotedToken } from '../tokens/quoted-token'\nimport { PropertyAccessToken } from '../tokens/property-access-token'\nimport { NumberToken } from '../tokens/number-token'\nimport { assert } from '../util/assert'\nimport { literalValues } from '../util/literal'\nimport { LiteralToken } from '../tokens/literal-token'\nimport * as TypeGuards from '../util/type-guards'\nimport { Token } from '../tokens/token'\nimport { OperatorToken } from '../tokens/operator-token'\nimport { RangeToken } from '../tokens/range-token'\nimport { parseStringLiteral } from '../parser/parse-string-literal'\nimport { Context } from '../context/context'\nimport { range } from '../util/underscore'\nimport { Operators } from '../render/operator'\nimport { UndefinedVariableError } from '../util/error'\n\nexport class Expression {\n private postfix: Token[]\n\n public constructor (tokens: IterableIterator<Token>) {\n this.postfix = [...toPostfix(tokens)]\n }\n public * evaluate (ctx: Context, lenient: boolean): Generator<unknown, unknown, unknown> {\n assert(ctx, 'unable to evaluate: context not defined')\n const operands: any[] = []\n for (const token of this.postfix) {\n if (TypeGuards.isOperatorToken(token)) {\n const r = yield operands.pop()\n const l = yield operands.pop()\n const result = evalOperatorToken(ctx.opts.operators, token, l, r, ctx)\n operands.push(result)\n } else {\n operands.push(yield evalToken(token, ctx, lenient && this.postfix.length === 1))\n }\n }\n return operands[0]\n }\n}\n\nexport function evalToken (token: Token | undefined, ctx: Context, lenient = false): any {\n if (TypeGuards.isPropertyAccessToken(token)) return evalPropertyAccessToken(token, ctx, lenient)\n if (TypeGuards.isRangeToken(token)) return evalRangeToken(token, ctx)\n if (TypeGuards.isLiteralToken(token)) return evalLiteralToken(token)\n if (TypeGuards.isNumberToken(token)) return evalNumberToken(token)\n if (TypeGuards.isWordToken(token)) return token.getText()\n if (TypeGuards.isQuotedToken(token)) return evalQuotedToken(token)\n}\n\nfunction evalPropertyAccessToken (token: PropertyAccessToken, ctx: Context, lenient: boolean) {\n const props: string[] = token.props.map(prop => evalToken(prop, ctx, false))\n try {\n return ctx.get([token.propertyName, ...props])\n } catch (e) {\n if (lenient && (e as Error).name === 'InternalUndefinedVariableError') return null\n throw (new UndefinedVariableError(e as Error, token))\n }\n}\n\nfunction evalNumberToken (token: NumberToken) {\n const str = token.whole.content + '.' + (token.decimal ? token.decimal.content : '')\n return Number(str)\n}\n\nexport function evalQuotedToken (token: QuotedToken) {\n return parseStringLiteral(token.getText())\n}\n\nfunction evalOperatorToken (operators: Operators, token: OperatorToken, lhs: any, rhs: any, ctx: Context) {\n const impl = operators[token.operator]\n return impl(lhs, rhs, ctx)\n}\n\nfunction evalLiteralToken (token: LiteralToken) {\n return literalValues[token.literal]\n}\n\nfunction evalRangeToken (token: RangeToken, ctx: Context) {\n const low: number = evalToken(token.lhs, ctx)\n const high: number = evalToken(token.rhs, ctx)\n return range(+low, +high + 1)\n}\n\nfunction * toPostfix (tokens: IterableIterator<Token>): IterableIterator<Token> {\n const ops: OperatorToken[] = []\n for (const token of tokens) {\n if (TypeGuards.isOperatorToken(token)) {\n while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) {\n yield ops.pop()!\n }\n ops.push(token)\n } else yield token\n }\n while (ops.length) {\n yield ops.pop()!\n }\n}\n","import { TokenKind } from '../parser/token-kind'\n\nexport abstract class Token {\n public constructor (\n public kind: TokenKind,\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {}\n public getText () {\n return this.input.slice(this.begin, this.end)\n }\n public getPosition () {\n let [row, col] = [1, 1]\n for (let i = 0; i < this.begin; i++) {\n if (this.input[i] === '\\n') {\n row++\n col = 1\n } else col++\n }\n return [row, col]\n }\n public size () {\n return this.end - this.begin\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser/token-kind'\nimport { last } from '../util/underscore'\n\nexport abstract class DelimitedToken extends Token {\n public trimLeft = false\n public trimRight = false\n public content: string\n public constructor (\n kind: TokenKind,\n content: string,\n input: string,\n begin: number,\n end: number,\n trimLeft: boolean,\n trimRight: boolean,\n file?: string\n ) {\n super(kind, input, begin, end, file)\n this.content = this.getText()\n const tl = content[0] === '-'\n const tr = last(content) === '-'\n this.content = content\n .slice(\n tl ? 1 : 0,\n tr ? -1 : content.length\n )\n .trim()\n this.trimLeft = tl || trimLeft\n this.trimRight = tr || trimRight\n }\n}\n","import { Token } from '../tokens/token'\nimport { isTagToken, isHTMLToken, isDelimitedToken } from '../util/type-guards'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { TYPES, INLINE_BLANK, BLANK } from '../util/character'\n\nexport function whiteSpaceCtrl (tokens: Token[], options: NormalizedFullOptions) {\n let inRaw = false\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n if (!isDelimitedToken(token)) continue\n if (!inRaw && token.trimLeft) {\n trimLeft(tokens[i - 1], options.greedy)\n }\n\n if (isTagToken(token)) {\n if (token.name === 'raw') inRaw = true\n else if (token.name === 'endraw') inRaw = false\n }\n\n if (!inRaw && token.trimRight) {\n trimRight(tokens[i + 1], options.greedy)\n }\n }\n}\n\nfunction trimLeft (token: Token, greedy: boolean) {\n if (!token || !isHTMLToken(token)) return\n\n const mask = greedy ? BLANK : INLINE_BLANK\n while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask) token.trimRight++\n}\n\nfunction trimRight (token: Token, greedy: boolean) {\n if (!token || !isHTMLToken(token)) return\n\n const mask = greedy ? BLANK : INLINE_BLANK\n while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask) token.trimLeft++\n if (token.input.charAt(token.begin + token.trimLeft) === '\\n') token.trimLeft++\n}\n","import { Token } from './token'\nimport { IdentifierToken } from './identifier-token'\nimport { TokenKind } from '../parser/token-kind'\n\nexport class NumberToken extends Token {\n constructor (\n public whole: IdentifierToken,\n public decimal?: IdentifierToken\n ) {\n super(TokenKind.Number, whole.input, whole.begin, decimal ? decimal.end : whole.end, whole.file)\n }\n}\n","import { Token } from './token'\nimport { NUMBER, TYPES, SIGN } from '../util/character'\nimport { TokenKind } from '../parser/token-kind'\n\nexport class IdentifierToken extends Token {\n public content: string\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Word, input, begin, end, file)\n this.content = this.getText()\n }\n isNumber (allowSign = false) {\n const begin = allowSign && TYPES[this.input.charCodeAt(this.begin)] & SIGN\n ? this.begin + 1\n : this.begin\n for (let i = begin; i < this.end; i++) {\n if (!(TYPES[this.input.charCodeAt(i)] & NUMBER)) return false\n }\n return true\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser/token-kind'\n\nexport class LiteralToken extends Token {\n public literal: string\n public constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Literal, input, begin, end, file)\n this.literal = this.getText()\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser/token-kind'\n\nexport const precedence = {\n '==': 1,\n '!=': 1,\n '>': 1,\n '<': 1,\n '>=': 1,\n '<=': 1,\n 'contains': 1,\n 'and': 0,\n 'or': 0\n}\n\nexport class OperatorToken extends Token {\n public operator: string\n public constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Operator, input, begin, end, file)\n this.operator = this.getText()\n }\n getPrecedence () {\n const key = this.getText()\n return key in precedence ? precedence[key] : 1\n }\n}\n","import { Token } from './token'\nimport { IdentifierToken } from './identifier-token'\nimport { QuotedToken } from './quoted-token'\nimport { TokenKind } from '../parser/token-kind'\nimport { parseStringLiteral } from '../parser/parse-string-literal'\n\nexport class PropertyAccessToken extends Token {\n public propertyName: string\n constructor (\n public variable: IdentifierToken | QuotedToken,\n public props: (IdentifierToken | QuotedToken | PropertyAccessToken)[],\n end: number\n ) {\n super(TokenKind.PropertyAccess, variable.input, variable.begin, end, variable.file)\n this.propertyName = this.variable instanceof IdentifierToken\n ? this.variable.getText()\n : parseStringLiteral(this.variable.getText())\n }\n}\n","import { Token } from './token'\nimport { FilterArg } from '../parser/filter-arg'\nimport { TokenKind } from '../parser/token-kind'\n\nexport class FilterToken extends Token {\n public constructor (\n public name: string,\n public args: FilterArg[],\n input: string,\n begin: number,\n end: number,\n file?: string\n ) {\n super(TokenKind.Filter, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { ValueToken } from './value-token'\nimport { IdentifierToken } from './identifier-token'\nimport { TokenKind } from '../parser/token-kind'\n\nexport class HashToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public name: IdentifierToken,\n public value?: ValueToken,\n public file?: string\n ) {\n super(TokenKind.Hash, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser/token-kind'\n\nexport class QuotedToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Quoted, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser/token-kind'\n\nexport class HTMLToken extends Token {\n trimLeft = 0\n trimRight = 0\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.HTML, input, begin, end, file)\n }\n public getContent () {\n return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight)\n }\n}\n","import { Token } from './token'\nimport { ValueToken } from './value-token'\nimport { TokenKind } from '../parser/token-kind'\n\nexport class RangeToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public lhs: ValueToken,\n public rhs: ValueToken,\n public file?: string\n ) {\n super(TokenKind.Range, input, begin, end, file)\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { TokenKind } from '../parser/token-kind'\n\nexport class OutputToken extends DelimitedToken {\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options\n const value = input.slice(begin + outputDelimiterLeft.length, end - outputDelimiterRight.length)\n super(TokenKind.Output, value, input, begin, end, trimOutputLeft, trimOutputRight, file)\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { TokenizationError } from '../util/error'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { TokenKind } from '../parser/token-kind'\nimport { Tokenizer } from '../parser/tokenizer'\n\nexport class LiquidTagToken extends DelimitedToken {\n public name: string\n public args: string\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const value = input.slice(begin, end)\n super(TokenKind.Tag, value, input, begin, end, false, false, file)\n\n if (!/\\S/.test(value)) {\n // A line that contains only whitespace.\n this.name = ''\n this.args = ''\n } else {\n const tokenizer = new Tokenizer(this.content, options.operatorsTrie)\n this.name = tokenizer.readIdentifier().getText()\n if (!this.name) throw new TokenizationError(`illegal liquid tag syntax`, this)\n\n tokenizer.skipBlank()\n this.args = tokenizer.remaining()\n }\n }\n}\n","import { whiteSpaceCtrl } from './whitespace-ctrl'\nimport { NumberToken } from '../tokens/number-token'\nimport { IdentifierToken } from '../tokens/identifier-token'\nimport { literalValues } from '../util/literal'\nimport { LiteralToken } from '../tokens/literal-token'\nimport { OperatorToken } from '../tokens/operator-token'\nimport { PropertyAccessToken } from '../tokens/property-access-token'\nimport { assert } from '../util/assert'\nimport { TopLevelToken } from '../tokens/toplevel-token'\nimport { FilterArg } from './filter-arg'\nimport { FilterToken } from '../tokens/filter-token'\nimport { HashToken } from '../tokens/hash-token'\nimport { QuotedToken } from '../tokens/quoted-token'\nimport { ellipsis } from '../util/underscore'\nimport { HTMLToken } from '../tokens/html-token'\nimport { TagToken } from '../tokens/tag-token'\nimport { Token } from '../tokens/token'\nimport { RangeToken } from '../tokens/range-token'\nimport { ValueToken } from '../tokens/value-token'\nimport { OutputToken } from '../tokens/output-token'\nimport { TokenizationError } from '../util/error'\nimport { NormalizedFullOptions, defaultOptions } from '../liquid-options'\nimport { TYPES, QUOTE, BLANK, IDENTIFIER } from '../util/character'\nimport { matchOperator } from './match-operator'\nimport { Trie } from '../util/operator-trie'\nimport { Expression } from '../render/expression'\nimport { LiquidTagToken } from '../tokens/liquid-tag-token'\n\nexport class Tokenizer {\n p = 0\n N: number\n private rawBeginAt = -1\n\n constructor (\n public input: string,\n private trie: Trie,\n public file: string = ''\n ) {\n this.N = input.length\n }\n\n readExpression () {\n return new Expression(this.readExpressionTokens())\n }\n\n * readExpressionTokens (): IterableIterator<Token> {\n const operand = this.readValue()\n if (!operand) return\n\n yield operand\n\n while (this.p < this.N) {\n const operator = this.readOperator()\n if (!operator) return\n\n const operand = this.readValue()\n if (!operand) return\n\n yield operator\n yield operand\n }\n }\n readOperator (): OperatorToken | undefined {\n this.skipBlank()\n const end = matchOperator(this.input, this.p, this.trie)\n if (end === -1) return\n return new OperatorToken(this.input, this.p, (this.p = end), this.file)\n }\n readFilters (): FilterToken[] {\n const filters = []\n while (true) {\n const filter = this.readFilter()\n if (!filter) return filters\n filters.push(filter)\n }\n }\n readFilter (): FilterToken | null {\n this.skipBlank()\n if (this.end()) return null\n assert(this.peek() === '|', () => `unexpected token at ${this.snapshot()}`)\n this.p++\n const begin = this.p\n const name = this.readIdentifier()\n if (!name.size()) return null\n const args = []\n this.skipBlank()\n if (this.peek() === ':') {\n do {\n ++this.p\n const arg = this.readFilterArg()\n arg && args.push(arg)\n while (this.p < this.N && this.peek() !== ',' && this.peek() !== '|') ++this.p\n } while (this.peek() === ',')\n }\n return new FilterToken(name.getText(), args, this.input, begin, this.p, this.file)\n }\n\n readFilterArg (): FilterArg | undefined {\n const key = this.readValue()\n if (!key) return\n this.skipBlank()\n if (this.peek() !== ':') return key\n ++this.p\n const value = this.readValue()\n return [key.getText(), value]\n }\n\n readTopLevelTokens (options: NormalizedFullOptions = defaultOptions): TopLevelToken[] {\n const tokens: TopLevelToken[] = []\n while (this.p < this.N) {\n const token = this.readTopLevelToken(options)\n tokens.push(token)\n }\n whiteSpaceCtrl(tokens, options)\n return tokens\n }\n\n readTopLevelToken (options: NormalizedFullOptions): TopLevelToken {\n const { tagDelimiterLeft, outputDelimiterLeft } = options\n if (this.rawBeginAt > -1) return this.readEndrawOrRawContent(options)\n if (this.match(tagDelimiterLeft)) return this.readTagToken(options)\n if (this.match(outputDelimiterLeft)) return this.readOutputToken(options)\n return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft])\n }\n\n readHTMLToken (stopStrings: string[]): HTMLToken {\n const begin = this.p\n while (this.p < this.N) {\n if (stopStrings.some(str => this.match(str))) break\n ++this.p\n }\n return new HTMLToken(this.input, begin, this.p, this.file)\n }\n\n readTagToken (options: NormalizedFullOptions = defaultOptions): TagToken {\n const { file, input } = this\n const begin = this.p\n if (this.readToDelimiter(options.tagDelimiterRight) === -1) {\n throw this.mkError(`tag ${this.snapshot(begin)} not closed`, begin)\n }\n const token = new TagToken(input, begin, this.p, options, file)\n if (token.name === 'raw') this.rawBeginAt = begin\n return token\n }\n\n readToDelimiter (delimiter: string) {\n while (this.p < this.N) {\n if ((this.peekType() & QUOTE)) {\n this.readQuoted()\n continue\n }\n ++this.p\n if (this.rmatch(delimiter)) return this.p\n }\n return -1\n }\n\n readOutputToken (options: NormalizedFullOptions = defaultOptions): OutputToken {\n const { file, input } = this\n const { outputDelimiterRight } = options\n const begin = this.p\n if (this.readToDelimiter(outputDelimiterRight) === -1) {\n throw this.mkError(`output ${this.snapshot(begin)} not closed`, begin)\n }\n return new OutputToken(input, begin, this.p, options, file)\n }\n\n readEndrawOrRawContent (options: NormalizedFullOptions): HTMLToken | TagToken {\n const { tagDelimiterLeft, tagDelimiterRight } = options\n const begin = this.p\n let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length\n while (this.p < this.N) {\n if (this.readIdentifier().getText() !== 'endraw') {\n leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length\n continue\n }\n while (this.p <= this.N) {\n if (this.rmatch(tagDelimiterRight)) {\n const end = this.p\n if (begin === leftPos) {\n this.rawBeginAt = -1\n return new TagToken(this.input, begin, end, options, this.file)\n } else {\n this.p = leftPos\n return new HTMLToken(this.input, begin, leftPos, this.file)\n }\n }\n if (this.rmatch(tagDelimiterLeft)) break\n this.p++\n }\n }\n throw this.mkError(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin)\n }\n\n readLiquidTagTokens (options: NormalizedFullOptions = defaultOptions): LiquidTagToken[] {\n const tokens: LiquidTagToken[] = []\n while (this.p < this.N) {\n const token = this.readLiquidTagToken(options)\n if (token.name) tokens.push(token)\n }\n return tokens\n }\n\n readLiquidTagToken (options: NormalizedFullOptions): LiquidTagToken {\n const { file, input } = this\n const begin = this.p\n let end = this.N\n if (this.readToDelimiter('\\n') !== -1) end = this.p\n const token = new LiquidTagToken(input, begin, end, options, file)\n return token\n }\n\n mkError (msg: string, begin: number) {\n return new TokenizationError(msg, new IdentifierToken(this.input, begin, this.N, this.file))\n }\n\n snapshot (begin: number = this.p) {\n return JSON.stringify(ellipsis(this.input.slice(begin), 16))\n }\n\n /**\n * @deprecated\n */\n readWord () {\n console.warn('Tokenizer#readWord() will be removed, use #readIdentifier instead')\n return this.readIdentifier()\n }\n\n readIdentifier (): IdentifierToken {\n this.skipBlank()\n const begin = this.p\n while (this.peekType() & IDENTIFIER) ++this.p\n return new IdentifierToken(this.input, begin, this.p, this.file)\n }\n\n readHashes (jekyllStyle?: boolean) {\n const hashes = []\n while (true) {\n const hash = this.readHash(jekyllStyle)\n if (!hash) return hashes\n hashes.push(hash)\n }\n }\n\n readHash (jekyllStyle?: boolean): HashToken | undefined {\n this.skipBlank()\n if (this.peek() === ',') ++this.p\n const begin = this.p\n const name = this.readIdentifier()\n if (!name.size()) return\n let value\n\n this.skipBlank()\n const sep = jekyllStyle ? '=' : ':'\n if (this.peek() === sep) {\n ++this.p\n value = this.readValue()\n }\n return new HashToken(this.input, begin, this.p, name, value, this.file)\n }\n\n remaining () {\n return this.input.slice(this.p)\n }\n\n advance (i = 1) {\n this.p += i\n }\n\n end () {\n return this.p >= this.N\n }\n\n readTo (end: string): number {\n while (this.p < this.N) {\n ++this.p\n if (this.rmatch(end)) return this.p\n }\n return -1\n }\n\n readValue (): ValueToken | undefined {\n const value = this.readQuoted() || this.readRange()\n if (value) return value\n\n if (this.peek() === '[') {\n this.p++\n const prop = this.readQuoted()\n if (!prop) return\n if (this.peek() !== ']') return\n this.p++\n return new PropertyAccessToken(prop, [], this.p)\n }\n\n const variable = this.readIdentifier()\n if (!variable.size()) return\n\n let isNumber = variable.isNumber(true)\n const props: (QuotedToken | IdentifierToken)[] = []\n while (true) {\n if (this.peek() === '[') {\n isNumber = false\n this.p++\n const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file)\n this.readTo(']')\n props.push(prop)\n } else if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax\n this.p++\n const prop = this.readIdentifier()\n if (!prop.size()) break\n if (!prop.isNumber()) isNumber = false\n props.push(prop)\n } else break\n }\n if (!props.length && literalValues.hasOwnProperty(variable.content)) {\n return new LiteralToken(this.input, variable.begin, variable.end, this.file)\n }\n if (isNumber) return new NumberToken(variable, props[0] as IdentifierToken)\n return new PropertyAccessToken(variable, props, this.p)\n }\n\n readRange (): RangeToken | undefined {\n this.skipBlank()\n const begin = this.p\n if (this.peek() !== '(') return\n ++this.p\n const lhs = this.readValueOrThrow()\n this.p += 2\n const rhs = this.readValueOrThrow()\n ++this.p\n return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file)\n }\n\n readValueOrThrow (): ValueToken {\n const value = this.readValue()\n assert(value, () => `unexpected token ${this.snapshot()}, value expected`)\n return value!\n }\n\n readQuoted (): QuotedToken | undefined {\n this.skipBlank()\n const begin = this.p\n if (!(this.peekType() & QUOTE)) return\n ++this.p\n let escaped = false\n while (this.p < this.N) {\n ++this.p\n if (this.input[this.p - 1] === this.input[begin] && !escaped) break\n if (escaped) escaped = false\n else if (this.input[this.p - 1] === '\\\\') escaped = true\n }\n return new QuotedToken(this.input, begin, this.p, this.file)\n }\n\n * readFileNameTemplate (options: NormalizedFullOptions): IterableIterator<TopLevelToken> {\n const { outputDelimiterLeft } = options\n const htmlStopStrings = [',', ' ', outputDelimiterLeft]\n const htmlStopStringSet = new Set(htmlStopStrings)\n // break on ',' and ' ', outputDelimiterLeft only stops HTML token\n while (this.p < this.N && !htmlStopStringSet.has(this.peek())) {\n yield this.match(outputDelimiterLeft)\n ? this.readOutputToken(options)\n : this.readHTMLToken(htmlStopStrings)\n }\n }\n\n match (word: string) {\n for (let i = 0; i < word.length; i++) {\n if (word[i] !== this.input[this.p + i]) return false\n }\n return true\n }\n\n rmatch (pattern: string) {\n for (let i = 0; i < pattern.length; i++) {\n if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i]) return false\n }\n return true\n }\n\n peekType (n = 0) {\n return TYPES[this.input.charCodeAt(this.p + n)]\n }\n\n peek (n = 0) {\n return this.input[this.p + n]\n }\n\n skipBlank () {\n while (this.peekType() & BLANK) ++this.p\n }\n}\n","import { IDENTIFIER, TYPES } from '../util/character'\nimport { Trie } from '../util/operator-trie'\n\nexport function matchOperator (str: string, begin: number, trie: Trie, end = str.length) {\n let node = trie\n let i = begin\n let info\n while (node[str[i]] && i < end) {\n node = node[str[i++]]\n if (node['end']) info = node\n }\n if (!info) return -1\n if (info['needBoundary'] && (TYPES[str.charCodeAt(i)] & IDENTIFIER)) return -1\n return i\n}\n","import { DelimitedToken } from './delimited-token'\nimport { TokenizationError } from '../util/error'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { TokenKind } from '../parser/token-kind'\nimport { Tokenizer } from '../parser/tokenizer'\n\nexport class TagToken extends DelimitedToken {\n public name: string\n public args: string\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options\n const value = input.slice(begin + tagDelimiterLeft.length, end - tagDelimiterRight.length)\n super(TokenKind.Tag, value, input, begin, end, trimTagLeft, trimTagRight, file)\n\n const tokenizer = new Tokenizer(this.content, options.operatorsTrie)\n this.name = tokenizer.readIdentifier().getText()\n if (!this.name) throw new TokenizationError(`illegal tag syntax`, this)\n\n tokenizer.skipBlank()\n this.args = tokenizer.remaining()\n }\n}\n","import { evalToken } from '../../render/expression'\nimport { Context } from '../../context/context'\nimport { Tokenizer } from '../../parser/tokenizer'\n\nexport interface HashValue {\n [key: string]: any;\n}\n\n/**\n * Key-Value Pairs Representing Tag Arguments\n * Example:\n * For the markup `, foo:'bar', coo:2 reversed %}`,\n * hash['foo'] === 'bar'\n * hash['coo'] === 2\n * hash['reversed'] === undefined\n */\nexport class Hash {\n hash: HashValue = {}\n constructor (markup: string, jekyllStyle?: boolean) {\n const tokenizer = new Tokenizer(markup, {})\n for (const hash of tokenizer.readHashes(jekyllStyle)) {\n this.hash[hash.name.content] = hash.value\n }\n }\n * render (ctx: Context): Generator<unknown, HashValue, unknown> {\n const hash = {}\n for (const key of Object.keys(this.hash)) {\n hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx)\n }\n return hash\n }\n}\n","import { evalToken } from '../../render/expression'\nimport { Context } from '../../context/context'\nimport { identify } from '../../util/underscore'\nimport { FilterImplOptions } from './filter-impl-options'\nimport { FilterArg, isKeyValuePair } from '../../parser/filter-arg'\nimport { Liquid } from '../../liquid'\n\nexport class Filter {\n public name: string\n public args: FilterArg[]\n private impl: FilterImplOptions\n private liquid: Liquid\n\n public constructor (name: string, impl: FilterImplOptions, args: FilterArg[], liquid: Liquid) {\n this.name = name\n this.impl = impl || identify\n this.args = args\n this.liquid = liquid\n }\n public render (value: any, context: Context) {\n const argv: any[] = []\n for (const arg of this.args as FilterArg[]) {\n if (isKeyValuePair(arg)) argv.push([arg[0], evalToken(arg[1], context)])\n else argv.push(evalToken(arg, context))\n }\n return this.impl.apply({ context, liquid: this.liquid }, [value, ...argv])\n }\n}\n","import { isArray } from '../util/underscore'\nimport { ValueToken } from '../tokens/value-token'\n\ntype KeyValuePair = [string?, ValueToken?]\n\nexport type FilterArg = ValueToken | KeyValuePair\n\nexport function isKeyValuePair (arr: FilterArg): arr is KeyValuePair { // TODO check\n return isArray(arr)\n}\n","import { Expression } from '../render/expression'\nimport { Tokenizer } from '../parser/tokenizer'\nimport { Filter } from './filter/filter'\nimport { Context } from '../context/context'\nimport { Liquid } from '../liquid'\n\nexport class Value {\n public readonly filters: Filter[] = []\n public readonly initial: Expression\n\n /**\n * @param str the value to be valuated, eg.: \"foobar\" | truncate: 3\n */\n public constructor (str: string, liquid: Liquid) {\n const tokenizer = new Tokenizer(str, liquid.options.operatorsTrie)\n this.initial = tokenizer.readExpression()\n this.filters = tokenizer.readFilters().map(({ name, args }) => new Filter(name, liquid.filters.get(name), args, liquid))\n }\n public * value (ctx: Context, lenient: boolean): Generator<unknown, unknown, unknown> {\n lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default')\n let val = yield this.initial.evaluate(ctx, lenient)\n\n for (const filter of this.filters) {\n val = yield filter.render(val, ctx)\n }\n return val\n }\n}\n","import { isFunction } from '../../util/underscore'\nimport { Liquid } from '../../liquid'\nimport { TemplateImpl } from '../../template/template-impl'\nimport { Emitter, Hash, Context, TagToken, Template, TopLevelToken } from '../../types'\nimport { TagImpl } from './tag-impl'\nimport { HashValue } from './hash'\n\nexport class Tag extends TemplateImpl<TagToken> implements Template {\n public name: string\n private impl: TagImpl\n\n public constructor (token: TagToken, tokens: TopLevelToken[], liquid: Liquid) {\n super(token)\n this.name = token.name\n\n const impl = liquid.tags.get(token.name)\n\n this.impl = Object.create(impl)\n this.impl.liquid = liquid\n if (this.impl.parse) {\n this.impl.parse(token, tokens)\n }\n }\n public * render (ctx: Context, emitter: Emitter): Generator<unknown, unknown, HashValue | unknown> {\n const hash = (yield new Hash(this.token.args).render(ctx)) as HashValue\n const impl = this.impl\n if (isFunction(impl.render)) return yield impl.render(ctx, emitter, hash)\n }\n}\n","import { Value } from './value'\nimport { TemplateImpl } from '../template/template-impl'\nimport { Template } from '../template/template'\nimport { Context } from '../context/context'\nimport { Emitter } from '../emitters/emitter'\nimport { OutputToken } from '../tokens/output-token'\nimport { Liquid } from '../liquid'\n\nexport class Output extends TemplateImpl<OutputToken> implements Template {\n private value: Value\n public constructor (token: OutputToken, liquid: Liquid) {\n super(token)\n this.value = new Value(token.content, liquid)\n }\n public * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n const val = yield this.value.value(ctx, false)\n emitter.write(val)\n }\n}\n","import { TemplateImpl } from '../template/template-impl'\nimport { Template } from '../template/template'\nimport { HTMLToken } from '../tokens/html-token'\nimport { Context } from '../context/context'\nimport { Emitter } from '../emitters/emitter'\n\nexport class HTML extends TemplateImpl<HTMLToken> implements Template {\n private str: string\n public constructor (token: HTMLToken) {\n super(token)\n this.str = token.getContent()\n }\n public * render (ctx: Context, emitter: Emitter): IterableIterator<void> {\n emitter.write(this.str)\n }\n}\n","import { ParseError } from '../util/error'\nimport { Liquid, Tokenizer } from '../liquid'\nimport { ParseStream } from './parse-stream'\nimport { isTagToken, isOutputToken } from '../util/type-guards'\nimport { OutputToken } from '../tokens/output-token'\nimport { Tag } from '../template/tag/tag'\nimport { Output } from '../template/output'\nimport { HTML } from '../template/html'\nimport { Template } from '../template/template'\nimport { TopLevelToken } from '../tokens/toplevel-token'\nimport { Cache } from '../cache/cache'\nimport { Loader, LookupType } from '../fs/loader'\nimport { FS } from '../fs/fs'\nimport { toThenable, Thenable } from '../util/async'\n\nexport default class Parser {\n public parseFile: (file: string, sync?: boolean, type?: LookupType, currentFile?: string) => Generator<unknown, Template[], Template[] | string>\n\n private liquid: Liquid\n private fs: FS\n private cache: Cache<Thenable<Template[]>> | undefined\n private loader: Loader\n\n public constructor (liquid: Liquid) {\n this.liquid = liquid\n this.cache = this.liquid.options.cache\n this.fs = this.liquid.options.fs\n this.parseFile = this.cache ? this._parseFileCached : this._parseFile\n this.loader = new Loader(this.liquid.options)\n }\n public parse (html: string, filepath?: string): Template[] {\n const tokenizer = new Tokenizer(html, this.liquid.options.operatorsTrie, filepath)\n const tokens = tokenizer.readTopLevelTokens(this.liquid.options)\n return this.parseTokens(tokens)\n }\n public parseTokens (tokens: TopLevelToken[]) {\n let token\n const templates: Template[] = []\n while ((token = tokens.shift())) {\n templates.push(this.parseToken(token, tokens))\n }\n return templates\n }\n public parseToken (token: TopLevelToken, remainTokens: TopLevelToken[]) {\n try {\n if (isTagToken(token)) {\n return new Tag(token, remainTokens, this.liquid)\n }\n if (isOutputToken(token)) {\n return new Output(token as OutputToken, this.liquid)\n }\n return new HTML(token)\n } catch (e) {\n throw new ParseError(e as Error, token)\n }\n }\n public parseStream (tokens: TopLevelToken[]) {\n return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens))\n }\n private * _parseFileCached (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator<unknown, Template[], Template[]> {\n const key = this.loader.shouldLoadRelative(file)\n ? currentFile + ',' + file\n : type + ':' + file\n const tpls = yield this.cache!.read(key)\n if (tpls) return tpls\n\n const task = toThenable(this._parseFile(file, sync, type, currentFile))\n this.cache!.write(key, task)\n try {\n return yield task\n } catch (e) {\n // remove cached task if failed\n this.cache!.remove(key)\n }\n return []\n }\n private * _parseFile (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator<unknown, Template[], string> {\n const filepath = yield this.loader.lookup(file, type, sync, currentFile)\n return this.liquid.parse(sync ? this.fs.readFileSync(filepath) : yield this.fs.readFile(filepath), filepath)\n }\n}\n","import { Tokenizer, assert, TagImplOptions, TagToken, Context } from '../../types'\n\nexport default {\n parse: function (token: TagToken) {\n const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)\n this.key = tokenizer.readIdentifier().content\n tokenizer.skipBlank()\n assert(tokenizer.peek() === '=', () => `illegal token ${token.getText()}`)\n tokenizer.advance()\n this.value = tokenizer.remaining()\n },\n render: function * (ctx: Context): Generator<unknown, void, unknown> {\n ctx.bottom()[this.key] = yield this.liquid._evalValue(this.value, ctx)\n }\n} as TagImplOptions\n","import { isString, isObject, isArray } from './underscore'\n\nexport function toEnumerable (val: any) {\n if (isArray(val)) return val\n if (isString(val) && val.length > 0) return [val]\n if (isObject(val)) return Object.keys(val).map((key) => [key, val[key]])\n return []\n}\n\nexport function toArray (val: any) {\n if (isArray(val)) return val\n return [ val ]\n}\n","import { Drop } from './drop'\n\nexport class ForloopDrop extends Drop {\n protected i = 0\n public name: string\n public length: number\n public constructor (length: number, collection: string, variable: string) {\n super()\n this.length = length\n this.name = `${variable}-${collection}`\n }\n public next () {\n this.i++\n }\n public index0 () {\n return this.i\n }\n public index () {\n return this.i + 1\n }\n public first () {\n return this.i === 0\n }\n public last () {\n return this.i === this.length - 1\n }\n public rindex () {\n return this.length - this.i\n }\n public rindex0 () {\n return this.length - this.i - 1\n }\n public valueOf () {\n return JSON.stringify(this)\n }\n}\n","import { assert, Tokenizer, evalToken, Emitter, TagToken, TopLevelToken, Context, Template, TagImplOptions, ParseStream } from '../../types'\nimport { toEnumerable } from '../../util/collection'\nimport { ForloopDrop } from '../../drop/forloop-drop'\nimport { Hash, HashValue } from '../../template/tag/hash'\n\nconst MODIFIERS = ['offset', 'limit', 'reversed']\n\ntype valueof<T> = T[keyof T]\n\nexport default {\n type: 'block',\n parse: function (token: TagToken, remainTokens: TopLevelToken[]) {\n const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)\n\n const variable = tokenizer.readIdentifier()\n const inStr = tokenizer.readIdentifier()\n const collection = tokenizer.readValue()\n assert(\n variable.size() && inStr.content === 'in' && collection,\n () => `illegal tag: ${token.getText()}`\n )\n\n this.variable = variable.content\n this.collection = collection\n this.hash = new Hash(tokenizer.remaining())\n this.templates = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endfor', () => stream.stop())\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${token.getText()} not closed`)\n })\n\n stream.start()\n },\n render: function * (ctx: Context, emitter: Emitter): Generator<unknown, void | string, HashValue | Template[]> {\n const r = this.liquid.renderer\n let collection = toEnumerable(yield evalToken(this.collection, ctx))\n\n if (!collection.length) {\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n return\n }\n\n const continueKey = 'continue-' + this.variable + '-' + this.collection.getText()\n ctx.push({ continue: ctx.getRegister(continueKey) })\n const hash = yield this.hash.render(ctx)\n ctx.pop()\n\n const modifiers = this.liquid.options.orderedFilterParameters\n ? Object.keys(hash).filter(x => MODIFIERS.includes(x))\n : MODIFIERS.filter(x => hash[x] !== undefined)\n\n collection = modifiers.reduce((collection, modifier: valueof<typeof MODIFIERS>) => {\n if (modifier === 'offset') return offset(collection, hash['offset'])\n if (modifier === 'limit') return limit(collection, hash['limit'])\n return reversed(collection)\n }, collection)\n\n ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length)\n const scope = { forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) }\n ctx.push(scope)\n for (const item of collection) {\n scope[this.variable] = item\n yield r.renderTemplates(this.templates, ctx, emitter)\n if (emitter['break']) {\n emitter['break'] = false\n break\n }\n emitter['continue'] = false\n scope.forloop.next()\n }\n ctx.pop()\n }\n} as TagImplOptions\n\nfunction reversed<T> (arr: Array<T>) {\n return [...arr].reverse()\n}\n\nfunction offset<T> (arr: Array<T>, count: number) {\n return arr.slice(count)\n}\n\nfunction limit<T> (arr: Array<T>, count: number) {\n return arr.slice(0, count)\n}\n","import { Tokenizer, assert, Template, Context, TagImplOptions, TagToken, TopLevelToken } from '../../types'\nimport { evalQuotedToken } from '../../render/expression'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {\n const tokenizer = new Tokenizer(tagToken.args, this.liquid.options.operatorsTrie)\n this.variable = readVariableName(tokenizer)\n assert(this.variable, () => `${tagToken.args} not valid identifier`)\n\n this.templates = []\n\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream.on('tag:endcapture', () => stream.stop())\n .on('template', (tpl: Template) => this.templates.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n stream.start()\n },\n render: function * (ctx: Context): Generator<unknown, void, string> {\n const r = this.liquid.renderer\n const html = yield r.renderTemplates(this.templates, ctx)\n ctx.bottom()[this.variable] = html\n }\n} as TagImplOptions\n\nfunction readVariableName (tokenizer: Tokenizer) {\n const word = tokenizer.readIdentifier().content\n if (word) return word\n const quoted = tokenizer.readQuoted()\n if (quoted) return evalQuotedToken(quoted)\n}\n","enum BlockMode {\n /* store rendered html into blocks */\n OUTPUT,\n /* output rendered html directly */\n STORE\n}\n\nexport default BlockMode\n","import { toValue, evalToken, Value, Emitter, TagToken, TopLevelToken, Context, Template, TagImplOptions, ParseStream } from '../../types'\nimport { Tokenizer } from '../../parser/tokenizer'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {\n this.cond = new Value(tagToken.args, this.liquid)\n this.cases = []\n this.elseTemplates = []\n\n let p: Template[] = []\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('tag:when', (token: TagToken) => {\n p = []\n\n const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)\n\n while (!tokenizer.end()) {\n const value = tokenizer.readValue()\n this.cases.push({\n val: value,\n templates: p\n })\n tokenizer.readTo(',')\n }\n })\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endcase', () => stream.stop())\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n\n stream.start()\n },\n\n render: function * (ctx: Context, emitter: Emitter) {\n const r = this.liquid.renderer\n const cond = toValue(yield this.cond.value(ctx, ctx.opts.lenientIf))\n for (const branch of this.cases) {\n const val = evalToken(branch.val, ctx, ctx.opts.lenientIf)\n if (val === cond) {\n yield r.renderTemplates(branch.templates, ctx, emitter)\n return\n }\n }\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n} as TagImplOptions\n","import { TagToken } from '../../tokens/tag-token'\nimport { TopLevelToken } from '../../tokens/toplevel-token'\nimport { TagImplOptions } from '../../template/tag/tag-impl-options'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream\n .on('token', (token: TagToken) => {\n if (token.name === 'endcomment') stream.stop()\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n stream.start()\n }\n} as TagImplOptions\n","import { __assign } from 'tslib'\nimport { assert } from '../../util/assert'\nimport { ForloopDrop } from '../../drop/forloop-drop'\nimport { toEnumerable } from '../../util/collection'\nimport { Liquid } from '../../liquid'\nimport { Token, Template, evalQuotedToken, TypeGuards, Tokenizer, evalToken, Hash, Emitter, TagToken, Context, TagImplOptions } from '../../types'\n\nexport default {\n parseFilePath,\n renderFilePath,\n parse: function (token: TagToken) {\n const args = token.args\n const tokenizer = new Tokenizer(args, this.liquid.options.operatorsTrie)\n this['file'] = this.parseFilePath(tokenizer, this.liquid)\n this['currentFile'] = token.file\n while (!tokenizer.end()) {\n tokenizer.skipBlank()\n const begin = tokenizer.p\n const keyword = tokenizer.readIdentifier()\n if (keyword.content === 'with' || keyword.content === 'for') {\n tokenizer.skipBlank()\n // can be normal key/value pair, like \"with: true\"\n if (tokenizer.peek() !== ':') {\n const value = tokenizer.readValue()\n // can be normal key, like \"with,\"\n if (value) {\n const beforeAs = tokenizer.p\n const asStr = tokenizer.readIdentifier()\n let alias\n if (asStr.content === 'as') alias = tokenizer.readIdentifier()\n else tokenizer.p = beforeAs\n\n this[keyword.content] = { value, alias: alias && alias.content }\n tokenizer.skipBlank()\n if (tokenizer.peek() === ',') tokenizer.advance()\n // matched!\n continue\n }\n }\n }\n /**\n * restore cursor if with/for not matched\n */\n tokenizer.p = begin\n break\n }\n this.hash = new Hash(tokenizer.remaining())\n },\n render: function * (ctx: Context, emitter: Emitter) {\n const { liquid, hash } = this\n const filepath = yield this.renderFilePath(this['file'], ctx, liquid)\n assert(filepath, () => `illegal filename \"${filepath}\"`)\n\n const childCtx = new Context({}, ctx.opts, { sync: ctx.sync, globals: ctx.globals, strictVariables: ctx.strictVariables })\n const scope = childCtx.bottom()\n __assign(scope, yield hash.render(ctx))\n if (this['with']) {\n const { value, alias } = this['with']\n scope[alias || filepath] = evalToken(value, ctx)\n }\n\n if (this['for']) {\n const { value, alias } = this['for']\n let collection = evalToken(value, ctx)\n collection = toEnumerable(collection)\n scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias)\n for (const item of collection) {\n scope[alias] = item\n const templates = yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])\n yield liquid.renderer.renderTemplates(templates, childCtx, emitter)\n scope['forloop'].next()\n }\n } else {\n const templates = yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])\n yield liquid.renderer.renderTemplates(templates, childCtx, emitter)\n }\n }\n} as TagImplOptions\n\ntype ParsedFileName = Template[] | Token | string | undefined\n\n/**\n * @return null for \"none\",\n * @return Template[] for quoted with tags and/or filters\n * @return Token for expression (not quoted)\n * @throws TypeError if cannot read next token\n */\nexport function parseFilePath (tokenizer: Tokenizer, liquid: Liquid): ParsedFileName | null {\n if (liquid.options.dynamicPartials) {\n const file = tokenizer.readValue()\n if (file === undefined) throw new TypeError(`illegal argument \"${tokenizer.input}\"`)\n if (file.getText() === 'none') return null\n if (TypeGuards.isQuotedToken(file)) {\n // for filenames like \"files/{{file}}\", eval as liquid template\n const templates = liquid.parse(evalQuotedToken(file))\n return optimize(templates)\n }\n return file\n }\n const tokens = [...tokenizer.readFileNameTemplate(liquid.options)]\n const templates = optimize(liquid.parser.parseTokens(tokens))\n return templates === 'none' ? null : templates\n}\n\nfunction optimize (templates: Template[]): string | Template[] {\n // for filenames like \"files/file.liquid\", extract the string directly\n if (templates.length === 1 && TypeGuards.isHTMLToken(templates[0].token)) return templates[0].token.getContent()\n return templates\n}\n\nexport function renderFilePath (file: ParsedFileName, ctx: Context, liquid: Liquid) {\n if (typeof file === 'string') return file\n if (Array.isArray(file)) return liquid.renderer.renderTemplates(file, ctx)\n return evalToken(file, ctx)\n}\n","import { assert, Tokenizer, evalToken, Hash, Emitter, TagToken, Context, TagImplOptions } from '../../types'\nimport BlockMode from '../../context/block-mode'\nimport { parseFilePath, renderFilePath } from './render'\n\nexport default {\n parseFilePath,\n renderFilePath,\n parse: function (token: TagToken) {\n const args = token.args\n const tokenizer = new Tokenizer(args, this.liquid.options.operatorsTrie)\n this['file'] = this.parseFilePath(tokenizer, this.liquid)\n this['currentFile'] = token.file\n\n const begin = tokenizer.p\n const withStr = tokenizer.readIdentifier()\n if (withStr.content === 'with') {\n tokenizer.skipBlank()\n if (tokenizer.peek() !== ':') {\n this.withVar = tokenizer.readValue()\n } else tokenizer.p = begin\n } else tokenizer.p = begin\n\n this.hash = new Hash(tokenizer.remaining(), this.liquid.options.jekyllInclude)\n },\n render: function * (ctx: Context, emitter: Emitter) {\n const { liquid, hash, withVar } = this\n const { renderer } = liquid\n const filepath = yield this.renderFilePath(this['file'], ctx, liquid)\n assert(filepath, () => `illegal filename \"${filepath}\"`)\n\n const saved = ctx.saveRegister('blocks', 'blockMode')\n ctx.setRegister('blocks', {})\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n const scope = yield hash.render(ctx)\n if (withVar) scope[filepath] = evalToken(withVar, ctx)\n const templates = yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile'])\n ctx.push(ctx.opts.jekyllInclude ? { include: scope } : scope)\n yield renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n ctx.restoreRegister(saved)\n }\n} as TagImplOptions\n","import { Tokenizer, Emitter, TagToken, Context, TagImplOptions } from '../../types'\nimport { isNumber, stringify } from '../../util/underscore'\n\nexport default {\n parse: function (token: TagToken) {\n const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)\n this.variable = tokenizer.readIdentifier().content\n },\n render: function (context: Context, emitter: Emitter) {\n const scope = context.environments\n if (!isNumber(scope[this.variable])) {\n scope[this.variable] = 0\n }\n emitter.write(stringify(--scope[this.variable]))\n }\n} as TagImplOptions\n","import { assert } from '../../util/assert'\nimport { evalToken, Emitter, TagToken, Context, TagImplOptions } from '../../types'\nimport { Tokenizer } from '../../parser/tokenizer'\n\nexport default {\n parse: function (tagToken: TagToken) {\n const tokenizer = new Tokenizer(tagToken.args, this.liquid.options.operatorsTrie)\n const group = tokenizer.readValue()\n tokenizer.skipBlank()\n\n this.candidates = []\n\n if (group) {\n if (tokenizer.peek() === ':') {\n this.group = group\n tokenizer.advance()\n } else this.candidates.push(group)\n }\n\n while (!tokenizer.end()) {\n const value = tokenizer.readValue()\n if (value) this.candidates.push(value)\n tokenizer.readTo(',')\n }\n assert(this.candidates.length, () => `empty candidates: ${tagToken.getText()}`)\n },\n\n render: function (ctx: Context, emitter: Emitter) {\n const group = evalToken(this.group, ctx)\n const fingerprint = `cycle:${group}:` + this.candidates.join(',')\n const groups = ctx.getRegister('cycle')\n let idx = groups[fingerprint]\n\n if (idx === undefined) {\n idx = groups[fingerprint] = 0\n }\n\n const candidate = this.candidates[idx]\n idx = (idx + 1) % this.candidates.length\n groups[fingerprint] = idx\n const html = evalToken(candidate, ctx)\n emitter.write(html)\n }\n} as TagImplOptions\n","import { Value, Emitter, isTruthy, TagToken, TopLevelToken, Context, Template, TagImplOptions } from '../../types'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {\n this.branches = []\n this.elseTemplates = []\n\n let p\n this.liquid.parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n predicate: new Value(tagToken.args, this.liquid),\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => this.branches.push({\n predicate: new Value(token.args, this.liquid),\n templates: (p = [])\n }))\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endif', function () { this.stop() })\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })\n .start()\n },\n\n render: function * (ctx: Context, emitter: Emitter): Generator<unknown, void, string> {\n const r = this.liquid.renderer\n\n for (const { predicate, templates } of this.branches) {\n const value = yield predicate.value(ctx, ctx.opts.lenientIf)\n if (isTruthy(value, ctx)) {\n yield r.renderTemplates(templates, ctx, emitter)\n return\n }\n }\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n} as TagImplOptions\n","import { isNumber, stringify } from '../../util/underscore'\nimport { Tokenizer, Emitter, TagToken, Context, TagImplOptions } from '../../types'\n\nexport default {\n parse: function (token: TagToken) {\n const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)\n this.variable = tokenizer.readIdentifier().content\n },\n render: function (context: Context, emitter: Emitter) {\n const scope = context.environments\n if (!isNumber(scope[this.variable])) {\n scope[this.variable] = 0\n }\n const val = scope[this.variable]\n scope[this.variable]++\n emitter.write(stringify(val))\n }\n} as TagImplOptions\n","import { assert, Tokenizer, Emitter, Hash, TagToken, TopLevelToken, Context, TagImplOptions } from '../../types'\nimport BlockMode from '../../context/block-mode'\nimport { parseFilePath, renderFilePath } from './render'\nimport { BlankDrop } from '../../drop/blank-drop'\n\nexport default {\n parseFilePath,\n renderFilePath,\n parse: function (token: TagToken, remainTokens: TopLevelToken[]) {\n const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)\n this['file'] = this.parseFilePath(tokenizer, this.liquid)\n this['currentFile'] = token.file\n this.hash = new Hash(tokenizer.remaining())\n this.tpls = this.liquid.parser.parseTokens(remainTokens)\n },\n render: function * (ctx: Context, emitter: Emitter) {\n const { liquid, hash, file } = this\n const { renderer } = liquid\n if (file === null) {\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n yield renderer.renderTemplates(this.tpls, ctx, emitter)\n return\n }\n const filepath = yield this.renderFilePath(this['file'], ctx, liquid)\n assert(filepath, () => `illegal filename \"${filepath}\"`)\n const templates = yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile'])\n\n // render remaining contents and store rendered results\n ctx.setRegister('blockMode', BlockMode.STORE)\n const html = yield renderer.renderTemplates(this.tpls, ctx)\n const blocks = ctx.getRegister('blocks')\n\n // set whole content to anonymous block if anonymous doesn't specified\n if (blocks[''] === undefined) blocks[''] = (parent: BlankDrop, emitter: Emitter) => emitter.write(html)\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n\n // render the layout file use stored blocks\n ctx.push(yield hash.render(ctx))\n yield renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n }\n} as TagImplOptions\n","import { Drop } from './drop'\n\nexport class BlockDrop extends Drop {\n constructor (\n // the block render from layout template\n private superBlockRender: () => Iterable<any> = () => ''\n ) {\n super()\n }\n /**\n * Provide parent access in child block by\n * {{ block.super }}\n */\n public super () {\n return this.superBlockRender()\n }\n}\n","import BlockMode from '../../context/block-mode'\nimport { BlockDrop } from '../../drop/block-drop'\nimport { TagToken, TopLevelToken, Template, Context, TagImpl, Emitter } from '../../types'\n\nexport default {\n parse (this: TagImpl, token: TagToken, remainTokens: TopLevelToken[]) {\n const match = /\\w+/.exec(token.args)\n this.block = match ? match[0] : ''\n this.tpls = [] as Template[]\n this.liquid.parser.parseStream(remainTokens)\n .on('tag:endblock', function () { this.stop() })\n .on('template', (tpl: Template) => this.tpls.push(tpl))\n .on('end', () => { throw new Error(`tag ${token.getText()} not closed`) })\n .start()\n },\n\n * render (this: TagImpl, ctx: Context, emitter: Emitter) {\n const blockRender = this.getBlockRender(ctx)\n if (ctx.getRegister('blockMode') === BlockMode.STORE) {\n ctx.getRegister('blocks')[this.block] = blockRender\n } else {\n yield blockRender(new BlockDrop(), emitter)\n }\n },\n\n getBlockRender (this: TagImpl, ctx: Context) {\n const { liquid, tpls } = this\n const renderChild = ctx.getRegister('blocks')[this.block]\n const renderCurrent = function * (superBlock: BlockDrop, emitter: Emitter) {\n // add {{ block.super }} support when rendering\n ctx.push({ block: superBlock })\n yield liquid.renderer.renderTemplates(tpls, ctx, emitter)\n ctx.pop()\n }\n return renderChild\n ? (superBlock: BlockDrop, emitter: Emitter) => renderChild(new BlockDrop(() => renderCurrent(superBlock, emitter)), emitter)\n : renderCurrent\n }\n}\n","import { TagToken, TopLevelToken, TagImplOptions } from '../../types'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {\n this.tokens = []\n\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream\n .on('token', (token: TagToken) => {\n if (token.name === 'endraw') stream.stop()\n else this.tokens.push(token)\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n stream.start()\n },\n render: function () {\n return this.tokens.map((token: TopLevelToken) => token.getText()).join('')\n }\n} as TagImplOptions\n","import { ForloopDrop } from './forloop-drop'\n\nexport class TablerowloopDrop extends ForloopDrop {\n private cols: number\n public constructor (length: number, cols: number, collection: string, variable: string) {\n super(length, collection, variable)\n this.length = length\n this.cols = cols\n }\n public row () {\n return Math.floor(this.i / this.cols) + 1\n }\n public col0 () {\n return (this.i % this.cols)\n }\n public col () {\n return this.col0() + 1\n }\n public col_first () { // eslint-disable-line\n return this.col0() === 0\n }\n public col_last () { // eslint-disable-line\n return this.col() === this.cols\n }\n}\n","import assign from './assign'\nimport For from './for'\nimport capture from './capture'\nimport Case from './case'\nimport comment from './comment'\nimport include from './include'\nimport render from './render'\nimport decrement from './decrement'\nimport cycle from './cycle'\nimport If from './if'\nimport increment from './increment'\nimport layout from './layout'\nimport block from './block'\nimport raw from './raw'\nimport tablerow from './tablerow'\nimport unless from './unless'\nimport Break from './break'\nimport Continue from './continue'\nimport echo from './echo'\nimport liquid from './liquid'\nimport { TagImplOptions } from '../../template/tag/tag-impl-options'\n\nconst tags: { [key: string]: TagImplOptions } = {\n assign, 'for': For, capture, 'case': Case, comment, include, render, decrement, increment, cycle, 'if': If, layout, block, raw, tablerow, unless, 'break': Break, 'continue': Continue, echo, liquid\n}\n\nexport default tags\n","import { toEnumerable } from '../../util/collection'\nimport { assert, evalToken, Emitter, Hash, TagToken, TopLevelToken, Context, Template, TagImplOptions, ParseStream } from '../../types'\nimport { TablerowloopDrop } from '../../drop/tablerowloop-drop'\nimport { Tokenizer } from '../../parser/tokenizer'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {\n const tokenizer = new Tokenizer(tagToken.args, this.liquid.options.operatorsTrie)\n\n const variable = tokenizer.readIdentifier()\n tokenizer.skipBlank()\n\n const tmp = tokenizer.readIdentifier()\n assert(tmp && tmp.content === 'in', () => `illegal tag: ${tagToken.getText()}`)\n\n this.variable = variable.content\n this.collection = tokenizer.readValue()\n this.hash = new Hash(tokenizer.remaining())\n this.templates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:endtablerow', () => stream.stop())\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n\n stream.start()\n },\n\n render: function * (ctx: Context, emitter: Emitter) {\n let collection = toEnumerable(yield evalToken(this.collection, ctx))\n const hash = yield this.hash.render(ctx)\n const offset = hash.offset || 0\n const limit = (hash.limit === undefined) ? collection.length : hash.limit\n\n collection = collection.slice(offset, offset + limit)\n const cols = hash.cols || collection.length\n\n const r = this.liquid.renderer\n const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable)\n const scope = { tablerowloop }\n ctx.push(scope)\n\n for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) {\n scope[this.variable] = collection[idx]\n if (tablerowloop.col0() === 0) {\n if (tablerowloop.row() !== 1) emitter.write('</tr>')\n emitter.write(`<tr class=\"row${tablerowloop.row()}\">`)\n }\n emitter.write(`<td class=\"col${tablerowloop.col()}\">`)\n yield r.renderTemplates(this.templates, ctx, emitter)\n emitter.write('</td>')\n }\n if (collection.length) emitter.write('</tr>')\n ctx.pop()\n }\n} as TagImplOptions\n","import { Value, TopLevelToken, Template, Emitter, isTruthy, isFalsy, Context, TagImplOptions, TagToken } from '../../types'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {\n this.branches = []\n this.elseTemplates = []\n let p\n this.liquid.parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n predicate: new Value(tagToken.args, this.liquid),\n test: isFalsy,\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => this.branches.push({\n predicate: new Value(token.args, this.liquid),\n test: isTruthy,\n templates: (p = [])\n }))\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endunless', function () { this.stop() })\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })\n .start()\n },\n\n render: function * (ctx: Context, emitter: Emitter) {\n const r = this.liquid.renderer\n\n for (const { predicate, test, templates } of this.branches) {\n const value = yield predicate.value(ctx, ctx.opts.lenientIf)\n if (test(value, ctx)) {\n yield r.renderTemplates(templates, ctx, emitter)\n return\n }\n }\n\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n} as TagImplOptions\n","import { Emitter, Context } from '../../types'\n\nexport default {\n render: function (ctx: Context, emitter: Emitter) {\n emitter['break'] = true\n }\n}\n","import { Emitter, Context } from '../../types'\n\nexport default {\n render: function (ctx: Context, emitter: Emitter) {\n emitter['continue'] = true\n }\n}\n","import { Value } from '../../template/value'\nimport { Emitter } from '../../emitters/emitter'\nimport { TagImplOptions, TagToken, Context } from '../../types'\n\nexport default {\n parse: function (token: TagToken) {\n this.value = new Value(token.args, this.liquid)\n },\n render: function * (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n const val = yield this.value.value(ctx, false)\n emitter.write(val)\n }\n} as TagImplOptions\n","import { Emitter } from '../../emitters/emitter'\nimport { TagImplOptions, TagToken, Context } from '../../types'\nimport { Tokenizer } from '../../parser/tokenizer'\n\nexport default {\n parse: function (token: TagToken) {\n const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)\n const tokens = tokenizer.readLiquidTagTokens(this.liquid.options)\n this.tpls = this.liquid.parser.parseTokens(tokens)\n },\n render: function * (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n yield this.liquid.renderer.renderTemplates(this.tpls, ctx, emitter)\n }\n} as TagImplOptions\n","import { stringify } from '../../util/underscore'\n\nconst escapeMap = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&#34;',\n \"'\": '&#39;'\n}\nconst unescapeMap = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&#34;': '\"',\n '&#39;': \"'\"\n}\n\nexport function escape (str: string) {\n return stringify(str).replace(/&|<|>|\"|'/g, m => escapeMap[m])\n}\n\nfunction unescape (str: string) {\n return String(str).replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m])\n}\n\nexport function escapeOnce (str: string) {\n return escape(unescape(str))\n}\n\nexport function newlineToBr (v: string) {\n return v.replace(/\\n/g, '<br />\\n')\n}\n\nexport function stripHtml (v: string) {\n return v.replace(/<script.*?<\\/script>|<!--.*?-->|<style.*?<\\/style>|<.*?>/g, '')\n}\n","import { caseInsensitiveCompare } from '../../util/underscore'\n\nexport const abs = Math.abs\nexport const atLeast = Math.max\nexport const atMost = Math.min\nexport const ceil = Math.ceil\nexport const dividedBy = (v: number, arg: number) => v / arg\nexport const floor = Math.floor\nexport const minus = (v: number, arg: number) => v - arg\nexport const modulo = (v: number, arg: number) => v % arg\nexport const times = (v: number, arg: number) => v * arg\n\nexport function round (v: number, arg = 0) {\n const amp = Math.pow(10, arg)\n return Math.round(v * amp) / amp\n}\n\nexport function plus (v: number, arg: number) {\n return Number(v) + Number(arg)\n}\n\nexport function sortNatural (input: any[], property?: string) {\n if (!input || !input.sort) return []\n if (property !== undefined) {\n return [...input].sort(\n (lhs, rhs) => caseInsensitiveCompare(lhs[property], rhs[property])\n )\n }\n return [...input].sort(caseInsensitiveCompare)\n}\n","import { changeCase, padStart, padEnd } from './underscore'\nimport { LiquidDate } from './liquid-date'\n\nconst rFormat = /%([-_0^#:]+)?(\\d+)?([EO])?(.)/\nconst monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'\n]\nconst dayNames = [\n 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'\n]\nconst monthNamesShort = monthNames.map(abbr)\nconst dayNamesShort = dayNames.map(abbr)\nconst suffixes = {\n 1: 'st',\n 2: 'nd',\n 3: 'rd',\n 'default': 'th'\n}\ninterface FormatOptions {\n flags: object;\n width?: string;\n modifier?: string;\n}\n\nfunction abbr (str: string) {\n return str.slice(0, 3)\n}\n\n// prototype extensions\nfunction daysInMonth (d: LiquidDate) {\n const feb = isLeapYear(d) ? 29 : 28\n return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n}\nfunction getDayOfYear (d: LiquidDate) {\n let num = 0\n for (let i = 0; i < d.getMonth(); ++i) {\n num += daysInMonth(d)[i]\n }\n return num + d.getDate()\n}\nfunction getWeekOfYear (d: LiquidDate, startDay: number) {\n // Skip to startDay of this week\n const now = getDayOfYear(d) + (startDay - d.getDay())\n // Find the first startDay of the year\n const jan1 = new Date(d.getFullYear(), 0, 1)\n const then = (7 - jan1.getDay() + startDay)\n return String(Math.floor((now - then) / 7) + 1)\n}\nfunction isLeapYear (d: LiquidDate) {\n const year = d.getFullYear()\n return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)))\n}\nfunction getSuffix (d: LiquidDate) {\n const str = d.getDate().toString()\n const index = parseInt(str.slice(-1))\n return suffixes[index] || suffixes['default']\n}\nfunction century (d: LiquidDate) {\n return parseInt(d.getFullYear().toString().substring(0, 2), 10)\n}\n\n// default to 0\nconst padWidths = {\n d: 2,\n e: 2,\n H: 2,\n I: 2,\n j: 3,\n k: 2,\n l: 2,\n L: 3,\n m: 2,\n M: 2,\n S: 2,\n U: 2,\n W: 2\n}\n\n// default to '0'\nconst padChars = {\n a: ' ',\n A: ' ',\n b: ' ',\n B: ' ',\n c: ' ',\n e: ' ',\n k: ' ',\n l: ' ',\n p: ' ',\n P: ' '\n}\nconst formatCodes = {\n a: (d: LiquidDate) => dayNamesShort[d.getDay()],\n A: (d: LiquidDate) => dayNames[d.getDay()],\n b: (d: LiquidDate) => monthNamesShort[d.getMonth()],\n B: (d: LiquidDate) => monthNames[d.getMonth()],\n c: (d: LiquidDate) => d.toLocaleString(),\n C: (d: LiquidDate) => century(d),\n d: (d: LiquidDate) => d.getDate(),\n e: (d: LiquidDate) => d.getDate(),\n H: (d: LiquidDate) => d.getHours(),\n I: (d: LiquidDate) => String(d.getHours() % 12 || 12),\n j: (d: LiquidDate) => getDayOfYear(d),\n k: (d: LiquidDate) => d.getHours(),\n l: (d: LiquidDate) => String(d.getHours() % 12 || 12),\n L: (d: LiquidDate) => d.getMilliseconds(),\n m: (d: LiquidDate) => d.getMonth() + 1,\n M: (d: LiquidDate) => d.getMinutes(),\n N: (d: LiquidDate, opts: FormatOptions) => {\n const width = Number(opts.width) || 9\n const str = String(d.getMilliseconds()).substr(0, width)\n return padEnd(str, width, '0')\n },\n p: (d: LiquidDate) => (d.getHours() < 12 ? 'AM' : 'PM'),\n P: (d: LiquidDate) => (d.getHours() < 12 ? 'am' : 'pm'),\n q: (d: LiquidDate) => getSuffix(d),\n s: (d: LiquidDate) => Math.round(d.getTime() / 1000),\n S: (d: LiquidDate) => d.getSeconds(),\n u: (d: LiquidDate) => d.getDay() || 7,\n U: (d: LiquidDate) => getWeekOfYear(d, 0),\n w: (d: LiquidDate) => d.getDay(),\n W: (d: LiquidDate) => getWeekOfYear(d, 1),\n x: (d: LiquidDate) => d.toLocaleDateString(),\n X: (d: LiquidDate) => d.toLocaleTimeString(),\n y: (d: LiquidDate) => d.getFullYear().toString().substring(2, 4),\n Y: (d: LiquidDate) => d.getFullYear(),\n z: (d: LiquidDate, opts: FormatOptions) => {\n const nOffset = Math.abs(d.getTimezoneOffset())\n const h = Math.floor(nOffset / 60)\n const m = nOffset % 60\n return (d.getTimezoneOffset() > 0 ? '-' : '+') +\n padStart(h, 2, '0') +\n (opts.flags[':'] ? ':' : '') +\n padStart(m, 2, '0')\n },\n 't': () => '\\t',\n 'n': () => '\\n',\n '%': () => '%'\n};\n(formatCodes as any).h = formatCodes.b\n\nexport default function (d: LiquidDate, formatStr: string) {\n let output = ''\n let remaining = formatStr\n let match\n while ((match = rFormat.exec(remaining))) {\n output += remaining.slice(0, match.index)\n remaining = remaining.slice(match.index + match[0].length)\n output += format(d, match)\n }\n return output + remaining\n}\n\nfunction format (d: LiquidDate, match: RegExpExecArray) {\n const [input, flagStr = '', width, modifier, conversion] = match\n const convert = formatCodes[conversion]\n if (!convert) return input\n const flags = {}\n for (const flag of flagStr) flags[flag] = true\n let ret = String(convert(d, { flags, width, modifier }))\n let padChar = padChars[conversion] || '0'\n let padWidth = width || padWidths[conversion] || 0\n if (flags['^']) ret = ret.toUpperCase()\n else if (flags['#']) ret = changeCase(ret)\n if (flags['_']) padChar = ' '\n else if (flags['0']) padChar = '0'\n if (flags['-']) padWidth = 0\n return padStart(ret, padWidth, padChar)\n}\n","import { LiquidDate } from './liquid-date'\n\n// one minute in milliseconds\nconst OneMinute = 60000\nconst hostTimezoneOffset = new Date().getTimezoneOffset()\nconst ISO8601_TIMEZONE_PATTERN = /([zZ]|([+-])(\\d{2}):(\\d{2}))$/\n\n/**\n * A date implementation with timezone info, just like Ruby date\n *\n * Implementation:\n * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods\n * - rewrite getTimezoneOffset() to trick strftime\n */\nexport class TimezoneDate implements LiquidDate {\n private timezoneOffset: number\n private date: Date\n constructor (init: string | number | Date | TimezoneDate, timezoneOffset: number) {\n if (init instanceof TimezoneDate) {\n this.date = init.date\n timezoneOffset = init.timezoneOffset\n } else {\n const diff = (hostTimezoneOffset - timezoneOffset) * OneMinute\n const time = new Date(init).getTime() + diff\n this.date = new Date(time)\n }\n this.timezoneOffset = timezoneOffset\n }\n\n getTime () {\n return this.date.getTime()\n }\n\n getMilliseconds () {\n return this.date.getMilliseconds()\n }\n getSeconds () {\n return this.date.getSeconds()\n }\n getMinutes () {\n return this.date.getMinutes()\n }\n getHours () {\n return this.date.getHours()\n }\n getDay () {\n return this.date.getDay()\n }\n getDate () {\n return this.date.getDate()\n }\n getMonth () {\n return this.date.getMonth()\n }\n getFullYear () {\n return this.date.getFullYear()\n }\n toLocaleTimeString (locale?: string) {\n return this.date.toLocaleTimeString(locale)\n }\n toLocaleDateString (locale?: string) {\n return this.date.toLocaleDateString(locale)\n }\n getTimezoneOffset () {\n return this.timezoneOffset!\n }\n\n /**\n * Create a Date object fixed to it's declared Timezone. Both\n * - 2021-08-06T02:29:00.000Z and\n * - 2021-08-06T02:29:00.000+08:00\n * will always be displayed as\n * - 2021-08-06 02:29:00\n * regardless timezoneOffset in JavaScript realm\n *\n * The implementation hack:\n * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`,\n * we create a different Date to trick strftime, it's both simpler and more performant.\n * Given that a template is expected to be parsed fewer times than rendered.\n */\n static createDateFixedToTimezone (dateString: string): LiquidDate {\n const m = dateString.match(ISO8601_TIMEZONE_PATTERN)\n // representing a UTC timestamp\n if (m && m[1] === 'Z') {\n return new TimezoneDate(+new Date(dateString), 0)\n }\n // has a timezone specified\n if (m && m[2] && m[3] && m[4]) {\n const [, , sign, hours, minutes] = m\n const delta = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10))\n return new TimezoneDate(+new Date(dateString), delta)\n }\n return new Date(dateString)\n }\n}\n","export const urlDecode = (x: string) => x.split('+').map(decodeURIComponent).join(' ')\nexport const urlEncode = (x: string) => x.split(' ').map(encodeURIComponent).join('+')\n","import { isArray, isNil, last as arrayLast } from '../../util/underscore'\nimport { toArray } from '../../util/collection'\nimport { isTruthy } from '../../render/boolean'\nimport { FilterImpl } from '../../template/filter/filter-impl'\nimport { Scope } from '../../context/scope'\n\nexport const join = (v: any[], arg: string) => v.join(arg === undefined ? ' ' : arg)\nexport const last = (v: any) => isArray(v) ? arrayLast(v) : ''\nexport const first = (v: any) => isArray(v) ? v[0] : ''\nexport const reverse = (v: any[]) => [...v].reverse()\n\nexport function sort<T> (this: FilterImpl, arr: T[], property?: string) {\n const getValue = (obj: Scope) => property ? this.context.getFromScope(obj, property.split('.')) : obj\n return toArray(arr).sort((lhs, rhs) => {\n lhs = getValue(lhs)\n rhs = getValue(rhs)\n return lhs < rhs ? -1 : (lhs > rhs ? 1 : 0)\n })\n}\n\nexport const size = (v: string | any[]) => (v && v.length) || 0\n\nexport function map (this: FilterImpl, arr: Scope[], property: string) {\n return toArray(arr).map(obj => this.context.getFromScope(obj, property.split('.')))\n}\n\nexport function compact<T> (this: FilterImpl, arr: T[]) {\n return toArray(arr).filter(x => !isNil(x))\n}\n\nexport function concat<T1, T2> (v: T1[], arg: T2[] | T2): (T1 | T2)[] {\n return toArray(v).concat(arg)\n}\n\nexport function slice<T> (v: T[], begin: number, length = 1): T[] {\n begin = begin < 0 ? v.length + begin : begin\n return v.slice(begin, begin + length)\n}\n\nexport function where<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): T[] {\n return toArray(arr).filter(obj => {\n const value = this.context.getFromScope(obj, String(property).split('.'))\n return expected === undefined ? isTruthy(value, this.context) : value === expected\n })\n}\n\nexport function uniq<T> (arr: T[]): T[] {\n const u = {}\n return (arr || []).filter(val => {\n if (u.hasOwnProperty(String(val))) return false\n u[String(val)] = true\n return true\n })\n}\n","import strftime from '../../util/strftime'\nimport { LiquidDate } from '../../util/liquid-date'\nimport { isString, isNumber } from '../../util/underscore'\nimport { FilterImpl } from '../../template/filter/filter-impl'\nimport { TimezoneDate } from '../../util/timezone-date'\n\nexport function date (this: FilterImpl, v: string | Date, arg: string) {\n const opts = this.context.opts\n let date: LiquidDate\n if (v === 'now' || v === 'today') {\n date = new Date()\n } else if (isNumber(v)) {\n date = new Date(v * 1000)\n } else if (isString(v)) {\n if (/^\\d+$/.test(v)) {\n date = new Date(+v * 1000)\n } else if (opts.preserveTimezones) {\n date = TimezoneDate.createDateFixedToTimezone(v)\n } else {\n date = new Date(v)\n }\n } else {\n date = v\n }\n if (!isValidDate(date)) return v\n if (opts.hasOwnProperty('timezoneOffset')) {\n date = new TimezoneDate(date, opts.timezoneOffset!)\n }\n return strftime(date, arg)\n}\n\nfunction isValidDate (date: any): date is Date {\n return (date instanceof Date || date instanceof TimezoneDate) && !isNaN(date.getTime())\n}\n","import { isFalsy } from '../../render/boolean'\nimport { isArray, isString, toValue } from '../../util/underscore'\nimport { FilterImpl } from '../../template/filter/filter-impl'\n\nexport function Default<T1 extends boolean, T2> (this: FilterImpl, value: T1, defaultValue: T2, ...args: Array<[string, any]>): T1 | T2 {\n if (isArray(value) || isString(value)) return value.length ? value : defaultValue\n value = toValue(value)\n if (value === false && (new Map(args)).get('allow_false')) return false as T1\n return isFalsy(value, this.context) ? defaultValue : value\n}\n\nexport function json (value: any) {\n return JSON.stringify(value)\n}\n","/**\n * String related filters\n *\n * * prefer stringify() to String() since `undefined`, `null` should eval ''\n */\nimport { stringify } from '../../util/underscore'\nimport { assert } from '../../util/assert'\n\nexport function append (v: string, arg: string) {\n assert(arguments.length === 2, 'append expect 2 arguments')\n return stringify(v) + stringify(arg)\n}\n\nexport function prepend (v: string, arg: string) {\n assert(arguments.length === 2, 'prepend expect 2 arguments')\n return stringify(arg) + stringify(v)\n}\n\nexport function lstrip (v: string) {\n return stringify(v).replace(/^\\s+/, '')\n}\n\nexport function downcase (v: string) {\n return stringify(v).toLowerCase()\n}\n\nexport function upcase (str: string) {\n return stringify(str).toUpperCase()\n}\n\nexport function remove (v: string, arg: string) {\n return stringify(v).split(String(arg)).join('')\n}\n\nexport function removeFirst (v: string, l: string) {\n return stringify(v).replace(String(l), '')\n}\n\nexport function rstrip (str: string) {\n return stringify(str).replace(/\\s+$/, '')\n}\n\nexport function split (v: string, arg: string) {\n return stringify(v).split(String(arg))\n}\n\nexport function strip (v: string) {\n return stringify(v).trim()\n}\n\nexport function stripNewlines (v: string) {\n return stringify(v).replace(/\\n/g, '')\n}\n\nexport function capitalize (str: string) {\n str = stringify(str)\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\nexport function replace (v: string, pattern: string, replacement: string) {\n return stringify(v).split(String(pattern)).join(replacement)\n}\n\nexport function replaceFirst (v: string, arg1: string, arg2: string) {\n return stringify(v).replace(String(arg1), arg2)\n}\n\nexport function truncate (v: string, l = 50, o = '...') {\n v = stringify(v)\n if (v.length <= l) return v\n return v.substr(0, l - o.length) + o\n}\n\nexport function truncatewords (v: string, l = 15, o = '...') {\n const arr = v.split(/\\s+/)\n let ret = arr.slice(0, l).join(' ')\n if (arr.length >= l) ret += o\n return ret\n}\n","import { TagImplOptions } from './tag-impl-options'\nimport { assert } from '../../util/assert'\n\nexport class TagMap {\n private impls: {[key: string]: TagImplOptions} = {}\n\n get (name: string) {\n const impl = this.impls[name]\n assert(impl, () => `tag \"${name}\" not found`)\n return impl\n }\n\n set (name: string, impl: TagImplOptions) {\n this.impls[name] = impl\n }\n}\n","import { FilterImplOptions } from './filter-impl-options'\nimport { Filter } from './filter'\nimport { FilterArg } from '../../parser/filter-arg'\nimport { assert } from '../../util/assert'\nimport { Liquid } from '../../liquid'\n\nexport class FilterMap {\n private impls: {[key: string]: FilterImplOptions} = {}\n\n constructor (\n private readonly strictFilters: boolean,\n private readonly liquid: Liquid\n ) {}\n\n get (name: string) {\n const impl = this.impls[name]\n assert(impl || !this.strictFilters, () => `undefined filter: ${name}`)\n return impl\n }\n\n set (name: string, impl: FilterImplOptions) {\n this.impls[name] = impl\n }\n\n create (name: string, args: FilterArg[]) {\n return new Filter(name, this.get(name), args, this.liquid)\n }\n}\n","import { Context } from './context/context'\nimport { forOwn, snakeCase } from './util/underscore'\nimport { Template } from './template/template'\nimport { LookupType } from './fs/loader'\nimport { Render } from './render/render'\nimport Parser from './parser/parser'\nimport { TagImplOptions } from './template/tag/tag-impl-options'\nimport { Value } from './template/value'\nimport builtinTags from './builtin/tags'\nimport * as builtinFilters from './builtin/filters'\nimport { TagMap } from './template/tag/tag-map'\nimport { FilterMap } from './template/filter/filter-map'\nimport { LiquidOptions, normalizeDirectoryList, NormalizedFullOptions, normalize, RenderOptions } from './liquid-options'\nimport { FilterImplOptions } from './template/filter/filter-impl-options'\nimport { toPromise, toValue } from './util/async'\n\nexport * from './util/error'\nexport * from './types'\nexport const version = '[VI]{version}[/VI]'\n\nexport class Liquid {\n public readonly options: NormalizedFullOptions\n public readonly renderer: Render\n public readonly parser: Parser\n public readonly filters: FilterMap\n public readonly tags: TagMap\n\n public constructor (opts: LiquidOptions = {}) {\n this.options = normalize(opts)\n this.parser = new Parser(this)\n this.renderer = new Render()\n this.filters = new FilterMap(this.options.strictFilters, this)\n this.tags = new TagMap()\n\n forOwn(builtinTags, (conf: TagImplOptions, name: string) => this.registerTag(snakeCase(name), conf))\n forOwn(builtinFilters, (handler: FilterImplOptions, name: string) => this.registerFilter(snakeCase(name), handler))\n }\n public parse (html: string, filepath?: string): Template[] {\n return this.parser.parse(html, filepath)\n }\n\n public _render (tpl: Template[], scope: object | undefined, renderOptions: RenderOptions): IterableIterator<any> {\n const ctx = new Context(scope, this.options, renderOptions)\n return this.renderer.renderTemplates(tpl, ctx)\n }\n public async render (tpl: Template[], scope?: object, renderOptions?: RenderOptions): Promise<any> {\n return toPromise(this._render(tpl, scope, { ...renderOptions, sync: false }))\n }\n public renderSync (tpl: Template[], scope?: object, renderOptions?: RenderOptions): any {\n return toValue(this._render(tpl, scope, { ...renderOptions, sync: true }))\n }\n public renderToNodeStream (tpl: Template[], scope?: object, renderOptions: RenderOptions = {}): NodeJS.ReadableStream {\n const ctx = new Context(scope, this.options, renderOptions)\n return this.renderer.renderTemplatesToNodeStream(tpl, ctx)\n }\n\n public _parseAndRender (html: string, scope: object | undefined, renderOptions: RenderOptions): IterableIterator<any> {\n const tpl = this.parse(html)\n return this._render(tpl, scope, renderOptions)\n }\n public async parseAndRender (html: string, scope?: object, renderOptions?: RenderOptions): Promise<any> {\n return toPromise(this._parseAndRender(html, scope, { ...renderOptions, sync: false }))\n }\n public parseAndRenderSync (html: string, scope?: object, renderOptions?: RenderOptions): any {\n return toValue(this._parseAndRender(html, scope, { ...renderOptions, sync: true }))\n }\n\n public _parsePartialFile (file: string, sync?: boolean, currentFile?: string) {\n return this.parser.parseFile(file, sync, LookupType.Partials, currentFile)\n }\n public _parseLayoutFile (file: string, sync?: boolean, currentFile?: string) {\n return this.parser.parseFile(file, sync, LookupType.Layouts, currentFile)\n }\n public async parseFile (file: string): Promise<Template[]> {\n return toPromise<Template[]>(this.parser.parseFile(file, false))\n }\n public parseFileSync (file: string): Template[] {\n return toValue<Template[]>(this.parser.parseFile(file, true))\n }\n public async renderFile (file: string, ctx?: object, renderOptions?: RenderOptions) {\n const templates = await this.parseFile(file)\n return this.render(templates, ctx, renderOptions)\n }\n public renderFileSync (file: string, ctx?: object, renderOptions?: RenderOptions) {\n const templates = this.parseFileSync(file)\n return this.renderSync(templates, ctx, renderOptions)\n }\n public async renderFileToNodeStream (file: string, scope?: object, renderOptions?: RenderOptions) {\n const templates = await this.parseFile(file)\n return this.renderToNodeStream(templates, scope, renderOptions)\n }\n\n public _evalValue (str: string, ctx: Context): IterableIterator<any> {\n const value = new Value(str, this)\n return value.value(ctx, false)\n }\n public async evalValue (str: string, ctx: Context): Promise<any> {\n return toPromise(this._evalValue(str, ctx))\n }\n public evalValueSync (str: string, ctx: Context): any {\n return toValue(this._evalValue(str, ctx))\n }\n\n public registerFilter (name: string, filter: FilterImplOptions) {\n this.filters.set(name, filter)\n }\n public registerTag (name: string, tag: TagImplOptions) {\n this.tags.set(name, tag)\n }\n public plugin (plugin: (this: Liquid, L: typeof Liquid) => void) {\n return plugin.call(this, Liquid)\n }\n public express () {\n const self = this // eslint-disable-line\n let firstCall = true\n\n return function (this: any, filePath: string, ctx: object, callback: (err: Error | null, rendered: string) => void) {\n if (firstCall) {\n firstCall = false\n const dirs = normalizeDirectoryList(this.root)\n self.options.root.unshift(...dirs)\n self.options.layouts.unshift(...dirs)\n self.options.partials.unshift(...dirs)\n }\n self.renderFile(filePath, ctx).then(html => callback(null, html) as any, callback as any)\n }\n }\n}\n"],"names":["Drop","key","toStr","Object","prototype","toString","toLowerCase","String","isString","value","isFunction","stringify","toValue","isNil","valueOf","isNumber","isArray","call","forOwn","obj","iteratee","k","hasOwnProperty","last","arr","length","isObject","type","range","start","stop","step","i","push","padStart","str","ch","pad","add","n","identify","val","snakeCase","replace","_","a","b","caseInsensitiveCompare","next","prev","this","LRU","cache","node","Node","head","size","ensureLimit","remove","write","tail","limit","domResolve","root","path","base","document","createElement","href","getElementsByTagName","insertBefore","firstChild","resolved","removeChild","filepath","ext","origin","split","pop","test","url","Promise","resolve","reject","xhr","XMLHttpRequest","onload","status","responseText","Error","statusText","onerror","open","send","isComparable","arg","equals","isTruthy","ctx","isFalsy","opts","jsTruthy","defaultOperators","==","l","r","!=",">","gt","lt","<",">=","geq","leq","<=","contains","indexOf","and","or","TYPES","IDENTIFIER","BLANK","INLINE_BLANK","createTrie","operators","trie","_b","__values","entries","_d","__read","name_1","handler","c","charCodeAt","needBoundary","end","defaultOptions","layouts","partials","relativeReference","jekyllInclude","undefined","extname","fs","dynamicPartials","trimTagRight","trimTagLeft","trimOutputRight","trimOutputLeft","greedy","tagDelimiterLeft","tagDelimiterRight","outputDelimiterLeft","outputDelimiterRight","preserveTimezones","strictFilters","strictVariables","lenientIf","globals","keepOutputType","operatorsTrie","normalizeDirectoryList","list","_.isArray","_.isString","__extends","LiquidError","err","originalError","context","token","line","getPosition","lines","input","begin","Math","max","min","_\r\n .range","map","lineNumber","indicator","num","_.padStart","text","join","mkContext","message","msg","file","_a","col","mkMessage","stack","_super","_this","name","update","RenderError","tpl","variableName","LookupType","Context","registers","_i","keys","getRegister","keyValues","forEach","setRegister","__spreadArray","environments","scopes","reduce","__assign","paths","scope","findScope","getFromScope","toLiquid","liquidMethodMissing","readSize","readFirst","readLast","readProperty","InternalUndefinedVariableError","candidate","env","renderOptions","sync","assert","predicate","AssertionError","Loader","currentFile","options","dirs","candidates","Root","_c","existsSync","exists","_e","lookupError","enforceRoot","shouldLoadRelative","referenced","dirname","dirs_1","dir","dirs_2","fallback","roots","code","sep","rRelativePath_1","RegExp","prefix","escapeRegex","referencedFile","SimpleEmitter","html","buffer","createResolvedThenable","ret","then","catch","createRejectedThenable","toThenable","isThenable","throw","return","isAsyncIterator","state","done","e","toPromise","x","KeepingTypeEmitter","TokenKind","Render","templates","emitter","StreamedEmitter","renderTemplates","error","stream","templates_1","render","is","e_1","isDelimitedToken","getKind","Delimited","isOperatorToken","Operator","isHTMLToken","HTML","isOutputToken","Output","isTagToken","Tag","isQuotedToken","Quoted","isLiteralToken","Literal","isNumberToken","Number","isPropertyAccessToken","PropertyAccess","isWordToken","Word","isRangeToken","Range","kind","ParseStream","cb","handlers","event","h","trigger","stopRequested","tokens","shift","template","parseToken","NullDrop","EmptyDrop","BlankDrop","nil","literalValues","true","false","null","empty","blank","rHex","rOct","escapeChar","f","t","v","hexVal","parseStringLiteral","j","fromCharCode","Expression","lenient","operands","postfix","TypeGuards.isOperatorToken","_f","result","lhs","rhs","impl","operator","evalOperatorToken","evalToken","ops","tokens_1","getPrecedence","toPostfix","TypeGuards.isPropertyAccessToken","props","prop","get","propertyName","UndefinedVariableError","evalPropertyAccessToken","TypeGuards.isRangeToken","low","high","evalRangeToken","TypeGuards.isLiteralToken","literal","evalLiteralToken","TypeGuards.isNumberToken","whole","content","decimal","evalNumberToken","TypeGuards.isWordToken","getText","TypeGuards.isQuotedToken","evalQuotedToken","Token","slice","row","trimLeft","trimRight","tl","tr","trim","mask","charAt","IdentifierToken","allowSign","precedence","OperatorToken","variable","args","Filter","Hash","HTMLToken","DelimitedToken","tokenizer","Tokenizer","readIdentifier","TokenizationError","skipBlank","remaining","readExpressionTokens","operand","readValue","p","N","readOperator","operand_1","info","matchOperator","filters","filter","readFilter","peek","snapshot","readFilterArg","FilterToken","readTopLevelToken","inRaw","whiteSpaceCtrl","rawBeginAt","readEndrawOrRawContent","match","readTagToken","readOutputToken","readHTMLToken","stopStrings","some","readToDelimiter","mkError","TagToken","delimiter","peekType","readQuoted","rmatch","OutputToken","leftPos","readTo","readLiquidTagToken","LiquidTagToken","JSON","substr","ellipsis","console","warn","jekyllStyle","hashes","hash","readHash","HashToken","readRange","PropertyAccessToken","LiteralToken","NumberToken","readValueOrThrow","RangeToken","escaped","QuotedToken","htmlStopStrings","htmlStopStringSet","Set","has","word","pattern","_g","markup","readHashes","argv","apply","liquid","Value","initial","evaluate","readExpression","readFilters","TemplateImpl","tags","create","parse","getContent","Parser","readTopLevelTokens","parseTokens","remainTokens","ParseError","loader","read","tpls","task","_parseFile","lookup","readFileSync","readFile","parseFile","_parseFileCached","advance","bottom","_evalValue","toEnumerable","toArray","ForloopDrop","collection","MODIFIERS","inStr","elseTemplates","parser","parseStream","on","renderer","continueKey","continue","modifiers","orderedFilterParameters","includes","modifier","count","offset","reverse","reversed","forloop","collection_1","item","tagToken","quoted","readVariableName","BlockMode","cond","cases","branch","parseFilePath","renderFilePath","keyword","beforeAs","alias","childCtx","_parsePartialFile","TypeError","optimize","readFileNameTemplate","TypeGuards.isHTMLToken","Array","withVar","saved","saveRegister","OUTPUT","include","restoreRegister","group","fingerprint","groups","idx","branches","_parseLayoutFile","STORE","blocks","parent","BlockDrop","superBlockRender","exec","block","blockRender","getBlockRender","renderCurrent","superBlock","renderChild","TablerowloopDrop","floor","cols","col0","assign","for","For","capture","case","Case","comment","decrement","increment","cycle","if","If","layout","raw","tablerow","tmp","tablerowloop","unless","test_1","break","echo","readLiquidTagTokens","escapeMap","&","\"","'","unescapeMap","&amp;","&lt;","&gt;","&#34;","&#39;","escape","m","abs","atLeast","atMost","ceil","rFormat","monthNames","dayNames","monthNamesShort","abbr","dayNamesShort","suffixes","1","2","3","default","getDayOfYear","d","getMonth","year","getFullYear","isLeapYear","getDate","getWeekOfYear","startDay","now","getDay","Date","padWidths","H","I","L","M","S","U","W","padChars","A","B","P","formatCodes","toLocaleString","C","parseInt","substring","century","getHours","getMilliseconds","getMinutes","width","padEnd","q","index","getSuffix","s","round","getTime","getSeconds","u","w","toLocaleDateString","X","toLocaleTimeString","y","Y","z","nOffset","getTimezoneOffset","flags","%","format","flagStr","conversion","convert","flagStr_1","padChar","padWidth","toUpperCase","changeCase","hostTimezoneOffset","ISO8601_TIMEZONE_PATTERN","TimezoneDate","date","locale","timezoneOffset","dateString","sign","hours","minutes","delta","init","diff","time","unescape","amp","pow","property","sort","decodeURIComponent","encodeURIComponent","arrayLast","getValue","concat","expected","isNaN","isValidDate","createDateFixedToTimezone","formatStr","output","strftime","defaultValue","Map","arguments","replacement","arg1","arg2","o","TagMap","impls","FilterMap","Liquid","_render","renderTemplatesToNodeStream","_parseAndRender","Partials","Layouts","parseFileSync","renderSync","renderToNodeStream","set","tag","plugin","self","firstCall","filePath","callback","unshift","renderFile","normalize","builtinTags","conf","registerTag","builtinFilters","registerFilter"],"mappings":"89FACSA,oBAAP,aAIOA,gCAAP,SAA4BC,QAL9B,cCEA,IAAMC,EAAQC,OAAOC,UAAUC,SACzBC,EAAcC,OAAOH,UAAUE,qBAErBE,EAAUC,GACxB,MAAwB,iBAAVA,WAIAC,EAAYD,GAC1B,MAAwB,mBAAVA,WAmBAE,EAAWF,GAEzB,OAAID,EADJC,EAAQG,EAAQH,IACYA,EACxBI,EAAMJ,GAAe,GAClBF,OAAOE,YAGAG,EAASH,GACvB,OAAOA,aAAiBT,EAAOS,EAAMK,UAAYL,WAGnCM,EAAUN,GACxB,MAAwB,iBAAVA,WAQAI,EAAOJ,GACrB,OAAgB,MAATA,WAGOO,EAASP,GAEvB,MAA6B,mBAAtBP,EAAMe,KAAKR,YAWJS,EACdC,EACAC,GAGA,IAAK,IAAMC,KADXF,EAAMA,GAAO,GAEX,GAAIhB,OAAOmB,eAAeL,KAAKE,EAAKE,KACD,IAA7BD,EAASD,EAAIE,GAAIA,EAAGF,GAAgB,MAG5C,OAAOA,WAKOI,EAAMC,GACpB,OAAOA,EAAIA,EAAIC,OAAS,YASVC,EAAUjB,GACxB,IAAMkB,SAAclB,EACpB,OAAiB,OAAVA,IAA4B,UAATkB,GAA8B,YAATA,YAGjCC,EAAOC,EAAeC,EAAcC,gBAAAA,KAElD,IADA,IAAMP,EAAgB,GACbQ,EAAIH,EAAOG,EAAIF,EAAME,GAAKD,EACjCP,EAAIS,KAAKD,GAEX,OAAOR,WAGOU,EAAUC,EAAUV,EAAgBW,GAClD,oBADkDA,OAC3CC,EAAIF,EAAKV,EAAQW,EAAI,SAACD,EAAKC,GAAO,OAAAA,EAAKD,aAOhCE,EAAKF,EAAUV,EAAgBW,EAAYE,GAGzD,IADA,IAAIC,EAAId,GADRU,EAAM5B,OAAO4B,IACQV,OACR,EAANc,KAASJ,EAAMG,EAAIH,EAAKC,GAC/B,OAAOD,WAGOK,EAAaC,GAC3B,OAAOA,WAGOC,EAAWP,GACzB,OAAOA,EAAIQ,QACT,gBACA,SAACC,EAAGC,EAAGC,GAAM,OAACD,EAAIA,EAAI,IAAM,IAAMC,EAAExC,yBAcxByC,EAAwBF,EAAQC,GAC9C,OAAS,MAALD,GAAkB,MAALC,EAAkB,EAC1B,MAALD,EAAkB,EACb,MAALC,GAAmB,GACvBD,EAAIvC,EAAYW,KAAK4B,KACrBC,EAAIxC,EAAYW,KAAK6B,KACF,EACXA,EAAJD,EAAc,EACX,ECnJT,MACE,SACS5C,EACAQ,EACAuC,EACAC,GAHAC,SAAAjD,EACAiD,WAAAzC,EACAyC,UAAAF,EACAE,UAAAD,MAmBTE,kBAAA,SAAOlD,EAAaQ,GAClB,GAAIyC,KAAKE,MAAMnD,GACbiD,KAAKE,MAAMnD,GAAKQ,MAAQA,MACnB,CACL,IAAM4C,EAAO,IAAIC,EAAKrD,EAAKQ,EAAOyC,KAAKK,KAAKP,KAAME,KAAKK,MACvDL,KAAKK,KAAKP,KAAKC,KAAOI,EACtBH,KAAKK,KAAKP,KAAOK,EAEjBH,KAAKE,MAAMnD,GAAOoD,EAClBH,KAAKM,OACLN,KAAKO,gBAITN,iBAAA,SAAMlD,GACJ,GAAKiD,KAAKE,MAAMnD,GAAhB,CACQ,IAAAQ,EAAUyC,KAAKE,MAAMnD,SAG7B,OAFAiD,KAAKQ,OAAOzD,GACZiD,KAAKS,MAAM1D,EAAKQ,GACTA,IAGT0C,mBAAA,SAAQlD,GACN,IAAMoD,EAAOH,KAAKE,MAAMnD,GACxBoD,EAAKJ,KAAKD,KAAOK,EAAKL,KACtBK,EAAKL,KAAKC,KAAOI,EAAKJ,YACfC,KAAKE,MAAMnD,GAClBiD,KAAKM,QAGPL,kBAAA,WACED,KAAKK,KAAKP,KAAOE,KAAKU,KACtBV,KAAKU,KAAKX,KAAOC,KAAKK,KACtBL,KAAKM,KAAO,EACZN,KAAKE,MAAQ,IAGPD,wBAAR,WACMD,KAAKM,KAAON,KAAKW,OAAOX,KAAKQ,OAAOR,KAAKU,KAAKX,KAAKhD,SAhDzD,WACS4D,EACAL,gBAAAA,KADAN,WAAAW,EACAX,UAAAM,EANDN,WAAoC,GAQ1CA,KAAKK,KAAO,IAAID,EAAQ,OAAQ,KAAa,KAAa,MAC1DJ,KAAKU,KAAO,IAAIN,EAAQ,OAAQ,KAAa,KAAa,MAC1DJ,KAAKK,KAAKP,KAAOE,KAAKU,KACtBV,KAAKU,KAAKX,KAAOC,KAAKK,KCrB1B,SAASO,EAAYC,EAAcC,GACjC,IAAMC,EAAOC,SAASC,cAAc,QACpCF,EAAKG,KAAOL,EAEZ,IAAMR,EAAOW,SAASG,qBAAqB,QAAQ,GACnDd,EAAKe,aAAaL,EAAMV,EAAKgB,YAE7B,IAAM1B,EAAIqB,SAASC,cAAc,KACjCtB,EAAEuB,KAAOJ,EACT,IAAMQ,EAAW3B,EAAEuB,KAGnB,OAFAb,EAAKkB,YAAYR,GAEVO,EAqDF,qDAlDkBT,EAAcW,EAAkBC,GAGvD,OAFIZ,EAAKtC,QAAyB,MAAfF,EAAKwC,KAAeA,GAAQ,KACnCD,EAAWC,EAAMW,GAClB/B,QAAQ,4BAA6B,SAACR,EAAKyC,EAAQZ,GAC5D,IAAMzC,EAAOyC,EAAKa,MAAM,KAAKC,MAC7B,MAAI,SAASC,KAAKxD,GAAcY,EACzByC,EAASZ,EAAOW,uBAIKK,oEAC9B,SAAO,IAAIC,QAAQ,SAACC,EAASC,GAC3B,IAAMC,EAAM,IAAIC,eAChBD,EAAIE,OAAS,WACO,KAAdF,EAAIG,QAAiBH,EAAIG,OAAS,IACpCL,EAAQE,EAAII,cAEZL,EAAO,IAAIM,MAAML,EAAIM,cAGzBN,EAAIO,QAAU,WACZR,EAAO,IAAIM,MAAM,sDAEnBL,EAAIQ,KAAK,MAAOZ,GAChBI,EAAIS,qCAIsBb,GAC5B,IAAMI,EAAM,IAAIC,eAGhB,GAFAD,EAAIQ,KAAK,MAAOZ,GAAK,GACrBI,EAAIS,OACAT,EAAIG,OAAS,KAAqB,KAAdH,EAAIG,OAC1B,MAAM,IAAIE,MAAML,EAAIM,YAEtB,OAAON,EAAII,8BAGiBd,oEAC5B,UAAO,4BAGmBA,GAC1B,OAAO,oBAGgBA,GACvB,OAAOZ,EAAWY,EAAU,UAGX,eCzDHoB,EAAcC,GAC5B,OAAOA,GAAOrF,EAAWqF,EAAIC,iBCTfC,EAAUxD,EAAUyD,GAClC,OAAQC,EAAQ1D,EAAKyD,YAGPC,EAAS1D,EAAUyD,GACjC,OAAIA,EAAIE,KAAKC,UACH5D,GAEO,IAARA,GAAAA,MAA+BA,MCD7B6D,EAA8B,CACzCC,KAAM,SAACC,EAAQC,GACb,OAAIX,EAAaU,GAAWA,EAAER,OAAOS,GACjCX,EAAaW,GAAWA,EAAET,OAAOQ,GAC9BA,IAAMC,GAEfC,KAAM,SAACF,EAAQC,GACb,OAAIX,EAAaU,IAAYA,EAAER,OAAOS,GAClCX,EAAaW,IAAYA,EAAET,OAAOQ,GAC/BA,IAAMC,GAEfE,IAAK,SAACH,EAAQC,GACZ,OAAIX,EAAaU,GAAWA,EAAEI,GAAGH,GAC7BX,EAAaW,GAAWA,EAAEI,GAAGL,GACtBC,EAAJD,GAETM,IAAK,SAACN,EAAQC,GACZ,OAAIX,EAAaU,GAAWA,EAAEK,GAAGJ,GAC7BX,EAAaW,GAAWA,EAAEG,GAAGJ,GAC1BA,EAAIC,GAEbM,KAAM,SAACP,EAAQC,GACb,OAAIX,EAAaU,GAAWA,EAAEQ,IAAIP,GAC9BX,EAAaW,GAAWA,EAAEQ,IAAIT,GACtBC,GAALD,GAETU,KAAM,SAACV,EAAQC,GACb,OAAIX,EAAaU,GAAWA,EAAES,IAAIR,GAC9BX,EAAaW,GAAWA,EAAEO,IAAIR,GAC3BA,GAAKC,GAEdU,SAAY,SAACX,EAAQC,GACnB,SAAOD,IAAK9F,EAAW8F,EAAEY,YAA2B,EAAhBZ,EAAEY,QAAQX,IAEhDY,IAAO,SAACb,EAAQC,EAAQP,GAAiB,OAAAD,EAASO,EAAGN,IAAQD,EAASQ,EAAGP,IACzEoB,GAAM,SAACd,EAAQC,EAAQP,GAAiB,OAAAD,EAASO,EAAGN,IAAQD,EAASQ,EAAGP,KCxC7DqB,EAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GACrZC,EAAa,EAEbC,EAAQ,EAERC,EAAe,YCFZC,EAAYC,WACpBC,EAAa,OACnB,IAA8B,IAAAC,EAAAC,EAAA5H,OAAO6H,QAAQJ,kCAAY,CAGvD,IAHS,IAAAK,EAAAC,aAACC,OAAMC,OACZ/E,EAAOwE,EAEF7F,EAAI,EAAGA,EAAImG,EAAK1G,OAAQO,IAAK,CACpC,IAAMqG,EAAIF,EAAKnG,GACfqB,EAAKgF,GAAKhF,EAAKgF,IAAM,GAEjBrG,IAAMmG,EAAK1G,OAAS,GAAM8F,EAAMY,EAAKG,WAAWtG,IAAMwF,IACxDnE,EAAKgF,GAAGE,cAAe,GAGzBlF,EAAOA,EAAKgF,GAGdhF,EAAK+E,QAAUA,EACf/E,EAAKmF,KAAM,oGAEb,OAAOX,EDdTN,EAAM,KAAOA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,MAAQA,EAAM,OAASE,EE8GnQ,IAAMgB,EAAwC,CACnD1E,KAAM,CAAC,KACP2E,QAAS,CAAC,KACVC,SAAU,CAAC,KACXC,mBAAmB,EACnBC,eAAe,EACfzF,WAAO0F,EACPC,QAAS,GACTC,GAAIA,EACJC,iBAAiB,EACjB5C,UAAU,EACV6C,cAAc,EACdC,aAAa,EACbC,iBAAiB,EACjBC,gBAAgB,EAChBC,QAAQ,EACRC,iBAAkB,KAClBC,kBAAmB,KACnBC,oBAAqB,KACrBC,qBAAsB,KACtBC,mBAAmB,EACnBC,eAAe,EACfC,iBAAiB,EACjBC,WAAW,EACXC,QAAS,GACTC,gBAAgB,EAChBpC,UAAWtB,EACX2D,cAAetC,EAAWrB,aA6BZ4D,EAAwBzJ,GACtC,IAAI0J,EAAiB,GAGrB,OAFIC,EAAU3J,KAAQ0J,EAAO1J,GACzB4J,EAAW5J,KAAQ0J,EAAO,CAAC1J,IACxB0J,WClLiCG,MAAA7E,OAU9B8E,mBAAV,WACE,IAAMC,EAAMtH,KAAKuH,cACjBvH,KAAKwH,QAiET,SAAoBC,GACZ,IAACC,EAAD1C,EAASyC,EAAME,oBACfC,EAAQH,EAAMI,MAAMlG,MAAM,MAC1BmG,EAAQC,KAAKC,IAAIN,EAAO,EAAG,GAC3BpC,EAAMyC,KAAKE,IAAIP,EAAO,EAAGE,EAAMrJ,QAYrC,OAVgB2J,EACPJ,EAAOxC,EAAM,GACnB6C,IAAI,SAAAC,GACH,IAAMC,EAAaD,IAAeV,EAAQ,MAAQ,MAC5CY,EAAMC,EAAWlL,OAAO+K,GAAa/K,OAAOiI,GAAK/G,QACjDiK,EAAOZ,EAAMQ,EAAa,GAChC,MAAO,UAAGC,UAAYC,eAAQE,KAE/BC,KAAK,MA/ESC,CAAU1I,KAAKyH,OAC9BzH,KAAK2I,QAmFT,SAAoBC,EAAanB,GAC3BA,EAAMoB,OAAMD,GAAO,iBAAUnB,EAAMoB,OACjC,IAAAC,EAAA9D,EAAcyC,EAAME,iBAAnBD,OAAMqB,OAEb,OADAH,GAAO,iBAAUlB,mBAAaqB,GAtFbC,CAAU1B,EAAIqB,QAAS3I,KAAKyH,OAC3CzH,KAAKiJ,MAAQjJ,KAAK2I,QAAU,KAAO3I,KAAKwH,QACtC,KAAOxH,KAAKiJ,MAAQ,UAAY3B,EAAI2B,UAXxC,WAAoB3B,EAAYG,GAAhC,MACEyB,YAAM5B,EAAIqB,sBACVQ,EAAK5B,cAAgBD,EACrB6B,EAAK1B,MAAQA,EACb0B,EAAK3B,QAAU,cAWoBJ,MAAAC,MACrC,WAAoBsB,EAAiBlB,GAArC,MACEyB,YAAM,IAAI3G,MAAMoG,GAAUlB,gBAC1B0B,EAAKC,KAAO,oBACZF,YAAMG,0BAIsBjC,MAAAC,MAC9B,WAAoBC,EAAYG,GAAhC,MACEyB,YAAM5B,EAAKG,gBACX0B,EAAKC,KAAO,aACZD,EAAKR,QAAUrB,EAAIqB,QACnBO,YAAMG,4BAIuBjC,QAAAC,GAOjBiC,MAAd,SAAkBrL,GAChB,MAAoB,gBAAbA,EAAImL,UAPb,YAAoB9B,EAAYiC,GAAhC,MACEL,aAAM5B,EAAKiC,EAAI9B,oBACf0B,EAAKC,KAAO,cACZD,EAAKR,QAAUrB,EAAIqB,QACnBO,aAAMG,4BAOkCjC,QAAAC,OAC1C,YAAoBC,EAAYG,GAAhC,MACEyB,aAAM5B,EAAKG,gBACX0B,EAAKC,KAAO,yBACZD,EAAKR,QAAUrB,EAAIqB,QACnBO,aAAMG,4BAM0CjC,QAAA7E,WAGlD,YAAoBiH,GAApB,MACEN,aAAM,8BAAuBM,iBAC7BL,EAAKC,KAAO,iCACZD,EAAKK,aAAeA,eAIYpC,QAAA7E,WAClC,YAAoBoG,GAApB,MACEO,aAAMP,gBACNQ,EAAKC,KAAO,iBACZD,EAAKR,QAAUA,EAAU,SCjEjBc,GAAAA,OC4BHC,yBAAP,SAAoB3M,GAClB,OAAQiD,KAAK2J,UAAU5M,GAAOiD,KAAK2J,UAAU5M,IAAQ,IAEhD2M,yBAAP,SAAoB3M,EAAaQ,GAC/B,OAAQyC,KAAK2J,UAAU5M,GAAOQ,GAEzBmM,0BAAP,eAAA,oBAAqBE,mBAAAA,IAAAC,kBACnB,OAAOA,EAAK1B,IAAI,SAAApL,GAAO,MAAA,CAACA,EAAKoM,EAAKW,YAAY/M,OAEzC2M,6BAAP,SAAwBK,GAAxB,WACE,OAAOA,EAAUC,QAAQ,SAAClB,OAAAlE,EAAAI,OAACjI,OAAKQ,OAAW,OAAA4L,EAAKc,YAAYlN,EAAKQ,MAE5DmM,oBAAP,WACE,OAAOQ,GAAClK,KAAK6G,QAAS7G,KAAKmK,gBAAiBnK,KAAKoK,YAC9CC,OAAO,SAACrH,EAAKzD,GAAQ,OAAA+K,EAAStH,EAAKzD,IAAM,KAEvCmK,iBAAP,SAAYa,GACV,IAAMC,EAAQxK,KAAKyK,UAAUF,EAAM,IACnC,OAAOvK,KAAK0K,aAAaF,EAAOD,IAE3Bb,0BAAP,SAAqBc,EAAeD,GAApC,WAEE,MADqB,iBAAVA,IAAoBA,EAAQA,EAAM5I,MAAM,MAC5C4I,EAAMF,OAAO,SAACG,EAAO1J,GAE1B,GAAInD,EADJ6M,WA0BwBvM,EAAYlB,GACxC,OAAIY,EAAMM,GAAaA,EAEnBT,GADJS,WX9Cc0M,EAAUpN,GACxB,OAAIA,GAASC,EAAWD,EAAMoN,UAAkBA,EAASpN,EAAMoN,YACxDpN,EW4CDoN,CAAS1M,IACIlB,IAAckB,EAAIlB,KACjCkB,aAAenB,EACbmB,EAAIG,eAAerB,GAAakB,EAAIlB,GACjCkB,EAAI2M,oBAAoB7N,GAErB,SAARA,EAgBN,SAAmBkB,GACjB,OAAIA,EAAIG,eAAe,cAA2BwH,IAAhB3H,EAAU,KAAwBA,EAAU,KAC1EH,EAAQG,IAAQX,EAASW,GAAaA,EAAIM,OAC3B,iBAARN,EAAyBhB,OAAO4M,KAAK5L,GAAKM,YAArD,EAnB2BsM,CAAS5M,GACxB,UAARlB,EAKN,SAAoBkB,GAClB,OAAIH,EAAQG,GAAaA,EAAI,GACtBA,EAAW,MAPU6M,CAAU7M,GAC1B,SAARlB,EASN,SAAmBkB,GACjB,OAAIH,EAAQG,GAAaA,EAAIA,EAAIM,OAAS,GACnCN,EAAU,KAXU8M,CAAS9M,GAC7BA,EAAIlB,GArCCiO,CAAaR,EAAO1J,KACRqI,EAAKxC,gBACvB,MAAM,IAAIsE,GAA+BnK,GAE3C,OAAO0J,GACNA,IAEEd,kBAAP,SAAa1G,GACX,OAAOhD,KAAKoK,OAAOrL,KAAKiE,IAEnB0G,iBAAP,WACE,OAAO1J,KAAKoK,OAAOxI,OAEd8H,oBAAP,WACE,OAAO1J,KAAKoK,OAAO,IAEbV,uBAAR,SAAmB3M,GACjB,IAAK,IAAI+B,EAAIkB,KAAKoK,OAAO7L,OAAS,EAAQ,GAALO,EAAQA,IAAK,CAChD,IAAMoM,EAAYlL,KAAKoK,OAAOtL,GAC9B,GAAI/B,KAAOmO,EAAW,OAAOA,EAE/B,OAAInO,KAAOiD,KAAKmK,aAAqBnK,KAAKmK,aACnCnK,KAAK6G,aApDd,YAAoBsE,EAAkBjI,EAA8CkI,wBAAhED,mBAAkBjI,kBAA8CkI,MArB5EpL,YAAkB,CAAC,IACnBA,eAAY,GAqBlBA,KAAKqL,OAASD,EAAcC,KAC5BrL,KAAKkD,KAAOA,EACZlD,KAAK6G,kBAAUuE,EAAcvE,uBAAW3D,EAAK2D,QAC7C7G,KAAKmK,aAAegB,EACpBnL,KAAK2G,0BAAkByE,EAAczE,+BAAmB3G,KAAKkD,KAAKyD,yBCpCtD2E,GAAYC,EAAiC5C,GAC3D,IAAK4C,EAAW,CACd,IAAM3C,EAAyB,mBAAZD,EACfA,IACCA,GAAW,iBAAU4C,iBAC1B,MAAM,IAAIC,GAAe5C,KFKjBa,GAAAA,GAAAA,4BAEVA,qBACAA,eAEF,QAkBWgC,oBAAT,SAAiB5C,EAAcpK,EAAkB4M,EAAgBK,0EACvD5F,EAAO9F,KAAK2L,WACdC,EAAO5L,KAAK2L,QAAQlN,4CACHqK,EAAAjE,EAAA7E,KAAK6L,WAAWhD,EAAM+C,EAAMF,EAAajN,IAASgL,GAAWqC,wDAAzEtK,UACL6J,GAAOU,EAAAjG,EAAGkG,WAAWxK,wBAAY,SAAMsE,EAAGmG,OAAOzK,WAAhBuK,EAAAG,0BAArC,KAAgE,SAAO1K,wMAEzE,MAAMxB,KAAKmM,YAAYtD,EAAM+C,OAGtBH,wBAAT,SAAqB5C,EAAc+C,EAAgBF,EAAsBU,2FACjEtD,EAAkB9I,KAAK2L,QAArB7F,OAAID,aACR7F,KAAKqM,mBAAmBxD,KAAS6C,EAAjC,YACIY,EAAaxG,EAAG9D,QAAQhC,KAAKuM,QAAQb,GAAc7C,EAAMhD,2CAC7C2G,EAAA3H,EAAA+G,oDAAPa,UACJL,IAAepM,KAAKiE,SAASwI,EAAKH,YAE/BA,WACN,OADAvH,iOAKY2H,EAAA7H,EAAA+G,qDAAPa,UACHH,EAAaxG,EAAG9D,QAAQyK,EAAK5D,EAAMhD,GACpCuG,IAAepM,KAAKiE,SAASwI,EAAKH,aAC/BA,YAANvH,+NAGgBa,IAAhBE,EAAG6G,qBAEY/G,KADXpE,EAAWsE,EAAG6G,SAAS9D,cACKrH,WAANuD,0CAIxB0G,qBAAR,SAAiB3K,GACf,IAAMgF,EAAK9F,KAAK2L,QAAQ7F,GAExB,OADAwF,GAAOxF,EAAGyG,QAAS,mDACZzG,EAAGyG,QAASzL,IAGb2K,yBAAR,SAAqB5C,EAAc+D,GACjC,IAAMtF,EAAM,IAAI/E,MAAM,UAGtB,OAFA+E,EAAIqB,QAAU,oCAA6BE,mBAAa+D,OACxDtF,EAAIuF,KAAO,SACJvF,OAxDT,YAAaqE,GAEX,IADA3L,KAAK2L,QAAUA,GACHjG,kBAAmB,CAC7B,IAAMoH,EAAMnB,EAAQ7F,GAAGgH,IACvBxB,GAAOwB,EAAK,+CACZ,IAAMC,EAAgB,IAAIC,OAAO,CAAC,IAAMF,EAAK,KAAOA,EAAK,KAAM,OAAO3E,IAAI,SAAA8E,GAAU,gBVb7DhO,GAC3B,OAAOA,EAAIQ,QAAQ,wBAAyB,QUY4CyN,CAAYD,KAASxE,KAAK,MAC9GzI,KAAKqM,mBAAqB,SAACc,GAA2B,OAAAJ,EAAclL,KAAKsL,SAEzEnN,KAAKqM,mBAAqB,SAACc,GAA2B,OAAA,GAExDnN,KAAKiE,SAAWjE,KAAK2L,QAAQ7F,GAAG7B,qBAAmB,OAAA,GG7BvD,QAGSmJ,mBAAP,SAAcC,GACZrN,KAAKsN,QAAU7P,EAAU4P,QAJ7B,cACSrN,YAAS,GCFlB,OAGE,WACE,MAHKA,YAAS,GACTA,YAAgC,KAE/B,IAAIuC,MAAM,uCCGpB,SAASgL,GAA2BhQ,GAClC,IAAMiQ,EAAM,CACVC,KAAM,SAACzL,GAAsB,OAAAA,EAAQzE,IACrCmQ,MAAO,WAAM,OAAAF,IAEf,OAAOA,EAGT,SAASG,GAA2BrG,GAClC,IAAMkG,EAAM,CACVC,KAAM,SAACzL,EAAmBC,GACxB,OAAIA,EAAeA,EAAOqF,GACnBkG,GAETE,MAAO,SAACzL,GAAqB,OAAAA,EAAOqF,KAEtC,OAAOkG,WAYOI,GAAerO,GAC7B,OAVF,SAAwBA,GACtB,OAAOA,GAAO/B,EAAW+B,EAAIkO,MASzBI,CAAWtO,GAAaA,EAN9B,SAA0BA,GACxB,OAAOA,GAAO/B,EAAW+B,EAAIO,OAAStC,EAAW+B,EAAIuO,QAAUtQ,EAAW+B,EAAIwO,QAM1EC,CAAgBzO,GAGpB,SAAS8K,EAAWtK,GAClB,IAAIkO,EACJ,IACEA,EAAQ1O,EAAIO,KAAKC,GACjB,MAAOuH,GACP,OAAOqG,GAAuBrG,GAGhC,GAAI2G,EAAMC,KAAM,OAAOX,GAAuBU,EAAM1Q,OACpD,OAAOqQ,GAAWK,EAAM1Q,OAAQkQ,KAAKpD,EAAQ,SAAA/C,GAC3C,IAAI2G,EACJ,IACEA,EAAQ1O,EAAIuO,MAAOxG,GACnB,MAAO6G,GACP,OAAOR,GAAuBQ,GAEhC,OAAIF,EAAMC,KAAaX,GAAuBU,EAAM1Q,OAC7C8M,EAAO4D,EAAM1Q,SApBS8M,GAC1BkD,GAAuBhO,YAwBhB6O,GAAc7O,GAC5B,OAAOwC,QAAQC,QAAQ4L,GAAWrO,aAIpB7B,GAAY6B,GAC1B,IAAIiO,EASJ,OARAI,GAAWrO,GACRkO,KAAK,SAACY,GAEL,OAAOd,GADPC,EAAMa,KAGPX,MAAM,SAACpG,GACN,MAAMA,IAEHkG,EC5ET,QAGSc,mBAAP,SAAcjB,GAMQ,iBALpBA,EAAO3P,EAAQ2P,KAKiC,KAAhBrN,KAAKsN,OACnCtN,KAAKsN,OAASD,EAEdrN,KAAKsN,OAAS7P,EAAUuC,KAAKsN,QAAU7P,EAAU4P,QAZvD,cACSrN,YAAc,GCKvB,ICTYuO,ODUHC,yCAAP,SAAoCC,EAAuBzL,GAA3D,WACQ0L,EAAU,IAAIC,GAGpB,OAFA5M,QAAQC,UAAUyL,KAAK,WAAM,OAAAG,GAAWzE,EAAKyF,gBAAgBH,EAAWzL,EAAK0L,MAC1EjB,KAAK,WAAM,OAAAiB,EAAQpJ,OAAO,SAAAgC,GAAO,OAAAoH,EAAQG,MAAMvH,KAC3CoH,EAAQI,QAERN,6BAAT,SAA0BC,EAAuBzL,EAAc0L,wEAE3DA,EADGA,IACO1L,EAAIE,KAAK4D,eAAiB,IAAIwH,GAAuB,IAAIlB,6CAEnD2B,EAAAlK,EAAA4J,qDAAPlF,2BAGM,gCAAMA,EAAIyF,OAAOhM,EAAK0L,WAGnC,OAHMrB,EAAOzI,WAEL8J,EAAQjO,MAAM4M,GAClBqB,EAAe,OAAKA,EAAkB,4BAG1C,iBADYpF,GAAY2F,GAAGC,GAAKA,EAAI,IAAI5F,GAAY4F,EAAY3F,8LAIpE,SAAOmF,EAAQpB,gBAvBnB,wBEIgB6B,GAAkB5P,GAChC,SAAU6P,GAAQ7P,GAAOgP,YAAUc,oBAGrBC,GAAiB/P,GAC/B,OAAO6P,GAAQ7P,KAASgP,YAAUgB,kBAGpBC,GAAajQ,GAC3B,OAAO6P,GAAQ7P,KAASgP,YAAUkB,cAGpBC,GAAenQ,GAC7B,OAAO6P,GAAQ7P,KAASgP,YAAUoB,gBAGpBC,GAAYrQ,GAC1B,OAAO6P,GAAQ7P,KAASgP,YAAUsB,aAGpBC,GAAevQ,GAC7B,OAAO6P,GAAQ7P,KAASgP,YAAUwB,gBAGpBC,GAAgBzQ,GAC9B,OAAO6P,GAAQ7P,KAASgP,YAAU0B,iBAGpBC,GAAe3Q,GAC7B,OAAO6P,GAAQ7P,KAASgP,YAAU4B,gBAGpBC,GAAuB7Q,GACrC,OAAO6P,GAAQ7P,KAASgP,YAAU8B,wBAGpBC,GAAa/Q,GAC3B,OAAO6P,GAAQ7P,KAASgP,YAAUgC,cAGpBC,GAAcjR,GAC5B,OAAO6P,GAAQ7P,KAASgP,YAAUkC,MAGpC,SAASrB,GAAS7P,GAChB,OAAOA,EAAMA,EAAImR,MAAQ,sBD1DfnC,GAAAA,cAAAA,uCAEVA,2BACAA,mBACAA,yBACAA,sBACAA,0BACAA,sBACAA,2CACAA,uBACAA,yBACAA,4BACAA,gCACAA,4QEIOoC,gBAAP,SAAgDvH,EAAcwH,GAE5D,OADA5Q,KAAK6Q,SAASzH,GAAQwH,EACf5Q,MAED2Q,qBAAR,SAA8CG,EAAejO,GAC3D,IAAMkO,EAAI/Q,KAAK6Q,SAASC,GACxB,QAAOC,IAAKA,EAAEhT,KAAKiC,KAAM6C,IAAM,IAE1B8N,mBAAP,WAEE,IAAIlJ,EACJ,IAFAzH,KAAKgR,QAAQ,UAELhR,KAAKiR,gBAAkBxJ,EAAQzH,KAAKkR,OAAOC,UACjD,KAAInR,KAAKgR,QAAQ,QAASvJ,IACtBmI,GAAWnI,IAAUzH,KAAKgR,QAAQ,cAAOvJ,EAAM2B,MAAQ3B,IAA3D,CAGA,IAAM2J,EAAWpR,KAAKqR,WAAW5J,EAAOzH,KAAKkR,QAC7ClR,KAAKgR,QAAQ,WAAYI,GAG3B,OADKpR,KAAKiR,eAAejR,KAAKgR,QAAQ,OAC/BhR,MAEF2Q,kBAAP,WAEE,OADA3Q,KAAKiR,eAAgB,EACdjR,UA5BT,YAAoBkR,EAAaG,GAJzBrR,cAAgD,GAChDA,oBAAgB,EAItBA,KAAKkR,OAASA,EACdlR,KAAKqR,WAAaA,ECbpB,YAAoB5J,GAClBzH,KAAKyH,MAAQA,EAHjB,WCI8BL,QAAAtK,GACrBwU,oBAAP,SAAe/T,GACb,OAAOI,EAAMD,EAAQH,KAEhB+T,gBAAP,WACE,OAAO,GAEFA,iBAAP,WACE,OAAO,GAEFA,gBAAP,WACE,OAAO,GAEFA,iBAAP,WACE,OAAO,GAEFA,qBAAP,WACE,OAAO,UAjBX,+DCAA,WAA+BlK,QAAAtK,GACtByU,oBAAP,SAAehU,GACb,QAAIA,aAAiBgU,KAEjBjU,EADJC,EAAQG,EAAQH,KACOO,EAAQP,GAAgC,IAAjBA,EAAMgB,QAChDC,EAASjB,IAA6C,IAA9BN,OAAO4M,KAAKtM,GAAOgB,UAG1CgT,gBAAP,WACE,OAAO,GAEFA,iBAAP,WACE,OAAO,GAEFA,gBAAP,WACE,OAAO,GAEFA,iBAAP,WACE,OAAO,GAEFA,qBAAP,WACE,MAAO,QArBX,+DCDA,WAA+BnK,QAAAmK,IACtBC,oBAAP,SAAejU,GACb,OAAc,IAAVA,KACAI,EAAMD,EAAQH,MACdD,EAASC,GAAe,QAAQsE,KAAKtE,GAClC2L,aAAMpG,iBAAOvF,SALxB,+DCCA,IAAMkU,GAAM,IAAIH,GACHI,GAAgB,CAC3BC,MAAQ,EACRC,OAAS,EACTH,IAAOA,GACPI,KAAQJ,GACRK,MAAS,IAAIP,GACbQ,MAAS,IAAIP,ICXTQ,GAAO,aACPC,GAAO,QACPC,GAAa,CACjBtS,EAAG,KACHuS,EAAG,KACH9S,EAAG,KACHkE,EAAG,KACH6O,EAAG,KACHC,EAAG,MAGL,SAASC,GAAQnN,GACf,IAAM0H,EAAO1H,EAAEC,WAAW,GAC1B,OAAY,IAARyH,EAAmBA,EAAO,GAClB,IAARA,EAAmBA,EAAO,GACvBA,EAAO,YAGA0F,GAAoBtT,GAElC,IADA,IAAIuO,EAAM,GACD1O,EAAI,EAAGA,EAAIG,EAAIV,OAAS,EAAGO,IAClC,GAAe,OAAXG,EAAIH,GAIR,QAA+B8G,IAA3BsM,GAAWjT,EAAIH,EAAI,IACrB0O,GAAO0E,GAAWjT,IAAMH,SACnB,GAAmB,MAAfG,EAAIH,EAAI,GAAY,CAG7B,IAFA,IAAIS,EAAM,EACNiT,EAAI1T,EAAI,EACL0T,GAAK1T,EAAI,GAAKkT,GAAKnQ,KAAK5C,EAAIuT,KACjCjT,EAAY,GAANA,EAAW+S,GAAOrT,EAAIuT,MAE9B1T,EAAI0T,EAAI,EACRhF,GAAOnQ,OAAOoV,aAAalT,QACtB,GAAK0S,GAAKpQ,KAAK5C,EAAIH,EAAI,IAEvB,CAGL,IAFI0T,EAAI1T,EAAI,EACRS,EAAM,EACHiT,GAAK1T,EAAI,GAAKmT,GAAKpQ,KAAK5C,EAAIuT,KACjCjT,EAAY,EAANA,EAAU+S,GAAOrT,EAAIuT,MAE7B1T,EAAI0T,EAAI,EACRhF,GAAOnQ,OAAOoV,aAAalT,QAR3BiO,GAAOvO,IAAMH,QAdb0O,GAAOvO,EAAIH,GAyBf,OAAO0O,UCzBEkF,sBAAT,SAAmB1P,EAAc2P,gFAC/BrH,GAAOtI,EAAK,2CACN4P,EAAkB,6CACJ9J,EAAAjE,EAAA7E,KAAK6S,yDACnBC,GADKrL,cAESmL,EAAShR,oBACf,OADJ2B,EAAIwP,YACMH,EAAShR,qBAAnB0B,EAAIyP,SACJC,EAsCd,SAA4BtO,EAAsB+C,EAAsBwL,EAAUC,EAAUlQ,GAE1F,OAAOmQ,EADMzO,EAAU+C,EAAM2L,WACjBH,EAAKC,EAAKlQ,GAxCDqQ,CAAkBrQ,EAAIE,KAAKwB,UAAW+C,EAAOnE,EAAGC,EAAGP,GAClE4P,EAAS7T,KAAKiU,gBAEA,OAAdjO,GAAAgH,EAAA6G,GAAS7T,QAAWuU,GAAU7L,EAAOzE,EAAK2P,GAAmC,IAAxB3S,KAAK6S,QAAQtU,gBAAlEwG,WAAcgO,iNAGlB,SAAOH,EAAS,YAhBlB,YAAoB1B,GAClBlR,KAAK6S,eA8DT,SAAsB3B,sEACdqC,EAAuB,8CACTC,EAAA3O,EAAAqM,yDACd4B,GADKrL,WACL,oCACK8L,EAAIhV,QAAUgV,EAAIA,EAAIhV,OAAS,GAAGkV,gBAAkBhM,EAAMgM,mBACzDF,EAAI3R,2BAAVgD,6BAEF2O,EAAIxU,KAAK0I,gBACJ,SAAMA,UAAN7C,uNAEF2O,EAAIhV,UACHgV,EAAI3R,6BAAVgD,qCAzEmB8O,CAAUxC,iBAmBjBoC,GAAW7L,EAA0BzE,EAAc2P,GACjE,oBADiEA,MAC7DgB,GAAiClM,GAQvC,SAAkCA,EAA4BzE,EAAc2P,GAC1E,IAAMiB,EAAkBnM,EAAMmM,MAAMzL,IAAI,SAAA0L,GAAQ,OAAAP,GAAUO,EAAM7Q,GAAK,KACrE,IACE,OAAOA,EAAI8Q,OAAKrM,EAAMsM,gBAAiBH,QACvC,MAAOzF,GACP,GAAIwE,GAAiC,mCAArBxE,EAAY/E,KAA2C,OAAO,KAC9E,UAAW4K,GAAuB7F,EAAY1G,IAdIwM,CAAwBxM,EAAOzE,EAAK2P,GACpFuB,GAAwBzM,GAmC9B,SAAyBA,EAAmBzE,GAC1C,IAAMmR,EAAcb,GAAU7L,EAAMwL,IAAKjQ,GACnCoR,EAAed,GAAU7L,EAAMyL,IAAKlQ,GAC1C,OAAOtE,GAAOyV,GAAMC,EAAO,GAtCgBC,CAAe5M,EAAOzE,GAC7DsR,GAA0B7M,GA8BhC,SAA2BA,GACzB,OAAOiK,GAAcjK,EAAM8M,SA/BkBC,CAAiB/M,GAC1DgN,GAAyBhN,GAe/B,SAA0BA,GACxB,IAAMxI,EAAMwI,EAAMiN,MAAMC,QAAU,KAAOlN,EAAMmN,QAAUnN,EAAMmN,QAAQD,QAAU,IACjF,OAAOxE,OAAOlR,GAjB8B4V,CAAgBpN,GACxDqN,GAAuBrN,GAAeA,EAAMsN,UAC5CC,GAAyBvN,GAAewN,GAAgBxN,QAA5D,WAkBcwN,GAAiBxN,GAC/B,OAAO8K,GAAmB9K,EAAMsN,mBCtDzBG,qBAAP,WACE,OAAOlV,KAAK6H,MAAMsN,MAAMnV,KAAK8H,MAAO9H,KAAKsF,MAEpC4P,yBAAP,WAEE,IADI,IAAApM,EAAA9D,EAAa,CAAC,EAAG,MAAhBoQ,OAAKrM,OACDjK,EAAI,EAAGA,EAAIkB,KAAK8H,MAAOhJ,IACR,OAAlBkB,KAAK6H,MAAM/I,IACbsW,IACArM,EAAM,GACDA,IAET,MAAO,CAACqM,EAAKrM,IAERmM,kBAAP,WACE,OAAOlV,KAAKsF,IAAMtF,KAAK8H,WArBzB,YACS4I,EACA7I,EACAC,EACAxC,EACAuD,GAJA7I,UAAA0Q,EACA1Q,WAAA6H,EACA7H,WAAA8H,EACA9H,SAAAsF,EACAtF,UAAA6I,ECJX,WAA6CzB,QAAA8N,QAI3C,YACExE,EACAiE,EACA9M,EACAC,EACAxC,EACA+P,EACAC,EACAzM,GARF,MAUEK,aAAMwH,EAAM7I,EAAOC,EAAOxC,EAAKuD,SAb1BM,YAAW,EACXA,aAAY,EAajBA,EAAKwL,QAAUxL,EAAK4L,UACpB,IAAMQ,EAAoB,MAAfZ,EAAQ,GACba,EAAuB,MAAlBnX,EAAKsW,UAChBxL,EAAKwL,QAAUA,EACZQ,MACCI,EAAK,EAAI,EACTC,GAAM,EAAIb,EAAQpW,QAEnBkX,OACHtM,EAAKkM,SAAWE,GAAMF,EACtBlM,EAAKmM,UAAYE,GAAMF,ICH3B,SAASD,GAAU5N,EAAcrB,GAC/B,GAAKqB,GAAU+H,GAAY/H,GAG3B,IADA,IAAMiO,EAAOtP,EAAS7B,EAAQC,EACvBH,EAAMoD,EAAMI,MAAMzC,WAAWqC,EAAMnC,IAAM,EAAImC,EAAM6N,YAAcI,GAAMjO,EAAM6N,YAGtF,SAASA,GAAW7N,EAAcrB,GAChC,GAAKqB,GAAU+H,GAAY/H,GAA3B,CAGA,IADA,IAAMiO,EAAOtP,EAAS7B,EAAQC,EACvBH,EAAMoD,EAAMI,MAAMzC,WAAWqC,EAAMK,MAAQL,EAAM4N,WAAaK,GAAMjO,EAAM4N,WACxB,OAArD5N,EAAMI,MAAM8N,OAAOlO,EAAMK,MAAQL,EAAM4N,WAAoB5N,EAAM4N,YClCvE,WAAiCjO,QAAA8N,QAC/B,YACSR,EACAE,GAFT,MAIE1L,aAAMqF,YAAU4B,OAAQuE,EAAM7M,MAAO6M,EAAM5M,MAAO8M,EAAUA,EAAQtP,IAAMoP,EAAMpP,IAAKoP,EAAM7L,mBAHpFM,QAAAuL,EACAvL,UAAAyL,ICHX,WAAqCxN,QAAA8N,IAWnCU,sBAAA,SAAUC,gBAAAA,MAIR,IAHA,IAGS/W,EAHK+W,G1BLE,G0BKWxR,EAAMrE,KAAK6H,MAAMzC,WAAWpF,KAAK8H,QACxD9H,KAAK8H,MAAQ,EACb9H,KAAK8H,MACWhJ,EAAIkB,KAAKsF,IAAKxG,IAChC,K1BVgB,G0BUVuF,EAAMrE,KAAK6H,MAAMzC,WAAWtG,KAAe,OAAO,EAE1D,OAAO,OAhBT,YACS+I,EACAC,EACAxC,EACAuD,GAJT,MAMEK,aAAMqF,YAAUgC,KAAM1I,EAAOC,EAAOxC,EAAKuD,gBALlCM,QAAAtB,EACAsB,QAAArB,EACAqB,MAAA7D,EACA6D,OAAAN,EAGPM,EAAKwL,QAAUxL,EAAK4L,YCVxB,WAAkC3N,QAAA8N,QAEhC,YACSrN,EACAC,EACAxC,EACAuD,GAJT,MAMEK,aAAMqF,YAAU0B,QAASpI,EAAOC,EAAOxC,EAAKuD,gBALrCM,QAAAtB,EACAsB,QAAArB,EACAqB,MAAA7D,EACA6D,OAAAN,EAGPM,EAAKoL,QAAUpL,EAAK4L,YCTjB,OAAMe,GAAa,CACxBzS,KAAM,EACNG,KAAM,EACNC,IAAK,EACLG,IAAK,EACLC,KAAM,EACNG,KAAM,EACNC,SAAY,EACZE,IAAO,EACPC,GAAM,OAG2BgD,QAAA8N,IAWjCa,2BAAA,WACE,IAAMhZ,EAAMiD,KAAK+U,UACjB,OAAOhY,KAAO+Y,GAAaA,GAAW/Y,GAAO,OAX/C,YACS8K,EACAC,EACAxC,EACAuD,GAJT,MAMEK,aAAMqF,YAAUgB,SAAU1H,EAAOC,EAAOxC,EAAKuD,gBALtCM,QAAAtB,EACAsB,QAAArB,EACAqB,MAAA7D,EACA6D,OAAAN,EAGPM,EAAKiK,SAAWjK,EAAK4L,YClBzB,WAAyC3N,QAAA8N,QAEvC,YACSc,EACApC,EACPtO,GAHF,MAKE4D,aAAMqF,YAAU8B,eAAgB2F,EAASnO,MAAOmO,EAASlO,MAAOxC,EAAK0Q,EAASnN,mBAJvEM,WAAA6M,EACA7M,QAAAyK,EAIPzK,EAAK4K,aAAe5K,EAAK6M,oBAAoBJ,GACzCzM,EAAK6M,SAASjB,UACdxC,GAAmBpJ,EAAK6M,SAASjB,aCZzC,WAAiC3N,QAAA8N,QAC/B,YACS9L,EACA6M,EACPpO,EACAC,EACAxC,EACAuD,GANF,MAQEK,aAAMqF,YAAU2H,OAAQrO,EAAOC,EAAOxC,EAAKuD,gBAPpCM,OAAAC,EACAD,OAAA8M,ICFX,WAA+B7O,QAAA8N,QAC7B,YACSrN,EACAC,EACAxC,EACA8D,EACA7L,EACAsL,GANT,MAQEK,aAAMqF,YAAU4H,KAAMtO,EAAOC,EAAOxC,EAAKuD,gBAPlCM,QAAAtB,EACAsB,QAAArB,EACAqB,MAAA7D,EACA6D,OAAAC,EACAD,QAAA5L,EACA4L,OAAAN,ICTX,WAAiCzB,QAAA8N,QAC/B,YACSrN,EACAC,EACAxC,EACAuD,GAJT,MAMEK,aAAMqF,YAAUwB,OAAQlI,EAAOC,EAAOxC,EAAKuD,gBALpCM,QAAAtB,EACAsB,QAAArB,EACAqB,MAAA7D,EACA6D,OAAAN,ICLX,WAA+BzB,QAAA8N,IAWtBkB,wBAAP,WACE,OAAOpW,KAAK6H,MAAMsN,MAAMnV,KAAK8H,MAAQ9H,KAAKqV,SAAUrV,KAAKsF,IAAMtF,KAAKsV,gBATtE,YACSzN,EACAC,EACAxC,EACAuD,GAJT,MAMEK,aAAMqF,YAAUkB,KAAM5H,EAAOC,EAAOxC,EAAKuD,gBALlCM,QAAAtB,EACAsB,QAAArB,EACAqB,MAAA7D,EACA6D,OAAAN,EANTM,WAAW,EACXA,YAAY,ICDd,WAAgC/B,QAAA8N,QAC9B,YACSrN,EACAC,EACAxC,EACA2N,EACAC,EACArK,GANT,MAQEK,aAAMqF,YAAUkC,MAAO5I,EAAOC,EAAOxC,EAAKuD,gBAPnCM,QAAAtB,EACAsB,QAAArB,EACAqB,MAAA7D,EACA6D,MAAA8J,EACA9J,MAAA+J,EACA/J,OAAAN,ICPX,WAAiCzB,QAAAiP,QAC/B,YACExO,EACAC,EACAxC,EACAqG,EACA9C,GALF,IAOU1C,EAA+EwF,iBAA/DzF,EAA+DyF,kBAA9CpF,EAA8CoF,sBAAzBnF,EAAyBmF,uBACjFpO,EAAQsK,EAAMsN,MAAMrN,EAAQvB,EAAoBhI,OAAQ+G,EAAMkB,EAAqBjI,eACzF2K,aAAMqF,YAAUoB,OAAQpS,EAAOsK,EAAOC,EAAOxC,EAAKa,EAAgBD,EAAiB2C,SCRvF,WAAoCzB,QAAAiP,QAGlC,YACExO,EACAC,EACAxC,EACAqG,EACA9C,GALF,WAOQtL,EAAQsK,EAAMsN,MAAMrN,EAAOxC,GAGjC,GAFA6D,EAAAD,aAAMqF,YAAUsB,IAAKtS,EAAOsK,EAAOC,EAAOxC,GAAK,GAAO,EAAOuD,SAExD,KAAKhH,KAAKtE,GAIR,CACL,IAAM+Y,EAAY,IAAIC,GAAUpN,EAAKwL,QAAShJ,EAAQ5E,eAEtD,GADAoC,EAAKC,KAAOkN,EAAUE,iBAAiBzB,WAClC5L,EAAKC,KAAM,MAAM,IAAIqN,EAAkB,4BAA6BtN,GAEzEmN,EAAUI,YACVvN,EAAK8M,KAAOK,EAAUK,iBARtBxN,EAAKC,KAAO,GACZD,EAAK8M,KAAO,oBCmBhBM,4BAAA,WACE,OAAO,IAAI7D,GAAW1S,KAAK4W,yBAG3BL,kCAAF,sEAEE,OADMM,EAAU7W,KAAK8W,gBAGfD,cAAN/N,iCAEO9I,KAAK+W,EAAI/W,KAAKgX,GACb5D,EAAWpT,KAAKiX,kBAGhBC,EAAUlX,KAAK8W,gBAGf1D,oBACN,OADAtK,YACMoO,iBAANpO,oCAGJyN,0BAAA,WACEvW,KAAK0W,YACL,IAAMpR,WC7DqBrG,EAAa6I,EAAenD,EAAYW,gBAAAA,EAAMrG,EAAIV,QAI/E,IAHA,IAEI4Y,EAFAhX,EAAOwE,EACP7F,EAAIgJ,EAED3H,EAAKlB,EAAIH,KAAOA,EAAIwG,IACzBnF,EAAOA,EAAKlB,EAAIH,OACF,MAAGqY,EAAOhX,GAE1B,OAAKgX,EACDA,EAAmB,cAAM9S,EAAMpF,EAAImG,WAAWtG,IAAMwF,GAAqB,EACtExF,GAFY,EDqDLsY,CAAcpX,KAAK6H,MAAO7H,KAAK+W,EAAG/W,KAAK2E,MACnD,IAAa,IAATW,EACJ,OAAO,IAAIyQ,GAAc/V,KAAK6H,MAAO7H,KAAK+W,EAAI/W,KAAK+W,EAAIzR,EAAMtF,KAAK6I,OAEpE0N,yBAAA,WAEE,IADA,IAAMc,EAAU,KACH,CACX,IAAMC,EAAStX,KAAKuX,aACpB,IAAKD,EAAQ,OAAOD,EACpBA,EAAQtY,KAAKuY,KAGjBf,wBAAA,WAAA,WAEE,GADAvW,KAAK0W,YACD1W,KAAKsF,MAAO,OAAO,KACvBgG,GAAuB,MAAhBtL,KAAKwX,OAAgB,WAAM,MAAA,8BAAuBrO,EAAKsO,cAC9DzX,KAAK+W,IACL,IAAMjP,EAAQ9H,KAAK+W,EACb3N,EAAOpJ,KAAKwW,iBAClB,IAAKpN,EAAK9I,OAAQ,OAAO,KACzB,IAAM2V,EAAO,GAEb,GADAjW,KAAK0W,YACe,MAAhB1W,KAAKwX,OACP,EAAG,GACCxX,KAAK+W,EACP,IAAMlU,EAAM7C,KAAK0X,gBAEjB,IADA7U,GAAOoT,EAAKlX,KAAK8D,GACV7C,KAAK+W,EAAI/W,KAAKgX,GAAqB,MAAhBhX,KAAKwX,QAAkC,MAAhBxX,KAAKwX,UAAkBxX,KAAK+W,QACtD,MAAhB/W,KAAKwX,QAEhB,OAAO,IAAIG,GAAYvO,EAAK2L,UAAWkB,EAAMjW,KAAK6H,MAAOC,EAAO9H,KAAK+W,EAAG/W,KAAK6I,OAG/E0N,2BAAA,WACE,IAAMxZ,EAAMiD,KAAK8W,YACjB,GAAK/Z,EAAL,CAEA,GADAiD,KAAK0W,YACe,MAAhB1W,KAAKwX,OAAgB,OAAOza,IAC9BiD,KAAK+W,EACP,IAAMxZ,EAAQyC,KAAK8W,YACnB,MAAO,CAAC/Z,EAAIgY,UAAWxX,KAGzBgZ,gCAAA,SAAoB5K,gBAAAA,KAElB,IADA,IAAMuF,EAA0B,GACzBlR,KAAK+W,EAAI/W,KAAKgX,GAAG,CACtB,IAAMvP,EAAQzH,KAAK4X,kBAAkBjM,GACrCuF,EAAOnS,KAAK0I,GAGd,gBb7G4ByJ,EAAiBvF,GAG/C,IAFA,IAAIkM,GAAQ,EAEH/Y,EAAI,EAAGA,EAAIoS,EAAO3S,OAAQO,IAAK,CACtC,IAAM2I,EAAQyJ,EAAOpS,GAChBqQ,GAAiB1H,MACjBoQ,GAASpQ,EAAM4N,UAClBA,GAASnE,EAAOpS,EAAI,GAAI6M,EAAQvF,QAG9BwJ,GAAWnI,KACM,QAAfA,EAAM2B,KAAgByO,GAAQ,EACV,WAAfpQ,EAAM2B,OAAmByO,GAAQ,KAGvCA,GAASpQ,EAAM6N,WAClBA,GAAUpE,EAAOpS,EAAI,GAAI6M,EAAQvF,Ua4FnC0R,CAAe5G,EAAQvF,GAChBuF,GAGTqF,+BAAA,SAAmB5K,GACT,IAAAtF,EAA0CsF,mBAAxBpF,EAAwBoF,sBAClD,OAAuB,EAAnB3L,KAAK+X,WAAwB/X,KAAKgY,uBAAuBrM,GACzD3L,KAAKiY,MAAM5R,GAA0BrG,KAAKkY,aAAavM,GACvD3L,KAAKiY,MAAM1R,GAA6BvG,KAAKmY,gBAAgBxM,GAC1D3L,KAAKoY,cAAc,CAAC/R,EAAkBE,KAG/CgQ,2BAAA,SAAe8B,GAEb,IAFF,WACQvQ,EAAQ9H,KAAK+W,EACZ/W,KAAK+W,EAAI/W,KAAKgX,IACfqB,EAAYC,KAAK,SAAArZ,GAAO,OAAAkK,EAAK8O,MAAMhZ,QACrCe,KAAK+W,EAET,OAAO,IAAIX,GAAUpW,KAAK6H,MAAOC,EAAO9H,KAAK+W,EAAG/W,KAAK6I,OAGvD0N,0BAAA,SAAc5K,gBAAAA,KACN,IAAE9C,EAAgB7I,UAAV6H,EAAU7H,WAClB8H,EAAQ9H,KAAK+W,EACnB,IAAyD,IAArD/W,KAAKuY,gBAAgB5M,EAAQrF,mBAC/B,MAAMtG,KAAKwY,QAAQ,cAAOxY,KAAKyX,SAAS3P,kBAAqBA,GAE/D,IAAML,EAAQ,IAAIgR,GAAS5Q,EAAOC,EAAO9H,KAAK+W,EAAGpL,EAAS9C,GAE1D,MADmB,QAAfpB,EAAM2B,OAAgBpJ,KAAK+X,WAAajQ,GACrCL,GAGT8O,6BAAA,SAAiBmC,GACf,KAAO1Y,KAAK+W,EAAI/W,KAAKgX,GACnB,GrC3Ie,EqC2IVhX,KAAK2Y,WACR3Y,KAAK4Y,kBAIP,KADE5Y,KAAK+W,EACH/W,KAAK6Y,OAAOH,GAAY,OAAO1Y,KAAK+W,EAE1C,OAAQ,GAGVR,6BAAA,SAAiB5K,gBAAAA,KACT,IAAE9C,EAAgB7I,UAAV6H,EAAU7H,WAChBwG,EAAyBmF,uBAC3B7D,EAAQ9H,KAAK+W,EACnB,IAAoD,IAAhD/W,KAAKuY,gBAAgB/R,GACvB,MAAMxG,KAAKwY,QAAQ,iBAAUxY,KAAKyX,SAAS3P,kBAAqBA,GAElE,OAAO,IAAIgR,GAAYjR,EAAOC,EAAO9H,KAAK+W,EAAGpL,EAAS9C,IAGxD0N,oCAAA,SAAwB5K,GAItB,IAHQ,IAAAtF,EAAwCsF,mBAAtBrF,EAAsBqF,oBAC1C7D,EAAQ9H,KAAK+W,EACfgC,EAAU/Y,KAAKgZ,OAAO3S,GAAoBA,EAAiB9H,OACxDyB,KAAK+W,EAAI/W,KAAKgX,GACnB,GAAwC,WAApChX,KAAKwW,iBAAiBzB,UAI1B,KAAO/U,KAAK+W,GAAK/W,KAAKgX,GAAG,CACvB,GAAIhX,KAAK6Y,OAAOvS,GAAoB,CAClC,IAAMhB,EAAMtF,KAAK+W,EACjB,OAAIjP,IAAUiR,GACZ/Y,KAAK+X,YAAc,EACZ,IAAIU,GAASzY,KAAK6H,MAAOC,EAAOxC,EAAKqG,EAAS3L,KAAK6I,QAE1D7I,KAAK+W,EAAIgC,EACF,IAAI3C,GAAUpW,KAAK6H,MAAOC,EAAOiR,EAAS/Y,KAAK6I,OAG1D,GAAI7I,KAAK6Y,OAAOxS,GAAmB,MACnCrG,KAAK+W,SAfLgC,EAAU/Y,KAAKgZ,OAAO3S,GAAoBA,EAAiB9H,OAkB/D,MAAMyB,KAAKwY,QAAQ,cAAOxY,KAAKyX,SAASzX,KAAK+X,2BAA0BjQ,IAGzEyO,iCAAA,SAAqB5K,gBAAAA,KAEnB,IADA,IAAMuF,EAA2B,GAC1BlR,KAAK+W,EAAI/W,KAAKgX,GAAG,CACtB,IAAMvP,EAAQzH,KAAKiZ,mBAAmBtN,GAClClE,EAAM2B,MAAM8H,EAAOnS,KAAK0I,GAE9B,OAAOyJ,GAGTqF,gCAAA,SAAoB5K,GACZ,IAAE9C,EAAgB7I,UAAV6H,EAAU7H,WAClB8H,EAAQ9H,KAAK+W,EACfzR,EAAMtF,KAAKgX,EAGf,OAFoC,IAAhChX,KAAKuY,gBAAgB,QAAcjT,EAAMtF,KAAK+W,GACpC,IAAImC,GAAerR,EAAOC,EAAOxC,EAAKqG,EAAS9C,IAI/D0N,qBAAA,SAAS3N,EAAad,GACpB,OAAO,IAAI2O,EAAkB7N,EAAK,IAAIgN,GAAgB5V,KAAK6H,MAAOC,EAAO9H,KAAKgX,EAAGhX,KAAK6I,QAGxF0N,sBAAA,SAAUzO,GACR,oBADQA,EAAgB9H,KAAK+W,GACtBoC,KAAK1b,mB3CjFUwB,EAAa+X,GACrC,OAAO/X,EAAIV,OAASyY,EAAI/X,EAAIma,OAAO,EAAGpC,EAAI,GAAK,MAAQ/X,E2CgF/Boa,CAASrZ,KAAK6H,MAAMsN,MAAMrN,GAAQ,MAM1DyO,sBAAA,WAEE,OADA+C,QAAQC,KAAK,qEACNvZ,KAAKwW,kBAGdD,4BAAA,WACEvW,KAAK0W,YAEL,IADA,IAAM5O,EAAQ9H,KAAK+W,EACZ/W,KAAK2Y,WAAarU,KAActE,KAAK+W,EAC5C,OAAO,IAAInB,GAAgB5V,KAAK6H,MAAOC,EAAO9H,KAAK+W,EAAG/W,KAAK6I,OAG7D0N,wBAAA,SAAYiD,GAEV,IADA,IAAMC,EAAS,KACF,CACX,IAAMC,EAAO1Z,KAAK2Z,SAASH,GAC3B,IAAKE,EAAM,OAAOD,EAClBA,EAAO1a,KAAK2a,KAIhBnD,sBAAA,SAAUiD,GACRxZ,KAAK0W,YACe,MAAhB1W,KAAKwX,UAAkBxX,KAAK+W,EAChC,IAAMjP,EAAQ9H,KAAK+W,EACb3N,EAAOpJ,KAAKwW,iBAClB,GAAKpN,EAAK9I,OAAV,CACA,IAAI/C,EAEJyC,KAAK0W,YACL,IAAM5J,EAAM0M,EAAc,IAAM,IAKhC,OAJIxZ,KAAKwX,SAAW1K,MAChB9M,KAAK+W,EACPxZ,EAAQyC,KAAK8W,aAER,IAAI8C,GAAU5Z,KAAK6H,MAAOC,EAAO9H,KAAK+W,EAAG3N,EAAM7L,EAAOyC,KAAK6I,QAGpE0N,uBAAA,WACE,OAAOvW,KAAK6H,MAAMsN,MAAMnV,KAAK+W,IAG/BR,qBAAA,SAASzX,gBAAAA,KACPkB,KAAK+W,GAAKjY,GAGZyX,iBAAA,WACE,OAAOvW,KAAK+W,GAAK/W,KAAKgX,GAGxBT,oBAAA,SAAQjR,GACN,KAAOtF,KAAK+W,EAAI/W,KAAKgX,GAEnB,KADEhX,KAAK+W,EACH/W,KAAK6Y,OAAOvT,GAAM,OAAOtF,KAAK+W,EAEpC,OAAQ,GAGVR,uBAAA,WACE,IAAMhZ,EAAQyC,KAAK4Y,cAAgB5Y,KAAK6Z,YACxC,GAAItc,EAAO,OAAOA,EAElB,GAAoB,MAAhByC,KAAKwX,OAAgB,CAGvB,GAFAxX,KAAK+W,MACClD,EAAO7T,KAAK4Y,cACP,OACX,GAAoB,MAAhB5Y,KAAKwX,OAAgB,OAEzB,OADAxX,KAAK+W,IACE,IAAI+C,GAAoBjG,EAAM,GAAI7T,KAAK+W,GAGhD,IAAMf,EAAWhW,KAAKwW,iBACtB,GAAKR,EAAS1V,OAAd,CAIA,IAFA,IAAIzC,EAAWmY,EAASnY,UAAS,GAC3B+V,EAA2C,KAE/C,GAAoB,MAAhB5T,KAAKwX,OAAgB,CACvB3Z,GAAW,EACXmC,KAAK+W,IACL,IAAMlD,EAAO7T,KAAK8W,aAAe,IAAIlB,GAAgB5V,KAAK6H,MAAO7H,KAAK+W,EAAG/W,KAAK+W,EAAG/W,KAAK6I,MACtF7I,KAAKgZ,OAAO,KACZpF,EAAM7U,KAAK8U,OACN,CAAA,GAAoB,MAAhB7T,KAAKwX,QAAmC,MAAjBxX,KAAKwX,KAAK,GAMrC,MAHL,GAFAxX,KAAK+W,MACClD,EAAO7T,KAAKwW,kBACRlW,OAAQ,MACbuT,EAAKhW,aAAYA,GAAW,GACjC+V,EAAM7U,KAAK8U,GAGf,OAAKD,EAAMrV,QAAUmT,GAActT,eAAe4X,EAASrB,SAClD,IAAIoF,GAAa/Z,KAAK6H,MAAOmO,EAASlO,MAAOkO,EAAS1Q,IAAKtF,KAAK6I,MAErEhL,EAAiB,IAAImc,GAAYhE,EAAUpC,EAAM,IAC9C,IAAIkG,GAAoB9D,EAAUpC,EAAO5T,KAAK+W,KAGvDR,uBAAA,WACEvW,KAAK0W,YACL,IAAM5O,EAAQ9H,KAAK+W,EACnB,GAAoB,MAAhB/W,KAAKwX,OAAT,GACExX,KAAK+W,EACP,IAAM9D,EAAMjT,KAAKia,mBACjBja,KAAK+W,GAAK,EACV,IAAM7D,EAAMlT,KAAKia,mBAEjB,QADEja,KAAK+W,EACA,IAAImD,GAAWla,KAAK6H,MAAOC,EAAO9H,KAAK+W,EAAG9D,EAAKC,EAAKlT,KAAK6I,QAGlE0N,8BAAA,WAAA,WACQhZ,EAAQyC,KAAK8W,YAEnB,OADAxL,GAAO/N,EAAO,WAAM,MAAA,2BAAoB4L,EAAKsO,iCACtCla,GAGTgZ,wBAAA,WACEvW,KAAK0W,YACL,IAAM5O,EAAQ9H,KAAK+W,EACnB,GrC9UiB,EqC8UX/W,KAAK2Y,WAAX,GACE3Y,KAAK+W,EAEP,IADA,IAAIoD,GAAU,EACPna,KAAK+W,EAAI/W,KAAKgX,MACjBhX,KAAK+W,EACH/W,KAAK6H,MAAM7H,KAAK+W,EAAI,KAAO/W,KAAK6H,MAAMC,IAAWqS,IACjDA,EAASA,GAAU,EACa,OAA3Bna,KAAK6H,MAAM7H,KAAK+W,EAAI,KAAaoD,GAAU,GAEtD,OAAO,IAAIC,GAAYpa,KAAK6H,MAAOC,EAAO9H,KAAK+W,EAAG/W,KAAK6I,QAGvD0N,kCAAF,SAAwB5K,8DACdpF,EAAwBoF,sBAC1B0O,EAAkB,CAAC,IAAK,IAAK9T,GAC7B+T,EAAoB,IAAIC,IAAIF,2BAE3Bra,KAAK+W,EAAI/W,KAAKgX,IAAMsD,EAAkBE,IAAIxa,KAAKwX,WAC9CxX,KAAKiY,MAAM1R,GACbvG,KAAKmY,gBAAgBxM,GACrB3L,KAAKoY,cAAciC,wBAFvBvR,oCAMJyN,mBAAA,SAAOkE,GACL,IAAK,IAAI3b,EAAI,EAAGA,EAAI2b,EAAKlc,OAAQO,IAC/B,GAAI2b,EAAK3b,KAAOkB,KAAK6H,MAAM7H,KAAK+W,EAAIjY,GAAI,OAAO,EAEjD,OAAO,GAGTyX,oBAAA,SAAQmE,GACN,IAAK,IAAI5b,EAAI,EAAGA,EAAI4b,EAAQnc,OAAQO,IAClC,GAAI4b,EAAQA,EAAQnc,OAAS,EAAIO,KAAOkB,KAAK6H,MAAM7H,KAAK+W,EAAI,EAAIjY,GAAI,OAAO,EAE7E,OAAO,GAGTyX,sBAAA,SAAUlX,GACR,oBADQA,KACDgF,EAAMrE,KAAK6H,MAAMzC,WAAWpF,KAAK+W,EAAI1X,KAG9CkX,kBAAA,SAAMlX,GACJ,oBADIA,KACGW,KAAK6H,MAAM7H,KAAK+W,EAAI1X,IAG7BkX,uBAAA,WACE,KAAOvW,KAAK2Y,WAAapU,KAASvE,KAAK+W,OApWzC,YACSlP,EACClD,EACDkE,gBAAAA,MAFA7I,WAAA6H,EACC7H,UAAA2E,EACD3E,UAAA6I,EAPT7I,OAAI,EAEIA,iBAAc,EAOpBA,KAAKgX,EAAInP,EAAMtJ,kBEhCW6I,QAAAiP,QAG5B,YACExO,EACAC,EACAxC,EACAqG,EACA9C,GALF,WAOU5C,EAAmE0F,cAAtD3F,EAAsD2F,eAAxCtF,EAAwCsF,mBAAtBrF,EAAsBqF,oBACrEpO,EAAQsK,EAAMsN,MAAMrN,EAAQzB,EAAiB9H,OAAQ+G,EAAMgB,EAAkB/H,QACnF4K,EAAAD,aAAMqF,YAAUsB,IAAKtS,EAAOsK,EAAOC,EAAOxC,EAAKW,EAAaD,EAAc6C,SAE1E,IAAMyN,EAAY,IAAIC,GAAUpN,EAAKwL,QAAShJ,EAAQ5E,eAEtD,GADAoC,EAAKC,KAAOkN,EAAUE,iBAAiBzB,WAClC5L,EAAKC,KAAM,MAAM,IAAIqN,EAAkB,qBAAsBtN,UAElEmN,EAAUI,YACVvN,EAAK8M,KAAOK,EAAUK,sBCDtBR,oBAAF,SAAUnT,4EACF0W,EAAO,4CACK5Q,EAAAjE,EAAA5H,OAAO4M,KAAK7J,KAAK0Z,wDAAxB3c,UACTgP,EAAA2N,EAAK3U,EAAAhI,OAA0B6I,IAAnB5F,KAAK0Z,KAAK3c,UAAqBmP,GAAA,iBAAO,SAAMoH,GAAUtT,KAAK0Z,KAAK3c,GAAMiG,WAAhCkJ,EAAAyO,0BAAlD5O,4MAEF,SAAO2N,WAXT,YAAakB,EAAgBpB,WAD7BxZ,UAAkB,GAEhB,IAAMsW,EAAY,IAAIC,GAAUqE,EAAQ,QACxC,IAAmB,IAAAhW,EAAAC,EAAAyR,EAAUuE,WAAWrB,kCAAc,CAAjD,IAAME,UACT1Z,KAAK0Z,KAAKA,EAAKtQ,KAAKuL,SAAW+E,EAAKnc,yGCd1C,QAYS2Y,oBAAP,SAAe3Y,EAAYiK,WACnBsT,EAAc,OACpB,IAAkB,IAAAlW,EAAAC,EAAA7E,KAAKiW,oCAAqB,CAAvC,IAAMpT,UCbN/E,EDcgB+E,GAAMiY,EAAK/b,KAAK,CAAC8D,EAAI,GAAIyQ,GAAUzQ,EAAI,GAAI2E,KACzDsT,EAAK/b,KAAKuU,GAAUzQ,EAAK2E,sGAEhC,OAAOxH,KAAKmT,KAAK4H,MAAM,CAAEvT,UAASwT,OAAQhb,KAAKgb,WAAWzd,KAAUud,aAZtE,YAAoB1R,EAAc+J,EAAyB8C,EAAmB+E,GAC5Ehb,KAAKoJ,KAAOA,EACZpJ,KAAKmT,KAAOA,GAAQ7T,EACpBU,KAAKiW,KAAOA,EACZjW,KAAKgb,OAASA,UECPC,mBAAT,SAAgBjY,EAAc2P,oEAElB,OADVA,EAAUA,GAAY3P,EAAIE,KAAK0D,WAAmC,EAAtB5G,KAAKqX,QAAQ9Y,QAAuC,YAAzByB,KAAKqX,QAAQ,GAAGjO,QACvEpJ,KAAKkb,QAAQC,SAASnY,EAAK2P,WAAvCpT,EAAMwF,iDAEW+D,EAAAjE,EAAA7E,KAAKqX,oEACLrI,OAAOzP,EAAKyD,WAA/BzD,EAAMwF,2MAER,SAAOxF,WAZT,YAAoBN,EAAa+b,GANjBhb,aAAoB,GAOlC,IAAMsW,EAAY,IAAIC,GAAUtX,EAAK+b,EAAOrP,QAAQ5E,eACpD/G,KAAKkb,QAAU5E,EAAU8E,iBACzBpb,KAAKqX,QAAUf,EAAU+E,cAAclT,IAAI,SAACW,OAAEM,SAAM6M,SAAW,OAAA,IAAIC,GAAO9M,EAAM4R,EAAO3D,QAAQvD,IAAI1K,GAAO6M,EAAM+E,KCTpH,WAAyB5T,QAAAkU,IAgBdzL,oBAAT,SAAiB7M,EAAc0L,4DACf,SAAM,IAAIyH,GAAKnW,KAAKyH,MAAMwO,MAAMjH,OAAOhM,kBAA/C0W,EAAQ5Q,SAEVtL,GADE2V,EAAOnT,KAAKmT,MACEnE,WAAsBmE,EAAKnE,OAAOhM,EAAK0L,EAASgL,iBAAvC,SAAO5Q,mCAftC,YAAoBrB,EAAiByJ,EAAyB8J,GAA9D,MACE9R,aAAMzB,SACN0B,EAAKC,KAAO3B,EAAM2B,KAElB,IAAM+J,EAAO6H,EAAOO,KAAKzH,IAAIrM,EAAM2B,aAEnCD,EAAKgK,KAAOlW,OAAOue,OAAOrI,GAC1BhK,EAAKgK,KAAK6H,OAASA,EACf7R,EAAKgK,KAAKsI,OACZtS,EAAKgK,KAAKsI,MAAMhU,EAAOyJ,KCZ7B,WAA4B9J,QAAAkU,IAMjB3L,oBAAT,SAAiB3M,EAAc0L,0DACjB,SAAM1O,KAAKzC,MAAMA,MAAMyF,GAAK,kBAAlCzD,EAAMuJ,SACZ4F,EAAQjO,MAAMlB,eANhB,YAAoBkI,EAAoBuT,GAAxC,MACE9R,aAAMzB,gBACN0B,EAAK5L,MAAQ,IAAI0d,GAAMxT,EAAMkN,QAASqG,KCN1C,WAA0B5T,QAAAkU,IAMf7L,oBAAT,SAAiBzM,EAAc0L,oCAC7BA,EAAQjO,MAAMT,KAAKf,gBALrB,YAAoBwI,GAApB,MACEyB,aAAMzB,gBACN0B,EAAKlK,IAAMwI,EAAMiU,eCKrB,QAeSC,mBAAP,SAActO,EAAc7L,GAC1B,IACM0P,EADY,IAAIqF,GAAUlJ,EAAMrN,KAAKgb,OAAOrP,QAAQ5E,cAAevF,GAChDoa,mBAAmB5b,KAAKgb,OAAOrP,SACxD,OAAO3L,KAAK6b,YAAY3K,IAEnByK,yBAAP,SAAoBzK,GAGlB,IAFA,IAAIzJ,EACEgH,EAAwB,GACtBhH,EAAQyJ,EAAOC,SACrB1C,EAAU1P,KAAKiB,KAAKqR,WAAW5J,EAAOyJ,IAExC,OAAOzC,GAEFkN,wBAAP,SAAmBlU,EAAsBqU,GACvC,IACE,OAAIlM,GAAWnI,GACN,IAAIoI,GAAIpI,EAAOqU,EAAc9b,KAAKgb,QAEvCtL,GAAcjI,GACT,IAAIkI,GAAOlI,EAAsBzH,KAAKgb,QAExC,IAAIvL,GAAKhI,GAChB,MAAO0G,GACP,MAAM,IAAI4N,EAAW5N,EAAY1G,KAG9BkU,yBAAP,SAAoBzK,GAApB,WACE,OAAO,IAAIP,GAAYO,EAAQ,SAACzJ,EAAOyJ,GAAW,OAAA/H,EAAKkI,WAAW5J,EAAOyJ,MAEjEyK,8BAAV,SAA4B9S,EAAcwC,EAAgB5M,EAAoCiN,iCAApCjN,EAAmBgL,GAAWqC,gDAIzE,OAHP/O,EAAMiD,KAAKgc,OAAO3P,mBAAmBxD,GACvC6C,EAAc,IAAM7C,EACpBpK,EAAO,IAAMoK,KACE7I,KAAKE,MAAO+b,KAAKlf,WACpC,GADMmf,EAAOpT,SACH,SAAOoT,GAEXC,EAAOvO,GAAW5N,KAAKoc,WAAWvT,EAAMwC,EAAM5M,EAAMiN,IAC1D1L,KAAKE,MAAOO,MAAM1D,EAAKof,oBAEd,gCAAMA,UAAb,SAAOrT,iCAGP9I,KAAKE,MAAOM,OAAOzD,gBAErB,SAAO,QAEC4e,wBAAV,SAAsB9S,EAAcwC,EAAgB5M,EAAoCiN,mCAApCjN,EAAmBgL,GAAWqC,gDAC/D,SAAM9L,KAAKgc,OAAOK,OAAOxT,EAAMpK,EAAM4M,EAAMK,kBAAtDlK,EAAWuD,SACVH,GAAAkE,EAAA9I,KAAKgb,QAAOS,MAAMpQ,GAAOU,EAAA/L,KAAK8F,GAAGwW,aAAa9a,uBAAY,SAAMxB,KAAK8F,GAAGyW,SAAS/a,WAAvBuK,EAAAhH,0BAAjE,SAAOH,aAA4FpD,aAvDrG,YAAoBwZ,GAClBhb,KAAKgb,OAASA,EACdhb,KAAKE,MAAQF,KAAKgb,OAAOrP,QAAQzL,MACjCF,KAAK8F,GAAK9F,KAAKgb,OAAOrP,QAAQ7F,GAC9B9F,KAAKwc,UAAYxc,KAAKE,MAAQF,KAAKyc,iBAAmBzc,KAAKoc,WAC3Dpc,KAAKgc,OAAS,IAAIvQ,GAAOzL,KAAKgb,OAAOrP,gBC1B1B,CACb8P,MAAO,SAAUhU,GACf,IAAM6O,EAAY,IAAIC,GAAU9O,EAAMwO,KAAMjW,KAAKgb,OAAOrP,QAAQ5E,eAChE/G,KAAKjD,IAAMuZ,EAAUE,iBAAiB7B,QACtC2B,EAAUI,YACVpL,GAA4B,MAArBgL,EAAUkB,OAAgB,WAAM,MAAA,wBAAiB/P,EAAMsN,aAC9DuB,EAAUoG,UACV1c,KAAKzC,MAAQ+Y,EAAUK,aAEzB3H,OAAQ,SAAYhM,4DACO,OAAzB8F,EAAA9F,EAAI2Z,SAAS/X,EAAA5E,KAAKjD,OAAaiD,KAAKgb,OAAO4B,WAAW5c,KAAKzC,MAAOyF,kBAAlE8F,KAAyBiD,2BCVb8Q,GAActd,GAC5B,OAAIzB,EAAQyB,GAAaA,EACrBjC,EAASiC,IAAqB,EAAbA,EAAIhB,OAAmB,CAACgB,GACzCf,EAASe,GAAatC,OAAO4M,KAAKtK,GAAK4I,IAAI,SAACpL,GAAQ,MAAA,CAACA,EAAKwC,EAAIxC,MAC3D,YAGO+f,GAASvd,GACvB,OAAIzB,EAAQyB,GAAaA,EAClB,CAAEA,GCTX,WAAiC6H,QAAAtK,GASxBigB,kBAAP,WACE/c,KAAKlB,KAEAie,oBAAP,WACE,OAAO/c,KAAKlB,GAEPie,mBAAP,WACE,OAAO/c,KAAKlB,EAAI,GAEXie,mBAAP,WACE,OAAkB,IAAX/c,KAAKlB,GAEPie,kBAAP,WACE,OAAO/c,KAAKlB,IAAMkB,KAAKzB,OAAS,GAE3Bwe,oBAAP,WACE,OAAO/c,KAAKzB,OAASyB,KAAKlB,GAErBie,qBAAP,WACE,OAAO/c,KAAKzB,OAASyB,KAAKlB,EAAI,GAEzBie,qBAAP,WACE,OAAO5D,KAAK1b,UAAUuC,WA3BxB,YAAoBzB,EAAgBye,EAAoBhH,GAAxD,MACE9M,2BAJQC,IAAI,EAKZA,EAAK5K,OAASA,EACd4K,EAAKC,KAAO,UAAG4M,cAAYgH,KCJ/B,IAAMC,GAAY,CAAC,SAAU,QAAS,eAIvB,CACbxe,KAAM,QACNgd,MAAO,SAAUhU,EAAiBqU,GAA3B,IAiBD/E,SAhBET,EAAY,IAAIC,GAAU9O,EAAMwO,KAAMjW,KAAKgb,OAAOrP,QAAQ5E,eAE1DiP,EAAWM,EAAUE,iBACrB0G,EAAQ5G,EAAUE,iBAClBwG,EAAa1G,EAAUQ,YAC7BxL,GACE0K,EAAS1V,QAA4B,OAAlB4c,EAAMvI,SAAoBqI,EAC7C,WAAM,MAAA,uBAAgBvV,EAAMsN,aAG9B/U,KAAKgW,SAAWA,EAASrB,QACzB3U,KAAKgd,WAAaA,EAClBhd,KAAK0Z,KAAO,IAAIvD,GAAKG,EAAUK,aAC/B3W,KAAKyO,UAAY,GACjBzO,KAAKmd,cAAgB,GAGrB,IAAMrO,EAAsB9O,KAAKgb,OAAOoC,OAAOC,YAAYvB,GACxDwB,GAAG,QAAS,WAAM,OAACvG,EAAI5N,EAAKsF,YAC5B6O,GAAG,WAAY,WAAM,OAACvG,EAAI5N,EAAKgU,gBAC/BG,GAAG,aAAc,WAAM,OAAAxO,EAAOlQ,SAC9B0e,GAAG,WAAY,SAAC/T,GAAkB,OAAAwN,EAAEhY,KAAKwK,KACzC+T,GAAG,MAAO,WACT,MAAM,IAAI/a,MAAM,cAAOkF,EAAMsN,4BAGjCjG,EAAOnQ,SAETqQ,OAAQ,SAAYhM,EAAc0L,kFAEF,OADxBnL,EAAIvD,KAAKgb,OAAOuC,SACLzU,EAAA+T,MAAmBvJ,GAAUtT,KAAKgd,WAAYha,kBAA3Dga,EAAalU,gBAAaiD,YAEdxN,gBACRgF,EAAEqL,gBAAgB5O,KAAKmd,cAAena,EAAK0L,WACjD,OADA3C,oBAMW,OAFPyR,EAAc,YAAcxd,KAAKgW,SAAW,IAAMhW,KAAKgd,WAAWjI,UACxE/R,EAAIjE,KAAK,CAAE0e,SAAUza,EAAI8G,YAAY0T,QAClBxd,KAAK0Z,KAAK1K,OAAOhM,WAA9B0W,EAAO3N,SACb/I,EAAIpB,MAEE8b,EAAY1d,KAAKgb,OAAOrP,QAAQgS,wBAClC1gB,OAAO4M,KAAK6P,GAAMpC,OAAO,SAAAjJ,GAAK,OAAA4O,GAAUW,SAASvP,KACjD4O,GAAU3F,OAAO,SAAAjJ,GAAK,YAAYzI,IAAZ8T,EAAKrL,KAE/B2O,EAAaU,EAAUrT,OAAO,SAAC2S,EAAYa,GACzC,MAAiB,WAAbA,EA0BV,SAAoBvf,EAAewf,GACjC,OAAOxf,EAAI6W,MAAM2I,GA3BqBC,CAAOf,EAAYtD,EAAa,QACjD,UAAbmE,EA6BV,SAAmBvf,EAAewf,GAChC,OAAOxf,EAAI6W,MAAM,EAAG2I,GA9BiBnd,CAAMqc,EAAYtD,EAAY,OAqBrE,SAAsBpb,GACpB,OAAO4L,OAAI5L,OAAK0f,UArBLC,CAASjB,IACfA,GAEHha,EAAIiH,YAAYuT,GAAc9D,EAAa,QAAK,GAAKsD,EAAWze,QAC1DiM,EAAQ,CAAE0T,QAAS,IAAInB,GAAYC,EAAWze,OAAQyB,KAAKgd,WAAWjI,UAAW/U,KAAKgW,WAC5FhT,EAAIjE,KAAKyL,8CACU2T,EAAAtZ,EAAAmY,oDAARoB,UACT5T,EAAMxK,KAAKgW,UAAYoI,KACjB7a,EAAEqL,gBAAgB5O,KAAKyO,UAAWzL,EAAK0L,YAC7C,GADA3C,SACI2C,EAAe,MAEjB,OADAA,EAAe,OAAI,QAGrBA,EAAkB,UAAI,EACtBlE,EAAM0T,QAAQpe,qNAEhBkD,EAAIpB,sBC1EO,CACb6Z,MAAO,SAAU4C,EAAoBvC,GAA9B,WACCxF,EAAY,IAAIC,GAAU8H,EAASpI,KAAMjW,KAAKgb,OAAOrP,QAAQ5E,eACnE/G,KAAKgW,SAoBT,SAA2BM,GACzB,IAAMmE,EAAOnE,EAAUE,iBAAiB7B,QACxC,GAAI8F,EAAM,OAAOA,EACjB,IAAM6D,EAAShI,EAAUsC,aACzB,GAAI0F,EAAQ,OAAOrJ,GAAgBqJ,GAxBjBC,CAAiBjI,GACjChL,GAAOtL,KAAKgW,SAAU,WAAM,MAAA,UAAGqI,EAASpI,gCAExCjW,KAAKyO,UAAY,GAEjB,IAAMK,EAAS9O,KAAKgb,OAAOoC,OAAOC,YAAYvB,GAC9ChN,EAAOwO,GAAG,iBAAkB,WAAM,OAAAxO,EAAOlQ,SACtC0e,GAAG,WAAY,SAAC/T,GAAkB,OAAAJ,EAAKsF,UAAU1P,KAAKwK,KACtD+T,GAAG,MAAO,WACT,MAAM,IAAI/a,MAAM,cAAO8b,EAAStJ,4BAEpCjG,EAAOnQ,SAETqQ,OAAQ,SAAYhM,0DAEL,SADHhD,KAAKgb,OAAOuC,SACD3O,gBAAgB5O,KAAKyO,UAAWzL,kBAA/CqK,EAAOvE,SACb9F,EAAI2Z,SAAS3c,KAAKgW,UAAY3I,eCtB7BmR,GAAAA,MCGU,CACb/C,MAAO,SAAU4C,EAAoBvC,GAA9B,WACL9b,KAAKye,KAAO,IAAIxD,GAAMoD,EAASpI,KAAMjW,KAAKgb,QAC1Chb,KAAK0e,MAAQ,GACb1e,KAAKmd,cAAgB,GAErB,IAAIpG,EAAgB,GACdjI,EAAsB9O,KAAKgb,OAAOoC,OAAOC,YAAYvB,GACxDwB,GAAG,WAAY,SAAC7V,GACfsP,EAAI,GAIJ,IAFA,IAAMT,EAAY,IAAIC,GAAU9O,EAAMwO,KAAM9M,EAAK6R,OAAOrP,QAAQ5E,gBAExDuP,EAAUhR,OAAO,CACvB,IAAM/H,EAAQ+Y,EAAUQ,YACxB3N,EAAKuV,MAAM3f,KAAK,CACdQ,IAAKhC,EACLkR,UAAWsI,IAEbT,EAAU0C,OAAO,QAGpBsE,GAAG,WAAY,WAAM,OAACvG,EAAI5N,EAAKgU,gBAC/BG,GAAG,cAAe,WAAM,OAAAxO,EAAOlQ,SAC/B0e,GAAG,WAAY,SAAC/T,GAAkB,OAAAwN,EAAEhY,KAAKwK,KACzC+T,GAAG,MAAO,WACT,MAAM,IAAI/a,MAAM,cAAO8b,EAAStJ,4BAGpCjG,EAAOnQ,SAGTqQ,OAAQ,SAAYhM,EAAc0L,0EAEX,OADfnL,EAAIvD,KAAKgb,OAAOuC,SACTzU,EAAApL,KAAcsC,KAAKye,KAAKlhB,MAAMyF,EAAKA,EAAIE,KAAK0D,mBAAnD6X,EAAO3V,gBAAQoD,mDACAtH,EAAAC,EAAA7E,KAAK0e,wDAAfC,UACGrL,GAAUqL,EAAOpf,IAAKyD,EAAKA,EAAIE,KAAK0D,aACpC6X,WACJlb,EAAEqL,gBAAgB+P,EAAOlQ,UAAWzL,EAAK0L,YAC/C,OADAxC,qMAIJ,SAAM3I,EAAEqL,gBAAgB5O,KAAKmd,cAAena,EAAK0L,mBAAjDxC,qBCzCW,CACbuP,MAAO,SAAU4C,EAAoBvC,GACnC,IAAMhN,EAAS9O,KAAKgb,OAAOoC,OAAOC,YAAYvB,GAC9ChN,EACGwO,GAAG,QAAS,SAAC7V,GACO,eAAfA,EAAM2B,MAAuB0F,EAAOlQ,SAEzC0e,GAAG,MAAO,WACT,MAAM,IAAI/a,MAAM,cAAO8b,EAAStJ,4BAEpCjG,EAAOnQ,WFdN6f,GAAAA,GAAAA,8BAIHA,8BAGaA,MGAA,CACbI,iBACAC,kBACApD,MAAO,SAAUhU,GACf,IAAMwO,EAAOxO,EAAMwO,KACbK,EAAY,IAAIC,GAAUN,EAAMjW,KAAKgb,OAAOrP,QAAQ5E,eAG1D,IAFA/G,KAAW,KAAIA,KAAK4e,cAActI,EAAWtW,KAAKgb,QAClDhb,KAAkB,YAAIyH,EAAMoB,MACpByN,EAAUhR,OAAO,CACvBgR,EAAUI,YACV,IAAM5O,EAAQwO,EAAUS,EAClB+H,EAAUxI,EAAUE,iBAC1B,IAAwB,SAApBsI,EAAQnK,SAA0C,QAApBmK,EAAQnK,WACxC2B,EAAUI,YAEe,MAArBJ,EAAUkB,QAAgB,CAC5B,IAAMja,EAAQ+Y,EAAUQ,YAExB,GAAIvZ,EAAO,CACT,IAAMwhB,EAAWzI,EAAUS,EAEvBiI,SACkB,OAFR1I,EAAUE,iBAEd7B,QAAkBqK,EAAQ1I,EAAUE,iBACzCF,EAAUS,EAAIgI,EAEnB/e,KAAK8e,EAAQnK,SAAW,CAAEpX,QAAOyhB,MAAOA,GAASA,EAAMrK,SACvD2B,EAAUI,YACe,MAArBJ,EAAUkB,QAAgBlB,EAAUoG,UAExC,UAONpG,EAAUS,EAAIjP,EACd,MAEF9H,KAAK0Z,KAAO,IAAIvD,GAAKG,EAAUK,cAEjC3H,OAAQ,SAAYhM,EAAc0L,gGAEf,OADTsM,GAAFlS,EAAmB9I,aAAT0Z,YACO1Z,KAAK6e,eAAe7e,KAAW,KAAGgD,EAAKgY,WAK9C,OAJhB1P,GADM9J,EAAWmZ,SACA,WAAM,MAAA,4BAAqBnZ,SAEtCyd,EAAW,IAAIvV,GAAQ,GAAI1G,EAAIE,KAAM,CAAEmI,KAAMrI,EAAIqI,KAAMxE,QAAS7D,EAAI6D,QAASF,gBAAiB3D,EAAI2D,kBAClG6D,EAAQyU,EAAStC,SACvB/X,EAAA0F,KAASE,MAAakP,EAAK1K,OAAOhM,cAAlC4B,yBAAgB+V,YACZ3a,KAAW,OACP+E,EAAmB/E,KAAW,KAA5BzC,UAAOyhB,UACfxU,EAAMwU,GAASxd,GAAY8R,GAAU/V,EAAOyF,KAG1ChD,KAAU,IAAV,aACIkM,EAAmBlM,KAAU,IAA3BzC,UAAOyhB,UAEfhC,EAAaH,GADTG,EAAa1J,GAAU/V,EAAOyF,IAElCwH,EAAe,QAAI,IAAIuS,GAAYC,EAAWze,OAAQhB,EAAMwX,UAAWiK,6CACpDb,EAAAtZ,EAAAmY,oDAARoB,UACT5T,EAAMwU,GAASZ,KACSpD,EAAOkE,kBAAkB1d,EAAUyd,EAAS5T,KAAMrL,KAAkB,sBAC5F,OADMyO,EAAYkM,YACZK,EAAOuC,SAAS3O,gBAAgBH,EAAWwQ,EAAUvQ,WAA3DiM,SACAnQ,EAAe,QAAE1K,kOAGD,SAAMkb,EAAOkE,kBAAkB1d,EAAUyd,EAAS5T,KAAMrL,KAAkB,sBAC5F,OADMyO,EAAYkM,YACZK,EAAOuC,SAAS3O,gBAAgBH,EAAWwQ,EAAUvQ,YAA3DiM,oDAaUiE,GAAetI,EAAsB0E,GACnD,GAAIA,EAAOrP,QAAQ5F,gBAAiB,CAClC,IAAM8C,EAAOyN,EAAUQ,YACvB,QAAalR,IAATiD,EAAoB,MAAM,IAAIsW,UAAU,4BAAqB7I,EAAUzO,YAC3E,MAAuB,SAAnBgB,EAAKkM,UAA6B,KAClCC,GAAyBnM,GAGpBuW,GADWpE,EAAOS,MAAMxG,GAAgBpM,KAG1CA,EAET,IAAMqI,SAAaoF,EAAU+I,qBAAqBrE,EAAOrP,cACnD8C,EAAY2Q,GAASpE,EAAOoC,OAAOvB,YAAY3K,IACrD,MAAqB,SAAdzC,EAAuB,KAAOA,EAGvC,SAAS2Q,GAAU3Q,GAEjB,OAAyB,IAArBA,EAAUlQ,QAAgB+gB,GAAuB7Q,EAAU,GAAGhH,OAAegH,EAAU,GAAGhH,MAAMiU,aAC7FjN,WAGOoQ,GAAgBhW,EAAsB7F,EAAcgY,GAClE,MAAoB,iBAATnS,EAA0BA,EACjC0W,MAAMzhB,QAAQ+K,GAAcmS,EAAOuC,SAAS3O,gBAAgB/F,EAAM7F,GAC/DsQ,GAAUzK,EAAM7F,aC7GV,CACb4b,iBACAC,kBACApD,MAAO,SAAUhU,GACf,IAAMwO,EAAOxO,EAAMwO,KACbK,EAAY,IAAIC,GAAUN,EAAMjW,KAAKgb,OAAOrP,QAAQ5E,eAC1D/G,KAAW,KAAIA,KAAK4e,cAActI,EAAWtW,KAAKgb,QAClDhb,KAAkB,YAAIyH,EAAMoB,KAE5B,IAAMf,EAAQwO,EAAUS,EAEA,SADRT,EAAUE,iBACd7B,SACV2B,EAAUI,YACe,MAArBJ,EAAUkB,OACZxX,KAAKwf,QAAUlJ,EAAUQ,YACpBR,EAAUS,EAAIjP,GAChBwO,EAAUS,EAAIjP,EAErB9H,KAAK0Z,KAAO,IAAIvD,GAAKG,EAAUK,YAAa3W,KAAKgb,OAAOrP,QAAQhG,gBAElEqJ,OAAQ,SAAYhM,EAAc0L,0EAGf,OAFTsM,GAAFlS,EAA4B9I,aAAlB0Z,SAAM8F,YACdjC,EAAavC,cACEhb,KAAK6e,eAAe7e,KAAW,KAAGgD,EAAKgY,WAMhD,OALd1P,GADM9J,EAAWoD,SACA,WAAM,MAAA,4BAAqBpD,SAEtCie,EAAQzc,EAAI0c,aAAa,SAAU,aACzC1c,EAAIiH,YAAY,SAAU,IAC1BjH,EAAIiH,YAAY,YAAauU,GAAUmB,WACnBjG,EAAK1K,OAAOhM,WAEd,OAFZwH,EAAQ5F,SACV4a,IAAShV,EAAMhJ,GAAY8R,GAAUkM,EAASxc,OAC1BgY,EAAOkE,kBAAkB1d,EAAUwB,EAAIqI,KAAMrL,KAAkB,qBAEvF,OAFMyO,EAAY7J,SAClB5B,EAAIjE,KAAKiE,EAAIE,KAAKyC,cAAgB,CAAEia,QAASpV,GAAUA,MACjD+S,EAAS3O,gBAAgBH,EAAWzL,EAAK0L,kBAA/C9J,SACA5B,EAAIpB,MACJoB,EAAI6c,gBAAgBJ,eCpCT,CACbhE,MAAO,SAAUhU,GACf,IAAM6O,EAAY,IAAIC,GAAU9O,EAAMwO,KAAMjW,KAAKgb,OAAOrP,QAAQ5E,eAChE/G,KAAKgW,SAAWM,EAAUE,iBAAiB7B,SAE7C3F,OAAQ,SAAUxH,EAAkBkH,GAClC,IAAMlE,EAAQhD,EAAQ2C,aACjBtM,EAAS2M,EAAMxK,KAAKgW,aACvBxL,EAAMxK,KAAKgW,UAAY,GAEzBtH,EAAQjO,MAAMhD,IAAY+M,EAAMxK,KAAKgW,iBCT1B,CACbyF,MAAO,SAAU4C,GACf,IAAM/H,EAAY,IAAIC,GAAU8H,EAASpI,KAAMjW,KAAKgb,OAAOrP,QAAQ5E,eAC7D+Y,EAAQxJ,EAAUQ,YAYxB,IAXAR,EAAUI,YAEV1W,KAAK6L,WAAa,GAEdiU,IACuB,MAArBxJ,EAAUkB,QACZxX,KAAK8f,MAAQA,EACbxJ,EAAUoG,WACL1c,KAAK6L,WAAW9M,KAAK+gB,KAGtBxJ,EAAUhR,OAAO,CACvB,IAAM/H,EAAQ+Y,EAAUQ,YACpBvZ,GAAOyC,KAAK6L,WAAW9M,KAAKxB,GAChC+Y,EAAU0C,OAAO,KAEnB1N,GAAOtL,KAAK6L,WAAWtN,OAAQ,WAAM,MAAA,4BAAqB8f,EAAStJ,cAGrE/F,OAAQ,SAAUhM,EAAc0L,GAC9B,IAAMoR,EAAQxM,GAAUtT,KAAK8f,MAAO9c,GAC9B+c,EAAc,gBAASD,OAAW9f,KAAK6L,WAAWpD,KAAK,KACvDuX,EAAShd,EAAI8G,YAAY,SAC3BmW,EAAMD,EAAOD,QAELna,IAARqa,IACFA,EAAMD,EAAOD,GAAe,GAG9B,IAAM7U,EAAYlL,KAAK6L,WAAWoU,GAClCA,GAAOA,EAAM,GAAKjgB,KAAK6L,WAAWtN,OAClCyhB,EAAOD,GAAeE,EACtB,IAAM5S,EAAOiG,GAAUpI,EAAWlI,GAClC0L,EAAQjO,MAAM4M,QCvCH,CACboO,MAAO,SAAU4C,EAAoBvC,GAA9B,IAID/E,SAHJ/W,KAAKkgB,SAAW,GAChBlgB,KAAKmd,cAAgB,GAGrBnd,KAAKgb,OAAOoC,OAAOC,YAAYvB,GAC5BwB,GAAG,QAAS,WAAM,OAAAnU,EAAK+W,SAASnhB,KAAK,CACpCwM,UAAW,IAAI0P,GAAMoD,EAASpI,KAAM9M,EAAK6R,QACzCvM,UAAYsI,EAAI,OAEjBuG,GAAG,YAAa,SAAC7V,GAAoB,OAAA0B,EAAK+W,SAASnhB,KAAK,CACvDwM,UAAW,IAAI0P,GAAMxT,EAAMwO,KAAM9M,EAAK6R,QACtCvM,UAAYsI,EAAI,OAEjBuG,GAAG,WAAY,WAAM,OAACvG,EAAI5N,EAAKgU,gBAC/BG,GAAG,YAAa,WAActd,KAAKpB,SACnC0e,GAAG,WAAY,SAAC/T,GAAkB,OAAAwN,EAAEhY,KAAKwK,KACzC+T,GAAG,MAAO,WAAQ,MAAM,IAAI/a,MAAM,cAAO8b,EAAStJ,4BAClDpW,SAGLqQ,OAAQ,SAAYhM,EAAc0L,0EAC1BnL,EAAIvD,KAAKgb,OAAOuC,iDAEiBzU,EAAAjE,EAAA7E,KAAKkgB,2DAAjCnU,UAAER,cAAWkD,iBACFlD,EAAUhO,MAAMyF,EAAKA,EAAIE,KAAK0D,2BAC9C7D,EADUmJ,SACMlJ,MACZO,EAAEqL,gBAAgBH,EAAWzL,EAAK0L,iBACxC,OADAxC,qMAIJ,SAAM3I,EAAEqL,gBAAgB5O,KAAKmd,cAAena,EAAK0L,mBAAjDxC,qBC/BW,CACbuP,MAAO,SAAUhU,GACf,IAAM6O,EAAY,IAAIC,GAAU9O,EAAMwO,KAAMjW,KAAKgb,OAAOrP,QAAQ5E,eAChE/G,KAAKgW,SAAWM,EAAUE,iBAAiB7B,SAE7C3F,OAAQ,SAAUxH,EAAkBkH,GAClC,IAAMlE,EAAQhD,EAAQ2C,aACjBtM,EAAS2M,EAAMxK,KAAKgW,aACvBxL,EAAMxK,KAAKgW,UAAY,GAEzB,IAAMzW,EAAMiL,EAAMxK,KAAKgW,UACvBxL,EAAMxK,KAAKgW,YACXtH,EAAQjO,MAAMhD,EAAU8B,SCVb,CACbqf,iBACAC,kBACApD,MAAO,SAAUhU,EAAiBqU,GAChC,IAAMxF,EAAY,IAAIC,GAAU9O,EAAMwO,KAAMjW,KAAKgb,OAAOrP,QAAQ5E,eAChE/G,KAAW,KAAIA,KAAK4e,cAActI,EAAWtW,KAAKgb,QAClDhb,KAAkB,YAAIyH,EAAMoB,KAC5B7I,KAAK0Z,KAAO,IAAIvD,GAAKG,EAAUK,aAC/B3W,KAAKkc,KAAOlc,KAAKgb,OAAOoC,OAAOvB,YAAYC,IAE7C9M,OAAQ,SAAYhM,EAAc0L,qFACxBsM,GAAFlS,EAAyB9I,aAAf0Z,SAAM7Q,SACd0U,EAAavC,WACR,OAATnS,SACF7F,EAAIiH,YAAY,YAAauU,GAAUmB,WACjCpC,EAAS3O,gBAAgB5O,KAAKkc,KAAMlZ,EAAK0L,YAC/C,OADA3J,oBAGe,SAAM/E,KAAK6e,eAAe7e,KAAW,KAAGgD,EAAKgY,WAE5C,OADlB1P,GADM9J,EAAWuD,SACA,WAAM,MAAA,4BAAqBvD,YACpBwZ,EAAOmF,iBAAiB3e,EAAUwB,EAAIqI,KAAMrL,KAAkB,qBAIzE,OAJPyO,EAAY1J,SAGlB/B,EAAIiH,YAAY,YAAauU,GAAU4B,UACpB7C,EAAS3O,gBAAgB5O,KAAKkc,KAAMlZ,WAQ9C,OARHqK,EAAOtI,cAIMa,KAHbya,EAASrd,EAAI8G,YAAY,WAGpB,MAAmBuW,EAAO,IAAM,SAACC,EAAmB5R,GAAqB,OAAAA,EAAQjO,MAAM4M,KAClGrK,EAAIiH,YAAY,YAAauU,GAAUmB,QAGvC5T,GAAAnH,EAAA5B,GAAIjE,QAAW2a,EAAK1K,OAAOhM,WAC3B,OADA+I,WAAShH,cACHwY,EAAS3O,gBAAgBH,EAAWzL,EAAK0L,kBAA/C3J,SACA/B,EAAIpB,mBCrCuBwF,QAAAtK,GAWtByjB,mBAAP,WACE,OAAOvgB,KAAKwgB,wBAXd,YAEUA,gBAAAA,aAA8C,MAAA,KAFxD,MAIEtX,2BAFQC,mBAAAqX,cCDG,CACb/E,MAAA,SAAsBhU,EAAiBqU,GAAvC,WACQ7D,EAAQ,MAAMwI,KAAKhZ,EAAMwO,MAC/BjW,KAAK0gB,MAAQzI,EAAQA,EAAM,GAAK,GAChCjY,KAAKkc,KAAO,GACZlc,KAAKgb,OAAOoC,OAAOC,YAAYvB,GAC5BwB,GAAG,eAAgB,WAActd,KAAKpB,SACtC0e,GAAG,WAAY,SAAC/T,GAAkB,OAAAJ,EAAK+S,KAAKnd,KAAKwK,KACjD+T,GAAG,MAAO,WAAQ,MAAM,IAAI/a,MAAM,cAAOkF,EAAMsN,4BAC/CpW,SAGHqQ,OAAF,SAAyBhM,EAAc0L,iEAC/BiS,EAAc3gB,KAAK4gB,eAAe5d,GACpCA,EAAI8G,YAAY,eAAiB0U,GAAU4B,aAC7Cpd,EAAI8G,YAAY,UAAU9J,KAAK0gB,OAASC,gBAExC,SAAMA,EAAY,IAAIJ,GAAa7R,WAAnC5F,wCAIJ8X,eAAA,SAA+B5d,GAGP,SAAhB6d,EAA4BC,EAAuBpS,oDAGvD,OADA1L,EAAIjE,KAAK,CAAE2hB,MAAOI,OACZ9F,EAAOuC,SAAS3O,gBAAgBsN,EAAMlZ,EAAK0L,kBAAjD5F,SACA9F,EAAIpB,aANA,IAAEoZ,EAAiBhb,YAATkc,EAASlc,UACnB+gB,EAAc/d,EAAI8G,YAAY,UAAU9J,KAAK0gB,OAOnD,OAAOK,EACH,SAACD,EAAuBpS,GAAqB,OAAAqS,EAAY,IAAIR,GAAU,WAAM,OAAAM,EAAcC,EAAYpS,KAAWA,IAClHmS,OClCO,CACbpF,MAAO,SAAU4C,EAAoBvC,GAA9B,WACL9b,KAAKkR,OAAS,GAEd,IAAMpC,EAAS9O,KAAKgb,OAAOoC,OAAOC,YAAYvB,GAC9ChN,EACGwO,GAAG,QAAS,SAAC7V,GACO,WAAfA,EAAM2B,KAAmB0F,EAAOlQ,OAC/BuK,EAAK+H,OAAOnS,KAAK0I,KAEvB6V,GAAG,MAAO,WACT,MAAM,IAAI/a,MAAM,cAAO8b,EAAStJ,4BAEpCjG,EAAOnQ,SAETqQ,OAAQ,WACN,OAAOhP,KAAKkR,OAAO/I,IAAI,SAACV,GAAyB,OAAAA,EAAMsN,YAAWtM,KAAK,UChBrCrB,QAAA2V,IAO7BiE,iBAAP,WACE,OAAOjZ,KAAKkZ,MAAMjhB,KAAKlB,EAAIkB,KAAKkhB,MAAQ,GAEnCF,kBAAP,WACE,OAAQhhB,KAAKlB,EAAIkB,KAAKkhB,MAEjBF,iBAAP,WACE,OAAOhhB,KAAKmhB,OAAS,GAEhBH,uBAAP,WACE,OAAuB,IAAhBhhB,KAAKmhB,QAEPH,sBAAP,WACE,OAAOhhB,KAAK+I,QAAU/I,KAAKkhB,UAlB7B,YAAoB3iB,EAAgB2iB,EAAclE,EAAoBhH,GAAtE,MACE9M,aAAM3K,EAAQye,EAAYhH,gBAC1B7M,EAAK5K,OAASA,EACd4K,EAAK+X,KAAOA,QCeV3F,GAA0C,CAC9C6F,UAAQC,IAAOC,GAAKC,WAASC,KAAQC,GAAMC,WAAS9B,WAAS5Q,UAAQ2S,aAAWC,aAAWC,SAAOC,GAAMC,GAAIC,UAAQtB,SAAOuB,OAAKC,SClBnH,CACbzG,MAAO,SAAU4C,EAAoBvC,GAA9B,WACCxF,EAAY,IAAIC,GAAU8H,EAASpI,KAAMjW,KAAKgb,OAAOrP,QAAQ5E,eAE7DiP,EAAWM,EAAUE,iBAC3BF,EAAUI,YAEV,IAQIK,EAREoL,EAAM7L,EAAUE,iBACtBlL,GAAO6W,GAAuB,OAAhBA,EAAIxN,QAAkB,WAAM,MAAA,uBAAgB0J,EAAStJ,aAEnE/U,KAAKgW,SAAWA,EAASrB,QACzB3U,KAAKgd,WAAa1G,EAAUQ,YAC5B9W,KAAK0Z,KAAO,IAAIvD,GAAKG,EAAUK,aAC/B3W,KAAKyO,UAAY,GAGjB,IAAMK,EAAsB9O,KAAKgb,OAAOoC,OAAOC,YAAYvB,GACxDwB,GAAG,QAAS,WAAM,OAACvG,EAAI5N,EAAKsF,YAC5B6O,GAAG,kBAAmB,WAAM,OAAAxO,EAAOlQ,SACnC0e,GAAG,WAAY,SAAC/T,GAAkB,OAAAwN,EAAEhY,KAAKwK,KACzC+T,GAAG,MAAO,WACT,MAAM,IAAI/a,MAAM,cAAO8b,EAAStJ,4BAGpCjG,EAAOnQ,SAGTqQ,OAAQ,SAAYhM,EAAc0L,4EACF,OAAb5F,EAAA+T,MAAmBvJ,GAAUtT,KAAKgd,WAAYha,WAClD,OADTga,EAAalU,gBAAalE,cACX5E,KAAK0Z,KAAK1K,OAAOhM,WAA9B0W,EAAO9U,SACPmZ,EAASrE,EAAKqE,QAAU,EACxBpd,OAAwBiF,IAAf8T,EAAK/Y,MAAuBqc,EAAWze,OAASmb,EAAK/Y,MAEpEqc,EAAaA,EAAW7H,MAAM4I,EAAQA,EAASpd,GACzCugB,EAAOxH,EAAKwH,MAAQlE,EAAWze,OAE/BgF,EAAIvD,KAAKgb,OAAOuC,SAChB6E,EAAe,IAAIpB,GAAiBhE,EAAWze,OAAQ2iB,EAAMlhB,KAAKgd,WAAWjI,UAAW/U,KAAKgW,UAC7FxL,EAAQ,CAAE4X,gBAChBpf,EAAIjE,KAAKyL,GAEAyV,EAAM,0BAAGA,EAAMjD,EAAWze,QACjCiM,EAAMxK,KAAKgW,UAAYgH,EAAWiD,GACN,IAAxBmC,EAAajB,SACY,IAAvBiB,EAAahN,OAAa1G,EAAQjO,MAAM,SAC5CiO,EAAQjO,MAAM,wBAAiB2hB,EAAahN,cAE9C1G,EAAQjO,MAAM,wBAAiB2hB,EAAarZ,gBACtCxF,EAAEqL,gBAAgB5O,KAAKyO,UAAWzL,EAAK0L,kBAA7C9J,SACA8J,EAAQjO,MAAM,iCAR2Bwf,IAAOmC,EAAatiB,2BAU3Dkd,EAAWze,QAAQmQ,EAAQjO,MAAM,SACrCuC,EAAIpB,eDlCoIygB,OErB7H,CACb5G,MAAO,SAAU4C,EAAoBvC,GAA9B,IAGD/E,SAFJ/W,KAAKkgB,SAAW,GAChBlgB,KAAKmd,cAAgB,GAErBnd,KAAKgb,OAAOoC,OAAOC,YAAYvB,GAC5BwB,GAAG,QAAS,WAAM,OAAAnU,EAAK+W,SAASnhB,KAAK,CACpCwM,UAAW,IAAI0P,GAAMoD,EAASpI,KAAM9M,EAAK6R,QACzCnZ,KAAMoB,EACNwL,UAAYsI,EAAI,OAEjBuG,GAAG,YAAa,SAAC7V,GAAoB,OAAA0B,EAAK+W,SAASnhB,KAAK,CACvDwM,UAAW,IAAI0P,GAAMxT,EAAMwO,KAAM9M,EAAK6R,QACtCnZ,KAAMkB,EACN0L,UAAYsI,EAAI,OAEjBuG,GAAG,WAAY,WAAM,OAACvG,EAAI5N,EAAKgU,gBAC/BG,GAAG,gBAAiB,WAActd,KAAKpB,SACvC0e,GAAG,WAAY,SAAC/T,GAAkB,OAAAwN,EAAEhY,KAAKwK,KACzC+T,GAAG,MAAO,WAAQ,MAAM,IAAI/a,MAAM,cAAO8b,EAAStJ,4BAClDpW,SAGLqQ,OAAQ,SAAYhM,EAAc0L,8EAC1BnL,EAAIvD,KAAKgb,OAAOuC,iDAEuBzU,EAAAjE,EAAA7E,KAAKkgB,2DAAvCnU,UAAER,cAAW+W,SAAM7T,iBACRlD,EAAUhO,MAAMyF,EAAKA,EAAIE,KAAK0D,2BAA5CrJ,EAAQ2O,SACVoW,EAAK/kB,EAAOyF,MACRO,EAAEqL,gBAAgBH,EAAWzL,EAAK0L,iBACxC,OADAxC,qMAKJ,SAAM3I,EAAEqL,gBAAgB5O,KAAKmd,cAAena,EAAK0L,mBAAjDxC,kBFbgJqW,MGrBrI,CACbvT,OAAQ,SAAUhM,EAAc0L,GAC9BA,EAAe,OAAI,IHmB6I+O,SIrBrJ,CACbzO,OAAQ,SAAUhM,EAAc0L,GAC9BA,EAAkB,UAAI,IJmBgK8T,KKnB3K,CACb/G,MAAO,SAAUhU,GACfzH,KAAKzC,MAAQ,IAAI0d,GAAMxT,EAAMwO,KAAMjW,KAAKgb,SAE1ChM,OAAQ,SAAYhM,EAAc0L,0DACpB,SAAM1O,KAAKzC,MAAMA,MAAMyF,GAAK,kBAAlCzD,EAAMuJ,SACZ4F,EAAQjO,MAAMlB,YLa8Kyb,OMnBjL,CACbS,MAAO,SAAUhU,GACf,IACMyJ,EADY,IAAIqF,GAAU9O,EAAMwO,KAAMjW,KAAKgb,OAAOrP,QAAQ5E,eACvC0b,oBAAoBziB,KAAKgb,OAAOrP,SACzD3L,KAAKkc,KAAOlc,KAAKgb,OAAOoC,OAAOvB,YAAY3K,IAE7ClC,OAAQ,SAAYhM,EAAc0L,oDAChC,SAAM1O,KAAKgb,OAAOuC,SAAS3O,gBAAgB5O,KAAKkc,KAAMlZ,EAAK0L,kBAA3D5F,mBCTE4Z,GAAY,CAChBC,IAAK,QACL/e,IAAK,OACLH,IAAK,OACLmf,IAAK,QACLC,IAAK,SAEDC,GAAc,CAClBC,QAAS,IACTC,OAAQ,IACRC,OAAQ,IACRC,QAAS,IACTC,QAAS,cAGKC,GAAQnkB,GACtB,OAAOxB,EAAUwB,GAAKQ,QAAQ,aAAc,SAAA4jB,GAAK,OAAAX,GAAUW,KChBtD,IAAMC,GAAMvb,KAAKub,IACXC,GAAUxb,KAAKC,IACfwb,GAASzb,KAAKE,IACdwb,GAAO1b,KAAK0b,KAEZxC,GAAQlZ,KAAKkZ,MCJ1B,IAAMyC,GAAU,gCACVC,GAAa,CACjB,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAChE,YAAa,UAAW,WAAY,YAEhCC,GAAW,CACf,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAE9DC,GAAkBF,GAAWxb,IAAI2b,IACjCC,GAAgBH,GAASzb,IAAI2b,IAC7BE,GAAW,CACfC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,QAAW,MAQb,SAASN,GAAM7kB,GACb,OAAOA,EAAIkW,MAAM,EAAG,GAQtB,SAASkP,GAAcC,GAErB,IADA,IAAIhc,EAAM,EACDxJ,EAAI,EAAGA,EAAIwlB,EAAEC,aAAczlB,EAClCwJ,GALK,CAAC,GAiBV,SAAqBgc,GACnB,IAAME,EAAOF,EAAEG,cACf,QAAyB,IAAP,EAAPD,MAAoBA,EAAO,KAAQA,EAAO,KAAQ,GAAKA,IApBtDE,CAMSJ,GANO,GAAK,GAChB,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAK7BxlB,GAExB,OAAOwJ,EAAMgc,EAAEK,UAEjB,SAASC,GAAeN,EAAeO,GAErC,IAAMC,EAAMT,GAAaC,IAAMO,EAAWP,EAAES,UAGtCtX,EAAQ,EADD,IAAIuX,KAAKV,EAAEG,cAAe,EAAG,GACnBM,SAAWF,EAClC,OAAOxnB,OAAO0K,KAAKkZ,OAAO6D,EAAMrX,GAAQ,GAAK,GAgB/C,IAAMwX,GAAY,CAChBX,EAAG,EACHnW,EAAG,EACH+W,EAAG,EACHC,EAAG,EACH3S,EAAG,EACHrU,EAAG,EACHmF,EAAG,EACH8hB,EAAG,EACH/B,EAAG,EACHgC,EAAG,EACHC,EAAG,EACHC,EAAG,EACHC,EAAG,GAICC,GAAW,CACf9lB,EAAG,IACH+lB,EAAG,IACH9lB,EAAG,IACH+lB,EAAG,IACHxgB,EAAG,IACHgJ,EAAG,IACHhQ,EAAG,IACHmF,EAAG,IACHyT,EAAG,IACH6O,EAAG,KAECC,GAAc,CAClBlmB,EAAG,SAAC2kB,GAAkB,OAAAP,GAAcO,EAAES,WACtCW,EAAG,SAACpB,GAAkB,OAAAV,GAASU,EAAES,WACjCnlB,EAAG,SAAC0kB,GAAkB,OAAAT,GAAgBS,EAAEC,aACxCoB,EAAG,SAACrB,GAAkB,OAAAX,GAAWW,EAAEC,aACnCpf,EAAG,SAACmf,GAAkB,OAAAA,EAAEwB,kBACxBC,EAAG,SAACzB,GAAkB,OAxCxB,SAAkBA,GAChB,OAAO0B,SAAS1B,EAAEG,cAActnB,WAAW8oB,UAAU,EAAG,GAAI,IAuCtCC,CAAQ5B,IAC9BA,EAAG,SAACA,GAAkB,OAAAA,EAAEK,WACxBxW,EAAG,SAACmW,GAAkB,OAAAA,EAAEK,WACxBO,EAAG,SAACZ,GAAkB,OAAAA,EAAE6B,YACxBhB,EAAG,SAACb,GAAkB,OAAAjnB,OAAOinB,EAAE6B,WAAa,IAAM,KAClD3T,EAAG,SAAC8R,GAAkB,OAAAD,GAAaC,IACnCnmB,EAAG,SAACmmB,GAAkB,OAAAA,EAAE6B,YACxB7iB,EAAG,SAACghB,GAAkB,OAAAjnB,OAAOinB,EAAE6B,WAAa,IAAM,KAClDf,EAAG,SAACd,GAAkB,OAAAA,EAAE8B,mBACxB/C,EAAG,SAACiB,GAAkB,OAAAA,EAAEC,WAAa,GACrCc,EAAG,SAACf,GAAkB,OAAAA,EAAE+B,cACxBrP,EAAG,SAACsN,EAAephB,GACjB,IAAMojB,EAAQnW,OAAOjN,EAAKojB,QAAU,EAEpC,gBlFHoBrnB,EAAUV,EAAgBW,GAChD,oBADgDA,OACzCC,EAAIF,EAAKV,EAAQW,EAAI,SAACD,EAAKC,GAAO,OAAAD,EAAMC,IkFEtCqnB,CADKlpB,OAAOinB,EAAE8B,mBAAmBhN,OAAO,EAAGkN,GAC/BA,EAAO,MAE5BvP,EAAG,SAACuN,GAAkB,OAACA,EAAE6B,WAAa,GAAK,KAAO,MAClDP,EAAG,SAACtB,GAAkB,OAACA,EAAE6B,WAAa,GAAK,KAAO,MAClDK,EAAG,SAAClC,GAAkB,OA/DxB,SAAoBA,GAClB,IAAMrlB,EAAMqlB,EAAEK,UAAUxnB,WAClBspB,EAAQT,SAAS/mB,EAAIkW,OAAO,IAClC,OAAO6O,GAASyC,IAAUzC,GAAkB,QA4DtB0C,CAAUpC,IAChCqC,EAAG,SAACrC,GAAkB,OAAAvc,KAAK6e,MAAMtC,EAAEuC,UAAY,MAC/CvB,EAAG,SAAChB,GAAkB,OAAAA,EAAEwC,cACxBC,EAAG,SAACzC,GAAkB,OAAAA,EAAES,UAAY,GACpCQ,EAAG,SAACjB,GAAkB,OAAAM,GAAcN,EAAG,IACvC0C,EAAG,SAAC1C,GAAkB,OAAAA,EAAES,UACxBS,EAAG,SAAClB,GAAkB,OAAAM,GAAcN,EAAG,IACvCjW,EAAG,SAACiW,GAAkB,OAAAA,EAAE2C,sBACxBC,EAAG,SAAC5C,GAAkB,OAAAA,EAAE6C,sBACxBC,EAAG,SAAC9C,GAAkB,OAAAA,EAAEG,cAActnB,WAAW8oB,UAAU,EAAG,IAC9DoB,EAAG,SAAC/C,GAAkB,OAAAA,EAAEG,eACxB6C,EAAG,SAAChD,EAAephB,GACjB,IAAMqkB,EAAUxf,KAAKub,IAAIgB,EAAEkD,qBACrBzW,EAAIhJ,KAAKkZ,MAAMsG,EAAU,IACzBlE,EAAIkE,EAAU,GACpB,OAAgC,EAAxBjD,EAAEkD,oBAA0B,IAAM,KACxCxoB,EAAS+R,EAAG,EAAG,MACd7N,EAAKukB,MAAM,KAAO,IAAM,IACzBzoB,EAASqkB,EAAG,EAAG,MAEnBjR,EAAK,WAAM,MAAA,MACX/S,EAAK,WAAM,MAAA,MACXqoB,IAAK,WAAM,MAAA,MAgBb,SAASC,GAAQrD,EAAerM,WACxBrT,EAAAI,EAAqDiT,KAApDpQ,OAAOkE,OAAA6b,aAAU,KAAItB,OAAOzI,OAAUgK,OACvCC,EAAUjC,GAAYgC,GAC5B,IAAKC,EAAS,OAAOjgB,EACrB,IAAM4f,EAAQ,OACd,IAAmB,IAAAM,EAAAljB,EAAA+iB,kCAASH,YAAc,oGAC1C,IAAIja,EAAMnQ,OAAOyqB,EAAQxD,EAAG,CAAEmD,QAAOnB,QAAOzI,cACxCmK,EAAUvC,GAASoC,IAAe,IAClCI,EAAW3B,GAASrB,GAAU4C,IAAe,EAMjD,OALIJ,EAAM,KAAMja,EAAMA,EAAI0a,cACjBT,EAAM,OAAMja,WlFjCKvO,GAE1B,OADqBiL,OAAIjL,OAAKqZ,KAAK,SAAApZ,GAAM,MAAM,KAANA,GAAaA,GAAM,MACtCD,EAAIipB,cAAgBjpB,EAAI7B,ckF+BnB+qB,CAAW3a,IAClCia,EAAS,EAAGO,EAAU,IACjBP,EAAM,KAAMO,EAAU,KAC3BP,EAAM,OAAMQ,EAAW,GACpBjpB,EAASwO,EAAKya,EAAUD,GA5BhCnC,GAAoB9U,EAAI8U,GAAYjmB,ECzIrC,IACMwoB,IAAqB,IAAIpD,MAAOwC,oBAChCa,GAA2B,oCAwB/BC,qBAAA,WACE,OAAOtoB,KAAKuoB,KAAK1B,WAGnByB,6BAAA,WACE,OAAOtoB,KAAKuoB,KAAKnC,mBAEnBkC,wBAAA,WACE,OAAOtoB,KAAKuoB,KAAKzB,cAEnBwB,wBAAA,WACE,OAAOtoB,KAAKuoB,KAAKlC,cAEnBiC,sBAAA,WACE,OAAOtoB,KAAKuoB,KAAKpC,YAEnBmC,oBAAA,WACE,OAAOtoB,KAAKuoB,KAAKxD,UAEnBuD,qBAAA,WACE,OAAOtoB,KAAKuoB,KAAK5D,WAEnB2D,sBAAA,WACE,OAAOtoB,KAAKuoB,KAAKhE,YAEnB+D,yBAAA,WACE,OAAOtoB,KAAKuoB,KAAK9D,eAEnB6D,gCAAA,SAAoBE,GAClB,OAAOxoB,KAAKuoB,KAAKpB,mBAAmBqB,IAEtCF,gCAAA,SAAoBE,GAClB,OAAOxoB,KAAKuoB,KAAKtB,mBAAmBuB,IAEtCF,+BAAA,WACE,OAAOtoB,KAAKyoB,gBAgBPH,6BAAP,SAAkCI,GAChC,IAAMrF,EAAIqF,EAAWzQ,MAAMoQ,IAE3B,GAAIhF,GAAc,MAATA,EAAE,GACT,OAAO,IAAIiF,IAAc,IAAItD,KAAK0D,GAAa,GAGjD,GAAIrF,GAAKA,EAAE,IAAMA,EAAE,IAAMA,EAAE,GAAI,CACvB,IAAAva,EAAA9D,EAA6Bqe,KAAxBsF,OAAMC,OAAOC,OAClBC,GAAkB,MAATH,GAAgB,EAAI,IAA4B,GAAtB3C,SAAS4C,EAAO,IAAW5C,SAAS6C,EAAS,KACtF,OAAO,IAAIP,IAAc,IAAItD,KAAK0D,GAAaI,GAEjD,OAAO,IAAI9D,KAAK0D,QA3ElB,YAAaK,EAA6CN,GACxD,GAAIM,aAAgBT,GAClBtoB,KAAKuoB,KAAOQ,EAAKR,KACjBE,EAAiBM,EAAKN,mBACjB,CACL,IAAMO,EAnBM,KAmBEZ,GAAqBK,GAC7BQ,EAAO,IAAIjE,KAAK+D,GAAMlC,UAAYmC,EACxChpB,KAAKuoB,KAAO,IAAIvD,KAAKiE,GAEvBjpB,KAAKyoB,eAAiBA,qEHDExpB,GAC1B,OAAOmkB,GALT,SAAmBnkB,GACjB,OAAO5B,OAAO4B,GAAKQ,QAAQ,yBAA0B,SAAA4jB,GAAK,OAAAP,GAAYO,KAIxD6F,CAASjqB,0BAGIoT,GAC3B,OAAOA,EAAE5S,QAAQ,MAAO,gCAGC4S,GACzB,OAAOA,EAAE5S,QAAQ,4DAA6D,mDC5BvD,SAAC4S,EAAWxP,GAAgB,OAAAwP,EAAIxP,kBAEpC,SAACwP,EAAWxP,GAAgB,OAAAwP,EAAIxP,UAC/B,SAACwP,EAAWxP,GAAgB,OAAAwP,EAAIxP,SACjC,SAACwP,EAAWxP,GAAgB,OAAAwP,EAAIxP,kBAE9BwP,EAAWxP,gBAAAA,KAChC,IAAMsmB,EAAMphB,KAAKqhB,IAAI,GAAIvmB,GACzB,OAAOkF,KAAK6e,MAAMvU,EAAI8W,GAAOA,iBAGT9W,EAAWxP,GAC/B,OAAOsN,OAAOkC,GAAKlC,OAAOtN,yBAGCgF,EAAcwhB,GACzC,OAAKxhB,GAAUA,EAAMyhB,UACJ1jB,IAAbyjB,EACKnf,OAAIrC,OAAOyhB,KAChB,SAACrW,EAAKC,GAAQ,OAAArT,EAAuBoT,EAAIoW,GAAWnW,EAAImW,MAGrDnf,OAAIrC,OAAOyhB,KAAKzpB,GANW,cGtBX,SAACwO,GAAc,OAAAA,EAAE1M,MAAM,KAAKwG,IAAIohB,oBAAoB9gB,KAAK,gBACzD,SAAC4F,GAAc,OAAAA,EAAE1M,MAAM,KAAKwG,IAAIqhB,oBAAoB/gB,KAAK,WCK9D,SAAC4J,EAAUxP,GAAgB,OAAAwP,EAAE5J,UAAa7C,IAAR/C,EAAoB,IAAMA,SAC5D,SAACwP,GAAW,OAAAvU,EAAQuU,GAAKoX,EAAUpX,GAAK,UACvC,SAACA,GAAW,OAAAvU,EAAQuU,GAAKA,EAAE,GAAK,YAC9B,SAACA,GAAa,OAAAnI,OAAImI,OAAG2L,yBAED1f,EAAU+qB,GAClC,SAAXK,EAAYzrB,GAAe,OAAAorB,EAAWlgB,EAAK3B,QAAQkD,aAAazM,EAAKorB,EAAS1nB,MAAM,MAAQ1D,EADpG,WAEE,OAAO6e,GAAQxe,GAAKgrB,KAAK,SAACrW,EAAKC,GAG7B,OAFAD,EAAMyW,EAASzW,KACfC,EAAMwW,EAASxW,KACK,EAAWA,EAAND,EAAY,EAAI,UAIzB,SAACZ,GAAsB,OAACA,GAAKA,EAAE9T,QAAW,gBAEvBD,EAAc+qB,GAArD,WACE,OAAOvM,GAAQxe,GAAK6J,IAAI,SAAAlK,GAAO,OAAAkL,EAAK3B,QAAQkD,aAAazM,EAAKorB,EAAS1nB,MAAM,0BAGjCrD,GAC5C,OAAOwe,GAAQxe,GAAKgZ,OAAO,SAAAjJ,GAAK,OAAC1Q,EAAM0Q,sBAGTgE,EAASxP,GACvC,OAAOia,GAAQzK,GAAGsX,OAAO9mB,mBAGDwP,EAAQvK,EAAevJ,GAE/C,oBAF+CA,KAC/CuJ,EAAQA,EAAQ,EAAIuK,EAAE9T,OAASuJ,EAAQA,EAChCuK,EAAE8C,MAAMrN,EAAOA,EAAQvJ,mBAG2BD,EAAU+qB,EAAkBO,GAAvF,WACE,OAAO9M,GAAQxe,GAAKgZ,OAAO,SAAArZ,GACzB,IAAMV,EAAQ4L,EAAK3B,QAAQkD,aAAazM,EAAKZ,OAAOgsB,GAAU1nB,MAAM,MACpE,YAAoBiE,IAAbgkB,EAAyB7mB,EAASxF,EAAO4L,EAAK3B,SAAWjK,IAAUqsB,mBAIrDtrB,GACvB,IAAMyoB,EAAI,GACV,OAAQzoB,GAAO,IAAIgZ,OAAO,SAAA/X,GACxB,OAAIwnB,EAAE3oB,eAAef,OAAOkC,MAC5BwnB,EAAE1pB,OAAOkC,KAAQ,oBC5CmB8S,EAAkBxP,GACxD,IACI0lB,EADErlB,EAAOlD,KAAKwH,QAAQtE,KAiB1B,OAOF,SAAsBqlB,GACpB,OAAQA,aAAgBvD,MAAQuD,aAAgBD,MAAkBuB,MAAMtB,EAAK1B,WARxEiD,CAdHvB,EADQ,QAANlW,GAAqB,UAANA,EACV,IAAI2S,KACFnnB,EAASwU,GACX,IAAI2S,KAAS,IAAJ3S,GACP/U,EAAS+U,GACd,QAAQxQ,KAAKwQ,GACR,IAAI2S,KAAU,KAAJ3S,GACRnP,EAAKuD,kBACP6hB,GAAayB,0BAA0B1X,GAEvC,IAAI2S,KAAK3S,GAGXA,IAGLnP,EAAK9E,eAAe,oBACtBmqB,EAAO,IAAID,GAAaC,EAAMrlB,EAAKulB,0BJoHdnE,EAAe0F,GAItC,IAHA,IAEI/R,EAFAgS,EAAS,GACTtT,EAAYqT,EAER/R,EAAQyL,GAAQjD,KAAK9J,IAC3BsT,GAAUtT,EAAUxB,MAAM,EAAG8C,EAAMwO,OACnC9P,EAAYA,EAAUxB,MAAM8C,EAAMwO,MAAQxO,EAAM,GAAG1Z,QACnD0rB,GAAUtC,GAAOrD,EAAGrM,GAEtB,OAAOgS,EAAStT,EI3HTuT,CAAS3B,EAAM1lB,IAJSwP,oBCpBkC9U,EAAW4sB,OAAkB,aAAAvgB,mBAAAA,IAAAqM,oBAC9F,OAAInY,EAAQP,IAAUD,EAASC,GAAeA,EAAMgB,OAAShB,EAAQ4sB,IAEvD,KADd5sB,EAAQG,EAAQH,MACO,IAAK6sB,IAAInU,GAAOnC,IAAI,kBACpC7Q,EAAQ1F,EAAOyC,KAAKwH,SAAW2iB,EAAe5sB,kBAGjCA,GACpB,OAAO4b,KAAK1b,UAAUF,oBCJA8U,EAAWxP,GAEjC,OADAyI,GAA4B,IAArB+e,UAAU9rB,OAAc,6BACxBd,EAAU4U,GAAK5U,EAAUoF,qBAGTwP,EAAWxP,GAElC,OADAyI,GAA4B,IAArB+e,UAAU9rB,OAAc,8BACxBd,EAAUoF,GAAOpF,EAAU4U,oBAGZA,GACtB,OAAO5U,EAAU4U,GAAG5S,QAAQ,OAAQ,uBAGZ4S,GACxB,OAAO5U,EAAU4U,GAAGjV,+BAGE6B,GACtB,OAAOxB,EAAUwB,GAAKipB,+BAGA7V,EAAWxP,GACjC,OAAOpF,EAAU4U,GAAG1Q,MAAMtE,OAAOwF,IAAM4F,KAAK,0BAGjB4J,EAAW/O,GACtC,OAAO7F,EAAU4U,GAAG5S,QAAQpC,OAAOiG,GAAI,qBAGjBrE,GACtB,OAAOxB,EAAUwB,GAAKQ,QAAQ,OAAQ,oBAGjB4S,EAAWxP,GAChC,OAAOpF,EAAU4U,GAAG1Q,MAAMtE,OAAOwF,oBAGZwP,GACrB,OAAO5U,EAAU4U,GAAGoD,+BAGSpD,GAC7B,OAAO5U,EAAU4U,GAAG5S,QAAQ,MAAO,yBAGTR,GAE1B,OADAA,EAAMxB,EAAUwB,IACL0W,OAAO,GAAGuS,cAAgBjpB,EAAIkW,MAAM,GAAG/X,gCAG3BiV,EAAWqI,EAAiB4P,GACnD,OAAO7sB,EAAU4U,GAAG1Q,MAAMtE,OAAOqd,IAAUjS,KAAK6hB,0BAGpBjY,EAAWkY,EAAcC,GACrD,OAAO/sB,EAAU4U,GAAG5S,QAAQpC,OAAOktB,GAAOC,sBAGlBnY,EAAW/O,EAAQmnB,GAE3C,oBAFmCnnB,mBAAQmnB,UAC3CpY,EAAI5U,EAAU4U,IACR9T,QAAU+E,EAAU+O,EACnBA,EAAE+G,OAAO,EAAG9V,EAAImnB,EAAElsB,QAAUksB,0BAGNpY,EAAW/O,EAAQmnB,gBAARnnB,mBAAQmnB,SAChD,IAAMnsB,EAAM+T,EAAE1Q,MAAM,OAChB6L,EAAMlP,EAAI6W,MAAM,EAAG7R,GAAGmF,KAAK,KAE/B,OADInK,EAAIC,QAAU+E,IAAGkK,GAAOid,GACrBjd,SCvEPkd,iBAAA,SAAKthB,GACH,IAAM+J,EAAOnT,KAAK2qB,MAAMvhB,GAExB,OADAkC,GAAO6H,EAAM,WAAM,MAAA,eAAQ/J,mBACpB+J,GAGTuX,iBAAA,SAAKthB,EAAc+J,GACjBnT,KAAK2qB,MAAMvhB,GAAQ+J,OAVvB,cACUnT,WAAyC,GCEnD,QAQE4qB,iBAAA,SAAKxhB,GACH,IAAM+J,EAAOnT,KAAK2qB,MAAMvhB,GAExB,OADAkC,GAAO6H,IAASnT,KAAK0G,cAAe,WAAM,MAAA,4BAAqB0C,KACxD+J,GAGTyX,iBAAA,SAAKxhB,EAAc+J,GACjBnT,KAAK2qB,MAAMvhB,GAAQ+J,GAGrByX,oBAAA,SAAQxhB,EAAc6M,GACpB,OAAO,IAAIC,GAAO9M,EAAMpJ,KAAK8T,IAAI1K,GAAO6M,EAAMjW,KAAKgb,aAhBrD,YACmBtU,EACAsU,GADAhb,mBAAA0G,EACA1G,YAAAgb,EAJXhb,WAA4C,WC8B7C6qB,mBAAP,SAAcxd,EAAc7L,GAC1B,OAAOxB,KAAKod,OAAO3B,MAAMpO,EAAM7L,IAG1BqpB,qBAAP,SAAgBthB,EAAiBiB,EAA2BY,GAC1D,IAAMpI,EAAM,IAAI0G,GAAQc,EAAOxK,KAAK2L,QAASP,GAC7C,OAAOpL,KAAKud,SAAS3O,gBAAgBrF,EAAKvG,IAE/B6nB,oBAAb,SAAqBthB,EAAiBiB,EAAgBY,oEACpD,SAAOgD,GAAUpO,KAAK8qB,QAAQvhB,EAAKiB,SAAYY,IAAeC,MAAM,YAE/Dwf,wBAAP,SAAmBthB,EAAiBiB,EAAgBY,GAClD,OAAO1N,GAAQsC,KAAK8qB,QAAQvhB,EAAKiB,SAAYY,IAAeC,MAAM,OAE7Dwf,gCAAP,SAA2BthB,EAAiBiB,EAAgBY,gBAAAA,MAC1D,IAAMpI,EAAM,IAAI0G,GAAQc,EAAOxK,KAAK2L,QAASP,GAC7C,OAAOpL,KAAKud,SAASwN,4BAA4BxhB,EAAKvG,IAGjD6nB,6BAAP,SAAwBxd,EAAc7C,EAA2BY,GAC/D,IAAM7B,EAAMvJ,KAAKyb,MAAMpO,GACvB,OAAOrN,KAAK8qB,QAAQvhB,EAAKiB,EAAOY,IAErByf,4BAAb,SAA6Bxd,EAAc7C,EAAgBY,oEACzD,SAAOgD,GAAUpO,KAAKgrB,gBAAgB3d,EAAM7C,SAAYY,IAAeC,MAAM,YAExEwf,gCAAP,SAA2Bxd,EAAc7C,EAAgBY,GACvD,OAAO1N,GAAQsC,KAAKgrB,gBAAgB3d,EAAM7C,SAAYY,IAAeC,MAAM,OAGtEwf,+BAAP,SAA0BhiB,EAAcwC,EAAgBK,GACtD,OAAO1L,KAAKod,OAAOZ,UAAU3T,EAAMwC,EAAM5B,GAAWwhB,SAAUvf,IAEzDmf,8BAAP,SAAyBhiB,EAAcwC,EAAgBK,GACrD,OAAO1L,KAAKod,OAAOZ,UAAU3T,EAAMwC,EAAM5B,GAAWyhB,QAASxf,IAElDmf,uBAAb,SAAwBhiB,oEACtB,SAAOuF,GAAsBpO,KAAKod,OAAOZ,UAAU3T,GAAM,UAEpDgiB,2BAAP,SAAsBhiB,GACpB,OAAOnL,GAAoBsC,KAAKod,OAAOZ,UAAU3T,GAAM,KAE5CgiB,wBAAb,SAAyBhiB,EAAc7F,EAAcoI,iGACjC,SAAMpL,KAAKwc,UAAU3T,WACvC,OADM4F,EAAY3F,YACX9I,KAAKgP,OAAOP,EAAWzL,EAAKoI,UAE9Byf,4BAAP,SAAuBhiB,EAAc7F,EAAcoI,GACjD,IAAMqD,EAAYzO,KAAKmrB,cAActiB,GACrC,OAAO7I,KAAKorB,WAAW3c,EAAWzL,EAAKoI,IAE5Byf,oCAAb,SAAqChiB,EAAc2B,EAAgBY,iGAC/C,SAAMpL,KAAKwc,UAAU3T,WACvC,OADM4F,EAAY3F,YACX9I,KAAKqrB,mBAAmB5c,EAAWjE,EAAOY,UAG5Cyf,wBAAP,SAAmB5rB,EAAa+D,GAE9B,OADc,IAAIiY,GAAMhc,EAAKe,MAChBzC,MAAMyF,GAAK,IAEb6nB,uBAAb,SAAwB5rB,EAAa+D,oEACnC,SAAOoL,GAAUpO,KAAK4c,WAAW3d,EAAK+D,UAEjC6nB,2BAAP,SAAsB5rB,EAAa+D,GACjC,OAAOtF,GAAQsC,KAAK4c,WAAW3d,EAAK+D,KAG/B6nB,4BAAP,SAAuBzhB,EAAckO,GACnCtX,KAAKqX,QAAQiU,IAAIliB,EAAMkO,IAElBuT,yBAAP,SAAoBzhB,EAAcmiB,GAChCvrB,KAAKub,KAAK+P,IAAIliB,EAAMmiB,IAEfV,oBAAP,SAAeW,GACb,OAAOA,EAAOztB,KAAKiC,KAAM6qB,KAEpBA,qBAAP,WACE,IAAMY,EAAOzrB,KACT0rB,GAAY,EAEhB,OAAO,SAAqBC,EAAkB3oB,EAAa4oB,aACzD,GAAIF,EAAW,CACbA,GAAY,EACZ,IAAM9f,EAAO5E,EAAuBhH,KAAKa,OACzCiI,EAAA2iB,EAAK9f,QAAQ9K,MAAKgrB,uBAAWjgB,SAC7BhH,EAAA6mB,EAAK9f,QAAQnG,SAAQqmB,uBAAWjgB,SAChCG,EAAA0f,EAAK9f,QAAQlG,UAASomB,uBAAWjgB,QAEnC6f,EAAKK,WAAWH,EAAU3oB,GAAKyK,KAAK,SAAAJ,GAAQ,OAAAue,EAAS,KAAMve,IAAcue,SAjG7E,YAAoB1oB,GAApB,wBAAoBA,MAClBlD,KAAK2L,iBnF4HkBA,GAQzB,GAPIA,EAAQvN,eAAe,eACxBuN,EAA8B5E,cAAgBtC,EAAWkH,EAAQjH,YAEhEiH,EAAQvN,eAAe,UACpBuN,EAAQvN,eAAe,cAAauN,EAAQlG,SAAWkG,EAAQ9K,MAC/D8K,EAAQvN,eAAe,aAAYuN,EAAQnG,QAAUmG,EAAQ9K,OAEhE8K,EAAQvN,eAAe,SAAU,CACnC,IAAI8B,SACmCA,EAAV,iBAAlByL,EAAQzL,MAA4C,EAAhByL,EAAQzL,MAAY,IAAID,EAAI0L,EAAQzL,YAAS0F,EAC1D,iBAAlB+F,EAAQzL,MAA4ByL,EAAQzL,MAC/CyL,EAAQzL,MAAQ,IAAID,EAAI,WAAQ2F,EAC7C+F,EAAQzL,MAAQA,EAUlB,QARAyL,WAAepG,GAAoBoG,EAAQhG,cAAgB,CAAEI,iBAAiB,GAAU,IAAQ4F,IACnF7F,GAAIyG,SAAWZ,EAAQjG,oBAClC4T,QAAQC,KAAK,oKACb5N,EAAQjG,mBAAoB,GAE9BiG,EAAQ9K,KAAOmG,EAAuB2E,EAAQ9K,MAC9C8K,EAAQlG,SAAWuB,EAAuB2E,EAAQlG,UAClDkG,EAAQnG,QAAUwB,EAAuB2E,EAAQnG,SAC1CmG,EmFnJUogB,CAAU7oB,GACzBlD,KAAKod,OAAS,IAAIzB,GAAO3b,MACzBA,KAAKud,SAAW,IAAI/O,GACpBxO,KAAKqX,QAAU,IAAIuT,GAAU5qB,KAAK2L,QAAQjF,cAAe1G,MACzDA,KAAKub,KAAO,IAAImP,GAEhB1sB,EAAOguB,GAAa,SAACC,EAAsB7iB,GAAiB,OAAAD,EAAK+iB,YAAY1sB,EAAU4J,GAAO6iB,KAC9FjuB,EAAOmuB,GAAgB,SAACjnB,EAA4BkE,GAAiB,OAAAD,EAAKijB,eAAe5sB,EAAU4J,GAAOlE,idAjBvF"}
\No newline at end of file