{"version":3,"sources":["jsdelivr-header.js","/npm/@antv/g-lottie-player@1.0.38/src/LottieAnimation.ts","/npm/@antv/g-lottie-player@1.0.38/src/parser/complete-data.ts","/npm/@antv/g-lottie-player@1.0.38/src/parser/lottie-type.ts","/npm/@antv/g-lottie-player@1.0.38/src/parser/index.ts","/npm/@antv/g-lottie-player@1.0.38/src/index.ts"],"names":[],"mappings":"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","file":"/npm/@antv/g-lottie-player@1.0.38/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@antv/g-lottie-player@1.0.38/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import type { IAnimation, PointLike } from '@antv/g-lite';\nimport {\n  Canvas,\n  DisplayObject,\n  definedProps,\n  Ellipse,\n  Group,\n  Rect,\n  Path,\n  Image,\n  Shape,\n  isCanvas,\n  isDisplayObject,\n} from '@antv/g-lite';\nimport { isNil, PathArray, path2String } from '@antv/util';\n// import { mat4, quat, vec3 } from 'gl-matrix';\nimport type {\n  CustomElementOption,\n  KeyframeAnimation,\n  KeyframeAnimationKeyframe,\n  ParseContext,\n} from './parser';\n\nconst eps = 0.0001;\n\n/**\n * Provides some control methods like:\n * - play\n * - pause\n * - stop\n * - goToAndStop\n * - goToAndPlay\n * @see https://github.com/airbnb/lottie-web/blob/master/player/js/animation/AnimationItem.js\n */\nexport class LottieAnimation {\n  constructor(\n    private width: number,\n    private height: number,\n    private elements: CustomElementOption[],\n    private context: ParseContext,\n  ) {\n    this.displayObjects = elements.map((element) =>\n      this.buildHierachy(element),\n    );\n\n    // TODO: preload images\n    // TODO: preload fonts\n  }\n\n  private displayObjects: DisplayObject[];\n  private keyframeAnimationMap = new WeakMap<\n    DisplayObject,\n    KeyframeAnimation[]\n  >();\n  private displayObjectElementMap = new WeakMap<\n    DisplayObject,\n    CustomElementOption\n  >();\n\n  private animations: IAnimation[] = [];\n\n  private generateTransform(\n    tx: number,\n    ty: number,\n    scaleX: number,\n    scaleY: number,\n    rotation,\n  ) {\n    let transformStr = '';\n    if (tx !== 0 || ty !== 0) {\n      transformStr += `translate(${tx}, ${ty})`;\n    }\n    if (scaleX !== 1 || scaleY !== 1) {\n      transformStr += ` scale(${scaleX === 0 ? eps : scaleX}, ${\n        scaleY === 0 ? eps : scaleY\n      })`;\n    }\n    if (rotation !== 0) {\n      transformStr += ` rotate(${rotation}deg)`;\n    }\n    return transformStr;\n  }\n\n  private buildHierachy(element: CustomElementOption) {\n    const {\n      type,\n      name,\n      anchorX = 0,\n      anchorY = 0,\n      rotation = 0,\n      scaleX = 1,\n      scaleY = 1,\n      x = 0,\n      y = 0,\n      // skew = 0,\n      // skewAxis = 0,\n      children,\n      shape,\n      style,\n      keyframeAnimation,\n    } = element;\n\n    let displayObject: DisplayObject;\n    const transform = this.generateTransform(\n      x - anchorX,\n      y - anchorY,\n      scaleX,\n      scaleY,\n      rotation,\n    );\n    // const transformMat = mat4.fromRotationTranslationScaleOrigin(\n    //   mat4.create(),\n    //   quat.fromEuler(quat.create(), 0, 0, rotation),\n    //   [x - anchorX, y - anchorY, 0],\n    //   [scaleX, scaleY, 1],\n    //   [anchorX, anchorY, 0],\n    // );\n\n    // TODO: repeater @see https://lottiefiles.github.io/lottie-docs/shapes/#repeater\n\n    // @see https://lottiefiles.github.io/lottie-docs/shapes/#shape\n    // TODO: polystar, convert to Bezier @see https://lottiefiles.github.io/lottie-docs/rendering/#polystar\n    if (type === Shape.GROUP) {\n      displayObject = new Group({\n        style: {\n          transformOrigin: `${anchorX}px ${anchorY}px`,\n          transform,\n        },\n      });\n    } else if (type === Shape.ELLIPSE) {\n      const { cx, cy, rx, ry } = shape;\n      // const center = vec3.fromValues(cx, cy, 0);\n      // vec3.transformMat4(center, center, transformMat);\n\n      displayObject = new Ellipse({\n        style: {\n          // cx: center[0],\n          // cy: center[1],\n          cx,\n          cy,\n          rx,\n          ry,\n          // reset transform-origin based on anchor & center\n          transformOrigin: `${anchorX - cx + rx}px ${anchorY - cy + ry}px`,\n          transform,\n        },\n      });\n    } else if (type === Shape.PATH) {\n      const d = this.generatePathFromShape(shape);\n      displayObject = new Path({\n        style: {\n          d, // use Path Array which can be skipped when parsing\n          transformOrigin: `${anchorX}px ${anchorY}px`,\n          transform,\n        },\n      });\n    } else if (type === Shape.RECT) {\n      // @see https://lottiefiles.github.io/lottie-docs/shapes/#rectangle\n      const { x: cx, y: cy, width, height, r } = shape;\n\n      displayObject = new Rect({\n        style: {\n          x: cx - width / 2,\n          y: cy - height / 2,\n          width,\n          height,\n          // anchor: [0.5, 0.5], // position means the center of the rectangle\n          radius: r,\n          transformOrigin: `${anchorX - cx + width / 2}px ${\n            anchorY - cy + height / 2\n          }px`,\n          transform,\n        },\n      });\n    } else if (type === Shape.IMAGE) {\n      const { width, height, src } = shape;\n\n      displayObject = new Image({\n        style: {\n          x: 0,\n          y: 0,\n          width,\n          height,\n          src,\n          transformOrigin: `${anchorX}px ${anchorY}px`,\n          transform,\n        },\n      });\n    }\n\n    if (name) {\n      displayObject.name = name;\n    }\n\n    // TODO: match name `mn`, used in expressions\n\n    if (style) {\n      // { fill, fillOpacity, fillRule, opacity, lineDash, lineDashOffset }\n      displayObject.attr(style);\n    }\n\n    if (keyframeAnimation) {\n      this.keyframeAnimationMap.set(displayObject, keyframeAnimation);\n    }\n\n    if (children) {\n      const childNodes = children.map((child) => this.buildHierachy(child));\n      displayObject.append(...childNodes);\n    }\n\n    this.displayObjectElementMap.set(displayObject, element);\n\n    return displayObject;\n  }\n\n  getAnimations() {\n    return this.animations;\n  }\n\n  /**\n   * Returns the animation duration in seconds or frames.\n   * @see https://github.com/airbnb/lottie-web#getdurationinframes\n   */\n  getDuration(inFrames = false) {\n    return (\n      ((inFrames ? this.fps() : 1) *\n        (this.context.endFrame - this.context.startFrame) *\n        this.context.frameTime) /\n      1000\n    );\n  }\n  /**\n   * Returns the animation frame rate (frames / second).\n   */\n  fps() {\n    return this.context.fps;\n  }\n\n  private isSameKeyframeOptions(\n    options1: Omit<KeyframeAnimation, 'keyframes'>,\n    options2: Omit<KeyframeAnimation, 'keyframes'>,\n  ) {\n    return (\n      options1.delay === options2.delay &&\n      options1.duration === options2.duration &&\n      options1.easing === options2.easing\n    );\n  }\n\n  private isSameKeyframes(\n    keyframe1: KeyframeAnimationKeyframe,\n    keyframe2: KeyframeAnimationKeyframe,\n  ) {\n    // const { offset: o1, easing: e1, ...rest1 } = keyframe1;\n    // const { offset: o2, easing: e2, ...rest2 } = keyframe2;\n    // const isAllApplyToTransform =\n    //   Object.keys(rest1).every((key) =>\n    //     ['x', 'y', 'scaleX', 'scaleY', 'rotation'].includes(key),\n    //   ) &&\n    //   Object.keys(rest2).every((key) =>\n    //     ['x', 'y', 'scaleX', 'scaleY', 'rotation'].includes(key),\n    //   );\n\n    return (\n      keyframe1.offset === keyframe2.offset &&\n      keyframe1.easing === keyframe2.easing\n      // (keyframe1.easing === keyframe2.easing || isAllApplyToTransform)\n    );\n  }\n\n  private generatePathFromShape(shape: Record<string, any>): PathArray {\n    // @see https://lottiefiles.github.io/lottie-docs/shapes/#path\n    const { close, v, in: i, out } = shape;\n    const d: PathArray = [] as unknown as PathArray;\n\n    d.push(['M', v[0][0], v[0][1]]);\n\n    for (let n = 1; n < v.length; n++) {\n      // @see https://lottiefiles.github.io/lottie-docs/concepts/#bezier\n      // The nth bezier segment is defined as:\n      // v[n], v[n]+o[n], v[n+1]+i[n+1], v[n+1]\n      d.push([\n        'C',\n        out[n - 1][0],\n        out[n - 1][1],\n        i[n][0],\n        i[n][1],\n        v[n][0],\n        v[n][1],\n      ]);\n    }\n\n    if (close) {\n      d.push([\n        'C',\n        out[v.length - 1][0],\n        out[v.length - 1][1],\n        i[0][0],\n        i[0][1],\n        v[0][0],\n        v[0][1],\n      ]);\n      d.push(['Z']);\n    }\n\n    return d;\n  }\n\n  /**\n   * render Lottie Group to canvas or a mounted display object\n   */\n  render(canvasOrDisplayObject: Canvas | DisplayObject) {\n    const wrapper = new Group();\n    wrapper.append(...this.displayObjects);\n\n    if (isCanvas(canvasOrDisplayObject)) {\n      canvasOrDisplayObject.appendChild(wrapper);\n    } else if (isDisplayObject(canvasOrDisplayObject)) {\n      if (!canvasOrDisplayObject.isConnected) {\n        throw new Error(\n          '[g-lottie-player]: Cannot render Lottie to an unmounted DisplayObject.',\n        );\n      } else {\n        canvasOrDisplayObject.appendChild(wrapper);\n      }\n    } else {\n      throw new Error(\n        '[g-lottie-player]: We should render Lottie to a mounted DisplayObject or Canvas.',\n      );\n    }\n\n    this.displayObjects.forEach((parent) => {\n      parent.forEach((child: DisplayObject) => {\n        let keyframeAnimation = this.keyframeAnimationMap.get(child);\n\n        // console.log('keyframeAnimation', keyframeAnimation);\n\n        const element = this.displayObjectElementMap.get(child);\n        if (element && element.clipPath) {\n          const { shape, keyframeAnimation } = element.clipPath;\n\n          const clipPath = new Path();\n          // use clipPath as target's siblings\n          child.parentElement.appendChild(clipPath);\n          child.style.clipPath = clipPath;\n          if (shape) {\n            clipPath.style.d = this.generatePathFromShape(shape);\n          }\n\n          // TODO: only support one clipPath now\n          if (keyframeAnimation && keyframeAnimation.length) {\n            const { delay, duration, easing, keyframes } = keyframeAnimation[0];\n\n            // animate clipPath with its `d` property\n            const clipPathAnimation = clipPath.animate(\n              keyframes.map(({ offset, shape, easing }) => {\n                return {\n                  offset,\n                  d: path2String(this.generatePathFromShape(shape)),\n                  easing,\n                };\n              }),\n              {\n                delay,\n                duration,\n                easing,\n                iterations: this.context.iterations,\n              },\n            );\n            this.animations.push(clipPathAnimation);\n          }\n        }\n\n        // account for animation only apply to visibility, e.g. spring\n        const { visibilityStartOffset, visibilityEndOffset, visibilityFrame } =\n          element;\n        if (\n          visibilityFrame &&\n          (!keyframeAnimation || !keyframeAnimation.length)\n        ) {\n          keyframeAnimation = [\n            {\n              duration: this.context.frameTime * visibilityFrame,\n              keyframes: [\n                { offset: 0, style: { opacity: 1 } },\n                { offset: 1, style: { opacity: 1 } },\n              ],\n            },\n          ];\n        }\n\n        if (keyframeAnimation && keyframeAnimation.length) {\n          const keyframesOptions: [\n            KeyframeAnimationKeyframe[],\n            Omit<KeyframeAnimation, 'keyframes'>,\n          ][] = [];\n\n          keyframeAnimation.forEach(\n            ({ delay = 0, duration, easing, keyframes }) => {\n              const formattedKeyframes = keyframes.map((keyframe) =>\n                definedProps(keyframe),\n              ) as KeyframeAnimationKeyframe[];\n              const options = definedProps({\n                delay,\n                duration,\n                easing,\n                iterations: this.context.iterations,\n                fill: this.context.fill,\n              }) as Omit<KeyframeAnimation, 'keyframes'>;\n\n              keyframesOptions.push([formattedKeyframes, options]);\n            },\n          );\n\n          const mergedKeyframesOptions = [keyframesOptions[0]];\n          // merge [{ offset: 0, cx: 1 }, { offset: 0, cy: 1 }] into { offset: 0, cx: 1, cy: 1 }\n          for (let i = 1; i < keyframesOptions.length; i++) {\n            const [currentKeyframes, currentOptions] = keyframesOptions[i];\n            // can merge options?\n            const existedKeyframeOptions = mergedKeyframesOptions.find(\n              ([keyframes, options]) =>\n                keyframes.length === currentKeyframes.length &&\n                this.isSameKeyframeOptions(currentOptions, options),\n            );\n\n            if (existedKeyframeOptions) {\n              currentKeyframes.forEach((currentKeyframe) => {\n                const existedKeyframe = existedKeyframeOptions[0].find(\n                  (keyframe) => this.isSameKeyframes(currentKeyframe, keyframe),\n                );\n\n                if (existedKeyframe) {\n                  const {\n                    offset,\n                    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n                    easing = 'linear',\n                    ...rest\n                  } = currentKeyframe;\n\n                  // merge interpolated properties\n                  Object.assign(existedKeyframe, rest);\n                } else {\n                  // append if cannot be merged\n                  existedKeyframeOptions[0].push(currentKeyframe);\n                }\n              });\n            } else {\n              // cannot be merged since options are different\n              mergedKeyframesOptions.push(keyframesOptions[i]);\n            }\n          }\n\n          // restore animations for later use\n          this.animations.push(\n            ...mergedKeyframesOptions\n              .map(([merged, options]) => {\n                // format interpolated properties, e.g. scaleX -> transform\n                const formatted = this.formatKeyframes(merged, child);\n\n                if (formatted.length) {\n                  // console.log(child, formatted);\n\n                  const animation = child.animate(formatted, options);\n                  if (\n                    !isNil(visibilityStartOffset) &&\n                    !isNil(visibilityEndOffset)\n                  ) {\n                    child.hide();\n                    animation.onframe = () => {\n                      const { progress } = animation.effect.getComputedTiming();\n                      if (\n                        progress >= visibilityStartOffset &&\n                        progress < visibilityEndOffset\n                      ) {\n                        child.show();\n                      } else {\n                        child.hide();\n                      }\n                    };\n                  }\n\n                  if (!this.context.autoplay) {\n                    animation.pause();\n                  }\n                  return animation;\n                }\n\n                return null;\n              })\n              .filter((animation) => !!animation),\n          );\n        }\n      });\n    });\n\n    return wrapper;\n  }\n\n  private formatKeyframes(\n    keyframes: Record<string, any>[],\n    object: DisplayObject,\n  ) {\n    keyframes.forEach((keyframe) => {\n      // if ('offsetPath' in keyframe) {\n      //   if (!object.style.offsetPath) {\n      //     const [ox, oy] = object.getOrigin();\n      //     (keyframe.offsetPath as AbsoluteArray).forEach((segment) => {\n      //       if (segment[0] === 'M') {\n      //         segment[1] -= ox;\n      //         segment[2] -= oy;\n      //       } else if (segment[0] === 'C') {\n      //         segment[1] -= ox;\n      //         segment[2] -= oy;\n      //         segment[3] -= ox;\n      //         segment[4] -= oy;\n      //         segment[5] -= ox;\n      //         segment[6] -= oy;\n      //       }\n      //     });\n\n      //     const offsetPath = new Path({\n      //       style: {\n      //         d: keyframe.offsetPath,\n      //       },\n      //     });\n\n      //     object.style.offsetPath = offsetPath;\n\n      //     console.log(offsetPath);\n      //   }\n      //   delete keyframe.offsetPath;\n      //   // offsetPath should override x/y\n      //   delete keyframe.x;\n      //   delete keyframe.y;\n      // }\n\n      // should keep transform during initialization\n      // if (!object.style.offsetPath) {\n      //   keyframe.transform = object.style.transform || '';\n      // }\n\n      keyframe.transform = object.style.transform || '';\n\n      // TODO: transforms with different easing functions will conflict\n\n      if ('scaleX' in keyframe) {\n        keyframe.transform = `${\n          keyframe.transform || ''\n        } scaleX(${keyframe.scaleX === 0 ? eps : keyframe.scaleX})`;\n        delete keyframe.scaleX;\n      }\n      if ('scaleY' in keyframe) {\n        keyframe.transform = `${\n          keyframe.transform || ''\n        } scaleY(${keyframe.scaleY === 0 ? eps : keyframe.scaleY})`;\n        delete keyframe.scaleY;\n      }\n\n      if ('rotation' in keyframe) {\n        keyframe.transform = `${keyframe.transform || ''} rotate(${keyframe.rotation}deg)`;\n        delete keyframe.rotation;\n      }\n\n      // TODO: skew & skewAxis\n      // if ('skew' in keyframe) {\n      //   keyframe.transform = (keyframe.transform || '') + ` skew(${keyframe.skew}deg)`;\n      //   delete keyframe.skew;\n      // }\n\n      if ('x' in keyframe) {\n        keyframe.transform = `${keyframe.transform || ''} translateX(${keyframe.x}px)`;\n        delete keyframe.x;\n      }\n      if ('y' in keyframe) {\n        keyframe.transform = `${keyframe.transform || ''} translateY(${keyframe.y}px)`;\n        delete keyframe.y;\n      }\n\n      // { style: { opacity: 1 } }\n      if ('style' in keyframe) {\n        Object.keys(keyframe.style).forEach((name) => {\n          keyframe[name] = keyframe.style[name];\n        });\n        delete keyframe.style;\n      }\n    });\n\n    // ignore empty interpolable attributes\n    keyframes = keyframes.filter((keyframe) => {\n      // TODO: support negative offset\n\n      const { ignore, easing, offset, ...rest } = keyframe;\n      return offset >= 0 && Object.keys(rest).length > 0;\n      // return Object.keys(rest).length > 0;\n    });\n\n    if (keyframes.length) {\n      // padding offset = 1\n      if (keyframes[keyframes.length - 1].offset !== 1) {\n        keyframes.push({\n          ...keyframes[keyframes.length - 1],\n          offset: 1,\n        });\n      }\n    }\n\n    // sort by offset\n    keyframes.sort((a, b) => a.offset - b.offset);\n\n    // remove empty attributes\n    keyframes.forEach((keyframe) => {\n      Object.keys(keyframe).forEach((name) => {\n        if (keyframe[name] === '') {\n          delete keyframe[name];\n        }\n      });\n    });\n\n    return keyframes;\n  }\n\n  /**\n   * Destroy all internal displayobjects.\n   */\n  destroy() {\n    this.displayObjects.forEach((object) => {\n      object.destroy();\n    });\n  }\n\n  /**\n   * Return the size of this animation.\n   * @param outputSize - If provided, the size will be copied into here as width, height.\n   */\n  size(outputSize?: PointLike) {\n    return { width: this.width, height: this.height };\n  }\n\n  /**\n   * Bodymovin version\n   */\n  version() {\n    return this.context.version;\n  }\n\n  private isPaused = false;\n  play() {\n    this.isPaused = false;\n    this.animations.forEach((animation) => {\n      animation.play();\n    });\n  }\n\n  /**\n   * Can contain 2 numeric values that will be used as first and last frame of the animation.\n   * @see https://github.com/airbnb/lottie-web#playsegmentssegments-forceflag\n   */\n  playSegments(segments: [number, number]) {\n    const [firstFrame, lastFrame] = segments;\n\n    this.isPaused = false;\n    this.animations.forEach((animation) => {\n      animation.currentTime = (firstFrame / this.fps()) * 1000;\n      const originOnFrame = animation.onframe;\n      animation.onframe = (e) => {\n        if (originOnFrame) {\n          // @ts-ignore\n          originOnFrame(e);\n        }\n\n        if (animation.currentTime >= (lastFrame / this.fps()) * 1000) {\n          animation.finish();\n\n          if (originOnFrame) {\n            animation.onframe = originOnFrame;\n          } else {\n            animation.onframe = null;\n          }\n        }\n      };\n      animation.play();\n    });\n  }\n\n  pause() {\n    this.isPaused = true;\n    this.animations.forEach((animation) => {\n      animation.pause();\n    });\n  }\n\n  /**\n   *\n   */\n  togglePause() {\n    if (this.isPaused) {\n      this.play();\n    } else {\n      this.pause();\n    }\n  }\n\n  /**\n   * Goto and stop at a specific time(in seconds) or frame.\n   * Split goToAndStop/Play into goTo & stop/play\n   * @see https://github.com/airbnb/lottie-web\n   */\n  goTo(value: number, isFrame = false) {\n    if (isFrame) {\n      this.animations.forEach((animation) => {\n        animation.currentTime = (value / this.fps()) * 1000;\n      });\n    } else {\n      this.animations.forEach((animation) => {\n        animation.currentTime = value * 1000;\n      });\n    }\n  }\n\n  /**\n   * @see https://github.com/airbnb/lottie-web#stop\n   */\n  stop() {\n    this.animations.forEach((animation) => {\n      animation.finish();\n    });\n  }\n\n  /**\n   * 1 is normal speed.\n   * @see https://github.com/airbnb/lottie-web#setspeedspeed\n   */\n  setSpeed(speed: number) {\n    this.animations.forEach((animation) => {\n      animation.playbackRate = speed * this.direction;\n    });\n  }\n\n  private direction = 1;\n\n  /**\n   * 1 is forward, -1 is reverse.\n   * @see https://github.com/airbnb/lottie-web#setdirectiondirection\n   */\n  setDirection(direction: 1 | -1) {\n    this.direction = direction;\n    this.animations.forEach((animation) => {\n      animation.playbackRate *= direction;\n    });\n  }\n}\n","/**\n * borrow from https://github.com/airbnb/lottie-web/blob/master/player/js/utils/DataManager.js#L40-L493\n */\n\nfunction completeLayers(layers, comps) {\n  let layerData;\n  let i;\n  const len = layers.length;\n  let j;\n  let jLen;\n  let k;\n  let kLen;\n  for (i = 0; i < len; i += 1) {\n    layerData = layers[i];\n    if ('ks' in layerData && !layerData.completed) {\n      layerData.completed = true;\n      if (layerData.tt) {\n        layers[i - 1].td = layerData.tt;\n      }\n      if (layerData.hasMask) {\n        const maskProps = layerData.masksProperties;\n        jLen = maskProps.length;\n        for (j = 0; j < jLen; j += 1) {\n          if (maskProps[j].pt.k.i) {\n            convertPathsToAbsoluteValues(maskProps[j].pt.k);\n          } else {\n            kLen = maskProps[j].pt.k.length;\n            for (k = 0; k < kLen; k += 1) {\n              if (maskProps[j].pt.k[k].s) {\n                convertPathsToAbsoluteValues(maskProps[j].pt.k[k].s[0]);\n              }\n              if (maskProps[j].pt.k[k].e) {\n                convertPathsToAbsoluteValues(maskProps[j].pt.k[k].e[0]);\n              }\n            }\n          }\n        }\n      }\n      if (layerData.ty === 0) {\n        layerData.layers = findCompLayers(layerData.refId, comps);\n        completeLayers(layerData.layers, comps);\n      } else if (layerData.ty === 4) {\n        completeShapes(layerData.shapes);\n      } else if (layerData.ty === 5) {\n        completeText(layerData);\n      }\n    }\n  }\n}\n\nfunction completeChars(chars, assets) {\n  if (chars) {\n    let i = 0;\n    const len = chars.length;\n    for (i = 0; i < len; i += 1) {\n      if (chars[i].t === 1) {\n        // var compData = findComp(chars[i].data.refId, assets);\n        chars[i].data.layers = findCompLayers(chars[i].data.refId, assets);\n        // chars[i].data.ip = 0;\n        // chars[i].data.op = 99999;\n        // chars[i].data.st = 0;\n        // chars[i].data.sr = 1;\n        // chars[i].w = compData.w;\n        // chars[i].data.ks = {\n        //   a: { k: [0, 0, 0], a: 0 },\n        //   p: { k: [0, -compData.h, 0], a: 0 },\n        //   r: { k: 0, a: 0 },\n        //   s: { k: [100, 100], a: 0 },\n        //   o: { k: 100, a: 0 },\n        // };\n        completeLayers(chars[i].data.layers, assets);\n      }\n    }\n  }\n}\n\nfunction findComp(id, comps) {\n  let i = 0;\n  const len = comps.length;\n  while (i < len) {\n    if (comps[i].id === id) {\n      return comps[i];\n    }\n    i += 1;\n  }\n  return null;\n}\n\nfunction findCompLayers(id, comps) {\n  const comp = findComp(id, comps);\n  if (comp) {\n    if (!comp.layers.__used) {\n      comp.layers.__used = true;\n      return comp.layers;\n    }\n    return JSON.parse(JSON.stringify(comp.layers));\n  }\n  return null;\n}\n\nfunction completeShapes(arr) {\n  let i;\n  const len = arr.length;\n  let j;\n  let jLen;\n  for (i = len - 1; i >= 0; i -= 1) {\n    if (arr[i].ty === 'sh') {\n      if (arr[i].ks.k.i) {\n        convertPathsToAbsoluteValues(arr[i].ks.k);\n      } else {\n        jLen = arr[i].ks.k.length;\n        for (j = 0; j < jLen; j += 1) {\n          if (arr[i].ks.k[j].s) {\n            convertPathsToAbsoluteValues(arr[i].ks.k[j].s[0]);\n          }\n          if (arr[i].ks.k[j].e) {\n            convertPathsToAbsoluteValues(arr[i].ks.k[j].e[0]);\n          }\n        }\n      }\n    } else if (arr[i].ty === 'gr') {\n      completeShapes(arr[i].it);\n    }\n  }\n}\n\nfunction convertPathsToAbsoluteValues(path) {\n  let i;\n  const len = path.i.length;\n  for (i = 0; i < len; i += 1) {\n    path.i[i][0] += path.v[i][0];\n    path.i[i][1] += path.v[i][1];\n    path.o[i][0] += path.v[i][0];\n    path.o[i][1] += path.v[i][1];\n  }\n}\n\nfunction checkVersion(minimum, animVersionString) {\n  const animVersion = animVersionString\n    ? animVersionString.split('.')\n    : [100, 100, 100];\n  if (minimum[0] > animVersion[0]) {\n    return true;\n  }\n  if (animVersion[0] > minimum[0]) {\n    return false;\n  }\n  if (minimum[1] > animVersion[1]) {\n    return true;\n  }\n  if (animVersion[1] > minimum[1]) {\n    return false;\n  }\n  if (minimum[2] > animVersion[2]) {\n    return true;\n  }\n  if (animVersion[2] > minimum[2]) {\n    return false;\n  }\n  return null;\n}\n\nconst checkText = (function () {\n  const minimumVersion = [4, 4, 14];\n\n  function updateTextLayer(textLayer) {\n    const documentData = textLayer.t.d;\n    textLayer.t.d = {\n      k: [\n        {\n          s: documentData,\n          t: 0,\n        },\n      ],\n    };\n  }\n\n  function iterateLayers(layers) {\n    let i;\n    const len = layers.length;\n    for (i = 0; i < len; i += 1) {\n      if (layers[i].ty === 5) {\n        updateTextLayer(layers[i]);\n      }\n    }\n  }\n\n  return function (animationData) {\n    if (checkVersion(minimumVersion, animationData.v)) {\n      iterateLayers(animationData.layers);\n      if (animationData.assets) {\n        let i;\n        const len = animationData.assets.length;\n        for (i = 0; i < len; i += 1) {\n          if (animationData.assets[i].layers) {\n            iterateLayers(animationData.assets[i].layers);\n          }\n        }\n      }\n    }\n  };\n})();\n\nconst checkChars = (function () {\n  const minimumVersion = [4, 7, 99];\n  return function (animationData) {\n    if (animationData.chars && !checkVersion(minimumVersion, animationData.v)) {\n      let i;\n      const len = animationData.chars.length;\n      for (i = 0; i < len; i += 1) {\n        const charData = animationData.chars[i];\n        if (charData.data && charData.data.shapes) {\n          completeShapes(charData.data.shapes);\n          charData.data.ip = 0;\n          charData.data.op = 99999;\n          charData.data.st = 0;\n          charData.data.sr = 1;\n          charData.data.ks = {\n            p: { k: [0, 0], a: 0 },\n            s: { k: [100, 100], a: 0 },\n            a: { k: [0, 0], a: 0 },\n            r: { k: 0, a: 0 },\n            o: { k: 100, a: 0 },\n          };\n          if (!animationData.chars[i].t) {\n            charData.data.shapes.push({\n              ty: 'no',\n            });\n            charData.data.shapes[0].it.push({\n              p: { k: [0, 0], a: 0 },\n              s: { k: [100, 100], a: 0 },\n              a: { k: [0, 0], a: 0 },\n              r: { k: 0, a: 0 },\n              o: { k: 100, a: 0 },\n              sk: { k: 0, a: 0 },\n              sa: { k: 0, a: 0 },\n              ty: 'tr',\n            });\n          }\n        }\n      }\n    }\n  };\n})();\n\nconst checkPathProperties = (function () {\n  const minimumVersion = [5, 7, 15];\n\n  function updateTextLayer(textLayer) {\n    const pathData = textLayer.t.p;\n    if (typeof pathData.a === 'number') {\n      pathData.a = {\n        a: 0,\n        k: pathData.a,\n      };\n    }\n    if (typeof pathData.p === 'number') {\n      pathData.p = {\n        a: 0,\n        k: pathData.p,\n      };\n    }\n    if (typeof pathData.r === 'number') {\n      pathData.r = {\n        a: 0,\n        k: pathData.r,\n      };\n    }\n  }\n\n  function iterateLayers(layers) {\n    let i;\n    const len = layers.length;\n    for (i = 0; i < len; i += 1) {\n      if (layers[i].ty === 5) {\n        updateTextLayer(layers[i]);\n      }\n    }\n  }\n\n  return function (animationData) {\n    if (checkVersion(minimumVersion, animationData.v)) {\n      iterateLayers(animationData.layers);\n      if (animationData.assets) {\n        let i;\n        const len = animationData.assets.length;\n        for (i = 0; i < len; i += 1) {\n          if (animationData.assets[i].layers) {\n            iterateLayers(animationData.assets[i].layers);\n          }\n        }\n      }\n    }\n  };\n})();\n\nconst checkColors = (function () {\n  const minimumVersion = [4, 1, 9];\n\n  function iterateShapes(shapes) {\n    let i;\n    const len = shapes.length;\n    let j;\n    let jLen;\n    for (i = 0; i < len; i += 1) {\n      if (shapes[i].ty === 'gr') {\n        iterateShapes(shapes[i].it);\n      } else if (shapes[i].ty === 'fl' || shapes[i].ty === 'st') {\n        if (shapes[i].c.k && shapes[i].c.k[0].i) {\n          jLen = shapes[i].c.k.length;\n          for (j = 0; j < jLen; j += 1) {\n            if (shapes[i].c.k[j].s) {\n              shapes[i].c.k[j].s[0] /= 255;\n              shapes[i].c.k[j].s[1] /= 255;\n              shapes[i].c.k[j].s[2] /= 255;\n              shapes[i].c.k[j].s[3] /= 255;\n            }\n            if (shapes[i].c.k[j].e) {\n              shapes[i].c.k[j].e[0] /= 255;\n              shapes[i].c.k[j].e[1] /= 255;\n              shapes[i].c.k[j].e[2] /= 255;\n              shapes[i].c.k[j].e[3] /= 255;\n            }\n          }\n        } else {\n          shapes[i].c.k[0] /= 255;\n          shapes[i].c.k[1] /= 255;\n          shapes[i].c.k[2] /= 255;\n          shapes[i].c.k[3] /= 255;\n        }\n      }\n    }\n  }\n\n  function iterateLayers(layers) {\n    let i;\n    const len = layers.length;\n    for (i = 0; i < len; i += 1) {\n      if (layers[i].ty === 4) {\n        iterateShapes(layers[i].shapes);\n      }\n    }\n  }\n\n  return function (animationData) {\n    if (checkVersion(minimumVersion, animationData.v)) {\n      iterateLayers(animationData.layers);\n      if (animationData.assets) {\n        let i;\n        const len = animationData.assets.length;\n        for (i = 0; i < len; i += 1) {\n          if (animationData.assets[i].layers) {\n            iterateLayers(animationData.assets[i].layers);\n          }\n        }\n      }\n    }\n  };\n})();\n\nconst checkShapes = (function () {\n  const minimumVersion = [4, 4, 18];\n\n  function completeClosingShapes(arr) {\n    let i;\n    const len = arr.length;\n    let j;\n    let jLen;\n    for (i = len - 1; i >= 0; i -= 1) {\n      if (arr[i].ty === 'sh') {\n        if (arr[i].ks.k.i) {\n          arr[i].ks.k.c = arr[i].closed;\n        } else {\n          jLen = arr[i].ks.k.length;\n          for (j = 0; j < jLen; j += 1) {\n            if (arr[i].ks.k[j].s) {\n              arr[i].ks.k[j].s[0].c = arr[i].closed;\n            }\n            if (arr[i].ks.k[j].e) {\n              arr[i].ks.k[j].e[0].c = arr[i].closed;\n            }\n          }\n        }\n      } else if (arr[i].ty === 'gr') {\n        completeClosingShapes(arr[i].it);\n      }\n    }\n  }\n\n  function iterateLayers(layers) {\n    let layerData;\n    let i;\n    const len = layers.length;\n    let j;\n    let jLen;\n    let k;\n    let kLen;\n    for (i = 0; i < len; i += 1) {\n      layerData = layers[i];\n      if (layerData.hasMask) {\n        const maskProps = layerData.masksProperties;\n        jLen = maskProps.length;\n        for (j = 0; j < jLen; j += 1) {\n          if (maskProps[j].pt.k.i) {\n            maskProps[j].pt.k.c = maskProps[j].cl;\n          } else {\n            kLen = maskProps[j].pt.k.length;\n            for (k = 0; k < kLen; k += 1) {\n              if (maskProps[j].pt.k[k].s) {\n                maskProps[j].pt.k[k].s[0].c = maskProps[j].cl;\n              }\n              if (maskProps[j].pt.k[k].e) {\n                maskProps[j].pt.k[k].e[0].c = maskProps[j].cl;\n              }\n            }\n          }\n        }\n      }\n      if (layerData.ty === 4) {\n        completeClosingShapes(layerData.shapes);\n      }\n    }\n  }\n\n  return function (animationData) {\n    if (checkVersion(minimumVersion, animationData.v)) {\n      iterateLayers(animationData.layers);\n      if (animationData.assets) {\n        let i;\n        const len = animationData.assets.length;\n        for (i = 0; i < len; i += 1) {\n          if (animationData.assets[i].layers) {\n            iterateLayers(animationData.assets[i].layers);\n          }\n        }\n      }\n    }\n  };\n})();\n\nexport function completeData(animationData) {\n  if (animationData.__complete) {\n    return;\n  }\n  checkColors(animationData);\n  checkText(animationData);\n  checkChars(animationData);\n  checkPathProperties(animationData);\n  checkShapes(animationData);\n  completeLayers(animationData.layers, animationData.assets);\n  completeChars(animationData.chars, animationData.assets);\n  animationData.__complete = true;\n}\n\nfunction completeText(data) {\n  if (data.t.a.length === 0 && !('m' in data.t.p)) {\n    // data.singleShape = true;\n  }\n}\n","/**\n * https://lottiefiles.github.io/lottie-docs/constants/\n */\n\nexport enum BlendMode {\n  Normal,\n  Multiply,\n  Screen,\n  Overlay,\n  Darken,\n  Lighten,\n  ColorDodge,\n  ColorBurn,\n  HardLight,\n  SoftLight,\n  Difference,\n  Exclusion,\n  Hue,\n  Saturation,\n  Color,\n  Luminosity,\n  Add,\n  HardMix,\n}\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/constants/#mattemode\n */\nexport enum MatteMode {\n  Normal,\n  Alpha,\n  InvertedAlpha,\n  Luma,\n  InvertedLuma,\n}\n\nexport enum Layer3DMode {\n  Off,\n  On,\n}\n\nexport enum AutoOrientMode {\n  Off,\n  On,\n}\n\nexport enum EffectValueType {\n  Number = 0,\n  Color = 2,\n  MultiDimensional = 3,\n  Boolean = 7,\n}\n\nexport type EffectValue = {\n  /** Effect value type */\n  ty: EffectValueType;\n  /** Effect value index */\n  ix: number;\n  /** Name */\n  nm: string;\n  /** ??? */\n  mn: string;\n  /** Effect value */\n  v: Value;\n};\n\nexport enum EffectType {\n  Transform = 5,\n  DropShadow = 25,\n}\n\nexport type Effect = {\n  /** Effect Index. */\n  ix: number;\n  /** After Effect's Name. */\n  nm: string;\n  /** Effect type. */\n  ty: EffectType;\n  /** Effect parameters. [] */\n  ef: EffectValue[];\n  /** ??? */\n  np: number;\n  /** Match name (for expressions) */\n  mn: string;\n  /** ??? */\n  en: number;\n};\n\nexport const enum MaskMode {\n  No = 'n',\n  Add = 'a',\n  Subtract = 's',\n  Intersect = 'i',\n  Lighten = 'l',\n  Darken = 'd',\n  Difference = 'f',\n}\n\nexport type Mask = {\n  /** Inverted Mask flag. */\n  inv: boolean;\n  /** Mask name. */\n  nm?: string;\n  /** Mask vertices. */\n  pt: ShapeProperty;\n  /** Mask opacity. */\n  o: Value;\n  /** Mask mode. */\n  mode: MaskMode;\n  /** Dilate. */\n  x: Value;\n};\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/layers/\n */\nexport type Layer = {\n  /** 3d layer flag */\n  ddd?: Layer3DMode;\n  /** Hidden layer */\n  hd?: boolean;\n  /** Layer type */\n  ty: LayerType;\n  /** After Effects Layer Name */\n  nm?: string;\n  /** Layer Parent */\n  parent?: number;\n  /** Layer Time Stretching */\n  sr?: number;\n  /** Transform properties */\n  ks: Transform;\n  /** Auto-Orient along path AE property */\n  ao?: AutoOrientMode;\n  /** In Point of layer */\n  ip: number;\n  /** Out Point of layer */\n  op: number;\n  /** Start Time of layer */\n  st: number;\n  /** Blend Mode */\n  bm?: BlendMode;\n  /** Matte mode, the layer will inherit the transparency from the layer above */\n  tt?: MatteMode;\n  /** Layer index in AE */\n  ind?: number;\n  /** Whether the layer has some masks applied */\n  hasMask?: boolean;\n  /** List of Masks */\n  masksProperties?: Mask[];\n  /** List of Effects */\n  ef?: Effect[];\n  /** matte_target */\n  td?: number;\n  /**\n   * Enable motion blur\n   * (only has effect if Animation.mb is set)\n   */\n  mb?: boolean;\n};\n\nexport enum LayerType {\n  precomp,\n  solid,\n  image,\n  null,\n  shape,\n  text,\n  audio,\n  pholderVideo,\n  imageSeq,\n  video,\n  pholderStill,\n  guide,\n  adjustment,\n  camera,\n  light,\n  data,\n}\n\nexport type Position = {\n  // Not sure what this s mean\n  s: boolean;\n  x: Value;\n  y: Value;\n};\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/concepts/#transform\n */\nexport type Transform = {\n  /** Transform Anchor Point. */\n  a: MultiDimensional;\n  /** Transform Position. */\n  p: MultiDimensional | Position;\n  /** Transform Scale. */\n  s: MultiDimensional;\n  /** Transform Rotation. */\n  r: Value;\n  /** Transform Opacity. */\n  o: Value;\n  /** Transform Skew. */\n  sk?: Value;\n  /** Transform Skew Axis. */\n  sa?: Value;\n};\n\nexport type PrecompLayer = Layer & {\n  /** Reference ID (in assets list) */\n  refId: string;\n};\n\nexport type AudioProperties = {\n  /** Audio levels. [number, number] */\n  lv: Value;\n};\n\nexport type AudioLayer = Omit<Layer, 'ks'> & {\n  ty: LayerType.audio;\n  /** Reference ID (in assets list) */\n  refId: string;\n  /** Audio Properties. */\n  au: AudioProperties;\n  /** File format? */\n  cl: 'mp3';\n};\n\nexport type VideoLayer = Layer & {\n  ty: LayerType.video;\n  /** Reference ID (in assets list) */\n  refId: string;\n  /** ??? Audio Properties? */\n  ao: number;\n  /** File format? */\n  cl: string;\n};\n\nexport type ShapeLayer = Layer & {\n  /** Shape list of items. */\n  shapes: ShapeElement[];\n};\n\nexport interface NullLayer extends Layer {\n  ty: LayerType.null;\n}\n\nexport type SolidColorLayer = Layer & {\n  ty: LayerType.solid;\n  /** Color of the layer as a #rrggbb hex. */\n  sc: string;\n  /** Height of the layer. */\n  sh: number;\n  /** Width of the layer. */\n  sw: number;\n};\n\nexport type ImageLayer = Layer & {\n  ty: LayerType.image;\n  /** id pointing to the source image defined on 'assets' object. */\n  refId: string;\n};\n\nexport type TextAnimatorDataProperty = {\n  /** Transform Anchor Point. */\n  a?: MultiDimensional;\n  /** Transform Position. */\n  p?: MultiDimensional;\n  /** Transform Scale. */\n  s?: MultiDimensional;\n  /** Transform Rotation. */\n  r?: Value;\n  /** Transform Opacity. */\n  o?: Value;\n  /** Transform Skew. */\n  sk?: Value;\n  /** Transform Skew Axis. */\n  sa?: Value;\n  /** Angle? */\n  rx?: Value;\n  /** Angle? */\n  ry?: Value;\n  /** Stroke width. */\n  sw?: Value;\n  /** Stroke color. */\n  sc?: MultiDimensional;\n  /** Fill color. */\n  fc?: MultiDimensional;\n  /**  fh */\n  fh?: Value;\n  /** 0-100? */\n  fs?: Value;\n  /** 0-100? */\n  fb?: Value;\n  /** Tracking. */\n  t?: Value;\n};\n\nexport enum TextJustify {\n  Left = 0,\n  Right,\n  Center,\n}\n\nexport enum VerticalJustify {\n  Top = 0,\n  Center = 1,\n  Bottom = 2,\n}\n\nexport type TextBoxSize = [number, number];\n\nexport type TextDocument = {\n  /** Font family. */\n  f: string;\n  /** Text color. */\n  fc: Color4;\n  /** Font Size. */\n  s: number;\n  /** Line height when wrapping. */\n  lh: number;\n  /** Size of the box containing the text */\n  sz?: TextBoxSize;\n  /** Text. */\n  t: string;\n  /** Text alignment. */\n  j: TextJustify;\n  /** Character anchor? */\n  ca: number;\n  /** Line shift? positive moves text up */\n  ls: number;\n  /** Position? */\n  ps: number[];\n  /** Tracking */\n  tr: number;\n  /** Vertical justification. (Skottie) */\n  vj?: VerticalJustify;\n};\n\nexport type TextDataKeyframe = {\n  /** Start value of keyframe segment. */\n  s: TextDocument;\n  /** Start time of keyframe segment. */\n  t: number;\n};\n\nexport type TextDocumentData = {\n  k: TextDataKeyframe[];\n};\n\nexport type TextMoreOptions = any;\nexport type MaskedPath = any;\n\nexport const enum RangeSelectorDomain {\n  Characters = 1,\n  CharactersExcludingSpaces,\n  Words,\n  Lines,\n}\n\nexport const enum RangeSelectorShape {\n  Square = 1,\n  RampUp,\n  RampDown,\n  Triangle,\n  Round,\n  Smooth,\n}\n\nexport const enum RangeSelectorUnits {\n  Percentage = 1,\n  Index,\n}\n\nexport const enum RangeSelectorMode {\n  Add = 1,\n  Subtract,\n  Intersect,\n  Min,\n  Max,\n  Difference,\n}\n\nexport type RangeSelector = {\n  /** number/enum */\n  t: number;\n  /** number/enum */\n  rn: number;\n  /**\n   * Domain\n   *\n   * 1. Characters\n   * 2. Characters exluding spaces\n   * 3. Words\n   * 4. Lines\n   */\n  b: RangeSelectorDomain;\n  /**\n   * Shape\n   *\n   * 1. Square\n   * 2. Ramp up\n   * 3. Ramp down\n   * 4. Triangle\n   * 5. Round\n   * 6. Smooth\n   */\n  sh: RangeSelectorShape;\n  /**\n   * Mode\n   *\n   * 1. Add\n   * 2. Subtract (Unsupported)\n   * 3. Intersect (Unsupported)\n   * 4. Min (Unsupported)\n   * 5. Max (Unsupported)\n   * 6. Difference (Unsupported)\n   */\n  m?: RangeSelectorMode;\n  /** Optional square \"smoothness\" prop. */\n  sm: Value;\n  /**\n   * Units\n   *\n   * 1. Percentage\n   * 2. Index\n   */\n  r: RangeSelectorUnits;\n  /** Start */\n  s?: Value;\n  /** End */\n  e?: Value;\n  /** Offset */\n  o: Value;\n  /** Amount */\n  a: Value;\n  /** Ease high */\n  xe: Value;\n  /** Ease low */\n  ne: Value;\n};\n\nexport type TextAnimator = {\n  /** Name */\n  nm?: string;\n  /** Range selector */\n  s?: RangeSelector;\n  /** Animated properties */\n  a: TextAnimatorDataProperty;\n};\n\nexport type TextData = {\n  a: TextAnimator[];\n  d: TextDocumentData;\n  m?: TextMoreOptions;\n  p?: MaskedPath;\n};\n\nexport type TextLayer = Layer & {\n  /** Text Data. */\n  t: TextData;\n};\n\nexport type Point = { x: number; y: number };\n\nexport type Matrix4 = [\n  number,\n  number,\n  number,\n  number,\n\n  number,\n  number,\n  number,\n  number,\n\n  number,\n  number,\n  number,\n  number,\n\n  number,\n  number,\n  number,\n  number,\n];\n\nexport type Matrix3 = [\n  number,\n  number,\n  number,\n  number,\n  number,\n  number,\n  number,\n  number,\n  number,\n];\n\nexport type Node3D = {\n  transform: Matrix4;\n  children: Node3D[];\n};\n\nexport type Context = {\n  anchor: number[];\n  position: number[];\n  rotation: number;\n  opacity: number;\n  scale: number[];\n  points: Point[];\n  fill: number[];\n};\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/shapes/#shape-types\n */\nexport enum ShapeType {\n  Rectangle = 'rc',\n  Ellipse = 'el',\n  PolyStar = 'sr',\n  Path = 'sh',\n  Fill = 'fl',\n  Stroke = 'st',\n  GradientFill = 'gf',\n  GradientStroke = 'gs',\n  NoStyle = 'no',\n  Group = 'gr',\n  Transform = 'tr',\n  Repeater = 'rp',\n  Trim = 'tm',\n  RoundedCorners = 'rd',\n  PuckerOrBloat = 'pb',\n  Merge = 'mm',\n  Twist = 'tw',\n  OffsetPath = 'op',\n  ZigZag = 'zz',\n}\n\nexport type ShapeElement = {\n  /** Hide element. */\n  hd: boolean;\n\n  /** After Effect's Name. */\n  nm: string;\n\n  /** Shape type. */\n  ty: ShapeType;\n\n  /** Property index. */\n  cix: number;\n\n  /** Blending Mode */\n  bm: BlendMode;\n};\n\nexport type GroupShapeElement = ShapeElement & {\n  /** Number of properties. */\n  np: number;\n  /** List of ShapeElement.  */\n  it: ShapeElement[];\n};\n\nexport type Bezier = {\n  /** Closed property of shape. */\n  c?: boolean;\n  /** Cubic bezier handles for the segments before each vertex. */\n  i: number[][];\n  /** Cubic bezier handles for the segments after each vertex. */\n  o: number[][];\n  /** Bezier curve vertices. */\n  v: number[][];\n};\n\nexport type ShapePropKeyframe = {\n  /** Start time of keyframe segment. */\n  t: number;\n  /** Bezier curve easing in value. */\n  i: KeyframeBezierHandle;\n  /** Bezier curve easing out value. */\n  o: KeyframeBezierHandle;\n  /** [0-1] Jump to the end value. */\n  h: number;\n  /** or list of Bezier\tStart value of keyframe segment. */\n  s: Bezier[];\n  /** or list of Bezier\tEnd value of keyframe segment. */\n  e: Bezier[];\n};\n\nexport type ShapeProperty = {\n  /**\n   * Bezier: Non-animated value.\n   * ShapePropKeyframe[]: Keyframe list.\n   */\n  k: Bezier | ShapePropKeyframe[];\n  /** Property index. */\n  ix: number;\n  /** [0-1] Whether it's animated. */\n  a?: number;\n};\n\nexport type PathShape = ShapeElement & {\n  /** Shape's vertices. */\n  ks: ShapeProperty;\n  /** index  */\n  ind: number;\n};\n\nexport type EllipseShape = ShapeElement & {\n  p: MultiDimensional;\n  s: MultiDimensional;\n};\n\nexport type MultiDimensional = {\n  /**\n   * number[]: Non-animated value.\n   * OffsetKeyframe[]: Animated keyframes.\n   */\n  k: number[] | OffsetKeyframe[];\n  /** Property index. */\n  ix?: number;\n  /** [0-1] Whether it's animated. */\n  a?: number;\n  /** ??? */\n  l?: number;\n};\n\nexport type Value = {\n  /**\n   * number | number[]: Non-animated value.\n   * OffsetKeyframe[]: Animated keyframes.\n   */\n  k: number | number[] | OffsetKeyframe[];\n  /** Property index. */\n  ix?: number;\n  /** [0-1] Whether it's animated. */\n  a?: number;\n  /** Split values (???) */\n  s?: boolean;\n};\n\nexport type KeyframeBezierHandle = {\n  /** x position of the handle. */\n  x: number | number[];\n  /** y position of the handle. */\n  y: number | number[];\n};\n\nexport type OffsetKeyframe = {\n  /** Start time of keyframe segment. */\n  t: number;\n  /** Bezier curve easing in value. */\n  i?: KeyframeBezierHandle;\n  /** Bezier curve easing out value. */\n  o?: KeyframeBezierHandle;\n  /** [0-1] Jump to value. */\n  h?: number;\n  /** Start value of keyframe segment. */\n  s: number | number[];\n  /** End value of keyframe segment. */\n  e?: number[];\n  /** In Spatial Tangent. Only for spatial properties. */\n  ti?: number[];\n  /** Out Spatial Tangent. Only for spatial properties. */\n  to?: number[];\n};\n\nexport type RectShape = ShapeElement & {\n  /** After Effect's Direction. */\n  d: number;\n  /** Rect's position. */\n  p: MultiDimensional;\n  /** Rect's size. */\n  s: MultiDimensional;\n  /** Rect's rounded corners. */\n  r: Value;\n};\n\nexport type TransformShape = ShapeElement & {\n  /** Anchor point */\n  a: MultiDimensional;\n  /** Transform Position. */\n  p: MultiDimensional;\n  /** Transform Scale. */\n  s: MultiDimensional;\n  /** Transform Rotation. */\n  r: Value;\n  /** Transform Opacity. */\n  o: Value;\n  /** Transform Skew. */\n  sk: Value;\n  /** Transform Skew Axis. */\n  sa: Value;\n};\n\nexport type RepeatShape = ShapeElement & {\n  c: Value;\n  tr: Transform;\n};\n\nexport type TrimShape = ShapeElement & {\n  s: Value;\n  e: Value;\n  o: Value;\n};\nexport type Color4 = [number, number, number, number];\n\nexport type ColorValue = {\n  /**\n   * number[]: Non-animated value.\n   * OffsetKeyframe[]: Animated keyframes.\n   */\n  k: number[] | OffsetKeyframe[];\n  /** Property index. */\n  ix: number;\n  /** [0-1] Whether it's animated. */\n  a?: number;\n};\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/constants/#fillrule\n */\nexport enum FillRule {\n  NonZero = 1,\n  EvenOdd,\n}\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/constants/#linejoin\n */\nexport enum LineJoin {\n  Miter = 1,\n  Round = 2,\n  Bevel = 3,\n}\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/constants/#linecap\n */\nexport enum LineCap {\n  Butt = 1,\n  Round = 2,\n  Square = 3,\n}\n\nexport type FillShape = ShapeElement & {\n  /** Fill Opacity. */\n  o: Value;\n  /** Fill Color. */\n  c: ColorValue;\n  /** Fill rule. */\n  r: FillRule;\n};\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/constants/#gradienttype\n */\nexport enum GradientType {\n  Linear = 1,\n  Radial = 2,\n}\n\nexport type GradientColor = {\n  // Number of stops\n  p: number;\n  // t, r, g, b, t, r, g, b\n  k: Value;\n};\n\nexport type GradientCommon = {\n  /** Gradient Type. 1: linear, 2: radial */\n  t: GradientType;\n  /** Start Point. */\n  s: MultiDimensional;\n  /** End Point. */\n  e: MultiDimensional;\n  /** Gradient Colors */\n  g: GradientColor;\n};\n\nexport type GradientFillShape = Omit<FillShape, 'c'> & GradientCommon;\n\ntype DashItem = {\n  n: string;\n  nm: string;\n  v: { a: number; k: number; ix: number };\n};\n\nexport type StrokeShape = ShapeElement & {\n  /** Stroke Opacity. */\n  o: Value;\n  /** Stroke Color. */\n  c: ColorValue;\n  /** Stroke Line Width */\n  w: Value;\n  /** Miter Limit */\n  ml: number;\n  /** Stroke Line Join */\n  lj: LineJoin;\n  /** Stroke Line Cap */\n  lc: LineCap;\n  /** Line Dash */\n  d: DashItem[];\n};\n\nexport type GradientStrokeShape = Omit<StrokeShape, 'c'> & GradientCommon;\n\nexport type Asset = ImageAsset | PrecompAsset | AudioAsset | VideoAsset;\n\ninterface AssetInterface {\n  /** Id used to reference in a precomp layer */\n  id: string;\n}\n\nexport type ImageAsset = AssetInterface & {\n  /** URL base */\n  u: string;\n  /** Path relative to URL base (asset.u) */\n  p: string;\n  /** [non standard]: URL */\n  _p: string;\n  /** Width */\n  w: number;\n  /** Height */\n  h: number;\n};\n\nexport type VideoAsset = AssetInterface & {\n  /** URL base */\n  u: string;\n  /** Path relative to URL base (asset.u) */\n  p: string;\n  /** [non standard]: URL */\n  _p: string;\n  /** Width */\n  w: number;\n  /** Height */\n  h: number;\n  /** ??? (usually 0) */\n  e: number;\n};\n\nexport type AudioAsset = AssetInterface & {\n  /** URL base */\n  u: string;\n  /** Path relative to URL base (asset.u) */\n  p: string;\n  /** [non standard]: URL */\n  _p: string;\n  /** ??? (usually 0) */\n  e: number;\n};\n\nexport type PrecompAsset = AssetInterface & {\n  /** Layers */\n  layers: Layer[];\n};\n\nexport enum FontPathOrigin {\n  CssUrl = 1,\n  ScriptUrl,\n  FontUrl,\n}\n\nexport type Font = {\n  /** ascent */\n  ascent: number;\n  /** font_family */\n  fFamily: string;\n  /** name */\n  fName: string;\n  /** font_style */\n  fStyle: string;\n  /** ??? */\n  fClass?: string;\n  /** path */\n  fPath: string;\n  /** weight */\n  fWeight: string;\n  /** origin */\n  origin: FontPathOrigin;\n};\n\nexport type FontList = {\n  list: Font[];\n};\n\nexport type CharData = {\n  shapes: ShapeElement[];\n};\n\nexport type Chars = {\n  /** Character Value. */\n  ch: string;\n  /** Character Font Family. */\n  fFamily: string;\n  /** Character Font Size. */\n  size: number;\n  /** Character Font Style. */\n  style: string;\n  /** Character Width. */\n  w: number;\n  /** Character Data. */\n  data: CharData;\n};\n\nexport interface Composition {\n  /** List of layers. */\n  layers?: Layer[];\n}\n\nexport type Animation = {\n  /** Bodymovin Version. */\n  v: string;\n  /** Frames per second. Positive integer. */\n  fr: number;\n  /** The time when the composition work area begins, in frames. */\n  ip: number;\n  /** The time when the composition work area ends. */\n  op: number;\n  /** Composition Width. */\n  w: number;\n  /** Composition Height. */\n  h: number;\n  /** List of Composition Layers. */\n  layers?: Layer[];\n  /** Composition name. */\n  nm?: string;\n  /** [0-1] Composition has 3-D layers. */\n  ddd?: number;\n  /** source items that can be used in multiple places. */\n  assets?: Asset[];\n  /** Available fonts. */\n  fonts?: FontList;\n  /** Source chars for text layers.  */\n  chars?: Chars[];\n  /** Motion blur setting. (Skottie) */\n  mb?: MotionBlurSettings;\n};\n\n/**\n * Motion Blur Settings\n * Enable motion blur for a layer by setting `layer.mb = true`\n */\nexport type MotionBlurSettings = {\n  /**\n   * Shutter Angle\n   * AE default: 180\n   * Skottie default: 0 ([0, 720])\n   */\n  sa?: number;\n  /**\n   * Shutter Phase\n   * AE default: -90\n   * Skottie default: 0 ([-360, 360])\n   */\n  sp?: number;\n  /**\n   * Samples Per Frame\n   * AE default: 16\n   * Skottie default: 1 ([1, 64])\n   */\n  spf?: number;\n  /**\n   * (not yet supported in any known Lottie player)\n   * Adaptive Sample Limit\n   * 2D layer motion automatically uses more samples per frame\n   * when needed, up to the value specified by Adaptive Sample\n   * Limit.\n   * AE default: 128\n   */\n  asl?: number;\n};\n","import { definedProps, rad2deg, Shape } from '@antv/g-lite';\nimport type { PathArray } from '@antv/util';\nimport {\n  isNumber,\n  distanceSquareRoot,\n  isNil,\n  getTotalLength,\n} from '@antv/util';\nimport type { LoadAnimationOptions } from '..';\nimport { completeData } from './complete-data';\nimport * as Lottie from './lottie-type';\n\nexport interface KeyframeAnimationKeyframe {\n  easing?: string;\n  offset: number;\n  [key: string]: any;\n}\n\nexport interface KeyframeAnimation {\n  duration?: number;\n  delay?: number;\n  easing?: string;\n  keyframes: Record<string, any>[];\n}\n\nexport interface CustomElementOption {\n  type: Shape;\n\n  keyframeAnimation?: KeyframeAnimation[];\n  children?: CustomElementOption[];\n\n  shape?: Record<string, any>;\n  style?: Record<string, any>;\n  clipPath?: CustomElementOption;\n  extra?: any;\n\n  name?: string;\n  anchorX?: number;\n  anchorY?: number;\n  rotation?: number;\n  scaleX?: number;\n  scaleY?: number;\n  x?: number;\n  y?: number;\n\n  visibilityStartOffset?: number;\n  visibilityEndOffset?: number;\n  visibilityFrame?: number;\n}\n\nexport class ParseContext {\n  fps: number;\n  frameTime = 1000 / 30;\n  startFrame = 0;\n  endFrame: number;\n  version: string;\n  autoplay = false;\n  fill: FillMode = 'auto';\n  iterations = 0;\n\n  assetsMap: Map<string, Lottie.Asset> = new Map();\n\n  layerOffsetTime: number;\n}\n\nfunction isNumberArray(val: any): val is number[] {\n  return Array.isArray(val) && typeof val[0] === 'number';\n}\n\nfunction isMultiDimensionalValue(val?: { k?: any }): val is { k: number[] } {\n  return isNumberArray(val?.k);\n}\n\nfunction isMultiDimensionalKeyframedValue(val?: {\n  k?: any;\n}): val is { k: Lottie.OffsetKeyframe[] } {\n  const k = val?.k;\n  return Array.isArray(k) && k[0].t !== undefined && isNumberArray(k[0].s);\n}\n\nfunction isValue(val?: { k?: any }): val is { k: number } {\n  // TODO is [100] sort of value?\n  return typeof val?.k === 'number';\n}\n\nfunction isKeyframedValue(val?: {\n  k?: any;\n}): val is { k: Lottie.OffsetKeyframe[] } {\n  const k = val?.k;\n  return Array.isArray(k) && k[0].t !== undefined && typeof k[0].s === 'number';\n}\n\nfunction toColorString(val: number | number[]) {\n  const opacity = getMultiDimensionValue(val, 3);\n\n  return `rgba(${[\n    Math.round(getMultiDimensionValue(val, 0) * 255),\n    Math.round(getMultiDimensionValue(val, 1) * 255),\n    Math.round(getMultiDimensionValue(val, 2) * 255),\n    !isNil(opacity) ? opacity : 1,\n  ].join(',')})`;\n}\n\nfunction getMultiDimensionValue(val: number | number[], dimIndex?: number) {\n  // eslint-disable-next-line no-nested-ternary\n  return val != null\n    ? typeof val === 'number'\n      ? val\n      : val[dimIndex || 0]\n    : NaN;\n}\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/concepts/#easing-handles\n */\nfunction getMultiDimensionEasingBezierString(\n  kf: Pick<Lottie.OffsetKeyframe, 'o' | 'i'>,\n  nextKf: Pick<Lottie.OffsetKeyframe, 'o' | 'i'>,\n  dimIndex?: number,\n) {\n  const bezierEasing: number[] = [];\n  bezierEasing.push(\n    (kf.o?.x &&\n      (getMultiDimensionValue(kf.o.x, dimIndex) ||\n        getMultiDimensionValue(kf.o.x, 0))) ||\n      0,\n    (kf.o?.y &&\n      (getMultiDimensionValue(kf.o.y, dimIndex) ||\n        getMultiDimensionValue(kf.o.y, 0))) ||\n      0,\n    (kf.i?.x &&\n      (getMultiDimensionValue(kf.i.x, dimIndex) ||\n        getMultiDimensionValue(kf.i.x, 0))) ||\n      1,\n    (kf.i?.y &&\n      (getMultiDimensionValue(kf.i.y, dimIndex) ||\n        getMultiDimensionValue(kf.i.y, 0))) ||\n      1,\n    // nextKf?.o?.x ? getMultiDimensionValue(nextKf.o.x, dimIndex) : 1,\n    // nextKf?.o?.y ? getMultiDimensionValue(nextKf.o.y, dimIndex) : 1,\n  );\n\n  // linear by default\n  if (\n    !(\n      bezierEasing[0] === 0 &&\n      bezierEasing[1] === 0 &&\n      bezierEasing[2] === 1 &&\n      bezierEasing[3] === 1\n    )\n  ) {\n    return `cubic-bezier(${bezierEasing.join(',')})`;\n  }\n}\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/concepts/#keyframe\n */\nfunction parseKeyframe(\n  kfs: Lottie.OffsetKeyframe[],\n  bezierEasingDimIndex: number,\n  context: ParseContext,\n  setVal: (kfObj: any, val: any) => void,\n) {\n  const kfsLen = kfs.length;\n  // const offset = context.layerStartTime;\n  const duration = context.endFrame - context.startFrame;\n  const out: KeyframeAnimation = {\n    duration: 0,\n    delay: 0,\n    keyframes: [],\n  };\n\n  let prevKf;\n  for (let i = 0; i < kfsLen; i++) {\n    const kf = kfs[i];\n    const nextKf = kfs[i + 1];\n\n    // If h is present and it's 1, you don't need i and o,\n    // as the property will keep the same value until the next keyframe.\n    const isDiscrete = kf.h === 1;\n    const offset =\n      (kf.t + context.layerOffsetTime - context.startFrame) / duration;\n\n    const outKeyframe: KeyframeAnimationKeyframe = {\n      offset,\n    };\n    if (!isDiscrete) {\n      outKeyframe.easing = getMultiDimensionEasingBezierString(\n        kf,\n        nextKf,\n        bezierEasingDimIndex,\n      );\n    }\n    // Use end state of later frame if start state not exits.\n    // @see https://lottiefiles.github.io/lottie-docs/concepts/#old-lottie-keyframes\n    const startVal = kf.s || prevKf?.e;\n    if (startVal) {\n      setVal(outKeyframe, startVal);\n    }\n\n    if (outKeyframe.offset > 0 && i === 0) {\n      // Set initial\n      const initialKeyframe = {\n        offset: 0,\n      };\n      if (startVal) {\n        setVal(initialKeyframe, startVal);\n      }\n      out.keyframes.push(initialKeyframe);\n    }\n\n    out.keyframes.push(outKeyframe);\n\n    if (isDiscrete && nextKf) {\n      // Use two keyframe to simulate the discrete animation.\n      const extraKeyframe: KeyframeAnimationKeyframe = {\n        offset: Math.max(\n          (nextKf.t + context.layerOffsetTime - context.startFrame) / duration,\n          0,\n        ),\n      };\n      setVal(extraKeyframe, startVal);\n      out.keyframes.push(extraKeyframe);\n    }\n\n    prevKf = kf;\n  }\n\n  if (kfsLen) {\n    out.duration = context.frameTime * duration;\n  }\n\n  return out;\n}\n\nfunction parseOffsetKeyframe(\n  kfs: Lottie.OffsetKeyframe[],\n  targetPropName: string,\n  propNames: string[],\n  keyframeAnimations: KeyframeAnimation[],\n  context: ParseContext,\n  convertVal?: (val: number) => number,\n) {\n  for (let dimIndex = 0; dimIndex < propNames.length; dimIndex++) {\n    const propName = propNames[dimIndex];\n    const keyframeAnim = parseKeyframe(\n      kfs,\n      dimIndex,\n      context,\n      (outKeyframe, startVal) => {\n        let val = getMultiDimensionValue(startVal, dimIndex);\n        if (convertVal) {\n          val = convertVal(val);\n        }\n        (targetPropName\n          ? (outKeyframe[targetPropName] = {} as any)\n          : outKeyframe)[propName] = val;\n      },\n    );\n\n    // moving position around a curved path\n    const needOffsetPath = kfs.some((kf) => kf.ti && kf.to);\n    if (needOffsetPath) {\n      const offsetPath: PathArray = [] as unknown as PathArray;\n\n      kfs.forEach((kf, i) => {\n        keyframeAnim.keyframes[i].offsetPath = offsetPath;\n\n        // convert to & ti(Tangent for values (eg: moving position around a curved path)) to offsetPath & offsetDistance\n        // @see https://lottiefiles.github.io/lottie-docs/concepts/#animated-position\n        if (kf.ti && kf.to) {\n          if (i === 0) {\n            offsetPath.push(['M', kf.s[0], kf.s[1]]);\n          }\n\n          keyframeAnim.keyframes[i].segmentLength = getTotalLength(offsetPath);\n\n          // @see https://lottiefiles.github.io/lottie-docs/concepts/#bezier\n          // The nth bezier segment is defined as:\n          // v[n], v[n]+o[n], v[n+1]+i[n+1], v[n+1]\n          offsetPath.push([\n            'C',\n            kf.s[0] + kf.to[0],\n            kf.s[1] + kf.to[1],\n            kf.s[0] + kf.ti[0],\n            kf.s[1] + kf.ti[1],\n            kf.e[0],\n            kf.e[1],\n          ]);\n        }\n      });\n\n      // calculate offsetDistance: segmentLength / totalLength\n      const totalLength = getTotalLength(offsetPath);\n      keyframeAnim.keyframes.forEach((kf) => {\n        kf.offsetDistance = isNil(kf.segmentLength)\n          ? 1\n          : kf.segmentLength / totalLength;\n        delete kf.segmentLength;\n      });\n    }\n\n    if (keyframeAnim.keyframes.length) {\n      keyframeAnimations.push(keyframeAnim);\n    }\n  }\n}\n\nfunction parseColorOffsetKeyframe(\n  kfs: Lottie.OffsetKeyframe[],\n  targetPropName: string,\n  propName: string,\n  keyframeAnimations: KeyframeAnimation[],\n  context: ParseContext,\n) {\n  const keyframeAnim = parseKeyframe(\n    kfs,\n    0,\n    context,\n    (outKeyframe, startVal) => {\n      (targetPropName\n        ? (outKeyframe[targetPropName] = {} as any)\n        : outKeyframe)[propName] = toColorString(startVal);\n    },\n  );\n  if (keyframeAnim.keyframes.length) {\n    keyframeAnimations.push(keyframeAnim);\n  }\n}\n\nfunction parseValue(\n  lottieVal: Lottie.MultiDimensional | Lottie.Value,\n  attrs: Record<string, any>,\n  targetPropName: string,\n  propNames: string[],\n  animations: KeyframeAnimation[],\n  context: ParseContext,\n  convertVal?: (val: number) => number,\n) {\n  if (targetPropName) {\n    attrs[targetPropName] = attrs[targetPropName] || {};\n  }\n  const target = targetPropName ? attrs[targetPropName] : attrs;\n\n  if (isValue(lottieVal)) {\n    const val = lottieVal.k;\n    target[propNames[0]] = convertVal ? convertVal(val) : val;\n  } else if (isKeyframedValue(lottieVal)) {\n    parseOffsetKeyframe(\n      lottieVal.k,\n      targetPropName,\n      propNames,\n      animations,\n      context,\n      convertVal,\n    );\n  } else if (isMultiDimensionalValue(lottieVal)) {\n    for (let i = 0; i < propNames.length; i++) {\n      const val = getMultiDimensionValue(lottieVal.k, i);\n      target[propNames[i]] = convertVal ? convertVal(val) : val;\n    }\n  } else if (isMultiDimensionalKeyframedValue(lottieVal)) {\n    // TODO Merge dimensions\n    parseOffsetKeyframe(\n      lottieVal.k,\n      targetPropName,\n      propNames,\n      animations,\n      context,\n      convertVal,\n    );\n  }\n}\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/concepts/#transform\n */\nfunction parseTransforms(\n  ks: Lottie.Transform,\n  attrs: Record<string, any>,\n  animations: KeyframeAnimation[],\n  context: ParseContext,\n  targetProp = '',\n  transformProps = {\n    x: 'x',\n    y: 'y',\n    rotation: 'rotation',\n    scaleX: 'scaleX',\n    scaleY: 'scaleY',\n    anchorX: 'anchorX',\n    anchorY: 'anchorY',\n    skew: 'skew',\n    skewAxis: 'skewAxis',\n  },\n) {\n  // @see https://lottiefiles.github.io/lottie-docs/concepts/#split-vector\n  if ((ks.p as Lottie.Position).s) {\n    parseValue(\n      (ks.p as Lottie.Position).x,\n      attrs,\n      targetProp,\n      [transformProps.x],\n      animations,\n      context,\n    );\n    parseValue(\n      (ks.p as Lottie.Position).y,\n      attrs,\n      targetProp,\n      [transformProps.y],\n      animations,\n      context,\n    );\n  } else {\n    parseValue(\n      ks.p as Lottie.MultiDimensional,\n      attrs,\n      targetProp,\n      [transformProps.x, transformProps.y],\n      animations,\n      context,\n    );\n  }\n  parseValue(\n    ks.s,\n    attrs,\n    targetProp,\n    [transformProps.scaleX, transformProps.scaleY],\n    animations,\n    context,\n    (val) => val / 100,\n  );\n  parseValue(\n    ks.r,\n    attrs,\n    targetProp,\n    [transformProps.rotation],\n    animations,\n    context,\n  );\n\n  parseValue(\n    ks.a,\n    attrs,\n    targetProp,\n    [transformProps.anchorX, transformProps.anchorY],\n    animations,\n    context,\n  );\n\n  parseValue(\n    ks.sk,\n    attrs,\n    targetProp,\n    [transformProps.skew],\n    animations,\n    context,\n  );\n\n  parseValue(\n    ks.sa,\n    attrs,\n    targetProp,\n    [transformProps.skewAxis],\n    animations,\n    context,\n  );\n}\n\nfunction isGradientFillOrStroke(\n  fl: any,\n): fl is Lottie.GradientFillShape | Lottie.GradientStrokeShape {\n  return fl.g && fl.s && fl.e;\n}\n\nfunction convertColorStops(arr: number[], count: number) {\n  const colorStops = [];\n  for (let i = 0; i < count * 4; ) {\n    const offset = arr[i++];\n    const r = Math.round(arr[i++] * 255);\n    const g = Math.round(arr[i++] * 255);\n    const b = Math.round(arr[i++] * 255);\n    colorStops.push({\n      offset,\n      color: `rgb(${r}, ${g}, ${b})`,\n    });\n  }\n  return colorStops;\n}\n\nfunction joinColorStops(colorStops: any[]) {\n  return `${colorStops\n    .map(({ offset, color }) => `${color} ${offset * 100}%`)\n    .join(', ')}`;\n}\n\n/**\n * TODO:\n * * Transition\n * * Highlight length & angle in Radial Gradient\n *\n * @see https://lottiefiles.github.io/lottie-docs/concepts/#gradients\n * @see https://lottiefiles.github.io/lottie-docs/shapes/#gradients\n */\nfunction parseGradient(\n  shape: Lottie.GradientFillShape | Lottie.GradientStrokeShape,\n) {\n  const colorArr = shape.g.k.k as number[];\n  const colorStops = convertColorStops(colorArr, shape.g.p);\n  // @see https://lottiefiles.github.io/lottie-docs/constants/#gradienttype\n  if (shape.t === Lottie.GradientType.Linear) {\n    const angle = rad2deg(\n      Math.atan2(\n        (shape.e.k[1] as number) - (shape.s.k[1] as number),\n        (shape.e.k[0] as number) - (shape.s.k[0] as number),\n      ),\n    );\n\n    // @see https://g-next.antv.vision/zh/docs/api/css/css-properties-values-api#linear-gradient\n    return `linear-gradient(${angle}deg, ${joinColorStops(colorStops)})`;\n  }\n  if (shape.t === Lottie.GradientType.Radial) {\n    // TODO: highlight length & angle (h & a)\n    // Highlight Length, as a percentage between s and e\n    // Highlight Angle, relative to the direction from s to e\n    const size = distanceSquareRoot(\n      shape.e.k as [number, number],\n      shape.s.k as [number, number],\n    );\n\n    // @see https://g-next.antv.vision/zh/docs/api/css/css-properties-values-api#radial-gradient\n    return `radial-gradient(circle ${size}px at ${shape.s.k[0] as number}px ${\n      shape.s.k[1] as number\n    }px, ${joinColorStops(colorStops)})`;\n  }\n  // Invalid gradient\n  return '#000';\n}\nfunction parseFill(\n  fl: Lottie.FillShape | Lottie.GradientFillShape,\n  attrs: Record<string, any>,\n  animations: KeyframeAnimation[],\n  context: ParseContext,\n) {\n  attrs.style = attrs.style || {};\n  // Color\n  if (isGradientFillOrStroke(fl)) {\n    attrs.style.fill = parseGradient(fl);\n  } else if (isMultiDimensionalValue(fl.c)) {\n    attrs.style.fill = toColorString(fl.c.k);\n  } else if (isMultiDimensionalKeyframedValue(fl.c)) {\n    parseColorOffsetKeyframe(fl.c.k, 'style', 'fill', animations, context);\n  }\n\n  // FillRule @see https://lottiefiles.github.io/lottie-docs/constants/#fillrule\n  attrs.style.fillRule =\n    fl.r === Lottie.FillRule.EvenOdd ? 'evenodd' : 'nonzero';\n\n  // Opacity\n  parseValue(\n    fl.o,\n    attrs,\n    'style',\n    ['fillOpacity'],\n    animations,\n    context,\n    (opacity) => opacity / 100,\n  );\n}\n\nfunction parseStroke(\n  st: Lottie.StrokeShape,\n  attrs: Record<string, any>,\n  animations: KeyframeAnimation[],\n  context: ParseContext,\n) {\n  attrs.style = attrs.style || {};\n  // Color\n  if (isGradientFillOrStroke(st)) {\n    attrs.style.stroke = parseGradient(st);\n  } else if (isMultiDimensionalValue(st.c)) {\n    attrs.style.stroke = toColorString(st.c.k);\n  } else if (isMultiDimensionalKeyframedValue(st.c)) {\n    parseColorOffsetKeyframe(st.c.k, 'style', 'stroke', animations, context);\n  }\n\n  // Opacity\n  parseValue(\n    st.o,\n    attrs,\n    'style',\n    ['strokeOpacity'],\n    animations,\n    context,\n    (opacity) => opacity / 100,\n  );\n  // Line width\n  parseValue(st.w, attrs, 'style', ['lineWidth'], animations, context);\n\n  switch (st.lj) {\n    case Lottie.LineJoin.Bevel:\n      attrs.style.lineJoin = 'bevel';\n      break;\n    case Lottie.LineJoin.Round:\n      attrs.style.lineJoin = 'round';\n      break;\n    case Lottie.LineJoin.Miter:\n      attrs.style.lineJoin = 'miter';\n      break;\n  }\n\n  switch (st.lc) {\n    case Lottie.LineCap.Butt:\n      attrs.style.lineCap = 'butt';\n      break;\n    case Lottie.LineCap.Round:\n      attrs.style.lineCap = 'round';\n      break;\n    case Lottie.LineCap.Square:\n      attrs.style.lineCap = 'square';\n      break;\n  }\n\n  // Line dash\n  const dashArray: number[] = [];\n  let dashOffset = 0;\n  if (st.d) {\n    st.d.forEach((item) => {\n      if (item.n !== 'o') {\n        dashArray.push(item.v.k);\n      } else {\n        dashOffset = item.v.k;\n      }\n    });\n\n    attrs.style.lineDash = dashArray;\n    attrs.style.lineDashOffset = dashOffset;\n  }\n}\n\nfunction isBezier(k: any): k is Lottie.Bezier {\n  return k && k.i && k.o && k.v;\n}\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/shapes/#path\n */\nfunction parseShapePaths(\n  shape: Pick<Lottie.PathShape, 'ks'>,\n  animations: KeyframeAnimation[],\n  context: ParseContext,\n) {\n  const attrs: any = {\n    type: Shape.PATH,\n    // Should have no fill and stroke by default\n    style: {\n      fill: 'none',\n      stroke: 'none',\n    },\n  };\n  // @see https://lottiefiles.github.io/lottie-docs/concepts/#bezier\n  if (isBezier(shape.ks.k)) {\n    attrs.shape = {\n      in: shape.ks.k.i,\n      out: shape.ks.k.o,\n      v: shape.ks.k.v,\n      close: shape.ks.k.c,\n    };\n  } else if (Array.isArray(shape.ks.k)) {\n    const keyframeAnim = parseKeyframe(\n      shape.ks.k as any as Lottie.OffsetKeyframe[],\n      0,\n      context,\n      (outKeyframe, startVal) => {\n        outKeyframe.shape = {\n          in: startVal[0].i,\n          out: startVal[0].o,\n          v: startVal[0].v,\n          close: startVal[0].c,\n        };\n      },\n    );\n    if (keyframeAnim.keyframes.length) {\n      animations.push(keyframeAnim);\n    }\n  }\n  return attrs;\n}\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/shapes/#rectangle\n */\nfunction parseShapeRect(\n  shape: Lottie.RectShape,\n  animations: KeyframeAnimation[],\n  context: ParseContext,\n) {\n  const attrs = {\n    type: Shape.RECT,\n    // Should have no fill and stroke by default\n    style: {\n      fill: 'none',\n      stroke: 'none',\n    },\n    shape: {},\n  };\n\n  parseValue(shape.p, attrs, 'shape', ['x', 'y'], animations, context);\n  parseValue(shape.s, attrs, 'shape', ['width', 'height'], animations, context);\n  parseValue(shape.r, attrs, 'shape', ['r'], animations, context);\n\n  return attrs;\n}\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/layers/#image-layer\n */\nfunction parseImageLayer(layer: Lottie.ImageLayer, context: ParseContext) {\n  const attrs = {\n    type: Shape.IMAGE,\n    style: {},\n    shape: {\n      width: 0,\n      height: 0,\n      src: '',\n    },\n  };\n\n  const asset = context.assetsMap.get(layer.refId) as Lottie.ImageAsset;\n  if (asset) {\n    attrs.shape.width = asset.w;\n    attrs.shape.height = asset.h;\n    // TODO: url to fetch\n    attrs.shape.src = asset.p;\n  }\n\n  return attrs;\n}\n\n/**\n * @see https://lottiefiles.github.io/lottie-docs/shapes/#ellipse\n */\nfunction parseShapeEllipse(\n  shape: Lottie.EllipseShape,\n  animations: KeyframeAnimation[],\n  context: ParseContext,\n) {\n  const attrs: any = {\n    type: Shape.ELLIPSE,\n    // Should have no fill and stroke by default\n    style: {\n      fill: 'none',\n      stroke: 'none',\n    },\n    shape: {},\n  };\n\n  parseValue(shape.p, attrs, 'shape', ['cx', 'cy'], animations, context);\n  parseValue(\n    shape.s,\n    attrs,\n    'shape',\n    ['rx', 'ry'],\n    animations,\n    context,\n    (val) => val / 2,\n  );\n  return attrs;\n}\n\nfunction parseShapeLayer(layer: Lottie.ShapeLayer, context: ParseContext) {\n  function tryCreateShape(\n    shape: Lottie.ShapeElement,\n    keyframeAnimations: KeyframeAnimation[],\n  ) {\n    let ecEl: any;\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n    switch (shape.ty) {\n      case Lottie.ShapeType.Path:\n        ecEl = parseShapePaths(\n          shape as Lottie.PathShape,\n          keyframeAnimations,\n          context,\n        );\n        break;\n      case Lottie.ShapeType.Ellipse:\n        ecEl = parseShapeEllipse(\n          shape as Lottie.EllipseShape,\n          keyframeAnimations,\n          context,\n        );\n        break;\n      case Lottie.ShapeType.Rectangle:\n        ecEl = parseShapeRect(\n          shape as Lottie.RectShape,\n          keyframeAnimations,\n          context,\n        );\n        break;\n      case Lottie.ShapeType.PolyStar:\n        // TODO: parseShapePolyStar\n        break;\n    }\n    return ecEl;\n  }\n\n  function parseModifiers(\n    shapes: Lottie.ShapeElement[],\n    modifiers: {\n      attrs: Record<string, any>;\n      keyframeAnimations: KeyframeAnimation[];\n    },\n  ) {\n    shapes.forEach((shape) => {\n      if (shape.hd) {\n        return;\n      }\n      // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n      switch (shape.ty) {\n        case Lottie.ShapeType.Repeater:\n          parseValue(\n            (shape as Lottie.RepeatShape).c,\n            modifiers.attrs,\n            'shape',\n            ['repeat'],\n            modifiers.keyframeAnimations,\n            context,\n          );\n          parseTransforms(\n            (shape as Lottie.RepeatShape).tr,\n            modifiers.attrs,\n            modifiers.keyframeAnimations,\n            context,\n            'shape',\n            {\n              x: 'repeatX',\n              y: 'repeatY',\n              rotation: 'repeatRot',\n              scaleX: 'repeatScaleX',\n              scaleY: 'repeatScaleY',\n              anchorX: 'repeatAnchorX',\n              anchorY: 'repeatAnchorY',\n              skew: 'repeatSkew',\n              skewAxis: 'repeatSkewAxis',\n            },\n          );\n          break;\n        case Lottie.ShapeType.Trim:\n          parseValue(\n            (shape as Lottie.TrimShape).s,\n            modifiers.attrs,\n            'shape',\n            ['trimStart'],\n            modifiers.keyframeAnimations,\n            context,\n          );\n          parseValue(\n            (shape as Lottie.TrimShape).e,\n            modifiers.attrs,\n            'shape',\n            ['trimEnd'],\n            modifiers.keyframeAnimations,\n            context,\n          );\n          break;\n      }\n    });\n  }\n\n  function parseIterations(\n    shapes: Lottie.ShapeElement[],\n    modifiers: {\n      attrs: Record<string, any>;\n      keyframeAnimations: KeyframeAnimation[];\n    },\n  ) {\n    const ecEls: CustomElementOption[] = [];\n    const attrs: Record<string, any> = {};\n    const keyframeAnimations: KeyframeAnimation[] = [];\n\n    // Order is reversed\n    shapes = shapes.slice().reverse();\n\n    // Modifiers first:\n    parseModifiers(shapes, modifiers);\n\n    shapes.forEach((shape) => {\n      if (shape.hd) {\n        return;\n      }\n\n      let ecEl;\n      switch (shape.ty) {\n        case Lottie.ShapeType.Group:\n          ecEl = {\n            type: Shape.GROUP,\n            children: parseIterations(\n              (shape as Lottie.GroupShapeElement).it,\n              // Modifiers will be applied to all childrens.\n              modifiers,\n            ),\n          };\n          break;\n        // TODO Multiple fill and stroke\n        case Lottie.ShapeType.Fill:\n        case Lottie.ShapeType.GradientFill:\n          parseFill(\n            shape as Lottie.FillShape,\n            attrs,\n            keyframeAnimations,\n            context,\n          );\n          break;\n        case Lottie.ShapeType.Stroke:\n        case Lottie.ShapeType.GradientStroke:\n          parseStroke(\n            shape as Lottie.StrokeShape,\n            attrs,\n            keyframeAnimations,\n            context,\n          );\n          break;\n        case Lottie.ShapeType.Transform:\n          parseTransforms(\n            shape as Lottie.TransformShape,\n            attrs,\n            keyframeAnimations,\n            context,\n          );\n          break;\n        // TODO Multiple shapes.\n        default:\n          ecEl = tryCreateShape(shape, keyframeAnimations);\n      }\n      if (ecEl) {\n        ecEl.name = shape.nm;\n        ecEls.push(ecEl);\n      }\n    });\n\n    ecEls.forEach((el, idx) => {\n      // Apply modifiers first\n      el = {\n        ...el,\n        ...definedProps(modifiers.attrs),\n        ...attrs,\n      };\n\n      if (keyframeAnimations.length || modifiers.keyframeAnimations.length) {\n        el.keyframeAnimation = [\n          ...modifiers.keyframeAnimations,\n          ...keyframeAnimations,\n        ];\n      }\n\n      ecEls[idx] = el;\n    });\n    return ecEls;\n  }\n\n  return {\n    type: Shape.GROUP,\n    children: parseIterations(layer.shapes, {\n      attrs: {},\n      keyframeAnimations: [],\n    }),\n  } as CustomElementOption;\n}\n\nfunction traverse(\n  el: CustomElementOption,\n  cb: (el: CustomElementOption) => void,\n) {\n  cb(el);\n  if (el.type === Shape.GROUP) {\n    el.children?.forEach((child) => {\n      traverse(child, cb);\n    });\n  }\n}\n\nfunction addLayerOpacity(\n  layer: Lottie.Layer,\n  layerGroup: CustomElementOption,\n  context: ParseContext,\n) {\n  const opacityAttrs = {} as CustomElementOption;\n  const opacityAnimations: KeyframeAnimation[] = [];\n\n  if (layer.ks?.o) {\n    parseValue(\n      layer.ks.o,\n      opacityAttrs,\n      'style',\n      ['opacity'],\n      opacityAnimations,\n      context,\n      (val) => val / 100,\n    );\n\n    if (opacityAttrs.style?.opacity || opacityAnimations.length) {\n      // apply opacity to group's children\n      traverse(layerGroup, (el) => {\n        if (el.type !== Shape.GROUP && el.style) {\n          Object.assign(el.style, opacityAttrs.style);\n          if (opacityAnimations.length) {\n            el.keyframeAnimation = (el.keyframeAnimation || []).concat(\n              opacityAnimations,\n            );\n          }\n        }\n      });\n    }\n  }\n}\n\nfunction parseSolidShape(layer: Lottie.SolidColorLayer) {\n  return {\n    type: Shape.RECT,\n    shape: {\n      x: 0,\n      y: 0,\n      width: layer.sw,\n      height: layer.sh,\n    },\n    style: {\n      fill: layer.sc,\n    },\n  } as CustomElementOption;\n}\n\nfunction parseLayers(\n  layers: Lottie.Layer[],\n  context: ParseContext,\n  precompLayerTl?: {\n    st: number;\n  },\n) {\n  const elements: CustomElementOption[] = [];\n\n  // Order is reversed\n  layers = layers.slice().reverse();\n  const layerIndexMap: Map<number, CustomElementOption> = new Map();\n  const offsetTime = precompLayerTl?.st || 0;\n\n  layers?.forEach((layer) => {\n    // Layer time is offseted by the precomp layer.\n\n    // Use the ip, op, st of ref from.\n    const layerIp = offsetTime + layer.ip;\n    const layerOp = offsetTime + layer.op;\n    const layerSt = offsetTime + layer.st;\n    context.layerOffsetTime = offsetTime;\n\n    let layerGroup: CustomElementOption | undefined;\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n    switch (layer.ty) {\n      case Lottie.LayerType.shape:\n        // @see https://lottiefiles.github.io/lottie-docs/layers/#shape-layer\n        layerGroup = parseShapeLayer(layer as Lottie.ShapeLayer, context);\n        break;\n      case Lottie.LayerType.null:\n        // @see https://lottiefiles.github.io/lottie-docs/layers/#null-layer\n        layerGroup = {\n          type: Shape.GROUP,\n          children: [],\n        };\n        break;\n      case Lottie.LayerType.solid:\n        // @see https://lottiefiles.github.io/lottie-docs/layers/#solid-color-layer\n        layerGroup = {\n          type: Shape.GROUP,\n          children: [],\n        };\n        // Anything you can do with solid layers, you can do better with a shape layer and a rectangle shape\n        // since none of this layer's own properties can be animated.\n        if ((layer as Lottie.SolidColorLayer).sc) {\n          layerGroup.children.push(\n            parseSolidShape(layer as Lottie.SolidColorLayer),\n          );\n        }\n        break;\n      case Lottie.LayerType.precomp:\n        // @see https://lottiefiles.github.io/lottie-docs/layers/#precomposition-layer\n        layerGroup = {\n          type: Shape.GROUP,\n          children: parseLayers(\n            (\n              context.assetsMap.get(\n                (layer as Lottie.PrecompLayer).refId,\n              ) as Lottie.PrecompAsset\n            )?.layers || [],\n            context,\n            {\n              st: layerSt,\n            },\n          ),\n        };\n        break;\n      case Lottie.LayerType.text:\n        // TODO: https://lottiefiles.github.io/lottie-docs/layers/#text-layer\n        break;\n      case Lottie.LayerType.image:\n        // TODO: https://lottiefiles.github.io/lottie-docs/layers/#image-layer\n        layerGroup = layerGroup = {\n          type: Shape.GROUP,\n          children: [parseImageLayer(layer as Lottie.ImageLayer, context)],\n        };\n        break;\n    }\n\n    if (layerGroup) {\n      const keyframeAnimations: KeyframeAnimation[] = [];\n      const attrs: Record<string, any> = {\n        name: layer.nm,\n      };\n      if (layer.ks) {\n        parseTransforms(layer.ks, attrs, keyframeAnimations, context);\n      }\n\n      Object.assign(layerGroup, attrs);\n      if (layer.ind != null) {\n        layerIndexMap.set(layer.ind, layerGroup);\n      }\n\n      layerGroup.extra = {\n        layerParent: layer.parent,\n      };\n      // Masks @see https://lottiefiles.github.io/lottie-docs/layers/#masks\n      // @see https://lottie-animation-community.github.io/docs/specs/layers/common/#clipping-masks\n      // TODO: not support alpha and other modes.\n      // @see https://lottie-animation-community.github.io/docs/specs/properties/mask-mode-types/\n      if (layer.hasMask && layer.masksProperties?.length) {\n        const maskKeyframeAnimations: KeyframeAnimation[] = [];\n        // TODO: Only support one mask now.\n        const attrs = parseShapePaths(\n          {\n            ks: layer.masksProperties[0].pt,\n          },\n          maskKeyframeAnimations,\n          context,\n        );\n\n        layerGroup.clipPath = {\n          type: Shape.PATH,\n          ...attrs,\n        };\n        if (maskKeyframeAnimations.length) {\n          layerGroup.clipPath.keyframeAnimation = maskKeyframeAnimations;\n        }\n      }\n\n      addLayerOpacity(layer, layerGroup, context);\n\n      // Update in and out animation.\n      if (\n        layerIp != null &&\n        layerOp != null &&\n        (layerIp > context.startFrame || layerOp < context.endFrame)\n      ) {\n        const duration = context.endFrame - context.startFrame;\n        const visibilityStartOffset = (layerIp - context.startFrame) / duration;\n        const visibilityEndOffset = (layerOp - context.startFrame) / duration;\n        layerGroup.visibilityStartOffset = visibilityStartOffset;\n        layerGroup.visibilityEndOffset = visibilityEndOffset;\n        layerGroup.visibilityFrame = duration;\n      }\n      if (keyframeAnimations.length) {\n        layerGroup.keyframeAnimation = keyframeAnimations;\n      }\n\n      elements.push(layerGroup);\n    }\n  });\n\n  // Build hierarchy\n  return elements.filter((el) => {\n    const parentLayer = layerIndexMap.get(el.extra?.layerParent);\n    if (parentLayer) {\n      parentLayer.children?.push(el);\n      return false;\n    }\n    return true;\n  });\n}\n\nconst DEFAULT_LOAD_ANIMATION_OPTIONS: LoadAnimationOptions = {\n  loop: true,\n  autoplay: false,\n  fill: 'both',\n};\nexport function parse(\n  data: Lottie.Animation,\n  options: Partial<LoadAnimationOptions>,\n) {\n  completeData(data);\n  const { loop, autoplay, fill } = {\n    ...DEFAULT_LOAD_ANIMATION_OPTIONS,\n    ...options,\n  };\n  const context = new ParseContext();\n\n  context.fps = data.fr || 30;\n  context.frameTime = 1000 / context.fps;\n  context.startFrame = data.ip;\n  context.endFrame = data.op;\n  context.version = data.v;\n  context.autoplay = !!autoplay;\n  context.fill = fill;\n  // eslint-disable-next-line no-nested-ternary\n  context.iterations = isNumber(loop) ? loop : loop ? Infinity : 1;\n  // @see https://lottiefiles.github.io/lottie-docs/assets/\n  data.assets?.forEach((asset) => {\n    context.assetsMap.set(asset.id, asset);\n  });\n\n  const elements = parseLayers(data.layers || [], context);\n\n  return {\n    width: data.w,\n    height: data.h,\n    elements,\n    context,\n  };\n}\n","import type * as Lottie from './parser/lottie-type';\nimport { LottieAnimation } from './LottieAnimation';\nimport { parse } from './parser';\n\nexport interface LoadAnimationOptions {\n  /**\n   * @see https://github.com/airbnb/lottie-web/blob/master/player/js/animation/AnimationItem.js#L43\n   */\n  loop: boolean | number;\n\n  /**\n   * @see https://github.com/airbnb/lottie-web/blob/master/player/js/animation/AnimationItem.js#L42\n   */\n  autoplay: boolean;\n\n  /**\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/EffectTiming/fill\n   */\n  fill: FillMode;\n}\n\n/**\n * @see https://github.com/airbnb/lottie-web/wiki/loadAnimation-options\n * @see https://github.com/airbnb/lottie-web#other-loading-options\n */\nexport function loadAnimation(\n  data: Lottie.Animation,\n  options: Partial<LoadAnimationOptions>,\n): LottieAnimation {\n  const { width, height, elements, context } = parse(data, options);\n  return new LottieAnimation(width, height, elements, context);\n}\n"]}