{"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>&lt;source&gt;</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>&lt;audio&gt;</code>\n *   or <code>&lt;video&gt;</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\\\">&lt;</button>\\n  <div id=\\\"m-pos\\\"></div>\\n  <button id=\\\"m-next\\\">&gt;</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]}