4aed8fb201cfb6e1ea69db270f40d6be.json 147 KB
{"ast":null,"code":"/*\r\n  imagetracer.js version 1.2.4\r\n  Simple raster image tracer and vectorizer written in JavaScript.\r\n  andras@jankovics.net\r\n*/\n\n/*\r\n  The Unlicense / PUBLIC DOMAIN\r\n  This is free and unencumbered software released into the public domain.\r\n  Anyone is free to copy, modify, publish, use, compile, sell, or\r\n  distribute this software, either in source code form or as a compiled\r\n  binary, for any purpose, commercial or non-commercial, and by any\r\n  means.\r\n  In jurisdictions that recognize copyright laws, the author or authors\r\n  of this software dedicate any and all copyright interest in the\r\n  software to the public domain. We make this dedication for the benefit\r\n  of the public at large and to the detriment of our heirs and\r\n  successors. We intend this dedication to be an overt act of\r\n  relinquishment in perpetuity of all present and future rights to this\r\n  software under copyright law.\r\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\r\n  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\r\n  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\n  OTHER DEALINGS IN THE SOFTWARE.\r\n  For more information, please refer to http://unlicense.org/\r\n*/\nexport default class ImageTracer {\n  static tracerDefaultOption() {\n    return {\n      pathomit: 100,\n      ltres: 0.1,\n      qtres: 1,\n      scale: 1,\n      strokewidth: 5,\n      viewbox: false,\n      linefilter: true,\n      desc: false,\n      rightangleenhance: false,\n      pal: [{\n        r: 0,\n        g: 0,\n        b: 0,\n        a: 255\n      }, {\n        r: 255,\n        g: 255,\n        b: 255,\n        a: 255\n      }]\n    };\n  }\n  /* eslint-disable */\n\n\n  constructor() {\n    this.versionnumber = '1.2.4';\n    this.optionpresets = {\n      default: {\n        corsenabled: false,\n        ltres: 1,\n        qtres: 1,\n        pathomit: 8,\n        rightangleenhance: true,\n        colorsampling: 2,\n        numberofcolors: 16,\n        mincolorratio: 0,\n        colorquantcycles: 3,\n        layering: 0,\n        strokewidth: 1,\n        linefilter: false,\n        scale: 1,\n        roundcoords: 1,\n        viewbox: false,\n        desc: false,\n        lcpr: 0,\n        qcpr: 0,\n        blurradius: 0,\n        blurdelta: 20\n      },\n      posterized1: {\n        colorsampling: 0,\n        numberofcolors: 2\n      },\n      posterized2: {\n        numberofcolors: 4,\n        blurradius: 5\n      },\n      curvy: {\n        ltres: 0.01,\n        linefilter: true,\n        rightangleenhance: false\n      },\n      sharp: {\n        qtres: 0.01,\n        linefilter: false\n      },\n      detailed: {\n        pathomit: 0,\n        roundcoords: 2,\n        ltres: 0.5,\n        qtres: 0.5,\n        numberofcolors: 64\n      },\n      smoothed: {\n        blurradius: 5,\n        blurdelta: 64\n      },\n      grayscale: {\n        colorsampling: 0,\n        colorquantcycles: 1,\n        numberofcolors: 7\n      },\n      fixedpalette: {\n        colorsampling: 0,\n        colorquantcycles: 1,\n        numberofcolors: 27\n      },\n      randomsampling1: {\n        colorsampling: 1,\n        numberofcolors: 8\n      },\n      randomsampling2: {\n        colorsampling: 1,\n        numberofcolors: 64\n      },\n      artistic1: {\n        colorsampling: 0,\n        colorquantcycles: 1,\n        pathomit: 0,\n        blurradius: 5,\n        blurdelta: 64,\n        ltres: 0.01,\n        linefilter: true,\n        numberofcolors: 16,\n        strokewidth: 2\n      },\n      artistic2: {\n        qtres: 0.01,\n        colorsampling: 0,\n        colorquantcycles: 1,\n        numberofcolors: 4,\n        strokewidth: 0\n      },\n      artistic3: {\n        qtres: 10,\n        ltres: 10,\n        numberofcolors: 8\n      },\n      artistic4: {\n        qtres: 10,\n        ltres: 10,\n        numberofcolors: 64,\n        blurradius: 5,\n        blurdelta: 256,\n        strokewidth: 2\n      },\n      posterized3: {\n        ltres: 1,\n        qtres: 1,\n        pathomit: 20,\n        rightangleenhance: true,\n        colorsampling: 0,\n        numberofcolors: 3,\n        mincolorratio: 0,\n        colorquantcycles: 3,\n        blurradius: 3,\n        blurdelta: 20,\n        strokewidth: 0,\n        linefilter: false,\n        roundcoords: 1,\n        pal: [{\n          r: 0,\n          g: 0,\n          b: 100,\n          a: 255\n        }, {\n          r: 255,\n          g: 255,\n          b: 255,\n          a: 255\n        }]\n      }\n    };\n    this.pathscan_combined_lookup = [[[-1, -1, -1, -1], [-1, -1, -1, -1], [-1, -1, -1, -1], [-1, -1, -1, -1]], [[0, 1, 0, -1], [-1, -1, -1, -1], [-1, -1, -1, -1], [0, 2, -1, 0]], [[-1, -1, -1, -1], [-1, -1, -1, -1], [0, 1, 0, -1], [0, 0, 1, 0]], [[0, 0, 1, 0], [-1, -1, -1, -1], [0, 2, -1, 0], [-1, -1, -1, -1]], [[-1, -1, -1, -1], [0, 0, 1, 0], [0, 3, 0, 1], [-1, -1, -1, -1]], [[13, 3, 0, 1], [13, 2, -1, 0], [7, 1, 0, -1], [7, 0, 1, 0]], [[-1, -1, -1, -1], [0, 1, 0, -1], [-1, -1, -1, -1], [0, 3, 0, 1]], [[0, 3, 0, 1], [0, 2, -1, 0], [-1, -1, -1, -1], [-1, -1, -1, -1]], [[0, 3, 0, 1], [0, 2, -1, 0], [-1, -1, -1, -1], [-1, -1, -1, -1]], [[-1, -1, -1, -1], [0, 1, 0, -1], [-1, -1, -1, -1], [0, 3, 0, 1]], [[11, 1, 0, -1], [14, 0, 1, 0], [14, 3, 0, 1], [11, 2, -1, 0]], [[-1, -1, -1, -1], [0, 0, 1, 0], [0, 3, 0, 1], [-1, -1, -1, -1]], [[0, 0, 1, 0], [-1, -1, -1, -1], [0, 2, -1, 0], [-1, -1, -1, -1]], [[-1, -1, -1, -1], [-1, -1, -1, -1], [0, 1, 0, -1], [0, 0, 1, 0]], [[0, 1, 0, -1], [-1, -1, -1, -1], [-1, -1, -1, -1], [0, 2, -1, 0]], [[-1, -1, -1, -1], [-1, -1, -1, -1], [-1, -1, -1, -1], [-1, -1, -1, -1]]];\n    this.gks = [[0.27901, 0.44198, 0.27901], [0.135336, 0.228569, 0.272192, 0.228569, 0.135336], [0.086776, 0.136394, 0.178908, 0.195843, 0.178908, 0.136394, 0.086776], [0.063327, 0.093095, 0.122589, 0.144599, 0.152781, 0.144599, 0.122589, 0.093095, 0.063327], [0.049692, 0.069304, 0.089767, 0.107988, 0.120651, 0.125194, 0.120651, 0.107988, 0.089767, 0.069304, 0.049692]];\n    this.specpalette = [{\n      r: 0,\n      g: 0,\n      b: 0,\n      a: 255\n    }, {\n      r: 128,\n      g: 128,\n      b: 128,\n      a: 255\n    }, {\n      r: 0,\n      g: 0,\n      b: 128,\n      a: 255\n    }, {\n      r: 64,\n      g: 64,\n      b: 128,\n      a: 255\n    }, {\n      r: 192,\n      g: 192,\n      b: 192,\n      a: 255\n    }, {\n      r: 255,\n      g: 255,\n      b: 255,\n      a: 255\n    }, {\n      r: 128,\n      g: 128,\n      b: 192,\n      a: 255\n    }, {\n      r: 0,\n      g: 0,\n      b: 192,\n      a: 255\n    }, {\n      r: 128,\n      g: 0,\n      b: 0,\n      a: 255\n    }, {\n      r: 128,\n      g: 64,\n      b: 64,\n      a: 255\n    }, {\n      r: 128,\n      g: 0,\n      b: 128,\n      a: 255\n    }, {\n      r: 168,\n      g: 168,\n      b: 168,\n      a: 255\n    }, {\n      r: 192,\n      g: 128,\n      b: 128,\n      a: 255\n    }, {\n      r: 192,\n      g: 0,\n      b: 0,\n      a: 255\n    }, {\n      r: 255,\n      g: 255,\n      b: 255,\n      a: 255\n    }, {\n      r: 0,\n      g: 128,\n      b: 0,\n      a: 255\n    }];\n  }\n\n  imageToSVG(url, callback, options) {\n    options = this.checkoptions(options);\n    this.loadImage(url, canvas => {\n      callback(this.imagedataToSVG(this.getImgdata(canvas), options));\n    }, options);\n  }\n\n  imagedataToSVG(imgd, options) {\n    options = this.checkoptions(options);\n    const td = this.imagedataToTracedata(imgd, options);\n    return this.getsvgstring(td, options);\n  }\n\n  imageToTracedata(url, callback, options) {\n    options = this.checkoptions(options);\n    this.loadImage(url, canvas => {\n      callback(this.imagedataToTracedata(this.getImgdata(canvas), options));\n    }, options);\n  }\n\n  imagedataToTracedata(imgd, options) {\n    options = this.checkoptions(options);\n    const ii = this.colorquantization(imgd, options);\n    let tracedata;\n\n    if (options.layering === 0) {\n      tracedata = {\n        layers: [],\n        palette: ii.palette,\n        width: ii.array[0].length - 2,\n        height: ii.array.length - 2\n      };\n\n      for (let colornum = 0; colornum < ii.palette.length; colornum += 1) {\n        const tracedlayer = this.batchtracepaths(this.internodes(this.pathscan(this.layeringstep(ii, colornum), options.pathomit), options), options.ltres, options.qtres);\n        tracedata.layers.push(tracedlayer);\n      }\n    } else {\n      const ls = this.layering(ii);\n\n      if (options.layercontainerid) {\n        this.drawLayers(ls, this.specpalette, options.scale, options.layercontainerid);\n      }\n\n      const bps = this.batchpathscan(ls, options.pathomit);\n      const bis = this.batchinternodes(bps, options);\n      tracedata = {\n        layers: this.batchtracelayers(bis, options.ltres, options.qtres),\n        palette: ii.palette,\n        width: imgd.width,\n        height: imgd.height\n      };\n    }\n\n    return tracedata;\n  }\n\n  checkoptions(options) {\n    options = options || {};\n\n    if (typeof options === 'string') {\n      options = options.toLowerCase();\n\n      if (this.optionpresets[options]) {\n        options = this.optionpresets[options];\n      } else {\n        options = {};\n      }\n    }\n\n    const ok = Object.keys(this.optionpresets['default']);\n\n    for (let k = 0; k < ok.length; k += 1) {\n      if (!options.hasOwnProperty(ok[k])) {\n        options[ok[k]] = this.optionpresets['default'][ok[k]];\n      }\n    }\n\n    return options;\n  }\n\n  colorquantization(imgd, options) {\n    const arr = [];\n    let idx = 0;\n    let cd;\n    let cdl;\n    let ci;\n    const paletteacc = [];\n    const pixelnum = imgd.width * imgd.height;\n    let i;\n    let j;\n    let k;\n    let cnt;\n    let palette;\n\n    for (j = 0; j < imgd.height + 2; j += 1) {\n      arr[j] = [];\n\n      for (i = 0; i < imgd.width + 2; i += 1) {\n        arr[j][i] = -1;\n      }\n    }\n\n    if (options.pal) {\n      palette = options.pal;\n    } else if (options.colorsampling === 0) {\n      palette = this.generatepalette(options.numberofcolors);\n    } else if (options.colorsampling === 1) {\n      palette = this.samplepalette(options.numberofcolors, imgd);\n    } else {\n      palette = this.samplepalette2(options.numberofcolors, imgd);\n    }\n\n    if (options.blurradius > 0) {\n      imgd = this.blur(imgd, options.blurradius, options.blurdelta);\n    }\n\n    for (cnt = 0; cnt < options.colorquantcycles; cnt += 1) {\n      if (cnt > 0) {\n        for (k = 0; k < palette.length; k += 1) {\n          if (paletteacc[k].n > 0) {\n            palette[k] = {\n              r: Math.floor(paletteacc[k].r / paletteacc[k].n),\n              g: Math.floor(paletteacc[k].g / paletteacc[k].n),\n              b: Math.floor(paletteacc[k].b / paletteacc[k].n),\n              a: Math.floor(paletteacc[k].a / paletteacc[k].n)\n            };\n          }\n\n          if (paletteacc[k].n / pixelnum < options.mincolorratio && cnt < options.colorquantcycles - 1) {\n            palette[k] = {\n              r: Math.floor(Math.random() * 255),\n              g: Math.floor(Math.random() * 255),\n              b: Math.floor(Math.random() * 255),\n              a: Math.floor(Math.random() * 255)\n            };\n          }\n        }\n      }\n\n      for (i = 0; i < palette.length; i += 1) {\n        paletteacc[i] = {\n          r: 0,\n          g: 0,\n          b: 0,\n          a: 0,\n          n: 0\n        };\n      }\n\n      for (j = 0; j < imgd.height; j += 1) {\n        for (i = 0; i < imgd.width; i += 1) {\n          idx = (j * imgd.width + i) * 4;\n          ci = 0;\n          cdl = 1024;\n\n          for (k = 0; k < palette.length; k += 1) {\n            cd = Math.abs(palette[k].r - imgd.data[idx]) + Math.abs(palette[k].g - imgd.data[idx + 1]) + Math.abs(palette[k].b - imgd.data[idx + 2]) + Math.abs(palette[k].a - imgd.data[idx + 3]);\n\n            if (cd < cdl) {\n              cdl = cd;\n              ci = k;\n            }\n          }\n\n          paletteacc[ci].r += imgd.data[idx];\n          paletteacc[ci].g += imgd.data[idx + 1];\n          paletteacc[ci].b += imgd.data[idx + 2];\n          paletteacc[ci].a += imgd.data[idx + 3];\n          paletteacc[ci].n += 1;\n          arr[j + 1][i + 1] = ci;\n        }\n      }\n    }\n\n    return {\n      array: arr,\n      palette\n    };\n  }\n\n  samplepalette(numberofcolors, imgd) {\n    let idx;\n    const palette = [];\n\n    for (let i = 0; i < numberofcolors; i += 1) {\n      idx = Math.floor(Math.random() * imgd.data.length / 4) * 4;\n      palette.push({\n        r: imgd.data[idx],\n        g: imgd.data[idx + 1],\n        b: imgd.data[idx + 2],\n        a: imgd.data[idx + 3]\n      });\n    }\n\n    return palette;\n  }\n\n  samplepalette2(numberofcolors, imgd) {\n    let idx;\n    const palette = [];\n    const ni = Math.ceil(Math.sqrt(numberofcolors));\n    const nj = Math.ceil(numberofcolors / ni);\n    const vx = imgd.width / (ni + 1);\n    const vy = imgd.height / (nj + 1);\n\n    for (let j = 0; j < nj; j += 1) {\n      for (let i = 0; i < ni; i += 1) {\n        if (palette.length === numberofcolors) {\n          break;\n        } else {\n          idx = Math.floor((j + 1) * vy * imgd.width + (i + 1) * vx) * 4;\n          palette.push({\n            r: imgd.data[idx],\n            g: imgd.data[idx + 1],\n            b: imgd.data[idx + 2],\n            a: imgd.data[idx + 3]\n          });\n        }\n      }\n    }\n\n    return palette;\n  }\n\n  generatepalette(numberofcolors) {\n    const palette = [];\n    let rcnt;\n    let gcnt;\n    let bcnt;\n\n    if (numberofcolors < 8) {\n      const graystep = Math.floor(255 / (numberofcolors - 1));\n\n      for (let i = 0; i < numberofcolors; i += 1) {\n        palette.push({\n          r: i * graystep,\n          g: i * graystep,\n          b: i * graystep,\n          a: 255\n        });\n      }\n    } else {\n      const colorqnum = Math.floor(Math.pow(numberofcolors, 1 / 3));\n      const colorstep = Math.floor(255 / (colorqnum - 1));\n      const rndnum = numberofcolors - colorqnum * colorqnum * colorqnum;\n\n      for (rcnt = 0; rcnt < colorqnum; rcnt += 1) {\n        for (gcnt = 0; gcnt < colorqnum; gcnt += 1) {\n          for (bcnt = 0; bcnt < colorqnum; bcnt += 1) {\n            palette.push({\n              r: rcnt * colorstep,\n              g: gcnt * colorstep,\n              b: bcnt * colorstep,\n              a: 255\n            });\n          }\n        }\n      }\n\n      for (rcnt = 0; rcnt < rndnum; rcnt += 1) {\n        palette.push({\n          r: Math.floor(Math.random() * 255),\n          g: Math.floor(Math.random() * 255),\n          b: Math.floor(Math.random() * 255),\n          a: Math.floor(Math.random() * 255)\n        });\n      }\n    }\n\n    return palette;\n  }\n\n  layering(ii) {\n    const layers = [];\n    let val = 0;\n    const ah = ii.array.length;\n    const aw = ii.array[0].length;\n    let n1;\n    let n2;\n    let n3;\n    let n4;\n    let n5;\n    let n6;\n    let n7;\n    let n8;\n    let i;\n    let j;\n    let k;\n\n    for (k = 0; k < ii.palette.length; k += 1) {\n      layers[k] = [];\n\n      for (j = 0; j < ah; j += 1) {\n        layers[k][j] = [];\n\n        for (i = 0; i < aw; i += 1) {\n          layers[k][j][i] = 0;\n        }\n      }\n    }\n\n    for (j = 1; j < ah - 1; j += 1) {\n      for (i = 1; i < aw - 1; i += 1) {\n        val = ii.array[j][i];\n        n1 = ii.array[j - 1][i - 1] === val ? 1 : 0;\n        n2 = ii.array[j - 1][i] === val ? 1 : 0;\n        n3 = ii.array[j - 1][i + 1] === val ? 1 : 0;\n        n4 = ii.array[j][i - 1] === val ? 1 : 0;\n        n5 = ii.array[j][i + 1] === val ? 1 : 0;\n        n6 = ii.array[j + 1][i - 1] === val ? 1 : 0;\n        n7 = ii.array[j + 1][i] === val ? 1 : 0;\n        n8 = ii.array[j + 1][i + 1] === val ? 1 : 0;\n        layers[val][j + 1][i + 1] = 1 + n5 * 2 + n8 * 4 + n7 * 8;\n\n        if (!n4) {\n          layers[val][j + 1][i] = 0 + 2 + n7 * 4 + n6 * 8;\n        }\n\n        if (!n2) {\n          layers[val][j][i + 1] = 0 + n3 * 2 + n5 * 4 + 8;\n        }\n\n        if (!n1) {\n          layers[val][j][i] = 0 + n2 * 2 + 4 + n4 * 8;\n        }\n      }\n    }\n\n    return layers;\n  }\n\n  layeringstep(ii, cnum) {\n    const layer = [];\n    const ah = ii.array.length;\n    const aw = ii.array[0].length;\n    let i;\n    let j;\n\n    for (j = 0; j < ah; j += 1) {\n      layer[j] = [];\n\n      for (i = 0; i < aw; i += 1) {\n        layer[j][i] = 0;\n      }\n    }\n\n    for (j = 1; j < ah; j += 1) {\n      for (i = 1; i < aw; i += 1) {\n        layer[j][i] = (ii.array[j - 1][i - 1] === cnum ? 1 : 0) + (ii.array[j - 1][i] === cnum ? 2 : 0) + (ii.array[j][i - 1] === cnum ? 8 : 0) + (ii.array[j][i] === cnum ? 4 : 0);\n      }\n    }\n\n    return layer;\n  }\n\n  pathscan(arr, pathomit) {\n    const paths = [];\n    let pacnt = 0;\n    let pcnt = 0;\n    let px = 0;\n    let py = 0;\n    const w = arr[0].length;\n    const h = arr.length;\n    let dir = 0;\n    let pathfinished = true;\n    let holepath = false;\n    let lookuprow;\n\n    for (let j = 0; j < h; j += 1) {\n      for (let i = 0; i < w; i += 1) {\n        if (arr[j][i] === 4 || arr[j][i] === 11) {\n          px = i;\n          py = j;\n          paths[pacnt] = {};\n          paths[pacnt].points = [];\n          paths[pacnt].boundingbox = [px, py, px, py];\n          paths[pacnt].holechildren = [];\n          pathfinished = false;\n          pcnt = 0;\n          holepath = arr[j][i] === 11;\n          dir = 1;\n\n          while (!pathfinished) {\n            paths[pacnt].points[pcnt] = {};\n            paths[pacnt].points[pcnt].x = px - 1;\n            paths[pacnt].points[pcnt].y = py - 1;\n            paths[pacnt].points[pcnt].t = arr[py][px];\n\n            if (px - 1 < paths[pacnt].boundingbox[0]) {\n              paths[pacnt].boundingbox[0] = px - 1;\n            }\n\n            if (px - 1 > paths[pacnt].boundingbox[2]) {\n              paths[pacnt].boundingbox[2] = px - 1;\n            }\n\n            if (py - 1 < paths[pacnt].boundingbox[1]) {\n              paths[pacnt].boundingbox[1] = py - 1;\n            }\n\n            if (py - 1 > paths[pacnt].boundingbox[3]) {\n              paths[pacnt].boundingbox[3] = py - 1;\n            }\n\n            lookuprow = this.pathscan_combined_lookup[arr[py][px]][dir];\n            arr[py][px] = lookuprow[0];\n            dir = lookuprow[1];\n            px += lookuprow[2];\n            py += lookuprow[3];\n\n            if (px - 1 === paths[pacnt].points[0].x && py - 1 === paths[pacnt].points[0].y) {\n              pathfinished = true;\n\n              if (paths[pacnt].points.length < pathomit) {\n                paths.pop();\n              } else {\n                paths[pacnt].isholepath = !!holepath;\n\n                if (holepath) {\n                  let parentidx = 0,\n                      parentbbox = [-1, -1, w + 1, h + 1];\n\n                  for (let parentcnt = 0; parentcnt < pacnt; parentcnt++) {\n                    if (!paths[parentcnt].isholepath && this.boundingboxincludes(paths[parentcnt].boundingbox, paths[pacnt].boundingbox) && this.boundingboxincludes(parentbbox, paths[parentcnt].boundingbox)) {\n                      parentidx = parentcnt;\n                      parentbbox = paths[parentcnt].boundingbox;\n                    }\n                  }\n\n                  paths[parentidx].holechildren.push(pacnt);\n                }\n\n                pacnt += 1;\n              }\n            }\n\n            pcnt += 1;\n          }\n        }\n      }\n    }\n\n    return paths;\n  }\n\n  boundingboxincludes(parentbbox, childbbox) {\n    return parentbbox[0] < childbbox[0] && parentbbox[1] < childbbox[1] && parentbbox[2] > childbbox[2] && parentbbox[3] > childbbox[3];\n  }\n\n  batchpathscan(layers, pathomit) {\n    const bpaths = [];\n\n    for (const k in layers) {\n      if (!layers.hasOwnProperty(k)) {\n        continue;\n      }\n\n      bpaths[k] = this.pathscan(layers[k], pathomit);\n    }\n\n    return bpaths;\n  }\n\n  internodes(paths, options) {\n    const ins = [];\n    let palen = 0;\n    let nextidx = 0;\n    let nextidx2 = 0;\n    let previdx = 0;\n    let previdx2 = 0;\n    let pacnt;\n    let pcnt;\n\n    for (pacnt = 0; pacnt < paths.length; pacnt += 1) {\n      ins[pacnt] = {};\n      ins[pacnt].points = [];\n      ins[pacnt].boundingbox = paths[pacnt].boundingbox;\n      ins[pacnt].holechildren = paths[pacnt].holechildren;\n      ins[pacnt].isholepath = paths[pacnt].isholepath;\n      palen = paths[pacnt].points.length;\n\n      for (pcnt = 0; pcnt < palen; pcnt += 1) {\n        nextidx = (pcnt + 1) % palen;\n        nextidx2 = (pcnt + 2) % palen;\n        previdx = (pcnt - 1 + palen) % palen;\n        previdx2 = (pcnt - 2 + palen) % palen;\n\n        if (options.rightangleenhance && this.testrightangle(paths[pacnt], previdx2, previdx, pcnt, nextidx, nextidx2)) {\n          if (ins[pacnt].points.length > 0) {\n            ins[pacnt].points[ins[pacnt].points.length - 1].linesegment = this.getdirection(ins[pacnt].points[ins[pacnt].points.length - 1].x, ins[pacnt].points[ins[pacnt].points.length - 1].y, paths[pacnt].points[pcnt].x, paths[pacnt].points[pcnt].y);\n          }\n\n          ins[pacnt].points.push({\n            x: paths[pacnt].points[pcnt].x,\n            y: paths[pacnt].points[pcnt].y,\n            linesegment: this.getdirection(paths[pacnt].points[pcnt].x, paths[pacnt].points[pcnt].y, (paths[pacnt].points[pcnt].x + paths[pacnt].points[nextidx].x) / 2, (paths[pacnt].points[pcnt].y + paths[pacnt].points[nextidx].y) / 2)\n          });\n        }\n\n        ins[pacnt].points.push({\n          x: (paths[pacnt].points[pcnt].x + paths[pacnt].points[nextidx].x) / 2,\n          y: (paths[pacnt].points[pcnt].y + paths[pacnt].points[nextidx].y) / 2,\n          linesegment: this.getdirection((paths[pacnt].points[pcnt].x + paths[pacnt].points[nextidx].x) / 2, (paths[pacnt].points[pcnt].y + paths[pacnt].points[nextidx].y) / 2, (paths[pacnt].points[nextidx].x + paths[pacnt].points[nextidx2].x) / 2, (paths[pacnt].points[nextidx].y + paths[pacnt].points[nextidx2].y) / 2)\n        });\n      }\n    }\n\n    return ins;\n  }\n\n  testrightangle(path, idx1, idx2, idx3, idx4, idx5) {\n    return path.points[idx3].x === path.points[idx1].x && path.points[idx3].x === path.points[idx2].x && path.points[idx3].y === path.points[idx4].y && path.points[idx3].y === path.points[idx5].y || path.points[idx3].y === path.points[idx1].y && path.points[idx3].y === path.points[idx2].y && path.points[idx3].x === path.points[idx4].x && path.points[idx3].x === path.points[idx5].x;\n  }\n\n  getdirection(x1, y1, x2, y2) {\n    let val = 8;\n\n    if (x1 < x2) {\n      if (y1 < y2) {\n        val = 1;\n      } else if (y1 > y2) {\n        val = 7;\n      } else {\n        val = 0;\n      }\n    } else if (x1 > x2) {\n      if (y1 < y2) {\n        val = 3;\n      } else if (y1 > y2) {\n        val = 5;\n      } else {\n        val = 4;\n      }\n    } else if (y1 < y2) {\n      val = 2;\n    } else if (y1 > y2) {\n      val = 6;\n    } else {\n      val = 8;\n    }\n\n    return val;\n  }\n\n  batchinternodes(bpaths, options) {\n    const binternodes = [];\n\n    for (const k in bpaths) {\n      if (!bpaths.hasOwnProperty(k)) {\n        continue;\n      }\n\n      binternodes[k] = this.internodes(bpaths[k], options);\n    }\n\n    return binternodes;\n  }\n\n  tracepath(path, ltres, qtres) {\n    let pcnt = 0;\n    let segtype1;\n    let segtype2;\n    let seqend;\n    const smp = {};\n    smp.segments = [];\n    smp.boundingbox = path.boundingbox;\n    smp.holechildren = path.holechildren;\n    smp.isholepath = path.isholepath;\n\n    while (pcnt < path.points.length) {\n      segtype1 = path.points[pcnt].linesegment;\n      segtype2 = -1;\n      seqend = pcnt + 1;\n\n      while ((path.points[seqend].linesegment === segtype1 || path.points[seqend].linesegment === segtype2 || segtype2 === -1) && seqend < path.points.length - 1) {\n        if (path.points[seqend].linesegment !== segtype1 && segtype2 === -1) {\n          segtype2 = path.points[seqend].linesegment;\n        }\n\n        seqend += 1;\n      }\n\n      if (seqend === path.points.length - 1) {\n        seqend = 0;\n      }\n\n      smp.segments = smp.segments.concat(this.fitseq(path, ltres, qtres, pcnt, seqend));\n\n      if (seqend > 0) {\n        pcnt = seqend;\n      } else {\n        pcnt = path.points.length;\n      }\n    }\n\n    return smp;\n  }\n\n  fitseq(path, ltres, qtres, seqstart, seqend) {\n    if (seqend > path.points.length || seqend < 0) {\n      return [];\n    }\n\n    let errorpoint = seqstart,\n        errorval = 0,\n        curvepass = true,\n        px,\n        py,\n        dist2;\n    let tl = seqend - seqstart;\n\n    if (tl < 0) {\n      tl += path.points.length;\n    }\n\n    let vx = (path.points[seqend].x - path.points[seqstart].x) / tl,\n        vy = (path.points[seqend].y - path.points[seqstart].y) / tl;\n    let pcnt = (seqstart + 1) % path.points.length,\n        pl;\n\n    while (pcnt != seqend) {\n      pl = pcnt - seqstart;\n\n      if (pl < 0) {\n        pl += path.points.length;\n      }\n\n      px = path.points[seqstart].x + vx * pl;\n      py = path.points[seqstart].y + vy * pl;\n      dist2 = (path.points[pcnt].x - px) * (path.points[pcnt].x - px) + (path.points[pcnt].y - py) * (path.points[pcnt].y - py);\n\n      if (dist2 > ltres) {\n        curvepass = false;\n      }\n\n      if (dist2 > errorval) {\n        errorpoint = pcnt;\n        errorval = dist2;\n      }\n\n      pcnt = (pcnt + 1) % path.points.length;\n    }\n\n    if (curvepass) {\n      return [{\n        type: 'L',\n        x1: path.points[seqstart].x,\n        y1: path.points[seqstart].y,\n        x2: path.points[seqend].x,\n        y2: path.points[seqend].y\n      }];\n    }\n\n    const fitpoint = errorpoint;\n    curvepass = true;\n    errorval = 0;\n    let t = (fitpoint - seqstart) / tl,\n        t1 = (1 - t) * (1 - t),\n        t2 = 2 * (1 - t) * t,\n        t3 = t * t;\n    let cpx = (t1 * path.points[seqstart].x + t3 * path.points[seqend].x - path.points[fitpoint].x) / -t2,\n        cpy = (t1 * path.points[seqstart].y + t3 * path.points[seqend].y - path.points[fitpoint].y) / -t2;\n    pcnt = seqstart + 1;\n\n    while (pcnt != seqend) {\n      t = (pcnt - seqstart) / tl;\n      t1 = (1 - t) * (1 - t);\n      t2 = 2 * (1 - t) * t;\n      t3 = t * t;\n      px = t1 * path.points[seqstart].x + t2 * cpx + t3 * path.points[seqend].x;\n      py = t1 * path.points[seqstart].y + t2 * cpy + t3 * path.points[seqend].y;\n      dist2 = (path.points[pcnt].x - px) * (path.points[pcnt].x - px) + (path.points[pcnt].y - py) * (path.points[pcnt].y - py);\n\n      if (dist2 > qtres) {\n        curvepass = false;\n      }\n\n      if (dist2 > errorval) {\n        errorpoint = pcnt;\n        errorval = dist2;\n      }\n\n      pcnt = (pcnt + 1) % path.points.length;\n    }\n\n    if (curvepass) {\n      return [{\n        type: 'Q',\n        x1: path.points[seqstart].x,\n        y1: path.points[seqstart].y,\n        x2: cpx,\n        y2: cpy,\n        x3: path.points[seqend].x,\n        y3: path.points[seqend].y\n      }];\n    }\n\n    const splitpoint = fitpoint;\n    return this.fitseq(path, ltres, qtres, seqstart, splitpoint).concat(this.fitseq(path, ltres, qtres, splitpoint, seqend));\n  }\n\n  batchtracepaths(internodepaths, ltres, qtres) {\n    const btracedpaths = [];\n\n    for (const k in internodepaths) {\n      if (!internodepaths.hasOwnProperty(k)) {\n        continue;\n      }\n\n      btracedpaths.push(this.tracepath(internodepaths[k], ltres, qtres));\n    }\n\n    return btracedpaths;\n  }\n\n  batchtracelayers(binternodes, ltres, qtres) {\n    const btbis = [];\n\n    for (const k in binternodes) {\n      if (!binternodes.hasOwnProperty(k)) {\n        continue;\n      }\n\n      btbis[k] = this.batchtracepaths(binternodes[k], ltres, qtres);\n    }\n\n    return btbis;\n  }\n\n  roundtodec(val, places) {\n    return Number(val.toFixed(places));\n  }\n\n  svgpathstring(tracedata, lnum, pathnum, options) {\n    let layer = tracedata.layers[lnum],\n        smp = layer[pathnum],\n        str = '',\n        pcnt;\n\n    if (options.linefilter && smp.segments.length < 3) {\n      return str;\n    }\n\n    str = `<path ${options.desc ? `desc=\"l ${lnum} p ${pathnum}\" ` : ''}${this.tosvgcolorstr(tracedata.palette[lnum], options)}d=\"`;\n\n    if (options.roundcoords === -1) {\n      str += `M ${smp.segments[0].x1 * options.scale} ${smp.segments[0].y1 * options.scale} `;\n\n      for (pcnt = 0; pcnt < smp.segments.length; pcnt++) {\n        str += `${smp.segments[pcnt].type} ${smp.segments[pcnt].x2 * options.scale} ${smp.segments[pcnt].y2 * options.scale} `;\n\n        if (smp.segments[pcnt].hasOwnProperty('x3')) {\n          str += `${smp.segments[pcnt].x3 * options.scale} ${smp.segments[pcnt].y3 * options.scale} `;\n        }\n      }\n\n      str += 'Z ';\n    } else {\n      str += `M ${this.roundtodec(smp.segments[0].x1 * options.scale, options.roundcoords)} ${this.roundtodec(smp.segments[0].y1 * options.scale, options.roundcoords)} `;\n\n      for (pcnt = 0; pcnt < smp.segments.length; pcnt++) {\n        str += `${smp.segments[pcnt].type} ${this.roundtodec(smp.segments[pcnt].x2 * options.scale, options.roundcoords)} ${this.roundtodec(smp.segments[pcnt].y2 * options.scale, options.roundcoords)} `;\n\n        if (smp.segments[pcnt].hasOwnProperty('x3')) {\n          str += `${this.roundtodec(smp.segments[pcnt].x3 * options.scale, options.roundcoords)} ${this.roundtodec(smp.segments[pcnt].y3 * options.scale, options.roundcoords)} `;\n        }\n      }\n\n      str += 'Z ';\n    }\n\n    for (var hcnt = 0; hcnt < smp.holechildren.length; hcnt++) {\n      var hsmp = layer[smp.holechildren[hcnt]];\n\n      if (options.roundcoords === -1) {\n        if (hsmp.segments[hsmp.segments.length - 1].hasOwnProperty('x3')) {\n          str += `M ${hsmp.segments[hsmp.segments.length - 1].x3 * options.scale} ${hsmp.segments[hsmp.segments.length - 1].y3 * options.scale} `;\n        } else {\n          str += `M ${hsmp.segments[hsmp.segments.length - 1].x2 * options.scale} ${hsmp.segments[hsmp.segments.length - 1].y2 * options.scale} `;\n        }\n\n        for (pcnt = hsmp.segments.length - 1; pcnt >= 0; pcnt--) {\n          str += `${hsmp.segments[pcnt].type} `;\n\n          if (hsmp.segments[pcnt].hasOwnProperty('x3')) {\n            str += `${hsmp.segments[pcnt].x2 * options.scale} ${hsmp.segments[pcnt].y2 * options.scale} `;\n          }\n\n          str += `${hsmp.segments[pcnt].x1 * options.scale} ${hsmp.segments[pcnt].y1 * options.scale} `;\n        }\n      } else {\n        if (hsmp.segments[hsmp.segments.length - 1].hasOwnProperty('x3')) {\n          str += `M ${this.roundtodec(hsmp.segments[hsmp.segments.length - 1].x3 * options.scale)} ${this.roundtodec(hsmp.segments[hsmp.segments.length - 1].y3 * options.scale)} `;\n        } else {\n          str += `M ${this.roundtodec(hsmp.segments[hsmp.segments.length - 1].x2 * options.scale)} ${this.roundtodec(hsmp.segments[hsmp.segments.length - 1].y2 * options.scale)} `;\n        }\n\n        for (pcnt = hsmp.segments.length - 1; pcnt >= 0; pcnt--) {\n          str += `${hsmp.segments[pcnt].type} `;\n\n          if (hsmp.segments[pcnt].hasOwnProperty('x3')) {\n            str += `${this.roundtodec(hsmp.segments[pcnt].x2 * options.scale)} ${this.roundtodec(hsmp.segments[pcnt].y2 * options.scale)} `;\n          }\n\n          str += `${this.roundtodec(hsmp.segments[pcnt].x1 * options.scale)} ${this.roundtodec(hsmp.segments[pcnt].y1 * options.scale)} `;\n        }\n      }\n\n      str += 'Z ';\n    }\n\n    str += '\" />';\n\n    if (options.lcpr || options.qcpr) {\n      for (pcnt = 0; pcnt < smp.segments.length; pcnt++) {\n        if (smp.segments[pcnt].hasOwnProperty('x3') && options.qcpr) {\n          str += `<circle cx=\"${smp.segments[pcnt].x2 * options.scale}\" cy=\"${smp.segments[pcnt].y2 * options.scale}\" r=\"${options.qcpr}\" fill=\"cyan\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"black\" />`;\n          str += `<circle cx=\"${smp.segments[pcnt].x3 * options.scale}\" cy=\"${smp.segments[pcnt].y3 * options.scale}\" r=\"${options.qcpr}\" fill=\"white\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"black\" />`;\n          str += `<line x1=\"${smp.segments[pcnt].x1 * options.scale}\" y1=\"${smp.segments[pcnt].y1 * options.scale}\" x2=\"${smp.segments[pcnt].x2 * options.scale}\" y2=\"${smp.segments[pcnt].y2 * options.scale}\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"cyan\" />`;\n          str += `<line x1=\"${smp.segments[pcnt].x2 * options.scale}\" y1=\"${smp.segments[pcnt].y2 * options.scale}\" x2=\"${smp.segments[pcnt].x3 * options.scale}\" y2=\"${smp.segments[pcnt].y3 * options.scale}\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"cyan\" />`;\n        }\n\n        if (!smp.segments[pcnt].hasOwnProperty('x3') && options.lcpr) {\n          str += `<circle cx=\"${smp.segments[pcnt].x2 * options.scale}\" cy=\"${smp.segments[pcnt].y2 * options.scale}\" r=\"${options.lcpr}\" fill=\"white\" stroke-width=\"${options.lcpr * 0.2}\" stroke=\"black\" />`;\n        }\n      }\n\n      for (var hcnt = 0; hcnt < smp.holechildren.length; hcnt++) {\n        var hsmp = layer[smp.holechildren[hcnt]];\n\n        for (pcnt = 0; pcnt < hsmp.segments.length; pcnt++) {\n          if (hsmp.segments[pcnt].hasOwnProperty('x3') && options.qcpr) {\n            str += `<circle cx=\"${hsmp.segments[pcnt].x2 * options.scale}\" cy=\"${hsmp.segments[pcnt].y2 * options.scale}\" r=\"${options.qcpr}\" fill=\"cyan\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"black\" />`;\n            str += `<circle cx=\"${hsmp.segments[pcnt].x3 * options.scale}\" cy=\"${hsmp.segments[pcnt].y3 * options.scale}\" r=\"${options.qcpr}\" fill=\"white\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"black\" />`;\n            str += `<line x1=\"${hsmp.segments[pcnt].x1 * options.scale}\" y1=\"${hsmp.segments[pcnt].y1 * options.scale}\" x2=\"${hsmp.segments[pcnt].x2 * options.scale}\" y2=\"${hsmp.segments[pcnt].y2 * options.scale}\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"cyan\" />`;\n            str += `<line x1=\"${hsmp.segments[pcnt].x2 * options.scale}\" y1=\"${hsmp.segments[pcnt].y2 * options.scale}\" x2=\"${hsmp.segments[pcnt].x3 * options.scale}\" y2=\"${hsmp.segments[pcnt].y3 * options.scale}\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"cyan\" />`;\n          }\n\n          if (!hsmp.segments[pcnt].hasOwnProperty('x3') && options.lcpr) {\n            str += `<circle cx=\"${hsmp.segments[pcnt].x2 * options.scale}\" cy=\"${hsmp.segments[pcnt].y2 * options.scale}\" r=\"${options.lcpr}\" fill=\"white\" stroke-width=\"${options.lcpr * 0.2}\" stroke=\"black\" />`;\n          }\n        }\n      }\n    }\n\n    return str;\n  }\n\n  getsvgstring(tracedata, options) {\n    options = this.checkoptions(options);\n    const w = tracedata.width * options.scale;\n    const h = tracedata.height * options.scale;\n    let svgstr = `<svg ${options.viewbox ? `viewBox=\"0 0 ${w} ${h}\" ` : `width=\"${w}\" height=\"${h}\" `}version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" desc=\"Created with imagetracer.js version ${this.versionnumber}\" >`;\n\n    for (let lcnt = 0; lcnt < tracedata.layers.length; lcnt += 1) {\n      for (let pcnt = 0; pcnt < tracedata.layers[lcnt].length; pcnt += 1) {\n        if (!tracedata.layers[lcnt][pcnt].isholepath) {\n          svgstr += this.svgpathstring(tracedata, lcnt, pcnt, options);\n        }\n      }\n    }\n\n    svgstr += '</svg>';\n    return svgstr;\n  }\n\n  compareNumbers(a, b) {\n    return a - b;\n  }\n\n  torgbastr(c) {\n    return `rgba(${c.r},${c.g},${c.b},${c.a})`;\n  }\n\n  tosvgcolorstr(c, options) {\n    return `fill=\"rgb(${c.r},${c.g},${c.b})\" stroke=\"rgb(${c.r},${c.g},${c.b})\" stroke-width=\"${options.strokewidth}\" opacity=\"${c.a / 255.0}\" `;\n  }\n\n  appendSVGString(svgstr, parentid) {\n    let div;\n\n    if (parentid) {\n      div = document.getElementById(parentid);\n\n      if (!div) {\n        div = document.createElement('div');\n        div.id = parentid;\n        document.body.appendChild(div);\n      }\n    } else {\n      div = document.createElement('div');\n      document.body.appendChild(div);\n    }\n\n    div.innerHTML += svgstr;\n  }\n\n  blur(imgd, radius, delta) {\n    let i, j, k, d, idx, racc, gacc, bacc, aacc, wacc;\n    const imgd2 = {\n      width: imgd.width,\n      height: imgd.height,\n      data: []\n    };\n    radius = Math.floor(radius);\n\n    if (radius < 1) {\n      return imgd;\n    }\n\n    if (radius > 5) {\n      radius = 5;\n    }\n\n    delta = Math.abs(delta);\n\n    if (delta > 1024) {\n      delta = 1024;\n    }\n\n    const thisgk = this.gks[radius - 1];\n\n    for (j = 0; j < imgd.height; j++) {\n      for (i = 0; i < imgd.width; i++) {\n        racc = 0;\n        gacc = 0;\n        bacc = 0;\n        aacc = 0;\n        wacc = 0;\n\n        for (k = -radius; k < radius + 1; k++) {\n          if (i + k > 0 && i + k < imgd.width) {\n            idx = (j * imgd.width + i + k) * 4;\n            racc += imgd.data[idx] * thisgk[k + radius];\n            gacc += imgd.data[idx + 1] * thisgk[k + radius];\n            bacc += imgd.data[idx + 2] * thisgk[k + radius];\n            aacc += imgd.data[idx + 3] * thisgk[k + radius];\n            wacc += thisgk[k + radius];\n          }\n        }\n\n        idx = (j * imgd.width + i) * 4;\n        imgd2.data[idx] = Math.floor(racc / wacc);\n        imgd2.data[idx + 1] = Math.floor(gacc / wacc);\n        imgd2.data[idx + 2] = Math.floor(bacc / wacc);\n        imgd2.data[idx + 3] = Math.floor(aacc / wacc);\n      }\n    }\n\n    const himgd = new Uint8ClampedArray(imgd2.data);\n\n    for (j = 0; j < imgd.height; j++) {\n      for (i = 0; i < imgd.width; i++) {\n        racc = 0;\n        gacc = 0;\n        bacc = 0;\n        aacc = 0;\n        wacc = 0;\n\n        for (k = -radius; k < radius + 1; k++) {\n          if (j + k > 0 && j + k < imgd.height) {\n            idx = ((j + k) * imgd.width + i) * 4;\n            racc += himgd[idx] * thisgk[k + radius];\n            gacc += himgd[idx + 1] * thisgk[k + radius];\n            bacc += himgd[idx + 2] * thisgk[k + radius];\n            aacc += himgd[idx + 3] * thisgk[k + radius];\n            wacc += thisgk[k + radius];\n          }\n        }\n\n        idx = (j * imgd.width + i) * 4;\n        imgd2.data[idx] = Math.floor(racc / wacc);\n        imgd2.data[idx + 1] = Math.floor(gacc / wacc);\n        imgd2.data[idx + 2] = Math.floor(bacc / wacc);\n        imgd2.data[idx + 3] = Math.floor(aacc / wacc);\n      }\n    }\n\n    for (j = 0; j < imgd.height; j++) {\n      for (i = 0; i < imgd.width; i++) {\n        idx = (j * imgd.width + i) * 4;\n        d = Math.abs(imgd2.data[idx] - imgd.data[idx]) + Math.abs(imgd2.data[idx + 1] - imgd.data[idx + 1]) + Math.abs(imgd2.data[idx + 2] - imgd.data[idx + 2]) + Math.abs(imgd2.data[idx + 3] - imgd.data[idx + 3]);\n\n        if (d > delta) {\n          imgd2.data[idx] = imgd.data[idx];\n          imgd2.data[idx + 1] = imgd.data[idx + 1];\n          imgd2.data[idx + 2] = imgd.data[idx + 2];\n          imgd2.data[idx + 3] = imgd.data[idx + 3];\n        }\n      }\n    }\n\n    return imgd2;\n  }\n\n  loadImage(url, callback, options) {\n    const img = new Image();\n\n    if (options && options.corsenabled) {\n      img.crossOrigin = 'Anonymous';\n    }\n\n    img.src = url;\n\n    img.onload = function () {\n      const canvas = document.createElement('canvas');\n      canvas.width = img.width;\n      canvas.height = img.height;\n      const context = canvas.getContext('2d');\n      context.drawImage(img, 0, 0);\n      callback(canvas);\n    };\n  }\n\n  getImgdata(canvas) {\n    const context = canvas.getContext('2d');\n    return context.getImageData(0, 0, canvas.width, canvas.height);\n  }\n\n  drawLayers(layers, palette, scale, parentid) {\n    scale = scale || 1;\n    let w, h, i, j, k;\n    let div;\n\n    if (parentid) {\n      div = document.getElementById(parentid);\n\n      if (!div) {\n        div = document.createElement('div');\n        div.id = parentid;\n        document.body.appendChild(div);\n      }\n    } else {\n      div = document.createElement('div');\n      document.body.appendChild(div);\n    }\n\n    for (k in layers) {\n      if (!layers.hasOwnProperty(k)) {\n        continue;\n      }\n\n      w = layers[k][0].length;\n      h = layers[k].length;\n      const canvas = document.createElement('canvas');\n      canvas.width = w * scale;\n      canvas.height = h * scale;\n      const context = canvas.getContext('2d');\n\n      for (j = 0; j < h; j += 1) {\n        for (i = 0; i < w; i += 1) {\n          context.fillStyle = this.torgbastr(palette[layers[k][j][i] % palette.length]);\n          context.fillRect(i * scale, j * scale, scale, scale);\n        }\n      }\n\n      div.appendChild(canvas);\n    }\n  }\n\n}","map":{"version":3,"sources":["C:/Users/kkwan_000/Desktop/git/2017110269/minsung/src/js/helper/imagetracer.js"],"names":["ImageTracer","tracerDefaultOption","pathomit","ltres","qtres","scale","strokewidth","viewbox","linefilter","desc","rightangleenhance","pal","r","g","b","a","constructor","versionnumber","optionpresets","default","corsenabled","colorsampling","numberofcolors","mincolorratio","colorquantcycles","layering","roundcoords","lcpr","qcpr","blurradius","blurdelta","posterized1","posterized2","curvy","sharp","detailed","smoothed","grayscale","fixedpalette","randomsampling1","randomsampling2","artistic1","artistic2","artistic3","artistic4","posterized3","pathscan_combined_lookup","gks","specpalette","imageToSVG","url","callback","options","checkoptions","loadImage","canvas","imagedataToSVG","getImgdata","imgd","td","imagedataToTracedata","getsvgstring","imageToTracedata","ii","colorquantization","tracedata","layers","palette","width","array","length","height","colornum","tracedlayer","batchtracepaths","internodes","pathscan","layeringstep","push","ls","layercontainerid","drawLayers","bps","batchpathscan","bis","batchinternodes","batchtracelayers","toLowerCase","ok","Object","keys","k","hasOwnProperty","arr","idx","cd","cdl","ci","paletteacc","pixelnum","i","j","cnt","generatepalette","samplepalette","samplepalette2","blur","n","Math","floor","random","abs","data","ni","ceil","sqrt","nj","vx","vy","rcnt","gcnt","bcnt","graystep","colorqnum","pow","colorstep","rndnum","val","ah","aw","n1","n2","n3","n4","n5","n6","n7","n8","cnum","layer","paths","pacnt","pcnt","px","py","w","h","dir","pathfinished","holepath","lookuprow","points","boundingbox","holechildren","x","y","t","pop","isholepath","parentidx","parentbbox","parentcnt","boundingboxincludes","childbbox","bpaths","ins","palen","nextidx","nextidx2","previdx","previdx2","testrightangle","linesegment","getdirection","path","idx1","idx2","idx3","idx4","idx5","x1","y1","x2","y2","binternodes","tracepath","segtype1","segtype2","seqend","smp","segments","concat","fitseq","seqstart","errorpoint","errorval","curvepass","dist2","tl","pl","type","fitpoint","t1","t2","t3","cpx","cpy","x3","y3","splitpoint","internodepaths","btracedpaths","btbis","roundtodec","places","Number","toFixed","svgpathstring","lnum","pathnum","str","tosvgcolorstr","hcnt","hsmp","svgstr","lcnt","compareNumbers","torgbastr","c","appendSVGString","parentid","div","document","getElementById","createElement","id","body","appendChild","innerHTML","radius","delta","d","racc","gacc","bacc","aacc","wacc","imgd2","thisgk","himgd","Uint8ClampedArray","img","Image","crossOrigin","src","onload","context","getContext","drawImage","getImageData","fillStyle","fillRect"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,MAAMA,WAAN,CAAkB;AAC/B,SAAOC,mBAAP,GAA6B;AAC3B,WAAO;AACLC,MAAAA,QAAQ,EAAE,GADL;AAELC,MAAAA,KAAK,EAAE,GAFF;AAGLC,MAAAA,KAAK,EAAE,CAHF;AAKLC,MAAAA,KAAK,EAAE,CALF;AAMLC,MAAAA,WAAW,EAAE,CANR;AAOLC,MAAAA,OAAO,EAAE,KAPJ;AAQLC,MAAAA,UAAU,EAAE,IARP;AASLC,MAAAA,IAAI,EAAE,KATD;AAULC,MAAAA,iBAAiB,EAAE,KAVd;AAWLC,MAAAA,GAAG,EAAE,CACH;AACEC,QAAAA,CAAC,EAAE,CADL;AAEEC,QAAAA,CAAC,EAAE,CAFL;AAGEC,QAAAA,CAAC,EAAE,CAHL;AAIEC,QAAAA,CAAC,EAAE;AAJL,OADG,EAOH;AACEH,QAAAA,CAAC,EAAE,GADL;AAEEC,QAAAA,CAAC,EAAE,GAFL;AAGEC,QAAAA,CAAC,EAAE,GAHL;AAIEC,QAAAA,CAAC,EAAE;AAJL,OAPG;AAXA,KAAP;AA0BD;AACD;;;AACAC,EAAAA,WAAW,GAAG;AACZ,SAAKC,aAAL,GAAqB,OAArB;AACA,SAAKC,aAAL,GAAqB;AACnBC,MAAAA,OAAO,EAAE;AACPC,QAAAA,WAAW,EAAE,KADN;AAEPjB,QAAAA,KAAK,EAAE,CAFA;AAGPC,QAAAA,KAAK,EAAE,CAHA;AAIPF,QAAAA,QAAQ,EAAE,CAJH;AAKPQ,QAAAA,iBAAiB,EAAE,IALZ;AAMPW,QAAAA,aAAa,EAAE,CANR;AAOPC,QAAAA,cAAc,EAAE,EAPT;AAQPC,QAAAA,aAAa,EAAE,CARR;AASPC,QAAAA,gBAAgB,EAAE,CATX;AAUPC,QAAAA,QAAQ,EAAE,CAVH;AAWPnB,QAAAA,WAAW,EAAE,CAXN;AAYPE,QAAAA,UAAU,EAAE,KAZL;AAaPH,QAAAA,KAAK,EAAE,CAbA;AAcPqB,QAAAA,WAAW,EAAE,CAdN;AAePnB,QAAAA,OAAO,EAAE,KAfF;AAgBPE,QAAAA,IAAI,EAAE,KAhBC;AAiBPkB,QAAAA,IAAI,EAAE,CAjBC;AAkBPC,QAAAA,IAAI,EAAE,CAlBC;AAmBPC,QAAAA,UAAU,EAAE,CAnBL;AAoBPC,QAAAA,SAAS,EAAE;AApBJ,OADU;AAuBnBC,MAAAA,WAAW,EAAE;AACXV,QAAAA,aAAa,EAAE,CADJ;AAEXC,QAAAA,cAAc,EAAE;AAFL,OAvBM;AA2BnBU,MAAAA,WAAW,EAAE;AACXV,QAAAA,cAAc,EAAE,CADL;AAEXO,QAAAA,UAAU,EAAE;AAFD,OA3BM;AA+BnBI,MAAAA,KAAK,EAAE;AACL9B,QAAAA,KAAK,EAAE,IADF;AAELK,QAAAA,UAAU,EAAE,IAFP;AAGLE,QAAAA,iBAAiB,EAAE;AAHd,OA/BY;AAoCnBwB,MAAAA,KAAK,EAAE;AAAE9B,QAAAA,KAAK,EAAE,IAAT;AAAeI,QAAAA,UAAU,EAAE;AAA3B,OApCY;AAqCnB2B,MAAAA,QAAQ,EAAE;AAAEjC,QAAAA,QAAQ,EAAE,CAAZ;AAAewB,QAAAA,WAAW,EAAE,CAA5B;AAA+BvB,QAAAA,KAAK,EAAE,GAAtC;AAA2CC,QAAAA,KAAK,EAAE,GAAlD;AAAuDkB,QAAAA,cAAc,EAAE;AAAvE,OArCS;AAsCnBc,MAAAA,QAAQ,EAAE;AAAEP,QAAAA,UAAU,EAAE,CAAd;AAAiBC,QAAAA,SAAS,EAAE;AAA5B,OAtCS;AAuCnBO,MAAAA,SAAS,EAAE;AAAEhB,QAAAA,aAAa,EAAE,CAAjB;AAAoBG,QAAAA,gBAAgB,EAAE,CAAtC;AAAyCF,QAAAA,cAAc,EAAE;AAAzD,OAvCQ;AAwCnBgB,MAAAA,YAAY,EAAE;AAAEjB,QAAAA,aAAa,EAAE,CAAjB;AAAoBG,QAAAA,gBAAgB,EAAE,CAAtC;AAAyCF,QAAAA,cAAc,EAAE;AAAzD,OAxCK;AAyCnBiB,MAAAA,eAAe,EAAE;AAAElB,QAAAA,aAAa,EAAE,CAAjB;AAAoBC,QAAAA,cAAc,EAAE;AAApC,OAzCE;AA0CnBkB,MAAAA,eAAe,EAAE;AAAEnB,QAAAA,aAAa,EAAE,CAAjB;AAAoBC,QAAAA,cAAc,EAAE;AAApC,OA1CE;AA2CnBmB,MAAAA,SAAS,EAAE;AACTpB,QAAAA,aAAa,EAAE,CADN;AAETG,QAAAA,gBAAgB,EAAE,CAFT;AAGTtB,QAAAA,QAAQ,EAAE,CAHD;AAIT2B,QAAAA,UAAU,EAAE,CAJH;AAKTC,QAAAA,SAAS,EAAE,EALF;AAMT3B,QAAAA,KAAK,EAAE,IANE;AAOTK,QAAAA,UAAU,EAAE,IAPH;AAQTc,QAAAA,cAAc,EAAE,EARP;AASThB,QAAAA,WAAW,EAAE;AATJ,OA3CQ;AAsDnBoC,MAAAA,SAAS,EAAE;AACTtC,QAAAA,KAAK,EAAE,IADE;AAETiB,QAAAA,aAAa,EAAE,CAFN;AAGTG,QAAAA,gBAAgB,EAAE,CAHT;AAITF,QAAAA,cAAc,EAAE,CAJP;AAKThB,QAAAA,WAAW,EAAE;AALJ,OAtDQ;AA6DnBqC,MAAAA,SAAS,EAAE;AAAEvC,QAAAA,KAAK,EAAE,EAAT;AAAaD,QAAAA,KAAK,EAAE,EAApB;AAAwBmB,QAAAA,cAAc,EAAE;AAAxC,OA7DQ;AA8DnBsB,MAAAA,SAAS,EAAE;AACTxC,QAAAA,KAAK,EAAE,EADE;AAETD,QAAAA,KAAK,EAAE,EAFE;AAGTmB,QAAAA,cAAc,EAAE,EAHP;AAITO,QAAAA,UAAU,EAAE,CAJH;AAKTC,QAAAA,SAAS,EAAE,GALF;AAMTxB,QAAAA,WAAW,EAAE;AANJ,OA9DQ;AAsEnBuC,MAAAA,WAAW,EAAE;AACX1C,QAAAA,KAAK,EAAE,CADI;AAEXC,QAAAA,KAAK,EAAE,CAFI;AAGXF,QAAAA,QAAQ,EAAE,EAHC;AAIXQ,QAAAA,iBAAiB,EAAE,IAJR;AAKXW,QAAAA,aAAa,EAAE,CALJ;AAMXC,QAAAA,cAAc,EAAE,CANL;AAOXC,QAAAA,aAAa,EAAE,CAPJ;AAQXC,QAAAA,gBAAgB,EAAE,CARP;AASXK,QAAAA,UAAU,EAAE,CATD;AAUXC,QAAAA,SAAS,EAAE,EAVA;AAWXxB,QAAAA,WAAW,EAAE,CAXF;AAYXE,QAAAA,UAAU,EAAE,KAZD;AAaXkB,QAAAA,WAAW,EAAE,CAbF;AAcXf,QAAAA,GAAG,EAAE,CACH;AAAEC,UAAAA,CAAC,EAAE,CAAL;AAAQC,UAAAA,CAAC,EAAE,CAAX;AAAcC,UAAAA,CAAC,EAAE,GAAjB;AAAsBC,UAAAA,CAAC,EAAE;AAAzB,SADG,EAEH;AAAEH,UAAAA,CAAC,EAAE,GAAL;AAAUC,UAAAA,CAAC,EAAE,GAAb;AAAkBC,UAAAA,CAAC,EAAE,GAArB;AAA0BC,UAAAA,CAAC,EAAE;AAA7B,SAFG;AAdM;AAtEM,KAArB;AA2FA,SAAK+B,wBAAL,GAAgC,CAC9B,CACE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CADF,EAEE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAFF,EAGE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAHF,EAIE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAJF,CAD8B,EAO9B,CACE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAC,CAAX,CADF,EAEE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAFF,EAGE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAHF,EAIE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAC,CAAR,EAAW,CAAX,CAJF,CAP8B,EAa9B,CACE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CADF,EAEE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAFF,EAGE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAC,CAAX,CAHF,EAIE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAJF,CAb8B,EAmB9B,CACE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADF,EAEE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAFF,EAGE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAC,CAAR,EAAW,CAAX,CAHF,EAIE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAJF,CAnB8B,EAyB9B,CACE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CADF,EAEE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAFF,EAGE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAHF,EAIE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAJF,CAzB8B,EA+B9B,CACE,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAX,CADF,EAEE,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAC,CAAT,EAAY,CAAZ,CAFF,EAGE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAC,CAAX,CAHF,EAIE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAJF,CA/B8B,EAqC9B,CACE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CADF,EAEE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAC,CAAX,CAFF,EAGE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAHF,EAIE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAJF,CArC8B,EA2C9B,CACE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADF,EAEE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAC,CAAR,EAAW,CAAX,CAFF,EAGE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAHF,EAIE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAJF,CA3C8B,EAiD9B,CACE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADF,EAEE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAC,CAAR,EAAW,CAAX,CAFF,EAGE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAHF,EAIE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAJF,CAjD8B,EAuD9B,CACE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CADF,EAEE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAC,CAAX,CAFF,EAGE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAHF,EAIE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAJF,CAvD8B,EA6D9B,CACE,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAC,CAAZ,CADF,EAEE,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAX,CAFF,EAGE,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAR,EAAW,CAAX,CAHF,EAIE,CAAC,EAAD,EAAK,CAAL,EAAQ,CAAC,CAAT,EAAY,CAAZ,CAJF,CA7D8B,EAmE9B,CACE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CADF,EAEE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAFF,EAGE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAHF,EAIE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAJF,CAnE8B,EAyE9B,CACE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CADF,EAEE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAFF,EAGE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAC,CAAR,EAAW,CAAX,CAHF,EAIE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAJF,CAzE8B,EA+E9B,CACE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CADF,EAEE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAFF,EAGE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAC,CAAX,CAHF,EAIE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAJF,CA/E8B,EAqF9B,CACE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAC,CAAX,CADF,EAEE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAFF,EAGE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAHF,EAIE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAC,CAAR,EAAW,CAAX,CAJF,CArF8B,EA2F9B,CACE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CADF,EAEE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAFF,EAGE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAHF,EAIE,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAAS,CAAC,CAAV,EAAa,CAAC,CAAd,CAJF,CA3F8B,CAAhC;AAmGA,SAAKC,GAAL,GAAW,CACT,CAAC,OAAD,EAAU,OAAV,EAAmB,OAAnB,CADS,EAET,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,EAA+B,QAA/B,EAAyC,QAAzC,CAFS,EAGT,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,EAA+B,QAA/B,EAAyC,QAAzC,EAAmD,QAAnD,EAA6D,QAA7D,CAHS,EAIT,CAAC,QAAD,EAAW,QAAX,EAAqB,QAArB,EAA+B,QAA/B,EAAyC,QAAzC,EAAmD,QAAnD,EAA6D,QAA7D,EAAuE,QAAvE,EAAiF,QAAjF,CAJS,EAKT,CACE,QADF,EAEE,QAFF,EAGE,QAHF,EAIE,QAJF,EAKE,QALF,EAME,QANF,EAOE,QAPF,EAQE,QARF,EASE,QATF,EAUE,QAVF,EAWE,QAXF,CALS,CAAX;AAoBA,SAAKC,WAAL,GAAmB,CACjB;AAAEpC,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE,CAAX;AAAcC,MAAAA,CAAC,EAAE,CAAjB;AAAoBC,MAAAA,CAAC,EAAE;AAAvB,KADiB,EAEjB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,GAAb;AAAkBC,MAAAA,CAAC,EAAE,GAArB;AAA0BC,MAAAA,CAAC,EAAE;AAA7B,KAFiB,EAGjB;AAAEH,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE,CAAX;AAAcC,MAAAA,CAAC,EAAE,GAAjB;AAAsBC,MAAAA,CAAC,EAAE;AAAzB,KAHiB,EAIjB;AAAEH,MAAAA,CAAC,EAAE,EAAL;AAASC,MAAAA,CAAC,EAAE,EAAZ;AAAgBC,MAAAA,CAAC,EAAE,GAAnB;AAAwBC,MAAAA,CAAC,EAAE;AAA3B,KAJiB,EAKjB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,GAAb;AAAkBC,MAAAA,CAAC,EAAE,GAArB;AAA0BC,MAAAA,CAAC,EAAE;AAA7B,KALiB,EAMjB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,GAAb;AAAkBC,MAAAA,CAAC,EAAE,GAArB;AAA0BC,MAAAA,CAAC,EAAE;AAA7B,KANiB,EAOjB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,GAAb;AAAkBC,MAAAA,CAAC,EAAE,GAArB;AAA0BC,MAAAA,CAAC,EAAE;AAA7B,KAPiB,EAQjB;AAAEH,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE,CAAX;AAAcC,MAAAA,CAAC,EAAE,GAAjB;AAAsBC,MAAAA,CAAC,EAAE;AAAzB,KARiB,EASjB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,CAAb;AAAgBC,MAAAA,CAAC,EAAE,CAAnB;AAAsBC,MAAAA,CAAC,EAAE;AAAzB,KATiB,EAUjB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,EAAb;AAAiBC,MAAAA,CAAC,EAAE,EAApB;AAAwBC,MAAAA,CAAC,EAAE;AAA3B,KAViB,EAWjB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,CAAb;AAAgBC,MAAAA,CAAC,EAAE,GAAnB;AAAwBC,MAAAA,CAAC,EAAE;AAA3B,KAXiB,EAYjB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,GAAb;AAAkBC,MAAAA,CAAC,EAAE,GAArB;AAA0BC,MAAAA,CAAC,EAAE;AAA7B,KAZiB,EAajB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,GAAb;AAAkBC,MAAAA,CAAC,EAAE,GAArB;AAA0BC,MAAAA,CAAC,EAAE;AAA7B,KAbiB,EAcjB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,CAAb;AAAgBC,MAAAA,CAAC,EAAE,CAAnB;AAAsBC,MAAAA,CAAC,EAAE;AAAzB,KAdiB,EAejB;AAAEH,MAAAA,CAAC,EAAE,GAAL;AAAUC,MAAAA,CAAC,EAAE,GAAb;AAAkBC,MAAAA,CAAC,EAAE,GAArB;AAA0BC,MAAAA,CAAC,EAAE;AAA7B,KAfiB,EAgBjB;AAAEH,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE,GAAX;AAAgBC,MAAAA,CAAC,EAAE,CAAnB;AAAsBC,MAAAA,CAAC,EAAE;AAAzB,KAhBiB,CAAnB;AAkBD;;AAEDkC,EAAAA,UAAU,CAACC,GAAD,EAAMC,QAAN,EAAgBC,OAAhB,EAAyB;AACjCA,IAAAA,OAAO,GAAG,KAAKC,YAAL,CAAkBD,OAAlB,CAAV;AACA,SAAKE,SAAL,CACEJ,GADF,EAEGK,MAAD,IAAY;AACVJ,MAAAA,QAAQ,CAAC,KAAKK,cAAL,CAAoB,KAAKC,UAAL,CAAgBF,MAAhB,CAApB,EAA6CH,OAA7C,CAAD,CAAR;AACD,KAJH,EAKEA,OALF;AAOD;;AAEDI,EAAAA,cAAc,CAACE,IAAD,EAAON,OAAP,EAAgB;AAC5BA,IAAAA,OAAO,GAAG,KAAKC,YAAL,CAAkBD,OAAlB,CAAV;AACA,UAAMO,EAAE,GAAG,KAAKC,oBAAL,CAA0BF,IAA1B,EAAgCN,OAAhC,CAAX;AAEA,WAAO,KAAKS,YAAL,CAAkBF,EAAlB,EAAsBP,OAAtB,CAAP;AACD;;AAEDU,EAAAA,gBAAgB,CAACZ,GAAD,EAAMC,QAAN,EAAgBC,OAAhB,EAAyB;AACvCA,IAAAA,OAAO,GAAG,KAAKC,YAAL,CAAkBD,OAAlB,CAAV;AACA,SAAKE,SAAL,CACEJ,GADF,EAEGK,MAAD,IAAY;AACVJ,MAAAA,QAAQ,CAAC,KAAKS,oBAAL,CAA0B,KAAKH,UAAL,CAAgBF,MAAhB,CAA1B,EAAmDH,OAAnD,CAAD,CAAR;AACD,KAJH,EAKEA,OALF;AAOD;;AAEDQ,EAAAA,oBAAoB,CAACF,IAAD,EAAON,OAAP,EAAgB;AAClCA,IAAAA,OAAO,GAAG,KAAKC,YAAL,CAAkBD,OAAlB,CAAV;AACA,UAAMW,EAAE,GAAG,KAAKC,iBAAL,CAAuBN,IAAvB,EAA6BN,OAA7B,CAAX;AACA,QAAIa,SAAJ;;AACA,QAAIb,OAAO,CAAC3B,QAAR,KAAqB,CAAzB,EAA4B;AAC1BwC,MAAAA,SAAS,GAAG;AACVC,QAAAA,MAAM,EAAE,EADE;AAEVC,QAAAA,OAAO,EAAEJ,EAAE,CAACI,OAFF;AAGVC,QAAAA,KAAK,EAAEL,EAAE,CAACM,KAAH,CAAS,CAAT,EAAYC,MAAZ,GAAqB,CAHlB;AAIVC,QAAAA,MAAM,EAAER,EAAE,CAACM,KAAH,CAASC,MAAT,GAAkB;AAJhB,OAAZ;;AAOA,WAAK,IAAIE,QAAQ,GAAG,CAApB,EAAuBA,QAAQ,GAAGT,EAAE,CAACI,OAAH,CAAWG,MAA7C,EAAqDE,QAAQ,IAAI,CAAjE,EAAoE;AAClE,cAAMC,WAAW,GAAG,KAAKC,eAAL,CAClB,KAAKC,UAAL,CACE,KAAKC,QAAL,CAAc,KAAKC,YAAL,CAAkBd,EAAlB,EAAsBS,QAAtB,CAAd,EAA+CpB,OAAO,CAAClD,QAAvD,CADF,EAEEkD,OAFF,CADkB,EAKlBA,OAAO,CAACjD,KALU,EAMlBiD,OAAO,CAAChD,KANU,CAApB;AAQA6D,QAAAA,SAAS,CAACC,MAAV,CAAiBY,IAAjB,CAAsBL,WAAtB;AACD;AACF,KAnBD,MAmBO;AACL,YAAMM,EAAE,GAAG,KAAKtD,QAAL,CAAcsC,EAAd,CAAX;;AACA,UAAIX,OAAO,CAAC4B,gBAAZ,EAA8B;AAC5B,aAAKC,UAAL,CAAgBF,EAAhB,EAAoB,KAAK/B,WAAzB,EAAsCI,OAAO,CAAC/C,KAA9C,EAAqD+C,OAAO,CAAC4B,gBAA7D;AACD;;AACD,YAAME,GAAG,GAAG,KAAKC,aAAL,CAAmBJ,EAAnB,EAAuB3B,OAAO,CAAClD,QAA/B,CAAZ;AACA,YAAMkF,GAAG,GAAG,KAAKC,eAAL,CAAqBH,GAArB,EAA0B9B,OAA1B,CAAZ;AACAa,MAAAA,SAAS,GAAG;AACVC,QAAAA,MAAM,EAAE,KAAKoB,gBAAL,CAAsBF,GAAtB,EAA2BhC,OAAO,CAACjD,KAAnC,EAA0CiD,OAAO,CAAChD,KAAlD,CADE;AAEV+D,QAAAA,OAAO,EAAEJ,EAAE,CAACI,OAFF;AAGVC,QAAAA,KAAK,EAAEV,IAAI,CAACU,KAHF;AAIVG,QAAAA,MAAM,EAAEb,IAAI,CAACa;AAJH,OAAZ;AAMD;;AAED,WAAON,SAAP;AACD;;AAEDZ,EAAAA,YAAY,CAACD,OAAD,EAAU;AACpBA,IAAAA,OAAO,GAAGA,OAAO,IAAI,EAArB;;AACA,QAAI,OAAOA,OAAP,KAAmB,QAAvB,EAAiC;AAC/BA,MAAAA,OAAO,GAAGA,OAAO,CAACmC,WAAR,EAAV;;AACA,UAAI,KAAKrE,aAAL,CAAmBkC,OAAnB,CAAJ,EAAiC;AAC/BA,QAAAA,OAAO,GAAG,KAAKlC,aAAL,CAAmBkC,OAAnB,CAAV;AACD,OAFD,MAEO;AACLA,QAAAA,OAAO,GAAG,EAAV;AACD;AACF;;AACD,UAAMoC,EAAE,GAAGC,MAAM,CAACC,IAAP,CAAY,KAAKxE,aAAL,CAAmB,SAAnB,CAAZ,CAAX;;AACA,SAAK,IAAIyE,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGH,EAAE,CAAClB,MAAvB,EAA+BqB,CAAC,IAAI,CAApC,EAAuC;AACrC,UAAI,CAACvC,OAAO,CAACwC,cAAR,CAAuBJ,EAAE,CAACG,CAAD,CAAzB,CAAL,EAAoC;AAClCvC,QAAAA,OAAO,CAACoC,EAAE,CAACG,CAAD,CAAH,CAAP,GAAiB,KAAKzE,aAAL,CAAmB,SAAnB,EAA8BsE,EAAE,CAACG,CAAD,CAAhC,CAAjB;AACD;AACF;;AAED,WAAOvC,OAAP;AACD;;AAEDY,EAAAA,iBAAiB,CAACN,IAAD,EAAON,OAAP,EAAgB;AAC/B,UAAMyC,GAAG,GAAG,EAAZ;AACA,QAAIC,GAAG,GAAG,CAAV;AACA,QAAIC,EAAJ;AACA,QAAIC,GAAJ;AACA,QAAIC,EAAJ;AACA,UAAMC,UAAU,GAAG,EAAnB;AACA,UAAMC,QAAQ,GAAGzC,IAAI,CAACU,KAAL,GAAaV,IAAI,CAACa,MAAnC;AACA,QAAI6B,CAAJ;AACA,QAAIC,CAAJ;AACA,QAAIV,CAAJ;AACA,QAAIW,GAAJ;AACA,QAAInC,OAAJ;;AAEA,SAAKkC,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG3C,IAAI,CAACa,MAAL,GAAc,CAA9B,EAAiC8B,CAAC,IAAI,CAAtC,EAAyC;AACvCR,MAAAA,GAAG,CAACQ,CAAD,CAAH,GAAS,EAAT;;AACA,WAAKD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG1C,IAAI,CAACU,KAAL,GAAa,CAA7B,EAAgCgC,CAAC,IAAI,CAArC,EAAwC;AACtCP,QAAAA,GAAG,CAACQ,CAAD,CAAH,CAAOD,CAAP,IAAY,CAAC,CAAb;AACD;AACF;;AACD,QAAIhD,OAAO,CAACzC,GAAZ,EAAiB;AACfwD,MAAAA,OAAO,GAAGf,OAAO,CAACzC,GAAlB;AACD,KAFD,MAEO,IAAIyC,OAAO,CAAC/B,aAAR,KAA0B,CAA9B,EAAiC;AACtC8C,MAAAA,OAAO,GAAG,KAAKoC,eAAL,CAAqBnD,OAAO,CAAC9B,cAA7B,CAAV;AACD,KAFM,MAEA,IAAI8B,OAAO,CAAC/B,aAAR,KAA0B,CAA9B,EAAiC;AACtC8C,MAAAA,OAAO,GAAG,KAAKqC,aAAL,CAAmBpD,OAAO,CAAC9B,cAA3B,EAA2CoC,IAA3C,CAAV;AACD,KAFM,MAEA;AACLS,MAAAA,OAAO,GAAG,KAAKsC,cAAL,CAAoBrD,OAAO,CAAC9B,cAA5B,EAA4CoC,IAA5C,CAAV;AACD;;AACD,QAAIN,OAAO,CAACvB,UAAR,GAAqB,CAAzB,EAA4B;AAC1B6B,MAAAA,IAAI,GAAG,KAAKgD,IAAL,CAAUhD,IAAV,EAAgBN,OAAO,CAACvB,UAAxB,EAAoCuB,OAAO,CAACtB,SAA5C,CAAP;AACD;;AACD,SAAKwE,GAAG,GAAG,CAAX,EAAcA,GAAG,GAAGlD,OAAO,CAAC5B,gBAA5B,EAA8C8E,GAAG,IAAI,CAArD,EAAwD;AACtD,UAAIA,GAAG,GAAG,CAAV,EAAa;AACX,aAAKX,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGxB,OAAO,CAACG,MAAxB,EAAgCqB,CAAC,IAAI,CAArC,EAAwC;AACtC,cAAIO,UAAU,CAACP,CAAD,CAAV,CAAcgB,CAAd,GAAkB,CAAtB,EAAyB;AACvBxC,YAAAA,OAAO,CAACwB,CAAD,CAAP,GAAa;AACX/E,cAAAA,CAAC,EAAEgG,IAAI,CAACC,KAAL,CAAWX,UAAU,CAACP,CAAD,CAAV,CAAc/E,CAAd,GAAkBsF,UAAU,CAACP,CAAD,CAAV,CAAcgB,CAA3C,CADQ;AAEX9F,cAAAA,CAAC,EAAE+F,IAAI,CAACC,KAAL,CAAWX,UAAU,CAACP,CAAD,CAAV,CAAc9E,CAAd,GAAkBqF,UAAU,CAACP,CAAD,CAAV,CAAcgB,CAA3C,CAFQ;AAGX7F,cAAAA,CAAC,EAAE8F,IAAI,CAACC,KAAL,CAAWX,UAAU,CAACP,CAAD,CAAV,CAAc7E,CAAd,GAAkBoF,UAAU,CAACP,CAAD,CAAV,CAAcgB,CAA3C,CAHQ;AAIX5F,cAAAA,CAAC,EAAE6F,IAAI,CAACC,KAAL,CAAWX,UAAU,CAACP,CAAD,CAAV,CAAc5E,CAAd,GAAkBmF,UAAU,CAACP,CAAD,CAAV,CAAcgB,CAA3C;AAJQ,aAAb;AAMD;;AAED,cACET,UAAU,CAACP,CAAD,CAAV,CAAcgB,CAAd,GAAkBR,QAAlB,GAA6B/C,OAAO,CAAC7B,aAArC,IACA+E,GAAG,GAAGlD,OAAO,CAAC5B,gBAAR,GAA2B,CAFnC,EAGE;AACA2C,YAAAA,OAAO,CAACwB,CAAD,CAAP,GAAa;AACX/E,cAAAA,CAAC,EAAEgG,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,KAAgB,GAA3B,CADQ;AAEXjG,cAAAA,CAAC,EAAE+F,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,KAAgB,GAA3B,CAFQ;AAGXhG,cAAAA,CAAC,EAAE8F,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,KAAgB,GAA3B,CAHQ;AAIX/F,cAAAA,CAAC,EAAE6F,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,KAAgB,GAA3B;AAJQ,aAAb;AAMD;AACF;AACF;;AAED,WAAKV,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGjC,OAAO,CAACG,MAAxB,EAAgC8B,CAAC,IAAI,CAArC,EAAwC;AACtCF,QAAAA,UAAU,CAACE,CAAD,CAAV,GAAgB;AAAExF,UAAAA,CAAC,EAAE,CAAL;AAAQC,UAAAA,CAAC,EAAE,CAAX;AAAcC,UAAAA,CAAC,EAAE,CAAjB;AAAoBC,UAAAA,CAAC,EAAE,CAAvB;AAA0B4F,UAAAA,CAAC,EAAE;AAA7B,SAAhB;AACD;;AAED,WAAKN,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG3C,IAAI,CAACa,MAArB,EAA6B8B,CAAC,IAAI,CAAlC,EAAqC;AACnC,aAAKD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG1C,IAAI,CAACU,KAArB,EAA4BgC,CAAC,IAAI,CAAjC,EAAoC;AAClCN,UAAAA,GAAG,GAAG,CAACO,CAAC,GAAG3C,IAAI,CAACU,KAAT,GAAiBgC,CAAlB,IAAuB,CAA7B;AAEAH,UAAAA,EAAE,GAAG,CAAL;AACAD,UAAAA,GAAG,GAAG,IAAN;;AACA,eAAKL,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGxB,OAAO,CAACG,MAAxB,EAAgCqB,CAAC,IAAI,CAArC,EAAwC;AACtCI,YAAAA,EAAE,GACAa,IAAI,CAACG,GAAL,CAAS5C,OAAO,CAACwB,CAAD,CAAP,CAAW/E,CAAX,GAAe8C,IAAI,CAACsD,IAAL,CAAUlB,GAAV,CAAxB,IACAc,IAAI,CAACG,GAAL,CAAS5C,OAAO,CAACwB,CAAD,CAAP,CAAW9E,CAAX,GAAe6C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAAxB,CADA,GAEAc,IAAI,CAACG,GAAL,CAAS5C,OAAO,CAACwB,CAAD,CAAP,CAAW7E,CAAX,GAAe4C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAAxB,CAFA,GAGAc,IAAI,CAACG,GAAL,CAAS5C,OAAO,CAACwB,CAAD,CAAP,CAAW5E,CAAX,GAAe2C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAAxB,CAJF;;AAMA,gBAAIC,EAAE,GAAGC,GAAT,EAAc;AACZA,cAAAA,GAAG,GAAGD,EAAN;AACAE,cAAAA,EAAE,GAAGN,CAAL;AACD;AACF;;AAEDO,UAAAA,UAAU,CAACD,EAAD,CAAV,CAAerF,CAAf,IAAoB8C,IAAI,CAACsD,IAAL,CAAUlB,GAAV,CAApB;AACAI,UAAAA,UAAU,CAACD,EAAD,CAAV,CAAepF,CAAf,IAAoB6C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAApB;AACAI,UAAAA,UAAU,CAACD,EAAD,CAAV,CAAenF,CAAf,IAAoB4C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAApB;AACAI,UAAAA,UAAU,CAACD,EAAD,CAAV,CAAelF,CAAf,IAAoB2C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAApB;AACAI,UAAAA,UAAU,CAACD,EAAD,CAAV,CAAeU,CAAf,IAAoB,CAApB;AAEAd,UAAAA,GAAG,CAACQ,CAAC,GAAG,CAAL,CAAH,CAAWD,CAAC,GAAG,CAAf,IAAoBH,EAApB;AACD;AACF;AACF;;AAED,WAAO;AAAE5B,MAAAA,KAAK,EAAEwB,GAAT;AAAc1B,MAAAA;AAAd,KAAP;AACD;;AAEDqC,EAAAA,aAAa,CAAClF,cAAD,EAAiBoC,IAAjB,EAAuB;AAClC,QAAIoC,GAAJ;AACA,UAAM3B,OAAO,GAAG,EAAhB;;AACA,SAAK,IAAIiC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG9E,cAApB,EAAoC8E,CAAC,IAAI,CAAzC,EAA4C;AAC1CN,MAAAA,GAAG,GAAGc,IAAI,CAACC,KAAL,CAAYD,IAAI,CAACE,MAAL,KAAgBpD,IAAI,CAACsD,IAAL,CAAU1C,MAA3B,GAAqC,CAAhD,IAAqD,CAA3D;AACAH,MAAAA,OAAO,CAACW,IAAR,CAAa;AACXlE,QAAAA,CAAC,EAAE8C,IAAI,CAACsD,IAAL,CAAUlB,GAAV,CADQ;AAEXjF,QAAAA,CAAC,EAAE6C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAFQ;AAGXhF,QAAAA,CAAC,EAAE4C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAHQ;AAIX/E,QAAAA,CAAC,EAAE2C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB;AAJQ,OAAb;AAMD;;AAED,WAAO3B,OAAP;AACD;;AAEDsC,EAAAA,cAAc,CAACnF,cAAD,EAAiBoC,IAAjB,EAAuB;AACnC,QAAIoC,GAAJ;AACA,UAAM3B,OAAO,GAAG,EAAhB;AACA,UAAM8C,EAAE,GAAGL,IAAI,CAACM,IAAL,CAAUN,IAAI,CAACO,IAAL,CAAU7F,cAAV,CAAV,CAAX;AACA,UAAM8F,EAAE,GAAGR,IAAI,CAACM,IAAL,CAAU5F,cAAc,GAAG2F,EAA3B,CAAX;AACA,UAAMI,EAAE,GAAG3D,IAAI,CAACU,KAAL,IAAc6C,EAAE,GAAG,CAAnB,CAAX;AACA,UAAMK,EAAE,GAAG5D,IAAI,CAACa,MAAL,IAAe6C,EAAE,GAAG,CAApB,CAAX;;AACA,SAAK,IAAIf,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGe,EAApB,EAAwBf,CAAC,IAAI,CAA7B,EAAgC;AAC9B,WAAK,IAAID,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGa,EAApB,EAAwBb,CAAC,IAAI,CAA7B,EAAgC;AAC9B,YAAIjC,OAAO,CAACG,MAAR,KAAmBhD,cAAvB,EAAuC;AACrC;AACD,SAFD,MAEO;AACLwE,UAAAA,GAAG,GAAGc,IAAI,CAACC,KAAL,CAAW,CAACR,CAAC,GAAG,CAAL,IAAUiB,EAAV,GAAe5D,IAAI,CAACU,KAApB,GAA4B,CAACgC,CAAC,GAAG,CAAL,IAAUiB,EAAjD,IAAuD,CAA7D;AACAlD,UAAAA,OAAO,CAACW,IAAR,CAAa;AACXlE,YAAAA,CAAC,EAAE8C,IAAI,CAACsD,IAAL,CAAUlB,GAAV,CADQ;AAEXjF,YAAAA,CAAC,EAAE6C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAFQ;AAGXhF,YAAAA,CAAC,EAAE4C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAHQ;AAIX/E,YAAAA,CAAC,EAAE2C,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB;AAJQ,WAAb;AAMD;AACF;AACF;;AAED,WAAO3B,OAAP;AACD;;AAEDoC,EAAAA,eAAe,CAACjF,cAAD,EAAiB;AAC9B,UAAM6C,OAAO,GAAG,EAAhB;AACA,QAAIoD,IAAJ;AACA,QAAIC,IAAJ;AACA,QAAIC,IAAJ;;AACA,QAAInG,cAAc,GAAG,CAArB,EAAwB;AACtB,YAAMoG,QAAQ,GAAGd,IAAI,CAACC,KAAL,CAAW,OAAOvF,cAAc,GAAG,CAAxB,CAAX,CAAjB;;AACA,WAAK,IAAI8E,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG9E,cAApB,EAAoC8E,CAAC,IAAI,CAAzC,EAA4C;AAC1CjC,QAAAA,OAAO,CAACW,IAAR,CAAa;AAAElE,UAAAA,CAAC,EAAEwF,CAAC,GAAGsB,QAAT;AAAmB7G,UAAAA,CAAC,EAAEuF,CAAC,GAAGsB,QAA1B;AAAoC5G,UAAAA,CAAC,EAAEsF,CAAC,GAAGsB,QAA3C;AAAqD3G,UAAAA,CAAC,EAAE;AAAxD,SAAb;AACD;AACF,KALD,MAKO;AACL,YAAM4G,SAAS,GAAGf,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACgB,GAAL,CAAStG,cAAT,EAAyB,IAAI,CAA7B,CAAX,CAAlB;AACA,YAAMuG,SAAS,GAAGjB,IAAI,CAACC,KAAL,CAAW,OAAOc,SAAS,GAAG,CAAnB,CAAX,CAAlB;AACA,YAAMG,MAAM,GAAGxG,cAAc,GAAGqG,SAAS,GAAGA,SAAZ,GAAwBA,SAAxD;;AACA,WAAKJ,IAAI,GAAG,CAAZ,EAAeA,IAAI,GAAGI,SAAtB,EAAiCJ,IAAI,IAAI,CAAzC,EAA4C;AAC1C,aAAKC,IAAI,GAAG,CAAZ,EAAeA,IAAI,GAAGG,SAAtB,EAAiCH,IAAI,IAAI,CAAzC,EAA4C;AAC1C,eAAKC,IAAI,GAAG,CAAZ,EAAeA,IAAI,GAAGE,SAAtB,EAAiCF,IAAI,IAAI,CAAzC,EAA4C;AAC1CtD,YAAAA,OAAO,CAACW,IAAR,CAAa;AAAElE,cAAAA,CAAC,EAAE2G,IAAI,GAAGM,SAAZ;AAAuBhH,cAAAA,CAAC,EAAE2G,IAAI,GAAGK,SAAjC;AAA4C/G,cAAAA,CAAC,EAAE2G,IAAI,GAAGI,SAAtD;AAAiE9G,cAAAA,CAAC,EAAE;AAApE,aAAb;AACD;AACF;AACF;;AACD,WAAKwG,IAAI,GAAG,CAAZ,EAAeA,IAAI,GAAGO,MAAtB,EAA8BP,IAAI,IAAI,CAAtC,EAAyC;AACvCpD,QAAAA,OAAO,CAACW,IAAR,CAAa;AACXlE,UAAAA,CAAC,EAAEgG,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,KAAgB,GAA3B,CADQ;AAEXjG,UAAAA,CAAC,EAAE+F,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,KAAgB,GAA3B,CAFQ;AAGXhG,UAAAA,CAAC,EAAE8F,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,KAAgB,GAA3B,CAHQ;AAIX/F,UAAAA,CAAC,EAAE6F,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,KAAgB,GAA3B;AAJQ,SAAb;AAMD;AACF;;AAED,WAAO3C,OAAP;AACD;;AAED1C,EAAAA,QAAQ,CAACsC,EAAD,EAAK;AACX,UAAMG,MAAM,GAAG,EAAf;AACA,QAAI6D,GAAG,GAAG,CAAV;AACA,UAAMC,EAAE,GAAGjE,EAAE,CAACM,KAAH,CAASC,MAApB;AACA,UAAM2D,EAAE,GAAGlE,EAAE,CAACM,KAAH,CAAS,CAAT,EAAYC,MAAvB;AACA,QAAI4D,EAAJ;AACA,QAAIC,EAAJ;AACA,QAAIC,EAAJ;AACA,QAAIC,EAAJ;AACA,QAAIC,EAAJ;AACA,QAAIC,EAAJ;AACA,QAAIC,EAAJ;AACA,QAAIC,EAAJ;AACA,QAAIrC,CAAJ;AACA,QAAIC,CAAJ;AACA,QAAIV,CAAJ;;AACA,SAAKA,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG5B,EAAE,CAACI,OAAH,CAAWG,MAA3B,EAAmCqB,CAAC,IAAI,CAAxC,EAA2C;AACzCzB,MAAAA,MAAM,CAACyB,CAAD,CAAN,GAAY,EAAZ;;AACA,WAAKU,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG2B,EAAhB,EAAoB3B,CAAC,IAAI,CAAzB,EAA4B;AAC1BnC,QAAAA,MAAM,CAACyB,CAAD,CAAN,CAAUU,CAAV,IAAe,EAAf;;AACA,aAAKD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG6B,EAAhB,EAAoB7B,CAAC,IAAI,CAAzB,EAA4B;AAC1BlC,UAAAA,MAAM,CAACyB,CAAD,CAAN,CAAUU,CAAV,EAAaD,CAAb,IAAkB,CAAlB;AACD;AACF;AACF;;AACD,SAAKC,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG2B,EAAE,GAAG,CAArB,EAAwB3B,CAAC,IAAI,CAA7B,EAAgC;AAC9B,WAAKD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG6B,EAAE,GAAG,CAArB,EAAwB7B,CAAC,IAAI,CAA7B,EAAgC;AAC9B2B,QAAAA,GAAG,GAAGhE,EAAE,CAACM,KAAH,CAASgC,CAAT,EAAYD,CAAZ,CAAN;AAEA8B,QAAAA,EAAE,GAAGnE,EAAE,CAACM,KAAH,CAASgC,CAAC,GAAG,CAAb,EAAgBD,CAAC,GAAG,CAApB,MAA2B2B,GAA3B,GAAiC,CAAjC,GAAqC,CAA1C;AACAI,QAAAA,EAAE,GAAGpE,EAAE,CAACM,KAAH,CAASgC,CAAC,GAAG,CAAb,EAAgBD,CAAhB,MAAuB2B,GAAvB,GAA6B,CAA7B,GAAiC,CAAtC;AACAK,QAAAA,EAAE,GAAGrE,EAAE,CAACM,KAAH,CAASgC,CAAC,GAAG,CAAb,EAAgBD,CAAC,GAAG,CAApB,MAA2B2B,GAA3B,GAAiC,CAAjC,GAAqC,CAA1C;AACAM,QAAAA,EAAE,GAAGtE,EAAE,CAACM,KAAH,CAASgC,CAAT,EAAYD,CAAC,GAAG,CAAhB,MAAuB2B,GAAvB,GAA6B,CAA7B,GAAiC,CAAtC;AACAO,QAAAA,EAAE,GAAGvE,EAAE,CAACM,KAAH,CAASgC,CAAT,EAAYD,CAAC,GAAG,CAAhB,MAAuB2B,GAAvB,GAA6B,CAA7B,GAAiC,CAAtC;AACAQ,QAAAA,EAAE,GAAGxE,EAAE,CAACM,KAAH,CAASgC,CAAC,GAAG,CAAb,EAAgBD,CAAC,GAAG,CAApB,MAA2B2B,GAA3B,GAAiC,CAAjC,GAAqC,CAA1C;AACAS,QAAAA,EAAE,GAAGzE,EAAE,CAACM,KAAH,CAASgC,CAAC,GAAG,CAAb,EAAgBD,CAAhB,MAAuB2B,GAAvB,GAA6B,CAA7B,GAAiC,CAAtC;AACAU,QAAAA,EAAE,GAAG1E,EAAE,CAACM,KAAH,CAASgC,CAAC,GAAG,CAAb,EAAgBD,CAAC,GAAG,CAApB,MAA2B2B,GAA3B,GAAiC,CAAjC,GAAqC,CAA1C;AAEA7D,QAAAA,MAAM,CAAC6D,GAAD,CAAN,CAAY1B,CAAC,GAAG,CAAhB,EAAmBD,CAAC,GAAG,CAAvB,IAA4B,IAAIkC,EAAE,GAAG,CAAT,GAAaG,EAAE,GAAG,CAAlB,GAAsBD,EAAE,GAAG,CAAvD;;AACA,YAAI,CAACH,EAAL,EAAS;AACPnE,UAAAA,MAAM,CAAC6D,GAAD,CAAN,CAAY1B,CAAC,GAAG,CAAhB,EAAmBD,CAAnB,IAAwB,IAAI,CAAJ,GAAQoC,EAAE,GAAG,CAAb,GAAiBD,EAAE,GAAG,CAA9C;AACD;;AACD,YAAI,CAACJ,EAAL,EAAS;AACPjE,UAAAA,MAAM,CAAC6D,GAAD,CAAN,CAAY1B,CAAZ,EAAeD,CAAC,GAAG,CAAnB,IAAwB,IAAIgC,EAAE,GAAG,CAAT,GAAaE,EAAE,GAAG,CAAlB,GAAsB,CAA9C;AACD;;AACD,YAAI,CAACJ,EAAL,EAAS;AACPhE,UAAAA,MAAM,CAAC6D,GAAD,CAAN,CAAY1B,CAAZ,EAAeD,CAAf,IAAoB,IAAI+B,EAAE,GAAG,CAAT,GAAa,CAAb,GAAiBE,EAAE,GAAG,CAA1C;AACD;AACF;AACF;;AAED,WAAOnE,MAAP;AACD;;AAEDW,EAAAA,YAAY,CAACd,EAAD,EAAK2E,IAAL,EAAW;AACrB,UAAMC,KAAK,GAAG,EAAd;AACA,UAAMX,EAAE,GAAGjE,EAAE,CAACM,KAAH,CAASC,MAApB;AACA,UAAM2D,EAAE,GAAGlE,EAAE,CAACM,KAAH,CAAS,CAAT,EAAYC,MAAvB;AACA,QAAI8B,CAAJ;AACA,QAAIC,CAAJ;;AACA,SAAKA,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG2B,EAAhB,EAAoB3B,CAAC,IAAI,CAAzB,EAA4B;AAC1BsC,MAAAA,KAAK,CAACtC,CAAD,CAAL,GAAW,EAAX;;AACA,WAAKD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG6B,EAAhB,EAAoB7B,CAAC,IAAI,CAAzB,EAA4B;AAC1BuC,QAAAA,KAAK,CAACtC,CAAD,CAAL,CAASD,CAAT,IAAc,CAAd;AACD;AACF;;AACD,SAAKC,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG2B,EAAhB,EAAoB3B,CAAC,IAAI,CAAzB,EAA4B;AAC1B,WAAKD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG6B,EAAhB,EAAoB7B,CAAC,IAAI,CAAzB,EAA4B;AAC1BuC,QAAAA,KAAK,CAACtC,CAAD,CAAL,CAASD,CAAT,IACE,CAACrC,EAAE,CAACM,KAAH,CAASgC,CAAC,GAAG,CAAb,EAAgBD,CAAC,GAAG,CAApB,MAA2BsC,IAA3B,GAAkC,CAAlC,GAAsC,CAAvC,KACC3E,EAAE,CAACM,KAAH,CAASgC,CAAC,GAAG,CAAb,EAAgBD,CAAhB,MAAuBsC,IAAvB,GAA8B,CAA9B,GAAkC,CADnC,KAEC3E,EAAE,CAACM,KAAH,CAASgC,CAAT,EAAYD,CAAC,GAAG,CAAhB,MAAuBsC,IAAvB,GAA8B,CAA9B,GAAkC,CAFnC,KAGC3E,EAAE,CAACM,KAAH,CAASgC,CAAT,EAAYD,CAAZ,MAAmBsC,IAAnB,GAA0B,CAA1B,GAA8B,CAH/B,CADF;AAKD;AACF;;AAED,WAAOC,KAAP;AACD;;AAED/D,EAAAA,QAAQ,CAACiB,GAAD,EAAM3F,QAAN,EAAgB;AACtB,UAAM0I,KAAK,GAAG,EAAd;AACA,QAAIC,KAAK,GAAG,CAAZ;AACA,QAAIC,IAAI,GAAG,CAAX;AACA,QAAIC,EAAE,GAAG,CAAT;AACA,QAAIC,EAAE,GAAG,CAAT;AACA,UAAMC,CAAC,GAAGpD,GAAG,CAAC,CAAD,CAAH,CAAOvB,MAAjB;AACA,UAAM4E,CAAC,GAAGrD,GAAG,CAACvB,MAAd;AACA,QAAI6E,GAAG,GAAG,CAAV;AACA,QAAIC,YAAY,GAAG,IAAnB;AACA,QAAIC,QAAQ,GAAG,KAAf;AACA,QAAIC,SAAJ;;AACA,SAAK,IAAIjD,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG6C,CAApB,EAAuB7C,CAAC,IAAI,CAA5B,EAA+B;AAC7B,WAAK,IAAID,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG6C,CAApB,EAAuB7C,CAAC,IAAI,CAA5B,EAA+B;AAC7B,YAAIP,GAAG,CAACQ,CAAD,CAAH,CAAOD,CAAP,MAAc,CAAd,IAAmBP,GAAG,CAACQ,CAAD,CAAH,CAAOD,CAAP,MAAc,EAArC,EAAyC;AACvC2C,UAAAA,EAAE,GAAG3C,CAAL;AACA4C,UAAAA,EAAE,GAAG3C,CAAL;AACAuC,UAAAA,KAAK,CAACC,KAAD,CAAL,GAAe,EAAf;AACAD,UAAAA,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,GAAsB,EAAtB;AACAX,UAAAA,KAAK,CAACC,KAAD,CAAL,CAAaW,WAAb,GAA2B,CAACT,EAAD,EAAKC,EAAL,EAASD,EAAT,EAAaC,EAAb,CAA3B;AACAJ,UAAAA,KAAK,CAACC,KAAD,CAAL,CAAaY,YAAb,GAA4B,EAA5B;AACAL,UAAAA,YAAY,GAAG,KAAf;AACAN,UAAAA,IAAI,GAAG,CAAP;AACAO,UAAAA,QAAQ,GAAGxD,GAAG,CAACQ,CAAD,CAAH,CAAOD,CAAP,MAAc,EAAzB;AACA+C,UAAAA,GAAG,GAAG,CAAN;;AAEA,iBAAO,CAACC,YAAR,EAAsB;AACpBR,YAAAA,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,IAA4B,EAA5B;AACAF,YAAAA,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0BY,CAA1B,GAA8BX,EAAE,GAAG,CAAnC;AACAH,YAAAA,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0Ba,CAA1B,GAA8BX,EAAE,GAAG,CAAnC;AACAJ,YAAAA,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0Bc,CAA1B,GAA8B/D,GAAG,CAACmD,EAAD,CAAH,CAAQD,EAAR,CAA9B;;AAEA,gBAAIA,EAAE,GAAG,CAAL,GAASH,KAAK,CAACC,KAAD,CAAL,CAAaW,WAAb,CAAyB,CAAzB,CAAb,EAA0C;AACxCZ,cAAAA,KAAK,CAACC,KAAD,CAAL,CAAaW,WAAb,CAAyB,CAAzB,IAA8BT,EAAE,GAAG,CAAnC;AACD;;AACD,gBAAIA,EAAE,GAAG,CAAL,GAASH,KAAK,CAACC,KAAD,CAAL,CAAaW,WAAb,CAAyB,CAAzB,CAAb,EAA0C;AACxCZ,cAAAA,KAAK,CAACC,KAAD,CAAL,CAAaW,WAAb,CAAyB,CAAzB,IAA8BT,EAAE,GAAG,CAAnC;AACD;;AACD,gBAAIC,EAAE,GAAG,CAAL,GAASJ,KAAK,CAACC,KAAD,CAAL,CAAaW,WAAb,CAAyB,CAAzB,CAAb,EAA0C;AACxCZ,cAAAA,KAAK,CAACC,KAAD,CAAL,CAAaW,WAAb,CAAyB,CAAzB,IAA8BR,EAAE,GAAG,CAAnC;AACD;;AACD,gBAAIA,EAAE,GAAG,CAAL,GAASJ,KAAK,CAACC,KAAD,CAAL,CAAaW,WAAb,CAAyB,CAAzB,CAAb,EAA0C;AACxCZ,cAAAA,KAAK,CAACC,KAAD,CAAL,CAAaW,WAAb,CAAyB,CAAzB,IAA8BR,EAAE,GAAG,CAAnC;AACD;;AAEDM,YAAAA,SAAS,GAAG,KAAKxG,wBAAL,CAA8B+C,GAAG,CAACmD,EAAD,CAAH,CAAQD,EAAR,CAA9B,EAA2CI,GAA3C,CAAZ;AACAtD,YAAAA,GAAG,CAACmD,EAAD,CAAH,CAAQD,EAAR,IAAcO,SAAS,CAAC,CAAD,CAAvB;AACAH,YAAAA,GAAG,GAAGG,SAAS,CAAC,CAAD,CAAf;AACAP,YAAAA,EAAE,IAAIO,SAAS,CAAC,CAAD,CAAf;AACAN,YAAAA,EAAE,IAAIM,SAAS,CAAC,CAAD,CAAf;;AAEA,gBAAIP,EAAE,GAAG,CAAL,KAAWH,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoB,CAApB,EAAuBG,CAAlC,IAAuCV,EAAE,GAAG,CAAL,KAAWJ,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoB,CAApB,EAAuBI,CAA7E,EAAgF;AAC9EP,cAAAA,YAAY,GAAG,IAAf;;AAEA,kBAAIR,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBjF,MAApB,GAA6BpE,QAAjC,EAA2C;AACzC0I,gBAAAA,KAAK,CAACiB,GAAN;AACD,eAFD,MAEO;AACLjB,gBAAAA,KAAK,CAACC,KAAD,CAAL,CAAaiB,UAAb,GAA0B,CAAC,CAACT,QAA5B;;AAEA,oBAAIA,QAAJ,EAAc;AACZ,sBAAIU,SAAS,GAAG,CAAhB;AAAA,sBACEC,UAAU,GAAG,CAAC,CAAC,CAAF,EAAK,CAAC,CAAN,EAASf,CAAC,GAAG,CAAb,EAAgBC,CAAC,GAAG,CAApB,CADf;;AAEA,uBAAK,IAAIe,SAAS,GAAG,CAArB,EAAwBA,SAAS,GAAGpB,KAApC,EAA2CoB,SAAS,EAApD,EAAwD;AACtD,wBACE,CAACrB,KAAK,CAACqB,SAAD,CAAL,CAAiBH,UAAlB,IACA,KAAKI,mBAAL,CACEtB,KAAK,CAACqB,SAAD,CAAL,CAAiBT,WADnB,EAEEZ,KAAK,CAACC,KAAD,CAAL,CAAaW,WAFf,CADA,IAKA,KAAKU,mBAAL,CAAyBF,UAAzB,EAAqCpB,KAAK,CAACqB,SAAD,CAAL,CAAiBT,WAAtD,CANF,EAOE;AACAO,sBAAAA,SAAS,GAAGE,SAAZ;AACAD,sBAAAA,UAAU,GAAGpB,KAAK,CAACqB,SAAD,CAAL,CAAiBT,WAA9B;AACD;AACF;;AACDZ,kBAAAA,KAAK,CAACmB,SAAD,CAAL,CAAiBN,YAAjB,CAA8B3E,IAA9B,CAAmC+D,KAAnC;AACD;;AACDA,gBAAAA,KAAK,IAAI,CAAT;AACD;AACF;;AACDC,YAAAA,IAAI,IAAI,CAAR;AACD;AACF;AACF;AACF;;AAED,WAAOF,KAAP;AACD;;AAEDsB,EAAAA,mBAAmB,CAACF,UAAD,EAAaG,SAAb,EAAwB;AACzC,WACEH,UAAU,CAAC,CAAD,CAAV,GAAgBG,SAAS,CAAC,CAAD,CAAzB,IACAH,UAAU,CAAC,CAAD,CAAV,GAAgBG,SAAS,CAAC,CAAD,CADzB,IAEAH,UAAU,CAAC,CAAD,CAAV,GAAgBG,SAAS,CAAC,CAAD,CAFzB,IAGAH,UAAU,CAAC,CAAD,CAAV,GAAgBG,SAAS,CAAC,CAAD,CAJ3B;AAMD;;AAEDhF,EAAAA,aAAa,CAACjB,MAAD,EAAShE,QAAT,EAAmB;AAC9B,UAAMkK,MAAM,GAAG,EAAf;;AACA,SAAK,MAAMzE,CAAX,IAAgBzB,MAAhB,EAAwB;AACtB,UAAI,CAACA,MAAM,CAAC0B,cAAP,CAAsBD,CAAtB,CAAL,EAA+B;AAC7B;AACD;;AACDyE,MAAAA,MAAM,CAACzE,CAAD,CAAN,GAAY,KAAKf,QAAL,CAAcV,MAAM,CAACyB,CAAD,CAApB,EAAyBzF,QAAzB,CAAZ;AACD;;AAED,WAAOkK,MAAP;AACD;;AAEDzF,EAAAA,UAAU,CAACiE,KAAD,EAAQxF,OAAR,EAAiB;AACzB,UAAMiH,GAAG,GAAG,EAAZ;AACA,QAAIC,KAAK,GAAG,CAAZ;AACA,QAAIC,OAAO,GAAG,CAAd;AACA,QAAIC,QAAQ,GAAG,CAAf;AACA,QAAIC,OAAO,GAAG,CAAd;AACA,QAAIC,QAAQ,GAAG,CAAf;AACA,QAAI7B,KAAJ;AACA,QAAIC,IAAJ;;AACA,SAAKD,KAAK,GAAG,CAAb,EAAgBA,KAAK,GAAGD,KAAK,CAACtE,MAA9B,EAAsCuE,KAAK,IAAI,CAA/C,EAAkD;AAChDwB,MAAAA,GAAG,CAACxB,KAAD,CAAH,GAAa,EAAb;AACAwB,MAAAA,GAAG,CAACxB,KAAD,CAAH,CAAWU,MAAX,GAAoB,EAApB;AACAc,MAAAA,GAAG,CAACxB,KAAD,CAAH,CAAWW,WAAX,GAAyBZ,KAAK,CAACC,KAAD,CAAL,CAAaW,WAAtC;AACAa,MAAAA,GAAG,CAACxB,KAAD,CAAH,CAAWY,YAAX,GAA0Bb,KAAK,CAACC,KAAD,CAAL,CAAaY,YAAvC;AACAY,MAAAA,GAAG,CAACxB,KAAD,CAAH,CAAWiB,UAAX,GAAwBlB,KAAK,CAACC,KAAD,CAAL,CAAaiB,UAArC;AACAQ,MAAAA,KAAK,GAAG1B,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBjF,MAA5B;;AAEA,WAAKwE,IAAI,GAAG,CAAZ,EAAeA,IAAI,GAAGwB,KAAtB,EAA6BxB,IAAI,IAAI,CAArC,EAAwC;AACtCyB,QAAAA,OAAO,GAAG,CAACzB,IAAI,GAAG,CAAR,IAAawB,KAAvB;AACAE,QAAAA,QAAQ,GAAG,CAAC1B,IAAI,GAAG,CAAR,IAAawB,KAAxB;AACAG,QAAAA,OAAO,GAAG,CAAC3B,IAAI,GAAG,CAAP,GAAWwB,KAAZ,IAAqBA,KAA/B;AACAI,QAAAA,QAAQ,GAAG,CAAC5B,IAAI,GAAG,CAAP,GAAWwB,KAAZ,IAAqBA,KAAhC;;AAEA,YACElH,OAAO,CAAC1C,iBAAR,IACA,KAAKiK,cAAL,CAAoB/B,KAAK,CAACC,KAAD,CAAzB,EAAkC6B,QAAlC,EAA4CD,OAA5C,EAAqD3B,IAArD,EAA2DyB,OAA3D,EAAoEC,QAApE,CAFF,EAGE;AACA,cAAIH,GAAG,CAACxB,KAAD,CAAH,CAAWU,MAAX,CAAkBjF,MAAlB,GAA2B,CAA/B,EAAkC;AAChC+F,YAAAA,GAAG,CAACxB,KAAD,CAAH,CAAWU,MAAX,CAAkBc,GAAG,CAACxB,KAAD,CAAH,CAAWU,MAAX,CAAkBjF,MAAlB,GAA2B,CAA7C,EAAgDsG,WAAhD,GAA8D,KAAKC,YAAL,CAC5DR,GAAG,CAACxB,KAAD,CAAH,CAAWU,MAAX,CAAkBc,GAAG,CAACxB,KAAD,CAAH,CAAWU,MAAX,CAAkBjF,MAAlB,GAA2B,CAA7C,EAAgDoF,CADY,EAE5DW,GAAG,CAACxB,KAAD,CAAH,CAAWU,MAAX,CAAkBc,GAAG,CAACxB,KAAD,CAAH,CAAWU,MAAX,CAAkBjF,MAAlB,GAA2B,CAA7C,EAAgDqF,CAFY,EAG5Df,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0BY,CAHkC,EAI5Dd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0Ba,CAJkC,CAA9D;AAMD;;AAEDU,UAAAA,GAAG,CAACxB,KAAD,CAAH,CAAWU,MAAX,CAAkBzE,IAAlB,CAAuB;AACrB4E,YAAAA,CAAC,EAAEd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0BY,CADR;AAErBC,YAAAA,CAAC,EAAEf,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0Ba,CAFR;AAGrBiB,YAAAA,WAAW,EAAE,KAAKC,YAAL,CACXjC,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0BY,CADf,EAEXd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0Ba,CAFf,EAGX,CAACf,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0BY,CAA1B,GAA8Bd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBgB,OAApB,EAA6Bb,CAA5D,IAAiE,CAHtD,EAIX,CAACd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0Ba,CAA1B,GAA8Bf,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBgB,OAApB,EAA6BZ,CAA5D,IAAiE,CAJtD;AAHQ,WAAvB;AAUD;;AAEDU,QAAAA,GAAG,CAACxB,KAAD,CAAH,CAAWU,MAAX,CAAkBzE,IAAlB,CAAuB;AACrB4E,UAAAA,CAAC,EAAE,CAACd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0BY,CAA1B,GAA8Bd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBgB,OAApB,EAA6Bb,CAA5D,IAAiE,CAD/C;AAErBC,UAAAA,CAAC,EAAE,CAACf,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0Ba,CAA1B,GAA8Bf,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBgB,OAApB,EAA6BZ,CAA5D,IAAiE,CAF/C;AAGrBiB,UAAAA,WAAW,EAAE,KAAKC,YAAL,CACX,CAACjC,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0BY,CAA1B,GAA8Bd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBgB,OAApB,EAA6Bb,CAA5D,IAAiE,CADtD,EAEX,CAACd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBT,IAApB,EAA0Ba,CAA1B,GAA8Bf,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBgB,OAApB,EAA6BZ,CAA5D,IAAiE,CAFtD,EAGX,CAACf,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBgB,OAApB,EAA6Bb,CAA7B,GAAiCd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBiB,QAApB,EAA8Bd,CAAhE,IAAqE,CAH1D,EAIX,CAACd,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBgB,OAApB,EAA6BZ,CAA7B,GAAiCf,KAAK,CAACC,KAAD,CAAL,CAAaU,MAAb,CAAoBiB,QAApB,EAA8Bb,CAAhE,IAAqE,CAJ1D;AAHQ,SAAvB;AAUD;AACF;;AAED,WAAOU,GAAP;AACD;;AAEDM,EAAAA,cAAc,CAACG,IAAD,EAAOC,IAAP,EAAaC,IAAb,EAAmBC,IAAnB,EAAyBC,IAAzB,EAA+BC,IAA/B,EAAqC;AACjD,WACGL,IAAI,CAACvB,MAAL,CAAY0B,IAAZ,EAAkBvB,CAAlB,KAAwBoB,IAAI,CAACvB,MAAL,CAAYwB,IAAZ,EAAkBrB,CAA1C,IACCoB,IAAI,CAACvB,MAAL,CAAY0B,IAAZ,EAAkBvB,CAAlB,KAAwBoB,IAAI,CAACvB,MAAL,CAAYyB,IAAZ,EAAkBtB,CAD3C,IAECoB,IAAI,CAACvB,MAAL,CAAY0B,IAAZ,EAAkBtB,CAAlB,KAAwBmB,IAAI,CAACvB,MAAL,CAAY2B,IAAZ,EAAkBvB,CAF3C,IAGCmB,IAAI,CAACvB,MAAL,CAAY0B,IAAZ,EAAkBtB,CAAlB,KAAwBmB,IAAI,CAACvB,MAAL,CAAY4B,IAAZ,EAAkBxB,CAH5C,IAICmB,IAAI,CAACvB,MAAL,CAAY0B,IAAZ,EAAkBtB,CAAlB,KAAwBmB,IAAI,CAACvB,MAAL,CAAYwB,IAAZ,EAAkBpB,CAA1C,IACCmB,IAAI,CAACvB,MAAL,CAAY0B,IAAZ,EAAkBtB,CAAlB,KAAwBmB,IAAI,CAACvB,MAAL,CAAYyB,IAAZ,EAAkBrB,CAD3C,IAECmB,IAAI,CAACvB,MAAL,CAAY0B,IAAZ,EAAkBvB,CAAlB,KAAwBoB,IAAI,CAACvB,MAAL,CAAY2B,IAAZ,EAAkBxB,CAF3C,IAGCoB,IAAI,CAACvB,MAAL,CAAY0B,IAAZ,EAAkBvB,CAAlB,KAAwBoB,IAAI,CAACvB,MAAL,CAAY4B,IAAZ,EAAkBzB,CAR9C;AAUD;;AAEDmB,EAAAA,YAAY,CAACO,EAAD,EAAKC,EAAL,EAASC,EAAT,EAAaC,EAAb,EAAiB;AAC3B,QAAIxD,GAAG,GAAG,CAAV;;AACA,QAAIqD,EAAE,GAAGE,EAAT,EAAa;AACX,UAAID,EAAE,GAAGE,EAAT,EAAa;AACXxD,QAAAA,GAAG,GAAG,CAAN;AACD,OAFD,MAEO,IAAIsD,EAAE,GAAGE,EAAT,EAAa;AAClBxD,QAAAA,GAAG,GAAG,CAAN;AACD,OAFM,MAEA;AACLA,QAAAA,GAAG,GAAG,CAAN;AACD;AACF,KARD,MAQO,IAAIqD,EAAE,GAAGE,EAAT,EAAa;AAClB,UAAID,EAAE,GAAGE,EAAT,EAAa;AACXxD,QAAAA,GAAG,GAAG,CAAN;AACD,OAFD,MAEO,IAAIsD,EAAE,GAAGE,EAAT,EAAa;AAClBxD,QAAAA,GAAG,GAAG,CAAN;AACD,OAFM,MAEA;AACLA,QAAAA,GAAG,GAAG,CAAN;AACD;AACF,KARM,MAQA,IAAIsD,EAAE,GAAGE,EAAT,EAAa;AAClBxD,MAAAA,GAAG,GAAG,CAAN;AACD,KAFM,MAEA,IAAIsD,EAAE,GAAGE,EAAT,EAAa;AAClBxD,MAAAA,GAAG,GAAG,CAAN;AACD,KAFM,MAEA;AACLA,MAAAA,GAAG,GAAG,CAAN;AACD;;AAED,WAAOA,GAAP;AACD;;AAED1C,EAAAA,eAAe,CAAC+E,MAAD,EAAShH,OAAT,EAAkB;AAC/B,UAAMoI,WAAW,GAAG,EAApB;;AACA,SAAK,MAAM7F,CAAX,IAAgByE,MAAhB,EAAwB;AACtB,UAAI,CAACA,MAAM,CAACxE,cAAP,CAAsBD,CAAtB,CAAL,EAA+B;AAC7B;AACD;;AACD6F,MAAAA,WAAW,CAAC7F,CAAD,CAAX,GAAiB,KAAKhB,UAAL,CAAgByF,MAAM,CAACzE,CAAD,CAAtB,EAA2BvC,OAA3B,CAAjB;AACD;;AAED,WAAOoI,WAAP;AACD;;AAEDC,EAAAA,SAAS,CAACX,IAAD,EAAO3K,KAAP,EAAcC,KAAd,EAAqB;AAC5B,QAAI0I,IAAI,GAAG,CAAX;AACA,QAAI4C,QAAJ;AACA,QAAIC,QAAJ;AACA,QAAIC,MAAJ;AACA,UAAMC,GAAG,GAAG,EAAZ;AACAA,IAAAA,GAAG,CAACC,QAAJ,GAAe,EAAf;AACAD,IAAAA,GAAG,CAACrC,WAAJ,GAAkBsB,IAAI,CAACtB,WAAvB;AACAqC,IAAAA,GAAG,CAACpC,YAAJ,GAAmBqB,IAAI,CAACrB,YAAxB;AACAoC,IAAAA,GAAG,CAAC/B,UAAJ,GAAiBgB,IAAI,CAAChB,UAAtB;;AAEA,WAAOhB,IAAI,GAAGgC,IAAI,CAACvB,MAAL,CAAYjF,MAA1B,EAAkC;AAChCoH,MAAAA,QAAQ,GAAGZ,IAAI,CAACvB,MAAL,CAAYT,IAAZ,EAAkB8B,WAA7B;AACAe,MAAAA,QAAQ,GAAG,CAAC,CAAZ;AACAC,MAAAA,MAAM,GAAG9C,IAAI,GAAG,CAAhB;;AACA,aACE,CAACgC,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBhB,WAApB,KAAoCc,QAApC,IACCZ,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBhB,WAApB,KAAoCe,QADrC,IAECA,QAAQ,KAAK,CAAC,CAFhB,KAGAC,MAAM,GAAGd,IAAI,CAACvB,MAAL,CAAYjF,MAAZ,GAAqB,CAJhC,EAKE;AACA,YAAIwG,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBhB,WAApB,KAAoCc,QAApC,IAAgDC,QAAQ,KAAK,CAAC,CAAlE,EAAqE;AACnEA,UAAAA,QAAQ,GAAGb,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBhB,WAA/B;AACD;;AACDgB,QAAAA,MAAM,IAAI,CAAV;AACD;;AACD,UAAIA,MAAM,KAAKd,IAAI,CAACvB,MAAL,CAAYjF,MAAZ,GAAqB,CAApC,EAAuC;AACrCsH,QAAAA,MAAM,GAAG,CAAT;AACD;;AAEDC,MAAAA,GAAG,CAACC,QAAJ,GAAeD,GAAG,CAACC,QAAJ,CAAaC,MAAb,CAAoB,KAAKC,MAAL,CAAYlB,IAAZ,EAAkB3K,KAAlB,EAAyBC,KAAzB,EAAgC0I,IAAhC,EAAsC8C,MAAtC,CAApB,CAAf;;AAEA,UAAIA,MAAM,GAAG,CAAb,EAAgB;AACd9C,QAAAA,IAAI,GAAG8C,MAAP;AACD,OAFD,MAEO;AACL9C,QAAAA,IAAI,GAAGgC,IAAI,CAACvB,MAAL,CAAYjF,MAAnB;AACD;AACF;;AAED,WAAOuH,GAAP;AACD;;AAEDG,EAAAA,MAAM,CAAClB,IAAD,EAAO3K,KAAP,EAAcC,KAAd,EAAqB6L,QAArB,EAA+BL,MAA/B,EAAuC;AAC3C,QAAIA,MAAM,GAAGd,IAAI,CAACvB,MAAL,CAAYjF,MAArB,IAA+BsH,MAAM,GAAG,CAA5C,EAA+C;AAC7C,aAAO,EAAP;AACD;;AACD,QAAIM,UAAU,GAAGD,QAAjB;AAAA,QACEE,QAAQ,GAAG,CADb;AAAA,QAEEC,SAAS,GAAG,IAFd;AAAA,QAGErD,EAHF;AAAA,QAIEC,EAJF;AAAA,QAKEqD,KALF;AAMA,QAAIC,EAAE,GAAGV,MAAM,GAAGK,QAAlB;;AACA,QAAIK,EAAE,GAAG,CAAT,EAAY;AACVA,MAAAA,EAAE,IAAIxB,IAAI,CAACvB,MAAL,CAAYjF,MAAlB;AACD;;AACD,QAAI+C,EAAE,GAAG,CAACyD,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBlC,CAApB,GAAwBoB,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBvC,CAA/C,IAAoD4C,EAA7D;AAAA,QACEhF,EAAE,GAAG,CAACwD,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBjC,CAApB,GAAwBmB,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBtC,CAA/C,IAAoD2C,EAD3D;AAEA,QAAIxD,IAAI,GAAG,CAACmD,QAAQ,GAAG,CAAZ,IAAiBnB,IAAI,CAACvB,MAAL,CAAYjF,MAAxC;AAAA,QACEiI,EADF;;AAEA,WAAOzD,IAAI,IAAI8C,MAAf,EAAuB;AACrBW,MAAAA,EAAE,GAAGzD,IAAI,GAAGmD,QAAZ;;AACA,UAAIM,EAAE,GAAG,CAAT,EAAY;AACVA,QAAAA,EAAE,IAAIzB,IAAI,CAACvB,MAAL,CAAYjF,MAAlB;AACD;;AACDyE,MAAAA,EAAE,GAAG+B,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBvC,CAAtB,GAA0BrC,EAAE,GAAGkF,EAApC;AACAvD,MAAAA,EAAE,GAAG8B,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBtC,CAAtB,GAA0BrC,EAAE,GAAGiF,EAApC;AACAF,MAAAA,KAAK,GACH,CAACvB,IAAI,CAACvB,MAAL,CAAYT,IAAZ,EAAkBY,CAAlB,GAAsBX,EAAvB,KAA8B+B,IAAI,CAACvB,MAAL,CAAYT,IAAZ,EAAkBY,CAAlB,GAAsBX,EAApD,IACA,CAAC+B,IAAI,CAACvB,MAAL,CAAYT,IAAZ,EAAkBa,CAAlB,GAAsBX,EAAvB,KAA8B8B,IAAI,CAACvB,MAAL,CAAYT,IAAZ,EAAkBa,CAAlB,GAAsBX,EAApD,CAFF;;AAGA,UAAIqD,KAAK,GAAGlM,KAAZ,EAAmB;AACjBiM,QAAAA,SAAS,GAAG,KAAZ;AACD;;AACD,UAAIC,KAAK,GAAGF,QAAZ,EAAsB;AACpBD,QAAAA,UAAU,GAAGpD,IAAb;AACAqD,QAAAA,QAAQ,GAAGE,KAAX;AACD;;AACDvD,MAAAA,IAAI,GAAG,CAACA,IAAI,GAAG,CAAR,IAAagC,IAAI,CAACvB,MAAL,CAAYjF,MAAhC;AACD;;AACD,QAAI8H,SAAJ,EAAe;AACb,aAAO,CACL;AACEI,QAAAA,IAAI,EAAE,GADR;AAEEpB,QAAAA,EAAE,EAAEN,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBvC,CAF5B;AAGE2B,QAAAA,EAAE,EAAEP,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBtC,CAH5B;AAIE2B,QAAAA,EAAE,EAAER,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBlC,CAJ1B;AAKE6B,QAAAA,EAAE,EAAET,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBjC;AAL1B,OADK,CAAP;AASD;;AACD,UAAM8C,QAAQ,GAAGP,UAAjB;AACAE,IAAAA,SAAS,GAAG,IAAZ;AACAD,IAAAA,QAAQ,GAAG,CAAX;AACA,QAAIvC,CAAC,GAAG,CAAC6C,QAAQ,GAAGR,QAAZ,IAAwBK,EAAhC;AAAA,QACEI,EAAE,GAAG,CAAC,IAAI9C,CAAL,KAAW,IAAIA,CAAf,CADP;AAAA,QAEE+C,EAAE,GAAG,KAAK,IAAI/C,CAAT,IAAcA,CAFrB;AAAA,QAGEgD,EAAE,GAAGhD,CAAC,GAAGA,CAHX;AAIA,QAAIiD,GAAG,GACH,CAACH,EAAE,GAAG5B,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBvC,CAA3B,GAA+BkD,EAAE,GAAG9B,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBlC,CAAxD,GAA4DoB,IAAI,CAACvB,MAAL,CAAYkD,QAAZ,EAAsB/C,CAAnF,IAAwF,CAACiD,EAD7F;AAAA,QAEEG,GAAG,GACD,CAACJ,EAAE,GAAG5B,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBtC,CAA3B,GAA+BiD,EAAE,GAAG9B,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBjC,CAAxD,GAA4DmB,IAAI,CAACvB,MAAL,CAAYkD,QAAZ,EAAsB9C,CAAnF,IAAwF,CAACgD,EAH7F;AAIA7D,IAAAA,IAAI,GAAGmD,QAAQ,GAAG,CAAlB;;AACA,WAAOnD,IAAI,IAAI8C,MAAf,EAAuB;AACrBhC,MAAAA,CAAC,GAAG,CAACd,IAAI,GAAGmD,QAAR,IAAoBK,EAAxB;AACAI,MAAAA,EAAE,GAAG,CAAC,IAAI9C,CAAL,KAAW,IAAIA,CAAf,CAAL;AACA+C,MAAAA,EAAE,GAAG,KAAK,IAAI/C,CAAT,IAAcA,CAAnB;AACAgD,MAAAA,EAAE,GAAGhD,CAAC,GAAGA,CAAT;AACAb,MAAAA,EAAE,GAAG2D,EAAE,GAAG5B,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBvC,CAA3B,GAA+BiD,EAAE,GAAGE,GAApC,GAA0CD,EAAE,GAAG9B,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBlC,CAAxE;AACAV,MAAAA,EAAE,GAAG0D,EAAE,GAAG5B,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBtC,CAA3B,GAA+BgD,EAAE,GAAGG,GAApC,GAA0CF,EAAE,GAAG9B,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBjC,CAAxE;AACA0C,MAAAA,KAAK,GACH,CAACvB,IAAI,CAACvB,MAAL,CAAYT,IAAZ,EAAkBY,CAAlB,GAAsBX,EAAvB,KAA8B+B,IAAI,CAACvB,MAAL,CAAYT,IAAZ,EAAkBY,CAAlB,GAAsBX,EAApD,IACA,CAAC+B,IAAI,CAACvB,MAAL,CAAYT,IAAZ,EAAkBa,CAAlB,GAAsBX,EAAvB,KAA8B8B,IAAI,CAACvB,MAAL,CAAYT,IAAZ,EAAkBa,CAAlB,GAAsBX,EAApD,CAFF;;AAGA,UAAIqD,KAAK,GAAGjM,KAAZ,EAAmB;AACjBgM,QAAAA,SAAS,GAAG,KAAZ;AACD;;AACD,UAAIC,KAAK,GAAGF,QAAZ,EAAsB;AACpBD,QAAAA,UAAU,GAAGpD,IAAb;AACAqD,QAAAA,QAAQ,GAAGE,KAAX;AACD;;AACDvD,MAAAA,IAAI,GAAG,CAACA,IAAI,GAAG,CAAR,IAAagC,IAAI,CAACvB,MAAL,CAAYjF,MAAhC;AACD;;AACD,QAAI8H,SAAJ,EAAe;AACb,aAAO,CACL;AACEI,QAAAA,IAAI,EAAE,GADR;AAEEpB,QAAAA,EAAE,EAAEN,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBvC,CAF5B;AAGE2B,QAAAA,EAAE,EAAEP,IAAI,CAACvB,MAAL,CAAY0C,QAAZ,EAAsBtC,CAH5B;AAIE2B,QAAAA,EAAE,EAAEuB,GAJN;AAKEtB,QAAAA,EAAE,EAAEuB,GALN;AAMEC,QAAAA,EAAE,EAAEjC,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBlC,CAN1B;AAOEsD,QAAAA,EAAE,EAAElC,IAAI,CAACvB,MAAL,CAAYqC,MAAZ,EAAoBjC;AAP1B,OADK,CAAP;AAWD;;AACD,UAAMsD,UAAU,GAAGR,QAAnB;AAEA,WAAO,KAAKT,MAAL,CAAYlB,IAAZ,EAAkB3K,KAAlB,EAAyBC,KAAzB,EAAgC6L,QAAhC,EAA0CgB,UAA1C,EAAsDlB,MAAtD,CACL,KAAKC,MAAL,CAAYlB,IAAZ,EAAkB3K,KAAlB,EAAyBC,KAAzB,EAAgC6M,UAAhC,EAA4CrB,MAA5C,CADK,CAAP;AAGD;;AAEDlH,EAAAA,eAAe,CAACwI,cAAD,EAAiB/M,KAAjB,EAAwBC,KAAxB,EAA+B;AAC5C,UAAM+M,YAAY,GAAG,EAArB;;AACA,SAAK,MAAMxH,CAAX,IAAgBuH,cAAhB,EAAgC;AAC9B,UAAI,CAACA,cAAc,CAACtH,cAAf,CAA8BD,CAA9B,CAAL,EAAuC;AACrC;AACD;;AACDwH,MAAAA,YAAY,CAACrI,IAAb,CAAkB,KAAK2G,SAAL,CAAeyB,cAAc,CAACvH,CAAD,CAA7B,EAAkCxF,KAAlC,EAAyCC,KAAzC,CAAlB;AACD;;AAED,WAAO+M,YAAP;AACD;;AAED7H,EAAAA,gBAAgB,CAACkG,WAAD,EAAcrL,KAAd,EAAqBC,KAArB,EAA4B;AAC1C,UAAMgN,KAAK,GAAG,EAAd;;AACA,SAAK,MAAMzH,CAAX,IAAgB6F,WAAhB,EAA6B;AAC3B,UAAI,CAACA,WAAW,CAAC5F,cAAZ,CAA2BD,CAA3B,CAAL,EAAoC;AAClC;AACD;;AACDyH,MAAAA,KAAK,CAACzH,CAAD,CAAL,GAAW,KAAKjB,eAAL,CAAqB8G,WAAW,CAAC7F,CAAD,CAAhC,EAAqCxF,KAArC,EAA4CC,KAA5C,CAAX;AACD;;AAED,WAAOgN,KAAP;AACD;;AAEDC,EAAAA,UAAU,CAACtF,GAAD,EAAMuF,MAAN,EAAc;AACtB,WAAOC,MAAM,CAACxF,GAAG,CAACyF,OAAJ,CAAYF,MAAZ,CAAD,CAAb;AACD;;AAEDG,EAAAA,aAAa,CAACxJ,SAAD,EAAYyJ,IAAZ,EAAkBC,OAAlB,EAA2BvK,OAA3B,EAAoC;AAC/C,QAAIuF,KAAK,GAAG1E,SAAS,CAACC,MAAV,CAAiBwJ,IAAjB,CAAZ;AAAA,QACE7B,GAAG,GAAGlD,KAAK,CAACgF,OAAD,CADb;AAAA,QAEEC,GAAG,GAAG,EAFR;AAAA,QAGE9E,IAHF;;AAIA,QAAI1F,OAAO,CAAC5C,UAAR,IAAsBqL,GAAG,CAACC,QAAJ,CAAaxH,MAAb,GAAsB,CAAhD,EAAmD;AACjD,aAAOsJ,GAAP;AACD;;AACDA,IAAAA,GAAG,GAAI,SAAQxK,OAAO,CAAC3C,IAAR,GAAgB,WAAUiN,IAAK,MAAKC,OAAQ,IAA5C,GAAkD,EAAG,GAAE,KAAKE,aAAL,CACpE5J,SAAS,CAACE,OAAV,CAAkBuJ,IAAlB,CADoE,EAEpEtK,OAFoE,CAGpE,KAHF;;AAIA,QAAIA,OAAO,CAAC1B,WAAR,KAAwB,CAAC,CAA7B,EAAgC;AAC9BkM,MAAAA,GAAG,IAAK,KAAI/B,GAAG,CAACC,QAAJ,CAAa,CAAb,EAAgBV,EAAhB,GAAqBhI,OAAO,CAAC/C,KAAM,IAAGwL,GAAG,CAACC,QAAJ,CAAa,CAAb,EAAgBT,EAAhB,GAAqBjI,OAAO,CAAC/C,KAAM,GAArF;;AACA,WAAKyI,IAAI,GAAG,CAAZ,EAAeA,IAAI,GAAG+C,GAAG,CAACC,QAAJ,CAAaxH,MAAnC,EAA2CwE,IAAI,EAA/C,EAAmD;AACjD8E,QAAAA,GAAG,IAAK,GAAE/B,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmB0D,IAAK,IAAGX,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBwC,EAAnB,GAAwBlI,OAAO,CAAC/C,KAAM,IACzEwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmByC,EAAnB,GAAwBnI,OAAO,CAAC/C,KACjC,GAFD;;AAGA,YAAIwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBlD,cAAnB,CAAkC,IAAlC,CAAJ,EAA6C;AAC3CgI,UAAAA,GAAG,IAAK,GAAE/B,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBiE,EAAnB,GAAwB3J,OAAO,CAAC/C,KAAM,IAC9CwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBkE,EAAnB,GAAwB5J,OAAO,CAAC/C,KACjC,GAFD;AAGD;AACF;;AACDuN,MAAAA,GAAG,IAAI,IAAP;AACD,KAbD,MAaO;AACLA,MAAAA,GAAG,IAAK,KAAI,KAAKP,UAAL,CACVxB,GAAG,CAACC,QAAJ,CAAa,CAAb,EAAgBV,EAAhB,GAAqBhI,OAAO,CAAC/C,KADnB,EAEV+C,OAAO,CAAC1B,WAFE,CAGV,IAAG,KAAK2L,UAAL,CAAgBxB,GAAG,CAACC,QAAJ,CAAa,CAAb,EAAgBT,EAAhB,GAAqBjI,OAAO,CAAC/C,KAA7C,EAAoD+C,OAAO,CAAC1B,WAA5D,CAAyE,GAH9E;;AAIA,WAAKoH,IAAI,GAAG,CAAZ,EAAeA,IAAI,GAAG+C,GAAG,CAACC,QAAJ,CAAaxH,MAAnC,EAA2CwE,IAAI,EAA/C,EAAmD;AACjD8E,QAAAA,GAAG,IAAK,GAAE/B,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmB0D,IAAK,IAAG,KAAKa,UAAL,CACnCxB,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBwC,EAAnB,GAAwBlI,OAAO,CAAC/C,KADG,EAEnC+C,OAAO,CAAC1B,WAF2B,CAGnC,IAAG,KAAK2L,UAAL,CAAgBxB,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmByC,EAAnB,GAAwBnI,OAAO,CAAC/C,KAAhD,EAAuD+C,OAAO,CAAC1B,WAA/D,CAA4E,GAHjF;;AAIA,YAAImK,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBlD,cAAnB,CAAkC,IAAlC,CAAJ,EAA6C;AAC3CgI,UAAAA,GAAG,IAAK,GAAE,KAAKP,UAAL,CACRxB,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBiE,EAAnB,GAAwB3J,OAAO,CAAC/C,KADxB,EAER+C,OAAO,CAAC1B,WAFA,CAGR,IAAG,KAAK2L,UAAL,CAAgBxB,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBkE,EAAnB,GAAwB5J,OAAO,CAAC/C,KAAhD,EAAuD+C,OAAO,CAAC1B,WAA/D,CAA4E,GAHjF;AAID;AACF;;AACDkM,MAAAA,GAAG,IAAI,IAAP;AACD;;AACD,SAAK,IAAIE,IAAI,GAAG,CAAhB,EAAmBA,IAAI,GAAGjC,GAAG,CAACpC,YAAJ,CAAiBnF,MAA3C,EAAmDwJ,IAAI,EAAvD,EAA2D;AACzD,UAAIC,IAAI,GAAGpF,KAAK,CAACkD,GAAG,CAACpC,YAAJ,CAAiBqE,IAAjB,CAAD,CAAhB;;AAEA,UAAI1K,OAAO,CAAC1B,WAAR,KAAwB,CAAC,CAA7B,EAAgC;AAC9B,YAAIqM,IAAI,CAACjC,QAAL,CAAciC,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAArC,EAAwCsB,cAAxC,CAAuD,IAAvD,CAAJ,EAAkE;AAChEgI,UAAAA,GAAG,IAAK,KAAIG,IAAI,CAACjC,QAAL,CAAciC,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAArC,EAAwCyI,EAAxC,GAA6C3J,OAAO,CAAC/C,KAAM,IACrE0N,IAAI,CAACjC,QAAL,CAAciC,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAArC,EAAwC0I,EAAxC,GAA6C5J,OAAO,CAAC/C,KACtD,GAFD;AAGD,SAJD,MAIO;AACLuN,UAAAA,GAAG,IAAK,KAAIG,IAAI,CAACjC,QAAL,CAAciC,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAArC,EAAwCgH,EAAxC,GAA6ClI,OAAO,CAAC/C,KAAM,IACrE0N,IAAI,CAACjC,QAAL,CAAciC,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAArC,EAAwCiH,EAAxC,GAA6CnI,OAAO,CAAC/C,KACtD,GAFD;AAGD;;AACD,aAAKyI,IAAI,GAAGiF,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAAnC,EAAsCwE,IAAI,IAAI,CAA9C,EAAiDA,IAAI,EAArD,EAAyD;AACvD8E,UAAAA,GAAG,IAAK,GAAEG,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoB0D,IAAK,GAAnC;;AACA,cAAIuB,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBlD,cAApB,CAAmC,IAAnC,CAAJ,EAA8C;AAC5CgI,YAAAA,GAAG,IAAK,GAAEG,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBwC,EAApB,GAAyBlI,OAAO,CAAC/C,KAAM,IAC/C0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoByC,EAApB,GAAyBnI,OAAO,CAAC/C,KAClC,GAFD;AAGD;;AACDuN,UAAAA,GAAG,IAAK,GAAEG,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBsC,EAApB,GAAyBhI,OAAO,CAAC/C,KAAM,IAC/C0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBuC,EAApB,GAAyBjI,OAAO,CAAC/C,KAClC,GAFD;AAGD;AACF,OArBD,MAqBO;AACL,YAAI0N,IAAI,CAACjC,QAAL,CAAciC,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAArC,EAAwCsB,cAAxC,CAAuD,IAAvD,CAAJ,EAAkE;AAChEgI,UAAAA,GAAG,IAAK,KAAI,KAAKP,UAAL,CACVU,IAAI,CAACjC,QAAL,CAAciC,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAArC,EAAwCyI,EAAxC,GAA6C3J,OAAO,CAAC/C,KAD3C,CAEV,IAAG,KAAKgN,UAAL,CAAgBU,IAAI,CAACjC,QAAL,CAAciC,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAArC,EAAwC0I,EAAxC,GAA6C5J,OAAO,CAAC/C,KAArE,CAA4E,GAFjF;AAGD,SAJD,MAIO;AACLuN,UAAAA,GAAG,IAAK,KAAI,KAAKP,UAAL,CACVU,IAAI,CAACjC,QAAL,CAAciC,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAArC,EAAwCgH,EAAxC,GAA6ClI,OAAO,CAAC/C,KAD3C,CAEV,IAAG,KAAKgN,UAAL,CAAgBU,IAAI,CAACjC,QAAL,CAAciC,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAArC,EAAwCiH,EAAxC,GAA6CnI,OAAO,CAAC/C,KAArE,CAA4E,GAFjF;AAGD;;AACD,aAAKyI,IAAI,GAAGiF,IAAI,CAACjC,QAAL,CAAcxH,MAAd,GAAuB,CAAnC,EAAsCwE,IAAI,IAAI,CAA9C,EAAiDA,IAAI,EAArD,EAAyD;AACvD8E,UAAAA,GAAG,IAAK,GAAEG,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoB0D,IAAK,GAAnC;;AACA,cAAIuB,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBlD,cAApB,CAAmC,IAAnC,CAAJ,EAA8C;AAC5CgI,YAAAA,GAAG,IAAK,GAAE,KAAKP,UAAL,CAAgBU,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBwC,EAApB,GAAyBlI,OAAO,CAAC/C,KAAjD,CAAwD,IAAG,KAAKgN,UAAL,CACnEU,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoByC,EAApB,GAAyBnI,OAAO,CAAC/C,KADkC,CAEnE,GAFF;AAGD;;AACDuN,UAAAA,GAAG,IAAK,GAAE,KAAKP,UAAL,CAAgBU,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBsC,EAApB,GAAyBhI,OAAO,CAAC/C,KAAjD,CAAwD,IAAG,KAAKgN,UAAL,CACnEU,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBuC,EAApB,GAAyBjI,OAAO,CAAC/C,KADkC,CAEnE,GAFF;AAGD;AACF;;AACDuN,MAAAA,GAAG,IAAI,IAAP;AACD;;AACDA,IAAAA,GAAG,IAAI,MAAP;;AACA,QAAIxK,OAAO,CAACzB,IAAR,IAAgByB,OAAO,CAACxB,IAA5B,EAAkC;AAChC,WAAKkH,IAAI,GAAG,CAAZ,EAAeA,IAAI,GAAG+C,GAAG,CAACC,QAAJ,CAAaxH,MAAnC,EAA2CwE,IAAI,EAA/C,EAAmD;AACjD,YAAI+C,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBlD,cAAnB,CAAkC,IAAlC,KAA2CxC,OAAO,CAACxB,IAAvD,EAA6D;AAC3DgM,UAAAA,GAAG,IAAK,eAAc/B,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBwC,EAAnB,GAAwBlI,OAAO,CAAC/C,KAAM,SAC1DwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmByC,EAAnB,GAAwBnI,OAAO,CAAC/C,KACjC,QAAO+C,OAAO,CAACxB,IAAK,+BACnBwB,OAAO,CAACxB,IAAR,GAAe,GAChB,qBAJD;AAKAgM,UAAAA,GAAG,IAAK,eAAc/B,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBiE,EAAnB,GAAwB3J,OAAO,CAAC/C,KAAM,SAC1DwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBkE,EAAnB,GAAwB5J,OAAO,CAAC/C,KACjC,QAAO+C,OAAO,CAACxB,IAAK,gCACnBwB,OAAO,CAACxB,IAAR,GAAe,GAChB,qBAJD;AAKAgM,UAAAA,GAAG,IAAK,aAAY/B,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBsC,EAAnB,GAAwBhI,OAAO,CAAC/C,KAAM,SACxDwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBuC,EAAnB,GAAwBjI,OAAO,CAAC/C,KACjC,SAAQwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBwC,EAAnB,GAAwBlI,OAAO,CAAC/C,KAAM,SAC7CwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmByC,EAAnB,GAAwBnI,OAAO,CAAC/C,KACjC,mBAAkB+C,OAAO,CAACxB,IAAR,GAAe,GAAI,oBAJtC;AAKAgM,UAAAA,GAAG,IAAK,aAAY/B,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBwC,EAAnB,GAAwBlI,OAAO,CAAC/C,KAAM,SACxDwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmByC,EAAnB,GAAwBnI,OAAO,CAAC/C,KACjC,SAAQwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBiE,EAAnB,GAAwB3J,OAAO,CAAC/C,KAAM,SAC7CwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBkE,EAAnB,GAAwB5J,OAAO,CAAC/C,KACjC,mBAAkB+C,OAAO,CAACxB,IAAR,GAAe,GAAI,oBAJtC;AAKD;;AACD,YAAI,CAACiK,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBlD,cAAnB,CAAkC,IAAlC,CAAD,IAA4CxC,OAAO,CAACzB,IAAxD,EAA8D;AAC5DiM,UAAAA,GAAG,IAAK,eAAc/B,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmBwC,EAAnB,GAAwBlI,OAAO,CAAC/C,KAAM,SAC1DwL,GAAG,CAACC,QAAJ,CAAahD,IAAb,EAAmByC,EAAnB,GAAwBnI,OAAO,CAAC/C,KACjC,QAAO+C,OAAO,CAACzB,IAAK,gCACnByB,OAAO,CAACzB,IAAR,GAAe,GAChB,qBAJD;AAKD;AACF;;AAED,WAAK,IAAImM,IAAI,GAAG,CAAhB,EAAmBA,IAAI,GAAGjC,GAAG,CAACpC,YAAJ,CAAiBnF,MAA3C,EAAmDwJ,IAAI,EAAvD,EAA2D;AACzD,YAAIC,IAAI,GAAGpF,KAAK,CAACkD,GAAG,CAACpC,YAAJ,CAAiBqE,IAAjB,CAAD,CAAhB;;AACA,aAAKhF,IAAI,GAAG,CAAZ,EAAeA,IAAI,GAAGiF,IAAI,CAACjC,QAAL,CAAcxH,MAApC,EAA4CwE,IAAI,EAAhD,EAAoD;AAClD,cAAIiF,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBlD,cAApB,CAAmC,IAAnC,KAA4CxC,OAAO,CAACxB,IAAxD,EAA8D;AAC5DgM,YAAAA,GAAG,IAAK,eAAcG,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBwC,EAApB,GAAyBlI,OAAO,CAAC/C,KAAM,SAC3D0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoByC,EAApB,GAAyBnI,OAAO,CAAC/C,KAClC,QAAO+C,OAAO,CAACxB,IAAK,+BACnBwB,OAAO,CAACxB,IAAR,GAAe,GAChB,qBAJD;AAKAgM,YAAAA,GAAG,IAAK,eAAcG,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBiE,EAApB,GAAyB3J,OAAO,CAAC/C,KAAM,SAC3D0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBkE,EAApB,GAAyB5J,OAAO,CAAC/C,KAClC,QAAO+C,OAAO,CAACxB,IAAK,gCACnBwB,OAAO,CAACxB,IAAR,GAAe,GAChB,qBAJD;AAKAgM,YAAAA,GAAG,IAAK,aAAYG,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBsC,EAApB,GAAyBhI,OAAO,CAAC/C,KAAM,SACzD0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBuC,EAApB,GAAyBjI,OAAO,CAAC/C,KAClC,SAAQ0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBwC,EAApB,GAAyBlI,OAAO,CAAC/C,KAAM,SAC9C0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoByC,EAApB,GAAyBnI,OAAO,CAAC/C,KAClC,mBAAkB+C,OAAO,CAACxB,IAAR,GAAe,GAAI,oBAJtC;AAKAgM,YAAAA,GAAG,IAAK,aAAYG,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBwC,EAApB,GAAyBlI,OAAO,CAAC/C,KAAM,SACzD0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoByC,EAApB,GAAyBnI,OAAO,CAAC/C,KAClC,SAAQ0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBiE,EAApB,GAAyB3J,OAAO,CAAC/C,KAAM,SAC9C0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBkE,EAApB,GAAyB5J,OAAO,CAAC/C,KAClC,mBAAkB+C,OAAO,CAACxB,IAAR,GAAe,GAAI,oBAJtC;AAKD;;AACD,cAAI,CAACmM,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBlD,cAApB,CAAmC,IAAnC,CAAD,IAA6CxC,OAAO,CAACzB,IAAzD,EAA+D;AAC7DiM,YAAAA,GAAG,IAAK,eAAcG,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoBwC,EAApB,GAAyBlI,OAAO,CAAC/C,KAAM,SAC3D0N,IAAI,CAACjC,QAAL,CAAchD,IAAd,EAAoByC,EAApB,GAAyBnI,OAAO,CAAC/C,KAClC,QAAO+C,OAAO,CAACzB,IAAK,gCACnByB,OAAO,CAACzB,IAAR,GAAe,GAChB,qBAJD;AAKD;AACF;AACF;AACF;;AAED,WAAOiM,GAAP;AACD;;AAED/J,EAAAA,YAAY,CAACI,SAAD,EAAYb,OAAZ,EAAqB;AAC/BA,IAAAA,OAAO,GAAG,KAAKC,YAAL,CAAkBD,OAAlB,CAAV;AACA,UAAM6F,CAAC,GAAGhF,SAAS,CAACG,KAAV,GAAkBhB,OAAO,CAAC/C,KAApC;AACA,UAAM6I,CAAC,GAAGjF,SAAS,CAACM,MAAV,GAAmBnB,OAAO,CAAC/C,KAArC;AAEA,QAAI2N,MAAM,GAAI,QACZ5K,OAAO,CAAC7C,OAAR,GAAmB,gBAAe0I,CAAE,IAAGC,CAAE,IAAzC,GAAgD,UAASD,CAAE,aAAYC,CAAE,IAC1E,8FACC,KAAKjI,aACN,KAJD;;AAKA,SAAK,IAAIgN,IAAI,GAAG,CAAhB,EAAmBA,IAAI,GAAGhK,SAAS,CAACC,MAAV,CAAiBI,MAA3C,EAAmD2J,IAAI,IAAI,CAA3D,EAA8D;AAC5D,WAAK,IAAInF,IAAI,GAAG,CAAhB,EAAmBA,IAAI,GAAG7E,SAAS,CAACC,MAAV,CAAiB+J,IAAjB,EAAuB3J,MAAjD,EAAyDwE,IAAI,IAAI,CAAjE,EAAoE;AAClE,YAAI,CAAC7E,SAAS,CAACC,MAAV,CAAiB+J,IAAjB,EAAuBnF,IAAvB,EAA6BgB,UAAlC,EAA8C;AAC5CkE,UAAAA,MAAM,IAAI,KAAKP,aAAL,CAAmBxJ,SAAnB,EAA8BgK,IAA9B,EAAoCnF,IAApC,EAA0C1F,OAA1C,CAAV;AACD;AACF;AACF;;AACD4K,IAAAA,MAAM,IAAI,QAAV;AAEA,WAAOA,MAAP;AACD;;AAEDE,EAAAA,cAAc,CAACnN,CAAD,EAAID,CAAJ,EAAO;AACnB,WAAOC,CAAC,GAAGD,CAAX;AACD;;AAEDqN,EAAAA,SAAS,CAACC,CAAD,EAAI;AACX,WAAQ,QAAOA,CAAC,CAACxN,CAAE,IAAGwN,CAAC,CAACvN,CAAE,IAAGuN,CAAC,CAACtN,CAAE,IAAGsN,CAAC,CAACrN,CAAE,GAAxC;AACD;;AAED8M,EAAAA,aAAa,CAACO,CAAD,EAAIhL,OAAJ,EAAa;AACxB,WAAQ,aAAYgL,CAAC,CAACxN,CAAE,IAAGwN,CAAC,CAACvN,CAAE,IAAGuN,CAAC,CAACtN,CAAE,kBAAiBsN,CAAC,CAACxN,CAAE,IAAGwN,CAAC,CAACvN,CAAE,IAAGuN,CAAC,CAACtN,CAAE,oBACvEsC,OAAO,CAAC9C,WACT,cAAa8N,CAAC,CAACrN,CAAF,GAAM,KAAM,IAF1B;AAGD;;AAEDsN,EAAAA,eAAe,CAACL,MAAD,EAASM,QAAT,EAAmB;AAChC,QAAIC,GAAJ;;AACA,QAAID,QAAJ,EAAc;AACZC,MAAAA,GAAG,GAAGC,QAAQ,CAACC,cAAT,CAAwBH,QAAxB,CAAN;;AACA,UAAI,CAACC,GAAL,EAAU;AACRA,QAAAA,GAAG,GAAGC,QAAQ,CAACE,aAAT,CAAuB,KAAvB,CAAN;AACAH,QAAAA,GAAG,CAACI,EAAJ,GAASL,QAAT;AACAE,QAAAA,QAAQ,CAACI,IAAT,CAAcC,WAAd,CAA0BN,GAA1B;AACD;AACF,KAPD,MAOO;AACLA,MAAAA,GAAG,GAAGC,QAAQ,CAACE,aAAT,CAAuB,KAAvB,CAAN;AACAF,MAAAA,QAAQ,CAACI,IAAT,CAAcC,WAAd,CAA0BN,GAA1B;AACD;;AACDA,IAAAA,GAAG,CAACO,SAAJ,IAAiBd,MAAjB;AACD;;AAEDtH,EAAAA,IAAI,CAAChD,IAAD,EAAOqL,MAAP,EAAeC,KAAf,EAAsB;AACxB,QAAI5I,CAAJ,EAAOC,CAAP,EAAUV,CAAV,EAAasJ,CAAb,EAAgBnJ,GAAhB,EAAqBoJ,IAArB,EAA2BC,IAA3B,EAAiCC,IAAjC,EAAuCC,IAAvC,EAA6CC,IAA7C;AACA,UAAMC,KAAK,GAAG;AAAEnL,MAAAA,KAAK,EAAEV,IAAI,CAACU,KAAd;AAAqBG,MAAAA,MAAM,EAAEb,IAAI,CAACa,MAAlC;AAA0CyC,MAAAA,IAAI,EAAE;AAAhD,KAAd;AACA+H,IAAAA,MAAM,GAAGnI,IAAI,CAACC,KAAL,CAAWkI,MAAX,CAAT;;AACA,QAAIA,MAAM,GAAG,CAAb,EAAgB;AACd,aAAOrL,IAAP;AACD;;AACD,QAAIqL,MAAM,GAAG,CAAb,EAAgB;AACdA,MAAAA,MAAM,GAAG,CAAT;AACD;;AACDC,IAAAA,KAAK,GAAGpI,IAAI,CAACG,GAAL,CAASiI,KAAT,CAAR;;AACA,QAAIA,KAAK,GAAG,IAAZ,EAAkB;AAChBA,MAAAA,KAAK,GAAG,IAAR;AACD;;AACD,UAAMQ,MAAM,GAAG,KAAKzM,GAAL,CAASgM,MAAM,GAAG,CAAlB,CAAf;;AACA,SAAK1I,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG3C,IAAI,CAACa,MAArB,EAA6B8B,CAAC,EAA9B,EAAkC;AAChC,WAAKD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG1C,IAAI,CAACU,KAArB,EAA4BgC,CAAC,EAA7B,EAAiC;AAC/B8I,QAAAA,IAAI,GAAG,CAAP;AACAC,QAAAA,IAAI,GAAG,CAAP;AACAC,QAAAA,IAAI,GAAG,CAAP;AACAC,QAAAA,IAAI,GAAG,CAAP;AACAC,QAAAA,IAAI,GAAG,CAAP;;AAEA,aAAK3J,CAAC,GAAG,CAACoJ,MAAV,EAAkBpJ,CAAC,GAAGoJ,MAAM,GAAG,CAA/B,EAAkCpJ,CAAC,EAAnC,EAAuC;AACrC,cAAIS,CAAC,GAAGT,CAAJ,GAAQ,CAAR,IAAaS,CAAC,GAAGT,CAAJ,GAAQjC,IAAI,CAACU,KAA9B,EAAqC;AACnC0B,YAAAA,GAAG,GAAG,CAACO,CAAC,GAAG3C,IAAI,CAACU,KAAT,GAAiBgC,CAAjB,GAAqBT,CAAtB,IAA2B,CAAjC;AACAuJ,YAAAA,IAAI,IAAIxL,IAAI,CAACsD,IAAL,CAAUlB,GAAV,IAAiB0J,MAAM,CAAC7J,CAAC,GAAGoJ,MAAL,CAA/B;AACAI,YAAAA,IAAI,IAAIzL,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,IAAqB0J,MAAM,CAAC7J,CAAC,GAAGoJ,MAAL,CAAnC;AACAK,YAAAA,IAAI,IAAI1L,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,IAAqB0J,MAAM,CAAC7J,CAAC,GAAGoJ,MAAL,CAAnC;AACAM,YAAAA,IAAI,IAAI3L,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,IAAqB0J,MAAM,CAAC7J,CAAC,GAAGoJ,MAAL,CAAnC;AACAO,YAAAA,IAAI,IAAIE,MAAM,CAAC7J,CAAC,GAAGoJ,MAAL,CAAd;AACD;AACF;;AAEDjJ,QAAAA,GAAG,GAAG,CAACO,CAAC,GAAG3C,IAAI,CAACU,KAAT,GAAiBgC,CAAlB,IAAuB,CAA7B;AACAmJ,QAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAX,IAAkBc,IAAI,CAACC,KAAL,CAAWqI,IAAI,GAAGI,IAAlB,CAAlB;AACAC,QAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBc,IAAI,CAACC,KAAL,CAAWsI,IAAI,GAAGG,IAAlB,CAAtB;AACAC,QAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBc,IAAI,CAACC,KAAL,CAAWuI,IAAI,GAAGE,IAAlB,CAAtB;AACAC,QAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBc,IAAI,CAACC,KAAL,CAAWwI,IAAI,GAAGC,IAAlB,CAAtB;AACD;AACF;;AACD,UAAMG,KAAK,GAAG,IAAIC,iBAAJ,CAAsBH,KAAK,CAACvI,IAA5B,CAAd;;AACA,SAAKX,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG3C,IAAI,CAACa,MAArB,EAA6B8B,CAAC,EAA9B,EAAkC;AAChC,WAAKD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG1C,IAAI,CAACU,KAArB,EAA4BgC,CAAC,EAA7B,EAAiC;AAC/B8I,QAAAA,IAAI,GAAG,CAAP;AACAC,QAAAA,IAAI,GAAG,CAAP;AACAC,QAAAA,IAAI,GAAG,CAAP;AACAC,QAAAA,IAAI,GAAG,CAAP;AACAC,QAAAA,IAAI,GAAG,CAAP;;AAEA,aAAK3J,CAAC,GAAG,CAACoJ,MAAV,EAAkBpJ,CAAC,GAAGoJ,MAAM,GAAG,CAA/B,EAAkCpJ,CAAC,EAAnC,EAAuC;AACrC,cAAIU,CAAC,GAAGV,CAAJ,GAAQ,CAAR,IAAaU,CAAC,GAAGV,CAAJ,GAAQjC,IAAI,CAACa,MAA9B,EAAsC;AACpCuB,YAAAA,GAAG,GAAG,CAAC,CAACO,CAAC,GAAGV,CAAL,IAAUjC,IAAI,CAACU,KAAf,GAAuBgC,CAAxB,IAA6B,CAAnC;AACA8I,YAAAA,IAAI,IAAIO,KAAK,CAAC3J,GAAD,CAAL,GAAa0J,MAAM,CAAC7J,CAAC,GAAGoJ,MAAL,CAA3B;AACAI,YAAAA,IAAI,IAAIM,KAAK,CAAC3J,GAAG,GAAG,CAAP,CAAL,GAAiB0J,MAAM,CAAC7J,CAAC,GAAGoJ,MAAL,CAA/B;AACAK,YAAAA,IAAI,IAAIK,KAAK,CAAC3J,GAAG,GAAG,CAAP,CAAL,GAAiB0J,MAAM,CAAC7J,CAAC,GAAGoJ,MAAL,CAA/B;AACAM,YAAAA,IAAI,IAAII,KAAK,CAAC3J,GAAG,GAAG,CAAP,CAAL,GAAiB0J,MAAM,CAAC7J,CAAC,GAAGoJ,MAAL,CAA/B;AACAO,YAAAA,IAAI,IAAIE,MAAM,CAAC7J,CAAC,GAAGoJ,MAAL,CAAd;AACD;AACF;;AAEDjJ,QAAAA,GAAG,GAAG,CAACO,CAAC,GAAG3C,IAAI,CAACU,KAAT,GAAiBgC,CAAlB,IAAuB,CAA7B;AACAmJ,QAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAX,IAAkBc,IAAI,CAACC,KAAL,CAAWqI,IAAI,GAAGI,IAAlB,CAAlB;AACAC,QAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBc,IAAI,CAACC,KAAL,CAAWsI,IAAI,GAAGG,IAAlB,CAAtB;AACAC,QAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBc,IAAI,CAACC,KAAL,CAAWuI,IAAI,GAAGE,IAAlB,CAAtB;AACAC,QAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBc,IAAI,CAACC,KAAL,CAAWwI,IAAI,GAAGC,IAAlB,CAAtB;AACD;AACF;;AACD,SAAKjJ,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG3C,IAAI,CAACa,MAArB,EAA6B8B,CAAC,EAA9B,EAAkC;AAChC,WAAKD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG1C,IAAI,CAACU,KAArB,EAA4BgC,CAAC,EAA7B,EAAiC;AAC/BN,QAAAA,GAAG,GAAG,CAACO,CAAC,GAAG3C,IAAI,CAACU,KAAT,GAAiBgC,CAAlB,IAAuB,CAA7B;AAEA6I,QAAAA,CAAC,GACCrI,IAAI,CAACG,GAAL,CAASwI,KAAK,CAACvI,IAAN,CAAWlB,GAAX,IAAkBpC,IAAI,CAACsD,IAAL,CAAUlB,GAAV,CAA3B,IACAc,IAAI,CAACG,GAAL,CAASwI,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBpC,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAA/B,CADA,GAEAc,IAAI,CAACG,GAAL,CAASwI,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBpC,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAA/B,CAFA,GAGAc,IAAI,CAACG,GAAL,CAASwI,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBpC,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAA/B,CAJF;;AAMA,YAAImJ,CAAC,GAAGD,KAAR,EAAe;AACbO,UAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAX,IAAkBpC,IAAI,CAACsD,IAAL,CAAUlB,GAAV,CAAlB;AACAyJ,UAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBpC,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAAtB;AACAyJ,UAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBpC,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAAtB;AACAyJ,UAAAA,KAAK,CAACvI,IAAN,CAAWlB,GAAG,GAAG,CAAjB,IAAsBpC,IAAI,CAACsD,IAAL,CAAUlB,GAAG,GAAG,CAAhB,CAAtB;AACD;AACF;AACF;;AAED,WAAOyJ,KAAP;AACD;;AAEDjM,EAAAA,SAAS,CAACJ,GAAD,EAAMC,QAAN,EAAgBC,OAAhB,EAAyB;AAChC,UAAMuM,GAAG,GAAG,IAAIC,KAAJ,EAAZ;;AACA,QAAIxM,OAAO,IAAIA,OAAO,CAAChC,WAAvB,EAAoC;AAClCuO,MAAAA,GAAG,CAACE,WAAJ,GAAkB,WAAlB;AACD;;AACDF,IAAAA,GAAG,CAACG,GAAJ,GAAU5M,GAAV;;AACAyM,IAAAA,GAAG,CAACI,MAAJ,GAAa,YAAY;AACvB,YAAMxM,MAAM,GAAGiL,QAAQ,CAACE,aAAT,CAAuB,QAAvB,CAAf;AACAnL,MAAAA,MAAM,CAACa,KAAP,GAAeuL,GAAG,CAACvL,KAAnB;AACAb,MAAAA,MAAM,CAACgB,MAAP,GAAgBoL,GAAG,CAACpL,MAApB;AACA,YAAMyL,OAAO,GAAGzM,MAAM,CAAC0M,UAAP,CAAkB,IAAlB,CAAhB;AACAD,MAAAA,OAAO,CAACE,SAAR,CAAkBP,GAAlB,EAAuB,CAAvB,EAA0B,CAA1B;AACAxM,MAAAA,QAAQ,CAACI,MAAD,CAAR;AACD,KAPD;AAQD;;AAEDE,EAAAA,UAAU,CAACF,MAAD,EAAS;AACjB,UAAMyM,OAAO,GAAGzM,MAAM,CAAC0M,UAAP,CAAkB,IAAlB,CAAhB;AAEA,WAAOD,OAAO,CAACG,YAAR,CAAqB,CAArB,EAAwB,CAAxB,EAA2B5M,MAAM,CAACa,KAAlC,EAAyCb,MAAM,CAACgB,MAAhD,CAAP;AACD;;AAEDU,EAAAA,UAAU,CAACf,MAAD,EAASC,OAAT,EAAkB9D,KAAlB,EAAyBiO,QAAzB,EAAmC;AAC3CjO,IAAAA,KAAK,GAAGA,KAAK,IAAI,CAAjB;AACA,QAAI4I,CAAJ,EAAOC,CAAP,EAAU9C,CAAV,EAAaC,CAAb,EAAgBV,CAAhB;AACA,QAAI4I,GAAJ;;AACA,QAAID,QAAJ,EAAc;AACZC,MAAAA,GAAG,GAAGC,QAAQ,CAACC,cAAT,CAAwBH,QAAxB,CAAN;;AACA,UAAI,CAACC,GAAL,EAAU;AACRA,QAAAA,GAAG,GAAGC,QAAQ,CAACE,aAAT,CAAuB,KAAvB,CAAN;AACAH,QAAAA,GAAG,CAACI,EAAJ,GAASL,QAAT;AACAE,QAAAA,QAAQ,CAACI,IAAT,CAAcC,WAAd,CAA0BN,GAA1B;AACD;AACF,KAPD,MAOO;AACLA,MAAAA,GAAG,GAAGC,QAAQ,CAACE,aAAT,CAAuB,KAAvB,CAAN;AACAF,MAAAA,QAAQ,CAACI,IAAT,CAAcC,WAAd,CAA0BN,GAA1B;AACD;;AACD,SAAK5I,CAAL,IAAUzB,MAAV,EAAkB;AAChB,UAAI,CAACA,MAAM,CAAC0B,cAAP,CAAsBD,CAAtB,CAAL,EAA+B;AAC7B;AACD;;AAEDsD,MAAAA,CAAC,GAAG/E,MAAM,CAACyB,CAAD,CAAN,CAAU,CAAV,EAAarB,MAAjB;AACA4E,MAAAA,CAAC,GAAGhF,MAAM,CAACyB,CAAD,CAAN,CAAUrB,MAAd;AAEA,YAAMf,MAAM,GAAGiL,QAAQ,CAACE,aAAT,CAAuB,QAAvB,CAAf;AACAnL,MAAAA,MAAM,CAACa,KAAP,GAAe6E,CAAC,GAAG5I,KAAnB;AACAkD,MAAAA,MAAM,CAACgB,MAAP,GAAgB2E,CAAC,GAAG7I,KAApB;AACA,YAAM2P,OAAO,GAAGzM,MAAM,CAAC0M,UAAP,CAAkB,IAAlB,CAAhB;;AAEA,WAAK5J,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG6C,CAAhB,EAAmB7C,CAAC,IAAI,CAAxB,EAA2B;AACzB,aAAKD,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG6C,CAAhB,EAAmB7C,CAAC,IAAI,CAAxB,EAA2B;AACzB4J,UAAAA,OAAO,CAACI,SAAR,GAAoB,KAAKjC,SAAL,CAAehK,OAAO,CAACD,MAAM,CAACyB,CAAD,CAAN,CAAUU,CAAV,EAAaD,CAAb,IAAkBjC,OAAO,CAACG,MAA3B,CAAtB,CAApB;AACA0L,UAAAA,OAAO,CAACK,QAAR,CAAiBjK,CAAC,GAAG/F,KAArB,EAA4BgG,CAAC,GAAGhG,KAAhC,EAAuCA,KAAvC,EAA8CA,KAA9C;AACD;AACF;;AAEDkO,MAAAA,GAAG,CAACM,WAAJ,CAAgBtL,MAAhB;AACD;AACF;;AAr1C8B","sourcesContent":["/*\r\n  imagetracer.js version 1.2.4\r\n  Simple raster image tracer and vectorizer written in JavaScript.\r\n  andras@jankovics.net\r\n*/\r\n\r\n/*\r\n  The Unlicense / PUBLIC DOMAIN\r\n  This is free and unencumbered software released into the public domain.\r\n  Anyone is free to copy, modify, publish, use, compile, sell, or\r\n  distribute this software, either in source code form or as a compiled\r\n  binary, for any purpose, commercial or non-commercial, and by any\r\n  means.\r\n  In jurisdictions that recognize copyright laws, the author or authors\r\n  of this software dedicate any and all copyright interest in the\r\n  software to the public domain. We make this dedication for the benefit\r\n  of the public at large and to the detriment of our heirs and\r\n  successors. We intend this dedication to be an overt act of\r\n  relinquishment in perpetuity of all present and future rights to this\r\n  software under copyright law.\r\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\r\n  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\r\n  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\n  OTHER DEALINGS IN THE SOFTWARE.\r\n  For more information, please refer to http://unlicense.org/\r\n*/\r\nexport default class ImageTracer {\r\n  static tracerDefaultOption() {\r\n    return {\r\n      pathomit: 100,\r\n      ltres: 0.1,\r\n      qtres: 1,\r\n\r\n      scale: 1,\r\n      strokewidth: 5,\r\n      viewbox: false,\r\n      linefilter: true,\r\n      desc: false,\r\n      rightangleenhance: false,\r\n      pal: [\r\n        {\r\n          r: 0,\r\n          g: 0,\r\n          b: 0,\r\n          a: 255,\r\n        },\r\n        {\r\n          r: 255,\r\n          g: 255,\r\n          b: 255,\r\n          a: 255,\r\n        },\r\n      ],\r\n    };\r\n  }\r\n  /* eslint-disable */\r\n  constructor() {\r\n    this.versionnumber = '1.2.4';\r\n    this.optionpresets = {\r\n      default: {\r\n        corsenabled: false,\r\n        ltres: 1,\r\n        qtres: 1,\r\n        pathomit: 8,\r\n        rightangleenhance: true,\r\n        colorsampling: 2,\r\n        numberofcolors: 16,\r\n        mincolorratio: 0,\r\n        colorquantcycles: 3,\r\n        layering: 0,\r\n        strokewidth: 1,\r\n        linefilter: false,\r\n        scale: 1,\r\n        roundcoords: 1,\r\n        viewbox: false,\r\n        desc: false,\r\n        lcpr: 0,\r\n        qcpr: 0,\r\n        blurradius: 0,\r\n        blurdelta: 20,\r\n      },\r\n      posterized1: {\r\n        colorsampling: 0,\r\n        numberofcolors: 2,\r\n      },\r\n      posterized2: {\r\n        numberofcolors: 4,\r\n        blurradius: 5,\r\n      },\r\n      curvy: {\r\n        ltres: 0.01,\r\n        linefilter: true,\r\n        rightangleenhance: false,\r\n      },\r\n      sharp: { qtres: 0.01, linefilter: false },\r\n      detailed: { pathomit: 0, roundcoords: 2, ltres: 0.5, qtres: 0.5, numberofcolors: 64 },\r\n      smoothed: { blurradius: 5, blurdelta: 64 },\r\n      grayscale: { colorsampling: 0, colorquantcycles: 1, numberofcolors: 7 },\r\n      fixedpalette: { colorsampling: 0, colorquantcycles: 1, numberofcolors: 27 },\r\n      randomsampling1: { colorsampling: 1, numberofcolors: 8 },\r\n      randomsampling2: { colorsampling: 1, numberofcolors: 64 },\r\n      artistic1: {\r\n        colorsampling: 0,\r\n        colorquantcycles: 1,\r\n        pathomit: 0,\r\n        blurradius: 5,\r\n        blurdelta: 64,\r\n        ltres: 0.01,\r\n        linefilter: true,\r\n        numberofcolors: 16,\r\n        strokewidth: 2,\r\n      },\r\n      artistic2: {\r\n        qtres: 0.01,\r\n        colorsampling: 0,\r\n        colorquantcycles: 1,\r\n        numberofcolors: 4,\r\n        strokewidth: 0,\r\n      },\r\n      artistic3: { qtres: 10, ltres: 10, numberofcolors: 8 },\r\n      artistic4: {\r\n        qtres: 10,\r\n        ltres: 10,\r\n        numberofcolors: 64,\r\n        blurradius: 5,\r\n        blurdelta: 256,\r\n        strokewidth: 2,\r\n      },\r\n      posterized3: {\r\n        ltres: 1,\r\n        qtres: 1,\r\n        pathomit: 20,\r\n        rightangleenhance: true,\r\n        colorsampling: 0,\r\n        numberofcolors: 3,\r\n        mincolorratio: 0,\r\n        colorquantcycles: 3,\r\n        blurradius: 3,\r\n        blurdelta: 20,\r\n        strokewidth: 0,\r\n        linefilter: false,\r\n        roundcoords: 1,\r\n        pal: [\r\n          { r: 0, g: 0, b: 100, a: 255 },\r\n          { r: 255, g: 255, b: 255, a: 255 },\r\n        ],\r\n      },\r\n    };\r\n\r\n    this.pathscan_combined_lookup = [\r\n      [\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n      ],\r\n      [\r\n        [0, 1, 0, -1],\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n        [0, 2, -1, 0],\r\n      ],\r\n      [\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n        [0, 1, 0, -1],\r\n        [0, 0, 1, 0],\r\n      ],\r\n      [\r\n        [0, 0, 1, 0],\r\n        [-1, -1, -1, -1],\r\n        [0, 2, -1, 0],\r\n        [-1, -1, -1, -1],\r\n      ],\r\n      [\r\n        [-1, -1, -1, -1],\r\n        [0, 0, 1, 0],\r\n        [0, 3, 0, 1],\r\n        [-1, -1, -1, -1],\r\n      ],\r\n      [\r\n        [13, 3, 0, 1],\r\n        [13, 2, -1, 0],\r\n        [7, 1, 0, -1],\r\n        [7, 0, 1, 0],\r\n      ],\r\n      [\r\n        [-1, -1, -1, -1],\r\n        [0, 1, 0, -1],\r\n        [-1, -1, -1, -1],\r\n        [0, 3, 0, 1],\r\n      ],\r\n      [\r\n        [0, 3, 0, 1],\r\n        [0, 2, -1, 0],\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n      ],\r\n      [\r\n        [0, 3, 0, 1],\r\n        [0, 2, -1, 0],\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n      ],\r\n      [\r\n        [-1, -1, -1, -1],\r\n        [0, 1, 0, -1],\r\n        [-1, -1, -1, -1],\r\n        [0, 3, 0, 1],\r\n      ],\r\n      [\r\n        [11, 1, 0, -1],\r\n        [14, 0, 1, 0],\r\n        [14, 3, 0, 1],\r\n        [11, 2, -1, 0],\r\n      ],\r\n      [\r\n        [-1, -1, -1, -1],\r\n        [0, 0, 1, 0],\r\n        [0, 3, 0, 1],\r\n        [-1, -1, -1, -1],\r\n      ],\r\n      [\r\n        [0, 0, 1, 0],\r\n        [-1, -1, -1, -1],\r\n        [0, 2, -1, 0],\r\n        [-1, -1, -1, -1],\r\n      ],\r\n      [\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n        [0, 1, 0, -1],\r\n        [0, 0, 1, 0],\r\n      ],\r\n      [\r\n        [0, 1, 0, -1],\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n        [0, 2, -1, 0],\r\n      ],\r\n      [\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n        [-1, -1, -1, -1],\r\n      ],\r\n    ];\r\n\r\n    this.gks = [\r\n      [0.27901, 0.44198, 0.27901],\r\n      [0.135336, 0.228569, 0.272192, 0.228569, 0.135336],\r\n      [0.086776, 0.136394, 0.178908, 0.195843, 0.178908, 0.136394, 0.086776],\r\n      [0.063327, 0.093095, 0.122589, 0.144599, 0.152781, 0.144599, 0.122589, 0.093095, 0.063327],\r\n      [\r\n        0.049692,\r\n        0.069304,\r\n        0.089767,\r\n        0.107988,\r\n        0.120651,\r\n        0.125194,\r\n        0.120651,\r\n        0.107988,\r\n        0.089767,\r\n        0.069304,\r\n        0.049692,\r\n      ],\r\n    ];\r\n\r\n    this.specpalette = [\r\n      { r: 0, g: 0, b: 0, a: 255 },\r\n      { r: 128, g: 128, b: 128, a: 255 },\r\n      { r: 0, g: 0, b: 128, a: 255 },\r\n      { r: 64, g: 64, b: 128, a: 255 },\r\n      { r: 192, g: 192, b: 192, a: 255 },\r\n      { r: 255, g: 255, b: 255, a: 255 },\r\n      { r: 128, g: 128, b: 192, a: 255 },\r\n      { r: 0, g: 0, b: 192, a: 255 },\r\n      { r: 128, g: 0, b: 0, a: 255 },\r\n      { r: 128, g: 64, b: 64, a: 255 },\r\n      { r: 128, g: 0, b: 128, a: 255 },\r\n      { r: 168, g: 168, b: 168, a: 255 },\r\n      { r: 192, g: 128, b: 128, a: 255 },\r\n      { r: 192, g: 0, b: 0, a: 255 },\r\n      { r: 255, g: 255, b: 255, a: 255 },\r\n      { r: 0, g: 128, b: 0, a: 255 },\r\n    ];\r\n  }\r\n\r\n  imageToSVG(url, callback, options) {\r\n    options = this.checkoptions(options);\r\n    this.loadImage(\r\n      url,\r\n      (canvas) => {\r\n        callback(this.imagedataToSVG(this.getImgdata(canvas), options));\r\n      },\r\n      options\r\n    );\r\n  }\r\n\r\n  imagedataToSVG(imgd, options) {\r\n    options = this.checkoptions(options);\r\n    const td = this.imagedataToTracedata(imgd, options);\r\n\r\n    return this.getsvgstring(td, options);\r\n  }\r\n\r\n  imageToTracedata(url, callback, options) {\r\n    options = this.checkoptions(options);\r\n    this.loadImage(\r\n      url,\r\n      (canvas) => {\r\n        callback(this.imagedataToTracedata(this.getImgdata(canvas), options));\r\n      },\r\n      options\r\n    );\r\n  }\r\n\r\n  imagedataToTracedata(imgd, options) {\r\n    options = this.checkoptions(options);\r\n    const ii = this.colorquantization(imgd, options);\r\n    let tracedata;\r\n    if (options.layering === 0) {\r\n      tracedata = {\r\n        layers: [],\r\n        palette: ii.palette,\r\n        width: ii.array[0].length - 2,\r\n        height: ii.array.length - 2,\r\n      };\r\n\r\n      for (let colornum = 0; colornum < ii.palette.length; colornum += 1) {\r\n        const tracedlayer = this.batchtracepaths(\r\n          this.internodes(\r\n            this.pathscan(this.layeringstep(ii, colornum), options.pathomit),\r\n            options\r\n          ),\r\n          options.ltres,\r\n          options.qtres\r\n        );\r\n        tracedata.layers.push(tracedlayer);\r\n      }\r\n    } else {\r\n      const ls = this.layering(ii);\r\n      if (options.layercontainerid) {\r\n        this.drawLayers(ls, this.specpalette, options.scale, options.layercontainerid);\r\n      }\r\n      const bps = this.batchpathscan(ls, options.pathomit);\r\n      const bis = this.batchinternodes(bps, options);\r\n      tracedata = {\r\n        layers: this.batchtracelayers(bis, options.ltres, options.qtres),\r\n        palette: ii.palette,\r\n        width: imgd.width,\r\n        height: imgd.height,\r\n      };\r\n    }\r\n\r\n    return tracedata;\r\n  }\r\n\r\n  checkoptions(options) {\r\n    options = options || {};\r\n    if (typeof options === 'string') {\r\n      options = options.toLowerCase();\r\n      if (this.optionpresets[options]) {\r\n        options = this.optionpresets[options];\r\n      } else {\r\n        options = {};\r\n      }\r\n    }\r\n    const ok = Object.keys(this.optionpresets['default']);\r\n    for (let k = 0; k < ok.length; k += 1) {\r\n      if (!options.hasOwnProperty(ok[k])) {\r\n        options[ok[k]] = this.optionpresets['default'][ok[k]];\r\n      }\r\n    }\r\n\r\n    return options;\r\n  }\r\n\r\n  colorquantization(imgd, options) {\r\n    const arr = [];\r\n    let idx = 0;\r\n    let cd;\r\n    let cdl;\r\n    let ci;\r\n    const paletteacc = [];\r\n    const pixelnum = imgd.width * imgd.height;\r\n    let i;\r\n    let j;\r\n    let k;\r\n    let cnt;\r\n    let palette;\r\n\r\n    for (j = 0; j < imgd.height + 2; j += 1) {\r\n      arr[j] = [];\r\n      for (i = 0; i < imgd.width + 2; i += 1) {\r\n        arr[j][i] = -1;\r\n      }\r\n    }\r\n    if (options.pal) {\r\n      palette = options.pal;\r\n    } else if (options.colorsampling === 0) {\r\n      palette = this.generatepalette(options.numberofcolors);\r\n    } else if (options.colorsampling === 1) {\r\n      palette = this.samplepalette(options.numberofcolors, imgd);\r\n    } else {\r\n      palette = this.samplepalette2(options.numberofcolors, imgd);\r\n    }\r\n    if (options.blurradius > 0) {\r\n      imgd = this.blur(imgd, options.blurradius, options.blurdelta);\r\n    }\r\n    for (cnt = 0; cnt < options.colorquantcycles; cnt += 1) {\r\n      if (cnt > 0) {\r\n        for (k = 0; k < palette.length; k += 1) {\r\n          if (paletteacc[k].n > 0) {\r\n            palette[k] = {\r\n              r: Math.floor(paletteacc[k].r / paletteacc[k].n),\r\n              g: Math.floor(paletteacc[k].g / paletteacc[k].n),\r\n              b: Math.floor(paletteacc[k].b / paletteacc[k].n),\r\n              a: Math.floor(paletteacc[k].a / paletteacc[k].n),\r\n            };\r\n          }\r\n\r\n          if (\r\n            paletteacc[k].n / pixelnum < options.mincolorratio &&\r\n            cnt < options.colorquantcycles - 1\r\n          ) {\r\n            palette[k] = {\r\n              r: Math.floor(Math.random() * 255),\r\n              g: Math.floor(Math.random() * 255),\r\n              b: Math.floor(Math.random() * 255),\r\n              a: Math.floor(Math.random() * 255),\r\n            };\r\n          }\r\n        }\r\n      }\r\n\r\n      for (i = 0; i < palette.length; i += 1) {\r\n        paletteacc[i] = { r: 0, g: 0, b: 0, a: 0, n: 0 };\r\n      }\r\n\r\n      for (j = 0; j < imgd.height; j += 1) {\r\n        for (i = 0; i < imgd.width; i += 1) {\r\n          idx = (j * imgd.width + i) * 4;\r\n\r\n          ci = 0;\r\n          cdl = 1024;\r\n          for (k = 0; k < palette.length; k += 1) {\r\n            cd =\r\n              Math.abs(palette[k].r - imgd.data[idx]) +\r\n              Math.abs(palette[k].g - imgd.data[idx + 1]) +\r\n              Math.abs(palette[k].b - imgd.data[idx + 2]) +\r\n              Math.abs(palette[k].a - imgd.data[idx + 3]);\r\n\r\n            if (cd < cdl) {\r\n              cdl = cd;\r\n              ci = k;\r\n            }\r\n          }\r\n\r\n          paletteacc[ci].r += imgd.data[idx];\r\n          paletteacc[ci].g += imgd.data[idx + 1];\r\n          paletteacc[ci].b += imgd.data[idx + 2];\r\n          paletteacc[ci].a += imgd.data[idx + 3];\r\n          paletteacc[ci].n += 1;\r\n\r\n          arr[j + 1][i + 1] = ci;\r\n        }\r\n      }\r\n    }\r\n\r\n    return { array: arr, palette };\r\n  }\r\n\r\n  samplepalette(numberofcolors, imgd) {\r\n    let idx;\r\n    const palette = [];\r\n    for (let i = 0; i < numberofcolors; i += 1) {\r\n      idx = Math.floor((Math.random() * imgd.data.length) / 4) * 4;\r\n      palette.push({\r\n        r: imgd.data[idx],\r\n        g: imgd.data[idx + 1],\r\n        b: imgd.data[idx + 2],\r\n        a: imgd.data[idx + 3],\r\n      });\r\n    }\r\n\r\n    return palette;\r\n  }\r\n\r\n  samplepalette2(numberofcolors, imgd) {\r\n    let idx;\r\n    const palette = [];\r\n    const ni = Math.ceil(Math.sqrt(numberofcolors));\r\n    const nj = Math.ceil(numberofcolors / ni);\r\n    const vx = imgd.width / (ni + 1);\r\n    const vy = imgd.height / (nj + 1);\r\n    for (let j = 0; j < nj; j += 1) {\r\n      for (let i = 0; i < ni; i += 1) {\r\n        if (palette.length === numberofcolors) {\r\n          break;\r\n        } else {\r\n          idx = Math.floor((j + 1) * vy * imgd.width + (i + 1) * vx) * 4;\r\n          palette.push({\r\n            r: imgd.data[idx],\r\n            g: imgd.data[idx + 1],\r\n            b: imgd.data[idx + 2],\r\n            a: imgd.data[idx + 3],\r\n          });\r\n        }\r\n      }\r\n    }\r\n\r\n    return palette;\r\n  }\r\n\r\n  generatepalette(numberofcolors) {\r\n    const palette = [];\r\n    let rcnt;\r\n    let gcnt;\r\n    let bcnt;\r\n    if (numberofcolors < 8) {\r\n      const graystep = Math.floor(255 / (numberofcolors - 1));\r\n      for (let i = 0; i < numberofcolors; i += 1) {\r\n        palette.push({ r: i * graystep, g: i * graystep, b: i * graystep, a: 255 });\r\n      }\r\n    } else {\r\n      const colorqnum = Math.floor(Math.pow(numberofcolors, 1 / 3));\r\n      const colorstep = Math.floor(255 / (colorqnum - 1));\r\n      const rndnum = numberofcolors - colorqnum * colorqnum * colorqnum;\r\n      for (rcnt = 0; rcnt < colorqnum; rcnt += 1) {\r\n        for (gcnt = 0; gcnt < colorqnum; gcnt += 1) {\r\n          for (bcnt = 0; bcnt < colorqnum; bcnt += 1) {\r\n            palette.push({ r: rcnt * colorstep, g: gcnt * colorstep, b: bcnt * colorstep, a: 255 });\r\n          }\r\n        }\r\n      }\r\n      for (rcnt = 0; rcnt < rndnum; rcnt += 1) {\r\n        palette.push({\r\n          r: Math.floor(Math.random() * 255),\r\n          g: Math.floor(Math.random() * 255),\r\n          b: Math.floor(Math.random() * 255),\r\n          a: Math.floor(Math.random() * 255),\r\n        });\r\n      }\r\n    }\r\n\r\n    return palette;\r\n  }\r\n\r\n  layering(ii) {\r\n    const layers = [];\r\n    let val = 0;\r\n    const ah = ii.array.length;\r\n    const aw = ii.array[0].length;\r\n    let n1;\r\n    let n2;\r\n    let n3;\r\n    let n4;\r\n    let n5;\r\n    let n6;\r\n    let n7;\r\n    let n8;\r\n    let i;\r\n    let j;\r\n    let k;\r\n    for (k = 0; k < ii.palette.length; k += 1) {\r\n      layers[k] = [];\r\n      for (j = 0; j < ah; j += 1) {\r\n        layers[k][j] = [];\r\n        for (i = 0; i < aw; i += 1) {\r\n          layers[k][j][i] = 0;\r\n        }\r\n      }\r\n    }\r\n    for (j = 1; j < ah - 1; j += 1) {\r\n      for (i = 1; i < aw - 1; i += 1) {\r\n        val = ii.array[j][i];\r\n\r\n        n1 = ii.array[j - 1][i - 1] === val ? 1 : 0;\r\n        n2 = ii.array[j - 1][i] === val ? 1 : 0;\r\n        n3 = ii.array[j - 1][i + 1] === val ? 1 : 0;\r\n        n4 = ii.array[j][i - 1] === val ? 1 : 0;\r\n        n5 = ii.array[j][i + 1] === val ? 1 : 0;\r\n        n6 = ii.array[j + 1][i - 1] === val ? 1 : 0;\r\n        n7 = ii.array[j + 1][i] === val ? 1 : 0;\r\n        n8 = ii.array[j + 1][i + 1] === val ? 1 : 0;\r\n\r\n        layers[val][j + 1][i + 1] = 1 + n5 * 2 + n8 * 4 + n7 * 8;\r\n        if (!n4) {\r\n          layers[val][j + 1][i] = 0 + 2 + n7 * 4 + n6 * 8;\r\n        }\r\n        if (!n2) {\r\n          layers[val][j][i + 1] = 0 + n3 * 2 + n5 * 4 + 8;\r\n        }\r\n        if (!n1) {\r\n          layers[val][j][i] = 0 + n2 * 2 + 4 + n4 * 8;\r\n        }\r\n      }\r\n    }\r\n\r\n    return layers;\r\n  }\r\n\r\n  layeringstep(ii, cnum) {\r\n    const layer = [];\r\n    const ah = ii.array.length;\r\n    const aw = ii.array[0].length;\r\n    let i;\r\n    let j;\r\n    for (j = 0; j < ah; j += 1) {\r\n      layer[j] = [];\r\n      for (i = 0; i < aw; i += 1) {\r\n        layer[j][i] = 0;\r\n      }\r\n    }\r\n    for (j = 1; j < ah; j += 1) {\r\n      for (i = 1; i < aw; i += 1) {\r\n        layer[j][i] =\r\n          (ii.array[j - 1][i - 1] === cnum ? 1 : 0) +\r\n          (ii.array[j - 1][i] === cnum ? 2 : 0) +\r\n          (ii.array[j][i - 1] === cnum ? 8 : 0) +\r\n          (ii.array[j][i] === cnum ? 4 : 0);\r\n      }\r\n    }\r\n\r\n    return layer;\r\n  }\r\n\r\n  pathscan(arr, pathomit) {\r\n    const paths = [];\r\n    let pacnt = 0;\r\n    let pcnt = 0;\r\n    let px = 0;\r\n    let py = 0;\r\n    const w = arr[0].length;\r\n    const h = arr.length;\r\n    let dir = 0;\r\n    let pathfinished = true;\r\n    let holepath = false;\r\n    let lookuprow;\r\n    for (let j = 0; j < h; j += 1) {\r\n      for (let i = 0; i < w; i += 1) {\r\n        if (arr[j][i] === 4 || arr[j][i] === 11) {\r\n          px = i;\r\n          py = j;\r\n          paths[pacnt] = {};\r\n          paths[pacnt].points = [];\r\n          paths[pacnt].boundingbox = [px, py, px, py];\r\n          paths[pacnt].holechildren = [];\r\n          pathfinished = false;\r\n          pcnt = 0;\r\n          holepath = arr[j][i] === 11;\r\n          dir = 1;\r\n\r\n          while (!pathfinished) {\r\n            paths[pacnt].points[pcnt] = {};\r\n            paths[pacnt].points[pcnt].x = px - 1;\r\n            paths[pacnt].points[pcnt].y = py - 1;\r\n            paths[pacnt].points[pcnt].t = arr[py][px];\r\n\r\n            if (px - 1 < paths[pacnt].boundingbox[0]) {\r\n              paths[pacnt].boundingbox[0] = px - 1;\r\n            }\r\n            if (px - 1 > paths[pacnt].boundingbox[2]) {\r\n              paths[pacnt].boundingbox[2] = px - 1;\r\n            }\r\n            if (py - 1 < paths[pacnt].boundingbox[1]) {\r\n              paths[pacnt].boundingbox[1] = py - 1;\r\n            }\r\n            if (py - 1 > paths[pacnt].boundingbox[3]) {\r\n              paths[pacnt].boundingbox[3] = py - 1;\r\n            }\r\n\r\n            lookuprow = this.pathscan_combined_lookup[arr[py][px]][dir];\r\n            arr[py][px] = lookuprow[0];\r\n            dir = lookuprow[1];\r\n            px += lookuprow[2];\r\n            py += lookuprow[3];\r\n\r\n            if (px - 1 === paths[pacnt].points[0].x && py - 1 === paths[pacnt].points[0].y) {\r\n              pathfinished = true;\r\n\r\n              if (paths[pacnt].points.length < pathomit) {\r\n                paths.pop();\r\n              } else {\r\n                paths[pacnt].isholepath = !!holepath;\r\n\r\n                if (holepath) {\r\n                  let parentidx = 0,\r\n                    parentbbox = [-1, -1, w + 1, h + 1];\r\n                  for (let parentcnt = 0; parentcnt < pacnt; parentcnt++) {\r\n                    if (\r\n                      !paths[parentcnt].isholepath &&\r\n                      this.boundingboxincludes(\r\n                        paths[parentcnt].boundingbox,\r\n                        paths[pacnt].boundingbox\r\n                      ) &&\r\n                      this.boundingboxincludes(parentbbox, paths[parentcnt].boundingbox)\r\n                    ) {\r\n                      parentidx = parentcnt;\r\n                      parentbbox = paths[parentcnt].boundingbox;\r\n                    }\r\n                  }\r\n                  paths[parentidx].holechildren.push(pacnt);\r\n                }\r\n                pacnt += 1;\r\n              }\r\n            }\r\n            pcnt += 1;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    return paths;\r\n  }\r\n\r\n  boundingboxincludes(parentbbox, childbbox) {\r\n    return (\r\n      parentbbox[0] < childbbox[0] &&\r\n      parentbbox[1] < childbbox[1] &&\r\n      parentbbox[2] > childbbox[2] &&\r\n      parentbbox[3] > childbbox[3]\r\n    );\r\n  }\r\n\r\n  batchpathscan(layers, pathomit) {\r\n    const bpaths = [];\r\n    for (const k in layers) {\r\n      if (!layers.hasOwnProperty(k)) {\r\n        continue;\r\n      }\r\n      bpaths[k] = this.pathscan(layers[k], pathomit);\r\n    }\r\n\r\n    return bpaths;\r\n  }\r\n\r\n  internodes(paths, options) {\r\n    const ins = [];\r\n    let palen = 0;\r\n    let nextidx = 0;\r\n    let nextidx2 = 0;\r\n    let previdx = 0;\r\n    let previdx2 = 0;\r\n    let pacnt;\r\n    let pcnt;\r\n    for (pacnt = 0; pacnt < paths.length; pacnt += 1) {\r\n      ins[pacnt] = {};\r\n      ins[pacnt].points = [];\r\n      ins[pacnt].boundingbox = paths[pacnt].boundingbox;\r\n      ins[pacnt].holechildren = paths[pacnt].holechildren;\r\n      ins[pacnt].isholepath = paths[pacnt].isholepath;\r\n      palen = paths[pacnt].points.length;\r\n\r\n      for (pcnt = 0; pcnt < palen; pcnt += 1) {\r\n        nextidx = (pcnt + 1) % palen;\r\n        nextidx2 = (pcnt + 2) % palen;\r\n        previdx = (pcnt - 1 + palen) % palen;\r\n        previdx2 = (pcnt - 2 + palen) % palen;\r\n\r\n        if (\r\n          options.rightangleenhance &&\r\n          this.testrightangle(paths[pacnt], previdx2, previdx, pcnt, nextidx, nextidx2)\r\n        ) {\r\n          if (ins[pacnt].points.length > 0) {\r\n            ins[pacnt].points[ins[pacnt].points.length - 1].linesegment = this.getdirection(\r\n              ins[pacnt].points[ins[pacnt].points.length - 1].x,\r\n              ins[pacnt].points[ins[pacnt].points.length - 1].y,\r\n              paths[pacnt].points[pcnt].x,\r\n              paths[pacnt].points[pcnt].y\r\n            );\r\n          }\r\n\r\n          ins[pacnt].points.push({\r\n            x: paths[pacnt].points[pcnt].x,\r\n            y: paths[pacnt].points[pcnt].y,\r\n            linesegment: this.getdirection(\r\n              paths[pacnt].points[pcnt].x,\r\n              paths[pacnt].points[pcnt].y,\r\n              (paths[pacnt].points[pcnt].x + paths[pacnt].points[nextidx].x) / 2,\r\n              (paths[pacnt].points[pcnt].y + paths[pacnt].points[nextidx].y) / 2\r\n            ),\r\n          });\r\n        }\r\n\r\n        ins[pacnt].points.push({\r\n          x: (paths[pacnt].points[pcnt].x + paths[pacnt].points[nextidx].x) / 2,\r\n          y: (paths[pacnt].points[pcnt].y + paths[pacnt].points[nextidx].y) / 2,\r\n          linesegment: this.getdirection(\r\n            (paths[pacnt].points[pcnt].x + paths[pacnt].points[nextidx].x) / 2,\r\n            (paths[pacnt].points[pcnt].y + paths[pacnt].points[nextidx].y) / 2,\r\n            (paths[pacnt].points[nextidx].x + paths[pacnt].points[nextidx2].x) / 2,\r\n            (paths[pacnt].points[nextidx].y + paths[pacnt].points[nextidx2].y) / 2\r\n          ),\r\n        });\r\n      }\r\n    }\r\n\r\n    return ins;\r\n  }\r\n\r\n  testrightangle(path, idx1, idx2, idx3, idx4, idx5) {\r\n    return (\r\n      (path.points[idx3].x === path.points[idx1].x &&\r\n        path.points[idx3].x === path.points[idx2].x &&\r\n        path.points[idx3].y === path.points[idx4].y &&\r\n        path.points[idx3].y === path.points[idx5].y) ||\r\n      (path.points[idx3].y === path.points[idx1].y &&\r\n        path.points[idx3].y === path.points[idx2].y &&\r\n        path.points[idx3].x === path.points[idx4].x &&\r\n        path.points[idx3].x === path.points[idx5].x)\r\n    );\r\n  }\r\n\r\n  getdirection(x1, y1, x2, y2) {\r\n    let val = 8;\r\n    if (x1 < x2) {\r\n      if (y1 < y2) {\r\n        val = 1;\r\n      } else if (y1 > y2) {\r\n        val = 7;\r\n      } else {\r\n        val = 0;\r\n      }\r\n    } else if (x1 > x2) {\r\n      if (y1 < y2) {\r\n        val = 3;\r\n      } else if (y1 > y2) {\r\n        val = 5;\r\n      } else {\r\n        val = 4;\r\n      }\r\n    } else if (y1 < y2) {\r\n      val = 2;\r\n    } else if (y1 > y2) {\r\n      val = 6;\r\n    } else {\r\n      val = 8;\r\n    }\r\n\r\n    return val;\r\n  }\r\n\r\n  batchinternodes(bpaths, options) {\r\n    const binternodes = [];\r\n    for (const k in bpaths) {\r\n      if (!bpaths.hasOwnProperty(k)) {\r\n        continue;\r\n      }\r\n      binternodes[k] = this.internodes(bpaths[k], options);\r\n    }\r\n\r\n    return binternodes;\r\n  }\r\n\r\n  tracepath(path, ltres, qtres) {\r\n    let pcnt = 0;\r\n    let segtype1;\r\n    let segtype2;\r\n    let seqend;\r\n    const smp = {};\r\n    smp.segments = [];\r\n    smp.boundingbox = path.boundingbox;\r\n    smp.holechildren = path.holechildren;\r\n    smp.isholepath = path.isholepath;\r\n\r\n    while (pcnt < path.points.length) {\r\n      segtype1 = path.points[pcnt].linesegment;\r\n      segtype2 = -1;\r\n      seqend = pcnt + 1;\r\n      while (\r\n        (path.points[seqend].linesegment === segtype1 ||\r\n          path.points[seqend].linesegment === segtype2 ||\r\n          segtype2 === -1) &&\r\n        seqend < path.points.length - 1\r\n      ) {\r\n        if (path.points[seqend].linesegment !== segtype1 && segtype2 === -1) {\r\n          segtype2 = path.points[seqend].linesegment;\r\n        }\r\n        seqend += 1;\r\n      }\r\n      if (seqend === path.points.length - 1) {\r\n        seqend = 0;\r\n      }\r\n\r\n      smp.segments = smp.segments.concat(this.fitseq(path, ltres, qtres, pcnt, seqend));\r\n\r\n      if (seqend > 0) {\r\n        pcnt = seqend;\r\n      } else {\r\n        pcnt = path.points.length;\r\n      }\r\n    }\r\n\r\n    return smp;\r\n  }\r\n\r\n  fitseq(path, ltres, qtres, seqstart, seqend) {\r\n    if (seqend > path.points.length || seqend < 0) {\r\n      return [];\r\n    }\r\n    let errorpoint = seqstart,\r\n      errorval = 0,\r\n      curvepass = true,\r\n      px,\r\n      py,\r\n      dist2;\r\n    let tl = seqend - seqstart;\r\n    if (tl < 0) {\r\n      tl += path.points.length;\r\n    }\r\n    let vx = (path.points[seqend].x - path.points[seqstart].x) / tl,\r\n      vy = (path.points[seqend].y - path.points[seqstart].y) / tl;\r\n    let pcnt = (seqstart + 1) % path.points.length,\r\n      pl;\r\n    while (pcnt != seqend) {\r\n      pl = pcnt - seqstart;\r\n      if (pl < 0) {\r\n        pl += path.points.length;\r\n      }\r\n      px = path.points[seqstart].x + vx * pl;\r\n      py = path.points[seqstart].y + vy * pl;\r\n      dist2 =\r\n        (path.points[pcnt].x - px) * (path.points[pcnt].x - px) +\r\n        (path.points[pcnt].y - py) * (path.points[pcnt].y - py);\r\n      if (dist2 > ltres) {\r\n        curvepass = false;\r\n      }\r\n      if (dist2 > errorval) {\r\n        errorpoint = pcnt;\r\n        errorval = dist2;\r\n      }\r\n      pcnt = (pcnt + 1) % path.points.length;\r\n    }\r\n    if (curvepass) {\r\n      return [\r\n        {\r\n          type: 'L',\r\n          x1: path.points[seqstart].x,\r\n          y1: path.points[seqstart].y,\r\n          x2: path.points[seqend].x,\r\n          y2: path.points[seqend].y,\r\n        },\r\n      ];\r\n    }\r\n    const fitpoint = errorpoint;\r\n    curvepass = true;\r\n    errorval = 0;\r\n    let t = (fitpoint - seqstart) / tl,\r\n      t1 = (1 - t) * (1 - t),\r\n      t2 = 2 * (1 - t) * t,\r\n      t3 = t * t;\r\n    let cpx =\r\n        (t1 * path.points[seqstart].x + t3 * path.points[seqend].x - path.points[fitpoint].x) / -t2,\r\n      cpy =\r\n        (t1 * path.points[seqstart].y + t3 * path.points[seqend].y - path.points[fitpoint].y) / -t2;\r\n    pcnt = seqstart + 1;\r\n    while (pcnt != seqend) {\r\n      t = (pcnt - seqstart) / tl;\r\n      t1 = (1 - t) * (1 - t);\r\n      t2 = 2 * (1 - t) * t;\r\n      t3 = t * t;\r\n      px = t1 * path.points[seqstart].x + t2 * cpx + t3 * path.points[seqend].x;\r\n      py = t1 * path.points[seqstart].y + t2 * cpy + t3 * path.points[seqend].y;\r\n      dist2 =\r\n        (path.points[pcnt].x - px) * (path.points[pcnt].x - px) +\r\n        (path.points[pcnt].y - py) * (path.points[pcnt].y - py);\r\n      if (dist2 > qtres) {\r\n        curvepass = false;\r\n      }\r\n      if (dist2 > errorval) {\r\n        errorpoint = pcnt;\r\n        errorval = dist2;\r\n      }\r\n      pcnt = (pcnt + 1) % path.points.length;\r\n    }\r\n    if (curvepass) {\r\n      return [\r\n        {\r\n          type: 'Q',\r\n          x1: path.points[seqstart].x,\r\n          y1: path.points[seqstart].y,\r\n          x2: cpx,\r\n          y2: cpy,\r\n          x3: path.points[seqend].x,\r\n          y3: path.points[seqend].y,\r\n        },\r\n      ];\r\n    }\r\n    const splitpoint = fitpoint;\r\n\r\n    return this.fitseq(path, ltres, qtres, seqstart, splitpoint).concat(\r\n      this.fitseq(path, ltres, qtres, splitpoint, seqend)\r\n    );\r\n  }\r\n\r\n  batchtracepaths(internodepaths, ltres, qtres) {\r\n    const btracedpaths = [];\r\n    for (const k in internodepaths) {\r\n      if (!internodepaths.hasOwnProperty(k)) {\r\n        continue;\r\n      }\r\n      btracedpaths.push(this.tracepath(internodepaths[k], ltres, qtres));\r\n    }\r\n\r\n    return btracedpaths;\r\n  }\r\n\r\n  batchtracelayers(binternodes, ltres, qtres) {\r\n    const btbis = [];\r\n    for (const k in binternodes) {\r\n      if (!binternodes.hasOwnProperty(k)) {\r\n        continue;\r\n      }\r\n      btbis[k] = this.batchtracepaths(binternodes[k], ltres, qtres);\r\n    }\r\n\r\n    return btbis;\r\n  }\r\n\r\n  roundtodec(val, places) {\r\n    return Number(val.toFixed(places));\r\n  }\r\n\r\n  svgpathstring(tracedata, lnum, pathnum, options) {\r\n    let layer = tracedata.layers[lnum],\r\n      smp = layer[pathnum],\r\n      str = '',\r\n      pcnt;\r\n    if (options.linefilter && smp.segments.length < 3) {\r\n      return str;\r\n    }\r\n    str = `<path ${options.desc ? `desc=\"l ${lnum} p ${pathnum}\" ` : ''}${this.tosvgcolorstr(\r\n      tracedata.palette[lnum],\r\n      options\r\n    )}d=\"`;\r\n    if (options.roundcoords === -1) {\r\n      str += `M ${smp.segments[0].x1 * options.scale} ${smp.segments[0].y1 * options.scale} `;\r\n      for (pcnt = 0; pcnt < smp.segments.length; pcnt++) {\r\n        str += `${smp.segments[pcnt].type} ${smp.segments[pcnt].x2 * options.scale} ${\r\n          smp.segments[pcnt].y2 * options.scale\r\n        } `;\r\n        if (smp.segments[pcnt].hasOwnProperty('x3')) {\r\n          str += `${smp.segments[pcnt].x3 * options.scale} ${\r\n            smp.segments[pcnt].y3 * options.scale\r\n          } `;\r\n        }\r\n      }\r\n      str += 'Z ';\r\n    } else {\r\n      str += `M ${this.roundtodec(\r\n        smp.segments[0].x1 * options.scale,\r\n        options.roundcoords\r\n      )} ${this.roundtodec(smp.segments[0].y1 * options.scale, options.roundcoords)} `;\r\n      for (pcnt = 0; pcnt < smp.segments.length; pcnt++) {\r\n        str += `${smp.segments[pcnt].type} ${this.roundtodec(\r\n          smp.segments[pcnt].x2 * options.scale,\r\n          options.roundcoords\r\n        )} ${this.roundtodec(smp.segments[pcnt].y2 * options.scale, options.roundcoords)} `;\r\n        if (smp.segments[pcnt].hasOwnProperty('x3')) {\r\n          str += `${this.roundtodec(\r\n            smp.segments[pcnt].x3 * options.scale,\r\n            options.roundcoords\r\n          )} ${this.roundtodec(smp.segments[pcnt].y3 * options.scale, options.roundcoords)} `;\r\n        }\r\n      }\r\n      str += 'Z ';\r\n    }\r\n    for (var hcnt = 0; hcnt < smp.holechildren.length; hcnt++) {\r\n      var hsmp = layer[smp.holechildren[hcnt]];\r\n\r\n      if (options.roundcoords === -1) {\r\n        if (hsmp.segments[hsmp.segments.length - 1].hasOwnProperty('x3')) {\r\n          str += `M ${hsmp.segments[hsmp.segments.length - 1].x3 * options.scale} ${\r\n            hsmp.segments[hsmp.segments.length - 1].y3 * options.scale\r\n          } `;\r\n        } else {\r\n          str += `M ${hsmp.segments[hsmp.segments.length - 1].x2 * options.scale} ${\r\n            hsmp.segments[hsmp.segments.length - 1].y2 * options.scale\r\n          } `;\r\n        }\r\n        for (pcnt = hsmp.segments.length - 1; pcnt >= 0; pcnt--) {\r\n          str += `${hsmp.segments[pcnt].type} `;\r\n          if (hsmp.segments[pcnt].hasOwnProperty('x3')) {\r\n            str += `${hsmp.segments[pcnt].x2 * options.scale} ${\r\n              hsmp.segments[pcnt].y2 * options.scale\r\n            } `;\r\n          }\r\n          str += `${hsmp.segments[pcnt].x1 * options.scale} ${\r\n            hsmp.segments[pcnt].y1 * options.scale\r\n          } `;\r\n        }\r\n      } else {\r\n        if (hsmp.segments[hsmp.segments.length - 1].hasOwnProperty('x3')) {\r\n          str += `M ${this.roundtodec(\r\n            hsmp.segments[hsmp.segments.length - 1].x3 * options.scale\r\n          )} ${this.roundtodec(hsmp.segments[hsmp.segments.length - 1].y3 * options.scale)} `;\r\n        } else {\r\n          str += `M ${this.roundtodec(\r\n            hsmp.segments[hsmp.segments.length - 1].x2 * options.scale\r\n          )} ${this.roundtodec(hsmp.segments[hsmp.segments.length - 1].y2 * options.scale)} `;\r\n        }\r\n        for (pcnt = hsmp.segments.length - 1; pcnt >= 0; pcnt--) {\r\n          str += `${hsmp.segments[pcnt].type} `;\r\n          if (hsmp.segments[pcnt].hasOwnProperty('x3')) {\r\n            str += `${this.roundtodec(hsmp.segments[pcnt].x2 * options.scale)} ${this.roundtodec(\r\n              hsmp.segments[pcnt].y2 * options.scale\r\n            )} `;\r\n          }\r\n          str += `${this.roundtodec(hsmp.segments[pcnt].x1 * options.scale)} ${this.roundtodec(\r\n            hsmp.segments[pcnt].y1 * options.scale\r\n          )} `;\r\n        }\r\n      }\r\n      str += 'Z ';\r\n    }\r\n    str += '\" />';\r\n    if (options.lcpr || options.qcpr) {\r\n      for (pcnt = 0; pcnt < smp.segments.length; pcnt++) {\r\n        if (smp.segments[pcnt].hasOwnProperty('x3') && options.qcpr) {\r\n          str += `<circle cx=\"${smp.segments[pcnt].x2 * options.scale}\" cy=\"${\r\n            smp.segments[pcnt].y2 * options.scale\r\n          }\" r=\"${options.qcpr}\" fill=\"cyan\" stroke-width=\"${\r\n            options.qcpr * 0.2\r\n          }\" stroke=\"black\" />`;\r\n          str += `<circle cx=\"${smp.segments[pcnt].x3 * options.scale}\" cy=\"${\r\n            smp.segments[pcnt].y3 * options.scale\r\n          }\" r=\"${options.qcpr}\" fill=\"white\" stroke-width=\"${\r\n            options.qcpr * 0.2\r\n          }\" stroke=\"black\" />`;\r\n          str += `<line x1=\"${smp.segments[pcnt].x1 * options.scale}\" y1=\"${\r\n            smp.segments[pcnt].y1 * options.scale\r\n          }\" x2=\"${smp.segments[pcnt].x2 * options.scale}\" y2=\"${\r\n            smp.segments[pcnt].y2 * options.scale\r\n          }\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"cyan\" />`;\r\n          str += `<line x1=\"${smp.segments[pcnt].x2 * options.scale}\" y1=\"${\r\n            smp.segments[pcnt].y2 * options.scale\r\n          }\" x2=\"${smp.segments[pcnt].x3 * options.scale}\" y2=\"${\r\n            smp.segments[pcnt].y3 * options.scale\r\n          }\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"cyan\" />`;\r\n        }\r\n        if (!smp.segments[pcnt].hasOwnProperty('x3') && options.lcpr) {\r\n          str += `<circle cx=\"${smp.segments[pcnt].x2 * options.scale}\" cy=\"${\r\n            smp.segments[pcnt].y2 * options.scale\r\n          }\" r=\"${options.lcpr}\" fill=\"white\" stroke-width=\"${\r\n            options.lcpr * 0.2\r\n          }\" stroke=\"black\" />`;\r\n        }\r\n      }\r\n\r\n      for (var hcnt = 0; hcnt < smp.holechildren.length; hcnt++) {\r\n        var hsmp = layer[smp.holechildren[hcnt]];\r\n        for (pcnt = 0; pcnt < hsmp.segments.length; pcnt++) {\r\n          if (hsmp.segments[pcnt].hasOwnProperty('x3') && options.qcpr) {\r\n            str += `<circle cx=\"${hsmp.segments[pcnt].x2 * options.scale}\" cy=\"${\r\n              hsmp.segments[pcnt].y2 * options.scale\r\n            }\" r=\"${options.qcpr}\" fill=\"cyan\" stroke-width=\"${\r\n              options.qcpr * 0.2\r\n            }\" stroke=\"black\" />`;\r\n            str += `<circle cx=\"${hsmp.segments[pcnt].x3 * options.scale}\" cy=\"${\r\n              hsmp.segments[pcnt].y3 * options.scale\r\n            }\" r=\"${options.qcpr}\" fill=\"white\" stroke-width=\"${\r\n              options.qcpr * 0.2\r\n            }\" stroke=\"black\" />`;\r\n            str += `<line x1=\"${hsmp.segments[pcnt].x1 * options.scale}\" y1=\"${\r\n              hsmp.segments[pcnt].y1 * options.scale\r\n            }\" x2=\"${hsmp.segments[pcnt].x2 * options.scale}\" y2=\"${\r\n              hsmp.segments[pcnt].y2 * options.scale\r\n            }\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"cyan\" />`;\r\n            str += `<line x1=\"${hsmp.segments[pcnt].x2 * options.scale}\" y1=\"${\r\n              hsmp.segments[pcnt].y2 * options.scale\r\n            }\" x2=\"${hsmp.segments[pcnt].x3 * options.scale}\" y2=\"${\r\n              hsmp.segments[pcnt].y3 * options.scale\r\n            }\" stroke-width=\"${options.qcpr * 0.2}\" stroke=\"cyan\" />`;\r\n          }\r\n          if (!hsmp.segments[pcnt].hasOwnProperty('x3') && options.lcpr) {\r\n            str += `<circle cx=\"${hsmp.segments[pcnt].x2 * options.scale}\" cy=\"${\r\n              hsmp.segments[pcnt].y2 * options.scale\r\n            }\" r=\"${options.lcpr}\" fill=\"white\" stroke-width=\"${\r\n              options.lcpr * 0.2\r\n            }\" stroke=\"black\" />`;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    return str;\r\n  }\r\n\r\n  getsvgstring(tracedata, options) {\r\n    options = this.checkoptions(options);\r\n    const w = tracedata.width * options.scale;\r\n    const h = tracedata.height * options.scale;\r\n\r\n    let svgstr = `<svg ${\r\n      options.viewbox ? `viewBox=\"0 0 ${w} ${h}\" ` : `width=\"${w}\" height=\"${h}\" `\r\n    }version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" desc=\"Created with imagetracer.js version ${\r\n      this.versionnumber\r\n    }\" >`;\r\n    for (let lcnt = 0; lcnt < tracedata.layers.length; lcnt += 1) {\r\n      for (let pcnt = 0; pcnt < tracedata.layers[lcnt].length; pcnt += 1) {\r\n        if (!tracedata.layers[lcnt][pcnt].isholepath) {\r\n          svgstr += this.svgpathstring(tracedata, lcnt, pcnt, options);\r\n        }\r\n      }\r\n    }\r\n    svgstr += '</svg>';\r\n\r\n    return svgstr;\r\n  }\r\n\r\n  compareNumbers(a, b) {\r\n    return a - b;\r\n  }\r\n\r\n  torgbastr(c) {\r\n    return `rgba(${c.r},${c.g},${c.b},${c.a})`;\r\n  }\r\n\r\n  tosvgcolorstr(c, options) {\r\n    return `fill=\"rgb(${c.r},${c.g},${c.b})\" stroke=\"rgb(${c.r},${c.g},${c.b})\" stroke-width=\"${\r\n      options.strokewidth\r\n    }\" opacity=\"${c.a / 255.0}\" `;\r\n  }\r\n\r\n  appendSVGString(svgstr, parentid) {\r\n    let div;\r\n    if (parentid) {\r\n      div = document.getElementById(parentid);\r\n      if (!div) {\r\n        div = document.createElement('div');\r\n        div.id = parentid;\r\n        document.body.appendChild(div);\r\n      }\r\n    } else {\r\n      div = document.createElement('div');\r\n      document.body.appendChild(div);\r\n    }\r\n    div.innerHTML += svgstr;\r\n  }\r\n\r\n  blur(imgd, radius, delta) {\r\n    let i, j, k, d, idx, racc, gacc, bacc, aacc, wacc;\r\n    const imgd2 = { width: imgd.width, height: imgd.height, data: [] };\r\n    radius = Math.floor(radius);\r\n    if (radius < 1) {\r\n      return imgd;\r\n    }\r\n    if (radius > 5) {\r\n      radius = 5;\r\n    }\r\n    delta = Math.abs(delta);\r\n    if (delta > 1024) {\r\n      delta = 1024;\r\n    }\r\n    const thisgk = this.gks[radius - 1];\r\n    for (j = 0; j < imgd.height; j++) {\r\n      for (i = 0; i < imgd.width; i++) {\r\n        racc = 0;\r\n        gacc = 0;\r\n        bacc = 0;\r\n        aacc = 0;\r\n        wacc = 0;\r\n\r\n        for (k = -radius; k < radius + 1; k++) {\r\n          if (i + k > 0 && i + k < imgd.width) {\r\n            idx = (j * imgd.width + i + k) * 4;\r\n            racc += imgd.data[idx] * thisgk[k + radius];\r\n            gacc += imgd.data[idx + 1] * thisgk[k + radius];\r\n            bacc += imgd.data[idx + 2] * thisgk[k + radius];\r\n            aacc += imgd.data[idx + 3] * thisgk[k + radius];\r\n            wacc += thisgk[k + radius];\r\n          }\r\n        }\r\n\r\n        idx = (j * imgd.width + i) * 4;\r\n        imgd2.data[idx] = Math.floor(racc / wacc);\r\n        imgd2.data[idx + 1] = Math.floor(gacc / wacc);\r\n        imgd2.data[idx + 2] = Math.floor(bacc / wacc);\r\n        imgd2.data[idx + 3] = Math.floor(aacc / wacc);\r\n      }\r\n    }\r\n    const himgd = new Uint8ClampedArray(imgd2.data);\r\n    for (j = 0; j < imgd.height; j++) {\r\n      for (i = 0; i < imgd.width; i++) {\r\n        racc = 0;\r\n        gacc = 0;\r\n        bacc = 0;\r\n        aacc = 0;\r\n        wacc = 0;\r\n\r\n        for (k = -radius; k < radius + 1; k++) {\r\n          if (j + k > 0 && j + k < imgd.height) {\r\n            idx = ((j + k) * imgd.width + i) * 4;\r\n            racc += himgd[idx] * thisgk[k + radius];\r\n            gacc += himgd[idx + 1] * thisgk[k + radius];\r\n            bacc += himgd[idx + 2] * thisgk[k + radius];\r\n            aacc += himgd[idx + 3] * thisgk[k + radius];\r\n            wacc += thisgk[k + radius];\r\n          }\r\n        }\r\n\r\n        idx = (j * imgd.width + i) * 4;\r\n        imgd2.data[idx] = Math.floor(racc / wacc);\r\n        imgd2.data[idx + 1] = Math.floor(gacc / wacc);\r\n        imgd2.data[idx + 2] = Math.floor(bacc / wacc);\r\n        imgd2.data[idx + 3] = Math.floor(aacc / wacc);\r\n      }\r\n    }\r\n    for (j = 0; j < imgd.height; j++) {\r\n      for (i = 0; i < imgd.width; i++) {\r\n        idx = (j * imgd.width + i) * 4;\r\n\r\n        d =\r\n          Math.abs(imgd2.data[idx] - imgd.data[idx]) +\r\n          Math.abs(imgd2.data[idx + 1] - imgd.data[idx + 1]) +\r\n          Math.abs(imgd2.data[idx + 2] - imgd.data[idx + 2]) +\r\n          Math.abs(imgd2.data[idx + 3] - imgd.data[idx + 3]);\r\n\r\n        if (d > delta) {\r\n          imgd2.data[idx] = imgd.data[idx];\r\n          imgd2.data[idx + 1] = imgd.data[idx + 1];\r\n          imgd2.data[idx + 2] = imgd.data[idx + 2];\r\n          imgd2.data[idx + 3] = imgd.data[idx + 3];\r\n        }\r\n      }\r\n    }\r\n\r\n    return imgd2;\r\n  }\r\n\r\n  loadImage(url, callback, options) {\r\n    const img = new Image();\r\n    if (options && options.corsenabled) {\r\n      img.crossOrigin = 'Anonymous';\r\n    }\r\n    img.src = url;\r\n    img.onload = function () {\r\n      const canvas = document.createElement('canvas');\r\n      canvas.width = img.width;\r\n      canvas.height = img.height;\r\n      const context = canvas.getContext('2d');\r\n      context.drawImage(img, 0, 0);\r\n      callback(canvas);\r\n    };\r\n  }\r\n\r\n  getImgdata(canvas) {\r\n    const context = canvas.getContext('2d');\r\n\r\n    return context.getImageData(0, 0, canvas.width, canvas.height);\r\n  }\r\n\r\n  drawLayers(layers, palette, scale, parentid) {\r\n    scale = scale || 1;\r\n    let w, h, i, j, k;\r\n    let div;\r\n    if (parentid) {\r\n      div = document.getElementById(parentid);\r\n      if (!div) {\r\n        div = document.createElement('div');\r\n        div.id = parentid;\r\n        document.body.appendChild(div);\r\n      }\r\n    } else {\r\n      div = document.createElement('div');\r\n      document.body.appendChild(div);\r\n    }\r\n    for (k in layers) {\r\n      if (!layers.hasOwnProperty(k)) {\r\n        continue;\r\n      }\r\n\r\n      w = layers[k][0].length;\r\n      h = layers[k].length;\r\n\r\n      const canvas = document.createElement('canvas');\r\n      canvas.width = w * scale;\r\n      canvas.height = h * scale;\r\n      const context = canvas.getContext('2d');\r\n\r\n      for (j = 0; j < h; j += 1) {\r\n        for (i = 0; i < w; i += 1) {\r\n          context.fillStyle = this.torgbastr(palette[layers[k][j][i] % palette.length]);\r\n          context.fillRect(i * scale, j * scale, scale, scale);\r\n        }\r\n      }\r\n\r\n      div.appendChild(canvas);\r\n    }\r\n  }\r\n}\r\n"]},"metadata":{},"sourceType":"module"}