{"version":3,"file":"840.3c756c63cc12bc1a.js","mappings":"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","names":["Class","observers","_observers","this","addObserver","element","push","removeObserver","index","indexOf","splice","trigger","methodName","event","_suspended","idx","length","observer","optionsChange","e","geometryChange","suspend","resume","Math","max","_observerField","field","value","toString","HasObservers","constructor","options","prefix","super","member","_wrap","get","parts","split","result","shift","set","current","_set","composite","parentObj","fieldName","obj","OptionsStore","_clear","object","type","call","wrapped","defined","a","b","tolerance","close","pow","accessors","withAccessors","center","Point","setCenter","radiusX","radiusY","startAngle","endAngle","anticlockwise","xRotation","clone","Arc","getCenter","pointAt","angle","radian","rad","x","cos","y","sin","curvePoints","dir","interval","_arcInterval","intervalAngle","subIntervalsCount","ceil","subIntervalAngle","transformation","currentAngle","transform","rotate","i","nextAngle","points","_intervalCurvePoints","cp1","cp2","p2","bbox","matrix","extremeAngles","ellipseExtremeAngles","extremeX","deg","extremeY","endPoint","transformCopy","currentAngleX","bboxStartAngle","currentAngleY","currentPoint","minPoint","maxPoint","currentPointX","currentPointY","Rect","oldStart","p1","p1Derivative","_derivativeAt","p2Derivative","t","containsPoint","point","distance","distanceTo","angleRad","atan2","pointRadius","sqrt","startPoint","round","PRECISION","intersection","p0","p3","s1x","s2x","s1y","s2y","nx","ny","d","s","lineIntersection","closeOrLess","calculateAngle","inAngleRange","equals","_isOnPath","width","start","end","rx","ry","largeArc","swipe","rotation","arcParameters","parameters","x1","y1","x2","y2","radians","cosine","sine","xT","yT","sign","xt2","yt2","rx2","ry2","delta","constT","isNaN","cxT","cyT","cx","cy","uX","uY","vX","vY","acos","angleCosine","signEndAngle","abs","normalizeArcParameters","PI_DIV_2","PI","radius","setRadius","other","Circle","_pointAt","pointDistance","c","intersects","minX","min","maxX","minY","maxY","inRange","f","multiplyCopy","Matrix","invert","g","h","det","precision","toArray","separator","join","scaleX","scaleY","IDENTITY","unit","origin","originPoint","create","ZERO","translate","translateWith","move","scale","scaleCopy","toMatrix","dx","dy","digits","doRound","arg0","arg1","arguments","MAX_NUM","MIN_NUM","size","Size","cornerRadius","setOrigin","setSize","setCornerRadius","getOrigin","Array","isArray","getCornerRadius","getSize","height","topLeft","bottomRight","topRight","bottomLeft","tl","tr","br","bl","fromPoints","m","expand","expandCopy","rectOuter","rectInner","rect1","left","top","right","bottom","rect2","controlPoint","rotatedPoint","t1","real","img","add","cNumber","ComplexNumber","addConstant","negate","multiply","multiplyConstant","nthRoot","n","r","nthR","isReal","squareRoot","solveQuadraticEquation","p","q","Q","b3a","y3","z1","z2","numberSign","rootField","range","polynomial","toCubicPolynomial","roots","solveCubicEquation","calculateCurveAt","withPoints","anchor","controlIn","controlOut","bboxTo","toSegment","segmentAnchor","toSegmentAnchor","rect","_curveBoundingBox","_lineBoundingBox","extremesX","_curveExtremesFor","extremesY","xLimits","arrayLimits","yLimits","extremes","_curveExtremes","x3","x4","t2","_intersectionsTo","segment","intersectionsCount","rayIntersection","intersectsRay","count","curveIntersectionsCount","lineIntersectionsCount","_isOnCurveTo","endSegment","p4","isOutOfEndPoint","hasRootsInRange","rotatedPoints","_isOnLineTo","_isOnPathTo","isOnPath","arr","Segment","_matrix","Transformation","_optionsChange","name","TBase","names","defineOptionsAccessors","fn","optionsAccessor","prototype","withOptions","offset","color","opacity","arg","stop","GradientStop","o","ElementsArray","_change","nodeType","stops","StopsArray","_createStops","_userSpace","userSpace","id","definitionId","addStop","removeStop","Gradient","LinearGradient","_radius","_fallbackFill","fallbackFill","RadialGradient","IDENTITY_MATRIX_HASH","combinedMatrix","currentTransform","matrixHash","_bboxCache","_matrixHash","_bbox","strokeWidth","_","fill","newFill","stroke","childrenField","traverse","callback","children","child","defineAccessors","fields","capitalized","charAt","toUpperCase","substring","setAccessor","getAccessor","defineGeometryAccessors","geometryAccessor","definePointAccessors","pointAccessor","isVertical","insertPosition","third","position","scaledPoint","l","path","isRelative","lineTo","curveTo","v","toLineParamaters","arcTo","previousCommand","lastControlIn","last","paths","segments","U","reflectionPoint","cubicControlPoints","quadraticToCubicControlPoints","lastSegment","SEGMENT_REGEX","SPLIT_REGEX","L","pathInstance","str","replace","match","params","closePath","command","toLowerCase","number","parseFloat","parseParameters","trim","moveTo","ShapeMap","Error","paintable","measurable","withGeometry","Element","geometry","GeometryCircle","rawBBox","_geometry","_containsPoint","_initOptions","clip","createTransform","parentTransform","parentMatrix","parent","elementTransform","elementMatrix","C","visible","valueOrDefault","clippedBBox","_clippedBBox","transformedPoint","_hasFill","_hasStroke","isTransparent","pop","slice","unshift","array","_splice","elements","apply","_add","_remove","howMany","concat","_clearObserver","_setObserver","traversable","childrenChange","action","items","append","_reparent","insert","insertAt","remove","removeAt","clear","elementsBoundingBox","elementsClippedBoundingBox","newParent","Group","src","_rect","Image","static","MultiPath","parse","GeometryElementsArray","lineJoin","arc","_addArcSegments","closed","previous","pathWidth","boundingBox","segmentBox","Path","limitValue","instance","parsePath","content","font","measure","measureText","pos","Text","applyTransform","elementBoundingBox","_size","_length","_map","put","key","map","entry","_head","_tail","newer","older","text","style","measureBox","TextMetrics","DEFAULT_OPTIONS","baselineMarkerSize","defaultMeasureBox","document","createElement","cssText","_cache","LRUCache","Object","assign","baseline","styleKey","objectKey","cacheKey","hashKey","cachedResult","box","baselineMarker","_baselineMarker","cloneNode","textStr","normalizeText","String","textContent","appendChild","body","offsetWidth","offsetHeight","offsetTop","parentNode","removeChild","marker","REPLACE_REGEX","sort","hash","charCodeAt","first","second","literals","values","roman","DEG_TO_RAD","Number","MAX_VALUE","resolveFn","rejectFn","promise","Promise","resolve","reject","data","_state","state","defId","KEY_STR","input","output","utfInput","encodeUTF8","chr1","chr2","chr3","enc1","enc2","enc3","enc4","fromCharCode","BOM","code","hi","low","codeUnit","encodeUnit","trail","cmp","floor","ai","bi","merge","degrees","power","defaultValue"],"sourceRoot":"webpack:///","sources":["./node_modules/@progress/kendo-drawing/dist/es2015/core/has-observers.js","./node_modules/@progress/kendo-drawing/dist/es2015/core/options-store.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/close-or-less.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/arc.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/line-intersection.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/circle.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/constants.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/close.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/ellipse-extreme-angles.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/line-intersections-count.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/matrix.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/point.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/rect.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/is-out-of-end-point.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/calculate-curve-at.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/to-cubic-polynomial.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/complex-number.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/solve-cubic-equation.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/has-roots-in-range.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/segment.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/math/curve-intersections-count.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/size.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/to-matrix.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/transformation.js","./node_modules/@progress/kendo-drawing/dist/es2015/geometry/transform.js","./node_modules/@progress/kendo-drawing/dist/es2015/mixins/with-options.js","./node_modules/@progress/kendo-drawing/dist/es2015/gradients/gradient-stop.js","./node_modules/@progress/kendo-drawing/dist/es2015/gradients/stops-array.js","./node_modules/@progress/kendo-drawing/dist/es2015/gradients/gradient.js","./node_modules/@progress/kendo-drawing/dist/es2015/gradients/linear-gradient.js","./node_modules/@progress/kendo-drawing/dist/es2015/gradients/radial-gradient.js","./node_modules/@progress/kendo-drawing/dist/es2015/mixins/measurable.js","./node_modules/@progress/kendo-drawing/dist/es2015/mixins/paintable.js","./node_modules/@progress/kendo-drawing/dist/es2015/mixins/traversable.js","./node_modules/@progress/kendo-drawing/dist/es2015/mixins/with-accessors.js","./node_modules/@progress/kendo-drawing/dist/es2015/mixins/with-geometry.js","./node_modules/@progress/kendo-drawing/dist/es2015/mixins/with-points.js","./node_modules/@progress/kendo-drawing/dist/es2015/parsing/shape-map.js","./node_modules/@progress/kendo-drawing/dist/es2015/parsing/parse-path.js","./node_modules/@progress/kendo-drawing/dist/es2015/shapes/circle.js","./node_modules/@progress/kendo-drawing/dist/es2015/shapes/element.js","./node_modules/@progress/kendo-drawing/dist/es2015/shapes/elements-array.js","./node_modules/@progress/kendo-drawing/dist/es2015/shapes/group.js","./node_modules/@progress/kendo-drawing/dist/es2015/shapes/image.js","./node_modules/@progress/kendo-drawing/dist/es2015/shapes/geometry-elements-array.js","./node_modules/@progress/kendo-drawing/dist/es2015/shapes/path.js","./node_modules/@progress/kendo-drawing/dist/es2015/shapes/text.js","./node_modules/@progress/kendo-drawing/dist/es2015/shapes/utils/elements-bounding-box.js","./node_modules/@progress/kendo-drawing/dist/es2015/shapes/utils/elements-clippend-bounding-box.js","./node_modules/@progress/kendo-drawing/dist/es2015/text-metrics/lru-cache.js","./node_modules/@progress/kendo-drawing/dist/es2015/text-metrics/measure-text.js","./node_modules/@progress/kendo-drawing/dist/es2015/text-metrics/text-metrics.js","./node_modules/@progress/kendo-drawing/dist/es2015/text-metrics/util.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/append.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/arabic-to-roman.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/constants.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/create-promise.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/defined.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/definition-id.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/deg.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/encode-base64.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/encode-utf.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/is-transparent.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/last.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/limit-value.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/merge-sort.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/rad.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/round.js","./node_modules/@progress/kendo-drawing/dist/es2015/util/value-or-default.js"],"sourcesContent":["import { Class } from '../common';\n\nclass HasObservers extends Class {\n observers() {\n this._observers = this._observers || [];\n return this._observers;\n }\n\n addObserver(element) {\n if (!this._observers) {\n this._observers = [ element ];\n } else {\n this._observers.push(element);\n }\n return this;\n }\n\n removeObserver(element) {\n const observers = this.observers();\n const index = observers.indexOf(element);\n if (index !== -1) {\n observers.splice(index, 1);\n }\n return this;\n }\n\n trigger(methodName, event) {\n const observers = this._observers;\n\n if (observers && !this._suspended) {\n for (let idx = 0; idx < observers.length; idx++) {\n let observer = observers[idx];\n if (observer[methodName]) {\n observer[methodName](event);\n }\n }\n }\n return this;\n }\n\n optionsChange(e = {}) {\n e.element = this;\n this.trigger(\"optionsChange\", e);\n }\n\n geometryChange() {\n this.trigger(\"geometryChange\", {\n element: this\n });\n }\n\n suspend() {\n this._suspended = (this._suspended || 0) + 1;\n return this;\n }\n\n resume() {\n this._suspended = Math.max((this._suspended || 0) - 1, 0);\n return this;\n }\n\n _observerField(field, value) {\n if (this[field]) {\n this[field].removeObserver(this);\n }\n this[field] = value;\n value.addObserver(this);\n }\n}\n\nexport default HasObservers;\n\n","import { Class } from '../common';\nimport HasObservers from './has-observers';\nimport { defined } from '../util';\n\n\nconst toString = {}.toString;\n\nclass OptionsStore extends HasObservers {\n constructor(options, prefix = \"\") {\n super();\n\n this.prefix = prefix;\n\n for (let field in options) {\n let member = options[field];\n member = this._wrap(member, field);\n this[field] = member;\n }\n }\n\n get(field) {\n const parts = field.split(\".\");\n let result = this;\n\n while (parts.length && result) {\n let part = parts.shift();\n result = result[part];\n }\n\n return result;\n }\n\n set(field, value) {\n const current = this.get(field);\n\n if (current !== value) {\n this._set(field, this._wrap(value, field));\n this.optionsChange({\n field: this.prefix + field,\n value: value\n });\n }\n }\n\n _set(field, value) {\n const composite = field.indexOf(\".\") >= 0;\n let parentObj = this;\n let fieldName = field;\n\n if (composite) {\n const parts = fieldName.split(\".\");\n let prefix = this.prefix;\n\n while (parts.length > 1) {\n fieldName = parts.shift();\n prefix += fieldName + \".\";\n\n let obj = parentObj[fieldName];\n\n if (!obj) {\n obj = new OptionsStore({}, prefix);\n obj.addObserver(this);\n parentObj[fieldName] = obj;\n }\n parentObj = obj;\n }\n fieldName = parts[0];\n }\n\n parentObj._clear(fieldName);\n parentObj[fieldName] = value;\n }\n\n _clear(field) {\n const current = this[field];\n if (current && current.removeObserver) {\n current.removeObserver(this);\n }\n }\n\n _wrap(object, field) {\n const type = toString.call(object);\n let wrapped = object;\n\n if (wrapped !== null && defined(wrapped) && type === \"[object Object]\") {\n if (!(object instanceof OptionsStore) && !(object instanceof Class)) {\n wrapped = new OptionsStore(wrapped, this.prefix + field + \".\");\n }\n\n wrapped.addObserver(this);\n }\n\n return wrapped;\n }\n}\n\nexport default OptionsStore;\n","import close from './close';\n\nexport default function closeOrLess(a, b, tolerance) {\n return a < b || close(a, b, tolerance);\n}","import HasObservers from '../core/has-observers';\nimport { deg, rad, round } from '../util';\nimport withAccessors from '../mixins/with-accessors';\n\nimport closeOrLess from './math/close-or-less';\nimport lineIntersection from './math/line-intersection';\nimport ellipseExtremeAngles from './math/ellipse-extreme-angles';\n\nimport { PRECISION } from './constants';\nimport Point from './point';\nimport Rect from './rect';\nimport transform from './transform';\n\n\nconst MAX_INTERVAL = 45;\nconst pow = Math.pow;\nconst accessors = [ \"radiusX\", \"radiusY\", \"startAngle\", \"endAngle\", \"anticlockwise\" ];\n\nclass Arc extends withAccessors(HasObservers, accessors) {\n constructor(center = new Point(), options = {}) {\n super();\n\n this.setCenter(center);\n\n this.radiusX = options.radiusX;\n this.radiusY = options.radiusY || options.radiusX;\n this.startAngle = options.startAngle;\n this.endAngle = options.endAngle;\n this.anticlockwise = options.anticlockwise || false;\n this.xRotation = options.xRotation;\n }\n\n clone() {\n return new Arc(this.center, {\n radiusX: this.radiusX,\n radiusY: this.radiusY,\n startAngle: this.startAngle,\n endAngle: this.endAngle,\n anticlockwise: this.anticlockwise\n });\n }\n\n setCenter(value) {\n this._observerField(\"center\", Point.create(value));\n this.geometryChange();\n return this;\n }\n\n getCenter() {\n return this.center;\n }\n\n pointAt(angle) {\n const center = this.center;\n const radian = rad(angle);\n\n return new Point(\n center.x + this.radiusX * Math.cos(radian),\n center.y + this.radiusY * Math.sin(radian)\n );\n }\n\n curvePoints() {\n const startAngle = this.startAngle;\n const dir = this.anticlockwise ? -1 : 1;\n const curvePoints = [ this.pointAt(startAngle) ];\n const interval = this._arcInterval();\n const intervalAngle = interval.endAngle - interval.startAngle;\n const subIntervalsCount = Math.ceil(intervalAngle / MAX_INTERVAL);\n const subIntervalAngle = intervalAngle / subIntervalsCount;\n let currentAngle = startAngle;\n let transformation;\n if (this.xRotation) {\n transformation = transform().rotate(this.xRotation, this.center);\n }\n\n for (let i = 1; i <= subIntervalsCount; i++) {\n const nextAngle = currentAngle + dir * subIntervalAngle;\n const points = this._intervalCurvePoints(currentAngle, nextAngle, transformation);\n\n curvePoints.push(points.cp1, points.cp2, points.p2);\n currentAngle = nextAngle;\n }\n\n return curvePoints;\n }\n\n bbox(matrix) {\n const interval = this._arcInterval();\n const startAngle = interval.startAngle;\n const endAngle = interval.endAngle;\n const extremeAngles = ellipseExtremeAngles(this.center, this.radiusX, this.radiusY, matrix);\n const extremeX = deg(extremeAngles.x);\n const extremeY = deg(extremeAngles.y);\n const endPoint = this.pointAt(endAngle).transformCopy(matrix);\n let currentAngleX = bboxStartAngle(extremeX, startAngle);\n let currentAngleY = bboxStartAngle(extremeY, startAngle);\n let currentPoint = this.pointAt(startAngle).transformCopy(matrix);\n let minPoint = Point.min(currentPoint, endPoint);\n let maxPoint = Point.max(currentPoint, endPoint);\n\n while (currentAngleX < endAngle || currentAngleY < endAngle) {\n let currentPointX;\n if (currentAngleX < endAngle) {\n currentPointX = this.pointAt(currentAngleX).transformCopy(matrix);\n currentAngleX += 90;\n }\n\n let currentPointY;\n if (currentAngleY < endAngle) {\n currentPointY = this.pointAt(currentAngleY).transformCopy(matrix);\n currentAngleY += 90;\n }\n\n currentPoint = new Point(currentPointX.x, currentPointY.y);\n minPoint = Point.min(minPoint, currentPoint);\n maxPoint = Point.max(maxPoint, currentPoint);\n }\n\n return Rect.fromPoints(minPoint, maxPoint);\n }\n\n _arcInterval() {\n let { startAngle, endAngle, anticlockwise } = this;\n\n if (anticlockwise) {\n let oldStart = startAngle;\n startAngle = endAngle;\n endAngle = oldStart;\n }\n\n if (startAngle > endAngle || (anticlockwise && startAngle === endAngle)) {\n endAngle += 360;\n }\n\n return {\n startAngle: startAngle,\n endAngle: endAngle\n };\n }\n\n _intervalCurvePoints(startAngle, endAngle, transformation) {\n const p1 = this.pointAt(startAngle);\n const p2 = this.pointAt(endAngle);\n const p1Derivative = this._derivativeAt(startAngle);\n const p2Derivative = this._derivativeAt(endAngle);\n const t = (rad(endAngle) - rad(startAngle)) / 3;\n const cp1 = new Point(p1.x + t * p1Derivative.x, p1.y + t * p1Derivative.y);\n const cp2 = new Point(p2.x - t * p2Derivative.x, p2.y - t * p2Derivative.y);\n if (transformation) {\n p1.transform(transformation);\n p2.transform(transformation);\n cp1.transform(transformation);\n cp2.transform(transformation);\n }\n\n return {\n p1: p1,\n cp1: cp1,\n cp2: cp2,\n p2: p2\n };\n }\n\n _derivativeAt(angle) {\n const radian = rad(angle);\n\n return new Point(-this.radiusX * Math.sin(radian), this.radiusY * Math.cos(radian));\n }\n\n containsPoint(point) {\n const interval = this._arcInterval();\n const intervalAngle = interval.endAngle - interval.startAngle;\n const { center, radiusX, radiusY } = this;\n const distance = center.distanceTo(point);\n const angleRad = Math.atan2(point.y - center.y, point.x - center.x);\n const pointRadius = (radiusX * radiusY) /\n Math.sqrt(pow(radiusX, 2) * pow(Math.sin(angleRad), 2) + pow(radiusY, 2) * pow(Math.cos(angleRad), 2));\n const startPoint = this.pointAt(this.startAngle).round(PRECISION);\n const endPoint = this.pointAt(this.endAngle).round(PRECISION);\n const intersection = lineIntersection(center, point.round(PRECISION), startPoint, endPoint);\n let containsPoint;\n\n if (intervalAngle < 180) {\n containsPoint = intersection && closeOrLess(center.distanceTo(intersection), distance) && closeOrLess(distance, pointRadius);\n } else {\n let angle = calculateAngle(center.x, center.y, radiusX, radiusY, point.x, point.y);\n if (angle !== 360) {\n angle = (360 + angle) % 360;\n }\n\n let inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\n containsPoint = (inAngleRange && closeOrLess(distance, pointRadius)) || (!inAngleRange && (!intersection || intersection.equals(point)));\n }\n return containsPoint;\n }\n\n _isOnPath(point, width) {\n const interval = this._arcInterval();\n const center = this.center;\n let angle = calculateAngle(center.x, center.y, this.radiusX, this.radiusY, point.x, point.y);\n if (angle !== 360) {\n angle = (360 + angle) % 360;\n }\n\n const inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\n\n return inAngleRange && this.pointAt(angle).distanceTo(point) <= width;\n }\n\n static fromPoints(start, end, rx, ry, largeArc, swipe, rotation) {// eslint-disable-line max-params\n const arcParameters = normalizeArcParameters({\n x1: start.x,\n y1: start.y,\n x2: end.x,\n y2: end.y,\n rx: rx,\n ry: ry,\n largeArc: largeArc,\n swipe: swipe,\n rotation: rotation\n });\n\n return new Arc(arcParameters.center, {\n startAngle: arcParameters.startAngle,\n endAngle: arcParameters.endAngle,\n radiusX: arcParameters.radiusX,\n radiusY: arcParameters.radiusY,\n xRotation: arcParameters.xRotation,\n anticlockwise: swipe === 0\n });\n }\n}\n\nfunction calculateAngle(cx, cy, rx, ry, x, y) {\n const cos = round((x - cx) / rx, 3);\n const sin = round((y - cy) / ry, 3);\n\n return round(deg(Math.atan2(sin, cos)));\n}\n\nfunction normalizeArcParameters(parameters) {\n let { x1, y1, x2, y2, rx, ry, largeArc, swipe, rotation = 0 } = parameters;\n\n const radians = rad(rotation);\n const cosine = Math.cos(radians);\n const sine = Math.sin(radians);\n\n const xT = cosine * (x1 - x2) / 2 + sine * (y1 - y2) / 2;\n const yT = -sine * (x1 - x2) / 2 + cosine * (y1 - y2) / 2;\n\n const sign = largeArc !== swipe ? 1 : -1;\n\n const xt2 = Math.pow(xT, 2);\n const yt2 = Math.pow(yT, 2);\n let rx2 = Math.pow(rx, 2);\n let ry2 = Math.pow(ry, 2);\n\n let delta = xt2 / rx2 + yt2 / ry2;\n\n if (delta > 1) {\n delta = Math.sqrt(xt2 / rx2 + yt2 / ry2);\n rx = delta * rx;\n rx2 = Math.pow(rx, 2);\n\n ry = delta * ry;\n ry2 = Math.pow(ry, 2);\n }\n\n let constT = sign * Math.sqrt((rx2 * ry2 - rx2 * yt2 - ry2 * xt2) / (rx2 * yt2 + ry2 * xt2));\n // due to rounding errors the value could become NaN even after radii correction\n if (isNaN(constT)) {\n constT = 0;\n }\n\n const cxT = constT * (rx * yT) / ry;\n const cyT = - constT * (ry * xT) / rx;\n\n const cx = cosine * cxT - sine * cyT + (x1 + x2) / 2;\n const cy = sine * cxT + cosine * cyT + (y1 + y2) / 2;\n\n\n const uX = (xT - cxT) / rx;\n const uY = (yT - cyT) / ry;\n const vX = -(xT + cxT) / rx;\n const vY = -(yT + cyT) / ry;\n\n const startAngle = (uY >= 0 ? 1 : -1) * deg(Math.acos(uX / Math.sqrt(uX * uX + uY * uY)));\n\n const angleCosine = round((uX * vX + uY * vY) / (Math.sqrt(uX * uX + uY * uY) * Math.sqrt(vX * vX + vY * vY)), 10);\n let angle = (uX * vY - uY * vX >= 0 ? 1 : -1) * deg(Math.acos(angleCosine));\n\n if (!swipe && angle > 0) {\n angle -= 360;\n }\n\n if (swipe && angle < 0) {\n angle += 360;\n }\n let endAngle = startAngle + angle;\n const signEndAngle = endAngle >= 0 ? 1 : -1;\n endAngle = (Math.abs(endAngle) % 360) * signEndAngle;\n\n return {\n center: new Point(cx, cy),\n startAngle: startAngle,\n endAngle: endAngle,\n radiusX: rx,\n radiusY: ry,\n xRotation: rotation\n };\n}\n\nfunction bboxStartAngle(angle, start) {\n let startAngle = angle;\n\n while (startAngle < start) {\n startAngle += 90;\n }\n\n return startAngle;\n}\n\nexport default Arc;\n","import Point from '../point';\n\nexport default function lineIntersection(p0, p1, p2, p3) {\n const s1x = p1.x - p0.x;\n const s2x = p3.x - p2.x;\n const s1y = p1.y - p0.y;\n const s2y = p3.y - p2.y;\n const nx = p0.x - p2.x;\n const ny = p0.y - p2.y;\n const d = s1x * s2y - s2x * s1y;\n const s = (s1x * ny - s1y * nx) / d;\n const t = (s2x * ny - s2y * nx) / d;\n\n if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {\n return new Point(p0.x + t * s1x, p0.y + t * s1y);\n }\n}","import withAccessors from '../mixins/with-accessors';\nimport Point from './point';\nimport Rect from './rect';\nimport ellipseExtremeAngles from './math/ellipse-extreme-angles';\nimport HasObservers from '../core/has-observers';\nimport { rad } from '../util';\n\n\nconst PI_DIV_2 = Math.PI / 2;\n\nclass Circle extends withAccessors(HasObservers, [ \"radius\" ]) {\n constructor(center = new Point(), radius = 0) {\n super();\n\n this.setCenter(center);\n this.setRadius(radius);\n }\n\n setCenter(value) {\n this._observerField(\"center\", Point.create(value));\n this.geometryChange();\n return this;\n }\n\n getCenter() {\n return this.center;\n }\n\n equals(other) {\n return other &&\n other.center.equals(this.center) &&\n other.radius === this.radius;\n }\n\n clone() {\n return new Circle(this.center.clone(), this.radius);\n }\n\n pointAt(angle) {\n return this._pointAt(rad(angle));\n }\n\n bbox(matrix) {\n const extremeAngles = ellipseExtremeAngles(this.center, this.radius, this.radius, matrix);\n let minPoint = Point.maxPoint();\n let maxPoint = Point.minPoint();\n\n for (let i = 0; i < 4; i++) {\n let currentPointX = this._pointAt(extremeAngles.x + i * PI_DIV_2).transformCopy(matrix);\n let currentPointY = this._pointAt(extremeAngles.y + i * PI_DIV_2).transformCopy(matrix);\n let currentPoint = new Point(currentPointX.x, currentPointY.y);\n\n minPoint = Point.min(minPoint, currentPoint);\n maxPoint = Point.max(maxPoint, currentPoint);\n }\n\n return Rect.fromPoints(minPoint, maxPoint);\n }\n\n _pointAt(angle) {\n const { center, radius } = this;\n\n return new Point(\n center.x + radius * Math.cos(angle),\n center.y + radius * Math.sin(angle)\n );\n }\n\n containsPoint(point) {\n const { center, radius } = this;\n const inCircle = Math.pow(point.x - center.x, 2) +\n Math.pow(point.y - center.y, 2) <= Math.pow(radius, 2);\n return inCircle;\n }\n\n _isOnPath(point, width) {\n const { center, radius } = this;\n const pointDistance = center.distanceTo(point);\n\n return radius - width <= pointDistance && pointDistance <= radius + width;\n }\n}\n\nexport default Circle;\n","const PRECISION = 10;\n\nexport { PRECISION };","import { PRECISION } from '../constants';\n\nimport { round } from '../../util';\n\nexport default function close(a, b, tolerance = PRECISION) {\n return round(Math.abs(a - b), tolerance) === 0;\n}","export default function ellipseExtremeAngles(center, rx, ry, matrix) {\n let extremeX = 0;\n let extremeY = 0;\n\n if (matrix) {\n extremeX = Math.atan2(matrix.c * ry, matrix.a * rx);\n if (matrix.b !== 0) {\n extremeY = Math.atan2(matrix.d * ry, matrix.b * rx);\n }\n }\n\n return {\n x: extremeX,\n y: extremeY\n };\n}","export default function lineIntersectionsCount(a, b, point) {\n let intersects;\n if (a.x !== b.x) {\n const minX = Math.min(a.x, b.x);\n const maxX = Math.max(a.x, b.x);\n const minY = Math.min(a.y, b.y);\n const maxY = Math.max(a.y, b.y);\n const inRange = minX <= point.x && point.x < maxX;\n\n if (minY === maxY) {\n intersects = point.y <= minY && inRange;\n } else {\n intersects = inRange && (((maxY - minY) * ((a.x - b.x) * (a.y - b.y) > 0 ? point.x - minX : maxX - point.x)) / (maxX - minX) + minY - point.y) >= 0;\n }\n }\n\n return intersects ? 1 : 0;\n}","import { Class } from '../common';\nimport defined from '../util/defined';\nimport rad from '../util/rad';\nimport round from '../util/round';\n\nclass Matrix extends Class {\n\n constructor(a = 0, b = 0, c = 0, d = 0, e = 0, f = 0) {\n super();\n\n this.a = a;\n this.b = b;\n this.c = c;\n this.d = d;\n this.e = e;\n this.f = f;\n }\n\n multiplyCopy(matrix) {\n return new Matrix(\n this.a * matrix.a + this.c * matrix.b,\n this.b * matrix.a + this.d * matrix.b,\n this.a * matrix.c + this.c * matrix.d,\n this.b * matrix.c + this.d * matrix.d,\n this.a * matrix.e + this.c * matrix.f + this.e,\n this.b * matrix.e + this.d * matrix.f + this.f\n );\n }\n\n invert() {\n const { a, b, c: d, d: e, e: g, f: h } = this;\n const det = a * e - b * d;\n\n if (det === 0) {\n return null;\n }\n\n return new Matrix(e / det, -b / det, -d / det, a / det,\n (d * h - e * g) / det, (b * g - a * h) / det);\n }\n\n clone() {\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n }\n\n equals(other) {\n if (!other) {\n return false;\n }\n\n return this.a === other.a && this.b === other.b &&\n this.c === other.c && this.d === other.d &&\n this.e === other.e && this.f === other.f;\n }\n\n round(precision) {\n this.a = round(this.a, precision);\n this.b = round(this.b, precision);\n this.c = round(this.c, precision);\n this.d = round(this.d, precision);\n this.e = round(this.e, precision);\n this.f = round(this.f, precision);\n\n return this;\n }\n\n toArray(precision) {\n const result = [ this.a, this.b, this.c, this.d, this.e, this.f ];\n\n if (defined(precision)) {\n for (let i = 0; i < result.length; i++) {\n result[i] = round(result[i], precision);\n }\n }\n\n return result;\n }\n\n toString(precision, separator = \",\") {\n return this.toArray(precision).join(separator);\n }\n\n static translate(x, y) {\n return new Matrix(1, 0, 0, 1, x, y);\n }\n\n static unit() {\n return new Matrix(1, 0, 0, 1, 0, 0);\n }\n\n static rotate(angle, x, y) {\n const matrix = new Matrix();\n matrix.a = Math.cos(rad(angle));\n matrix.b = Math.sin(rad(angle));\n matrix.c = -matrix.b;\n matrix.d = matrix.a;\n matrix.e = (x - x * matrix.a + y * matrix.b) || 0;\n matrix.f = (y - y * matrix.a - x * matrix.b) || 0;\n\n return matrix;\n }\n\n static scale(scaleX, scaleY) {\n return new Matrix(scaleX, 0, 0, scaleY, 0, 0);\n }\n}\n\nMatrix.IDENTITY = Matrix.unit();\n\nexport default Matrix;\n","import withAccessors from '../mixins/with-accessors';\nimport HasObservers from '../core/has-observers';\nimport { defined, MIN_NUM, MAX_NUM, round } from '../util';\nimport Matrix from './matrix';\nimport toMatrix from './to-matrix';\n\n\nclass Point extends withAccessors(HasObservers, [ \"x\", \"y\" ]) {\n constructor(x, y) {\n super();\n\n this.x = x || 0;\n this.y = y || 0;\n }\n\n equals(other) {\n return other && other.x === this.x && other.y === this.y;\n }\n\n clone() {\n return new Point(this.x, this.y);\n }\n\n rotate(angle, origin) {\n const originPoint = Point.create(origin) || Point.ZERO;\n\n return this.transform(Matrix.rotate(angle, originPoint.x, originPoint.y));\n }\n\n translate(x, y) {\n this.x += x;\n this.y += y;\n\n this.geometryChange();\n\n return this;\n }\n\n translateWith(point) {\n return this.translate(point.x, point.y);\n }\n\n move(x, y) {\n this.x = this.y = 0;\n return this.translate(x, y);\n }\n\n scale(scaleX, scaleY = scaleX) {\n this.x *= scaleX;\n this.y *= scaleY;\n\n this.geometryChange();\n\n return this;\n }\n\n scaleCopy(scaleX, scaleY) {\n return this.clone().scale(scaleX, scaleY);\n }\n\n transform(transformation) {\n const matrix = toMatrix(transformation);\n const { x, y } = this;\n\n this.x = matrix.a * x + matrix.c * y + matrix.e;\n this.y = matrix.b * x + matrix.d * y + matrix.f;\n\n this.geometryChange();\n\n return this;\n }\n\n transformCopy(transformation) {\n const point = this.clone();\n\n if (transformation) {\n point.transform(transformation);\n }\n\n return point;\n }\n\n distanceTo(point) {\n const dx = this.x - point.x;\n const dy = this.y - point.y;\n\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n round(digits) {\n this.x = round(this.x, digits);\n this.y = round(this.y, digits);\n\n this.geometryChange();\n\n return this;\n }\n\n toArray(digits) {\n const doRound = defined(digits);\n const x = doRound ? round(this.x, digits) : this.x;\n const y = doRound ? round(this.y, digits) : this.y;\n\n return [ x, y ];\n }\n\n toString(digits, separator = \" \") {\n let { x, y } = this;\n\n if (defined(digits)) {\n x = round(x, digits);\n y = round(y, digits);\n }\n\n return x + separator + y;\n }\n\n static create(arg0, arg1) {\n if (defined(arg0)) {\n if (arg0 instanceof Point) {\n return arg0;\n } else if (arguments.length === 1 && arg0.length === 2) {\n return new Point(arg0[0], arg0[1]);\n }\n\n return new Point(arg0, arg1);\n }\n }\n\n static min() {\n let minX = MAX_NUM;\n let minY = MAX_NUM;\n\n for (let i = 0; i < arguments.length; i++) {\n let point = arguments[i];\n minX = Math.min(point.x, minX);\n minY = Math.min(point.y, minY);\n }\n\n return new Point(minX, minY);\n }\n\n static max() {\n let maxX = MIN_NUM;\n let maxY = MIN_NUM;\n\n for (let i = 0; i < arguments.length; i++) {\n const point = arguments[i];\n maxX = Math.max(point.x, maxX);\n maxY = Math.max(point.y, maxY);\n }\n\n return new Point(maxX, maxY);\n }\n\n static minPoint() {\n return new Point(MIN_NUM, MIN_NUM);\n }\n\n static maxPoint() {\n return new Point(MAX_NUM, MAX_NUM);\n }\n\n static get ZERO() {\n return new Point(0, 0);\n }\n}\n\nexport default Point;\n","import HasObservers from '../core/has-observers';\nimport Point from './point';\nimport Size from './size';\n\nclass Rect extends HasObservers {\n constructor(origin = new Point(), size = new Size(), cornerRadius = 0) {\n super();\n\n this.setOrigin(origin);\n this.setSize(size);\n this.setCornerRadius(cornerRadius);\n }\n\n clone() {\n return new Rect(\n this.origin.clone(),\n this.size.clone()\n );\n }\n\n equals(other) {\n return other &&\n other.origin.equals(this.origin) &&\n other.size.equals(this.size);\n }\n\n setOrigin(value) {\n this._observerField(\"origin\", Point.create(value));\n this.geometryChange();\n return this;\n }\n\n getOrigin() {\n return this.origin;\n }\n\n setCornerRadius(radius) {\n this.cornerRadius = Array.isArray(radius) ? radius : [ radius, radius ];\n\n this.geometryChange();\n return this;\n }\n\n getCornerRadius() {\n return this.cornerRadius;\n }\n\n setSize(value) {\n this._observerField(\"size\", Size.create(value));\n this.geometryChange();\n return this;\n }\n\n getSize() {\n return this.size;\n }\n\n width() {\n return this.size.width;\n }\n\n height() {\n return this.size.height;\n }\n\n topLeft() {\n return this.origin.clone();\n }\n\n bottomRight() {\n return this.origin.clone().translate(this.width(), this.height());\n }\n\n topRight() {\n return this.origin.clone().translate(this.width(), 0);\n }\n\n bottomLeft() {\n return this.origin.clone().translate(0, this.height());\n }\n\n center() {\n return this.origin.clone().translate(this.width() / 2, this.height() / 2);\n }\n\n bbox(matrix) {\n const tl = this.topLeft().transformCopy(matrix);\n const tr = this.topRight().transformCopy(matrix);\n const br = this.bottomRight().transformCopy(matrix);\n const bl = this.bottomLeft().transformCopy(matrix);\n\n return Rect.fromPoints(tl, tr, br, bl);\n }\n\n transformCopy(m) {\n return Rect.fromPoints(\n this.topLeft().transform(m),\n this.bottomRight().transform(m)\n );\n }\n\n expand(x, y = x) {\n\n this.size.width += 2 * x;\n this.size.height += 2 * y;\n\n this.origin.translate(-x, -y);\n\n return this;\n }\n\n expandCopy(x, y) {\n return this.clone().expand(x, y);\n }\n\n containsPoint(point) {\n const origin = this.origin;\n const bottomRight = this.bottomRight();\n return !(point.x < origin.x || point.y < origin.y || bottomRight.x < point.x || bottomRight.y < point.y);\n }\n\n _isOnPath(point, width) {\n const rectOuter = this.expandCopy(width, width);\n const rectInner = this.expandCopy(-width, -width);\n\n return rectOuter.containsPoint(point) && !rectInner.containsPoint(point);\n }\n\n static fromPoints() {\n const topLeft = Point.min.apply(null, arguments);\n const bottomRight = Point.max.apply(null, arguments);\n const size = new Size(\n bottomRight.x - topLeft.x,\n bottomRight.y - topLeft.y\n );\n\n return new Rect(topLeft, size);\n }\n\n static union(a, b) {\n return Rect.fromPoints(\n Point.min(a.topLeft(), b.topLeft()),\n Point.max(a.bottomRight(), b.bottomRight())\n );\n }\n\n static intersect(a, b) {\n const rect1 = {\n left: a.topLeft().x,\n top: a.topLeft().y,\n right: a.bottomRight().x,\n bottom: a.bottomRight().y\n };\n\n const rect2 = {\n left: b.topLeft().x,\n top: b.topLeft().y,\n right: b.bottomRight().x,\n bottom: b.bottomRight().y\n };\n\n if (rect1.left <= rect2.right &&\n rect2.left <= rect1.right &&\n rect1.top <= rect2.bottom &&\n rect2.top <= rect1.bottom) {\n return Rect.fromPoints(\n new Point(Math.max(rect1.left, rect2.left), Math.max(rect1.top, rect2.top)),\n new Point(Math.min(rect1.right, rect2.right), Math.min(rect1.bottom, rect2.bottom))\n );\n }\n }\n}\n\nexport default Rect;\n","import { deg } from '../../util';\nimport transform from '../transform';\n\nexport default function isOutOfEndPoint(endPoint, controlPoint, point) {\n const angle = deg(Math.atan2(controlPoint.y - endPoint.y, controlPoint.x - endPoint.x));\n const rotatedPoint = point.transformCopy(transform().rotate(-angle, endPoint));\n\n return rotatedPoint.x < endPoint.x;\n}","export default function calculateCurveAt(t, field, points) {\n const t1 = 1 - t;\n return Math.pow(t1, 3) * points[0][field] +\n 3 * Math.pow(t1, 2) * t * points[1][field] +\n 3 * Math.pow(t, 2) * t1 * points[2][field] +\n Math.pow(t, 3) * points[3][field];\n}","export default function toCubicPolynomial(points, field) {\n return [ -points[0][field] + 3 * points[1][field] - 3 * points[2][field] + points[3][field],\n 3 * (points[0][field] - 2 * points[1][field] + points[2][field]),\n 3 * (-points[0][field] + points[1][field]),\n points[0][field]\n ];\n}","import { PRECISION } from '../constants';\nimport { Class } from '../../common';\nimport { round } from '../../util';\n\nclass ComplexNumber extends Class {\n\n constructor(real = 0, img = 0) {\n super();\n\n this.real = real;\n this.img = img;\n }\n\n add(cNumber) {\n return new ComplexNumber(round(this.real + cNumber.real, PRECISION), round(this.img + cNumber.img, PRECISION));\n }\n\n addConstant(value) {\n return new ComplexNumber(this.real + value, this.img);\n }\n\n negate() {\n return new ComplexNumber(-this.real, -this.img);\n }\n\n multiply(cNumber) {\n return new ComplexNumber(this.real * cNumber.real - this.img * cNumber.img,\n this.real * cNumber.img + this.img * cNumber.real);\n }\n\n multiplyConstant(value) {\n return new ComplexNumber(this.real * value, this.img * value);\n }\n\n nthRoot(n) {\n const rad = Math.atan2(this.img, this.real);\n const r = Math.sqrt(Math.pow(this.img, 2) + Math.pow(this.real, 2));\n const nthR = Math.pow(r, 1 / n);\n\n return new ComplexNumber(nthR * Math.cos(rad / n), nthR * Math.sin(rad / n)); //Moivre's formula\n }\n\n equals(cNumber) {\n return this.real === cNumber.real && this.img === cNumber.img;\n }\n\n isReal() {\n return this.img === 0;\n }\n}\n\nexport default ComplexNumber;","import ComplexNumber from './complex-number';\nimport { PRECISION } from '../constants';\nimport { round } from '../../util';\n\nfunction numberSign(x) {\n return x < 0 ? -1 : 1;\n}\n\nfunction solveQuadraticEquation(a, b, c) {\n const squareRoot = Math.sqrt(Math.pow(b, 2) - 4 * a * c);\n return [\n (-b + squareRoot) / (2 * a),\n (-b - squareRoot) / (2 * a)\n ];\n}\n\n//Cardano's formula\nexport default function solveCubicEquation(a, b, c, d) {\n if (a === 0) {\n return solveQuadraticEquation(b, c, d);\n }\n\n const p = (3 * a * c - Math.pow(b, 2)) / (3 * Math.pow(a, 2));\n const q = (2 * Math.pow(b, 3) - 9 * a * b * c + 27 * Math.pow(a, 2) * d) / (27 * Math.pow(a, 3));\n const Q = Math.pow(p / 3, 3) + Math.pow(q / 2, 2);\n const i = new ComplexNumber(0,1);\n const b3a = -b / (3 * a);\n let x1, x2, y1, y2, y3, z1, z2;\n\n if (Q < 0) {\n x1 = new ComplexNumber(-q / 2, Math.sqrt(-Q)).nthRoot(3);\n x2 = new ComplexNumber(-q / 2, - Math.sqrt(-Q)).nthRoot(3);\n } else {\n x1 = -q / 2 + Math.sqrt(Q);\n x1 = new ComplexNumber(numberSign(x1) * Math.pow(Math.abs(x1), 1 / 3));\n x2 = -q / 2 - Math.sqrt(Q);\n x2 = new ComplexNumber(numberSign(x2) * Math.pow(Math.abs(x2), 1 / 3));\n }\n\n y1 = x1.add(x2);\n\n z1 = x1.add(x2).multiplyConstant(-1 / 2);\n z2 = x1.add(x2.negate()).multiplyConstant(Math.sqrt(3) / 2);\n\n y2 = z1.add(i.multiply(z2));\n y3 = z1.add(i.negate().multiply(z2));\n\n const result = [];\n\n if (y1.isReal()) {\n result.push(round(y1.real + b3a, PRECISION));\n }\n if (y2.isReal()) {\n result.push(round(y2.real + b3a, PRECISION));\n }\n if (y3.isReal()) {\n result.push(round(y3.real + b3a, PRECISION));\n }\n\n return result;\n}","import toCubicPolynomial from './to-cubic-polynomial';\nimport solveCubicEquation from './solve-cubic-equation';\nimport calculateCurveAt from './calculate-curve-at';\n\nexport default function hasRootsInRange(points, point, field, rootField, range) {\n const polynomial = toCubicPolynomial(points, rootField);\n const roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point[rootField]);\n let intersection;\n\n for (let idx = 0; idx < roots.length; idx++) {\n if (0 <= roots[idx] && roots[idx] <= 1) {\n intersection = calculateCurveAt(roots[idx], field, points);\n if (Math.abs(intersection - point[field]) <= range) {\n return true;\n }\n }\n }\n}","import HasObservers from '../core/has-observers';\nimport Rect from './rect';\nimport Point from './point';\nimport transform from './transform';\nimport { deg, MIN_NUM, MAX_NUM } from '../util';\nimport isOutOfEndPoint from './math/is-out-of-end-point';\nimport calculateCurveAt from './math/calculate-curve-at';\nimport hasRootsInRange from './math/has-roots-in-range';\nimport curveIntersectionsCount from './math/curve-intersections-count';\nimport lineIntersectionsCount from './math/line-intersections-count';\nimport withPoints from '../mixins/with-points';\n\n\nconst points = [ \"anchor\", \"controlIn\", \"controlOut\" ];\n\nclass Segment extends withPoints(HasObservers, points) {\n constructor(anchor, controlIn, controlOut) {\n super();\n\n this.anchor(anchor || new Point());\n this.controlIn(controlIn);\n this.controlOut(controlOut);\n }\n\n bboxTo(toSegment, matrix) {\n const segmentAnchor = this.anchor().transformCopy(matrix);\n const toSegmentAnchor = toSegment.anchor().transformCopy(matrix);\n let rect;\n\n if (this.controlOut() && toSegment.controlIn()) {\n rect = this._curveBoundingBox(\n segmentAnchor, this.controlOut().transformCopy(matrix),\n toSegment.controlIn().transformCopy(matrix), toSegmentAnchor\n );\n } else {\n rect = this._lineBoundingBox(segmentAnchor, toSegmentAnchor);\n }\n\n return rect;\n }\n\n _lineBoundingBox(p1, p2) {\n return Rect.fromPoints(p1, p2);\n }\n\n _curveBoundingBox(p1, cp1, cp2, p2) {\n const points = [ p1, cp1, cp2, p2 ];\n const extremesX = this._curveExtremesFor(points, \"x\");\n const extremesY = this._curveExtremesFor(points, \"y\");\n const xLimits = arrayLimits([ extremesX.min, extremesX.max, p1.x, p2.x ]);\n const yLimits = arrayLimits([ extremesY.min, extremesY.max, p1.y, p2.y ]);\n\n return Rect.fromPoints(new Point(xLimits.min, yLimits.min), new Point(xLimits.max, yLimits.max));\n }\n\n _curveExtremesFor(points, field) {\n const extremes = this._curveExtremes(\n points[0][field], points[1][field],\n points[2][field], points[3][field]\n );\n\n return {\n min: calculateCurveAt(extremes.min, field, points),\n max: calculateCurveAt(extremes.max, field, points)\n };\n }\n\n _curveExtremes(x1, x2, x3, x4) {\n const a = x1 - 3 * x2 + 3 * x3 - x4;\n const b = - 2 * (x1 - 2 * x2 + x3);\n const c = x1 - x2;\n const sqrt = Math.sqrt(b * b - 4 * a * c);\n let t1 = 0;\n let t2 = 1;\n\n if (a === 0) {\n if (b !== 0) {\n t1 = t2 = -c / b;\n }\n } else if (!isNaN(sqrt)) {\n t1 = (- b + sqrt) / (2 * a);\n t2 = (- b - sqrt) / (2 * a);\n }\n\n let min = Math.max(Math.min(t1, t2), 0);\n if (min < 0 || min > 1) {\n min = 0;\n }\n\n let max = Math.min(Math.max(t1, t2), 1);\n if (max > 1 || max < 0) {\n max = 1;\n }\n\n return {\n min: min,\n max: max\n };\n }\n\n _intersectionsTo(segment, point) {\n let intersectionsCount;\n if (this.controlOut() && segment.controlIn()) {\n intersectionsCount = curveIntersectionsCount([ this.anchor(), this.controlOut(), segment.controlIn(), segment.anchor() ], point, this.bboxTo(segment));\n } else {\n intersectionsCount = lineIntersectionsCount(this.anchor(), segment.anchor(), point);\n }\n return intersectionsCount;\n }\n\n _isOnCurveTo(segment, point, width, endSegment) {\n const bbox = this.bboxTo(segment).expand(width, width);\n if (bbox.containsPoint(point)) {\n const p1 = this.anchor();\n const p2 = this.controlOut();\n const p3 = segment.controlIn();\n const p4 = segment.anchor();\n\n if (endSegment === \"start\" && p1.distanceTo(point) <= width) {\n return !isOutOfEndPoint(p1, p2, point);\n } else if (endSegment === \"end\" && p4.distanceTo(point) <= width) {\n return !isOutOfEndPoint(p4, p3, point);\n }\n\n //the approach is not entirely correct but is close and the alternatives are solving a 6th degree polynomial or testing the segment points\n const points = [ p1, p2, p3, p4 ];\n if (hasRootsInRange(points, point, \"x\", \"y\", width) || hasRootsInRange(points, point, \"y\", \"x\", width)) {\n return true;\n }\n const rotation = transform().rotate(45, point);\n const rotatedPoints = [ p1.transformCopy(rotation), p2.transformCopy(rotation), p3.transformCopy(rotation), p4.transformCopy(rotation) ];\n return hasRootsInRange(rotatedPoints, point, \"x\", \"y\", width) || hasRootsInRange(rotatedPoints, point, \"y\", \"x\", width);\n }\n }\n\n _isOnLineTo(segment, point, width) {\n const p1 = this.anchor();\n const p2 = segment.anchor();\n const angle = deg(Math.atan2(p2.y - p1.y, p2.x - p1.x));\n const rect = new Rect([ p1.x, p1.y - width / 2 ], [ p1.distanceTo(p2), width ]);\n return rect.containsPoint(point.transformCopy(transform().rotate(-angle, p1)));\n }\n\n _isOnPathTo(segment, point, width, endSegment) {\n let isOnPath;\n if (this.controlOut() && segment.controlIn()) {\n isOnPath = this._isOnCurveTo(segment, point, width / 2, endSegment);\n } else {\n isOnPath = this._isOnLineTo(segment, point, width);\n }\n return isOnPath;\n }\n}\n\nfunction arrayLimits(arr) {\n let length = arr.length;\n let min = MAX_NUM;\n let max = MIN_NUM;\n\n for (let i = 0; i < length; i ++) {\n max = Math.max(max, arr[i]);\n min = Math.min(min, arr[i]);\n }\n\n return {\n min: min,\n max: max\n };\n}\n\nexport default Segment;\n","import toCubicPolynomial from './to-cubic-polynomial';\nimport solveCubicEquation from './solve-cubic-equation';\nimport calculateCurveAt from './calculate-curve-at';\nimport close from './close';\n\nexport default function curveIntersectionsCount(points, point, bbox) {\n const polynomial = toCubicPolynomial(points, \"x\");\n const roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point.x);\n let rayIntersection, intersectsRay;\n let count = 0;\n for (let i = 0; i < roots.length; i++) {\n rayIntersection = calculateCurveAt(roots[i], \"y\", points);\n intersectsRay = close(rayIntersection, point.y) || rayIntersection > point.y;\n if (intersectsRay && (((roots[i] === 0 || roots[i] === 1) && bbox.bottomRight().x > point.x) || (0 < roots[i] && roots[i] < 1))) {\n count++;\n }\n }\n\n return count;\n}","import HasObservers from '../core/has-observers';\nimport withAccessors from '../mixins/with-accessors';\nimport { defined, round } from '../util';\n\n\nclass Size extends withAccessors(HasObservers, [ \"width\", \"height\" ]) {\n constructor(width, height) {\n super();\n\n this.width = width || 0;\n this.height = height || 0;\n }\n\n equals(other) {\n return other && other.width === this.width && other.height === this.height;\n }\n\n clone() {\n return new Size(this.width, this.height);\n }\n\n toArray(digits) {\n const doRound = defined(digits);\n const width = doRound ? round(this.width, digits) : this.width;\n const height = doRound ? round(this.height, digits) : this.height;\n\n return [ width, height ];\n }\n\n static create(arg0, arg1) {\n if (defined(arg0)) {\n if (arg0 instanceof Size) {\n return arg0;\n } else if (arguments.length === 1 && arg0.length === 2) {\n return new Size(arg0[0], arg0[1]);\n }\n\n return new Size(arg0, arg1);\n }\n }\n\n static get ZERO() {\n return new Size(0, 0);\n }\n}\n\nexport default Size;\n","export default function toMatrix(transformation) {\n if (transformation && typeof transformation.matrix === \"function\") {\n return transformation.matrix();\n }\n\n return transformation;\n}","import HasObservers from '../core/has-observers';\nimport toMatrix from './to-matrix';\nimport Matrix from './matrix';\nimport Point from './point';\n\nclass Transformation extends HasObservers {\n constructor(matrix = Matrix.unit()) {\n super();\n\n this._matrix = matrix;\n }\n\n clone() {\n return new Transformation(\n this._matrix.clone()\n );\n }\n\n equals(other) {\n return other &&\n other._matrix.equals(this._matrix);\n }\n\n translate(x, y) {\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(x, y));\n\n this._optionsChange();\n return this;\n }\n\n scale(scaleX, scaleY = scaleX, origin = null) {\n let originPoint = origin;\n\n if (originPoint) {\n originPoint = Point.create(originPoint);\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(originPoint.x, originPoint.y));\n }\n\n this._matrix = this._matrix.multiplyCopy(Matrix.scale(scaleX, scaleY));\n\n if (originPoint) {\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(-originPoint.x, -originPoint.y));\n }\n\n this._optionsChange();\n return this;\n }\n\n rotate(angle, origin) {\n const originPoint = Point.create(origin) || Point.ZERO;\n\n this._matrix = this._matrix.multiplyCopy(Matrix.rotate(angle, originPoint.x, originPoint.y));\n\n this._optionsChange();\n return this;\n }\n\n multiply(transformation) {\n const matrix = toMatrix(transformation);\n\n this._matrix = this._matrix.multiplyCopy(matrix);\n\n this._optionsChange();\n return this;\n }\n\n matrix(value) {\n if (value) {\n this._matrix = value;\n this._optionsChange();\n return this;\n }\n\n return this._matrix;\n }\n\n _optionsChange() {\n this.optionsChange({\n field: \"transform\",\n value: this\n });\n }\n}\n\nexport default Transformation;\n","import Transformation from './transformation';\n\nexport default function transform(matrix) {\n if (matrix === null) {\n return null;\n }\n\n if (matrix instanceof Transformation) {\n return matrix;\n }\n\n return new Transformation(matrix);\n}","import { defined } from '../util';\n\nfunction optionsAccessor(name) {\n return function(value) {\n if (defined(value)) {\n this.options.set(name, value);\n return this;\n }\n\n return this.options.get(name);\n };\n}\n\nfunction defineOptionsAccessors(fn, names) {\n for (let i = 0; i < names.length; i++) {\n fn[names[i]] = optionsAccessor(names[i]);\n }\n}\n\nconst withOptions = (TBase, names) => {\n const result = class extends TBase {};\n defineOptionsAccessors(result.prototype, names);\n\n return result;\n};\n\nexport default withOptions;\n","import OptionsStore from '../core/options-store';\nimport withOptions from '../mixins/with-options';\nimport HasObservers from '../core/has-observers';\nimport { defined } from '../util';\n\n\nconst options = [ \"offset\", \"color\", \"opacity\" ];\n\nclass GradientStop extends withOptions(HasObservers, options) {\n constructor(offset, color, opacity) {\n super();\n\n this.options = new OptionsStore({\n offset: offset,\n color: color,\n opacity: defined(opacity) ? opacity : 1\n });\n\n this.options.addObserver(this);\n }\n\n static create(arg) {\n if (defined(arg)) {\n let stop;\n if (arg instanceof GradientStop) {\n stop = arg;\n } else if (arg.length > 1) {\n stop = new GradientStop(arg[0], arg[1], arg[2]);\n } else {\n stop = new GradientStop(arg.offset, arg.color, arg.opacity);\n }\n\n return stop;\n }\n }\n}\n\nexport default GradientStop;\n","import ElementsArray from '../shapes/elements-array';\n\nclass StopsArray extends ElementsArray {\n _change() {\n this.optionsChange({\n field: \"stops\"\n });\n }\n}\n\nexport default StopsArray;","import StopsArray from './stops-array';\nimport GradientStop from './gradient-stop';\nimport HasObservers from '../core/has-observers';\nimport { defined, definitionId } from '../util';\n\nclass Gradient extends HasObservers {\n get nodeType() {\n return \"Gradient\";\n }\n\n constructor(options = {}) {\n super();\n\n this.stops = new StopsArray(this._createStops(options.stops));\n this.stops.addObserver(this);\n this._userSpace = options.userSpace;\n this.id = definitionId();\n }\n\n userSpace(value) {\n if (defined(value)) {\n this._userSpace = value;\n this.optionsChange();\n return this;\n }\n\n return this._userSpace;\n }\n\n _createStops(stops = []) {\n const result = [];\n for (let idx = 0; idx < stops.length; idx++) {\n result.push(GradientStop.create(stops[idx]));\n }\n\n return result;\n }\n\n addStop(offset, color, opacity) {\n this.stops.push(new GradientStop(offset, color, opacity));\n }\n\n removeStop(stop) {\n const index = this.stops.indexOf(stop);\n if (index >= 0) {\n this.stops.splice(index, 1);\n }\n }\n\n optionsChange(e) {\n this.trigger(\"optionsChange\", {\n field: \"gradient\" + (e ? \".\" + e.field : \"\"),\n value: this\n });\n }\n\n geometryChange() {\n this.optionsChange();\n }\n}\n\nexport default Gradient;\n","import withPoints from '../mixins/with-points';\nimport Point from '../geometry/point';\nimport Gradient from './gradient';\n\n\nconst points = [ \"start\", \"end\" ];\n\nclass LinearGradient extends withPoints(Gradient, points) {\n constructor(options = {}) {\n super(options);\n\n this.start(options.start || new Point());\n this.end(options.end || new Point(1, 0));\n }\n}\n\nexport default LinearGradient;\n","import withPoints from '../mixins/with-points';\nimport Point from '../geometry/point';\nimport Gradient from './gradient';\nimport { defined } from '../util';\n\n\nclass RadialGradient extends withPoints(Gradient, [ \"center\" ]) {\n constructor(options = {}) {\n super(options);\n\n this.center(options.center || new Point());\n this._radius = defined(options.radius) ? options.radius : 1;\n this._fallbackFill = options.fallbackFill;\n }\n\n radius(value) {\n if (defined(value)) {\n this._radius = value;\n this.geometryChange();\n return this;\n }\n\n return this._radius;\n }\n\n fallbackFill(value) {\n if (defined(value)) {\n this._fallbackFill = value;\n this.optionsChange();\n return this;\n }\n\n return this._fallbackFill;\n }\n}\n\nexport default RadialGradient;\n","import Matrix from '../geometry/matrix';\nimport toMatrix from '../geometry/to-matrix';\n\nconst IDENTITY_MATRIX_HASH = Matrix.IDENTITY.toString();\n\nconst measurable = TBase => (\n class extends TBase {\n bbox(transformation) {\n const combinedMatrix = toMatrix(this.currentTransform(transformation));\n const matrixHash = combinedMatrix ? combinedMatrix.toString() : IDENTITY_MATRIX_HASH;\n let bbox;\n\n if (this._bboxCache && this._matrixHash === matrixHash) {\n bbox = this._bboxCache.clone();\n } else {\n bbox = this._bbox(combinedMatrix);\n this._bboxCache = bbox ? bbox.clone() : null;\n this._matrixHash = matrixHash;\n }\n\n const strokeWidth = this.options.get(\"stroke.width\");\n if (strokeWidth && bbox) {\n bbox.expand(strokeWidth / 2);\n }\n\n return bbox;\n }\n\n geometryChange() {\n delete this._bboxCache;\n this.trigger(\"geometryChange\", {\n element: this\n });\n }\n }\n);\n\nexport default measurable;","import { defined } from '../util';\n\nconst GRADIENT = \"Gradient\";\n\nconst paintable = TBase => (\n class extends TBase {\n fill(color, opacity) {\n const options = this.options;\n\n if (defined(color)) {\n if (color && color.nodeType !== GRADIENT) {\n const newFill = {\n color: color\n };\n if (defined(opacity)) {\n newFill.opacity = opacity;\n }\n options.set(\"fill\", newFill);\n } else {\n options.set(\"fill\", color);\n }\n\n return this;\n }\n\n return options.get(\"fill\");\n }\n\n stroke(color, width, opacity) {\n if (defined(color)) {\n this.options.set(\"stroke.color\", color);\n\n if (defined(width)) {\n this.options.set(\"stroke.width\", width);\n }\n\n if (defined(opacity)) {\n this.options.set(\"stroke.opacity\", opacity);\n }\n\n return this;\n }\n\n return this.options.get(\"stroke\");\n }\n}\n);\n\nexport default paintable;\n","const traversable = (TBase, childrenField) => (\n class extends TBase {\n traverse(callback) {\n const children = this[childrenField];\n\n for (let i = 0; i < children.length; i++) {\n let child = children[i];\n\n if (child.traverse) {\n child.traverse(callback);\n } else {\n callback(child);\n }\n }\n\n return this;\n }\n }\n);\n\nexport default traversable;\n","function setAccessor(field) {\n return function(value) {\n if (this[field] !== value) {\n this[field] = value;\n this.geometryChange();\n }\n\n return this;\n };\n}\n\nfunction getAccessor(field) {\n return function() {\n return this[field];\n };\n}\n\nfunction defineAccessors(fn, fields) {\n for (let i = 0; i < fields.length; i++) {\n let name = fields[i];\n let capitalized = name.charAt(0).toUpperCase() +\n name.substring(1, name.length);\n\n fn[\"set\" + capitalized] = setAccessor(name);\n fn[\"get\" + capitalized] = getAccessor(name);\n }\n}\n\nconst withAccessors = (TBase, names) => {\n const result = class extends TBase {};\n defineAccessors(result.prototype, names);\n\n return result;\n};\n\nexport default withAccessors;\n","import { defined } from '../util';\n\nfunction geometryAccessor(name) {\n const fieldName = \"_\" + name;\n return function(value) {\n if (defined(value)) {\n this._observerField(fieldName, value);\n this.geometryChange();\n return this;\n }\n\n return this[fieldName];\n };\n}\n\nfunction defineGeometryAccessors(fn, names) {\n for (let i = 0; i < names.length; i++) {\n fn[names[i]] = geometryAccessor(names[i]);\n }\n}\n\nconst withGeometry = (TBase, names = [ \"geometry\" ]) => {\n const result = class extends TBase {};\n defineGeometryAccessors(result.prototype, names);\n\n return result;\n};\n\nexport default withGeometry;\n","import { defined } from '../util';\nimport Point from '../geometry/point';\n\nfunction pointAccessor(name) {\n const fieldName = \"_\" + name;\n return function(value) {\n if (defined(value)) {\n this._observerField(fieldName, Point.create(value));\n this.geometryChange();\n return this;\n }\n\n return this[fieldName];\n };\n}\n\nfunction definePointAccessors(fn, names) {\n for (let i = 0; i < names.length; i++) {\n fn[names[i]] = pointAccessor(names[i]);\n }\n}\n\nconst withPoints = (TBase, names) => {\n const result = class extends TBase {};\n definePointAccessors(result.prototype, names);\n\n return result;\n};\n\nexport default withPoints;\n","import Point from '../geometry/point';\nimport { last } from '../util';\n\nconst ShapeMap = {\n l: function(path, options) {\n const { parameters, position } = options;\n\n for (let i = 0; i < parameters.length; i += 2) {\n let point = new Point(parameters[i], parameters[i + 1]);\n\n if (options.isRelative) {\n point.translateWith(position);\n }\n\n path.lineTo(point.x, point.y);\n\n position.x = point.x;\n position.y = point.y;\n }\n },\n\n c: function(path, options) {\n const { parameters, position } = options;\n\n for (let i = 0; i < parameters.length; i += 6) {\n let controlOut = new Point(parameters[i], parameters[i + 1]);\n let controlIn = new Point(parameters[i + 2], parameters[i + 3]);\n let point = new Point(parameters[i + 4], parameters[i + 5]);\n if (options.isRelative) {\n controlIn.translateWith(position);\n controlOut.translateWith(position);\n point.translateWith(position);\n }\n\n path.curveTo(controlOut, controlIn, point);\n\n position.x = point.x;\n position.y = point.y;\n }\n },\n\n v: function(path, options) {\n const value = options.isRelative ? 0 : options.position.x;\n\n toLineParamaters(options.parameters, true, value);\n this.l(path, options);\n },\n\n h: function(path, options) {\n const value = options.isRelative ? 0 : options.position.y;\n\n toLineParamaters(options.parameters, false, value);\n this.l(path, options);\n },\n\n a: function(path, options) {\n const { parameters, position } = options;\n\n for (let i = 0; i < parameters.length; i += 7) {\n const radiusX = parameters[i];\n const radiusY = parameters[i + 1];\n const rotation = parameters[i + 2];\n const largeArc = parameters[i + 3];\n const swipe = parameters[i + 4];\n const endPoint = new Point(parameters[i + 5], parameters[i + 6]);\n\n if (options.isRelative) {\n endPoint.translateWith(position);\n }\n if (position.x !== endPoint.x || position.y !== endPoint.y) {\n path.arcTo(endPoint, radiusX, radiusY, largeArc, swipe, rotation);\n\n position.x = endPoint.x;\n position.y = endPoint.y;\n }\n }\n },\n\n s: function(path, options) {\n const { parameters, position, previousCommand } = options;\n let lastControlIn;\n\n if (previousCommand === \"s\" || previousCommand === \"c\") {\n lastControlIn = last(last(path.paths).segments).controlIn();\n }\n\n for (let i = 0; i < parameters.length; i += 4) {\n let controlIn = new Point(parameters[i], parameters[i + 1]);\n let endPoint = new Point(parameters[i + 2], parameters[i + 3]);\n let controlOut;\n\n if (options.isRelative) {\n controlIn.translateWith(position);\n endPoint.translateWith(position);\n }\n\n if (lastControlIn) {\n controlOut = reflectionPoint(lastControlIn, position);\n } else {\n controlOut = position.clone();\n }\n\n lastControlIn = controlIn;\n\n path.curveTo(controlOut, controlIn, endPoint);\n\n position.x = endPoint.x;\n position.y = endPoint.y;\n }\n },\n\n q: function(path, options) {\n const { parameters, position } = options;\n\n for (let i = 0; i < parameters.length; i += 4) {\n let controlPoint = new Point(parameters[i], parameters[i + 1]);\n let endPoint = new Point(parameters[i + 2], parameters[i + 3]);\n\n if (options.isRelative) {\n controlPoint.translateWith(position);\n endPoint.translateWith(position);\n }\n\n let cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\n\n path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\n\n position.x = endPoint.x;\n position.y = endPoint.y;\n }\n },\n\n t: function(path, options) {\n const { parameters, position, previousCommand } = options;\n let controlPoint;\n\n if (previousCommand === \"q\" || previousCommand === \"t\") {\n let lastSegment = last(last(path.paths).segments);\n controlPoint = lastSegment.controlIn().clone()\n .translateWith(position.scaleCopy(-1 / 3))\n .scale(3 / 2);\n }\n\n for (let i = 0; i < parameters.length; i += 2) {\n let endPoint = new Point(parameters[i], parameters[i + 1]);\n if (options.isRelative) {\n endPoint.translateWith(position);\n }\n\n if (controlPoint) {\n controlPoint = reflectionPoint(controlPoint, position);\n } else {\n controlPoint = position.clone();\n }\n\n let cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\n\n path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\n\n position.x = endPoint.x;\n position.y = endPoint.y;\n }\n }\n};\n\nfunction toLineParamaters(parameters, isVertical, value) {\n const insertPosition = isVertical ? 0 : 1;\n\n for (let i = 0; i < parameters.length; i += 2) {\n parameters.splice(i + insertPosition, 0, value);\n }\n}\n\nfunction reflectionPoint(point, center) {\n if (point && center) {\n return center.scaleCopy(2).translate(-point.x, -point.y);\n }\n}\n\nconst third = 1 / 3;\n\nfunction quadraticToCubicControlPoints(position, controlPoint, endPoint) {\n const scaledPoint = controlPoint.clone().scale(2 / 3);\n return {\n controlOut: scaledPoint.clone().translateWith(position.scaleCopy(third)),\n controlIn: scaledPoint.translateWith(endPoint.scaleCopy(third))\n };\n}\n\nexport default ShapeMap;","import Point from '../geometry/point';\nimport ShapeMap from './shape-map';\n\nconst SEGMENT_REGEX = /([a-df-z]{1})([^a-df-z]*)(z)?/gi;\nconst SPLIT_REGEX = /[,\\s]?([+\\-]?(?:\\d*\\.\\d+|\\d+)(?:[eE][+\\-]?\\d+)?)/g;\nconst MOVE = \"m\";\nconst CLOSE = \"z\";\n\nfunction parseParameters(str) {\n const parameters = [];\n str.replace(SPLIT_REGEX, function(match, number) {\n parameters.push(parseFloat(number));\n });\n return parameters;\n}\n\nfunction parsePath(pathInstance, str) {\n const position = new Point();\n let previousCommand;\n\n str.replace(SEGMENT_REGEX, (match, element, params, closePath) => {\n let command = element.toLowerCase();\n const isRelative = command === element;\n const parameters = parseParameters(params.trim());\n\n if (command === MOVE) {\n if (isRelative) {\n position.x += parameters[0];\n position.y += parameters[1];\n } else {\n position.x = parameters[0];\n position.y = parameters[1];\n }\n\n pathInstance.moveTo(position.x, position.y);\n\n if (parameters.length > 2) {\n command = \"l\";\n parameters.splice(0, 2);\n }\n }\n\n if (ShapeMap[command]) {\n ShapeMap[command](\n pathInstance, {\n parameters: parameters,\n position: position,\n isRelative: isRelative,\n previousCommand: previousCommand\n }\n );\n\n if (closePath && closePath.toLowerCase() === CLOSE) {\n pathInstance.close();\n }\n } else if (command !== MOVE) {\n throw new Error(\"Error while parsing SVG path. Unsupported command: \" + command);\n }\n\n previousCommand = command;\n });\n\n return pathInstance;\n}\n\nexport default parsePath;\n\n","import GeometryCircle from '../geometry/circle';\nimport paintable from '../mixins/paintable';\nimport measurable from '../mixins/measurable';\nimport withGeometry from '../mixins/with-geometry';\nimport Element from './element';\nimport { defined } from '../util';\n\nconst DEFAULT_STROKE = \"#000\";\n\nclass Circle extends paintable(measurable(withGeometry(Element))) {\n get nodeType() {\n return \"Circle\";\n }\n\n constructor(geometry = new GeometryCircle(), options = {}) {\n super(options);\n\n this.geometry(geometry);\n\n if (!defined(this.options.stroke)) {\n this.stroke(DEFAULT_STROKE);\n }\n }\n\n rawBBox() {\n return this._geometry.bbox();\n }\n\n _bbox(matrix) {\n return this._geometry.bbox(matrix);\n }\n\n _containsPoint(point) {\n return this.geometry().containsPoint(point);\n }\n\n _isOnPath(point) {\n return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\n }\n}\n\nexport default Circle;\n","import OptionsStore from '../core/options-store';\nimport Rect from '../geometry/rect';\nimport Matrix from '../geometry/matrix';\nimport createTransform from '../geometry/transform';\nimport toMatrix from '../geometry/to-matrix';\nimport HasObservers from '../core/has-observers';\nimport { defined, definitionId, isTransparent, valueOrDefault } from '../util';\n\nclass Element extends HasObservers {\n get nodeType() {\n return \"Rect\";\n }\n\n constructor(options) {\n super();\n\n this._initOptions(options);\n }\n\n _initOptions(options = {}) {\n const { clip, transform } = options;\n\n if (transform) {\n options.transform = createTransform(transform);\n }\n\n if (clip && !clip.id) {\n clip.id = definitionId();\n }\n\n this.options = new OptionsStore(options);\n this.options.addObserver(this);\n }\n\n transform(value) {\n if (defined(value)) {\n this.options.set(\"transform\", createTransform(value));\n } else {\n return this.options.get(\"transform\");\n }\n }\n\n parentTransform() {\n let element = this;\n let parentMatrix;\n\n while (element.parent) {\n element = element.parent;\n let transformation = element.transform();\n if (transformation) {\n parentMatrix = transformation.matrix().multiplyCopy(parentMatrix || Matrix.unit());\n }\n }\n\n if (parentMatrix) {\n return createTransform(parentMatrix);\n }\n }\n\n currentTransform(parentTransform = this.parentTransform()) {\n const elementTransform = this.transform();\n const elementMatrix = toMatrix(elementTransform);\n\n let parentMatrix = toMatrix(parentTransform);\n let combinedMatrix;\n\n if (elementMatrix && parentMatrix) {\n combinedMatrix = parentMatrix.multiplyCopy(elementMatrix);\n } else {\n combinedMatrix = elementMatrix || parentMatrix;\n }\n\n if (combinedMatrix) {\n return createTransform(combinedMatrix);\n }\n }\n\n visible(value) {\n if (defined(value)) {\n this.options.set(\"visible\", value);\n return this;\n }\n\n return this.options.get(\"visible\") !== false;\n }\n\n clip(value) {\n const options = this.options;\n if (defined(value)) {\n if (value && !value.id) {\n value.id = definitionId();\n }\n options.set(\"clip\", value);\n return this;\n }\n\n return options.get(\"clip\");\n }\n\n opacity(value) {\n if (defined(value)) {\n this.options.set(\"opacity\", value);\n return this;\n }\n\n return valueOrDefault(this.options.get(\"opacity\"), 1);\n }\n\n clippedBBox(transformation) {\n const bbox = this._clippedBBox(transformation);\n if (bbox) {\n const clip = this.clip();\n return clip ? Rect.intersect(bbox, clip.bbox(transformation)) : bbox;\n }\n }\n\n containsPoint(point, parentTransform) {\n if (this.visible()) {\n const transform = this.currentTransform(parentTransform);\n let transformedPoint = point;\n if (transform) {\n transformedPoint = point.transformCopy(transform.matrix().invert());\n }\n return (this._hasFill() && this._containsPoint(transformedPoint)) || (this._isOnPath && this._hasStroke() && this._isOnPath(transformedPoint));\n }\n return false;\n }\n\n _hasFill() {\n const fill = this.options.fill;\n return fill && !isTransparent(fill.color);\n }\n\n _hasStroke() {\n const stroke = this.options.stroke;\n return stroke && stroke.width > 0 && !isTransparent(stroke.color);\n }\n\n _clippedBBox(transformation) {\n return this.bbox(transformation);\n }\n}\n\nexport default Element;\n","import HasObservers from '../core/has-observers';\n\nconst push = [].push;\nconst pop = [].pop;\nconst splice = [].splice;\nconst shift = [].shift;\nconst slice = [].slice;\nconst unshift = [].unshift;\n\nclass ElementsArray extends HasObservers {\n constructor(array = []) {\n super();\n\n this.length = 0;\n this._splice(0, array.length, array);\n }\n\n elements(value) {\n if (value) {\n this._splice(0, this.length, value);\n\n this._change();\n return this;\n }\n\n return this.slice(0);\n }\n\n push() {\n const elements = arguments;\n const result = push.apply(this, elements);\n\n this._add(elements);\n\n return result;\n }\n\n slice() {\n return slice.call(this);\n }\n\n pop() {\n const length = this.length;\n const result = pop.apply(this);\n\n if (length) {\n this._remove([ result ]);\n }\n\n return result;\n }\n\n splice(index, howMany) {\n const elements = slice.call(arguments, 2);\n const result = this._splice(index, howMany, elements);\n\n this._change();\n\n return result;\n }\n\n shift() {\n const length = this.length;\n const result = shift.apply(this);\n\n if (length) {\n this._remove([ result ]);\n }\n\n return result;\n }\n\n unshift() {\n const elements = arguments;\n const result = unshift.apply(this, elements);\n\n this._add(elements);\n\n return result;\n }\n\n indexOf(element) {\n const length = this.length;\n\n for (let idx = 0; idx < length; idx++) {\n if (this[idx] === element) {\n return idx;\n }\n }\n return -1;\n }\n\n _splice(index, howMany, elements) {\n const result = splice.apply(this, [ index, howMany ].concat(elements));\n\n this._clearObserver(result);\n this._setObserver(elements);\n\n return result;\n }\n\n _add(elements) {\n this._setObserver(elements);\n this._change();\n }\n\n _remove(elements) {\n this._clearObserver(elements);\n this._change();\n }\n\n _setObserver(elements) {\n for (let idx = 0; idx < elements.length; idx++) {\n elements[idx].addObserver(this);\n }\n }\n\n _clearObserver(elements) {\n for (let idx = 0; idx < elements.length; idx++) {\n elements[idx].removeObserver(this);\n }\n }\n\n _change() {}\n}\n\nexport default ElementsArray;\n","import Element from './element';\nimport traversable from '../mixins/traversable';\nimport { append } from '../util';\nimport elementsBoundingBox from './utils/elements-bounding-box';\nimport elementsClippedBoundingBox from './utils/elements-clippend-bounding-box';\n\n\nclass Group extends traversable(Element, \"children\") {\n get nodeType() {\n return \"Group\";\n }\n\n constructor(options) {\n super(options);\n this.children = [];\n }\n\n childrenChange(action, items, index) {\n this.trigger(\"childrenChange\",{\n action: action,\n items: items,\n index: index\n });\n }\n\n append() {\n append(this.children, arguments);\n this._reparent(arguments, this);\n\n this.childrenChange(\"add\", arguments);\n\n return this;\n }\n\n insert(index, element) {\n this.children.splice(index, 0, element);\n element.parent = this;\n\n this.childrenChange(\"add\", [ element ], index);\n\n return this;\n }\n\n insertAt(element, index) {\n return this.insert(index, element);\n }\n\n remove(element) {\n const index = this.children.indexOf(element);\n if (index >= 0) {\n this.children.splice(index, 1);\n element.parent = null;\n this.childrenChange(\"remove\", [ element ], index);\n }\n\n return this;\n }\n\n removeAt(index) {\n if (0 <= index && index < this.children.length) {\n let element = this.children[index];\n this.children.splice(index, 1);\n element.parent = null;\n this.childrenChange(\"remove\", [ element ], index);\n }\n\n return this;\n }\n\n clear() {\n const items = this.children;\n this.children = [];\n this._reparent(items, null);\n\n this.childrenChange(\"remove\", items, 0);\n\n return this;\n }\n\n bbox(transformation) {\n return elementsBoundingBox(this.children, true, this.currentTransform(transformation));\n }\n\n rawBBox() {\n return elementsBoundingBox(this.children, false);\n }\n\n _clippedBBox(transformation) {\n return elementsClippedBoundingBox(this.children, this.currentTransform(transformation));\n }\n\n currentTransform(transformation) {\n return Element.prototype.currentTransform.call(this, transformation) || null;\n }\n\n containsPoint(point, parentTransform) {\n if (this.visible()) {\n const children = this.children;\n const transform = this.currentTransform(parentTransform);\n for (let idx = 0; idx < children.length; idx++) {\n if (children[idx].containsPoint(point, transform)) {\n return true;\n }\n }\n }\n return false;\n }\n\n _reparent(elements, newParent) {\n for (let i = 0; i < elements.length; i++) {\n const child = elements[i];\n const parent = child.parent;\n if (parent && parent !== this && parent.remove) {\n parent.remove(child);\n }\n\n child.parent = newParent;\n }\n }\n}\n\nexport default Group;","import withGeometry from '../mixins/with-geometry';\nimport Element from './element';\nimport Rect from '../geometry/rect';\nimport toMatrix from '../geometry/to-matrix';\nimport { defined } from '../util';\n\n\nclass Image extends withGeometry(Element, [ \"rect\" ]) {\n get nodeType() {\n return \"Image\";\n }\n\n constructor(src, rect = new Rect(), options = {}) {\n super(options);\n\n this.src(src);\n this.rect(rect);\n }\n\n src(value) {\n if (defined(value)) {\n this.options.set(\"src\", value);\n return this;\n }\n\n return this.options.get(\"src\");\n }\n\n bbox(transformation) {\n const combinedMatrix = toMatrix(this.currentTransform(transformation));\n return this._rect.bbox(combinedMatrix);\n }\n\n rawBBox() {\n return this._rect.bbox();\n }\n\n _containsPoint(point) {\n return this._rect.containsPoint(point);\n }\n\n _hasFill() {\n return this.src();\n }\n}\n\nexport default Image;","import ElementsArray from './elements-array';\n\nclass GeometryElementsArray extends ElementsArray {\n _change() {\n this.geometryChange();\n }\n}\n\nexport default GeometryElementsArray;","import GeometryElementsArray from './geometry-elements-array';\nimport Element from './element';\nimport paintable from '../mixins/paintable';\nimport measurable from '../mixins/measurable';\nimport Arc from '../geometry/arc';\nimport Rect from '../geometry/rect';\nimport Segment from '../geometry/segment';\nimport Point from '../geometry/point';\nimport Size from '../geometry/size';\nimport lineIntersectionsCount from '../geometry/math/line-intersections-count';\nimport { defined, last, rad } from '../util';\nimport parsePath from '../parsing/parse-path';\nimport elementsBoundingBox from './utils/elements-bounding-box';\nimport elementsClippedBoundingBox from './utils/elements-clippend-bounding-box';\nimport limitValue from '../util/limit-value';\n\n\nexport class Path extends paintable(measurable(Element)) {\n static parse(str, options) {\n return MultiPath.parse(str, options);\n }\n\n get nodeType() {\n return \"Path\";\n }\n\n constructor(options) {\n super(options);\n this.segments = new GeometryElementsArray();\n this.segments.addObserver(this);\n\n if (!defined(this.options.stroke)) {\n this.stroke(\"#000\");\n\n if (!defined(this.options.stroke.lineJoin)) {\n this.options.set(\"stroke.lineJoin\", \"miter\");\n }\n }\n }\n\n moveTo(x, y) {\n this.suspend();\n this.segments.elements([]);\n this.resume();\n\n this.lineTo(x, y);\n\n return this;\n }\n\n lineTo(x, y) {\n const point = defined(y) ? new Point(x, y) : x;\n const segment = new Segment(point);\n\n this.segments.push(segment);\n\n return this;\n }\n\n curveTo(controlOut, controlIn, point) {\n if (this.segments.length > 0) {\n const lastSegment = last(this.segments);\n const segment = new Segment(point, controlIn);\n this.suspend();\n lastSegment.controlOut(controlOut);\n this.resume();\n\n this.segments.push(segment);\n }\n\n return this;\n }\n\n arc(startAngle, endAngle, radiusX, radiusY, anticlockwise) {\n if (this.segments.length > 0) {\n const lastSegment = last(this.segments);\n const anchor = lastSegment.anchor();\n const start = rad(startAngle);\n const center = new Point(anchor.x - radiusX * Math.cos(start),\n anchor.y - radiusY * Math.sin(start));\n const arc = new Arc(center, {\n startAngle: startAngle,\n endAngle: endAngle,\n radiusX: radiusX,\n radiusY: radiusY,\n anticlockwise: anticlockwise\n });\n\n this._addArcSegments(arc);\n }\n\n return this;\n }\n\n arcTo(end, rx, ry, largeArc, swipe, rotation) {\n if (this.segments.length > 0) {\n const lastSegment = last(this.segments);\n const anchor = lastSegment.anchor();\n const arc = Arc.fromPoints(anchor, Point.create(end), rx, ry, largeArc, swipe, rotation);\n\n this._addArcSegments(arc);\n }\n return this;\n }\n\n _addArcSegments(arc) {\n this.suspend();\n\n const curvePoints = arc.curvePoints();\n\n for (let i = 1; i < curvePoints.length; i += 3) {\n this.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\n }\n\n this.resume();\n this.geometryChange();\n }\n\n close() {\n this.options.closed = true;\n this.geometryChange();\n\n return this;\n }\n\n rawBBox() {\n return this._bbox();\n }\n\n _containsPoint(point) {\n const segments = this.segments;\n const length = segments.length;\n let intersectionsCount = 0;\n let previous, current;\n\n for (let idx = 1; idx < length; idx++) {\n previous = segments[idx - 1];\n current = segments[idx];\n intersectionsCount += previous._intersectionsTo(current, point);\n }\n\n if (this.options.closed || !segments[0].anchor().equals(segments[length - 1].anchor())) {\n intersectionsCount += lineIntersectionsCount(segments[0].anchor(), segments[length - 1].anchor(), point);\n }\n\n return intersectionsCount % 2 !== 0;\n }\n\n _isOnPath(point, width) {\n const segments = this.segments;\n const length = segments.length;\n const pathWidth = width || this.options.stroke.width;\n\n if (length > 1) {\n if (segments[0]._isOnPathTo(segments[1], point, pathWidth, \"start\")) {\n return true;\n }\n\n for (let idx = 2; idx <= length - 2; idx++) {\n if (segments[idx - 1]._isOnPathTo(segments[idx], point, pathWidth)) {\n return true;\n }\n }\n\n if (segments[length - 2]._isOnPathTo(segments[length - 1], point, pathWidth, \"end\")) {\n return true;\n }\n }\n return false;\n }\n\n _bbox(matrix) {\n const segments = this.segments;\n const length = segments.length;\n let boundingBox;\n\n if (length === 1) {\n let anchor = segments[0].anchor().transformCopy(matrix);\n boundingBox = new Rect(anchor, Size.ZERO);\n } else if (length > 0) {\n for (let i = 1; i < length; i++) {\n let segmentBox = segments[i - 1].bboxTo(segments[i], matrix);\n if (boundingBox) {\n boundingBox = Rect.union(boundingBox, segmentBox);\n } else {\n boundingBox = segmentBox;\n }\n }\n }\n\n return boundingBox;\n }\n\n static fromRect(rect, options) {\n const path = new Path(options);\n let [ rx, ry ] = rect.cornerRadius;\n\n if (rx === 0 && ry === 0) {\n path.moveTo(rect.topLeft())\n .lineTo(rect.topRight())\n .lineTo(rect.bottomRight())\n .lineTo(rect.bottomLeft())\n .close();\n } else {\n const origin = rect.origin;\n const { x, y } = origin;\n const width = rect.width();\n const height = rect.height();\n rx = limitValue(rx, 0, width / 2);\n ry = limitValue(ry, 0, height / 2);\n\n path.moveTo(x + rx, y)\n .lineTo(x + width - rx, y)\n .arcTo([ x + width, y + ry ], rx, ry, false)\n .lineTo(x + width, y + height - ry)\n .arcTo([ x + width - rx, y + height ], rx, ry, false)\n .lineTo(x + rx, y + height)\n .arcTo([ x, y + height - ry ], rx, ry, false)\n .lineTo(x, y + ry)\n .arcTo([ x + rx, y ], rx, ry, false);\n }\n\n return path;\n }\n\n static fromPoints(points, options) {\n if (points) {\n const path = new Path(options);\n\n for (let i = 0; i < points.length; i++) {\n let point = Point.create(points[i]);\n if (point) {\n if (i === 0) {\n path.moveTo(point);\n } else {\n path.lineTo(point);\n }\n }\n }\n\n return path;\n }\n }\n\n static fromArc(arc, options) {\n const path = new Path(options);\n const startAngle = arc.startAngle;\n const start = arc.pointAt(startAngle);\n path.moveTo(start.x, start.y);\n path.arc(startAngle, arc.endAngle, arc.radiusX, arc.radiusY, arc.anticlockwise);\n return path;\n }\n}\n\nexport class MultiPath extends paintable(measurable(Element)) {\n static parse(str, options) {\n const instance = new MultiPath(options);\n return parsePath(instance, str);\n }\n\n get nodeType() {\n return \"MultiPath\";\n }\n\n constructor(options) {\n super(options);\n this.paths = new GeometryElementsArray();\n this.paths.addObserver(this);\n\n if (!defined(this.options.stroke)) {\n this.stroke(\"#000\");\n }\n }\n\n moveTo(x, y) {\n const path = new Path();\n path.moveTo(x, y);\n\n this.paths.push(path);\n\n return this;\n }\n\n lineTo(x, y) {\n if (this.paths.length > 0) {\n last(this.paths).lineTo(x, y);\n }\n\n return this;\n }\n\n curveTo(controlOut, controlIn, point) {\n if (this.paths.length > 0) {\n last(this.paths).curveTo(controlOut, controlIn, point);\n }\n\n return this;\n }\n\n arc(startAngle, endAngle, radiusX, radiusY, anticlockwise) {\n if (this.paths.length > 0) {\n last(this.paths).arc(startAngle, endAngle, radiusX, radiusY, anticlockwise);\n }\n\n return this;\n }\n\n arcTo(end, rx, ry, largeArc, swipe, rotation) {\n if (this.paths.length > 0) {\n last(this.paths).arcTo(end, rx, ry, largeArc, swipe, rotation);\n }\n\n return this;\n }\n\n close() {\n if (this.paths.length > 0) {\n last(this.paths).close();\n }\n\n return this;\n }\n\n _bbox(matrix) {\n return elementsBoundingBox(this.paths, true, matrix);\n }\n\n rawBBox() {\n return elementsBoundingBox(this.paths, false);\n }\n\n _containsPoint(point) {\n const paths = this.paths;\n\n for (let idx = 0; idx < paths.length; idx++) {\n if (paths[idx]._containsPoint(point)) {\n return true;\n }\n }\n return false;\n }\n\n _isOnPath(point) {\n const paths = this.paths;\n const width = this.options.stroke.width;\n\n for (let idx = 0; idx < paths.length; idx++) {\n if (paths[idx]._isOnPath(point, width)) {\n return true;\n }\n }\n return false;\n }\n\n _clippedBBox(transformation) {\n return elementsClippedBoundingBox(this.paths, this.currentTransform(transformation));\n }\n}\n\n","import Element from './element';\nimport Point from '../geometry/point';\nimport Rect from '../geometry/rect';\nimport toMatrix from '../geometry/to-matrix';\nimport paintable from '../mixins/paintable';\nimport withPoints from '../mixins/with-points';\nimport { defined, measureText } from '../util';\n\n\nconst DEFAULT_FONT = \"12px sans-serif\";\nconst DEFAULT_FILL = \"#000\";\n\nclass Text extends paintable(withPoints(Element, [ \"position\" ])) {\n get nodeType() {\n return \"Text\";\n }\n\n constructor(content, position = new Point(), options = {}) {\n super(options);\n\n this.content(content);\n this.position(position);\n\n if (!this.options.font) {\n this.options.font = DEFAULT_FONT;\n }\n\n if (!defined(this.options.fill)) {\n this.fill(DEFAULT_FILL);\n }\n }\n\n content(value) {\n if (defined(value)) {\n this.options.set(\"content\", value);\n return this;\n }\n\n return this.options.get(\"content\");\n }\n\n measure() {\n const metrics = measureText(this.content(), {\n font: this.options.get(\"font\")\n });\n\n return metrics;\n }\n\n rect() {\n const size = this.measure();\n const pos = this.position().clone();\n return new Rect(pos, [ size.width, size.height ]);\n }\n\n bbox(transformation) {\n const combinedMatrix = toMatrix(this.currentTransform(transformation));\n return this.rect().bbox(combinedMatrix);\n }\n\n rawBBox() {\n return this.rect().bbox();\n }\n\n _containsPoint(point) {\n return this.rect().containsPoint(point);\n }\n}\n\nexport default Text;\n","import Rect from '../../geometry/rect';\n\nexport default function elementsBoundingBox(elements, applyTransform, transformation) {\n let boundingBox;\n\n for (let i = 0; i < elements.length; i++) {\n let element = elements[i];\n if (element.visible()) {\n let elementBoundingBox = applyTransform ? element.bbox(transformation) : element.rawBBox();\n if (elementBoundingBox) {\n if (boundingBox) {\n boundingBox = Rect.union(boundingBox, elementBoundingBox);\n } else {\n boundingBox = elementBoundingBox;\n }\n }\n }\n }\n\n return boundingBox;\n}\n\n","import Rect from '../../geometry/rect';\n\nexport default function elementsClippedBoundingBox(elements, transformation) {\n let boundingBox;\n\n for (let i = 0; i < elements.length; i++) {\n let element = elements[i];\n if (element.visible()) {\n let elementBoundingBox = element.clippedBBox(transformation);\n if (elementBoundingBox) {\n if (boundingBox) {\n boundingBox = Rect.union(boundingBox, elementBoundingBox);\n } else {\n boundingBox = elementBoundingBox;\n }\n }\n }\n }\n\n return boundingBox;\n}","import { Class } from '../common';\n\nclass LRUCache extends Class {\n constructor(size) {\n super();\n\n this._size = size;\n this._length = 0;\n this._map = {};\n }\n\n put(key, value) {\n const map = this._map;\n const entry = { key: key, value: value };\n\n map[key] = entry;\n\n if (!this._head) {\n this._head = this._tail = entry;\n } else {\n this._tail.newer = entry;\n entry.older = this._tail;\n this._tail = entry;\n }\n\n if (this._length >= this._size) {\n map[this._head.key] = null;\n this._head = this._head.newer;\n this._head.older = null;\n } else {\n this._length++;\n }\n }\n\n get(key) {\n const entry = this._map[key];\n\n if (entry) {\n if (entry === this._head && entry !== this._tail) {\n this._head = entry.newer;\n this._head.older = null;\n }\n\n if (entry !== this._tail) {\n if (entry.older) {\n entry.older.newer = entry.newer;\n entry.newer.older = entry.older;\n }\n\n entry.older = this._tail;\n entry.newer = null;\n\n this._tail.newer = entry;\n this._tail = entry;\n }\n\n return entry.value;\n }\n }\n}\n\nexport default LRUCache;","import TextMetrics from './text-metrics';\n\nexport default function measureText(text, style, measureBox) {\n return TextMetrics.current.measure(text, style, measureBox);\n}\n","import LRUCache from './lru-cache';\nimport { Class } from '../common';\nimport { objectKey, hashKey, normalizeText } from './util';\n\nfunction zeroSize() {\n return { width: 0, height: 0, baseline: 0 };\n}\n\nconst DEFAULT_OPTIONS = {\n baselineMarkerSize: 1\n};\n\nlet defaultMeasureBox;\n\nif (typeof document !== \"undefined\") {\n defaultMeasureBox = document.createElement(\"div\");\n defaultMeasureBox.style.cssText = \"position: absolute !important; top: -4000px !important; width: auto !important; height: auto !important;\" +\n \"padding: 0 !important; margin: 0 !important; border: 0 !important;\" +\n \"line-height: normal !important; visibility: hidden !important; white-space: pre!important;\";\n}\n\nclass TextMetrics extends Class {\n constructor(options) {\n super();\n\n this._cache = new LRUCache(1000);\n this.options = Object.assign({}, DEFAULT_OPTIONS, options);\n }\n\n measure(text, style, options = {}) {\n if (typeof text === 'undefined' || text === null) {\n return zeroSize();\n }\n\n const styleKey = objectKey(style);\n const cacheKey = hashKey(text + styleKey);\n const cachedResult = this._cache.get(cacheKey);\n\n if (cachedResult) {\n return cachedResult;\n }\n\n const size = zeroSize();\n const measureBox = options.box || defaultMeasureBox;\n const baselineMarker = this._baselineMarker().cloneNode(false);\n\n for (let key in style) {\n let value = style[key];\n if (typeof value !== \"undefined\") {\n measureBox.style[key] = value;\n }\n }\n\n const textStr = options.normalizeText !== false ? normalizeText(text) : String(text);\n\n measureBox.textContent = textStr;\n measureBox.appendChild(baselineMarker);\n document.body.appendChild(measureBox);\n\n if (textStr.length) {\n size.width = measureBox.offsetWidth - this.options.baselineMarkerSize;\n size.height = measureBox.offsetHeight;\n size.baseline = baselineMarker.offsetTop + this.options.baselineMarkerSize;\n }\n\n if (size.width > 0 && size.height > 0) {\n this._cache.put(cacheKey, size);\n }\n\n measureBox.parentNode.removeChild(measureBox);\n\n return size;\n }\n\n _baselineMarker() {\n const marker = document.createElement(\"div\");\n marker.style.cssText = \"display: inline-block; vertical-align: baseline;width: \" +\n this.options.baselineMarkerSize + \"px; height: \" + this.options.baselineMarkerSize + \"px;overflow: hidden;\";\n\n return marker;\n }\n}\n\nTextMetrics.current = new TextMetrics();\n\nexport default TextMetrics;\n","const REPLACE_REGEX = /\\r?\\n|\\r|\\t/g;\nconst SPACE = ' ';\n\nfunction normalizeText(text) {\n return String(text).replace(REPLACE_REGEX, SPACE);\n}\n\nfunction objectKey(object) {\n const parts = [];\n for (let key in object) {\n parts.push(key + object[key]);\n }\n\n return parts.sort().join(\"\");\n}\n\n// Computes FNV-1 hash\n// See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function\nfunction hashKey(str) {\n // 32-bit FNV-1 offset basis\n // See http://isthe.com/chongo/tech/comp/fnv/#FNV-param\n let hash = 0x811C9DC5;\n\n for (let i = 0; i < str.length; ++i) {\n hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\n hash ^= str.charCodeAt(i);\n }\n\n return hash >>> 0;\n}\n\nexport { objectKey, hashKey, normalizeText };","export default function append(first, second) {\n first.push.apply(first, second);\n return first;\n}","/* eslint-disable key-spacing,no-multi-spaces,no-param-reassign */\n\nconst literals = {\n 1 : \"i\", 10 : \"x\", 100 : \"c\",\n 2 : \"ii\", 20 : \"xx\", 200 : \"cc\",\n 3 : \"iii\", 30 : \"xxx\", 300 : \"ccc\",\n 4 : \"iv\", 40 : \"xl\", 400 : \"cd\",\n 5 : \"v\", 50 : \"l\", 500 : \"d\",\n 6 : \"vi\", 60 : \"lx\", 600 : \"dc\",\n 7 : \"vii\", 70 : \"lxx\", 700 : \"dcc\",\n 8 : \"viii\", 80 : \"lxxx\", 800 : \"dccc\",\n 9 : \"ix\", 90 : \"xc\", 900 : \"cm\",\n 1000 : \"m\"\n};\n\nexport default function arabicToRoman(n) {\n const values = [ 1000,\n 900 , 800, 700, 600, 500, 400, 300, 200, 100,\n 90 , 80 , 70 , 60 , 50 , 40 , 30 , 20 , 10 ,\n 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ];\n\n let roman = \"\";\n while (n > 0) {\n if (n < values[0]) {\n values.shift();\n } else {\n roman += literals[values[0]];\n n -= values[0];\n }\n }\n return roman;\n}","const DEG_TO_RAD = Math.PI / 180;\nconst MAX_NUM = Number.MAX_VALUE;\nconst MIN_NUM = -Number.MAX_VALUE;\n\nexport { DEG_TO_RAD, MAX_NUM, MIN_NUM };","export default function createPromise() {\n let resolveFn, rejectFn;\n const promise = new Promise((resolve, reject) => {\n resolveFn = (data) => {\n promise._state = \"resolved\";\n resolve(data);\n return promise;\n };\n rejectFn = (data) => {\n promise._state = \"rejected\";\n reject(data);\n\n return promise;\n };\n });\n promise._state = \"pending\";\n promise.resolve = resolveFn;\n promise.reject = rejectFn;\n promise.state = () => promise._state;\n\n return promise;\n}\n","const UNDEFINED = \"undefined\";\n\nexport default function defined(value) {\n return typeof value !== UNDEFINED;\n}","let defId = 1;\n\nexport default function definitionId() {\n return \"kdef\" + defId++;\n}","import { DEG_TO_RAD } from './constants';\n\nexport default function deg(radians) {\n return radians / DEG_TO_RAD;\n}","import { encodeUTF8 } from './encode-utf';\n\nconst KEY_STR = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nexport default function encodeBase64(input) {\n let output = \"\";\n let i = 0;\n\n const utfInput = encodeUTF8(input);\n\n while (i < utfInput.length) {\n let chr1 = utfInput.charCodeAt(i++);\n let chr2 = utfInput.charCodeAt(i++);\n let chr3 = utfInput.charCodeAt(i++);\n\n let enc1 = chr1 >> 2;\n let enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n let enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n let enc4 = chr3 & 63;\n\n if (isNaN(chr2)) {\n enc3 = enc4 = 64;\n } else if (isNaN(chr3)) {\n enc4 = 64;\n }\n\n output = output +\n KEY_STR.charAt(enc1) + KEY_STR.charAt(enc2) +\n KEY_STR.charAt(enc3) + KEY_STR.charAt(enc4);\n }\n\n return output;\n}","const fromCharCode = String.fromCharCode;\n\nexport const BOM = '\\xfe\\xff';\n\n// Encodes a string as UTF-8\nexport function encodeUTF8(input) {\n let output = \"\";\n\n for (let i = 0; i < input.length; i++) {\n let code = input.charCodeAt(i);\n\n if (0xD800 <= code && code <= 0xDBFF) {\n const hi = code;\n const low = input.charCodeAt(++i);\n\n if (!isNaN(low)) {\n // Combine high and low surrogate\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\n code = (hi - 0xD800) * 0x400 +\n (low - 0xDC00) + 0x10000;\n }\n }\n\n if (code < 0x80) {\n // One byte\n output += fromCharCode(code);\n } else if (code < 0x800) {\n // Two bytes\n output += fromCharCode(0xC0 | (code >>> 6));\n output += fromCharCode(0x80 | (code & 0x3f));\n } else if (code < 0x10000) {\n // Three bytes\n output += fromCharCode(0xE0 | (code >>> 12));\n output += fromCharCode(0x80 | (code >>> 6 & 0x3f));\n output += fromCharCode(0x80 | (code & 0x3f));\n } else if (code < 0x10FFFF) {\n // Four bytes\n output += fromCharCode(0xF0 | (code >>> 18));\n output += fromCharCode(0x80 | (code >>> 12 & 0x3f));\n output += fromCharCode(0x80 | (code >>> 6 & 0x3f));\n output += fromCharCode(0x80 | (code & 0x3f));\n }\n }\n\n return output;\n}\n\nfunction encodeUnit(codeUnit) {\n return fromCharCode(codeUnit >> 8) + fromCharCode(codeUnit & 0x00ff);\n}\n\n// Encodes a string as UTF-16 big-endian\nexport function encodeUTF16BE(input) {\n let output = '';\n\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n\n if (c < 0xFFFF) {\n output += encodeUnit(c);\n } else {\n const lead = ((c - 0x10000) >> 10) + 0xD800;\n const trail = ((c - 0x10000) & 0x3FF) + 0xDC00;\n output += encodeUnit(lead);\n output += encodeUnit(trail);\n }\n }\n\n return output;\n}\n","import defined from './defined';\n\nexport default function isTransparent(color) {\n return color === \"\" || color === null || color === \"none\" || color === \"transparent\" || !defined(color);\n}","export default function last(array) {\n if (array) {\n return array[array.length - 1];\n }\n}","export default function limitValue(value, min, max) {\n return Math.max(Math.min(value, max), min);\n}","/* eslint-disable no-multi-spaces, key-spacing, indent, camelcase, space-before-blocks, eqeqeq, brace-style */\n/* eslint-disable space-infix-ops, space-before-function-paren, array-bracket-spacing, object-curly-spacing */\n/* eslint-disable no-nested-ternary, max-params, default-case, no-else-return, no-empty */\n/* eslint-disable no-param-reassign, no-var, block-scoped-var */\n\n// mergeSort is stable.\nexport default function mergeSort(a, cmp) {\n if (a.length < 2) {\n return a.slice();\n }\n function merge(a, b) {\n var r = [], ai = 0, bi = 0, i = 0;\n while (ai < a.length && bi < b.length) {\n if (cmp(a[ai], b[bi]) <= 0) {\n r[i++] = a[ai++];\n } else {\n r[i++] = b[bi++];\n }\n }\n if (ai < a.length) {\n r.push.apply(r, a.slice(ai));\n }\n if (bi < b.length) {\n r.push.apply(r, b.slice(bi));\n }\n return r;\n }\n return (function sort(a) {\n if (a.length <= 1) {\n return a;\n }\n var m = Math.floor(a.length / 2);\n var left = a.slice(0, m);\n var right = a.slice(m);\n left = sort(left);\n right = sort(right);\n return merge(left, right);\n })(a);\n}","import { DEG_TO_RAD } from './constants';\n\nexport default function rad(degrees) {\n return degrees * DEG_TO_RAD;\n}\n","function pow(p) {\n if (p) {\n return Math.pow(10, p);\n }\n\n return 1;\n}\n\nexport default function round(value, precision) {\n const power = pow(precision);\n return Math.round(value * power) / power;\n}","import defined from './defined';\n\nexport default function valueOrDefault(value, defaultValue) {\n return defined(value) ? value : defaultValue;\n}"]}