peaks-player
Version:
A Web Component for peaks.js
1 lines • 813 kB
Source Map (JSON)
{"version":3,"file":"peaks-player.umd.cjs","sources":["../src/player.html?raw","../node_modules/konva/lib/Global.js","../node_modules/konva/lib/Util.js","../node_modules/konva/lib/Validators.js","../node_modules/konva/lib/Factory.js","../node_modules/konva/lib/Context.js","../node_modules/konva/lib/Canvas.js","../node_modules/konva/lib/DragAndDrop.js","../node_modules/konva/lib/Node.js","../node_modules/konva/lib/Container.js","../node_modules/konva/lib/PointerEvents.js","../node_modules/konva/lib/Stage.js","../node_modules/konva/lib/Shape.js","../node_modules/konva/lib/Layer.js","../node_modules/konva/lib/FastLayer.js","../node_modules/konva/lib/Group.js","../node_modules/konva/lib/Animation.js","../node_modules/konva/lib/Tween.js","../node_modules/konva/lib/_CoreInternals.js","../node_modules/konva/lib/Core.js","../node_modules/konva/lib/shapes/Line.js","../node_modules/konva/lib/shapes/Rect.js","../node_modules/konva/lib/shapes/Text.js","../node_modules/waveform-data/dist/waveform-data.esm.js","../node_modules/peaks.js/dist/peaks.esm.js","../src/playlist.html?raw","../src/index.js"],"sourcesContent":["export default \"<style>\\n #m-zoomview, #m-overview {\\n height: 100px;\\n background: var(--pp-color-bg, #111);\\n }\\n #m-audio, #m-zoomview, #m-overview {\\n width: 1000px;\\n }\\n #m-root {\\n display: flex;\\n flex-direction: column;\\n }\\n</style>\\n<div id=\\\"m-root\\\">\\n <audio controls id=\\\"m-audio\\\"></audio>\\n <div id=\\\"m-zoomview\\\"></div>\\n <div id=\\\"m-overview\\\"></div>\\n</div>\\n\"","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports._registerNode = exports.Konva = exports.glob = void 0;\nconst PI_OVER_180 = Math.PI / 180;\nfunction detectBrowser() {\n return (typeof window !== 'undefined' &&\n ({}.toString.call(window) === '[object Window]' ||\n {}.toString.call(window) === '[object global]'));\n}\nexports.glob = typeof global !== 'undefined'\n ? global\n : typeof window !== 'undefined'\n ? window\n : typeof WorkerGlobalScope !== 'undefined'\n ? self\n : {};\nexports.Konva = {\n _global: exports.glob,\n version: '9.3.18',\n isBrowser: detectBrowser(),\n isUnminified: /param/.test(function (param) { }.toString()),\n dblClickWindow: 400,\n getAngle(angle) {\n return exports.Konva.angleDeg ? angle * PI_OVER_180 : angle;\n },\n enableTrace: false,\n pointerEventsEnabled: true,\n autoDrawEnabled: true,\n hitOnDragEnabled: false,\n capturePointerEventsEnabled: false,\n _mouseListenClick: false,\n _touchListenClick: false,\n _pointerListenClick: false,\n _mouseInDblClickWindow: false,\n _touchInDblClickWindow: false,\n _pointerInDblClickWindow: false,\n _mouseDblClickPointerId: null,\n _touchDblClickPointerId: null,\n _pointerDblClickPointerId: null,\n _fixTextRendering: false,\n pixelRatio: (typeof window !== 'undefined' && window.devicePixelRatio) || 1,\n dragDistance: 3,\n angleDeg: true,\n showWarnings: true,\n dragButtons: [0, 1],\n isDragging() {\n return exports.Konva['DD'].isDragging;\n },\n isTransforming() {\n var _a;\n return (_a = exports.Konva['Transformer']) === null || _a === void 0 ? void 0 : _a.isTransforming();\n },\n isDragReady() {\n return !!exports.Konva['DD'].node;\n },\n releaseCanvasOnDestroy: true,\n document: exports.glob.document,\n _injectGlobal(Konva) {\n exports.glob.Konva = Konva;\n },\n};\nconst _registerNode = (NodeClass) => {\n exports.Konva[NodeClass.prototype.getClassName()] = NodeClass;\n};\nexports._registerNode = _registerNode;\nexports.Konva._injectGlobal(exports.Konva);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Util = exports.Transform = void 0;\nconst Global_1 = require(\"./Global\");\nclass Transform {\n constructor(m = [1, 0, 0, 1, 0, 0]) {\n this.dirty = false;\n this.m = (m && m.slice()) || [1, 0, 0, 1, 0, 0];\n }\n reset() {\n this.m[0] = 1;\n this.m[1] = 0;\n this.m[2] = 0;\n this.m[3] = 1;\n this.m[4] = 0;\n this.m[5] = 0;\n }\n copy() {\n return new Transform(this.m);\n }\n copyInto(tr) {\n tr.m[0] = this.m[0];\n tr.m[1] = this.m[1];\n tr.m[2] = this.m[2];\n tr.m[3] = this.m[3];\n tr.m[4] = this.m[4];\n tr.m[5] = this.m[5];\n }\n point(point) {\n const m = this.m;\n return {\n x: m[0] * point.x + m[2] * point.y + m[4],\n y: m[1] * point.x + m[3] * point.y + m[5],\n };\n }\n translate(x, y) {\n this.m[4] += this.m[0] * x + this.m[2] * y;\n this.m[5] += this.m[1] * x + this.m[3] * y;\n return this;\n }\n scale(sx, sy) {\n this.m[0] *= sx;\n this.m[1] *= sx;\n this.m[2] *= sy;\n this.m[3] *= sy;\n return this;\n }\n rotate(rad) {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n const m11 = this.m[0] * c + this.m[2] * s;\n const m12 = this.m[1] * c + this.m[3] * s;\n const m21 = this.m[0] * -s + this.m[2] * c;\n const m22 = this.m[1] * -s + this.m[3] * c;\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n return this;\n }\n getTranslation() {\n return {\n x: this.m[4],\n y: this.m[5],\n };\n }\n skew(sx, sy) {\n const m11 = this.m[0] + this.m[2] * sy;\n const m12 = this.m[1] + this.m[3] * sy;\n const m21 = this.m[2] + this.m[0] * sx;\n const m22 = this.m[3] + this.m[1] * sx;\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n return this;\n }\n multiply(matrix) {\n const m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];\n const m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];\n const m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];\n const m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];\n const dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];\n const dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n this.m[4] = dx;\n this.m[5] = dy;\n return this;\n }\n invert() {\n const d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);\n const m0 = this.m[3] * d;\n const m1 = -this.m[1] * d;\n const m2 = -this.m[2] * d;\n const m3 = this.m[0] * d;\n const m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);\n const m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);\n this.m[0] = m0;\n this.m[1] = m1;\n this.m[2] = m2;\n this.m[3] = m3;\n this.m[4] = m4;\n this.m[5] = m5;\n return this;\n }\n getMatrix() {\n return this.m;\n }\n decompose() {\n const a = this.m[0];\n const b = this.m[1];\n const c = this.m[2];\n const d = this.m[3];\n const e = this.m[4];\n const f = this.m[5];\n const delta = a * d - b * c;\n const result = {\n x: e,\n y: f,\n rotation: 0,\n scaleX: 0,\n scaleY: 0,\n skewX: 0,\n skewY: 0,\n };\n if (a != 0 || b != 0) {\n const r = Math.sqrt(a * a + b * b);\n result.rotation = b > 0 ? Math.acos(a / r) : -Math.acos(a / r);\n result.scaleX = r;\n result.scaleY = delta / r;\n result.skewX = (a * c + b * d) / delta;\n result.skewY = 0;\n }\n else if (c != 0 || d != 0) {\n const s = Math.sqrt(c * c + d * d);\n result.rotation =\n Math.PI / 2 - (d > 0 ? Math.acos(-c / s) : -Math.acos(c / s));\n result.scaleX = delta / s;\n result.scaleY = s;\n result.skewX = 0;\n result.skewY = (a * c + b * d) / delta;\n }\n else {\n }\n result.rotation = exports.Util._getRotation(result.rotation);\n return result;\n }\n}\nexports.Transform = Transform;\nconst OBJECT_ARRAY = '[object Array]', OBJECT_NUMBER = '[object Number]', OBJECT_STRING = '[object String]', OBJECT_BOOLEAN = '[object Boolean]', PI_OVER_DEG180 = Math.PI / 180, DEG180_OVER_PI = 180 / Math.PI, HASH = '#', EMPTY_STRING = '', ZERO = '0', KONVA_WARNING = 'Konva warning: ', KONVA_ERROR = 'Konva error: ', RGB_PAREN = 'rgb(', COLORS = {\n aliceblue: [240, 248, 255],\n antiquewhite: [250, 235, 215],\n aqua: [0, 255, 255],\n aquamarine: [127, 255, 212],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n bisque: [255, 228, 196],\n black: [0, 0, 0],\n blanchedalmond: [255, 235, 205],\n blue: [0, 0, 255],\n blueviolet: [138, 43, 226],\n brown: [165, 42, 42],\n burlywood: [222, 184, 135],\n cadetblue: [95, 158, 160],\n chartreuse: [127, 255, 0],\n chocolate: [210, 105, 30],\n coral: [255, 127, 80],\n cornflowerblue: [100, 149, 237],\n cornsilk: [255, 248, 220],\n crimson: [220, 20, 60],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgoldenrod: [184, 132, 11],\n darkgray: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkgrey: [169, 169, 169],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkseagreen: [143, 188, 143],\n darkslateblue: [72, 61, 139],\n darkslategray: [47, 79, 79],\n darkslategrey: [47, 79, 79],\n darkturquoise: [0, 206, 209],\n darkviolet: [148, 0, 211],\n deeppink: [255, 20, 147],\n deepskyblue: [0, 191, 255],\n dimgray: [105, 105, 105],\n dimgrey: [105, 105, 105],\n dodgerblue: [30, 144, 255],\n firebrick: [178, 34, 34],\n floralwhite: [255, 255, 240],\n forestgreen: [34, 139, 34],\n fuchsia: [255, 0, 255],\n gainsboro: [220, 220, 220],\n ghostwhite: [248, 248, 255],\n gold: [255, 215, 0],\n goldenrod: [218, 165, 32],\n gray: [128, 128, 128],\n green: [0, 128, 0],\n greenyellow: [173, 255, 47],\n grey: [128, 128, 128],\n honeydew: [240, 255, 240],\n hotpink: [255, 105, 180],\n indianred: [205, 92, 92],\n indigo: [75, 0, 130],\n ivory: [255, 255, 240],\n khaki: [240, 230, 140],\n lavender: [230, 230, 250],\n lavenderblush: [255, 240, 245],\n lawngreen: [124, 252, 0],\n lemonchiffon: [255, 250, 205],\n lightblue: [173, 216, 230],\n lightcoral: [240, 128, 128],\n lightcyan: [224, 255, 255],\n lightgoldenrodyellow: [250, 250, 210],\n lightgray: [211, 211, 211],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightsalmon: [255, 160, 122],\n lightseagreen: [32, 178, 170],\n lightskyblue: [135, 206, 250],\n lightslategray: [119, 136, 153],\n lightslategrey: [119, 136, 153],\n lightsteelblue: [176, 196, 222],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n limegreen: [50, 205, 50],\n linen: [250, 240, 230],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n mediumaquamarine: [102, 205, 170],\n mediumblue: [0, 0, 205],\n mediumorchid: [186, 85, 211],\n mediumpurple: [147, 112, 219],\n mediumseagreen: [60, 179, 113],\n mediumslateblue: [123, 104, 238],\n mediumspringgreen: [0, 250, 154],\n mediumturquoise: [72, 209, 204],\n mediumvioletred: [199, 21, 133],\n midnightblue: [25, 25, 112],\n mintcream: [245, 255, 250],\n mistyrose: [255, 228, 225],\n moccasin: [255, 228, 181],\n navajowhite: [255, 222, 173],\n navy: [0, 0, 128],\n oldlace: [253, 245, 230],\n olive: [128, 128, 0],\n olivedrab: [107, 142, 35],\n orange: [255, 165, 0],\n orangered: [255, 69, 0],\n orchid: [218, 112, 214],\n palegoldenrod: [238, 232, 170],\n palegreen: [152, 251, 152],\n paleturquoise: [175, 238, 238],\n palevioletred: [219, 112, 147],\n papayawhip: [255, 239, 213],\n peachpuff: [255, 218, 185],\n peru: [205, 133, 63],\n pink: [255, 192, 203],\n plum: [221, 160, 203],\n powderblue: [176, 224, 230],\n purple: [128, 0, 128],\n rebeccapurple: [102, 51, 153],\n red: [255, 0, 0],\n rosybrown: [188, 143, 143],\n royalblue: [65, 105, 225],\n saddlebrown: [139, 69, 19],\n salmon: [250, 128, 114],\n sandybrown: [244, 164, 96],\n seagreen: [46, 139, 87],\n seashell: [255, 245, 238],\n sienna: [160, 82, 45],\n silver: [192, 192, 192],\n skyblue: [135, 206, 235],\n slateblue: [106, 90, 205],\n slategray: [119, 128, 144],\n slategrey: [119, 128, 144],\n snow: [255, 255, 250],\n springgreen: [0, 255, 127],\n steelblue: [70, 130, 180],\n tan: [210, 180, 140],\n teal: [0, 128, 128],\n thistle: [216, 191, 216],\n transparent: [255, 255, 255, 0],\n tomato: [255, 99, 71],\n turquoise: [64, 224, 208],\n violet: [238, 130, 238],\n wheat: [245, 222, 179],\n white: [255, 255, 255],\n whitesmoke: [245, 245, 245],\n yellow: [255, 255, 0],\n yellowgreen: [154, 205, 5],\n}, RGB_REGEX = /rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)/;\nlet animQueue = [];\nconst req = (typeof requestAnimationFrame !== 'undefined' && requestAnimationFrame) ||\n function (f) {\n setTimeout(f, 60);\n };\nexports.Util = {\n _isElement(obj) {\n return !!(obj && obj.nodeType == 1);\n },\n _isFunction(obj) {\n return !!(obj && obj.constructor && obj.call && obj.apply);\n },\n _isPlainObject(obj) {\n return !!obj && obj.constructor === Object;\n },\n _isArray(obj) {\n return Object.prototype.toString.call(obj) === OBJECT_ARRAY;\n },\n _isNumber(obj) {\n return (Object.prototype.toString.call(obj) === OBJECT_NUMBER &&\n !isNaN(obj) &&\n isFinite(obj));\n },\n _isString(obj) {\n return Object.prototype.toString.call(obj) === OBJECT_STRING;\n },\n _isBoolean(obj) {\n return Object.prototype.toString.call(obj) === OBJECT_BOOLEAN;\n },\n isObject(val) {\n return val instanceof Object;\n },\n isValidSelector(selector) {\n if (typeof selector !== 'string') {\n return false;\n }\n const firstChar = selector[0];\n return (firstChar === '#' ||\n firstChar === '.' ||\n firstChar === firstChar.toUpperCase());\n },\n _sign(number) {\n if (number === 0) {\n return 1;\n }\n if (number > 0) {\n return 1;\n }\n else {\n return -1;\n }\n },\n requestAnimFrame(callback) {\n animQueue.push(callback);\n if (animQueue.length === 1) {\n req(function () {\n const queue = animQueue;\n animQueue = [];\n queue.forEach(function (cb) {\n cb();\n });\n });\n }\n },\n createCanvasElement() {\n const canvas = document.createElement('canvas');\n try {\n canvas.style = canvas.style || {};\n }\n catch (e) { }\n return canvas;\n },\n createImageElement() {\n return document.createElement('img');\n },\n _isInDocument(el) {\n while ((el = el.parentNode)) {\n if (el == document) {\n return true;\n }\n }\n return false;\n },\n _urlToImage(url, callback) {\n const imageObj = exports.Util.createImageElement();\n imageObj.onload = function () {\n callback(imageObj);\n };\n imageObj.src = url;\n },\n _rgbToHex(r, g, b) {\n return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);\n },\n _hexToRgb(hex) {\n hex = hex.replace(HASH, EMPTY_STRING);\n const bigint = parseInt(hex, 16);\n return {\n r: (bigint >> 16) & 255,\n g: (bigint >> 8) & 255,\n b: bigint & 255,\n };\n },\n getRandomColor() {\n let randColor = ((Math.random() * 0xffffff) << 0).toString(16);\n while (randColor.length < 6) {\n randColor = ZERO + randColor;\n }\n return HASH + randColor;\n },\n getRGB(color) {\n let rgb;\n if (color in COLORS) {\n rgb = COLORS[color];\n return {\n r: rgb[0],\n g: rgb[1],\n b: rgb[2],\n };\n }\n else if (color[0] === HASH) {\n return this._hexToRgb(color.substring(1));\n }\n else if (color.substr(0, 4) === RGB_PAREN) {\n rgb = RGB_REGEX.exec(color.replace(/ /g, ''));\n return {\n r: parseInt(rgb[1], 10),\n g: parseInt(rgb[2], 10),\n b: parseInt(rgb[3], 10),\n };\n }\n else {\n return {\n r: 0,\n g: 0,\n b: 0,\n };\n }\n },\n colorToRGBA(str) {\n str = str || 'black';\n return (exports.Util._namedColorToRBA(str) ||\n exports.Util._hex3ColorToRGBA(str) ||\n exports.Util._hex4ColorToRGBA(str) ||\n exports.Util._hex6ColorToRGBA(str) ||\n exports.Util._hex8ColorToRGBA(str) ||\n exports.Util._rgbColorToRGBA(str) ||\n exports.Util._rgbaColorToRGBA(str) ||\n exports.Util._hslColorToRGBA(str));\n },\n _namedColorToRBA(str) {\n const c = COLORS[str.toLowerCase()];\n if (!c) {\n return null;\n }\n return {\n r: c[0],\n g: c[1],\n b: c[2],\n a: 1,\n };\n },\n _rgbColorToRGBA(str) {\n if (str.indexOf('rgb(') === 0) {\n str = str.match(/rgb\\(([^)]+)\\)/)[1];\n const parts = str.split(/ *, */).map(Number);\n return {\n r: parts[0],\n g: parts[1],\n b: parts[2],\n a: 1,\n };\n }\n },\n _rgbaColorToRGBA(str) {\n if (str.indexOf('rgba(') === 0) {\n str = str.match(/rgba\\(([^)]+)\\)/)[1];\n const parts = str.split(/ *, */).map((n, index) => {\n if (n.slice(-1) === '%') {\n return index === 3 ? parseInt(n) / 100 : (parseInt(n) / 100) * 255;\n }\n return Number(n);\n });\n return {\n r: parts[0],\n g: parts[1],\n b: parts[2],\n a: parts[3],\n };\n }\n },\n _hex8ColorToRGBA(str) {\n if (str[0] === '#' && str.length === 9) {\n return {\n r: parseInt(str.slice(1, 3), 16),\n g: parseInt(str.slice(3, 5), 16),\n b: parseInt(str.slice(5, 7), 16),\n a: parseInt(str.slice(7, 9), 16) / 0xff,\n };\n }\n },\n _hex6ColorToRGBA(str) {\n if (str[0] === '#' && str.length === 7) {\n return {\n r: parseInt(str.slice(1, 3), 16),\n g: parseInt(str.slice(3, 5), 16),\n b: parseInt(str.slice(5, 7), 16),\n a: 1,\n };\n }\n },\n _hex4ColorToRGBA(str) {\n if (str[0] === '#' && str.length === 5) {\n return {\n r: parseInt(str[1] + str[1], 16),\n g: parseInt(str[2] + str[2], 16),\n b: parseInt(str[3] + str[3], 16),\n a: parseInt(str[4] + str[4], 16) / 0xff,\n };\n }\n },\n _hex3ColorToRGBA(str) {\n if (str[0] === '#' && str.length === 4) {\n return {\n r: parseInt(str[1] + str[1], 16),\n g: parseInt(str[2] + str[2], 16),\n b: parseInt(str[3] + str[3], 16),\n a: 1,\n };\n }\n },\n _hslColorToRGBA(str) {\n if (/hsl\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%\\)/g.test(str)) {\n const [_, ...hsl] = /hsl\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%\\)/g.exec(str);\n const h = Number(hsl[0]) / 360;\n const s = Number(hsl[1]) / 100;\n const l = Number(hsl[2]) / 100;\n let t2;\n let t3;\n let val;\n if (s === 0) {\n val = l * 255;\n return {\n r: Math.round(val),\n g: Math.round(val),\n b: Math.round(val),\n a: 1,\n };\n }\n if (l < 0.5) {\n t2 = l * (1 + s);\n }\n else {\n t2 = l + s - l * s;\n }\n const t1 = 2 * l - t2;\n const rgb = [0, 0, 0];\n for (let i = 0; i < 3; i++) {\n t3 = h + (1 / 3) * -(i - 1);\n if (t3 < 0) {\n t3++;\n }\n if (t3 > 1) {\n t3--;\n }\n if (6 * t3 < 1) {\n val = t1 + (t2 - t1) * 6 * t3;\n }\n else if (2 * t3 < 1) {\n val = t2;\n }\n else if (3 * t3 < 2) {\n val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n }\n else {\n val = t1;\n }\n rgb[i] = val * 255;\n }\n return {\n r: Math.round(rgb[0]),\n g: Math.round(rgb[1]),\n b: Math.round(rgb[2]),\n a: 1,\n };\n }\n },\n haveIntersection(r1, r2) {\n return !(r2.x > r1.x + r1.width ||\n r2.x + r2.width < r1.x ||\n r2.y > r1.y + r1.height ||\n r2.y + r2.height < r1.y);\n },\n cloneObject(obj) {\n const retObj = {};\n for (const key in obj) {\n if (this._isPlainObject(obj[key])) {\n retObj[key] = this.cloneObject(obj[key]);\n }\n else if (this._isArray(obj[key])) {\n retObj[key] = this.cloneArray(obj[key]);\n }\n else {\n retObj[key] = obj[key];\n }\n }\n return retObj;\n },\n cloneArray(arr) {\n return arr.slice(0);\n },\n degToRad(deg) {\n return deg * PI_OVER_DEG180;\n },\n radToDeg(rad) {\n return rad * DEG180_OVER_PI;\n },\n _degToRad(deg) {\n exports.Util.warn('Util._degToRad is removed. Please use public Util.degToRad instead.');\n return exports.Util.degToRad(deg);\n },\n _radToDeg(rad) {\n exports.Util.warn('Util._radToDeg is removed. Please use public Util.radToDeg instead.');\n return exports.Util.radToDeg(rad);\n },\n _getRotation(radians) {\n return Global_1.Konva.angleDeg ? exports.Util.radToDeg(radians) : radians;\n },\n _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n },\n throw(str) {\n throw new Error(KONVA_ERROR + str);\n },\n error(str) {\n console.error(KONVA_ERROR + str);\n },\n warn(str) {\n if (!Global_1.Konva.showWarnings) {\n return;\n }\n console.warn(KONVA_WARNING + str);\n },\n each(obj, func) {\n for (const key in obj) {\n func(key, obj[key]);\n }\n },\n _inRange(val, left, right) {\n return left <= val && val < right;\n },\n _getProjectionToSegment(x1, y1, x2, y2, x3, y3) {\n let x, y, dist;\n const pd2 = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);\n if (pd2 == 0) {\n x = x1;\n y = y1;\n dist = (x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2);\n }\n else {\n const u = ((x3 - x1) * (x2 - x1) + (y3 - y1) * (y2 - y1)) / pd2;\n if (u < 0) {\n x = x1;\n y = y1;\n dist = (x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3);\n }\n else if (u > 1.0) {\n x = x2;\n y = y2;\n dist = (x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3);\n }\n else {\n x = x1 + u * (x2 - x1);\n y = y1 + u * (y2 - y1);\n dist = (x - x3) * (x - x3) + (y - y3) * (y - y3);\n }\n }\n return [x, y, dist];\n },\n _getProjectionToLine(pt, line, isClosed) {\n const pc = exports.Util.cloneObject(pt);\n let dist = Number.MAX_VALUE;\n line.forEach(function (p1, i) {\n if (!isClosed && i === line.length - 1) {\n return;\n }\n const p2 = line[(i + 1) % line.length];\n const proj = exports.Util._getProjectionToSegment(p1.x, p1.y, p2.x, p2.y, pt.x, pt.y);\n const px = proj[0], py = proj[1], pdist = proj[2];\n if (pdist < dist) {\n pc.x = px;\n pc.y = py;\n dist = pdist;\n }\n });\n return pc;\n },\n _prepareArrayForTween(startArray, endArray, isClosed) {\n const start = [], end = [];\n if (startArray.length > endArray.length) {\n const temp = endArray;\n endArray = startArray;\n startArray = temp;\n }\n for (let n = 0; n < startArray.length; n += 2) {\n start.push({\n x: startArray[n],\n y: startArray[n + 1],\n });\n }\n for (let n = 0; n < endArray.length; n += 2) {\n end.push({\n x: endArray[n],\n y: endArray[n + 1],\n });\n }\n const newStart = [];\n end.forEach(function (point) {\n const pr = exports.Util._getProjectionToLine(point, start, isClosed);\n newStart.push(pr.x);\n newStart.push(pr.y);\n });\n return newStart;\n },\n _prepareToStringify(obj) {\n let desc;\n obj.visitedByCircularReferenceRemoval = true;\n for (const key in obj) {\n if (!(obj.hasOwnProperty(key) && obj[key] && typeof obj[key] == 'object')) {\n continue;\n }\n desc = Object.getOwnPropertyDescriptor(obj, key);\n if (obj[key].visitedByCircularReferenceRemoval ||\n exports.Util._isElement(obj[key])) {\n if (desc.configurable) {\n delete obj[key];\n }\n else {\n return null;\n }\n }\n else if (exports.Util._prepareToStringify(obj[key]) === null) {\n if (desc.configurable) {\n delete obj[key];\n }\n else {\n return null;\n }\n }\n }\n delete obj.visitedByCircularReferenceRemoval;\n return obj;\n },\n _assign(target, source) {\n for (const key in source) {\n target[key] = source[key];\n }\n return target;\n },\n _getFirstPointerId(evt) {\n if (!evt.touches) {\n return evt.pointerId || 999;\n }\n else {\n return evt.changedTouches[0].identifier;\n }\n },\n releaseCanvas(...canvases) {\n if (!Global_1.Konva.releaseCanvasOnDestroy)\n return;\n canvases.forEach((c) => {\n c.width = 0;\n c.height = 0;\n });\n },\n drawRoundedRectPath(context, width, height, cornerRadius) {\n let topLeft = 0;\n let topRight = 0;\n let bottomLeft = 0;\n let bottomRight = 0;\n if (typeof cornerRadius === 'number') {\n topLeft =\n topRight =\n bottomLeft =\n bottomRight =\n Math.min(cornerRadius, width / 2, height / 2);\n }\n else {\n topLeft = Math.min(cornerRadius[0] || 0, width / 2, height / 2);\n topRight = Math.min(cornerRadius[1] || 0, width / 2, height / 2);\n bottomRight = Math.min(cornerRadius[2] || 0, width / 2, height / 2);\n bottomLeft = Math.min(cornerRadius[3] || 0, width / 2, height / 2);\n }\n context.moveTo(topLeft, 0);\n context.lineTo(width - topRight, 0);\n context.arc(width - topRight, topRight, topRight, (Math.PI * 3) / 2, 0, false);\n context.lineTo(width, height - bottomRight);\n context.arc(width - bottomRight, height - bottomRight, bottomRight, 0, Math.PI / 2, false);\n context.lineTo(bottomLeft, height);\n context.arc(bottomLeft, height - bottomLeft, bottomLeft, Math.PI / 2, Math.PI, false);\n context.lineTo(0, topLeft);\n context.arc(topLeft, topLeft, topLeft, Math.PI, (Math.PI * 3) / 2, false);\n },\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RGBComponent = RGBComponent;\nexports.alphaComponent = alphaComponent;\nexports.getNumberValidator = getNumberValidator;\nexports.getNumberOrArrayOfNumbersValidator = getNumberOrArrayOfNumbersValidator;\nexports.getNumberOrAutoValidator = getNumberOrAutoValidator;\nexports.getStringValidator = getStringValidator;\nexports.getStringOrGradientValidator = getStringOrGradientValidator;\nexports.getFunctionValidator = getFunctionValidator;\nexports.getNumberArrayValidator = getNumberArrayValidator;\nexports.getBooleanValidator = getBooleanValidator;\nexports.getComponentValidator = getComponentValidator;\nconst Global_1 = require(\"./Global\");\nconst Util_1 = require(\"./Util\");\nfunction _formatValue(val) {\n if (Util_1.Util._isString(val)) {\n return '\"' + val + '\"';\n }\n if (Object.prototype.toString.call(val) === '[object Number]') {\n return val;\n }\n if (Util_1.Util._isBoolean(val)) {\n return val;\n }\n return Object.prototype.toString.call(val);\n}\nfunction RGBComponent(val) {\n if (val > 255) {\n return 255;\n }\n else if (val < 0) {\n return 0;\n }\n return Math.round(val);\n}\nfunction alphaComponent(val) {\n if (val > 1) {\n return 1;\n }\n else if (val < 0.0001) {\n return 0.0001;\n }\n return val;\n}\nfunction getNumberValidator() {\n if (Global_1.Konva.isUnminified) {\n return function (val, attr) {\n if (!Util_1.Util._isNumber(val)) {\n Util_1.Util.warn(_formatValue(val) +\n ' is a not valid value for \"' +\n attr +\n '\" attribute. The value should be a number.');\n }\n return val;\n };\n }\n}\nfunction getNumberOrArrayOfNumbersValidator(noOfElements) {\n if (Global_1.Konva.isUnminified) {\n return function (val, attr) {\n let isNumber = Util_1.Util._isNumber(val);\n let isValidArray = Util_1.Util._isArray(val) && val.length == noOfElements;\n if (!isNumber && !isValidArray) {\n Util_1.Util.warn(_formatValue(val) +\n ' is a not valid value for \"' +\n attr +\n '\" attribute. The value should be a number or Array<number>(' +\n noOfElements +\n ')');\n }\n return val;\n };\n }\n}\nfunction getNumberOrAutoValidator() {\n if (Global_1.Konva.isUnminified) {\n return function (val, attr) {\n var isNumber = Util_1.Util._isNumber(val);\n var isAuto = val === 'auto';\n if (!(isNumber || isAuto)) {\n Util_1.Util.warn(_formatValue(val) +\n ' is a not valid value for \"' +\n attr +\n '\" attribute. The value should be a number or \"auto\".');\n }\n return val;\n };\n }\n}\nfunction getStringValidator() {\n if (Global_1.Konva.isUnminified) {\n return function (val, attr) {\n if (!Util_1.Util._isString(val)) {\n Util_1.Util.warn(_formatValue(val) +\n ' is a not valid value for \"' +\n attr +\n '\" attribute. The value should be a string.');\n }\n return val;\n };\n }\n}\nfunction getStringOrGradientValidator() {\n if (Global_1.Konva.isUnminified) {\n return function (val, attr) {\n const isString = Util_1.Util._isString(val);\n const isGradient = Object.prototype.toString.call(val) === '[object CanvasGradient]' ||\n (val && val['addColorStop']);\n if (!(isString || isGradient)) {\n Util_1.Util.warn(_formatValue(val) +\n ' is a not valid value for \"' +\n attr +\n '\" attribute. The value should be a string or a native gradient.');\n }\n return val;\n };\n }\n}\nfunction getFunctionValidator() {\n if (Global_1.Konva.isUnminified) {\n return function (val, attr) {\n if (!Util_1.Util._isFunction(val)) {\n Util_1.Util.warn(_formatValue(val) +\n ' is a not valid value for \"' +\n attr +\n '\" attribute. The value should be a function.');\n }\n return val;\n };\n }\n}\nfunction getNumberArrayValidator() {\n if (Global_1.Konva.isUnminified) {\n return function (val, attr) {\n const TypedArray = Int8Array ? Object.getPrototypeOf(Int8Array) : null;\n if (TypedArray && val instanceof TypedArray) {\n return val;\n }\n if (!Util_1.Util._isArray(val)) {\n Util_1.Util.warn(_formatValue(val) +\n ' is a not valid value for \"' +\n attr +\n '\" attribute. The value should be a array of numbers.');\n }\n else {\n val.forEach(function (item) {\n if (!Util_1.Util._isNumber(item)) {\n Util_1.Util.warn('\"' +\n attr +\n '\" attribute has non numeric element ' +\n item +\n '. Make sure that all elements are numbers.');\n }\n });\n }\n return val;\n };\n }\n}\nfunction getBooleanValidator() {\n if (Global_1.Konva.isUnminified) {\n return function (val, attr) {\n var isBool = val === true || val === false;\n if (!isBool) {\n Util_1.Util.warn(_formatValue(val) +\n ' is a not valid value for \"' +\n attr +\n '\" attribute. The value should be a boolean.');\n }\n return val;\n };\n }\n}\nfunction getComponentValidator(components) {\n if (Global_1.Konva.isUnminified) {\n return function (val, attr) {\n if (val === undefined || val === null) {\n return val;\n }\n if (!Util_1.Util.isObject(val)) {\n Util_1.Util.warn(_formatValue(val) +\n ' is a not valid value for \"' +\n attr +\n '\" attribute. The value should be an object with properties ' +\n components);\n }\n return val;\n };\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Factory = void 0;\nconst Util_1 = require(\"./Util\");\nconst Validators_1 = require(\"./Validators\");\nconst GET = 'get';\nconst SET = 'set';\nexports.Factory = {\n addGetterSetter(constructor, attr, def, validator, after) {\n exports.Factory.addGetter(constructor, attr, def);\n exports.Factory.addSetter(constructor, attr, validator, after);\n exports.Factory.addOverloadedGetterSetter(constructor, attr);\n },\n addGetter(constructor, attr, def) {\n var method = GET + Util_1.Util._capitalize(attr);\n constructor.prototype[method] =\n constructor.prototype[method] ||\n function () {\n const val = this.attrs[attr];\n return val === undefined ? def : val;\n };\n },\n addSetter(constructor, attr, validator, after) {\n var method = SET + Util_1.Util._capitalize(attr);\n if (!constructor.prototype[method]) {\n exports.Factory.overWriteSetter(constructor, attr, validator, after);\n }\n },\n overWriteSetter(constructor, attr, validator, after) {\n var method = SET + Util_1.Util._capitalize(attr);\n constructor.prototype[method] = function (val) {\n if (validator && val !== undefined && val !== null) {\n val = validator.call(this, val, attr);\n }\n this._setAttr(attr, val);\n if (after) {\n after.call(this);\n }\n return this;\n };\n },\n addComponentsGetterSetter(constructor, attr, components, validator, after) {\n const len = components.length, capitalize = Util_1.Util._capitalize, getter = GET + capitalize(attr), setter = SET + capitalize(attr);\n constructor.prototype[getter] = function () {\n const ret = {};\n for (let n = 0; n < len; n++) {\n const component = components[n];\n ret[component] = this.getAttr(attr + capitalize(component));\n }\n return ret;\n };\n const basicValidator = (0, Validators_1.getComponentValidator)(components);\n constructor.prototype[setter] = function (val) {\n const oldVal = this.attrs[attr];\n if (validator) {\n val = validator.call(this, val, attr);\n }\n if (basicValidator) {\n basicValidator.call(this, val, attr);\n }\n for (const key in val) {\n if (!val.hasOwnProperty(key)) {\n continue;\n }\n this._setAttr(attr + capitalize(key), val[key]);\n }\n if (!val) {\n components.forEach((component) => {\n this._setAttr(attr + capitalize(component), undefined);\n });\n }\n this._fireChangeEvent(attr, oldVal, val);\n if (after) {\n after.call(this);\n }\n return this;\n };\n exports.Factory.addOverloadedGetterSetter(constructor, attr);\n },\n addOverloadedGetterSetter(constructor, attr) {\n var capitalizedAttr = Util_1.Util._capitalize(attr), setter = SET + capitalizedAttr, getter = GET + capitalizedAttr;\n constructor.prototype[attr] = function () {\n if (arguments.length) {\n this[setter](arguments[0]);\n return this;\n }\n return this[getter]();\n };\n },\n addDeprecatedGetterSetter(constructor, attr, def, validator) {\n Util_1.Util.error('Adding deprecated ' + attr);\n const method = GET + Util_1.Util._capitalize(attr);\n const message = attr +\n ' property is deprecated and will be removed soon. Look at Konva change log for more information.';\n constructor.prototype[method] = function () {\n Util_1.Util.error(message);\n const val = this.attrs[attr];\n return val === undefined ? def : val;\n };\n exports.Factory.addSetter(constructor, attr, validator, function () {\n Util_1.Util.error(message);\n });\n exports.Factory.addOverloadedGetterSetter(constructor, attr);\n },\n backCompat(constructor, methods) {\n Util_1.Util.each(methods, function (oldMethodName, newMethodName) {\n const method = constructor.prototype[newMethodName];\n const oldGetter = GET + Util_1.Util._capitalize(oldMethodName);\n const oldSetter = SET + Util_1.Util._capitalize(oldMethodName);\n function deprecated() {\n method.apply(this, arguments);\n Util_1.Util.error('\"' +\n oldMethodName +\n '\" method is deprecated and will be removed soon. Use \"\"' +\n newMethodName +\n '\" instead.');\n }\n constructor.prototype[oldMethodName] = deprecated;\n constructor.prototype[oldGetter] = deprecated;\n constructor.prototype[oldSetter] = deprecated;\n });\n },\n afterSetFilter() {\n this._filterUpToDate = false;\n },\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HitContext = exports.SceneContext = exports.Context = void 0;\nconst Util_1 = require(\"./Util\");\nconst Global_1 = require(\"./Global\");\nfunction simplifyArray(arr) {\n const retArr = [], len = arr.length, util = Util_1.Util;\n for (let n = 0; n < len; n++) {\n let val = arr[n];\n if (util._isNumber(val)) {\n val = Math.round(val * 1000) / 1000;\n }\n else if (!util._isString(val)) {\n val = val + '';\n }\n retArr.push(val);\n }\n return retArr;\n}\nconst COMMA = ',', OPEN_PAREN = '(', CLOSE_PAREN = ')', OPEN_PAREN_BRACKET = '([', CLOSE_BRACKET_PAREN = '])', SEMICOLON = ';', DOUBLE_PAREN = '()', EQUALS = '=', CONTEXT_METHODS = [\n 'arc',\n 'arcTo',\n 'beginPath',\n 'bezierCurveTo',\n 'clearRect',\n 'clip',\n 'closePath',\n 'createLinearGradient',\n 'createPattern',\n 'createRadialGradient',\n 'drawImage',\n 'ellipse',\n 'fill',\n 'fillText',\n 'getImageData',\n 'createImageData',\n 'lineTo',\n 'moveTo',\n 'putImageData',\n 'quadraticCurveTo',\n 'rect',\n 'roundRect',\n 'restore',\n 'rotate',\n 'save',\n 'scale',\n 'setLineDash',\n 'setTransform',\n 'stroke',\n 'strokeText',\n 'transform',\n 'translate',\n];\nconst CONTEXT_PROPERTIES = [\n 'fillStyle',\n 'strokeStyle',\n 'shadowColor',\n 'shadowBlur',\n 'shadowOffsetX',\n 'shadowOffsetY',\n 'letterSpacing',\n 'lineCap',\n 'lineDashOffset',\n 'lineJoin',\n 'lineWidth',\n 'miterLimit',\n 'direction',\n 'font',\n 'textAlign',\n 'textBaseline',\n 'globalAlpha',\n 'globalCompositeOperation',\n 'imageSmoothingEnabled',\n];\nconst traceArrMax = 100;\nclass Context {\n constructor(canvas) {\n this.canvas = canvas;\n if (Global_1.Konva.enableTrace) {\n this.traceArr = [];\n this._enableTrace();\n }\n }\n fillShape(shape) {\n if (shape.fillEnabled()) {\n this._fill(shape);\n }\n }\n _fill(shape) {\n }\n strokeShape(shape) {\n if (shape.hasStroke()) {\n this._stroke(shape);\n }\n }\n _stroke(shape) {\n }\n fillStrokeShape(shape) {\n if (shape.attrs.fillAfterStrokeEnabled) {\n this.strokeShape(shape);\n this.fillShape(shape);\n }\n else {\n this.fillShape(shape);\n this.strokeShape(shape);\n }\n }\n getTrace(relaxed, rounded) {\n let traceArr = this.traceArr, len = traceArr.length, str = '', n, trace, method, args;\n for (n = 0; n < len; n++) {\n trace = traceArr[n];\n method = trace.method;\n if (method) {\n args = trace.args;\n str += method;\n if (relaxed) {\n str += DOUBLE_PAREN;\n }\n else {\n if (Util_1.Util._isArray(args[0])) {\n str += OPEN_PAREN_BRACKET + args.join(COMMA) + CLOSE_BRACKET_PAREN;\n }\n else {\n if (rounded) {\n args = args.map((a) => typeof a === 'number' ? Math.floor(a) : a);\n }\n str += OPEN_PAREN + args.join(COMMA) + CLOSE_PAREN;\n }\n }\n }\n else {\n str += trace.property;\n if (!relaxed) {\n str += EQUALS + trace.val;\n }\n }\n str += SEMICOLON;\n }\n return str;\n }\n clearTrace() {\n this.traceArr = [];\n }\n _trace(str) {\n let traceArr = this.traceArr, len;\n traceArr.push(str);\n len = traceArr.length;\n if (len >= traceArrMax) {\n traceArr.shift();\n }\n }\n reset() {\n const pixelRatio = this.getCanvas().getPixelRatio();\n this.setTransform(1 * pixelRatio, 0, 0, 1 * pixelRatio, 0, 0);\n }\n getCanvas() {\n return this.canvas;\n }\n clear(bounds) {\n const canvas = this.getCanvas();\n if (bounds) {\n this.clearRect(bounds.x || 0, bounds.y || 0, bounds.width || 0, bounds.height || 0);\n }\n else {\n this.clearRect(0, 0, canvas.getWidth() / canvas.pixelRatio, canvas.getHeight() / canvas.pixelRatio);\n }\n }\n _applyLineCap(shape) {\n const lineCap = shape.attrs.lineCap;\n if (lineCap) {\n this.setAttr('lineCap', lineCap);\n }\n }\n _applyOpacity(shape) {\n const absOpacity = shape.getAbsoluteOpacity();\n if (absOpacity !== 1) {\n this.setAttr('globalAlpha', absOpacity);\n }\n }\n _applyLineJoin(shape) {\n const lineJoin = shape.attrs.lineJoin;\n if (lineJoin) {\n this.setAttr('lineJoin', lineJoin);\n }\n }\n setAttr(attr, val) {\n this._context[attr] = val;\n }\n arc(x, y, radius, startAngle, endAngle, counterClockwise) {\n this._context.arc(x, y, radius, startAngle, endAngle, counterClockwise);\n }\n arcTo(x1, y1, x2, y2, radius) {\n this._context.arcTo(x1, y1, x2, y2, radius);\n }\n beginPath() {\n this._context.beginPath();\n }\n bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n this._context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n }\n clearRect(x, y, width, height) {\n this._context.clearRect(x, y, width, height);\n }\n clip(...args) {\n this._context.clip.apply(this._context, args);\n }\n closePath() {\n this._context.closePath();\n }\n createImageData(width, height) {\n const a = arguments;\n if (a.length === 2) {\n return this._context.createImageData(width, height);\n }\n else if (a.length === 1) {\n return this._context.createImageData(width);\n }\n }\n createLinearGradient(x0, y0, x1, y1) {\n return this._context.createLinearGradient(x0, y0, x1, y1);\n }\n createPattern(image, repetition) {\n return this._context.createPattern(image, repetition);\n }\n createRadialGradient(x0, y0, r0, x1, y1, r1) {\n return this._context.createRadialGradient(x0, y0, r0, x1, y1, r1);\n }\n drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) {\n const a = arguments, _context = this._context;\n if (a.length === 3) {\n _context.drawImage(image, sx, sy);\n }\n else if (a.length === 5) {\n _context.drawImage(image, sx, sy, sWidth, sHeight);\n }\n else if (a.length === 9) {\n _context.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);\n }\n }\n ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, counterclockwise) {\n this._context.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, counterclockwise);\n }\n isPointInPath(x, y, path, fillRule) {\n if (path) {\n return this._context.isPointInPath(path, x, y, fillRule);\n }\n return this._context.isPointInPath(x, y, fillRule);\n }\n fill(...args) {\n this._context.fill.apply(this._context, args);\n }\n fillRect(x, y, width, height) {\n this._context.fillRect(x, y, width, height);\n }\n strokeRect(x, y, width, height) {\n this._context.strokeRect(x, y, width, height);\n }\n fillText(text, x, y, maxWidth) {\n if (maxWidth) {\n this._context.fillText(text, x, y, maxWidth);\n }\n else {\n this._context.fillText(text, x, y);\n }\n }\n measureText(text) {\n return this._context.measureText(text);\n }\n getImageData(sx, sy, sw, sh) {\n return this._context.getImageData(sx, sy, sw, sh);\n }\n lineTo(x, y) {\n this._context.lineTo(x, y);\n }\n moveTo(x, y) {\n this._context.moveTo(x, y);\n }\n rect(x, y, width, height) {\n this._context.rect(x, y, width, height);\n }\n roundRect(x, y, width, height, radii) {\n this._context.roundRect(x, y, width, height, radii);\n }\n putImageData(imageData, dx, dy) {\n this._context.putImageData(imageData, dx, dy);\n }\n quadraticCurveTo(cpx, cpy, x, y) {\n this._context.quadraticCurveTo(cpx, cpy, x, y);\n }\n restore() {\n this._context.restore();\n }\n rotate(angle) {\n this._context.rotate(angle);\n }\n save() {\n this._context.save();\n }\n scale(x, y) {\n this._context.scale(x, y);\n }\n setLineDash(segments) {\n if (this._context.setLineDash) {\n this._context.setLineDash(segments);\n }\n else if ('mozDash' in this._context) {\n this._context['mozDash'] = segments;\n }\n else if ('webkitLineDash' in this._context) {\n this._context['webkitLineDash'] = segments;\n }\n }\n getLineDash() {\n return this._context.getLineDash();\n }\n setTransform(a, b, c, d, e, f) {\n this._context.setTransform(a, b, c, d, e, f);\n }\n stroke(path2d) {\n if (path2d) {\n this._context.stroke(path2d);\n }\n else {\n this._context.stroke();\n }\n }\n strokeText(text, x, y, maxWidth) {\n this._context.strokeText(text, x, y, maxWidth);\n }\n transform(a, b, c, d, e, f) {\n this._context.transform(a, b, c, d, e, f);\n }\n translate(x, y) {\n this._context.translate(x, y);\n }\n _enableTrace() {\n let that = this, len = CONTEXT_METHODS.length, origSetter = this.setAttr, n, args;\n const func = function (methodName) {\n let origMethod = that[methodName], ret;\n that[methodName] = function () {\n args = simplifyArray(Array.prototype.slice.call(arguments, 0));\n ret = origMethod.apply(that, arguments);\n that._trace({\n method: methodName,\n args: args,\n });\n return ret;\n };\n };\n for (n = 0; n < len; n++) {\n func(CONTEXT_METHODS[n]);\n }\n that.setAttr = function () {\n origSetter.apply(that, arguments);\n const prop = arguments[0];\n let val = arguments[1];\n if (prop === 'shadowOffsetX' ||\n prop === 'shadowOffsetY' ||\n prop === 'shadowBlur') {\n val = val / this.canvas.getPixelRatio();\n }\n that._trace({\n property: prop,\n val: val,\n });\n };\n }\n _applyGlobalCompositeOperation(node) {\n const op = node.attrs.globalCompositeOperation;\n const def = !op || op === 'source-over';\n if (!def) {\n this.setAttr('globalCompositeOperation', op);\n }\n }\n}\nexports.Context = Context;\nCONTEXT_PROPERTIES.forEach(function (prop) {\n Object.defineProperty(Context.prototype, prop, {\n get() {\n return this._context[prop];\n },\n set(val) {\n this._context[prop] = val;\n },\n });\n});\nclass SceneContext extends Context {\n constructor(canvas, { willReadFrequently = false } = {}) {\n super(canvas);\n this._context = canvas._canvas.getContext('2d', {\n willReadFrequently,\n });\n }\n _fillColor(shape) {\n const fill = shape.fill();\n this.setAttr('fillStyle', fill);\n shape._fillFunc(this);\n }\n _fillPattern(shape) {\n this.setAttr('fillStyle', shape._getFillPattern());\n shape._fillFunc(this);\n }\n _fillLinearGradient(shape) {\n const grd = shape._getLinearGradient();\n if (grd) {\n this.setAttr('fillStyle', grd);\n shape._fillFunc(this);\n }\n }\n _fillRadialGradient(shape) {\n const grd = shape._getRadialGradient();\n if (grd) {\n this.setAttr('fillStyle', grd);\n shape._fillFunc(this);\n }\n }\n _fill(shape) {\n const hasColor = shape.fill(), fillPriority = shape.getFillPriority();\n if (hasColor && fillPriority === 'color') {\n this._fillColor(shape);\n return;\n }\n const hasPattern = shape.getFillPatternImage();\n if (hasPattern && fillPriority === 'pattern') {\n this._fillPattern(shape);\n return;\n }\n const hasLinearGradient = shape.getFillLinearGradientColorStops();\n if (hasLinearGradient && fillPriority === 'linear-gradient') {\n this._fillLinearGradient(shape);\n return;\n }\n const hasRadialGradient = shape.getFillRadialGradientColorStops();\n if (hasRadialGradient && fillPriority === 'radial-gradient') {\n this._fillRadialGradient(shape);\n return;\n }\n if (hasColor) {\n this._fillColor(shape);\n }\n else if (hasPattern) {\n this._fillPattern(shape);\n }\n else if (hasLinearGradient) {\n this._fillLinearGradient(shape);\n }\n else if (hasRadialGradient) {\n this._fillRadialGradient(shape);\n }\n }\n _strokeLinearGradient(shape) {\n const start = shape.getStrokeLinearGradientStartPoint(), end = shape.getStrokeLinearGradientEndPoint(), colorStops = shape.getStrokeLinearGradientColorStops(), grd = this.createLinearGradient(start.x, start.y, end.x, end.y);\n if (colorStops) {\n for (let n = 0; n < colorStops.length; n += 2) {\n grd.addColorStop(colorStops[n], colorStops[n + 1]);\n }\n this.setAttr('strokeStyle', grd);\n }\n }\n _stroke(shape) {\n const dash = shape.dash(), strokeScaleEnabled = shape.getStrokeScaleEnabled();\n if (shape.hasStroke()) {\n if (!strokeScaleEnabled) {\n this.save();\n const pixelRatio = this.getCanvas().getPixelRatio();\n this.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n }\n this._applyLineCap(shape);\n if (dash && shape.dashEnabled()) {\n this.setLineDash(dash);\n this.setAttr('lineDashOffset', shape.dashOffset());\n }\n this.setAttr('lineWidth', shape.strokeWidth());\n if (!shape.getShadowForStrokeEnabled()) {\n this.setAttr('shadowColor', 'rgba(0,0,0,0)');\n }\n const hasLinearGradient = shape.getStrokeLinearGradientColorStops();\n if (hasLinearGradient) {\n this._strokeLinearGradient(shape);\n }\n else {\n this.setAttr('strokeStyle', shape.stroke());\n }\n shape._strokeFunc(this);\n if (!strokeScaleEnabled) {\n this.restore();\n }\n }\n }\n _applyShadow(shape) {\n var _a, _b, _c;\n const color = (_a = shape.getShadowRGBA()) !== null && _a !== void 0 ? _a : 'black', blur = (_b = shape.getShadowBlur()) !== null && _b !== void 0 ? _b : 5, offset = (_c = shape.getShadowOffset()) !== null && _c !== void 0 ? _c : {\n x: 0,\n y: 0,\n }, scale = shape.getAbsoluteScale(), ratio = this.canvas.getPixelRatio(), scaleX = scale.x * ratio, scaleY = scale.y * ratio;\n this.setAttr('shadowColor', color);\n this.setAttr('shadowBlur', blur * Math.min(Math.abs(scaleX), Math.abs(scaleY)));\n this.setAttr('shadowOffsetX', offset.x * scaleX);\n this.setAttr('shadowOffsetY', offset.y * scaleY);\n }\n}\nexports.SceneContext = SceneContext;\nclass HitContext extends Context {\n constructor(canvas) {\n super(canvas);\n this._context = canvas._canvas.getContext('2d', {\n willReadFrequently: true,\n });\n }\n _fill(shape) {\n this.save();\n this.setAttr('fillStyle', shape.colorKey);\n shape._fillFuncHit(this);\n this.restore();\n }\n strokeShape(shape) {\n if (shape.hasHitStroke()) {\n this._stroke(shape);\n }\n }\n _stroke(shape) {\n if (shape.hasHitStroke()) {\n const strokeScaleEnabled = shape.getStrokeScaleEnabled();\n if (!strokeScaleEnabled) {\n this.save();\n const pixelRatio = this.getCanvas().getPixelRatio();\n this.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n }\n this._applyLineCap(shape);\n const hitStrokeWidth = shape.hitStrokeWidth();\n const strokeWidth = hitStrokeWidth === 'auto' ? shape.strokeWidth() : hitStrokeWidth;\n this.setAttr('lineWidth', strokeWidth);\n this.setAttr('strokeStyle', shape.colorKey);\n shape._strokeFuncHit(this);\n if (!strokeScaleEnabled) {\n this.restore();\n }\n }\n }\n}\nexports.HitContext = HitContext;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HitCanvas = exports.SceneCanvas = exports.Canvas = void 0;\nconst Util_1 = require(\"./Util\");\nconst Context_1 = require(\"./Context\");\nconst Global_1 = require(\"./Global\");\nconst Factory_1 = require(\"./Factory\");\nconst Validators_1 = require(\"./Validators\");\nlet _pixelRatio;\nfunction getDevicePixelRatio() {\n if (_pixelRatio) {\n return _pixelRatio;\n }\n const canvas = Util_1.Util.createCanvasElement();\n const context = canvas.getContext('2d');\n _pixelRatio = (function () {\n const devicePixelRatio = Global_1.Konva._global.devicePixelRatio || 1, backingStoreRatio = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio ||\n 1;\n return devicePixelRatio / backingStoreRatio;\n })();\n Util_1.Util.releaseCanvas(canvas);\n return _pixelRatio;\n}\nclass Canvas {\n constructor(config) {\n this.pixelRatio = 1;\n this.width = 0;\n this.height = 0;\n this.isCache = false;\n const conf = config || {};\n const pixelRatio = conf.pixelRatio || Global_1.Konva.pixelRatio || getDevicePixelRatio();\n this.pixelRatio = pixelRatio;\n this._canvas = Util_1.Util.createCanvasElement();\n this._canvas.style.padding = '0';\n this._canvas.style.margin = '0';\n this._canvas.style.border = '0';\n this._canvas.style.background = 'transparent';\n this._canvas.style.position = 'absolute';\n this._canvas.style.top = '0';\n this._canvas.style.left = '0';\n }\n getContext() {\n return this.context;\n }\n getPixelRatio() {\n return this.pixelRatio;\n }\n setPixelRatio(pixelRatio) {\n const previousRatio = this.pixelRatio;\n this.pixelRatio = pixelRatio;\n this.setSize(this.getWidth() / previousRatio, this.getHeight() / previousRatio);\n }\n setWidth(width) {\n this.width = this._canvas.width = width * this.pixelRatio;\n this._canvas.style.width = width + 'px';\n const pixelRatio = this.pixelRatio, _context = this.getContext()._context;\n _context.scale(pixelRatio, pixelRatio);\n }\n setHeight(height) {\n this.height = this._canvas.height = height * this.pixelRatio;\n this._canvas.style.height = height + 'px';\n const pixelRatio = this.pixelRatio, _context = this.getContext()._context;\n _context.scale(pixelRatio, pixelRatio);\n }\n getWidth() {\n return this.width;\n }\n getHeight() {\n return this.height;\n }\n setSize(width, height) {\n this.setWidth(width || 0);\n this.setHeight(height || 0);\n }\n toDataURL(mimeType, quality) {\n try {\n return this._canvas.toDataURL(mimeType, quality);\n }\n catch (e) {\n try {\n return this._canvas.toDataURL();\n }\n catch (err) {\n Util_1.Util.error('Unable to get data URL. ' +\n err.message +\n ' For more info read https://konvajs.org/docs/posts/Tainted_Canvas.html.');\n return '';\n }\n }\n }\n}\nexports.Canvas = Canvas;\nFactory_1.Factory.addGetterSetter(Canvas, 'pixelRatio', undefined, (0, Validators_1.getNumberValidator)());\nclass SceneCanvas extends Canvas {\n constructor(config = { width: 0, height: 0, willReadFrequently: false }) {\n super(config);\n this.context = new Context_1.SceneContext(this, {\n willReadFrequently: config.willReadFrequently,\n });\n this.setSize(config.width, config.height);\n }\n}\nexports.SceneCanvas = SceneCanvas;\nclass HitCanvas extends Canvas {\n constructor(config = { width: 0, height: 0 }) {\n super(config);\n this.hitCanvas = true;\n this.context = new Context_1.HitContext(this);\n this.setSize(config.width, config.height);\n }\n}\nexports.HitCanvas = HitCanvas;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DD = void 0;\nconst Global_1 = require(\"./Global\");\nconst Util_1 = require(\"./Util\");\nexports.DD = {\n get isDragging() {\n let flag = false;\n exports.DD._dragElements.forEach((elem) => {\n if (elem.dragStatus === 'dragging') {\n flag = true;\n }\n });\n return flag;\n },\n justDragged: false,\n get node() {\n let node;\n exports.DD._dragElements.forEach((elem) => {\n node = elem.node;\n });\n return node;\n },\n _dragElements: new Map(),\n _drag(evt) {\n const nodesToFireEvents = [];\n exports.DD._dragElements.forEach((elem, key) => {\n const { node } = elem;\n const stage = node.getStage();\n stage.setPointersPositions(evt);\n if (elem.pointerId === undefined) {\n elem.pointerId = Util_1.Util._getFirstPointerId(evt);\n }\n const pos = stage._changedPointerPositions.find((pos) => pos.id === elem.pointerId);\n if (!pos) {\n return;\n }\n if (elem.dragStatus !== 'dragging') {\n const dragDistance = node.dragDistance();\n const distance = Math.max(Math.abs(pos.x - elem.startPointerPos.x), Math.abs(pos.y - elem.startPointerPos.y));\n if (distance < dragDistance) {\n return;\n }\n node.startDrag({ evt });\n if (!node.isDragging()) {\n return;\n }\n }\n node._setDragPosition(evt, elem);\n nodesToFireEvents.push(node);\n });\n nodesToFireEvents.forEach((node) => {\n node.fire('dragmove', {\n type: 'dragmove',\n target: node,\n evt: evt,\n }, true);\n });\n },\n _endDragBefore(evt) {\n const drawNodes = [];\n exports.DD._dragElements.forEach((elem) => {\n const { node } = elem;\n const stage = node.getStage();\n if (evt) {\n stage.setPointersPositions(evt);\n }\n const pos = stage._changedPointerPositions.find((pos) => pos.id === elem.pointerId);\n if (!pos) {\n return;\n }\n if (elem.dragStatus === 'dragging' || elem.dragStatus === 'stopped') {\n exports.DD.justDragged = true;\n Global_1.Konva._mouseListenClick = false;\n Global_1.Konva._touchListenClick = false;\n Global_1.Konva._pointerListenClick = false;\n elem.dragStatus = 'stopped';\n }\n const drawNode = elem.node.getLayer() ||\n (elem.node instanceof Global_1.Konva['Stage'] && elem.node);\n if (drawNode && drawNodes.indexOf(drawNode) === -1) {\n drawNodes.push(drawNode);\n }\n });\n drawNodes.forEach((drawNode) => {\n drawNode.draw();\n });\n },\n _endDragAfter(evt) {\n exports.DD._dragElements.forEach((elem, key) => {\n if (elem.dragStatus === 'stopped') {\n elem.node.fire('dragend', {\n type: 'dragend',\n target: elem.node,\n evt: evt,\n }, true);\n }\n if (elem.dragStatus !== 'dragging') {\n exports.DD._dragElements.delete(key);\n }\n });\n },\n};\nif (Global_1.Konva.isBrowser) {\n window.addEventListener('mouseup', exports.DD._endDragBefore, true);\n window.addEventListener('touchend', exports.DD._endDragBefore, true);\n window.addEventListener('touchcancel', exports.DD._endDragBefore, true);\n window.addEventListener('mousemove', exports.DD._drag);\n window.addEventListener('touchmove', exports.DD._drag);\n window.addEventListener('mouseup', exports.DD._endDragAfter, false);\n window.addEventListener('touchend', exports.DD._endDragAfter, false);\n window.addEventListener('touchcancel', exports.DD._endDragAfter, false);\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Node = void 0;\nconst Util_1 = require(\"./Util\");\nconst Factory_1 = require(\"./Factory\");\nconst Canvas_1 = require(\"./Canvas\");\nconst Global_1 = require(\"./Global\");\nconst DragAndDrop_1 = require(\"./DragAndDrop\");\nconst Validators_1 = require(\"./Validators\");\nconst ABSOLUTE_OPACITY = 'absoluteOpacity', ALL_LISTENERS = 'allEventListeners', ABSOLUTE_TRANSFORM = 'absoluteTransform', ABSOLUTE_SCALE = 'absoluteScale', CANVAS = 'canvas', CHANGE = 'Change', CHILDREN = 'children', KONVA = 'konva', LISTENING = 'listening', MOUSEENTER = 'mouseenter', MOUSELEAVE = 'mouseleave', NAME = 'name', SET = 'set', SHAPE = 'Shape', SPACE = ' ', STAGE = 'stage', TRANSFORM = 'transform', UPPER_STAGE = 'Stage', VISIBLE = 'visible', TRANSFORM_CHANGE_STR = [\n 'xChange.konva',\n 'yChange.konva',\n 'scaleXChange.konva',\n 'scaleYChange.konva',\n 'skewXChange.konva',\n 'skewYChange.konva',\n 'rotationChange.konva',\n 'offsetXChange.konva',\n 'offsetYChange.konva',\n 'transformsEnabledChange.konva',\n].join(SPACE);\nlet idCounter = 1;\nclass Node {\n constructor(config) {\n this._id = idCounter++;\n this.eventListeners = {};\n this.attrs = {};\n this.index = 0;\n this._allEventListeners = null;\n this.parent = null;\n this._cache = new Map();\n this._attachedDepsListeners = new Map();\n this._lastPos = null;\n this._batchingTransformChange = false;\n this._needClearTransformCache = false;\n this._filterUpToDate = false;\n this._isUnderCache = false;\n this._dragEventId = null;\n this._shouldFireChangeEvents = false;\n this.setAttrs(config);\n this._shouldFireChangeEvents = true;\n }\n hasChildren() {\n return false;\n }\n _clearCache(attr) {\n if ((attr === TRANSFORM || attr === ABSOLUTE_TRANSFORM) &&\n this._cache.get(attr)) {\n this._cache.get(attr).dirty = true;\n }\n else if (attr) {\n this._cache.delete(attr);\n }\n else {\n this._cache.clear();\n }\n }\n _getCache(attr, privateGetter) {\n let cache = this._cache.get(attr);\n const isTransform = attr === TRANSFORM || attr === ABSOLUTE_TRANSFORM;\n const invalid = cache === undefined || (isTransform && cache.dirty === true);\n if (invalid) {\n cache = privateGetter.call(this);\n this._cache.set(attr, cache);\n }\n return cache;\n }\n _calculate(name, deps, getter) {\n if (!this._attachedDepsListeners.get(name)) {\n const depsString = deps.map((dep) => dep + 'Change.konva').join(SPACE);\n this.on(depsString, () => {\n this._clearCache(name);\n });\n this._attachedDepsListeners.set(name, true);\n }\n return this._getCache(name, getter);\n }\n _getCanvasCache() {\n return this._cache.get(CANVAS);\n }\n _clearSelfAndDescendantCache(attr) {\n this._clearCache(attr);\n if (attr === ABSOLUTE_TRANSFORM) {\n this.fire('absoluteTransformChange');\n }\n }\n clearCache() {\n if (this._cache.has(CANVAS)) {\n const { scene, filter, hit } = this._cache.get(CANVAS);\n Util_1.Util.releaseCanvas(scene, filter, hit);\n this._cache.delete(CANVAS);\n }\n this._clearSelfAndDescendantCache();\n this._requestDraw();\n return this;\n }\n cache(config) {\n const conf = config || {};\n let rect = {};\n if (conf.x === undefined ||\n conf.y === undefined ||\n conf.width === undefined ||\n conf.height === undefined) {\n rect = this.getClientRect({\n skipTransform: true,\n relativeTo: this.getParent() || undefined,\n });\n }\n let width = Math.ceil(conf.width || rect.width), height = Math.ceil(conf.height || rect.height), pixelRatio = conf.pixelRatio, x = conf.x === undefined ? Math.floor(rect.x) : conf.x, y = conf.y === undefined ? Math.floor(rect.y) : conf.y, offset = conf.offset || 0, drawBorder = conf.drawBorder || false, hitCanvasPixelRatio = conf.hitCanvasPixelRatio || 1;\n if (!width || !height) {\n Util_1.Util.error('Can not cache the node. Width or height of the node equals 0. Caching is skipped.');\n return;\n }\n const extraPaddingX = Math.abs(Math.round(rect.x) - x) > 0.5 ? 1 : 0;\n const extraPaddingY = Math.abs(Math.round(rect.y) - y) > 0.5 ? 1 : 0;\n width += offset * 2 + extraPaddingX;\n height += offset * 2 + extraPaddingY;\n x -= offset;\n y -= offset;\n const cachedSceneCanvas = new Canvas_1.SceneCanvas({\n pixelRatio: pixelRatio,\n width: width,\n height: height,\n }), cachedFilterCanvas = new Canvas_1.SceneCanvas({\n pixelRatio: pixelRatio,\n width: 0,\n height: 0,\n willReadFrequently: true,\n }), cachedHitCanvas = new Canvas_1.HitCanvas({\n pixelRatio: hitCanvasPixelRatio,\n width: width,\n height: height,\n }), sceneContext = cachedSceneCanvas.getContext(), hitContext = cachedHitCanvas.getContext();\n cachedHitCanvas.isCache = true;\n cachedSceneCanvas.isCache = true;\n this._cache.delete(CANVAS);\n this._filterUpToDate = false;\n if (conf.imageSmoothingEnabled === false) {\n cachedSceneCanvas.getContext()._context.imageSmoothingEnabled = false;\n cachedFilterCanvas.getContext()._context.imageSmoothingEnabled = false;\n }\n sceneContext.save();\n hitContext.save();\n sceneContext.translate(-x, -y);\n hitContext.translate(-x, -y);\n this._isUnderCache = true;\n this._clearSelfAndDescendantCache(ABSOLUTE_OPACITY);\n this._clearSelfAndDescendantCache(ABSOLUTE_SCALE);\n this.drawScene(cachedSceneCanvas, this);\n this.drawHit(cachedHitCanvas, this);\n this._isUnderCache = false;\n sceneContext.restore();\n hitContext.restore();\n if (drawBorder) {\n sceneContext.save();\n sceneContext.beginPath();\n sceneContext.rect(0, 0, width, height);\n sceneContext.closePath();\n sceneContext.setAttr('strokeStyle', 'red');\n sceneContext.setAttr('lineWidth', 5);\n sceneContext.stroke();\n sceneContext.restore();\n }\n this._cache.set(CANVAS, {\n scene: cachedSceneCanvas,\n filter: cachedFilterCanvas,\n hit: cachedHitCanvas,\n x: x,\n y: y,\n });\n this._requestDraw();\n return this;\n }\n isCached() {\n return this._cache.has(CANVAS);\n }\n getClientRect(config) {\n throw new Error('abstract \"getClientRect\" method call');\n }\n _transformedRect(rect, top) {\n const points = [\n { x: rect.x, y: rect.y },\n { x: rect.x + rect.width, y: rect.y },\n { x: rect.x + rect.width, y: rect.y + rect.height },\n { x: rect.x, y: rect.y + rect.height },\n ];\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const trans = this.getAbsoluteTransform(top);\n points.forEach(function (point) {\n const transformed = trans.point(point);\n if (minX === undefined) {\n minX = maxX = transformed.x;\n minY = maxY = transformed.y;\n }\n minX = Math.min(minX, transformed.x);\n minY = Math.min(minY, transformed.y);\n maxX = Math.max(maxX, transformed.x);\n maxY = Math.max(maxY, transformed.y);\n });\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n }\n _drawCachedSceneCanvas(context) {\n context.save();\n context._applyOpacity(this);\n context._applyGlobalCompositeOperation(this);\n const canvasCache = this._getCanvasCache();\n context.translate(canvasCache.x, canvasCache.y);\n const cacheCanvas = this._getCachedSceneCanvas();\n const ratio = cacheCanvas.pixelRatio;\n context.drawImage(cacheCanvas._canvas, 0, 0, cacheCanvas.width / ratio, cacheCanvas.height / ratio);\n context.restore();\n }\n _drawCachedHitCanvas(context) {\n const canvasCache = this._getCanvasCache(), hitCanvas = canvasCache.hit;\n context.save();\n context.translate(canvasCache.x, canvasCache.y);\n context.drawImage(hitCanvas._canvas, 0, 0, hitCanvas.width / hitCanvas.pixelRatio, hitCanvas.height / hitCanvas.pixelRatio);\n context.restore();\n }\n _getCachedSceneCanvas() {\n let filters = this.filters(), cachedCanvas = this._getCanvasCache(), sceneCanvas = cachedCanvas.scene, filterCanvas = cachedCanvas.filter, filterContext = filterCanvas.getContext(), len, imageData, n, filter;\n if (filters) {\n if (!this._filterUpToDate) {\n const ratio = sceneCanvas.pixelRatio;\n filterCanvas.setSize(sceneCanvas.width / sceneCanvas.pixelRatio, sceneCanvas.height / sceneCanvas.pixelRatio);\n try {\n len = filters.length;\n filterContext.clear();\n filterContext.drawImage(sceneCanvas._canvas, 0, 0, sceneCanvas.getWidth() / ratio, sceneCanvas.getHeight() / ratio);\n imageData = filterContext.getImageData(0, 0, filterCanvas.getWidth(), filterCanvas.getHeight());\n for (n = 0; n < len; n++) {\n filter = filters[n];\n if (typeof filter !== 'function') {\n Util_1.Util.error('Filter should be type of function, but got ' +\n typeof filter +\n ' instead. Please check correct filters');\n continue;\n }\n filter.call(this, imageData);\n filterContext.putImageData(imageData, 0, 0);\n }\n }\n catch (e) {\n Util_1.Util.error('Unable to apply filter. ' +\n e.message +\n ' This post my help you https://konvajs.org/docs/posts/Tainted_Canvas.html.');\n }\n this._filterUpToDate = true;\n }\n return filterCanvas;\n }\n return sceneCanvas;\n }\n on(evtStr, handler) {\n this._cache && this._cache.delete(ALL_LISTENERS);\n if (arguments.length === 3) {\n return this._delegate.apply(this, arguments);\n }\n let events = evtStr.split(SPACE), len = events.length, n, event, parts, baseEvent, name;\n for (n = 0; n < len; n++) {\n event = events[n];\n parts = event.split('.');\n baseEvent = parts[0];\n name = parts[1] || '';\n if (!this.eventListeners[baseEvent]) {\n this.eventListeners[baseEvent] = [];\n }\n this.eventListeners[baseEvent].push({\n name: name,\n handler: handler,\n });\n }\n return this;\n }\n off(evtStr, callback) {\n let events = (evtStr || '').split(SPACE), len = events.length, n, t, event, parts, baseEvent, name;\n this._cache && this._cache.delete(ALL_LISTENERS);\n if (!evtStr) {\n for (t in this.eventListeners) {\n this._off(t);\n }\n }\n for (n = 0; n < len; n++) {\n event = events[n];\n parts = event.split('.');\n baseEvent = parts[0];\n name = parts[1];\n if (baseEvent) {\n if (this.eventListeners[baseEvent]) {\n this._off(baseEvent, name, callback);\n }\n }\n else {\n for (t in this.eventListeners) {\n this._off(t, name, callback);\n }\n }\n }\n return this;\n }\n dispatchEvent(evt) {\n const e = {\n target: this,\n type: evt.type,\n evt: evt,\n };\n this.fire(evt.type, e);\n return this;\n }\n addEventListener(type, handler) {\n this.on(type, function (evt) {\n handler.call(this, evt.evt);\n });\n return this;\n }\n removeEventListener(type) {\n this.off(type);\n return this;\n }\n _delegate(event, selector, handler) {\n const stopNode = this;\n this.on(event, function (evt) {\n const targets = evt.target.findAncestors(selector, true, stopNode);\n for (let i = 0; i < targets.length; i++) {\n evt = Util_1.Util.cloneObject(evt);\n evt.currentTarget = targets[i];\n handler.call(targets[i], evt);\n }\n });\n }\n remove() {\n if (this.isDragging()) {\n this.stopDrag();\n }\n DragAndDrop_1.DD._dragElements.delete(this._id);\n this._remove();\n return this;\n }\n _clearCaches() {\n this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM);\n this._clearSelfAndDescendantCache(ABSOLUTE_OPACITY);\n this._clearSelfAndDescendantCache(ABSOLUTE_SCALE);\n this._clearSelfAndDescendantCache(STAGE);\n this._clearSelfAndDescendantCache(VISIBLE);\n this._clearSelfAndDescendantCache(LISTENING);\n }\n _remove() {\n this._clearCaches();\n const parent = this.getParent();\n if (parent && parent.children) {\n parent.children.splice(this.index, 1);\n parent._setChildrenIndices();\n this.parent = null;\n }\n }\n destroy() {\n this.remove();\n this.clearCache();\n return this;\n }\n getAttr(attr) {\n const method = 'get' + Util_1.Util._capitalize(attr);\n if (Util_1.Util._isFunction(this[method])) {\n return this[method]();\n }\n return this.attrs[attr];\n }\n getAncestors() {\n let parent = this.getParent(), ancestors = [];\n while (parent) {\n ancestors.push(parent);\n parent = parent.getParent();\n }\n return ancestors;\n }\n getAttrs() {\n return (this.attrs || {});\n }\n setAttrs(config) {\n this._batchTransformChanges(() => {\n let key, method;\n if (!config) {\n return this;\n }\n for (key in config) {\n if (key === CHILDREN) {\n continue;\n }\n method = SET + Util_1.Util._capitalize(key);\n if (Util_1.Util._isFunction(this[method])) {\n this[method](config[key]);\n }\n else {\n this._setAttr(key, config[key]);\n }\n }\n });\n return this;\n }\n isListening() {\n return this._getCache(LISTENING, this._isListening);\n }\n _isListening(relativeTo) {\n const listening = this.listening();\n if (!listening) {\n return false;\n }\n const parent = this.getParent();\n if (parent && parent !== relativeTo && this !== relativeTo) {\n return parent._isListening(relativeTo);\n }\n else {\n return true;\n }\n }\n isVisible() {\n return this._getCache(VISIBLE, this._isVisible);\n }\n _isVisible(relativeTo) {\n const visible = this.visible();\n if (!visible) {\n return false;\n }\n const parent = this.getParent();\n if (parent && parent !== relativeTo && this !== relativeTo) {\n return parent._isVisible(relativeTo);\n }\n else {\n return true;\n }\n }\n shouldDrawHit(top, skipDragCheck = false) {\n if (top) {\n return this._isVisible(top) && this._isListening(top);\n }\n const layer = this.getLayer();\n let layerUnderDrag = false;\n DragAndDrop_1.DD._dragElements.forEach((elem) => {\n if (elem.dragStatus !== 'dragging') {\n return;\n }\n else if (elem.node.nodeType === 'Stage') {\n layerUnderDrag = true;\n }\n else if (elem.node.getLayer() === layer) {\n layerUnderDrag = true;\n }\n });\n const dragSkip = !skipDragCheck &&\n !Global_1.Konva.hitOnDragEnabled &&\n (layerUnderDrag || Global_1.Konva.isTransforming());\n return this.isListening() && this.isVisible() && !dragSkip;\n }\n show() {\n this.visible(true);\n return this;\n }\n hide() {\n this.visible(false);\n return this;\n }\n getZIndex() {\n return this.index || 0;\n }\n getAbsoluteZIndex() {\n let depth = this.getDepth(), that = this, index = 0, nodes, len, n, child;\n function addChildren(children) {\n nodes = [];\n len = children.length;\n for (n = 0; n < len; n++) {\n child = children[n];\n index++;\n if (child.nodeType !== SHAPE) {\n nodes = nodes.concat(child.getChildren().slice());\n }\n if (child._id === that._id) {\n n = len;\n }\n }\n if (nodes.length > 0 && nodes[0].getDepth() <= depth) {\n addChildren(nodes);\n }\n }\n const stage = this.getStage();\n if (that.nodeType !== UPPER_STAGE && stage) {\n addChildren(stage.getChildren());\n }\n return index;\n }\n getDepth() {\n let depth = 0, parent = this.parent;\n while (parent) {\n depth++;\n parent = parent.parent;\n }\n return depth;\n }\n _batchTransformChanges(func) {\n this._batchingTransformChange = true;\n func();\n this._batchingTransformChange = false;\n if (this._needClearTransformCache) {\n this._clearCache(TRANSFORM);\n this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM);\n }\n this._needClearTransformCache = false;\n }\n setPosition(pos) {\n this._batchTransformChanges(() => {\n this.x(pos.x);\n this.y(pos.y);\n });\n return this;\n }\n getPosition() {\n return {\n x: this.x(),\n y: this.y(),\n };\n }\n getRelativePointerPosition() {\n const stage = this.getStage();\n if (!stage) {\n return null;\n }\n const pos = stage.getPointerPosition();\n if (!pos) {\n return null;\n }\n const transform = this.getAbsoluteTransform().copy();\n transform.invert();\n return transform.point(pos);\n }\n getAbsolutePosition(top) {\n let haveCachedParent = false;\n let parent = this.parent;\n while (parent) {\n if (parent.isCached()) {\n haveCachedParent = true;\n break;\n }\n parent = parent.parent;\n }\n if (haveCachedParent && !top) {\n top = true;\n }\n const absoluteMatrix = this.getAbsoluteTransform(top).getMatrix(), absoluteTransform = new Util_1.Transform(), offset = this.offset();\n absoluteTransform.m = absoluteMatrix.slice();\n absoluteTransform.translate(offset.x, offset.y);\n return absoluteTransform.getTranslation();\n }\n setAbsolutePosition(pos) {\n const { x, y, ...origTrans } = this._clearTransform();\n this.attrs.x = x;\n this.attrs.y = y;\n this._clearCache(TRANSFORM);\n const it = this._getAbsoluteTransform().copy();\n it.invert();\n it.translate(pos.x, pos.y);\n pos = {\n x: this.attrs.x + it.getTranslation().x,\n y: this.attrs.y + it.getTranslation().y,\n };\n this._setTransform(origTrans);\n this.setPosition({ x: pos.x, y: pos.y });\n this._clearCache(TRANSFORM);\n this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM);\n return this;\n }\n _setTransform(trans) {\n let key;\n for (key in trans) {\n this.attrs[key] = trans[key];\n }\n }\n _clearTransform() {\n const trans = {\n x: this.x(),\n y: this.y(),\n rotation: this.rotation(),\n scaleX: this.scaleX(),\n scaleY: this.scaleY(),\n offsetX: this.offsetX(),\n offsetY: this.offsetY(),\n skewX: this.skewX(),\n skewY: this.skewY(),\n };\n this.attrs.x = 0;\n this.attrs.y = 0;\n this.attrs.rotation = 0;\n this.attrs.scaleX = 1;\n this.attrs.scaleY = 1;\n this.attrs.offsetX = 0;\n this.attrs.offsetY = 0;\n this.attrs.skewX = 0;\n this.attrs.skewY = 0;\n return trans;\n }\n move(change) {\n let changeX = change.x, changeY = change.y, x = this.x(), y = this.y();\n if (changeX !== undefined) {\n x += changeX;\n }\n if (changeY !== undefined) {\n y += changeY;\n }\n this.setPosition({ x: x, y: y });\n return this;\n }\n _eachAncestorReverse(func, top) {\n let family = [], parent = this.getParent(), len, n;\n if (top && top._id === this._id) {\n return;\n }\n family.unshift(this);\n while (parent && (!top || parent._id !== top._id)) {\n family.unshift(parent);\n parent = parent.parent;\n }\n len = family.length;\n for (n = 0; n < len; n++) {\n func(family[n]);\n }\n }\n rotate(theta) {\n this.rotation(this.rotation() + theta);\n return this;\n }\n moveToTop() {\n if (!this.parent) {\n Util_1.Util.warn('Node has no parent. moveToTop function is ignored.');\n return false;\n }\n const index = this.index, len = this.parent.getChildren().length;\n if (index < len - 1) {\n this.parent.children.splice(index, 1);\n this.parent.children.push(this);\n this.parent._setChildrenIndices();\n return true;\n }\n return false;\n }\n moveUp() {\n if (!this.parent) {\n Util_1.Util.warn('Node has no parent. moveUp function is ignored.');\n return false;\n }\n const index = this.index, len = this.parent.getChildren().length;\n if (index < len - 1) {\n this.parent.children.splice(index, 1);\n this.parent.children.splice(index + 1, 0, this);\n this.parent._setChildrenIndices();\n return true;\n }\n return false;\n }\n moveDown() {\n if (!this.parent) {\n Util_1.Util.warn('Node has no parent. moveDown function is ignored.');\n return false;\n }\n const index = this.index;\n if (index > 0) {\n this.parent.children.splice(index, 1);\n this.parent.children.splice(index - 1, 0, this);\n this.parent._setChildrenIndices();\n return true;\n }\n return false;\n }\n moveToBottom() {\n if (!this.parent) {\n Util_1.Util.warn('Node has no parent. moveToBottom function is ignored.');\n return false;\n }\n const index = this.index;\n if (index > 0) {\n this.parent.children.splice(index, 1);\n this.parent.children.unshift(this);\n this.parent._setChildrenIndices();\n return true;\n }\n return false;\n }\n setZIndex(zIndex) {\n if (!this.parent) {\n Util_1.Util.warn('Node has no parent. zIndex parameter is ignored.');\n return this;\n }\n if (zIndex < 0 || zIndex >= this.parent.children.length) {\n Util_1.Util.warn('Unexpected value ' +\n zIndex +\n ' for zIndex property. zIndex is just index of a node in children of its parent. Expected value is from 0 to ' +\n (this.parent.children.length - 1) +\n '.');\n }\n const index = this.index;\n this.parent.children.splice(index, 1);\n this.parent.children.splice(zIndex, 0, this);\n this.parent._setChildrenIndices();\n return this;\n }\n getAbsoluteOpacity() {\n return this._getCache(ABSOLUTE_OPACITY, this._getAbsoluteOpacity);\n }\n _getAbsoluteOpacity() {\n let absOpacity = this.opacity();\n const parent = this.getParent();\n if (parent && !parent._isUnderCache) {\n absOpacity *= parent.getAbsoluteOpacity();\n }\n return absOpacity;\n }\n moveTo(newContainer) {\n if (this.getParent() !== newContainer) {\n this._remove();\n newContainer.add(this);\n }\n return this;\n }\n toObject() {\n let attrs = this.getAttrs(), key, val, getter, defaultValue, nonPlainObject;\n const obj = {\n attrs: {},\n className: this.getClassName(),\n };\n for (key in attrs) {\n val = attrs[key];\n nonPlainObject =\n Util_1.Util.isObject(val) && !Util_1.Util._isPlainObject(val) && !Util_1.Util._isArray(val);\n if (nonPlainObject) {\n continue;\n }\n getter = typeof this[key] === 'function' && this[key];\n delete attrs[key];\n defaultValue = getter ? getter.call(this) : null;\n attrs[key] = val;\n if (defaultValue !== val) {\n obj.attrs[key] = val;\n }\n }\n return Util_1.Util._prepareToStringify(obj);\n }\n toJSON() {\n return JSON.stringify(this.toObject());\n }\n getParent() {\n return this.parent;\n }\n findAncestors(selector, includeSelf, stopNode) {\n const res = [];\n if (includeSelf && this._isMatch(selector)) {\n res.push(this);\n }\n let ancestor = this.parent;\n while (ancestor) {\n if (ancestor === stopNode) {\n return res;\n }\n if (ancestor._isMatch(selector)) {\n res.push(ancestor);\n }\n ancestor = ancestor.parent;\n }\n return res;\n }\n isAncestorOf(node) {\n return false;\n }\n findAncestor(selector, includeSelf, stopNode) {\n return this.findAncestors(selector, includeSelf, stopNode)[0];\n }\n _isMatch(selector) {\n if (!selector) {\n return false;\n }\n if (typeof selector === 'function') {\n return selector(this);\n }\n let selectorArr = selector.replace(/ /g, '').split(','), len = selectorArr.length, n, sel;\n for (n = 0; n < len; n++) {\n sel = selectorArr[n];\n if (!Util_1.Util.isValidSelector(sel)) {\n Util_1.Util.warn('Selector \"' +\n sel +\n '\" is invalid. Allowed selectors examples are \"#foo\", \".bar\" or \"Group\".');\n Util_1.Util.warn('If you have a custom shape with such className, please change it to start with upper letter like \"Triangle\".');\n Util_1.Util.warn('Konva is awesome, right?');\n }\n if (sel.charAt(0) === '#') {\n if (this.id() === sel.slice(1)) {\n return true;\n }\n }\n else if (sel.charAt(0) === '.') {\n if (this.hasName(sel.slice(1))) {\n return true;\n }\n }\n else if (this.className === sel || this.nodeType === sel) {\n return true;\n }\n }\n return false;\n }\n getLayer() {\n const parent = this.getParent();\n return parent ? parent.getLayer() : null;\n }\n getStage() {\n return this._getCache(STAGE, this._getStage);\n }\n _getStage() {\n const parent = this.getParent();\n if (parent) {\n return parent.getStage();\n }\n else {\n return null;\n }\n }\n fire(eventType, evt = {}, bubble) {\n evt.target = evt.target || this;\n if (bubble) {\n this._fireAndBubble(eventType, evt);\n }\n else {\n this._fire(eventType, evt);\n }\n return this;\n }\n getAbsoluteTransform(top) {\n if (top) {\n return this._getAbsoluteTransform(top);\n }\n else {\n return this._getCache(ABSOLUTE_TRANSFORM, this._getAbsoluteTransform);\n }\n }\n _getAbsoluteTransform(top) {\n let at;\n if (top) {\n at = new Util_1.Transform();\n this._eachAncestorReverse(function (node) {\n const transformsEnabled = node.transformsEnabled();\n if (transformsEnabled === 'all') {\n at.multiply(node.getTransform());\n }\n else if (transformsEnabled === 'position') {\n at.translate(node.x() - node.offsetX(), node.y() - node.offsetY());\n }\n }, top);\n return at;\n }\n else {\n at = this._cache.get(ABSOLUTE_TRANSFORM) || new Util_1.Transform();\n if (this.parent) {\n this.parent.getAbsoluteTransform().copyInto(at);\n }\n else {\n at.reset();\n }\n const transformsEnabled = this.transformsEnabled();\n if (transformsEnabled === 'all') {\n at.multiply(this.getTransform());\n }\n else if (transformsEnabled === 'position') {\n const x = this.attrs.x || 0;\n const y = this.attrs.y || 0;\n const offsetX = this.attrs.offsetX || 0;\n const offsetY = this.attrs.offsetY || 0;\n at.translate(x - offsetX, y - offsetY);\n }\n at.dirty = false;\n return at;\n }\n }\n getAbsoluteScale(top) {\n let parent = this;\n while (parent) {\n if (parent._isUnderCache) {\n top = parent;\n }\n parent = parent.getParent();\n }\n const transform = this.getAbsoluteTransform(top);\n const attrs = transform.decompose();\n return {\n x: attrs.scaleX,\n y: attrs.scaleY,\n };\n }\n getAbsoluteRotation() {\n return this.getAbsoluteTransform().decompose().rotation;\n }\n getTransform() {\n return this._getCache(TRANSFORM, this._getTransform);\n }\n _getTransform() {\n var _a, _b;\n const m = this._cache.get(TRANSFORM) || new Util_1.Transform();\n m.reset();\n const x = this.x(), y = this.y(), rotation = Global_1.Konva.getAngle(this.rotation()), scaleX = (_a = this.attrs.scaleX) !== null && _a !== void 0 ? _a : 1, scaleY = (_b = this.attrs.scaleY) !== null && _b !== void 0 ? _b : 1, skewX = this.attrs.skewX || 0, skewY = this.attrs.skewY || 0, offsetX = this.attrs.offsetX || 0, offsetY = this.attrs.offsetY || 0;\n if (x !== 0 || y !== 0) {\n m.translate(x, y);\n }\n if (rotation !== 0) {\n m.rotate(rotation);\n }\n if (skewX !== 0 || skewY !== 0) {\n m.skew(skewX, skewY);\n }\n if (scaleX !== 1 || scaleY !== 1) {\n m.scale(scaleX, scaleY);\n }\n if (offsetX !== 0 || offsetY !== 0) {\n m.translate(-1 * offsetX, -1 * offsetY);\n }\n m.dirty = false;\n return m;\n }\n clone(obj) {\n let attrs = Util_1.Util.cloneObject(this.attrs), key, allListeners, len, n, listener;\n for (key in obj) {\n attrs[key] = obj[key];\n }\n const node = new this.constructor(attrs);\n for (key in this.eventListeners) {\n allListeners = this.eventListeners[key];\n len = allListeners.length;\n for (n = 0; n < len; n++) {\n listener = allListeners[n];\n if (listener.name.indexOf(KONVA) < 0) {\n if (!node.eventListeners[key]) {\n node.eventListeners[key] = [];\n }\n node.eventListeners[key].push(listener);\n }\n }\n }\n return node;\n }\n _toKonvaCanvas(config) {\n config = config || {};\n const box = this.getClientRect();\n const stage = this.getStage(), x = config.x !== undefined ? config.x : Math.floor(box.x), y = config.y !== undefined ? config.y : Math.floor(box.y), pixelRatio = config.pixelRatio || 1, canvas = new Canvas_1.SceneCanvas({\n width: config.width || Math.ceil(box.width) || (stage ? stage.width() : 0),\n height: config.height ||\n Math.ceil(box.height) ||\n (stage ? stage.height() : 0),\n pixelRatio: pixelRatio,\n }), context = canvas.getContext();\n const bufferCanvas = new Canvas_1.SceneCanvas({\n width: canvas.width / canvas.pixelRatio + Math.abs(x),\n height: canvas.height / canvas.pixelRatio + Math.abs(y),\n pixelRatio: canvas.pixelRatio,\n });\n if (config.imageSmoothingEnabled === false) {\n context._context.imageSmoothingEnabled = false;\n }\n context.save();\n if (x || y) {\n context.translate(-1 * x, -1 * y);\n }\n this.drawScene(canvas, undefined, bufferCanvas);\n context.restore();\n return canvas;\n }\n toCanvas(config) {\n return this._toKonvaCanvas(config)._canvas;\n }\n toDataURL(config) {\n config = config || {};\n const mimeType = config.mimeType || null, quality = config.quality || null;\n const url = this._toKonvaCanvas(config).toDataURL(mimeType, quality);\n if (config.callback) {\n config.callback(url);\n }\n return url;\n }\n toImage(config) {\n return new Promise((resolve, reject) => {\n try {\n const callback = config === null || config === void 0 ? void 0 : config.callback;\n if (callback)\n delete config.callback;\n Util_1.Util._urlToImage(this.toDataURL(config), function (img) {\n resolve(img);\n callback === null || callback === void 0 ? void 0 : callback(img);\n });\n }\n catch (err) {\n reject(err);\n }\n });\n }\n toBlob(config) {\n return new Promise((resolve, reject) => {\n try {\n const callback = config === null || config === void 0 ? void 0 : config.callback;\n if (callback)\n delete config.callback;\n this.toCanvas(config).toBlob((blob) => {\n resolve(blob);\n callback === null || callback === void 0 ? void 0 : callback(blob);\n }, config === null || config === void 0 ? void 0 : config.mimeType, config === null || config === void 0 ? void 0 : config.quality);\n }\n catch (err) {\n reject(err);\n }\n });\n }\n setSize(size) {\n this.width(size.width);\n this.height(size.height);\n return this;\n }\n getSize() {\n return {\n width: this.width(),\n height: this.height(),\n };\n }\n getClassName() {\n return this.className || this.nodeType;\n }\n getType() {\n return this.nodeType;\n }\n getDragDistance() {\n if (this.attrs.dragDistance !== undefined) {\n return this.attrs.dragDistance;\n }\n else if (this.parent) {\n return this.parent.getDragDistance();\n }\n else {\n return Global_1.Konva.dragDistance;\n }\n }\n _off(type, name, callback) {\n let evtListeners = this.eventListeners[type], i, evtName, handler;\n for (i = 0; i < evtListeners.length; i++) {\n evtName = evtListeners[i].name;\n handler = evtListeners[i].handler;\n if ((evtName !== 'konva' || name === 'konva') &&\n (!name || evtName === name) &&\n (!callback || callback === handler)) {\n evtListeners.splice(i, 1);\n if (evtListeners.length === 0) {\n delete this.eventListeners[type];\n break;\n }\n i--;\n }\n }\n }\n _fireChangeEvent(attr, oldVal, newVal) {\n this._fire(attr + CHANGE, {\n oldVal: oldVal,\n newVal: newVal,\n });\n }\n addName(name) {\n if (!this.hasName(name)) {\n const oldName = this.name();\n const newName = oldName ? oldName + ' ' + name : name;\n this.name(newName);\n }\n return this;\n }\n hasName(name) {\n if (!name) {\n return false;\n }\n const fullName = this.name();\n if (!fullName) {\n return false;\n }\n const names = (fullName || '').split(/\\s/g);\n return names.indexOf(name) !== -1;\n }\n removeName(name) {\n const names = (this.name() || '').split(/\\s/g);\n const index = names.indexOf(name);\n if (index !== -1) {\n names.splice(index, 1);\n this.name(names.join(' '));\n }\n return this;\n }\n setAttr(attr, val) {\n const func = this[SET + Util_1.Util._capitalize(attr)];\n if (Util_1.Util._isFunction(func)) {\n func.call(this, val);\n }\n else {\n this._setAttr(attr, val);\n }\n return this;\n }\n _requestDraw() {\n if (Global_1.Konva.autoDrawEnabled) {\n const drawNode = this.getLayer() || this.getStage();\n drawNode === null || drawNode === void 0 ? void 0 : drawNode.batchDraw();\n }\n }\n _setAttr(key, val) {\n const oldVal = this.attrs[key];\n if (oldVal === val && !Util_1.Util.isObject(val)) {\n return;\n }\n if (val === undefined || val === null) {\n delete this.attrs[key];\n }\n else {\n this.attrs[key] = val;\n }\n if (this._shouldFireChangeEvents) {\n this._fireChangeEvent(key, oldVal, val);\n }\n this._requestDraw();\n }\n _setComponentAttr(key, component, val) {\n let oldVal;\n if (val !== undefined) {\n oldVal = this.attrs[key];\n if (!oldVal) {\n this.attrs[key] = this.getAttr(key);\n }\n this.attrs[key][component] = val;\n this._fireChangeEvent(key, oldVal, val);\n }\n }\n _fireAndBubble(eventType, evt, compareShape) {\n if (evt && this.nodeType === SHAPE) {\n evt.target = this;\n }\n const shouldStop = (eventType === MOUSEENTER || eventType === MOUSELEAVE) &&\n ((compareShape &&\n (this === compareShape ||\n (this.isAncestorOf && this.isAncestorOf(compareShape)))) ||\n (this.nodeType === 'Stage' && !compareShape));\n if (!shouldStop) {\n this._fire(eventType, evt);\n const stopBubble = (eventType === MOUSEENTER || eventType === MOUSELEAVE) &&\n compareShape &&\n compareShape.isAncestorOf &&\n compareShape.isAncestorOf(this) &&\n !compareShape.isAncestorOf(this.parent);\n if (((evt && !evt.cancelBubble) || !evt) &&\n this.parent &&\n this.parent.isListening() &&\n !stopBubble) {\n if (compareShape && compareShape.parent) {\n this._fireAndBubble.call(this.parent, eventType, evt, compareShape);\n }\n else {\n this._fireAndBubble.call(this.parent, eventType, evt);\n }\n }\n }\n }\n _getProtoListeners(eventType) {\n var _a, _b, _c;\n const allListeners = (_a = this._cache.get(ALL_LISTENERS)) !== null && _a !== void 0 ? _a : {};\n let events = allListeners === null || allListeners === void 0 ? void 0 : allListeners[eventType];\n if (events === undefined) {\n events = [];\n let obj = Object.getPrototypeOf(this);\n while (obj) {\n const hierarchyEvents = (_c = (_b = obj.eventListeners) === null || _b === void 0 ? void 0 : _b[eventType]) !== null && _c !== void 0 ? _c : [];\n events.push(...hierarchyEvents);\n obj = Object.getPrototypeOf(obj);\n }\n allListeners[eventType] = events;\n this._cache.set(ALL_LISTENERS, allListeners);\n }\n return events;\n }\n _fire(eventType, evt) {\n evt = evt || {};\n evt.currentTarget = this;\n evt.type = eventType;\n const topListeners = this._getProtoListeners(eventType);\n if (topListeners) {\n for (var i = 0; i < topListeners.length; i++) {\n topListeners[i].handler.call(this, evt);\n }\n }\n const selfListeners = this.eventListeners[eventType];\n if (selfListeners) {\n for (var i = 0; i < selfListeners.length; i++) {\n selfListeners[i].handler.call(this, evt);\n }\n }\n }\n draw() {\n this.drawScene();\n this.drawHit();\n return this;\n }\n _createDragElement(evt) {\n const pointerId = evt ? evt.pointerId : undefined;\n const stage = this.getStage();\n const ap = this.getAbsolutePosition();\n if (!stage) {\n return;\n }\n const pos = stage._getPointerById(pointerId) ||\n stage._changedPointerPositions[0] ||\n ap;\n DragAndDrop_1.DD._dragElements.set(this._id, {\n node: this,\n startPointerPos: pos,\n offset: {\n x: pos.x - ap.x,\n y: pos.y - ap.y,\n },\n dragStatus: 'ready',\n pointerId,\n });\n }\n startDrag(evt, bubbleEvent = true) {\n if (!DragAndDrop_1.DD._dragElements.has(this._id)) {\n this._createDragElement(evt);\n }\n const elem = DragAndDrop_1.DD._dragElements.get(this._id);\n elem.dragStatus = 'dragging';\n this.fire('dragstart', {\n type: 'dragstart',\n target: this,\n evt: evt && evt.evt,\n }, bubbleEvent);\n }\n _setDragPosition(evt, elem) {\n const pos = this.getStage()._getPointerById(elem.pointerId);\n if (!pos) {\n return;\n }\n let newNodePos = {\n x: pos.x - elem.offset.x,\n y: pos.y - elem.offset.y,\n };\n const dbf = this.dragBoundFunc();\n if (dbf !== undefined) {\n const bounded = dbf.call(this, newNodePos, evt);\n if (!bounded) {\n Util_1.Util.warn('dragBoundFunc did not return any value. That is unexpected behavior. You must return new absolute position from dragBoundFunc.');\n }\n else {\n newNodePos = bounded;\n }\n }\n if (!this._lastPos ||\n this._lastPos.x !== newNodePos.x ||\n this._lastPos.y !== newNodePos.y) {\n this.setAbsolutePosition(newNodePos);\n this._requestDraw();\n }\n this._lastPos = newNodePos;\n }\n stopDrag(evt) {\n const elem = DragAndDrop_1.DD._dragElements.get(this._id);\n if (elem) {\n elem.dragStatus = 'stopped';\n }\n DragAndDrop_1.DD._endDragBefore(evt);\n DragAndDrop_1.DD._endDragAfter(evt);\n }\n setDraggable(draggable) {\n this._setAttr('draggable', draggable);\n this._dragChange();\n }\n isDragging() {\n const elem = DragAndDrop_1.DD._dragElements.get(this._id);\n return elem ? elem.dragStatus === 'dragging' : false;\n }\n _listenDrag() {\n this._dragCleanup();\n this.on('mousedown.konva touchstart.konva', function (evt) {\n const shouldCheckButton = evt.evt['button'] !== undefined;\n const canDrag = !shouldCheckButton || Global_1.Konva.dragButtons.indexOf(evt.evt['button']) >= 0;\n if (!canDrag) {\n return;\n }\n if (this.isDragging()) {\n return;\n }\n let hasDraggingChild = false;\n DragAndDrop_1.DD._dragElements.forEach((elem) => {\n if (this.isAncestorOf(elem.node)) {\n hasDraggingChild = true;\n }\n });\n if (!hasDraggingChild) {\n this._createDragElement(evt);\n }\n });\n }\n _dragChange() {\n if (this.attrs.draggable) {\n this._listenDrag();\n }\n else {\n this._dragCleanup();\n const stage = this.getStage();\n if (!stage) {\n return;\n }\n const dragElement = DragAndDrop_1.DD._dragElements.get(this._id);\n const isDragging = dragElement && dragElement.dragStatus === 'dragging';\n const isReady = dragElement && dragElement.dragStatus === 'ready';\n if (isDragging) {\n this.stopDrag();\n }\n else if (isReady) {\n DragAndDrop_1.DD._dragElements.delete(this._id);\n }\n }\n }\n _dragCleanup() {\n this.off('mousedown.konva');\n this.off('touchstart.konva');\n }\n isClientRectOnScreen(margin = { x: 0, y: 0 }) {\n const stage = this.getStage();\n if (!stage) {\n return false;\n }\n const screenRect = {\n x: -margin.x,\n y: -margin.y,\n width: stage.width() + 2 * margin.x,\n height: stage.height() + 2 * margin.y,\n };\n return Util_1.Util.haveIntersection(screenRect, this.getClientRect());\n }\n static create(data, container) {\n if (Util_1.Util._isString(data)) {\n data = JSON.parse(data);\n }\n return this._createNode(data, container);\n }\n static _createNode(obj, container) {\n let className = Node.prototype.getClassName.call(obj), children = obj.children, no, len, n;\n if (container) {\n obj.attrs.container = container;\n }\n if (!Global_1.Konva[className]) {\n Util_1.Util.warn('Can not find a node with class name \"' +\n className +\n '\". Fallback to \"Shape\".');\n className = 'Shape';\n }\n const Class = Global_1.Konva[className];\n no = new Class(obj.attrs);\n if (children) {\n len = children.length;\n for (n = 0; n < len; n++) {\n no.add(Node._createNode(children[n]));\n }\n }\n return no;\n }\n}\nexports.Node = Node;\nNode.prototype.nodeType = 'Node';\nNode.prototype._attrsAffectingSize = [];\nNode.prototype.eventListeners = {};\nNode.prototype.on.call(Node.prototype, TRANSFORM_CHANGE_STR, function () {\n if (this._batchingTransformChange) {\n this._needClearTransformCache = true;\n return;\n }\n this._clearCache(TRANSFORM);\n this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM);\n});\nNode.prototype.on.call(Node.prototype, 'visibleChange.konva', function () {\n this._clearSelfAndDescendantCache(VISIBLE);\n});\nNode.prototype.on.call(Node.prototype, 'listeningChange.konva', function () {\n this._clearSelfAndDescendantCache(LISTENING);\n});\nNode.prototype.on.call(Node.prototype, 'opacityChange.konva', function () {\n this._clearSelfAndDescendantCache(ABSOLUTE_OPACITY);\n});\nconst addGetterSetter = Factory_1.Factory.addGetterSetter;\naddGetterSetter(Node, 'zIndex');\naddGetterSetter(Node, 'absolutePosition');\naddGetterSetter(Node, 'position');\naddGetterSetter(Node, 'x', 0, (0, Validators_1.getNumberValidator)());\naddGetterSetter(Node, 'y', 0, (0, Validators_1.getNumberValidator)());\naddGetterSetter(Node, 'globalCompositeOperation', 'source-over', (0, Validators_1.getStringValidator)());\naddGetterSetter(Node, 'opacity', 1, (0, Validators_1.getNumberValidator)());\naddGetterSetter(Node, 'name', '', (0, Validators_1.getStringValidator)());\naddGetterSetter(Node, 'id', '', (0, Validators_1.getStringValidator)());\naddGetterSetter(Node, 'rotation', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addComponentsGetterSetter(Node, 'scale', ['x', 'y']);\naddGetterSetter(Node, 'scaleX', 1, (0, Validators_1.getNumberValidator)());\naddGetterSetter(Node, 'scaleY', 1, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addComponentsGetterSetter(Node, 'skew', ['x', 'y']);\naddGetterSetter(Node, 'skewX', 0, (0, Validators_1.getNumberValidator)());\naddGetterSetter(Node, 'skewY', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addComponentsGetterSetter(Node, 'offset', ['x', 'y']);\naddGetterSetter(Node, 'offsetX', 0, (0, Validators_1.getNumberValidator)());\naddGetterSetter(Node, 'offsetY', 0, (0, Validators_1.getNumberValidator)());\naddGetterSetter(Node, 'dragDistance', undefined, (0, Validators_1.getNumberValidator)());\naddGetterSetter(Node, 'width', 0, (0, Validators_1.getNumberValidator)());\naddGetterSetter(Node, 'height', 0, (0, Validators_1.getNumberValidator)());\naddGetterSetter(Node, 'listening', true, (0, Validators_1.getBooleanValidator)());\naddGetterSetter(Node, 'preventDefault', true, (0, Validators_1.getBooleanValidator)());\naddGetterSetter(Node, 'filters', undefined, function (val) {\n this._filterUpToDate = false;\n return val;\n});\naddGetterSetter(Node, 'visible', true, (0, Validators_1.getBooleanValidator)());\naddGetterSetter(Node, 'transformsEnabled', 'all', (0, Validators_1.getStringValidator)());\naddGetterSetter(Node, 'size');\naddGetterSetter(Node, 'dragBoundFunc');\naddGetterSetter(Node, 'draggable', false, (0, Validators_1.getBooleanValidator)());\nFactory_1.Factory.backCompat(Node, {\n rotateDeg: 'rotate',\n setRotationDeg: 'setRotation',\n getRotationDeg: 'getRotation',\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Container = void 0;\nconst Factory_1 = require(\"./Factory\");\nconst Node_1 = require(\"./Node\");\nconst Validators_1 = require(\"./Validators\");\nclass Container extends Node_1.Node {\n constructor() {\n super(...arguments);\n this.children = [];\n }\n getChildren(filterFunc) {\n if (!filterFunc) {\n return this.children || [];\n }\n const children = this.children || [];\n const results = [];\n children.forEach(function (child) {\n if (filterFunc(child)) {\n results.push(child);\n }\n });\n return results;\n }\n hasChildren() {\n return this.getChildren().length > 0;\n }\n removeChildren() {\n this.getChildren().forEach((child) => {\n child.parent = null;\n child.index = 0;\n child.remove();\n });\n this.children = [];\n this._requestDraw();\n return this;\n }\n destroyChildren() {\n this.getChildren().forEach((child) => {\n child.parent = null;\n child.index = 0;\n child.destroy();\n });\n this.children = [];\n this._requestDraw();\n return this;\n }\n add(...children) {\n if (children.length === 0) {\n return this;\n }\n if (children.length > 1) {\n for (let i = 0; i < children.length; i++) {\n this.add(children[i]);\n }\n return this;\n }\n const child = children[0];\n if (child.getParent()) {\n child.moveTo(this);\n return this;\n }\n this._validateAdd(child);\n child.index = this.getChildren().length;\n child.parent = this;\n child._clearCaches();\n this.getChildren().push(child);\n this._fire('add', {\n child: child,\n });\n this._requestDraw();\n return this;\n }\n destroy() {\n if (this.hasChildren()) {\n this.destroyChildren();\n }\n super.destroy();\n return this;\n }\n find(selector) {\n return this._generalFind(selector, false);\n }\n findOne(selector) {\n const result = this._generalFind(selector, true);\n return result.length > 0 ? result[0] : undefined;\n }\n _generalFind(selector, findOne) {\n const retArr = [];\n this._descendants((node) => {\n const valid = node._isMatch(selector);\n if (valid) {\n retArr.push(node);\n }\n if (valid && findOne) {\n return true;\n }\n return false;\n });\n return retArr;\n }\n _descendants(fn) {\n let shouldStop = false;\n const children = this.getChildren();\n for (const child of children) {\n shouldStop = fn(child);\n if (shouldStop) {\n return true;\n }\n if (!child.hasChildren()) {\n continue;\n }\n shouldStop = child._descendants(fn);\n if (shouldStop) {\n return true;\n }\n }\n return false;\n }\n toObject() {\n const obj = Node_1.Node.prototype.toObject.call(this);\n obj.children = [];\n this.getChildren().forEach((child) => {\n obj.children.push(child.toObject());\n });\n return obj;\n }\n isAncestorOf(node) {\n let parent = node.getParent();\n while (parent) {\n if (parent._id === this._id) {\n return true;\n }\n parent = parent.getParent();\n }\n return false;\n }\n clone(obj) {\n const node = Node_1.Node.prototype.clone.call(this, obj);\n this.getChildren().forEach(function (no) {\n node.add(no.clone());\n });\n return node;\n }\n getAllIntersections(pos) {\n const arr = [];\n this.find('Shape').forEach((shape) => {\n if (shape.isVisible() && shape.intersects(pos)) {\n arr.push(shape);\n }\n });\n return arr;\n }\n _clearSelfAndDescendantCache(attr) {\n var _a;\n super._clearSelfAndDescendantCache(attr);\n if (this.isCached()) {\n return;\n }\n (_a = this.children) === null || _a === void 0 ? void 0 : _a.forEach(function (node) {\n node._clearSelfAndDescendantCache(attr);\n });\n }\n _setChildrenIndices() {\n var _a;\n (_a = this.children) === null || _a === void 0 ? void 0 : _a.forEach(function (child, n) {\n child.index = n;\n });\n this._requestDraw();\n }\n drawScene(can, top, bufferCanvas) {\n const layer = this.getLayer(), canvas = can || (layer && layer.getCanvas()), context = canvas && canvas.getContext(), cachedCanvas = this._getCanvasCache(), cachedSceneCanvas = cachedCanvas && cachedCanvas.scene;\n const caching = canvas && canvas.isCache;\n if (!this.isVisible() && !caching) {\n return this;\n }\n if (cachedSceneCanvas) {\n context.save();\n const m = this.getAbsoluteTransform(top).getMatrix();\n context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n this._drawCachedSceneCanvas(context);\n context.restore();\n }\n else {\n this._drawChildren('drawScene', canvas, top, bufferCanvas);\n }\n return this;\n }\n drawHit(can, top) {\n if (!this.shouldDrawHit(top)) {\n return this;\n }\n const layer = this.getLayer(), canvas = can || (layer && layer.hitCanvas), context = canvas && canvas.getContext(), cachedCanvas = this._getCanvasCache(), cachedHitCanvas = cachedCanvas && cachedCanvas.hit;\n if (cachedHitCanvas) {\n context.save();\n const m = this.getAbsoluteTransform(top).getMatrix();\n context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n this._drawCachedHitCanvas(context);\n context.restore();\n }\n else {\n this._drawChildren('drawHit', canvas, top);\n }\n return this;\n }\n _drawChildren(drawMethod, canvas, top, bufferCanvas) {\n var _a;\n const context = canvas && canvas.getContext(), clipWidth = this.clipWidth(), clipHeight = this.clipHeight(), clipFunc = this.clipFunc(), hasClip = (typeof clipWidth === 'number' && typeof clipHeight === 'number') ||\n clipFunc;\n const selfCache = top === this;\n if (hasClip) {\n context.save();\n const transform = this.getAbsoluteTransform(top);\n let m = transform.getMatrix();\n context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n context.beginPath();\n let clipArgs;\n if (clipFunc) {\n clipArgs = clipFunc.call(this, context, this);\n }\n else {\n const clipX = this.clipX();\n const clipY = this.clipY();\n context.rect(clipX || 0, clipY || 0, clipWidth, clipHeight);\n }\n context.clip.apply(context, clipArgs);\n m = transform.copy().invert().getMatrix();\n context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n const hasComposition = !selfCache &&\n this.globalCompositeOperation() !== 'source-over' &&\n drawMethod === 'drawScene';\n if (hasComposition) {\n context.save();\n context._applyGlobalCompositeOperation(this);\n }\n (_a = this.children) === null || _a === void 0 ? void 0 : _a.forEach(function (child) {\n child[drawMethod](canvas, top, bufferCanvas);\n });\n if (hasComposition) {\n context.restore();\n }\n if (hasClip) {\n context.restore();\n }\n }\n getClientRect(config = {}) {\n var _a;\n const skipTransform = config.skipTransform;\n const relativeTo = config.relativeTo;\n let minX, minY, maxX, maxY;\n let selfRect = {\n x: Infinity,\n y: Infinity,\n width: 0,\n height: 0,\n };\n const that = this;\n (_a = this.children) === null || _a === void 0 ? void 0 : _a.forEach(function (child) {\n if (!child.visible()) {\n return;\n }\n const rect = child.getClientRect({\n relativeTo: that,\n skipShadow: config.skipShadow,\n skipStroke: config.skipStroke,\n });\n if (rect.width === 0 && rect.height === 0) {\n return;\n }\n if (minX === undefined) {\n minX = rect.x;\n minY = rect.y;\n maxX = rect.x + rect.width;\n maxY = rect.y + rect.height;\n }\n else {\n minX = Math.min(minX, rect.x);\n minY = Math.min(minY, rect.y);\n maxX = Math.max(maxX, rect.x + rect.width);\n maxY = Math.max(maxY, rect.y + rect.height);\n }\n });\n const shapes = this.find('Shape');\n let hasVisible = false;\n for (let i = 0; i < shapes.length; i++) {\n const shape = shapes[i];\n if (shape._isVisible(this)) {\n hasVisible = true;\n break;\n }\n }\n if (hasVisible && minX !== undefined) {\n selfRect = {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n }\n else {\n selfRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n }\n if (!skipTransform) {\n return this._transformedRect(selfRect, relativeTo);\n }\n return selfRect;\n }\n}\nexports.Container = Container;\nFactory_1.Factory.addComponentsGetterSetter(Container, 'clip', [\n 'x',\n 'y',\n 'width',\n 'height',\n]);\nFactory_1.Factory.addGetterSetter(Container, 'clipX', undefined, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Container, 'clipY', undefined, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Container, 'clipWidth', undefined, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Container, 'clipHeight', undefined, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Container, 'clipFunc');\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getCapturedShape = getCapturedShape;\nexports.createEvent = createEvent;\nexports.hasPointerCapture = hasPointerCapture;\nexports.setPointerCapture = setPointerCapture;\nexports.releaseCapture = releaseCapture;\nconst Global_1 = require(\"./Global\");\nconst Captures = new Map();\nconst SUPPORT_POINTER_EVENTS = Global_1.Konva._global['PointerEvent'] !== undefined;\nfunction getCapturedShape(pointerId) {\n return Captures.get(pointerId);\n}\nfunction createEvent(evt) {\n return {\n evt,\n pointerId: evt.pointerId,\n };\n}\nfunction hasPointerCapture(pointerId, shape) {\n return Captures.get(pointerId) === shape;\n}\nfunction setPointerCapture(pointerId, shape) {\n releaseCapture(pointerId);\n const stage = shape.getStage();\n if (!stage)\n return;\n Captures.set(pointerId, shape);\n if (SUPPORT_POINTER_EVENTS) {\n shape._fire('gotpointercapture', createEvent(new PointerEvent('gotpointercapture')));\n }\n}\nfunction releaseCapture(pointerId, target) {\n const shape = Captures.get(pointerId);\n if (!shape)\n return;\n const stage = shape.getStage();\n if (stage && stage.content) {\n }\n Captures.delete(pointerId);\n if (SUPPORT_POINTER_EVENTS) {\n shape._fire('lostpointercapture', createEvent(new PointerEvent('lostpointercapture')));\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Stage = exports.stages = void 0;\nconst Util_1 = require(\"./Util\");\nconst Factory_1 = require(\"./Factory\");\nconst Container_1 = require(\"./Container\");\nconst Global_1 = require(\"./Global\");\nconst Canvas_1 = require(\"./Canvas\");\nconst DragAndDrop_1 = require(\"./DragAndDrop\");\nconst Global_2 = require(\"./Global\");\nconst PointerEvents = require(\"./PointerEvents\");\nconst STAGE = 'Stage', STRING = 'string', PX = 'px', MOUSEOUT = 'mouseout', MOUSELEAVE = 'mouseleave', MOUSEOVER = 'mouseover', MOUSEENTER = 'mouseenter', MOUSEMOVE = 'mousemove', MOUSEDOWN = 'mousedown', MOUSEUP = 'mouseup', POINTERMOVE = 'pointermove', POINTERDOWN = 'pointerdown', POINTERUP = 'pointerup', POINTERCANCEL = 'pointercancel', LOSTPOINTERCAPTURE = 'lostpointercapture', POINTEROUT = 'pointerout', POINTERLEAVE = 'pointerleave', POINTEROVER = 'pointerover', POINTERENTER = 'pointerenter', CONTEXTMENU = 'contextmenu', TOUCHSTART = 'touchstart', TOUCHEND = 'touchend', TOUCHMOVE = 'touchmove', TOUCHCANCEL = 'touchcancel', WHEEL = 'wheel', MAX_LAYERS_NUMBER = 5, EVENTS = [\n [MOUSEENTER, '_pointerenter'],\n [MOUSEDOWN, '_pointerdown'],\n [MOUSEMOVE, '_pointermove'],\n [MOUSEUP, '_pointerup'],\n [MOUSELEAVE, '_pointerleave'],\n [TOUCHSTART, '_pointerdown'],\n [TOUCHMOVE, '_pointermove'],\n [TOUCHEND, '_pointerup'],\n [TOUCHCANCEL, '_pointercancel'],\n [MOUSEOVER, '_pointerover'],\n [WHEEL, '_wheel'],\n [CONTEXTMENU, '_contextmenu'],\n [POINTERDOWN, '_pointerdown'],\n [POINTERMOVE, '_pointermove'],\n [POINTERUP, '_pointerup'],\n [POINTERCANCEL, '_pointercancel'],\n [LOSTPOINTERCAPTURE, '_lostpointercapture'],\n];\nconst EVENTS_MAP = {\n mouse: {\n [POINTEROUT]: MOUSEOUT,\n [POINTERLEAVE]: MOUSELEAVE,\n [POINTEROVER]: MOUSEOVER,\n [POINTERENTER]: MOUSEENTER,\n [POINTERMOVE]: MOUSEMOVE,\n [POINTERDOWN]: MOUSEDOWN,\n [POINTERUP]: MOUSEUP,\n [POINTERCANCEL]: 'mousecancel',\n pointerclick: 'click',\n pointerdblclick: 'dblclick',\n },\n touch: {\n [POINTEROUT]: 'touchout',\n [POINTERLEAVE]: 'touchleave',\n [POINTEROVER]: 'touchover',\n [POINTERENTER]: 'touchenter',\n [POINTERMOVE]: TOUCHMOVE,\n [POINTERDOWN]: TOUCHSTART,\n [POINTERUP]: TOUCHEND,\n [POINTERCANCEL]: TOUCHCANCEL,\n pointerclick: 'tap',\n pointerdblclick: 'dbltap',\n },\n pointer: {\n [POINTEROUT]: POINTEROUT,\n [POINTERLEAVE]: POINTERLEAVE,\n [POINTEROVER]: POINTEROVER,\n [POINTERENTER]: POINTERENTER,\n [POINTERMOVE]: POINTERMOVE,\n [POINTERDOWN]: POINTERDOWN,\n [POINTERUP]: POINTERUP,\n [POINTERCANCEL]: POINTERCANCEL,\n pointerclick: 'pointerclick',\n pointerdblclick: 'pointerdblclick',\n },\n};\nconst getEventType = (type) => {\n if (type.indexOf('pointer') >= 0) {\n return 'pointer';\n }\n if (type.indexOf('touch') >= 0) {\n return 'touch';\n }\n return 'mouse';\n};\nconst getEventsMap = (eventType) => {\n const type = getEventType(eventType);\n if (type === 'pointer') {\n return Global_1.Konva.pointerEventsEnabled && EVENTS_MAP.pointer;\n }\n if (type === 'touch') {\n return EVENTS_MAP.touch;\n }\n if (type === 'mouse') {\n return EVENTS_MAP.mouse;\n }\n};\nfunction checkNoClip(attrs = {}) {\n if (attrs.clipFunc || attrs.clipWidth || attrs.clipHeight) {\n Util_1.Util.warn('Stage does not support clipping. Please use clip for Layers or Groups.');\n }\n return attrs;\n}\nconst NO_POINTERS_MESSAGE = `Pointer position is missing and not registered by the stage. Looks like it is outside of the stage container. You can set it manually from event: stage.setPointersPositions(event);`;\nexports.stages = [];\nclass Stage extends Container_1.Container {\n constructor(config) {\n super(checkNoClip(config));\n this._pointerPositions = [];\n this._changedPointerPositions = [];\n this._buildDOM();\n this._bindContentEvents();\n exports.stages.push(this);\n this.on('widthChange.konva heightChange.konva', this._resizeDOM);\n this.on('visibleChange.konva', this._checkVisibility);\n this.on('clipWidthChange.konva clipHeightChange.konva clipFuncChange.konva', () => {\n checkNoClip(this.attrs);\n });\n this._checkVisibility();\n }\n _validateAdd(child) {\n const isLayer = child.getType() === 'Layer';\n const isFastLayer = child.getType() === 'FastLayer';\n const valid = isLayer || isFastLayer;\n if (!valid) {\n Util_1.Util.throw('You may only add layers to the stage.');\n }\n }\n _checkVisibility() {\n if (!this.content) {\n return;\n }\n const style = this.visible() ? '' : 'none';\n this.content.style.display = style;\n }\n setContainer(container) {\n if (typeof container === STRING) {\n if (container.charAt(0) === '.') {\n const className = container.slice(1);\n container = document.getElementsByClassName(className)[0];\n }\n else {\n var id;\n if (container.charAt(0) !== '#') {\n id = container;\n }\n else {\n id = container.slice(1);\n }\n container = document.getElementById(id);\n }\n if (!container) {\n throw 'Can not find container in document with id ' + id;\n }\n }\n this._setAttr('container', container);\n if (this.content) {\n if (this.content.parentElement) {\n this.content.parentElement.removeChild(this.content);\n }\n container.appendChild(this.content);\n }\n return this;\n }\n shouldDrawHit() {\n return true;\n }\n clear() {\n const layers = this.children, len = layers.length;\n for (let n = 0; n < len; n++) {\n layers[n].clear();\n }\n return this;\n }\n clone(obj) {\n if (!obj) {\n obj = {};\n }\n obj.container =\n typeof document !== 'undefined' && document.createElement('div');\n return Container_1.Container.prototype.clone.call(this, obj);\n }\n destroy() {\n super.destroy();\n const content = this.content;\n if (content && Util_1.Util._isInDocument(content)) {\n this.container().removeChild(content);\n }\n const index = exports.stages.indexOf(this);\n if (index > -1) {\n exports.stages.splice(index, 1);\n }\n Util_1.Util.releaseCanvas(this.bufferCanvas._canvas, this.bufferHitCanvas._canvas);\n return this;\n }\n getPointerPosition() {\n const pos = this._pointerPositions[0] || this._changedPointerPositions[0];\n if (!pos) {\n Util_1.Util.warn(NO_POINTERS_MESSAGE);\n return null;\n }\n return {\n x: pos.x,\n y: pos.y,\n };\n }\n _getPointerById(id) {\n return this._pointerPositions.find((p) => p.id === id);\n }\n getPointersPositions() {\n return this._pointerPositions;\n }\n getStage() {\n return this;\n }\n getContent() {\n return this.content;\n }\n _toKonvaCanvas(config) {\n config = config || {};\n config.x = config.x || 0;\n config.y = config.y || 0;\n config.width = config.width || this.width();\n config.height = config.height || this.height();\n const canvas = new Canvas_1.SceneCanvas({\n width: config.width,\n height: config.height,\n pixelRatio: config.pixelRatio || 1,\n });\n const _context = canvas.getContext()._context;\n const layers = this.children;\n if (config.x || config.y) {\n _context.translate(-1 * config.x, -1 * config.y);\n }\n layers.forEach(function (layer) {\n if (!layer.isVisible()) {\n return;\n }\n const layerCanvas = layer._toKonvaCanvas(config);\n _context.drawImage(layerCanvas._canvas, config.x, config.y, layerCanvas.getWidth() / layerCanvas.getPixelRatio(), layerCanvas.getHeight() / layerCanvas.getPixelRatio());\n });\n return canvas;\n }\n getIntersection(pos) {\n if (!pos) {\n return null;\n }\n const layers = this.children, len = layers.length, end = len - 1;\n for (let n = end; n >= 0; n--) {\n const shape = layers[n].getIntersection(pos);\n if (shape) {\n return shape;\n }\n }\n return null;\n }\n _resizeDOM() {\n const width = this.width();\n const height = this.height();\n if (this.content) {\n this.content.style.width = width + PX;\n this.content.style.height = height + PX;\n }\n this.bufferCanvas.setSize(width, height);\n this.bufferHitCanvas.setSize(width, height);\n this.children.forEach((layer) => {\n layer.setSize({ width, height });\n layer.draw();\n });\n }\n add(layer, ...rest) {\n if (arguments.length > 1) {\n for (let i = 0; i < arguments.length; i++) {\n this.add(arguments[i]);\n }\n return this;\n }\n super.add(layer);\n const length = this.children.length;\n if (length > MAX_LAYERS_NUMBER) {\n Util_1.Util.warn('The stage has ' +\n length +\n ' layers. Recommended maximum number of layers is 3-5. Adding more layers into the stage may drop the performance. Rethink your tree structure, you can use Konva.Group.');\n }\n layer.setSize({ width: this.width(), height: this.height() });\n layer.draw();\n if (Global_1.Konva.isBrowser) {\n this.content.appendChild(layer.canvas._canvas);\n }\n return this;\n }\n getParent() {\n return null;\n }\n getLayer() {\n return null;\n }\n hasPointerCapture(pointerId) {\n return PointerEvents.hasPointerCapture(pointerId, this);\n }\n setPointerCapture(pointerId) {\n PointerEvents.setPointerCapture(pointerId, this);\n }\n releaseCapture(pointerId) {\n PointerEvents.releaseCapture(pointerId, this);\n }\n getLayers() {\n return this.children;\n }\n _bindContentEvents() {\n if (!Global_1.Konva.isBrowser) {\n return;\n }\n EVENTS.forEach(([event, methodName]) => {\n this.content.addEventListener(event, (evt) => {\n this[methodName](evt);\n }, { passive: false });\n });\n }\n _pointerenter(evt) {\n this.setPointersPositions(evt);\n const events = getEventsMap(evt.type);\n if (events) {\n this._fire(events.pointerenter, {\n evt: evt,\n target: this,\n currentTarget: this,\n });\n }\n }\n _pointerover(evt) {\n this.setPointersPositions(evt);\n const events = getEventsMap(evt.type);\n if (events) {\n this._fire(events.pointerover, {\n evt: evt,\n target: this,\n currentTarget: this,\n });\n }\n }\n _getTargetShape(evenType) {\n let shape = this[evenType + 'targetShape'];\n if (shape && !shape.getStage()) {\n shape = null;\n }\n return shape;\n }\n _pointerleave(evt) {\n const events = getEventsMap(evt.type);\n const eventType = getEventType(evt.type);\n if (!events) {\n return;\n }\n this.setPointersPositions(evt);\n const targetShape = this._getTargetShape(eventType);\n const eventsEnabled = !(Global_1.Konva.isDragging() || Global_1.Konva.isTransforming()) || Global_1.Konva.hitOnDragEnabled;\n if (targetShape && eventsEnabled) {\n targetShape._fireAndBubble(events.pointerout, { evt: evt });\n targetShape._fireAndBubble(events.pointerleave, { evt: evt });\n this._fire(events.pointerleave, {\n evt: evt,\n target: this,\n currentTarget: this,\n });\n this[eventType + 'targetShape'] = null;\n }\n else if (eventsEnabled) {\n this._fire(events.pointerleave, {\n evt: evt,\n target: this,\n currentTarget: this,\n });\n this._fire(events.pointerout, {\n evt: evt,\n target: this,\n currentTarget: this,\n });\n }\n this.pointerPos = null;\n this._pointerPositions = [];\n }\n _pointerdown(evt) {\n const events = getEventsMap(evt.type);\n const eventType = getEventType(evt.type);\n if (!events) {\n return;\n }\n this.setPointersPositions(evt);\n let triggeredOnShape = false;\n this._changedPointerPositions.forEach((pos) => {\n const shape = this.getIntersection(pos);\n DragAndDrop_1.DD.justDragged = false;\n Global_1.Konva['_' + eventType + 'ListenClick'] = true;\n if (!shape || !shape.isListening()) {\n this[eventType + 'ClickStartShape'] = undefined;\n return;\n }\n if (Global_1.Konva.capturePointerEventsEnabled) {\n shape.setPointerCapture(pos.id);\n }\n this[eventType + 'ClickStartShape'] = shape;\n shape._fireAndBubble(events.pointerdown, {\n evt: evt,\n pointerId: pos.id,\n });\n triggeredOnShape = true;\n const isTouch = evt.type.indexOf('touch') >= 0;\n if (shape.preventDefault() && evt.cancelable && isTouch) {\n evt.preventDefault();\n }\n });\n if (!triggeredOnShape) {\n this._fire(events.pointerdown, {\n evt: evt,\n target: this,\n currentTarget: this,\n pointerId: this._pointerPositions[0].id,\n });\n }\n }\n _pointermove(evt) {\n const events = getEventsMap(evt.type);\n const eventType = getEventType(evt.type);\n if (!events) {\n return;\n }\n if (Global_1.Konva.isDragging() && DragAndDrop_1.DD.node.preventDefault() && evt.cancelable) {\n evt.preventDefault();\n }\n this.setPointersPositions(evt);\n const eventsEnabled = !(Global_1.Konva.isDragging() || Global_1.Konva.isTransforming()) || Global_1.Konva.hitOnDragEnabled;\n if (!eventsEnabled) {\n return;\n }\n const processedShapesIds = {};\n let triggeredOnShape = false;\n const targetShape = this._getTargetShape(eventType);\n this._changedPointerPositions.forEach((pos) => {\n const shape = (PointerEvents.getCapturedShape(pos.id) ||\n this.getIntersection(pos));\n const pointerId = pos.id;\n const event = { evt: evt, pointerId };\n const differentTarget = targetShape !== shape;\n if (differentTarget && targetShape) {\n targetShape._fireAndBubble(events.pointerout, { ...event }, shape);\n targetShape._fireAndBubble(events.pointerleave, { ...event }, shape);\n }\n if (shape) {\n if (processedShapesIds[shape._id]) {\n return;\n }\n processedShapesIds[shape._id] = true;\n }\n if (shape && shape.isListening()) {\n triggeredOnShape = true;\n if (differentTarget) {\n shape._fireAndBubble(events.pointerover, { ...event }, targetShape);\n shape._fireAndBubble(events.pointerenter, { ...event }, targetShape);\n this[eventType + 'targetShape'] = shape;\n }\n shape._fireAndBubble(events.pointermove, { ...event });\n }\n else {\n if (targetShape) {\n this._fire(events.pointerover, {\n evt: evt,\n target: this,\n currentTarget: this,\n pointerId,\n });\n this[eventType + 'targetShape'] = null;\n }\n }\n });\n if (!triggeredOnShape) {\n this._fire(events.pointermove, {\n evt: evt,\n target: this,\n currentTarget: this,\n pointerId: this._changedPointerPositions[0].id,\n });\n }\n }\n _pointerup(evt) {\n const events = getEventsMap(evt.type);\n const eventType = getEventType(evt.type);\n if (!events) {\n return;\n }\n this.setPointersPositions(evt);\n const clickStartShape = this[eventType + 'ClickStartShape'];\n const clickEndShape = this[eventType + 'ClickEndShape'];\n const processedShapesIds = {};\n let triggeredOnShape = false;\n this._changedPointerPositions.forEach((pos) => {\n const shape = (PointerEvents.getCapturedShape(pos.id) ||\n this.getIntersection(pos));\n if (shape) {\n shape.releaseCapture(pos.id);\n if (processedShapesIds[shape._id]) {\n return;\n }\n processedShapesIds[shape._id] = true;\n }\n const pointerId = pos.id;\n const event = { evt: evt, pointerId };\n let fireDblClick = false;\n if (Global_1.Konva['_' + eventType + 'InDblClickWindow']) {\n fireDblClick = true;\n clearTimeout(this[eventType + 'DblTimeout']);\n }\n else if (!DragAndDrop_1.DD.justDragged) {\n Global_1.Konva['_' + eventType + 'InDblClickWindow'] = true;\n clearTimeout(this[eventType + 'DblTimeout']);\n }\n this[eventType + 'DblTimeout'] = setTimeout(function () {\n Global_1.Konva['_' + eventType + 'InDblClickWindow'] = false;\n }, Global_1.Konva.dblClickWindow);\n if (shape && shape.isListening()) {\n triggeredOnShape = true;\n this[eventType + 'ClickEndShape'] = shape;\n shape._fireAndBubble(events.pointerup, { ...event });\n if (Global_1.Konva['_' + eventType + 'ListenClick'] &&\n clickStartShape &&\n clickStartShape === shape) {\n shape._fireAndBubble(events.pointerclick, { ...event });\n if (fireDblClick && clickEndShape && clickEndShape === shape) {\n shape._fireAndBubble(events.pointerdblclick, { ...event });\n }\n }\n }\n else {\n this[eventType + 'ClickEndShape'] = null;\n if (Global_1.Konva['_' + eventType + 'ListenClick']) {\n this._fire(events.pointerclick, {\n evt: evt,\n target: this,\n currentTarget: this,\n pointerId,\n });\n }\n if (fireDblClick) {\n this._fire(events.pointerdblclick, {\n evt: evt,\n target: this,\n currentTarget: this,\n pointerId,\n });\n }\n }\n });\n if (!triggeredOnShape) {\n this._fire(events.pointerup, {\n evt: evt,\n target: this,\n currentTarget: this,\n pointerId: this._changedPointerPositions[0].id,\n });\n }\n Global_1.Konva['_' + eventType + 'ListenClick'] = false;\n if (evt.cancelable && eventType !== 'touch' && eventType !== 'pointer') {\n evt.preventDefault();\n }\n }\n _contextmenu(evt) {\n this.setPointersPositions(evt);\n const shape = this.getIntersection(this.getPointerPosition());\n if (shape && shape.isListening()) {\n shape._fireAndBubble(CONTEXTMENU, { evt: evt });\n }\n else {\n this._fire(CONTEXTMENU, {\n evt: evt,\n target: this,\n currentTarget: this,\n });\n }\n }\n _wheel(evt) {\n this.setPointersPositions(evt);\n const shape = this.getIntersection(this.getPointerPosition());\n if (shape && shape.isListening()) {\n shape._fireAndBubble(WHEEL, { evt: evt });\n }\n else {\n this._fire(WHEEL, {\n evt: evt,\n target: this,\n currentTarget: this,\n });\n }\n }\n _pointercancel(evt) {\n this.setPointersPositions(evt);\n const shape = PointerEvents.getCapturedShape(evt.pointerId) ||\n this.getIntersection(this.getPointerPosition());\n if (shape) {\n shape._fireAndBubble(POINTERUP, PointerEvents.createEvent(evt));\n }\n PointerEvents.releaseCapture(evt.pointerId);\n }\n _lostpointercapture(evt) {\n PointerEvents.releaseCapture(evt.pointerId);\n }\n setPointersPositions(evt) {\n const contentPosition = this._getContentPosition();\n let x = null, y = null;\n evt = evt ? evt : window.event;\n if (evt.touches !== undefined) {\n this._pointerPositions = [];\n this._changedPointerPositions = [];\n Array.prototype.forEach.call(evt.touches, (touch) => {\n this._pointerPositions.push({\n id: touch.identifier,\n x: (touch.clientX - contentPosition.left) / contentPosition.scaleX,\n y: (touch.clientY - contentPosition.top) / contentPosition.scaleY,\n });\n });\n Array.prototype.forEach.call(evt.changedTouches || evt.touches, (touch) => {\n this._changedPointerPositions.push({\n id: touch.identifier,\n x: (touch.clientX - contentPosition.left) / contentPosition.scaleX,\n y: (touch.clientY - contentPosition.top) / contentPosition.scaleY,\n });\n });\n }\n else {\n x = (evt.clientX - contentPosition.left) / contentPosition.scaleX;\n y = (evt.clientY - contentPosition.top) / contentPosition.scaleY;\n this.pointerPos = {\n x: x,\n y: y,\n };\n this._pointerPositions = [{ x, y, id: Util_1.Util._getFirstPointerId(evt) }];\n this._changedPointerPositions = [\n { x, y, id: Util_1.Util._getFirstPointerId(evt) },\n ];\n }\n }\n _setPointerPosition(evt) {\n Util_1.Util.warn('Method _setPointerPosition is deprecated. Use \"stage.setPointersPositions(event)\" instead.');\n this.setPointersPositions(evt);\n }\n _getContentPosition() {\n if (!this.content || !this.content.getBoundingClientRect) {\n return {\n top: 0,\n left: 0,\n scaleX: 1,\n scaleY: 1,\n };\n }\n const rect = this.content.getBoundingClientRect();\n return {\n top: rect.top,\n left: rect.left,\n scaleX: rect.width / this.content.clientWidth || 1,\n scaleY: rect.height / this.content.clientHeight || 1,\n };\n }\n _buildDOM() {\n this.bufferCanvas = new Canvas_1.SceneCanvas({\n width: this.width(),\n height: this.height(),\n });\n this.bufferHitCanvas = new Canvas_1.HitCanvas({\n pixelRatio: 1,\n width: this.width(),\n height: this.height(),\n });\n if (!Global_1.Konva.isBrowser) {\n return;\n }\n const container = this.container();\n if (!container) {\n throw 'Stage has no container. A container is required.';\n }\n container.innerHTML = '';\n this.content = document.createElement('div');\n this.content.style.position = 'relative';\n this.content.style.userSelect = 'none';\n this.content.className = 'konvajs-content';\n this.content.setAttribute('role', 'presentation');\n container.appendChild(this.content);\n this._resizeDOM();\n }\n cache() {\n Util_1.Util.warn('Cache function is not allowed for stage. You may use cache only for layers, groups and shapes.');\n return this;\n }\n clearCache() {\n return this;\n }\n batchDraw() {\n this.getChildren().forEach(function (layer) {\n layer.batchDraw();\n });\n return this;\n }\n}\nexports.Stage = Stage;\nStage.prototype.nodeType = STAGE;\n(0, Global_2._registerNode)(Stage);\nFactory_1.Factory.addGetterSetter(Stage, 'container');\nif (Global_1.Konva.isBrowser) {\n document.addEventListener('visibilitychange', () => {\n exports.stages.forEach((stage) => {\n stage.batchDraw();\n });\n });\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Shape = exports.shapes = void 0;\nconst Global_1 = require(\"./Global\");\nconst Util_1 = require(\"./Util\");\nconst Factory_1 = require(\"./Factory\");\nconst Node_1 = require(\"./Node\");\nconst Validators_1 = require(\"./Validators\");\nconst Global_2 = require(\"./Global\");\nconst PointerEvents = require(\"./PointerEvents\");\nconst HAS_SHADOW = 'hasShadow';\nconst SHADOW_RGBA = 'shadowRGBA';\nconst patternImage = 'patternImage';\nconst linearGradient = 'linearGradient';\nconst radialGradient = 'radialGradient';\nlet dummyContext;\nfunction getDummyContext() {\n if (dummyContext) {\n return dummyContext;\n }\n dummyContext = Util_1.Util.createCanvasElement().getContext('2d');\n return dummyContext;\n}\nexports.shapes = {};\nfunction _fillFunc(context) {\n const fillRule = this.attrs.fillRule;\n if (fillRule) {\n context.fill(fillRule);\n }\n else {\n context.fill();\n }\n}\nfunction _strokeFunc(context) {\n context.stroke();\n}\nfunction _fillFuncHit(context) {\n const fillRule = this.attrs.fillRule;\n if (fillRule) {\n context.fill(fillRule);\n }\n else {\n context.fill();\n }\n}\nfunction _strokeFuncHit(context) {\n context.stroke();\n}\nfunction _clearHasShadowCache() {\n this._clearCache(HAS_SHADOW);\n}\nfunction _clearGetShadowRGBACache() {\n this._clearCache(SHADOW_RGBA);\n}\nfunction _clearFillPatternCache() {\n this._clearCache(patternImage);\n}\nfunction _clearLinearGradientCache() {\n this._clearCache(linearGradient);\n}\nfunction _clearRadialGradientCache() {\n this._clearCache(radialGradient);\n}\nclass Shape extends Node_1.Node {\n constructor(config) {\n super(config);\n let key;\n while (true) {\n key = Util_1.Util.getRandomColor();\n if (key && !(key in exports.shapes)) {\n break;\n }\n }\n this.colorKey = key;\n exports.shapes[key] = this;\n }\n getContext() {\n Util_1.Util.warn('shape.getContext() method is deprecated. Please do not use it.');\n return this.getLayer().getContext();\n }\n getCanvas() {\n Util_1.Util.warn('shape.getCanvas() method is deprecated. Please do not use it.');\n return this.getLayer().getCanvas();\n }\n getSceneFunc() {\n return this.attrs.sceneFunc || this['_sceneFunc'];\n }\n getHitFunc() {\n return this.attrs.hitFunc || this['_hitFunc'];\n }\n hasShadow() {\n return this._getCache(HAS_SHADOW, this._hasShadow);\n }\n _hasShadow() {\n return (this.shadowEnabled() &&\n this.shadowOpacity() !== 0 &&\n !!(this.shadowColor() ||\n this.shadowBlur() ||\n this.shadowOffsetX() ||\n this.shadowOffsetY()));\n }\n _getFillPattern() {\n return this._getCache(patternImage, this.__getFillPattern);\n }\n __getFillPattern() {\n if (this.fillPatternImage()) {\n const ctx = getDummyContext();\n const pattern = ctx.createPattern(this.fillPatternImage(), this.fillPatternRepeat() || 'repeat');\n if (pattern && pattern.setTransform) {\n const tr = new Util_1.Transform();\n tr.translate(this.fillPatternX(), this.fillPatternY());\n tr.rotate(Global_1.Konva.getAngle(this.fillPatternRotation()));\n tr.scale(this.fillPatternScaleX(), this.fillPatternScaleY());\n tr.translate(-1 * this.fillPatternOffsetX(), -1 * this.fillPatternOffsetY());\n const m = tr.getMatrix();\n const matrix = typeof DOMMatrix === 'undefined'\n ? {\n a: m[0],\n b: m[1],\n c: m[2],\n d: m[3],\n e: m[4],\n f: m[5],\n }\n : new DOMMatrix(m);\n pattern.setTransform(matrix);\n }\n return pattern;\n }\n }\n _getLinearGradient() {\n return this._getCache(linearGradient, this.__getLinearGradient);\n }\n __getLinearGradient() {\n const colorStops = this.fillLinearGradientColorStops();\n if (colorStops) {\n const ctx = getDummyContext();\n const start = this.fillLinearGradientStartPoint();\n const end = this.fillLinearGradientEndPoint();\n const grd = ctx.createLinearGradient(start.x, start.y, end.x, end.y);\n for (let n = 0; n < colorStops.length; n += 2) {\n grd.addColorStop(colorStops[n], colorStops[n + 1]);\n }\n return grd;\n }\n }\n _getRadialGradient() {\n return this._getCache(radialGradient, this.__getRadialGradient);\n }\n __getRadialGradient() {\n const colorStops = this.fillRadialGradientColorStops();\n if (colorStops) {\n const ctx = getDummyContext();\n const start = this.fillRadialGradientStartPoint();\n const end = this.fillRadialGradientEndPoint();\n const grd = ctx.createRadialGradient(start.x, start.y, this.fillRadialGradientStartRadius(), end.x, end.y, this.fillRadialGradientEndRadius());\n for (let n = 0; n < colorStops.length; n += 2) {\n grd.addColorStop(colorStops[n], colorStops[n + 1]);\n }\n return grd;\n }\n }\n getShadowRGBA() {\n return this._getCache(SHADOW_RGBA, this._getShadowRGBA);\n }\n _getShadowRGBA() {\n if (!this.hasShadow()) {\n return;\n }\n const rgba = Util_1.Util.colorToRGBA(this.shadowColor());\n if (rgba) {\n return ('rgba(' +\n rgba.r +\n ',' +\n rgba.g +\n ',' +\n rgba.b +\n ',' +\n rgba.a * (this.shadowOpacity() || 1) +\n ')');\n }\n }\n hasFill() {\n return this._calculate('hasFill', [\n 'fillEnabled',\n 'fill',\n 'fillPatternImage',\n 'fillLinearGradientColorStops',\n 'fillRadialGradientColorStops',\n ], () => {\n return (this.fillEnabled() &&\n !!(this.fill() ||\n this.fillPatternImage() ||\n this.fillLinearGradientColorStops() ||\n this.fillRadialGradientColorStops()));\n });\n }\n hasStroke() {\n return this._calculate('hasStroke', [\n 'strokeEnabled',\n 'strokeWidth',\n 'stroke',\n 'strokeLinearGradientColorStops',\n ], () => {\n return (this.strokeEnabled() &&\n this.strokeWidth() &&\n !!(this.stroke() || this.strokeLinearGradientColorStops()));\n });\n }\n hasHitStroke() {\n const width = this.hitStrokeWidth();\n if (width === 'auto') {\n return this.hasStroke();\n }\n return this.strokeEnabled() && !!width;\n }\n intersects(point) {\n const stage = this.getStage();\n if (!stage) {\n return false;\n }\n const bufferHitCanvas = stage.bufferHitCanvas;\n bufferHitCanvas.getContext().clear();\n this.drawHit(bufferHitCanvas, undefined, true);\n const p = bufferHitCanvas.context.getImageData(Math.round(point.x), Math.round(point.y), 1, 1).data;\n return p[3] > 0;\n }\n destroy() {\n Node_1.Node.prototype.destroy.call(this);\n delete exports.shapes[this.colorKey];\n delete this.colorKey;\n return this;\n }\n _useBufferCanvas(forceFill) {\n var _a;\n const perfectDrawEnabled = (_a = this.attrs.perfectDrawEnabled) !== null && _a !== void 0 ? _a : true;\n if (!perfectDrawEnabled) {\n return false;\n }\n const hasFill = forceFill || this.hasFill();\n const hasStroke = this.hasStroke();\n const isTransparent = this.getAbsoluteOpacity() !== 1;\n if (hasFill && hasStroke && isTransparent) {\n return true;\n }\n const hasShadow = this.hasShadow();\n const strokeForShadow = this.shadowForStrokeEnabled();\n if (hasFill && hasStroke && hasShadow && strokeForShadow) {\n return true;\n }\n return false;\n }\n setStrokeHitEnabled(val) {\n Util_1.Util.warn('strokeHitEnabled property is deprecated. Please use hitStrokeWidth instead.');\n if (val) {\n this.hitStrokeWidth('auto');\n }\n else {\n this.hitStrokeWidth(0);\n }\n }\n getStrokeHitEnabled() {\n if (this.hitStrokeWidth() === 0) {\n return false;\n }\n else {\n return true;\n }\n }\n getSelfRect() {\n const size = this.size();\n return {\n x: this._centroid ? -size.width / 2 : 0,\n y: this._centroid ? -size.height / 2 : 0,\n width: size.width,\n height: size.height,\n };\n }\n getClientRect(config = {}) {\n let hasCachedParent = false;\n let parent = this.getParent();\n while (parent) {\n if (parent.isCached()) {\n hasCachedParent = true;\n break;\n }\n parent = parent.getParent();\n }\n const skipTransform = config.skipTransform;\n const relativeTo = config.relativeTo || (hasCachedParent && this.getStage()) || undefined;\n const fillRect = this.getSelfRect();\n const applyStroke = !config.skipStroke && this.hasStroke();\n const strokeWidth = (applyStroke && this.strokeWidth()) || 0;\n const fillAndStrokeWidth = fillRect.width + strokeWidth;\n const fillAndStrokeHeight = fillRect.height + strokeWidth;\n const applyShadow = !config.skipShadow && this.hasShadow();\n const shadowOffsetX = applyShadow ? this.shadowOffsetX() : 0;\n const shadowOffsetY = applyShadow ? this.shadowOffsetY() : 0;\n const preWidth = fillAndStrokeWidth + Math.abs(shadowOffsetX);\n const preHeight = fillAndStrokeHeight + Math.abs(shadowOffsetY);\n const blurRadius = (applyShadow && this.shadowBlur()) || 0;\n const width = preWidth + blurRadius * 2;\n const height = preHeight + blurRadius * 2;\n const rect = {\n width: width,\n height: height,\n x: -(strokeWidth / 2 + blurRadius) +\n Math.min(shadowOffsetX, 0) +\n fillRect.x,\n y: -(strokeWidth / 2 + blurRadius) +\n Math.min(shadowOffsetY, 0) +\n fillRect.y,\n };\n if (!skipTransform) {\n return this._transformedRect(rect, relativeTo);\n }\n return rect;\n }\n drawScene(can, top, bufferCanvas) {\n const layer = this.getLayer();\n let canvas = can || layer.getCanvas(), context = canvas.getContext(), cachedCanvas = this._getCanvasCache(), drawFunc = this.getSceneFunc(), hasShadow = this.hasShadow(), stage, bufferContext;\n const skipBuffer = canvas.isCache;\n const cachingSelf = top === this;\n if (!this.isVisible() && !cachingSelf) {\n return this;\n }\n if (cachedCanvas) {\n context.save();\n const m = this.getAbsoluteTransform(top).getMatrix();\n context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n this._drawCachedSceneCanvas(context);\n context.restore();\n return this;\n }\n if (!drawFunc) {\n return this;\n }\n context.save();\n if (this._useBufferCanvas() && !skipBuffer) {\n stage = this.getStage();\n const bc = bufferCanvas || stage.bufferCanvas;\n bufferContext = bc.getContext();\n bufferContext.clear();\n bufferContext.save();\n bufferContext._applyLineJoin(this);\n var o = this.getAbsoluteTransform(top).getMatrix();\n bufferContext.transform(o[0], o[1], o[2], o[3], o[4], o[5]);\n drawFunc.call(this, bufferContext, this);\n bufferContext.restore();\n const ratio = bc.pixelRatio;\n if (hasShadow) {\n context._applyShadow(this);\n }\n context._applyOpacity(this);\n context._applyGlobalCompositeOperation(this);\n context.drawImage(bc._canvas, 0, 0, bc.width / ratio, bc.height / ratio);\n }\n else {\n context._applyLineJoin(this);\n if (!cachingSelf) {\n var o = this.getAbsoluteTransform(top).getMatrix();\n context.transform(o[0], o[1], o[2], o[3], o[4], o[5]);\n context._applyOpacity(this);\n context._applyGlobalCompositeOperation(this);\n }\n if (hasShadow) {\n context._applyShadow(this);\n }\n drawFunc.call(this, context, this);\n }\n context.restore();\n return this;\n }\n drawHit(can, top, skipDragCheck = false) {\n if (!this.shouldDrawHit(top, skipDragCheck)) {\n return this;\n }\n const layer = this.getLayer(), canvas = can || layer.hitCanvas, context = canvas && canvas.getContext(), drawFunc = this.hitFunc() || this.sceneFunc(), cachedCanvas = this._getCanvasCache(), cachedHitCanvas = cachedCanvas && cachedCanvas.hit;\n if (!this.colorKey) {\n Util_1.Util.warn('Looks like your canvas has a destroyed shape in it. Do not reuse shape after you destroyed it. If you want to reuse shape you should call remove() instead of destroy()');\n }\n if (cachedHitCanvas) {\n context.save();\n const m = this.getAbsoluteTransform(top).getMatrix();\n context.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n this._drawCachedHitCanvas(context);\n context.restore();\n return this;\n }\n if (!drawFunc) {\n return this;\n }\n context.save();\n context._applyLineJoin(this);\n const selfCache = this === top;\n if (!selfCache) {\n const o = this.getAbsoluteTransform(top).getMatrix();\n context.transform(o[0], o[1], o[2], o[3], o[4], o[5]);\n }\n drawFunc.call(this, context, this);\n context.restore();\n return this;\n }\n drawHitFromCache(alphaThreshold = 0) {\n const cachedCanvas = this._getCanvasCache(), sceneCanvas = this._getCachedSceneCanvas(), hitCanvas = cachedCanvas.hit, hitContext = hitCanvas.getContext(), hitWidth = hitCanvas.getWidth(), hitHeight = hitCanvas.getHeight();\n hitContext.clear();\n hitContext.drawImage(sceneCanvas._canvas, 0, 0, hitWidth, hitHeight);\n try {\n const hitImageData = hitContext.getImageData(0, 0, hitWidth, hitHeight);\n const hitData = hitImageData.data;\n const len = hitData.length;\n const rgbColorKey = Util_1.Util._hexToRgb(this.colorKey);\n for (let i = 0; i < len; i += 4) {\n const alpha = hitData[i + 3];\n if (alpha > alphaThreshold) {\n hitData[i] = rgbColorKey.r;\n hitData[i + 1] = rgbColorKey.g;\n hitData[i + 2] = rgbColorKey.b;\n hitData[i + 3] = 255;\n }\n else {\n hitData[i + 3] = 0;\n }\n }\n hitContext.putImageData(hitImageData, 0, 0);\n }\n catch (e) {\n Util_1.Util.error('Unable to draw hit graph from cached scene canvas. ' + e.message);\n }\n return this;\n }\n hasPointerCapture(pointerId) {\n return PointerEvents.hasPointerCapture(pointerId, this);\n }\n setPointerCapture(pointerId) {\n PointerEvents.setPointerCapture(pointerId, this);\n }\n releaseCapture(pointerId) {\n PointerEvents.releaseCapture(pointerId, this);\n }\n}\nexports.Shape = Shape;\nShape.prototype._fillFunc = _fillFunc;\nShape.prototype._strokeFunc = _strokeFunc;\nShape.prototype._fillFuncHit = _fillFuncHit;\nShape.prototype._strokeFuncHit = _strokeFuncHit;\nShape.prototype._centroid = false;\nShape.prototype.nodeType = 'Shape';\n(0, Global_2._registerNode)(Shape);\nShape.prototype.eventListeners = {};\nShape.prototype.on.call(Shape.prototype, 'shadowColorChange.konva shadowBlurChange.konva shadowOffsetChange.konva shadowOpacityChange.konva shadowEnabledChange.konva', _clearHasShadowCache);\nShape.prototype.on.call(Shape.prototype, 'shadowColorChange.konva shadowOpacityChange.konva shadowEnabledChange.konva', _clearGetShadowRGBACache);\nShape.prototype.on.call(Shape.prototype, 'fillPriorityChange.konva fillPatternImageChange.konva fillPatternRepeatChange.konva fillPatternScaleXChange.konva fillPatternScaleYChange.konva fillPatternOffsetXChange.konva fillPatternOffsetYChange.konva fillPatternXChange.konva fillPatternYChange.konva fillPatternRotationChange.konva', _clearFillPatternCache);\nShape.prototype.on.call(Shape.prototype, 'fillPriorityChange.konva fillLinearGradientColorStopsChange.konva fillLinearGradientStartPointXChange.konva fillLinearGradientStartPointYChange.konva fillLinearGradientEndPointXChange.konva fillLinearGradientEndPointYChange.konva', _clearLinearGradientCache);\nShape.prototype.on.call(Shape.prototype, 'fillPriorityChange.konva fillRadialGradientColorStopsChange.konva fillRadialGradientStartPointXChange.konva fillRadialGradientStartPointYChange.konva fillRadialGradientEndPointXChange.konva fillRadialGradientEndPointYChange.konva fillRadialGradientStartRadiusChange.konva fillRadialGradientEndRadiusChange.konva', _clearRadialGradientCache);\nFactory_1.Factory.addGetterSetter(Shape, 'stroke', undefined, (0, Validators_1.getStringOrGradientValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'strokeWidth', 2, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'fillAfterStrokeEnabled', false);\nFactory_1.Factory.addGetterSetter(Shape, 'hitStrokeWidth', 'auto', (0, Validators_1.getNumberOrAutoValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'strokeHitEnabled', true, (0, Validators_1.getBooleanValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'perfectDrawEnabled', true, (0, Validators_1.getBooleanValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'shadowForStrokeEnabled', true, (0, Validators_1.getBooleanValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'lineJoin');\nFactory_1.Factory.addGetterSetter(Shape, 'lineCap');\nFactory_1.Factory.addGetterSetter(Shape, 'sceneFunc');\nFactory_1.Factory.addGetterSetter(Shape, 'hitFunc');\nFactory_1.Factory.addGetterSetter(Shape, 'dash');\nFactory_1.Factory.addGetterSetter(Shape, 'dashOffset', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'shadowColor', undefined, (0, Validators_1.getStringValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'shadowBlur', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'shadowOpacity', 1, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addComponentsGetterSetter(Shape, 'shadowOffset', ['x', 'y']);\nFactory_1.Factory.addGetterSetter(Shape, 'shadowOffsetX', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'shadowOffsetY', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'fillPatternImage');\nFactory_1.Factory.addGetterSetter(Shape, 'fill', undefined, (0, Validators_1.getStringOrGradientValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'fillPatternX', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'fillPatternY', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'fillLinearGradientColorStops');\nFactory_1.Factory.addGetterSetter(Shape, 'strokeLinearGradientColorStops');\nFactory_1.Factory.addGetterSetter(Shape, 'fillRadialGradientStartRadius', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'fillRadialGradientEndRadius', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'fillRadialGradientColorStops');\nFactory_1.Factory.addGetterSetter(Shape, 'fillPatternRepeat', 'repeat');\nFactory_1.Factory.addGetterSetter(Shape, 'fillEnabled', true);\nFactory_1.Factory.addGetterSetter(Shape, 'strokeEnabled', true);\nFactory_1.Factory.addGetterSetter(Shape, 'shadowEnabled', true);\nFactory_1.Factory.addGetterSetter(Shape, 'dashEnabled', true);\nFactory_1.Factory.addGetterSetter(Shape, 'strokeScaleEnabled', true);\nFactory_1.Factory.addGetterSetter(Shape, 'fillPriority', 'color');\nFactory_1.Factory.addComponentsGetterSetter(Shape, 'fillPatternOffset', ['x', 'y']);\nFactory_1.Factory.addGetterSetter(Shape, 'fillPatternOffsetX', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'fillPatternOffsetY', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addComponentsGetterSetter(Shape, 'fillPatternScale', ['x', 'y']);\nFactory_1.Factory.addGetterSetter(Shape, 'fillPatternScaleX', 1, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Shape, 'fillPatternScaleY', 1, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addComponentsGetterSetter(Shape, 'fillLinearGradientStartPoint', [\n 'x',\n 'y',\n]);\nFactory_1.Factory.addComponentsGetterSetter(Shape, 'strokeLinearGradientStartPoint', [\n 'x',\n 'y',\n]);\nFactory_1.Factory.addGetterSetter(Shape, 'fillLinearGradientStartPointX', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'strokeLinearGradientStartPointX', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'fillLinearGradientStartPointY', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'strokeLinearGradientStartPointY', 0);\nFactory_1.Factory.addComponentsGetterSetter(Shape, 'fillLinearGradientEndPoint', [\n 'x',\n 'y',\n]);\nFactory_1.Factory.addComponentsGetterSetter(Shape, 'strokeLinearGradientEndPoint', [\n 'x',\n 'y',\n]);\nFactory_1.Factory.addGetterSetter(Shape, 'fillLinearGradientEndPointX', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'strokeLinearGradientEndPointX', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'fillLinearGradientEndPointY', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'strokeLinearGradientEndPointY', 0);\nFactory_1.Factory.addComponentsGetterSetter(Shape, 'fillRadialGradientStartPoint', [\n 'x',\n 'y',\n]);\nFactory_1.Factory.addGetterSetter(Shape, 'fillRadialGradientStartPointX', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'fillRadialGradientStartPointY', 0);\nFactory_1.Factory.addComponentsGetterSetter(Shape, 'fillRadialGradientEndPoint', [\n 'x',\n 'y',\n]);\nFactory_1.Factory.addGetterSetter(Shape, 'fillRadialGradientEndPointX', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'fillRadialGradientEndPointY', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'fillPatternRotation', 0);\nFactory_1.Factory.addGetterSetter(Shape, 'fillRule', undefined, (0, Validators_1.getStringValidator)());\nFactory_1.Factory.backCompat(Shape, {\n dashArray: 'dash',\n getDashArray: 'getDash',\n setDashArray: 'getDash',\n drawFunc: 'sceneFunc',\n getDrawFunc: 'getSceneFunc',\n setDrawFunc: 'setSceneFunc',\n drawHitFunc: 'hitFunc',\n getDrawHitFunc: 'getHitFunc',\n setDrawHitFunc: 'setHitFunc',\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Layer = void 0;\nconst Util_1 = require(\"./Util\");\nconst Container_1 = require(\"./Container\");\nconst Node_1 = require(\"./Node\");\nconst Factory_1 = require(\"./Factory\");\nconst Canvas_1 = require(\"./Canvas\");\nconst Validators_1 = require(\"./Validators\");\nconst Shape_1 = require(\"./Shape\");\nconst Global_1 = require(\"./Global\");\nconst HASH = '#', BEFORE_DRAW = 'beforeDraw', DRAW = 'draw', INTERSECTION_OFFSETS = [\n { x: 0, y: 0 },\n { x: -1, y: -1 },\n { x: 1, y: -1 },\n { x: 1, y: 1 },\n { x: -1, y: 1 },\n], INTERSECTION_OFFSETS_LEN = INTERSECTION_OFFSETS.length;\nclass Layer extends Container_1.Container {\n constructor(config) {\n super(config);\n this.canvas = new Canvas_1.SceneCanvas();\n this.hitCanvas = new Canvas_1.HitCanvas({\n pixelRatio: 1,\n });\n this._waitingForDraw = false;\n this.on('visibleChange.konva', this._checkVisibility);\n this._checkVisibility();\n this.on('imageSmoothingEnabledChange.konva', this._setSmoothEnabled);\n this._setSmoothEnabled();\n }\n createPNGStream() {\n const c = this.canvas._canvas;\n return c.createPNGStream();\n }\n getCanvas() {\n return this.canvas;\n }\n getNativeCanvasElement() {\n return this.canvas._canvas;\n }\n getHitCanvas() {\n return this.hitCanvas;\n }\n getContext() {\n return this.getCanvas().getContext();\n }\n clear(bounds) {\n this.getContext().clear(bounds);\n this.getHitCanvas().getContext().clear(bounds);\n return this;\n }\n setZIndex(index) {\n super.setZIndex(index);\n const stage = this.getStage();\n if (stage && stage.content) {\n stage.content.removeChild(this.getNativeCanvasElement());\n if (index < stage.children.length - 1) {\n stage.content.insertBefore(this.getNativeCanvasElement(), stage.children[index + 1].getCanvas()._canvas);\n }\n else {\n stage.content.appendChild(this.getNativeCanvasElement());\n }\n }\n return this;\n }\n moveToTop() {\n Node_1.Node.prototype.moveToTop.call(this);\n const stage = this.getStage();\n if (stage && stage.content) {\n stage.content.removeChild(this.getNativeCanvasElement());\n stage.content.appendChild(this.getNativeCanvasElement());\n }\n return true;\n }\n moveUp() {\n const moved = Node_1.Node.prototype.moveUp.call(this);\n if (!moved) {\n return false;\n }\n const stage = this.getStage();\n if (!stage || !stage.content) {\n return false;\n }\n stage.content.removeChild(this.getNativeCanvasElement());\n if (this.index < stage.children.length - 1) {\n stage.content.insertBefore(this.getNativeCanvasElement(), stage.children[this.index + 1].getCanvas()._canvas);\n }\n else {\n stage.content.appendChild(this.getNativeCanvasElement());\n }\n return true;\n }\n moveDown() {\n if (Node_1.Node.prototype.moveDown.call(this)) {\n const stage = this.getStage();\n if (stage) {\n const children = stage.children;\n if (stage.content) {\n stage.content.removeChild(this.getNativeCanvasElement());\n stage.content.insertBefore(this.getNativeCanvasElement(), children[this.index + 1].getCanvas()._canvas);\n }\n }\n return true;\n }\n return false;\n }\n moveToBottom() {\n if (Node_1.Node.prototype.moveToBottom.call(this)) {\n const stage = this.getStage();\n if (stage) {\n const children = stage.children;\n if (stage.content) {\n stage.content.removeChild(this.getNativeCanvasElement());\n stage.content.insertBefore(this.getNativeCanvasElement(), children[1].getCanvas()._canvas);\n }\n }\n return true;\n }\n return false;\n }\n getLayer() {\n return this;\n }\n remove() {\n const _canvas = this.getNativeCanvasElement();\n Node_1.Node.prototype.remove.call(this);\n if (_canvas && _canvas.parentNode && Util_1.Util._isInDocument(_canvas)) {\n _canvas.parentNode.removeChild(_canvas);\n }\n return this;\n }\n getStage() {\n return this.parent;\n }\n setSize({ width, height }) {\n this.canvas.setSize(width, height);\n this.hitCanvas.setSize(width, height);\n this._setSmoothEnabled();\n return this;\n }\n _validateAdd(child) {\n const type = child.getType();\n if (type !== 'Group' && type !== 'Shape') {\n Util_1.Util.throw('You may only add groups and shapes to a layer.');\n }\n }\n _toKonvaCanvas(config) {\n config = config || {};\n config.width = config.width || this.getWidth();\n config.height = config.height || this.getHeight();\n config.x = config.x !== undefined ? config.x : this.x();\n config.y = config.y !== undefined ? config.y : this.y();\n return Node_1.Node.prototype._toKonvaCanvas.call(this, config);\n }\n _checkVisibility() {\n const visible = this.visible();\n if (visible) {\n this.canvas._canvas.style.display = 'block';\n }\n else {\n this.canvas._canvas.style.display = 'none';\n }\n }\n _setSmoothEnabled() {\n this.getContext()._context.imageSmoothingEnabled =\n this.imageSmoothingEnabled();\n }\n getWidth() {\n if (this.parent) {\n return this.parent.width();\n }\n }\n setWidth() {\n Util_1.Util.warn('Can not change width of layer. Use \"stage.width(value)\" function instead.');\n }\n getHeight() {\n if (this.parent) {\n return this.parent.height();\n }\n }\n setHeight() {\n Util_1.Util.warn('Can not change height of layer. Use \"stage.height(value)\" function instead.');\n }\n batchDraw() {\n if (!this._waitingForDraw) {\n this._waitingForDraw = true;\n Util_1.Util.requestAnimFrame(() => {\n this.draw();\n this._waitingForDraw = false;\n });\n }\n return this;\n }\n getIntersection(pos) {\n if (!this.isListening() || !this.isVisible()) {\n return null;\n }\n let spiralSearchDistance = 1;\n let continueSearch = false;\n while (true) {\n for (let i = 0; i < INTERSECTION_OFFSETS_LEN; i++) {\n const intersectionOffset = INTERSECTION_OFFSETS[i];\n const obj = this._getIntersection({\n x: pos.x + intersectionOffset.x * spiralSearchDistance,\n y: pos.y + intersectionOffset.y * spiralSearchDistance,\n });\n const shape = obj.shape;\n if (shape) {\n return shape;\n }\n continueSearch = !!obj.antialiased;\n if (!obj.antialiased) {\n break;\n }\n }\n if (continueSearch) {\n spiralSearchDistance += 1;\n }\n else {\n return null;\n }\n }\n }\n _getIntersection(pos) {\n const ratio = this.hitCanvas.pixelRatio;\n const p = this.hitCanvas.context.getImageData(Math.round(pos.x * ratio), Math.round(pos.y * ratio), 1, 1).data;\n const p3 = p[3];\n if (p3 === 255) {\n const colorKey = Util_1.Util._rgbToHex(p[0], p[1], p[2]);\n const shape = Shape_1.shapes[HASH + colorKey];\n if (shape) {\n return {\n shape: shape,\n };\n }\n return {\n antialiased: true,\n };\n }\n else if (p3 > 0) {\n return {\n antialiased: true,\n };\n }\n return {};\n }\n drawScene(can, top) {\n const layer = this.getLayer(), canvas = can || (layer && layer.getCanvas());\n this._fire(BEFORE_DRAW, {\n node: this,\n });\n if (this.clearBeforeDraw()) {\n canvas.getContext().clear();\n }\n Container_1.Container.prototype.drawScene.call(this, canvas, top);\n this._fire(DRAW, {\n node: this,\n });\n return this;\n }\n drawHit(can, top) {\n const layer = this.getLayer(), canvas = can || (layer && layer.hitCanvas);\n if (layer && layer.clearBeforeDraw()) {\n layer.getHitCanvas().getContext().clear();\n }\n Container_1.Container.prototype.drawHit.call(this, canvas, top);\n return this;\n }\n enableHitGraph() {\n this.hitGraphEnabled(true);\n return this;\n }\n disableHitGraph() {\n this.hitGraphEnabled(false);\n return this;\n }\n setHitGraphEnabled(val) {\n Util_1.Util.warn('hitGraphEnabled method is deprecated. Please use layer.listening() instead.');\n this.listening(val);\n }\n getHitGraphEnabled(val) {\n Util_1.Util.warn('hitGraphEnabled method is deprecated. Please use layer.listening() instead.');\n return this.listening();\n }\n toggleHitCanvas() {\n if (!this.parent || !this.parent['content']) {\n return;\n }\n const parent = this.parent;\n const added = !!this.hitCanvas._canvas.parentNode;\n if (added) {\n parent.content.removeChild(this.hitCanvas._canvas);\n }\n else {\n parent.content.appendChild(this.hitCanvas._canvas);\n }\n }\n destroy() {\n Util_1.Util.releaseCanvas(this.getNativeCanvasElement(), this.getHitCanvas()._canvas);\n return super.destroy();\n }\n}\nexports.Layer = Layer;\nLayer.prototype.nodeType = 'Layer';\n(0, Global_1._registerNode)(Layer);\nFactory_1.Factory.addGetterSetter(Layer, 'imageSmoothingEnabled', true);\nFactory_1.Factory.addGetterSetter(Layer, 'clearBeforeDraw', true);\nFactory_1.Factory.addGetterSetter(Layer, 'hitGraphEnabled', true, (0, Validators_1.getBooleanValidator)());\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FastLayer = void 0;\nconst Util_1 = require(\"./Util\");\nconst Layer_1 = require(\"./Layer\");\nconst Global_1 = require(\"./Global\");\nclass FastLayer extends Layer_1.Layer {\n constructor(attrs) {\n super(attrs);\n this.listening(false);\n Util_1.Util.warn('Konva.Fast layer is deprecated. Please use \"new Konva.Layer({ listening: false })\" instead.');\n }\n}\nexports.FastLayer = FastLayer;\nFastLayer.prototype.nodeType = 'FastLayer';\n(0, Global_1._registerNode)(FastLayer);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Group = void 0;\nconst Util_1 = require(\"./Util\");\nconst Container_1 = require(\"./Container\");\nconst Global_1 = require(\"./Global\");\nclass Group extends Container_1.Container {\n _validateAdd(child) {\n const type = child.getType();\n if (type !== 'Group' && type !== 'Shape') {\n Util_1.Util.throw('You may only add groups and shapes to groups.');\n }\n }\n}\nexports.Group = Group;\nGroup.prototype.nodeType = 'Group';\n(0, Global_1._registerNode)(Group);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Animation = void 0;\nconst Global_1 = require(\"./Global\");\nconst Util_1 = require(\"./Util\");\nconst now = (function () {\n if (Global_1.glob.performance && Global_1.glob.performance.now) {\n return function () {\n return Global_1.glob.performance.now();\n };\n }\n return function () {\n return new Date().getTime();\n };\n})();\nclass Animation {\n constructor(func, layers) {\n this.id = Animation.animIdCounter++;\n this.frame = {\n time: 0,\n timeDiff: 0,\n lastTime: now(),\n frameRate: 0,\n };\n this.func = func;\n this.setLayers(layers);\n }\n setLayers(layers) {\n let lays = [];\n if (layers) {\n lays = Array.isArray(layers) ? layers : [layers];\n }\n this.layers = lays;\n return this;\n }\n getLayers() {\n return this.layers;\n }\n addLayer(layer) {\n const layers = this.layers;\n const len = layers.length;\n for (let n = 0; n < len; n++) {\n if (layers[n]._id === layer._id) {\n return false;\n }\n }\n this.layers.push(layer);\n return true;\n }\n isRunning() {\n const a = Animation;\n const animations = a.animations;\n const len = animations.length;\n for (let n = 0; n < len; n++) {\n if (animations[n].id === this.id) {\n return true;\n }\n }\n return false;\n }\n start() {\n this.stop();\n this.frame.timeDiff = 0;\n this.frame.lastTime = now();\n Animation._addAnimation(this);\n return this;\n }\n stop() {\n Animation._removeAnimation(this);\n return this;\n }\n _updateFrameObject(time) {\n this.frame.timeDiff = time - this.frame.lastTime;\n this.frame.lastTime = time;\n this.frame.time += this.frame.timeDiff;\n this.frame.frameRate = 1000 / this.frame.timeDiff;\n }\n static _addAnimation(anim) {\n this.animations.push(anim);\n this._handleAnimation();\n }\n static _removeAnimation(anim) {\n const id = anim.id;\n const animations = this.animations;\n const len = animations.length;\n for (let n = 0; n < len; n++) {\n if (animations[n].id === id) {\n this.animations.splice(n, 1);\n break;\n }\n }\n }\n static _runFrames() {\n const layerHash = {};\n const animations = this.animations;\n for (let n = 0; n < animations.length; n++) {\n const anim = animations[n];\n const layers = anim.layers;\n const func = anim.func;\n anim._updateFrameObject(now());\n const layersLen = layers.length;\n let needRedraw;\n if (func) {\n needRedraw = func.call(anim, anim.frame) !== false;\n }\n else {\n needRedraw = true;\n }\n if (!needRedraw) {\n continue;\n }\n for (let i = 0; i < layersLen; i++) {\n const layer = layers[i];\n if (layer._id !== undefined) {\n layerHash[layer._id] = layer;\n }\n }\n }\n for (const key in layerHash) {\n if (!layerHash.hasOwnProperty(key)) {\n continue;\n }\n layerHash[key].batchDraw();\n }\n }\n static _animationLoop() {\n const Anim = Animation;\n if (Anim.animations.length) {\n Anim._runFrames();\n Util_1.Util.requestAnimFrame(Anim._animationLoop);\n }\n else {\n Anim.animRunning = false;\n }\n }\n static _handleAnimation() {\n if (!this.animRunning) {\n this.animRunning = true;\n Util_1.Util.requestAnimFrame(this._animationLoop);\n }\n }\n}\nexports.Animation = Animation;\nAnimation.animations = [];\nAnimation.animIdCounter = 0;\nAnimation.animRunning = false;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Easings = exports.Tween = void 0;\nconst Util_1 = require(\"./Util\");\nconst Animation_1 = require(\"./Animation\");\nconst Node_1 = require(\"./Node\");\nconst Global_1 = require(\"./Global\");\nconst blacklist = {\n node: 1,\n duration: 1,\n easing: 1,\n onFinish: 1,\n yoyo: 1,\n}, PAUSED = 1, PLAYING = 2, REVERSING = 3, colorAttrs = ['fill', 'stroke', 'shadowColor'];\nlet idCounter = 0;\nclass TweenEngine {\n constructor(prop, propFunc, func, begin, finish, duration, yoyo) {\n this.prop = prop;\n this.propFunc = propFunc;\n this.begin = begin;\n this._pos = begin;\n this.duration = duration;\n this._change = 0;\n this.prevPos = 0;\n this.yoyo = yoyo;\n this._time = 0;\n this._position = 0;\n this._startTime = 0;\n this._finish = 0;\n this.func = func;\n this._change = finish - this.begin;\n this.pause();\n }\n fire(str) {\n const handler = this[str];\n if (handler) {\n handler();\n }\n }\n setTime(t) {\n if (t > this.duration) {\n if (this.yoyo) {\n this._time = this.duration;\n this.reverse();\n }\n else {\n this.finish();\n }\n }\n else if (t < 0) {\n if (this.yoyo) {\n this._time = 0;\n this.play();\n }\n else {\n this.reset();\n }\n }\n else {\n this._time = t;\n this.update();\n }\n }\n getTime() {\n return this._time;\n }\n setPosition(p) {\n this.prevPos = this._pos;\n this.propFunc(p);\n this._pos = p;\n }\n getPosition(t) {\n if (t === undefined) {\n t = this._time;\n }\n return this.func(t, this.begin, this._change, this.duration);\n }\n play() {\n this.state = PLAYING;\n this._startTime = this.getTimer() - this._time;\n this.onEnterFrame();\n this.fire('onPlay');\n }\n reverse() {\n this.state = REVERSING;\n this._time = this.duration - this._time;\n this._startTime = this.getTimer() - this._time;\n this.onEnterFrame();\n this.fire('onReverse');\n }\n seek(t) {\n this.pause();\n this._time = t;\n this.update();\n this.fire('onSeek');\n }\n reset() {\n this.pause();\n this._time = 0;\n this.update();\n this.fire('onReset');\n }\n finish() {\n this.pause();\n this._time = this.duration;\n this.update();\n this.fire('onFinish');\n }\n update() {\n this.setPosition(this.getPosition(this._time));\n this.fire('onUpdate');\n }\n onEnterFrame() {\n const t = this.getTimer() - this._startTime;\n if (this.state === PLAYING) {\n this.setTime(t);\n }\n else if (this.state === REVERSING) {\n this.setTime(this.duration - t);\n }\n }\n pause() {\n this.state = PAUSED;\n this.fire('onPause');\n }\n getTimer() {\n return new Date().getTime();\n }\n}\nclass Tween {\n constructor(config) {\n const that = this, node = config.node, nodeId = node._id, easing = config.easing || exports.Easings.Linear, yoyo = !!config.yoyo;\n let duration, key;\n if (typeof config.duration === 'undefined') {\n duration = 0.3;\n }\n else if (config.duration === 0) {\n duration = 0.001;\n }\n else {\n duration = config.duration;\n }\n this.node = node;\n this._id = idCounter++;\n const layers = node.getLayer() ||\n (node instanceof Global_1.Konva['Stage'] ? node.getLayers() : null);\n if (!layers) {\n Util_1.Util.error('Tween constructor have `node` that is not in a layer. Please add node into layer first.');\n }\n this.anim = new Animation_1.Animation(function () {\n that.tween.onEnterFrame();\n }, layers);\n this.tween = new TweenEngine(key, function (i) {\n that._tweenFunc(i);\n }, easing, 0, 1, duration * 1000, yoyo);\n this._addListeners();\n if (!Tween.attrs[nodeId]) {\n Tween.attrs[nodeId] = {};\n }\n if (!Tween.attrs[nodeId][this._id]) {\n Tween.attrs[nodeId][this._id] = {};\n }\n if (!Tween.tweens[nodeId]) {\n Tween.tweens[nodeId] = {};\n }\n for (key in config) {\n if (blacklist[key] === undefined) {\n this._addAttr(key, config[key]);\n }\n }\n this.reset();\n this.onFinish = config.onFinish;\n this.onReset = config.onReset;\n this.onUpdate = config.onUpdate;\n }\n _addAttr(key, end) {\n const node = this.node, nodeId = node._id;\n let diff, len, trueEnd, trueStart, endRGBA;\n const tweenId = Tween.tweens[nodeId][key];\n if (tweenId) {\n delete Tween.attrs[nodeId][tweenId][key];\n }\n let start = node.getAttr(key);\n if (Util_1.Util._isArray(end)) {\n diff = [];\n len = Math.max(end.length, start.length);\n if (key === 'points' && end.length !== start.length) {\n if (end.length > start.length) {\n trueStart = start;\n start = Util_1.Util._prepareArrayForTween(start, end, node.closed());\n }\n else {\n trueEnd = end;\n end = Util_1.Util._prepareArrayForTween(end, start, node.closed());\n }\n }\n if (key.indexOf('fill') === 0) {\n for (let n = 0; n < len; n++) {\n if (n % 2 === 0) {\n diff.push(end[n] - start[n]);\n }\n else {\n const startRGBA = Util_1.Util.colorToRGBA(start[n]);\n endRGBA = Util_1.Util.colorToRGBA(end[n]);\n start[n] = startRGBA;\n diff.push({\n r: endRGBA.r - startRGBA.r,\n g: endRGBA.g - startRGBA.g,\n b: endRGBA.b - startRGBA.b,\n a: endRGBA.a - startRGBA.a,\n });\n }\n }\n }\n else {\n for (let n = 0; n < len; n++) {\n diff.push(end[n] - start[n]);\n }\n }\n }\n else if (colorAttrs.indexOf(key) !== -1) {\n start = Util_1.Util.colorToRGBA(start);\n endRGBA = Util_1.Util.colorToRGBA(end);\n diff = {\n r: endRGBA.r - start.r,\n g: endRGBA.g - start.g,\n b: endRGBA.b - start.b,\n a: endRGBA.a - start.a,\n };\n }\n else {\n diff = end - start;\n }\n Tween.attrs[nodeId][this._id][key] = {\n start: start,\n diff: diff,\n end: end,\n trueEnd: trueEnd,\n trueStart: trueStart,\n };\n Tween.tweens[nodeId][key] = this._id;\n }\n _tweenFunc(i) {\n const node = this.node, attrs = Tween.attrs[node._id][this._id];\n let key, attr, start, diff, newVal, n, len, end;\n for (key in attrs) {\n attr = attrs[key];\n start = attr.start;\n diff = attr.diff;\n end = attr.end;\n if (Util_1.Util._isArray(start)) {\n newVal = [];\n len = Math.max(start.length, end.length);\n if (key.indexOf('fill') === 0) {\n for (n = 0; n < len; n++) {\n if (n % 2 === 0) {\n newVal.push((start[n] || 0) + diff[n] * i);\n }\n else {\n newVal.push('rgba(' +\n Math.round(start[n].r + diff[n].r * i) +\n ',' +\n Math.round(start[n].g + diff[n].g * i) +\n ',' +\n Math.round(start[n].b + diff[n].b * i) +\n ',' +\n (start[n].a + diff[n].a * i) +\n ')');\n }\n }\n }\n else {\n for (n = 0; n < len; n++) {\n newVal.push((start[n] || 0) + diff[n] * i);\n }\n }\n }\n else if (colorAttrs.indexOf(key) !== -1) {\n newVal =\n 'rgba(' +\n Math.round(start.r + diff.r * i) +\n ',' +\n Math.round(start.g + diff.g * i) +\n ',' +\n Math.round(start.b + diff.b * i) +\n ',' +\n (start.a + diff.a * i) +\n ')';\n }\n else {\n newVal = start + diff * i;\n }\n node.setAttr(key, newVal);\n }\n }\n _addListeners() {\n this.tween.onPlay = () => {\n this.anim.start();\n };\n this.tween.onReverse = () => {\n this.anim.start();\n };\n this.tween.onPause = () => {\n this.anim.stop();\n };\n this.tween.onFinish = () => {\n const node = this.node;\n const attrs = Tween.attrs[node._id][this._id];\n if (attrs.points && attrs.points.trueEnd) {\n node.setAttr('points', attrs.points.trueEnd);\n }\n if (this.onFinish) {\n this.onFinish.call(this);\n }\n };\n this.tween.onReset = () => {\n const node = this.node;\n const attrs = Tween.attrs[node._id][this._id];\n if (attrs.points && attrs.points.trueStart) {\n node.points(attrs.points.trueStart);\n }\n if (this.onReset) {\n this.onReset();\n }\n };\n this.tween.onUpdate = () => {\n if (this.onUpdate) {\n this.onUpdate.call(this);\n }\n };\n }\n play() {\n this.tween.play();\n return this;\n }\n reverse() {\n this.tween.reverse();\n return this;\n }\n reset() {\n this.tween.reset();\n return this;\n }\n seek(t) {\n this.tween.seek(t * 1000);\n return this;\n }\n pause() {\n this.tween.pause();\n return this;\n }\n finish() {\n this.tween.finish();\n return this;\n }\n destroy() {\n const nodeId = this.node._id, thisId = this._id, attrs = Tween.tweens[nodeId];\n this.pause();\n for (const key in attrs) {\n delete Tween.tweens[nodeId][key];\n }\n delete Tween.attrs[nodeId][thisId];\n }\n}\nexports.Tween = Tween;\nTween.attrs = {};\nTween.tweens = {};\nNode_1.Node.prototype.to = function (params) {\n const onFinish = params.onFinish;\n params.node = this;\n params.onFinish = function () {\n this.destroy();\n if (onFinish) {\n onFinish();\n }\n };\n const tween = new Tween(params);\n tween.play();\n};\nexports.Easings = {\n BackEaseIn(t, b, c, d) {\n const s = 1.70158;\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n BackEaseOut(t, b, c, d) {\n const s = 1.70158;\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n BackEaseInOut(t, b, c, d) {\n let s = 1.70158;\n if ((t /= d / 2) < 1) {\n return (c / 2) * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n }\n return (c / 2) * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n },\n ElasticEaseIn(t, b, c, d, a, p) {\n let s = 0;\n if (t === 0) {\n return b;\n }\n if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (!a || a < Math.abs(c)) {\n a = c;\n s = p / 4;\n }\n else {\n s = (p / (2 * Math.PI)) * Math.asin(c / a);\n }\n return (-(a *\n Math.pow(2, 10 * (t -= 1)) *\n Math.sin(((t * d - s) * (2 * Math.PI)) / p)) + b);\n },\n ElasticEaseOut(t, b, c, d, a, p) {\n let s = 0;\n if (t === 0) {\n return b;\n }\n if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (!a || a < Math.abs(c)) {\n a = c;\n s = p / 4;\n }\n else {\n s = (p / (2 * Math.PI)) * Math.asin(c / a);\n }\n return (a * Math.pow(2, -10 * t) * Math.sin(((t * d - s) * (2 * Math.PI)) / p) +\n c +\n b);\n },\n ElasticEaseInOut(t, b, c, d, a, p) {\n let s = 0;\n if (t === 0) {\n return b;\n }\n if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (!a || a < Math.abs(c)) {\n a = c;\n s = p / 4;\n }\n else {\n s = (p / (2 * Math.PI)) * Math.asin(c / a);\n }\n if (t < 1) {\n return (-0.5 *\n (a *\n Math.pow(2, 10 * (t -= 1)) *\n Math.sin(((t * d - s) * (2 * Math.PI)) / p)) +\n b);\n }\n return (a *\n Math.pow(2, -10 * (t -= 1)) *\n Math.sin(((t * d - s) * (2 * Math.PI)) / p) *\n 0.5 +\n c +\n b);\n },\n BounceEaseOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n }\n else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n }\n else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n }\n else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n BounceEaseIn(t, b, c, d) {\n return c - exports.Easings.BounceEaseOut(d - t, 0, c, d) + b;\n },\n BounceEaseInOut(t, b, c, d) {\n if (t < d / 2) {\n return exports.Easings.BounceEaseIn(t * 2, 0, c, d) * 0.5 + b;\n }\n else {\n return exports.Easings.BounceEaseOut(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n }\n },\n EaseIn(t, b, c, d) {\n return c * (t /= d) * t + b;\n },\n EaseOut(t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n },\n EaseInOut(t, b, c, d) {\n if ((t /= d / 2) < 1) {\n return (c / 2) * t * t + b;\n }\n return (-c / 2) * (--t * (t - 2) - 1) + b;\n },\n StrongEaseIn(t, b, c, d) {\n return c * (t /= d) * t * t * t * t + b;\n },\n StrongEaseOut(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n StrongEaseInOut(t, b, c, d) {\n if ((t /= d / 2) < 1) {\n return (c / 2) * t * t * t * t * t + b;\n }\n return (c / 2) * ((t -= 2) * t * t * t * t + 2) + b;\n },\n Linear(t, b, c, d) {\n return (c * t) / d + b;\n },\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Konva = void 0;\nconst Global_1 = require(\"./Global\");\nconst Util_1 = require(\"./Util\");\nconst Node_1 = require(\"./Node\");\nconst Container_1 = require(\"./Container\");\nconst Stage_1 = require(\"./Stage\");\nconst Layer_1 = require(\"./Layer\");\nconst FastLayer_1 = require(\"./FastLayer\");\nconst Group_1 = require(\"./Group\");\nconst DragAndDrop_1 = require(\"./DragAndDrop\");\nconst Shape_1 = require(\"./Shape\");\nconst Animation_1 = require(\"./Animation\");\nconst Tween_1 = require(\"./Tween\");\nconst Context_1 = require(\"./Context\");\nconst Canvas_1 = require(\"./Canvas\");\nexports.Konva = Util_1.Util._assign(Global_1.Konva, {\n Util: Util_1.Util,\n Transform: Util_1.Transform,\n Node: Node_1.Node,\n Container: Container_1.Container,\n Stage: Stage_1.Stage,\n stages: Stage_1.stages,\n Layer: Layer_1.Layer,\n FastLayer: FastLayer_1.FastLayer,\n Group: Group_1.Group,\n DD: DragAndDrop_1.DD,\n Shape: Shape_1.Shape,\n shapes: Shape_1.shapes,\n Animation: Animation_1.Animation,\n Tween: Tween_1.Tween,\n Easings: Tween_1.Easings,\n Context: Context_1.Context,\n Canvas: Canvas_1.Canvas,\n});\nexports.default = exports.Konva;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Konva = void 0;\nvar _CoreInternals_1 = require(\"./_CoreInternals\");\nObject.defineProperty(exports, \"Konva\", { enumerable: true, get: function () { return _CoreInternals_1.Konva; } });\nconst _CoreInternals_2 = require(\"./_CoreInternals\");\nmodule.exports = _CoreInternals_2.Konva;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Line = void 0;\nconst Factory_1 = require(\"../Factory\");\nconst Global_1 = require(\"../Global\");\nconst Shape_1 = require(\"../Shape\");\nconst Validators_1 = require(\"../Validators\");\nfunction getControlPoints(x0, y0, x1, y1, x2, y2, t) {\n const d01 = Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2)), d12 = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)), fa = (t * d01) / (d01 + d12), fb = (t * d12) / (d01 + d12), p1x = x1 - fa * (x2 - x0), p1y = y1 - fa * (y2 - y0), p2x = x1 + fb * (x2 - x0), p2y = y1 + fb * (y2 - y0);\n return [p1x, p1y, p2x, p2y];\n}\nfunction expandPoints(p, tension) {\n const len = p.length, allPoints = [];\n for (let n = 2; n < len - 2; n += 2) {\n const cp = getControlPoints(p[n - 2], p[n - 1], p[n], p[n + 1], p[n + 2], p[n + 3], tension);\n if (isNaN(cp[0])) {\n continue;\n }\n allPoints.push(cp[0]);\n allPoints.push(cp[1]);\n allPoints.push(p[n]);\n allPoints.push(p[n + 1]);\n allPoints.push(cp[2]);\n allPoints.push(cp[3]);\n }\n return allPoints;\n}\nclass Line extends Shape_1.Shape {\n constructor(config) {\n super(config);\n this.on('pointsChange.konva tensionChange.konva closedChange.konva bezierChange.konva', function () {\n this._clearCache('tensionPoints');\n });\n }\n _sceneFunc(context) {\n let points = this.points(), length = points.length, tension = this.tension(), closed = this.closed(), bezier = this.bezier(), tp, len, n;\n if (!length) {\n return;\n }\n context.beginPath();\n context.moveTo(points[0], points[1]);\n if (tension !== 0 && length > 4) {\n tp = this.getTensionPoints();\n len = tp.length;\n n = closed ? 0 : 4;\n if (!closed) {\n context.quadraticCurveTo(tp[0], tp[1], tp[2], tp[3]);\n }\n while (n < len - 2) {\n context.bezierCurveTo(tp[n++], tp[n++], tp[n++], tp[n++], tp[n++], tp[n++]);\n }\n if (!closed) {\n context.quadraticCurveTo(tp[len - 2], tp[len - 1], points[length - 2], points[length - 1]);\n }\n }\n else if (bezier) {\n n = 2;\n while (n < length) {\n context.bezierCurveTo(points[n++], points[n++], points[n++], points[n++], points[n++], points[n++]);\n }\n }\n else {\n for (n = 2; n < length; n += 2) {\n context.lineTo(points[n], points[n + 1]);\n }\n }\n if (closed) {\n context.closePath();\n context.fillStrokeShape(this);\n }\n else {\n context.strokeShape(this);\n }\n }\n getTensionPoints() {\n return this._getCache('tensionPoints', this._getTensionPoints);\n }\n _getTensionPoints() {\n if (this.closed()) {\n return this._getTensionPointsClosed();\n }\n else {\n return expandPoints(this.points(), this.tension());\n }\n }\n _getTensionPointsClosed() {\n const p = this.points(), len = p.length, tension = this.tension(), firstControlPoints = getControlPoints(p[len - 2], p[len - 1], p[0], p[1], p[2], p[3], tension), lastControlPoints = getControlPoints(p[len - 4], p[len - 3], p[len - 2], p[len - 1], p[0], p[1], tension), middle = expandPoints(p, tension), tp = [firstControlPoints[2], firstControlPoints[3]]\n .concat(middle)\n .concat([\n lastControlPoints[0],\n lastControlPoints[1],\n p[len - 2],\n p[len - 1],\n lastControlPoints[2],\n lastControlPoints[3],\n firstControlPoints[0],\n firstControlPoints[1],\n p[0],\n p[1],\n ]);\n return tp;\n }\n getWidth() {\n return this.getSelfRect().width;\n }\n getHeight() {\n return this.getSelfRect().height;\n }\n getSelfRect() {\n let points = this.points();\n if (points.length < 4) {\n return {\n x: points[0] || 0,\n y: points[1] || 0,\n width: 0,\n height: 0,\n };\n }\n if (this.tension() !== 0) {\n points = [\n points[0],\n points[1],\n ...this._getTensionPoints(),\n points[points.length - 2],\n points[points.length - 1],\n ];\n }\n else {\n points = this.points();\n }\n let minX = points[0];\n let maxX = points[0];\n let minY = points[1];\n let maxY = points[1];\n let x, y;\n for (let i = 0; i < points.length / 2; i++) {\n x = points[i * 2];\n y = points[i * 2 + 1];\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n }\n}\nexports.Line = Line;\nLine.prototype.className = 'Line';\nLine.prototype._attrsAffectingSize = ['points', 'bezier', 'tension'];\n(0, Global_1._registerNode)(Line);\nFactory_1.Factory.addGetterSetter(Line, 'closed', false);\nFactory_1.Factory.addGetterSetter(Line, 'bezier', false);\nFactory_1.Factory.addGetterSetter(Line, 'tension', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Line, 'points', [], (0, Validators_1.getNumberArrayValidator)());\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Rect = void 0;\nconst Factory_1 = require(\"../Factory\");\nconst Shape_1 = require(\"../Shape\");\nconst Global_1 = require(\"../Global\");\nconst Util_1 = require(\"../Util\");\nconst Validators_1 = require(\"../Validators\");\nclass Rect extends Shape_1.Shape {\n _sceneFunc(context) {\n const cornerRadius = this.cornerRadius(), width = this.width(), height = this.height();\n context.beginPath();\n if (!cornerRadius) {\n context.rect(0, 0, width, height);\n }\n else {\n Util_1.Util.drawRoundedRectPath(context, width, height, cornerRadius);\n }\n context.closePath();\n context.fillStrokeShape(this);\n }\n}\nexports.Rect = Rect;\nRect.prototype.className = 'Rect';\n(0, Global_1._registerNode)(Rect);\nFactory_1.Factory.addGetterSetter(Rect, 'cornerRadius', 0, (0, Validators_1.getNumberOrArrayOfNumbersValidator)(4));\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Text = void 0;\nexports.stringToArray = stringToArray;\nconst Util_1 = require(\"../Util\");\nconst Factory_1 = require(\"../Factory\");\nconst Shape_1 = require(\"../Shape\");\nconst Global_1 = require(\"../Global\");\nconst Validators_1 = require(\"../Validators\");\nconst Global_2 = require(\"../Global\");\nfunction stringToArray(string) {\n return [...string].reduce((acc, char, index, array) => {\n if (/\\p{Emoji}/u.test(char)) {\n const nextChar = array[index + 1];\n if (nextChar && /\\p{Emoji_Modifier}|\\u200D/u.test(nextChar)) {\n acc.push(char + nextChar);\n array[index + 1] = '';\n }\n else {\n acc.push(char);\n }\n }\n else if (/\\p{Regional_Indicator}{2}/u.test(char + (array[index + 1] || ''))) {\n acc.push(char + array[index + 1]);\n }\n else if (index > 0 && /\\p{Mn}|\\p{Me}|\\p{Mc}/u.test(char)) {\n acc[acc.length - 1] += char;\n }\n else if (char) {\n acc.push(char);\n }\n return acc;\n }, []);\n}\nconst AUTO = 'auto', CENTER = 'center', INHERIT = 'inherit', JUSTIFY = 'justify', CHANGE_KONVA = 'Change.konva', CONTEXT_2D = '2d', DASH = '-', LEFT = 'left', TEXT = 'text', TEXT_UPPER = 'Text', TOP = 'top', BOTTOM = 'bottom', MIDDLE = 'middle', NORMAL = 'normal', PX_SPACE = 'px ', SPACE = ' ', RIGHT = 'right', RTL = 'rtl', WORD = 'word', CHAR = 'char', NONE = 'none', ELLIPSIS = '…', ATTR_CHANGE_LIST = [\n 'direction',\n 'fontFamily',\n 'fontSize',\n 'fontStyle',\n 'fontVariant',\n 'padding',\n 'align',\n 'verticalAlign',\n 'lineHeight',\n 'text',\n 'width',\n 'height',\n 'wrap',\n 'ellipsis',\n 'letterSpacing',\n], attrChangeListLen = ATTR_CHANGE_LIST.length;\nfunction normalizeFontFamily(fontFamily) {\n return fontFamily\n .split(',')\n .map((family) => {\n family = family.trim();\n const hasSpace = family.indexOf(' ') >= 0;\n const hasQuotes = family.indexOf('\"') >= 0 || family.indexOf(\"'\") >= 0;\n if (hasSpace && !hasQuotes) {\n family = `\"${family}\"`;\n }\n return family;\n })\n .join(', ');\n}\nlet dummyContext;\nfunction getDummyContext() {\n if (dummyContext) {\n return dummyContext;\n }\n dummyContext = Util_1.Util.createCanvasElement().getContext(CONTEXT_2D);\n return dummyContext;\n}\nfunction _fillFunc(context) {\n context.fillText(this._partialText, this._partialTextX, this._partialTextY);\n}\nfunction _strokeFunc(context) {\n context.setAttr('miterLimit', 2);\n context.strokeText(this._partialText, this._partialTextX, this._partialTextY);\n}\nfunction checkDefaultFill(config) {\n config = config || {};\n if (!config.fillLinearGradientColorStops &&\n !config.fillRadialGradientColorStops &&\n !config.fillPatternImage) {\n config.fill = config.fill || 'black';\n }\n return config;\n}\nclass Text extends Shape_1.Shape {\n constructor(config) {\n super(checkDefaultFill(config));\n this._partialTextX = 0;\n this._partialTextY = 0;\n for (let n = 0; n < attrChangeListLen; n++) {\n this.on(ATTR_CHANGE_LIST[n] + CHANGE_KONVA, this._setTextData);\n }\n this._setTextData();\n }\n _sceneFunc(context) {\n const textArr = this.textArr, textArrLen = textArr.length;\n if (!this.text()) {\n return;\n }\n let padding = this.padding(), fontSize = this.fontSize(), lineHeightPx = this.lineHeight() * fontSize, verticalAlign = this.verticalAlign(), direction = this.direction(), alignY = 0, align = this.align(), totalWidth = this.getWidth(), letterSpacing = this.letterSpacing(), fill = this.fill(), textDecoration = this.textDecoration(), shouldUnderline = textDecoration.indexOf('underline') !== -1, shouldLineThrough = textDecoration.indexOf('line-through') !== -1, n;\n direction = direction === INHERIT ? context.direction : direction;\n let translateY = lineHeightPx / 2;\n let baseline = MIDDLE;\n if (Global_1.Konva._fixTextRendering) {\n const metrics = this.measureSize('M');\n baseline = 'alphabetic';\n translateY =\n (metrics.fontBoundingBoxAscent - metrics.fontBoundingBoxDescent) / 2 +\n lineHeightPx / 2;\n }\n var lineTranslateX = 0;\n var lineTranslateY = 0;\n if (direction === RTL) {\n context.setAttr('direction', direction);\n }\n context.setAttr('font', this._getContextFont());\n context.setAttr('textBaseline', baseline);\n context.setAttr('textAlign', LEFT);\n if (verticalAlign === MIDDLE) {\n alignY = (this.getHeight() - textArrLen * lineHeightPx - padding * 2) / 2;\n }\n else if (verticalAlign === BOTTOM) {\n alignY = this.getHeight() - textArrLen * lineHeightPx - padding * 2;\n }\n context.translate(padding, alignY + padding);\n for (n = 0; n < textArrLen; n++) {\n var lineTranslateX = 0;\n var lineTranslateY = 0;\n var obj = textArr[n], text = obj.text, width = obj.width, lastLine = obj.lastInParagraph, spacesNumber, oneWord, lineWidth;\n context.save();\n if (align === RIGHT) {\n lineTranslateX += totalWidth - width - padding * 2;\n }\n else if (align === CENTER) {\n lineTranslateX += (totalWidth - width - padding * 2) / 2;\n }\n if (shouldUnderline) {\n context.save();\n context.beginPath();\n const yOffset = Global_1.Konva._fixTextRendering\n ? Math.round(fontSize / 4)\n : Math.round(fontSize / 2);\n const x = lineTranslateX;\n const y = translateY + lineTranslateY + yOffset;\n context.moveTo(x, y);\n spacesNumber = text.split(' ').length - 1;\n oneWord = spacesNumber === 0;\n lineWidth =\n align === JUSTIFY && !lastLine ? totalWidth - padding * 2 : width;\n context.lineTo(x + Math.round(lineWidth), y);\n context.lineWidth = fontSize / 15;\n const gradient = this._getLinearGradient();\n context.strokeStyle = gradient || fill;\n context.stroke();\n context.restore();\n }\n if (shouldLineThrough) {\n context.save();\n context.beginPath();\n const yOffset = Global_1.Konva._fixTextRendering ? -Math.round(fontSize / 4) : 0;\n context.moveTo(lineTranslateX, translateY + lineTranslateY + yOffset);\n spacesNumber = text.split(' ').length - 1;\n oneWord = spacesNumber === 0;\n lineWidth =\n align === JUSTIFY && !lastLine ? totalWidth - padding * 2 : width;\n context.lineTo(lineTranslateX + Math.round(lineWidth), translateY + lineTranslateY + yOffset);\n context.lineWidth = fontSize / 15;\n const gradient = this._getLinearGradient();\n context.strokeStyle = gradient || fill;\n context.stroke();\n context.restore();\n }\n if (direction !== RTL && (letterSpacing !== 0 || align === JUSTIFY)) {\n spacesNumber = text.split(' ').length - 1;\n const array = stringToArray(text);\n for (let li = 0; li < array.length; li++) {\n const letter = array[li];\n if (letter === ' ' && !lastLine && align === JUSTIFY) {\n lineTranslateX += (totalWidth - padding * 2 - width) / spacesNumber;\n }\n this._partialTextX = lineTranslateX;\n this._partialTextY = translateY + lineTranslateY;\n this._partialText = letter;\n context.fillStrokeShape(this);\n lineTranslateX += this.measureSize(letter).width + letterSpacing;\n }\n }\n else {\n if (letterSpacing !== 0) {\n context.setAttr('letterSpacing', `${letterSpacing}px`);\n }\n this._partialTextX = lineTranslateX;\n this._partialTextY = translateY + lineTranslateY;\n this._partialText = text;\n context.fillStrokeShape(this);\n }\n context.restore();\n if (textArrLen > 1) {\n translateY += lineHeightPx;\n }\n }\n }\n _hitFunc(context) {\n const width = this.getWidth(), height = this.getHeight();\n context.beginPath();\n context.rect(0, 0, width, height);\n context.closePath();\n context.fillStrokeShape(this);\n }\n setText(text) {\n const str = Util_1.Util._isString(text)\n ? text\n : text === null || text === undefined\n ? ''\n : text + '';\n this._setAttr(TEXT, str);\n return this;\n }\n getWidth() {\n const isAuto = this.attrs.width === AUTO || this.attrs.width === undefined;\n return isAuto ? this.getTextWidth() + this.padding() * 2 : this.attrs.width;\n }\n getHeight() {\n const isAuto = this.attrs.height === AUTO || this.attrs.height === undefined;\n return isAuto\n ? this.fontSize() * this.textArr.length * this.lineHeight() +\n this.padding() * 2\n : this.attrs.height;\n }\n getTextWidth() {\n return this.textWidth;\n }\n getTextHeight() {\n Util_1.Util.warn('text.getTextHeight() method is deprecated. Use text.height() - for full height and text.fontSize() - for one line height.');\n return this.textHeight;\n }\n measureSize(text) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;\n let _context = getDummyContext(), fontSize = this.fontSize(), metrics;\n _context.save();\n _context.font = this._getContextFont();\n metrics = _context.measureText(text);\n _context.restore();\n const scaleFactor = fontSize / 100;\n return {\n actualBoundingBoxAscent: (_a = metrics.actualBoundingBoxAscent) !== null && _a !== void 0 ? _a : 71.58203125 * scaleFactor,\n actualBoundingBoxDescent: (_b = metrics.actualBoundingBoxDescent) !== null && _b !== void 0 ? _b : 0,\n actualBoundingBoxLeft: (_c = metrics.actualBoundingBoxLeft) !== null && _c !== void 0 ? _c : -7.421875 * scaleFactor,\n actualBoundingBoxRight: (_d = metrics.actualBoundingBoxRight) !== null && _d !== void 0 ? _d : 75.732421875 * scaleFactor,\n alphabeticBaseline: (_e = metrics.alphabeticBaseline) !== null && _e !== void 0 ? _e : 0,\n emHeightAscent: (_f = metrics.emHeightAscent) !== null && _f !== void 0 ? _f : 100 * scaleFactor,\n emHeightDescent: (_g = metrics.emHeightDescent) !== null && _g !== void 0 ? _g : -20 * scaleFactor,\n fontBoundingBoxAscent: (_h = metrics.fontBoundingBoxAscent) !== null && _h !== void 0 ? _h : 91 * scaleFactor,\n fontBoundingBoxDescent: (_j = metrics.fontBoundingBoxDescent) !== null && _j !== void 0 ? _j : 21 * scaleFactor,\n hangingBaseline: (_k = metrics.hangingBaseline) !== null && _k !== void 0 ? _k : 72.80000305175781 * scaleFactor,\n ideographicBaseline: (_l = metrics.ideographicBaseline) !== null && _l !== void 0 ? _l : -21 * scaleFactor,\n width: metrics.width,\n height: fontSize,\n };\n }\n _getContextFont() {\n return (this.fontStyle() +\n SPACE +\n this.fontVariant() +\n SPACE +\n (this.fontSize() + PX_SPACE) +\n normalizeFontFamily(this.fontFamily()));\n }\n _addTextLine(line) {\n const align = this.align();\n if (align === JUSTIFY) {\n line = line.trim();\n }\n const width = this._getTextWidth(line);\n return this.textArr.push({\n text: line,\n width: width,\n lastInParagraph: false,\n });\n }\n _getTextWidth(text) {\n const letterSpacing = this.letterSpacing();\n const length = text.length;\n return getDummyContext().measureText(text).width + letterSpacing * length;\n }\n _setTextData() {\n let lines = this.text().split('\\n'), fontSize = +this.fontSize(), textWidth = 0, lineHeightPx = this.lineHeight() * fontSize, width = this.attrs.width, height = this.attrs.height, fixedWidth = width !== AUTO && width !== undefined, fixedHeight = height !== AUTO && height !== undefined, padding = this.padding(), maxWidth = width - padding * 2, maxHeightPx = height - padding * 2, currentHeightPx = 0, wrap = this.wrap(), shouldWrap = wrap !== NONE, wrapAtWord = wrap !== CHAR && shouldWrap, shouldAddEllipsis = this.ellipsis();\n this.textArr = [];\n getDummyContext().font = this._getContextFont();\n const additionalWidth = shouldAddEllipsis\n ? this._getTextWidth(ELLIPSIS)\n : 0;\n for (let i = 0, max = lines.length; i < max; ++i) {\n let line = lines[i];\n let lineWidth = this._getTextWidth(line);\n if (fixedWidth && lineWidth > maxWidth) {\n while (line.length > 0) {\n let low = 0, high = stringToArray(line).length, match = '', matchWidth = 0;\n while (low < high) {\n const mid = (low + high) >>> 1, lineArray = stringToArray(line), substr = lineArray.slice(0, mid + 1).join(''), substrWidth = this._getTextWidth(substr) + additionalWidth;\n if (substrWidth <= maxWidth) {\n low = mid + 1;\n match = substr;\n matchWidth = substrWidth;\n }\n else {\n high = mid;\n }\n }\n if (match) {\n if (wrapAtWord) {\n const lineArray = stringToArray(line);\n const matchArray = stringToArray(match);\n const nextChar = lineArray[matchArray.length];\n const nextIsSpaceOrDash = nextChar === SPACE || nextChar === DASH;\n let wrapIndex;\n if (nextIsSpaceOrDash && matchWidth <= maxWidth) {\n wrapIndex = matchArray.length;\n }\n else {\n const lastSpaceIndex = matchArray.lastIndexOf(SPACE);\n const lastDashIndex = matchArray.lastIndexOf(DASH);\n wrapIndex = Math.max(lastSpaceIndex, lastDashIndex) + 1;\n }\n if (wrapIndex > 0) {\n low = wrapIndex;\n match = lineArray.slice(0, low).join('');\n matchWidth = this._getTextWidth(match);\n }\n }\n match = match.trimRight();\n this._addTextLine(match);\n textWidth = Math.max(textWidth, matchWidth);\n currentHeightPx += lineHeightPx;\n const shouldHandleEllipsis = this._shouldHandleEllipsis(currentHeightPx);\n if (shouldHandleEllipsis) {\n this._tryToAddEllipsisToLastLine();\n break;\n }\n const lineArray = stringToArray(line);\n line = lineArray.slice(low).join('').trimLeft();\n if (line.length > 0) {\n lineWidth = this._getTextWidth(line);\n if (lineWidth <= maxWidth) {\n this._addTextLine(line);\n currentHeightPx += lineHeightPx;\n textWidth = Math.max(textWidth, lineWidth);\n break;\n }\n }\n }\n else {\n break;\n }\n }\n }\n else {\n this._addTextLine(line);\n currentHeightPx += lineHeightPx;\n textWidth = Math.max(textWidth, lineWidth);\n if (this._shouldHandleEllipsis(currentHeightPx) && i < max - 1) {\n this._tryToAddEllipsisToLastLine();\n }\n }\n if (this.textArr[this.textArr.length - 1]) {\n this.textArr[this.textArr.length - 1].lastInParagraph = true;\n }\n if (fixedHeight && currentHeightPx + lineHeightPx > maxHeightPx) {\n break;\n }\n }\n this.textHeight = fontSize;\n this.textWidth = textWidth;\n }\n _shouldHandleEllipsis(currentHeightPx) {\n const fontSize = +this.fontSize(), lineHeightPx = this.lineHeight() * fontSize, height = this.attrs.height, fixedHeight = height !== AUTO && height !== undefined, padding = this.padding(), maxHeightPx = height - padding * 2, wrap = this.wrap(), shouldWrap = wrap !== NONE;\n return (!shouldWrap ||\n (fixedHeight && currentHeightPx + lineHeightPx > maxHeightPx));\n }\n _tryToAddEllipsisToLastLine() {\n const width = this.attrs.width, fixedWidth = width !== AUTO && width !== undefined, padding = this.padding(), maxWidth = width - padding * 2, shouldAddEllipsis = this.ellipsis();\n const lastLine = this.textArr[this.textArr.length - 1];\n if (!lastLine || !shouldAddEllipsis) {\n return;\n }\n if (fixedWidth) {\n const haveSpace = this._getTextWidth(lastLine.text + ELLIPSIS) < maxWidth;\n if (!haveSpace) {\n lastLine.text = lastLine.text.slice(0, lastLine.text.length - 3);\n }\n }\n this.textArr.splice(this.textArr.length - 1, 1);\n this._addTextLine(lastLine.text + ELLIPSIS);\n }\n getStrokeScaleEnabled() {\n return true;\n }\n _useBufferCanvas() {\n const hasLine = this.textDecoration().indexOf('underline') !== -1 ||\n this.textDecoration().indexOf('line-through') !== -1;\n const hasShadow = this.hasShadow();\n if (hasLine && hasShadow) {\n return true;\n }\n return super._useBufferCanvas();\n }\n}\nexports.Text = Text;\nText.prototype._fillFunc = _fillFunc;\nText.prototype._strokeFunc = _strokeFunc;\nText.prototype.className = TEXT_UPPER;\nText.prototype._attrsAffectingSize = [\n 'text',\n 'fontSize',\n 'padding',\n 'wrap',\n 'lineHeight',\n 'letterSpacing',\n];\n(0, Global_2._registerNode)(Text);\nFactory_1.Factory.overWriteSetter(Text, 'width', (0, Validators_1.getNumberOrAutoValidator)());\nFactory_1.Factory.overWriteSetter(Text, 'height', (0, Validators_1.getNumberOrAutoValidator)());\nFactory_1.Factory.addGetterSetter(Text, 'direction', INHERIT);\nFactory_1.Factory.addGetterSetter(Text, 'fontFamily', 'Arial');\nFactory_1.Factory.addGetterSetter(Text, 'fontSize', 12, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Text, 'fontStyle', NORMAL);\nFactory_1.Factory.addGetterSetter(Text, 'fontVariant', NORMAL);\nFactory_1.Factory.addGetterSetter(Text, 'padding', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Text, 'align', LEFT);\nFactory_1.Factory.addGetterSetter(Text, 'verticalAlign', TOP);\nFactory_1.Factory.addGetterSetter(Text, 'lineHeight', 1, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Text, 'wrap', WORD);\nFactory_1.Factory.addGetterSetter(Text, 'ellipsis', false, (0, Validators_1.getBooleanValidator)());\nFactory_1.Factory.addGetterSetter(Text, 'letterSpacing', 0, (0, Validators_1.getNumberValidator)());\nFactory_1.Factory.addGetterSetter(Text, 'text', '', (0, Validators_1.getStringValidator)());\nFactory_1.Factory.addGetterSetter(Text, 'textDecoration', '');\n","/**\n * Provides access to the waveform data for a single audio channel.\n */\n\nfunction WaveformDataChannel(waveformData, channelIndex) {\n this._waveformData = waveformData;\n this._channelIndex = channelIndex;\n}\n\n/**\n * Returns the waveform minimum at the given index position.\n */\n\nWaveformDataChannel.prototype.min_sample = function (index) {\n var offset = (index * this._waveformData.channels + this._channelIndex) * 2;\n return this._waveformData._at(offset);\n};\n\n/**\n * Returns the waveform maximum at the given index position.\n */\n\nWaveformDataChannel.prototype.max_sample = function (index) {\n var offset = (index * this._waveformData.channels + this._channelIndex) * 2 + 1;\n return this._waveformData._at(offset);\n};\n\n/**\n * Sets the waveform minimum at the given index position.\n */\n\nWaveformDataChannel.prototype.set_min_sample = function (index, sample) {\n var offset = (index * this._waveformData.channels + this._channelIndex) * 2;\n return this._waveformData._set_at(offset, sample);\n};\n\n/**\n * Sets the waveform maximum at the given index position.\n */\n\nWaveformDataChannel.prototype.set_max_sample = function (index, sample) {\n var offset = (index * this._waveformData.channels + this._channelIndex) * 2 + 1;\n return this._waveformData._set_at(offset, sample);\n};\n\n/**\n * Returns all the waveform minimum values as an array.\n */\n\nWaveformDataChannel.prototype.min_array = function () {\n var length = this._waveformData.length;\n var values = [];\n for (var i = 0; i < length; i++) {\n values.push(this.min_sample(i));\n }\n return values;\n};\n\n/**\n * Returns all the waveform maximum values as an array.\n */\n\nWaveformDataChannel.prototype.max_array = function () {\n var length = this._waveformData.length;\n var values = [];\n for (var i = 0; i < length; i++) {\n values.push(this.max_sample(i));\n }\n return values;\n};\n\n/**\n * AudioBuffer-based WaveformData generator\n *\n * Adapted from BlockFile::CalcSummary in Audacity, with permission.\n * See https://github.com/audacity/audacity/blob/\n * 1108c1376c09166162335fab4743008cba57c4ee/src/BlockFile.cpp#L198\n */\n\nvar INT8_MAX = 127;\nvar INT8_MIN = -128;\nvar INT16_MAX = 32767;\nvar INT16_MIN = -32768;\nfunction calculateWaveformDataLength(audio_sample_count, scale) {\n var data_length = Math.floor(audio_sample_count / scale);\n var samples_remaining = audio_sample_count - data_length * scale;\n if (samples_remaining > 0) {\n data_length++;\n }\n return data_length;\n}\nfunction generateWaveformData(options) {\n var scale = options.scale;\n var amplitude_scale = options.amplitude_scale;\n var split_channels = options.split_channels;\n var length = options.length;\n var sample_rate = options.sample_rate;\n var channels = options.channels.map(function (channel) {\n return new Float32Array(channel);\n });\n var output_channels = split_channels ? channels.length : 1;\n var version = output_channels === 1 ? 1 : 2;\n var header_size = version === 1 ? 20 : 24;\n var data_length = calculateWaveformDataLength(length, scale);\n var bytes_per_sample = options.bits === 8 ? 1 : 2;\n var total_size = header_size + data_length * 2 * bytes_per_sample * output_channels;\n var buffer = new ArrayBuffer(total_size);\n var data_view = new DataView(buffer);\n var scale_counter = 0;\n var offset = header_size;\n var channel, i;\n var min_value = new Array(output_channels);\n var max_value = new Array(output_channels);\n for (channel = 0; channel < output_channels; channel++) {\n min_value[channel] = Infinity;\n max_value[channel] = -Infinity;\n }\n var range_min = options.bits === 8 ? INT8_MIN : INT16_MIN;\n var range_max = options.bits === 8 ? INT8_MAX : INT16_MAX;\n data_view.setInt32(0, version, true); // Version\n data_view.setUint32(4, options.bits === 8, true); // Is 8 bit?\n data_view.setInt32(8, sample_rate, true); // Sample rate\n data_view.setInt32(12, scale, true); // Scale\n data_view.setInt32(16, data_length, true); // Length\n\n if (version === 2) {\n data_view.setInt32(20, output_channels, true);\n }\n for (i = 0; i < length; i++) {\n var sample = 0;\n if (output_channels === 1) {\n for (channel = 0; channel < channels.length; ++channel) {\n sample += channels[channel][i];\n }\n sample = Math.floor(range_max * sample * amplitude_scale / channels.length);\n if (sample < min_value[0]) {\n min_value[0] = sample;\n if (min_value[0] < range_min) {\n min_value[0] = range_min;\n }\n }\n if (sample > max_value[0]) {\n max_value[0] = sample;\n if (max_value[0] > range_max) {\n max_value[0] = range_max;\n }\n }\n } else {\n for (channel = 0; channel < output_channels; ++channel) {\n sample = Math.floor(range_max * channels[channel][i] * amplitude_scale);\n if (sample < min_value[channel]) {\n min_value[channel] = sample;\n if (min_value[channel] < range_min) {\n min_value[channel] = range_min;\n }\n }\n if (sample > max_value[channel]) {\n max_value[channel] = sample;\n if (max_value[channel] > range_max) {\n max_value[channel] = range_max;\n }\n }\n }\n }\n if (++scale_counter === scale) {\n for (channel = 0; channel < output_channels; channel++) {\n if (options.bits === 8) {\n data_view.setInt8(offset++, min_value[channel]);\n data_view.setInt8(offset++, max_value[channel]);\n } else {\n data_view.setInt16(offset, min_value[channel], true);\n data_view.setInt16(offset + 2, max_value[channel], true);\n offset += 4;\n }\n min_value[channel] = Infinity;\n max_value[channel] = -Infinity;\n }\n scale_counter = 0;\n }\n }\n if (scale_counter > 0) {\n for (channel = 0; channel < output_channels; channel++) {\n if (options.bits === 8) {\n data_view.setInt8(offset++, min_value[channel]);\n data_view.setInt8(offset++, max_value[channel]);\n } else {\n data_view.setInt16(offset, min_value[channel], true);\n data_view.setInt16(offset + 2, max_value[channel], true);\n }\n }\n }\n return buffer;\n}\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\n\nfunction isJsonWaveformData(data) {\n return data && _typeof(data) === \"object\" && \"sample_rate\" in data && \"samples_per_pixel\" in data && \"bits\" in data && \"length\" in data && \"data\" in data;\n}\nfunction isBinaryWaveformData(data) {\n var isCompatible = data && _typeof(data) === \"object\" && \"byteLength\" in data;\n if (isCompatible) {\n var view = new DataView(data);\n var version = view.getInt32(0, true);\n if (version !== 1 && version !== 2) {\n throw new TypeError(\"WaveformData.create(): This waveform data version not supported\");\n }\n }\n return isCompatible;\n}\nfunction convertJsonToBinary(data) {\n var waveformData = data.data;\n var channels = data.channels || 1;\n var header_size = 24; // version 2\n var bytes_per_sample = data.bits === 8 ? 1 : 2;\n var expected_length = data.length * 2 * channels;\n if (waveformData.length !== expected_length) {\n throw new Error(\"WaveformData.create(): Length mismatch in JSON waveform data\");\n }\n var total_size = header_size + waveformData.length * bytes_per_sample;\n var array_buffer = new ArrayBuffer(total_size);\n var data_object = new DataView(array_buffer);\n data_object.setInt32(0, 2, true); // Version\n data_object.setUint32(4, data.bits === 8, true);\n data_object.setInt32(8, data.sample_rate, true);\n data_object.setInt32(12, data.samples_per_pixel, true);\n data_object.setInt32(16, data.length, true);\n data_object.setInt32(20, channels, true);\n var index = header_size;\n var i;\n if (data.bits === 8) {\n for (i = 0; i < waveformData.length; i++) {\n data_object.setInt8(index++, waveformData[i], true);\n }\n } else {\n for (i = 0; i < waveformData.length; i++) {\n data_object.setInt16(index, waveformData[i], true);\n index += 2;\n }\n }\n return array_buffer;\n}\n\nfunction decodeBase64(base64, enableUnicode) {\n var binaryString = atob(base64);\n if (enableUnicode) {\n var binaryView = new Uint8Array(binaryString.length);\n for (var i = 0, n = binaryString.length; i < n; ++i) {\n binaryView[i] = binaryString.charCodeAt(i);\n }\n return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));\n }\n return binaryString;\n}\n\nfunction createURL(base64, sourcemapArg, enableUnicodeArg) {\n var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;\n var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;\n var source = decodeBase64(base64, enableUnicode);\n var start = source.indexOf('\\n', 10) + 1;\n var body = source.substring(start) + (sourcemap ? '\\/\\/# sourceMappingURL=' + sourcemap : '');\n var blob = new Blob([body], { type: 'application/javascript' });\n return URL.createObjectURL(blob);\n}\n\nfunction createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {\n var url;\n return function WorkerFactory(options) {\n url = url || createURL(base64, sourcemapArg, enableUnicodeArg);\n return new Worker(url, options);\n };\n}\n\nvar WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQXVkaW9CdWZmZXItYmFzZWQgV2F2ZWZvcm1EYXRhIGdlbmVyYXRvcgogICAqCiAgICogQWRhcHRlZCBmcm9tIEJsb2NrRmlsZTo6Q2FsY1N1bW1hcnkgaW4gQXVkYWNpdHksIHdpdGggcGVybWlzc2lvbi4KICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F1ZGFjaXR5L2F1ZGFjaXR5L2Jsb2IvCiAgICogICAxMTA4YzEzNzZjMDkxNjYxNjIzMzVmYWI0NzQzMDA4Y2JhNTdjNGVlL3NyYy9CbG9ja0ZpbGUuY3BwI0wxOTgKICAgKi8KCiAgdmFyIElOVDhfTUFYID0gMTI3OwogIHZhciBJTlQ4X01JTiA9IC0xMjg7CiAgdmFyIElOVDE2X01BWCA9IDMyNzY3OwogIHZhciBJTlQxNl9NSU4gPSAtMzI3Njg7CiAgZnVuY3Rpb24gY2FsY3VsYXRlV2F2ZWZvcm1EYXRhTGVuZ3RoKGF1ZGlvX3NhbXBsZV9jb3VudCwgc2NhbGUpIHsKICAgIHZhciBkYXRhX2xlbmd0aCA9IE1hdGguZmxvb3IoYXVkaW9fc2FtcGxlX2NvdW50IC8gc2NhbGUpOwogICAgdmFyIHNhbXBsZXNfcmVtYWluaW5nID0gYXVkaW9fc2FtcGxlX2NvdW50IC0gZGF0YV9sZW5ndGggKiBzY2FsZTsKICAgIGlmIChzYW1wbGVzX3JlbWFpbmluZyA+IDApIHsKICAgICAgZGF0YV9sZW5ndGgrKzsKICAgIH0KICAgIHJldHVybiBkYXRhX2xlbmd0aDsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVXYXZlZm9ybURhdGEob3B0aW9ucykgewogICAgdmFyIHNjYWxlID0gb3B0aW9ucy5zY2FsZTsKICAgIHZhciBhbXBsaXR1ZGVfc2NhbGUgPSBvcHRpb25zLmFtcGxpdHVkZV9zY2FsZTsKICAgIHZhciBzcGxpdF9jaGFubmVscyA9IG9wdGlvbnMuc3BsaXRfY2hhbm5lbHM7CiAgICB2YXIgbGVuZ3RoID0gb3B0aW9ucy5sZW5ndGg7CiAgICB2YXIgc2FtcGxlX3JhdGUgPSBvcHRpb25zLnNhbXBsZV9yYXRlOwogICAgdmFyIGNoYW5uZWxzID0gb3B0aW9ucy5jaGFubmVscy5tYXAoZnVuY3Rpb24gKGNoYW5uZWwpIHsKICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoY2hhbm5lbCk7CiAgICB9KTsKICAgIHZhciBvdXRwdXRfY2hhbm5lbHMgPSBzcGxpdF9jaGFubmVscyA/IGNoYW5uZWxzLmxlbmd0aCA6IDE7CiAgICB2YXIgdmVyc2lvbiA9IG91dHB1dF9jaGFubmVscyA9PT0gMSA/IDEgOiAyOwogICAgdmFyIGhlYWRlcl9zaXplID0gdmVyc2lvbiA9PT0gMSA/IDIwIDogMjQ7CiAgICB2YXIgZGF0YV9sZW5ndGggPSBjYWxjdWxhdGVXYXZlZm9ybURhdGFMZW5ndGgobGVuZ3RoLCBzY2FsZSk7CiAgICB2YXIgYnl0ZXNfcGVyX3NhbXBsZSA9IG9wdGlvbnMuYml0cyA9PT0gOCA/IDEgOiAyOwogICAgdmFyIHRvdGFsX3NpemUgPSBoZWFkZXJfc2l6ZSArIGRhdGFfbGVuZ3RoICogMiAqIGJ5dGVzX3Blcl9zYW1wbGUgKiBvdXRwdXRfY2hhbm5lbHM7CiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHRvdGFsX3NpemUpOwogICAgdmFyIGRhdGFfdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIpOwogICAgdmFyIHNjYWxlX2NvdW50ZXIgPSAwOwogICAgdmFyIG9mZnNldCA9IGhlYWRlcl9zaXplOwogICAgdmFyIGNoYW5uZWwsIGk7CiAgICB2YXIgbWluX3ZhbHVlID0gbmV3IEFycmF5KG91dHB1dF9jaGFubmVscyk7CiAgICB2YXIgbWF4X3ZhbHVlID0gbmV3IEFycmF5KG91dHB1dF9jaGFubmVscyk7CiAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgb3V0cHV0X2NoYW5uZWxzOyBjaGFubmVsKyspIHsKICAgICAgbWluX3ZhbHVlW2NoYW5uZWxdID0gSW5maW5pdHk7CiAgICAgIG1heF92YWx1ZVtjaGFubmVsXSA9IC1JbmZpbml0eTsKICAgIH0KICAgIHZhciByYW5nZV9taW4gPSBvcHRpb25zLmJpdHMgPT09IDggPyBJTlQ4X01JTiA6IElOVDE2X01JTjsKICAgIHZhciByYW5nZV9tYXggPSBvcHRpb25zLmJpdHMgPT09IDggPyBJTlQ4X01BWCA6IElOVDE2X01BWDsKICAgIGRhdGFfdmlldy5zZXRJbnQzMigwLCB2ZXJzaW9uLCB0cnVlKTsgLy8gVmVyc2lvbgogICAgZGF0YV92aWV3LnNldFVpbnQzMig0LCBvcHRpb25zLmJpdHMgPT09IDgsIHRydWUpOyAvLyBJcyA4IGJpdD8KICAgIGRhdGFfdmlldy5zZXRJbnQzMig4LCBzYW1wbGVfcmF0ZSwgdHJ1ZSk7IC8vIFNhbXBsZSByYXRlCiAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMTIsIHNjYWxlLCB0cnVlKTsgLy8gU2NhbGUKICAgIGRhdGFfdmlldy5zZXRJbnQzMigxNiwgZGF0YV9sZW5ndGgsIHRydWUpOyAvLyBMZW5ndGgKCiAgICBpZiAodmVyc2lvbiA9PT0gMikgewogICAgICBkYXRhX3ZpZXcuc2V0SW50MzIoMjAsIG91dHB1dF9jaGFubmVscywgdHJ1ZSk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHNhbXBsZSA9IDA7CiAgICAgIGlmIChvdXRwdXRfY2hhbm5lbHMgPT09IDEpIHsKICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbHMubGVuZ3RoOyArK2NoYW5uZWwpIHsKICAgICAgICAgIHNhbXBsZSArPSBjaGFubmVsc1tjaGFubmVsXVtpXTsKICAgICAgICB9CiAgICAgICAgc2FtcGxlID0gTWF0aC5mbG9vcihyYW5nZV9tYXggKiBzYW1wbGUgKiBhbXBsaXR1ZGVfc2NhbGUgLyBjaGFubmVscy5sZW5ndGgpOwogICAgICAgIGlmIChzYW1wbGUgPCBtaW5fdmFsdWVbMF0pIHsKICAgICAgICAgIG1pbl92YWx1ZVswXSA9IHNhbXBsZTsKICAgICAgICAgIGlmIChtaW5fdmFsdWVbMF0gPCByYW5nZV9taW4pIHsKICAgICAgICAgICAgbWluX3ZhbHVlWzBdID0gcmFuZ2VfbWluOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc2FtcGxlID4gbWF4X3ZhbHVlWzBdKSB7CiAgICAgICAgICBtYXhfdmFsdWVbMF0gPSBzYW1wbGU7CiAgICAgICAgICBpZiAobWF4X3ZhbHVlWzBdID4gcmFuZ2VfbWF4KSB7CiAgICAgICAgICAgIG1heF92YWx1ZVswXSA9IHJhbmdlX21heDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IG91dHB1dF9jaGFubmVsczsgKytjaGFubmVsKSB7CiAgICAgICAgICBzYW1wbGUgPSBNYXRoLmZsb29yKHJhbmdlX21heCAqIGNoYW5uZWxzW2NoYW5uZWxdW2ldICogYW1wbGl0dWRlX3NjYWxlKTsKICAgICAgICAgIGlmIChzYW1wbGUgPCBtaW5fdmFsdWVbY2hhbm5lbF0pIHsKICAgICAgICAgICAgbWluX3ZhbHVlW2NoYW5uZWxdID0gc2FtcGxlOwogICAgICAgICAgICBpZiAobWluX3ZhbHVlW2NoYW5uZWxdIDwgcmFuZ2VfbWluKSB7CiAgICAgICAgICAgICAgbWluX3ZhbHVlW2NoYW5uZWxdID0gcmFuZ2VfbWluOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc2FtcGxlID4gbWF4X3ZhbHVlW2NoYW5uZWxdKSB7CiAgICAgICAgICAgIG1heF92YWx1ZVtjaGFubmVsXSA9IHNhbXBsZTsKICAgICAgICAgICAgaWYgKG1heF92YWx1ZVtjaGFubmVsXSA+IHJhbmdlX21heCkgewogICAgICAgICAgICAgIG1heF92YWx1ZVtjaGFubmVsXSA9IHJhbmdlX21heDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoKytzY2FsZV9jb3VudGVyID09PSBzY2FsZSkgewogICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBvdXRwdXRfY2hhbm5lbHM7IGNoYW5uZWwrKykgewogICAgICAgICAgaWYgKG9wdGlvbnMuYml0cyA9PT0gOCkgewogICAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50OChvZmZzZXQrKywgbWluX3ZhbHVlW2NoYW5uZWxdKTsKICAgICAgICAgICAgZGF0YV92aWV3LnNldEludDgob2Zmc2V0KyssIG1heF92YWx1ZVtjaGFubmVsXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50MTYob2Zmc2V0LCBtaW5fdmFsdWVbY2hhbm5lbF0sIHRydWUpOwogICAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50MTYob2Zmc2V0ICsgMiwgbWF4X3ZhbHVlW2NoYW5uZWxdLCB0cnVlKTsKICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7CiAgICAgICAgICB9CiAgICAgICAgICBtaW5fdmFsdWVbY2hhbm5lbF0gPSBJbmZpbml0eTsKICAgICAgICAgIG1heF92YWx1ZVtjaGFubmVsXSA9IC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgc2NhbGVfY291bnRlciA9IDA7CiAgICAgIH0KICAgIH0KICAgIGlmIChzY2FsZV9jb3VudGVyID4gMCkgewogICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgb3V0cHV0X2NoYW5uZWxzOyBjaGFubmVsKyspIHsKICAgICAgICBpZiAob3B0aW9ucy5iaXRzID09PSA4KSB7CiAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50OChvZmZzZXQrKywgbWluX3ZhbHVlW2NoYW5uZWxdKTsKICAgICAgICAgIGRhdGFfdmlldy5zZXRJbnQ4KG9mZnNldCsrLCBtYXhfdmFsdWVbY2hhbm5lbF0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXRhX3ZpZXcuc2V0SW50MTYob2Zmc2V0LCBtaW5fdmFsdWVbY2hhbm5lbF0sIHRydWUpOwogICAgICAgICAgZGF0YV92aWV3LnNldEludDE2KG9mZnNldCArIDIsIG1heF92YWx1ZVtjaGFubmVsXSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmZmVyOwogIH0KCiAgb25tZXNzYWdlID0gZnVuY3Rpb24gb25tZXNzYWdlKGV2dCkgewogICAgdmFyIGJ1ZmZlciA9IGdlbmVyYXRlV2F2ZWZvcm1EYXRhKGV2dC5kYXRhKTsKCiAgICAvLyBUcmFuc2ZlciBidWZmZXIgdG8gdGhlIGNhbGxpbmcgdGhyZWFkCiAgICB0aGlzLnBvc3RNZXNzYWdlKGJ1ZmZlciwgW2J1ZmZlcl0pOwogICAgdGhpcy5jbG9zZSgpOwogIH07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD13YXZlZm9ybS1kYXRhLXdvcmtlci5qcy5tYXAKCg==', null, false);\n/* eslint-enable */\n\n/**\n * Provides access to waveform data.\n */\n\nfunction WaveformData(data) {\n if (isJsonWaveformData(data)) {\n data = convertJsonToBinary(data);\n }\n if (isBinaryWaveformData(data)) {\n this._data = new DataView(data);\n this._offset = this._version() === 2 ? 24 : 20;\n this._channels = [];\n for (var channel = 0; channel < this.channels; channel++) {\n this._channels[channel] = new WaveformDataChannel(this, channel);\n }\n } else {\n throw new TypeError(\"WaveformData.create(): Unknown data format\");\n }\n}\nvar defaultOptions = {\n scale: 512,\n bits: 8,\n amplitude_scale: 1.0,\n split_channels: false,\n disable_worker: false\n};\nfunction getOptions(options) {\n var opts = {\n scale: options.scale || defaultOptions.scale,\n bits: options.bits || defaultOptions.bits,\n amplitude_scale: options.amplitude_scale || defaultOptions.amplitude_scale,\n split_channels: options.split_channels || defaultOptions.split_channels,\n disable_worker: options.disable_worker || defaultOptions.disable_worker\n };\n return opts;\n}\nfunction getChannelData(audio_buffer) {\n var channels = [];\n for (var i = 0; i < audio_buffer.numberOfChannels; ++i) {\n channels.push(audio_buffer.getChannelData(i).buffer);\n }\n return channels;\n}\nfunction createFromAudioBuffer(audio_buffer, options, callback) {\n var channels = getChannelData(audio_buffer);\n if (options.disable_worker) {\n var buffer = generateWaveformData({\n scale: options.scale,\n bits: options.bits,\n amplitude_scale: options.amplitude_scale,\n split_channels: options.split_channels,\n length: audio_buffer.length,\n sample_rate: audio_buffer.sampleRate,\n channels: channels\n });\n callback(null, new WaveformData(buffer), audio_buffer);\n } else {\n var worker = new WorkerFactory();\n worker.onmessage = function (evt) {\n callback(null, new WaveformData(evt.data), audio_buffer);\n };\n worker.postMessage({\n scale: options.scale,\n bits: options.bits,\n amplitude_scale: options.amplitude_scale,\n split_channels: options.split_channels,\n length: audio_buffer.length,\n sample_rate: audio_buffer.sampleRate,\n channels: channels\n }, channels);\n }\n}\nfunction createFromArrayBuffer(audioContext, audioData, options, callback) {\n // The following function is a workaround for a Webkit bug where decodeAudioData\n // invokes the errorCallback with null instead of a DOMException.\n // See https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-decodeaudiodata\n // and http://stackoverflow.com/q/10365335/103396\n\n function errorCallback(error) {\n if (!error) {\n error = new DOMException(\"EncodingError\");\n }\n callback(error);\n // prevent double-calling the callback on errors:\n callback = function callback() {};\n }\n var promise = audioContext.decodeAudioData(audioData, function (audio_buffer) {\n createFromAudioBuffer(audio_buffer, options, callback);\n }, errorCallback);\n if (promise) {\n promise.catch(errorCallback);\n }\n}\n\n/**\n * Creates and returns a WaveformData instance from the given waveform data.\n */\n\nWaveformData.create = function create(data) {\n return new WaveformData(data);\n};\n\n/**\n * Creates a WaveformData instance from audio.\n */\n\nWaveformData.createFromAudio = function (options, callback) {\n var opts = getOptions(options);\n if (options.audio_context && options.array_buffer) {\n return createFromArrayBuffer(options.audio_context, options.array_buffer, opts, callback);\n } else if (options.audio_buffer) {\n return createFromAudioBuffer(options.audio_buffer, opts, callback);\n } else {\n throw new TypeError(\n // eslint-disable-next-line\n \"WaveformData.createFromAudio(): Pass either an AudioContext and ArrayBuffer, or an AudioBuffer object\");\n }\n};\nfunction WaveformResampler(options) {\n this._inputData = options.waveformData;\n\n // Scale we want to reach\n this._output_samples_per_pixel = options.scale;\n this._scale = this._inputData.scale; // scale we are coming from\n\n // The amount of data we want to resample i.e. final zoom want to resample\n // all data but for intermediate zoom we want to resample subset\n this._input_buffer_size = this._inputData.length;\n var input_buffer_length_samples = this._input_buffer_size * this._inputData.scale;\n var output_buffer_length_samples = Math.ceil(input_buffer_length_samples / this._output_samples_per_pixel);\n var output_header_size = 24; // version 2\n var bytes_per_sample = this._inputData.bits === 8 ? 1 : 2;\n var total_size = output_header_size + output_buffer_length_samples * 2 * this._inputData.channels * bytes_per_sample;\n this._output_data = new ArrayBuffer(total_size);\n this.output_dataview = new DataView(this._output_data);\n this.output_dataview.setInt32(0, 2, true); // Version\n this.output_dataview.setUint32(4, this._inputData.bits === 8, true); // Is 8 bit?\n this.output_dataview.setInt32(8, this._inputData.sample_rate, true);\n this.output_dataview.setInt32(12, this._output_samples_per_pixel, true);\n this.output_dataview.setInt32(16, output_buffer_length_samples, true);\n this.output_dataview.setInt32(20, this._inputData.channels, true);\n this._outputWaveformData = new WaveformData(this._output_data);\n this._input_index = 0;\n this._output_index = 0;\n var channels = this._inputData.channels;\n this._min = new Array(channels);\n this._max = new Array(channels);\n var channel;\n for (channel = 0; channel < channels; ++channel) {\n if (this._input_buffer_size > 0) {\n this._min[channel] = this._inputData.channel(channel).min_sample(this._input_index);\n this._max[channel] = this._inputData.channel(channel).max_sample(this._input_index);\n } else {\n this._min[channel] = 0;\n this._max[channel] = 0;\n }\n }\n this._min_value = this._inputData.bits === 8 ? -128 : -32768;\n this._max_value = this._inputData.bits === 8 ? 127 : 32767;\n this._where = 0;\n this._prev_where = 0;\n this._stop = 0;\n this._last_input_index = 0;\n}\nWaveformResampler.prototype.sample_at_pixel = function (x) {\n return Math.floor(x * this._output_samples_per_pixel);\n};\nWaveformResampler.prototype.next = function () {\n var count = 0;\n var total = 1000;\n var channels = this._inputData.channels;\n var channel;\n var value;\n var i;\n while (this._input_index < this._input_buffer_size && count < total) {\n while (Math.floor(this.sample_at_pixel(this._output_index) / this._scale) === this._input_index) {\n if (this._output_index > 0) {\n for (i = 0; i < channels; ++i) {\n channel = this._outputWaveformData.channel(i);\n channel.set_min_sample(this._output_index - 1, this._min[i]);\n channel.set_max_sample(this._output_index - 1, this._max[i]);\n }\n }\n this._last_input_index = this._input_index;\n this._output_index++;\n this._where = this.sample_at_pixel(this._output_index);\n this._prev_where = this.sample_at_pixel(this._output_index - 1);\n if (this._where !== this._prev_where) {\n for (i = 0; i < channels; ++i) {\n this._min[i] = this._max_value;\n this._max[i] = this._min_value;\n }\n }\n }\n this._where = this.sample_at_pixel(this._output_index);\n this._stop = Math.floor(this._where / this._scale);\n if (this._stop > this._input_buffer_size) {\n this._stop = this._input_buffer_size;\n }\n while (this._input_index < this._stop) {\n for (i = 0; i < channels; ++i) {\n channel = this._inputData.channel(i);\n value = channel.min_sample(this._input_index);\n if (value < this._min[i]) {\n this._min[i] = value;\n }\n value = channel.max_sample(this._input_index);\n if (value > this._max[i]) {\n this._max[i] = value;\n }\n }\n this._input_index++;\n }\n count++;\n }\n if (this._input_index < this._input_buffer_size) {\n // More to do\n return false;\n } else {\n // Done\n if (this._input_index !== this._last_input_index) {\n for (i = 0; i < channels; ++i) {\n channel = this._outputWaveformData.channel(i);\n channel.set_min_sample(this._output_index - 1, this._min[i]);\n channel.set_max_sample(this._output_index - 1, this._max[i]);\n }\n }\n return true;\n }\n};\nWaveformResampler.prototype.getOutputData = function () {\n return this._output_data;\n};\nWaveformData.prototype = {\n _getResampleOptions: function _getResampleOptions(options) {\n var opts = {};\n opts.scale = options.scale;\n opts.width = options.width;\n if (opts.width != null && (typeof opts.width !== \"number\" || opts.width <= 0)) {\n throw new RangeError(\"WaveformData.resample(): width should be a positive integer value\");\n }\n if (opts.scale != null && (typeof opts.scale !== \"number\" || opts.scale <= 0)) {\n throw new RangeError(\"WaveformData.resample(): scale should be a positive integer value\");\n }\n if (!opts.scale && !opts.width) {\n throw new Error(\"WaveformData.resample(): Missing scale or width option\");\n }\n if (opts.width) {\n // Calculate the target scale for the resampled waveform\n opts.scale = Math.floor(this.duration * this.sample_rate / opts.width);\n }\n if (opts.scale < this.scale) {\n throw new Error(\"WaveformData.resample(): Zoom level \" + opts.scale + \" too low, minimum: \" + this.scale);\n }\n opts.abortSignal = options.abortSignal;\n return opts;\n },\n resample: function resample(options) {\n options = this._getResampleOptions(options);\n options.waveformData = this;\n var resampler = new WaveformResampler(options);\n while (!resampler.next()) {\n // nothing\n }\n return new WaveformData(resampler.getOutputData());\n },\n /**\n * Concatenates with one or more other waveforms, returning a new WaveformData object.\n */\n\n concat: function concat() {\n var self = this;\n var otherWaveforms = Array.prototype.slice.call(arguments);\n\n // Check that all the supplied waveforms are compatible\n otherWaveforms.forEach(function (otherWaveform) {\n if (self.channels !== otherWaveform.channels || self.sample_rate !== otherWaveform.sample_rate || self.bits !== otherWaveform.bits || self.scale !== otherWaveform.scale) {\n throw new Error(\"WaveformData.concat(): Waveforms are incompatible\");\n }\n });\n var combinedBuffer = this._concatBuffers.apply(this, otherWaveforms);\n return WaveformData.create(combinedBuffer);\n },\n /**\n * Returns a new ArrayBuffer with the concatenated waveform.\n * All waveforms must have identical metadata (version, channels, etc)\n */\n\n _concatBuffers: function _concatBuffers() {\n var otherWaveforms = Array.prototype.slice.call(arguments);\n var headerSize = this._offset;\n var totalSize = headerSize;\n var totalDataLength = 0;\n var bufferCollection = [this].concat(otherWaveforms).map(function (w) {\n return w._data.buffer;\n });\n var i, buffer;\n for (i = 0; i < bufferCollection.length; i++) {\n buffer = bufferCollection[i];\n var dataSize = new DataView(buffer).getInt32(16, true);\n totalSize += buffer.byteLength - headerSize;\n totalDataLength += dataSize;\n }\n var totalBuffer = new ArrayBuffer(totalSize);\n var sourceHeader = new DataView(bufferCollection[0]);\n var totalBufferView = new DataView(totalBuffer);\n\n // Copy the header from the first chunk\n for (i = 0; i < headerSize; i++) {\n totalBufferView.setUint8(i, sourceHeader.getUint8(i));\n }\n // Rewrite the data-length header item to reflect all of the samples concatenated together\n totalBufferView.setInt32(16, totalDataLength, true);\n var offset = 0;\n var dataOfTotalBuffer = new Uint8Array(totalBuffer, headerSize);\n for (i = 0; i < bufferCollection.length; i++) {\n buffer = bufferCollection[i];\n dataOfTotalBuffer.set(new Uint8Array(buffer, headerSize), offset);\n offset += buffer.byteLength - headerSize;\n }\n return totalBuffer;\n },\n slice: function slice(options) {\n var startIndex = 0;\n var endIndex = 0;\n if (options.startIndex != null && options.endIndex != null) {\n startIndex = options.startIndex;\n endIndex = options.endIndex;\n } else if (options.startTime != null && options.endTime != null) {\n startIndex = this.at_time(options.startTime);\n endIndex = this.at_time(options.endTime);\n }\n if (startIndex < 0) {\n throw new RangeError(\"startIndex or startTime must not be negative\");\n }\n if (endIndex < 0) {\n throw new RangeError(\"endIndex or endTime must not be negative\");\n }\n if (startIndex > this.length) {\n startIndex = this.length;\n }\n if (endIndex > this.length) {\n endIndex = this.length;\n }\n if (startIndex > endIndex) {\n startIndex = endIndex;\n }\n var length = endIndex - startIndex;\n var header_size = 24; // Version 2\n var bytes_per_sample = this.bits === 8 ? 1 : 2;\n var total_size = header_size + length * 2 * this.channels * bytes_per_sample;\n var output_data = new ArrayBuffer(total_size);\n var output_dataview = new DataView(output_data);\n output_dataview.setInt32(0, 2, true); // Version\n output_dataview.setUint32(4, this.bits === 8, true); // Is 8 bit?\n output_dataview.setInt32(8, this.sample_rate, true);\n output_dataview.setInt32(12, this.scale, true);\n output_dataview.setInt32(16, length, true);\n output_dataview.setInt32(20, this.channels, true);\n for (var i = 0; i < length * this.channels * 2; i++) {\n var sample = this._at(startIndex * this.channels * 2 + i);\n if (this.bits === 8) {\n output_dataview.setInt8(header_size + i, sample);\n } else {\n output_dataview.setInt16(header_size + i * 2, sample, true);\n }\n }\n return new WaveformData(output_data);\n },\n /**\n * Returns the data format version number.\n */\n\n _version: function _version() {\n return this._data.getInt32(0, true);\n },\n /**\n * Returns the length of the waveform, in pixels.\n */\n\n get length() {\n return this._data.getUint32(16, true);\n },\n /**\n * Returns the number of bits per sample, either 8 or 16.\n */\n\n get bits() {\n var bits = Boolean(this._data.getUint32(4, true));\n return bits ? 8 : 16;\n },\n /**\n * Returns the (approximate) duration of the audio file, in seconds.\n */\n\n get duration() {\n return this.length * this.scale / this.sample_rate;\n },\n /**\n * Returns the number of pixels per second.\n */\n\n get pixels_per_second() {\n return this.sample_rate / this.scale;\n },\n /**\n * Returns the amount of time represented by a single pixel, in seconds.\n */\n\n get seconds_per_pixel() {\n return this.scale / this.sample_rate;\n },\n /**\n * Returns the number of waveform channels.\n */\n\n get channels() {\n if (this._version() === 2) {\n return this._data.getInt32(20, true);\n } else {\n return 1;\n }\n },\n /**\n * Returns a waveform channel.\n */\n\n channel: function channel(index) {\n if (index >= 0 && index < this._channels.length) {\n return this._channels[index];\n } else {\n throw new RangeError(\"Invalid channel: \" + index);\n }\n },\n /**\n * Returns the number of audio samples per second.\n */\n\n get sample_rate() {\n return this._data.getInt32(8, true);\n },\n /**\n * Returns the number of audio samples per pixel.\n */\n\n get scale() {\n return this._data.getInt32(12, true);\n },\n /**\n * Returns a waveform data value at a specific offset.\n */\n\n _at: function at_sample(index) {\n if (this.bits === 8) {\n return this._data.getInt8(this._offset + index);\n } else {\n return this._data.getInt16(this._offset + index * 2, true);\n }\n },\n /**\n * Sets a waveform data value at a specific offset.\n */\n\n _set_at: function set_at(index, sample) {\n if (this.bits === 8) {\n return this._data.setInt8(this._offset + index, sample);\n } else {\n return this._data.setInt16(this._offset + index * 2, sample, true);\n }\n },\n /**\n * Returns the waveform data index position for a given time.\n */\n\n at_time: function at_time(time) {\n return Math.floor(time * this.sample_rate / this.scale);\n },\n /**\n * Returns the time in seconds for a given index.\n */\n\n time: function time(index) {\n return index * this.scale / this.sample_rate;\n },\n /**\n * Returns an object containing the waveform data.\n */\n\n toJSON: function toJSON() {\n var waveform = {\n version: 2,\n channels: this.channels,\n sample_rate: this.sample_rate,\n samples_per_pixel: this.scale,\n bits: this.bits,\n length: this.length,\n data: []\n };\n for (var i = 0; i < this.length; i++) {\n for (var channel = 0; channel < this.channels; channel++) {\n waveform.data.push(this.channel(channel).min_sample(i));\n waveform.data.push(this.channel(channel).max_sample(i));\n }\n }\n return waveform;\n },\n /**\n * Returns the waveform data in binary format as an ArrayBuffer.\n */\n\n toArrayBuffer: function toArrayBuffer() {\n return this._data.buffer;\n }\n};\n\nexport { WaveformData as default };\n","import Konva from 'konva/lib/Core';\nimport { Line } from 'konva/lib/shapes/Line';\nimport { Rect } from 'konva/lib/shapes/Rect';\nimport { Text } from 'konva/lib/shapes/Text';\nimport { Animation } from 'konva/lib/Animation';\nimport WaveformData from 'waveform-data';\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nvar eventemitter3 = {exports: {}};\n\n(function (module) {\n\n var has = Object.prototype.hasOwnProperty,\n prefix = '~';\n\n /**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\n function Events() {}\n\n //\n // We try to not inherit from `Object.prototype`. In some engines creating an\n // instance in this way is faster than calling `Object.create(null)` directly.\n // If `Object.create(null)` is not supported we prefix the event names with a\n // character to make sure that the built-in object properties are not\n // overridden or used as an attack vector.\n //\n if (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n }\n\n /**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\n function EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n }\n\n /**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\n function addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n var listener = new EE(fn, context || emitter, once),\n evt = prefix ? prefix + event : event;\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);else emitter._events[evt] = [emitter._events[evt], listener];\n return emitter;\n }\n\n /**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\n function clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();else delete emitter._events[evt];\n }\n\n /**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\n function EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n /**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\n EventEmitter.prototype.eventNames = function eventNames() {\n var names = [],\n events,\n name;\n if (this._eventsCount === 0) return names;\n for (name in events = this._events) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n return names;\n };\n\n /**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\n EventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event,\n handlers = this._events[evt];\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n return ee;\n };\n\n /**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\n EventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event,\n listeners = this._events[evt];\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n };\n\n /**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\n EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n if (!this._events[evt]) return false;\n var listeners = this._events[evt],\n len = arguments.length,\n args,\n i;\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n switch (len) {\n case 1:\n return listeners.fn.call(listeners.context), true;\n case 2:\n return listeners.fn.call(listeners.context, a1), true;\n case 3:\n return listeners.fn.call(listeners.context, a1, a2), true;\n case 4:\n return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5:\n return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6:\n return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n for (i = 1, args = new Array(len - 1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length,\n j;\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n switch (len) {\n case 1:\n listeners[i].fn.call(listeners[i].context);\n break;\n case 2:\n listeners[i].fn.call(listeners[i].context, a1);\n break;\n case 3:\n listeners[i].fn.call(listeners[i].context, a1, a2);\n break;\n case 4:\n listeners[i].fn.call(listeners[i].context, a1, a2, a3);\n break;\n default:\n if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n return true;\n };\n\n /**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\n EventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n };\n\n /**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\n EventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n };\n\n /**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\n EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n var listeners = this._events[evt];\n if (listeners.fn) {\n if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;else clearEvent(this, evt);\n }\n return this;\n };\n\n /**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\n EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n return this;\n };\n\n //\n // Alias methods names because people roll like that.\n //\n EventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n EventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n //\n // Expose the prefix.\n //\n EventEmitter.prefixed = prefix;\n\n //\n // Allow `EventEmitter` to be imported as module namespace.\n //\n EventEmitter.EventEmitter = EventEmitter;\n\n //\n // Expose the module.\n //\n {\n module.exports = EventEmitter;\n }\n})(eventemitter3);\nvar eventemitter3Exports = eventemitter3.exports;\nvar EventEmitter = /*@__PURE__*/getDefaultExportFromCjs(eventemitter3Exports);\n\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\n\n/**\n * @file\n *\n * Defines the {@link Cue} class.\n *\n * @module cue\n */\n\n/**\n * A cue represents an event to be triggered at some point on the media\n * timeline.\n *\n * @class\n * @alias Cue\n *\n * @param {Number} time Cue time, in seconds.\n * @param {Number} type Cue mark type, either <code>Cue.POINT</code>,\n * <code>Cue.SEGMENT_START</code>, or <code>Cue.SEGMENT_END</code>.\n * @param {String} id The id of the {@link Point} or {@link Segment}.\n */\n\nfunction Cue(time, type, id) {\n this.time = time;\n this.type = type;\n this.id = id;\n}\n\n/**\n * @constant\n * @type {Number}\n */\n\nCue.POINT = 0;\nCue.SEGMENT_START = 1;\nCue.SEGMENT_END = 2;\n\n/**\n * Callback function for use with Array.prototype.sort().\n *\n * @static\n * @param {Cue} a\n * @param {Cue} b\n * @return {Number}\n */\n\nCue.sorter = function (a, b) {\n return a.time - b.time;\n};\n\nfunction zeroPad(number, precision) {\n number = number.toString();\n while (number.length < precision) {\n number = '0' + number;\n }\n return number;\n}\n\n/**\n * Returns a formatted time string.\n *\n * @param {Number} time The time to be formatted, in seconds.\n * @param {Number} precision Decimal places to which time is displayed\n * @returns {String}\n */\n\nfunction formatTime(time, precision) {\n var result = [];\n var fractionSeconds = Math.floor(time % 1 * Math.pow(10, precision));\n var seconds = Math.floor(time);\n var minutes = Math.floor(seconds / 60);\n var hours = Math.floor(minutes / 60);\n if (hours > 0) {\n result.push(hours); // Hours\n }\n result.push(minutes % 60); // Mins\n result.push(seconds % 60); // Seconds\n\n for (var i = 0; i < result.length; i++) {\n result[i] = zeroPad(result[i], 2);\n }\n result = result.join(':');\n if (precision > 0) {\n result += '.' + zeroPad(fractionSeconds, precision);\n }\n return result;\n}\n\n/**\n * Rounds the given value up to the nearest given multiple.\n *\n * @param {Number} value\n * @param {Number} multiple\n * @returns {Number}\n *\n * @example\n * roundUpToNearest(5.5, 3); // returns 6\n * roundUpToNearest(141.0, 10); // returns 150\n * roundUpToNearest(-5.5, 3); // returns -6\n */\n\nfunction roundUpToNearest(value, multiple) {\n if (multiple === 0) {\n return 0;\n }\n var multiplier = 1;\n if (value < 0.0) {\n multiplier = -1;\n value = -value;\n }\n var roundedUp = Math.ceil(value);\n return multiplier * ((roundedUp + multiple - 1) / multiple | 0) * multiple;\n}\nfunction clamp(value, min, max) {\n if (value < min) {\n return min;\n } else if (value > max) {\n return max;\n } else {\n return value;\n }\n}\nfunction objectHasProperty(object, field) {\n return Object.prototype.hasOwnProperty.call(object, field);\n}\nfunction extend(to, from) {\n for (var key in from) {\n if (objectHasProperty(from, key)) {\n to[key] = from[key];\n }\n }\n return to;\n}\n\n/**\n * Checks whether the given array contains values in ascending order.\n *\n * @param {Array<Number>} array The array to test\n * @returns {Boolean}\n */\n\nfunction isInAscendingOrder(array) {\n if (array.length === 0) {\n return true;\n }\n var value = array[0];\n for (var i = 1; i < array.length; i++) {\n if (value >= array[i]) {\n return false;\n }\n value = array[i];\n }\n return true;\n}\n\n/**\n * Checks whether the given value is a number.\n *\n * @param {Number} value The value to test\n * @returns {Boolean}\n */\n\nfunction isNumber(value) {\n return typeof value === 'number';\n}\n\n/**\n * Checks whether the given value is a finite number.\n *\n * @param {Number} value The value to test\n * @returns {Boolean}\n */\n\nfunction isFinite(value) {\n if (typeof value !== 'number') {\n return false;\n }\n\n // Check for NaN and infinity\n // eslint-disable-next-line no-self-compare\n if (value !== value || value === Infinity || value === -Infinity) {\n return false;\n }\n return true;\n}\n\n/**\n * Checks whether the given value is a valid timestamp.\n *\n * @param {Number} value The value to test\n * @returns {Boolean}\n */\n\nfunction isValidTime(value) {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\n/**\n * Checks whether the given value is a valid object.\n *\n * @param {Object|Array} value The value to test\n * @returns {Boolean}\n */\n\nfunction isObject(value) {\n return value !== null && _typeof(value) === 'object' && !Array.isArray(value);\n}\n\n/**\n * Checks whether the given value is a valid string.\n *\n * @param {String} value The value to test\n * @returns {Boolean}\n */\n\nfunction isString(value) {\n return typeof value === 'string';\n}\n\n/**\n * Checks whether the given value is a valid ArrayBuffer.\n *\n * @param {ArrayBuffer} value The value to test\n * @returns {Boolean}\n */\n\nfunction isArrayBuffer(value) {\n return Object.prototype.toString.call(value).includes('ArrayBuffer');\n}\n\n/**\n * Checks whether the given value is null or undefined.\n *\n * @param {Object} value The value to test\n * @returns {Boolean}\n */\n\nfunction isNullOrUndefined(value) {\n return value === undefined || value === null;\n}\n\n/**\n * Checks whether the given value is a function.\n *\n * @param {Function} value The value to test\n * @returns {Boolean}\n */\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n\n/**\n * Checks whether the given value is a boolean.\n *\n * @param {Function} value The value to test\n * @returns {Boolean}\n */\n\nfunction isBoolean(value) {\n return value === true || value === false;\n}\n\n/**\n * Checks whether the given value is a valid HTML element.\n *\n * @param {HTMLElement} value The value to test\n * @returns {Boolean}\n */\n\nfunction isHTMLElement(value) {\n return value instanceof HTMLElement;\n}\n\n/**\n * Checks whether the given value is an array\n *\n * @param {Function} value The value to test\n * @returns {Boolean}\n */\n\nfunction isArray(value) {\n return Array.isArray(value);\n}\n\n/**\n * Checks whether the given value is a valid linear gradient color\n *\n * @param {Function} value The value to test\n * @returns {Boolean}\n */\n\nfunction isLinearGradientColor(value) {\n return isObject(value) && objectHasProperty(value, 'linearGradientStart') && objectHasProperty(value, 'linearGradientEnd') && objectHasProperty(value, 'linearGradientColorStops') && isNumber(value.linearGradientStart) && isNumber(value.linearGradientEnd) && isArray(value.linearGradientColorStops) && value.linearGradientColorStops.length === 2;\n}\nfunction getMarkerObject(obj) {\n while (obj.parent !== null) {\n if (obj.parent instanceof Konva.Layer) {\n return obj;\n }\n obj = obj.parent;\n }\n return null;\n}\n\nvar isHeadless = /HeadlessChrome/.test(navigator.userAgent);\nfunction windowIsVisible() {\n if (isHeadless || navigator.webdriver) {\n return false;\n }\n return (typeof document === \"undefined\" ? \"undefined\" : _typeof(document)) === 'object' && 'visibilityState' in document && document.visibilityState === 'visible';\n}\nvar requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;\nvar cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame;\nvar eventTypes = {\n forward: {},\n reverse: {}\n};\nvar EVENT_TYPE_POINT = 0;\nvar EVENT_TYPE_SEGMENT_ENTER = 1;\nvar EVENT_TYPE_SEGMENT_EXIT = 2;\neventTypes.forward[Cue.POINT] = EVENT_TYPE_POINT;\neventTypes.forward[Cue.SEGMENT_START] = EVENT_TYPE_SEGMENT_ENTER;\neventTypes.forward[Cue.SEGMENT_END] = EVENT_TYPE_SEGMENT_EXIT;\neventTypes.reverse[Cue.POINT] = EVENT_TYPE_POINT;\neventTypes.reverse[Cue.SEGMENT_START] = EVENT_TYPE_SEGMENT_EXIT;\neventTypes.reverse[Cue.SEGMENT_END] = EVENT_TYPE_SEGMENT_ENTER;\nvar eventNames = {};\neventNames[EVENT_TYPE_POINT] = 'points.enter';\neventNames[EVENT_TYPE_SEGMENT_ENTER] = 'segments.enter';\neventNames[EVENT_TYPE_SEGMENT_EXIT] = 'segments.exit';\nvar eventAttributes = {};\neventAttributes[EVENT_TYPE_POINT] = 'point';\neventAttributes[EVENT_TYPE_SEGMENT_ENTER] = 'segment';\neventAttributes[EVENT_TYPE_SEGMENT_EXIT] = 'segment';\n\n/**\n * Given a cue instance, returns the corresponding {@link Point}\n * {@link Segment}.\n *\n * @param {Peaks} peaks\n * @param {Cue} cue\n * @return {Point|Segment}\n * @throws {Error}\n */\n\nfunction getPointOrSegment(peaks, cue) {\n switch (cue.type) {\n case Cue.POINT:\n return peaks.points.getPoint(cue.id);\n case Cue.SEGMENT_START:\n case Cue.SEGMENT_END:\n return peaks.segments.getSegment(cue.id);\n default:\n throw new Error('getPointOrSegment: id not found?');\n }\n}\n\n/**\n * CueEmitter is responsible for emitting <code>points.enter</code>,\n * <code>segments.enter</code>, and <code>segments.exit</code> events.\n *\n * @class\n * @alias CueEmitter\n *\n * @param {Peaks} peaks Parent {@link Peaks} instance.\n */\n\nfunction CueEmitter(peaks) {\n this._cues = [];\n this._peaks = peaks;\n this._previousTime = -1;\n this._updateCues = this._updateCues.bind(this);\n this._onPlaying = this._onPlaying.bind(this);\n this._onSeeked = this._onSeeked.bind(this);\n this._onTimeUpdate = this._onTimeUpdate.bind(this);\n this._onAnimationFrame = this._onAnimationFrame.bind(this);\n this._rAFHandle = null;\n this._activeSegments = {};\n this._attachEventHandlers();\n}\n\n/**\n * This function is bound to all {@link Peaks} events relating to mutated\n * [Points]{@link Point} or [Segments]{@link Segment}, and updates the\n * list of cues accordingly.\n *\n * @private\n */\n\nCueEmitter.prototype._updateCues = function () {\n var self = this;\n var points = self._peaks.points.getPoints();\n var segments = self._peaks.segments.getSegments();\n self._cues.length = 0;\n points.forEach(function (point) {\n self._cues.push(new Cue(point.time, Cue.POINT, point.id));\n });\n segments.forEach(function (segment) {\n self._cues.push(new Cue(segment.startTime, Cue.SEGMENT_START, segment.id));\n self._cues.push(new Cue(segment.endTime, Cue.SEGMENT_END, segment.id));\n });\n self._cues.sort(Cue.sorter);\n var time = self._peaks.player.getCurrentTime();\n self._updateActiveSegments(time);\n};\n\n/**\n * Emits events for any cues passed through during media playback.\n *\n * @param {Number} time The current time on the media timeline.\n * @param {Number} previousTime The previous time on the media timeline when\n * this function was called.\n */\n\nCueEmitter.prototype._onUpdate = function (time, previousTime) {\n var isForward = time > previousTime;\n var start;\n var end;\n var step;\n if (isForward) {\n start = 0;\n end = this._cues.length;\n step = 1;\n } else {\n start = this._cues.length - 1;\n end = -1;\n step = -1;\n }\n\n // Cues are sorted.\n\n for (var i = start; isForward ? i < end : i > end; i += step) {\n var cue = this._cues[i];\n if (isForward ? cue.time > previousTime : cue.time < previousTime) {\n if (isForward ? cue.time > time : cue.time < time) {\n break;\n }\n\n // Cue falls between time and previousTime.\n\n var marker = getPointOrSegment(this._peaks, cue);\n var eventType = isForward ? eventTypes.forward[cue.type] : eventTypes.reverse[cue.type];\n if (eventType === EVENT_TYPE_SEGMENT_ENTER) {\n this._activeSegments[marker.id] = marker;\n } else if (eventType === EVENT_TYPE_SEGMENT_EXIT) {\n delete this._activeSegments[marker.id];\n }\n var event = {\n time: time\n };\n event[eventAttributes[eventType]] = marker;\n this._peaks.emit(eventNames[eventType], event);\n }\n }\n};\n\n// The next handler and onAnimationFrame are bound together\n// when the window isn't in focus, rAF is throttled\n// falling back to timeUpdate.\n\nCueEmitter.prototype._onTimeUpdate = function (time) {\n if (windowIsVisible()) {\n return;\n }\n if (this._peaks.player.isPlaying() && !this._peaks.player.isSeeking()) {\n this._onUpdate(time, this._previousTime);\n }\n this._previousTime = time;\n};\nCueEmitter.prototype._onAnimationFrame = function () {\n var time = this._peaks.player.getCurrentTime();\n if (!this._peaks.player.isSeeking()) {\n this._onUpdate(time, this._previousTime);\n }\n this._previousTime = time;\n if (this._peaks.player.isPlaying()) {\n this._rAFHandle = requestAnimationFrame(this._onAnimationFrame);\n }\n};\nCueEmitter.prototype._onPlaying = function () {\n this._previousTime = this._peaks.player.getCurrentTime();\n this._rAFHandle = requestAnimationFrame(this._onAnimationFrame);\n};\nCueEmitter.prototype._onSeeked = function (time) {\n this._previousTime = time;\n this._updateActiveSegments(time);\n};\nfunction getSegmentIdComparator(id) {\n return function compareSegmentIds(segment) {\n return segment.id === id;\n };\n}\n\n/**\n * The active segments is the set of all segments which overlap the current\n * playhead position. This function updates that set and emits\n * <code>segments.enter</code> and <code>segments.exit</code> events.\n */\n\nCueEmitter.prototype._updateActiveSegments = function (time) {\n var self = this;\n var activeSegments = self._peaks.segments.getSegmentsAtTime(time);\n\n // Remove any segments no longer active.\n\n for (var id in self._activeSegments) {\n if (objectHasProperty(self._activeSegments, id)) {\n var segment = activeSegments.find(getSegmentIdComparator(id));\n if (!segment) {\n self._peaks.emit('segments.exit', {\n segment: self._activeSegments[id],\n time: time\n });\n delete self._activeSegments[id];\n }\n }\n }\n\n // Add new active segments.\n\n activeSegments.forEach(function (segment) {\n if (!(segment.id in self._activeSegments)) {\n self._activeSegments[segment.id] = segment;\n self._peaks.emit('segments.enter', {\n segment: segment,\n time: time\n });\n }\n });\n};\nvar events = ['points.update', 'points.dragmove', 'points.add', 'points.remove', 'points.remove_all', 'segments.update', 'segments.dragged', 'segments.add', 'segments.remove', 'segments.remove_all'];\nCueEmitter.prototype._attachEventHandlers = function () {\n this._peaks.on('player.timeupdate', this._onTimeUpdate);\n this._peaks.on('player.playing', this._onPlaying);\n this._peaks.on('player.seeked', this._onSeeked);\n for (var i = 0; i < events.length; i++) {\n this._peaks.on(events[i], this._updateCues);\n }\n this._updateCues();\n};\nCueEmitter.prototype._detachEventHandlers = function () {\n this._peaks.off('player.timeupdate', this._onTimeUpdate);\n this._peaks.off('player.playing', this._onPlaying);\n this._peaks.off('player.seeked', this._onSeeked);\n for (var i = 0; i < events.length; i++) {\n this._peaks.off(events[i], this._updateCues);\n }\n};\nCueEmitter.prototype.destroy = function () {\n if (this._rAFHandle) {\n cancelAnimationFrame(this._rAFHandle);\n this._rAFHandle = null;\n }\n this._detachEventHandlers();\n this._previousTime = -1;\n};\n\n/**\n * @file\n *\n * Defines the {@link Point} class.\n *\n * @module point\n */\n\nvar pointOptions = ['id', 'pid', 'time', 'labelText', 'color', 'editable'];\nvar invalidOptions$1 = ['update', 'isVisible', 'peaks', 'pid'];\nfunction setDefaultPointOptions(options, peaksOptions) {\n if (isNullOrUndefined(options.labelText)) {\n options.labelText = '';\n }\n if (isNullOrUndefined(options.editable)) {\n options.editable = false;\n }\n if (isNullOrUndefined(options.color)) {\n options.color = peaksOptions.pointMarkerColor;\n }\n}\nfunction validatePointOptions(options, updating) {\n var context = updating ? 'update()' : 'add()';\n if (!updating || updating && objectHasProperty(options, 'time')) {\n if (!isValidTime(options.time)) {\n // eslint-disable-next-line max-len\n throw new TypeError('peaks.points.' + context + ': time should be a numeric value');\n }\n }\n if (options.time < 0) {\n // eslint-disable-next-line max-len\n throw new RangeError('peaks.points.' + context + ': time should not be negative');\n }\n if (objectHasProperty(options, 'labelText') && !isString(options.labelText)) {\n throw new TypeError('peaks.points.' + context + ': labelText must be a string');\n }\n if (objectHasProperty(options, 'editable') && !isBoolean(options.editable)) {\n throw new TypeError('peaks.points.' + context + ': editable must be true or false');\n }\n if (objectHasProperty(options, 'color') && !isString(options.color) && !isLinearGradientColor(options.color)) {\n // eslint-disable-next-line max-len\n throw new TypeError('peaks.points.' + context + ': color must be a string or a valid linear gradient object');\n }\n invalidOptions$1.forEach(function (name) {\n if (objectHasProperty(options, name)) {\n throw new Error('peaks.points.' + context + ': invalid option name: ' + name);\n }\n });\n pointOptions.forEach(function (name) {\n if (objectHasProperty(options, '_' + name)) {\n throw new Error('peaks.points.' + context + ': invalid option name: _' + name);\n }\n });\n}\n\n/**\n * A point is a single instant of time, with associated label and color.\n *\n * @class\n * @alias Point\n *\n * @param {Peaks} peaks A reference to the Peaks instance.\n * @param {Number} pid An internal unique identifier for the point.\n * @param {PointOptions} options User specified point attributes.\n */\n\nfunction Point(peaks, pid, options) {\n this._peaks = peaks;\n this._pid = pid;\n this._setUserData(options);\n}\nPoint.prototype._setUserData = function (options) {\n for (var key in options) {\n if (objectHasProperty(options, key)) {\n if (pointOptions.indexOf(key) === -1) {\n this[key] = options[key];\n } else {\n this['_' + key] = options[key];\n }\n }\n }\n};\nObject.defineProperties(Point.prototype, {\n id: {\n enumerable: true,\n get: function get() {\n return this._id;\n }\n },\n pid: {\n enumerable: true,\n get: function get() {\n return this._pid;\n }\n },\n time: {\n enumerable: true,\n get: function get() {\n return this._time;\n }\n },\n labelText: {\n get: function get() {\n return this._labelText;\n }\n },\n color: {\n enumerable: true,\n get: function get() {\n return this._color;\n }\n },\n editable: {\n enumerable: true,\n get: function get() {\n return this._editable;\n }\n }\n});\nPoint.prototype.update = function (options) {\n validatePointOptions(options, true);\n if (objectHasProperty(options, 'id')) {\n if (isNullOrUndefined(options.id)) {\n throw new TypeError('point.update(): invalid id');\n }\n this._peaks.points.updatePointId(this, options.id);\n }\n this._setUserData(options);\n this._peaks.emit('points.update', this, options);\n};\n\n/**\n * Returns <code>true</code> if the point lies with in a given time range.\n *\n * @param {Number} startTime The start of the time region, in seconds.\n * @param {Number} endTime The end of the time region, in seconds.\n * @returns {Boolean}\n */\n\nPoint.prototype.isVisible = function (startTime, endTime) {\n return this.time >= startTime && this.time < endTime;\n};\nPoint.prototype._setTime = function (time) {\n this._time = time;\n};\n\n/**\n * @file\n *\n * Defines the {@link WaveformPoints} class.\n *\n * @module waveform-points\n */\n\n\n/**\n * Point parameters.\n *\n * @typedef {Object} PointOptions\n * @global\n * @property {Number} time Point time, in seconds.\n * @property {Boolean=} editable If <code>true</code> the point time can be\n * adjusted via the user interface.\n * Default: <code>false</code>.\n * @property {String=} color Point marker color.\n * Default: a random color.\n * @property {String=} labelText Point label text.\n * Default: an empty string.\n * @property {String=} id A unique point identifier.\n * Default: an automatically generated identifier.\n * @property {*} data Optional application-specific data.\n */\n\n/**\n * Handles all functionality related to the adding, removing and manipulation\n * of points. A point is a single instant of time.\n *\n * @class\n * @alias WaveformPoints\n *\n * @param {Peaks} peaks The parent Peaks object.\n */\n\nfunction WaveformPoints(peaks) {\n this._peaks = peaks;\n this._points = [];\n this._pointsById = {};\n this._pointsByPid = {};\n this._pointIdCounter = 0;\n this._pointPid = 0;\n}\n\n/**\n * Returns a new unique point id value.\n *\n * @returns {String}\n */\n\nWaveformPoints.prototype._getNextPointId = function () {\n return 'peaks.point.' + this._pointIdCounter++;\n};\n\n/**\n * Returns a new unique point id value, for internal use within\n * Peaks.js only.\n *\n * @returns {Number}\n */\n\nWaveformPoints.prototype._getNextPid = function () {\n return this._pointPid++;\n};\n\n/**\n * Adds a new point object.\n *\n * @private\n * @param {Point} point\n */\n\nWaveformPoints.prototype._addPoint = function (point) {\n this._points.push(point);\n this._pointsById[point.id] = point;\n this._pointsByPid[point.pid] = point;\n};\n\n/**\n * Creates a new point object.\n *\n * @private\n * @param {PointOptions} options\n * @returns {Point}\n */\n\nWaveformPoints.prototype._createPoint = function (options) {\n var pointOptions = {};\n extend(pointOptions, options);\n if (isNullOrUndefined(pointOptions.id)) {\n pointOptions.id = this._getNextPointId();\n }\n var pid = this._getNextPid();\n setDefaultPointOptions(pointOptions, this._peaks.options);\n validatePointOptions(pointOptions, false);\n return new Point(this._peaks, pid, pointOptions);\n};\n\n/**\n * Returns all points.\n *\n * @returns {Array<Point>}\n */\n\nWaveformPoints.prototype.getPoints = function () {\n return this._points;\n};\n\n/**\n * Returns the point with the given id, or <code>undefined</code> if not found.\n *\n * @param {String} id\n * @returns {Point}\n */\n\nWaveformPoints.prototype.getPoint = function (id) {\n return this._pointsById[id];\n};\n\n/**\n * Returns all points within a given time region.\n *\n * @param {Number} startTime The start of the time region, in seconds.\n * @param {Number} endTime The end of the time region, in seconds.\n * @returns {Array<Point>}\n */\n\nWaveformPoints.prototype.find = function (startTime, endTime) {\n return this._points.filter(function (point) {\n return point.isVisible(startTime, endTime);\n });\n};\n\n/**\n * Adds one or more points to the timeline.\n *\n * @param {PointOptions|Array<PointOptions>} pointOrPoints\n *\n * @returns Point|Array<Point>\n */\n\nWaveformPoints.prototype.add = function /* pointOrPoints */\n() {\n var self = this;\n var arrayArgs = Array.isArray(arguments[0]);\n var points = arrayArgs ? arguments[0] : Array.prototype.slice.call(arguments);\n points = points.map(function (pointOptions) {\n var point = self._createPoint(pointOptions);\n if (objectHasProperty(self._pointsById, point.id)) {\n throw new Error('peaks.points.add(): duplicate id');\n }\n return point;\n });\n points.forEach(function (point) {\n self._addPoint(point);\n });\n this._peaks.emit('points.add', {\n points: points\n });\n return arrayArgs ? points : points[0];\n};\nWaveformPoints.prototype.updatePointId = function (point, newPointId) {\n if (this._pointsById[point.id]) {\n if (this._pointsById[newPointId]) {\n throw new Error('point.update(): duplicate id');\n } else {\n delete this._pointsById[point.id];\n this._pointsById[newPointId] = point;\n }\n }\n};\n\n/**\n * Returns the indexes of points that match the given predicate.\n *\n * @private\n * @param {Function} predicate Predicate function to find matching points.\n * @returns {Array<Number>} An array of indexes into the points array of\n * the matching elements.\n */\n\nWaveformPoints.prototype._findPoint = function (predicate) {\n var indexes = [];\n for (var i = 0, length = this._points.length; i < length; i++) {\n if (predicate(this._points[i])) {\n indexes.push(i);\n }\n }\n return indexes;\n};\n\n/**\n * Removes the points at the given array indexes.\n *\n * @private\n * @param {Array<Number>} indexes The array indexes to remove.\n * @returns {Array<Point>} The removed {@link Point} objects.\n */\n\nWaveformPoints.prototype._removeIndexes = function (indexes) {\n var removed = [];\n for (var i = 0; i < indexes.length; i++) {\n var index = indexes[i] - removed.length;\n var itemRemoved = this._points.splice(index, 1)[0];\n delete this._pointsById[itemRemoved.id];\n delete this._pointsByPid[itemRemoved.pid];\n removed.push(itemRemoved);\n }\n return removed;\n};\n\n/**\n * Removes all points that match a given predicate function.\n *\n * After removing the points, this function emits a\n * <code>points.remove</code> event with the removed {@link Point}\n * objects.\n *\n * @private\n * @param {Function} predicate A predicate function that identifies which\n * points to remove.\n * @returns {Array<Point>} The removed {@link Points} objects.\n */\n\nWaveformPoints.prototype._removePoints = function (predicate) {\n var indexes = this._findPoint(predicate);\n var removed = this._removeIndexes(indexes);\n this._peaks.emit('points.remove', {\n points: removed\n });\n return removed;\n};\n\n/**\n * Removes the given point.\n *\n * @param {Point} point The point to remove.\n * @returns {Array<Point>} The removed points.\n */\n\nWaveformPoints.prototype.remove = function (point) {\n return this._removePoints(function (p) {\n return p === point;\n });\n};\n\n/**\n * Removes any points with the given id.\n *\n * @param {String} id\n * @returns {Array<Point>} The removed {@link Point} objects.\n */\n\nWaveformPoints.prototype.removeById = function (pointId) {\n return this._removePoints(function (point) {\n return point.id === pointId;\n });\n};\n\n/**\n * Removes any points at the given time.\n *\n * @param {Number} time\n * @returns {Array<Point>} The removed {@link Point} objects.\n */\n\nWaveformPoints.prototype.removeByTime = function (time) {\n return this._removePoints(function (point) {\n return point.time === time;\n });\n};\n\n/**\n * Removes all points.\n *\n * After removing the points, this function emits a\n * <code>points.remove_all</code> event.\n */\n\nWaveformPoints.prototype.removeAll = function () {\n this._points = [];\n this._pointsById = {};\n this._pointsByPid = {};\n this._peaks.emit('points.remove_all');\n};\n\n/**\n * @file\n *\n * Defines the {@link Segment} class.\n *\n * @module segment\n */\n\nvar segmentOptions = ['id', 'pid', 'startTime', 'endTime', 'labelText', 'color', 'borderColor', 'editable'];\nvar invalidOptions = ['update', 'isVisible', 'peaks', 'pid'];\nfunction setDefaultSegmentOptions(options, globalSegmentOptions) {\n if (isNullOrUndefined(options.color)) {\n if (globalSegmentOptions.overlay) {\n options.color = globalSegmentOptions.overlayColor;\n } else {\n options.color = globalSegmentOptions.waveformColor;\n }\n }\n if (isNullOrUndefined(options.borderColor)) {\n options.borderColor = globalSegmentOptions.overlayBorderColor;\n }\n if (isNullOrUndefined(options.labelText)) {\n options.labelText = '';\n }\n if (isNullOrUndefined(options.editable)) {\n options.editable = false;\n }\n}\nfunction validateSegmentOptions(options, updating) {\n var context = updating ? 'update()' : 'add()';\n if (objectHasProperty(options, 'startTime') && !isValidTime(options.startTime)) {\n // eslint-disable-next-line max-len\n throw new TypeError('peaks.segments.' + context + ': startTime should be a valid number');\n }\n if (objectHasProperty(options, 'endTime') && !isValidTime(options.endTime)) {\n // eslint-disable-next-line max-len\n throw new TypeError('peaks.segments.' + context + ': endTime should be a valid number');\n }\n if (!updating) {\n if (!objectHasProperty(options, 'startTime') || !objectHasProperty(options, 'endTime')) {\n throw new TypeError('peaks.segments.' + context + ': missing startTime or endTime');\n }\n }\n if (options.startTime < 0) {\n // eslint-disable-next-line max-len\n throw new RangeError('peaks.segments.' + context + ': startTime should not be negative');\n }\n if (options.endTime < 0) {\n // eslint-disable-next-line max-len\n throw new RangeError('peaks.segments.' + context + ': endTime should not be negative');\n }\n if (options.endTime < options.startTime) {\n // eslint-disable-next-line max-len\n throw new RangeError('peaks.segments.' + context + ': endTime should not be less than startTime');\n }\n if (objectHasProperty(options, 'labelText') && !isString(options.labelText)) {\n throw new TypeError('peaks.segments.' + context + ': labelText must be a string');\n }\n if (objectHasProperty(options, 'editable') && !isBoolean(options.editable)) {\n throw new TypeError('peaks.segments.' + context + ': editable must be true or false');\n }\n if (objectHasProperty(options, 'color') && !isString(options.color) && !isLinearGradientColor(options.color)) {\n // eslint-disable-next-line max-len\n throw new TypeError('peaks.segments.' + context + ': color must be a string or a valid linear gradient object');\n }\n if (objectHasProperty(options, 'borderColor') && !isString(options.borderColor)) {\n // eslint-disable-next-line max-len\n throw new TypeError('peaks.segments.' + context + ': borderColor must be a string');\n }\n invalidOptions.forEach(function (name) {\n if (objectHasProperty(options, name)) {\n throw new Error('peaks.segments.' + context + ': invalid option name: ' + name);\n }\n });\n segmentOptions.forEach(function (name) {\n if (objectHasProperty(options, '_' + name)) {\n throw new Error('peaks.segments.' + context + ': invalid option name: _' + name);\n }\n });\n}\n\n/**\n * A segment is a region of time, with associated label and color.\n *\n * @class\n * @alias Segment\n *\n * @param {Peaks} peaks A reference to the Peaks instance.\n * @param {Number} pid An internal unique identifier for the segment.\n * @param {SegmentOptions} options User specified segment attributes.\n */\n\nfunction Segment(peaks, pid, options) {\n this._peaks = peaks;\n this._pid = pid;\n this._id = options.id;\n this._startTime = options.startTime;\n this._endTime = options.endTime;\n this._labelText = options.labelText;\n this._color = options.color;\n this._borderColor = options.borderColor;\n this._editable = options.editable;\n this._setUserData(options);\n}\nSegment.prototype._setUserData = function (options) {\n for (var key in options) {\n if (objectHasProperty(options, key)) {\n if (segmentOptions.indexOf(key) === -1) {\n this[key] = options[key];\n } else {\n this['_' + key] = options[key];\n }\n }\n }\n};\nObject.defineProperties(Segment.prototype, {\n id: {\n enumerable: true,\n get: function get() {\n return this._id;\n }\n },\n pid: {\n enumerable: true,\n get: function get() {\n return this._pid;\n }\n },\n startTime: {\n enumerable: true,\n get: function get() {\n return this._startTime;\n }\n },\n endTime: {\n enumerable: true,\n get: function get() {\n return this._endTime;\n }\n },\n labelText: {\n enumerable: true,\n get: function get() {\n return this._labelText;\n }\n },\n color: {\n enumerable: true,\n get: function get() {\n return this._color;\n }\n },\n borderColor: {\n enumerable: true,\n get: function get() {\n return this._borderColor;\n }\n },\n editable: {\n enumerable: true,\n get: function get() {\n return this._editable;\n }\n }\n});\nSegment.prototype.update = function (options) {\n validateSegmentOptions(options, true);\n if (objectHasProperty(options, 'id')) {\n if (isNullOrUndefined(options.id)) {\n throw new TypeError('segment.update(): invalid id');\n }\n this._peaks.segments.updateSegmentId(this, options.id);\n }\n this._setUserData(options);\n this._peaks.emit('segments.update', this, options);\n};\n\n/**\n * Returns <code>true</code> if the segment overlaps a given time region.\n *\n * @param {Number} startTime The start of the time region, in seconds.\n * @param {Number} endTime The end of the time region, in seconds.\n * @returns {Boolean}\n *\n * @see http://wiki.c2.com/?TestIfDateRangesOverlap\n */\n\nSegment.prototype.isVisible = function (startTime, endTime) {\n return this.startTime < endTime && startTime < this.endTime;\n};\nSegment.prototype._setStartTime = function (time) {\n this._startTime = time;\n};\nSegment.prototype._setEndTime = function (time) {\n this._endTime = time;\n};\n\n/**\n * @file\n *\n * Defines the {@link WaveformSegments} class.\n *\n * @module waveform-segments\n */\n\n\n/**\n * Segment parameters.\n *\n * @typedef {Object} SegmentOptions\n * @global\n * @property {Number} startTime Segment start time, in seconds.\n * @property {Number} endTime Segment end time, in seconds.\n * @property {Boolean=} editable If <code>true</code> the segment start and\n * end times can be adjusted via the user interface.\n * Default: <code>false</code>.\n * @property {String=} color Segment waveform color.\n * Default: Set by the <code>segmentOptions.waveformColor</code> option\n * or the <code>segmentOptions.overlayColor</code> option.\n * @property {String=} borderColor Segment border color.\n * Default: Set by the <code>segmentOptions.overlayBorderColor</code> option.\n * @property {String=} labelText Segment label text.\n * Default: an empty string.\n * @property {String=} id A unique segment identifier.\n * Default: an automatically generated identifier.\n * @property {*} data Optional application specific data.\n */\n\n/**\n * Handles all functionality related to the adding, removing and manipulation\n * of segments.\n *\n * @class\n * @alias WaveformSegments\n *\n * @param {Peaks} peaks The parent Peaks object.\n */\n\nfunction WaveformSegments(peaks) {\n this._peaks = peaks;\n this._segments = [];\n this._segmentsById = {};\n this._segmentsByPid = {};\n this._segmentIdCounter = 0;\n this._segmentPid = 0;\n this._isInserting = false;\n}\n\n/**\n * Returns a new unique segment id value.\n *\n * @private\n * @returns {String}\n */\n\nWaveformSegments.prototype._getNextSegmentId = function () {\n return 'peaks.segment.' + this._segmentIdCounter++;\n};\n\n/**\n * Returns a new unique segment id value, for internal use within\n * Peaks.js only.\n *\n * @private\n * @returns {Number}\n */\n\nWaveformSegments.prototype._getNextPid = function () {\n return this._segmentPid++;\n};\n\n/**\n * Adds a new segment object.\n *\n * @private\n * @param {Segment} segment\n */\n\nWaveformSegments.prototype._addSegment = function (segment) {\n this._segments.push(segment);\n this._segmentsById[segment.id] = segment;\n this._segmentsByPid[segment.pid] = segment;\n};\n\n/**\n * Creates a new segment object.\n *\n * @private\n * @param {SegmentOptions} options\n * @return {Segment}\n */\n\nWaveformSegments.prototype._createSegment = function (options) {\n var segmentOptions = {};\n extend(segmentOptions, options);\n if (isNullOrUndefined(segmentOptions.id)) {\n segmentOptions.id = this._getNextSegmentId();\n }\n var pid = this._getNextPid();\n setDefaultSegmentOptions(segmentOptions, this._peaks.options.segmentOptions);\n validateSegmentOptions(segmentOptions, false);\n return new Segment(this._peaks, pid, segmentOptions);\n};\n\n/**\n * Returns all segments.\n *\n * @returns {Array<Segment>}\n */\n\nWaveformSegments.prototype.getSegments = function () {\n return this._segments;\n};\n\n/**\n * Returns the segment with the given id, or <code>undefined</code> if not found.\n *\n * @param {String} id\n * @returns {Segment}\n */\n\nWaveformSegments.prototype.getSegment = function (id) {\n return this._segmentsById[id];\n};\n\n/**\n * Returns all segments that overlap a given point in time.\n *\n * @param {Number} time\n * @returns {Array<Segment>}\n */\n\nWaveformSegments.prototype.getSegmentsAtTime = function (time) {\n return this._segments.filter(function (segment) {\n return time >= segment.startTime && time < segment.endTime;\n });\n};\n\n/**\n * Returns all segments that overlap a given time region.\n *\n * @param {Number} startTime The start of the time region, in seconds.\n * @param {Number} endTime The end of the time region, in seconds.\n *\n * @returns {Array<Segment>}\n */\n\nWaveformSegments.prototype.find = function (startTime, endTime) {\n return this._segments.filter(function (segment) {\n return segment.isVisible(startTime, endTime);\n });\n};\n\n/**\n * Returns a copy of the segments array, sorted by ascending segment start time.\n *\n * @returns {Array<Segment>}\n */\n\nWaveformSegments.prototype._getSortedSegments = function () {\n return this._segments.slice().sort(function (a, b) {\n return a.startTime - b.startTime;\n });\n};\nWaveformSegments.prototype.findPreviousSegment = function (segment) {\n var sortedSegments = this._getSortedSegments();\n var index = sortedSegments.findIndex(function (s) {\n return s.id === segment.id;\n });\n if (index !== -1) {\n return sortedSegments[index - 1];\n }\n return undefined;\n};\nWaveformSegments.prototype.findNextSegment = function (segment) {\n var sortedSegments = this._getSortedSegments();\n var index = sortedSegments.findIndex(function (s) {\n return s.id === segment.id;\n });\n if (index !== -1) {\n return sortedSegments[index + 1];\n }\n return undefined;\n};\n\n/**\n * Adds one or more segments to the timeline.\n *\n * @param {SegmentOptions|Array<SegmentOptions>} segmentOrSegments\n *\n * @returns Segment|Array<Segment>\n */\n\nWaveformSegments.prototype.add = function /* segmentOrSegments */\n() {\n var self = this;\n var arrayArgs = Array.isArray(arguments[0]);\n var segments = arrayArgs ? arguments[0] : Array.prototype.slice.call(arguments);\n segments = segments.map(function (segmentOptions) {\n var segment = self._createSegment(segmentOptions);\n if (objectHasProperty(self._segmentsById, segment.id)) {\n throw new Error('peaks.segments.add(): duplicate id');\n }\n return segment;\n });\n segments.forEach(function (segment) {\n self._addSegment(segment);\n });\n this._peaks.emit('segments.add', {\n segments: segments,\n insert: this._isInserting\n });\n return arrayArgs ? segments : segments[0];\n};\nWaveformSegments.prototype.updateSegmentId = function (segment, newSegmentId) {\n if (this._segmentsById[segment.id]) {\n if (this._segmentsById[newSegmentId]) {\n throw new Error('segment.update(): duplicate id');\n } else {\n delete this._segmentsById[segment.id];\n this._segmentsById[newSegmentId] = segment;\n }\n }\n};\n\n/**\n * Returns the indexes of segments that match the given predicate.\n *\n * @private\n * @param {Function} predicate Predicate function to find matching segments.\n * @returns {Array<Number>} An array of indexes into the segments array of\n * the matching elements.\n */\n\nWaveformSegments.prototype._findSegment = function (predicate) {\n var indexes = [];\n for (var i = 0, length = this._segments.length; i < length; i++) {\n if (predicate(this._segments[i])) {\n indexes.push(i);\n }\n }\n return indexes;\n};\n\n/**\n * Removes the segments at the given array indexes.\n *\n * @private\n * @param {Array<Number>} indexes The array indexes to remove.\n * @returns {Array<Segment>} The removed {@link Segment} objects.\n */\n\nWaveformSegments.prototype._removeIndexes = function (indexes) {\n var removed = [];\n for (var i = 0; i < indexes.length; i++) {\n var index = indexes[i] - removed.length;\n var itemRemoved = this._segments.splice(index, 1)[0];\n delete this._segmentsById[itemRemoved.id];\n delete this._segmentsByPid[itemRemoved.pid];\n removed.push(itemRemoved);\n }\n return removed;\n};\n\n/**\n * Removes all segments that match a given predicate function.\n *\n * After removing the segments, this function also emits a\n * <code>segments.remove</code> event with the removed {@link Segment}\n * objects.\n *\n * @private\n * @param {Function} predicate A predicate function that identifies which\n * segments to remove.\n * @returns {Array<Segment>} The removed {@link Segment} objects.\n */\n\nWaveformSegments.prototype._removeSegments = function (predicate) {\n var indexes = this._findSegment(predicate);\n var removed = this._removeIndexes(indexes);\n this._peaks.emit('segments.remove', {\n segments: removed\n });\n return removed;\n};\n\n/**\n * Removes the given segment.\n *\n * @param {Segment} segment The segment to remove.\n * @returns {Array<Segment>} The removed segment.\n */\n\nWaveformSegments.prototype.remove = function (segment) {\n return this._removeSegments(function (s) {\n return s === segment;\n });\n};\n\n/**\n * Removes any segments with the given id.\n *\n * @param {String} id\n * @returns {Array<Segment>} The removed {@link Segment} objects.\n */\n\nWaveformSegments.prototype.removeById = function (segmentId) {\n return this._removeSegments(function (segment) {\n return segment.id === segmentId;\n });\n};\n\n/**\n * Removes any segments with the given start time, and optional end time.\n *\n * @param {Number} startTime Segments with this start time are removed.\n * @param {Number?} endTime If present, only segments with both the given\n * start time and end time are removed.\n * @returns {Array<Segment>} The removed {@link Segment} objects.\n */\n\nWaveformSegments.prototype.removeByTime = function (startTime, endTime) {\n endTime = typeof endTime === 'number' ? endTime : 0;\n var filter;\n if (endTime > 0) {\n filter = function filter(segment) {\n return segment.startTime === startTime && segment.endTime === endTime;\n };\n } else {\n filter = function filter(segment) {\n return segment.startTime === startTime;\n };\n }\n return this._removeSegments(filter);\n};\n\n/**\n * Removes all segments.\n *\n * After removing the segments, this function emits a\n * <code>segments.remove_all</code> event.\n */\n\nWaveformSegments.prototype.removeAll = function () {\n this._segments = [];\n this._segmentsById = {};\n this._segmentsByPid = {};\n this._peaks.emit('segments.remove_all');\n};\nWaveformSegments.prototype.setInserting = function (value) {\n this._isInserting = value;\n};\nWaveformSegments.prototype.isInserting = function () {\n return this._isInserting;\n};\n\n/**\n * @file\n *\n * Defines the {@link KeyboardHandler} class.\n *\n * @module keyboard-handler\n */\n\nvar nodes = ['OBJECT', 'TEXTAREA', 'INPUT', 'SELECT', 'OPTION'];\nvar SPACE = 32,\n TAB = 9,\n LEFT_ARROW = 37,\n RIGHT_ARROW = 39;\nvar keys = [SPACE, TAB, LEFT_ARROW, RIGHT_ARROW];\n\n/**\n * Configures keyboard event handling.\n *\n * @class\n * @alias KeyboardHandler\n *\n * @param {EventEmitter} eventEmitter\n */\n\nfunction KeyboardHandler(eventEmitter) {\n this.eventEmitter = eventEmitter;\n this._handleKeyEvent = this._handleKeyEvent.bind(this);\n document.addEventListener('keydown', this._handleKeyEvent);\n document.addEventListener('keypress', this._handleKeyEvent);\n document.addEventListener('keyup', this._handleKeyEvent);\n}\n\n/**\n * Keyboard event handler function.\n *\n * @note Arrow keys only triggered on keydown, not keypress.\n *\n * @param {KeyboardEvent} event\n * @private\n */\n\nKeyboardHandler.prototype._handleKeyEvent = function handleKeyEvent(event) {\n if (nodes.indexOf(event.target.nodeName) === -1) {\n if (keys.indexOf(event.type) > -1) {\n event.preventDefault();\n }\n if (event.type === 'keydown' || event.type === 'keypress') {\n switch (event.keyCode) {\n case SPACE:\n this.eventEmitter.emit('keyboard.space');\n break;\n case TAB:\n this.eventEmitter.emit('keyboard.tab');\n break;\n }\n } else if (event.type === 'keyup') {\n switch (event.keyCode) {\n case LEFT_ARROW:\n if (event.shiftKey) {\n this.eventEmitter.emit('keyboard.shift_left');\n } else {\n this.eventEmitter.emit('keyboard.left');\n }\n break;\n case RIGHT_ARROW:\n if (event.shiftKey) {\n this.eventEmitter.emit('keyboard.shift_right');\n } else {\n this.eventEmitter.emit('keyboard.right');\n }\n break;\n }\n }\n }\n};\nKeyboardHandler.prototype.destroy = function () {\n document.removeEventListener('keydown', this._handleKeyEvent);\n document.removeEventListener('keypress', this._handleKeyEvent);\n document.removeEventListener('keyup', this._handleKeyEvent);\n};\n\n/**\n * @file\n *\n * Implementation of {@link Player} adapter based on the HTML5 media element.\n *\n * @module mediaelement-player\n */\n\n/**\n * Checks whether the given HTMLMediaElement has either a src attribute\n * or any child <code><source></code> nodes\n */\n\nfunction mediaElementHasSource(mediaElement) {\n if (mediaElement.src) {\n return true;\n }\n if (mediaElement.querySelector('source')) {\n return true;\n }\n return false;\n}\n\n/**\n * A wrapper for interfacing with the HTML5 media element API.\n * Initializes the player for a given media element.\n *\n * @class\n * @alias MediaElementPlayer\n * @param {HTMLMediaElement} mediaElement The HTML <code><audio></code>\n * or <code><video></code> element to associate with the\n * {@link Peaks} instance.\n */\n\nfunction MediaElementPlayer(mediaElement) {\n this._mediaElement = mediaElement;\n}\n\n/**\n * Adds an event listener to the media element.\n *\n * @private\n * @param {String} type The event type to listen for.\n * @param {Function} callback An event handler function.\n */\n\nMediaElementPlayer.prototype._addMediaListener = function (type, callback) {\n this._listeners.push({\n type: type,\n callback: callback\n });\n this._mediaElement.addEventListener(type, callback);\n};\nMediaElementPlayer.prototype.init = function (eventEmitter) {\n var self = this;\n self._eventEmitter = eventEmitter;\n self._listeners = [];\n self._duration = self.getDuration();\n self._addMediaListener('timeupdate', function () {\n self._eventEmitter.emit('player.timeupdate', self.getCurrentTime());\n });\n self._addMediaListener('playing', function () {\n self._eventEmitter.emit('player.playing', self.getCurrentTime());\n });\n self._addMediaListener('pause', function () {\n self._eventEmitter.emit('player.pause', self.getCurrentTime());\n });\n self._addMediaListener('ended', function () {\n self._eventEmitter.emit('player.ended');\n });\n self._addMediaListener('seeked', function () {\n self._eventEmitter.emit('player.seeked', self.getCurrentTime());\n });\n self._addMediaListener('canplay', function () {\n self._eventEmitter.emit('player.canplay');\n });\n self._addMediaListener('error', function (event) {\n self._eventEmitter.emit('player.error', event.target.error);\n });\n self._interval = null;\n if (!mediaElementHasSource(self._mediaElement)) {\n return Promise.resolve();\n } else if (self._mediaElement.error && self._mediaElement.error.code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED) {\n // The media element has a source, but the format is not supported.\n return Promise.reject(self._mediaElement.error);\n }\n return new Promise(function (resolve, reject) {\n function eventHandler(event) {\n self._mediaElement.removeEventListener('loadedmetadata', eventHandler);\n self._mediaElement.removeEventListener('error', eventHandler);\n if (event.type === 'loadedmetadata') {\n resolve();\n } else {\n reject(event.target.error);\n }\n }\n\n // If the media element has preload=\"none\", clicking to seek in the\n // waveform won't work, so here we force the media to load.\n if (self._mediaElement.readyState === HTMLMediaElement.HAVE_NOTHING) {\n // Wait for the readyState to change to HAVE_METADATA so we know the\n // duration is valid, otherwise it could be NaN.\n self._mediaElement.addEventListener('loadedmetadata', eventHandler);\n self._mediaElement.addEventListener('error', eventHandler);\n self._mediaElement.load();\n } else {\n resolve();\n }\n });\n};\n\n/**\n * Cleans up the player object, removing all event listeners from the\n * associated media element.\n */\n\nMediaElementPlayer.prototype.destroy = function () {\n for (var i = 0; i < this._listeners.length; i++) {\n var listener = this._listeners[i];\n this._mediaElement.removeEventListener(listener.type, listener.callback);\n }\n this._listeners.length = 0;\n this._mediaElement = null;\n};\nMediaElementPlayer.prototype.play = function () {\n return this._mediaElement.play();\n};\nMediaElementPlayer.prototype.pause = function () {\n this._mediaElement.pause();\n};\nMediaElementPlayer.prototype.isPlaying = function () {\n return !this._mediaElement.paused;\n};\nMediaElementPlayer.prototype.isSeeking = function () {\n return this._mediaElement.seeking;\n};\nMediaElementPlayer.prototype.getCurrentTime = function () {\n return this._mediaElement.currentTime;\n};\nMediaElementPlayer.prototype.getDuration = function () {\n return this._mediaElement.duration;\n};\nMediaElementPlayer.prototype.seek = function (time) {\n this._mediaElement.currentTime = time;\n};\nfunction SetSourceHandler(eventEmitter, mediaElement) {\n this._eventEmitter = eventEmitter;\n this._mediaElement = mediaElement;\n this._playerCanPlayHandler = this._playerCanPlayHandler.bind(this);\n this._playerErrorHandler = this._playerErrorHandler.bind(this);\n}\nSetSourceHandler.prototype.setSource = function (options, callback) {\n var self = this;\n self._options = options;\n self._callback = callback;\n self._eventEmitter.on('player.canplay', self._playerCanPlayHandler);\n self._eventEmitter.on('player.error', self._playerErrorHandler);\n return new Promise(function (resolve, reject) {\n self._resolve = resolve;\n self._reject = reject;\n self._eventEmitter.on('player.canplay', self._playerCanPlayHandler);\n self._eventEmitter.on('player.error', self._playerErrorHandler);\n self._mediaElement.setAttribute('src', options.mediaUrl);\n\n // Force the media element to load, in case the media element\n // has preload=\"none\".\n if (self._mediaElement.readyState === HTMLMediaElement.HAVE_NOTHING) {\n self._mediaElement.load();\n }\n });\n};\nSetSourceHandler.prototype._reset = function () {\n this._eventEmitter.removeListener('player.canplay', this._playerCanPlayHandler);\n this._eventEmitter.removeListener('player.error', this._playerErrorHandler);\n};\nSetSourceHandler.prototype._playerCanPlayHandler = function () {\n this._reset();\n this._resolve();\n};\nSetSourceHandler.prototype._playerErrorHandler = function (err) {\n this._reset();\n\n // Return the MediaError object from the media element\n this._reject(err);\n};\nMediaElementPlayer.prototype.setSource = function (options) {\n if (!options.mediaUrl) {\n // eslint-disable-next-line max-len\n return Promise.reject(new Error('peaks.setSource(): options must contain a mediaUrl when using mediaElement'));\n }\n var setSourceHandler = new SetSourceHandler(this._eventEmitter, this._mediaElement);\n return setSourceHandler.setSource(options);\n};\n\n/**\n * @file\n *\n * A general audio player class which interfaces with external audio players.\n * The default audio player in Peaks.js is {@link MediaElementPlayer}.\n *\n * @module player\n */\n\nfunction getAllPropertiesFrom(adapter) {\n var allProperties = [];\n var obj = adapter;\n while (obj) {\n Object.getOwnPropertyNames(obj).forEach(function (p) {\n allProperties.push(p);\n });\n obj = Object.getPrototypeOf(obj);\n }\n return allProperties;\n}\nfunction validateAdapter(adapter) {\n var publicAdapterMethods = ['init', 'destroy', 'play', 'pause', 'isPlaying', 'isSeeking', 'getCurrentTime', 'getDuration', 'seek'];\n var allProperties = getAllPropertiesFrom(adapter);\n publicAdapterMethods.forEach(function (method) {\n if (!allProperties.includes(method)) {\n throw new TypeError('Peaks.init(): Player method ' + method + ' is undefined');\n }\n if (typeof adapter[method] !== 'function') {\n throw new TypeError('Peaks.init(): Player method ' + method + ' is not a function');\n }\n });\n}\n\n/**\n * A wrapper for interfacing with an external player API.\n *\n * @class\n * @alias Player\n *\n * @param {Peaks} peaks The parent {@link Peaks} object.\n * @param {Adapter} adapter The player adapter.\n */\n\nfunction Player(peaks, adapter) {\n this._peaks = peaks;\n this._playingSegment = false;\n this._segment = null;\n this._loop = false;\n this._playSegmentTimerCallback = this._playSegmentTimerCallback.bind(this);\n validateAdapter(adapter);\n this._adapter = adapter;\n}\nPlayer.prototype.init = function () {\n return this._adapter.init(this._peaks);\n};\n\n/**\n * Cleans up the player object.\n */\n\nPlayer.prototype.destroy = function () {\n this._adapter.destroy();\n};\n\n/**\n * Starts playback.\n * @returns {Promise}\n */\n\nPlayer.prototype.play = function () {\n return this._adapter.play();\n};\n\n/**\n * Pauses playback.\n */\n\nPlayer.prototype.pause = function () {\n this._adapter.pause();\n};\n\n/**\n * @returns {Boolean} <code>true</code> if playing, <code>false</code>\n * otherwise.\n */\n\nPlayer.prototype.isPlaying = function () {\n return this._adapter.isPlaying();\n};\n\n/**\n * @returns {boolean} <code>true</code> if seeking\n */\n\nPlayer.prototype.isSeeking = function () {\n return this._adapter.isSeeking();\n};\n\n/**\n * Returns the current playback time position, in seconds.\n *\n * @returns {Number}\n */\n\nPlayer.prototype.getCurrentTime = function () {\n return this._adapter.getCurrentTime();\n};\n\n/**\n * Returns the media duration, in seconds.\n *\n * @returns {Number}\n */\n\nPlayer.prototype.getDuration = function () {\n return this._adapter.getDuration();\n};\n\n/**\n * Seeks to a given time position within the media.\n *\n * @param {Number} time The time position, in seconds.\n */\n\nPlayer.prototype.seek = function (time) {\n if (!isValidTime(time)) {\n this._peaks._logger('peaks.player.seek(): parameter must be a valid time, in seconds');\n return;\n }\n this._adapter.seek(time);\n};\n\n/**\n * Plays the given segment.\n *\n * @param {Segment} segment The segment denoting the time region to play.\n * @param {Boolean} loop If true, playback is looped.\n */\n\nPlayer.prototype.playSegment = function (segment, loop) {\n var self = this;\n if (!segment || !isValidTime(segment.startTime) || !isValidTime(segment.endTime)) {\n return Promise.reject(new Error('peaks.player.playSegment(): parameter must be a segment object'));\n }\n self._segment = segment;\n self._loop = loop;\n\n // Set audio time to segment start time\n self.seek(segment.startTime);\n self._peaks.once('player.playing', function () {\n if (!self._playingSegment) {\n self._playingSegment = true;\n\n // We need to use requestAnimationFrame here as the timeupdate event\n // doesn't fire often enough.\n window.requestAnimationFrame(self._playSegmentTimerCallback);\n }\n });\n\n // Start playing audio\n return self.play();\n};\nPlayer.prototype._playSegmentTimerCallback = function () {\n if (!this.isPlaying()) {\n this._playingSegment = false;\n return;\n } else if (this.getCurrentTime() >= this._segment.endTime) {\n if (this._loop) {\n this.seek(this._segment.startTime);\n } else {\n this.pause();\n this._peaks.emit('player.ended');\n this._playingSegment = false;\n return;\n }\n }\n window.requestAnimationFrame(this._playSegmentTimerCallback);\n};\nPlayer.prototype._setSource = function (options) {\n return this._adapter.setSource(options);\n};\n\n/**\n * @file\n *\n * Defines the {@link DefaultPointMarker} class.\n *\n * @module default-point-marker\n */\n\n\n/**\n * Creates a point marker handle.\n *\n * @class\n * @alias DefaultPointMarker\n *\n * @param {CreatePointMarkerOptions} options\n */\n\nfunction DefaultPointMarker(options) {\n this._options = options;\n this._draggable = options.editable;\n}\nDefaultPointMarker.prototype.init = function (group) {\n var handleWidth = 10;\n var handleHeight = 20;\n var handleX = -(handleWidth / 2) + 0.5; // Place in the middle of the marker\n\n // Label\n\n if (this._options.view === 'zoomview') {\n // Label - create with default y, the real value is set in fitToView().\n this._label = new Text({\n x: 2,\n y: 0,\n text: this._options.point.labelText,\n textAlign: 'left',\n fontFamily: this._options.fontFamily || 'sans-serif',\n fontSize: this._options.fontSize || 10,\n fontStyle: this._options.fontStyle || 'normal',\n fill: '#000'\n });\n }\n\n // Handle - create with default y, the real value is set in fitToView().\n\n this._handle = new Rect({\n x: handleX,\n y: 0,\n width: handleWidth,\n height: handleHeight,\n fill: this._options.color,\n visible: this._draggable\n });\n\n // Line - create with default y and points, the real values\n // are set in fitToView().\n this._line = new Line({\n x: 0,\n y: 0,\n stroke: this._options.color,\n strokeWidth: 1\n });\n\n // Time label - create with default y, the real value is set\n // in fitToView().\n this._time = new Text({\n x: -24,\n y: 0,\n text: this._options.layer.formatTime(this._options.point.time),\n fontFamily: this._options.fontFamily,\n fontSize: this._options.fontSize,\n fontStyle: this._options.fontStyle,\n fill: '#000',\n textAlign: 'center'\n });\n this._time.hide();\n group.add(this._handle);\n group.add(this._line);\n if (this._label) {\n group.add(this._label);\n }\n group.add(this._time);\n this.fitToView();\n this.bindEventHandlers(group);\n};\nDefaultPointMarker.prototype.bindEventHandlers = function (group) {\n var self = this;\n self._handle.on('mouseover touchstart', function () {\n if (self._draggable) {\n // Position text to the left of the marker\n self._time.setX(-24 - self._time.getWidth());\n self._time.show();\n }\n });\n self._handle.on('mouseout touchend', function () {\n if (self._draggable) {\n self._time.hide();\n }\n });\n group.on('dragstart', function () {\n self._time.setX(-24 - self._time.getWidth());\n self._time.show();\n });\n group.on('dragend', function () {\n self._time.hide();\n });\n};\nDefaultPointMarker.prototype.fitToView = function () {\n var height = this._options.layer.getHeight();\n this._line.points([0.5, 0, 0.5, height]);\n if (this._label) {\n this._label.y(12);\n }\n if (this._handle) {\n this._handle.y(height / 2 - 10.5);\n }\n if (this._time) {\n this._time.y(height / 2 - 5);\n }\n};\nDefaultPointMarker.prototype.update = function (options) {\n if (options.time !== undefined) {\n if (this._time) {\n this._time.setText(this._options.layer.formatTime(options.time));\n }\n }\n if (options.labelText !== undefined) {\n if (this._label) {\n this._label.text(options.labelText);\n }\n }\n if (options.color !== undefined) {\n if (this._handle) {\n this._handle.fill(options.color);\n }\n this._line.stroke(options.color);\n }\n if (options.editable !== undefined) {\n this._draggable = options.editable;\n this._handle.visible(this._draggable);\n }\n};\n\n/**\n * @file\n *\n * Defines the {@link DefaultSegmentMarker} class.\n *\n * @module default-segment-marker\n */\n\n\n/**\n * Creates a segment marker handle.\n *\n * @class\n * @alias DefaultSegmentMarker\n *\n * @param {CreateSegmentMarkerOptions} options\n */\n\nfunction DefaultSegmentMarker(options) {\n this._options = options;\n this._editable = options.editable;\n}\nDefaultSegmentMarker.prototype.init = function (group) {\n var handleWidth = 10;\n var handleHeight = 20;\n var handleX = -(handleWidth / 2) + 0.5; // Place in the middle of the marker\n\n var xPosition = this._options.startMarker ? -24 : 24;\n var time = this._options.startMarker ? this._options.segment.startTime : this._options.segment.endTime;\n\n // Label - create with default y, the real value is set in fitToView().\n this._label = new Text({\n x: xPosition,\n y: 0,\n text: this._options.layer.formatTime(time),\n fontFamily: this._options.fontFamily,\n fontSize: this._options.fontSize,\n fontStyle: this._options.fontStyle,\n fill: '#000',\n textAlign: 'center',\n visible: this._editable\n });\n this._label.hide();\n\n // Handle - create with default y, the real value is set in fitToView().\n this._handle = new Rect({\n x: handleX,\n y: 0,\n width: handleWidth,\n height: handleHeight,\n fill: this._options.color,\n stroke: this._options.color,\n strokeWidth: 1,\n visible: this._editable\n });\n\n // Vertical Line - create with default y and points, the real values\n // are set in fitToView().\n this._line = new Line({\n x: 0,\n y: 0,\n stroke: this._options.color,\n strokeWidth: 1,\n visible: this._editable\n });\n group.add(this._label);\n group.add(this._line);\n group.add(this._handle);\n this.fitToView();\n this.bindEventHandlers(group);\n};\nDefaultSegmentMarker.prototype.bindEventHandlers = function (group) {\n var self = this;\n var xPosition = self._options.startMarker ? -24 : 24;\n group.on('dragstart', function () {\n if (self._options.startMarker) {\n self._label.setX(xPosition - self._label.getWidth());\n }\n self._label.show();\n });\n group.on('dragend', function () {\n self._label.hide();\n });\n self._handle.on('mouseover touchstart', function () {\n if (self._options.startMarker) {\n self._label.setX(xPosition - self._label.getWidth());\n }\n self._label.show();\n });\n self._handle.on('mouseout touchend', function () {\n self._label.hide();\n });\n};\nDefaultSegmentMarker.prototype.fitToView = function () {\n var height = this._options.layer.getHeight();\n this._label.y(height / 2 - 5);\n this._handle.y(height / 2 - 10.5);\n this._line.points([0.5, 0, 0.5, height]);\n};\nDefaultSegmentMarker.prototype.update = function (options) {\n if (options.startTime !== undefined && this._options.startMarker) {\n this._label.text(this._options.layer.formatTime(options.startTime));\n }\n if (options.endTime !== undefined && !this._options.startMarker) {\n this._label.text(this._options.layer.formatTime(options.endTime));\n }\n if (options.editable !== undefined) {\n this._editable = options.editable;\n this._label.visible(this._editable);\n this._handle.visible(this._editable);\n this._line.visible(this._editable);\n }\n};\n\n/**\n * @file\n *\n * Factory functions for creating point and segment marker handles.\n *\n * @module marker-factories\n */\n\n\n/**\n * Parameters for the {@link createSegmentMarker} function.\n *\n * @typedef {Object} CreateSegmentMarkerOptions\n * @global\n * @property {Segment} segment\n * @property {Boolean} draggable If true, marker is draggable.\n * @property {Boolean} startMarker\n * @property {String} color\n * @property {String} fontFamily\n * @property {Number} fontSize\n * @property {String} fontStyle\n * @property {Layer} layer\n * @property {String} view\n * @property {SegmentDisplayOptions} segmentOptions\n */\n\n/**\n * Creates a left or right side segment marker handle.\n *\n * @param {CreateSegmentMarkerOptions} options\n * @returns {Marker}\n */\n\nfunction createSegmentMarker(options) {\n if (options.view === 'zoomview') {\n return new DefaultSegmentMarker(options);\n }\n return null;\n}\n\n/**\n * Parameters for the {@link createSegmentLabel} function.\n *\n * @typedef {Object} SegmentLabelOptions\n * @global\n * @property {Segment} segment The {@link Segment} object associated with this\n * label.\n * @property {String} view The name of the view that the label is being\n * created in, either <code>zoomview</code> or <code>overview</code>.\n * @property {SegmentsLayer} layer\n * @property {String} fontFamily\n * @property {Number} fontSize\n * @property {String} fontStyle\n */\n\n/**\n * Creates a Konva object that renders information about a segment, such as\n * its label text.\n *\n * @param {SegmentLabelOptions} options\n * @returns {Konva.Text}\n */\n\nfunction createSegmentLabel(options) {\n return new Text({\n x: 12,\n y: 12,\n text: options.segment.labelText,\n textAlign: 'center',\n fontFamily: options.fontFamily || 'sans-serif',\n fontSize: options.fontSize || 12,\n fontStyle: options.fontStyle || 'normal',\n fill: '#000'\n });\n}\n\n/**\n * Parameters for the {@link createPointMarker} function.\n *\n * @typedef {Object} CreatePointMarkerOptions\n * @global\n * @property {Point} point\n * @property {Boolean} editable If true, marker is draggable.\n * @property {String} color\n * @property {Layer} layer\n * @property {String} view\n * @property {String} fontFamily\n * @property {Number} fontSize\n * @property {String} fontStyle\n */\n\n/**\n * Creates a point marker handle.\n *\n * @param {CreatePointMarkerOptions} options\n * @returns {Marker}\n */\n\nfunction createPointMarker(options) {\n return new DefaultPointMarker(options);\n}\n\n/**\n * @file\n *\n * Defines the {@link HighlightLayer} class.\n *\n * @module highlight-layer\n */\n\n\n/**\n * Highlight layer options\n *\n * @typedef {Object} HighlightLayerOptions\n * @global\n * @property {Number} highlightOffset\n * @property {String} highlightColor\n * @property {String} highlightStrokeColor\n * @property {Number} highlightOpacity\n * @property {Number} highlightCornerRadius\n */\n\n/**\n * Creates the highlight region that shows the position of the zoomable\n * waveform view in the overview waveform.\n *\n * @class\n * @alias HighlightLayer\n *\n * @param {WaveformOverview} view\n * @param {HighlightLayerOptions} options\n */\n\nfunction HighlightLayer(view, options) {\n this._view = view;\n this._offset = options.highlightOffset;\n this._color = options.highlightColor;\n this._layer = new Konva.Layer({\n listening: false\n });\n this._highlightRect = null;\n this._startTime = null;\n this._endTime = null;\n this._strokeColor = options.highlightStrokeColor;\n this._opacity = options.highlightOpacity;\n this._cornerRadius = options.highlightCornerRadius;\n}\nHighlightLayer.prototype.addToStage = function (stage) {\n stage.add(this._layer);\n};\nHighlightLayer.prototype.showHighlight = function (startTime, endTime) {\n if (!this._highlightRect) {\n this._createHighlightRect(startTime, endTime);\n }\n this._update(startTime, endTime);\n};\n\n/**\n * Updates the position of the highlight region.\n *\n * @param {Number} startTime The start of the highlight region, in seconds.\n * @param {Number} endTime The end of the highlight region, in seconds.\n */\n\nHighlightLayer.prototype._update = function (startTime, endTime) {\n this._startTime = startTime;\n this._endTime = endTime;\n var startOffset = this._view.timeToPixels(startTime);\n var endOffset = this._view.timeToPixels(endTime);\n this._highlightRect.setAttrs({\n x: startOffset,\n width: endOffset - startOffset\n });\n};\nHighlightLayer.prototype._createHighlightRect = function (startTime, endTime) {\n this._startTime = startTime;\n this._endTime = endTime;\n var startOffset = this._view.timeToPixels(startTime);\n var endOffset = this._view.timeToPixels(endTime);\n\n // Create with default y and height, the real values are set in fitToView().\n this._highlightRect = new Rect({\n x: startOffset,\n y: 0,\n width: endOffset - startOffset,\n height: 0,\n stroke: this._strokeColor,\n strokeWidth: 1,\n fill: this._color,\n opacity: this._opacity,\n cornerRadius: this._cornerRadius\n });\n this.fitToView();\n this._layer.add(this._highlightRect);\n};\nHighlightLayer.prototype.removeHighlight = function () {\n if (this._highlightRect) {\n this._highlightRect.destroy();\n this._highlightRect = null;\n }\n};\nHighlightLayer.prototype.updateHighlight = function () {\n if (this._highlightRect) {\n this._update(this._startTime, this._endTime);\n }\n};\nHighlightLayer.prototype.fitToView = function () {\n if (this._highlightRect) {\n var height = this._view.getHeight();\n var offset = clamp(this._offset, 0, Math.floor(height / 2));\n this._highlightRect.setAttrs({\n y: offset,\n height: height - offset * 2\n });\n }\n};\n\n/**\n * @file\n *\n * Defines the {@link PointMarker} class.\n *\n * @module point-marker\n */\n\n\n/**\n * Parameters for the {@link PointMarker} constructor.\n *\n * @typedef {Object} PointMarkerOptions\n * @global\n * @property {Point} point Point object with timestamp.\n * @property {Boolean} editable If true, marker is draggable.\n * @property {Marker} marker\n * @property {Function} onclick\n * @property {Function} onDblClick\n * @property {Function} onDragStart\n * @property {Function} onDragMove Callback during mouse drag operations.\n * @property {Function} onDragEnd\n * @property {Function} dragBoundFunc\n * @property {Function} onMouseEnter\n * @property {Function} onMouseLeave\n * @property {Function} onContextMenu\n */\n\n/**\n * Creates a point marker handle.\n *\n * @class\n * @alias PointMarker\n *\n * @param {PointMarkerOptions} options\n */\n\nfunction PointMarker(options) {\n this._point = options.point;\n this._marker = options.marker;\n this._draggable = options.draggable;\n this._onDragStart = options.onDragStart;\n this._onDragMove = options.onDragMove;\n this._onDragEnd = options.onDragEnd;\n this._dragBoundFunc = options.dragBoundFunc;\n this._onMouseEnter = options.onMouseEnter;\n this._onMouseLeave = options.onMouseLeave;\n this._group = new Konva.Group({\n name: 'point-marker',\n point: this._point,\n draggable: this._draggable,\n dragBoundFunc: options.dragBoundFunc\n });\n this._bindDefaultEventHandlers();\n this._marker.init(this._group);\n}\nPointMarker.prototype._bindDefaultEventHandlers = function () {\n var self = this;\n self._group.on('dragstart', function (event) {\n self._onDragStart(event, self._point);\n });\n self._group.on('dragmove', function (event) {\n self._onDragMove(event, self._point);\n });\n self._group.on('dragend', function (event) {\n self._onDragEnd(event, self._point);\n });\n self._group.on('mouseenter', function (event) {\n self._onMouseEnter(event, self._point);\n });\n self._group.on('mouseleave', function (event) {\n self._onMouseLeave(event, self._point);\n });\n};\n\n/**\n * @param {Konva.Layer} layer\n */\n\nPointMarker.prototype.addToLayer = function (layer) {\n layer.add(this._group);\n};\nPointMarker.prototype.fitToView = function () {\n this._marker.fitToView();\n};\nPointMarker.prototype.getPoint = function () {\n return this._point;\n};\nPointMarker.prototype.getX = function () {\n return this._group.getX();\n};\nPointMarker.prototype.setX = function (x) {\n this._group.setX(x);\n};\nPointMarker.prototype.getWidth = function () {\n return this._group.getWidth();\n};\nPointMarker.prototype.getAbsolutePosition = function () {\n return this._group.getAbsolutePosition();\n};\nPointMarker.prototype.update = function (options) {\n if (options.editable !== undefined) {\n this._group.draggable(options.editable);\n }\n if (this._marker.update) {\n this._marker.update(options);\n }\n};\nPointMarker.prototype.destroy = function () {\n if (this._marker.destroy) {\n this._marker.destroy();\n }\n this._group.destroyChildren();\n this._group.destroy();\n};\n\n/**\n * @file\n *\n * Defines the {@link PointsLayer} class.\n *\n * @module points-layer\n */\n\nvar defaultFontFamily$1 = 'sans-serif';\nvar defaultFontSize$1 = 10;\nvar defaultFontShape$1 = 'normal';\n\n/**\n * Creates a Konva.Layer that displays point markers against the audio\n * waveform.\n *\n * @class\n * @alias PointsLayer\n *\n * @param {Peaks} peaks\n * @param {WaveformOverview|WaveformZoomView} view\n * @param {Boolean} allowEditing\n */\n\nfunction PointsLayer(peaks, view, allowEditing) {\n this._peaks = peaks;\n this._view = view;\n this._allowEditing = allowEditing;\n this._pointMarkers = {};\n this._layer = new Konva.Layer();\n this._onPointsDrag = this._onPointsDrag.bind(this);\n this._onPointMarkerDragStart = this._onPointMarkerDragStart.bind(this);\n this._onPointMarkerDragMove = this._onPointMarkerDragMove.bind(this);\n this._onPointMarkerDragEnd = this._onPointMarkerDragEnd.bind(this);\n this._pointMarkerDragBoundFunc = this._pointMarkerDragBoundFunc.bind(this);\n this._onPointMarkerMouseEnter = this._onPointMarkerMouseEnter.bind(this);\n this._onPointMarkerMouseLeave = this._onPointMarkerMouseLeave.bind(this);\n this._onPointsUpdate = this._onPointsUpdate.bind(this);\n this._onPointsAdd = this._onPointsAdd.bind(this);\n this._onPointsRemove = this._onPointsRemove.bind(this);\n this._onPointsRemoveAll = this._onPointsRemoveAll.bind(this);\n this._peaks.on('points.update', this._onPointsUpdate);\n this._peaks.on('points.add', this._onPointsAdd);\n this._peaks.on('points.remove', this._onPointsRemove);\n this._peaks.on('points.remove_all', this._onPointsRemoveAll);\n this._peaks.on('points.dragstart', this._onPointsDrag);\n this._peaks.on('points.dragmove', this._onPointsDrag);\n this._peaks.on('points.dragend', this._onPointsDrag);\n}\n\n/**\n * Adds the layer to the given {Konva.Stage}.\n *\n * @param {Konva.Stage} stage\n */\n\nPointsLayer.prototype.addToStage = function (stage) {\n stage.add(this._layer);\n};\nPointsLayer.prototype.enableEditing = function (enable) {\n this._allowEditing = enable;\n};\nPointsLayer.prototype.getPointMarker = function (point) {\n return this._pointMarkers[point.pid];\n};\nPointsLayer.prototype.formatTime = function (time) {\n return this._view.formatTime(time);\n};\nPointsLayer.prototype._onPointsUpdate = function (point, options) {\n var frameStartTime = this._view.getStartTime();\n var frameEndTime = this._view.getEndTime();\n var pointMarker = this.getPointMarker(point);\n var isVisible = point.isVisible(frameStartTime, frameEndTime);\n if (pointMarker && !isVisible) {\n // Remove point marker that is no longer visible.\n this._removePoint(point);\n } else if (!pointMarker && isVisible) {\n // Add point marker for visible point.\n this._updatePoint(point);\n } else if (pointMarker && isVisible) {\n // Update the point marker with the changed attributes.\n if (objectHasProperty(options, 'time')) {\n var pointMarkerOffset = this._view.timeToPixels(point.time);\n var pointMarkerX = pointMarkerOffset - this._view.getFrameOffset();\n pointMarker.setX(pointMarkerX);\n }\n pointMarker.update(options);\n }\n};\nPointsLayer.prototype._onPointsAdd = function (event) {\n var self = this;\n var frameStartTime = self._view.getStartTime();\n var frameEndTime = self._view.getEndTime();\n event.points.forEach(function (point) {\n if (point.isVisible(frameStartTime, frameEndTime)) {\n self._updatePoint(point);\n }\n });\n};\nPointsLayer.prototype._onPointsRemove = function (event) {\n var self = this;\n event.points.forEach(function (point) {\n self._removePoint(point);\n });\n};\nPointsLayer.prototype._onPointsRemoveAll = function () {\n this._layer.removeChildren();\n this._pointMarkers = {};\n};\n\n/**\n * Creates the Konva UI objects for a given point.\n *\n * @private\n * @param {Point} point\n * @returns {PointMarker}\n */\n\nPointsLayer.prototype._createPointMarker = function (point) {\n var editable = this._allowEditing && point.editable;\n var marker = this._peaks.options.createPointMarker({\n point: point,\n editable: editable,\n color: point.color,\n fontFamily: this._peaks.options.fontFamily || defaultFontFamily$1,\n fontSize: this._peaks.options.fontSize || defaultFontSize$1,\n fontStyle: this._peaks.options.fontStyle || defaultFontShape$1,\n layer: this,\n view: this._view.getName()\n });\n return new PointMarker({\n point: point,\n draggable: editable,\n marker: marker,\n onDragStart: this._onPointMarkerDragStart,\n onDragMove: this._onPointMarkerDragMove,\n onDragEnd: this._onPointMarkerDragEnd,\n dragBoundFunc: this._pointMarkerDragBoundFunc,\n onMouseEnter: this._onPointMarkerMouseEnter,\n onMouseLeave: this._onPointMarkerMouseLeave\n });\n};\nPointsLayer.prototype.getHeight = function () {\n return this._view.getHeight();\n};\n\n/**\n * Adds a Konva UI object to the layer for a given point.\n *\n * @private\n * @param {Point} point\n * @returns {PointMarker}\n */\n\nPointsLayer.prototype._addPointMarker = function (point) {\n var pointMarker = this._createPointMarker(point);\n this._pointMarkers[point.pid] = pointMarker;\n pointMarker.addToLayer(this._layer);\n return pointMarker;\n};\nPointsLayer.prototype._onPointsDrag = function (event) {\n var pointMarker = this._updatePoint(event.point);\n pointMarker.update({\n time: event.point.time\n });\n};\n\n/**\n * @param {KonvaEventObject} event\n * @param {Point} point\n */\n\nPointsLayer.prototype._onPointMarkerMouseEnter = function (event, point) {\n this._peaks.emit('points.mouseenter', {\n point: point,\n evt: event.evt\n });\n};\n\n/**\n * @param {KonvaEventObject} event\n * @param {Point} point\n */\n\nPointsLayer.prototype._onPointMarkerMouseLeave = function (event, point) {\n this._peaks.emit('points.mouseleave', {\n point: point,\n evt: event.evt\n });\n};\n\n/**\n * @param {KonvaEventObject} event\n * @param {Point} point\n */\n\nPointsLayer.prototype._onPointMarkerDragStart = function (event, point) {\n this._dragPointMarker = this.getPointMarker(point);\n this._peaks.emit('points.dragstart', {\n point: point,\n evt: event.evt\n });\n};\n\n/**\n * @param {KonvaEventObject} event\n * @param {Point} point\n */\n\nPointsLayer.prototype._onPointMarkerDragMove = function (event, point) {\n var pointMarker = this._pointMarkers[point.pid];\n var markerX = pointMarker.getX();\n var offset = markerX + pointMarker.getWidth();\n point._setTime(this._view.pixelOffsetToTime(offset));\n this._peaks.emit('points.dragmove', {\n point: point,\n evt: event.evt\n });\n};\n\n/**\n * @param {KonvaEventObject} event\n * @param {Point} point\n */\n\nPointsLayer.prototype._onPointMarkerDragEnd = function (event, point) {\n this._dragPointMarker = null;\n this._peaks.emit('points.dragend', {\n point: point,\n evt: event.evt\n });\n};\nPointsLayer.prototype._pointMarkerDragBoundFunc = function (pos) {\n // Allow the marker to be moved horizontally but not vertically.\n return {\n x: clamp(pos.x, 0, this._view.getWidth()),\n y: this._dragPointMarker.getAbsolutePosition().y\n };\n};\n\n/**\n * Updates the positions of all displayed points in the view.\n *\n * @param {Number} startTime The start of the visible range in the view,\n * in seconds.\n * @param {Number} endTime The end of the visible range in the view,\n * in seconds.\n */\n\nPointsLayer.prototype.updatePoints = function (startTime, endTime) {\n // Update all points in the visible time range.\n var points = this._peaks.points.find(startTime, endTime);\n points.forEach(this._updatePoint.bind(this));\n\n // TODO: In the overview all points are visible, so no need to do this.\n this._removeInvisiblePoints(startTime, endTime);\n};\n\n/**\n * @private\n * @param {Point} point\n */\n\nPointsLayer.prototype._updatePoint = function (point) {\n var pointMarker = this.getPointMarker(point);\n if (!pointMarker) {\n pointMarker = this._addPointMarker(point);\n }\n var pointMarkerOffset = this._view.timeToPixels(point.time);\n var pointMarkerX = pointMarkerOffset - this._view.getFrameOffset();\n pointMarker.setX(pointMarkerX);\n return pointMarker;\n};\n\n/**\n * Remove any points that are not visible, i.e., are outside the given time\n * range.\n *\n * @private\n * @param {Number} startTime The start of the visible time range, in seconds.\n * @param {Number} endTime The end of the visible time range, in seconds.\n */\n\nPointsLayer.prototype._removeInvisiblePoints = function (startTime, endTime) {\n for (var pointPid in this._pointMarkers) {\n if (objectHasProperty(this._pointMarkers, pointPid)) {\n var point = this._pointMarkers[pointPid].getPoint();\n if (!point.isVisible(startTime, endTime)) {\n this._removePoint(point);\n }\n }\n }\n};\n\n/**\n * Removes the UI object for a given point.\n *\n * @private\n * @param {Point} point\n */\n\nPointsLayer.prototype._removePoint = function (point) {\n var pointMarker = this.getPointMarker(point);\n if (pointMarker) {\n pointMarker.destroy();\n delete this._pointMarkers[point.pid];\n }\n};\n\n/**\n * Toggles visibility of the points layer.\n *\n * @param {Boolean} visible\n */\n\nPointsLayer.prototype.setVisible = function (visible) {\n this._layer.setVisible(visible);\n};\nPointsLayer.prototype.destroy = function () {\n this._peaks.off('points.update', this._onPointsUpdate);\n this._peaks.off('points.add', this._onPointsAdd);\n this._peaks.off('points.remove', this._onPointsRemove);\n this._peaks.off('points.remove_all', this._onPointsRemoveAll);\n this._peaks.off('points.dragstart', this._onPointsDrag);\n this._peaks.off('points.dragmove', this._onPointsDrag);\n this._peaks.off('points.dragend', this._onPointsDrag);\n};\nPointsLayer.prototype.fitToView = function () {\n for (var pointPid in this._pointMarkers) {\n if (objectHasProperty(this._pointMarkers, pointPid)) {\n var pointMarker = this._pointMarkers[pointPid];\n pointMarker.fitToView();\n }\n }\n};\nPointsLayer.prototype.draw = function () {\n this._layer.draw();\n};\n\n/**\n * @file\n *\n * Defines the {@link PlayheadLayer} class.\n *\n * @module playhead-layer\n */\n\n\n/**\n * Creates a Konva.Layer that displays a playhead marker.\n *\n * @class\n * @alias PlayheadLayer\n *\n * @param {Player} player\n * @param {WaveformOverview|WaveformZoomView} view\n * @param {Object} options\n * @param {Boolean} options.showPlayheadTime If <code>true</code> The playback time position\n * is shown next to the playhead.\n * @param {String} options.playheadColor\n * @param {String} options.playheadTextColor\n * @param {String} options.playheadBackgroundColor\n * @param {Number} options.playheadPadding\n * @param {Number} options.playheadWidth\n * @param {String} options.playheadFontFamily\n * @param {Number} options.playheadFontSize\n * @param {String} options.playheadFontStyle\n */\n\nfunction PlayheadLayer(player, view, options) {\n this._player = player;\n this._view = view;\n this._playheadPixel = 0;\n this._playheadLineAnimation = null;\n this._playheadVisible = false;\n this._playheadColor = options.playheadColor;\n this._playheadTextColor = options.playheadTextColor;\n this._playheadBackgroundColor = options.playheadBackgroundColor;\n this._playheadPadding = options.playheadPadding;\n this._playheadWidth = options.playheadWidth;\n this._playheadFontFamily = options.playheadFontFamily;\n this._playheadFontSize = options.playheadFontSize;\n this._playheadFontStyle = options.playheadFontStyle;\n this._playheadLayer = new Konva.Layer();\n this._createPlayhead();\n if (options.showPlayheadTime) {\n this._createPlayheadText();\n }\n this.fitToView();\n this.zoomLevelChanged();\n}\n\n/**\n * Adds the layer to the given {Konva.Stage}.\n *\n * @param {Konva.Stage} stage\n */\n\nPlayheadLayer.prototype.addToStage = function (stage) {\n stage.add(this._playheadLayer);\n};\n\n/**\n * Decides whether to use an animation to update the playhead position.\n *\n * If the zoom level is such that the number of pixels per second of audio is\n * low, we can use timeupdate events from the HTMLMediaElement to\n * set the playhead position. Otherwise, we use an animation to update the\n * playhead position more smoothly. The animation is CPU intensive, so we\n * avoid using it where possible.\n */\n\nPlayheadLayer.prototype.zoomLevelChanged = function () {\n var pixelsPerSecond = this._view.timeToPixels(1.0);\n this._useAnimation = pixelsPerSecond >= 5;\n if (this._useAnimation) {\n if (this._player.isPlaying() && !this._playheadLineAnimation) {\n // Start the animation\n this._start();\n }\n } else {\n if (this._playheadLineAnimation) {\n // Stop the animation\n var time = this._player.getCurrentTime();\n this.stop(time);\n }\n }\n};\n\n/**\n * Resizes the playhead UI objects to fit the available space in the\n * view.\n */\n\nPlayheadLayer.prototype.fitToView = function () {\n var height = this._view.getHeight();\n this._playheadLine.points([0.5, 0, 0.5, height]);\n if (this._playheadText) {\n this._playheadText.y(12);\n }\n};\n\n/**\n * Creates the playhead UI objects.\n *\n * @private\n * @param {String} color\n */\n\nPlayheadLayer.prototype._createPlayhead = function () {\n // Create with default points, the real values are set in fitToView().\n this._playheadLine = new Line({\n stroke: this._playheadColor,\n strokeWidth: this._playheadWidth\n });\n this._playheadGroup = new Konva.Group({\n x: 0,\n y: 0\n });\n this._playheadGroup.add(this._playheadLine);\n this._playheadLayer.add(this._playheadGroup);\n};\nPlayheadLayer.prototype._createPlayheadText = function () {\n var self = this;\n var time = self._player.getCurrentTime();\n var text = self._view.formatTime(time);\n\n // Create with default y, the real value is set in fitToView().\n self._playheadText = new Text({\n x: 0,\n y: 0,\n padding: self._playheadPadding,\n text: text,\n fontSize: self._playheadFontSize,\n fontFamily: self._playheadFontFamily,\n fontStyle: self._playheadFontStyle,\n fill: self._playheadTextColor,\n align: 'right',\n sceneFunc: function sceneFunc(context, shape) {\n var width = shape.width();\n var height = shape.height() + 2 * self._playheadPadding;\n context.fillStyle = self._playheadBackgroundColor;\n context.fillRect(0, -self._playheadPadding, width, height);\n shape._sceneFunc(context);\n }\n });\n self._playheadGroup.add(self._playheadText);\n};\n\n/**\n * Updates the playhead position.\n *\n * @param {Number} time Current playhead position, in seconds.\n */\n\nPlayheadLayer.prototype.updatePlayheadTime = function (time) {\n this._syncPlayhead(time);\n if (this._player.isPlaying()) {\n this._start();\n }\n};\n\n/**\n * Updates the playhead position.\n *\n * @private\n * @param {Number} time Current playhead position, in seconds.\n */\n\nPlayheadLayer.prototype._syncPlayhead = function (time) {\n var pixelIndex = this._view.timeToPixels(time);\n var frameOffset = this._view.getFrameOffset();\n var width = this._view.getWidth();\n var isVisible = pixelIndex >= frameOffset && pixelIndex <= frameOffset + width;\n this._playheadPixel = pixelIndex;\n if (isVisible) {\n var playheadX = this._playheadPixel - frameOffset;\n if (!this._playheadVisible) {\n this._playheadVisible = true;\n this._playheadGroup.show();\n }\n this._playheadGroup.setX(playheadX);\n if (this._playheadText) {\n var text = this._view.formatTime(time);\n var playheadTextWidth = this._playheadText.width();\n this._playheadText.setText(text);\n if (playheadTextWidth + playheadX > width - 2) {\n this._playheadText.setX(-playheadTextWidth);\n } else if (playheadTextWidth + playheadX < width) {\n this._playheadText.setX(0);\n }\n }\n } else {\n if (this._playheadVisible) {\n this._playheadVisible = false;\n this._playheadGroup.hide();\n }\n }\n if (this._view.playheadPosChanged) {\n this._view.playheadPosChanged(time);\n }\n};\n\n/**\n * Starts a playhead animation in sync with the media playback.\n *\n * @private\n */\n\nPlayheadLayer.prototype._start = function () {\n var self = this;\n if (self._playheadLineAnimation) {\n self._playheadLineAnimation.stop();\n self._playheadLineAnimation = null;\n }\n if (!self._useAnimation) {\n return;\n }\n var lastPlayheadPosition = null;\n self._playheadLineAnimation = new Animation(function () {\n var time = self._player.getCurrentTime();\n var playheadPosition = self._view.timeToPixels(time);\n if (playheadPosition !== lastPlayheadPosition) {\n self._syncPlayhead(time);\n lastPlayheadPosition = playheadPosition;\n }\n }, self._playheadLayer);\n self._playheadLineAnimation.start();\n};\nPlayheadLayer.prototype.stop = function (time) {\n if (this._playheadLineAnimation) {\n this._playheadLineAnimation.stop();\n this._playheadLineAnimation = null;\n }\n this._syncPlayhead(time);\n};\nPlayheadLayer.prototype.getPlayheadPixel = function () {\n return this._playheadPixel;\n};\nPlayheadLayer.prototype.showPlayheadTime = function (show) {\n if (show) {\n if (!this._playheadText) {\n // Create it\n this._createPlayheadText(this._playheadTextColor, this._playheadBackgroundColor, this._playheadPadding);\n this.fitToView();\n }\n } else {\n if (this._playheadText) {\n this._playheadText.remove();\n this._playheadText.destroy();\n this._playheadText = null;\n }\n }\n};\nPlayheadLayer.prototype.updatePlayheadText = function () {\n if (this._playheadText) {\n var time = this._player.getCurrentTime();\n var text = this._view.formatTime(time);\n this._playheadText.setText(text);\n }\n};\nPlayheadLayer.prototype.destroy = function () {\n if (this._playheadLineAnimation) {\n this._playheadLineAnimation.stop();\n this._playheadLineAnimation = null;\n }\n};\n\n/**\n * @file\n *\n * Defines the {@link OverlaySegmentMarker} class.\n *\n * @module overlay-segment-marker\n */\n\n\n/**\n * Creates a segment marker handle.\n *\n * @class\n * @alias OverlaySegmentMarker\n *\n * @param {CreateSegmentMarkerOptions} options\n */\n\nfunction OverlaySegmentMarker(options) {\n this._options = options;\n}\nOverlaySegmentMarker.prototype.init = function (group) {\n var handleWidth = 10;\n var handleHeight = 20;\n var handleX = -(handleWidth / 2) + 0.5; // Place in the middle of the marker\n\n var xPosition = this._options.startMarker ? -24 : 24;\n var time = this._options.startMarker ? this._options.segment.startTime : this._options.segment.endTime;\n\n // Label - create with default y, the real value is set in fitToView().\n this._label = new Text({\n x: xPosition,\n y: 0,\n text: this._options.layer.formatTime(time),\n fontFamily: this._options.fontFamily,\n fontSize: this._options.fontSize,\n fontStyle: this._options.fontStyle,\n fill: '#000',\n textAlign: 'center',\n visible: false\n });\n\n // Handle - create with default y, the real value is set in fitToView().\n this._handle = new Rect({\n x: handleX,\n y: 0,\n width: handleWidth,\n height: handleHeight\n });\n group.add(this._label);\n group.add(this._handle);\n this.fitToView();\n this.bindEventHandlers(group);\n};\nOverlaySegmentMarker.prototype.bindEventHandlers = function (group) {\n var self = this;\n var xPosition = self._options.startMarker ? -24 : 24;\n group.on('dragstart', function () {\n if (self._options.startMarker) {\n self._label.setX(xPosition - self._label.getWidth());\n }\n self._label.show();\n });\n group.on('dragend', function () {\n self._label.hide();\n });\n self._handle.on('mouseover touchstart', function () {\n if (self._options.startMarker) {\n self._label.setX(xPosition - self._label.getWidth());\n }\n self._label.show();\n document.body.style.cursor = 'ew-resize';\n });\n self._handle.on('mouseout touchend', function () {\n self._label.hide();\n document.body.style.cursor = 'default';\n });\n};\nOverlaySegmentMarker.prototype.fitToView = function () {\n var viewHeight = this._options.layer.getHeight();\n var overlayOffset = this._options.segmentOptions.overlayOffset;\n var overlayRectHeight = clamp(0, viewHeight - 2 * overlayOffset);\n this._label.y(viewHeight / 2 - 5);\n this._handle.y(overlayOffset);\n this._handle.height(overlayRectHeight);\n};\nOverlaySegmentMarker.prototype.update = function (options) {\n if (options.startTime !== undefined && this._options.startMarker) {\n this._label.text(this._options.layer.formatTime(options.startTime));\n }\n if (options.endTime !== undefined && !this._options.startMarker) {\n this._label.text(this._options.layer.formatTime(options.endTime));\n }\n};\n\n/**\n * @file\n *\n * Defines the {@link SegmentMarker} class.\n *\n * @module segment-marker\n */\n\n\n/**\n * Parameters for the {@link SegmentMarker} constructor.\n *\n * @typedef {Object} SegmentMarkerOptions\n * @global\n * @property {Segment} segment\n * @property {SegmentShape} segmentShape\n * @property {Boolean} editable If true, marker is draggable.\n * @property {Boolean} startMarker If <code>true</code>, the marker indicates\n * the start time of the segment. If <code>false</code>, the marker\n * indicates the end time of the segment.\n * @property {Function} onDragStart\n * @property {Function} onDragMove\n * @property {Function} onDragEnd\n * @property {Function} dragBoundFunc\n */\n\n/**\n * Creates a segment handle marker for the start or end of a segment.\n *\n * @class\n * @alias SegmentMarker\n *\n * @param {SegmentMarkerOptions} options\n */\n\nfunction SegmentMarker(options) {\n var self = this;\n self._segment = options.segment;\n self._marker = options.marker;\n self._segmentShape = options.segmentShape;\n self._editable = options.editable;\n self._startMarker = options.startMarker;\n self._onDragStart = options.onDragStart;\n self._onDragMove = options.onDragMove;\n self._onDragEnd = options.onDragEnd;\n self._group = new Konva.Group({\n name: 'segment-marker',\n segment: self._segment,\n draggable: self._editable,\n visible: self._editable,\n dragBoundFunc: function dragBoundFunc(pos) {\n return options.dragBoundFunc(self, pos);\n }\n });\n self._bindDefaultEventHandlers();\n self._marker.init(self._group);\n}\nSegmentMarker.prototype._bindDefaultEventHandlers = function () {\n var self = this;\n self._group.on('dragstart', function (event) {\n self._onDragStart(self, event);\n });\n self._group.on('dragmove', function (event) {\n self._onDragMove(self, event);\n });\n self._group.on('dragend', function (event) {\n self._onDragEnd(self, event);\n });\n};\nSegmentMarker.prototype.addToLayer = function (layer) {\n layer.add(this._group);\n};\nSegmentMarker.prototype.moveToTop = function () {\n this._group.moveToTop();\n};\nSegmentMarker.prototype.fitToView = function () {\n this._marker.fitToView();\n};\nSegmentMarker.prototype.getSegment = function () {\n return this._segment;\n};\nSegmentMarker.prototype.getX = function () {\n return this._group.getX();\n};\nSegmentMarker.prototype.setX = function (x) {\n this._group.setX(x);\n};\nSegmentMarker.prototype.getWidth = function () {\n return this._group.getWidth();\n};\nSegmentMarker.prototype.getAbsolutePosition = function () {\n return this._group.getAbsolutePosition();\n};\nSegmentMarker.prototype.isStartMarker = function () {\n return this._startMarker;\n};\nSegmentMarker.prototype.update = function (options) {\n if (options.editable !== undefined) {\n this._group.visible(options.editable);\n this._group.draggable(options.editable);\n }\n if (this._marker.update) {\n this._marker.update(options);\n }\n};\nSegmentMarker.prototype.destroy = function () {\n if (this._marker.destroy) {\n this._marker.destroy();\n }\n this._group.destroyChildren();\n this._group.destroy();\n};\nSegmentMarker.prototype.startDrag = function () {\n this._group.startDrag();\n};\nSegmentMarker.prototype.stopDrag = function () {\n this._group.stopDrag();\n};\n\n/**\n * @file\n *\n * Defines the {@link WaveformShape} class.\n *\n * @module waveform-shape\n */\n\n\n/**\n * Waveform shape options.\n *\n * @typedef {Object} WaveformShapeOptions\n * @global\n * @property {String | LinearGradientColor} color Waveform color.\n * @property {WaveformOverview|WaveformZoomView} view The view object\n * that contains the waveform shape.\n * @property {Segment?} segment If given, render a waveform image\n * covering the segment's time range. Otherwise, render the entire\n * waveform duration.\n */\n\n/**\n * Creates a Konva.Shape object that renders a waveform image.\n *\n * @class\n * @alias WaveformShape\n *\n * @param {WaveformShapeOptions} options\n */\n\nfunction WaveformShape(options) {\n this._color = options.color;\n var shapeOptions = {};\n if (isString(options.color)) {\n shapeOptions.fill = options.color;\n } else if (isLinearGradientColor(options.color)) {\n var startY = options.view._height * (options.color.linearGradientStart / 100);\n var endY = options.view._height * (options.color.linearGradientEnd / 100);\n shapeOptions.fillLinearGradientStartPointY = startY;\n shapeOptions.fillLinearGradientEndPointY = endY;\n shapeOptions.fillLinearGradientColorStops = [0, options.color.linearGradientColorStops[0], 1, options.color.linearGradientColorStops[1]];\n } else {\n throw new TypeError('Unknown type for color property');\n }\n this._shape = new Konva.Shape(shapeOptions);\n this._view = options.view;\n this._segment = options.segment;\n this._shape.sceneFunc(this._sceneFunc.bind(this));\n}\nWaveformShape.prototype.getX = function () {\n return this._shape.getX();\n};\nWaveformShape.prototype.setX = function (x) {\n return this._shape.setX(x);\n};\nWaveformShape.prototype.setSegment = function (segment) {\n this._segment = segment;\n};\nWaveformShape.prototype.setWaveformColor = function (color) {\n if (isString(color)) {\n this._shape.fill(color);\n this._shape.fillLinearGradientStartPointY(null);\n this._shape.fillLinearGradientEndPointY(null);\n this._shape.fillLinearGradientColorStops(null);\n } else if (isLinearGradientColor(color)) {\n this._shape.fill(null);\n var startY = this._view._height * (color.linearGradientStart / 100);\n var endY = this._view._height * (color.linearGradientEnd / 100);\n this._shape.fillLinearGradientStartPointY(startY);\n this._shape.fillLinearGradientEndPointY(endY);\n this._shape.fillLinearGradientColorStops([0, color.linearGradientColorStops[0], 1, color.linearGradientColorStops[1]]);\n } else {\n throw new TypeError('Unknown type for color property');\n }\n};\nWaveformShape.prototype.fitToView = function () {\n this.setWaveformColor(this._color);\n};\nWaveformShape.prototype._sceneFunc = function (context) {\n var frameOffset = this._view.getFrameOffset();\n var width = this._view.getWidth();\n var height = this._view.getHeight();\n this._drawWaveform(context, this._view.getWaveformData(), frameOffset, this._segment ? this._view.timeToPixels(this._segment.startTime) : frameOffset, this._segment ? this._view.timeToPixels(this._segment.endTime) : frameOffset + width, width, height);\n};\n\n/**\n * Draws a waveform on a canvas context.\n *\n * @param {Konva.Context} context The canvas context to draw on.\n * @param {WaveformData} waveformData The waveform data to draw.\n * @param {Number} frameOffset The start position of the waveform shown\n * in the view, in pixels.\n * @param {Number} startPixels The start position of the waveform to draw,\n * in pixels.\n * @param {Number} endPixels The end position of the waveform to draw,\n * in pixels.\n * @param {Number} width The width of the waveform area, in pixels.\n * @param {Number} height The height of the waveform area, in pixels.\n */\n\nWaveformShape.prototype._drawWaveform = function (context, waveformData, frameOffset, startPixels, endPixels, width, height) {\n if (startPixels < frameOffset) {\n startPixels = frameOffset;\n }\n var limit = frameOffset + width;\n if (endPixels > limit) {\n endPixels = limit;\n }\n if (endPixels > waveformData.length - 1) {\n endPixels = waveformData.length - 1;\n }\n var channels = waveformData.channels;\n var waveformTop = 0;\n var waveformHeight = Math.floor(height / channels);\n for (var i = 0; i < channels; i++) {\n if (i === channels - 1) {\n waveformHeight = height - (channels - 1) * waveformHeight;\n }\n this._drawChannel(context, waveformData.channel(i), frameOffset, startPixels, endPixels, waveformTop, waveformHeight);\n waveformTop += waveformHeight;\n }\n};\n\n/**\n * Draws a single waveform channel on a canvas context.\n *\n * @param {Konva.Context} context The canvas context to draw on.\n * @param {WaveformDataChannel} channel The waveform data to draw.\n * @param {Number} frameOffset The start position of the waveform shown\n * in the view, in pixels.\n * @param {Number} startPixels The start position of the waveform to draw,\n * in pixels.\n * @param {Number} endPixels The end position of the waveform to draw,\n * in pixels.\n * @param {Number} top The top of the waveform channel area, in pixels.\n * @param {Number} height The height of the waveform channel area, in pixels.\n */\n\nWaveformShape.prototype._drawChannel = function (context, channel, frameOffset, startPixels, endPixels, top, height) {\n var x, amplitude;\n var amplitudeScale = this._view.getAmplitudeScale();\n var lineX, lineY;\n context.beginPath();\n for (x = startPixels; x <= endPixels; x++) {\n amplitude = channel.min_sample(x);\n lineX = x - frameOffset + 0.5;\n lineY = top + WaveformShape.scaleY(amplitude, height, amplitudeScale) + 0.5;\n context.lineTo(lineX, lineY);\n }\n for (x = endPixels; x >= startPixels; x--) {\n amplitude = channel.max_sample(x);\n lineX = x - frameOffset + 0.5;\n lineY = top + WaveformShape.scaleY(amplitude, height, amplitudeScale) + 1.0;\n context.lineTo(lineX, lineY);\n }\n context.closePath();\n context.fillShape(this._shape);\n};\nWaveformShape.prototype.addToLayer = function (layer) {\n layer.add(this._shape);\n};\nWaveformShape.prototype.destroy = function () {\n this._shape.destroy();\n this._shape = null;\n};\nWaveformShape.prototype.on = function (event, handler) {\n this._shape.on(event, handler);\n};\nWaveformShape.prototype.off = function (event, handler) {\n this._shape.off(event, handler);\n};\n\n/**\n * Scales the waveform data for drawing on a canvas context.\n *\n * @see {@link https://stats.stackexchange.com/questions/281162}\n *\n * @todo Assumes 8-bit waveform data (-128 to 127 range)\n *\n * @param {Number} amplitude The waveform data point amplitude.\n * @param {Number} height The height of the waveform, in pixels.\n * @param {Number} scale Amplitude scaling factor.\n * @returns {Number} The scaled waveform data point.\n */\n\nWaveformShape.scaleY = function (amplitude, height, scale) {\n var y = -(height - 1) * (amplitude * scale + 128) / 255 + (height - 1);\n return clamp(Math.floor(y), 0, height - 1);\n};\n\n/**\n * @file\n *\n * Defines the {@link SegmentShape} class.\n *\n * @module segment-shape\n */\n\nvar defaultFontFamily = 'sans-serif';\nvar defaultFontSize = 10;\nvar defaultFontShape = 'normal';\n\n/**\n * Options that control segments' visual appearance\n *\n * @typedef {Object} SegmentDisplayOptions\n * @global\n * @property {Boolean} markers\n * @property {Boolean} overlay\n * @property {String} startMarkerColor\n * @property {String} endMarkerColor\n * @property {String} waveformColor\n * @property {String} overlayColor\n * @property {Number} overlayOpacity\n * @property {String} overlayBorderColor\n * @property {Number} overlayBorderWidth\n * @property {Number} overlayCornerRadius\n * @property {Number} overlayOffset\n * @property {String} overlayLabelAlign\n * @property {String} overlayLabelVerticalAlign\n * @property {Number} overlayLabelPadding\n * @property {String} overlayLabelColor\n * @property {String} overlayFontFamily\n * @property {Number} overlayFontSize\n * @property {String} overlayFontStyle\n */\n\n/**\n * Creates a waveform segment shape with optional start and end markers.\n *\n * @class\n * @alias SegmentShape\n *\n * @param {Segment} segment\n * @param {Peaks} peaks\n * @param {SegmentsLayer} layer\n * @param {WaveformOverview|WaveformZoomView} view\n */\n\nfunction SegmentShape(segment, peaks, layer, view) {\n this._segment = segment;\n this._peaks = peaks;\n this._layer = layer;\n this._view = view;\n this._label = null;\n this._startMarker = null;\n this._endMarker = null;\n this._color = segment.color;\n this._borderColor = segment.borderColor;\n this._draggable = this._segment.editable && this._view.isSegmentDraggingEnabled();\n this._dragging = false;\n var segmentOptions = view.getViewOptions().segmentOptions;\n this._overlayOffset = segmentOptions.overlayOffset;\n if (!segmentOptions.overlay) {\n this._waveformShape = new WaveformShape({\n color: segment.color,\n view: view,\n segment: segment\n });\n }\n this._onMouseEnter = this._onMouseEnter.bind(this);\n this._onMouseLeave = this._onMouseLeave.bind(this);\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n this._dragBoundFunc = this._dragBoundFunc.bind(this);\n this._onSegmentDragStart = this._onSegmentDragStart.bind(this);\n this._onSegmentDragMove = this._onSegmentDragMove.bind(this);\n this._onSegmentDragEnd = this._onSegmentDragEnd.bind(this);\n\n // Event handlers for markers\n this._onSegmentMarkerDragStart = this._onSegmentMarkerDragStart.bind(this);\n this._onSegmentMarkerDragMove = this._onSegmentMarkerDragMove.bind(this);\n this._onSegmentMarkerDragEnd = this._onSegmentMarkerDragEnd.bind(this);\n this._segmentMarkerDragBoundFunc = this._segmentMarkerDragBoundFunc.bind(this);\n this._label = this._peaks.options.createSegmentLabel({\n segment: segment,\n view: this._view.getName(),\n layer: this._layer,\n fontFamily: this._peaks.options.fontFamily,\n fontSize: this._peaks.options.fontSize,\n fontStyle: this._peaks.options.fontStyle\n });\n if (this._label) {\n this._label.hide();\n }\n\n // Create with default y and height, the real values are set in fitToView().\n var segmentStartOffset = this._view.timeToPixelOffset(this._segment.startTime);\n var segmentEndOffset = this._view.timeToPixelOffset(this._segment.endTime);\n var overlayRectHeight = clamp(0, this._view.getHeight() - 2 * this._overlayOffset);\n\n // The clip rectangle prevents text in the overlay from appearing\n // outside the overlay.\n\n this._overlay = new Konva.Group({\n name: 'segment-overlay',\n segment: this._segment,\n x: segmentStartOffset,\n y: 0,\n width: segmentEndOffset - segmentStartOffset,\n height: this._view.getHeight(),\n clipX: 0,\n clipY: this._overlayOffset,\n clipWidth: segmentEndOffset - segmentStartOffset,\n clipHeight: overlayRectHeight,\n draggable: this._draggable,\n dragBoundFunc: this._dragBoundFunc\n });\n var overlayBorderColor, overlayBorderWidth, overlayColor, overlayOpacity, overlayCornerRadius;\n if (segmentOptions.overlay) {\n overlayBorderColor = this._borderColor || segmentOptions.overlayBorderColor;\n overlayBorderWidth = segmentOptions.overlayBorderWidth;\n overlayColor = this._color || segmentOptions.overlayColor;\n overlayOpacity = segmentOptions.overlayOpacity;\n overlayCornerRadius = segmentOptions.overlayCornerRadius;\n }\n this._overlayRect = new Konva.Rect({\n x: 0,\n y: this._overlayOffset,\n width: segmentEndOffset - segmentStartOffset,\n stroke: overlayBorderColor,\n strokeWidth: overlayBorderWidth,\n height: overlayRectHeight,\n fill: overlayColor,\n opacity: overlayOpacity,\n cornerRadius: overlayCornerRadius\n });\n this._overlay.add(this._overlayRect);\n if (segmentOptions.overlay) {\n this._overlayText = new Konva.Text({\n x: 0,\n y: this._overlayOffset,\n text: this._segment.labelText,\n fontFamily: segmentOptions.overlayFontFamily,\n fontSize: segmentOptions.overlayFontSize,\n fontStyle: segmentOptions.overlayFontStyle,\n fill: segmentOptions.overlayLabelColor,\n listening: false,\n align: segmentOptions.overlayLabelAlign,\n width: segmentEndOffset - segmentStartOffset,\n verticalAlign: segmentOptions.overlayLabelVerticalAlign,\n height: overlayRectHeight,\n padding: segmentOptions.overlayLabelPadding\n });\n this._overlay.add(this._overlayText);\n }\n\n // Set up event handlers to show/hide the segment label text when the user\n // hovers the mouse over the segment.\n this._overlay.on('mouseenter', this._onMouseEnter);\n this._overlay.on('mouseleave', this._onMouseLeave);\n this._overlay.on('mousedown', this._onMouseDown);\n this._overlay.on('mouseup', this._onMouseUp);\n if (this._draggable) {\n this._overlay.on('dragstart', this._onSegmentDragStart);\n this._overlay.on('dragmove', this._onSegmentDragMove);\n this._overlay.on('dragend', this._onSegmentDragEnd);\n }\n this._createMarkers();\n}\nfunction createOverlayMarker(options) {\n return new OverlaySegmentMarker(options);\n}\nSegmentShape.prototype._createMarkers = function () {\n var editable = this._layer.isEditingEnabled() && this._segment.editable;\n var segmentOptions = this._view.getViewOptions().segmentOptions;\n var createSegmentMarker = segmentOptions.markers ? this._peaks.options.createSegmentMarker : createOverlayMarker;\n var startMarker = createSegmentMarker({\n segment: this._segment,\n editable: editable,\n startMarker: true,\n color: segmentOptions.startMarkerColor,\n fontFamily: this._peaks.options.fontFamily || defaultFontFamily,\n fontSize: this._peaks.options.fontSize || defaultFontSize,\n fontStyle: this._peaks.options.fontStyle || defaultFontShape,\n layer: this._layer,\n view: this._view.getName(),\n segmentOptions: this._view.getViewOptions().segmentOptions\n });\n if (startMarker) {\n this._startMarker = new SegmentMarker({\n segment: this._segment,\n segmentShape: this,\n editable: editable,\n startMarker: true,\n marker: startMarker,\n onDragStart: this._onSegmentMarkerDragStart,\n onDragMove: this._onSegmentMarkerDragMove,\n onDragEnd: this._onSegmentMarkerDragEnd,\n dragBoundFunc: this._segmentMarkerDragBoundFunc\n });\n }\n var endMarker = createSegmentMarker({\n segment: this._segment,\n editable: editable,\n startMarker: false,\n color: segmentOptions.endMarkerColor,\n fontFamily: this._peaks.options.fontFamily || defaultFontFamily,\n fontSize: this._peaks.options.fontSize || defaultFontSize,\n fontStyle: this._peaks.options.fontStyle || defaultFontShape,\n layer: this._layer,\n view: this._view.getName(),\n segmentOptions: this._view.getViewOptions().segmentOptions\n });\n if (endMarker) {\n this._endMarker = new SegmentMarker({\n segment: this._segment,\n segmentShape: this,\n editable: editable,\n startMarker: false,\n marker: endMarker,\n onDragStart: this._onSegmentMarkerDragStart,\n onDragMove: this._onSegmentMarkerDragMove,\n onDragEnd: this._onSegmentMarkerDragEnd,\n dragBoundFunc: this._segmentMarkerDragBoundFunc\n });\n }\n};\nSegmentShape.prototype._dragBoundFunc = function (pos) {\n // Allow the segment to be moved horizontally but not vertically.\n return {\n x: pos.x,\n y: 0\n };\n};\n\n/**\n * Update the segment shape after the segment's attributes have changed.\n */\n\nSegmentShape.prototype.update = function (options) {\n var segmentStartOffset = this._view.timeToPixelOffset(this._segment.startTime);\n var segmentEndOffset = this._view.timeToPixelOffset(this._segment.endTime);\n var width = segmentEndOffset - segmentStartOffset;\n var marker;\n if (marker = this.getStartMarker()) {\n marker.setX(segmentStartOffset - marker.getWidth());\n if (options) {\n marker.update(options);\n }\n }\n if (marker = this.getEndMarker()) {\n marker.setX(segmentEndOffset);\n if (options) {\n marker.update(options);\n }\n }\n this._color = this._segment.color;\n this._borderColor = this._segment.bordercolor;\n if (this._overlayText) {\n this._overlayText.text(this._segment.labelText);\n }\n var segmentOptions = this._view.getViewOptions().segmentOptions;\n if (segmentOptions.overlay) {\n if (this._color) {\n this._overlayRect.fill(this._color);\n }\n if (this._borderColor) {\n this._overlayRect.stroke(this._borderColor);\n }\n } else {\n this._waveformShape.setWaveformColor(this._segment.color);\n }\n\n // While dragging, the overlay position is controlled in _onSegmentDragMove().\n\n if (!this._dragging) {\n if (this._overlay) {\n this._overlay.setAttrs({\n x: segmentStartOffset,\n width: width,\n clipWidth: width < 1 ? 1 : width\n });\n this._overlayRect.setAttrs({\n x: 0,\n width: width\n });\n if (this._overlayText) {\n this._overlayText.setAttrs({\n width: width\n });\n }\n }\n }\n};\nSegmentShape.prototype.getSegment = function () {\n return this._segment;\n};\nSegmentShape.prototype.getStartMarker = function () {\n return this._startMarker;\n};\nSegmentShape.prototype.getEndMarker = function () {\n return this._endMarker;\n};\nSegmentShape.prototype.addToLayer = function (layer) {\n if (this._waveformShape) {\n this._waveformShape.addToLayer(layer);\n }\n if (this._label) {\n layer.add(this._label);\n }\n if (this._overlay) {\n layer.add(this._overlay);\n }\n if (this._startMarker) {\n this._startMarker.addToLayer(layer);\n }\n if (this._endMarker) {\n this._endMarker.addToLayer(layer);\n }\n};\nSegmentShape.prototype.isDragging = function () {\n return this._dragging;\n};\nSegmentShape.prototype._onMouseEnter = function (event) {\n if (this._label) {\n this._label.moveToTop();\n this._label.show();\n }\n this._peaks.emit('segments.mouseenter', {\n segment: this._segment,\n evt: event.evt\n });\n};\nSegmentShape.prototype._onMouseLeave = function (event) {\n if (this._label) {\n this._label.hide();\n }\n this._peaks.emit('segments.mouseleave', {\n segment: this._segment,\n evt: event.evt\n });\n};\nSegmentShape.prototype._onMouseDown = function (event) {\n this._peaks.emit('segments.mousedown', {\n segment: this._segment,\n evt: event.evt\n });\n};\nSegmentShape.prototype._onMouseUp = function (event) {\n this._peaks.emit('segments.mouseup', {\n segment: this._segment,\n evt: event.evt\n });\n};\nSegmentShape.prototype.segmentClicked = function (eventName, event) {\n this._moveToTop();\n this._peaks.emit('segments.' + eventName, event);\n};\nSegmentShape.prototype._moveToTop = function () {\n this._overlay.moveToTop();\n this._layer.moveSegmentMarkersToTop();\n};\nSegmentShape.prototype.enableSegmentDragging = function (enable) {\n if (!this._segment.editable) {\n return;\n }\n if (!this._draggable && enable) {\n this._overlay.on('dragstart', this._onSegmentDragStart);\n this._overlay.on('dragmove', this._onSegmentDragMove);\n this._overlay.on('dragend', this._onSegmentDragEnd);\n } else if (this._draggable && !enable) {\n this._overlay.off('dragstart', this._onSegmentDragStart);\n this._overlay.off('dragmove', this._onSegmentDragMove);\n this._overlay.off('dragend', this._onSegmentDragEnd);\n }\n this._overlay.draggable(enable);\n this._draggable = enable;\n};\nSegmentShape.prototype._setPreviousAndNextSegments = function () {\n if (this._view.getSegmentDragMode() !== 'overlap') {\n this._nextSegment = this._peaks.segments.findNextSegment(this._segment);\n this._previousSegment = this._peaks.segments.findPreviousSegment(this._segment);\n } else {\n this._nextSegment = null;\n this._previousSegment = null;\n }\n};\nSegmentShape.prototype._onSegmentDragStart = function (event) {\n this._setPreviousAndNextSegments();\n this._dragging = true;\n this._dragStartX = this._overlay.getX();\n this._dragStartTime = this._segment.startTime;\n this._dragEndTime = this._segment.endTime;\n this._peaks.emit('segments.dragstart', {\n segment: this._segment,\n marker: false,\n startMarker: false,\n evt: event.evt\n });\n};\nSegmentShape.prototype._onSegmentDragMove = function (event) {\n var x = this._overlay.getX();\n var offsetX = x - this._dragStartX;\n var timeOffset = this._view.pixelsToTime(offsetX);\n\n // The WaveformShape for a segment fills the canvas width\n // but only draws a subset of the horizontal range. When dragged\n // we need to keep the shape object in its position but\n // update the segment start and end time so that the right\n // subset is drawn.\n\n // Calculate new segment start/end time based on drag position. We'll\n // correct this later based on the drag mode, to prevent overlapping\n // segments or to compress the adjacent segment.\n\n var startTime = this._dragStartTime + timeOffset;\n var endTime = this._dragEndTime + timeOffset;\n var segmentDuration = this._segment.endTime - this._segment.startTime;\n var dragMode;\n var minSegmentWidth = this._view.getMinSegmentDragWidth();\n var minSegmentDuration = this._view.pixelsToTime(minSegmentWidth);\n var previousSegmentUpdated = false;\n var nextSegmentUpdated = false;\n\n // Prevent the segment from being dragged beyond the start of the waveform.\n\n if (startTime < 0) {\n startTime = 0;\n endTime = segmentDuration;\n this._overlay.setX(this._view.timeToPixelOffset(startTime));\n }\n\n // Adjust segment position if it now overlaps the previous segment?\n\n if (this._previousSegment) {\n var previousSegmentEndX = this._view.timeToPixelOffset(this._previousSegment.endTime);\n if (startTime < this._previousSegment.endTime) {\n dragMode = this._view.getSegmentDragMode();\n if (dragMode === 'no-overlap' || dragMode === 'compress' && !this._previousSegment.editable) {\n startTime = this._previousSegment.endTime;\n endTime = startTime + segmentDuration;\n this._overlay.setX(previousSegmentEndX);\n } else if (dragMode === 'compress') {\n var previousSegmentEndTime = startTime;\n var minPreviousSegmentEndTime = this._previousSegment.startTime + minSegmentDuration;\n if (previousSegmentEndTime < minPreviousSegmentEndTime) {\n previousSegmentEndTime = minPreviousSegmentEndTime;\n previousSegmentEndX = this._view.timeToPixelOffset(previousSegmentEndTime);\n this._overlay.setX(previousSegmentEndX);\n startTime = previousSegmentEndTime;\n endTime = startTime + segmentDuration;\n }\n this._previousSegment.update({\n endTime: previousSegmentEndTime\n });\n previousSegmentUpdated = true;\n }\n }\n }\n\n // Adjust segment position if it now overlaps the following segment?\n\n if (this._nextSegment) {\n var nextSegmentStartX = this._view.timeToPixelOffset(this._nextSegment.startTime);\n if (endTime > this._nextSegment.startTime) {\n dragMode = this._view.getSegmentDragMode();\n if (dragMode === 'no-overlap' || dragMode === 'compress' && !this._nextSegment.editable) {\n endTime = this._nextSegment.startTime;\n startTime = endTime - segmentDuration;\n this._overlay.setX(nextSegmentStartX - this._overlay.getWidth());\n } else if (dragMode === 'compress') {\n var nextSegmentStartTime = endTime;\n var maxNextSegmentStartTime = this._nextSegment.endTime - minSegmentDuration;\n if (nextSegmentStartTime > maxNextSegmentStartTime) {\n nextSegmentStartTime = maxNextSegmentStartTime;\n nextSegmentStartX = this._view.timeToPixelOffset(nextSegmentStartTime);\n this._overlay.setX(nextSegmentStartX - this._overlay.getWidth());\n endTime = nextSegmentStartTime;\n startTime = endTime - segmentDuration;\n }\n this._nextSegment.update({\n startTime: nextSegmentStartTime\n });\n nextSegmentUpdated = true;\n }\n }\n }\n this._segment._setStartTime(startTime);\n this._segment._setEndTime(endTime);\n this._peaks.emit('segments.dragged', {\n segment: this._segment,\n marker: false,\n startMarker: false,\n evt: event.evt\n });\n if (previousSegmentUpdated) {\n this._peaks.emit('segments.dragged', {\n segment: this._previousSegment,\n marker: false,\n startMarker: false,\n evt: event.evt\n });\n } else if (nextSegmentUpdated) {\n this._peaks.emit('segments.dragged', {\n segment: this._nextSegment,\n marker: false,\n startMarker: false,\n evt: event.evt\n });\n }\n};\nSegmentShape.prototype._onSegmentDragEnd = function (event) {\n this._dragging = false;\n this._peaks.emit('segments.dragend', {\n segment: this._segment,\n marker: false,\n startMarker: false,\n evt: event.evt\n });\n};\nSegmentShape.prototype.moveMarkersToTop = function () {\n if (this._startMarker) {\n this._startMarker.moveToTop();\n }\n if (this._endMarker) {\n this._endMarker.moveToTop();\n }\n};\nSegmentShape.prototype.startDrag = function () {\n if (this._endMarker) {\n this._endMarker.startDrag();\n }\n};\nSegmentShape.prototype.stopDrag = function () {\n if (this._endMarker) {\n this._endMarker.stopDrag();\n }\n};\n\n/**\n * @param {SegmentMarker} segmentMarker\n */\n\nSegmentShape.prototype._onSegmentMarkerDragStart = function (segmentMarker, event) {\n this._setPreviousAndNextSegments();\n\n // Move this segment to the top of the z-order, so that it remains on top\n // of any adjacent segments that the marker is dragged over.\n this._moveToTop();\n this._startMarkerX = this._startMarker.getX();\n this._endMarkerX = this._endMarker.getX();\n this._peaks.emit('segments.dragstart', {\n segment: this._segment,\n marker: true,\n startMarker: segmentMarker.isStartMarker(),\n evt: event.evt\n });\n};\n\n/**\n * @param {SegmentMarker} segmentMarker\n */\n\nSegmentShape.prototype._onSegmentMarkerDragMove = function (segmentMarker, event) {\n if (segmentMarker.isStartMarker()) {\n this._segmentStartMarkerDragMove(segmentMarker, event);\n segmentMarker.update({\n startTime: this._segment.startTime\n });\n } else {\n this._segmentEndMarkerDragMove(segmentMarker, event);\n segmentMarker.update({\n endTime: this._segment.endTime\n });\n }\n};\nfunction getDuration(segment) {\n return segment.endTime - segment.startTime;\n}\nSegmentShape.prototype._segmentStartMarkerDragMove = function (segmentMarker, event) {\n var width = this._view.getWidth();\n var startMarkerX = this._startMarker.getX();\n var endMarkerX = this._endMarker.getX();\n var minSegmentDuration = this._view.pixelsToTime(50);\n var minSegmentWidth = this._view.getMinSegmentDragWidth();\n var upperLimit = this._endMarker.getX() - minSegmentWidth;\n if (upperLimit > width) {\n upperLimit = width;\n }\n var previousSegmentVisible = false;\n var previousSegmentUpdated = false;\n var previousSegmentEndX;\n if (this._previousSegment) {\n previousSegmentEndX = this._view.timeToPixelOffset(this._previousSegment.endTime);\n previousSegmentVisible = previousSegmentEndX >= 0;\n }\n if (startMarkerX > upperLimit) {\n segmentMarker.setX(upperLimit);\n this._overlay.clipWidth(upperLimit - endMarkerX);\n if (minSegmentWidth === 0 && upperLimit < width) {\n this._segment._setStartTime(this._segment.endTime);\n } else {\n this._segment._setStartTime(this._view.pixelOffsetToTime(upperLimit));\n }\n } else if (this._previousSegment && previousSegmentVisible) {\n var dragMode = this._view.getSegmentDragMode();\n var fixedPreviousSegment = dragMode === 'no-overlap' || dragMode === 'compress' && !this._previousSegment.editable;\n var compressPreviousSegment = dragMode === 'compress' && this._previousSegment.editable;\n if (startMarkerX <= previousSegmentEndX) {\n if (fixedPreviousSegment) {\n segmentMarker.setX(previousSegmentEndX);\n this._overlay.clipWidth(previousSegmentEndX - endMarkerX);\n this._segment._setStartTime(this._previousSegment.endTime);\n } else if (compressPreviousSegment) {\n var previousSegmentDuration = getDuration(this._previousSegment);\n if (previousSegmentDuration < minSegmentDuration) {\n minSegmentDuration = previousSegmentDuration;\n }\n var lowerLimit = this._view.timeToPixelOffset(this._previousSegment.startTime + minSegmentDuration);\n if (startMarkerX < lowerLimit) {\n startMarkerX = lowerLimit;\n }\n segmentMarker.setX(startMarkerX);\n this._overlay.clipWidth(endMarkerX - startMarkerX);\n this._segment._setStartTime(this._view.pixelOffsetToTime(startMarkerX));\n this._previousSegment.update({\n endTime: this._view.pixelOffsetToTime(startMarkerX)\n });\n previousSegmentUpdated = true;\n }\n } else {\n if (startMarkerX < 0) {\n startMarkerX = 0;\n }\n segmentMarker.setX(startMarkerX);\n this._overlay.clipWidth(endMarkerX - startMarkerX);\n this._segment._setStartTime(this._view.pixelOffsetToTime(startMarkerX));\n }\n } else {\n if (startMarkerX < 0) {\n startMarkerX = 0;\n }\n segmentMarker.setX(startMarkerX);\n this._overlay.clipWidth(endMarkerX - startMarkerX);\n this._segment._setStartTime(this._view.pixelOffsetToTime(startMarkerX));\n }\n this._peaks.emit('segments.dragged', {\n segment: this._segment,\n marker: true,\n startMarker: true,\n evt: event.evt\n });\n if (previousSegmentUpdated) {\n this._peaks.emit('segments.dragged', {\n segment: this._previousSegment,\n marker: true,\n startMarker: false,\n evt: event.evt\n });\n }\n};\nSegmentShape.prototype._segmentEndMarkerDragMove = function (segmentMarker, event) {\n var width = this._view.getWidth();\n var startMarkerX = this._startMarker.getX();\n var endMarkerX = this._endMarker.getX();\n var minSegmentDuration = this._view.pixelsToTime(50);\n var minSegmentWidth = this._view.getMinSegmentDragWidth();\n var lowerLimit = this._startMarker.getX() + minSegmentWidth;\n if (lowerLimit < 0) {\n lowerLimit = 0;\n }\n var nextSegmentVisible = false;\n var nextSegmentUpdated = false;\n var nextSegmentStartX;\n if (this._nextSegment) {\n nextSegmentStartX = this._view.timeToPixelOffset(this._nextSegment.startTime);\n nextSegmentVisible = nextSegmentStartX < width;\n }\n if (endMarkerX < lowerLimit) {\n segmentMarker.setX(lowerLimit);\n this._overlay.clipWidth(lowerLimit - startMarkerX);\n if (minSegmentWidth === 0 && lowerLimit > 0) {\n this._segment._setEndTime(this._segment.startTime);\n } else {\n this._segment._setEndTime(this._view.pixelOffsetToTime(lowerLimit));\n }\n } else if (this._nextSegment && nextSegmentVisible) {\n var dragMode = this._view.getSegmentDragMode();\n var fixedNextSegment = dragMode === 'no-overlap' || dragMode === 'compress' && !this._nextSegment.editable;\n var compressNextSegment = dragMode === 'compress' && this._nextSegment.editable;\n if (endMarkerX >= nextSegmentStartX) {\n if (fixedNextSegment) {\n segmentMarker.setX(nextSegmentStartX);\n this._overlay.clipWidth(nextSegmentStartX - startMarkerX);\n this._segment._setEndTime(this._nextSegment.startTime);\n } else if (compressNextSegment) {\n var nextSegmentDuration = getDuration(this._nextSegment);\n if (nextSegmentDuration < minSegmentDuration) {\n minSegmentDuration = nextSegmentDuration;\n }\n var upperLimit = this._view.timeToPixelOffset(this._nextSegment.endTime - minSegmentDuration);\n if (endMarkerX > upperLimit) {\n endMarkerX = upperLimit;\n }\n segmentMarker.setX(endMarkerX);\n this._overlay.clipWidth(endMarkerX - startMarkerX);\n this._segment._setEndTime(this._view.pixelOffsetToTime(endMarkerX));\n this._nextSegment.update({\n startTime: this._view.pixelOffsetToTime(endMarkerX)\n });\n nextSegmentUpdated = true;\n }\n } else {\n if (endMarkerX > width) {\n endMarkerX = width;\n }\n segmentMarker.setX(endMarkerX);\n this._overlay.clipWidth(endMarkerX - startMarkerX);\n this._segment._setEndTime(this._view.pixelOffsetToTime(endMarkerX));\n }\n } else {\n if (endMarkerX > width) {\n endMarkerX = width;\n }\n segmentMarker.setX(endMarkerX);\n this._overlay.clipWidth(endMarkerX - startMarkerX);\n this._segment._setEndTime(this._view.pixelOffsetToTime(endMarkerX));\n }\n this._peaks.emit('segments.dragged', {\n segment: this._segment,\n marker: true,\n startMarker: false,\n evt: event.evt\n });\n if (nextSegmentUpdated) {\n this._peaks.emit('segments.dragged', {\n segment: this._nextSegment,\n marker: true,\n startMarker: true,\n evt: event.evt\n });\n }\n};\n\n/**\n * @param {SegmentMarker} segmentMarker\n */\n\nSegmentShape.prototype._onSegmentMarkerDragEnd = function (segmentMarker, event) {\n this._nextSegment = null;\n this._previousSegment = null;\n var startMarker = segmentMarker.isStartMarker();\n this._peaks.emit('segments.dragend', {\n segment: this._segment,\n marker: true,\n startMarker: startMarker,\n evt: event.evt\n });\n};\n\n// eslint-disable-next-line no-unused-vars\nSegmentShape.prototype._segmentMarkerDragBoundFunc = function (segmentMarker, pos) {\n // Allow the marker to be moved horizontally but not vertically.\n return {\n x: pos.x,\n y: segmentMarker.getAbsolutePosition().y\n };\n};\nSegmentShape.prototype.fitToView = function () {\n if (this._startMarker) {\n this._startMarker.fitToView();\n }\n if (this._endMarker) {\n this._endMarker.fitToView();\n }\n if (this._overlay) {\n var height = this._view.getHeight();\n var overlayRectHeight = clamp(0, height - this._overlayOffset * 2);\n this._overlay.setAttrs({\n y: 0,\n height: height,\n clipY: this._overlayOffset,\n clipHeight: overlayRectHeight\n });\n this._overlayRect.setAttrs({\n y: this._overlayOffset,\n height: overlayRectHeight\n });\n if (this._overlayText) {\n this._overlayText.setAttrs({\n y: this._overlayOffset,\n height: overlayRectHeight\n });\n }\n }\n};\nSegmentShape.prototype.destroy = function () {\n if (this._waveformShape) {\n this._waveformShape.destroy();\n }\n if (this._label) {\n this._label.destroy();\n }\n if (this._startMarker) {\n this._startMarker.destroy();\n }\n if (this._endMarker) {\n this._endMarker.destroy();\n }\n if (this._overlay) {\n this._overlay.destroy();\n }\n};\n\n/**\n * @file\n *\n * Defines the {@link SegmentsLayer} class.\n *\n * @module segments-layer\n */\n\n\n/**\n * Creates a Konva.Layer that displays segment markers against the audio\n * waveform.\n *\n * @class\n * @alias SegmentsLayer\n *\n * @param {Peaks} peaks\n * @param {WaveformOverview|WaveformZoomView} view\n * @param {Boolean} allowEditing\n */\n\nfunction SegmentsLayer(peaks, view, allowEditing) {\n this._peaks = peaks;\n this._view = view;\n this._allowEditing = allowEditing;\n this._segmentShapes = {};\n this._layer = new Konva.Layer();\n this._onSegmentsUpdate = this._onSegmentsUpdate.bind(this);\n this._onSegmentsAdd = this._onSegmentsAdd.bind(this);\n this._onSegmentsRemove = this._onSegmentsRemove.bind(this);\n this._onSegmentsRemoveAll = this._onSegmentsRemoveAll.bind(this);\n this._onSegmentsDragged = this._onSegmentsDragged.bind(this);\n this._peaks.on('segments.update', this._onSegmentsUpdate);\n this._peaks.on('segments.add', this._onSegmentsAdd);\n this._peaks.on('segments.remove', this._onSegmentsRemove);\n this._peaks.on('segments.remove_all', this._onSegmentsRemoveAll);\n this._peaks.on('segments.dragged', this._onSegmentsDragged);\n}\n\n/**\n * Adds the layer to the given {Konva.Stage}.\n *\n * @param {Konva.Stage} stage\n */\n\nSegmentsLayer.prototype.addToStage = function (stage) {\n stage.add(this._layer);\n};\nSegmentsLayer.prototype.enableEditing = function (enable) {\n this._allowEditing = enable;\n};\nSegmentsLayer.prototype.isEditingEnabled = function () {\n return this._allowEditing;\n};\nSegmentsLayer.prototype.enableSegmentDragging = function (enable) {\n for (var segmentPid in this._segmentShapes) {\n if (objectHasProperty(this._segmentShapes, segmentPid)) {\n this._segmentShapes[segmentPid].enableSegmentDragging(enable);\n }\n }\n};\nSegmentsLayer.prototype.getSegmentShape = function (segment) {\n return this._segmentShapes[segment.pid];\n};\nSegmentsLayer.prototype.formatTime = function (time) {\n return this._view.formatTime(time);\n};\nSegmentsLayer.prototype._onSegmentsUpdate = function (segment, options) {\n var frameStartTime = this._view.getStartTime();\n var frameEndTime = this._view.getEndTime();\n var segmentShape = this.getSegmentShape(segment);\n var isVisible = segment.isVisible(frameStartTime, frameEndTime);\n if (segmentShape && !isVisible) {\n // Remove segment shape that is no longer visible.\n\n if (!segmentShape.isDragging()) {\n this._removeSegment(segment);\n }\n } else if (!segmentShape && isVisible) {\n // Add segment shape for visible segment.\n segmentShape = this._updateSegment(segment);\n } else if (segmentShape && isVisible) {\n // Update the segment shape with the changed attributes.\n segmentShape.update(options);\n }\n};\nSegmentsLayer.prototype._onSegmentsAdd = function (event) {\n var self = this;\n var frameStartTime = self._view.getStartTime();\n var frameEndTime = self._view.getEndTime();\n event.segments.forEach(function (segment) {\n if (segment.isVisible(frameStartTime, frameEndTime)) {\n var segmentShape = self._addSegmentShape(segment);\n segmentShape.update();\n }\n });\n\n // Ensure segment markers are always draggable.\n this.moveSegmentMarkersToTop();\n};\nSegmentsLayer.prototype._onSegmentsRemove = function (event) {\n var self = this;\n event.segments.forEach(function (segment) {\n self._removeSegment(segment);\n });\n};\nSegmentsLayer.prototype._onSegmentsRemoveAll = function () {\n this._layer.removeChildren();\n this._segmentShapes = {};\n};\nSegmentsLayer.prototype._onSegmentsDragged = function (event) {\n this._updateSegment(event.segment);\n};\n\n/**\n * Creates the Konva UI objects for a given segment.\n *\n * @private\n * @param {Segment} segment\n * @returns {SegmentShape}\n */\n\nSegmentsLayer.prototype._createSegmentShape = function (segment) {\n return new SegmentShape(segment, this._peaks, this, this._view);\n};\n\n/**\n * Adds a Konva UI object to the layer for a given segment.\n *\n * @private\n * @param {Segment} segment\n * @returns {SegmentShape}\n */\n\nSegmentsLayer.prototype._addSegmentShape = function (segment) {\n var segmentShape = this._createSegmentShape(segment);\n segmentShape.addToLayer(this._layer);\n this._segmentShapes[segment.pid] = segmentShape;\n return segmentShape;\n};\n\n/**\n * Updates the positions of all displayed segments in the view.\n *\n * @param {Number} startTime The start of the visible range in the view,\n * in seconds.\n * @param {Number} endTime The end of the visible range in the view,\n * in seconds.\n */\n\nSegmentsLayer.prototype.updateSegments = function (startTime, endTime) {\n // Update segments in visible time range.\n var segments = this._peaks.segments.find(startTime, endTime);\n segments.forEach(this._updateSegment.bind(this));\n\n // TODO: In the overview all segments are visible, so no need to do this.\n this._removeInvisibleSegments(startTime, endTime);\n};\n\n/**\n * @private\n * @param {Segment} segment\n */\n\nSegmentsLayer.prototype._updateSegment = function (segment) {\n var segmentShape = this.getSegmentShape(segment);\n if (!segmentShape) {\n segmentShape = this._addSegmentShape(segment);\n }\n segmentShape.update();\n};\n\n/**\n * Removes any segments that are not visible, i.e., are not within and do not\n * overlap the given time range.\n *\n * @private\n * @param {Number} startTime The start of the visible time range, in seconds.\n * @param {Number} endTime The end of the visible time range, in seconds.\n */\n\nSegmentsLayer.prototype._removeInvisibleSegments = function (startTime, endTime) {\n for (var segmentPid in this._segmentShapes) {\n if (objectHasProperty(this._segmentShapes, segmentPid)) {\n var segment = this._segmentShapes[segmentPid].getSegment();\n if (!segment.isVisible(startTime, endTime)) {\n this._removeSegment(segment);\n }\n }\n }\n};\n\n/**\n * Removes the given segment from the view.\n *\n * @param {Segment} segment\n */\n\nSegmentsLayer.prototype._removeSegment = function (segment) {\n var segmentShape = this._segmentShapes[segment.pid];\n if (segmentShape) {\n segmentShape.destroy();\n delete this._segmentShapes[segment.pid];\n }\n};\n\n/**\n * Moves all segment markers to the top of the z-order,\n * so the user can always drag them.\n */\n\nSegmentsLayer.prototype.moveSegmentMarkersToTop = function () {\n for (var segmentPid in this._segmentShapes) {\n if (objectHasProperty(this._segmentShapes, segmentPid)) {\n this._segmentShapes[segmentPid].moveMarkersToTop();\n }\n }\n};\n\n/**\n * Toggles visibility of the segments layer.\n *\n * @param {Boolean} visible\n */\n\nSegmentsLayer.prototype.setVisible = function (visible) {\n this._layer.setVisible(visible);\n};\nSegmentsLayer.prototype.segmentClicked = function (eventName, event) {\n var segmentShape = this._segmentShapes[event.segment.pid];\n if (segmentShape) {\n segmentShape.segmentClicked(eventName, event);\n }\n};\nSegmentsLayer.prototype.destroy = function () {\n this._peaks.off('segments.update', this._onSegmentsUpdate);\n this._peaks.off('segments.add', this._onSegmentsAdd);\n this._peaks.off('segments.remove', this._onSegmentsRemove);\n this._peaks.off('segments.remove_all', this._onSegmentsRemoveAll);\n this._peaks.off('segments.dragged', this._onSegmentsDragged);\n};\nSegmentsLayer.prototype.fitToView = function () {\n for (var segmentPid in this._segmentShapes) {\n if (objectHasProperty(this._segmentShapes, segmentPid)) {\n var segmentShape = this._segmentShapes[segmentPid];\n segmentShape.fitToView();\n }\n }\n};\nSegmentsLayer.prototype.draw = function () {\n this._layer.draw();\n};\nSegmentsLayer.prototype.getHeight = function () {\n return this._layer.getHeight();\n};\n\n/**\n * @file\n *\n * Defines the {@link WaveformAxis} class.\n *\n * @module waveform-axis\n */\n\n\n/**\n * Creates the waveform axis shapes and adds them to the given view layer.\n *\n * @class\n * @alias WaveformAxis\n *\n * @param {WaveformOverview|WaveformZoomView} view\n * @param {Object} options\n * @param {String} options.axisGridlineColor\n * @param {String} options.axisLabelColor\n * @param {Boolean} options.showAxisLabels\n * @param {Function} options.formatAxisTime\n * @param {String} options.fontFamily\n * @param {Number} options.fontSize\n * @param {String} options.fontStyle\n */\n\nfunction WaveformAxis(view, options) {\n var self = this;\n self._axisGridlineColor = options.axisGridlineColor;\n self._axisLabelColor = options.axisLabelColor;\n self._showAxisLabels = options.showAxisLabels;\n self._axisTopMarkerHeight = options.axisTopMarkerHeight;\n self._axisBottomMarkerHeight = options.axisBottomMarkerHeight;\n if (options.formatAxisTime) {\n self._formatAxisTime = options.formatAxisTime;\n } else {\n self._formatAxisTime = function (time) {\n // precision = 0, drops the fractional seconds\n return formatTime(time, 0);\n };\n }\n self._axisLabelFont = WaveformAxis._buildFontString(options.fontFamily, options.fontSize, options.fontStyle);\n self._axisShape = new Konva.Shape({\n sceneFunc: function sceneFunc(context) {\n self._drawAxis(context, view);\n }\n });\n}\nWaveformAxis._buildFontString = function (fontFamily, fontSize, fontStyle) {\n if (!fontSize) {\n fontSize = 11;\n }\n if (!fontFamily) {\n fontFamily = 'sans-serif';\n }\n if (!fontStyle) {\n fontStyle = 'normal';\n }\n return fontStyle + ' ' + fontSize + 'px ' + fontFamily;\n};\nWaveformAxis.prototype.addToLayer = function (layer) {\n layer.add(this._axisShape);\n};\nWaveformAxis.prototype.showAxisLabels = function (show, options) {\n this._showAxisLabels = show;\n if (options) {\n if (objectHasProperty(options, 'topMarkerHeight')) {\n this._axisTopMarkerHeight = options.topMarkerHeight;\n }\n if (objectHasProperty(options, 'bottomMarkerHeight')) {\n this._axisBottomMarkerHeight = options.bottomMarkerHeight;\n }\n }\n};\n\n/**\n * Returns number of seconds for each x-axis marker, appropriate for the\n * current zoom level, ensuring that markers are not too close together\n * and that markers are placed at intuitive time intervals (i.e., every 1,\n * 2, 5, 10, 20, 30 seconds, then every 1, 2, 5, 10, 20, 30 minutes, then\n * every 1, 2, 5, 10, 20, 30 hours).\n *\n * @param {WaveformOverview|WaveformZoomView} view\n * @returns {Number}\n */\n\nWaveformAxis.prototype._getAxisLabelScale = function (view) {\n var baseSecs = 1; // seconds\n var steps = [1, 2, 5, 10, 20, 30];\n var minSpacing = 60;\n var index = 0;\n var secs;\n for (;;) {\n secs = baseSecs * steps[index];\n var pixels = view.timeToPixels(secs);\n if (pixels < minSpacing) {\n if (++index === steps.length) {\n baseSecs *= 60; // seconds -> minutes -> hours\n index = 0;\n }\n } else {\n break;\n }\n }\n return secs;\n};\n\n/**\n * Draws the time axis and labels onto a view.\n *\n * @param {Konva.Context} context The context to draw on.\n * @param {WaveformOverview|WaveformZoomView} view\n */\n\nWaveformAxis.prototype._drawAxis = function (context, view) {\n var currentFrameStartTime = view.getStartTime();\n\n // Time interval between axis markers (seconds)\n var axisLabelIntervalSecs = this._getAxisLabelScale(view);\n\n // Time of first axis marker (seconds)\n var firstAxisLabelSecs = roundUpToNearest(currentFrameStartTime, axisLabelIntervalSecs);\n\n // Distance between waveform start time and first axis marker (seconds)\n var axisLabelOffsetSecs = firstAxisLabelSecs - currentFrameStartTime;\n\n // Distance between waveform start time and first axis marker (pixels)\n var axisLabelOffsetPixels = view.timeToPixels(axisLabelOffsetSecs);\n context.setAttr('strokeStyle', this._axisGridlineColor);\n context.setAttr('lineWidth', 1);\n\n // Set text style\n context.setAttr('font', this._axisLabelFont);\n context.setAttr('fillStyle', this._axisLabelColor);\n context.setAttr('textAlign', 'left');\n context.setAttr('textBaseline', 'bottom');\n var width = view.getWidth();\n var height = view.getHeight();\n var secs = firstAxisLabelSecs;\n for (;;) {\n // Position of axis marker (pixels)\n var x = axisLabelOffsetPixels + view.timeToPixels(secs - firstAxisLabelSecs);\n if (x >= width) {\n break;\n }\n if (this._axisTopMarkerHeight > 0) {\n context.beginPath();\n context.moveTo(x + 0.5, 0);\n context.lineTo(x + 0.5, 0 + this._axisTopMarkerHeight);\n context.stroke();\n }\n if (this._axisBottomMarkerHeight) {\n context.beginPath();\n context.moveTo(x + 0.5, height);\n context.lineTo(x + 0.5, height - this._axisBottomMarkerHeight);\n context.stroke();\n }\n if (this._showAxisLabels) {\n var label = this._formatAxisTime(secs);\n var labelWidth = context.measureText(label).width;\n var labelX = x - labelWidth / 2;\n var labelY = height - 1 - this._axisBottomMarkerHeight;\n if (labelX >= 0) {\n context.fillText(label, labelX, labelY);\n }\n }\n secs += axisLabelIntervalSecs;\n }\n};\n\n/**\n * @file\n *\n * Defines the {@link WaveformView} class.\n *\n * @module waveform-view\n */\n\nfunction WaveformView(waveformData, container, peaks, viewOptions) {\n var self = this;\n self._container = container;\n self._peaks = peaks;\n self._options = peaks.options;\n self._viewOptions = viewOptions;\n self._originalWaveformData = waveformData;\n self._data = waveformData;\n\n // The pixel offset of the current frame being displayed\n self._frameOffset = 0;\n self._width = container.clientWidth;\n self._height = container.clientHeight;\n self._amplitudeScale = 1.0;\n self._waveformColor = self._viewOptions.waveformColor;\n self._playedWaveformColor = self._viewOptions.playedWaveformColor;\n self._timeLabelPrecision = self._viewOptions.timeLabelPrecision;\n if (self._viewOptions.formatPlayheadTime) {\n self._formatPlayheadTime = self._viewOptions.formatPlayheadTime;\n } else {\n self._formatPlayheadTime = function (time) {\n return formatTime(time, self._timeLabelPrecision);\n };\n }\n self._enableSeek = true;\n self.initWaveform();\n\n // Disable warning: The stage has 6 layers.\n // Recommended maximum number of layers is 3-5.\n Konva.showWarnings = false;\n self._stage = new Konva.Stage({\n container: container,\n width: self._width,\n height: self._height\n });\n self._createWaveform();\n if (self._viewOptions.enableSegments) {\n self._segmentsLayer = new SegmentsLayer(peaks, self, self._viewOptions.enableEditing);\n self._segmentsLayer.addToStage(self._stage);\n }\n if (self._viewOptions.enablePoints) {\n self._pointsLayer = new PointsLayer(peaks, self, self._viewOptions.enableEditing);\n self._pointsLayer.addToStage(self._stage);\n }\n self.initHighlightLayer();\n self._createAxisLabels();\n self._playheadLayer = new PlayheadLayer(self._peaks.player, self, self._viewOptions);\n self._playheadLayer.addToStage(self._stage);\n self._onClick = self._onClick.bind(self);\n self._onDblClick = self._onDblClick.bind(self);\n self._onContextMenu = self._onContextMenu.bind(self);\n self._stage.on('click', self._onClick);\n self._stage.on('dblclick', self._onDblClick);\n self._stage.on('contextmenu', self._onContextMenu);\n}\nWaveformView.prototype.getViewOptions = function () {\n return this._viewOptions;\n};\n\n/**\n * @returns {WaveformData} The view's waveform data.\n */\n\nWaveformView.prototype.getWaveformData = function () {\n return this._data;\n};\nWaveformView.prototype.setWaveformData = function (waveformData) {\n this._data = waveformData;\n};\n\n/**\n * Returns the pixel index for a given time, for the current zoom level.\n *\n * @param {Number} time Time, in seconds.\n * @returns {Number} Pixel index.\n */\n\nWaveformView.prototype.timeToPixels = function (time) {\n return Math.floor(time * this._data.sample_rate / this._data.scale);\n};\n\n/**\n * Returns the time for a given pixel index, for the current zoom level.\n *\n * @param {Number} pixels Pixel index.\n * @returns {Number} Time, in seconds.\n */\n\nWaveformView.prototype.pixelsToTime = function (pixels) {\n return pixels * this._data.scale / this._data.sample_rate;\n};\n\n/**\n * Returns the time for a given pixel offset (relative to the\n * current scroll position), for the current zoom level.\n *\n * @param {Number} offset Offset from left-visible-edge of view\n * @returns {Number} Time, in seconds.\n */\n\nWaveformView.prototype.pixelOffsetToTime = function (offset) {\n var pixels = this._frameOffset + offset;\n return pixels * this._data.scale / this._data.sample_rate;\n};\nWaveformView.prototype.timeToPixelOffset = function (time) {\n return Math.floor(time * this._data.sample_rate / this._data.scale) - this._frameOffset;\n};\n\n/**\n * @returns {Number} The start position of the waveform shown in the view,\n * in pixels.\n */\n\nWaveformView.prototype.getFrameOffset = function () {\n return this._frameOffset;\n};\n\n/**\n * @returns {Number} The width of the view, in pixels.\n */\n\nWaveformView.prototype.getWidth = function () {\n return this._width;\n};\n\n/**\n * @returns {Number} The height of the view, in pixels.\n */\n\nWaveformView.prototype.getHeight = function () {\n return this._height;\n};\n\n/**\n * @returns {Number} The time at the left edge of the waveform view.\n */\n\nWaveformView.prototype.getStartTime = function () {\n return this.pixelOffsetToTime(0);\n};\n\n/**\n * @returns {Number} The time at the right edge of the waveform view.\n */\n\nWaveformView.prototype.getEndTime = function () {\n return this.pixelOffsetToTime(this._width);\n};\n\n/**\n * @returns {Number} The media duration, in seconds.\n */\n\nWaveformView.prototype._getDuration = function () {\n return this._peaks.player.getDuration();\n};\nWaveformView.prototype._createWaveform = function () {\n this._waveformLayer = new Konva.Layer({\n listening: false\n });\n this._createWaveformShapes();\n this._stage.add(this._waveformLayer);\n};\nWaveformView.prototype._createWaveformShapes = function () {\n if (!this._waveformShape) {\n this._waveformShape = new WaveformShape({\n color: this._waveformColor,\n view: this\n });\n this._waveformShape.addToLayer(this._waveformLayer);\n }\n if (this._playedWaveformColor && !this._playedWaveformShape) {\n var time = this._peaks.player.getCurrentTime();\n this._playedSegment = {\n startTime: 0,\n endTime: time\n };\n this._unplayedSegment = {\n startTime: time,\n endTime: this._getDuration()\n };\n this._waveformShape.setSegment(this._unplayedSegment);\n this._playedWaveformShape = new WaveformShape({\n color: this._playedWaveformColor,\n view: this,\n segment: this._playedSegment\n });\n this._playedWaveformShape.addToLayer(this._waveformLayer);\n }\n};\nWaveformView.prototype.setWaveformColor = function (color) {\n this._waveformColor = color;\n this._waveformShape.setWaveformColor(color);\n};\nWaveformView.prototype.setPlayedWaveformColor = function (color) {\n this._playedWaveformColor = color;\n if (color) {\n if (!this._playedWaveformShape) {\n this._createWaveformShapes();\n }\n this._playedWaveformShape.setWaveformColor(color);\n } else {\n if (this._playedWaveformShape) {\n this._destroyPlayedWaveformShape();\n }\n }\n};\nWaveformView.prototype._destroyPlayedWaveformShape = function () {\n this._waveformShape.setSegment(null);\n this._playedWaveformShape.destroy();\n this._playedWaveformShape = null;\n this._playedSegment = null;\n this._unplayedSegment = null;\n};\nWaveformView.prototype._createAxisLabels = function () {\n this._axisLayer = new Konva.Layer({\n listening: false\n });\n this._axis = new WaveformAxis(this, this._viewOptions);\n this._axis.addToLayer(this._axisLayer);\n this._stage.add(this._axisLayer);\n};\nWaveformView.prototype.showAxisLabels = function (show, options) {\n this._axis.showAxisLabels(show, options);\n this._axisLayer.draw();\n};\nWaveformView.prototype.showPlayheadTime = function (show) {\n this._playheadLayer.showPlayheadTime(show);\n};\nWaveformView.prototype.setTimeLabelPrecision = function (precision) {\n this._timeLabelPrecision = precision;\n this._playheadLayer.updatePlayheadText();\n};\nWaveformView.prototype.formatTime = function (time) {\n return this._formatPlayheadTime(time);\n};\n\n/**\n * Adjusts the amplitude scale of waveform shown in the view, which allows\n * users to zoom the waveform vertically.\n *\n * @param {Number} scale The new amplitude scale factor\n */\n\nWaveformView.prototype.setAmplitudeScale = function (scale) {\n if (!isNumber(scale) || !isFinite(scale)) {\n throw new Error('view.setAmplitudeScale(): Scale must be a valid number');\n }\n this._amplitudeScale = scale;\n this.drawWaveformLayer();\n if (this._segmentsLayer) {\n this._segmentsLayer.draw();\n }\n};\nWaveformView.prototype.getAmplitudeScale = function () {\n return this._amplitudeScale;\n};\nWaveformView.prototype.enableSeek = function (enable) {\n this._enableSeek = enable;\n};\nWaveformView.prototype.isSeekEnabled = function () {\n return this._enableSeek;\n};\nWaveformView.prototype._onClick = function (event) {\n this._clickHandler(event, 'click');\n};\nWaveformView.prototype._onDblClick = function (event) {\n this._clickHandler(event, 'dblclick');\n};\nWaveformView.prototype._onContextMenu = function (event) {\n this._clickHandler(event, 'contextmenu');\n};\nWaveformView.prototype._clickHandler = function (event, eventName) {\n var emitViewEvent = true;\n if (event.target !== this._stage) {\n var marker = getMarkerObject(event.target);\n if (marker) {\n if (marker.attrs.name === 'point-marker') {\n var point = marker.getAttr('point');\n if (point) {\n this._peaks.emit('points.' + eventName, {\n point: point,\n evt: event.evt,\n preventViewEvent: function preventViewEvent() {\n emitViewEvent = false;\n }\n });\n }\n } else if (marker.attrs.name === 'segment-overlay') {\n var segment = marker.getAttr('segment');\n if (segment) {\n var clickEvent = {\n segment: segment,\n evt: event.evt,\n preventViewEvent: function preventViewEvent() {\n emitViewEvent = false;\n }\n };\n if (this._segmentsLayer) {\n this._segmentsLayer.segmentClicked(eventName, clickEvent);\n }\n }\n }\n }\n }\n if (emitViewEvent) {\n var mousePosX = event.evt.layerX;\n var time = this.pixelOffsetToTime(mousePosX);\n var viewName = this.getName();\n this._peaks.emit(viewName + '.' + eventName, {\n time: time,\n evt: event.evt\n });\n }\n};\nWaveformView.prototype.updatePlayheadTime = function (time) {\n this._playheadLayer.updatePlayheadTime(time);\n};\nWaveformView.prototype.playheadPosChanged = function (time) {\n if (this._playedWaveformShape) {\n this._playedSegment.endTime = time;\n this._unplayedSegment.startTime = time;\n this.drawWaveformLayer();\n }\n};\nWaveformView.prototype.drawWaveformLayer = function () {\n this._waveformLayer.draw();\n};\nWaveformView.prototype.enableMarkerEditing = function (enable) {\n if (this._segmentsLayer) {\n this._segmentsLayer.enableEditing(enable);\n }\n if (this._pointsLayer) {\n this._pointsLayer.enableEditing(enable);\n }\n};\nWaveformView.prototype.fitToContainer = function () {\n if (this._container.clientWidth === 0 && this._container.clientHeight === 0) {\n return;\n }\n var updateWaveform = false;\n if (this._container.clientWidth !== this._width) {\n this._width = this._container.clientWidth;\n this._stage.setWidth(this._width);\n updateWaveform = this.containerWidthChange();\n }\n if (this._container.clientHeight !== this._height) {\n this._height = this._container.clientHeight;\n this._stage.height(this._height);\n this._waveformShape.fitToView();\n this._playheadLayer.fitToView();\n if (this._segmentsLayer) {\n this._segmentsLayer.fitToView();\n }\n if (this._pointsLayer) {\n this._pointsLayer.fitToView();\n }\n this.containerHeightChange();\n }\n if (updateWaveform) {\n this.updateWaveform(this._frameOffset);\n }\n};\nWaveformView.prototype.destroy = function () {\n this._playheadLayer.destroy();\n if (this._segmentsLayer) {\n this._segmentsLayer.destroy();\n }\n if (this._pointsLayer) {\n this._pointsLayer.destroy();\n }\n if (this._stage) {\n this._stage.destroy();\n this._stage = null;\n }\n};\n\n/**\n * @file\n *\n * Defines the {@link MouseDragHandler} class.\n *\n * @module mouse-drag-handler\n */\n\n\n/**\n * An object to receive callbacks on mouse drag events. Each function is\n * called with the current mouse X position, relative to the stage's\n * container HTML element.\n *\n * @typedef {Object} MouseDragHandlers\n * @global\n * @property {Function} onMouseDown Mouse down event handler.\n * @property {Function} onMouseMove Mouse move event handler.\n * @property {Function} onMouseUp Mouse up event handler.\n */\n\n/**\n * Creates a handler for mouse events to allow interaction with the waveform\n * views by clicking and dragging the mouse.\n *\n * @class\n * @alias MouseDragHandler\n *\n * @param {Konva.Stage} stage\n * @param {MouseDragHandlers} handlers\n */\n\nfunction MouseDragHandler(stage, handlers) {\n this._stage = stage;\n this._handlers = handlers;\n this._dragging = false;\n this._mouseDown = this._mouseDown.bind(this);\n this._mouseUp = this._mouseUp.bind(this);\n this._mouseMove = this._mouseMove.bind(this);\n this._stage.on('mousedown', this._mouseDown);\n this._stage.on('touchstart', this._mouseDown);\n this._lastMouseClientX = null;\n}\n\n/**\n * Mouse down event handler.\n *\n * @param {MouseEvent} event\n */\n\nMouseDragHandler.prototype._mouseDown = function (event) {\n var segment = null;\n if (event.type === 'mousedown' && event.evt.button !== 0) {\n // Mouse drag only applies to the primary mouse button.\n // The secondary button may be used to show a context menu\n // and we don't want to also treat this as a mouse drag operation.\n return;\n }\n var marker = getMarkerObject(event.target);\n if (marker) {\n // Avoid interfering with drag/drop of point and segment markers.\n if (marker.attrs.name === 'point-marker' || marker.attrs.name === 'segment-marker') {\n return;\n }\n\n // Check if we're dragging a segment.\n if (marker.attrs.name === 'segment-overlay') {\n segment = marker;\n }\n }\n this._lastMouseClientX = Math.floor(event.type === 'touchstart' ? event.evt.touches[0].clientX : event.evt.clientX);\n if (this._handlers.onMouseDown) {\n var mouseDownPosX = this._getMousePosX(this._lastMouseClientX);\n this._handlers.onMouseDown(mouseDownPosX, segment);\n }\n\n // Use the window mousemove and mouseup handlers instead of the\n // Konva.Stage ones so that we still receive events if the user moves the\n // mouse outside the stage.\n window.addEventListener('mousemove', this._mouseMove, {\n capture: false,\n passive: true\n });\n window.addEventListener('touchmove', this._mouseMove, {\n capture: false,\n passive: true\n });\n window.addEventListener('mouseup', this._mouseUp, {\n capture: false,\n passive: true\n });\n window.addEventListener('touchend', this._mouseUp, {\n capture: false,\n passive: true\n });\n window.addEventListener('blur', this._mouseUp, {\n capture: false,\n passive: true\n });\n};\n\n/**\n * Mouse move event handler.\n *\n * @param {MouseEvent} event\n */\n\nMouseDragHandler.prototype._mouseMove = function (event) {\n var clientX = Math.floor(event.type === 'touchmove' ? event.changedTouches[0].clientX : event.clientX);\n\n // Don't update on vertical mouse movement.\n if (clientX === this._lastMouseClientX) {\n return;\n }\n this._lastMouseClientX = clientX;\n this._dragging = true;\n if (this._handlers.onMouseMove) {\n var mousePosX = this._getMousePosX(clientX);\n this._handlers.onMouseMove(mousePosX);\n }\n};\n\n/**\n * Mouse up event handler.\n *\n * @param {MouseEvent} event\n */\n\nMouseDragHandler.prototype._mouseUp = function (event) {\n var clientX;\n if (event.type === 'touchend') {\n clientX = Math.floor(event.changedTouches[0].clientX);\n if (event.cancelable) {\n event.preventDefault();\n }\n } else {\n clientX = Math.floor(event.clientX);\n }\n if (this._handlers.onMouseUp) {\n var mousePosX = this._getMousePosX(clientX);\n this._handlers.onMouseUp(mousePosX);\n }\n window.removeEventListener('mousemove', this._mouseMove, {\n capture: false\n });\n window.removeEventListener('touchmove', this._mouseMove, {\n capture: false\n });\n window.removeEventListener('mouseup', this._mouseUp, {\n capture: false\n });\n window.removeEventListener('touchend', this._mouseUp, {\n capture: false\n });\n window.removeEventListener('blur', this._mouseUp, {\n capture: false\n });\n this._dragging = false;\n};\n\n/**\n * @returns {Number} The mouse X position, relative to the container that\n * received the mouse down event.\n *\n * @private\n * @param {Number} clientX Mouse client X position.\n */\n\nMouseDragHandler.prototype._getMousePosX = function (clientX) {\n var containerPos = this._stage.getContainer().getBoundingClientRect();\n return clientX - containerPos.left;\n};\n\n/**\n * Returns <code>true</code> if the mouse is being dragged, i.e., moved with\n * the mouse button held down.\n *\n * @returns {Boolean}\n */\n\nMouseDragHandler.prototype.isDragging = function () {\n return this._dragging;\n};\nMouseDragHandler.prototype.destroy = function () {\n this._stage.off('mousedown', this._mouseDown);\n this._stage.off('touchstart', this._mouseDown);\n};\n\n/**\n * @file\n *\n * Defines the {@link SeekMouseDragHandler} class.\n *\n * @module seek-mouse-drag-handler\n */\n\n\n/**\n * Creates a handler for mouse events to allow seeking the waveform\n * views by clicking and dragging the mouse.\n *\n * @class\n * @alias SeekMouseDragHandler\n *\n * @param {Peaks} peaks\n * @param {WaveformOverview} view\n */\n\nfunction SeekMouseDragHandler(peaks, view) {\n this._peaks = peaks;\n this._view = view;\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._mouseDragHandler = new MouseDragHandler(view._stage, {\n onMouseDown: this._onMouseDown,\n onMouseMove: this._onMouseMove\n });\n}\nSeekMouseDragHandler.prototype._onMouseDown = function (mousePosX) {\n this._seek(mousePosX);\n};\nSeekMouseDragHandler.prototype._onMouseMove = function (mousePosX) {\n this._seek(mousePosX);\n};\nSeekMouseDragHandler.prototype._seek = function (mousePosX) {\n if (!this._view.isSeekEnabled()) {\n return;\n }\n mousePosX = clamp(mousePosX, 0, this._width);\n var time = this._view.pixelsToTime(mousePosX);\n var duration = this._peaks.player.getDuration();\n\n // Prevent the playhead position from jumping by limiting click\n // handling to the waveform duration.\n if (time > duration) {\n time = duration;\n }\n\n // Update the playhead position. This gives a smoother visual update\n // than if we only use the player.timeupdate event.\n this._view.updatePlayheadTime(time);\n this._peaks.player.seek(time);\n};\nSeekMouseDragHandler.prototype.destroy = function () {\n this._mouseDragHandler.destroy();\n};\n\n/**\n * @file\n *\n * Defines the {@link WaveformOverview} class.\n *\n * @module waveform-overview\n */\n\n\n/**\n * Creates the overview waveform view.\n *\n * @class\n * @alias WaveformOverview\n *\n * @param {WaveformData} waveformData\n * @param {HTMLElement} container\n * @param {Peaks} peaks\n */\n\nfunction WaveformOverview(waveformData, container, peaks) {\n var self = this;\n WaveformView.call(self, waveformData, container, peaks, peaks.options.overview);\n\n // Bind event handlers\n self._onTimeUpdate = self._onTimeUpdate.bind(self);\n self._onPlaying = self._onPlaying.bind(self);\n self._onPause = self._onPause.bind(self);\n self._onZoomviewDisplaying = self._onZoomviewDisplaying.bind(self);\n\n // Register event handlers\n peaks.on('player.timeupdate', self._onTimeUpdate);\n peaks.on('player.playing', self._onPlaying);\n peaks.on('player.pause', self._onPause);\n peaks.on('zoomview.displaying', self._onZoomviewDisplaying);\n var time = self._peaks.player.getCurrentTime();\n self._playheadLayer.updatePlayheadTime(time);\n self._mouseDragHandler = new SeekMouseDragHandler(peaks, self);\n}\nWaveformOverview.prototype = Object.create(WaveformView.prototype);\nWaveformOverview.prototype.initWaveform = function () {\n if (this._width !== 0) {\n this._resampleAndSetWaveformData(this._originalWaveformData, this._width);\n }\n};\nWaveformOverview.prototype.initHighlightLayer = function () {\n this._highlightLayer = new HighlightLayer(this, this._viewOptions);\n this._highlightLayer.addToStage(this._stage);\n};\nWaveformOverview.prototype.isSegmentDraggingEnabled = function () {\n return false;\n};\nWaveformOverview.prototype.getName = function () {\n return 'overview';\n};\nWaveformOverview.prototype._onTimeUpdate = function (time) {\n this._playheadLayer.updatePlayheadTime(time);\n};\nWaveformOverview.prototype._onPlaying = function (time) {\n this._playheadLayer.updatePlayheadTime(time);\n};\nWaveformOverview.prototype._onPause = function (time) {\n this._playheadLayer.stop(time);\n};\nWaveformOverview.prototype._onZoomviewDisplaying = function (startTime, endTime) {\n this.showHighlight(startTime, endTime);\n};\nWaveformOverview.prototype.showHighlight = function (startTime, endTime) {\n this._highlightLayer.showHighlight(startTime, endTime);\n};\nWaveformOverview.prototype.setWaveformData = function (waveformData) {\n this._originalWaveformData = waveformData;\n if (this._width !== 0) {\n this._resampleAndSetWaveformData(waveformData, this._width);\n } else {\n this._data = waveformData;\n }\n this.updateWaveform();\n};\nWaveformOverview.prototype._resampleAndSetWaveformData = function (waveformData, width) {\n try {\n this._data = waveformData.resample({\n width: width\n });\n return true;\n } catch (error) {\n // This error usually indicates that the waveform length\n // is less than the container width. Ignore, and use the\n // given waveform data\n this._data = waveformData;\n return false;\n }\n};\nWaveformOverview.prototype.removeHighlightRect = function () {\n this._highlightLayer.removeHighlight();\n};\nWaveformOverview.prototype.updateWaveform = function () {\n this._waveformLayer.draw();\n this._axisLayer.draw();\n var playheadTime = this._peaks.player.getCurrentTime();\n this._playheadLayer.updatePlayheadTime(playheadTime);\n this._highlightLayer.updateHighlight();\n var frameStartTime = 0;\n var frameEndTime = this.pixelsToTime(this._width);\n if (this._pointsLayer) {\n this._pointsLayer.updatePoints(frameStartTime, frameEndTime);\n }\n if (this._segmentsLayer) {\n this._segmentsLayer.updateSegments(frameStartTime, frameEndTime);\n }\n};\nWaveformOverview.prototype.containerWidthChange = function () {\n return this._resampleAndSetWaveformData(this._originalWaveformData, this._width);\n};\nWaveformOverview.prototype.containerHeightChange = function () {\n this._highlightLayer.fitToView();\n};\nWaveformOverview.prototype.destroy = function () {\n // Unregister event handlers\n this._peaks.off('player.playing', this._onPlaying);\n this._peaks.off('player.pause', this._onPause);\n this._peaks.off('player.timeupdate', this._onTimeUpdate);\n this._peaks.off('zoomview.displaying', this._onZoomviewDisplaying);\n this._mouseDragHandler.destroy();\n WaveformView.prototype.destroy.call(this);\n};\n\n/**\n * @file\n *\n * Defines the {@link InsertSegmentMouseDragHandler} class.\n *\n * @module insert-segment-mouse-drag-handler\n */\n\n\n/**\n * Creates a handler for mouse events to allow inserting new waveform\n * segments by clicking and dragging the mouse.\n *\n * @class\n * @alias InsertSegmentMouseDragHandler\n *\n * @param {Peaks} peaks\n * @param {WaveformZoomView} view\n */\n\nfunction InsertSegmentMouseDragHandler(peaks, view) {\n this._peaks = peaks;\n this._view = view;\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n this._mouseDragHandler = new MouseDragHandler(view._stage, {\n onMouseDown: this._onMouseDown,\n onMouseMove: this._onMouseMove,\n onMouseUp: this._onMouseUp\n });\n}\nInsertSegmentMouseDragHandler.prototype.isDragging = function () {\n return this._mouseDragHandler.isDragging();\n};\nInsertSegmentMouseDragHandler.prototype._reset = function () {\n this._insertSegment = null;\n this._insertSegmentShape = null;\n this._segmentIsDraggable = false;\n this._peaks.segments.setInserting(false);\n};\nInsertSegmentMouseDragHandler.prototype._onMouseDown = function (mousePosX, segment) {\n this._reset();\n this._segment = segment;\n if (this._segment) {\n if (this._view.getSegmentDragMode() !== 'overlap') {\n return;\n } else {\n // The user has clicked within a segment. We want to prevent\n // the segment from being dragged while the user inserts a new\n // segment. So we temporarily make the segment non-draggable,\n // and restore its draggable state in onMouseUp().\n this._segmentIsDraggable = this._segment.draggable();\n this._segment.draggable(false);\n }\n }\n var time = this._view.pixelsToTime(mousePosX + this._view.getFrameOffset());\n this._peaks.segments.setInserting(true);\n this._insertSegment = this._peaks.segments.add({\n startTime: time,\n endTime: time,\n editable: true\n });\n this._insertSegmentShape = this._view._segmentsLayer.getSegmentShape(this._insertSegment);\n if (this._insertSegmentShape) {\n this._insertSegmentShape.moveMarkersToTop();\n this._insertSegmentShape.startDrag();\n }\n};\nInsertSegmentMouseDragHandler.prototype._onMouseMove = function () {};\nInsertSegmentMouseDragHandler.prototype._onMouseUp = function () {\n if (!this._insertSegment) {\n return;\n }\n if (this._insertSegmentShape) {\n this._insertSegmentShape.stopDrag();\n this._insertSegmentShape = null;\n }\n\n // If the user was dragging within an existing segment,\n // restore the segment's original draggable state.\n if (this._segment && this._segmentIsDraggable) {\n this._segment.draggable(true);\n }\n this._peaks.emit('segments.insert', {\n segment: this._insertSegment\n });\n this._peaks.segments.setInserting(false);\n};\nInsertSegmentMouseDragHandler.prototype.destroy = function () {\n this._mouseDragHandler.destroy();\n};\n\n/**\n * @file\n *\n * Defines the {@link ScrollMouseDragHandler} class.\n *\n * @module scroll-mouse-drag-handler\n */\n\n\n/**\n * Creates a handler for mouse events to allow scrolling the zoomable\n * waveform view by clicking and dragging the mouse.\n *\n * @class\n * @alias ScrollMouseDragHandler\n *\n * @param {Peaks} peaks\n * @param {WaveformZoomView} view\n */\n\nfunction ScrollMouseDragHandler(peaks, view) {\n this._peaks = peaks;\n this._view = view;\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n this._mouseDragHandler = new MouseDragHandler(view._stage, {\n onMouseDown: this._onMouseDown,\n onMouseMove: this._onMouseMove,\n onMouseUp: this._onMouseUp\n });\n}\nScrollMouseDragHandler.prototype.isDragging = function () {\n return this._mouseDragHandler.isDragging();\n};\nScrollMouseDragHandler.prototype._onMouseDown = function (mousePosX, segment) {\n this._seeking = false;\n if (segment && !segment.attrs.draggable) {\n this._segment = null;\n } else {\n this._segment = segment;\n }\n var playheadOffset = this._view.getPlayheadOffset();\n if (this._view.isSeekEnabled() && Math.abs(mousePosX - playheadOffset) <= this._view.getPlayheadClickTolerance()) {\n this._seeking = true;\n\n // The user has clicked near the playhead, and the playhead is within\n // a segment. In this case we want to allow the playhead to move, but\n // prevent the segment from being dragged. So we temporarily make the\n // segment non-draggable, and restore its draggable state in onMouseUp().\n if (this._segment) {\n this._segmentIsDraggable = this._segment.draggable();\n this._segment.draggable(false);\n }\n }\n if (this._seeking) {\n mousePosX = clamp(mousePosX, 0, this._view.getWidth());\n var time = this._view.pixelsToTime(mousePosX + this._view.getFrameOffset());\n this._seek(time);\n } else {\n this._initialFrameOffset = this._view.getFrameOffset();\n this._mouseDownX = mousePosX;\n }\n};\nScrollMouseDragHandler.prototype._onMouseMove = function (mousePosX) {\n // Prevent scrolling the waveform if the user is dragging a segment.\n if (this._segment && !this._seeking) {\n return;\n }\n if (this._seeking) {\n mousePosX = clamp(mousePosX, 0, this._view.getWidth());\n var time = this._view.pixelsToTime(mousePosX + this._view.getFrameOffset());\n this._seek(time);\n } else {\n // TODO: Prevent scrolling when zoomed to fit the waveform to the\n // view width. Sometimes the waveform is a few pixels longer.\n if (!this._view.isAutoZoom()) {\n // Moving the mouse to the left increases the time position of the\n // left-hand edge of the visible waveform.\n var diff = this._mouseDownX - mousePosX;\n var newFrameOffset = this._initialFrameOffset + diff;\n if (newFrameOffset !== this._initialFrameOffset) {\n this._view.updateWaveform(newFrameOffset);\n }\n }\n }\n};\nScrollMouseDragHandler.prototype._onMouseUp = function () {\n if (!this._seeking) {\n // Set playhead position only on click release, when not dragging.\n if (this._view._enableSeek && !this._mouseDragHandler.isDragging()) {\n var time = this._view.pixelOffsetToTime(this._mouseDownX);\n this._seek(time);\n }\n }\n\n // If the user was dragging within an existing segment,\n // restore the segment's original draggable state.\n if (this._segment && this._seeking) {\n if (this._segmentIsDraggable) {\n this._segment.draggable(true);\n }\n }\n};\nScrollMouseDragHandler.prototype._seek = function (time) {\n var duration = this._peaks.player.getDuration();\n\n // Prevent the playhead position from jumping by limiting click\n // handling to the waveform duration.\n if (time > duration) {\n time = duration;\n }\n\n // Update the playhead position. This gives a smoother visual update\n // than if we only use the player.timeupdate event.\n this._view.updatePlayheadTime(time);\n this._peaks.player.seek(time);\n};\nScrollMouseDragHandler.prototype.destroy = function () {\n this._mouseDragHandler.destroy();\n};\n\n/**\n * @file\n *\n * Defines the {@link WaveformZoomView} class.\n *\n * @module waveform-zoomview\n */\n\n\n/**\n * Creates a zoomable waveform view.\n *\n * @class\n * @alias WaveformZoomView\n *\n * @param {WaveformData} waveformData\n * @param {HTMLElement} container\n * @param {Peaks} peaks\n */\n\nfunction WaveformZoomView(waveformData, container, peaks) {\n var self = this;\n WaveformView.call(self, waveformData, container, peaks, peaks.options.zoomview);\n\n // Bind event handlers\n self._onTimeUpdate = self._onTimeUpdate.bind(self);\n self._onPlaying = self._onPlaying.bind(self);\n self._onPause = self._onPause.bind(self);\n self._onKeyboardLeft = self._onKeyboardLeft.bind(self);\n self._onKeyboardRight = self._onKeyboardRight.bind(self);\n self._onKeyboardShiftLeft = self._onKeyboardShiftLeft.bind(self);\n self._onKeyboardShiftRight = self._onKeyboardShiftRight.bind(self);\n\n // Register event handlers\n self._peaks.on('player.timeupdate', self._onTimeUpdate);\n self._peaks.on('player.playing', self._onPlaying);\n self._peaks.on('player.pause', self._onPause);\n self._peaks.on('keyboard.left', self._onKeyboardLeft);\n self._peaks.on('keyboard.right', self._onKeyboardRight);\n self._peaks.on('keyboard.shift_left', self._onKeyboardShiftLeft);\n self._peaks.on('keyboard.shift_right', self._onKeyboardShiftRight);\n self._autoScroll = self._viewOptions.autoScroll;\n self._autoScrollOffset = self._viewOptions.autoScrollOffset;\n self._enableSegmentDragging = false;\n self._segmentDragMode = 'overlap';\n self._minSegmentDragWidth = 0;\n self._insertSegmentShape = null;\n self._playheadClickTolerance = self._viewOptions.playheadClickTolerance;\n self._zoomLevelAuto = false;\n self._zoomLevelSeconds = null;\n var time = self._peaks.player.getCurrentTime();\n self._syncPlayhead(time);\n self._mouseDragHandler = new ScrollMouseDragHandler(peaks, self);\n self._onWheel = self._onWheel.bind(self);\n self._onWheelCaptureVerticalScroll = self._onWheelCaptureVerticalScroll.bind(self);\n self.setWheelMode(self._viewOptions.wheelMode);\n self._peaks.emit('zoomview.displaying', 0, self.getEndTime());\n}\nWaveformZoomView.prototype = Object.create(WaveformView.prototype);\nWaveformZoomView.prototype.initWaveform = function () {\n this._enableWaveformCache = this._options.waveformCache;\n this._initWaveformCache();\n var initialZoomLevel = this._peaks.zoom.getZoomLevel();\n this._resampleData({\n scale: initialZoomLevel\n });\n};\nWaveformZoomView.prototype._initWaveformCache = function () {\n if (this._enableWaveformCache) {\n this._waveformData = new Map();\n this._waveformData.set(this._originalWaveformData.scale, this._originalWaveformData);\n this._waveformScales = [this._originalWaveformData.scale];\n }\n};\nWaveformZoomView.prototype.initHighlightLayer = function () {};\nWaveformZoomView.prototype.setWheelMode = function (mode, options) {\n if (!options) {\n options = {};\n }\n if (mode !== this._wheelMode || options.captureVerticalScroll !== this._captureVerticalScroll) {\n this._stage.off('wheel');\n this._wheelMode = mode;\n this._captureVerticalScroll = options.captureVerticalScroll;\n switch (mode) {\n case 'scroll':\n if (options.captureVerticalScroll) {\n this._stage.on('wheel', this._onWheelCaptureVerticalScroll);\n } else {\n this._stage.on('wheel', this._onWheel);\n }\n break;\n }\n }\n};\nWaveformZoomView.prototype._onWheel = function (event) {\n var wheelEvent = event.evt;\n var delta;\n if (wheelEvent.shiftKey) {\n if (wheelEvent.deltaY !== 0) {\n delta = wheelEvent.deltaY;\n } else if (wheelEvent.deltaX !== 0) {\n delta = wheelEvent.deltaX;\n } else {\n return;\n }\n } else {\n // Ignore the event if it looks like the user is scrolling vertically\n // down the page\n if (Math.abs(wheelEvent.deltaX) < Math.abs(wheelEvent.deltaY)) {\n return;\n }\n delta = wheelEvent.deltaX;\n }\n if (wheelEvent.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n delta *= this._width;\n }\n wheelEvent.preventDefault();\n var newFrameOffset = clamp(this._frameOffset + Math.floor(delta), 0, this._pixelLength - this._width);\n this.updateWaveform(newFrameOffset);\n};\nWaveformZoomView.prototype._onWheelCaptureVerticalScroll = function (event) {\n var wheelEvent = event.evt;\n var delta = Math.abs(wheelEvent.deltaX) < Math.abs(wheelEvent.deltaY) ? wheelEvent.deltaY : wheelEvent.deltaX;\n wheelEvent.preventDefault();\n var newFrameOffset = clamp(this._frameOffset + Math.floor(delta), 0, this._pixelLength - this._width);\n this.updateWaveform(newFrameOffset);\n};\nWaveformZoomView.prototype.setWaveformDragMode = function (mode) {\n if (this._viewOptions.enableSegments) {\n this._mouseDragHandler.destroy();\n if (mode === 'insert-segment') {\n this._mouseDragHandler = new InsertSegmentMouseDragHandler(this._peaks, this);\n } else {\n this._mouseDragHandler = new ScrollMouseDragHandler(this._peaks, this);\n }\n }\n};\nWaveformZoomView.prototype.enableSegmentDragging = function (enable) {\n this._enableSegmentDragging = enable;\n\n // Update all existing segments\n if (this._segmentsLayer) {\n this._segmentsLayer.enableSegmentDragging(enable);\n }\n};\nWaveformZoomView.prototype.isSegmentDraggingEnabled = function () {\n return this._enableSegmentDragging;\n};\nWaveformZoomView.prototype.setSegmentDragMode = function (mode) {\n this._segmentDragMode = mode;\n};\nWaveformZoomView.prototype.getSegmentDragMode = function () {\n return this._segmentDragMode;\n};\nWaveformZoomView.prototype.getName = function () {\n return 'zoomview';\n};\nWaveformZoomView.prototype._onTimeUpdate = function (time) {\n if (this._mouseDragHandler.isDragging()) {\n return;\n }\n this._syncPlayhead(time);\n};\nWaveformZoomView.prototype._onPlaying = function (time) {\n this._playheadLayer.updatePlayheadTime(time);\n};\nWaveformZoomView.prototype._onPause = function (time) {\n this._playheadLayer.stop(time);\n};\nWaveformZoomView.prototype._onKeyboardLeft = function () {\n this._keyboardScroll(-1, false);\n};\nWaveformZoomView.prototype._onKeyboardRight = function () {\n this._keyboardScroll(1, false);\n};\nWaveformZoomView.prototype._onKeyboardShiftLeft = function () {\n this._keyboardScroll(-1, true);\n};\nWaveformZoomView.prototype._onKeyboardShiftRight = function () {\n this._keyboardScroll(1, true);\n};\nWaveformZoomView.prototype._keyboardScroll = function (direction, large) {\n var increment;\n if (large) {\n increment = direction * this._width;\n } else {\n increment = direction * this.timeToPixels(this._options.nudgeIncrement);\n }\n this.scrollWaveform({\n pixels: increment\n });\n};\nWaveformZoomView.prototype.setWaveformData = function (waveformData) {\n this._originalWaveformData = waveformData;\n // Clear cached waveforms\n this._initWaveformCache();\n\n // Don't update the UI here, call setZoom().\n};\n\n/**\n * Returns the position of the playhead marker, in pixels relative to the\n * left hand side of the waveform view.\n *\n * @return {Number}\n */\n\nWaveformZoomView.prototype.getPlayheadOffset = function () {\n return this._playheadLayer.getPlayheadPixel() - this._frameOffset;\n};\nWaveformZoomView.prototype.getPlayheadClickTolerance = function () {\n return this._playheadClickTolerance;\n};\nWaveformZoomView.prototype._syncPlayhead = function (time) {\n this._playheadLayer.updatePlayheadTime(time);\n if (this._autoScroll && !this._zoomLevelAuto) {\n // Check for the playhead reaching the right-hand side of the window.\n\n var pixelIndex = this.timeToPixels(time);\n\n // TODO: move this code to animation function?\n // TODO: don't scroll if user has positioned view manually (e.g., using\n // the keyboard)\n var endThreshold = this._frameOffset + this._width - this._autoScrollOffset;\n if (pixelIndex >= endThreshold || pixelIndex < this._frameOffset) {\n // Put the playhead at 100 pixels from the left edge\n this._frameOffset = pixelIndex - this._autoScrollOffset;\n if (this._frameOffset < 0) {\n this._frameOffset = 0;\n }\n this.updateWaveform(this._frameOffset);\n }\n }\n};\nWaveformZoomView.prototype._getScale = function (duration) {\n return Math.floor(duration * this._data.sample_rate / this._width);\n};\nfunction isAutoScale(options) {\n return objectHasProperty(options, 'scale') && options.scale === 'auto' || objectHasProperty(options, 'seconds') && options.seconds === 'auto';\n}\n\n/**\n * Options for [WaveformZoomView.setZoom]{@link WaveformZoomView#setZoom}.\n *\n * @typedef {Object} SetZoomOptions\n * @global\n * @property {Number|String} scale Zoom level, in samples per pixel, or 'auto'\n * to fit the entire waveform to the view width\n * @property {Number|String} seconds Number of seconds to fit to the view width,\n * or 'auto' to fit the entire waveform to the view width\n */\n\n/**\n * Changes the zoom level.\n *\n * @param {SetZoomOptions} options\n * @returns {Boolean}\n */\n\nWaveformZoomView.prototype.setZoom = function (options) {\n var scale;\n if (isAutoScale(options)) {\n // Use waveform duration, to match WaveformOverview\n var seconds = this._originalWaveformData.duration;\n this._zoomLevelAuto = true;\n this._zoomLevelSeconds = null;\n scale = this._getScale(seconds);\n } else {\n if (objectHasProperty(options, 'scale')) {\n this._zoomLevelSeconds = null;\n scale = Math.floor(options.scale);\n } else if (objectHasProperty(options, 'seconds')) {\n if (!isValidTime(options.seconds)) {\n return false;\n }\n this._zoomLevelSeconds = options.seconds;\n scale = this._getScale(options.seconds);\n }\n this._zoomLevelAuto = false;\n }\n if (scale < this._originalWaveformData.scale) {\n // eslint-disable-next-line max-len\n this._peaks._logger('peaks.zoomview.setZoom(): zoom level must be at least ' + this._originalWaveformData.scale);\n scale = this._originalWaveformData.scale;\n }\n var currentTime = this._peaks.player.getCurrentTime();\n var apexTime;\n var playheadOffsetPixels = this.getPlayheadOffset();\n if (playheadOffsetPixels >= 0 && playheadOffsetPixels < this._width) {\n // Playhead is visible. Change the zoom level while keeping the\n // playhead at the same position in the window.\n apexTime = currentTime;\n } else {\n // Playhead is not visible. Change the zoom level while keeping the\n // centre of the window at the same position in the waveform.\n playheadOffsetPixels = Math.floor(this._width / 2);\n apexTime = this.pixelOffsetToTime(playheadOffsetPixels);\n }\n var prevScale = this._scale;\n this._resampleData({\n scale: scale\n });\n var apexPixel = this.timeToPixels(apexTime);\n this._frameOffset = apexPixel - playheadOffsetPixels;\n this.updateWaveform(this._frameOffset);\n this._playheadLayer.zoomLevelChanged();\n\n // Update the playhead position after zooming.\n this._playheadLayer.updatePlayheadTime(currentTime);\n this._peaks.emit('zoom.update', {\n currentZoom: scale,\n previousZoom: prevScale\n });\n return true;\n};\nWaveformZoomView.prototype._resampleData = function (options) {\n var scale = options.scale;\n if (this._enableWaveformCache) {\n if (!this._waveformData.has(scale)) {\n var sourceWaveform = this._originalWaveformData;\n\n // Resample from the next lowest available zoom level\n\n for (var i = 0; i < this._waveformScales.length; i++) {\n if (this._waveformScales[i] < scale) {\n sourceWaveform = this._waveformData.get(this._waveformScales[i]);\n } else {\n break;\n }\n }\n this._waveformData.set(scale, sourceWaveform.resample(options));\n this._waveformScales.push(scale);\n this._waveformScales.sort(function (a, b) {\n return a - b; // Ascending order\n });\n }\n this._data = this._waveformData.get(scale);\n } else {\n this._data = this._originalWaveformData.resample(options);\n }\n this._scale = this._data.scale;\n this._pixelLength = this._data.length;\n};\nWaveformZoomView.prototype.isAutoZoom = function () {\n return this._zoomLevelAuto;\n};\nWaveformZoomView.prototype.setStartTime = function (time) {\n if (time < 0) {\n time = 0;\n }\n if (this._zoomLevelAuto) {\n time = 0;\n }\n this.updateWaveform(this.timeToPixels(time));\n};\n\n/**\n * @returns {Number} The length of the waveform, in pixels.\n */\n\nWaveformZoomView.prototype.getPixelLength = function () {\n return this._pixelLength;\n};\n\n/**\n * Scrolls the region of waveform shown in the view.\n *\n * @param {Number} scrollAmount How far to scroll, in pixels\n */\n\nWaveformZoomView.prototype.scrollWaveform = function (options) {\n var scrollAmount;\n if (objectHasProperty(options, 'pixels')) {\n scrollAmount = Math.floor(options.pixels);\n } else if (objectHasProperty(options, 'seconds')) {\n scrollAmount = this.timeToPixels(options.seconds);\n } else {\n throw new TypeError('view.scrollWaveform(): Missing umber of pixels or seconds');\n }\n this.updateWaveform(this._frameOffset + scrollAmount);\n};\n\n/**\n * Updates the region of waveform shown in the view.\n *\n * @param {Number} frameOffset The new frame offset, in pixels.\n */\n\nWaveformZoomView.prototype.updateWaveform = function (frameOffset) {\n var upperLimit;\n if (this._pixelLength < this._width) {\n // Total waveform is shorter than viewport, so reset the offset to 0.\n frameOffset = 0;\n upperLimit = this._width;\n } else {\n // Calculate the very last possible position.\n upperLimit = this._pixelLength - this._width;\n }\n frameOffset = clamp(frameOffset, 0, upperLimit);\n this._frameOffset = frameOffset;\n\n // Display playhead if it is within the zoom frame width.\n var playheadPixel = this._playheadLayer.getPlayheadPixel();\n this._playheadLayer.updatePlayheadTime(this.pixelsToTime(playheadPixel));\n this.drawWaveformLayer();\n this._axisLayer.draw();\n var frameStartTime = this.getStartTime();\n var frameEndTime = this.getEndTime();\n if (this._pointsLayer) {\n this._pointsLayer.updatePoints(frameStartTime, frameEndTime);\n }\n if (this._segmentsLayer) {\n this._segmentsLayer.updateSegments(frameStartTime, frameEndTime);\n }\n this._peaks.emit('zoomview.displaying', frameStartTime, frameEndTime);\n};\nWaveformZoomView.prototype.enableAutoScroll = function (enable, options) {\n if (!options) {\n options = {};\n }\n this._autoScroll = enable;\n if (objectHasProperty(options, 'offset')) {\n this._autoScrollOffset = options.offset;\n }\n};\nWaveformZoomView.prototype.getMinSegmentDragWidth = function () {\n return this._insertSegmentShape ? 0 : this._minSegmentDragWidth;\n};\nWaveformZoomView.prototype.setMinSegmentDragWidth = function (width) {\n this._minSegmentDragWidth = width;\n};\nWaveformZoomView.prototype.containerWidthChange = function () {\n var updateWaveform = false;\n var resample = false;\n var resampleOptions;\n if (this._zoomLevelAuto) {\n resample = true;\n resampleOptions = {\n width: this._width\n };\n } else if (this._zoomLevelSeconds !== null) {\n resample = true;\n resampleOptions = {\n scale: this._getScale(this._zoomLevelSeconds)\n };\n }\n if (resample) {\n try {\n this._resampleData(resampleOptions);\n updateWaveform = true;\n } catch (error) {\n // Ignore, and leave this._data as it was\n }\n }\n return updateWaveform;\n};\nWaveformZoomView.prototype.containerHeightChange = function () {\n // Nothing\n};\nWaveformZoomView.prototype.getStage = function () {\n return this._stage;\n};\nWaveformZoomView.prototype.getSegmentsLayer = function () {\n return this._segmentsLayer;\n};\nWaveformZoomView.prototype.destroy = function () {\n // Unregister event handlers\n this._peaks.off('player.playing', this._onPlaying);\n this._peaks.off('player.pause', this._onPause);\n this._peaks.off('player.timeupdate', this._onTimeUpdate);\n this._peaks.off('keyboard.left', this._onKeyboardLeft);\n this._peaks.off('keyboard.right', this._onKeyboardRight);\n this._peaks.off('keyboard.shift_left', this._onKeyboardShiftLeft);\n this._peaks.off('keyboard.shift_right', this._onKeyboardShiftRight);\n this._mouseDragHandler.destroy();\n WaveformView.prototype.destroy.call(this);\n};\n\n/**\n * @file\n *\n * Defines the {@link Scrollbar} class.\n *\n * @module scrollbar\n */\n\n\n/**\n * Creates a scrollbar.\n *\n * @class\n * @alias Scrollbar\n *\n * @param {WaveformData} waveformData\n * @param {HTMLElement} container\n * @param {Peaks} peaks\n */\n\nfunction Scrollbar(waveformData, container, peaks) {\n this._waveformData = waveformData;\n this._container = container;\n this._peaks = peaks;\n this._options = peaks.options.scrollbar;\n this._zoomview = peaks.views.getView('zoomview');\n this._dragBoundFunc = this._dragBoundFunc.bind(this);\n this._onScrollboxDragStart = this._onScrollboxDragStart.bind(this);\n this._onScrollboxDragMove = this._onScrollboxDragMove.bind(this);\n this._onScrollboxDragEnd = this._onScrollboxDragEnd.bind(this);\n this._onZoomviewDisplaying = this._onZoomviewDisplaying.bind(this);\n this._onScrollbarClick = this._onScrollbarClick.bind(this);\n peaks.on('zoomview.displaying', this._onZoomviewDisplaying);\n this._width = container.clientWidth;\n this._height = container.clientHeight;\n this._stage = new Konva.Stage({\n container: container,\n width: this._width,\n height: this._height\n });\n this._layer = new Konva.Layer();\n this._stage.on('click', this._onScrollbarClick);\n this._stage.add(this._layer);\n this._color = this._options.color;\n this._scrollboxX = 0;\n this._minScrollboxWidth = this._options.minWidth;\n this._offsetY = 0;\n this._scrollbox = new Konva.Group({\n draggable: true,\n dragBoundFunc: this._dragBoundFunc\n });\n this._scrollboxRect = new Rect({\n x: this._scrollboxX,\n y: this._offsetY,\n width: 0,\n height: this._height,\n fill: this._color\n });\n this._scrollbox.add(this._scrollboxRect);\n this._setScrollboxWidth();\n this._scrollbox.on('dragstart', this._onScrollboxDragStart);\n this._scrollbox.on('dragmove', this._onScrollboxDragMove);\n this._scrollbox.on('dragend', this._onScrollboxDragEnd);\n this._layer.add(this._scrollbox);\n this._layer.draw();\n}\nScrollbar.prototype.setZoomview = function (zoomview) {\n this._zoomview = zoomview;\n this._updateScrollbarWidthAndPosition();\n};\n\n/**\n * Sets the width of the scrollbox, based on the visible waveform region\n * in the zoomview and minimum scrollbox width option.\n */\n\nScrollbar.prototype._setScrollboxWidth = function () {\n if (this._zoomview) {\n this._scrollboxWidth = Math.floor(this._width * this._zoomview.pixelsToTime(this._zoomview.getWidth()) / this._peaks.player.getDuration());\n if (this._scrollboxWidth < this._minScrollboxWidth) {\n this._scrollboxWidth = this._minScrollboxWidth;\n }\n } else {\n this._scrollboxWidth = this._width;\n }\n this._scrollboxRect.width(this._scrollboxWidth);\n};\n\n/**\n * @returns {Number} The maximum scrollbox position, in pixels.\n */\n\nScrollbar.prototype._getScrollbarRange = function () {\n return this._width - this._scrollboxWidth;\n};\nScrollbar.prototype._dragBoundFunc = function (pos) {\n // Allow the scrollbar to be moved horizontally but not vertically.\n return {\n x: pos.x,\n y: 0\n };\n};\nScrollbar.prototype._onScrollboxDragStart = function () {\n this._dragging = true;\n};\nScrollbar.prototype._onScrollboxDragEnd = function () {\n this._dragging = false;\n};\nScrollbar.prototype._onScrollboxDragMove = function () {\n var range = this._getScrollbarRange();\n var x = clamp(this._scrollbox.x(), 0, range);\n this._scrollbox.x(x);\n if (x !== this._scrollboxX) {\n this._scrollboxX = x;\n if (this._zoomview) {\n this._updateWaveform(x);\n }\n }\n};\nScrollbar.prototype._onZoomviewDisplaying = function /* startTime , endTime */\n() {\n if (!this._dragging) {\n this._updateScrollbarWidthAndPosition();\n }\n};\nScrollbar.prototype._updateScrollbarWidthAndPosition = function () {\n this._setScrollboxWidth();\n if (this._zoomview) {\n var startTime = this._zoomview.getStartTime();\n var zoomviewRange = this._zoomview.getPixelLength() - this._zoomview.getWidth();\n var scrollBoxPos = Math.floor(this._zoomview.timeToPixels(startTime) * this._getScrollbarRange() / zoomviewRange);\n this._scrollbox.x(scrollBoxPos);\n this._layer.draw();\n }\n};\nScrollbar.prototype._onScrollbarClick = function (event) {\n // Handle clicks on the scrollbar outside the scrollbox.\n if (event.target === this._stage) {\n if (this._zoomview) {\n // Centre the scrollbox where the user clicked.\n var x = Math.floor(event.evt.layerX - this._scrollboxWidth / 2);\n if (x < 0) {\n x = 0;\n }\n this._updateWaveform(x);\n }\n }\n};\n\n/**\n * Sets the zoomview waveform position based on scrollbar position.\n */\n\nScrollbar.prototype._updateWaveform = function (x) {\n var offset = Math.floor((this._zoomview.getPixelLength() - this._zoomview.getWidth()) * x / this._getScrollbarRange());\n this._zoomview.updateWaveform(offset);\n};\nScrollbar.prototype.fitToContainer = function () {\n if (this._container.clientWidth === 0 && this._container.clientHeight === 0) {\n return;\n }\n if (this._container.clientWidth !== this._width) {\n this._width = this._container.clientWidth;\n this._stage.width(this._width);\n this._updateScrollbarWidthAndPosition();\n }\n this._height = this._container.clientHeight;\n this._stage.height(this._height);\n};\nScrollbar.prototype.destroy = function () {\n this._layer.destroy();\n this._stage.destroy();\n this._stage = null;\n};\n\n/**\n * @file\n *\n * Defines the {@link ViewController} class.\n *\n * @module view-controller\n */\n\n\n/**\n * Creates an object that allows users to create and manage waveform views.\n *\n * @class\n * @alias ViewController\n *\n * @param {Peaks} peaks\n */\n\nfunction ViewController(peaks) {\n this._peaks = peaks;\n this._overview = null;\n this._zoomview = null;\n this._scrollbar = null;\n}\nViewController.prototype.createOverview = function (container) {\n if (this._overview) {\n return this._overview;\n }\n var waveformData = this._peaks.getWaveformData();\n this._overview = new WaveformOverview(waveformData, container, this._peaks);\n if (this._zoomview) {\n this._overview.showHighlight(this._zoomview.getStartTime(), this._zoomview.getEndTime());\n }\n return this._overview;\n};\nViewController.prototype.createZoomview = function (container) {\n if (this._zoomview) {\n return this._zoomview;\n }\n var waveformData = this._peaks.getWaveformData();\n this._zoomview = new WaveformZoomView(waveformData, container, this._peaks);\n if (this._scrollbar) {\n this._scrollbar.setZoomview(this._zoomview);\n }\n return this._zoomview;\n};\nViewController.prototype.createScrollbar = function (container) {\n var waveformData = this._peaks.getWaveformData();\n this._scrollbar = new Scrollbar(waveformData, container, this._peaks);\n return this._scrollbar;\n};\nViewController.prototype.destroyOverview = function () {\n if (!this._overview) {\n return;\n }\n if (!this._zoomview) {\n return;\n }\n this._overview.destroy();\n this._overview = null;\n};\nViewController.prototype.destroyZoomview = function () {\n if (!this._zoomview) {\n return;\n }\n if (!this._overview) {\n return;\n }\n this._zoomview.destroy();\n this._zoomview = null;\n this._overview.removeHighlightRect();\n};\nViewController.prototype.destroy = function () {\n if (this._overview) {\n this._overview.destroy();\n this._overview = null;\n }\n if (this._zoomview) {\n this._zoomview.destroy();\n this._zoomview = null;\n }\n if (this._scrollbar) {\n this._scrollbar.destroy();\n this._scrollbar = null;\n }\n};\nViewController.prototype.getView = function (name) {\n if (isNullOrUndefined(name)) {\n if (this._overview && this._zoomview) {\n return null;\n } else if (this._overview) {\n return this._overview;\n } else if (this._zoomview) {\n return this._zoomview;\n } else {\n return null;\n }\n } else {\n switch (name) {\n case 'overview':\n return this._overview;\n case 'zoomview':\n return this._zoomview;\n default:\n return null;\n }\n }\n};\nViewController.prototype.getScrollbar = function () {\n return this._scrollbar;\n};\n\n/**\n * @file\n *\n * Defines the {@link ZoomController} class.\n *\n * @module zoom-controller\n */\n\n/**\n * Creates an object to control zoom levels in a {@link WaveformZoomView}.\n *\n * @class\n * @alias ZoomController\n *\n * @param {Peaks} peaks\n * @param {Array<Integer>} zoomLevels\n */\n\nfunction ZoomController(peaks, zoomLevels) {\n this._peaks = peaks;\n this._zoomLevels = zoomLevels;\n this._zoomLevelIndex = 0;\n}\nZoomController.prototype.setZoomLevels = function (zoomLevels) {\n this._zoomLevels = zoomLevels;\n this.setZoom(0, true);\n};\n\n/**\n * Zoom in one level.\n */\n\nZoomController.prototype.zoomIn = function () {\n this.setZoom(this._zoomLevelIndex - 1);\n};\n\n/**\n * Zoom out one level.\n */\n\nZoomController.prototype.zoomOut = function () {\n this.setZoom(this._zoomLevelIndex + 1);\n};\n\n/**\n * Given a particular zoom level, triggers a resampling of the data in the\n * zoomed view.\n *\n * @param {number} zoomLevelIndex An index into the options.zoomLevels array.\n */\n\nZoomController.prototype.setZoom = function (zoomLevelIndex, forceUpdate) {\n if (zoomLevelIndex >= this._zoomLevels.length) {\n zoomLevelIndex = this._zoomLevels.length - 1;\n }\n if (zoomLevelIndex < 0) {\n zoomLevelIndex = 0;\n }\n if (!forceUpdate && zoomLevelIndex === this._zoomLevelIndex) {\n // Nothing to do.\n return;\n }\n this._zoomLevelIndex = zoomLevelIndex;\n var zoomview = this._peaks.views.getView('zoomview');\n if (!zoomview) {\n return;\n }\n zoomview.setZoom({\n scale: this._zoomLevels[zoomLevelIndex]\n });\n};\n\n/**\n * Returns the current zoom level index.\n *\n * @returns {Number}\n */\n\nZoomController.prototype.getZoom = function () {\n return this._zoomLevelIndex;\n};\n\n/**\n * Returns the current zoom level, in samples per pixel.\n *\n * @returns {Number}\n */\n\nZoomController.prototype.getZoomLevel = function () {\n return this._zoomLevels[this._zoomLevelIndex];\n};\n\n/**\n * @file\n *\n * Defines the {@link WaveformBuilder} class.\n *\n * @module waveform-builder\n */\n\nvar isXhr2 = 'withCredentials' in new XMLHttpRequest();\n\n/**\n * Creates and returns a WaveformData object, either by requesting the\n * waveform data from the server, or by creating the waveform data using the\n * Web Audio API.\n *\n * @class\n * @alias WaveformBuilder\n *\n * @param {Peaks} peaks\n */\n\nfunction WaveformBuilder(peaks) {\n this._peaks = peaks;\n}\n\n/**\n * Options for requesting remote waveform data.\n *\n * @typedef {Object} RemoteWaveformDataOptions\n * @global\n * @property {String=} arraybuffer\n * @property {String=} json\n */\n\n/**\n * Options for supplying local waveform data.\n *\n * @typedef {Object} LocalWaveformDataOptions\n * @global\n * @property {ArrayBuffer=} arraybuffer\n * @property {Object=} json\n */\n\n/**\n * Options for the Web Audio waveform builder.\n *\n * @typedef {Object} WaveformBuilderWebAudioOptions\n * @global\n * @property {AudioContext} audioContext\n * @property {AudioBuffer=} audioBuffer\n * @property {Number=} scale\n * @property {Boolean=} multiChannel\n */\n\n/**\n * Options for [WaveformBuilder.init]{@link WaveformBuilder#init}.\n *\n * @typedef {Object} WaveformBuilderInitOptions\n * @global\n * @property {RemoteWaveformDataOptions=} dataUri\n * @property {LocalWaveformDataOptions=} waveformData\n * @property {WaveformBuilderWebAudioOptions=} webAudio\n * @property {Boolean=} withCredentials\n * @property {Array<Number>=} zoomLevels\n */\n\n/**\n * Callback for receiving the waveform data.\n *\n * @callback WaveformBuilderInitCallback\n * @global\n * @param {Error} error\n * @param {WaveformData} waveformData\n */\n\n/**\n * Loads or creates the waveform data.\n *\n * @private\n * @param {WaveformBuilderInitOptions} options\n * @param {WaveformBuilderInitCallback} callback\n */\n\nWaveformBuilder.prototype.init = function (options, callback) {\n if (options.dataUri && (options.webAudio || options.audioContext) || options.waveformData && (options.webAudio || options.audioContext) || options.dataUri && options.waveformData) {\n // eslint-disable-next-line max-len\n callback(new TypeError('Peaks.init(): You may only pass one source (webAudio, dataUri, or waveformData) to render waveform data.'));\n return;\n }\n if (options.audioContext) {\n // eslint-disable-next-line max-len\n this._peaks._logger('Peaks.init(): The audioContext option is deprecated, please pass a webAudio object instead');\n options.webAudio = {\n audioContext: options.audioContext\n };\n }\n if (options.dataUri) {\n return this._getRemoteWaveformData(options, callback);\n } else if (options.waveformData) {\n return this._buildWaveformFromLocalData(options, callback);\n } else if (options.webAudio) {\n if (options.webAudio.audioBuffer) {\n return this._buildWaveformDataFromAudioBuffer(options, callback);\n } else {\n return this._buildWaveformDataUsingWebAudio(options, callback);\n }\n } else {\n // eslint-disable-next-line max-len\n callback(new Error('Peaks.init(): You must pass an audioContext, or dataUri, or waveformData to render waveform data'));\n }\n};\nfunction hasValidContentRangeHeader(xhr) {\n var contentRange = xhr.getResponseHeader('content-range');\n if (!contentRange) {\n return false;\n }\n var matches = contentRange.match(/^bytes (\\d+)-(\\d+)\\/(\\d+)$/);\n if (matches && matches.length === 4) {\n var firstPos = parseInt(matches[1], 10);\n var lastPos = parseInt(matches[2], 10);\n var length = parseInt(matches[3], 10);\n if (firstPos === 0 && lastPos + 1 === length) {\n return true;\n }\n return false;\n }\n return false;\n}\n\n/* eslint-disable max-len */\n\n/**\n * Fetches waveform data, based on the given options.\n *\n * @private\n * @param {Object} options\n * @param {String|Object} options.dataUri\n * @param {String} options.dataUri.arraybuffer Waveform data URL\n * (binary format)\n * @param {String} options.dataUri.json Waveform data URL (JSON format)\n * @param {String} options.defaultUriFormat Either 'arraybuffer' (for binary\n * data) or 'json'\n * @param {WaveformBuilderInitCallback} callback\n *\n * @see Refer to the <a href=\"https://github.com/bbc/audiowaveform/blob/master/doc/DataFormat.md\">data format documentation</a>\n * for details of the binary and JSON waveform data formats.\n */\n\n/* eslint-enable max-len */\n\nWaveformBuilder.prototype._getRemoteWaveformData = function (options, callback) {\n var self = this;\n var dataUri = null;\n var requestType = null;\n var url;\n if (isObject(options.dataUri)) {\n dataUri = options.dataUri;\n } else {\n callback(new TypeError('Peaks.init(): The dataUri option must be an object'));\n return;\n }\n ['ArrayBuffer', 'JSON'].some(function (connector) {\n if (window[connector]) {\n requestType = connector.toLowerCase();\n url = dataUri[requestType];\n return Boolean(url);\n }\n });\n if (!url) {\n // eslint-disable-next-line max-len\n callback(new Error('Peaks.init(): Unable to determine a compatible dataUri format for this browser'));\n return;\n }\n self._xhr = self._createXHR(url, requestType, options.withCredentials, function (event) {\n if (this.readyState !== 4) {\n return;\n }\n\n // See https://github.com/bbc/peaks.js/issues/491\n\n if (this.status !== 200 && !(this.status === 206 && hasValidContentRangeHeader(this))) {\n callback(new Error('Unable to fetch remote data. HTTP status ' + this.status));\n return;\n }\n self._xhr = null;\n var waveformData = WaveformData.create(event.target.response);\n if (waveformData.channels !== 1 && waveformData.channels !== 2) {\n callback(new Error('Peaks.init(): Only mono or stereo waveforms are currently supported'));\n return;\n } else if (waveformData.bits !== 8) {\n callback(new Error('Peaks.init(): 16-bit waveform data is not supported'));\n return;\n }\n callback(null, waveformData);\n }, function () {\n callback(new Error('XHR failed'));\n }, function () {\n callback(new Error('XHR aborted'));\n });\n self._xhr.send();\n};\n\n/* eslint-disable max-len */\n\n/**\n * Creates a waveform from given data, based on the given options.\n *\n * @private\n * @param {Object} options\n * @param {Object} options.waveformData\n * @param {ArrayBuffer} options.waveformData.arraybuffer Waveform data (binary format)\n * @param {Object} options.waveformData.json Waveform data (JSON format)\n * @param {WaveformBuilderInitCallback} callback\n *\n * @see Refer to the <a href=\"https://github.com/bbc/audiowaveform/blob/master/doc/DataFormat.md\">data format documentation</a>\n * for details of the binary and JSON waveform data formats.\n */\n\n/* eslint-enable max-len */\n\nWaveformBuilder.prototype._buildWaveformFromLocalData = function (options, callback) {\n var waveformData = null;\n var data = null;\n if (isObject(options.waveformData)) {\n waveformData = options.waveformData;\n } else {\n callback(new Error('Peaks.init(): The waveformData option must be an object'));\n return;\n }\n if (isObject(waveformData.json)) {\n data = waveformData.json;\n } else if (isArrayBuffer(waveformData.arraybuffer)) {\n data = waveformData.arraybuffer;\n }\n if (!data) {\n // eslint-disable-next-line max-len\n callback(new Error('Peaks.init(): Unable to determine a compatible waveformData format'));\n return;\n }\n try {\n var createdWaveformData = WaveformData.create(data);\n if (createdWaveformData.channels !== 1 && createdWaveformData.channels !== 2) {\n callback(new Error('Peaks.init(): Only mono or stereo waveforms are currently supported'));\n return;\n } else if (createdWaveformData.bits !== 8) {\n callback(new Error('Peaks.init(): 16-bit waveform data is not supported'));\n return;\n }\n callback(null, createdWaveformData);\n } catch (err) {\n callback(err);\n }\n};\n\n/**\n * Creates waveform data using the Web Audio API.\n *\n * @private\n * @param {Object} options\n * @param {AudioContext} options.audioContext\n * @param {HTMLMediaElement} options.mediaElement\n * @param {WaveformBuilderInitCallback} callback\n */\n\nWaveformBuilder.prototype._buildWaveformDataUsingWebAudio = function (options, callback) {\n var self = this;\n var audioContext = window.AudioContext || window.webkitAudioContext;\n if (!(options.webAudio.audioContext instanceof audioContext)) {\n // eslint-disable-next-line max-len\n callback(new TypeError('Peaks.init(): The webAudio.audioContext option must be a valid AudioContext'));\n return;\n }\n var webAudioOptions = options.webAudio;\n if (webAudioOptions.scale !== options.zoomLevels[0]) {\n webAudioOptions.scale = options.zoomLevels[0];\n }\n\n // If the media element has already selected which source to play, its\n // currentSrc attribute will contain the source media URL. Otherwise,\n // we wait for a canplay event to tell us when the media is ready.\n\n var mediaSourceUrl = self._peaks.options.mediaElement.currentSrc;\n if (mediaSourceUrl) {\n self._requestAudioAndBuildWaveformData(mediaSourceUrl, webAudioOptions, options.withCredentials, callback);\n } else {\n self._peaks.once('player.canplay', function () {\n self._requestAudioAndBuildWaveformData(self._peaks.options.mediaElement.currentSrc, webAudioOptions, options.withCredentials, callback);\n });\n }\n};\nWaveformBuilder.prototype._buildWaveformDataFromAudioBuffer = function (options, callback) {\n var webAudioOptions = options.webAudio;\n if (webAudioOptions.scale !== options.zoomLevels[0]) {\n webAudioOptions.scale = options.zoomLevels[0];\n }\n var webAudioBuilderOptions = {\n audio_buffer: webAudioOptions.audioBuffer,\n split_channels: webAudioOptions.multiChannel,\n scale: webAudioOptions.scale,\n disable_worker: true\n };\n WaveformData.createFromAudio(webAudioBuilderOptions, callback);\n};\n\n/**\n * Fetches the audio content, based on the given options, and creates waveform\n * data using the Web Audio API.\n *\n * @private\n * @param {url} The media source URL\n * @param {WaveformBuilderWebAudioOptions} webAudio\n * @param {Boolean} withCredentials\n * @param {WaveformBuilderInitCallback} callback\n */\n\nWaveformBuilder.prototype._requestAudioAndBuildWaveformData = function (url, webAudio, withCredentials, callback) {\n var self = this;\n if (!url) {\n self._peaks._logger('Peaks.init(): The mediaElement src is invalid');\n return;\n }\n self._xhr = self._createXHR(url, 'arraybuffer', withCredentials, function (event) {\n if (this.readyState !== 4) {\n return;\n }\n\n // See https://github.com/bbc/peaks.js/issues/491\n\n if (this.status !== 200 && !(this.status === 206 && hasValidContentRangeHeader(this))) {\n callback(new Error('Unable to fetch remote data. HTTP status ' + this.status));\n return;\n }\n self._xhr = null;\n var webAudioBuilderOptions = {\n audio_context: webAudio.audioContext,\n array_buffer: event.target.response,\n split_channels: webAudio.multiChannel,\n scale: webAudio.scale\n };\n WaveformData.createFromAudio(webAudioBuilderOptions, callback);\n }, function () {\n callback(new Error('XHR failed'));\n }, function () {\n callback(new Error('XHR aborted'));\n });\n self._xhr.send();\n};\nWaveformBuilder.prototype.abort = function () {\n if (this._xhr) {\n this._xhr.abort();\n }\n};\n\n/**\n * @private\n * @param {String} url\n * @param {String} requestType\n * @param {Boolean} withCredentials\n * @param {Function} onLoad\n * @param {Function} onError\n *\n * @returns {XMLHttpRequest}\n */\n\nWaveformBuilder.prototype._createXHR = function (url, requestType, withCredentials, onLoad, onError, onAbort) {\n var xhr = new XMLHttpRequest();\n\n // open an XHR request to the data source file\n xhr.open('GET', url, true);\n if (isXhr2) {\n try {\n xhr.responseType = requestType;\n } catch (e) {\n // Some browsers like Safari 6 do handle XHR2 but not the json\n // response type, doing only a try/catch fails in IE9\n }\n }\n xhr.onload = onLoad;\n xhr.onerror = onError;\n if (isXhr2 && withCredentials) {\n xhr.withCredentials = true;\n }\n xhr.addEventListener('abort', onAbort);\n return xhr;\n};\n\n/**\n * @file\n *\n * Defines the {@link Peaks} class.\n *\n * @module main\n */\n\n\n/**\n * Initialises a new Peaks instance with default option settings.\n *\n * @class\n * @alias Peaks\n *\n * @param {Object} opts Configuration options\n */\n\nfunction Peaks() {\n EventEmitter.call(this);\n\n // Set default options\n this.options = {\n zoomLevels: [512, 1024, 2048, 4096],\n waveformCache: true,\n mediaElement: null,\n mediaUrl: null,\n dataUri: null,\n withCredentials: false,\n waveformData: null,\n webAudio: null,\n nudgeIncrement: 1.0,\n pointMarkerColor: '#39cccc',\n createSegmentMarker: createSegmentMarker,\n createSegmentLabel: createSegmentLabel,\n createPointMarker: createPointMarker,\n // eslint-disable-next-line no-console\n logger: console.error.bind(console)\n };\n return this;\n}\nPeaks.prototype = Object.create(EventEmitter.prototype);\nvar defaultViewOptions = {\n playheadColor: '#111111',\n playheadTextColor: '#aaaaaa',\n playheadBackgroundColor: 'transparent',\n playheadPadding: 2,\n playheadWidth: 1,\n axisGridlineColor: '#cccccc',\n showAxisLabels: true,\n axisTopMarkerHeight: 10,\n axisBottomMarkerHeight: 10,\n axisLabelColor: '#aaaaaa',\n fontFamily: 'sans-serif',\n fontSize: 11,\n fontStyle: 'normal',\n timeLabelPrecision: 2,\n enablePoints: true,\n enableSegments: true\n};\nvar defaultZoomviewOptions = {\n // showPlayheadTime: true,\n playheadClickTolerance: 3,\n waveformColor: 'rgba(0, 225, 128, 1)',\n wheelMode: 'none',\n autoScroll: true,\n autoScrollOffset: 100,\n enableEditing: true\n};\nvar defaultOverviewOptions = {\n // showPlayheadTime: false,\n waveformColor: 'rgba(0, 0, 0, 0.2)',\n highlightColor: '#aaaaaa',\n highlightStrokeColor: 'transparent',\n highlightOpacity: 0.3,\n highlightOffset: 11,\n highlightCornerRadius: 2,\n enableEditing: false\n};\nvar defaultSegmentOptions = {\n overlay: false,\n markers: true,\n startMarkerColor: '#aaaaaa',\n endMarkerColor: '#aaaaaa',\n waveformColor: '#0074d9',\n overlayColor: '#ff0000',\n overlayOpacity: 0.3,\n overlayBorderColor: '#ff0000',\n overlayBorderWidth: 2,\n overlayCornerRadius: 5,\n overlayOffset: 25,\n overlayLabelAlign: 'left',\n overlayLabelVerticalAlign: 'top',\n overlayLabelPadding: 8,\n overlayLabelColor: '#000000',\n overlayFontFamily: 'sans-serif',\n overlayFontSize: 12,\n overlayFontStyle: 'normal'\n};\nvar defaultScrollbarOptions = {\n color: '#888888',\n minWidth: 50\n};\nfunction getOverviewOptions(opts) {\n var overviewOptions = {};\n if (opts.overview && opts.overview.showPlayheadTime) {\n overviewOptions.showPlayheadTime = opts.overview.showPlayheadTime;\n }\n var optNames = ['container', 'waveformColor', 'playedWaveformColor', 'playheadColor', 'playheadTextColor', 'playheadBackgroundColor', 'playheadPadding', 'playheadWidth', 'formatPlayheadTime', 'timeLabelPrecision', 'axisGridlineColor', 'showAxisLabels', 'axisTopMarkerHeight', 'axisBottomMarkerHeight', 'axisLabelColor', 'formatAxisTime', 'fontFamily', 'fontSize', 'fontStyle', 'highlightColor', 'highlightStrokeColor', 'highlightOpacity', 'highlightCornerRadius', 'highlightOffset', 'enablePoints', 'enableSegments', 'enableEditing'];\n optNames.forEach(function (optName) {\n if (opts.overview && objectHasProperty(opts.overview, optName)) {\n overviewOptions[optName] = opts.overview[optName];\n } else if (objectHasProperty(opts, optName)) {\n overviewOptions[optName] = opts[optName];\n } else if (!objectHasProperty(overviewOptions, optName)) {\n if (objectHasProperty(defaultOverviewOptions, optName)) {\n overviewOptions[optName] = defaultOverviewOptions[optName];\n } else if (objectHasProperty(defaultViewOptions, optName)) {\n overviewOptions[optName] = defaultViewOptions[optName];\n }\n }\n });\n return overviewOptions;\n}\nfunction getZoomviewOptions(opts) {\n var zoomviewOptions = {};\n if (opts.showPlayheadTime) {\n zoomviewOptions.showPlayheadTime = opts.showPlayheadTime;\n } else if (opts.zoomview && opts.zoomview.showPlayheadTime) {\n zoomviewOptions.showPlayheadTime = opts.zoomview.showPlayheadTime;\n }\n var optNames = ['container', 'waveformColor', 'playedWaveformColor', 'playheadColor', 'playheadTextColor', 'playheadBackgroundColor', 'playheadPadding', 'playheadWidth', 'formatPlayheadTime', 'playheadClickTolerance', 'timeLabelPrecision', 'axisGridlineColor', 'showAxisLabels', 'axisTopMarkerHeight', 'axisBottomMarkerHeight', 'axisLabelColor', 'formatAxisTime', 'fontFamily', 'fontSize', 'fontStyle', 'wheelMode', 'autoScroll', 'autoScrollOffset', 'enablePoints', 'enableSegments', 'enableEditing'];\n optNames.forEach(function (optName) {\n if (opts.zoomview && objectHasProperty(opts.zoomview, optName)) {\n zoomviewOptions[optName] = opts.zoomview[optName];\n } else if (objectHasProperty(opts, optName)) {\n zoomviewOptions[optName] = opts[optName];\n } else if (!objectHasProperty(zoomviewOptions, optName)) {\n if (objectHasProperty(defaultZoomviewOptions, optName)) {\n zoomviewOptions[optName] = defaultZoomviewOptions[optName];\n } else if (objectHasProperty(defaultViewOptions, optName)) {\n zoomviewOptions[optName] = defaultViewOptions[optName];\n }\n }\n });\n return zoomviewOptions;\n}\nfunction getScrollbarOptions(opts) {\n if (!objectHasProperty(opts, 'scrollbar')) {\n return null;\n }\n var scrollbarOptions = {};\n var optNames = ['container', 'color', 'minWidth'];\n optNames.forEach(function (optName) {\n if (objectHasProperty(opts.scrollbar, optName)) {\n scrollbarOptions[optName] = opts.scrollbar[optName];\n } else {\n scrollbarOptions[optName] = defaultScrollbarOptions[optName];\n }\n });\n return scrollbarOptions;\n}\nfunction extendOptions(to, from) {\n for (var key in from) {\n if (objectHasProperty(from, key) && objectHasProperty(to, key)) {\n to[key] = from[key];\n }\n }\n return to;\n}\nfunction addSegmentOptions(options, opts) {\n options.segmentOptions = {};\n extend(options.segmentOptions, defaultSegmentOptions);\n if (opts.segmentOptions) {\n extendOptions(options.segmentOptions, opts.segmentOptions);\n }\n options.zoomview.segmentOptions = {};\n extend(options.zoomview.segmentOptions, options.segmentOptions);\n if (opts.zoomview && opts.zoomview.segmentOptions) {\n extendOptions(options.zoomview.segmentOptions, opts.zoomview.segmentOptions);\n }\n options.overview.segmentOptions = {};\n extend(options.overview.segmentOptions, options.segmentOptions);\n if (opts.overview && opts.overview.segmentOptions) {\n extendOptions(options.overview.segmentOptions, opts.overview.segmentOptions);\n }\n}\nfunction checkContainerElements(options) {\n var zoomviewContainer = options.zoomview.container;\n var overviewContainer = options.overview.container;\n if (!isHTMLElement(zoomviewContainer) && !isHTMLElement(overviewContainer)) {\n // eslint-disable-next-line max-len\n return new TypeError('Peaks.init(): The zoomview and/or overview container options must be valid HTML elements');\n }\n if (zoomviewContainer && (zoomviewContainer.clientWidth <= 0 || zoomviewContainer.clientHeight <= 0)) {\n // eslint-disable-next-line max-len\n return new Error('Peaks.init(): The zoomview container must be visible and have non-zero width and height');\n }\n if (overviewContainer && (overviewContainer.clientWidth <= 0 || overviewContainer.clientHeight <= 0)) {\n // eslint-disable-next-line max-len\n return new Error('Peaks.init(): The overview container must be visible and have non-zero width and height');\n }\n}\n\n/**\n * Creates and initialises a new Peaks instance with the given options.\n *\n * @param {Object} opts Configuration options\n *\n * @return {Peaks}\n */\n\nPeaks.init = function (opts, callback) {\n var instance = new Peaks();\n var err = instance._setOptions(opts);\n if (!err) {\n err = checkContainerElements(instance.options);\n }\n if (err) {\n callback(err);\n return;\n }\n var scrollbarContainer = null;\n if (instance.options.scrollbar) {\n scrollbarContainer = instance.options.scrollbar.container;\n if (!isHTMLElement(scrollbarContainer)) {\n // eslint-disable-next-line max-len\n callback(new TypeError('Peaks.init(): The scrollbar container option must be a valid HTML element'));\n return;\n }\n if (scrollbarContainer.clientWidth <= 0) {\n // eslint-disable-next-line max-len\n callback(new TypeError('Peaks.init(): The scrollbar container must be visible and have non-zero width'));\n return;\n }\n }\n if (opts.keyboard) {\n instance._keyboardHandler = new KeyboardHandler(instance);\n }\n var player = opts.player ? opts.player : new MediaElementPlayer(instance.options.mediaElement);\n instance.player = new Player(instance, player);\n instance.segments = new WaveformSegments(instance);\n instance.points = new WaveformPoints(instance);\n instance.zoom = new ZoomController(instance, instance.options.zoomLevels);\n instance.views = new ViewController(instance);\n\n // Setup the UI components\n instance._waveformBuilder = new WaveformBuilder(instance);\n instance.player.init(instance).then(function () {\n instance._waveformBuilder.init(instance.options, function (err, waveformData) {\n if (err) {\n if (callback) {\n callback(err);\n }\n return;\n }\n err = checkContainerElements(instance.options);\n if (err) {\n if (callback) {\n callback(err);\n }\n return;\n }\n instance._waveformBuilder = null;\n instance._waveformData = waveformData;\n var zoomviewContainer = instance.options.zoomview.container;\n var overviewContainer = instance.options.overview.container;\n if (overviewContainer) {\n instance.views.createOverview(overviewContainer);\n }\n if (zoomviewContainer) {\n instance.views.createZoomview(zoomviewContainer);\n }\n if (scrollbarContainer) {\n instance.views.createScrollbar(scrollbarContainer);\n }\n if (opts.segments) {\n instance.segments.add(opts.segments);\n }\n if (opts.points) {\n instance.points.add(opts.points);\n }\n if (opts.emitCueEvents) {\n instance._cueEmitter = new CueEmitter(instance);\n }\n\n // Allow applications to attach event handlers before emitting events,\n // when initialising with local waveform data.\n\n setTimeout(function () {\n instance.emit('peaks.ready');\n }, 0);\n callback(null, instance);\n });\n }).catch(function (err) {\n if (callback) {\n callback(err);\n }\n });\n return instance;\n};\nPeaks.prototype._setOptions = function (opts) {\n if (!isObject(opts)) {\n return new TypeError('Peaks.init(): The options parameter should be an object');\n }\n if (!opts.player) {\n if (!opts.mediaElement) {\n return new Error('Peaks.init(): Missing mediaElement option');\n }\n if (!(opts.mediaElement instanceof HTMLMediaElement)) {\n // eslint-disable-next-line max-len\n return new TypeError('Peaks.init(): The mediaElement option should be an HTMLMediaElement');\n }\n }\n if (opts.logger && !isFunction(opts.logger)) {\n // eslint-disable-next-line max-len\n return new TypeError('Peaks.init(): The logger option should be a function');\n }\n if (opts.segments && !Array.isArray(opts.segments)) {\n // eslint-disable-next-line max-len\n return new TypeError('Peaks.init(): options.segments must be an array of segment objects');\n }\n if (opts.points && !Array.isArray(opts.points)) {\n // eslint-disable-next-line max-len\n return new TypeError('Peaks.init(): options.points must be an array of point objects');\n }\n extendOptions(this.options, opts);\n this.options.overview = getOverviewOptions(opts);\n this.options.zoomview = getZoomviewOptions(opts);\n this.options.scrollbar = getScrollbarOptions(opts);\n addSegmentOptions(this.options, opts);\n if (!Array.isArray(this.options.zoomLevels)) {\n return new TypeError('Peaks.init(): The zoomLevels option should be an array');\n } else if (this.options.zoomLevels.length === 0) {\n return new Error('Peaks.init(): The zoomLevels array must not be empty');\n } else {\n if (!isInAscendingOrder(this.options.zoomLevels)) {\n return new Error('Peaks.init(): The zoomLevels array must be sorted in ascending order');\n }\n }\n this._logger = this.options.logger;\n};\n\n/**\n * Remote waveform data options for [Peaks.setSource]{@link Peaks#setSource}.\n *\n * @typedef {Object} RemoteWaveformDataOptions\n * @global\n * @property {String=} arraybuffer\n * @property {String=} json\n */\n\n/**\n * Local waveform data options for [Peaks.setSource]{@link Peaks#setSource}.\n *\n * @typedef {Object} LocalWaveformDataOptions\n * @global\n * @property {ArrayBuffer=} arraybuffer\n * @property {Object=} json\n */\n\n/**\n * Web Audio options for [Peaks.setSource]{@link Peaks#setSource}.\n *\n * @typedef {Object} WebAudioOptions\n * @global\n * @property {AudioContext=} audioContext\n * @property {AudioBuffer=} audioBuffer\n * @property {Number=} scale\n * @property {Boolean=} multiChannel\n */\n\n/**\n * Options for [Peaks.setSource]{@link Peaks#setSource}.\n *\n * @typedef {Object} PeaksSetSourceOptions\n * @global\n * @property {String=} mediaUrl\n * @property {RemoteWaveformDataOptions=} dataUri\n * @property {LocalWaveformDataOptions=} waveformData\n * @property {WebAudioOptions=} webAudio\n * @property {Boolean=} withCredentials\n * @property {Array<Number>=} zoomLevels\n */\n\n/**\n * Changes the audio or video media source associated with the {@link Peaks}\n * instance.\n *\n * @see SetSourceHandler\n *\n * @param {PeaksSetSourceOptions} options\n * @param {Function} callback\n */\n\nPeaks.prototype.setSource = function (options, callback) {\n var self = this;\n self.player._setSource(options).then(function () {\n if (!options.zoomLevels) {\n options.zoomLevels = self.options.zoomLevels;\n }\n self._waveformBuilder = new WaveformBuilder(self);\n self._waveformBuilder.init(options, function (err, waveformData) {\n if (err) {\n callback(err);\n return;\n }\n self._waveformBuilder = null;\n self._waveformData = waveformData;\n ['overview', 'zoomview'].forEach(function (viewName) {\n var view = self.views.getView(viewName);\n if (view) {\n view.setWaveformData(waveformData);\n }\n });\n self.zoom.setZoomLevels(options.zoomLevels);\n callback();\n });\n }).catch(function (err) {\n callback(err);\n });\n};\nPeaks.prototype.getWaveformData = function () {\n return this._waveformData;\n};\n\n/**\n * Cleans up a Peaks instance after use.\n */\n\nPeaks.prototype.destroy = function () {\n if (this._waveformBuilder) {\n this._waveformBuilder.abort();\n }\n if (this._keyboardHandler) {\n this._keyboardHandler.destroy();\n }\n if (this.views) {\n this.views.destroy();\n }\n if (this.player) {\n this.player.destroy();\n }\n if (this._cueEmitter) {\n this._cueEmitter.destroy();\n }\n};\n\nexport { Peaks as default };\n","export default \"<style>\\n :host {\\n /* The main background */\\n --clr-bg: var(--pp-color-bg, #111);\\n /* UI backdrop */\\n --clr-bg2: var(--pp-color-bg2, #222);\\n /* UI color */\\n --clr-fg: var(--pp-color-fg, #ddd);\\n /* UI button colors */\\n --clr-bg-btn: var(--pp-color-btn, #666);\\n --clr-over-btn: var(--pp-color-btn-over, #888);\\n }\\n * {\\n margin: 0; padding: 0;\\n }\\n #m-root {\\n display: flex;\\n flex-direction: column;\\n }\\n #m-info {\\n background: var(--clr-bg);\\n color: var(--clr-fg);\\n display: flex;\\n align-items: center;\\n place-content: center;\\n padding: 4px 8px;\\n box-sizing: border-box;\\n gap: 4px;\\n width: 1000px;\\n }\\n #m-title {\\n font-weight: bold;\\n flex-grow: 1\\n }\\n #m-dl {\\n font-weight: bold;\\n text-decoration: none;\\n }\\n #m-pos {\\n font-family: monospace;\\n }\\n a {\\n color: var(--clr-bg-btn);\\n }\\n button {\\n border-color: var(--clr-bg2);\\n background-color: var(--clr-bg-btn);\\n color: var(--clr-fg);\\n font-weight: 800;\\n border-radius: 3px;\\n width: 28px;\\n height: 20px;\\n font-family: monospace;\\n cursor: pointer;\\n padding-bottom: 18px;\\n }\\n\\n li { background: var(--clr-bg); }\\n li:nth-child(odd) { background: var(--clr-bg2); }\\n #m-playlist {\\n width: 1000px;\\n background: var(--clr-bg);\\n color: var(--clr-fg);\\n box-sizing: border-box;\\n padding: 4px;\\n gap: 4px;\\n }\\n .m-track {\\n height: 30px;\\n display: flex;\\n align-items: center;\\n padding: 0 8px;\\n gap: 5px;\\n }\\n .m-playing {\\n border: 2px solid var(--clr-fg);\\n border-left: 4px dashed var(--clr-fg);\\n }\\n</style>\\n<div id=\\\"m-root\\\">\\n<div id=\\\"m-info\\\">\\n <button id=\\\"m-prev\\\"><</button>\\n <div id=\\\"m-pos\\\"></div>\\n <button id=\\\"m-next\\\">></button>\\n Now playing:\\n <div id=\\\"m-title\\\"></div>\\n <a id=\\\"m-dl\\\" title=\\\"Download media\\\">⇩</a>\\n <div id=\\\"m-date\\\"></div>\\n</div>\\n<peaks-player id=\\\"m-player\\\"></peaks-player>\\n<ul id=\\\"m-playlist\\\"></ul>\\n</div>\\n\"","// Copyright (C) 2024 Tristan de Cacqueray\n// SPDX-License-Identifier: GPL-3.0\n//\n// This module contains the web component.\n\n// Prepare the template from external file using vite raw import\nconst playerTemplate = document.createElement(\"template\");\nimport playerTemplateBody from \"./player.html?raw\";\nplayerTemplate.innerHTML = playerTemplateBody;\n\nimport Peaks from \"peaks.js\";\n\nfunction setAutoWidth(setWidth) {\n // adjust width if necessary\n const screenWidth = window.innerWidth;\n if (screenWidth < 600) {\n // tiny screen should use all the available space\n setWidth((window.innerWidth - 20) + \"px\");\n } else if (screenWidth < 1000) {\n // small screen uses 600px\n setWidth(\"600px\");\n } // otherwise the default is 1000px\n}\n\nclass PeaksPlayer extends HTMLElement {\n static observedAttributes = [\n \"width\",\n \"url\",\n ];\n\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n this.shadowRoot.appendChild(playerTemplate.content.cloneNode(true));\n this.audioElt = this.shadowRoot.getElementById(\"m-audio\");\n this.zoomElt = this.shadowRoot.getElementById(\"m-zoomview\");\n this.overviewElt = this.shadowRoot.getElementById(\"m-overview\");\n }\n\n connectedCallback() {\n setAutoWidth(this.setWidth.bind(this));\n\n if (this.firstMedia) {\n // The media was provided before the canvas was loaded, init the peaks now.\n this.initPeaks(this.firstMedia);\n }\n this.connected = true;\n }\n\n initPeaks(firstMedia) {\n const options = {\n zoomview: {\n container: this.zoomElt,\n playheadColor: \"pink\",\n },\n overview: {\n container: this.overviewElt,\n waveformColor: \"#ddd\",\n playheadColor: \"pink\",\n },\n mediaElement: this.audioElt,\n dataUri: {\n arraybuffer: firstMedia + \".dat\",\n },\n };\n\n let instance = this;\n Peaks.init(options, function (err, peaks) {\n if (err) {\n console.error(\"Failed to initialize Peaks instance\", err);\n } else {\n instance.peaks = peaks;\n }\n });\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"url\") this.setUrl(newValue);\n else if (name === \"width\") this.setWidth(newValue);\n }\n\n setWidth(width) {\n this.audioElt.style.width = width;\n this.zoomElt.style.width = width;\n this.overviewElt.style.width = width;\n // TODO: refresh the Peaks if necessary\n }\n\n setUrl(baseValue) {\n if (!this.peaks) {\n // The first media needs to be set manually.\n // Later we'll use setSource\n const srcElt = document.createElement(\"source\");\n srcElt.src = baseValue + \".mp3\";\n srcElt.type = \"audio/mpeg\";\n this.audioElt.appendChild(srcElt);\n if (this.connected) {\n // The media was provided after the canvas was loaded, we can init the peaks now.\n this.initPeaks(baseValue);\n } else {\n // Otherwise we'll wait for the canvbas to be loaded.\n this.firstMedia = baseValue;\n }\n } else {\n this.peaks.setSource({\n mediaUrl: baseValue + \".mp3\",\n dataUri: {\n arraybuffer: baseValue + \".dat\",\n },\n }, (err) => {\n if (err) {\n console.error(\"Failed to update Peaks instance\", err);\n }\n this.peaks.player.play();\n });\n }\n }\n}\n\ncustomElements.define(\"peaks-player\", PeaksPlayer);\n\n// Prepare the template from external file using vite raw import\nconst playlistTemplate = document.createElement(\"template\");\nimport playlistTemplateBody from \"./playlist.html?raw\";\nplaylistTemplate.innerHTML = playlistTemplateBody;\n\nclass PeaksPlaylist extends HTMLElement {\n static observedAttributes = [\n \"width\",\n \"pos\",\n \"url\",\n ];\n\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n this.shadowRoot.appendChild(playlistTemplate.content.cloneNode(true));\n this.pos = 0;\n\n // Bind the dom\n this.playerElt = this.shadowRoot.getElementById(\"m-player\");\n this.infoElt = this.shadowRoot.getElementById(\"m-info\");\n this.dlElt = this.shadowRoot.getElementById(\"m-dl\");\n this.titleElt = this.shadowRoot.getElementById(\"m-title\");\n this.dateElt = this.shadowRoot.getElementById(\"m-date\");\n this.posElt = this.shadowRoot.getElementById(\"m-pos\");\n this.playlistElt = this.shadowRoot.getElementById(\"m-playlist\");\n\n // Setup controllers\n this.shadowRoot.getElementById(\"m-prev\").onclick = () => {\n if (this.pos > 0) this.setPos(this.pos - 1);\n };\n this.shadowRoot.getElementById(\"m-next\").onclick = () => {\n if (this.items && this.pos + 1 < this.items.length) {\n this.setPos(this.pos + 1);\n }\n };\n\n // wait for peaks player to be initialized.\n // TODO: listen to <audio> event directly\n const attachPlayerEvent = () => {\n if (this.playerElt.peaks) {\n this.playerElt.peaks.on(\"player.ended\", () => {\n this.setPos((this.pos + 1) % this.items.length);\n });\n } else {\n setTimeout(attachPlayerEvent, 1000);\n }\n };\n setTimeout(attachPlayerEvent, 1000);\n }\n\n connectedCallback() {\n setAutoWidth(this.setWidth.bind(this));\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (name === \"url\") this.setUrl(newValue);\n else if (name === \"width\") this.setWidth(newValue);\n else if (name === \"pos\") this.setPos(parseInt(newValue - 1));\n }\n\n setPos(pos) {\n this.pos = pos;\n if (this.items) {\n this.loadItem(pos);\n }\n }\n\n setWidth(width) {\n this.infoElt.style.width = width;\n this.playlistElt.style.width = width;\n this.playerElt.setWidth(width);\n }\n\n setUrl(url) {\n // remove json filename from the url\n const basename = url.substr(0, url.lastIndexOf(\"/\"))\n this.baseUrl = URL.parse(basename, window.location.origin);\n fetch(new Request(url))\n .then((\n response,\n ) => response.json())\n .then(this.setItems.bind(this));\n }\n\n loadItem(pos) {\n const af = this.items[pos];\n const url = af.path[0] == '/' ?\n this.baseUrl.origin + af.path : this.baseUrl.href + \"/\" + af.path;\n this.titleElt.textContent = af.title;\n this.dateElt.textContent = af.date;\n if (af.format && af.format.indexOf('flac') > 0) {\n this.dlElt.href = url + \".flac\";\n } else {\n this.dlElt.href = url + \".mp3\";\n }\n this.posElt.textContent = (pos + 1) + \"/\" + this.items.length;\n\n for (let i = 0; i < this.playlistElt.children.length; i++) {\n const trackElt = this.playlistElt.children[i];\n if (i == pos) {\n trackElt.classList.add(\"m-playing\");\n } else {\n trackElt.classList.remove(\"m-playing\");\n }\n }\n\n // comment the next line when using hot reload to avoid loading the audio data\n this.playerElt.setUrl(url);\n }\n\n setItems(items) {\n this.items = items;\n // Remove current dom items\n this.playlistElt.innerHtml = \"\";\n items.forEach((item, idx) => {\n // Create a new playlist entry\n const trackElt = document.createElement(\"li\");\n trackElt.classList.add(\"m-track\");\n if (idx == this.pos) trackElt.classList.add(\"m-playing\");\n\n // The track number\n const posElt = document.createElement(\"button\");\n posElt.textContent = idx + 1;\n trackElt.appendChild(posElt);\n posElt.onclick = () => {\n this.setPos(idx);\n };\n\n // The track title\n const titleElt = document.createElement(\"div\");\n titleElt.style[\"flex-grow\"] = 1;\n titleElt.textContent = item.title;\n trackElt.appendChild(titleElt);\n\n // The track length\n const durElt = document.createElement(\"div\");\n durElt.style[\"font-family\"] = \"monospace\";\n durElt.textContent = formatTime(item.length || item.len);\n trackElt.appendChild(durElt);\n\n this.playlistElt.appendChild(trackElt);\n });\n this.loadItem(this.pos);\n }\n}\n\nfunction formatTime(ms) {\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}`;\n else if (sec < 3600) return `${Math.floor(sec / 60)}:${sec % 60}`;\n else {return `${Math.floor(sec / 3600)}:${Math.floor((sec % 3600) / 60)}:${\n sec % 60\n }`;}\n}\n\ncustomElements.define(\"peaks-playlist\", PeaksPlaylist);\n"],"names":["playerTemplateBody","exports","PI_OVER_180","detectBrowser","global","param","angle","_a","Konva","_registerNode","NodeClass","Global_1","require$$0","Transform","m","tr","point","x","y","sx","sy","rad","c","s","m11","m12","m21","m22","matrix","dx","dy","m0","m1","m2","m3","m4","m5","a","b","d","e","f","delta","result","r","OBJECT_ARRAY","OBJECT_NUMBER","OBJECT_STRING","OBJECT_BOOLEAN","PI_OVER_DEG180","DEG180_OVER_PI","HASH","EMPTY_STRING","ZERO","KONVA_WARNING","KONVA_ERROR","RGB_PAREN","COLORS","RGB_REGEX","animQueue","req","obj","val","selector","firstChar","number","callback","queue","cb","canvas","el","url","imageObj","g","hex","bigint","randColor","color","rgb","str","parts","n","index","_","hsl","h","l","t2","t3","t1","i","r1","r2","retObj","key","arr","deg","radians","func","left","right","x1","y1","x2","y2","x3","y3","dist","pd2","u","pt","line","isClosed","pc","p1","p2","proj","px","py","pdist","startArray","endArray","start","end","temp","newStart","pr","desc","target","source","evt","canvases","context","width","height","cornerRadius","topLeft","topRight","bottomLeft","bottomRight","Validators","RGBComponent","alphaComponent","getNumberValidator","getNumberOrArrayOfNumbersValidator","getNumberOrAutoValidator","getStringValidator","getStringOrGradientValidator","getFunctionValidator","getNumberArrayValidator","getBooleanValidator","getComponentValidator","Util_1","require$$1","_formatValue","attr","noOfElements","isNumber","isValidArray","isAuto","isString","isGradient","TypedArray","item","isBool","components","Validators_1","GET","SET","constructor","def","validator","after","method","len","capitalize","getter","setter","ret","component","basicValidator","oldVal","capitalizedAttr","message","methods","oldMethodName","newMethodName","oldGetter","oldSetter","deprecated","Context_1","Context$1","simplifyArray","retArr","util","COMMA","OPEN_PAREN","CLOSE_PAREN","OPEN_PAREN_BRACKET","CLOSE_BRACKET_PAREN","SEMICOLON","DOUBLE_PAREN","EQUALS","CONTEXT_METHODS","CONTEXT_PROPERTIES","traceArrMax","Context","shape","relaxed","rounded","traceArr","trace","args","pixelRatio","bounds","lineCap","absOpacity","lineJoin","radius","startAngle","endAngle","counterClockwise","cp1x","cp1y","cp2x","cp2y","x0","y0","image","repetition","r0","sWidth","sHeight","dWidth","dHeight","_context","radiusX","radiusY","rotation","counterclockwise","path","fillRule","text","maxWidth","sw","sh","radii","imageData","cpx","cpy","segments","path2d","that","origSetter","methodName","origMethod","prop","node","op","SceneContext","willReadFrequently","fill","grd","hasColor","fillPriority","hasPattern","hasLinearGradient","hasRadialGradient","colorStops","dash","strokeScaleEnabled","_b","_c","blur","offset","scale","ratio","scaleX","scaleY","HitContext","hitStrokeWidth","strokeWidth","Canvas_1","Canvas$1","require$$2","Factory_1","require$$3","require$$4","_pixelRatio","getDevicePixelRatio","devicePixelRatio","backingStoreRatio","Canvas","config","previousRatio","mimeType","quality","err","SceneCanvas","HitCanvas","flag","elem","nodesToFireEvents","stage","pos","dragDistance","drawNodes","drawNode","Node_1","Node$1","DragAndDrop_1","require$$5","ABSOLUTE_OPACITY","ALL_LISTENERS","ABSOLUTE_TRANSFORM","ABSOLUTE_SCALE","CANVAS","CHANGE","CHILDREN","KONVA","LISTENING","MOUSEENTER","MOUSELEAVE","SHAPE","SPACE","STAGE","TRANSFORM","UPPER_STAGE","VISIBLE","TRANSFORM_CHANGE_STR","idCounter","Node","privateGetter","cache","name","deps","depsString","dep","scene","filter","hit","conf","rect","drawBorder","hitCanvasPixelRatio","extraPaddingX","extraPaddingY","cachedSceneCanvas","cachedFilterCanvas","cachedHitCanvas","sceneContext","hitContext","top","points","minX","minY","maxX","maxY","trans","transformed","canvasCache","cacheCanvas","hitCanvas","filters","cachedCanvas","sceneCanvas","filterCanvas","filterContext","evtStr","handler","events","event","baseEvent","t","type","stopNode","targets","parent","ancestors","relativeTo","skipDragCheck","layer","layerUnderDrag","dragSkip","depth","nodes","child","addChildren","children","transform","haveCachedParent","absoluteMatrix","absoluteTransform","origTrans","it","change","changeX","changeY","family","theta","zIndex","newContainer","attrs","defaultValue","nonPlainObject","includeSelf","res","ancestor","selectorArr","sel","eventType","bubble","at","transformsEnabled","offsetX","offsetY","skewX","skewY","allListeners","listener","box","bufferCanvas","resolve","reject","img","blob","size","evtListeners","evtName","newVal","oldName","newName","fullName","names","compareShape","stopBubble","hierarchyEvents","topListeners","selfListeners","pointerId","ap","bubbleEvent","newNodePos","dbf","bounded","draggable","hasDraggingChild","dragElement","isDragging","isReady","margin","screenRect","data","container","className","no","Class","addGetterSetter","Container_1","Container$1","Container","filterFunc","results","findOne","valid","fn","shouldStop","can","caching","drawMethod","clipWidth","clipHeight","clipFunc","hasClip","selfCache","clipArgs","clipX","clipY","hasComposition","skipTransform","selfRect","shapes","hasVisible","Factory_1$4","PointerEvents","getCapturedShape","createEvent","hasPointerCapture","setPointerCapture","releaseCapture","Captures","SUPPORT_POINTER_EVENTS","Global_2","require$$6","STRING","PX","MOUSEOUT","MOUSEOVER","MOUSEMOVE","MOUSEDOWN","MOUSEUP","POINTERMOVE","POINTERDOWN","POINTERUP","POINTERCANCEL","LOSTPOINTERCAPTURE","POINTEROUT","POINTERLEAVE","POINTEROVER","POINTERENTER","CONTEXTMENU","TOUCHSTART","TOUCHEND","TOUCHMOVE","TOUCHCANCEL","WHEEL","MAX_LAYERS_NUMBER","EVENTS","EVENTS_MAP","getEventType","getEventsMap","checkNoClip","NO_POINTERS_MESSAGE","Stage","isLayer","isFastLayer","style","id","layers","content","p","layerCanvas","rest","length","evenType","targetShape","eventsEnabled","triggeredOnShape","isTouch","processedShapesIds","differentTarget","clickStartShape","clickEndShape","fireDblClick","contentPosition","touch","HAS_SHADOW","SHADOW_RGBA","patternImage","linearGradient","radialGradient","dummyContext","getDummyContext","_fillFunc","_strokeFunc","_fillFuncHit","_strokeFuncHit","_clearHasShadowCache","_clearGetShadowRGBACache","_clearFillPatternCache","_clearLinearGradientCache","_clearRadialGradientCache","Shape","pattern","ctx","rgba","bufferHitCanvas","forceFill","hasFill","hasStroke","isTransparent","hasShadow","strokeForShadow","hasCachedParent","fillRect","fillAndStrokeWidth","fillAndStrokeHeight","applyShadow","shadowOffsetX","shadowOffsetY","preWidth","preHeight","blurRadius","drawFunc","bufferContext","skipBuffer","cachingSelf","bc","o","alphaThreshold","hitWidth","hitHeight","hitImageData","hitData","rgbColorKey","Layer_1","Layer$1","Shape_1","require$$7","BEFORE_DRAW","DRAW","INTERSECTION_OFFSETS","INTERSECTION_OFFSETS_LEN","Layer","_canvas","spiralSearchDistance","continueSearch","intersectionOffset","p3","colorKey","Factory_1$3","FastLayer_1","FastLayer$1","FastLayer","Group_1","Group$1","Group","Animation_1","Animation_2","now","Animation","lays","animations","time","anim","layerHash","layersLen","needRedraw","Anim","blacklist","PAUSED","PLAYING","REVERSING","colorAttrs","TweenEngine","propFunc","begin","finish","duration","yoyo","Tween","nodeId","easing","diff","trueEnd","trueStart","endRGBA","tweenId","startRGBA","thisId","params","onFinish","Stage_1","require$$8","require$$9","require$$10","Tween_1","require$$11","require$$12","require$$13","_CoreInternals_1","_CoreInternals_2","module","Line_1","Line_2","getControlPoints","d01","d12","fa","fb","p1x","p1y","p2x","p2y","expandPoints","tension","allPoints","cp","Line","closed","bezier","tp","firstControlPoints","lastControlPoints","middle","Factory_1$2","Rect_1","Rect_2","Rect","Text_1","Text_2","Text$1","stringToArray","string","acc","char","array","nextChar","AUTO","CENTER","INHERIT","JUSTIFY","CHANGE_KONVA","CONTEXT_2D","DASH","LEFT","TEXT","TEXT_UPPER","TOP","BOTTOM","MIDDLE","NORMAL","PX_SPACE","RIGHT","RTL","WORD","CHAR","NONE","ELLIPSIS","ATTR_CHANGE_LIST","attrChangeListLen","normalizeFontFamily","fontFamily","hasSpace","hasQuotes","checkDefaultFill","Text","textArr","textArrLen","padding","fontSize","lineHeightPx","verticalAlign","direction","alignY","align","totalWidth","letterSpacing","textDecoration","shouldUnderline","shouldLineThrough","translateY","baseline","metrics","lineTranslateX","lineTranslateY","lastLine","spacesNumber","lineWidth","yOffset","gradient","li","letter","_d","_e","_f","_g","_h","_j","_k","_l","scaleFactor","lines","textWidth","fixedWidth","fixedHeight","maxHeightPx","currentHeightPx","wrap","shouldWrap","wrapAtWord","shouldAddEllipsis","additionalWidth","max","low","high","match","matchWidth","mid","lineArray","substr","substrWidth","matchArray","nextIsSpaceOrDash","wrapIndex","lastSpaceIndex","lastDashIndex","hasLine","WaveformDataChannel","waveformData","channelIndex","sample","values","INT8_MAX","INT8_MIN","INT16_MAX","INT16_MIN","calculateWaveformDataLength","audio_sample_count","data_length","samples_remaining","generateWaveformData","options","amplitude_scale","split_channels","sample_rate","channels","channel","output_channels","version","header_size","bytes_per_sample","total_size","buffer","data_view","scale_counter","min_value","max_value","range_min","range_max","_typeof","isJsonWaveformData","isBinaryWaveformData","isCompatible","view","convertJsonToBinary","expected_length","array_buffer","data_object","decodeBase64","base64","enableUnicode","binaryString","createURL","sourcemapArg","enableUnicodeArg","body","createBase64WorkerFactory","WorkerFactory","WaveformData","defaultOptions","getOptions","opts","getChannelData","audio_buffer","createFromAudioBuffer","worker","createFromArrayBuffer","audioContext","audioData","errorCallback","error","promise","WaveformResampler","input_buffer_length_samples","output_buffer_length_samples","output_header_size","count","total","value","resampler","self","otherWaveforms","otherWaveform","combinedBuffer","headerSize","totalSize","totalDataLength","bufferCollection","w","dataSize","totalBuffer","sourceHeader","totalBufferView","dataOfTotalBuffer","startIndex","endIndex","output_data","output_dataview","bits","waveform","getDefaultExportFromCjs","eventemitter3","has","prefix","Events","EE","once","addListener","emitter","clearEvent","EventEmitter","handlers","ee","listeners","a1","a2","a3","a4","a5","j","eventemitter3Exports","Cue","zeroPad","precision","formatTime","fractionSeconds","seconds","minutes","hours","roundUpToNearest","multiple","multiplier","roundedUp","clamp","min","objectHasProperty","object","field","extend","to","from","isInAscendingOrder","isFinite","isValidTime","isObject","isArrayBuffer","isNullOrUndefined","isFunction","isBoolean","isHTMLElement","isArray","isLinearGradientColor","getMarkerObject","isHeadless","windowIsVisible","requestAnimationFrame","cancelAnimationFrame","eventTypes","EVENT_TYPE_POINT","EVENT_TYPE_SEGMENT_ENTER","EVENT_TYPE_SEGMENT_EXIT","eventNames","eventAttributes","getPointOrSegment","peaks","cue","CueEmitter","segment","previousTime","isForward","step","marker","getSegmentIdComparator","activeSegments","pointOptions","invalidOptions$1","setDefaultPointOptions","peaksOptions","validatePointOptions","updating","Point","pid","startTime","endTime","WaveformPoints","arrayArgs","newPointId","predicate","indexes","removed","itemRemoved","pointId","segmentOptions","invalidOptions","setDefaultSegmentOptions","globalSegmentOptions","validateSegmentOptions","Segment","WaveformSegments","sortedSegments","newSegmentId","segmentId","TAB","LEFT_ARROW","RIGHT_ARROW","keys","KeyboardHandler","eventEmitter","mediaElementHasSource","mediaElement","MediaElementPlayer","eventHandler","SetSourceHandler","setSourceHandler","getAllPropertiesFrom","adapter","allProperties","validateAdapter","publicAdapterMethods","Player","loop","DefaultPointMarker","group","handleWidth","handleHeight","handleX","DefaultSegmentMarker","xPosition","createSegmentMarker","createSegmentLabel","createPointMarker","HighlightLayer","startOffset","endOffset","PointMarker","defaultFontFamily$1","defaultFontSize$1","defaultFontShape$1","PointsLayer","allowEditing","enable","frameStartTime","frameEndTime","pointMarker","isVisible","pointMarkerOffset","pointMarkerX","editable","markerX","pointPid","visible","PlayheadLayer","player","pixelsPerSecond","pixelIndex","frameOffset","playheadX","playheadTextWidth","lastPlayheadPosition","playheadPosition","show","OverlaySegmentMarker","viewHeight","overlayOffset","overlayRectHeight","SegmentMarker","WaveformShape","shapeOptions","startY","endY","startPixels","endPixels","limit","waveformTop","waveformHeight","amplitude","amplitudeScale","lineX","lineY","defaultFontFamily","defaultFontSize","defaultFontShape","SegmentShape","segmentStartOffset","segmentEndOffset","overlayBorderColor","overlayBorderWidth","overlayColor","overlayOpacity","overlayCornerRadius","createOverlayMarker","startMarker","endMarker","eventName","timeOffset","segmentDuration","dragMode","minSegmentWidth","minSegmentDuration","previousSegmentUpdated","nextSegmentUpdated","previousSegmentEndX","previousSegmentEndTime","minPreviousSegmentEndTime","nextSegmentStartX","nextSegmentStartTime","maxNextSegmentStartTime","segmentMarker","getDuration","startMarkerX","endMarkerX","upperLimit","previousSegmentVisible","fixedPreviousSegment","compressPreviousSegment","previousSegmentDuration","lowerLimit","nextSegmentVisible","fixedNextSegment","compressNextSegment","nextSegmentDuration","SegmentsLayer","segmentPid","segmentShape","WaveformAxis","fontStyle","baseSecs","steps","minSpacing","secs","pixels","currentFrameStartTime","axisLabelIntervalSecs","firstAxisLabelSecs","axisLabelOffsetSecs","axisLabelOffsetPixels","label","labelWidth","labelX","labelY","WaveformView","viewOptions","emitViewEvent","clickEvent","mousePosX","viewName","updateWaveform","MouseDragHandler","mouseDownPosX","clientX","containerPos","SeekMouseDragHandler","WaveformOverview","playheadTime","InsertSegmentMouseDragHandler","ScrollMouseDragHandler","playheadOffset","newFrameOffset","WaveformZoomView","initialZoomLevel","mode","wheelEvent","large","increment","endThreshold","isAutoScale","currentTime","apexTime","playheadOffsetPixels","prevScale","apexPixel","sourceWaveform","scrollAmount","playheadPixel","resample","resampleOptions","Scrollbar","zoomview","range","zoomviewRange","scrollBoxPos","ViewController","ZoomController","zoomLevels","zoomLevelIndex","forceUpdate","isXhr2","WaveformBuilder","hasValidContentRangeHeader","xhr","contentRange","matches","firstPos","lastPos","dataUri","requestType","connector","createdWaveformData","webAudioOptions","mediaSourceUrl","webAudioBuilderOptions","webAudio","withCredentials","onLoad","onError","onAbort","Peaks","defaultViewOptions","defaultZoomviewOptions","defaultOverviewOptions","defaultSegmentOptions","defaultScrollbarOptions","getOverviewOptions","overviewOptions","optNames","optName","getZoomviewOptions","zoomviewOptions","getScrollbarOptions","scrollbarOptions","extendOptions","addSegmentOptions","checkContainerElements","zoomviewContainer","overviewContainer","instance","scrollbarContainer","playlistTemplateBody","playerTemplate","setAutoWidth","setWidth","screenWidth","PeaksPlayer","firstMedia","oldValue","newValue","baseValue","srcElt","__publicField","playlistTemplate","PeaksPlaylist","attachPlayerEvent","basename","response","af","trackElt","items","idx","posElt","titleElt","durElt","ms","sec"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}