File: //home/madepabj/public_html/wp-content/themes/rehub-theme/js/MotionPathHelper.min.js.map
{"version":3,"file":"MotionPathHelper.min.js","sources":["../src/utils/paths.js","../src/utils/matrix.js","../src/utils/PathEditor.js","../src/MotionPathHelper.js"],"sourcesContent":["/*!\n * paths 3.4.2\n * https://greensock.com\n *\n * Copyright 2008-2020, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, [email protected]\n*/\n/* eslint-disable */\n\nlet _svgPathExp = /[achlmqstvz]|(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[0-9]/ig,\n\t_numbersExp = /(?:(-)?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[0-9]/ig,\n\t_scientific = /[\\+\\-]?\\d*\\.?\\d+e[\\+\\-]?\\d+/ig,\n\t_selectorExp = /(^[#\\.][a-z]|[a-y][a-z])/i,\n\t_DEG2RAD = Math.PI / 180,\n\t_RAD2DEG = 180 / Math.PI,\n\t_sin = Math.sin,\n\t_cos = Math.cos,\n\t_abs = Math.abs,\n\t_sqrt = Math.sqrt,\n\t_atan2 = Math.atan2,\n\t_largeNum = 1e8,\n\t_isString = value => typeof(value) === \"string\",\n\t_isNumber = value => typeof(value) === \"number\",\n\t_isUndefined = value => typeof(value) === \"undefined\",\n\t_temp = {},\n\t_temp2 = {},\n\t_roundingNum = 1e5,\n\t_wrapProgress = progress => (Math.round((progress + _largeNum) % 1 * _roundingNum) / _roundingNum) || ((progress < 0) ? 0 : 1), //if progress lands on 1, the % will make it 0 which is why we || 1, but not if it's negative because it makes more sense for motion to end at 0 in that case.\n\t_round = value => (Math.round(value * _roundingNum) / _roundingNum) || 0,\n\t_splitSegment = (rawPath, segIndex, i, t) => {\n\t\tlet segment = rawPath[segIndex],\n\t\t\tshift = t === 1 ? 6 : subdivideSegment(segment, i, t);\n\t\tif (shift && shift + i + 2 < segment.length) {\n\t\t\trawPath.splice(segIndex, 0, segment.slice(0, i + shift + 2));\n\t\t\tsegment.splice(0, i + shift);\n\t\t\treturn 1;\n\t\t}\n\t},\n\t_reverseRawPath = (rawPath, skipOuter) => {\n\t\tlet i = rawPath.length;\n\t\tif (!skipOuter) {\n\t\t\trawPath.reverse();\n\t\t}\n\t\twhile (i--) {\n\t\t\tif (!rawPath[i].reversed) {\n\t\t\t\treverseSegment(rawPath[i]);\n\t\t\t}\n\t\t}\n\t},\n\t_copyMetaData = (source, copy) => {\n\t\tcopy.totalLength = source.totalLength;\n\t\tif (source.samples) { //segment\n\t\t\tcopy.samples = source.samples.slice(0);\n\t\t\tcopy.lookup = source.lookup.slice(0);\n\t\t\tcopy.minLength = source.minLength;\n\t\t\tcopy.resolution = source.resolution;\n\t\t} else { //rawPath\n\t\t\tcopy.totalPoints = source.totalPoints;\n\t\t}\n\t\treturn copy;\n\t},\n\t//pushes a new segment into a rawPath, but if its starting values match the ending values of the last segment, it'll merge it into that same segment (to reduce the number of segments)\n\t_appendOrMerge = (rawPath, segment) => {\n\t\tlet index = rawPath.length,\n\t\t\tprevSeg = rawPath[index - 1] || [],\n\t\t\tl = prevSeg.length;\n\t\tif (segment[0] === prevSeg[l-2] && segment[1] === prevSeg[l-1]) {\n\t\t\tsegment = prevSeg.concat(segment.slice(2));\n\t\t\tindex--;\n\t\t}\n\t\trawPath[index] = segment;\n\t},\n\t_bestDistance;\n\n/* TERMINOLOGY\n - RawPath - an array of arrays, one for each Segment. A single RawPath could have multiple \"M\" commands, defining Segments (paths aren't always connected).\n - Segment - an array containing a sequence of Cubic Bezier coordinates in alternating x, y, x, y format. Starting anchor, then control point 1, control point 2, and ending anchor, then the next control point 1, control point 2, anchor, etc. Uses less memory than an array with a bunch of {x, y} points.\n - Bezier - a single cubic Bezier with a starting anchor, two control points, and an ending anchor.\n - the variable \"t\" is typically the position along an individual Bezier path (time) and it's NOT linear, meaning it could accelerate/decelerate based on the control points whereas the \"p\" or \"progress\" value is linearly mapped to the whole path, so it shouldn't really accelerate/decelerate based on control points. So a progress of 0.2 would be almost exactly 20% along the path. \"t\" is ONLY in an individual Bezier piece.\n */\n\n//accepts basic selector text, a path instance, a RawPath instance, or a Segment and returns a RawPath (makes it easy to homogenize things). If an element or selector text is passed in, it'll also cache the value so that if it's queried again, it'll just take the path data from there instead of parsing it all over again (as long as the path data itself hasn't changed - it'll check).\nexport function getRawPath(value) {\n\tvalue = (_isString(value) && _selectorExp.test(value)) ? document.querySelector(value) || value : value;\n\tlet e = value.getAttribute ? value : 0,\n\t\trawPath;\n\tif (e && (value = value.getAttribute(\"d\"))) {\n\t\t//implements caching\n\t\tif (!e._gsPath) {\n\t\t\te._gsPath = {};\n\t\t}\n\t\trawPath = e._gsPath[value];\n\t\treturn (rawPath && !rawPath._dirty) ? rawPath : (e._gsPath[value] = stringToRawPath(value));\n\t}\n\treturn !value ? console.warn(\"Expecting a <path> element or an SVG path data string\") : _isString(value) ? stringToRawPath(value) : (_isNumber(value[0])) ? [value] : value;\n}\n\n//copies a RawPath WITHOUT the length meta data (for speed)\nexport function copyRawPath(rawPath) {\n\tlet a = [],\n\t\ti = 0;\n\tfor (; i < rawPath.length; i++) {\n\t\ta[i] = _copyMetaData(rawPath[i], rawPath[i].slice(0));\n\t}\n\treturn _copyMetaData(rawPath, a);\n}\n\nexport function reverseSegment(segment) {\n\tlet i = 0,\n\t\ty;\n\tsegment.reverse(); //this will invert the order y, x, y, x so we must flip it back.\n\tfor (; i < segment.length; i += 2) {\n\t\ty = segment[i];\n\t\tsegment[i] = segment[i+1];\n\t\tsegment[i+1] = y;\n\t}\n\tsegment.reversed = !segment.reversed;\n}\n\n\n\nlet _createPath = (e, ignore) => {\n\t\tlet path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\"),\n\t\t\tattr = [].slice.call(e.attributes),\n\t\t\ti = attr.length,\n\t\t\tname;\n\t\tignore = \",\" + ignore + \",\";\n\t\twhile (--i > -1) {\n\t\t\tname = attr[i].nodeName.toLowerCase(); //in Microsoft Edge, if you don't set the attribute with a lowercase name, it doesn't render correctly! Super weird.\n\t\t\tif (ignore.indexOf(\",\" + name + \",\") < 0) {\n\t\t\t\tpath.setAttributeNS(null, name, attr[i].nodeValue);\n\t\t\t}\n\t\t}\n\t\treturn path;\n\t},\n\t_typeAttrs = {\n\t\trect:\"rx,ry,x,y,width,height\",\n\t\tcircle:\"r,cx,cy\",\n\t\tellipse:\"rx,ry,cx,cy\",\n\t\tline:\"x1,x2,y1,y2\"\n\t},\n\t_attrToObj = (e, attrs) => {\n\t\tlet props = attrs ? attrs.split(\",\") : [],\n\t\t\tobj = {},\n\t\t\ti = props.length;\n\t\twhile (--i > -1) {\n\t\t\tobj[props[i]] = +e.getAttribute(props[i]) || 0;\n\t\t}\n\t\treturn obj;\n\t};\n\n//converts an SVG shape like <circle>, <rect>, <polygon>, <polyline>, <ellipse>, etc. to a <path>, swapping it in and copying the attributes to match.\nexport function convertToPath(element, swap) {\n\tlet type = element.tagName.toLowerCase(),\n\t\tcirc = 0.552284749831,\n\t\tdata, x, y, r, ry, path, rcirc, rycirc, points, w, h, x2, x3, x4, x5, x6, y2, y3, y4, y5, y6, attr;\n\tif (type === \"path\" || !element.getBBox) {\n\t\treturn element;\n\t}\n\tpath = _createPath(element, \"x,y,width,height,cx,cy,rx,ry,r,x1,x2,y1,y2,points\");\n\tattr = _attrToObj(element, _typeAttrs[type]);\n\tif (type === \"rect\") {\n\t\tr = attr.rx;\n\t\try = attr.ry || r;\n\t\tx = attr.x;\n\t\ty = attr.y;\n\t\tw = attr.width - r * 2;\n\t\th = attr.height - ry * 2;\n\t\tif (r || ry) { //if there are rounded corners, render cubic beziers\n\t\t\tx2 = x + r * (1 - circ);\n\t\t\tx3 = x + r;\n\t\t\tx4 = x3 + w;\n\t\t\tx5 = x4 + r * circ;\n\t\t\tx6 = x4 + r;\n\t\t\ty2 = y + ry * (1 - circ);\n\t\t\ty3 = y + ry;\n\t\t\ty4 = y3 + h;\n\t\t\ty5 = y4 + ry * circ;\n\t\t\ty6 = y4 + ry;\n\t\t\tdata = \"M\" + x6 + \",\" + y3 + \" V\" + y4 + \" C\" + [x6, y5, x5, y6, x4, y6, x4 - (x4 - x3) / 3, y6, x3 + (x4 - x3) / 3, y6, x3, y6, x2, y6, x, y5, x, y4, x, y4 - (y4 - y3) / 3, x, y3 + (y4 - y3) / 3, x, y3, x, y2, x2, y, x3, y, x3 + (x4 - x3) / 3, y, x4 - (x4 - x3) / 3, y, x4, y, x5, y, x6, y2, x6, y3].join(\",\") + \"z\";\n\t\t} else {\n\t\t\tdata = \"M\" + (x + w) + \",\" + y + \" v\" + h + \" h\" + (-w) + \" v\" + (-h) + \" h\" + w + \"z\";\n\t\t}\n\n\t} else if (type === \"circle\" || type === \"ellipse\") {\n\t\tif (type === \"circle\") {\n\t\t\tr = ry = attr.r;\n\t\t\trycirc = r * circ;\n\t\t} else {\n\t\t\tr = attr.rx;\n\t\t\try = attr.ry;\n\t\t\trycirc = ry * circ;\n\t\t}\n\t\tx = attr.cx;\n\t\ty = attr.cy;\n\t\trcirc = r * circ;\n\t\tdata = \"M\" + (x+r) + \",\" + y + \" C\" + [x+r, y + rycirc, x + rcirc, y + ry, x, y + ry, x - rcirc, y + ry, x - r, y + rycirc, x - r, y, x - r, y - rycirc, x - rcirc, y - ry, x, y - ry, x + rcirc, y - ry, x + r, y - rycirc, x + r, y].join(\",\") + \"z\";\n\t} else if (type === \"line\") {\n\t\tdata = \"M\" + attr.x1 + \",\" + attr.y1 + \" L\" + attr.x2 + \",\" + attr.y2; //previously, we just converted to \"Mx,y Lx,y\" but Safari has bugs that cause that not to render properly when using a stroke-dasharray that's not fully visible! Using a cubic bezier fixes that issue.\n\t} else if (type === \"polyline\" || type === \"polygon\") {\n\t\tpoints = (element.getAttribute(\"points\") + \"\").match(_numbersExp) || [];\n\t\tx = points.shift();\n\t\ty = points.shift();\n\t\tdata = \"M\" + x + \",\" + y + \" L\" + points.join(\",\");\n\t\tif (type === \"polygon\") {\n\t\t\tdata += \",\" + x + \",\" + y + \"z\";\n\t\t}\n\t}\n\tpath.setAttribute(\"d\", rawPathToString(path._gsRawPath = stringToRawPath(data)));\n\tif (swap && element.parentNode) {\n\t\telement.parentNode.insertBefore(path, element);\n\t\telement.parentNode.removeChild(element);\n\t}\n\treturn path;\n}\n\n\n\n//returns the rotation (in degrees) at a particular progress on a rawPath (the slope of the tangent)\nexport function getRotationAtProgress(rawPath, progress) {\n\tlet d = getProgressData(rawPath, progress >= 1 ? 1 - 1e-9 : progress ? progress : 1e-9);\n\treturn getRotationAtBezierT(d.segment, d.i, d.t);\n}\n\nfunction getRotationAtBezierT(segment, i, t) {\n\tlet a = segment[i],\n\t\tb = segment[i+2],\n\t\tc = segment[i+4],\n\t\tx;\n\ta += (b - a) * t;\n\tb += (c - b) * t;\n\ta += (b - a) * t;\n\tx = b + ((c + (segment[i+6] - c) * t) - b) * t - a;\n\ta = segment[i+1];\n\tb = segment[i+3];\n\tc = segment[i+5];\n\ta += (b - a) * t;\n\tb += (c - b) * t;\n\ta += (b - a) * t;\n\treturn _round(_atan2(b + ((c + (segment[i+7] - c) * t) - b) * t - a, x) * _RAD2DEG);\n}\n\nexport function sliceRawPath(rawPath, start, end) {\n\tif (_isUndefined(end)) {\n\t\tend = 1;\n\t}\n\tstart = start || 0;\n\tlet reverse = start > end,\n\t\tloops = Math.max(0, ~~(_abs(end - start) - 1e-8));\n\tif (reverse) {\n\t\treverse = end;\n\t\tend = start;\n\t\tstart = reverse;\n\t\treverse = 1;\n\t\tloops -= loops ? 1 : 0;\n\t}\n\tif (start < 0 || end < 0) {\n\t\tlet offset = ~~Math.min(start, end) + 1;\n\t\tstart += offset;\n\t\tend += offset;\n\t}\n\tlet path = copyRawPath(rawPath.totalLength ? rawPath : cacheRawPathMeasurements(rawPath)),\n\t\twrap = (end > 1),\n\t\ts = getProgressData(path, start, _temp, true),\n\t\te = getProgressData(path, end, _temp2),\n\t\teSeg = e.segment,\n\t\tsSeg = s.segment,\n\t\teSegIndex = e.segIndex,\n\t\tsSegIndex = s.segIndex,\n\t\tei = e.i,\n\t\tsi = s.i,\n\t\tsameSegment = (sSegIndex === eSegIndex),\n\t\tsameBezier = (ei === si && sameSegment),\n\t\tinvertedOrder = ((sameSegment && si > ei) || (sameBezier && s.t > e.t)),\n\t\tsShift, eShift, i, copy, totalSegments, l, j;\n\tif (wrap || loops) {\n\t\tif (_splitSegment(path, sSegIndex, si, s.t)) {\n\t\t\tsShift = 1;\n\t\t\tsSegIndex++;\n\t\t\tif (sameBezier) {\n\t\t\t\tif (invertedOrder) {\n\t\t\t\t\te.t /= s.t;\n\t\t\t\t} else {\n\t\t\t\t\te.t = (e.t - s.t) / (1 - s.t);\n\t\t\t\t\teSegIndex++;\n\t\t\t\t\tei = 0;\n\t\t\t\t}\n\t\t\t} else if (sSegIndex <= eSegIndex + 1 && !invertedOrder) {\n\t\t\t\teSegIndex++;\n\t\t\t\tif (sameSegment) {\n\t\t\t\t\tei -= si;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!e.t) {\n\t\t\teSegIndex--;\n\t\t\tif (reverse) {\n\t\t\t\tsSegIndex--;\n\t\t\t}\n\t\t} else if (_splitSegment(path, eSegIndex, ei, e.t)) {\n\t\t\tif (invertedOrder && sShift) {\n\t\t\t\tsSegIndex++;\n\t\t\t}\n\t\t\tif (reverse) {\n\t\t\t\teSegIndex++;\n\t\t\t}\n\t\t}\n\t\tcopy = [];\n\t\ttotalSegments = path.length;\n\t\tl = 1 + totalSegments * loops;\n\t\tj = sSegIndex;\n\t\tif (reverse) {\n\t\t\teSegIndex = (eSegIndex || totalSegments) - 1;\n\t\t\tl += (totalSegments - eSegIndex + sSegIndex) % totalSegments;\n\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t_appendOrMerge(copy, path[j]);\n\t\t\t\tj = (j || totalSegments) - 1;\n\t\t\t}\n\t\t} else {\n\t\t\tl += ((totalSegments - sSegIndex) + eSegIndex) % totalSegments;\n\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t_appendOrMerge(copy, path[j++ % totalSegments]);\n\t\t\t}\n\t\t}\n\t\tpath = copy;\n\t} else {\n\t\teShift = e.t === 1 ? 6 : subdivideSegment(eSeg, ei, e.t);\n\t\tif (start !== end) {\n\t\t\tsShift = subdivideSegment(sSeg, si, sameBezier ? s.t / e.t : s.t);\n\t\t\tif (sameSegment) {\n\t\t\t\teShift += sShift;\n\t\t\t}\n\t\t\teSeg.splice(ei + eShift + 2);\n\t\t\tif (sShift || si) {\n\t\t\t\tsSeg.splice(0, si + sShift);\n\t\t\t}\n\t\t\ti = path.length;\n\t\t\twhile (i--) {\n\t\t\t\t//chop off any extra segments\n\t\t\t\tif (i < sSegIndex || i > eSegIndex) {\n\t\t\t\t\tpath.splice(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\teSeg.angle = getRotationAtBezierT(eSeg, ei + eShift, 0); //record the value before we chop because it'll be impossible to determine the angle after its length is 0!\n\t\t\tei += eShift;\n\t\t\ts = eSeg[ei];\n\t\t\te = eSeg[ei+1];\n\t\t\teSeg.length = eSeg.totalLength = 0;\n\t\t\teSeg.totalPoints = path.totalPoints = 8;\n\t\t\teSeg.push(s, e, s, e, s, e, s, e);\n\t\t}\n\t}\n\tif (reverse) {\n\t\t_reverseRawPath(path, wrap || loops);\n\t}\n\tpath.totalLength = 0;\n\treturn path;\n}\n\n//measures a Segment according to its resolution (so if segment.resolution is 6, for example, it'll take 6 samples equally across each Bezier) and create/populate a \"samples\" array that has the length up to each of those sample points (always increasing from the start) as well as a \"lookup\" array that's broken up according to the smallest distance between 2 samples. This gives us a very fast way of looking up a progress position rather than looping through all the points/Beziers. You can optionally have it only measure a subset, starting at startIndex and going for a specific number of beziers (remember, there are 3 x/y pairs each, for a total of 6 elements for each Bezier). It will also populate a \"totalLength\" property, but that's not generally super accurate because by default it'll only take 6 samples per Bezier. But for performance reasons, it's perfectly adequate for measuring progress values along the path. If you need a more accurate totalLength, either increase the resolution or use the more advanced bezierToPoints() method which keeps adding points until they don't deviate by more than a certain precision value.\nfunction measureSegment(segment, startIndex, bezierQty) {\n\tstartIndex = startIndex || 0;\n\tif (!segment.samples) {\n\t\tsegment.samples = [];\n\t\tsegment.lookup = [];\n\t}\n\tlet resolution = ~~segment.resolution || 12,\n\t\tinc = 1 / resolution,\n\t\tendIndex = bezierQty ? startIndex + bezierQty * 6 + 1 : segment.length,\n\t\tx1 = segment[startIndex],\n\t\ty1 = segment[startIndex + 1],\n\t\tsamplesIndex = startIndex ? (startIndex / 6) * resolution : 0,\n\t\tsamples = segment.samples,\n\t\tlookup = segment.lookup,\n\t\tmin = (startIndex ? segment.minLength : _largeNum) || _largeNum,\n\t\tprevLength = samples[samplesIndex + bezierQty * resolution - 1],\n\t\tlength = startIndex ? samples[samplesIndex-1] : 0,\n\t\ti, j, x4, x3, x2, xd, xd1, y4, y3, y2, yd, yd1, inv, t, lengthIndex, l, segLength;\n\tsamples.length = lookup.length = 0;\n\tfor (j = startIndex + 2; j < endIndex; j += 6) {\n\t\tx4 = segment[j + 4] - x1;\n\t\tx3 = segment[j + 2] - x1;\n\t\tx2 = segment[j] - x1;\n\t\ty4 = segment[j + 5] - y1;\n\t\ty3 = segment[j + 3] - y1;\n\t\ty2 = segment[j + 1] - y1;\n\t\txd = xd1 = yd = yd1 = 0;\n\t\tif (_abs(x4) < 1e-5 && _abs(y4) < 1e-5 && _abs(x2) + _abs(y2) < 1e-5) { //dump points that are sufficiently close (basically right on top of each other, making a bezier super tiny or 0 length)\n\t\t\tif (segment.length > 8) {\n\t\t\t\tsegment.splice(j, 6);\n\t\t\t\tj -= 6;\n\t\t\t\tendIndex -= 6;\n\t\t\t}\n\t\t} else {\n\t\t\tfor (i = 1; i <= resolution; i++) {\n\t\t\t\tt = inc * i;\n\t\t\t\tinv = 1 - t;\n\t\t\t\txd = xd1 - (xd1 = (t * t * x4 + 3 * inv * (t * x3 + inv * x2)) * t);\n\t\t\t\tyd = yd1 - (yd1 = (t * t * y4 + 3 * inv * (t * y3 + inv * y2)) * t);\n\t\t\t\tl = _sqrt(yd * yd + xd * xd);\n\t\t\t\tif (l < min) {\n\t\t\t\t\tmin = l;\n\t\t\t\t}\n\t\t\t\tlength += l;\n\t\t\t\tsamples[samplesIndex++] = length;\n\t\t\t}\n\t\t}\n\t\tx1 += x4;\n\t\ty1 += y4;\n\t}\n\tif (prevLength) {\n\t\tprevLength -= length;\n\t\tfor (; samplesIndex < samples.length; samplesIndex++) {\n\t\t\tsamples[samplesIndex] += prevLength;\n\t\t}\n\t}\n\tif (samples.length && min) {\n\t\tsegment.totalLength = segLength = samples[samples.length-1] || 0;\n\t\tsegment.minLength = min;\n\t\tl = lengthIndex = 0;\n\t\tfor (i = 0; i < segLength; i += min) {\n\t\t\tlookup[l++] = (samples[lengthIndex] < i) ? ++lengthIndex : lengthIndex;\n\t\t}\n\t} else {\n\t\tsegment.totalLength = samples[0] = 0;\n\t}\n\treturn startIndex ? length - samples[startIndex / 2 - 1] : length;\n}\n\nexport function cacheRawPathMeasurements(rawPath, resolution) {\n\tlet pathLength, points, i;\n\tfor (i = pathLength = points = 0; i < rawPath.length; i++) {\n\t\trawPath[i].resolution = ~~resolution || 12; //steps per Bezier curve (anchor, 2 control points, to anchor)\n\t\tpoints += rawPath[i].length;\n\t\tpathLength += measureSegment(rawPath[i]);\n\t}\n\trawPath.totalPoints = points;\n\trawPath.totalLength = pathLength;\n\treturn rawPath;\n}\n\n//divide segment[i] at position t (value between 0 and 1, progress along that particular cubic bezier segment that starts at segment[i]). Returns how many elements were spliced into the segment array (either 0 or 6)\nexport function subdivideSegment(segment, i, t) {\n\tif (t <= 0 || t >= 1) {\n\t\treturn 0;\n\t}\n\tlet ax = segment[i],\n\t\tay = segment[i+1],\n\t\tcp1x = segment[i+2],\n\t\tcp1y = segment[i+3],\n\t\tcp2x = segment[i+4],\n\t\tcp2y = segment[i+5],\n\t\tbx = segment[i+6],\n\t\tby = segment[i+7],\n\t\tx1a = ax + (cp1x - ax) * t,\n\t\tx2 = cp1x + (cp2x - cp1x) * t,\n\t\ty1a = ay + (cp1y - ay) * t,\n\t\ty2 = cp1y + (cp2y - cp1y) * t,\n\t\tx1 = x1a + (x2 - x1a) * t,\n\t\ty1 = y1a + (y2 - y1a) * t,\n\t\tx2a = cp2x + (bx - cp2x) * t,\n\t\ty2a = cp2y + (by - cp2y) * t;\n\tx2 += (x2a - x2) * t;\n\ty2 += (y2a - y2) * t;\n\tsegment.splice(i + 2, 4,\n\t\t_round(x1a), //first control point\n\t\t_round(y1a),\n\t\t_round(x1), //second control point\n\t\t_round(y1),\n\t\t_round(x1 + (x2 - x1) * t), //new fabricated anchor on line\n\t\t_round(y1 + (y2 - y1) * t),\n\t\t_round(x2), //third control point\n\t\t_round(y2),\n\t\t_round(x2a), //fourth control point\n\t\t_round(y2a)\n\t);\n\tsegment.samples && segment.samples.splice(((i / 6) * segment.resolution) | 0, 0, 0, 0, 0, 0, 0, 0);\n\treturn 6;\n}\n\n// returns an object {path, segment, segIndex, i, t}\nfunction getProgressData(rawPath, progress, decoratee, pushToNextIfAtEnd) {\n\tdecoratee = decoratee || {};\n\trawPath.totalLength || cacheRawPathMeasurements(rawPath);\n\tif (progress < 0 || progress > 1) {\n\t\tprogress = _wrapProgress(progress);\n\t}\n\tlet segIndex = 0,\n\t\tsegment = rawPath[0],\n\t\tsamples, resolution, length, min, max, i, t;\n\tif (rawPath.length > 1) { //speed optimization: most of the time, there's only one segment so skip the recursion.\n\t\tlength = rawPath.totalLength * progress;\n\t\tmax = i = 0;\n\t\twhile ((max += rawPath[i++].totalLength) < length) {\n\t\t\tsegIndex = i;\n\t\t}\n\t\tsegment = rawPath[segIndex];\n\t\tmin = max - segment.totalLength;\n\t\tprogress = ((length - min) / (max - min)) || 0;\n\t}\n\tsamples = segment.samples;\n\tresolution = segment.resolution; //how many samples per cubic bezier chunk\n\tlength = segment.totalLength * progress;\n\ti = segment.lookup[~~(length / segment.minLength)] || 0;\n\tmin = i ? samples[i-1] : 0;\n\tmax = samples[i];\n\tif (max < length) {\n\t\tmin = max;\n\t\tmax = samples[++i];\n\t}\n\tt = (1 / resolution) * (((length - min) / (max - min)) + ((i % resolution)));\n\ti = ~~(i / resolution) * 6;\n\tif (pushToNextIfAtEnd && t === 1) {\n\t\tif (i + 6 < segment.length) {\n\t\t\ti += 6;\n\t\t\tt = 0;\n\t\t} else if (segIndex + 1 < rawPath.length) {\n\t\t\ti = t = 0;\n\t\t\tsegment = rawPath[++segIndex];\n\t\t}\n\t}\n\tdecoratee.t = t;\n\tdecoratee.i = i;\n\tdecoratee.path = rawPath;\n\tdecoratee.segment = segment;\n\tdecoratee.segIndex = segIndex;\n\treturn decoratee;\n}\n\nexport function getPositionOnPath(rawPath, progress, includeAngle, point) {\n\tlet segment = rawPath[0],\n\t\tresult = point || {},\n\t\tsamples, resolution, length, min, max, i, t, a, inv;\n\tif (progress < 0 || progress > 1) {\n\t\tprogress = _wrapProgress(progress);\n\t}\n\tif (rawPath.length > 1) { //speed optimization: most of the time, there's only one segment so skip the recursion.\n\t\tlength = rawPath.totalLength * progress;\n\t\tmax = i = 0;\n\t\twhile ((max += rawPath[i++].totalLength) < length) {\n\t\t\tsegment = rawPath[i];\n\t\t}\n\t\tmin = max - segment.totalLength;\n\t\tprogress = ((length - min) / (max - min)) || 0;\n\t}\n\tsamples = segment.samples;\n\tresolution = segment.resolution;\n\tlength = segment.totalLength * progress;\n\ti = segment.lookup[~~(length / segment.minLength)] || 0;\n\tmin = i ? samples[i-1] : 0;\n\tmax = samples[i];\n\tif (max < length) {\n\t\tmin = max;\n\t\tmax = samples[++i];\n\t}\n\tt = ((1 / resolution) * (((length - min) / (max - min)) + ((i % resolution)))) || 0;\n\tinv = 1 - t;\n\ti = ~~(i / resolution) * 6;\n\ta = segment[i];\n\tresult.x = _round((t * t * (segment[i + 6] - a) + 3 * inv * (t * (segment[i + 4] - a) + inv * (segment[i + 2] - a))) * t + a);\n\tresult.y = _round((t * t * (segment[i + 7] - (a = segment[i+1])) + 3 * inv * (t * (segment[i + 5] - a) + inv * (segment[i + 3] - a))) * t + a);\n\tif (includeAngle) {\n\t\tresult.angle = segment.totalLength ? getRotationAtBezierT(segment, i, t >= 1 ? 1 - 1e-9 : t ? t : 1e-9) : segment.angle || 0;\n\t}\n\treturn result;\n}\n\n\n\n//applies a matrix transform to RawPath (or a segment in a RawPath) and returns whatever was passed in (it transforms the values in the array(s), not a copy).\nexport function transformRawPath(rawPath, a, b, c, d, tx, ty) {\n\tlet j = rawPath.length,\n\t\tsegment, l, i, x, y;\n\twhile (--j > -1) {\n\t\tsegment = rawPath[j];\n\t\tl = segment.length;\n\t\tfor (i = 0; i < l; i += 2) {\n\t\t\tx = segment[i];\n\t\t\ty = segment[i+1];\n\t\t\tsegment[i] = x * a + y * c + tx;\n\t\t\tsegment[i+1] = x * b + y * d + ty;\n\t\t}\n\t}\n\trawPath._dirty = 1;\n\treturn rawPath;\n}\n\n\n\n// translates SVG arc data into a segment (cubic beziers). Angle is in degrees.\nfunction arcToSegment(lastX, lastY, rx, ry, angle, largeArcFlag, sweepFlag, x, y) {\n\tif (lastX === x && lastY === y) {\n\t\treturn;\n\t}\n\trx = _abs(rx);\n\try = _abs(ry);\n\tlet angleRad = (angle % 360) * _DEG2RAD,\n\t\tcosAngle = _cos(angleRad),\n\t\tsinAngle = _sin(angleRad),\n\t\tPI = Math.PI,\n\t\tTWOPI = PI * 2,\n\t\tdx2 = (lastX - x) / 2,\n\t\tdy2 = (lastY - y) / 2,\n\t\tx1 = (cosAngle * dx2 + sinAngle * dy2),\n\t\ty1 = (-sinAngle * dx2 + cosAngle * dy2),\n\t\tx1_sq = x1 * x1,\n\t\ty1_sq = y1 * y1,\n\t\tradiiCheck = x1_sq / (rx * rx) + y1_sq / (ry * ry);\n\tif (radiiCheck > 1) {\n\t\trx = _sqrt(radiiCheck) * rx;\n\t\try = _sqrt(radiiCheck) * ry;\n\t}\n\tlet rx_sq = rx * rx,\n\t\try_sq = ry * ry,\n\t\tsq = ((rx_sq * ry_sq) - (rx_sq * y1_sq) - (ry_sq * x1_sq)) / ((rx_sq * y1_sq) + (ry_sq * x1_sq));\n\tif (sq < 0) {\n\t\tsq = 0;\n\t}\n\tlet coef = ((largeArcFlag === sweepFlag) ? -1 : 1) * _sqrt(sq),\n\t\tcx1 = coef * ((rx * y1) / ry),\n\t\tcy1 = coef * -((ry * x1) / rx),\n\t\tsx2 = (lastX + x) / 2,\n\t\tsy2 = (lastY + y) / 2,\n\t\tcx = sx2 + (cosAngle * cx1 - sinAngle * cy1),\n\t\tcy = sy2 + (sinAngle * cx1 + cosAngle * cy1),\n\t\tux = (x1 - cx1) / rx,\n\t\tuy = (y1 - cy1) / ry,\n\t\tvx = (-x1 - cx1) / rx,\n\t\tvy = (-y1 - cy1) / ry,\n\t\ttemp = ux * ux + uy * uy,\n\t\tangleStart = ((uy < 0) ? -1 : 1) * Math.acos(ux / _sqrt(temp)),\n\t\tangleExtent = ((ux * vy - uy * vx < 0) ? -1 : 1) * Math.acos((ux * vx + uy * vy) / _sqrt(temp * (vx * vx + vy * vy)));\n\tisNaN(angleExtent) && (angleExtent = PI); //rare edge case. Math.cos(-1) is NaN.\n\tif (!sweepFlag && angleExtent > 0) {\n\t\tangleExtent -= TWOPI;\n\t} else if (sweepFlag && angleExtent < 0) {\n\t\tangleExtent += TWOPI;\n\t}\n\tangleStart %= TWOPI;\n\tangleExtent %= TWOPI;\n\tlet segments = Math.ceil(_abs(angleExtent) / (TWOPI / 4)),\n\t\trawPath = [],\n\t\tangleIncrement = angleExtent / segments,\n\t\tcontrolLength = 4 / 3 * _sin(angleIncrement / 2) / (1 + _cos(angleIncrement / 2)),\n\t\tma = cosAngle * rx,\n\t\tmb = sinAngle * rx,\n\t\tmc = sinAngle * -ry,\n\t\tmd = cosAngle * ry,\n\t\ti;\n\tfor (i = 0; i < segments; i++) {\n\t\tangle = angleStart + i * angleIncrement;\n\t\tx1 = _cos(angle);\n\t\ty1 = _sin(angle);\n\t\tux = _cos(angle += angleIncrement);\n\t\tuy = _sin(angle);\n\t\trawPath.push(x1 - controlLength * y1, y1 + controlLength * x1, ux + controlLength * uy, uy - controlLength * ux, ux, uy);\n\t}\n\t//now transform according to the actual size of the ellipse/arc (the beziers were noramlized, between 0 and 1 on a circle).\n\tfor (i = 0; i < rawPath.length; i+=2) {\n\t\tx1 = rawPath[i];\n\t\ty1 = rawPath[i+1];\n\t\trawPath[i] = x1 * ma + y1 * mc + cx;\n\t\trawPath[i+1] = x1 * mb + y1 * md + cy;\n\t}\n\trawPath[i-2] = x; //always set the end to exactly where it's supposed to be\n\trawPath[i-1] = y;\n\treturn rawPath;\n}\n\n//Spits back a RawPath with absolute coordinates. Each segment starts with a \"moveTo\" command (x coordinate, then y) and then 2 control points (x, y, x, y), then anchor. The goal is to minimize memory and maximize speed.\nexport function stringToRawPath(d) {\n\tlet a = (d + \"\").replace(_scientific, m => { let n = +m; return (n < 0.0001 && n > -0.0001) ? 0 : n; }).match(_svgPathExp) || [], //some authoring programs spit out very small numbers in scientific notation like \"1e-5\", so make sure we round that down to 0 first.\n\t\tpath = [],\n\t\trelativeX = 0,\n\t\trelativeY = 0,\n\t\ttwoThirds = 2 / 3,\n\t\telements = a.length,\n\t\tpoints = 0,\n\t\terrorMessage = \"ERROR: malformed path: \" + d,\n\t\ti, j, x, y, command, isRelative, segment, startX, startY, difX, difY, beziers, prevCommand, flag1, flag2,\n\t\tline = function(sx, sy, ex, ey) {\n\t\t\tdifX = (ex - sx) / 3;\n\t\t\tdifY = (ey - sy) / 3;\n\t\t\tsegment.push(sx + difX, sy + difY, ex - difX, ey - difY, ex, ey);\n\t\t};\n\tif (!d || !isNaN(a[0]) || isNaN(a[1])) {\n\t\tconsole.log(errorMessage);\n\t\treturn path;\n\t}\n\tfor (i = 0; i < elements; i++) {\n\t\tprevCommand = command;\n\t\tif (isNaN(a[i])) {\n\t\t\tcommand = a[i].toUpperCase();\n\t\t\tisRelative = (command !== a[i]); //lower case means relative\n\t\t} else { //commands like \"C\" can be strung together without any new command characters between.\n\t\t\ti--;\n\t\t}\n\t\tx = +a[i + 1];\n\t\ty = +a[i + 2];\n\t\tif (isRelative) {\n\t\t\tx += relativeX;\n\t\t\ty += relativeY;\n\t\t}\n\t\tif (!i) {\n\t\t\tstartX = x;\n\t\t\tstartY = y;\n\t\t}\n\n\t\t// \"M\" (move)\n\t\tif (command === \"M\") {\n\t\t\tif (segment) {\n\t\t\t\tif (segment.length < 8) { //if the path data was funky and just had a M with no actual drawing anywhere, skip it.\n\t\t\t\t\tpath.length -= 1;\n\t\t\t\t} else {\n\t\t\t\t\tpoints += segment.length;\n\t\t\t\t}\n\t\t\t}\n\t\t\trelativeX = startX = x;\n\t\t\trelativeY = startY = y;\n\t\t\tsegment = [x, y];\n\t\t\tpath.push(segment);\n\t\t\ti += 2;\n\t\t\tcommand = \"L\"; //an \"M\" with more than 2 values gets interpreted as \"lineTo\" commands (\"L\").\n\n\t\t// \"C\" (cubic bezier)\n\t\t} else if (command === \"C\") {\n\t\t\tif (!segment) {\n\t\t\t\tsegment = [0, 0];\n\t\t\t}\n\t\t\tif (!isRelative) {\n\t\t\t\trelativeX = relativeY = 0;\n\t\t\t}\n\t\t\t//note: \"*1\" is just a fast/short way to cast the value as a Number. WAAAY faster in Chrome, slightly slower in Firefox.\n\t\t\tsegment.push(x,\ty, relativeX + a[i + 3] * 1, relativeY + a[i + 4] * 1, (relativeX += a[i + 5] * 1),\t(relativeY += a[i + 6] * 1));\n\t\t\ti += 6;\n\n\t\t// \"S\" (continuation of cubic bezier)\n\t\t} else if (command === \"S\") {\n\t\t\tdifX = relativeX;\n\t\t\tdifY = relativeY;\n\t\t\tif (prevCommand === \"C\" || prevCommand === \"S\") {\n\t\t\t\tdifX += relativeX - segment[segment.length - 4];\n\t\t\t\tdifY += relativeY - segment[segment.length - 3];\n\t\t\t}\n\t\t\tif (!isRelative) {\n\t\t\t\trelativeX = relativeY = 0;\n\t\t\t}\n\t\t\tsegment.push(difX, difY, x,\ty, (relativeX += a[i + 3] * 1), (relativeY += a[i + 4] * 1));\n\t\t\ti += 4;\n\n\t\t// \"Q\" (quadratic bezier)\n\t\t} else if (command === \"Q\") {\n\t\t\tdifX = relativeX + (x - relativeX) * twoThirds;\n\t\t\tdifY = relativeY + (y - relativeY) * twoThirds;\n\t\t\tif (!isRelative) {\n\t\t\t\trelativeX = relativeY = 0;\n\t\t\t}\n\t\t\trelativeX += a[i + 3] * 1;\n\t\t\trelativeY += a[i + 4] * 1;\n\t\t\tsegment.push(difX, difY, relativeX + (x - relativeX) * twoThirds, relativeY + (y - relativeY) * twoThirds, relativeX, relativeY);\n\t\t\ti += 4;\n\n\t\t// \"T\" (continuation of quadratic bezier)\n\t\t} else if (command === \"T\") {\n\t\t\tdifX = relativeX - segment[segment.length - 4];\n\t\t\tdifY = relativeY - segment[segment.length - 3];\n\t\t\tsegment.push(relativeX + difX, relativeY + difY, x + ((relativeX + difX * 1.5) - x) * twoThirds, y + ((relativeY + difY * 1.5) - y) * twoThirds, (relativeX = x), (relativeY = y));\n\t\t\ti += 2;\n\n\t\t// \"H\" (horizontal line)\n\t\t} else if (command === \"H\") {\n\t\t\tline(relativeX, relativeY, (relativeX = x), relativeY);\n\t\t\ti += 1;\n\n\t\t// \"V\" (vertical line)\n\t\t} else if (command === \"V\") {\n\t\t\t//adjust values because the first (and only one) isn't x in this case, it's y.\n\t\t\tline(relativeX, relativeY, relativeX, (relativeY = x + (isRelative ? relativeY - relativeX : 0)));\n\t\t\ti += 1;\n\n\t\t// \"L\" (line) or \"Z\" (close)\n\t\t} else if (command === \"L\" || command === \"Z\") {\n\t\t\tif (command === \"Z\") {\n\t\t\t\tx = startX;\n\t\t\t\ty = startY;\n\t\t\t\tsegment.closed = true;\n\t\t\t}\n\t\t\tif (command === \"L\" || _abs(relativeX - x) > 0.5 || _abs(relativeY - y) > 0.5) {\n\t\t\t\tline(relativeX, relativeY, x, y);\n\t\t\t\tif (command === \"L\") {\n\t\t\t\t\ti += 2;\n\t\t\t\t}\n\t\t\t}\n\t\t\trelativeX = x;\n\t\t\trelativeY = y;\n\n\t\t// \"A\" (arc)\n\t\t} else if (command === \"A\") {\n\t\t\tflag1 = a[i+4];\n\t\t\tflag2 = a[i+5];\n\t\t\tdifX = a[i+6];\n\t\t\tdifY = a[i+7];\n\t\t\tj = 7;\n\t\t\tif (flag1.length > 1) { // for cases when the flags are merged, like \"a8 8 0 018 8\" (the 0 and 1 flags are WITH the x value of 8, but it could also be \"a8 8 0 01-8 8\" so it may include x or not)\n\t\t\t\tif (flag1.length < 3) {\n\t\t\t\t\tdifY = difX;\n\t\t\t\t\tdifX = flag2;\n\t\t\t\t\tj--;\n\t\t\t\t} else {\n\t\t\t\t\tdifY = flag2;\n\t\t\t\t\tdifX = flag1.substr(2);\n\t\t\t\t\tj-=2;\n\t\t\t\t}\n\t\t\t\tflag2 = flag1.charAt(1);\n\t\t\t\tflag1 = flag1.charAt(0);\n\t\t\t}\n\t\t\tbeziers = arcToSegment(relativeX, relativeY, +a[i+1], +a[i+2], +a[i+3], +flag1, +flag2, (isRelative ? relativeX : 0) + difX*1, (isRelative ? relativeY : 0) + difY*1);\n\t\t\ti += j;\n\t\t\tif (beziers) {\n\t\t\t\tfor (j = 0; j < beziers.length; j++) {\n\t\t\t\t\tsegment.push(beziers[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t\trelativeX = segment[segment.length-2];\n\t\t\trelativeY = segment[segment.length-1];\n\n\t\t} else {\n\t\t\tconsole.log(errorMessage);\n\t\t}\n\t}\n\ti = segment.length;\n\tif (i < 6) { //in case there's odd SVG like a M0,0 command at the very end.\n\t\tpath.pop();\n\t\ti = 0;\n\t} else if (segment[0] === segment[i-2] && segment[1] === segment[i-1]) {\n\t\tsegment.closed = true;\n\t}\n\tpath.totalPoints = points + i;\n\treturn path;\n}\n\n//populates the points array in alternating x/y values (like [x, y, x, y...] instead of individual point objects [{x, y}, {x, y}...] to conserve memory and stay in line with how we're handling segment arrays\nexport function bezierToPoints(x1, y1, x2, y2, x3, y3, x4, y4, threshold, points, index) {\n\tlet x12 = (x1 + x2) / 2,\n\t\ty12 = (y1 + y2) / 2,\n\t\tx23 = (x2 + x3) / 2,\n\t\ty23 = (y2 + y3) / 2,\n\t\tx34 = (x3 + x4) / 2,\n\t\ty34 = (y3 + y4) / 2,\n\t\tx123 = (x12 + x23) / 2,\n\t\ty123 = (y12 + y23) / 2,\n\t\tx234 = (x23 + x34) / 2,\n\t\ty234 = (y23 + y34) / 2,\n\t\tx1234 = (x123 + x234) / 2,\n\t\ty1234 = (y123 + y234) / 2,\n\t\tdx = x4 - x1,\n\t\tdy = y4 - y1,\n\t\td2 = _abs((x2 - x4) * dy - (y2 - y4) * dx),\n\t\td3 = _abs((x3 - x4) * dy - (y3 - y4) * dx),\n\t\tlength;\n\tif (!points) {\n\t\tpoints = [x1, y1, x4, y4];\n\t\tindex = 2;\n\t}\n\tpoints.splice(index || points.length - 2, 0, x1234, y1234);\n\tif ((d2 + d3) * (d2 + d3) > threshold * (dx * dx + dy * dy)) {\n\t\tlength = points.length;\n\t\tbezierToPoints(x1, y1, x12, y12, x123, y123, x1234, y1234, threshold, points, index);\n\t\tbezierToPoints(x1234, y1234, x234, y234, x34, y34, x4, y4, threshold, points, index + 2 + (points.length - length));\n\t}\n\treturn points;\n}\n\n/*\nfunction getAngleBetweenPoints(x0, y0, x1, y1, x2, y2) { //angle between 3 points in radians\n\tvar dx1 = x1 - x0,\n\t\tdy1 = y1 - y0,\n\t\tdx2 = x2 - x1,\n\t\tdy2 = y2 - y1,\n\t\tdx3 = x2 - x0,\n\t\tdy3 = y2 - y0,\n\t\ta = dx1 * dx1 + dy1 * dy1,\n\t\tb = dx2 * dx2 + dy2 * dy2,\n\t\tc = dx3 * dx3 + dy3 * dy3;\n\treturn Math.acos( (a + b - c) / _sqrt(4 * a * b) );\n},\n*/\n\n//pointsToSegment() doesn't handle flat coordinates (where y is always 0) the way we need (the resulting control points are always right on top of the anchors), so this function basically makes the control points go directly up and down, varying in length based on the curviness (more curvy, further control points)\nexport function flatPointsToSegment(points, curviness=1) {\n\tlet x = points[0],\n\t\ty = 0,\n\t\tsegment = [x, y],\n\t\ti = 2;\n\tfor (; i < points.length; i+=2) {\n\t\tsegment.push(\n\t\t\tx,\n\t\t\ty,\n\t\t\tpoints[i],\n\t\t\t(y = (points[i] - x) * curviness / 2),\n\t\t\t(x = points[i]),\n\t\t\t-y\n\t\t);\n\t}\n\treturn segment;\n}\n\n//points is an array of x/y points, like [x, y, x, y, x, y]\nexport function pointsToSegment(points, curviness, cornerThreshold) {\n\t//points = simplifyPoints(points, tolerance);\n\tlet l = points.length-2,\n\t\tx = +points[0],\n\t\ty = +points[1],\n\t\tnextX = +points[2],\n\t\tnextY = +points[3],\n\t\tsegment = [x, y, x, y],\n\t\tdx2 = nextX - x,\n\t\tdy2 = nextY - y,\n\t\tclosed = Math.abs(points[l] - x) < 0.001 && Math.abs(points[l+1] - y) < 0.001,\n\t\tprevX, prevY, angle, slope, i, dx1, dx3, dy1, dy3, d1, d2, a, b, c;\n\tif (isNaN(cornerThreshold)) {\n\t\tcornerThreshold = Math.PI / 10;\n\t}\n\tif (closed) { // if the start and end points are basically on top of each other, close the segment by adding the 2nd point to the end, and the 2nd-to-last point to the beginning (we'll remove them at the end, but this allows the curvature to look perfect)\n\t\tpoints.push(nextX, nextY);\n\t\tnextX = x;\n\t\tnextY = y;\n\t\tx = points[l-2];\n\t\ty = points[l-1];\n\t\tpoints.unshift(x, y);\n\t\tl+=4;\n\t}\n\tcurviness = (curviness || curviness === 0) ? +curviness : 1;\n\tfor (i = 2; i < l; i+=2) {\n\t\tprevX = x;\n\t\tprevY = y;\n\t\tx = nextX;\n\t\ty = nextY;\n\t\tnextX = +points[i+2];\n\t\tnextY = +points[i+3];\n\t\tdx1 = dx2;\n\t\tdy1 = dy2;\n\t\tdx2 = nextX - x;\n\t\tdy2 = nextY - y;\n\t\tdx3 = nextX - prevX;\n\t\tdy3 = nextY - prevY;\n\t\ta = dx1 * dx1 + dy1 * dy1;\n\t\tb = dx2 * dx2 + dy2 * dy2;\n\t\tc = dx3 * dx3 + dy3 * dy3;\n\t\tangle = Math.acos( (a + b - c) / _sqrt(4 * a * b) ); //angle between the 3 points\n\t\td2 = (angle / Math.PI) * curviness; //temporary precalculation for speed (reusing d2 variable)\n\t\td1 = _sqrt(a) * d2; //the tighter the angle, the shorter we make the handles in proportion.\n\t\td2 *= _sqrt(b);\n\t\tif (x !== prevX || y !== prevY) {\n\t\t\tif (angle > cornerThreshold) {\n\t\t\t\tslope = _atan2(dy3, dx3);\n\t\t\t\tsegment.push(\n\t\t\t\t\t_round(x - _cos(slope) * d1), //first control point\n\t\t\t\t\t_round(y - _sin(slope) * d1),\n\t\t\t\t\t_round(x), //anchor\n\t\t\t\t\t_round(y),\n\t\t\t\t\t_round(x + _cos(slope) * d2), //second control point\n\t\t\t\t\t_round(y + _sin(slope) * d2)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tslope = _atan2(dy1, dx1);\n\t\t\t\tsegment.push(\n\t\t\t\t\t_round(x - _cos(slope) * d1), //first control point\n\t\t\t\t\t_round(y - _sin(slope) * d1));\n\t\t\t\tslope = _atan2(dy2, dx2);\n\t\t\t\tsegment.push(\n\t\t\t\t\t_round(x), //anchor\n\t\t\t\t\t_round(y),\n\t\t\t\t\t_round(x + _cos(slope) * d2), //second control point\n\t\t\t\t\t_round(y + _sin(slope) * d2)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tsegment.push(_round(nextX), _round(nextY), _round(nextX), _round(nextY));\n\tif (closed) {\n\t\tsegment.splice(0, 6);\n\t\tsegment.length = segment.length - 6;\n\t}\n\treturn segment;\n}\n\n//returns the squared distance between an x/y coordinate and a segment between x1/y1 and x2/y2\nfunction pointToSegDist(x, y, x1, y1, x2, y2) {\n\tlet dx = x2 - x1,\n\t\tdy = y2 - y1,\n\t\tt;\n\tif (dx || dy) {\n\t\tt = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);\n\t\tif (t > 1) {\n\t\t\tx1 = x2;\n\t\t\ty1 = y2;\n\t\t} else if (t > 0) {\n\t\t\tx1 += dx * t;\n\t\t\ty1 += dy * t;\n\t\t}\n\t}\n\treturn (x - x1) ** 2 + (y - y1) ** 2;\n}\n\nfunction simplifyStep(points, first, last, tolerance, simplified) {\n\tlet maxSqDist = tolerance,\n\t\tfirstX = points[first],\n\t\tfirstY = points[first+1],\n\t\tlastX = points[last],\n\t\tlastY = points[last+1],\n\t\tindex, i, d;\n\tfor (i = first + 2; i < last; i += 2) {\n\t\td = pointToSegDist(points[i], points[i+1], firstX, firstY, lastX, lastY);\n\t\tif (d > maxSqDist) {\n\t\t\tindex = i;\n\t\t\tmaxSqDist = d;\n\t\t}\n\t}\n\tif (maxSqDist > tolerance) {\n\t\tif (index - first > 2) {\n\t\t\tsimplifyStep(points, first, index, tolerance, simplified);\n\t\t}\n\t\tsimplified.push(points[index], points[index+1]);\n\t\tif (last - index > 2) {\n\t\t\tsimplifyStep(points, index, last, tolerance, simplified);\n\t\t}\n\t}\n}\n\n//points is an array of x/y values like [x, y, x, y, x, y]\nexport function simplifyPoints(points, tolerance) {\n\tlet prevX = parseFloat(points[0]),\n\t\tprevY = parseFloat(points[1]),\n\t\ttemp = [prevX, prevY],\n\t\tl = points.length - 2,\n\t\ti, x, y, dx, dy, result, last;\n\ttolerance = (tolerance || 1) ** 2;\n\tfor (i = 2; i < l; i += 2) {\n\t\tx = parseFloat(points[i]);\n\t\ty = parseFloat(points[i+1]);\n\t\tdx = prevX - x;\n\t\tdy = prevY - y;\n\t\tif (dx * dx + dy * dy > tolerance) {\n\t\t\ttemp.push(x, y);\n\t\t\tprevX = x;\n\t\t\tprevY = y;\n\t\t}\n\t}\n\ttemp.push(parseFloat(points[l]), parseFloat(points[l+1]));\n\tlast = temp.length - 2;\n\tresult = [temp[0], temp[1]];\n\tsimplifyStep(temp, 0, last, tolerance, result);\n\tresult.push(temp[last], temp[last+1]);\n\treturn result;\n}\n\nfunction getClosestProgressOnBezier(iterations, px, py, start, end, slices, x0, y0, x1, y1, x2, y2, x3, y3) {\n\tlet inc = (end - start) / slices,\n\t\tbest = 0,\n\t\tt = start,\n\t\tx, y, d, dx, dy, inv;\n\t_bestDistance = _largeNum;\n\twhile (t <= end) {\n\t\tinv = 1 - t;\n\t\tx = inv * inv * inv * x0 + 3 * inv * inv * t * x1 + 3 * inv * t * t * x2 + t * t * t * x3;\n\t\ty = inv * inv * inv * y0 + 3 * inv * inv * t * y1 + 3 * inv * t * t * y2 + t * t * t * y3;\n\t\tdx = x - px;\n\t\tdy = y - py;\n\t\td = dx * dx + dy * dy;\n\t\tif (d < _bestDistance) {\n\t\t\t_bestDistance = d;\n\t\t\tbest = t;\n\t\t}\n\t\tt += inc;\n\t}\n\treturn (iterations > 1) ? getClosestProgressOnBezier(iterations - 1, px, py, Math.max(best - inc, 0), Math.min(best + inc, 1), slices, x0, y0, x1, y1, x2, y2, x3, y3) : best;\n}\n\nexport function getClosestData(rawPath, x, y, slices) { //returns an object with the closest j, i, and t (j is the segment index, i is the index of the point in that segment, and t is the time/progress along that bezier)\n\tlet closest = {j:0, i:0, t:0},\n\t\tbestDistance = _largeNum,\n\t\ti, j, t, segment;\n\tfor (j = 0; j < rawPath.length; j++) {\n\t\tsegment = rawPath[j];\n\t\tfor (i = 0; i < segment.length; i+=6) {\n\t\t\tt = getClosestProgressOnBezier(1, x, y, 0, 1, slices || 20, segment[i], segment[i+1], segment[i+2], segment[i+3], segment[i+4], segment[i+5], segment[i+6], segment[i+7]);\n\t\t\tif (bestDistance > _bestDistance) {\n\t\t\t\tbestDistance = _bestDistance;\n\t\t\t\tclosest.j = j;\n\t\t\t\tclosest.i = i;\n\t\t\t\tclosest.t = t;\n\t\t\t}\n\t\t}\n\t}\n\treturn closest;\n}\n\n//subdivide a Segment closest to a specific x,y coordinate\nexport function subdivideSegmentNear(x, y, segment, slices, iterations) {\n\tlet l = segment.length,\n\t\tbestDistance = _largeNum,\n\t\tbestT = 0,\n\t\tbestSegmentIndex = 0,\n\t\tt, i;\n\tslices = slices || 20;\n\titerations = iterations || 3;\n\tfor (i = 0; i < l; i += 6) {\n\t\tt = getClosestProgressOnBezier(1, x, y, 0, 1, slices, segment[i], segment[i+1], segment[i+2], segment[i+3], segment[i+4], segment[i+5], segment[i+6], segment[i+7]);\n\t\tif (bestDistance > _bestDistance) {\n\t\t\tbestDistance = _bestDistance;\n\t\t\tbestT = t;\n\t\t\tbestSegmentIndex = i;\n\t\t}\n\t}\n\tt = getClosestProgressOnBezier(iterations, x, y, bestT - 0.05, bestT + 0.05, slices, segment[bestSegmentIndex], segment[bestSegmentIndex+1], segment[bestSegmentIndex+2], segment[bestSegmentIndex+3], segment[bestSegmentIndex+4], segment[bestSegmentIndex+5], segment[bestSegmentIndex+6], segment[bestSegmentIndex+7]);\n\tsubdivideSegment(segment, bestSegmentIndex, t);\n\treturn bestSegmentIndex + 6;\n}\n\n/*\nTakes any of the following and converts it to an all Cubic Bezier SVG data string:\n- A <path> data string like \"M0,0 L2,4 v20,15 H100\"\n- A RawPath, like [[x, y, x, y, x, y, x, y][[x, y, x, y, x, y, x, y]]\n- A Segment, like [x, y, x, y, x, y, x, y]\n\nNote: all numbers are rounded down to the closest 0.001 to minimize memory, maximize speed, and avoid odd numbers like 1e-13\n*/\nexport function rawPathToString(rawPath) {\n\tif (_isNumber(rawPath[0])) { //in case a segment is passed in instead\n\t\trawPath = [rawPath];\n\t}\n\tlet result = \"\",\n\t\tl = rawPath.length,\n\t\tsl, s, i, segment;\n\tfor (s = 0; s < l; s++) {\n\t\tsegment = rawPath[s];\n\t\tresult += \"M\" + _round(segment[0]) + \",\" + _round(segment[1]) + \" C\";\n\t\tsl = segment.length;\n\t\tfor (i = 2; i < sl; i++) {\n\t\t\tresult += _round(segment[i++]) + \",\" + _round(segment[i++]) + \" \" + _round(segment[i++]) + \",\" + _round(segment[i++]) + \" \" + _round(segment[i++]) + \",\" + _round(segment[i]) + \" \";\n\t\t}\n\t\tif (segment.closed) {\n\t\t\tresult += \"z\";\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\n// takes a segment with coordinates [x, y, x, y, ...] and converts the control points into angles and lengths [x, y, angle, length, angle, length, x, y, angle, length, ...] so that it animates more cleanly and avoids odd breaks/kinks. For example, if you animate from 1 o'clock to 6 o'clock, it'd just go directly/linearly rather than around. So the length would be very short in the middle of the tween.\nexport function cpCoordsToAngles(segment, copy) {\n\tvar result = copy ? segment.slice(0) : segment,\n\t\tx, y, i;\n\tfor (i = 0; i < segment.length; i+=6) {\n\t\tx = segment[i+2] - segment[i];\n\t\ty = segment[i+3] - segment[i+1];\n\t\tresult[i+2] = Math.atan2(y, x);\n\t\tresult[i+3] = Math.sqrt(x * x + y * y);\n\t\tx = segment[i+6] - segment[i+4];\n\t\ty = segment[i+7] - segment[i+5];\n\t\tresult[i+4] = Math.atan2(y, x);\n\t\tresult[i+5] = Math.sqrt(x * x + y * y);\n\t}\n\treturn result;\n}\n\n// takes a segment that was converted with cpCoordsToAngles() to have angles and lengths instead of coordinates for the control points, and converts it BACK into coordinates.\nexport function cpAnglesToCoords(segment, copy) {\n\tvar result = copy ? segment.slice(0) : segment,\n\t\tlength = segment.length,\n\t\trnd = 1000,\n\t\tangle, l, i, j;\n\tfor (i = 0; i < length; i+=6) {\n\t\tangle = segment[i+2];\n\t\tl = segment[i+3]; //length\n\t\tresult[i+2] = (((segment[i] + Math.cos(angle) * l) * rnd) | 0) / rnd;\n\t\tresult[i+3] = (((segment[i+1] + Math.sin(angle) * l) * rnd) | 0) / rnd;\n\t\tangle = segment[i+4];\n\t\tl = segment[i+5]; //length\n\t\tresult[i+4] = (((segment[i+6] - Math.cos(angle) * l) * rnd) | 0) / rnd;\n\t\tresult[i+5] = (((segment[i+7] - Math.sin(angle) * l) * rnd) | 0) / rnd;\n\t}\n\treturn result;\n}\n\n//adds an \"isSmooth\" array to each segment and populates it with a boolean value indicating whether or not it's smooth (the control points have basically the same slope). For any smooth control points, it converts the coordinates into angle (x, in radians) and length (y) and puts them into the same index value in a smoothData array.\nexport function populateSmoothData(rawPath) {\n\tlet j = rawPath.length,\n\t\tsmooth, segment, x, y, x2, y2, i, l, a, a2, isSmooth, smoothData;\n\twhile (--j > -1) {\n\t\tsegment = rawPath[j];\n\t\tisSmooth = segment.isSmooth = segment.isSmooth || [0, 0, 0, 0];\n\t\tsmoothData = segment.smoothData = segment.smoothData || [0, 0, 0, 0];\n\t\tisSmooth.length = 4;\n\t\tl = segment.length - 2;\n\t\tfor (i = 6; i < l; i += 6) {\n\t\t\tx = segment[i] - segment[i - 2];\n\t\t\ty = segment[i + 1] - segment[i - 1];\n\t\t\tx2 = segment[i + 2] - segment[i];\n\t\t\ty2 = segment[i + 3] - segment[i + 1];\n\t\t\ta = _atan2(y, x);\n\t\t\ta2 = _atan2(y2, x2);\n\t\t\tsmooth = (Math.abs(a - a2) < 0.09);\n\t\t\tif (smooth) {\n\t\t\t\tsmoothData[i - 2] = a;\n\t\t\t\tsmoothData[i + 2] = a2;\n\t\t\t\tsmoothData[i - 1] = _sqrt(x * x + y * y);\n\t\t\t\tsmoothData[i + 3] = _sqrt(x2 * x2 + y2 * y2);\n\t\t\t}\n\t\t\tisSmooth.push(smooth, smooth, 0, 0, smooth, smooth);\n\t\t}\n\t\t//if the first and last points are identical, check to see if there's a smooth transition. We must handle this a bit differently due to their positions in the array.\n\t\tif (segment[l] === segment[0] && segment[l+1] === segment[1]) {\n\t\t\tx = segment[0] - segment[l-2];\n\t\t\ty = segment[1] - segment[l-1];\n\t\t\tx2 = segment[2] - segment[0];\n\t\t\ty2 = segment[3] - segment[1];\n\t\t\ta = _atan2(y, x);\n\t\t\ta2 = _atan2(y2, x2);\n\t\t\tif (Math.abs(a - a2) < 0.09) {\n\t\t\t\tsmoothData[l-2] = a;\n\t\t\t\tsmoothData[2] = a2;\n\t\t\t\tsmoothData[l-1] = _sqrt(x * x + y * y);\n\t\t\t\tsmoothData[3] = _sqrt(x2 * x2 + y2 * y2);\n\t\t\t\tisSmooth[l-2] = isSmooth[l-1] = true; //don't change indexes 2 and 3 because we'll trigger everything from the END, and this will optimize file size a bit.\n\t\t\t}\n\t\t}\n\t}\n\treturn rawPath;\n}\nexport function pointToScreen(svgElement, point) {\n\tif (arguments.length < 2) { //by default, take the first set of coordinates in the path as the point\n\t\tlet rawPath = getRawPath(svgElement);\n\t\tpoint = svgElement.ownerSVGElement.createSVGPoint();\n\t\tpoint.x = rawPath[0][0];\n\t\tpoint.y = rawPath[0][1];\n\t}\n\treturn point.matrixTransform(svgElement.getScreenCTM());\n}\n\n*/","/*!\n * matrix 3.4.2\n * https://greensock.com\n *\n * Copyright 2008-2020, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, [email protected]\n*/\n/* eslint-disable */\n\nlet _doc, _win, _docElement, _body,\t_divContainer, _svgContainer, _identityMatrix,\n\t_transformProp = \"transform\",\n\t_transformOriginProp = _transformProp + \"Origin\",\n\t_hasOffsetBug,\n\t_setDoc = element => {\n\t\tlet doc = element.ownerDocument || element;\n\t\tif (!(_transformProp in element.style) && \"msTransform\" in element.style) { //to improve compatibility with old Microsoft browsers\n\t\t\t_transformProp = \"msTransform\";\n\t\t\t_transformOriginProp = _transformProp + \"Origin\";\n\t\t}\n\t\twhile (doc.parentNode && (doc = doc.parentNode)) {\t}\n\t\t_win = window;\n\t\t_identityMatrix = new Matrix2D();\n\t\tif (doc) {\n\t\t\t_doc = doc;\n\t\t\t_docElement = doc.documentElement;\n\t\t\t_body = doc.body;\n\t\t\t// now test for the offset reporting bug. Use feature detection instead of browser sniffing to make things more bulletproof and future-proof. Hopefully Safari will fix their bug soon but it's 2020 and it's still not fixed.\n\t\t\tlet d1 = doc.createElement(\"div\"),\n\t\t\t\td2 = doc.createElement(\"div\");\n\t\t\t_body.appendChild(d1);\n\t\t\td1.appendChild(d2);\n\t\t\td1.style.position = \"static\";\n\t\t\td1.style[_transformProp] = \"translate3d(0,0,1px)\";\n\t\t\t_hasOffsetBug = (d2.offsetParent !== d1);\n\t\t\t_body.removeChild(d1);\n\t\t}\n\t\treturn doc;\n\t},\n\t_forceNonZeroScale = e => { // walks up the element's ancestors and finds any that had their scale set to 0 via GSAP, and changes them to 0.0001 to ensure that measurements work\n\t\tlet a, cache;\n\t\twhile (e && e !== _body) {\n\t\t\tcache = e._gsap;\n\t\t\tif (cache && !cache.scaleX && !cache.scaleY && cache.renderTransform) {\n\t\t\t\tcache.scaleX = cache.scaleY = 1e-4;\n\t\t\t\tcache.renderTransform(1, cache);\n\t\t\t\ta ? a.push(cache) : (a = [cache]);\n\t\t\t}\n\t\t\te = e.parentNode;\n\t\t}\n\t\treturn a;\n\t},\n\t// possible future addition: pass an element to _forceDisplay() and it'll walk up all its ancestors and make sure anything with display: none is set to display: block, and if there's no parentNode, it'll add it to the body. It returns an Array that you can then feed to _revertDisplay() to have it revert all the changes it made.\n\t// _forceDisplay = e => {\n\t// \tlet a = [],\n\t// \t\tparent;\n\t// \twhile (e && e !== _body) {\n\t// \t\tparent = e.parentNode;\n\t// \t\t(_win.getComputedStyle(e).display === \"none\" || !parent) && a.push(e, e.style.display, parent) && (e.style.display = \"block\");\n\t// \t\tparent || _body.appendChild(e);\n\t// \t\te = parent;\n\t// \t}\n\t// \treturn a;\n\t// },\n\t// _revertDisplay = a => {\n\t// \tfor (let i = 0; i < a.length; i+=3) {\n\t// \t\ta[i+1] ? (a[i].style.display = a[i+1]) : a[i].style.removeProperty(\"display\");\n\t// \t\ta[i+2] || a[i].parentNode.removeChild(a[i]);\n\t// \t}\n\t// },\n\t_svgTemps = [], //we create 3 elements for SVG, and 3 for other DOM elements and cache them for performance reasons. They get nested in _divContainer and _svgContainer so that just one element is added to the DOM on each successive attempt. Again, performance is key.\n\t_divTemps = [],\n\t_getDocScrollTop = () => _win.pageYOffset || _doc.scrollTop || _docElement.scrollTop || _body.scrollTop || 0,\n\t_getDocScrollLeft = () => _win.pageXOffset || _doc.scrollLeft || _docElement.scrollLeft || _body.scrollLeft || 0,\n\t_svgOwner = element => element.ownerSVGElement || ((element.tagName + \"\").toLowerCase() === \"svg\" ? element : null),\n\t_isFixed = element => {\n\t\tif (_win.getComputedStyle(element).position === \"fixed\") {\n\t\t\treturn true;\n\t\t}\n\t\telement = element.parentNode;\n\t\tif (element && element.nodeType === 1) { // avoid document fragments which will throw an error.\n\t\t\treturn _isFixed(element);\n\t\t}\n\t},\n\t_createSibling = (element, i) => {\n\t\tif (element.parentNode && (_doc || _setDoc(element))) {\n\t\t\tlet svg = _svgOwner(element),\n\t\t\t\tns = svg ? (svg.getAttribute(\"xmlns\") || \"http://www.w3.org/2000/svg\") : \"http://www.w3.org/1999/xhtml\",\n\t\t\t\ttype = svg ? (i ? \"rect\" : \"g\") : \"div\",\n\t\t\t\tx = i !== 2 ? 0 : 100,\n\t\t\t\ty = i === 3 ? 100 : 0,\n\t\t\t\tcss = \"position:absolute;display:block;pointer-events:none;\",\n\t\t\t\te = _doc.createElementNS ? _doc.createElementNS(ns.replace(/^https/, \"http\"), type) : _doc.createElement(type);\n\t\t\tif (i) {\n\t\t\t\tif (!svg) {\n\t\t\t\t\tif (!_divContainer) {\n\t\t\t\t\t\t_divContainer = _createSibling(element);\n\t\t\t\t\t\t_divContainer.style.cssText = css;\n\t\t\t\t\t}\n\t\t\t\t\te.style.cssText = css + \"width:0.1px;height:0.1px;top:\" + y + \"px;left:\" + x + \"px\";\n\t\t\t\t\t_divContainer.appendChild(e);\n\n\t\t\t\t} else {\n\t\t\t\t\tif (!_svgContainer) {\n\t\t\t\t\t\t_svgContainer = _createSibling(element);\n\t\t\t\t\t}\n\t\t\t\t\te.setAttribute(\"width\", 0.01);\n\t\t\t\t\te.setAttribute(\"height\", 0.01);\n\t\t\t\t\te.setAttribute(\"transform\", \"translate(\" + x + \",\" + y + \")\");\n\t\t\t\t\t_svgContainer.appendChild(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn e;\n\t\t}\n\t\tthrow \"Need document and parent.\";\n\t},\n\t_consolidate = m => { // replaces SVGTransformList.consolidate() because a bug in Firefox causes it to break pointer events. See https://greensock.com/forums/topic/23248-touch-is-not-working-on-draggable-in-firefox-windows-v324/?tab=comments#comment-109800\n\t\tlet c = new Matrix2D(),\n\t\t\ti = 0;\n\t\tfor (; i < m.numberOfItems; i++) {\n\t\t\tc.multiply(m.getItem(i).matrix);\n\t\t}\n\t\treturn c;\n\t},\n\t_placeSiblings = (element, adjustGOffset) => {\n\t\tlet svg = _svgOwner(element),\n\t\t\tisRootSVG = element === svg,\n\t\t\tsiblings = svg ? _svgTemps : _divTemps,\n\t\t\tcontainer, m, b, x, y;\n\t\tif (element === _win) {\n\t\t\treturn element;\n\t\t}\n\t\tif (!siblings.length) {\n\t\t\tsiblings.push(_createSibling(element, 1), _createSibling(element, 2), _createSibling(element, 3));\n\t\t}\n\t\tcontainer = svg ? _svgContainer : _divContainer;\n\t\tif (svg) {\n\t\t\tb = isRootSVG ? {x:0, y:0} : element.getBBox();\n\t\t\tm = element.transform ? element.transform.baseVal : {}; // IE11 doesn't follow the spec.\n\t\t\tif (m.numberOfItems) {\n\t\t\t\tm = m.numberOfItems > 1 ? _consolidate(m) : m.getItem(0).matrix; // don't call m.consolidate().matrix because a bug in Firefox makes pointer events not work when consolidate() is called on the same tick as getBoundingClientRect()! See https://greensock.com/forums/topic/23248-touch-is-not-working-on-draggable-in-firefox-windows-v324/?tab=comments#comment-109800\n\t\t\t\tx = m.a * b.x + m.c * b.y;\n\t\t\t\ty = m.b * b.x + m.d * b.y;\n\t\t\t} else {\n\t\t\t\tm = _identityMatrix;\n\t\t\t\tx = b.x;\n\t\t\t\ty = b.y;\n\t\t\t}\n\t\t\tif (adjustGOffset && element.tagName.toLowerCase() === \"g\") {\n\t\t\t\tx = y = 0;\n\t\t\t}\n\t\t\tcontainer.setAttribute(\"transform\", \"matrix(\" + m.a + \",\" + m.b + \",\" + m.c + \",\" + m.d + \",\" + (m.e + x) + \",\" + (m.f + y) + \")\");\n\t\t\t(isRootSVG ? svg : element.parentNode).appendChild(container);\n\t\t} else {\n\t\t\tx = y = 0;\n\t\t\tif (_hasOffsetBug) { // some browsers (like Safari) have a bug that causes them to misreport offset values. When an ancestor element has a transform applied, it's supposed to treat it as if it's position: relative (new context). Safari botches this, so we need to find the closest ancestor (between the element and its offsetParent) that has a transform applied and if one is found, grab its offsetTop/Left and subtract them to compensate.\n\t\t\t\tm = element.offsetParent;\n\t\t\t\tb = element;\n\t\t\t\twhile (b && (b = b.parentNode) && b !== m && b.parentNode) {\n\t\t\t\t\tif ((_win.getComputedStyle(b)[_transformProp] + \"\").length > 4) {\n\t\t\t\t\t\tx = b.offsetLeft;\n\t\t\t\t\t\ty = b.offsetTop;\n\t\t\t\t\t\tb = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tb = container.style;\n\t\t\tb.top = (element.offsetTop - y) + \"px\";\n\t\t\tb.left = (element.offsetLeft - x) + \"px\";\n\t\t\tm = _win.getComputedStyle(element);\n\t\t\tb[_transformProp] = m[_transformProp];\n\t\t\tb[_transformOriginProp] = m[_transformOriginProp];\n\t\t\tb.border = m.border;\n\t\t\tb.borderLeftStyle = m.borderLeftStyle;\n\t\t\tb.borderTopStyle = m.borderTopStyle;\n\t\t\tb.borderLeftWidth = m.borderLeftWidth;\n\t\t\tb.borderTopWidth = m.borderTopWidth;\n\t\t\tb.position = m.position === \"fixed\" ? \"fixed\" : \"absolute\";\n\t\t\telement.parentNode.appendChild(container);\n\t\t}\n\t\treturn container;\n\t},\n\t_setMatrix = (m, a, b, c, d, e, f) => {\n\t\tm.a = a;\n\t\tm.b = b;\n\t\tm.c = c;\n\t\tm.d = d;\n\t\tm.e = e;\n\t\tm.f = f;\n\t\treturn m;\n\t};\n\nexport class Matrix2D {\n\tconstructor(a=1, b=0, c=0, d=1, e=0, f=0) {\n\t\t_setMatrix(this, a, b, c, d, e, f);\n\t}\n\n\tinverse() {\n\t\tlet {a, b, c, d, e, f} = this,\n\t\t\tdeterminant = (a * d - b * c) || 1e-10;\n\t\treturn _setMatrix(\n\t\t\tthis,\n\t\t\td / determinant,\n\t\t\t-b / determinant,\n\t\t\t-c / determinant,\n\t\t\ta / determinant,\n\t\t\t(c * f - d * e) / determinant,\n\t\t\t-(a * f - b * e) / determinant\n\t\t);\n\t}\n\n\tmultiply(matrix) {\n\t\tlet {a, b, c, d, e, f} = this,\n\t\t\ta2 = matrix.a,\n\t\t\tb2 = matrix.c,\n\t\t\tc2 = matrix.b,\n\t\t\td2 = matrix.d,\n\t\t\te2 = matrix.e,\n\t\t\tf2 = matrix.f;\n\t\treturn _setMatrix(this,\n\t\t\ta2 * a + c2 * c,\n\t\t\ta2 * b + c2 * d,\n\t\t\tb2 * a + d2 * c,\n\t\t\tb2 * b + d2 * d,\n\t\t\te + e2 * a + f2 * c,\n\t\t\tf + e2 * b + f2 * d);\n\t}\n\n\tclone() {\n\t\treturn new Matrix2D(this.a, this.b, this.c, this.d, this.e, this.f);\n\t}\n\n\tequals(matrix) {\n\t\tlet {a, b, c, d, e, f} = this;\n\t\treturn (a === matrix.a && b === matrix.b && c === matrix.c && d === matrix.d && e === matrix.e && f === matrix.f);\n\t}\n\n\tapply(point, decoratee={}) {\n\t\tlet {x, y} = point,\n\t\t\t{a, b, c, d, e, f} = this;\n\t\tdecoratee.x = (x * a + y * c + e) || 0;\n\t\tdecoratee.y = (x * b + y * d + f) || 0;\n\t\treturn decoratee;\n\t}\n\n}\n\n//feed in an element and it'll return a 2D matrix (optionally inverted) so that you can translate between coordinate spaces.\n// Inverting lets you translate a global point into a local coordinate space. No inverting lets you go the other way.\n// We needed this to work around various browser bugs, like Firefox doesn't accurately report getScreenCTM() when there\n// are transforms applied to ancestor elements.\n// The matrix math to convert any x/y coordinate is as follows, which is wrapped in a convenient apply() method of Matrix2D above:\n// tx = m.a * x + m.c * y + m.e\n// ty = m.b * x + m.d * y + m.f\nexport function getGlobalMatrix(element, inverse, adjustGOffset) { // adjustGOffset is typically used only when grabbing an element's PARENT's global matrix, and it ignores the x/y offset of any SVG <g> elements because they behave in a special way.\n\tif (!element || !element.parentNode || (_doc || _setDoc(element)).documentElement === element) {\n\t\treturn new Matrix2D();\n\t}\n\tlet zeroScales = _forceNonZeroScale(element.parentNode),\n\t\tsvg = _svgOwner(element),\n\t\ttemps = svg ? _svgTemps : _divTemps,\n\t\tcontainer = _placeSiblings(element, adjustGOffset),\n\t\tb1 = temps[0].getBoundingClientRect(),\n\t\tb2 = temps[1].getBoundingClientRect(),\n\t\tb3 = temps[2].getBoundingClientRect(),\n\t\tparent = container.parentNode,\n\t\tisFixed = _isFixed(element),\n\t\tm = new Matrix2D(\n\t\t\t(b2.left - b1.left) / 100,\n\t\t\t(b2.top - b1.top) / 100,\n\t\t\t(b3.left - b1.left) / 100,\n\t\t\t(b3.top - b1.top) / 100,\n\t\t\tb1.left + (isFixed ? 0 : _getDocScrollLeft()),\n\t\t\tb1.top + (isFixed ? 0 : _getDocScrollTop())\n\t\t);\n\tparent.removeChild(container);\n\tif (zeroScales) {\n\t\tb1 = zeroScales.length;\n\t\twhile (b1--) {\n\t\t\tb2 = zeroScales[b1];\n\t\t\tb2.scaleX = b2.scaleY = 0;\n\t\t\tb2.renderTransform(1, b2);\n\t\t}\n\t}\n\treturn inverse ? m.inverse() : m;\n}\n\n// export function getMatrix(element) {\n// \t_doc || _setDoc(element);\n// \tlet m = (_win.getComputedStyle(element)[_transformProp] + \"\").substr(7).match(/[-.]*\\d+[.e\\-+]*\\d*[e\\-\\+]*\\d*/g),\n// \t\tis2D = m && m.length === 6;\n// \treturn !m || m.length < 6 ? new Matrix2D() : new Matrix2D(+m[0], +m[1], +m[is2D ? 2 : 4], +m[is2D ? 3 : 5], +m[is2D ? 4 : 12], +m[is2D ? 5 : 13]);\n// }","/*!\n * PathEditor 3.4.2\n * https://greensock.com\n *\n * Copyright 2008-2020, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, [email protected]\n*/\n/* eslint-disable */\n\nimport { stringToRawPath, rawPathToString, bezierToPoints, simplifyPoints, pointsToSegment, subdivideSegment, getClosestData, copyRawPath, transformRawPath } from \"./paths.js\";\nimport { getGlobalMatrix, Matrix2D } from \"./matrix.js\";\n\nlet _numbersExp = /(?:(-)?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[0-9]/ig,\n\t_doc, _supportsPointer, _win, _body,\n\t_selectionColor = \"#4e7fff\",\n\t_minimumMovement = 1,\n\t_DEG2RAD = Math.PI / 180,\n\t_getTime = Date.now || (() => new Date().getTime()),\n\t_lastInteraction = 0,\n\t_isPressed = 0,\n\t_emptyFunc = () => false,\n\t_interacted = () => _lastInteraction = _getTime(),\n\t_CTRL, _ALT, _SHIFT, _CMD,\n\t_recentlyAddedAnchor,\n\t_editingAxis = {}, //stores the x/y of the most recently-selected anchor point's x and y axis. We tap into this for snapping horizontally and vertically.\n\t_history = [],\n\t_point = {}, //reuse to minimize memory and maximize performance (mostly for snapping)\n\t_temp = [], //reuse this in places like getNormalizedSVG() to conserve memory\n\t_comma = \",\",\n\t_selectedPaths = [],\n\t_preventDefault = event => {\n\t\tif (event.preventDefault) {\n\t\t\tevent.preventDefault();\n\t\t\tif (event.preventManipulation) {\n\t\t\t\tevent.preventManipulation(); //for some Microsoft browsers\n\t\t\t}\n\t\t}\n\t},\n\t_createElement = type => _doc.createElementNS ? _doc.createElementNS(\"http://www.w3.org/1999/xhtml\", type) : _doc.createElement(type),\n\t_createSVG = (type, container, attributes) => {\n\t\tlet element = _doc.createElementNS(\"http://www.w3.org/2000/svg\", type),\n\t\t\treg = /([a-z])([A-Z])/g,\n\t\t\tp;\n\t\tattributes = attributes || {};\n\t\tattributes.class = attributes.class || \"path-editor\";\n\t\tfor (p in attributes) {\n\t\t\tif (element.style[p] !== undefined) {\n\t\t\t\telement.style[p] = attributes[p];\n\t\t\t} else {\n\t\t\t\telement.setAttributeNS(null, p.replace(reg, \"$1-$2\").toLowerCase(), attributes[p]);\n\t\t\t}\n\t\t}\n\t\tcontainer.appendChild(element);\n\t\treturn element;\n\t},\n\t_identityMatrixObject = {matrix:new Matrix2D()},\n\t_getConsolidatedMatrix = target => ((target.transform && target.transform.baseVal.consolidate()) || _identityMatrixObject).matrix,\n\t_getConcatenatedTransforms = target => {\n\t\tlet m = _getConsolidatedMatrix(target),\n\t\t\towner = target.ownerSVGElement;\n\t\twhile ((target = target.parentNode) && target.ownerSVGElement === owner) {\n\t\t\tm.multiply(_getConsolidatedMatrix(target));\n\t\t}\n\t\treturn \"matrix(\" + m.a + \",\" + m.b + \",\" + m.c + \",\" + m.d + \",\" + m.e + \",\" + m.f + \")\";\n\t},\n\t_addHistory = pathEditor => {\n\t\tlet selectedIndexes = [],\n\t\t\ta = pathEditor._selectedAnchors,\n\t\t\ti;\n\t\tfor (i = 0; i < a.length; i++) {\n\t\t\tselectedIndexes[i] = a[i].i;\n\t\t}\n\t\t_history.unshift({path:pathEditor, d:pathEditor.path.getAttribute(\"d\"), transform:pathEditor.path.getAttribute(\"transform\") || \"\", selectedIndexes:selectedIndexes});\n\t\tif (_history.length > 30) {\n\t\t\t_history.length = 30;\n\t\t}\n\t},\n\t_round = value => ~~(value * 1000 + (value < 0 ? -.5 : .5)) / 1000,\n\t_getSquarePathData = size => {\n\t\tsize = _round(size);\n\t\treturn [\"M-\" + size, -size, size, -size, size, size, -size, size + \"z\"].join(_comma);\n\t},\n\t_getCirclePathData = size => {\n\t\tlet circ = 0.552284749831,\n\t\t\trcirc = _round(size * circ);\n\t\tsize = _round(size);\n\t\treturn \"M\" + size + \",0C\" + [size, rcirc, rcirc, size, 0, size, -rcirc, size, -size, rcirc, -size, 0, -size, -rcirc, -rcirc, -size, 0, -size, rcirc, -size, size, -rcirc, size, 0].join(_comma) + \"z\";\n\t},\n\t_checkDeselect = function(e) {\n\t\tif (!e.target._gsSelection && !_isPressed && _getTime() - _lastInteraction > 100) {\n\t\t\tlet i = _selectedPaths.length;\n\t\t\twhile (--i > -1) {\n\t\t\t\t_selectedPaths[i].deselect();\n\t\t\t}\n\t\t\t_selectedPaths.length = 0;\n\t\t}\n\t},\n\t_tempDiv, _touchEventLookup,\n\t_isMultiTouching = 0,\n\t_addListener = (element, type, func, capture) => {\n\t\tif (element.addEventListener) {\n\t\t\tlet touchType = _touchEventLookup[type];\n\t\t\tcapture = capture || {passive:false};\n\t\t\telement.addEventListener(touchType || type, func, capture);\n\t\t\tif (touchType && type !== touchType && touchType.substr(0, 7) !== \"pointer\") { //some browsers actually support both, so must we. But pointer events cover all.\n\t\t\t\telement.addEventListener(type, func, capture);\n\t\t\t}\n\t\t} else if (element.attachEvent) {\n\t\t\telement.attachEvent(\"on\" + type, func);\n\t\t}\n\t},\n\t_removeListener = (element, type, func) => {\n\t\tif (element.removeEventListener) {\n\t\t\tlet touchType = _touchEventLookup[type];\n\t\t\telement.removeEventListener(touchType || type, func);\n\t\t\tif (touchType && type !== touchType && touchType.substr(0, 7) !== \"pointer\") {\n\t\t\t\telement.removeEventListener(type, func);\n\t\t\t}\n\t\t} else if (element.detachEvent) {\n\t\t\telement.detachEvent(\"on\" + type, func);\n\t\t}\n\t},\n\t_hasTouchID = (list, ID) => {\n\t\tlet i = list.length;\n\t\twhile (--i > -1) {\n\t\t\tif (list[i].identifier === ID) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\t_onMultiTouchDocumentEnd = e => {\n\t\t_isMultiTouching = (e.touches && _dragCount < e.touches.length);\n\t\t_removeListener(e.target, \"touchend\", _onMultiTouchDocumentEnd);\n\t},\n\t_onMultiTouchDocument = e => {\n\t\t_isMultiTouching = (e.touches && _dragCount < e.touches.length);\n\t\t_addListener(e.target, \"touchend\", _onMultiTouchDocumentEnd);\n\t},\n\t_bind = (func, scope) => e => func.call(scope, e),\n\t_callback = (type, self, param) => {\n\t\tlet callback = self.vars[type];\n\t\tif (callback) {\n\t\t\tcallback.call(self.vars.callbackScope || self, param || self);\n\t\t}\n\t\treturn self;\n\t},\n\t_copyElement,\n\t_resetSelection = () => {\n\t\t_copyElement.style.display = \"block\";\n\t\t_copyElement.select();\n\t\t_copyElement.style.display = \"none\";\n\t},\n\t_coreInitted,\n\t_initCore = () => {\n\t\t_doc = document;\n\t\t_win = window;\n\t\t_body = _doc.body;\n\t\t_tempDiv = _createElement(\"div\");\n\t\t_copyElement = _createElement(\"textarea\");\n\t\t_copyElement.style.display = \"none\";\n\t\t_body && _body.appendChild(_copyElement);\n\t\t_touchEventLookup = (function(types) { //we create an object that makes it easy to translate touch event types into their \"pointer\" counterparts if we're in a browser that uses those instead. Like IE10 uses \"MSPointerDown\" instead of \"touchstart\", for example.\n\t\t\tlet standard = types.split(\",\"),\n\t\t\t\tconverted = ((_tempDiv.onpointerdown !== undefined) ? \"pointerdown,pointermove,pointerup,pointercancel\" : (_tempDiv.onmspointerdown !== undefined) ? \"MSPointerDown,MSPointerMove,MSPointerUp,MSPointerCancel\" : types).split(\",\"),\n\t\t\t\tobj = {},\n\t\t\t\ti = 4;\n\t\t\twhile (--i > -1) {\n\t\t\t\tobj[standard[i]] = converted[i];\n\t\t\t\tobj[converted[i]] = standard[i];\n\t\t\t}\n\t\t\treturn obj;\n\t\t}(\"touchstart,touchmove,touchend,touchcancel\"));\n\t\tSVGElement.prototype.getTransformToElement = SVGElement.prototype.getTransformToElement || function(e) { //adds Chrome support\n\t\t\treturn e.getScreenCTM().inverse().multiply(this.getScreenCTM());\n\t\t};\n\t\t_doc.addEventListener(\"keydown\", function(e) {\n\t\t\tlet key = e.keyCode || e.which,\n\t\t\t\tkeyString = e.key || key,\n\t\t\t\ti, state, a, path;\n\t\t\tif (keyString === \"Shift\" || key === 16) {\n\t\t\t\t_SHIFT = true;\n\t\t\t} else if (keyString === \"Control\" || key === 17) {\n\t\t\t\t_CTRL = true;\n\t\t\t} else if (keyString === \"Meta\" || key === 91) {\n\t\t\t\t_CMD = true;\n\t\t\t} else if (keyString === \"Alt\" || key === 18) {\n\t\t\t\t_ALT = true;\n\t\t\t\ti = _selectedPaths.length;\n\t\t\t\twhile (--i > -1) {\n\t\t\t\t\t_selectedPaths[i]._onPressAlt();\n\t\t\t\t}\n\t\t\t} else if ((keyString === \"z\" || key === 90) && (_CTRL || _CMD) && _history.length > 1) { //UNDO\n\t\t\t\t_history.shift();\n\t\t\t\tstate = _history[0];\n\t\t\t\tif (state) {\n\t\t\t\t\tpath = state.path;\n\t\t\t\t\tpath.path.setAttribute(\"d\", state.d);\n\t\t\t\t\tpath.path.setAttribute(\"transform\", state.transform);\n\t\t\t\t\tpath.init();\n\t\t\t\t\ta = path._anchors;\n\t\t\t\t\tfor (i = 0; i < a.length; i++) {\n\t\t\t\t\t\tif (state.selectedIndexes.indexOf(a[i].i) !== -1) {\n\t\t\t\t\t\t\tpath._selectedAnchors.push(a[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpath._updateAnchors();\n\t\t\t\t\tpath.update();\n\t\t\t\t\tif (path.vars.onUndo) {\n\t\t\t\t\t\tpath.vars.onUndo.call(path);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (keyString === \"Delete\" || keyString === \"Backspace\" || key === 8 || key === 46 || key === 63272 || (key === \"d\" && (_CTRL || _CMD))) { //DELETE\n\t\t\t\ti = _selectedPaths.length;\n\t\t\t\twhile (--i > -1) {\n\t\t\t\t\t_selectedPaths[i]._deleteSelectedAnchors();\n\t\t\t\t}\n\t\t\t} else if ((keyString === \"a\" || key === 65) && (_CMD || _CTRL)) { //SELECT ALL\n\t\t\t\ti = _selectedPaths.length;\n\t\t\t\twhile (--i > -1) {\n\t\t\t\t\t_selectedPaths[i].select(true);\n\t\t\t\t}\n\t\t\t}\n\t\t}, true);\n\t\t_doc.addEventListener(\"keyup\", function(e) {\n\t\t\tlet key = e.key || e.keyCode || e.which;\n\t\t\tif (key === \"Shift\" || key === 16) {\n\t\t\t\t_SHIFT = false;\n\t\t\t} else if (key === \"Control\" || key === 17) {\n\t\t\t\t_CTRL = false;\n\t\t\t} else if (key === \"Meta\" || key === 91) {\n\t\t\t\t_CMD = false;\n\t\t\t} else if (key === \"Alt\" || key === 18) {\n\t\t\t\t_ALT = false;\n\t\t\t\tlet i = _selectedPaths.length;\n\t\t\t\twhile (--i > -1) {\n\t\t\t\t\t_selectedPaths[i]._onReleaseAlt();\n\t\t\t\t}\n\t\t\t}\n\t\t}, true);\n\t\t_supportsPointer = !!_win.PointerEvent;\n\t\t_addListener(_doc, \"mouseup\", _checkDeselect);\n\t\t_addListener(_doc, \"touchend\", _checkDeselect);\n\t\t_addListener(_doc, \"touchcancel\", _emptyFunc); //some older Android devices intermittently stop dispatching \"touchmove\" events if we don't listen for \"touchcancel\" on the document. Very strange indeed.\n\t\t_addListener(_win, \"touchmove\", _emptyFunc); //works around Safari bugs that still allow the page to scroll even when we preventDefault() on the touchmove event.\n\t\t_body && _body.addEventListener(\"touchstart\", _emptyFunc); //works around Safari bug: https://greensock.com/forums/topic/21450-draggable-in-iframe-on-mobile-is-buggy/\n\t\t_coreInitted = 1;\n\t},\n\t_onPress = function(e) {\n\t\tlet self = this,\n\t\t\tctm = getGlobalMatrix(self.target.parentNode, true), //previously used self.target.parentNode.getScreenCTM().inverse() but there's a major bug in Firefox that prevents it from working properly when there's an ancestor with a transform applied, so we bootstrapped our own solution that seems ot work great across all browsers.\n\t\t\ttouchEventTarget, temp;\n\t\tthis._matrix = this.target.transform.baseVal.getItem(0).matrix;\n\t\tthis._ctm = ctm;\n\t\tif (_touchEventLookup[e.type]) { //note: on iOS, BOTH touchmove and mousemove are dispatched, but the mousemove has pageY and pageX of 0 which would mess up the calculations and needlessly hurt performance.\n\t\t\ttouchEventTarget = (e.type.indexOf(\"touch\") !== -1) ? (e.currentTarget || e.target) : _doc; //pointer-based touches (for Microsoft browsers) don't remain locked to the original target like other browsers, so we must use the document instead. The event type would be \"MSPointerDown\" or \"pointerdown\".\n\t\t\t_addListener(touchEventTarget, \"touchend\", self._onRelease);\n\t\t\t_addListener(touchEventTarget, \"touchmove\", self._onMove);\n\t\t\t_addListener(touchEventTarget, \"touchcancel\", self._onRelease);\n\t\t\t_addListener(_doc, \"touchstart\", _onMultiTouchDocument);\n\t\t\t_addListener(_win, \"touchforcechange\", _preventDefault); //otherwise iOS will scroll when dragging.\n\t\t} else {\n\t\t\ttouchEventTarget = null;\n\t\t\t_addListener(_doc, \"mousemove\", self._onMove); //attach these to the document instead of the box itself so that if the user's mouse moves too quickly (and off of the box), things still work.\n\t\t}\n\t\tif (!_supportsPointer) {\n\t\t\t_addListener(_doc, \"mouseup\", self._onRelease);\n\t\t}\n\t\t_preventDefault(e);\n\t\t_resetSelection(); // when a PathEditor is in an iframe in an environment like codepen, this helps avoid situations where the DELETE key won't actually work because the parent frame is intercepting the event.\n\t\tif (e.changedTouches) { //touch events store the data slightly differently\n\t\t\te = self.touch = e.changedTouches[0];\n\t\t\tself.touchID = e.identifier;\n\t\t} else if (e.pointerId) {\n\t\t\tself.touchID = e.pointerId; //for some Microsoft browsers\n\t\t} else {\n\t\t\tself.touch = self.touchID = null;\n\t\t}\n\t\tself._startPointerY = self.pointerY = e.pageY; //record the starting x and y so that we can calculate the movement from the original in _onMouseMove\n\t\tself._startPointerX = self.pointerX = e.pageX;\n\t\tself._startElementX = self._matrix.e;\n\t\tself._startElementY = self._matrix.f;\n\n\t\tif (this._ctm.a === 1 && this._ctm.b === 0 && this._ctm.c === 0 && this._ctm.d === 1) {\n\t\t\tthis._ctm = null;\n\t\t} else {\n\t\t\ttemp = self._startPointerX * this._ctm.a + self._startPointerY * this._ctm.c + this._ctm.e;\n\t\t\tself._startPointerY = self._startPointerX * this._ctm.b + self._startPointerY * this._ctm.d + this._ctm.f;\n\t\t\tself._startPointerX = temp;\n\t\t}\n\n\t\tself.isPressed = _isPressed = true;\n\t\tself.touchEventTarget = touchEventTarget;\n\t\tif (self.vars.onPress) {\n\t\t\tself.vars.onPress.call(self.vars.callbackScope || self, self.pointerEvent);\n\t\t}\n\t},\n\t_onMove = function(e) {\n\t\tlet self = this,\n\t\t\toriginalEvent = e,\n\t\t\ttouches, i;\n\t\tif (!self._enabled || _isMultiTouching || !self.isPressed || !e) {\n\t\t\treturn;\n\t\t}\n\t\tself.pointerEvent = e;\n\t\ttouches = e.changedTouches;\n\t\tif (touches) { //touch events store the data slightly differently\n\t\t\te = touches[0];\n\t\t\tif (e !== self.touch && e.identifier !== self.touchID) { //Usually changedTouches[0] will be what we're looking for, but in case it's not, look through the rest of the array...(and Android browsers don't reuse the event like iOS)\n\t\t\t\ti = touches.length;\n\t\t\t\twhile (--i > -1 && (e = touches[i]).identifier !== self.touchID) {}\n\t\t\t\tif (i < 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (e.pointerId && self.touchID && e.pointerId !== self.touchID) { //for some Microsoft browsers, we must attach the listener to the doc rather than the trigger so that when the finger moves outside the bounds of the trigger, things still work. So if the event we're receiving has a pointerId that doesn't match the touchID, ignore it (for multi-touch)\n\t\t\treturn;\n\t\t}\n\t\t_preventDefault(originalEvent);\n\t\tself.setPointerPosition(e.pageX, e.pageY);\n\t\tif (self.vars.onDrag) {\n\t\t\tself.vars.onDrag.call(self.vars.callbackScope || self, self.pointerEvent);\n\t\t}\n\t},\n\t_onRelease = function(e, force) {\n\t\tlet self = this;\n\t\tif (!self._enabled || !self.isPressed || (e && self.touchID != null && !force && ((e.pointerId && e.pointerId !== self.touchID) || (e.changedTouches && !_hasTouchID(e.changedTouches, self.touchID))))) { //for some Microsoft browsers, we must attach the listener to the doc rather than the trigger so that when the finger moves outside the bounds of the trigger, things still work. So if the event we're receiving has a pointerId that doesn't match the touchID, ignore it (for multi-touch)\n\t\t\treturn;\n\t\t}\n\t\t_interacted();\n\t\tself.isPressed = _isPressed = false; //TODO: if we want to accommodate multi-touch, we'd need to introduce a counter to track how many touches there are and only toggle this when they're all off.\n\t\tlet originalEvent = e,\n\t\t\twasDragging = self.isDragging,\n\t\t\ttouchEventTarget = self.touchEventTarget,\n\t\t\ttouches, i;\n\t\tif (touchEventTarget) {\n\t\t\t_removeListener(touchEventTarget, \"touchend\", self._onRelease);\n\t\t\t_removeListener(touchEventTarget, \"touchmove\", self._onMove);\n\t\t\t_removeListener(touchEventTarget, \"touchcancel\", self._onRelease);\n\t\t\t_removeListener(_doc, \"touchstart\", _onMultiTouchDocument);\n\t\t} else {\n\t\t\t_removeListener(_doc, \"mousemove\", self._onMove);\n\t\t}\n\t\tif (!_supportsPointer) {\n\t\t\t_removeListener(_doc, \"mouseup\", self._onRelease);\n\t\t\tif (e && e.target) {\n\t\t\t\t_removeListener(e.target, \"mouseup\", self._onRelease);\n\t\t\t}\n\t\t}\n\t\tif (wasDragging) {\n\t\t\tself.isDragging = false;\n\t\t} else if (self.vars.onClick) {\n\t\t\tself.vars.onClick.call(self.vars.callbackScope || self, originalEvent);\n\t\t}\n\t\tif (e) {\n\t\t\ttouches = e.changedTouches;\n\t\t\tif (touches) { //touch events store the data slightly differently\n\t\t\t\te = touches[0];\n\t\t\t\tif (e !== self.touch && e.identifier !== self.touchID) { //Usually changedTouches[0] will be what we're looking for, but in case it's not, look through the rest of the array...(and Android browsers don't reuse the event like iOS)\n\t\t\t\t\ti = touches.length;\n\t\t\t\t\twhile (--i > -1 && (e = touches[i]).identifier !== self.touchID) {}\n\t\t\t\t\tif (i < 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tself.pointerEvent = originalEvent;\n\t\t\tself.pointerX = e.pageX;\n\t\t\tself.pointerY = e.pageY;\n\t\t}\n\t\tif (originalEvent && !wasDragging && self.vars.onDragRelease) {\n\t\t\tself.vars.onDragRelease.call(self, self.pointerEvent);\n\n\t\t} else {\n\t\t\tif (originalEvent) {\n\t\t\t\t_preventDefault(originalEvent);\n\t\t\t}\n\t\t\tif (self.vars.onRelease) {\n\t\t\t\tself.vars.onRelease.call(self.vars.callbackScope || self, self.pointerEvent);\n\t\t\t}\n\t\t}\n\t\tif (wasDragging && self.vars.onDragEnd) {\n\t\t\tself.vars.onDragEnd.call(self.vars.callbackScope || self, self.pointerEvent);\n\t\t}\n\t\treturn true;\n\t},\n\t_createSegmentAnchors = (rawPath, j, editor, vars) => {\n\t\tlet segment = rawPath[j],\n\t\t\tl = segment.length,\n\t\t\ta = [],\n\t\t\ti;\n\t\tfor (i = 0; i < l; i+=6) {\n\t\t\ta.push(new Anchor(editor, rawPath, j, i, vars));\n\t\t}\n\t\treturn a;\n\t},\n\t_getLength = (segment, i, i2) => { //i is the starting index, and it'll return the length to the next x/y pair. So if you're looking for the length to handle1, you'd feed in the index of the handle control point x whereas if you're looking for the length to handle2, i would be the x of the anchor.\n\t\tlet x = segment[i2] - segment[i],\n\t\t\ty = segment[i2+1] - segment[i+1];\n\t\treturn Math.sqrt(x * x + y * y);\n\t};\n\n\nclass DraggableSVG {\n\n\tconstructor(target, vars) {\n\t\tthis.target = (typeof(target) === \"string\") ? _doc.querySelectorAll(target)[0] : target;\n\t\tthis.vars = vars || {};\n\t\tthis._onPress = _bind(_onPress, this);\n\t\tthis._onMove = _bind(_onMove, this);\n\t\tthis._onRelease = _bind(_onRelease, this);\n\t\tthis.target.setAttribute(\"transform\", (this.target.getAttribute(\"transform\") || \"\") + \" translate(0,0)\");\n\t\tthis._matrix = _getConsolidatedMatrix(this.target);\n\t\tthis.x = this._matrix.e;\n\t\tthis.y = this._matrix.f;\n\t\tthis.snap = vars.snap;\n\t\tif (!isNaN(vars.maxX) || !isNaN(vars.minX)) {\n\t\t\tthis._bounds = 1;\n\t\t\tthis.maxX = +vars.maxX;\n\t\t\tthis.minX = +vars.minX;\n\t\t} else {\n\t\t\tthis._bounds = 0;\n\t\t}\n\t\tthis.enabled(true);\n\t}\n\n\tsetPointerPosition(pointerX, pointerY) {\n\t\tlet rnd = 1000,\n\t\t\txChange, yChange, x, y, temp;\n\t\tthis.pointerX = pointerX;\n\t\tthis.pointerY = pointerY;\n\t\tif (this._ctm) {\n\t\t\ttemp = pointerX * this._ctm.a + pointerY * this._ctm.c + this._ctm.e;\n\t\t\tpointerY = pointerX * this._ctm.b + pointerY * this._ctm.d + this._ctm.f;\n\t\t\tpointerX = temp;\n\t\t}\n\t\tyChange = (pointerY - this._startPointerY);\n\t\txChange = (pointerX - this._startPointerX);\n\t\tif (yChange < _minimumMovement && yChange > -_minimumMovement) {\n\t\t\tyChange = 0;\n\t\t}\n\t\tif (xChange < _minimumMovement && xChange > -_minimumMovement) {\n\t\t\txChange = 0;\n\t\t}\n\t\tx = (((this._startElementX + xChange) * rnd) | 0) / rnd;\n\t\ty = (((this._startElementY + yChange) * rnd) | 0) / rnd;\n\t\tif (this.snap && !_SHIFT) {\n\t\t\t_point.x = x;\n\t\t\t_point.y = y;\n\t\t\tthis.snap.call(this, _point);\n\t\t\tx = _point.x;\n\t\t\ty = _point.y;\n\t\t}\n\t\tif (this.x !== x || this.y !== y) {\n\t\t\tthis._matrix.f = this.y = y;\n\t\t\tthis._matrix.e = this.x = x;\n\t\t\tif (!this.isDragging && this.isPressed) {\n\t\t\t\tthis.isDragging = true;\n\t\t\t\t_callback(\"onDragStart\", this, this.pointerEvent);\n\t\t\t}\n\t\t}\n\t}\n\n\tenabled(enabled) {\n\t\tif (!arguments.length) {\n\t\t\treturn this._enabled;\n\t\t}\n\t\tlet dragging;\n\t\tthis._enabled = enabled;\n\t\tif (enabled) {\n\t\t\tif (!_supportsPointer) {\n\t\t\t\t_addListener(this.target, \"mousedown\", this._onPress);\n\t\t\t}\n\t\t\t_addListener(this.target, \"touchstart\", this._onPress);\n\t\t\t_addListener(this.target, \"click\", this._onClick, true); //note: used to pass true for capture but it prevented click-to-play-video functionality in Firefox.\n\t\t} else {\n\t\t\tdragging = this.isDragging;\n\t\t\t_removeListener(this.target, \"mousedown\", this._onPress);\n\t\t\t_removeListener(this.target, \"touchstart\", this._onPress);\n\t\t\t_removeListener(_win, \"touchforcechange\", _preventDefault);\n\t\t\t_removeListener(this.target, \"click\", this._onClick);\n\t\t\tif (this.touchEventTarget) {\n\t\t\t\t_removeListener(this.touchEventTarget, \"touchcancel\", this._onRelease);\n\t\t\t\t_removeListener(this.touchEventTarget, \"touchend\", this._onRelease);\n\t\t\t\t_removeListener(this.touchEventTarget, \"touchmove\", this._onMove);\n\t\t\t}\n\t\t\t_removeListener(_doc, \"mouseup\", this._onRelease);\n\t\t\t_removeListener(_doc, \"mousemove\", this._onMove);\n\t\t\tthis.isDragging = this.isPressed = false;\n\t\t\tif (dragging) {\n\t\t\t\t_callback(\"onDragEnd\", this, this.pointerEvent);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n\tendDrag(e) {\n\t\tthis._onRelease(e);\n\t}\n\n}\n\n\n\n\n\nclass Anchor {\n\n\tconstructor(editor, rawPath, j, i, vars) {\n\t\tthis.editor = editor;\n\t\tthis.element = _createSVG(\"path\", editor._selection, {fill:_selectionColor, stroke:_selectionColor, strokeWidth:2, vectorEffect:\"non-scaling-stroke\"});\n\t\tthis.update(rawPath, j, i);\n\t\tthis.element._gsSelection = true;\n\t\tthis.vars = vars || {};\n\t\tthis._draggable = new DraggableSVG(this.element, {callbackScope:this, onDrag:this.onDrag, snap:this.vars.snap, onPress:this.onPress, onRelease:this.onRelease, onClick:this.onClick, onDragEnd:this.onDragEnd});\n\t}\n\n\tonPress() {\n\t\t_callback(\"onPress\", this);\n\t}\n\n\tonClick() {\n\t\t_callback(\"onClick\", this);\n\t}\n\n\tonDrag() {\n\t\tlet s = this.segment;\n\t\tthis.vars.onDrag.call(this.vars.callbackScope || this, this, this._draggable.x - s[this.i], this._draggable.y - s[this.i+1]);\n\t}\n\n\tonDragEnd() {\n\t\t_callback(\"onDragEnd\", this);\n\t}\n\n\tonRelease() {\n\t\t_callback(\"onRelease\", this);\n\t}\n\n\tupdate(rawPath, j, i) {\n\t\tif (rawPath) {\n\t\t\tthis.rawPath = rawPath;\n\t\t}\n\t\tif (arguments.length <= 1) {\n\t\t\tj = this.j;\n\t\t\ti = this.i;\n\t\t} else {\n\t\t\tthis.j = j;\n\t\t\tthis.i = i;\n\t\t}\n\t\tlet prevSmooth = this.smooth,\n\t\t\tsegment = this.rawPath[j];\n\t\tthis.segment = segment;\n\t\tthis.smooth = (i && i < segment.length - 2 && Math.abs(Math.atan2(segment[i+1] - segment[i-1], segment[i] - segment[i-2]) - Math.atan2(segment[i+3] - segment[i+1], segment[i+2] - segment[i])) < 0.09) ? 2 : 0; //0: corner, 1: smooth but not mirrored, 2: smooth and mirrored.\n\t\tif (this.smooth !== prevSmooth) {\n\t\t\tthis.element.setAttribute(\"d\", this.smooth ? this.editor._circleHandle : this.editor._squareHandle);\n\t\t}\n\t\tthis.element.setAttribute(\"transform\", \"translate(\" + segment[i] + \",\" + segment[i+1] + \")\");\n\t}\n}\n\n\n\n\nexport class PathEditor {\n\n\tconstructor(target, vars) {\n\t\tvars = vars || {};\n\t\tif (!_coreInitted) {\n\t\t\t_initCore();\n\t\t}\n\t\tthis.vars = vars;\n\t\tthis.path = (typeof(target) === \"string\") ? _doc.querySelectorAll(target)[0] : target;\n\t\tthis._g = _createSVG(\"g\", this.path.ownerSVGElement, {class:\"path-editor-g path-editor\"});\n\t\tthis._selectionHittest = _createSVG(\"path\", this._g, {stroke:\"transparent\", strokeWidth:16, fill:\"none\", vectorEffect:\"non-scaling-stroke\"});\n\t\tthis._selection = vars._selection || _createSVG(\"g\", this._g, {class:\"path-editor-selection path-editor\"});\n\t\tthis._selectionPath = _createSVG(\"path\", this._selection, {stroke:_selectionColor, strokeWidth:2, fill:\"none\", vectorEffect:\"non-scaling-stroke\"});\n\t\tthis._selectedAnchors = [];\n\t\tthis._line1 = _createSVG(\"polyline\", this._selection, {stroke:_selectionColor, strokeWidth:2, vectorEffect:\"non-scaling-stroke\"});\n\t\tthis._line2 = _createSVG(\"polyline\", this._selection, {stroke:_selectionColor, strokeWidth:2, vectorEffect:\"non-scaling-stroke\"});\n\t\tthis._line1.style.pointerEvents = this._line2.style.pointerEvents = this._selectionPath.style.pointerEvents = \"none\";\n\t\tthis._enabled = true;\n\t\tlet ctm = this.path.parentNode.getScreenCTM().inverse(),\n\t\t\tsize = (ctm.a + ctm.d) / 2 * (vars.handleSize || 5);\n\t\tthis._squareHandle = _getSquarePathData(size);\n\t\tthis._circleHandle = _getCirclePathData(size * 1.15);\n\t\tthis._handle1 = _createSVG(\"path\", this._selection, {d:this._squareHandle, fill:_selectionColor, stroke:\"transparent\", strokeWidth:6});\n\t\tthis._handle2 = _createSVG(\"path\", this._selection, {d:this._squareHandle, fill:_selectionColor, stroke:\"transparent\", strokeWidth:6});\n\t\tthis._handle1._draggable = new DraggableSVG(this._handle1, {onDrag:this._onDragHandle1, callbackScope:this, onPress:this._onPressHandle1, onRelease:this._onReleaseHandle, onClick:this._onClickHandle1, snap:vars.handleSnap});\n\t\tthis._handle2._draggable = new DraggableSVG(this._handle2, {onDrag:this._onDragHandle2, callbackScope:this, onPress:this._onPressHandle2, onRelease:this._onReleaseHandle, onClick:this._onClickHandle2, snap:vars.handleSnap});\n\t\tthis._handle1.style.visibility = this._handle2.style.visibility = \"hidden\";\n\t\tlet selectionItems = [this._handle1, this._handle2, this._line1, this._line2, this._selection, this._selectionPath, this._selectionHittest],\n\t\t\ti = selectionItems.length;\n\t\twhile (--i > -1) {\n\t\t\tselectionItems[i]._gsSelection = true; //just a flag we can check in the _checkDeselect() method to detect clicks on things that are selection-related.\n\t\t}\n\t\tif (vars.draggable !== false) {\n\t\t\tthis._draggable = new DraggableSVG(this._selectionHittest, {callbackScope:this, onPress:this.select, onRelease:this._onRelease, onDrag:this._onDragPath, onDragEnd:this._saveState, maxX:this.vars.maxX, minX:this.vars.minX});\n\t\t}\n\t\tthis.init();\n\t\tthis._selection.style.visibility = (vars.selected === false) ? \"hidden\" : \"visible\";\n\t\tif (vars.selected !== false) {\n\t\t\tthis.path._gsSelection = true;\n\t\t\t_selectedPaths.push(this);\n\t\t}\n\t\tthis._saveState();\n\t\tif (!_supportsPointer) {\n\t\t\t_addListener(this._selectionHittest, \"mousedown\", _bind(this._onClickSelectionPath, this));\n\t\t\t_addListener(this._selectionHittest, \"mouseup\", _bind(this._onRelease, this));\n\t\t}\n\t\t_addListener(this._selectionHittest, \"touchstart\", _bind(this._onClickSelectionPath, this));\n\t\t_addListener(this._selectionHittest, \"touchend\", _bind(this._onRelease, this));\n\t}\n\n\t_onRelease(e) {\n\t\tlet anchor = this._editingAnchor;\n\t\tif (anchor) {\n\t\t\t_editingAxis.x = anchor.segment[anchor.i];\n\t\t\t_editingAxis.y = anchor.segment[anchor.i+1];\n\t\t}\n\t\t_removeListener(_win, \"touchforcechange\", _preventDefault); //otherwise iOS will scroll when dragging.\n\t\t_callback(\"onRelease\", this, e);\n\t}\n\n\tinit() {\n\t\tlet pathData = this.path.getAttribute(\"d\"),\n\t\t\trawPath = stringToRawPath(pathData),\n\t\t\ttransform = this.path.getAttribute(\"transform\") || \"translate(0,0)\",\n\t\t\tcreateAnchors = (!this._rawPath || rawPath.totalPoints !== this._rawPath.totalPoints || rawPath.length !== this._rawPath.length),\n\t\t\tanchorVars = {callbackScope:this, snap:this.vars.anchorSnap, onDrag:this._onDragAnchor, onPress:this._onPressAnchor, onRelease:this._onRelease, onClick:this._onClickAnchor, onDragEnd:this._onDragEndAnchor, maxX:this.vars.maxX, minX:this.vars.minX},\n\t\t\tl, i;\n\n\t\tif (createAnchors && this._anchors && this._anchors.length) {\n\t\t\tfor (i = 0; i < this._anchors.length; i++) {\n\t\t\t\tthis._anchors[i].element.parentNode.removeChild(this._anchors[i].element);\n\t\t\t\tthis._anchors[i]._draggable.enabled(false);\n\t\t\t}\n\t\t\tthis._selectedAnchors.length = 0;\n\t\t}\n\t\tthis._rawPath = rawPath;\n\t\tif (createAnchors) {\n\t\t\tthis._anchors = _createSegmentAnchors(rawPath, 0, this, anchorVars);\n\t\t\tl = rawPath.length;\n\t\t\tif (l > 1) {\n\t\t\t\tfor (i = 1; i < l; i++) {\n\t\t\t\t\tthis._anchors = this._anchors.concat(_createSegmentAnchors(rawPath, i, this, anchorVars));\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\ti = this._anchors.length;\n\t\t\twhile (--i > -1) {\n\t\t\t\tthis._anchors[i].update(rawPath);\n\t\t\t}\n\t\t}\n\n\t\tthis._selection.appendChild(this._handle1); //for stacking order (handles should always be on top)\n\t\tthis._selection.appendChild(this._handle2);\n\t\t//\t\tthis._selectedAnchors.length = 0;\n\t\tthis._selectionPath.setAttribute(\"d\", pathData);\n\t\tthis._selectionHittest.setAttribute(\"d\", pathData);\n\t\tthis._g.setAttribute(\"transform\", _getConcatenatedTransforms(this.path.parentNode) || \"translate(0,0)\");\n\t\tthis._selection.setAttribute(\"transform\", transform);\n\t\tthis._selectionHittest.setAttribute(\"transform\", transform);\n\t\tthis._updateAnchors();\n\t\treturn this;\n\t}\n\n\t_saveState() {\n\t\t_addHistory(this);\n\t}\n\n\t_onClickSelectionPath(e) {\n\t\tif (this._selection.style.visibility === \"hidden\") {\n\t\t\tthis.select();\n\t\t} else if (_ALT || (e && e.altKey)) {\n\t\t\tlet anchorVars = {callbackScope:this, snap:this.vars.anchorSnap, onDrag:this._onDragAnchor, onPress:this._onPressAnchor, onRelease:this._onRelease, onClick:this._onClickAnchor, onDragEnd:this._onDragEndAnchor, maxX:this.vars.maxX, minX:this.vars.minX},\n\t\t\t\tctm = this._selection.getScreenCTM().inverse(),\n\t\t\t\tnewIndex, i, anchor, x, y, closestData;\n\t\t\tif (this._draggable) {\n\t\t\t\tthis._draggable._onRelease(e); //otherwise, ALT-click/dragging on a path would create a new anchor AND drag the entire path.\n\t\t\t}\n\t\t\tif (ctm) {\n\t\t\t\tx = e.clientX * ctm.a + e.clientY * ctm.c + ctm.e;\n\t\t\t\ty = e.clientX * ctm.b + e.clientY * ctm.d + ctm.f;\n\t\t\t}\n\t\t\t//DEBUG: _createSVG(\"circle\", this._selection, {fill:\"red\", r:5, cx:x, cy:y});\n\t\t\tclosestData = getClosestData(this._rawPath, x, y);\n\t\t\tsubdivideSegment(this._rawPath[closestData.j], closestData.i, closestData.t);\n\t\t\tnewIndex = closestData.i + 6;\n\t\t\tfor (i = 0; i < this._anchors.length; i++) {\n\t\t\t\tif (this._anchors[i].i >= newIndex) {\n\t\t\t\t\tthis._anchors[i].i += 6;\n\t\t\t\t}\n\t\t\t}\n\t\t\tanchor = new Anchor(this, this._rawPath, closestData.j, newIndex, anchorVars);\n\t\t\tthis._selection.appendChild(this._handle1); //for stacking order (handles should always be on top)\n\t\t\tthis._selection.appendChild(this._handle2);\n\t\t\tanchor._draggable._onPress(e);\n\t\t\t_recentlyAddedAnchor = anchor;\n\t\t\tthis._anchors.push(anchor);\n\t\t\tthis._selectedAnchors.length = 0;\n\t\t\tthis._selectedAnchors.push(anchor);\n\t\t\tthis._updateAnchors();\n\t\t\tthis.update();\n\t\t\tthis._saveState();\n\t\t}\n\t\t_resetSelection();\n\t\t_addListener(_win, \"touchforcechange\", _preventDefault); //otherwise iOS will scroll when dragging.\n\t\t_callback(\"onPress\", this);\n\t}\n\n\t_onClickHandle1() {\n\t\tlet anchor = this._editingAnchor,\n\t\t\ti = anchor.i,\n\t\t\ts = anchor.segment;\n\t\tif (_ALT && Math.abs(s[i] - s[i-2]) < 5 && Math.abs(s[i+1] - s[i-1]) < 5) {\n\t\t\tthis._onClickAnchor(anchor);\n\t\t}\n\t}\n\n\t_onClickHandle2() {\n\t\tlet anchor = this._editingAnchor,\n\t\t\ti = anchor.i,\n\t\t\ts = anchor.segment;\n\t\tif (_ALT && Math.abs(s[i] - s[i+2]) < 5 && Math.abs(s[i+1] - s[i+3]) < 5) {\n\t\t\tthis._onClickAnchor(anchor);\n\t\t}\n\t}\n\n\t_onDragEndAnchor(e) {\n\t\t_recentlyAddedAnchor = null;\n\t\tthis._saveState();\n\t}\n\n\tisSelected() {\n\t\treturn (this._selectedAnchors.length > 0);\n\t}\n\n\tselect(allAnchors) {\n\t\tthis._selection.style.visibility = \"visible\";\n\t\tthis._editingAnchor = null;\n\t\tthis.path._gsSelection = true;\n\t\tif (allAnchors === true) {\n\t\t\tlet i = this._anchors.length;\n\t\t\twhile (--i > -1) {\n\t\t\t\tthis._selectedAnchors[i] = this._anchors[i];\n\t\t\t}\n\t\t}\n\t\tif (_selectedPaths.indexOf(this) === -1) {\n\t\t\t_selectedPaths.push(this);\n\t\t}\n\t\tthis._updateAnchors();\n\t\treturn this;\n\t}\n\n\tdeselect() {\n\t\tthis._selection.style.visibility = \"hidden\";\n\t\tthis._selectedAnchors.length = 0;\n\t\tthis._editingAnchor = null;\n\t\tthis.path._gsSelection = false;\n\t\t_selectedPaths.splice(_selectedPaths.indexOf(this), 1);\n\t\tthis._updateAnchors();\n\t\treturn this;\n\t}\n\n\t_onDragPath(e) {\n\t\tlet transform = this._selectionHittest.getAttribute(\"transform\") || \"translate(0,0)\";\n\t\tthis._selection.setAttribute(\"transform\", transform);\n\t\tthis.path.setAttribute(\"transform\", transform);\n\t}\n\n\t_onPressAnchor(anchor) {\n\t\tif (this._selectedAnchors.indexOf(anchor) === -1) { //if it isn't already selected...\n\t\t\tif (!_SHIFT) {\n\t\t\t\tthis._selectedAnchors.length = 0;\n\t\t\t}\n\t\t\tthis._selectedAnchors.push(anchor);\n\t\t} else if (_SHIFT) {\n\t\t\tthis._selectedAnchors.splice(this._selectedAnchors.indexOf(anchor), 1);\n\t\t\tanchor._draggable.endDrag();\n\t\t}\n\t\t_editingAxis.x = anchor.segment[anchor.i];\n\t\t_editingAxis.y = anchor.segment[anchor.i+1];\n\t\tthis._updateAnchors();\n\t\t_callback(\"onPress\", this);\n\t}\n\n\t_deleteSelectedAnchors() {\n\t\tlet anchors = this._selectedAnchors,\n\t\t\ti = anchors.length,\n\t\t\tanchor, index, j;\n\t\twhile (--i > -1) {\n\t\t\tanchor = anchors[i];\n\t\t\tanchor.element.parentNode.removeChild(anchor.element);\n\t\t\tanchor._draggable.enabled(false);\n\t\t\tindex = anchor.i;\n\t\t\tif (!index) { //first\n\t\t\t\tanchor.segment.splice(index, 6);\n\t\t\t} else if (index < anchor.segment.length - 2) {\n\t\t\t\tanchor.segment.splice(index-2, 6);\n\t\t\t} else { //last\n\t\t\t\tanchor.segment.splice(index-4, 6);\n\t\t\t}\n\t\t\tanchors.splice(i, 1);\n\t\t\tthis._anchors.splice(this._anchors.indexOf(anchor), 1);\n\t\t\tfor (j = 0; j < this._anchors.length; j++) {\n\t\t\t\tif (this._anchors[j].i >= index) {\n\t\t\t\t\tthis._anchors[j].i -= 6;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._updateAnchors();\n\t\tthis.update();\n\t\tthis._saveState();\n\t\tif (this.vars.onDeleteAnchor) {\n\t\t\tthis.vars.onDeleteAnchor.call(this.vars.callbackScope || this);\n\t\t}\n\t}\n\n\t_onClickAnchor(anchor) {\n\t\tlet i = anchor.i,\n\t\t\tsegment = anchor.segment,\n\t\t\trnd = 1000,\n\t\t\tisEnd = (!i || i >= segment.length - 2),\n\t\t\tangle1, angle2, length1, length2, sin, cos;\n\t\tif (_ALT && _recentlyAddedAnchor !== anchor && this._editingAnchor) {\n\t\t\tanchor.smooth = !anchor.smooth;\n\t\t\tif (isEnd) { //the very ends can't be \"smooth\"\n\t\t\t\tanchor.smooth = false;\n\t\t\t}\n\t\t\tanchor.element.setAttribute(\"d\", anchor.smooth ? this._circleHandle : this._squareHandle);\n\t\t\tif (anchor.smooth && !isEnd) {\n\t\t\t\tangle1 = Math.atan2(segment[i+1] - segment[i-1], segment[i] - segment[i-2]);\n\t\t\t\tangle2 = Math.atan2(segment[i+3] - segment[i+1], segment[i+2] - segment[i]);\n\t\t\t\tangle1 = (angle1 + angle2) / 2;\n\t\t\t\tlength1 = _getLength(segment, i-2, i);\n\t\t\t\tlength2 = _getLength(segment, i, i+2);\n\t\t\t\tif (length1 < 0.2) {\n\t\t\t\t\tlength1 = (_getLength(segment, i, i-6) / 4);\n\t\t\t\t\tangle1 = angle2 || Math.atan2(segment[i+7] - segment[i-5], segment[i+6] - segment[i-6]);\n\t\t\t\t}\n\t\t\t\tif (length2 < 0.2) {\n\t\t\t\t\tlength2 = (_getLength(segment, i, i+6) / 4);\n\t\t\t\t\tangle2 = angle1 || Math.atan2(segment[i+7] - segment[i-5], segment[i+6] - segment[i-6]);\n\t\t\t\t}\n\t\t\t\tsin = Math.sin(angle1);\n\t\t\t\tcos = Math.cos(angle1);\n\t\t\t\tif (Math.abs(angle2 - angle1) < Math.PI / 2) {\n\t\t\t\t\tsin = -sin;\n\t\t\t\t\tcos = -cos;\n\t\t\t\t}\n\t\t\t\tsegment[i-2] = (((segment[i] + cos * length1) * rnd) | 0) / rnd;\n\t\t\t\tsegment[i-1] = (((segment[i+1] + sin * length1) * rnd) | 0) / rnd;\n\t\t\t\tsegment[i+2] = (((segment[i] - cos * length2) * rnd) | 0) / rnd;\n\t\t\t\tsegment[i+3] = (((segment[i+1] - sin * length2) * rnd) | 0) / rnd;\n\t\t\t\tthis._updateAnchors();\n\t\t\t\tthis.update();\n\t\t\t\tthis._saveState();\n\t\t\t} else if (!anchor.smooth && !isEnd) {\n\t\t\t\tif (i) {\n\t\t\t\t\tsegment[i-2] = segment[i];\n\t\t\t\t\tsegment[i-1] = segment[i+1];\n\t\t\t\t}\n\t\t\t\tif (i < segment.length - 2) {\n\t\t\t\t\tsegment[i+2] = segment[i];\n\t\t\t\t\tsegment[i+3] = segment[i+1];\n\t\t\t\t}\n\t\t\t\tthis._updateAnchors();\n\t\t\t\tthis.update();\n\t\t\t\tthis._saveState();\n\t\t\t}\n\t\t} else if (!_SHIFT) {\n\t\t\tthis._selectedAnchors.length = 0;\n\t\t\tthis._selectedAnchors.push(anchor);\n\t\t}\n\t\t_recentlyAddedAnchor = null;\n\t\tthis._updateAnchors();\n\t}\n\n\t_updateAnchors() {\n\t\tlet anchor = (this._selectedAnchors.length === 1) ? this._selectedAnchors[0] : null,\n\t\t\tsegment = anchor ? anchor.segment : null,\n\t\t\ti, x, y;\n\t\tthis._editingAnchor = anchor;\n\t\tfor (i = 0; i < this._anchors.length; i++) {\n\t\t\tthis._anchors[i].element.style.fill = (this._selectedAnchors.indexOf(this._anchors[i]) !== -1) ? _selectionColor : \"white\";\n\t\t\t//this._anchors[i].element.setAttribute(\"fill\", (this._selectedAnchors.indexOf(this._anchors[i]) !== -1) ? _selectionColor : \"white\");\n\t\t}\n\t\tif (anchor) {\n\t\t\tthis._handle1.setAttribute(\"d\", anchor.smooth ? this._circleHandle : this._squareHandle);\n\t\t\tthis._handle2.setAttribute(\"d\", anchor.smooth ? this._circleHandle : this._squareHandle);\n\t\t}\n\t\ti = anchor ? anchor.i : 0;\n\t\tif (anchor && i) {\n\t\t\tx = segment[i-2];\n\t\t\ty = segment[i-1]; //TODO: if they equal the anchor coordinates, just hide it.\n\t\t\tthis._handle1.style.visibility = this._line1.style.visibility = (!_ALT && x === segment[i] && y === segment[i+1]) ? \"hidden\" : \"visible\";\n\t\t\tthis._handle1.setAttribute(\"transform\", \"translate(\" + x + _comma + y + \")\");\n\t\t\tthis._line1.setAttribute(\"points\", x + _comma + y + _comma + segment[i] + _comma + segment[i+1]);\n\t\t} else {\n\t\t\tthis._handle1.style.visibility = this._line1.style.visibility = \"hidden\";\n\t\t}\n\t\tif (anchor && i < segment.length - 2) {\n\t\t\tx = segment[i+2];\n\t\t\ty = segment[i+3];\n\t\t\tthis._handle2.style.visibility = this._line2.style.visibility = (!_ALT && x === segment[i] && y === segment[i+1]) ? \"hidden\" : \"visible\";\n\t\t\tthis._handle2.setAttribute(\"transform\", \"translate(\" + x + _comma + y + \")\");\n\t\t\tthis._line2.setAttribute(\"points\", segment[i] + _comma + segment[i+1] + _comma + x + _comma + y);\n\n\t\t} else {\n\t\t\tthis._handle2.style.visibility = this._line2.style.visibility = \"hidden\";\n\t\t}\n\t}\n\n\t_onPressAlt() {\n\t\tlet anchor = this._editingAnchor;\n\t\tif (anchor) {\n\t\t\tif (anchor.i) {\n\t\t\t\tthis._handle1.style.visibility = this._line1.style.visibility = \"visible\";\n\t\t\t}\n\t\t\tif (anchor.i < anchor.segment.length - 2) {\n\t\t\t\tthis._handle2.style.visibility = this._line2.style.visibility = \"visible\";\n\t\t\t}\n\t\t}\n\t}\n\n\t_onReleaseAlt() {\n\t\tlet anchor = this._editingAnchor,\n\t\t\ts, i;\n\t\tif (anchor) {\n\t\t\ts = anchor.segment;\n\t\t\ti = anchor.i;\n\t\t\tif (s[i] === s[i-2] && s[i+1] === s[i-1]) {\n\t\t\t\tthis._handle1.style.visibility = this._line1.style.visibility = \"hidden\";\n\t\t\t}\n\t\t\tif (s[i] === s[i+2] && s[i+1] === s[i+3]) {\n\t\t\t\tthis._handle2.style.visibility = this._line2.style.visibility = \"hidden\";\n\t\t\t}\n\t\t}\n\t}\n\n\t_onPressHandle1() {\n\t\tif (this._editingAnchor.smooth) {\n\t\t\tthis._oppositeHandleLength = _getLength(this._editingAnchor.segment, this._editingAnchor.i, this._editingAnchor.i+2);\n\t\t}\n\t\t_callback(\"onPress\", this);\n\t}\n\n\t_onPressHandle2() {\n\t\tif (this._editingAnchor.smooth) {\n\t\t\tthis._oppositeHandleLength = _getLength(this._editingAnchor.segment, this._editingAnchor.i-2, this._editingAnchor.i);\n\t\t}\n\t\t_callback(\"onPress\", this);\n\t}\n\n\t_onReleaseHandle(e) {\n\t\tthis._onRelease(e);\n\t\tthis._saveState();\n\t}\n\n\t_onDragHandle1() {\n\t\tlet anchor = this._editingAnchor,\n\t\t\ts = anchor.segment,\n\t\t\ti = anchor.i,\n\t\t\trnd = 1000,\n\t\t\tx = this._handle1._draggable.x,\n\t\t\ty = this._handle1._draggable.y,\n\t\t\tangle;\n\t\ts[i-2] = x = ((x * rnd) | 0) / rnd;\n\t\ts[i-1] = y = ((y * rnd) | 0) / rnd;\n\t\tif (anchor.smooth) {\n\t\t\tif (_ALT) {\n\t\t\t\tanchor.smooth = false;\n\t\t\t\tanchor.element.setAttribute(\"d\", this._squareHandle);\n\t\t\t\tthis._handle1.setAttribute(\"d\", this._squareHandle);\n\t\t\t\tthis._handle2.setAttribute(\"d\", this._squareHandle);\n\t\t\t} else {\n\t\t\t\tangle = Math.atan2(s[i+1] - y, s[i] - x);\n\t\t\t\tx = this._oppositeHandleLength * Math.cos(angle);\n\t\t\t\ty = this._oppositeHandleLength * Math.sin(angle);\n\t\t\t\ts[i+2] = (((s[i] + x) * rnd) | 0) / rnd;\n\t\t\t\ts[i+3] = (((s[i+1] + y) * rnd) | 0) / rnd;\n\t\t\t}\n\n\t\t}\n\t\tthis.update();\n\t}\n\n\t_onDragHandle2() {\n\t\tlet anchor = this._editingAnchor,\n\t\t\ts = anchor.segment,\n\t\t\ti = anchor.i,\n\t\t\trnd = 1000,\n\t\t\tx = this._handle2._draggable.x,\n\t\t\ty = this._handle2._draggable.y,\n\t\t\tangle;\n\t\ts[i+2] = x = ((x * rnd) | 0) / rnd;\n\t\ts[i+3] = y = ((y * rnd) | 0) / rnd;\n\t\tif (anchor.smooth) {\n\t\t\tif (_ALT) {\n\t\t\t\tanchor.smooth = false;\n\t\t\t\tanchor.element.setAttribute(\"d\", this._squareHandle);\n\t\t\t\tthis._handle1.setAttribute(\"d\", this._squareHandle);\n\t\t\t\tthis._handle2.setAttribute(\"d\", this._squareHandle);\n\t\t\t} else {\n\t\t\t\tangle = Math.atan2(s[i+1] - y, s[i] - x);\n\t\t\t\tx = this._oppositeHandleLength * Math.cos(angle);\n\t\t\t\ty = this._oppositeHandleLength * Math.sin(angle);\n\t\t\t\ts[i-2] = (((s[i] + x) * rnd) | 0) / rnd;\n\t\t\t\ts[i-1] = (((s[i+1] + y) * rnd) | 0) / rnd;\n\t\t\t}\n\n\t\t}\n\t\tthis.update();\n\t}\n\n\t_onDragAnchor(anchor, changeX, changeY) {\n\t\tlet anchors = this._selectedAnchors,\n\t\t\tl = anchors.length,\n\t\t\trnd = 1000,\n\t\t\ti, j, s, a;\n\t\tfor (j = 0; j < l; j++) {\n\t\t\ta = anchors[j];\n\t\t\ti = a.i;\n\t\t\ts = a.segment;\n\t\t\tif (i) {\n\t\t\t\ts[i-2] = (((s[i-2] + changeX) * rnd) | 0) / rnd;\n\t\t\t\ts[i-1] = (((s[i-1] + changeY) * rnd) | 0) / rnd;\n\t\t\t}\n\t\t\ts[i] = (((s[i] + changeX) * rnd) | 0) / rnd;\n\t\t\ts[i+1] = (((s[i+1] + changeY) * rnd) | 0) / rnd;\n\t\t\tif (i < s.length - 2) {\n\t\t\t\ts[i+2] = (((s[i+2] + changeX) * rnd) | 0) / rnd;\n\t\t\t\ts[i+3] = (((s[i+3] + changeY) * rnd) | 0) / rnd;\n\t\t\t}\n\t\t\tif (a !== anchor) {\n\t\t\t\ta.element.setAttribute(\"transform\", \"translate(\" + (s[i]) + _comma + (s[i+1]) + \")\");\n\t\t\t}\n\t\t}\n\t\tthis.update();\n\t}\n\n\tenabled(enabled) {\n\t\tif (!arguments.length) {\n\t\t\treturn this._enabled;\n\t\t}\n\t\tlet i = this._anchors.length;\n\t\twhile (--i > -1) {\n\t\t\tthis._anchors[i]._draggable.enabled(enabled);\n\t\t}\n\t\tthis._enabled = enabled;\n\t\tthis._handle1._draggable.enabled(enabled);\n\t\tthis._handle2._draggable.enabled(enabled);\n\t\tif (this._draggable) {\n\t\t\tthis._draggable.enabled(enabled);\n\t\t}\n\t\tif (!enabled) {\n\t\t\tthis.deselect();\n\t\t\tthis.path.ownerSVGElement.removeChild(this._selectionHittest);\n\t\t\tthis.path.ownerSVGElement.removeChild(this._selection);\n\t\t} else if (!this._selection.parentNode) {\n\t\t\tthis.path.ownerSVGElement.appendChild(this._selectionHittest);\n\t\t\tthis.path.ownerSVGElement.appendChild(this._selection);\n\t\t\tthis.init();\n\t\t\tthis._saveState();\n\t\t}\n\t\tthis._updateAnchors();\n\t\treturn this.update();\n\t}\n\n\tupdate(readPath) {\n\t\tlet d = \"\",\n\t\t\tanchor = this._editingAnchor,\n\t\t\ti, s, x, y;\n\t\tif (readPath) {\n\t\t\tthis.init();\n\t\t}\n\t\tif (anchor) {\n\t\t\ti = anchor.i;\n\t\t\ts = anchor.segment;\n\t\t\tif (i) {\n\t\t\t\tx = s[i-2];\n\t\t\t\ty = s[i-1];\n\t\t\t\tthis._handle1.setAttribute(\"transform\", \"translate(\" + (x) + _comma + (y) + \")\");\n\t\t\t\tthis._line1.setAttribute(\"points\", x + _comma + y + _comma + s[i] + _comma + s[i+1]);\n\t\t\t}\n\t\t\tif (i < s.length - 2) {\n\t\t\t\tx = s[i+2];\n\t\t\t\ty = s[i+3];\n\t\t\t\tthis._handle2.setAttribute(\"transform\", \"translate(\" + (x) + _comma + (y) + \")\");\n\t\t\t\tthis._line2.setAttribute(\"points\", s[i] + _comma + s[i+1] + _comma + x + _comma + y);\n\t\t\t}\n\t\t}\n\n\t\tif (readPath) {\n\t\t\td = this.path.getAttribute(\"d\");\n\t\t} else {\n\t\t\tfor (i = 0; i < this._rawPath.length; i++) {\n\t\t\t\ts = this._rawPath[i];\n\t\t\t\tif (s.length > 7) {\n\t\t\t\t\td += \"M\" + s[0] + _comma + s[1] + \"C\" + s.slice(2).join(_comma);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.path.setAttribute(\"d\", d);\n\t\t\tthis._selectionPath.setAttribute(\"d\", d);\n\t\t\tthis._selectionHittest.setAttribute(\"d\", d);\n\t\t}\n\n\t\tif (this.vars.onUpdate && this._enabled) {\n\t\t\t_callback(\"onUpdate\", this, d);\n\t\t}\n\t\treturn this;\n\t}\n\n\tgetRawPath(applyTransforms, offsetX, offsetY) {\n\t\tif (applyTransforms) {\n\t\t\tlet m = _getConsolidatedMatrix(this.path);\n\t\t\treturn transformRawPath(copyRawPath(this._rawPath), 1, 0, 0, 1, m.e + (offsetX || 0), m.f + (offsetY || 0));\n\t\t}\n\t\treturn this._rawPath;\n\t}\n\n\tgetString(applyTransforms, offsetX, offsetY) {\n\t\tif (applyTransforms) {\n\t\t\tlet m = _getConsolidatedMatrix(this.path);\n\t\t\treturn rawPathToString(transformRawPath(copyRawPath(this._rawPath), 1, 0, 0, 1, m.e + (offsetX || 0), m.f + (offsetY || 0)));\n\t\t}\n\t\treturn this.path.getAttribute(\"d\");\n\t}\n\n\tgetNormalizedSVG(height, originY, shorten, onEaseError) {\n\t\tlet s = this._rawPath[0],\n\t\t\ttx = s[0] * -1,\n\t\t\tty = (originY === 0) ? 0 : -(originY || s[1]),\n\t\t\tl = s.length,\n\t\t\tsx = 1 / (s[l-2] + tx),\n\t\t\tsy = -height || (s[l-1] + ty),\n\t\t\trnd = 1000,\n\t\t\tpoints, i, x1, y1, x2, y2;\n\t\t_temp.length = 0;\n\t\tif (sy) { //typically y ends at 1 (so that the end values are reached)\n\t\t\tsy = 1 / sy;\n\t\t} else { //in case the ease returns to its beginning value, scale everything proportionally\n\t\t\tsy = -sx;\n\t\t}\n\t\tsx *= rnd;\n\t\tsy *= rnd;\n\t\tfor (i = 0; i < l; i += 2) {\n\t\t\t_temp[i] = (((s[i] + tx) * sx) | 0) / rnd;\n\t\t\t_temp[i+1] = (((s[i+1] + ty) * sy) | 0) / rnd;\n\t\t}\n\n\t\tif (onEaseError) {\n\t\t\tpoints = [];\n\t\t\tl = _temp.length;\n\t\t\tfor (i = 2; i < l; i+=6) {\n\t\t\t\tx1 = _temp[i-2];\n\t\t\t\ty1 = _temp[i-1];\n\t\t\t\tx2 = _temp[i+4];\n\t\t\t\ty2 = _temp[i+5];\n\t\t\t\tpoints.push(x1, y1, x2, y2);\n\t\t\t\tbezierToPoints(x1, y1, _temp[i], _temp[i+1], _temp[i+2], _temp[i+3], x2, y2, 0.001, points, points.length - 2);\n\t\t\t}\n\t\t\tx1 = points[0];\n\t\t\tl = points.length;\n\t\t\tfor (i = 2; i < l; i+=2) {\n\t\t\t\tx2 = points[i];\n\t\t\t\tif (x2 < x1 || x2 > 1 || x2 < 0) {\n\t\t\t\t\tonEaseError();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tx1 = x2;\n\t\t\t}\n\t\t}\n\n\t\tif (shorten && l === 8 && _temp[0] === 0 && _temp[1] === 0 && _temp[l-2] === 1 && _temp[l-1] === 1) {\n\t\t\treturn _temp.slice(2, 6).join(\",\");\n\t\t}\n\t\t_temp[2] = \"C\" + _temp[2];\n\t\treturn \"M\" + _temp.join(\",\");\n\t}\n\n}\n\n\n\n\n\nPathEditor.simplifyPoints = simplifyPoints;\nPathEditor.pointsToSegment = pointsToSegment;\nPathEditor.simplifySVG = (data, vars) => { //takes a <path> element or data string and simplifies it according to whatever tolerance you set (default:1, the bigger the number the more variance there can be). vars: {tolerance:1, cornerThreshold:degrees, curved:true}\n\tlet element, points, i, x1, x2, y1, y2, bezier, precision, tolerance, l, cornerThreshold;\n\tvars = vars || {};\n\ttolerance = vars.tolerance || 1;\n\tprecision = vars.precision || (1 / tolerance);\n\tcornerThreshold = (vars.cornerThreshold === undefined ? 18 : +vars.cornerThreshold) * _DEG2RAD;\n\tif (typeof(data) !== \"string\") { //element\n\t\telement = data;\n\t\tdata = element.getAttribute(\"d\");\n\t}\n\tif (data.charAt(0) === \"#\" || data.charAt(0) === \".\") { //selector text\n\t\telement = _doc.querySelector(data);\n\t\tif (element) {\n\t\t\tdata = element.getAttribute(\"d\");\n\t\t}\n\t}\n\tpoints = (vars.curved === false && !/[achqstvz]/ig.test(data)) ? data.match(_numbersExp) : stringToRawPath(data)[0];\n\tif (vars.curved !== false) {\n\t\tbezier = points;\n\t\tpoints = [];\n\t\tl = bezier.length;\n\t\tfor (i = 2; i < l; i+=6) {\n\t\t\tx1 = +bezier[i-2];\n\t\t\ty1 = +bezier[i-1];\n\t\t\tx2 = +bezier[i+4];\n\t\t\ty2 = +bezier[i+5];\n\t\t\tpoints.push(_round(x1), _round(y1), _round(x2), _round(y2));\n\t\t\tbezierToPoints(x1, y1, +bezier[i], +bezier[i+1], +bezier[i+2], +bezier[i+3], x2, y2, 1 / (precision * 200000), points, points.length - 2);\n\t\t}\n\t\tpoints = pointsToSegment(simplifyPoints(points, tolerance), vars.curviness, cornerThreshold);\n\t\tpoints[2] = \"C\" + points[2];\n\t} else {\n\t\tpoints = simplifyPoints(points, tolerance);\n\t}\n\tdata = \"M\" + points.join(\",\");\n\tif (element) {\n\t\telement.setAttribute(\"d\", data);\n\t}\n\treturn data;\n};\n\nPathEditor.create = (target, vars) => new PathEditor(target, vars);\n\nPathEditor.editingAxis = _editingAxis;\n\nPathEditor.getSnapFunction = (vars) => { //{gridSize, radius, x, y, width, height}\n\tlet r = vars.radius || 2,\n\t\tbig = 1e20,\n\t\tminX = (vars.x || vars.x === 0) ? vars.x : vars.width ? 0 : -big,\n\t\tminY = (vars.y || vars.y === 0) ? vars.y : vars.height ? 0 : -big,\n\t\tmaxX = minX + (vars.width || big*big),\n\t\tmaxY = minY + (vars.height || big*big),\n\t\tcontainX = (vars.containX !== false),\n\t\tcontainY = (vars.containY !== false),\n\t\taxis = vars.axis,\n\t\tgrid = vars.gridSize;\n\tr *= r;\n\treturn p => {\n\t\tlet x = p.x,\n\t\t\ty = p.y,\n\t\t\tgridX, gridY, dx, dy;\n\t\tif ((containX && x < minX) || (dx = x - minX) * dx < r) {\n\t\t\tx = minX;\n\t\t} else if ((containX && x > maxX) || (dx = maxX - x) * dx < r) {\n\t\t\tx = maxX;\n\t\t}\n\t\tif ((containY && y < minY) || (dy = y - minY) * dy < r) {\n\t\t\ty = minY;\n\t\t} else if ((containY && y > maxY) || (dy = maxY - y) * dy < r) {\n\t\t\ty = maxY;\n\t\t}\n\t\tif (axis) {\n\t\t\tdx = x - axis.x;\n\t\t\tdy = y - axis.y;\n\t\t\tif (dx * dx < r) {\n\t\t\t\tx = axis.x;\n\t\t\t}\n\t\t\tif (dy * dy < r) {\n\t\t\t\ty = axis.y;\n\t\t\t}\n\t\t}\n\t\tif (grid) {\n\t\t\tgridX = minX + Math.round((x - minX) / grid) * grid; //closest grid slot on x-axis\n\t\t\tdx = gridX - x;\n\t\t\tgridY = minY + Math.round((y - minY) / grid) * grid; //closest grid slot on y-axis\n\t\t\tdy = gridY - y;\n\t\t\tif (dx * dx + dy * dy < r) {\n\t\t\t\tx = gridX;\n\t\t\t\ty = gridY;\n\t\t\t}\n\t\t}\n\t\tp.x = x;\n\t\tp.y = y;\n\t};\n};\n\nPathEditor.version = \"3.4.2\";\n\nexport { PathEditor as default };","/*!\n * MotionPathHelper 3.4.2\n * https://greensock.com\n *\n * @license Copyright 2008-2020, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, [email protected]\n*/\n/* eslint-disable */\n\nimport PathEditor from \"./utils/PathEditor.js\";\n\nlet gsap, _win, _doc, _docEl, _body, MotionPathPlugin, _arrayToRawPath, _rawPathToString,\n\t_bonusValidated = 1, //<name>MotionPathHelper</name>\n\t_selectorExp = /(^[#\\.][a-z]|[a-y][a-z])/i,\n\t_isString = value => typeof(value) === \"string\",\n\t_createElement = (type, ns) => {\n\t\tlet e = _doc.createElementNS ? _doc.createElementNS((ns || \"http://www.w3.org/1999/xhtml\").replace(/^https/, \"http\"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making \"style\" inaccessible.\n\t\treturn e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://greensock.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/).\n\t},\n\t_getPositionOnPage = target => {\n\t\tlet bounds = target.getBoundingClientRect(),\n\t\t\twindowOffsetY = _docEl.clientTop - (_win.pageYOffset || _docEl.scrollTop || _body.scrollTop || 0),\n\t\t\twindowOffsetX = _docEl.clientLeft - (_win.pageXOffset || _docEl.scrollLeft || _body.scrollLeft || 0);\n\t\treturn {left:bounds.left + windowOffsetX, top:bounds.top + windowOffsetY, right: bounds.right + windowOffsetX, bottom: bounds.bottom + windowOffsetY};\n\t},\n\t_getInitialPath = (x, y) => {\n\t\tlet coordinates = [0,31,8,58,24,75,40,90,69,100,100,100],\n\t\t\ti;\n\t\tfor (i = 0; i < coordinates.length; i+=2) {\n\t\t\tcoordinates[i] += x;\n\t\t\tcoordinates[i+1] += y;\n\t\t}\n\t\treturn \"M\" + x + \",\" + y + \"C\" + coordinates.join(\",\");\n\t},\n\t_getGlobalTime = animation => {\n\t\tlet time = animation.totalTime();\n\t\twhile (animation) {\n\t\t\ttime = animation.startTime() + time / (animation.timeScale() || 1);\n\t\t\tanimation = animation.parent;\n\t\t}\n\t\treturn time;\n\t},\n\t_copyElement,\n\t_initCopyToClipboard = () => {\n\t\t_copyElement = _createElement(\"textarea\");\n\t\t_copyElement.style.display = \"none\";\n\t\t_body.appendChild(_copyElement);\n\t},\n\t_parsePath = (path, target, vars) => (_isString(path) && _selectorExp.test(path)) ? _doc.querySelector(path) : Array.isArray(path) ? _rawPathToString(_arrayToRawPath([{x:gsap.getProperty(target, \"x\"), y:gsap.getProperty(target, \"y\")}, ...path], vars)) : (_isString(path) || path && (path.tagName + \"\").toLowerCase() === \"path\") ? path : 0,\n\t_addCopyToClipboard = (target, getter, onComplete) => {\n\t\ttarget.addEventListener('click', e => {\n\t\t\tif (e.target._gsHelper) {\n\t\t\t\tlet c = getter(e.target);\n\t\t\t\t_copyElement.value = c;\n\t\t\t\tif (c && _copyElement.select) {\n\t\t\t\t\tconsole.log(c);\n\t\t\t\t\t_copyElement.style.display = \"block\";\n\t\t\t\t\t_copyElement.select();\n\t\t\t\t\ttry {\n\t\t\t\t\t\t_doc.execCommand('copy');\n\t\t\t\t\t\t_copyElement.blur();\n\t\t\t\t\t\tonComplete && onComplete(target);\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tconsole.warn(\"Copy didn't work; this browser doesn't permit that.\");\n\t\t\t\t\t}\n\t\t\t\t\t_copyElement.style.display = \"none\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\t_identityMatrixObject = {matrix:{a:1, b:0, c:0, d:1, e:0, f:0}},\n\t_getConsolidatedMatrix = target => (target.transform.baseVal.consolidate() || _identityMatrixObject).matrix,\n\t_findMotionPathTween = target => {\n\t\tlet tweens = gsap.getTweensOf(target),\n\t\t\ti = 0;\n\t\tfor (; i < tweens.length; i++) {\n\t\t\tif (tweens[i].vars.motionPath) {\n\t\t\t\treturn tweens[i];\n\t\t\t} else if (tweens[i].timeline) {\n\t\t\t\ttweens.push(...tweens[i].timeline.getChildren());\n\t\t\t}\n\t\t}\n\t},\n\t_initCore = (core, required) => {\n\t\tlet message = \"Please gsap.registerPlugin(MotionPathPlugin)\";\n\t\t_win = window;\n\t\tgsap = gsap || core || _win.gsap || console.warn(message);\n\t\t_doc = document;\n\t\t_body = _doc.body;\n\t\t_docEl = _doc.documentElement;\n\t\tMotionPathPlugin = gsap && gsap.plugins.motionPath;\n\t\tif (!MotionPathPlugin) {\n\t\t\t(required === true) && console.warn(message);\n\t\t} else {\n\t\t\t_initCopyToClipboard();\n\t\t\t_arrayToRawPath = MotionPathPlugin.arrayToRawPath;\n\t\t\t_rawPathToString = MotionPathPlugin.rawPathToString;\n\t\t}\n\t};\n\nexport class MotionPathHelper {\n\n\tconstructor(targetOrTween, vars = {}) {\n\t\tif (!MotionPathPlugin) {\n\t\t\t_initCore(vars.gsap, 1);\n\t\t}\n\t\tlet copyButton = _createElement(\"div\"),\n\t\t\tself = this,\n\t\t\toffset = {x:0, y:0},\n\t\t\ttarget, path, isSVG, startX, startY, position, svg, animation, svgNamespace, temp, matrix, refreshPath, animationToScrub;\n\t\tif (targetOrTween instanceof gsap.core.Tween) {\n\t\t\tanimation = targetOrTween;\n\t\t\ttarget = animation.targets()[0];\n\t\t} else {\n\t\t\ttarget = gsap.utils.toArray(targetOrTween)[0];\n\t\t\tanimation = _findMotionPathTween(target);\n\t\t}\n\t\tpath = _parsePath(vars.path, target, vars);\n\t\tthis.offset = offset;\n\t\tposition = _getPositionOnPage(target);\n\t\tstartX = parseFloat(gsap.getProperty(target, \"x\", \"px\"));\n\t\tstartY = parseFloat(gsap.getProperty(target, \"y\", \"px\"));\n\t\tisSVG = (target.getCTM && target.tagName.toLowerCase() !== \"svg\");\n\t\tif (animation && !path) {\n\t\t\tpath = _parsePath(animation.vars.motionPath.path || animation.vars.motionPath, target, animation.vars.motionPath);\n\t\t}\n\t\tcopyButton.setAttribute(\"class\", \"copy-motion-path\");\n\t\tcopyButton.style.cssText = \"border-radius:8px; background-color:rgba(85, 85, 85, 0.7); color:#fff; cursor:pointer; padding:6px 12px; font-family:Signika Negative, Arial, sans-serif; position:fixed; left:50%; transform:translate(-50%, 0); font-size:19px; bottom:10px\";\n\t\tcopyButton.innerText = \"COPY MOTION PATH\";\n\t\tcopyButton._gsHelper = self;\n\t\t(gsap.utils.toArray(vars.container)[0] || _body).appendChild(copyButton);\n\t\t_addCopyToClipboard(copyButton, () => self.getString(), () => gsap.fromTo(copyButton, {backgroundColor:\"white\"}, {duration:0.5, backgroundColor:\"rgba(85, 85, 85, 0.6)\"}));\n\t\tsvg = path && path.ownerSVGElement;\n\t\tif (!svg) {\n\t\t\tsvgNamespace = (isSVG && target.ownerSVGElement && target.ownerSVGElement.getAttribute(\"xmlns\")) || \"http://www.w3.org/2000/svg\";\n\t\t\tif (isSVG) {\n\t\t\t\tsvg = target.ownerSVGElement;\n\t\t\t\ttemp = target.getBBox();\n\t\t\t\tmatrix = _getConsolidatedMatrix(target);\n\t\t\t\tstartX = matrix.e;\n\t\t\t\tstartY = matrix.f;\n\t\t\t\toffset.x = temp.x;\n\t\t\t\toffset.y = temp.y;\n\t\t\t} else {\n\t\t\t\tsvg = _createElement(\"svg\", svgNamespace);\n\t\t\t\t_body.appendChild(svg);\n\t\t\t\tsvg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\t\t\t\tsvg.style.cssText = \"overflow:visible; background-color: transparent; position:absolute; width:100px; height:100px; top:\" + position.top + \"px; left:\" + position.left + \"px;\";\n\t\t\t}\n\t\t\ttemp = _isString(path) && !_selectorExp.test(path) ? path : _getInitialPath(startX, startY);\n\t\t\tpath = _createElement(\"path\", svgNamespace);\n\t\t\tpath.setAttribute(\"d\", temp);\n\t\t\tpath.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n\t\t\tpath.style.cssText = \"fill:transparent; stroke-width:\" + (vars.pathWidth || 3) + \"; stroke:\" + (vars.pathColor || \"#555\") + \"; opacity:\" + (vars.pathOpacity || 0.6);\n\t\t\tsvg.appendChild(path);\n\t\t\tif (offset.x || offset.y) {\n\t\t\t\tgsap.set(path, {x:offset.x, y:offset.y});\n\t\t\t}\n\t\t}\n\n\t\tif (!(\"selected\" in vars)) {\n\t\t\tvars.selected = true;\n\t\t}\n\t\tif (!(\"anchorSnap\" in vars)) {\n\t\t\tvars.anchorSnap = p => {\n\t\t\t\tif (p.x * p.x + p.y * p.y < 16) {\n\t\t\t\t\tp.x = p.y = 0;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tanimationToScrub = animation && animation.parent.data === \"nested\" ? animation.parent.parent : animation;\n\n\t\tvars.onPress = () => {\n\t\t\tanimationToScrub.pause(0);\n\t\t};\n\n\t\trefreshPath = () => {\n\t\t\t//let m = _getConsolidatedMatrix(path);\n\t\t\t//animation.vars.motionPath.offsetX = m.e - offset.x;\n\t\t\t//animation.vars.motionPath.offsetY = m.f - offset.y;\n\t\t\tanimation.invalidate();\n\t\t\tanimationToScrub.restart();\n\t\t};\n\t\tvars.onRelease = vars.onDeleteAnchor = refreshPath;\n\n\t\tthis.editor = PathEditor.create(path, vars);\n\t\tif (vars.center) {\n\t\t\tgsap.set(target, {transformOrigin:\"50% 50%\", xPercent:-50, yPercent:-50});\n\t\t}\n\t\tif (animation) {\n\t\t\tif (animation.vars.motionPath.path) {\n\t\t\t\tanimation.vars.motionPath.path = path;\n\t\t\t} else {\n\t\t\t\tanimation.vars.motionPath = {path:path};\n\t\t\t}\n\t\t\tif (animationToScrub.parent !== gsap.globalTimeline) {\n\t\t\t\tgsap.globalTimeline.add(animationToScrub, _getGlobalTime(animationToScrub) - animationToScrub.delay());\n\t\t\t}\n\t\t\tanimationToScrub.repeat(-1).repeatDelay(1);\n\n\t\t} else {\n\t\t\tanimation = animationToScrub = gsap.to(target, {\n\t\t\t\tmotionPath: {\n\t\t\t\t\tpath: path,\n\t\t\t\t\tstart: vars.start || 0,\n\t\t\t\t\tend: (\"end\" in vars) ? vars.end : 1,\n\t\t\t\t\tautoRotate: (\"autoRotate\" in vars) ? vars.autoRotate : false,\n\t\t\t\t\talign: path,\n\t\t\t\t\talignOrigin: vars.alignOrigin\n\t\t\t\t},\n\t\t\t\tduration: vars.duration || 5,\n\t\t\t\tease: vars.ease || \"power1.inOut\",\n\t\t\t\trepeat:-1,\n\t\t\t\trepeatDelay:1,\n\t\t\t\tpaused:!vars.path\n\t\t\t});\n\t\t}\n\t\tthis.animation = animation;\n\t}\n\n\tgetString() {\n\t\treturn this.editor.getString(true, -this.offset.x, -this.offset.y);\n\t}\n\n}\n\nMotionPathHelper.register = _initCore;\nMotionPathHelper.create = (target, vars) => new MotionPathHelper(target, vars);\nMotionPathHelper.editPath = (path, vars) => PathEditor.create(path, vars);\nMotionPathHelper.version = \"3.4.2\";\n\nexport { MotionPathHelper as default };"],"names":["_round","value","Math","round","_copyMetaData","source","copy","totalLength","samples","slice","lookup","minLength","resolution","totalPoints","_bestDistance","_svgPathExp","_scientific","_DEG2RAD","PI","_sin","sin","_cos","cos","_abs","abs","_sqrt","sqrt","_atan2","atan2","_largeNum","copyRawPath","rawPath","a","i","length","transformRawPath","b","c","d","tx","ty","segment","l","x","y","j","_dirty","arcToSegment","lastX","lastY","rx","ry","angle","largeArcFlag","sweepFlag","angleRad","cosAngle","sinAngle","TWOPI","dx2","dy2","x1","y1","x1_sq","y1_sq","radiiCheck","rx_sq","ry_sq","sq","coef","cx1","cy1","cx","cy","ux","uy","vx","vy","temp","angleStart","acos","angleExtent","isNaN","segments","ceil","angleIncrement","controlLength","ma","mb","mc","md","push","stringToRawPath","line","sx","sy","ex","ey","difX","difY","command","isRelative","startX","startY","beziers","prevCommand","flag1","flag2","replace","m","n","match","path","relativeX","relativeY","elements","points","errorMessage","console","log","toUpperCase","closed","substr","charAt","pop","bezierToPoints","x2","y2","x3","y3","x4","y4","threshold","index","x12","y12","x23","y23","x34","y34","x123","y123","x234","y234","x1234","y1234","dx","dy","d2","d3","splice","pointsToSegment","curviness","cornerThreshold","prevX","prevY","slope","dx1","dx3","dy1","dy3","d1","nextX","nextY","unshift","simplifyPoints","tolerance","result","last","parseFloat","simplifyStep","first","simplified","t","maxSqDist","firstX","firstY","getClosestProgressOnBezier","iterations","px","py","start","end","slices","x0","y0","inv","inc","best","max","min","_setDoc","element","doc","ownerDocument","_transformProp","style","_transformOriginProp","parentNode","_win","window","_identityMatrix","Matrix2D","_docElement","_doc","documentElement","_body","body","createElement","appendChild","position","_hasOffsetBug","offsetParent","removeChild","_svgOwner","ownerSVGElement","tagName","toLowerCase","_createSibling","svg","ns","getAttribute","type","css","e","createElementNS","_svgContainer","setAttribute","_divContainer","cssText","_placeSiblings","adjustGOffset","container","isRootSVG","siblings","_svgTemps","_divTemps","getBBox","transform","baseVal","numberOfItems","_consolidate","multiply","getItem","matrix","f","getComputedStyle","offsetLeft","offsetTop","top","left","border","borderLeftStyle","borderTopStyle","borderLeftWidth","borderTopWidth","_setMatrix","inverse","this","determinant","a2","b2","c2","e2","f2","clone","equals","apply","point","decoratee","getGlobalMatrix","zeroScales","_forceNonZeroScale","cache","_gsap","scaleX","scaleY","renderTransform","temps","b1","getBoundingClientRect","b3","parent","isFixed","_isFixed","nodeType","_getDocScrollLeft","pageXOffset","scrollLeft","_getDocScrollTop","pageYOffset","scrollTop","_emptyFunc","_preventDefault","event","preventDefault","preventManipulation","_createElement","_createSVG","attributes","p","reg","undefined","setAttributeNS","_getConsolidatedMatrix","target","consolidate","_identityMatrixObject","_checkDeselect","_gsSelection","_isPressed","_getTime","_lastInteraction","_selectedPaths","deselect","_addListener","func","capture","addEventListener","touchType","_touchEventLookup","passive","attachEvent","_removeListener","removeEventListener","detachEvent","_onMultiTouchDocumentEnd","_isMultiTouching","touches","_dragCount","_onMultiTouchDocument","_bind","scope","call","_callback","self","param","callback","vars","callbackScope","_resetSelection","_copyElement","display","select","_onPress","touchEventTarget","ctm","_matrix","_ctm","indexOf","currentTarget","_onRelease","_onMove","_supportsPointer","changedTouches","touch","touchID","identifier","pointerId","_startPointerY","pointerY","pageY","_startPointerX","pointerX","pageX","_startElementX","_startElementY","isPressed","onPress","pointerEvent","originalEvent","_enabled","setPointerPosition","onDrag","force","_hasTouchID","list","ID","_interacted","wasDragging","isDragging","onClick","onDragRelease","onRelease","onDragEnd","_createSegmentAnchors","editor","Anchor","_getLength","i2","_CTRL","_ALT","_SHIFT","_CMD","_recentlyAddedAnchor","_tempDiv","_coreInitted","_numbersExp","_selectionColor","Date","now","getTime","_editingAxis","_history","_point","_temp","_comma","DraggableSVG","xChange","yChange","snap","enabled","arguments","_onClick","dragging","endDrag","querySelectorAll","maxX","minX","_bounds","s","_draggable","update","prevSmooth","smooth","_circleHandle","_squareHandle","_selection","fill","stroke","strokeWidth","vectorEffect","PathEditor","anchor","_editingAnchor","init","pathData","createAnchors","_rawPath","anchorVars","anchorSnap","_onDragAnchor","_onPressAnchor","_onClickAnchor","_onDragEndAnchor","_anchors","_selectedAnchors","concat","_handle1","_handle2","_selectionPath","_selectionHittest","_g","_getConcatenatedTransforms","owner","_updateAnchors","_saveState","_addHistory","pathEditor","selectedIndexes","_onClickSelectionPath","visibility","altKey","newIndex","closestData","getScreenCTM","clientX","clientY","getClosestData","closest","bestDistance","subdivideSegment","ax","ay","cp1x","cp1y","cp2x","cp2y","x1a","y1a","x2a","y2a","_onClickHandle1","_onClickHandle2","isSelected","allAnchors","_onDragPath","_deleteSelectedAnchors","anchors","onDeleteAnchor","angle1","angle2","length1","length2","rnd","isEnd","_line1","_line2","_onPressAlt","_onReleaseAlt","_onPressHandle1","_oppositeHandleLength","_onPressHandle2","_onReleaseHandle","_onDragHandle1","_onDragHandle2","changeX","changeY","readPath","join","onUpdate","getRawPath","applyTransforms","offsetX","offsetY","getString","rawPathToString","_isNumber","sl","getNormalizedSVG","height","originY","shorten","onEaseError","_initCore","document","types","standard","split","converted","onpointerdown","onmspointerdown","obj","SVGElement","prototype","getTransformToElement","state","key","keyCode","which","keyString","shift","onUndo","PointerEvent","pointerEvents","size","handleSize","_getSquarePathData","_getCirclePathData","rcirc","handleSnap","selectionItems","draggable","selected","simplifySVG","data","bezier","precision","querySelector","curved","test","create","editingAxis","getSnapFunction","r","radius","big","width","minY","maxY","containX","containY","axis","grid","gridSize","gridX","gridY","version","_isString","_parsePath","_selectorExp","Array","isArray","_rawPathToString","_arrayToRawPath","gsap","getProperty","core","required","message","warn","_docEl","MotionPathPlugin","plugins","motionPath","_initCopyToClipboard","arrayToRawPath","_bonusValidated","MotionPathHelper","offset","targetOrTween","isSVG","animation","svgNamespace","refreshPath","animationToScrub","copyButton","Tween","targets","utils","toArray","_findMotionPathTween","tweens","getTweensOf","timeline","getChildren","_getPositionOnPage","bounds","windowOffsetY","clientTop","windowOffsetX","clientLeft","right","bottom","getCTM","innerText","_gsHelper","_addCopyToClipboard","getter","onComplete","execCommand","blur","err","fromTo","backgroundColor","duration","_getInitialPath","coordinates","pathWidth","pathColor","pathOpacity","set","pause","invalidate","restart","center","transformOrigin","xPercent","yPercent","globalTimeline","add","_getGlobalTime","time","totalTime","startTime","timeScale","delay","repeat","repeatDelay","to","autoRotate","align","alignOrigin","ease","paused","register","editPath"],"mappings":";;;;;;;;;6MA8BU,SAATA,EAASC,UAAUC,KAAKC,MAFT,IAEeF,GAFf,KAEwD,EAqBvD,SAAhBG,EAAiBC,EAAQC,UACxBA,EAAKC,YAAcF,EAAOE,YACtBF,EAAOG,SACVF,EAAKE,QAAUH,EAAOG,QAAQC,MAAM,GACpCH,EAAKI,OAASL,EAAOK,OAAOD,MAAM,GAClCH,EAAKK,UAAYN,EAAOM,UACxBL,EAAKM,WAAaP,EAAOO,YAEzBN,EAAKO,YAAcR,EAAOQ,YAEpBP,MAaRQ,EA/DGC,EAAc,mDAEjBC,EAAc,gCAEdC,EAAWf,KAAKgB,GAAK,IAErBC,EAAOjB,KAAKkB,IACZC,EAAOnB,KAAKoB,IACZC,EAAOrB,KAAKsB,IACZC,EAAQvB,KAAKwB,KACbC,EAASzB,KAAK0B,MACdC,EAAY,IA8EN,SAASC,YAAYC,WACvBC,EAAI,GACPC,EAAI,EACEA,EAAIF,EAAQG,OAAQD,IAC1BD,EAAEC,GAAK7B,EAAc2B,EAAQE,GAAIF,EAAQE,GAAGxB,MAAM,WAE5CL,EAAc2B,EAASC,GAmdxB,SAASG,iBAAiBJ,EAASC,EAAGI,EAAGC,EAAGC,EAAGC,EAAIC,WAExDC,EAASC,EAAGT,EAAGU,EAAGC,EADfC,EAAId,EAAQG,QAEF,IAALW,OAERH,GADAD,EAAUV,EAAQc,IACNX,OACPD,EAAI,EAAGA,EAAIS,EAAGT,GAAK,EACvBU,EAAIF,EAAQR,GACZW,EAAIH,EAAQR,EAAE,GACdQ,EAAQR,GAAKU,EAAIX,EAAIY,EAAIP,EAAIE,EAC7BE,EAAQR,EAAE,GAAKU,EAAIP,EAAIQ,EAAIN,EAAIE,SAGjCT,EAAQe,OAAS,EACVf,EAMR,SAASgB,aAAaC,EAAOC,EAAOC,EAAIC,EAAIC,EAAOC,EAAcC,EAAWX,EAAGC,MAC1EI,IAAUL,GAAKM,IAAUL,GAG7BM,EAAK3B,EAAK2B,GACVC,EAAK5B,EAAK4B,OACNI,EAAYH,EAAQ,IAAOnC,EAC9BuC,EAAWnC,EAAKkC,GAChBE,EAAWtC,EAAKoC,GAChBrC,EAAKhB,KAAKgB,GACVwC,EAAa,EAALxC,EACRyC,GAAOX,EAAQL,GAAK,EACpBiB,GAAOX,EAAQL,GAAK,EACpBiB,EAAML,EAAWG,EAAMF,EAAWG,EAClCE,GAAOL,EAAWE,EAAMH,EAAWI,EACnCG,EAAQF,EAAKA,EACbG,EAAQF,EAAKA,EACbG,EAAaF,GAASb,EAAKA,GAAMc,GAASb,EAAKA,GAC/B,EAAbc,IACHf,EAAKzB,EAAMwC,GAAcf,EACzBC,EAAK1B,EAAMwC,GAAcd,OAEtBe,EAAQhB,EAAKA,EAChBiB,EAAQhB,EAAKA,EACbiB,GAAOF,EAAQC,EAAUD,EAAQF,EAAUG,EAAQJ,IAAYG,EAAQF,EAAUG,EAAQJ,GACtFK,EAAK,IACRA,EAAK,OAEFC,GAAShB,IAAiBC,GAAc,EAAI,GAAK7B,EAAM2C,GAC1DE,EAAepB,EAAKY,EAAMX,EAApBkB,EACNE,GAAgBpB,EAAKU,EAAMX,EAArBmB,EAGNG,EAAYhB,EAAWc,EAAMb,EAAWc,GAFjCvB,EAAQL,GAAK,EAGpB8B,EAAYhB,EAAWa,EAAMd,EAAWe,GAFjCtB,EAAQL,GAAK,EAGpB8B,GAAMb,EAAKS,GAAOpB,EAClByB,GAAMb,EAAKS,GAAOpB,EAClByB,IAAOf,EAAKS,GAAOpB,EACnB2B,IAAOf,EAAKS,GAAOpB,EACnB2B,EAAOJ,EAAKA,EAAKC,EAAKA,EACtBI,GAAeJ,EAAK,GAAM,EAAI,GAAKzE,KAAK8E,KAAKN,EAAKjD,EAAMqD,IACxDG,GAAgBP,EAAKG,EAAKF,EAAKC,EAAK,GAAM,EAAI,GAAK1E,KAAK8E,MAAMN,EAAKE,EAAKD,EAAKE,GAAMpD,EAAMqD,GAAQF,EAAKA,EAAKC,EAAKA,KACjHK,MAAMD,KAAiBA,EAAc/D,IAChCoC,GAA2B,EAAd2B,EACjBA,GAAevB,EACLJ,GAAa2B,EAAc,IACrCA,GAAevB,GAEhBqB,GAAcrB,EACduB,GAAevB,MASdzB,EARGkD,EAAWjF,KAAKkF,KAAK7D,EAAK0D,IAAgBvB,EAAQ,IACrD3B,EAAU,GACVsD,EAAiBJ,EAAcE,EAC/BG,EAAgB,EAAI,EAAInE,EAAKkE,EAAiB,IAAM,EAAIhE,EAAKgE,EAAiB,IAC9EE,EAAK/B,EAAWN,EAChBsC,EAAK/B,EAAWP,EAChBuC,EAAKhC,GAAYN,EACjBuC,EAAKlC,EAAWL,MAEZlB,EAAI,EAAGA,EAAIkD,EAAUlD,IAEzB4B,EAAKxC,EADL+B,EAAQ2B,EAAa9C,EAAIoD,GAEzBvB,EAAK3C,EAAKiC,GACVsB,EAAKrD,EAAK+B,GAASiC,GACnBV,EAAKxD,EAAKiC,GACVrB,EAAQ4D,KAAK9B,EAAKyB,EAAgBxB,EAAIA,EAAKwB,EAAgBzB,EAAIa,EAAKY,EAAgBX,EAAIA,EAAKW,EAAgBZ,EAAIA,EAAIC,OAGjH1C,EAAI,EAAGA,EAAIF,EAAQG,OAAQD,GAAG,EAClC4B,EAAK9B,EAAQE,GACb6B,EAAK/B,EAAQE,EAAE,GACfF,EAAQE,GAAK4B,EAAK0B,EAAKzB,EAAK2B,EAAKjB,EACjCzC,EAAQE,EAAE,GAAK4B,EAAK2B,EAAK1B,EAAK4B,EAAKjB,SAEpC1C,EAAQE,EAAE,GAAKU,EACfZ,EAAQE,EAAE,GAAKW,EACRb,GAID,SAAS6D,gBAAgBtD,GAUvB,SAAPuD,GAAgBC,EAAIC,EAAIC,EAAIC,GAC3BC,GAAQF,EAAKF,GAAM,EACnBK,GAAQF,EAAKF,GAAM,EACnBtD,EAAQkD,KAAKG,EAAKI,EAAMH,EAAKI,EAAMH,EAAKE,EAAMD,EAAKE,EAAMH,EAAIC,OAJ9DhE,EAAGY,EAAGF,EAAGC,EAAGwD,EAASC,EAAY5D,EAAS6D,EAAQC,EAAQL,EAAMC,EAAMK,EAASC,EAAaC,EAAOC,EARhG3E,GAAKM,EAAI,IAAIsE,QAAQ5F,EAAa,SAAA6F,OAAWC,GAAKD,SAAWC,EAAI,OAAe,KAALA,EAAe,EAAIA,IAAMC,MAAMhG,IAAgB,GAC7HiG,EAAO,GACPC,EAAY,EACZC,EAAY,EAEZC,EAAWnF,EAAEE,OACbkF,EAAS,EACTC,EAAe,0BAA4B/E,MAOvCA,IAAM4C,MAAMlD,EAAE,KAAOkD,MAAMlD,EAAE,WACjCsF,QAAQC,IAAIF,GACLL,MAEH/E,EAAI,EAAGA,EAAIkF,EAAUlF,OACzBwE,EAAcL,EACVlB,MAAMlD,EAAEC,IAEXoE,GADAD,EAAUpE,EAAEC,GAAGuF,iBACWxF,EAAEC,GAE5BA,IAEDU,GAAKX,EAAEC,EAAI,GACXW,GAAKZ,EAAEC,EAAI,GACPoE,IACH1D,GAAKsE,EACLrE,GAAKsE,GAEDjF,IACJqE,EAAS3D,EACT4D,EAAS3D,GAIM,MAAZwD,EACC3D,IACCA,EAAQP,OAAS,IACpB8E,EAAK9E,OAELkF,GAAU3E,EAAQP,QAGpB+E,EAAYX,EAAS3D,EACrBuE,EAAYX,EAAS3D,EACrBH,EAAU,CAACE,EAAGC,GACdoE,EAAKrB,KAAKlD,GACVR,GAAK,EACLmE,EAAU,SAGJ,GAAgB,MAAZA,EAILC,IACJY,EAAYC,EAAY,IAHxBzE,EADIA,GACM,CAAC,EAAG,IAMPkD,KAAKhD,EAAGC,EAAGqE,EAAuB,EAAXjF,EAAEC,EAAI,GAAQiF,EAAuB,EAAXlF,EAAEC,EAAI,GAASgF,GAAwB,EAAXjF,EAAEC,EAAI,GAAUiF,GAAwB,EAAXlF,EAAEC,EAAI,IACxHA,GAAK,OAGC,GAAgB,MAAZmE,EACVF,EAAOe,EACPd,EAAOe,EACa,MAAhBT,GAAuC,MAAhBA,IAC1BP,GAAQe,EAAYxE,EAAQA,EAAQP,OAAS,GAC7CiE,GAAQe,EAAYzE,EAAQA,EAAQP,OAAS,IAEzCmE,IACJY,EAAYC,EAAY,GAEzBzE,EAAQkD,KAAKO,EAAMC,EAAMxD,EAAGC,EAAIqE,GAAwB,EAAXjF,EAAEC,EAAI,GAAUiF,GAAwB,EAAXlF,EAAEC,EAAI,IAChFA,GAAK,OAGC,GAAgB,MAAZmE,EACVF,EAAOe,EA7EI,EAAI,GA6EKtE,EAAIsE,GACxBd,EAAOe,EA9EI,EAAI,GA8EKtE,EAAIsE,GACnBb,IACJY,EAAYC,EAAY,GAEzBD,GAAwB,EAAXjF,EAAEC,EAAI,GACnBiF,GAAwB,EAAXlF,EAAEC,EAAI,GACnBQ,EAAQkD,KAAKO,EAAMC,EAAMc,EApFd,EAAI,GAoFuBtE,EAAIsE,GAAwBC,EApFvD,EAAI,GAoFgEtE,EAAIsE,GAAwBD,EAAWC,GACtHjF,GAAK,OAGC,GAAgB,MAAZmE,EACVF,EAAOe,EAAYxE,EAAQA,EAAQP,OAAS,GAC5CiE,EAAOe,EAAYzE,EAAQA,EAAQP,OAAS,GAC5CO,EAAQkD,KAAKsB,EAAYf,EAAMgB,EAAYf,EAAMxD,EA3FtC,EAAI,GA2FwCsE,EAAmB,IAAPf,EAAcvD,GAAgBC,EA3FtF,EAAI,GA2FwFsE,EAAmB,IAAPf,EAAcvD,GAAiBqE,EAAYtE,EAAKuE,EAAYtE,GAC/KX,GAAK,OAGC,GAAgB,MAAZmE,EACVP,GAAKoB,EAAWC,EAAYD,EAAYtE,EAAIuE,GAC5CjF,GAAK,OAGC,GAAgB,MAAZmE,EAEVP,GAAKoB,EAAWC,EAAWD,EAAYC,EAAYvE,GAAK0D,EAAaa,EAAYD,EAAY,IAC7FhF,GAAK,OAGC,GAAgB,MAAZmE,GAA+B,MAAZA,EACb,MAAZA,IACHzD,EAAI2D,EACJ1D,EAAI2D,EACJ9D,EAAQgF,QAAS,IAEF,MAAZrB,GAAyC,GAAtB7E,EAAK0F,EAAYtE,IAAkC,GAAtBpB,EAAK2F,EAAYtE,MACpEiD,GAAKoB,EAAWC,EAAWvE,EAAGC,GACd,MAAZwD,IACHnE,GAAK,IAGPgF,EAAYtE,EACZuE,EAAYtE,OAGN,GAAgB,MAAZwD,EAAiB,IAC3BM,EAAQ1E,EAAEC,EAAE,GACZ0E,EAAQ3E,EAAEC,EAAE,GACZiE,EAAOlE,EAAEC,EAAE,GACXkE,EAAOnE,EAAEC,EAAE,GACXY,EAAI,EACe,EAAf6D,EAAMxE,SACLwE,EAAMxE,OAAS,GAClBiE,EAAOD,EACPA,EAAOS,EACP9D,MAEAsD,EAAOQ,EACPT,EAAOQ,EAAMgB,OAAO,GACpB7E,GAAG,GAEJ8D,EAAQD,EAAMiB,OAAO,GACrBjB,EAAQA,EAAMiB,OAAO,IAEtBnB,EAAUzD,aAAakE,EAAWC,GAAYlF,EAAEC,EAAE,IAAKD,EAAEC,EAAE,IAAKD,EAAEC,EAAE,IAAKyE,GAAQC,GAAQN,EAAaY,EAAY,GAAU,EAALf,GAASG,EAAaa,EAAY,GAAU,EAALf,GAC9JlE,GAAKY,EACD2D,MACE3D,EAAI,EAAGA,EAAI2D,EAAQtE,OAAQW,IAC/BJ,EAAQkD,KAAKa,EAAQ3D,IAGvBoE,EAAYxE,EAAQA,EAAQP,OAAO,GACnCgF,EAAYzE,EAAQA,EAAQP,OAAO,QAGnCoF,QAAQC,IAAIF,UAGdpF,EAAIQ,EAAQP,QACJ,GACP8E,EAAKY,MACL3F,EAAI,GACMQ,EAAQ,KAAOA,EAAQR,EAAE,IAAMQ,EAAQ,KAAOA,EAAQR,EAAE,KAClEQ,EAAQgF,QAAS,GAElBT,EAAKnG,YAAcuG,EAASnF,EACrB+E,EAID,SAASa,eAAehE,EAAIC,EAAIgE,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAWhB,EAAQiB,OAiBhFnG,EAhBGoG,GAAOzE,EAAKiE,GAAM,EACrBS,GAAOzE,EAAKiE,GAAM,EAClBS,GAAOV,EAAKE,GAAM,EAClBS,GAAOV,EAAKE,GAAM,EAClBS,GAAOV,EAAKE,GAAM,EAClBS,GAAOV,EAAKE,GAAM,EAClBS,GAAQN,EAAME,GAAO,EACrBK,GAAQN,EAAME,GAAO,EACrBK,GAAQN,EAAME,GAAO,EACrBK,GAAQN,EAAME,GAAO,EACrBK,GAASJ,EAAOE,GAAQ,EACxBG,GAASJ,EAAOE,GAAQ,EACxBG,EAAKhB,EAAKrE,EACVsF,EAAKhB,EAAKrE,EACVsF,EAAK7H,GAAMuG,EAAKI,GAAMiB,GAAMpB,EAAKI,GAAMe,GACvCG,EAAK9H,GAAMyG,EAAKE,GAAMiB,GAAMlB,EAAKE,GAAMe,UAEnC9B,IACJA,EAAS,CAACvD,EAAIC,EAAIoE,EAAIC,GACtBE,EAAQ,GAETjB,EAAOkC,OAAOjB,GAASjB,EAAOlF,OAAS,EAAG,EAAG8G,EAAOC,GACxBb,GAAac,EAAKA,EAAKC,EAAKA,IAAnDC,EAAKC,IAAOD,EAAKC,KACrBnH,EAASkF,EAAOlF,OAChB2F,eAAehE,EAAIC,EAAIwE,EAAKC,EAAKK,EAAMC,EAAMG,EAAOC,EAAOb,EAAWhB,EAAQiB,GAC9ER,eAAemB,EAAOC,EAAOH,EAAMC,EAAML,EAAKC,EAAKT,EAAIC,EAAIC,EAAWhB,EAAQiB,EAAQ,GAAKjB,EAAOlF,OAASA,KAErGkF,EAsCD,SAASmC,gBAAgBnC,EAAQoC,EAAWC,OAWjDC,EAAOC,EAAOvG,EAAOwG,EAAO3H,EAAG4H,EAAKC,EAAKC,EAAKC,EAAKC,EAAIb,EAAIpH,EAAGI,EAAGC,EAT9DK,EAAI0E,EAAOlF,OAAO,EACrBS,GAAKyE,EAAO,GACZxE,GAAKwE,EAAO,GACZ8C,GAAS9C,EAAO,GAChB+C,GAAS/C,EAAO,GAChB3E,EAAU,CAACE,EAAGC,EAAGD,EAAGC,GACpBe,EAAMuG,EAAQvH,EACdiB,EAAMuG,EAAQvH,EACd6E,EAASvH,KAAKsB,IAAI4F,EAAO1E,GAAKC,GAAK,MAASzC,KAAKsB,IAAI4F,EAAO1E,EAAE,GAAKE,GAAK,SAErEsC,MAAMuE,KACTA,EAAkBvJ,KAAKgB,GAAK,IAEzBuG,IACHL,EAAOzB,KAAKuE,EAAOC,GACnBD,EAAQvH,EACRwH,EAAQvH,EACRD,EAAIyE,EAAO1E,EAAE,GACbE,EAAIwE,EAAO1E,EAAE,GACb0E,EAAOgD,QAAQzH,EAAGC,GAClBF,GAAG,GAEJ8G,EAAaA,GAA2B,IAAdA,GAAoBA,EAAY,EACrDvH,EAAI,EAAGA,EAAIS,EAAGT,GAAG,EACrByH,EAAQ/G,EACRgH,EAAQ/G,EACRD,EAAIuH,EACJtH,EAAIuH,EASJnI,GANA6H,EAAMlG,GAMIkG,GALVE,EAAMnG,GAKgBmG,EACtB3H,GALAuB,GAJAuG,GAAS9C,EAAOnF,EAAE,IAIJU,GAKJgB,GAJVC,GAJAuG,GAAS/C,EAAOnF,EAAE,IAIJW,GAIQgB,EACtBvB,GAJAyH,EAAMI,EAAQR,GAIJI,GAHVE,EAAMG,EAAQR,GAGQK,EAEtBZ,GADAhG,EAAQlD,KAAK8E,MAAOhD,EAAII,EAAIC,GAAKZ,EAAM,EAAIO,EAAII,KACjClC,KAAKgB,GAAMsI,EACzBS,EAAKxI,EAAMO,GAAKoH,EAChBA,GAAM3H,EAAMW,GACRO,IAAM+G,GAAS9G,IAAM+G,IACZF,EAARrG,GACHwG,EAAQjI,EAAOqI,EAAKF,GACpBrH,EAAQkD,KACP3F,EAAO2C,EAAItB,EAAKuI,GAASK,GACzBjK,EAAO4C,EAAIzB,EAAKyI,GAASK,GACzBjK,EAAO2C,GACP3C,EAAO4C,GACP5C,EAAO2C,EAAItB,EAAKuI,GAASR,GACzBpJ,EAAO4C,EAAIzB,EAAKyI,GAASR,MAG1BQ,EAAQjI,EAAOoI,EAAKF,GACpBpH,EAAQkD,KACP3F,EAAO2C,EAAItB,EAAKuI,GAASK,GACzBjK,EAAO4C,EAAIzB,EAAKyI,GAASK,IAC1BL,EAAQjI,EAAOiC,EAAKD,GACpBlB,EAAQkD,KACP3F,EAAO2C,GACP3C,EAAO4C,GACP5C,EAAO2C,EAAItB,EAAKuI,GAASR,GACzBpJ,EAAO4C,EAAIzB,EAAKyI,GAASR,aAK7B3G,EAAQkD,KAAK3F,EAAOkK,GAAQlK,EAAOmK,GAAQnK,EAAOkK,GAAQlK,EAAOmK,IAC7D1C,IACHhF,EAAQ6G,OAAO,EAAG,GAClB7G,EAAQP,OAASO,EAAQP,OAAS,GAE5BO,EA+CD,SAAS4H,eAAejD,EAAQkD,OAKrCrI,EAAGU,EAAGC,EAAGsG,EAAIC,EAAIoB,EAAQC,EAJtBd,EAAQe,WAAWrD,EAAO,IAC7BuC,EAAQc,WAAWrD,EAAO,IAC1BtC,EAAO,CAAC4E,EAAOC,GACfjH,EAAI0E,EAAOlF,OAAS,MAErBoI,WAAaA,GAAa,EAAM,GAC3BrI,EAAI,EAAGA,EAAIS,EAAGT,GAAK,EAKCqI,GAFxBpB,EAAKQ,GAFL/G,EAAI8H,WAAWrD,EAAOnF,MAIbiH,GADTC,EAAKQ,GAFL/G,EAAI6H,WAAWrD,EAAOnF,EAAE,MAGLkH,IAClBrE,EAAKa,KAAKhD,EAAGC,GACb8G,EAAQ/G,EACRgH,EAAQ/G,UAGVkC,EAAKa,KAAK8E,WAAWrD,EAAO1E,IAAK+H,WAAWrD,EAAS,EAAF1E,KA5CpD,SAASgI,aAAatD,EAAQuD,EAAOH,EAAMF,EAAWM,OAMpDvC,EAAOpG,EAAGK,EAvBYK,EAAGC,EAAGiB,EAAIC,EAAIgE,EAAIC,EAGxC8C,EAFG3B,EACHC,EAgBG2B,EAAYR,EACfS,EAAS3D,EAAOuD,GAChBK,EAAS5D,EAAOuD,EAAM,GACtB3H,EAAQoE,EAAOoD,GACfvH,EAAQmE,EAAOoD,EAAK,OAEhBvI,EAAI0I,EAAQ,EAAG1I,EAAIuI,EAAMvI,GAAK,EAxBZU,EAyBHyE,EAAOnF,GAzBDW,EAyBKwE,EAAOnF,EAAE,GAtBvC4I,OAAAA,EADA1B,GAFwCpB,EAyB0B9E,IAzBlCa,EAyBmBkH,KAxBhD9B,GADiCpB,EAyBuB9E,IAzB/Ba,EAyBekH,KArBlC5B,KAED,GADR0B,IAAMlI,EAAIkB,GAAMqF,GAAMtG,EAAIkB,GAAMqF,IAAOD,EAAKA,EAAKC,EAAKA,KAErDtF,EAAKiE,EACLhE,EAAKiE,GACS,EAAJ8C,IACVhH,GAAMqF,EAAK2B,EACX/G,GAAMqF,EAAK0B,IAeJC,GADRxI,EAXMpC,SAACyC,EAAIkB,EAAO,YAAKjB,EAAIkB,EAAO,MAajCuE,EAAQpG,EACR6I,EAAYxI,GAGEgI,EAAZQ,IACiB,EAAhBzC,EAAQsC,GACXD,aAAatD,EAAQuD,EAAOtC,EAAOiC,EAAWM,GAE/CA,EAAWjF,KAAKyB,EAAOiB,GAAQjB,EAAOiB,EAAM,IACzB,EAAfmC,EAAOnC,GACVqC,aAAatD,EAAQiB,EAAOmC,EAAMF,EAAWM,IA2B/CF,CAAa5F,EAAM,EAFnB0F,EAAO1F,EAAK5C,OAAS,EAEOoI,EAD5BC,EAAS,CAACzF,EAAK,GAAIA,EAAK,KAExByF,EAAO5E,KAAKb,EAAK0F,GAAO1F,EAAU,EAAL0F,IACtBD,EAGR,SAASU,2BAA2BC,EAAYC,EAAIC,EAAIC,EAAOC,EAAKC,EAAQC,EAAIC,EAAI5H,EAAIC,EAAIgE,EAAIC,EAAIC,EAAIC,OAIhG3F,EAAG4G,EAAIC,EAAIuC,EAHdC,GAAOL,EAAMD,GAASE,EACzBK,EAAO,EACPf,EAAIQ,MAELvK,EAAgBe,EACTgJ,GAAKS,IAMXhJ,GAFA4G,GAHAwC,EAAM,EAAIb,GACAa,EAAMA,EAAMF,EAAK,EAAIE,EAAMA,EAAMb,EAAIhH,EAAK,EAAI6H,EAAMb,EAAIA,EAAI/C,EAAK+C,EAAIA,EAAIA,EAAI7C,EAE9EmD,GAEAjC,GADTC,EAFIuC,EAAMA,EAAMA,EAAMD,EAAK,EAAIC,EAAMA,EAAMb,EAAI/G,EAAK,EAAI4H,EAAMb,EAAIA,EAAI9C,EAAK8C,EAAIA,EAAIA,EAAI5C,EAE9EmD,GACUjC,GACXrI,IACPA,EAAgBwB,EAChBsJ,EAAOf,GAERA,GAAKc,SAEe,EAAbT,EAAkBD,2BAA2BC,EAAa,EAAGC,EAAIC,EAAIlL,KAAK2L,IAAID,EAAOD,EAAK,GAAIzL,KAAK4L,IAAIF,EAAOD,EAAK,GAAIJ,EAAQC,EAAIC,EAAI5H,EAAIC,EAAIgE,EAAIC,EAAIC,EAAIC,GAAM2D,ECxiC/J,SAAVG,EAAUC,OACLC,EAAMD,EAAQE,eAAiBF,IAC7BG,KAAkBH,EAAQI,QAAU,gBAAiBJ,EAAQI,QAElEC,GADAF,EAAiB,eACuB,eAElCF,EAAIK,aAAeL,EAAMA,EAAIK,iBACpCC,EAAOC,OACPC,EAAkB,IAAIC,EAClBT,EAAK,CAERU,GADAC,EAAOX,GACWY,gBAClBC,EAAQb,EAAIc,SAER9C,EAAKgC,EAAIe,cAAc,OAC1B5D,EAAK6C,EAAIe,cAAc,OACxBF,EAAMG,YAAYhD,GAClBA,EAAGgD,YAAY7D,GACfa,EAAGmC,MAAMc,SAAW,SACpBjD,EAAGmC,MAAMD,GAAkB,uBAC3BgB,EAAiB/D,EAAGgE,eAAiBnD,EACrC6C,EAAMO,YAAYpD,UAEZgC,EAqCI,SAAZqB,EAAYtB,UAAWA,EAAQuB,kBAA6D,SAAxCvB,EAAQwB,QAAU,IAAIC,cAA0BzB,EAAU,MAU7F,SAAjB0B,EAAkB1B,EAAS/J,MACtB+J,EAAQM,aAAeM,GAAQb,EAAQC,IAAW,KACjD2B,EAAML,EAAUtB,GACnB4B,EAAKD,EAAOA,EAAIE,aAAa,UAAY,6BAAgC,+BACzEC,EAAOH,EAAO1L,EAAI,OAAS,IAAO,MAClCU,EAAU,IAANV,EAAU,EAAI,IAClBW,EAAU,IAANX,EAAU,IAAM,EACpB8L,EAAM,uDACNC,EAAIpB,EAAKqB,gBAAkBrB,EAAKqB,gBAAgBL,EAAGhH,QAAQ,SAAU,QAASkH,GAAQlB,EAAKI,cAAcc,UACtG7L,IACE0L,GAUHO,EADIA,GACYR,EAAe1B,GAEhCgC,EAAEG,aAAa,QAAS,KACxBH,EAAEG,aAAa,SAAU,KACzBH,EAAEG,aAAa,YAAa,aAAexL,EAAI,IAAMC,EAAI,KACzDsL,EAAcjB,YAAYe,KAdrBI,KACJA,EAAgBV,EAAe1B,IACjBI,MAAMiC,QAAUN,GAE/BC,EAAE5B,MAAMiC,QAAUN,EAAM,gCAAkCnL,EAAI,WAAaD,EAAI,KAC/EyL,EAAcnB,YAAYe,KAYrBA,OAEF,4BAUU,SAAjBM,EAAkBtC,EAASuC,OAIzBC,EAAW3H,EAAGzE,EAAGO,EAAGC,EAHjB+K,EAAML,EAAUtB,GACnByC,EAAYzC,IAAY2B,EACxBe,EAAWf,EAAMgB,EAAYC,KAE1B5C,IAAYO,SACRP,KAEH0C,EAASxM,QACbwM,EAAS/I,KAAK+H,EAAe1B,EAAS,GAAI0B,EAAe1B,EAAS,GAAI0B,EAAe1B,EAAS,IAE/FwC,EAAYb,EAAMO,EAAgBE,EAC9BT,EACHvL,EAAIqM,EAAY,CAAC9L,EAAE,EAAGC,EAAE,GAAKoJ,EAAQ6C,UAKpCjM,GAJDiE,EAAImF,EAAQ8C,UAAY9C,EAAQ8C,UAAUC,QAAU,IAC9CC,eAELrM,GADAkE,EAAsB,EAAlBA,EAAEmI,cAxBM,SAAfC,aAAepI,WACVxE,EAAI,IAAIqK,EACXzK,EAAI,EACEA,EAAI4E,EAAEmI,cAAe/M,IAC3BI,EAAE6M,SAASrI,EAAEsI,QAAQlN,GAAGmN,eAElB/M,EAkBqB4M,CAAapI,GAAKA,EAAEsI,QAAQ,GAAGC,QACnDpN,EAAII,EAAEO,EAAIkE,EAAExE,EAAID,EAAEQ,EACpBiE,EAAEzE,EAAIA,EAAEO,EAAIkE,EAAEvE,EAAIF,EAAEQ,IAExBiE,EAAI4F,EACJ9J,EAAIP,EAAEO,EACFP,EAAEQ,GAEH2L,GAAmD,MAAlCvC,EAAQwB,QAAQC,gBACpC9K,EAAIC,EAAI,GAET4L,EAAUL,aAAa,YAAa,UAAYtH,EAAE7E,EAAI,IAAM6E,EAAEzE,EAAI,IAAMyE,EAAExE,EAAI,IAAMwE,EAAEvE,EAAI,KAAOuE,EAAEmH,EAAIrL,GAAK,KAAOkE,EAAEwI,EAAIzM,GAAK,MAC7H6L,EAAYd,EAAM3B,EAAQM,YAAYW,YAAYuB,OAC7C,IACN7L,EAAIC,EAAI,EACJuK,MACHtG,EAAImF,EAAQoB,aACZhL,EAAI4J,GACS5J,EAANA,GAAUA,EAAEkK,aAAelK,IAAMyE,GAAKzE,EAAEkK,YACe,GAAxDC,EAAK+C,iBAAiBlN,GAAG+J,GAAkB,IAAIjK,SACnDS,EAAIP,EAAEmN,WACN3M,EAAIR,EAAEoN,UACNpN,EAAI,IAIPA,EAAIoM,EAAUpC,OACZqD,IAAOzD,EAAQwD,UAAY5M,EAAK,KAClCR,EAAEsN,KAAQ1D,EAAQuD,WAAa5M,EAAK,KACpCkE,EAAI0F,EAAK+C,iBAAiBtD,GAC1B5J,EAAE+J,GAAkBtF,EAAEsF,GACtB/J,EAAEiK,GAAwBxF,EAAEwF,GAC5BjK,EAAEuN,OAAS9I,EAAE8I,OACbvN,EAAEwN,gBAAkB/I,EAAE+I,gBACtBxN,EAAEyN,eAAiBhJ,EAAEgJ,eACrBzN,EAAE0N,gBAAkBjJ,EAAEiJ,gBACtB1N,EAAE2N,eAAiBlJ,EAAEkJ,eACrB3N,EAAE8K,SAA0B,UAAfrG,EAAEqG,SAAuB,QAAU,WAChDlB,EAAQM,WAAWW,YAAYuB,UAEzBA,EAEK,SAAbwB,EAAcnJ,EAAG7E,EAAGI,EAAGC,EAAGC,EAAG0L,EAAGqB,UAC/BxI,EAAE7E,EAAIA,EACN6E,EAAEzE,EAAIA,EACNyE,EAAExE,EAAIA,EACNwE,EAAEvE,EAAIA,EACNuE,EAAEmH,EAAIA,EACNnH,EAAEwI,EAAIA,EACCxI,EAnLT,IAAI+F,EAAML,EAAMI,EAAaG,EAAOsB,EAAeF,EAAezB,EAGjEU,IAFAhB,EAAiB,YACjBE,EAAuBF,EAAiB,SA0DxCwC,EAAY,GACZC,EAAY,GAyHAlC,0BAKZuD,QAAA,uBACMjO,EAAoBkO,KAApBlO,EAAGI,EAAiB8N,KAAjB9N,EAAGC,EAAc6N,KAAd7N,EAAGC,EAAW4N,KAAX5N,EAAG0L,EAAQkC,KAARlC,EAAGqB,EAAKa,KAALb,EACnBc,EAAenO,EAAIM,EAAIF,EAAIC,GAAM,aAC3B2N,EACNE,KACA5N,EAAI6N,GACH/N,EAAI+N,GACJ9N,EAAI8N,EACLnO,EAAImO,GACH9N,EAAIgN,EAAI/M,EAAI0L,GAAKmC,IAChBnO,EAAIqN,EAAIjN,EAAI4L,GAAKmC,MAIrBjB,SAAA,kBAASE,OACHpN,EAAoBkO,KAApBlO,EAAGI,EAAiB8N,KAAjB9N,EAAGC,EAAc6N,KAAd7N,EAAGC,EAAW4N,KAAX5N,EAAG0L,EAAQkC,KAARlC,EAAGqB,EAAKa,KAALb,EACnBe,EAAKhB,EAAOpN,EACZqO,EAAKjB,EAAO/M,EACZiO,EAAKlB,EAAOhN,EACZgH,EAAKgG,EAAO9M,EACZiO,EAAKnB,EAAOpB,EACZwC,EAAKpB,EAAOC,SACNW,EAAWE,KACjBE,EAAKpO,EAAIsO,EAAKjO,EACd+N,EAAKhO,EAAIkO,EAAKhO,EACd+N,EAAKrO,EAAIoH,EAAK/G,EACdgO,EAAKjO,EAAIgH,EAAK9G,EACd0L,EAAIuC,EAAKvO,EAAIwO,EAAKnO,EAClBgN,EAAIkB,EAAKnO,EAAIoO,EAAKlO,MAGpBmO,MAAA,wBACQ,IAAI/D,SAASwD,KAAKlO,EAAGkO,KAAK9N,EAAG8N,KAAK7N,EAAG6N,KAAK5N,EAAG4N,KAAKlC,EAAGkC,KAAKb,MAGlEqB,OAAA,gBAAOtB,OACDpN,EAAoBkO,KAApBlO,EAAGI,EAAiB8N,KAAjB9N,EAAGC,EAAc6N,KAAd7N,EAAGC,EAAW4N,KAAX5N,EAAG0L,EAAQkC,KAARlC,EAAGqB,EAAKa,KAALb,SACZrN,IAAMoN,EAAOpN,GAAKI,IAAMgN,EAAOhN,GAAKC,IAAM+M,EAAO/M,GAAKC,IAAM8M,EAAO9M,GAAK0L,IAAMoB,EAAOpB,GAAKqB,IAAMD,EAAOC,KAGhHsB,MAAA,eAAMC,EAAOC,YAAAA,IAAAA,EAAU,QACjBlO,EAAQiO,EAARjO,EAAGC,EAAKgO,EAALhO,EACNZ,EAAoBkO,KAApBlO,EAAGI,EAAiB8N,KAAjB9N,EAAGC,EAAc6N,KAAd7N,EAAGC,EAAW4N,KAAX5N,EAAG0L,EAAQkC,KAARlC,EAAGqB,EAAKa,KAALb,SACjBwB,EAAUlO,EAAKA,EAAIX,EAAIY,EAAIP,EAAI2L,GAAM,EACrC6C,EAAUjO,EAAKD,EAAIP,EAAIQ,EAAIN,EAAI+M,GAAM,EAC9BwB,+BAjDI7O,EAAKI,EAAKC,EAAKC,EAAK0L,EAAKqB,YAAzBrN,IAAAA,EAAE,YAAGI,IAAAA,EAAE,YAAGC,IAAAA,EAAE,YAAGC,IAAAA,EAAE,YAAG0L,IAAAA,EAAE,YAAGqB,IAAAA,EAAE,GACtCW,EAAWE,KAAMlO,EAAGI,EAAGC,EAAGC,EAAG0L,EAAGqB,GA4D3B,SAASyB,gBAAgB9E,EAASiE,EAAS1B,OAC5CvC,IAAYA,EAAQM,aAAeM,GAAQb,EAAQC,IAAUa,kBAAoBb,SAC9E,IAAIU,MAERqE,EA3NiB,SAArBC,mBAAqBhD,WAChBhM,EAAGiP,EACAjD,GAAKA,IAAMlB,IACjBmE,EAAQjD,EAAEkD,SACID,EAAME,SAAWF,EAAMG,QAAUH,EAAMI,kBACpDJ,EAAME,OAASF,EAAMG,OAAS,KAC9BH,EAAMI,gBAAgB,EAAGJ,GACzBjP,EAAIA,EAAE2D,KAAKsL,GAAUjP,EAAI,CAACiP,IAE3BjD,EAAIA,EAAE1B,kBAEAtK,EAgNSgP,CAAmBhF,EAAQM,YAE3CgF,EADMhE,EAAUtB,GACF2C,EAAYC,EAC1BJ,EAAYF,EAAetC,EAASuC,GACpCgD,EAAKD,EAAM,GAAGE,wBACdnB,EAAKiB,EAAM,GAAGE,wBACdC,EAAKH,EAAM,GAAGE,wBACdE,EAASlD,EAAUlC,WACnBqF,EA/LU,SAAXC,SAAW5F,SACsC,UAA5CO,EAAK+C,iBAAiBtD,GAASkB,YAGnClB,EAAUA,EAAQM,aACkB,IAArBN,EAAQ6F,SACfD,SAAS5F,WAyLP4F,CAAS5F,GACnBnF,EAAI,IAAI6F,GACN2D,EAAGX,KAAO6B,EAAG7B,MAAQ,KACrBW,EAAGZ,IAAM8B,EAAG9B,KAAO,KACnBgC,EAAG/B,KAAO6B,EAAG7B,MAAQ,KACrB+B,EAAGhC,IAAM8B,EAAG9B,KAAO,IACpB8B,EAAG7B,MAAQiC,EAAU,EAvMH,SAApBG,2BAA0BvF,EAAKwF,aAAenF,EAAKoF,YAAcrF,EAAYqF,YAAclF,EAAMkF,YAAc,EAuMpFF,IACzBP,EAAG9B,KAAOkC,EAAU,EAzMH,SAAnBM,0BAAyB1F,EAAK2F,aAAgBtF,EAAKuF,WAAaxF,EAAYwF,WAAarF,EAAMqF,WAAa,EAyMlFF,QAE1BP,EAAOrE,YAAYmB,GACfuC,MACHQ,EAAKR,EAAW7O,OACTqP,MACNlB,EAAKU,EAAWQ,IACbJ,OAASd,EAAGe,OAAS,EACxBf,EAAGgB,gBAAgB,EAAGhB,UAGjBJ,EAAUpJ,EAAEoJ,UAAYpJ,ECvQlB,SAAbuL,WAAmB,EAUD,SAAlBC,GAAkBC,GACbA,EAAMC,iBACTD,EAAMC,iBACFD,EAAME,qBACTF,EAAME,uBAIQ,SAAjBC,GAAiB3E,UAAQlB,EAAKqB,gBAAkBrB,EAAKqB,gBAAgB,+BAAgCH,GAAQlB,EAAKI,cAAcc,GACnH,SAAb4E,GAAc5E,EAAMU,EAAWmE,OAG7BC,EAFG5G,EAAUY,EAAKqB,gBAAgB,6BAA8BH,GAChE+E,EAAM,sBAIFD,KAFLD,EAAaA,GAAc,UACRA,SAAoB,cAC7BA,OACgBG,IAArB9G,EAAQI,MAAMwG,GACjB5G,EAAQI,MAAMwG,GAAKD,EAAWC,GAE9B5G,EAAQ+G,eAAe,KAAMH,EAAEhM,QAAQiM,EAAK,SAASpF,cAAekF,EAAWC,WAGjFpE,EAAUvB,YAAYjB,GACfA,EAGiB,SAAzBgH,GAAyBC,UAAYA,EAAOnE,WAAamE,EAAOnE,UAAUC,QAAQmE,eAAkBC,GAAuB/D,OAqBlH,SAATpP,GAASC,YAAqB,IAARA,GAAgBA,EAAQ,GAAK,GAAK,KAAO,IAW9C,SAAjBmT,GAA0BpF,OACpBA,EAAEiF,OAAOI,eAAiBC,IAA8C,IAAhCC,IAAaC,GAAwB,SAC7EvR,EAAIwR,GAAevR,QACT,IAALD,GACRwR,GAAexR,GAAGyR,WAEnBD,GAAevR,OAAS,GAKX,SAAfyR,GAAgB3H,EAAS8B,EAAM8F,EAAMC,MAChC7H,EAAQ8H,iBAAkB,KACzBC,EAAYC,EAAkBlG,GAClC+F,EAAUA,GAAW,CAACI,SAAQ,GAC9BjI,EAAQ8H,iBAAiBC,GAAajG,EAAM8F,EAAMC,GAC9CE,GAAajG,IAASiG,GAAwC,YAA3BA,EAAUrM,OAAO,EAAG,IAC1DsE,EAAQ8H,iBAAiBhG,EAAM8F,EAAMC,QAE5B7H,EAAQkI,aAClBlI,EAAQkI,YAAY,KAAOpG,EAAM8F,GAGjB,SAAlBO,GAAmBnI,EAAS8B,EAAM8F,MAC7B5H,EAAQoI,oBAAqB,KAC5BL,EAAYC,EAAkBlG,GAClC9B,EAAQoI,oBAAoBL,GAAajG,EAAM8F,GAC3CG,GAAajG,IAASiG,GAAwC,YAA3BA,EAAUrM,OAAO,EAAG,IAC1DsE,EAAQoI,oBAAoBtG,EAAM8F,QAEzB5H,EAAQqI,aAClBrI,EAAQqI,YAAY,KAAOvG,EAAM8F,GAYR,SAA3BU,GAA2BtG,GAC1BuG,EAAoBvG,EAAEwG,SAAWC,WAAazG,EAAEwG,QAAQtS,OACxDiS,GAAgBnG,EAAEiF,OAAQ,WAAYqB,IAEf,SAAxBI,GAAwB1G,GACvBuG,EAAoBvG,EAAEwG,SAAWC,WAAazG,EAAEwG,QAAQtS,OACxDyR,GAAa3F,EAAEiF,OAAQ,WAAYqB,IAE5B,SAARK,GAASf,EAAMgB,UAAU,SAAA5G,UAAK4F,EAAKiB,KAAKD,EAAO5G,IACnC,SAAZ8G,GAAahH,EAAMiH,EAAMC,OACpBC,EAAWF,EAAKG,KAAKpH,UACrBmH,GACHA,EAASJ,KAAKE,EAAKG,KAAKC,eAAiBJ,EAAMC,GAASD,GAElDA,EAGU,SAAlBK,KACCC,EAAajJ,MAAMkJ,QAAU,QAC7BD,EAAaE,SACbF,EAAajJ,MAAMkJ,QAAU,OAiGnB,SAAXE,GAAoBxH,OAGlByH,EAAkB3Q,EAFfiQ,EAAO7E,KACVwF,EAAM5E,gBAAgBiE,EAAK9B,OAAO3G,YAAY,QAE1CqJ,QAAUzF,KAAK+C,OAAOnE,UAAUC,QAAQI,QAAQ,GAAGC,YACnDwG,KAAOF,EACR1B,EAAkBhG,EAAEF,OACvB2H,GAAiD,IAA7BzH,EAAEF,KAAK+H,QAAQ,SAAoB7H,EAAE8H,eAAiB9H,EAAEiF,OAAUrG,EACtF+G,GAAa8B,EAAkB,WAAYV,EAAKgB,YAChDpC,GAAa8B,EAAkB,YAAaV,EAAKiB,SACjDrC,GAAa8B,EAAkB,cAAeV,EAAKgB,YACnDpC,GAAa/G,EAAM,aAAc8H,IACjCf,GAAapH,EAAM,mBAAoB8F,MAEvCoD,EAAmB,KACnB9B,GAAa/G,EAAM,YAAamI,EAAKiB,UAEjCC,GACJtC,GAAa/G,EAAM,UAAWmI,EAAKgB,YAEpC1D,GAAgBrE,GAChBoH,KACIpH,EAAEkI,gBACLlI,EAAI+G,EAAKoB,MAAQnI,EAAEkI,eAAe,GAClCnB,EAAKqB,QAAUpI,EAAEqI,YACPrI,EAAEsI,UACZvB,EAAKqB,QAAUpI,EAAEsI,UAEjBvB,EAAKoB,MAAQpB,EAAKqB,QAAU,KAE7BrB,EAAKwB,eAAiBxB,EAAKyB,SAAWxI,EAAEyI,MACxC1B,EAAK2B,eAAiB3B,EAAK4B,SAAW3I,EAAE4I,MACxC7B,EAAK8B,eAAiB9B,EAAKY,QAAQ3H,EACnC+G,EAAK+B,eAAiB/B,EAAKY,QAAQtG,EAEf,IAAhBa,KAAK0F,KAAK5T,GAA2B,IAAhBkO,KAAK0F,KAAKxT,GAA2B,IAAhB8N,KAAK0F,KAAKvT,GAA2B,IAAhB6N,KAAK0F,KAAKtT,OACvEsT,KAAO,MAEZ9Q,EAAOiQ,EAAK2B,eAAiBxG,KAAK0F,KAAK5T,EAAI+S,EAAKwB,eAAiBrG,KAAK0F,KAAKvT,EAAI6N,KAAK0F,KAAK5H,EACzF+G,EAAKwB,eAAiBxB,EAAK2B,eAAiBxG,KAAK0F,KAAKxT,EAAI2S,EAAKwB,eAAiBrG,KAAK0F,KAAKtT,EAAI4N,KAAK0F,KAAKvG,EACxG0F,EAAK2B,eAAiB5R,GAGvBiQ,EAAKgC,UAAYzD,IAAa,EAC9ByB,EAAKU,iBAAmBA,EACpBV,EAAKG,KAAK8B,SACbjC,EAAKG,KAAK8B,QAAQnC,KAAKE,EAAKG,KAAKC,eAAiBJ,EAAMA,EAAKkC,cAGrD,SAAVjB,GAAmBhI,OAGjBwG,EAASvS,EAFN8S,EAAO7E,KACVgH,EAAgBlJ,KAEZ+G,EAAKoC,WAAY5C,GAAqBQ,EAAKgC,WAAc/I,MAI9DwG,GADAO,EAAKkC,aAAejJ,GACRkI,oBAEXlI,EAAIwG,EAAQ,MACFO,EAAKoB,OAASnI,EAAEqI,aAAetB,EAAKqB,QAAS,KACtDnU,EAAIuS,EAAQtS,QACE,IAALD,IAAW+L,EAAIwG,EAAQvS,IAAIoU,aAAetB,EAAKqB,aACpDnU,EAAI,eAIH,GAAI+L,EAAEsI,WAAavB,EAAKqB,SAAWpI,EAAEsI,YAAcvB,EAAKqB,eAG/D/D,GAAgB6E,GAChBnC,EAAKqC,mBAAmBpJ,EAAE4I,MAAO5I,EAAEyI,OAC/B1B,EAAKG,KAAKmC,QACbtC,EAAKG,KAAKmC,OAAOxC,KAAKE,EAAKG,KAAKC,eAAiBJ,EAAMA,EAAKkC,eAGjD,SAAblB,GAAsB/H,EAAGsJ,OACpBvC,EAAO7E,QACN6E,EAAKoC,UAAapC,EAAKgC,aAAc/I,GAAqB,MAAhB+G,EAAKqB,SAAoBkB,KAAWtJ,EAAEsI,WAAatI,EAAEsI,YAAcvB,EAAKqB,SAAapI,EAAEkI,iBA5MzH,SAAdqB,YAAeC,EAAMC,WAChBxV,EAAIuV,EAAKtV,QACC,IAALD,MACJuV,EAAKvV,GAAGoU,aAAeoB,SACnB,SAGF,EAqMkJF,CAAYvJ,EAAEkI,eAAgBnB,EAAKqB,aAjT/K,SAAdsB,cAAoBlE,GAAmBD,IAoTtCmE,GACA3C,EAAKgC,UAAYzD,IAAa,MAI7BkB,EAASvS,EAHNiV,EAAgBlJ,EACnB2J,EAAc5C,EAAK6C,WACnBnC,EAAmBV,EAAKU,oBAErBA,GACHtB,GAAgBsB,EAAkB,WAAYV,EAAKgB,YACnD5B,GAAgBsB,EAAkB,YAAaV,EAAKiB,SACpD7B,GAAgBsB,EAAkB,cAAeV,EAAKgB,YACtD5B,GAAgBvH,EAAM,aAAc8H,KAEpCP,GAAgBvH,EAAM,YAAamI,EAAKiB,SAEpCC,IACJ9B,GAAgBvH,EAAM,UAAWmI,EAAKgB,YAClC/H,GAAKA,EAAEiF,QACVkB,GAAgBnG,EAAEiF,OAAQ,UAAW8B,EAAKgB,aAGxC4B,EACH5C,EAAK6C,YAAa,EACR7C,EAAKG,KAAK2C,SACpB9C,EAAKG,KAAK2C,QAAQhD,KAAKE,EAAKG,KAAKC,eAAiBJ,EAAMmC,GAErDlJ,EAAG,KACNwG,EAAUxG,EAAEkI,kBAEXlI,EAAIwG,EAAQ,MACFO,EAAKoB,OAASnI,EAAEqI,aAAetB,EAAKqB,QAAS,KACtDnU,EAAIuS,EAAQtS,QACE,IAALD,IAAW+L,EAAIwG,EAAQvS,IAAIoU,aAAetB,EAAKqB,aACpDnU,EAAI,SAKV8S,EAAKkC,aAAeC,EACpBnC,EAAK4B,SAAW3I,EAAE4I,MAClB7B,EAAKyB,SAAWxI,EAAEyI,aAEfS,IAAkBS,GAAe5C,EAAKG,KAAK4C,cAC9C/C,EAAKG,KAAK4C,cAAcjD,KAAKE,EAAMA,EAAKkC,eAGpCC,GACH7E,GAAgB6E,GAEbnC,EAAKG,KAAK6C,WACbhD,EAAKG,KAAK6C,UAAUlD,KAAKE,EAAKG,KAAKC,eAAiBJ,EAAMA,EAAKkC,eAG7DU,GAAe5C,EAAKG,KAAK8C,WAC5BjD,EAAKG,KAAK8C,UAAUnD,KAAKE,EAAKG,KAAKC,eAAiBJ,EAAMA,EAAKkC,eAEzD,GAEgB,SAAxBgB,GAAyBlW,EAASc,EAAGqV,EAAQhD,OAI3CjT,EAFAS,EADaX,EAAQc,GACTX,OACZF,EAAI,OAEAC,EAAI,EAAGA,EAAIS,EAAGT,GAAG,EACrBD,EAAE2D,KAAK,IAAIwS,GAAOD,EAAQnW,EAASc,EAAGZ,EAAGiT,WAEnClT,EAEK,SAAboW,GAAc3V,EAASR,EAAGoW,OACrB1V,EAAIF,EAAQ4V,GAAM5V,EAAQR,GAC7BW,EAAIH,EAAQ4V,EAAG,GAAK5V,EAAQR,EAAE,UACxB/B,KAAKwB,KAAKiB,EAAIA,EAAIC,EAAIA,OAlY9BgK,EAAMqJ,EAAkB1J,EAAMO,EAS9BwL,EAAOC,EAAMC,EAAQC,EACrBC,EA0EAC,EAAU3E,EAkDVqB,EAMAuD,IA7IGC,EAAc,0CAEjBC,EAAkB,UAElB7X,EAAWf,KAAKgB,GAAK,IACrBqS,EAAWwF,KAAKC,KAAQ,kBAAM,IAAID,MAAOE,WACzCzF,GAAmB,EACnBF,GAAa,EAKb4F,EAAe,GACfC,GAAW,GACXC,GAAS,GACTC,GAAQ,GACRC,GAAS,IACT7F,GAAiB,GA0BjBN,EAAwB,CAAC/D,OAAO,IAAI1C,GA2CpC6H,EAAmB,EAiTdgF,+BAuBLnC,mBAAA,4BAAmBT,EAAUH,OAE3BgD,EAASC,EAAS9W,EAAGC,EAAGkC,OACpB6R,SAAWA,OACXH,SAAWA,EACZtG,KAAK0F,OACR9Q,EAAO6R,EAAWzG,KAAK0F,KAAK5T,EAAIwU,EAAWtG,KAAK0F,KAAKvT,EAAI6N,KAAK0F,KAAK5H,EACnEwI,EAAWG,EAAWzG,KAAK0F,KAAKxT,EAAIoU,EAAWtG,KAAK0F,KAAKtT,EAAI4N,KAAK0F,KAAKvG,EACvEsH,EAAW7R,IAEZ2U,EAAWjD,EAAWtG,KAAKqG,gBAraT,IAAA,EAuagBkD,IACjCA,EAAU,IAFXD,EAAW7C,EAAWzG,KAAKwG,gBAtaT,IAAA,EA0agB8C,IACjCA,EAAU,GAEX7W,GAjBU,KAiBHuN,KAAK2G,eAAiB2C,GAAkB,GAjBrC,IAkBV5W,GAlBU,KAkBHsN,KAAK4G,eAAiB2C,GAAkB,GAlBrC,IAmBNvJ,KAAKwJ,OAASlB,IACjBY,GAAOzW,EAAIA,EACXyW,GAAOxW,EAAIA,OACN8W,KAAK7E,KAAK3E,KAAMkJ,IACrBzW,EAAIyW,GAAOzW,EACXC,EAAIwW,GAAOxW,GAERsN,KAAKvN,IAAMA,GAAKuN,KAAKtN,IAAMA,SACzB+S,QAAQtG,EAAIa,KAAKtN,EAAIA,OACrB+S,QAAQ3H,EAAIkC,KAAKvN,EAAIA,GACrBuN,KAAK0H,YAAc1H,KAAK6G,iBACvBa,YAAa,EAClB9C,GAAU,cAAe5E,KAAMA,KAAK+G,mBAKvC0C,QAAA,iBAAQA,UACFC,UAAU1X,cAIViV,SAAWwC,IAEV1D,GACJtC,GAAazD,KAAK+C,OAAQ,YAAa/C,KAAKsF,UAE7C7B,GAAazD,KAAK+C,OAAQ,aAAc/C,KAAKsF,UAC7C7B,GAAazD,KAAK+C,OAAQ,QAAS/C,KAAK2J,UAAU,KAElDC,EAAW5J,KAAK0H,WAChBzD,GAAgBjE,KAAK+C,OAAQ,YAAa/C,KAAKsF,UAC/CrB,GAAgBjE,KAAK+C,OAAQ,aAAc/C,KAAKsF,UAChDrB,GAAgB5H,EAAM,mBAAoB8F,IAC1C8B,GAAgBjE,KAAK+C,OAAQ,QAAS/C,KAAK2J,UACvC3J,KAAKuF,mBACRtB,GAAgBjE,KAAKuF,iBAAkB,cAAevF,KAAK6F,YAC3D5B,GAAgBjE,KAAKuF,iBAAkB,WAAYvF,KAAK6F,YACxD5B,GAAgBjE,KAAKuF,iBAAkB,YAAavF,KAAK8F,UAE1D7B,GAAgBvH,EAAM,UAAWsD,KAAK6F,YACtC5B,GAAgBvH,EAAM,YAAasD,KAAK8F,cACnC4B,WAAa1H,KAAK6G,WAAY,EAC/B+C,GACHhF,GAAU,YAAa5E,KAAMA,KAAK+G,eAG7B/G,MA5BCA,KAAKiH,aAET2C,KA6BLC,QAAA,iBAAQ/L,QACF+H,WAAW/H,wCA5FLiF,EAAQiC,QACdjC,OAA6B,iBAAZA,EAAwBrG,EAAKoN,iBAAiB/G,GAAQ,GAAKA,OAC5EiC,KAAOA,GAAQ,QACfM,SAAWb,GAAMa,GAAUtF,WAC3B8F,QAAUrB,GAAMqB,GAAS9F,WACzB6F,WAAapB,GAAMoB,GAAY7F,WAC/B+C,OAAO9E,aAAa,aAAc+B,KAAK+C,OAAOpF,aAAa,cAAgB,IAAM,wBACjF8H,QAAU3C,GAAuB9C,KAAK+C,aACtCtQ,EAAIuN,KAAKyF,QAAQ3H,OACjBpL,EAAIsN,KAAKyF,QAAQtG,OACjBqK,KAAOxE,EAAKwE,KACZxU,MAAMgQ,EAAK+E,OAAU/U,MAAMgQ,EAAKgF,WAK/BC,QAAU,QAJVA,QAAU,OACVF,MAAQ/E,EAAK+E,UACbC,MAAQhF,EAAKgF,WAIdP,SAAQ,UAmFTxB,0BAWLnB,QAAA,mBACClC,GAAU,UAAW5E,UAGtB2H,QAAA,mBACC/C,GAAU,UAAW5E,UAGtBmH,OAAA,sBACK+C,EAAIlK,KAAKzN,aACRyS,KAAKmC,OAAOxC,KAAK3E,KAAKgF,KAAKC,eAAiBjF,KAAMA,KAAMA,KAAKmK,WAAW1X,EAAIyX,EAAElK,KAAKjO,GAAIiO,KAAKmK,WAAWzX,EAAIwX,EAAElK,KAAKjO,EAAE,QAG1H+V,UAAA,qBACClD,GAAU,YAAa5E,UAGxB6H,UAAA,qBACCjD,GAAU,YAAa5E,UAGxBoK,OAAA,gBAAOvY,EAASc,EAAGZ,GACdF,SACEA,QAAUA,GAEZ6X,UAAU1X,QAAU,GACvBW,EAAIqN,KAAKrN,EACTZ,EAAIiO,KAAKjO,SAEJY,EAAIA,OACJZ,EAAIA,OAENsY,EAAarK,KAAKsK,OACrB/X,EAAUyN,KAAKnO,QAAQc,QACnBJ,QAAUA,OACV+X,OAAUvY,GAAKA,EAAIQ,EAAQP,OAAS,GAAKhC,KAAKsB,IAAItB,KAAK0B,MAAMa,EAAQR,EAAE,GAAKQ,EAAQR,EAAE,GAAIQ,EAAQR,GAAKQ,EAAQR,EAAE,IAAM/B,KAAK0B,MAAMa,EAAQR,EAAE,GAAKQ,EAAQR,EAAE,GAAIQ,EAAQR,EAAE,GAAKQ,EAAQR,KAAO,IAAQ,EAAI,EAC1MiO,KAAKsK,SAAWD,QACdvO,QAAQmC,aAAa,IAAK+B,KAAKsK,OAAStK,KAAKgI,OAAOuC,cAAgBvK,KAAKgI,OAAOwC,oBAEjF1O,QAAQmC,aAAa,YAAa,aAAe1L,EAAQR,GAAK,IAAMQ,EAAQR,EAAE,GAAK,8BAhD7EiW,EAAQnW,EAASc,EAAGZ,EAAGiT,QAC7BgD,OAASA,OACTlM,QAAU0G,GAAW,OAAQwF,EAAOyC,WAAY,CAACC,KAAK9B,EAAiB+B,OAAO/B,EAAiBgC,YAAY,EAAGC,aAAa,4BAC3HT,OAAOvY,EAASc,EAAGZ,QACnB+J,QAAQqH,cAAe,OACvB6B,KAAOA,GAAQ,QACfmF,WAAa,IAAId,GAAarJ,KAAKlE,QAAS,CAACmJ,cAAcjF,KAAMmH,OAAOnH,KAAKmH,OAAQqC,KAAKxJ,KAAKgF,KAAKwE,KAAM1C,QAAQ9G,KAAK8G,QAASe,UAAU7H,KAAK6H,UAAWF,QAAQ3H,KAAK2H,QAASG,UAAU9H,KAAK8H,mBAiDzLgD,8BAkDZjF,WAAA,oBAAW/H,OACNiN,EAAS/K,KAAKgL,eACdD,IACH/B,EAAavW,EAAIsY,EAAOxY,QAAQwY,EAAOhZ,GACvCiX,EAAatW,EAAIqY,EAAOxY,QAAQwY,EAAOhZ,EAAE,IAE1CkS,GAAgB5H,EAAM,mBAAoB8F,IAC1CyC,GAAU,YAAa5E,KAAMlC,OAG9BmN,KAAA,oBAMEzY,EAAGT,EALAmZ,EAAWlL,KAAKlJ,KAAK6G,aAAa,KACrC9L,EAAU6D,gBAAgBwV,GAC1BtM,EAAYoB,KAAKlJ,KAAK6G,aAAa,cAAgB,iBACnDwN,GAAkBnL,KAAKoL,UAAYvZ,EAAQlB,cAAgBqP,KAAKoL,SAASza,aAAekB,EAAQG,SAAWgO,KAAKoL,SAASpZ,OACzHqZ,EAAa,CAACpG,cAAcjF,KAAMwJ,KAAKxJ,KAAKgF,KAAKsG,WAAYnE,OAAOnH,KAAKuL,cAAezE,QAAQ9G,KAAKwL,eAAgB3D,UAAU7H,KAAK6F,WAAY8B,QAAQ3H,KAAKyL,eAAgB3D,UAAU9H,KAAK0L,iBAAkB3B,KAAK/J,KAAKgF,KAAK+E,KAAMC,KAAKhK,KAAKgF,KAAKgF,SAG/OmB,GAAiBnL,KAAK2L,UAAY3L,KAAK2L,SAAS3Z,OAAQ,KACtDD,EAAI,EAAGA,EAAIiO,KAAK2L,SAAS3Z,OAAQD,SAChC4Z,SAAS5Z,GAAG+J,QAAQM,WAAWe,YAAY6C,KAAK2L,SAAS5Z,GAAG+J,cAC5D6P,SAAS5Z,GAAGoY,WAAWV,SAAQ,QAEhCmC,iBAAiB5Z,OAAS,UAE3BoZ,SAAWvZ,EACZsZ,WACEQ,SAAW5D,GAAsBlW,EAAS,EAAGmO,KAAMqL,GAEhD,GADR7Y,EAAIX,EAAQG,YAEND,EAAI,EAAGA,EAAIS,EAAGT,SACb4Z,SAAW3L,KAAK2L,SAASE,OAAO9D,GAAsBlW,EAASE,EAAGiO,KAAMqL,aAI/EtZ,EAAIiO,KAAK2L,SAAS3Z,QACJ,IAALD,QACH4Z,SAAS5Z,GAAGqY,OAAOvY,eAIrB4Y,WAAW1N,YAAYiD,KAAK8L,eAC5BrB,WAAW1N,YAAYiD,KAAK+L,eAE5BC,eAAe/N,aAAa,IAAKiN,QACjCe,kBAAkBhO,aAAa,IAAKiN,QACpCgB,GAAGjO,aAAa,YA1lBO,SAA7BkO,2BAA6BpJ,WACxBpM,EAAImM,GAAuBC,GAC9BqJ,EAAQrJ,EAAO1F,iBACR0F,EAASA,EAAO3G,aAAe2G,EAAO1F,kBAAoB+O,GACjEzV,EAAEqI,SAAS8D,GAAuBC,UAE5B,UAAYpM,EAAE7E,EAAI,IAAM6E,EAAEzE,EAAI,IAAMyE,EAAExE,EAAI,IAAMwE,EAAEvE,EAAI,IAAMuE,EAAEmH,EAAI,IAAMnH,EAAEwI,EAAI,IAolBnDgN,CAA2BnM,KAAKlJ,KAAKsF,aAAe,uBACjFqO,WAAWxM,aAAa,YAAaW,QACrCqN,kBAAkBhO,aAAa,YAAaW,QAC5CyN,iBACErM,SAGRsM,WAAA,uBAzlBc,SAAdC,YAAcC,OAGZza,EAFG0a,EAAkB,GACrB3a,EAAI0a,EAAWZ,qBAEX7Z,EAAI,EAAGA,EAAID,EAAEE,OAAQD,IACzB0a,EAAgB1a,GAAKD,EAAEC,GAAGA,EAE3BkX,GAAS/O,QAAQ,CAACpD,KAAK0V,EAAYpa,EAAEoa,EAAW1V,KAAK6G,aAAa,KAAMiB,UAAU4N,EAAW1V,KAAK6G,aAAa,cAAgB,GAAI8O,gBAAgBA,IAC7H,GAAlBxD,GAASjX,SACZiX,GAASjX,OAAS,IAilBnBua,CAAYvM,UAGb0M,sBAAA,+BAAsB5O,MACoB,WAArCkC,KAAKyK,WAAWvO,MAAMyQ,gBACpBtH,cACC,GAAIgD,GAASvK,GAAKA,EAAE8O,OAAS,KAGlCC,EAAU9a,EAAGgZ,EAAQtY,EAAGC,EAAGoa,EAFxBzB,EAAa,CAACpG,cAAcjF,KAAMwJ,KAAKxJ,KAAKgF,KAAKsG,WAAYnE,OAAOnH,KAAKuL,cAAezE,QAAQ9G,KAAKwL,eAAgB3D,UAAU7H,KAAK6F,WAAY8B,QAAQ3H,KAAKyL,eAAgB3D,UAAU9H,KAAK0L,iBAAkB3B,KAAK/J,KAAKgF,KAAK+E,KAAMC,KAAKhK,KAAKgF,KAAKgF,MACrPxE,EAAMxF,KAAKyK,WAAWsC,eAAehN,cAElCC,KAAKmK,iBACHA,WAAWtE,WAAW/H,GAExB0H,IACH/S,EAAIqL,EAAEkP,QAAUxH,EAAI1T,EAAIgM,EAAEmP,QAAUzH,EAAIrT,EAAIqT,EAAI1H,EAChDpL,EAAIoL,EAAEkP,QAAUxH,EAAItT,EAAI4L,EAAEmP,QAAUzH,EAAIpT,EAAIoT,EAAIrG,GAGjD2N,EF2YI,SAASI,eAAerb,EAASY,EAAGC,EAAG2I,OAG5CtJ,EAAGY,EAAGgI,EAAGpI,EAFN4a,EAAU,CAACxa,EAAE,EAAGZ,EAAE,EAAG4I,EAAE,GAC1ByS,EAAezb,MAEXgB,EAAI,EAAGA,EAAId,EAAQG,OAAQW,QAC/BJ,EAAUV,EAAQc,GACbZ,EAAI,EAAGA,EAAIQ,EAAQP,OAAQD,GAAG,EAClC4I,EAAII,2BAA2B,EAAGtI,EAAGC,EAAG,EAAG,EAAG2I,GAAU,GAAI9I,EAAQR,GAAIQ,EAAQR,EAAE,GAAIQ,EAAQR,EAAE,GAAIQ,EAAQR,EAAE,GAAIQ,EAAQR,EAAE,GAAIQ,EAAQR,EAAE,GAAIQ,EAAQR,EAAE,GAAIQ,EAAQR,EAAE,IACnJnB,EAAfwc,IACHA,EAAexc,EACfuc,EAAQxa,EAAIA,EACZwa,EAAQpb,EAAIA,EACZob,EAAQxS,EAAIA,UAIRwS,EE3ZSD,CAAelN,KAAKoL,SAAU3Y,EAAGC,GFlP3C,SAAS2a,iBAAiB9a,EAASR,EAAG4I,MACxCA,GAAK,GAAU,GAALA,SACN,MAEJ2S,EAAK/a,EAAQR,GAChBwb,EAAKhb,EAAQR,EAAE,GACfyb,EAAOjb,EAAQR,EAAE,GACjB0b,EAAOlb,EAAQR,EAAE,GACjB2b,EAAOnb,EAAQR,EAAE,GACjB4b,EAAOpb,EAAQR,EAAE,GAGjB6b,EAAMN,GAAME,EAAOF,GAAM3S,EACzB/C,EAAK4V,GAAQE,EAAOF,GAAQ7S,EAC5BkT,EAAMN,GAAME,EAAOF,GAAM5S,EACzB9C,EAAK4V,GAAQE,EAAOF,GAAQ9S,EAC5BhH,EAAKia,GAAOhW,EAAKgW,GAAOjT,EACxB/G,EAAKia,GAAOhW,EAAKgW,GAAOlT,EACxBmT,EAAMJ,GARDnb,EAAQR,EAAE,GAQI2b,GAAQ/S,EAC3BoT,EAAMJ,GARDpb,EAAQR,EAAE,GAQI4b,GAAQhT,SAC5B/C,IAAOkW,EAAMlW,GAAM+C,EACnB9C,IAAOkW,EAAMlW,GAAM8C,EACnBpI,EAAQ6G,OAAOrH,EAAI,EAAG,EACrBjC,EAAO8d,GACP9d,EAAO+d,GACP/d,EAAO6D,GACP7D,EAAO8D,GACP9D,EAAO6D,GAAMiE,EAAKjE,GAAMgH,GACxB7K,EAAO8D,GAAMiE,EAAKjE,GAAM+G,GACxB7K,EAAO8H,GACP9H,EAAO+H,GACP/H,EAAOge,GACPhe,EAAOie,IAERxb,EAAQjC,SAAWiC,EAAQjC,QAAQ8I,OAASrH,EAAI,EAAKQ,EAAQ7B,WAAc,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GACzF,EEgNL2c,CAAiBrN,KAAKoL,SAAS0B,EAAYna,GAAIma,EAAY/a,EAAG+a,EAAYnS,GAC1EkS,EAAWC,EAAY/a,EAAI,EACtBA,EAAI,EAAGA,EAAIiO,KAAK2L,SAAS3Z,OAAQD,IACjCiO,KAAK2L,SAAS5Z,GAAGA,GAAK8a,SACpBlB,SAAS5Z,GAAGA,GAAK,GAGxBgZ,EAAS,IAAI9C,GAAOjI,KAAMA,KAAKoL,SAAU0B,EAAYna,EAAGka,EAAUxB,QAC7DZ,WAAW1N,YAAYiD,KAAK8L,eAC5BrB,WAAW1N,YAAYiD,KAAK+L,UACjChB,EAAOZ,WAAW7E,SAASxH,GAC3B0K,EAAuBuC,OAClBY,SAASlW,KAAKsV,QACda,iBAAiB5Z,OAAS,OAC1B4Z,iBAAiBnW,KAAKsV,QACtBsB,sBACAjC,cACAkC,aAENpH,KACAzB,GAAapH,EAAM,mBAAoB8F,IACvCyC,GAAU,UAAW5E,UAGtBgO,gBAAA,+BACKjD,EAAS/K,KAAKgL,eACjBjZ,EAAIgZ,EAAOhZ,EACXmY,EAAIa,EAAOxY,QACR8V,GAAQrY,KAAKsB,IAAI4Y,EAAEnY,GAAKmY,EAAEnY,EAAE,IAAM,GAAK/B,KAAKsB,IAAI4Y,EAAEnY,EAAE,GAAKmY,EAAEnY,EAAE,IAAM,QACjE0Z,eAAeV,OAItBkD,gBAAA,+BACKlD,EAAS/K,KAAKgL,eACjBjZ,EAAIgZ,EAAOhZ,EACXmY,EAAIa,EAAOxY,QACR8V,GAAQrY,KAAKsB,IAAI4Y,EAAEnY,GAAKmY,EAAEnY,EAAE,IAAM,GAAK/B,KAAKsB,IAAI4Y,EAAEnY,EAAE,GAAKmY,EAAEnY,EAAE,IAAM,QACjE0Z,eAAeV,OAItBW,iBAAA,4BACClD,EAAuB,UAClB8D,iBAGN4B,WAAA,6BACwC,EAA/BlO,KAAK4L,iBAAiB5Z,WAG/BqT,OAAA,gBAAO8I,WACD1D,WAAWvO,MAAMyQ,WAAa,eAC9B3B,eAAiB,WACjBlU,KAAKqM,cAAe,KACrBgL,UACCpc,EAAIiO,KAAK2L,SAAS3Z,QACR,IAALD,QACH6Z,iBAAiB7Z,GAAKiO,KAAK2L,SAAS5Z,UAGL,IAAlCwR,GAAeoC,QAAQ3F,OAC1BuD,GAAe9N,KAAKuK,WAEhBqM,iBACErM,SAGRwD,SAAA,gCACMiH,WAAWvO,MAAMyQ,WAAa,cAC9Bf,iBAAiB5Z,OAAS,OAC1BgZ,eAAiB,UACjBlU,KAAKqM,cAAe,EACzBI,GAAenK,OAAOmK,GAAeoC,QAAQ3F,MAAO,QAC/CqM,iBACErM,SAGRoO,YAAA,2BACKxP,EAAYoB,KAAKiM,kBAAkBtO,aAAa,cAAgB,sBAC/D8M,WAAWxM,aAAa,YAAaW,QACrC9H,KAAKmH,aAAa,YAAaW,OAGrC4M,eAAA,wBAAeT,IACiC,IAA3C/K,KAAK4L,iBAAiBjG,QAAQoF,IAC5BzC,SACCsD,iBAAiB5Z,OAAS,QAE3B4Z,iBAAiBnW,KAAKsV,IACjBzC,SACLsD,iBAAiBxS,OAAO4G,KAAK4L,iBAAiBjG,QAAQoF,GAAS,GACpEA,EAAOZ,WAAWN,WAEnBb,EAAavW,EAAIsY,EAAOxY,QAAQwY,EAAOhZ,GACvCiX,EAAatW,EAAIqY,EAAOxY,QAAQwY,EAAOhZ,EAAE,QACpCsa,iBACLzH,GAAU,UAAW5E,UAGtBqO,uBAAA,0CAGEtD,EAAQ5S,EAAOxF,EAFZ2b,EAAUtO,KAAK4L,iBAClB7Z,EAAIuc,EAAQtc,QAEC,IAALD,QACRgZ,EAASuD,EAAQvc,IACV+J,QAAQM,WAAWe,YAAY4N,EAAOjP,SAC7CiP,EAAOZ,WAAWV,SAAQ,IAC1BtR,EAAQ4S,EAAOhZ,GAGJoG,EAAQ4S,EAAOxY,QAAQP,OAAS,EAC1C+Y,EAAOxY,QAAQ6G,OAAOjB,EAAM,EAAG,GAE/B4S,EAAOxY,QAAQ6G,OAAOjB,EAAM,EAAG,GAJ/B4S,EAAOxY,QAAQ6G,OAAOjB,EAAO,GAM9BmW,EAAQlV,OAAOrH,EAAG,QACb4Z,SAASvS,OAAO4G,KAAK2L,SAAShG,QAAQoF,GAAS,GAC/CpY,EAAI,EAAGA,EAAIqN,KAAK2L,SAAS3Z,OAAQW,IACjCqN,KAAK2L,SAAShZ,GAAGZ,GAAKoG,SACpBwT,SAAShZ,GAAGZ,GAAK,QAIpBsa,sBACAjC,cACAkC,aACDtM,KAAKgF,KAAKuJ,qBACRvJ,KAAKuJ,eAAe5J,KAAK3E,KAAKgF,KAAKC,eAAiBjF,UAI3DyL,eAAA,wBAAeV,OAKbyD,EAAQC,EAAQC,EAASC,EAASzd,EAAKE,EAJpCW,EAAIgZ,EAAOhZ,EACdQ,EAAUwY,EAAOxY,QACjBqc,EAAM,IACNC,GAAU9c,GAAKA,GAAKQ,EAAQP,OAAS,EAElCqW,GAAQG,IAAyBuC,GAAU/K,KAAKgL,gBACnDD,EAAOT,QAAUS,EAAOT,OACpBuE,IACH9D,EAAOT,QAAS,GAEjBS,EAAOjP,QAAQmC,aAAa,IAAK8M,EAAOT,OAAStK,KAAKuK,cAAgBvK,KAAKwK,eACvEO,EAAOT,SAAWuE,GAGrBL,IAFAA,EAASxe,KAAK0B,MAAMa,EAAQR,EAAE,GAAKQ,EAAQR,EAAE,GAAIQ,EAAQR,GAAKQ,EAAQR,EAAE,MACxE0c,EAASze,KAAK0B,MAAMa,EAAQR,EAAE,GAAKQ,EAAQR,EAAE,GAAIQ,EAAQR,EAAE,GAAKQ,EAAQR,MAC3C,EAC7B2c,EAAUxG,GAAW3V,EAASR,EAAE,EAAGA,GACnC4c,EAAUzG,GAAW3V,EAASR,EAAGA,EAAE,GAC/B2c,EAAU,KACbA,EAAWxG,GAAW3V,EAASR,EAAGA,EAAE,GAAK,EACzCyc,EAASC,GAAUze,KAAK0B,MAAMa,EAAQR,EAAE,GAAKQ,EAAQR,EAAE,GAAIQ,EAAQR,EAAE,GAAKQ,EAAQR,EAAE,KAEjF4c,EAAU,KACbA,EAAWzG,GAAW3V,EAASR,EAAGA,EAAE,GAAK,EACzC0c,EAASD,GAAUxe,KAAK0B,MAAMa,EAAQR,EAAE,GAAKQ,EAAQR,EAAE,GAAIQ,EAAQR,EAAE,GAAKQ,EAAQR,EAAE,KAErFb,EAAMlB,KAAKkB,IAAIsd,GACfpd,EAAMpB,KAAKoB,IAAIod,GACXxe,KAAKsB,IAAImd,EAASD,GAAUxe,KAAKgB,GAAK,IACzCE,GAAOA,EACPE,GAAOA,GAERmB,EAAQR,EAAE,KAAQQ,EAAQR,GAAKX,EAAMsd,GAAWE,EAAO,GAAKA,EAC5Drc,EAAQR,EAAE,KAAQQ,EAAQR,EAAE,GAAKb,EAAMwd,GAAWE,EAAO,GAAKA,EAC9Drc,EAAQR,EAAE,KAAQQ,EAAQR,GAAKX,EAAMud,GAAWC,EAAO,GAAKA,EAC5Drc,EAAQR,EAAE,KAAQQ,EAAQR,EAAE,GAAKb,EAAMyd,GAAWC,EAAO,GAAKA,OACzDvC,sBACAjC,cACAkC,cACMvB,EAAOT,QAAWuE,IACzB9c,IACHQ,EAAQR,EAAE,GAAKQ,EAAQR,GACvBQ,EAAQR,EAAE,GAAKQ,EAAQR,EAAE,IAEtBA,EAAIQ,EAAQP,OAAS,IACxBO,EAAQR,EAAE,GAAKQ,EAAQR,GACvBQ,EAAQR,EAAE,GAAKQ,EAAQR,EAAE,SAErBsa,sBACAjC,cACAkC,eAEKhE,SACNsD,iBAAiB5Z,OAAS,OAC1B4Z,iBAAiBnW,KAAKsV,IAE5BvC,EAAuB,UAClB6D,qBAGNA,eAAA,8BAGEta,EAAGU,EAAGC,EAFHqY,EAA2C,IAAjC/K,KAAK4L,iBAAiB5Z,OAAgBgO,KAAK4L,iBAAiB,GAAK,KAC9ErZ,EAAUwY,EAASA,EAAOxY,QAAU,cAEhCyY,eAAiBD,EACjBhZ,EAAI,EAAGA,EAAIiO,KAAK2L,SAAS3Z,OAAQD,SAChC4Z,SAAS5Z,GAAG+J,QAAQI,MAAMwO,MAA6D,IAArD1K,KAAK4L,iBAAiBjG,QAAQ3F,KAAK2L,SAAS5Z,IAAc6W,EAAkB,QAGhHmC,SACEe,SAAS7N,aAAa,IAAK8M,EAAOT,OAAStK,KAAKuK,cAAgBvK,KAAKwK,oBACrEuB,SAAS9N,aAAa,IAAK8M,EAAOT,OAAStK,KAAKuK,cAAgBvK,KAAKwK,gBAE3EzY,EAAIgZ,EAASA,EAAOhZ,EAAI,EACpBgZ,GAAUhZ,GACbU,EAAIF,EAAQR,EAAE,GACdW,EAAIH,EAAQR,EAAE,QACT+Z,SAAS5P,MAAMyQ,WAAa3M,KAAK8O,OAAO5S,MAAMyQ,WAAetE,GAAQ5V,IAAMF,EAAQR,IAAMW,IAAMH,EAAQR,EAAE,GAAiB,UAAX,cAC/G+Z,SAAS7N,aAAa,YAAa,aAAexL,EAAI2W,GAAS1W,EAAI,UACnEoc,OAAO7Q,aAAa,SAAWxL,EAAI2W,GAAS1W,EAAI0W,GAAS7W,EAAQR,GAAKqX,GAAS7W,EAAQR,EAAE,UAEzF+Z,SAAS5P,MAAMyQ,WAAa3M,KAAK8O,OAAO5S,MAAMyQ,WAAa,SAE7D5B,GAAUhZ,EAAIQ,EAAQP,OAAS,GAClCS,EAAIF,EAAQR,EAAE,GACdW,EAAIH,EAAQR,EAAE,QACTga,SAAS7P,MAAMyQ,WAAa3M,KAAK+O,OAAO7S,MAAMyQ,WAAetE,GAAQ5V,IAAMF,EAAQR,IAAMW,IAAMH,EAAQR,EAAE,GAAiB,UAAX,cAC/Gga,SAAS9N,aAAa,YAAa,aAAexL,EAAI2W,GAAS1W,EAAI,UACnEqc,OAAO9Q,aAAa,SAAW1L,EAAQR,GAAKqX,GAAS7W,EAAQR,EAAE,GAAKqX,GAAS3W,EAAI2W,GAAS1W,SAG1FqZ,SAAS7P,MAAMyQ,WAAa3M,KAAK+O,OAAO7S,MAAMyQ,WAAa,aAIlEqC,YAAA,2BACKjE,EAAS/K,KAAKgL,eACdD,IACCA,EAAOhZ,SACL+Z,SAAS5P,MAAMyQ,WAAa3M,KAAK8O,OAAO5S,MAAMyQ,WAAa,WAE7D5B,EAAOhZ,EAAIgZ,EAAOxY,QAAQP,OAAS,SACjC+Z,SAAS7P,MAAMyQ,WAAa3M,KAAK+O,OAAO7S,MAAMyQ,WAAa,gBAKnEsC,cAAA,6BAEE/E,EAAGnY,EADAgZ,EAAS/K,KAAKgL,eAEdD,KACHb,EAAIa,EAAOxY,SACXR,EAAIgZ,EAAOhZ,KACEmY,EAAEnY,EAAE,IAAMmY,EAAEnY,EAAE,KAAOmY,EAAEnY,EAAE,UAChC+Z,SAAS5P,MAAMyQ,WAAa3M,KAAK8O,OAAO5S,MAAMyQ,WAAa,UAE7DzC,EAAEnY,KAAOmY,EAAEnY,EAAE,IAAMmY,EAAEnY,EAAE,KAAOmY,EAAEnY,EAAE,UAChCga,SAAS7P,MAAMyQ,WAAa3M,KAAK+O,OAAO7S,MAAMyQ,WAAa,eAKnEuC,gBAAA,2BACKlP,KAAKgL,eAAeV,cAClB6E,sBAAwBjH,GAAWlI,KAAKgL,eAAezY,QAASyN,KAAKgL,eAAejZ,EAAGiO,KAAKgL,eAAejZ,EAAE,IAEnH6S,GAAU,UAAW5E,UAGtBoP,gBAAA,2BACKpP,KAAKgL,eAAeV,cAClB6E,sBAAwBjH,GAAWlI,KAAKgL,eAAezY,QAASyN,KAAKgL,eAAejZ,EAAE,EAAGiO,KAAKgL,eAAejZ,IAEnH6S,GAAU,UAAW5E,UAGtBqP,iBAAA,0BAAiBvR,QACX+H,WAAW/H,QACXwO,iBAGNgD,eAAA,8BAOEpc,EANG6X,EAAS/K,KAAKgL,eACjBd,EAAIa,EAAOxY,QACXR,EAAIgZ,EAAOhZ,EACX6c,EAAM,IACNnc,EAAIuN,KAAK8L,SAAS3B,WAAW1X,EAC7BC,EAAIsN,KAAK8L,SAAS3B,WAAWzX,EAE9BwX,EAAEnY,EAAE,GAAKU,GAAMA,EAAImc,EAAO,GAAKA,EAC/B1E,EAAEnY,EAAE,GAAKW,GAAMA,EAAIkc,EAAO,GAAKA,EAC3B7D,EAAOT,SACNjC,GACH0C,EAAOT,QAAS,EAChBS,EAAOjP,QAAQmC,aAAa,IAAK+B,KAAKwK,oBACjCsB,SAAS7N,aAAa,IAAK+B,KAAKwK,oBAChCuB,SAAS9N,aAAa,IAAK+B,KAAKwK,iBAErCtX,EAAQlD,KAAK0B,MAAMwY,EAAEnY,EAAE,GAAKW,EAAGwX,EAAEnY,GAAKU,GACtCA,EAAIuN,KAAKmP,sBAAwBnf,KAAKoB,IAAI8B,GAC1CR,EAAIsN,KAAKmP,sBAAwBnf,KAAKkB,IAAIgC,GAC1CgX,EAAEnY,EAAE,KAAQmY,EAAEnY,GAAKU,GAAKmc,EAAO,GAAKA,EACpC1E,EAAEnY,EAAE,KAAQmY,EAAEnY,EAAE,GAAKW,GAAKkc,EAAO,GAAKA,SAInCxE,aAGNmF,eAAA,8BAOErc,EANG6X,EAAS/K,KAAKgL,eACjBd,EAAIa,EAAOxY,QACXR,EAAIgZ,EAAOhZ,EACX6c,EAAM,IACNnc,EAAIuN,KAAK+L,SAAS5B,WAAW1X,EAC7BC,EAAIsN,KAAK+L,SAAS5B,WAAWzX,EAE9BwX,EAAEnY,EAAE,GAAKU,GAAMA,EAAImc,EAAO,GAAKA,EAC/B1E,EAAEnY,EAAE,GAAKW,GAAMA,EAAIkc,EAAO,GAAKA,EAC3B7D,EAAOT,SACNjC,GACH0C,EAAOT,QAAS,EAChBS,EAAOjP,QAAQmC,aAAa,IAAK+B,KAAKwK,oBACjCsB,SAAS7N,aAAa,IAAK+B,KAAKwK,oBAChCuB,SAAS9N,aAAa,IAAK+B,KAAKwK,iBAErCtX,EAAQlD,KAAK0B,MAAMwY,EAAEnY,EAAE,GAAKW,EAAGwX,EAAEnY,GAAKU,GACtCA,EAAIuN,KAAKmP,sBAAwBnf,KAAKoB,IAAI8B,GAC1CR,EAAIsN,KAAKmP,sBAAwBnf,KAAKkB,IAAIgC,GAC1CgX,EAAEnY,EAAE,KAAQmY,EAAEnY,GAAKU,GAAKmc,EAAO,GAAKA,EACpC1E,EAAEnY,EAAE,KAAQmY,EAAEnY,EAAE,GAAKW,GAAKkc,EAAO,GAAKA,SAInCxE,aAGNmB,cAAA,uBAAcR,EAAQyE,EAASC,OAI7B1d,EAAGY,EAAGuX,EAAGpY,EAHNwc,EAAUtO,KAAK4L,iBAClBpZ,EAAI8b,EAAQtc,OACZ4c,EAAM,QAEFjc,EAAI,EAAGA,EAAIH,EAAGG,IAElBZ,GADAD,EAAIwc,EAAQ3b,IACNZ,EACNmY,EAAIpY,EAAES,QACFR,IACHmY,EAAEnY,EAAE,KAAQmY,EAAEnY,EAAE,GAAKyd,GAAWZ,EAAO,GAAKA,EAC5C1E,EAAEnY,EAAE,KAAQmY,EAAEnY,EAAE,GAAK0d,GAAWb,EAAO,GAAKA,GAE7C1E,EAAEnY,KAAQmY,EAAEnY,GAAKyd,GAAWZ,EAAO,GAAKA,EACxC1E,EAAEnY,EAAE,KAAQmY,EAAEnY,EAAE,GAAK0d,GAAWb,EAAO,GAAKA,EACxC7c,EAAImY,EAAElY,OAAS,IAClBkY,EAAEnY,EAAE,KAAQmY,EAAEnY,EAAE,GAAKyd,GAAWZ,EAAO,GAAKA,EAC5C1E,EAAEnY,EAAE,KAAQmY,EAAEnY,EAAE,GAAK0d,GAAWb,EAAO,GAAKA,GAEzC9c,IAAMiZ,GACTjZ,EAAEgK,QAAQmC,aAAa,YAAa,aAAgBiM,EAAEnY,GAAMqX,GAAUc,EAAEnY,EAAE,GAAM,UAG7EqY,aAGNX,QAAA,iBAAQA,OACFC,UAAU1X,cACPgO,KAAKiH,iBAETlV,EAAIiO,KAAK2L,SAAS3Z,QACR,IAALD,QACH4Z,SAAS5Z,GAAGoY,WAAWV,QAAQA,eAEhCxC,SAAWwC,OACXqC,SAAS3B,WAAWV,QAAQA,QAC5BsC,SAAS5B,WAAWV,QAAQA,GAC7BzJ,KAAKmK,iBACHA,WAAWV,QAAQA,GAEpBA,EAIOzJ,KAAKyK,WAAWrO,kBACtBtF,KAAKuG,gBAAgBN,YAAYiD,KAAKiM,wBACtCnV,KAAKuG,gBAAgBN,YAAYiD,KAAKyK,iBACtCQ,YACAqB,oBAPA9I,gBACA1M,KAAKuG,gBAAgBF,YAAY6C,KAAKiM,wBACtCnV,KAAKuG,gBAAgBF,YAAY6C,KAAKyK,kBAOvC4B,iBACErM,KAAKoK,aAGbA,OAAA,gBAAOsF,OAGL3d,EAAGmY,EAAGzX,EAAGC,EAFNN,EAAI,GACP2Y,EAAS/K,KAAKgL,kBAEX0E,QACEzE,OAEFF,IACHhZ,EAAIgZ,EAAOhZ,EACXmY,EAAIa,EAAOxY,QACPR,IACHU,EAAIyX,EAAEnY,EAAE,GACRW,EAAIwX,EAAEnY,EAAE,QACH+Z,SAAS7N,aAAa,YAAa,aAAgBxL,EAAK2W,GAAU1W,EAAK,UACvEoc,OAAO7Q,aAAa,SAAUxL,EAAI2W,GAAS1W,EAAI0W,GAASc,EAAEnY,GAAKqX,GAASc,EAAEnY,EAAE,KAE9EA,EAAImY,EAAElY,OAAS,IAClBS,EAAIyX,EAAEnY,EAAE,GACRW,EAAIwX,EAAEnY,EAAE,QACHga,SAAS9N,aAAa,YAAa,aAAgBxL,EAAK2W,GAAU1W,EAAK,UACvEqc,OAAO9Q,aAAa,SAAUiM,EAAEnY,GAAKqX,GAASc,EAAEnY,EAAE,GAAKqX,GAAS3W,EAAI2W,GAAS1W,KAIhFgd,EACHtd,EAAI4N,KAAKlJ,KAAK6G,aAAa,SACrB,KACD5L,EAAI,EAAGA,EAAIiO,KAAKoL,SAASpZ,OAAQD,IAEtB,GADfmY,EAAIlK,KAAKoL,SAASrZ,IACZC,SACLI,GAAK,IAAM8X,EAAE,GAAKd,GAASc,EAAE,GAAK,IAAMA,EAAE3Z,MAAM,GAAGof,KAAKvG,UAGrDtS,KAAKmH,aAAa,IAAK7L,QACvB4Z,eAAe/N,aAAa,IAAK7L,QACjC6Z,kBAAkBhO,aAAa,IAAK7L,UAGtC4N,KAAKgF,KAAK4K,UAAY5P,KAAKiH,UAC9BrC,GAAU,WAAY5E,KAAM5N,GAEtB4N,SAGR6P,WAAA,oBAAWC,EAAiBC,EAASC,MAChCF,EAAiB,KAChBnZ,EAAImM,GAAuB9C,KAAKlJ,aAC7B7E,iBAAiBL,YAAYoO,KAAKoL,UAAW,EAAG,EAAG,EAAG,EAAGzU,EAAEmH,GAAKiS,GAAW,GAAIpZ,EAAEwI,GAAK6Q,GAAW,WAElGhQ,KAAKoL,aAGb6E,UAAA,mBAAUH,EAAiBC,EAASC,MAC/BF,EAAiB,KAChBnZ,EAAImM,GAAuB9C,KAAKlJ,aFMhC,SAASoZ,gBAAgBre,IAnlCnB,SAAZse,UAAYpgB,SAA2B,iBAAXA,EAolCxBogB,CAAUte,EAAQ,MACrBA,EAAU,CAACA,QAIXue,EAAIlG,EAAGnY,EAAGQ,EAFP8H,EAAS,GACZ7H,EAAIX,EAAQG,WAERkY,EAAI,EAAGA,EAAI1X,EAAG0X,IAAK,KACvB3X,EAAUV,EAAQqY,GAClB7P,GAAU,IAAMvK,EAAOyC,EAAQ,IAAM,IAAMzC,EAAOyC,EAAQ,IAAM,KAChE6d,EAAK7d,EAAQP,OACRD,EAAI,EAAGA,EAAIqe,EAAIre,IACnBsI,GAAUvK,EAAOyC,EAAQR,MAAQ,IAAMjC,EAAOyC,EAAQR,MAAQ,IAAMjC,EAAOyC,EAAQR,MAAQ,IAAMjC,EAAOyC,EAAQR,MAAQ,IAAMjC,EAAOyC,EAAQR,MAAQ,IAAMjC,EAAOyC,EAAQR,IAAM,IAE7KQ,EAAQgF,SACX8C,GAAU,YAGLA,EEvBE6V,CAAgBje,iBAAiBL,YAAYoO,KAAKoL,UAAW,EAAG,EAAG,EAAG,EAAGzU,EAAEmH,GAAKiS,GAAW,GAAIpZ,EAAEwI,GAAK6Q,GAAW,YAElHhQ,KAAKlJ,KAAK6G,aAAa,SAG/B0S,iBAAA,0BAAiBC,EAAQC,EAASC,EAASC,OAQzCvZ,EAAQnF,EAAG4B,EAAIC,EAAIgE,EAAIC,EAPpBqS,EAAIlK,KAAKoL,SAAS,GACrB/Y,GAAa,EAAR6X,EAAE,GACP5X,EAAkB,IAAZie,EAAiB,IAAMA,GAAWrG,EAAE,IAC1C1X,EAAI0X,EAAElY,OACN4D,EAAK,GAAKsU,EAAE1X,EAAE,GAAKH,GACnBwD,GAAMya,GAAWpG,EAAE1X,EAAE,GAAKF,MAK1BuD,EADGA,EACE,EAAIA,GAEHD,EAEPA,GARO,IASPC,GATO,IAUF9D,EARLoX,GAAMnX,OAAS,EAQHD,EAAIS,EAAGT,GAAK,EACvBoX,GAAMpX,KAAQmY,EAAEnY,GAAKM,GAAMuD,EAAM,GAX3B,IAYNuT,GAAMpX,EAAE,KAAQmY,EAAEnY,EAAE,GAAKO,GAAMuD,EAAM,GAZ/B,OAeH4a,EAAa,KAChBvZ,EAAS,GACT1E,EAAI2W,GAAMnX,OACLD,EAAI,EAAGA,EAAIS,EAAGT,GAAG,EACrB4B,EAAKwV,GAAMpX,EAAE,GACb6B,EAAKuV,GAAMpX,EAAE,GACb6F,EAAKuR,GAAMpX,EAAE,GACb8F,EAAKsR,GAAMpX,EAAE,GACbmF,EAAOzB,KAAK9B,EAAIC,EAAIgE,EAAIC,GACxBF,eAAehE,EAAIC,EAAIuV,GAAMpX,GAAIoX,GAAMpX,EAAE,GAAIoX,GAAMpX,EAAE,GAAIoX,GAAMpX,EAAE,GAAI6F,EAAIC,EAAI,KAAOX,EAAQA,EAAOlF,OAAS,OAE7G2B,EAAKuD,EAAO,GACZ1E,EAAI0E,EAAOlF,OACND,EAAI,EAAGA,EAAIS,EAAGT,GAAG,EAAG,KACxB6F,EAAKV,EAAOnF,IACH4B,GAAW,EAALiE,GAAUA,EAAK,EAAG,CAChC6Y,UAGD9c,EAAKiE,UAIH4Y,GAAiB,IAANhe,GAAwB,IAAb2W,GAAM,IAAyB,IAAbA,GAAM,IAA2B,IAAfA,GAAM3W,EAAE,IAA2B,IAAf2W,GAAM3W,EAAE,GAClF2W,GAAM5Y,MAAM,EAAG,GAAGof,KAAK,MAE/BxG,GAAM,GAAK,IAAMA,GAAM,GAChB,IAAMA,GAAMwG,KAAK,uCArmBb5M,EAAQiC,GACnBA,EAAOA,GAAQ,GACV0D,GA7ZM,SAAZgI,YACChU,EAAOiU,SACPtU,EAAOC,OACPM,EAAQF,EAAKG,KACb4L,EAAWlG,GAAe,QAC1B4C,EAAe5C,GAAe,aACjBrG,MAAMkJ,QAAU,OAC7BxI,GAASA,EAAMG,YAAYoI,GAC3BrB,EAAqB,SAAS8M,WACzBC,EAAWD,EAAME,MAAM,KAC1BC,QAAyCnO,IAA3B6F,EAASuI,cAA+B,uDAAkFpO,IAA7B6F,EAASwI,gBAAiC,0DAA4DL,GAAOE,MAAM,KAC9NI,EAAM,GACNnf,EAAI,GACS,IAALA,GACRmf,EAAIL,EAAS9e,IAAMgf,EAAUhf,GAC7Bmf,EAAIH,EAAUhf,IAAM8e,EAAS9e,UAEvBmf,EATa,CAUnB,6CACFC,WAAWC,UAAUC,sBAAwBF,WAAWC,UAAUC,uBAAyB,SAASvT,UAC5FA,EAAEiP,eAAehN,UAAUf,SAASgB,KAAK+M,iBAEjDrQ,EAAKkH,iBAAiB,UAAW,SAAS9F,OAGxC/L,EAAGuf,EAAOxf,EAAGgF,EAFVya,EAAMzT,EAAE0T,SAAW1T,EAAE2T,MACxBC,EAAY5T,EAAEyT,KAAOA,KAEJ,UAAdG,GAAiC,KAARH,EAC5BjJ,GAAS,OACH,GAAkB,YAAdoJ,GAAmC,KAARH,EACrCnJ,GAAQ,OACF,GAAkB,SAAdsJ,GAAgC,KAARH,EAClChJ,GAAO,OACD,GAAkB,QAAdmJ,GAA+B,KAARH,MACjClJ,GAAO,EACPtW,EAAIwR,GAAevR,QACL,IAALD,GACRwR,GAAexR,GAAGid,mBAEb,IAAmB,MAAd0C,GAA6B,KAARH,KAAgBnJ,GAASG,IAA2B,EAAlBU,GAASjX,WAC3EiX,GAAS0I,QACTL,EAAQrI,GAAS,GACN,MACVnS,EAAOwa,EAAMxa,MACRA,KAAKmH,aAAa,IAAKqT,EAAMlf,GAClC0E,EAAKA,KAAKmH,aAAa,YAAaqT,EAAM1S,WAC1C9H,EAAKmU,OACLnZ,EAAIgF,EAAK6U,SACJ5Z,EAAI,EAAGA,EAAID,EAAEE,OAAQD,KACsB,IAA3Cuf,EAAM7E,gBAAgB9G,QAAQ7T,EAAEC,GAAGA,IACtC+E,EAAK8U,iBAAiBnW,KAAK3D,EAAEC,IAG/B+E,EAAKuV,iBACLvV,EAAKsT,SACDtT,EAAKkO,KAAK4M,QACb9a,EAAKkO,KAAK4M,OAAOjN,KAAK7N,SAGlB,GAAkB,WAAd4a,GAAwC,cAAdA,GAAqC,IAARH,GAAqB,KAARA,GAAsB,QAARA,GAA0B,MAARA,IAAgBnJ,GAASG,OACvIxW,EAAIwR,GAAevR,QACL,IAALD,GACRwR,GAAexR,GAAGsc,8BAEb,IAAmB,MAAdqD,GAA6B,KAARH,KAAgBhJ,GAAQH,OACxDrW,EAAIwR,GAAevR,QACL,IAALD,GACRwR,GAAexR,GAAGsT,QAAO,KAGzB,GACH3I,EAAKkH,iBAAiB,QAAS,SAAS9F,OACnCyT,EAAMzT,EAAEyT,KAAOzT,EAAE0T,SAAW1T,EAAE2T,SACtB,UAARF,GAA2B,KAARA,EACtBjJ,GAAS,OACH,GAAY,YAARiJ,GAA6B,KAARA,EAC/BnJ,GAAQ,OACF,GAAY,SAARmJ,GAA0B,KAARA,EAC5BhJ,GAAO,OACD,GAAY,QAARgJ,GAAyB,KAARA,EAAY,CACvClJ,GAAO,UACHtW,EAAIwR,GAAevR,QACT,IAALD,GACRwR,GAAexR,GAAGkd,mBAGlB,GACHlJ,IAAqB1J,EAAKwV,aAC1BpO,GAAa/G,EAAM,UAAWwG,IAC9BO,GAAa/G,EAAM,WAAYwG,IAC/BO,GAAa/G,EAAM,cAAewF,GAClCuB,GAAapH,EAAM,YAAa6F,GAChCtF,GAASA,EAAMgH,iBAAiB,aAAc1B,GAC9CwG,EAAe,EAkUdgI,QAEI1L,KAAOA,OACPlO,KAA2B,iBAAZiM,EAAwBrG,EAAKoN,iBAAiB/G,GAAQ,GAAKA,OAC1EmJ,GAAK1J,GAAW,IAAKxC,KAAKlJ,KAAKuG,gBAAiB,OAAO,mCACvD4O,kBAAoBzJ,GAAW,OAAQxC,KAAKkM,GAAI,CAACvB,OAAO,cAAeC,YAAY,GAAIF,KAAK,OAAQG,aAAa,4BACjHJ,WAAazF,EAAKyF,YAAcjI,GAAW,IAAKxC,KAAKkM,GAAI,OAAO,2CAChEF,eAAiBxJ,GAAW,OAAQxC,KAAKyK,WAAY,CAACE,OAAO/B,EAAiBgC,YAAY,EAAGF,KAAK,OAAQG,aAAa,4BACvHe,iBAAmB,QACnBkD,OAAStM,GAAW,WAAYxC,KAAKyK,WAAY,CAACE,OAAO/B,EAAiBgC,YAAY,EAAGC,aAAa,4BACtGkE,OAASvM,GAAW,WAAYxC,KAAKyK,WAAY,CAACE,OAAO/B,EAAiBgC,YAAY,EAAGC,aAAa,4BACtGiE,OAAO5S,MAAM4V,cAAgB9R,KAAK+O,OAAO7S,MAAM4V,cAAgB9R,KAAKgM,eAAe9P,MAAM4V,cAAgB,YACzG7K,UAAW,MACZzB,EAAMxF,KAAKlJ,KAAKsF,WAAW2Q,eAAehN,UAC7CgS,GAAQvM,EAAI1T,EAAI0T,EAAIpT,GAAK,GAAK4S,EAAKgN,YAAc,QAC7CxH,cAzfe,SAArByH,mBAAqBF,SAEb,CAAC,MADRA,EAAOjiB,GAAOiiB,KACQA,EAAMA,GAAOA,EAAMA,EAAMA,GAAOA,EAAMA,EAAO,KAAKpC,KAAKvG,IAufxD6I,CAAmBF,QACnCxH,cAtfe,SAArB2H,mBAAqBH,OAEnBI,EAAQriB,GADE,cACKiiB,SAET,KADPA,EAAOjiB,GAAOiiB,IACM,MAAQ,CAACA,EAAMI,EAAOA,EAAOJ,EAAM,EAAGA,GAAQI,EAAOJ,GAAOA,EAAMI,GAAQJ,EAAM,GAAIA,GAAOI,GAAQA,GAAQJ,EAAM,GAAIA,EAAMI,GAAQJ,EAAMA,GAAOI,EAAOJ,EAAM,GAAGpC,KAAKvG,IAAU,IAkf9K8I,CAA0B,KAAPH,QACnCjG,SAAWtJ,GAAW,OAAQxC,KAAKyK,WAAY,CAACrY,EAAE4N,KAAKwK,cAAeE,KAAK9B,EAAiB+B,OAAO,cAAeC,YAAY,SAC9HmB,SAAWvJ,GAAW,OAAQxC,KAAKyK,WAAY,CAACrY,EAAE4N,KAAKwK,cAAeE,KAAK9B,EAAiB+B,OAAO,cAAeC,YAAY,SAC9HkB,SAAS3B,WAAa,IAAId,GAAarJ,KAAK8L,SAAU,CAAC3E,OAAOnH,KAAKsP,eAAgBrK,cAAcjF,KAAM8G,QAAQ9G,KAAKkP,gBAAiBrH,UAAU7H,KAAKqP,iBAAkB1H,QAAQ3H,KAAKgO,gBAAiBxE,KAAKxE,EAAKoN,kBAC9MrG,SAAS5B,WAAa,IAAId,GAAarJ,KAAK+L,SAAU,CAAC5E,OAAOnH,KAAKuP,eAAgBtK,cAAcjF,KAAM8G,QAAQ9G,KAAKoP,gBAAiBvH,UAAU7H,KAAKqP,iBAAkB1H,QAAQ3H,KAAKiO,gBAAiBzE,KAAKxE,EAAKoN,kBAC9MtG,SAAS5P,MAAMyQ,WAAa3M,KAAK+L,SAAS7P,MAAMyQ,WAAa,iBAC9D0F,EAAiB,CAACrS,KAAK8L,SAAU9L,KAAK+L,SAAU/L,KAAK8O,OAAQ9O,KAAK+O,OAAQ/O,KAAKyK,WAAYzK,KAAKgM,eAAgBhM,KAAKiM,mBACxHla,EAAIsgB,EAAergB,QACN,IAALD,GACRsgB,EAAetgB,GAAGoR,cAAe,GAEX,IAAnB6B,EAAKsN,iBACHnI,WAAa,IAAId,GAAarJ,KAAKiM,kBAAmB,CAAChH,cAAcjF,KAAM8G,QAAQ9G,KAAKqF,OAAQwC,UAAU7H,KAAK6F,WAAYsB,OAAOnH,KAAKoO,YAAatG,UAAU9H,KAAKsM,WAAYvC,KAAK/J,KAAKgF,KAAK+E,KAAMC,KAAKhK,KAAKgF,KAAKgF,aAEpNiB,YACAR,WAAWvO,MAAMyQ,YAAgC,IAAlB3H,EAAKuN,SAAsB,SAAW,WACpD,IAAlBvN,EAAKuN,gBACHzb,KAAKqM,cAAe,EACzBI,GAAe9N,KAAKuK,YAEhBsM,aACAvG,IACJtC,GAAazD,KAAKiM,kBAAmB,YAAaxH,GAAMzE,KAAK0M,sBAAuB1M,OACpFyD,GAAazD,KAAKiM,kBAAmB,UAAWxH,GAAMzE,KAAK6F,WAAY7F,QAExEyD,GAAazD,KAAKiM,kBAAmB,aAAcxH,GAAMzE,KAAK0M,sBAAuB1M,OACrFyD,GAAazD,KAAKiM,kBAAmB,WAAYxH,GAAMzE,KAAK6F,WAAY7F,OAikB1E8K,GAAW3Q,eAAiBA,eAC5B2Q,GAAWzR,gBAAkBA,gBAC7ByR,GAAW0H,YAAc,SAACC,EAAMzN,OAC3BlJ,EAAS5E,EAAQnF,EAAG4B,EAAIiE,EAAIhE,EAAIiE,EAAI6a,EAAQC,EAAWvY,EAAW5H,EAAG+G,KAEzEa,GADA4K,EAAOA,GAAQ,IACE5K,WAAa,EAC9BuY,EAAY3N,EAAK2N,WAAc,EAAIvY,EACnCb,QAA4CqJ,IAAzBoC,EAAKzL,gBAAgC,IAAMyL,EAAKzL,iBAAmBxI,EACjE,iBAAV0hB,IAEVA,GADA3W,EAAU2W,GACK9U,aAAa,MAEN,MAAnB8U,EAAKhb,OAAO,IAAiC,MAAnBgb,EAAKhb,OAAO,KACzCqE,EAAUY,EAAKkW,cAAcH,MAE5BA,EAAO3W,EAAQ6B,aAAa,MAG9BzG,GAA0B,IAAhB8N,EAAK6N,QAAqB,eAAeC,KAAKL,GAAmC/c,gBAAgB+c,GAAM,GAAhDA,EAAK5b,MAAM8R,IACxD,IAAhB3D,EAAK6N,OAAkB,KAC1BH,EAASxb,EACTA,EAAS,GACT1E,EAAIkgB,EAAO1gB,OACND,EAAI,EAAGA,EAAIS,EAAGT,GAAG,EACrB4B,GAAM+e,EAAO3gB,EAAE,GACf6B,GAAM8e,EAAO3gB,EAAE,GACf6F,GAAM8a,EAAO3gB,EAAE,GACf8F,GAAM6a,EAAO3gB,EAAE,GACfmF,EAAOzB,KAAK3F,GAAO6D,GAAK7D,GAAO8D,GAAK9D,GAAO8H,GAAK9H,GAAO+H,IACvDF,eAAehE,EAAIC,GAAK8e,EAAO3gB,IAAK2gB,EAAO3gB,EAAE,IAAK2gB,EAAO3gB,EAAE,IAAK2gB,EAAO3gB,EAAE,GAAI6F,EAAIC,EAAI,GAAiB,IAAZ8a,GAAqBzb,EAAQA,EAAOlF,OAAS,IAExIkF,EAASmC,gBAAgBc,eAAejD,EAAQkD,GAAY4K,EAAK1L,UAAWC,IACrE,GAAK,IAAMrC,EAAO,QAEzBA,EAASiD,eAAejD,EAAQkD,UAEjCqY,EAAO,IAAMvb,EAAOyY,KAAK,KACrB7T,GACHA,EAAQmC,aAAa,IAAKwU,GAEpBA,GAGR3H,GAAWiI,OAAS,SAAChQ,EAAQiC,UAAS,IAAI8F,GAAW/H,EAAQiC,IAE7D8F,GAAWkI,YAAchK,EAEzB8B,GAAWmI,gBAAkB,SAACjO,OACzBkO,EAAIlO,EAAKmO,QAAU,EACtBC,EAAM,KACNpJ,EAAQhF,EAAKvS,GAAgB,IAAXuS,EAAKvS,EAAWuS,EAAKvS,EAAIuS,EAAKqO,MAAQ,GAAKD,EAC7DE,EAAQtO,EAAKtS,GAAgB,IAAXsS,EAAKtS,EAAWsS,EAAKtS,EAAIsS,EAAKsL,OAAS,GAAK8C,EAC9DrJ,EAAOC,GAAQhF,EAAKqO,OAASD,MAC7BG,EAAOD,GAAQtO,EAAKsL,QAAU8C,MAC9BI,GAA8B,IAAlBxO,EAAKwO,SACjBC,GAA8B,IAAlBzO,EAAKyO,SACjBC,EAAO1O,EAAK0O,KACZC,EAAO3O,EAAK4O,gBACbV,GAAKA,EACE,SAAAxQ,OAGLmR,EAAOC,EAAO9a,EAAIC,EAFfxG,EAAIiQ,EAAEjQ,EACTC,EAAIgQ,EAAEhQ,EAEF8gB,GAAY/gB,EAAIuX,IAAUhR,EAAKvG,EAAIuX,GAAQhR,EAAKka,EACpDzgB,EAAIuX,GACOwJ,GAAgBzJ,EAAJtX,IAAcuG,EAAK+Q,EAAOtX,GAAKuG,EAAKka,KAC3DzgB,EAAIsX,GAEA0J,GAAY/gB,EAAI4gB,IAAUra,EAAKvG,EAAI4gB,GAAQra,EAAKia,EACpDxgB,EAAI4gB,GACOG,GAAgBF,EAAJ7gB,IAAcuG,EAAKsa,EAAO7gB,GAAKuG,EAAKia,KAC3DxgB,EAAI6gB,GAEDG,IACH1a,EAAKvG,EAAIihB,EAAKjhB,EACdwG,EAAKvG,EAAIghB,EAAKhhB,EACVsG,EAAKA,EAAKka,IACbzgB,EAAIihB,EAAKjhB,GAENwG,EAAKA,EAAKia,IACbxgB,EAAIghB,EAAKhhB,IAGPihB,IAEH3a,GADA6a,EAAQ7J,EAAOha,KAAKC,OAAOwC,EAAIuX,GAAQ2J,GAAQA,GAClClhB,GAGJuG,GADTC,GADA6a,EAAQR,EAAOtjB,KAAKC,OAAOyC,EAAI4gB,GAAQK,GAAQA,GAClCjhB,GACMuG,EAAKia,IACvBzgB,EAAIohB,EACJnhB,EAAIohB,GAGNpR,EAAEjQ,EAAIA,EACNiQ,EAAEhQ,EAAIA,IAIRoY,GAAWiJ,QAAU,QCvvCR,SAAZC,GAAYjkB,SAA2B,iBAAXA,EACX,SAAjBwS,GAAkB3E,EAAMF,OACnBI,EAAIpB,GAAKqB,gBAAkBrB,GAAKqB,iBAAiBL,GAAM,gCAAgChH,QAAQ,SAAU,QAASkH,GAAQlB,GAAKI,cAAcc,UAC1IE,EAAE5B,MAAQ4B,EAAIpB,GAAKI,cAAcc,GA+B5B,SAAbqW,GAAcnd,EAAMiM,EAAQiC,UAAUgP,GAAUld,IAASod,GAAapB,KAAKhc,GAAS4F,GAAKkW,cAAc9b,GAAQqd,MAAMC,QAAQtd,GAAQud,GAAiBC,IAAiB,CAAC7hB,EAAE8hB,GAAKC,YAAYzR,EAAQ,KAAMrQ,EAAE6hB,GAAKC,YAAYzR,EAAQ,cAAUjM,GAAOkO,IAAUgP,GAAUld,IAASA,GAA8C,UAArCA,EAAKwG,QAAU,IAAIC,cAA4BzG,EAAO,EAmCrU,SAAZ4Z,GAAa+D,EAAMC,OACdC,EAAU,+CACdtY,GAAOC,OACPiY,GAAOA,IAAQE,GAAQpY,GAAKkY,MAAQnd,QAAQwd,KAAKD,GACjDjY,GAAOiU,SACP/T,GAAQF,GAAKG,KACbgY,GAASnY,GAAKC,iBACdmY,GAAmBP,IAAQA,GAAKQ,QAAQC,aA/ClB,SAAvBC,wBACC9P,GAAe5C,GAAe,aACjBrG,MAAMkJ,QAAU,OAC7BxI,GAAMG,YAAYoI,IAgDjB8P,GACAX,GAAkBQ,GAAiBI,eACnCb,GAAmBS,GAAiB5E,kBAJtB,IAAbwE,GAAsBtd,QAAQwd,KAAKD,OAjFnCJ,GAAMlY,GAAMK,GAAMmY,GAAQjY,GAAOkY,GAAmBR,GAAiBD,GA+BxElP,GA9BAgQ,GACe,4BAyDflS,GAAwB,CAAC/D,OAAO,CAACpN,EAAE,EAAGI,EAAE,EAAGC,EAAE,EAAGC,EAAE,EAAG0L,EAAE,EAAGqB,EAAE,IA8BhDiW,+BAyHZnF,UAAA,4BACQjQ,KAAKgI,OAAOiI,WAAU,GAAOjQ,KAAKqV,OAAO5iB,GAAIuN,KAAKqV,OAAO3iB,gDAxHrD4iB,EAAetQ,YAAAA,IAAAA,EAAO,IAC5B8P,IACJpE,GAAU1L,EAAKuP,KAAM,OAKrBxR,EAAQjM,EAAMye,EAAOnf,EAAQC,EAAQ2G,EAAUS,EAAK+X,EAAWC,EAAc7gB,EAAMsK,EAAQwW,EAAaC,EAHrGC,EAAarT,GAAe,OAC/BsC,EAAO7E,KACPqV,EAAS,CAAC5iB,EAAE,EAAGC,EAAE,GAEd4iB,aAAyBf,GAAKE,KAAKoB,MAEtC9S,GADAyS,EAAYF,GACOQ,UAAU,IAE7B/S,EAASwR,GAAKwB,MAAMC,QAAQV,GAAe,GAC3CE,EA3CqB,SAAvBS,qBAAuBlT,WAClBmT,EAAS3B,GAAK4B,YAAYpT,GAC7BhR,EAAI,EACEA,EAAImkB,EAAOlkB,OAAQD,IAAK,IAC1BmkB,EAAOnkB,GAAGiT,KAAKgQ,kBACXkB,EAAOnkB,GACJmkB,EAAOnkB,GAAGqkB,UACpBF,EAAOzgB,WAAPygB,EAAeA,EAAOnkB,GAAGqkB,SAASC,gBAoCvBJ,CAAqBlT,IAElCjM,EAAOmd,GAAWjP,EAAKlO,KAAMiM,EAAQiC,QAChCqQ,OAASA,EACdrY,EApGoB,SAArBsZ,mBAAqBvT,OAChBwT,EAASxT,EAAOzB,wBACnBkV,EAAgB3B,GAAO4B,WAAapa,GAAK2F,aAAe6S,GAAO5S,WAAarF,GAAMqF,WAAa,GAC/FyU,EAAgB7B,GAAO8B,YAActa,GAAKwF,aAAegT,GAAO/S,YAAclF,GAAMkF,YAAc,SAC5F,CAACtC,KAAK+W,EAAO/W,KAAOkX,EAAenX,IAAIgX,EAAOhX,IAAMiX,EAAeI,MAAOL,EAAOK,MAAQF,EAAeG,OAAQN,EAAOM,OAASL,GAgG5HF,CAAmBvT,GAC9B3M,EAASmE,WAAWga,GAAKC,YAAYzR,EAAQ,IAAK,OAClD1M,EAASkE,WAAWga,GAAKC,YAAYzR,EAAQ,IAAK,OAClDwS,EAASxS,EAAO+T,QAA2C,QAAjC/T,EAAOzF,QAAQC,cACrCiY,IAAc1e,IACjBA,EAAOmd,GAAWuB,EAAUxQ,KAAKgQ,WAAWle,MAAQ0e,EAAUxQ,KAAKgQ,WAAYjS,EAAQyS,EAAUxQ,KAAKgQ,aAEvGY,EAAW3X,aAAa,QAAS,oBACjC2X,EAAW1Z,MAAMiC,QAAU,gPAC3ByX,EAAWmB,UAAY,mBACvBnB,EAAWoB,UAAYnS,GACtB0P,GAAKwB,MAAMC,QAAQhR,EAAK1G,WAAW,IAAM1B,IAAOG,YAAY6Y,GAjFxC,SAAtBqB,oBAAuBlU,EAAQmU,EAAQC,GACtCpU,EAAOa,iBAAiB,QAAS,SAAA9F,MAC5BA,EAAEiF,OAAOiU,UAAW,KACnB7kB,EAAI+kB,EAAOpZ,EAAEiF,YACjBoC,GAAapV,MAAQoC,IACZgT,GAAaE,OAAQ,CAC7BjO,QAAQC,IAAIlF,GACZgT,GAAajJ,MAAMkJ,QAAU,QAC7BD,GAAaE,aAEZ3I,GAAK0a,YAAY,QACjBjS,GAAakS,OACbF,GAAcA,EAAWpU,GACxB,MAAOuU,GACRlgB,QAAQwd,KAAK,uDAEdzP,GAAajJ,MAAMkJ,QAAU,WAkEhC6R,CAAoBrB,EAAY,kBAAM/Q,EAAKoL,aAAa,kBAAMsE,GAAKgD,OAAO3B,EAAY,CAAC4B,gBAAgB,SAAU,CAACC,SAAS,GAAKD,gBAAgB,6BAChJ/Z,EAAM3G,GAAQA,EAAKuG,mBAElBoY,EAAgBF,GAASxS,EAAO1F,iBAAmB0F,EAAO1F,gBAAgBM,aAAa,UAAa,6BAChG4X,GACH9X,EAAMsF,EAAO1F,gBACbzI,EAAOmO,EAAOpE,UAEdvI,GADA8I,EAnEsB,SAAzB4D,uBAAyBC,UAAWA,EAAOnE,UAAUC,QAAQmE,eAAiBC,IAAuB/D,OAmEzF4D,CAAuBC,IAChBjF,EAChBzH,EAAS6I,EAAOC,EAChBkW,EAAO5iB,EAAImC,EAAKnC,EAChB4iB,EAAO3iB,EAAIkC,EAAKlC,IAEhB+K,EAAM8E,GAAe,MAAOkT,GAC5B7Y,GAAMG,YAAYU,GAClBA,EAAIQ,aAAa,UAAW,eAC5BR,EAAIvB,MAAMiC,QAAU,sGAAwGnB,EAASuC,IAAM,YAAcvC,EAASwC,KAAO,OAE1K5K,EAAOof,GAAUld,KAAUod,GAAapB,KAAKhc,GAAQA,EA5HrC,SAAlB4gB,gBAAmBjlB,EAAGC,OAEpBX,EADG4lB,EAAc,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,SAE/C5lB,EAAI,EAAGA,EAAI4lB,EAAY3lB,OAAQD,GAAG,EACtC4lB,EAAY5lB,IAAMU,EAClBklB,EAAY5lB,EAAE,IAAMW,QAEd,IAAMD,EAAI,IAAMC,EAAI,IAAMilB,EAAYhI,KAAK,KAqHW+H,CAAgBthB,EAAQC,IACpFS,EAAOyL,GAAe,OAAQkT,IACzBxX,aAAa,IAAKrJ,GACvBkC,EAAKmH,aAAa,gBAAiB,sBACnCnH,EAAKoF,MAAMiC,QAAU,mCAAqC6G,EAAK4S,WAAa,GAAK,aAAe5S,EAAK6S,WAAa,QAAU,cAAgB7S,EAAK8S,aAAe,IAChKra,EAAIV,YAAYjG,IACZue,EAAO5iB,GAAK4iB,EAAO3iB,IACtB6hB,GAAKwD,IAAIjhB,EAAM,CAACrE,EAAE4iB,EAAO5iB,EAAGC,EAAE2iB,EAAO3iB,KAIjC,aAAcsS,IACnBA,EAAKuN,UAAW,GAEX,eAAgBvN,IACrBA,EAAKsG,WAAa,SAAA5I,GACbA,EAAEjQ,EAAIiQ,EAAEjQ,EAAIiQ,EAAEhQ,EAAIgQ,EAAEhQ,EAAI,KAC3BgQ,EAAEjQ,EAAIiQ,EAAEhQ,EAAI,KAKfijB,EAAmBH,GAAuC,WAA1BA,EAAUhU,OAAOiR,KAAoB+C,EAAUhU,OAAOA,OAASgU,EAE/FxQ,EAAK8B,QAAU,WACd6O,EAAiBqC,MAAM,IAGxBtC,EAAc,uBAIbF,EAAUyC,aACVtC,EAAiBuC,WAElBlT,EAAK6C,UAAY7C,EAAKuJ,eAAiBmH,OAElC1N,OAAS8C,GAAWiI,OAAOjc,EAAMkO,GAClCA,EAAKmT,QACR5D,GAAKwD,IAAIhV,EAAQ,CAACqV,gBAAgB,UAAWC,UAAU,GAAIC,UAAU,KAElE9C,GACCA,EAAUxQ,KAAKgQ,WAAWle,KAC7B0e,EAAUxQ,KAAKgQ,WAAWle,KAAOA,EAEjC0e,EAAUxQ,KAAKgQ,WAAa,CAACle,KAAKA,GAE/B6e,EAAiBnU,SAAW+S,GAAKgE,gBACpChE,GAAKgE,eAAeC,IAAI7C,EAnKV,SAAjB8C,eAAiBjD,WACZkD,EAAOlD,EAAUmD,YACdnD,GACNkD,EAAOlD,EAAUoD,YAAcF,GAAQlD,EAAUqD,aAAe,GAChErD,EAAYA,EAAUhU,cAEhBkX,EA6JqCD,CAAe9C,GAAoBA,EAAiBmD,SAE/FnD,EAAiBoD,QAAQ,GAAGC,YAAY,IAGxCxD,EAAYG,EAAmBpB,GAAK0E,GAAGlW,EAAQ,CAC9CiS,WAAY,CACXle,KAAMA,EACNqE,MAAO6J,EAAK7J,OAAS,EACrBC,IAAM,QAAS4J,EAAQA,EAAK5J,IAAM,EAClC8d,WAAa,eAAgBlU,GAAQA,EAAKkU,WAC1CC,MAAOriB,EACPsiB,YAAapU,EAAKoU,aAEnB3B,SAAUzS,EAAKyS,UAAY,EAC3B4B,KAAMrU,EAAKqU,MAAQ,eACnBN,QAAQ,EACRC,YAAY,EACZM,QAAQtU,EAAKlO,YAGV0e,UAAYA,EASnBJ,GAAiBmE,SAAW7I,GAC5B0E,GAAiBrC,OAAS,SAAChQ,EAAQiC,UAAS,IAAIoQ,GAAiBrS,EAAQiC,IACzEoQ,GAAiBoE,SAAW,SAAC1iB,EAAMkO,UAAS8F,GAAWiI,OAAOjc,EAAMkO,IACpEoQ,GAAiBrB,QAAU"}