{"version":3,"file":"css-gradient.js","names":[],"sources":["../../../src/js/css-gradient.ts"],"sourcesContent":["/**\n * css-gradient\n */\n\nimport { CacheItem, createCacheKey, getCache, setCache } from './cache';\nimport { resolveColor } from './resolve';\nimport { isString } from './common';\nimport { MatchedRegExp, Options } from './typedef';\nimport { isColor, splitValue } from './util';\n\n/* constants */\nimport {\n  ANGLE,\n  CS_HUE,\n  CS_RECT,\n  LENGTH,\n  NUM,\n  NUM_POSITIVE,\n  PCT,\n  VAL_COMP,\n  VAL_SPEC\n} from './constant';\nconst NAMESPACE = 'css-gradient';\nconst DIM_ANGLE = `${NUM}(?:${ANGLE})`;\nconst DIM_ANGLE_PCT = `${DIM_ANGLE}|${PCT}`;\nconst DIM_LEN = `${NUM}(?:${LENGTH})|0`;\nconst DIM_LEN_PCT = `${DIM_LEN}|${PCT}`;\nconst DIM_LEN_PCT_POSI = `${NUM_POSITIVE}(?:${LENGTH}|%)|0`;\nconst DIM_LEN_POSI = `${NUM_POSITIVE}(?:${LENGTH})|0`;\nconst CTR = 'center';\nconst L_R = 'left|right';\nconst T_B = 'top|bottom';\nconst S_E = 'start|end';\nconst AXIS_X = `${L_R}|x-(?:${S_E})`;\nconst AXIS_Y = `${T_B}|y-(?:${S_E})`;\nconst BLOCK = `block-(?:${S_E})`;\nconst INLINE = `inline-(?:${S_E})`;\nconst POS_1 = `${CTR}|${AXIS_X}|${AXIS_Y}|${BLOCK}|${INLINE}|${DIM_LEN_PCT}`;\nconst POS_2 = [\n  `(?:${CTR}|${AXIS_X})\\\\s+(?:${CTR}|${AXIS_Y})`,\n  `(?:${CTR}|${AXIS_Y})\\\\s+(?:${CTR}|${AXIS_X})`,\n  `(?:${CTR}|${AXIS_X}|${DIM_LEN_PCT})\\\\s+(?:${CTR}|${AXIS_Y}|${DIM_LEN_PCT})`,\n  `(?:${CTR}|${BLOCK})\\\\s+(?:${CTR}|${INLINE})`,\n  `(?:${CTR}|${INLINE})\\\\s+(?:${CTR}|${BLOCK})`,\n  `(?:${CTR}|${S_E})\\\\s+(?:${CTR}|${S_E})`\n].join('|');\nconst POS_4 = [\n  `(?:${AXIS_X})\\\\s+(?:${DIM_LEN_PCT})\\\\s+(?:${AXIS_Y})\\\\s+(?:${DIM_LEN_PCT})`,\n  `(?:${AXIS_Y})\\\\s+(?:${DIM_LEN_PCT})\\\\s+(?:${AXIS_X})\\\\s+(?:${DIM_LEN_PCT})`,\n  `(?:${BLOCK})\\\\s+(?:${DIM_LEN_PCT})\\\\s+(?:${INLINE})\\\\s+(?:${DIM_LEN_PCT})`,\n  `(?:${INLINE})\\\\s+(?:${DIM_LEN_PCT})\\\\s+(?:${BLOCK})\\\\s+(?:${DIM_LEN_PCT})`,\n  `(?:${S_E})\\\\s+(?:${DIM_LEN_PCT})\\\\s+(?:${S_E})\\\\s+(?:${DIM_LEN_PCT})`\n].join('|');\nconst RAD_EXTENT = '(?:clos|farth)est-(?:corner|side)';\nconst RAD_SIZE = [\n  `${RAD_EXTENT}(?:\\\\s+${RAD_EXTENT})?`,\n  `${DIM_LEN_POSI}`,\n  `(?:${DIM_LEN_PCT_POSI})\\\\s+(?:${DIM_LEN_PCT_POSI})`\n].join('|');\nconst RAD_SHAPE = 'circle|ellipse';\nconst FROM_ANGLE = `from\\\\s+${DIM_ANGLE}`;\nconst AT_POSITION = `at\\\\s+(?:${POS_1}|${POS_2}|${POS_4})`;\nconst TO_SIDE_CORNER = `to\\\\s+(?:(?:${L_R})(?:\\\\s(?:${T_B}))?|(?:${T_B})(?:\\\\s(?:${L_R}))?)`;\nconst IN_COLOR_SPACE = `in\\\\s+(?:${CS_RECT}|${CS_HUE})`;\nconst LINE_SYNTAX_LINEAR = [\n  `(?:${DIM_ANGLE}|${TO_SIDE_CORNER})(?:\\\\s+${IN_COLOR_SPACE})?`,\n  `${IN_COLOR_SPACE}(?:\\\\s+(?:${DIM_ANGLE}|${TO_SIDE_CORNER}))?`\n].join('|');\nconst LINE_SYNTAX_RADIAL = [\n  `(?:${RAD_SHAPE})(?:\\\\s+(?:${RAD_SIZE}))?(?:\\\\s+${AT_POSITION})?(?:\\\\s+${IN_COLOR_SPACE})?`,\n  `(?:${RAD_SIZE})(?:\\\\s+(?:${RAD_SHAPE}))?(?:\\\\s+${AT_POSITION})?(?:\\\\s+${IN_COLOR_SPACE})?`,\n  `${AT_POSITION}(?:\\\\s+${IN_COLOR_SPACE})?`,\n  `${IN_COLOR_SPACE}(?:\\\\s+${RAD_SHAPE})(?:\\\\s+(?:${RAD_SIZE}))?(?:\\\\s+${AT_POSITION})?`,\n  `${IN_COLOR_SPACE}(?:\\\\s+${RAD_SIZE})(?:\\\\s+(?:${RAD_SHAPE}))?(?:\\\\s+${AT_POSITION})?`,\n  `${IN_COLOR_SPACE}(?:\\\\s+${AT_POSITION})?`\n].join('|');\nconst LINE_SYNTAX_CONIC = [\n  `${FROM_ANGLE}(?:\\\\s+${AT_POSITION})?(?:\\\\s+${IN_COLOR_SPACE})?`,\n  `${AT_POSITION}(?:\\\\s+${IN_COLOR_SPACE})?`,\n  `${IN_COLOR_SPACE}(?:\\\\s+${FROM_ANGLE})?(?:\\\\s+${AT_POSITION})?`\n].join('|');\nconst DEFAULT_LINEAR = [/to\\s+bottom/];\nconst DEFAULT_RADIAL = [/ellipse/, /farthest-corner/, /at\\s+center/];\nconst DEFAULT_CONIC = [/at\\s+center/];\n\n/* type definitions */\n/**\n * @type ColorStopList - list of color stops\n */\ntype ColorStopList = [string, string, ...string[]];\n\n/**\n * @typedef ValidateGradientLine - validate gradient line\n * @property line - gradient line\n * @property valid - result\n */\ninterface ValidateGradientLine {\n  line: string;\n  valid: boolean;\n}\n\n/**\n * @typedef ValidateColorStops - validate color stops\n * @property colorStops - list of color stops\n * @property valid - result\n */\ninterface ValidateColorStops {\n  colorStops: string[];\n  valid: boolean;\n}\n\n/**\n * @typedef Gradient - parsed CSS gradient\n * @property value - input value\n * @property type - gradient type\n * @property [gradientLine] - gradient line\n * @property colorStopList - list of color stops\n */\ninterface Gradient {\n  value: string;\n  type: string;\n  gradientLine?: string;\n  colorStopList: ColorStopList;\n}\n\n/* regexp */\nconst IS_CONIC = /^(?:repeating-)?conic-gradient$/;\nconst IS_LINEAR = /^(?:repeating-)?linear-gradient$/;\nconst IS_RADIAL = /^(?:repeating-)?radial-gradient$/;\nconst REG_COLOR_HINT_CONIC = new RegExp(`^(?:${DIM_ANGLE_PCT})$`);\nconst REG_COLOR_HINT_NON_CONIC = new RegExp(`^(?:${DIM_LEN_PCT})$`);\nconst REG_DIM_CONIC = new RegExp(`(?:\\\\s+(?:${DIM_ANGLE_PCT})){1,2}$`);\nconst REG_DIM_NON_CONIC = new RegExp(`(?:\\\\s+(?:${DIM_LEN_PCT})){1,2}$`);\nconst REG_GRAD = /^(?:repeating-)?(?:conic|linear|radial)-gradient\\(/;\nconst REG_GRAD_CAPT = /^((?:repeating-)?(?:conic|linear|radial)-gradient)\\(/;\nconst REG_LINE_CONIC = new RegExp(`^(?:${LINE_SYNTAX_CONIC})$`);\nconst REG_LINE_LINEAR = new RegExp(`^(?:${LINE_SYNTAX_LINEAR})$`);\nconst REG_LINE_RADIAL = new RegExp(`^(?:${LINE_SYNTAX_RADIAL})$`);\n\n/**\n * get gradient type\n * @param value - gradient value\n * @returns gradient type\n */\nexport const getGradientType = (value: string): string => {\n  if (isString(value)) {\n    value = value.trim();\n    if (REG_GRAD.test(value)) {\n      const [, type] = value.match(REG_GRAD_CAPT) as MatchedRegExp;\n      return type;\n    }\n  }\n  return '';\n};\n\n/**\n * validate gradient line\n * @param value - gradient line value\n * @param type - gradient type\n * @returns result\n */\nexport const validateGradientLine = (\n  value: string,\n  type: string\n): ValidateGradientLine => {\n  if (isString(value) && isString(type)) {\n    value = value.trim();\n    type = type.trim();\n    let reg: RegExp | null = null;\n    let defaultValues: RegExp[] = [];\n\n    if (IS_LINEAR.test(type)) {\n      reg = REG_LINE_LINEAR;\n      defaultValues = DEFAULT_LINEAR;\n    } else if (IS_RADIAL.test(type)) {\n      reg = REG_LINE_RADIAL;\n      defaultValues = DEFAULT_RADIAL;\n    } else if (IS_CONIC.test(type)) {\n      reg = REG_LINE_CONIC;\n      defaultValues = DEFAULT_CONIC;\n    }\n    if (reg) {\n      const valid = reg.test(value);\n      if (valid) {\n        let line = value;\n        for (const defaultValue of defaultValues) {\n          line = line.replace(defaultValue, '');\n        }\n        line = line.replace(/\\s{2,}/g, ' ').trim();\n        return { line, valid };\n      }\n      return { valid, line: value };\n    }\n  }\n  return { line: value, valid: false };\n};\n\n/**\n * validate color stop list\n * @param list\n * @param type\n * @param [opt]\n * @returns result\n */\nexport const validateColorStopList = (\n  list: string[],\n  type: string,\n  opt: Options = {}\n): ValidateColorStops => {\n  if (Array.isArray(list) && list.length > 1) {\n    const isConic = IS_CONIC.test(type);\n    const regColorHint = isConic\n      ? REG_COLOR_HINT_CONIC\n      : REG_COLOR_HINT_NON_CONIC;\n    const regDimension = isConic ? REG_DIM_CONIC : REG_DIM_NON_CONIC;\n    const valueList: string[] = [];\n    // State tracker: 'color' or 'hint'\n    let prevType = '';\n    for (let i = 0; i < list.length; i++) {\n      const item = list[i];\n      if (isString(item)) {\n        if (regColorHint.test(item)) {\n          // Hints cannot be the first item, and two hints cannot be adjacent\n          if (i === 0 || prevType === 'hint') {\n            return { colorStops: list, valid: false };\n          }\n          prevType = 'hint';\n          valueList.push(item);\n        } else {\n          const itemColor = item.replace(regDimension, '');\n          if (isColor(itemColor, { format: VAL_SPEC })) {\n            const resolvedColor = resolveColor(itemColor, opt) as string;\n            prevType = 'color';\n            valueList.push(item.replace(itemColor, resolvedColor));\n          } else {\n            return { colorStops: list, valid: false };\n          }\n        }\n      } else {\n        return { colorStops: list, valid: false };\n      }\n    }\n    // The last item must be a color, not a hint\n    if (prevType !== 'color') {\n      return { colorStops: list, valid: false };\n    }\n    return { valid: true, colorStops: valueList };\n  }\n  return { colorStops: list, valid: false };\n};\n\n/**\n * parse CSS gradient\n * @param value - gradient value\n * @param [opt] - options\n * @returns parsed result\n */\nexport const parseGradient = (\n  value: string,\n  opt: Options = {}\n): Gradient | null => {\n  if (isString(value)) {\n    value = value.trim();\n    const cacheKey: string = createCacheKey(\n      {\n        namespace: NAMESPACE,\n        name: 'parseGradient',\n        value\n      },\n      opt\n    );\n    const cachedResult = getCache(cacheKey);\n    if (cachedResult instanceof CacheItem) {\n      if (cachedResult.isNull) {\n        return null;\n      }\n      return cachedResult.item as Gradient;\n    }\n    const type = getGradientType(value);\n    const gradValue = value.replace(REG_GRAD, '').replace(/\\)$/, '');\n    if (type && gradValue) {\n      const [lineOrColorStop = '', ...itemList] = splitValue(gradValue, {\n        delimiter: ','\n      });\n      const isConic = IS_CONIC.test(type);\n      const regDimension = isConic ? REG_DIM_CONIC : REG_DIM_NON_CONIC;\n      let colorStop = '';\n      if (regDimension.test(lineOrColorStop)) {\n        const itemColor = lineOrColorStop.replace(regDimension, '');\n        if (isColor(itemColor, { format: VAL_SPEC })) {\n          const resolvedColor = resolveColor(itemColor, opt) as string;\n          colorStop = lineOrColorStop.replace(itemColor, resolvedColor);\n        }\n      } else if (isColor(lineOrColorStop, { format: VAL_SPEC })) {\n        colorStop = resolveColor(lineOrColorStop, opt) as string;\n      }\n      if (colorStop) {\n        itemList.unshift(colorStop);\n        const { colorStops, valid } = validateColorStopList(\n          itemList,\n          type,\n          opt\n        );\n        if (valid) {\n          const res: Gradient = {\n            value,\n            type,\n            colorStopList: colorStops as ColorStopList\n          };\n          setCache(cacheKey, res);\n          return res;\n        }\n      } else if (itemList.length > 1) {\n        const { line: gradientLine, valid: validLine } = validateGradientLine(\n          lineOrColorStop,\n          type\n        );\n        const { colorStops, valid: validColorStops } = validateColorStopList(\n          itemList,\n          type,\n          opt\n        );\n        if (validLine && validColorStops) {\n          const res: Gradient = {\n            value,\n            type,\n            gradientLine,\n            colorStopList: colorStops as ColorStopList\n          };\n          setCache(cacheKey, res);\n          return res;\n        }\n      }\n    }\n    setCache(cacheKey, null);\n    return null;\n  }\n  return null;\n};\n\n/**\n * resolve CSS gradient\n * @param value - CSS value\n * @param [opt] - options\n * @returns result\n */\nexport const resolveGradient = (value: string, opt: Options = {}): string => {\n  const { format = VAL_COMP } = opt;\n  const gradient = parseGradient(value, opt);\n  if (gradient) {\n    const { type = '', gradientLine = '', colorStopList = [] } = gradient;\n    if (type && Array.isArray(colorStopList) && colorStopList.length > 1) {\n      if (gradientLine) {\n        return `${type}(${gradientLine}, ${colorStopList.join(', ')})`;\n      }\n      return `${type}(${colorStopList.join(', ')})`;\n    }\n  }\n  if (format === VAL_SPEC) {\n    return '';\n  }\n  return 'none';\n};\n\n/**\n * is CSS gradient\n * @param value - CSS value\n * @param [opt] - options\n * @returns result\n */\nexport const isGradient = (value: string, opt: Options = {}): boolean => {\n  const gradient = parseGradient(value, opt);\n  return gradient !== null;\n};\n"],"mappings":";;;;;;;;;AAsBA,IAAM,YAAY;AAClB,IAAM,YAAY,GAAG,IAAI,KAAK,MAAM;AACpC,IAAM,gBAAgB,GAAG,UAAU,GAAG;AAEtC,IAAM,cAAc,GADJ,GAAG,IAAI,KAAK,OAAO,KACJ,GAAG;AAClC,IAAM,mBAAmB,GAAG,aAAa,KAAK,OAAO;AACrD,IAAM,eAAe,GAAG,aAAa,KAAK,OAAO;AACjD,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,MAAM;AACZ,IAAM,SAAS,GAAG,IAAI,QAAQ,IAAI;AAClC,IAAM,SAAS,GAAG,IAAI,QAAQ,IAAI;AAClC,IAAM,QAAQ,YAAY,IAAI;AAC9B,IAAM,SAAS,aAAa,IAAI;AAChC,IAAM,QAAQ,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG;AAC/D,IAAM,QAAQ;CACZ,MAAM,IAAI,GAAG,OAAO,UAAU,IAAI,GAAG,OAAO;CAC5C,MAAM,IAAI,GAAG,OAAO,UAAU,IAAI,GAAG,OAAO;CAC5C,MAAM,IAAI,GAAG,OAAO,GAAG,YAAY,UAAU,IAAI,GAAG,OAAO,GAAG,YAAY;CAC1E,MAAM,IAAI,GAAG,MAAM,UAAU,IAAI,GAAG,OAAO;CAC3C,MAAM,IAAI,GAAG,OAAO,UAAU,IAAI,GAAG,MAAM;CAC3C,MAAM,IAAI,GAAG,IAAI,UAAU,IAAI,GAAG,IAAI;CACvC,CAAC,KAAK,IAAI;AACX,IAAM,QAAQ;CACZ,MAAM,OAAO,UAAU,YAAY,UAAU,OAAO,UAAU,YAAY;CAC1E,MAAM,OAAO,UAAU,YAAY,UAAU,OAAO,UAAU,YAAY;CAC1E,MAAM,MAAM,UAAU,YAAY,UAAU,OAAO,UAAU,YAAY;CACzE,MAAM,OAAO,UAAU,YAAY,UAAU,MAAM,UAAU,YAAY;CACzE,MAAM,IAAI,UAAU,YAAY,UAAU,IAAI,UAAU,YAAY;CACrE,CAAC,KAAK,IAAI;AACX,IAAM,aAAa;AACnB,IAAM,WAAW;CACf,GAAG,WAAW,SAAS,WAAW;CAClC,GAAG;CACH,MAAM,iBAAiB,UAAU,iBAAiB;CACnD,CAAC,KAAK,IAAI;AACX,IAAM,YAAY;AAClB,IAAM,aAAa,WAAW;AAC9B,IAAM,cAAc,YAAY,MAAM,GAAG,MAAM,GAAG,MAAM;AACxD,IAAM,iBAAiB,eAAe,IAAI,YAAY,IAAI,SAAS,IAAI,YAAY,IAAI;AACvF,IAAM,iBAAiB,YAAY,QAAQ,GAAG,OAAO;AACrD,IAAM,qBAAqB,CACzB,MAAM,UAAU,GAAG,eAAe,UAAU,eAAe,KAC3D,GAAG,eAAe,YAAY,UAAU,GAAG,eAAe,KAC3D,CAAC,KAAK,IAAI;AACX,IAAM,qBAAqB;CACzB,MAAM,UAAU,aAAa,SAAS,YAAY,YAAY,WAAW,eAAe;CACxF,MAAM,SAAS,aAAa,UAAU,YAAY,YAAY,WAAW,eAAe;CACxF,GAAG,YAAY,SAAS,eAAe;CACvC,GAAG,eAAe,SAAS,UAAU,aAAa,SAAS,YAAY,YAAY;CACnF,GAAG,eAAe,SAAS,SAAS,aAAa,UAAU,YAAY,YAAY;CACnF,GAAG,eAAe,SAAS,YAAY;CACxC,CAAC,KAAK,IAAI;AACX,IAAM,oBAAoB;CACxB,GAAG,WAAW,SAAS,YAAY,WAAW,eAAe;CAC7D,GAAG,YAAY,SAAS,eAAe;CACvC,GAAG,eAAe,SAAS,WAAW,WAAW,YAAY;CAC9D,CAAC,KAAK,IAAI;AACX,IAAM,iBAAiB,CAAC,cAAc;AACtC,IAAM,iBAAiB;CAAC;CAAW;CAAmB;CAAc;AACpE,IAAM,gBAAgB,CAAC,cAAc;AA2CrC,IAAM,WAAW;AACjB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,uBAAuB,IAAI,OAAO,OAAO,cAAc,IAAI;AACjE,IAAM,2BAA2B,IAAI,OAAO,OAAO,YAAY,IAAI;AACnE,IAAM,gBAAgB,IAAI,OAAO,aAAa,cAAc,UAAU;AACtE,IAAM,oBAAoB,IAAI,OAAO,aAAa,YAAY,UAAU;AACxE,IAAM,WAAW;AACjB,IAAM,gBAAgB;AACtB,IAAM,iBAAiB,IAAI,OAAO,OAAO,kBAAkB,IAAI;AAC/D,IAAM,kBAAkB,IAAI,OAAO,OAAO,mBAAmB,IAAI;AACjE,IAAM,kBAAkB,IAAI,OAAO,OAAO,mBAAmB,IAAI;;;;;;AAOjE,IAAa,mBAAmB,UAA0B;AACxD,KAAI,SAAS,MAAM,EAAE;AACnB,UAAQ,MAAM,MAAM;AACpB,MAAI,SAAS,KAAK,MAAM,EAAE;GACxB,MAAM,GAAG,QAAQ,MAAM,MAAM,cAAc;AAC3C,UAAO;;;AAGX,QAAO;;;;;;;;AAST,IAAa,wBACX,OACA,SACyB;AACzB,KAAI,SAAS,MAAM,IAAI,SAAS,KAAK,EAAE;AACrC,UAAQ,MAAM,MAAM;AACpB,SAAO,KAAK,MAAM;EAClB,IAAI,MAAqB;EACzB,IAAI,gBAA0B,EAAE;AAEhC,MAAI,UAAU,KAAK,KAAK,EAAE;AACxB,SAAM;AACN,mBAAgB;aACP,UAAU,KAAK,KAAK,EAAE;AAC/B,SAAM;AACN,mBAAgB;aACP,SAAS,KAAK,KAAK,EAAE;AAC9B,SAAM;AACN,mBAAgB;;AAElB,MAAI,KAAK;GACP,MAAM,QAAQ,IAAI,KAAK,MAAM;AAC7B,OAAI,OAAO;IACT,IAAI,OAAO;AACX,SAAK,MAAM,gBAAgB,cACzB,QAAO,KAAK,QAAQ,cAAc,GAAG;AAEvC,WAAO,KAAK,QAAQ,WAAW,IAAI,CAAC,MAAM;AAC1C,WAAO;KAAE;KAAM;KAAO;;AAExB,UAAO;IAAE;IAAO,MAAM;IAAO;;;AAGjC,QAAO;EAAE,MAAM;EAAO,OAAO;EAAO;;;;;;;;;AAUtC,IAAa,yBACX,MACA,MACA,MAAe,EAAE,KACM;AACvB,KAAI,MAAM,QAAQ,KAAK,IAAI,KAAK,SAAS,GAAG;EAC1C,MAAM,UAAU,SAAS,KAAK,KAAK;EACnC,MAAM,eAAe,UACjB,uBACA;EACJ,MAAM,eAAe,UAAU,gBAAgB;EAC/C,MAAM,YAAsB,EAAE;EAE9B,IAAI,WAAW;AACf,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,OAAO,KAAK;AAClB,OAAI,SAAS,KAAK,CAChB,KAAI,aAAa,KAAK,KAAK,EAAE;AAE3B,QAAI,MAAM,KAAK,aAAa,OAC1B,QAAO;KAAE,YAAY;KAAM,OAAO;KAAO;AAE3C,eAAW;AACX,cAAU,KAAK,KAAK;UACf;IACL,MAAM,YAAY,KAAK,QAAQ,cAAc,GAAG;AAChD,QAAI,QAAQ,WAAW,EAAE,QAAA,kBAAkB,CAAC,EAAE;KAC5C,MAAM,gBAAgB,aAAa,WAAW,IAAI;AAClD,gBAAW;AACX,eAAU,KAAK,KAAK,QAAQ,WAAW,cAAc,CAAC;UAEtD,QAAO;KAAE,YAAY;KAAM,OAAO;KAAO;;OAI7C,QAAO;IAAE,YAAY;IAAM,OAAO;IAAO;;AAI7C,MAAI,aAAa,QACf,QAAO;GAAE,YAAY;GAAM,OAAO;GAAO;AAE3C,SAAO;GAAE,OAAO;GAAM,YAAY;GAAW;;AAE/C,QAAO;EAAE,YAAY;EAAM,OAAO;EAAO;;;;;;;;AAS3C,IAAa,iBACX,OACA,MAAe,EAAE,KACG;AACpB,KAAI,SAAS,MAAM,EAAE;AACnB,UAAQ,MAAM,MAAM;EACpB,MAAM,WAAmB,eACvB;GACE,WAAW;GACX,MAAM;GACN;GACD,EACD,IACD;EACD,MAAM,eAAe,SAAS,SAAS;AACvC,MAAI,wBAAwB,WAAW;AACrC,OAAI,aAAa,OACf,QAAO;AAET,UAAO,aAAa;;EAEtB,MAAM,OAAO,gBAAgB,MAAM;EACnC,MAAM,YAAY,MAAM,QAAQ,UAAU,GAAG,CAAC,QAAQ,OAAO,GAAG;AAChE,MAAI,QAAQ,WAAW;GACrB,MAAM,CAAC,kBAAkB,IAAI,GAAG,YAAY,WAAW,WAAW,EAChE,WAAW,KACZ,CAAC;GAEF,MAAM,eADU,SAAS,KAAK,KAAK,GACJ,gBAAgB;GAC/C,IAAI,YAAY;AAChB,OAAI,aAAa,KAAK,gBAAgB,EAAE;IACtC,MAAM,YAAY,gBAAgB,QAAQ,cAAc,GAAG;AAC3D,QAAI,QAAQ,WAAW,EAAE,QAAA,kBAAkB,CAAC,EAAE;KAC5C,MAAM,gBAAgB,aAAa,WAAW,IAAI;AAClD,iBAAY,gBAAgB,QAAQ,WAAW,cAAc;;cAEtD,QAAQ,iBAAiB,EAAE,QAAA,kBAAkB,CAAC,CACvD,aAAY,aAAa,iBAAiB,IAAI;AAEhD,OAAI,WAAW;AACb,aAAS,QAAQ,UAAU;IAC3B,MAAM,EAAE,YAAY,UAAU,sBAC5B,UACA,MACA,IACD;AACD,QAAI,OAAO;KACT,MAAM,MAAgB;MACpB;MACA;MACA,eAAe;MAChB;AACD,cAAS,UAAU,IAAI;AACvB,YAAO;;cAEA,SAAS,SAAS,GAAG;IAC9B,MAAM,EAAE,MAAM,cAAc,OAAO,cAAc,qBAC/C,iBACA,KACD;IACD,MAAM,EAAE,YAAY,OAAO,oBAAoB,sBAC7C,UACA,MACA,IACD;AACD,QAAI,aAAa,iBAAiB;KAChC,MAAM,MAAgB;MACpB;MACA;MACA;MACA,eAAe;MAChB;AACD,cAAS,UAAU,IAAI;AACvB,YAAO;;;;AAIb,WAAS,UAAU,KAAK;AACxB,SAAO;;AAET,QAAO;;;;;;;;AAST,IAAa,mBAAmB,OAAe,MAAe,EAAE,KAAa;CAC3E,MAAM,EAAE,SAAS,aAAa;CAC9B,MAAM,WAAW,cAAc,OAAO,IAAI;AAC1C,KAAI,UAAU;EACZ,MAAM,EAAE,OAAO,IAAI,eAAe,IAAI,gBAAgB,EAAE,KAAK;AAC7D,MAAI,QAAQ,MAAM,QAAQ,cAAc,IAAI,cAAc,SAAS,GAAG;AACpE,OAAI,aACF,QAAO,GAAG,KAAK,GAAG,aAAa,IAAI,cAAc,KAAK,KAAK,CAAC;AAE9D,UAAO,GAAG,KAAK,GAAG,cAAc,KAAK,KAAK,CAAC;;;AAG/C,KAAI,WAAA,iBACF,QAAO;AAET,QAAO;;;;;;;;AAST,IAAa,cAAc,OAAe,MAAe,EAAE,KAAc;AAEvE,QADiB,cAAc,OAAO,IAAI,KACtB"}