Your IP : 216.73.217.154


Current Path : /var/www/html/dev/reddsis-dev/node_modules/.vite/deps/
Upload File :
Current File : /var/www/html/dev/reddsis-dev/node_modules/.vite/deps/filepond.js.map

{"version":3,"file":"filepond.js","names":["exports"],"sources":["../../filepond/dist/filepond.js"],"sourcesContent":["/*!\n * FilePond 4.32.12\n * Licensed under MIT, https://opensource.org/licenses/MIT/\n * Please visit https://pqina.nl/filepond/ for details.\n */\n\n/* eslint-disable */\n\n(function(global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined'\n        ? factory(exports)\n        : typeof define === 'function' && define.amd\n        ? define(['exports'], factory)\n        : ((global = global || self), factory((global.FilePond = {})));\n})(this, function(exports) {\n    'use strict';\n\n    var isNode = function isNode(value) {\n        return value instanceof HTMLElement;\n    };\n\n    var createStore = function createStore(initialState) {\n        var queries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n        var actions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n        // internal state\n        var state = Object.assign({}, initialState);\n\n        // contains all actions for next frame, is clear when actions are requested\n        var actionQueue = [];\n        var dispatchQueue = [];\n\n        // returns a duplicate of the current state\n        var getState = function getState() {\n            return Object.assign({}, state);\n        };\n\n        // returns a duplicate of the actions array and clears the actions array\n        var processActionQueue = function processActionQueue() {\n            // create copy of actions queue\n            var queue = [].concat(actionQueue);\n\n            // clear actions queue (we don't want no double actions)\n            actionQueue.length = 0;\n\n            return queue;\n        };\n\n        // processes actions that might block the main UI thread\n        var processDispatchQueue = function processDispatchQueue() {\n            // create copy of actions queue\n            var queue = [].concat(dispatchQueue);\n\n            // clear actions queue (we don't want no double actions)\n            dispatchQueue.length = 0;\n\n            // now dispatch these actions\n            queue.forEach(function(_ref) {\n                var type = _ref.type,\n                    data = _ref.data;\n                dispatch(type, data);\n            });\n        };\n\n        // adds a new action, calls its handler and\n        var dispatch = function dispatch(type, data, isBlocking) {\n            // is blocking action (should never block if document is hidden)\n            if (isBlocking && !document.hidden) {\n                dispatchQueue.push({ type: type, data: data });\n                return;\n            }\n\n            // if this action has a handler, handle the action\n            if (actionHandlers[type]) {\n                actionHandlers[type](data);\n            }\n\n            // now add action\n            actionQueue.push({\n                type: type,\n                data: data,\n            });\n        };\n\n        var query = function query(str) {\n            var _queryHandles;\n            for (\n                var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1;\n                _key < _len;\n                _key++\n            ) {\n                args[_key - 1] = arguments[_key];\n            }\n            return queryHandles[str]\n                ? (_queryHandles = queryHandles)[str].apply(_queryHandles, args)\n                : null;\n        };\n\n        var api = {\n            getState: getState,\n            processActionQueue: processActionQueue,\n            processDispatchQueue: processDispatchQueue,\n            dispatch: dispatch,\n            query: query,\n        };\n\n        var queryHandles = {};\n        queries.forEach(function(query) {\n            queryHandles = Object.assign({}, query(state), {}, queryHandles);\n        });\n\n        var actionHandlers = {};\n        actions.forEach(function(action) {\n            actionHandlers = Object.assign({}, action(dispatch, query, state), {}, actionHandlers);\n        });\n\n        return api;\n    };\n\n    var defineProperty = function defineProperty(obj, property, definition) {\n        if (typeof definition === 'function') {\n            obj[property] = definition;\n            return;\n        }\n        Object.defineProperty(obj, property, Object.assign({}, definition));\n    };\n\n    var forin = function forin(obj, cb) {\n        for (var key in obj) {\n            if (!obj.hasOwnProperty(key)) {\n                continue;\n            }\n\n            cb(key, obj[key]);\n        }\n    };\n\n    var createObject = function createObject(definition) {\n        var obj = {};\n        forin(definition, function(property) {\n            defineProperty(obj, property, definition[property]);\n        });\n        return obj;\n    };\n\n    var attr = function attr(node, name) {\n        var value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n        if (value === null) {\n            return node.getAttribute(name) || node.hasAttribute(name);\n        }\n        node.setAttribute(name, value);\n    };\n\n    var ns = 'http://www.w3.org/2000/svg';\n    var svgElements = ['svg', 'path']; // only svg elements used\n\n    var isSVGElement = function isSVGElement(tag) {\n        return svgElements.includes(tag);\n    };\n\n    var createElement = function createElement(tag, className) {\n        var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n        if (typeof className === 'object') {\n            attributes = className;\n            className = null;\n        }\n        var element = isSVGElement(tag)\n            ? document.createElementNS(ns, tag)\n            : document.createElement(tag);\n        if (className) {\n            if (isSVGElement(tag)) {\n                attr(element, 'class', className);\n            } else {\n                element.className = className;\n            }\n        }\n        forin(attributes, function(name, value) {\n            attr(element, name, value);\n        });\n        return element;\n    };\n\n    var appendChild = function appendChild(parent) {\n        return function(child, index) {\n            if (typeof index !== 'undefined' && parent.children[index]) {\n                parent.insertBefore(child, parent.children[index]);\n            } else {\n                parent.appendChild(child);\n            }\n        };\n    };\n\n    var appendChildView = function appendChildView(parent, childViews) {\n        return function(view, index) {\n            if (typeof index !== 'undefined') {\n                childViews.splice(index, 0, view);\n            } else {\n                childViews.push(view);\n            }\n\n            return view;\n        };\n    };\n\n    var removeChildView = function removeChildView(parent, childViews) {\n        return function(view) {\n            // remove from child views\n            childViews.splice(childViews.indexOf(view), 1);\n\n            // remove the element\n            if (view.element.parentNode) {\n                parent.removeChild(view.element);\n            }\n\n            return view;\n        };\n    };\n\n    var IS_BROWSER = (function() {\n        return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n    })();\n    var isBrowser = function isBrowser() {\n        return IS_BROWSER;\n    };\n\n    var testElement = isBrowser() ? createElement('svg') : {};\n    var getChildCount =\n        'children' in testElement\n            ? function(el) {\n                  return el.children.length;\n              }\n            : function(el) {\n                  return el.childNodes.length;\n              };\n\n    var getViewRect = function getViewRect(elementRect, childViews, offset, scale) {\n        var left = offset[0] || elementRect.left;\n        var top = offset[1] || elementRect.top;\n        var right = left + elementRect.width;\n        var bottom = top + elementRect.height * (scale[1] || 1);\n\n        var rect = {\n            // the rectangle of the element itself\n            element: Object.assign({}, elementRect),\n\n            // the rectangle of the element expanded to contain its children, does not include any margins\n            inner: {\n                left: elementRect.left,\n                top: elementRect.top,\n                right: elementRect.right,\n                bottom: elementRect.bottom,\n            },\n\n            // the rectangle of the element expanded to contain its children including own margin and child margins\n            // margins will be added after we've recalculated the size\n            outer: {\n                left: left,\n                top: top,\n                right: right,\n                bottom: bottom,\n            },\n        };\n\n        // expand rect to fit all child rectangles\n        childViews\n            .filter(function(childView) {\n                return !childView.isRectIgnored();\n            })\n            .map(function(childView) {\n                return childView.rect;\n            })\n            .forEach(function(childViewRect) {\n                expandRect(rect.inner, Object.assign({}, childViewRect.inner));\n                expandRect(rect.outer, Object.assign({}, childViewRect.outer));\n            });\n\n        // calculate inner width and height\n        calculateRectSize(rect.inner);\n\n        // append additional margin (top and left margins are included in top and left automatically)\n        rect.outer.bottom += rect.element.marginBottom;\n        rect.outer.right += rect.element.marginRight;\n\n        // calculate outer width and height\n        calculateRectSize(rect.outer);\n\n        return rect;\n    };\n\n    var expandRect = function expandRect(parent, child) {\n        // adjust for parent offset\n        child.top += parent.top;\n        child.right += parent.left;\n        child.bottom += parent.top;\n        child.left += parent.left;\n\n        if (child.bottom > parent.bottom) {\n            parent.bottom = child.bottom;\n        }\n\n        if (child.right > parent.right) {\n            parent.right = child.right;\n        }\n    };\n\n    var calculateRectSize = function calculateRectSize(rect) {\n        rect.width = rect.right - rect.left;\n        rect.height = rect.bottom - rect.top;\n    };\n\n    var isNumber = function isNumber(value) {\n        return typeof value === 'number';\n    };\n\n    /**\n     * Determines if position is at destination\n     * @param position\n     * @param destination\n     * @param velocity\n     * @param errorMargin\n     * @returns {boolean}\n     */\n    var thereYet = function thereYet(position, destination, velocity) {\n        var errorMargin = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.001;\n        return Math.abs(position - destination) < errorMargin && Math.abs(velocity) < errorMargin;\n    };\n\n    /**\n     * Spring animation\n     */\n    var spring =\n        // default options\n        function spring() // method definition\n        {\n            var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n                _ref$stiffness = _ref.stiffness,\n                stiffness = _ref$stiffness === void 0 ? 0.5 : _ref$stiffness,\n                _ref$damping = _ref.damping,\n                damping = _ref$damping === void 0 ? 0.75 : _ref$damping,\n                _ref$mass = _ref.mass,\n                mass = _ref$mass === void 0 ? 10 : _ref$mass;\n            var target = null;\n            var position = null;\n            var velocity = 0;\n            var resting = false;\n\n            // updates spring state\n            var interpolate = function interpolate(ts, skipToEndState) {\n                // in rest, don't animate\n                if (resting) return;\n\n                // need at least a target or position to do springy things\n                if (!(isNumber(target) && isNumber(position))) {\n                    resting = true;\n                    velocity = 0;\n                    return;\n                }\n\n                // calculate spring force\n                var f = -(position - target) * stiffness;\n\n                // update velocity by adding force based on mass\n                velocity += f / mass;\n\n                // update position by adding velocity\n                position += velocity;\n\n                // slow down based on amount of damping\n                velocity *= damping;\n\n                // we've arrived if we're near target and our velocity is near zero\n                if (thereYet(position, target, velocity) || skipToEndState) {\n                    position = target;\n                    velocity = 0;\n                    resting = true;\n\n                    // we done\n                    api.onupdate(position);\n                    api.oncomplete(position);\n                } else {\n                    // progress update\n                    api.onupdate(position);\n                }\n            };\n\n            /**\n             * Set new target value\n             * @param value\n             */\n            var setTarget = function setTarget(value) {\n                // if currently has no position, set target and position to this value\n                if (isNumber(value) && !isNumber(position)) {\n                    position = value;\n                }\n\n                // next target value will not be animated to\n                if (target === null) {\n                    target = value;\n                    position = value;\n                }\n\n                // let start moving to target\n                target = value;\n\n                // already at target\n                if (position === target || typeof target === 'undefined') {\n                    // now resting as target is current position, stop moving\n                    resting = true;\n                    velocity = 0;\n\n                    // done!\n                    api.onupdate(position);\n                    api.oncomplete(position);\n\n                    return;\n                }\n\n                resting = false;\n            };\n\n            // need 'api' to call onupdate callback\n            var api = createObject({\n                interpolate: interpolate,\n                target: {\n                    set: setTarget,\n                    get: function get() {\n                        return target;\n                    },\n                },\n\n                resting: {\n                    get: function get() {\n                        return resting;\n                    },\n                },\n\n                onupdate: function onupdate(value) {},\n                oncomplete: function oncomplete(value) {},\n            });\n\n            return api;\n        };\n\n    var easeLinear = function easeLinear(t) {\n        return t;\n    };\n    var easeInOutQuad = function easeInOutQuad(t) {\n        return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n    };\n\n    var tween =\n        // default values\n        function tween() // method definition\n        {\n            var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n                _ref$duration = _ref.duration,\n                duration = _ref$duration === void 0 ? 500 : _ref$duration,\n                _ref$easing = _ref.easing,\n                easing = _ref$easing === void 0 ? easeInOutQuad : _ref$easing,\n                _ref$delay = _ref.delay,\n                delay = _ref$delay === void 0 ? 0 : _ref$delay;\n            var start = null;\n            var t;\n            var p;\n            var resting = true;\n            var reverse = false;\n            var target = null;\n\n            var interpolate = function interpolate(ts, skipToEndState) {\n                if (resting || target === null) return;\n\n                if (start === null) {\n                    start = ts;\n                }\n\n                if (ts - start < delay) return;\n\n                t = ts - start - delay;\n\n                if (t >= duration || skipToEndState) {\n                    t = 1;\n                    p = reverse ? 0 : 1;\n                    api.onupdate(p * target);\n                    api.oncomplete(p * target);\n                    resting = true;\n                } else {\n                    p = t / duration;\n                    api.onupdate((t >= 0 ? easing(reverse ? 1 - p : p) : 0) * target);\n                }\n            };\n\n            // need 'api' to call onupdate callback\n            var api = createObject({\n                interpolate: interpolate,\n                target: {\n                    get: function get() {\n                        return reverse ? 0 : target;\n                    },\n                    set: function set(value) {\n                        // is initial value\n                        if (target === null) {\n                            target = value;\n                            api.onupdate(value);\n                            api.oncomplete(value);\n                            return;\n                        }\n\n                        // want to tween to a smaller value and have a current value\n                        if (value < target) {\n                            target = 1;\n                            reverse = true;\n                        } else {\n                            // not tweening to a smaller value\n                            reverse = false;\n                            target = value;\n                        }\n\n                        // let's go!\n                        resting = false;\n                        start = null;\n                    },\n                },\n\n                resting: {\n                    get: function get() {\n                        return resting;\n                    },\n                },\n\n                onupdate: function onupdate(value) {},\n                oncomplete: function oncomplete(value) {},\n            });\n\n            return api;\n        };\n\n    var animator = {\n        spring: spring,\n        tween: tween,\n    };\n\n    /*\n                       { type: 'spring', stiffness: .5, damping: .75, mass: 10 };\n                       { translation: { type: 'spring', ... }, ... }\n                       { translation: { x: { type: 'spring', ... } } }\n                      */\n    var createAnimator = function createAnimator(definition, category, property) {\n        // default is single definition\n        // we check if transform is set, if so, we check if property is set\n        var def =\n            definition[category] && typeof definition[category][property] === 'object'\n                ? definition[category][property]\n                : definition[category] || definition;\n\n        var type = typeof def === 'string' ? def : def.type;\n        var props = typeof def === 'object' ? Object.assign({}, def) : {};\n\n        return animator[type] ? animator[type](props) : null;\n    };\n\n    var addGetSet = function addGetSet(keys, obj, props) {\n        var overwrite = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n        obj = Array.isArray(obj) ? obj : [obj];\n        obj.forEach(function(o) {\n            keys.forEach(function(key) {\n                var name = key;\n                var getter = function getter() {\n                    return props[key];\n                };\n                var setter = function setter(value) {\n                    return (props[key] = value);\n                };\n\n                if (typeof key === 'object') {\n                    name = key.key;\n                    getter = key.getter || getter;\n                    setter = key.setter || setter;\n                }\n\n                if (o[name] && !overwrite) {\n                    return;\n                }\n\n                o[name] = {\n                    get: getter,\n                    set: setter,\n                };\n            });\n        });\n    };\n\n    // add to state,\n    // add getters and setters to internal and external api (if not set)\n    // setup animators\n\n    var animations = function animations(_ref) {\n        var mixinConfig = _ref.mixinConfig,\n            viewProps = _ref.viewProps,\n            viewInternalAPI = _ref.viewInternalAPI,\n            viewExternalAPI = _ref.viewExternalAPI;\n        // initial properties\n        var initialProps = Object.assign({}, viewProps);\n\n        // list of all active animations\n        var animations = [];\n\n        // setup animators\n        forin(mixinConfig, function(property, animation) {\n            var animator = createAnimator(animation);\n            if (!animator) {\n                return;\n            }\n\n            // when the animator updates, update the view state value\n            animator.onupdate = function(value) {\n                viewProps[property] = value;\n            };\n\n            // set animator target\n            animator.target = initialProps[property];\n\n            // when value is set, set the animator target value\n            var prop = {\n                key: property,\n                setter: function setter(value) {\n                    // if already at target, we done!\n                    if (animator.target === value) {\n                        return;\n                    }\n\n                    animator.target = value;\n                },\n                getter: function getter() {\n                    return viewProps[property];\n                },\n            };\n\n            // add getters and setters\n            addGetSet([prop], [viewInternalAPI, viewExternalAPI], viewProps, true);\n\n            // add it to the list for easy updating from the _write method\n            animations.push(animator);\n        });\n\n        // expose internal write api\n        return {\n            write: function write(ts) {\n                var skipToEndState = document.hidden;\n                var resting = true;\n                animations.forEach(function(animation) {\n                    if (!animation.resting) resting = false;\n                    animation.interpolate(ts, skipToEndState);\n                });\n                return resting;\n            },\n            destroy: function destroy() {},\n        };\n    };\n\n    var addEvent = function addEvent(element) {\n        return function(type, fn) {\n            element.addEventListener(type, fn);\n        };\n    };\n\n    var removeEvent = function removeEvent(element) {\n        return function(type, fn) {\n            element.removeEventListener(type, fn);\n        };\n    };\n\n    // mixin\n    var listeners = function listeners(_ref) {\n        var mixinConfig = _ref.mixinConfig,\n            viewProps = _ref.viewProps,\n            viewInternalAPI = _ref.viewInternalAPI,\n            viewExternalAPI = _ref.viewExternalAPI,\n            viewState = _ref.viewState,\n            view = _ref.view;\n        var events = [];\n\n        var add = addEvent(view.element);\n        var remove = removeEvent(view.element);\n\n        viewExternalAPI.on = function(type, fn) {\n            events.push({\n                type: type,\n                fn: fn,\n            });\n\n            add(type, fn);\n        };\n\n        viewExternalAPI.off = function(type, fn) {\n            events.splice(\n                events.findIndex(function(event) {\n                    return event.type === type && event.fn === fn;\n                }),\n                1\n            );\n\n            remove(type, fn);\n        };\n\n        return {\n            write: function write() {\n                // not busy\n                return true;\n            },\n            destroy: function destroy() {\n                events.forEach(function(event) {\n                    remove(event.type, event.fn);\n                });\n            },\n        };\n    };\n\n    // add to external api and link to props\n\n    var apis = function apis(_ref) {\n        var mixinConfig = _ref.mixinConfig,\n            viewProps = _ref.viewProps,\n            viewExternalAPI = _ref.viewExternalAPI;\n        addGetSet(mixinConfig, viewExternalAPI, viewProps);\n    };\n\n    var isDefined = function isDefined(value) {\n        return value != null;\n    };\n\n    // add to state,\n    // add getters and setters to internal and external api (if not set)\n    // set initial state based on props in viewProps\n    // apply as transforms each frame\n\n    var defaults = {\n        opacity: 1,\n        scaleX: 1,\n        scaleY: 1,\n        translateX: 0,\n        translateY: 0,\n        rotateX: 0,\n        rotateY: 0,\n        rotateZ: 0,\n        originX: 0,\n        originY: 0,\n    };\n\n    var styles = function styles(_ref) {\n        var mixinConfig = _ref.mixinConfig,\n            viewProps = _ref.viewProps,\n            viewInternalAPI = _ref.viewInternalAPI,\n            viewExternalAPI = _ref.viewExternalAPI,\n            view = _ref.view;\n        // initial props\n        var initialProps = Object.assign({}, viewProps);\n\n        // current props\n        var currentProps = {};\n\n        // we will add those properties to the external API and link them to the viewState\n        addGetSet(mixinConfig, [viewInternalAPI, viewExternalAPI], viewProps);\n\n        // override rect on internal and external rect getter so it takes in account transforms\n        var getOffset = function getOffset() {\n            return [viewProps['translateX'] || 0, viewProps['translateY'] || 0];\n        };\n\n        var getScale = function getScale() {\n            return [viewProps['scaleX'] || 0, viewProps['scaleY'] || 0];\n        };\n        var getRect = function getRect() {\n            return view.rect\n                ? getViewRect(view.rect, view.childViews, getOffset(), getScale())\n                : null;\n        };\n        viewInternalAPI.rect = { get: getRect };\n        viewExternalAPI.rect = { get: getRect };\n\n        // apply view props\n        mixinConfig.forEach(function(key) {\n            viewProps[key] =\n                typeof initialProps[key] === 'undefined' ? defaults[key] : initialProps[key];\n        });\n\n        // expose api\n        return {\n            write: function write() {\n                // see if props have changed\n                if (!propsHaveChanged(currentProps, viewProps)) {\n                    return;\n                }\n\n                // moves element to correct position on screen\n                applyStyles(view.element, viewProps);\n\n                // store new transforms\n                Object.assign(currentProps, Object.assign({}, viewProps));\n\n                // no longer busy\n                return true;\n            },\n            destroy: function destroy() {},\n        };\n    };\n\n    var propsHaveChanged = function propsHaveChanged(currentProps, newProps) {\n        // different amount of keys\n        if (Object.keys(currentProps).length !== Object.keys(newProps).length) {\n            return true;\n        }\n\n        // lets analyze the individual props\n        for (var prop in newProps) {\n            if (newProps[prop] !== currentProps[prop]) {\n                return true;\n            }\n        }\n\n        return false;\n    };\n\n    var applyStyles = function applyStyles(element, _ref2) {\n        var opacity = _ref2.opacity,\n            perspective = _ref2.perspective,\n            translateX = _ref2.translateX,\n            translateY = _ref2.translateY,\n            scaleX = _ref2.scaleX,\n            scaleY = _ref2.scaleY,\n            rotateX = _ref2.rotateX,\n            rotateY = _ref2.rotateY,\n            rotateZ = _ref2.rotateZ,\n            originX = _ref2.originX,\n            originY = _ref2.originY,\n            width = _ref2.width,\n            height = _ref2.height;\n\n        var transforms = '';\n        var styles = '';\n\n        // handle transform origin\n        if (isDefined(originX) || isDefined(originY)) {\n            styles += 'transform-origin: ' + (originX || 0) + 'px ' + (originY || 0) + 'px;';\n        }\n\n        // transform order is relevant\n        // 0. perspective\n        if (isDefined(perspective)) {\n            transforms += 'perspective(' + perspective + 'px) ';\n        }\n\n        // 1. translate\n        if (isDefined(translateX) || isDefined(translateY)) {\n            transforms +=\n                'translate3d(' + (translateX || 0) + 'px, ' + (translateY || 0) + 'px, 0) ';\n        }\n\n        // 2. scale\n        if (isDefined(scaleX) || isDefined(scaleY)) {\n            transforms +=\n                'scale3d(' +\n                (isDefined(scaleX) ? scaleX : 1) +\n                ', ' +\n                (isDefined(scaleY) ? scaleY : 1) +\n                ', 1) ';\n        }\n\n        // 3. rotate\n        if (isDefined(rotateZ)) {\n            transforms += 'rotateZ(' + rotateZ + 'rad) ';\n        }\n\n        if (isDefined(rotateX)) {\n            transforms += 'rotateX(' + rotateX + 'rad) ';\n        }\n\n        if (isDefined(rotateY)) {\n            transforms += 'rotateY(' + rotateY + 'rad) ';\n        }\n\n        // add transforms\n        if (transforms.length) {\n            styles += 'transform:' + transforms + ';';\n        }\n\n        // add opacity\n        if (isDefined(opacity)) {\n            styles += 'opacity:' + opacity + ';';\n\n            // if we reach zero, we make the element inaccessible\n            if (opacity === 0) {\n                styles += 'visibility:hidden;';\n            }\n\n            // if we're below 100% opacity this element can't be clicked\n            if (opacity < 1) {\n                styles += 'pointer-events:none;';\n            }\n        }\n\n        // add height\n        if (isDefined(height)) {\n            styles += 'height:' + height + 'px;';\n        }\n\n        // add width\n        if (isDefined(width)) {\n            styles += 'width:' + width + 'px;';\n        }\n\n        // apply styles\n        var elementCurrentStyle = element.elementCurrentStyle || '';\n\n        // if new styles does not match current styles, lets update!\n        if (styles.length !== elementCurrentStyle.length || styles !== elementCurrentStyle) {\n            element.style.cssText = styles;\n            // store current styles so we can compare them to new styles later on\n            // _not_ getting the style value is faster\n            element.elementCurrentStyle = styles;\n        }\n    };\n\n    var Mixins = {\n        styles: styles,\n        listeners: listeners,\n        animations: animations,\n        apis: apis,\n    };\n\n    var updateRect = function updateRect() {\n        var rect = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        var style = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n        if (!element.layoutCalculated) {\n            rect.paddingTop = parseInt(style.paddingTop, 10) || 0;\n            rect.marginTop = parseInt(style.marginTop, 10) || 0;\n            rect.marginRight = parseInt(style.marginRight, 10) || 0;\n            rect.marginBottom = parseInt(style.marginBottom, 10) || 0;\n            rect.marginLeft = parseInt(style.marginLeft, 10) || 0;\n            element.layoutCalculated = true;\n        }\n\n        rect.left = element.offsetLeft || 0;\n        rect.top = element.offsetTop || 0;\n        rect.width = element.offsetWidth || 0;\n        rect.height = element.offsetHeight || 0;\n\n        rect.right = rect.left + rect.width;\n        rect.bottom = rect.top + rect.height;\n\n        rect.scrollTop = element.scrollTop;\n\n        rect.hidden = element.offsetParent === null;\n\n        return rect;\n    };\n\n    var createView =\n        // default view definition\n        function createView() {\n            var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n                _ref$tag = _ref.tag,\n                tag = _ref$tag === void 0 ? 'div' : _ref$tag,\n                _ref$name = _ref.name,\n                name = _ref$name === void 0 ? null : _ref$name,\n                _ref$attributes = _ref.attributes,\n                attributes = _ref$attributes === void 0 ? {} : _ref$attributes,\n                _ref$read = _ref.read,\n                read = _ref$read === void 0 ? function() {} : _ref$read,\n                _ref$write = _ref.write,\n                write = _ref$write === void 0 ? function() {} : _ref$write,\n                _ref$create = _ref.create,\n                create = _ref$create === void 0 ? function() {} : _ref$create,\n                _ref$destroy = _ref.destroy,\n                destroy = _ref$destroy === void 0 ? function() {} : _ref$destroy,\n                _ref$filterFrameActio = _ref.filterFrameActionsForChild,\n                filterFrameActionsForChild =\n                    _ref$filterFrameActio === void 0\n                        ? function(child, actions) {\n                              return actions;\n                          }\n                        : _ref$filterFrameActio,\n                _ref$didCreateView = _ref.didCreateView,\n                didCreateView = _ref$didCreateView === void 0 ? function() {} : _ref$didCreateView,\n                _ref$didWriteView = _ref.didWriteView,\n                didWriteView = _ref$didWriteView === void 0 ? function() {} : _ref$didWriteView,\n                _ref$ignoreRect = _ref.ignoreRect,\n                ignoreRect = _ref$ignoreRect === void 0 ? false : _ref$ignoreRect,\n                _ref$ignoreRectUpdate = _ref.ignoreRectUpdate,\n                ignoreRectUpdate = _ref$ignoreRectUpdate === void 0 ? false : _ref$ignoreRectUpdate,\n                _ref$mixins = _ref.mixins,\n                mixins = _ref$mixins === void 0 ? [] : _ref$mixins;\n            return function(\n                // each view requires reference to store\n                store\n            ) {\n                var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                // root element should not be changed\n                var element = createElement(tag, 'filepond--' + name, attributes);\n\n                // style reference should also not be changed\n                var style = window.getComputedStyle(element, null);\n\n                // element rectangle\n                var rect = updateRect();\n                var frameRect = null;\n\n                // rest state\n                var isResting = false;\n\n                // pretty self explanatory\n                var childViews = [];\n\n                // loaded mixins\n                var activeMixins = [];\n\n                // references to created children\n                var ref = {};\n\n                // state used for each instance\n                var state = {};\n\n                // list of writers that will be called to update this view\n                var writers = [\n                    write, // default writer\n                ];\n\n                var readers = [\n                    read, // default reader\n                ];\n\n                var destroyers = [\n                    destroy, // default destroy\n                ];\n\n                // core view methods\n                var getElement = function getElement() {\n                    return element;\n                };\n                var getChildViews = function getChildViews() {\n                    return childViews.concat();\n                };\n                var getReference = function getReference() {\n                    return ref;\n                };\n                var createChildView = function createChildView(store) {\n                    return function(view, props) {\n                        return view(store, props);\n                    };\n                };\n                var getRect = function getRect() {\n                    if (frameRect) {\n                        return frameRect;\n                    }\n                    frameRect = getViewRect(rect, childViews, [0, 0], [1, 1]);\n                    return frameRect;\n                };\n                var getStyle = function getStyle() {\n                    return style;\n                };\n\n                /**\n                 * Read data from DOM\n                 * @private\n                 */\n                var _read = function _read() {\n                    frameRect = null;\n\n                    // read child views\n                    childViews.forEach(function(child) {\n                        return child._read();\n                    });\n\n                    var shouldUpdate = !(ignoreRectUpdate && rect.width && rect.height);\n                    if (shouldUpdate) {\n                        updateRect(rect, element, style);\n                    }\n\n                    // readers\n                    var api = { root: internalAPI, props: props, rect: rect };\n                    readers.forEach(function(reader) {\n                        return reader(api);\n                    });\n                };\n\n                /**\n                 * Write data to DOM\n                 * @private\n                 */\n                var _write = function _write(ts, frameActions, shouldOptimize) {\n                    // if no actions, we assume that the view is resting\n                    var resting = frameActions.length === 0;\n\n                    // writers\n                    writers.forEach(function(writer) {\n                        var writerResting = writer({\n                            props: props,\n                            root: internalAPI,\n                            actions: frameActions,\n                            timestamp: ts,\n                            shouldOptimize: shouldOptimize,\n                        });\n\n                        if (writerResting === false) {\n                            resting = false;\n                        }\n                    });\n\n                    // run mixins\n                    activeMixins.forEach(function(mixin) {\n                        // if one of the mixins is still busy after write operation, we are not resting\n                        var mixinResting = mixin.write(ts);\n                        if (mixinResting === false) {\n                            resting = false;\n                        }\n                    });\n\n                    // updates child views that are currently attached to the DOM\n                    childViews\n                        .filter(function(child) {\n                            return !!child.element.parentNode;\n                        })\n                        .forEach(function(child) {\n                            // if a child view is not resting, we are not resting\n                            var childResting = child._write(\n                                ts,\n                                filterFrameActionsForChild(child, frameActions),\n                                shouldOptimize\n                            );\n\n                            if (!childResting) {\n                                resting = false;\n                            }\n                        });\n\n                    // append new elements to DOM and update those\n                    childViews\n                        //.filter(child => !child.element.parentNode)\n                        .forEach(function(child, index) {\n                            // skip\n                            if (child.element.parentNode) {\n                                return;\n                            }\n\n                            // append to DOM\n                            internalAPI.appendChild(child.element, index);\n\n                            // call read (need to know the size of these elements)\n                            child._read();\n\n                            // re-call write\n                            child._write(\n                                ts,\n                                filterFrameActionsForChild(child, frameActions),\n                                shouldOptimize\n                            );\n\n                            // we just added somthing to the dom, no rest\n                            resting = false;\n                        });\n\n                    // update resting state\n                    isResting = resting;\n\n                    didWriteView({\n                        props: props,\n                        root: internalAPI,\n                        actions: frameActions,\n                        timestamp: ts,\n                    });\n\n                    // let parent know if we are resting\n                    return resting;\n                };\n\n                var _destroy = function _destroy() {\n                    activeMixins.forEach(function(mixin) {\n                        return mixin.destroy();\n                    });\n                    destroyers.forEach(function(destroyer) {\n                        destroyer({ root: internalAPI, props: props });\n                    });\n                    childViews.forEach(function(child) {\n                        return child._destroy();\n                    });\n                };\n\n                // sharedAPI\n                var sharedAPIDefinition = {\n                    element: {\n                        get: getElement,\n                    },\n\n                    style: {\n                        get: getStyle,\n                    },\n\n                    childViews: {\n                        get: getChildViews,\n                    },\n                };\n\n                // private API definition\n                var internalAPIDefinition = Object.assign({}, sharedAPIDefinition, {\n                    rect: {\n                        get: getRect,\n                    },\n\n                    // access to custom children references\n                    ref: {\n                        get: getReference,\n                    },\n\n                    // dom modifiers\n                    is: function is(needle) {\n                        return name === needle;\n                    },\n                    appendChild: appendChild(element),\n                    createChildView: createChildView(store),\n                    linkView: function linkView(view) {\n                        childViews.push(view);\n                        return view;\n                    },\n                    unlinkView: function unlinkView(view) {\n                        childViews.splice(childViews.indexOf(view), 1);\n                    },\n                    appendChildView: appendChildView(element, childViews),\n                    removeChildView: removeChildView(element, childViews),\n                    registerWriter: function registerWriter(writer) {\n                        return writers.push(writer);\n                    },\n                    registerReader: function registerReader(reader) {\n                        return readers.push(reader);\n                    },\n                    registerDestroyer: function registerDestroyer(destroyer) {\n                        return destroyers.push(destroyer);\n                    },\n                    invalidateLayout: function invalidateLayout() {\n                        return (element.layoutCalculated = false);\n                    },\n\n                    // access to data store\n                    dispatch: store.dispatch,\n                    query: store.query,\n                });\n\n                // public view API methods\n                var externalAPIDefinition = {\n                    element: {\n                        get: getElement,\n                    },\n\n                    childViews: {\n                        get: getChildViews,\n                    },\n\n                    rect: {\n                        get: getRect,\n                    },\n\n                    resting: {\n                        get: function get() {\n                            return isResting;\n                        },\n                    },\n\n                    isRectIgnored: function isRectIgnored() {\n                        return ignoreRect;\n                    },\n                    _read: _read,\n                    _write: _write,\n                    _destroy: _destroy,\n                };\n\n                // mixin API methods\n                var mixinAPIDefinition = Object.assign({}, sharedAPIDefinition, {\n                    rect: {\n                        get: function get() {\n                            return rect;\n                        },\n                    },\n                });\n\n                // add mixin functionality\n                Object.keys(mixins)\n                    .sort(function(a, b) {\n                        // move styles to the back of the mixin list (so adjustments of other mixins are applied to the props correctly)\n                        if (a === 'styles') {\n                            return 1;\n                        } else if (b === 'styles') {\n                            return -1;\n                        }\n                        return 0;\n                    })\n                    .forEach(function(key) {\n                        var mixinAPI = Mixins[key]({\n                            mixinConfig: mixins[key],\n                            viewProps: props,\n                            viewState: state,\n                            viewInternalAPI: internalAPIDefinition,\n                            viewExternalAPI: externalAPIDefinition,\n                            view: createObject(mixinAPIDefinition),\n                        });\n\n                        if (mixinAPI) {\n                            activeMixins.push(mixinAPI);\n                        }\n                    });\n\n                // construct private api\n                var internalAPI = createObject(internalAPIDefinition);\n\n                // create the view\n                create({\n                    root: internalAPI,\n                    props: props,\n                });\n\n                // append created child views to root node\n                var childCount = getChildCount(element); // need to know the current child count so appending happens in correct order\n                childViews.forEach(function(child, index) {\n                    internalAPI.appendChild(child.element, childCount + index);\n                });\n\n                // call did create\n                didCreateView(internalAPI);\n\n                // expose public api\n                return createObject(externalAPIDefinition);\n            };\n        };\n\n    var createPainter = function createPainter(read, write) {\n        var fps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 60;\n\n        var name = '__framePainter';\n\n        // set global painter\n        if (window[name]) {\n            window[name].readers.push(read);\n            window[name].writers.push(write);\n            return;\n        }\n\n        window[name] = {\n            readers: [read],\n            writers: [write],\n        };\n\n        var painter = window[name];\n\n        var interval = 1000 / fps;\n        var last = null;\n        var id = null;\n        var requestTick = null;\n        var cancelTick = null;\n\n        var setTimerType = function setTimerType() {\n            if (document.hidden) {\n                requestTick = function requestTick() {\n                    return window.setTimeout(function() {\n                        return tick(performance.now());\n                    }, interval);\n                };\n                cancelTick = function cancelTick() {\n                    return window.clearTimeout(id);\n                };\n            } else {\n                requestTick = function requestTick() {\n                    return window.requestAnimationFrame(tick);\n                };\n                cancelTick = function cancelTick() {\n                    return window.cancelAnimationFrame(id);\n                };\n            }\n        };\n\n        document.addEventListener('visibilitychange', function() {\n            if (cancelTick) cancelTick();\n            setTimerType();\n            tick(performance.now());\n        });\n\n        var tick = function tick(ts) {\n            // queue next tick\n            id = requestTick(tick);\n\n            // limit fps\n            if (!last) {\n                last = ts;\n            }\n\n            var delta = ts - last;\n\n            if (delta <= interval) {\n                // skip frame\n                return;\n            }\n\n            // align next frame\n            last = ts - (delta % interval);\n\n            // update view\n            painter.readers.forEach(function(read) {\n                return read();\n            });\n            painter.writers.forEach(function(write) {\n                return write(ts);\n            });\n        };\n\n        setTimerType();\n        tick(performance.now());\n\n        return {\n            pause: function pause() {\n                cancelTick(id);\n            },\n        };\n    };\n\n    var createRoute = function createRoute(routes, fn) {\n        return function(_ref) {\n            var root = _ref.root,\n                props = _ref.props,\n                _ref$actions = _ref.actions,\n                actions = _ref$actions === void 0 ? [] : _ref$actions,\n                timestamp = _ref.timestamp,\n                shouldOptimize = _ref.shouldOptimize;\n            actions\n                .filter(function(action) {\n                    return routes[action.type];\n                })\n                .forEach(function(action) {\n                    return routes[action.type]({\n                        root: root,\n                        props: props,\n                        action: action.data,\n                        timestamp: timestamp,\n                        shouldOptimize: shouldOptimize,\n                    });\n                });\n\n            if (fn) {\n                fn({\n                    root: root,\n                    props: props,\n                    actions: actions,\n                    timestamp: timestamp,\n                    shouldOptimize: shouldOptimize,\n                });\n            }\n        };\n    };\n\n    var insertBefore = function insertBefore(newNode, referenceNode) {\n        return referenceNode.parentNode.insertBefore(newNode, referenceNode);\n    };\n\n    var insertAfter = function insertAfter(newNode, referenceNode) {\n        return referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\n    };\n\n    var isArray = function isArray(value) {\n        return Array.isArray(value);\n    };\n\n    var isEmpty = function isEmpty(value) {\n        return value == null;\n    };\n\n    var trim = function trim(str) {\n        return str.trim();\n    };\n\n    var toString = function toString(value) {\n        return '' + value;\n    };\n\n    var toArray = function toArray(value) {\n        var splitter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';\n        if (isEmpty(value)) {\n            return [];\n        }\n        if (isArray(value)) {\n            return value;\n        }\n        return toString(value)\n            .split(splitter)\n            .map(trim)\n            .filter(function(str) {\n                return str.length;\n            });\n    };\n\n    var isBoolean = function isBoolean(value) {\n        return typeof value === 'boolean';\n    };\n\n    var toBoolean = function toBoolean(value) {\n        return isBoolean(value) ? value : value === 'true';\n    };\n\n    var isString = function isString(value) {\n        return typeof value === 'string';\n    };\n\n    var toNumber = function toNumber(value) {\n        return isNumber(value)\n            ? value\n            : isString(value)\n            ? toString(value).replace(/[a-z]+/gi, '')\n            : 0;\n    };\n\n    var toInt = function toInt(value) {\n        return parseInt(toNumber(value), 10);\n    };\n\n    var toFloat = function toFloat(value) {\n        return parseFloat(toNumber(value));\n    };\n\n    var isInt = function isInt(value) {\n        return isNumber(value) && isFinite(value) && Math.floor(value) === value;\n    };\n\n    var toBytes = function toBytes(value) {\n        var base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n        // is in bytes\n        if (isInt(value)) {\n            return value;\n        }\n\n        // is natural file size\n        var naturalFileSize = toString(value).trim();\n\n        // if is value in megabytes\n        if (/MB$/i.test(naturalFileSize)) {\n            naturalFileSize = naturalFileSize.replace(/MB$i/, '').trim();\n            return toInt(naturalFileSize) * base * base;\n        }\n\n        // if is value in kilobytes\n        if (/KB/i.test(naturalFileSize)) {\n            naturalFileSize = naturalFileSize.replace(/KB$i/, '').trim();\n            return toInt(naturalFileSize) * base;\n        }\n\n        return toInt(naturalFileSize);\n    };\n\n    var isFunction = function isFunction(value) {\n        return typeof value === 'function';\n    };\n\n    var toFunctionReference = function toFunctionReference(string) {\n        var ref = self;\n        var levels = string.split('.');\n        var level = null;\n        while ((level = levels.shift())) {\n            ref = ref[level];\n            if (!ref) {\n                return null;\n            }\n        }\n        return ref;\n    };\n\n    var methods = {\n        process: 'POST',\n        patch: 'PATCH',\n        revert: 'DELETE',\n        fetch: 'GET',\n        restore: 'GET',\n        load: 'GET',\n    };\n\n    var createServerAPI = function createServerAPI(outline) {\n        var api = {};\n\n        api.url = isString(outline) ? outline : outline.url || '';\n        api.timeout = outline.timeout ? parseInt(outline.timeout, 10) : 0;\n        api.headers = outline.headers ? outline.headers : {};\n\n        forin(methods, function(key) {\n            api[key] = createAction(key, outline[key], methods[key], api.timeout, api.headers);\n        });\n\n        // remove process if no url or process on outline\n        api.process = outline.process || isString(outline) || outline.url ? api.process : null;\n\n        // special treatment for remove\n        api.remove = outline.remove || null;\n\n        // remove generic headers from api object\n        delete api.headers;\n\n        return api;\n    };\n\n    var createAction = function createAction(name, outline, method, timeout, headers) {\n        // is explicitely set to null so disable\n        if (outline === null) {\n            return null;\n        }\n\n        // if is custom function, done! Dev handles everything.\n        if (typeof outline === 'function') {\n            return outline;\n        }\n\n        // build action object\n        var action = {\n            url: method === 'GET' || method === 'PATCH' ? '?' + name + '=' : '',\n            method: method,\n            headers: headers,\n            withCredentials: false,\n            timeout: timeout,\n            onload: null,\n            ondata: null,\n            onerror: null,\n        };\n\n        // is a single url\n        if (isString(outline)) {\n            action.url = outline;\n            return action;\n        }\n\n        // overwrite\n        Object.assign(action, outline);\n\n        // see if should reformat headers;\n        if (isString(action.headers)) {\n            var parts = action.headers.split(/:(.+)/);\n            action.headers = {\n                header: parts[0],\n                value: parts[1],\n            };\n        }\n\n        // if is bool withCredentials\n        action.withCredentials = toBoolean(action.withCredentials);\n\n        return action;\n    };\n\n    var toServerAPI = function toServerAPI(value) {\n        return createServerAPI(value);\n    };\n\n    var isNull = function isNull(value) {\n        return value === null;\n    };\n\n    var isObject = function isObject(value) {\n        return typeof value === 'object' && value !== null;\n    };\n\n    var isAPI = function isAPI(value) {\n        return (\n            isObject(value) &&\n            isString(value.url) &&\n            isObject(value.process) &&\n            isObject(value.revert) &&\n            isObject(value.restore) &&\n            isObject(value.fetch)\n        );\n    };\n\n    var getType = function getType(value) {\n        if (isArray(value)) {\n            return 'array';\n        }\n\n        if (isNull(value)) {\n            return 'null';\n        }\n\n        if (isInt(value)) {\n            return 'int';\n        }\n\n        if (/^[0-9]+ ?(?:GB|MB|KB)$/gi.test(value)) {\n            return 'bytes';\n        }\n\n        if (isAPI(value)) {\n            return 'api';\n        }\n\n        return typeof value;\n    };\n\n    var replaceSingleQuotes = function replaceSingleQuotes(str) {\n        return str\n            .replace(/{\\s*'/g, '{\"')\n            .replace(/'\\s*}/g, '\"}')\n            .replace(/'\\s*:/g, '\":')\n            .replace(/:\\s*'/g, ':\"')\n            .replace(/,\\s*'/g, ',\"')\n            .replace(/'\\s*,/g, '\",');\n    };\n\n    var conversionTable = {\n        array: toArray,\n        boolean: toBoolean,\n        int: function int(value) {\n            return getType(value) === 'bytes' ? toBytes(value) : toInt(value);\n        },\n        number: toFloat,\n        float: toFloat,\n        bytes: toBytes,\n        string: function string(value) {\n            return isFunction(value) ? value : toString(value);\n        },\n        function: function _function(value) {\n            return toFunctionReference(value);\n        },\n        serverapi: toServerAPI,\n        object: function object(value) {\n            try {\n                return JSON.parse(replaceSingleQuotes(value));\n            } catch (e) {\n                return null;\n            }\n        },\n    };\n\n    var convertTo = function convertTo(value, type) {\n        return conversionTable[type](value);\n    };\n\n    var getValueByType = function getValueByType(newValue, defaultValue, valueType) {\n        // can always assign default value\n        if (newValue === defaultValue) {\n            return newValue;\n        }\n\n        // get the type of the new value\n        var newValueType = getType(newValue);\n\n        // is valid type?\n        if (newValueType !== valueType) {\n            // is string input, let's attempt to convert\n            var convertedValue = convertTo(newValue, valueType);\n\n            // what is the type now\n            newValueType = getType(convertedValue);\n\n            // no valid conversions found\n            if (convertedValue === null) {\n                throw 'Trying to assign value with incorrect type to \"' +\n                    option +\n                    '\", allowed type: \"' +\n                    valueType +\n                    '\"';\n            } else {\n                newValue = convertedValue;\n            }\n        }\n\n        // assign new value\n        return newValue;\n    };\n\n    var createOption = function createOption(defaultValue, valueType) {\n        var currentValue = defaultValue;\n        return {\n            enumerable: true,\n            get: function get() {\n                return currentValue;\n            },\n            set: function set(newValue) {\n                currentValue = getValueByType(newValue, defaultValue, valueType);\n            },\n        };\n    };\n\n    var createOptions = function createOptions(options) {\n        var obj = {};\n        forin(options, function(prop) {\n            var optionDefinition = options[prop];\n            obj[prop] = createOption(optionDefinition[0], optionDefinition[1]);\n        });\n        return createObject(obj);\n    };\n\n    var createInitialState = function createInitialState(options) {\n        return {\n            // model\n            items: [],\n\n            // timeout used for calling update items\n            listUpdateTimeout: null,\n\n            // timeout used for stacking metadata updates\n            itemUpdateTimeout: null,\n\n            // queue of items waiting to be processed\n            processingQueue: [],\n\n            // options\n            options: createOptions(options),\n        };\n    };\n\n    var fromCamels = function fromCamels(string) {\n        var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '-';\n        return string\n            .split(/(?=[A-Z])/)\n            .map(function(part) {\n                return part.toLowerCase();\n            })\n            .join(separator);\n    };\n\n    var createOptionAPI = function createOptionAPI(store, options) {\n        var obj = {};\n        forin(options, function(key) {\n            obj[key] = {\n                get: function get() {\n                    return store.getState().options[key];\n                },\n                set: function set(value) {\n                    store.dispatch('SET_' + fromCamels(key, '_').toUpperCase(), {\n                        value: value,\n                    });\n                },\n            };\n        });\n        return obj;\n    };\n\n    var createOptionActions = function createOptionActions(options) {\n        return function(dispatch, query, state) {\n            var obj = {};\n            forin(options, function(key) {\n                var name = fromCamels(key, '_').toUpperCase();\n\n                obj['SET_' + name] = function(action) {\n                    try {\n                        state.options[key] = action.value;\n                    } catch (e) {} // nope, failed\n\n                    // we successfully set the value of this option\n                    dispatch('DID_SET_' + name, { value: state.options[key] });\n                };\n            });\n            return obj;\n        };\n    };\n\n    var createOptionQueries = function createOptionQueries(options) {\n        return function(state) {\n            var obj = {};\n            forin(options, function(key) {\n                obj['GET_' + fromCamels(key, '_').toUpperCase()] = function(action) {\n                    return state.options[key];\n                };\n            });\n            return obj;\n        };\n    };\n\n    var InteractionMethod = {\n        API: 1,\n        DROP: 2,\n        BROWSE: 3,\n        PASTE: 4,\n        NONE: 5,\n    };\n\n    var getUniqueId = function getUniqueId() {\n        return Math.random()\n            .toString(36)\n            .substring(2, 11);\n    };\n\n    function _typeof(obj) {\n        if (typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol') {\n            _typeof = function(obj) {\n                return typeof obj;\n            };\n        } else {\n            _typeof = function(obj) {\n                return obj &&\n                    typeof Symbol === 'function' &&\n                    obj.constructor === Symbol &&\n                    obj !== Symbol.prototype\n                    ? 'symbol'\n                    : typeof obj;\n            };\n        }\n\n        return _typeof(obj);\n    }\n\n    var REACT_ELEMENT_TYPE;\n\n    function _jsx(type, props, key, children) {\n        if (!REACT_ELEMENT_TYPE) {\n            REACT_ELEMENT_TYPE =\n                (typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element')) ||\n                0xeac7;\n        }\n\n        var defaultProps = type && type.defaultProps;\n        var childrenLength = arguments.length - 3;\n\n        if (!props && childrenLength !== 0) {\n            props = {\n                children: void 0,\n            };\n        }\n\n        if (props && defaultProps) {\n            for (var propName in defaultProps) {\n                if (props[propName] === void 0) {\n                    props[propName] = defaultProps[propName];\n                }\n            }\n        } else if (!props) {\n            props = defaultProps || {};\n        }\n\n        if (childrenLength === 1) {\n            props.children = children;\n        } else if (childrenLength > 1) {\n            var childArray = new Array(childrenLength);\n\n            for (var i = 0; i < childrenLength; i++) {\n                childArray[i] = arguments[i + 3];\n            }\n\n            props.children = childArray;\n        }\n\n        return {\n            $$typeof: REACT_ELEMENT_TYPE,\n            type: type,\n            key: key === undefined ? null : '' + key,\n            ref: null,\n            props: props,\n            _owner: null,\n        };\n    }\n\n    function _asyncIterator(iterable) {\n        var method;\n\n        if (typeof Symbol !== 'undefined') {\n            if (Symbol.asyncIterator) {\n                method = iterable[Symbol.asyncIterator];\n                if (method != null) return method.call(iterable);\n            }\n\n            if (Symbol.iterator) {\n                method = iterable[Symbol.iterator];\n                if (method != null) return method.call(iterable);\n            }\n        }\n\n        throw new TypeError('Object is not async iterable');\n    }\n\n    function _AwaitValue(value) {\n        this.wrapped = value;\n    }\n\n    function _AsyncGenerator(gen) {\n        var front, back;\n\n        function send(key, arg) {\n            return new Promise(function(resolve, reject) {\n                var request = {\n                    key: key,\n                    arg: arg,\n                    resolve: resolve,\n                    reject: reject,\n                    next: null,\n                };\n\n                if (back) {\n                    back = back.next = request;\n                } else {\n                    front = back = request;\n                    resume(key, arg);\n                }\n            });\n        }\n\n        function resume(key, arg) {\n            try {\n                var result = gen[key](arg);\n                var value = result.value;\n                var wrappedAwait = value instanceof _AwaitValue;\n                Promise.resolve(wrappedAwait ? value.wrapped : value).then(\n                    function(arg) {\n                        if (wrappedAwait) {\n                            resume('next', arg);\n                            return;\n                        }\n\n                        settle(result.done ? 'return' : 'normal', arg);\n                    },\n                    function(err) {\n                        resume('throw', err);\n                    }\n                );\n            } catch (err) {\n                settle('throw', err);\n            }\n        }\n\n        function settle(type, value) {\n            switch (type) {\n                case 'return':\n                    front.resolve({\n                        value: value,\n                        done: true,\n                    });\n                    break;\n\n                case 'throw':\n                    front.reject(value);\n                    break;\n\n                default:\n                    front.resolve({\n                        value: value,\n                        done: false,\n                    });\n                    break;\n            }\n\n            front = front.next;\n\n            if (front) {\n                resume(front.key, front.arg);\n            } else {\n                back = null;\n            }\n        }\n\n        this._invoke = send;\n\n        if (typeof gen.return !== 'function') {\n            this.return = undefined;\n        }\n    }\n\n    if (typeof Symbol === 'function' && Symbol.asyncIterator) {\n        _AsyncGenerator.prototype[Symbol.asyncIterator] = function() {\n            return this;\n        };\n    }\n\n    _AsyncGenerator.prototype.next = function(arg) {\n        return this._invoke('next', arg);\n    };\n\n    _AsyncGenerator.prototype.throw = function(arg) {\n        return this._invoke('throw', arg);\n    };\n\n    _AsyncGenerator.prototype.return = function(arg) {\n        return this._invoke('return', arg);\n    };\n\n    function _wrapAsyncGenerator(fn) {\n        return function() {\n            return new _AsyncGenerator(fn.apply(this, arguments));\n        };\n    }\n\n    function _awaitAsyncGenerator(value) {\n        return new _AwaitValue(value);\n    }\n\n    function _asyncGeneratorDelegate(inner, awaitWrap) {\n        var iter = {},\n            waiting = false;\n\n        function pump(key, value) {\n            waiting = true;\n            value = new Promise(function(resolve) {\n                resolve(inner[key](value));\n            });\n            return {\n                done: false,\n                value: awaitWrap(value),\n            };\n        }\n\n        if (typeof Symbol === 'function' && Symbol.iterator) {\n            iter[Symbol.iterator] = function() {\n                return this;\n            };\n        }\n\n        iter.next = function(value) {\n            if (waiting) {\n                waiting = false;\n                return value;\n            }\n\n            return pump('next', value);\n        };\n\n        if (typeof inner.throw === 'function') {\n            iter.throw = function(value) {\n                if (waiting) {\n                    waiting = false;\n                    throw value;\n                }\n\n                return pump('throw', value);\n            };\n        }\n\n        if (typeof inner.return === 'function') {\n            iter.return = function(value) {\n                return pump('return', value);\n            };\n        }\n\n        return iter;\n    }\n\n    function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n        try {\n            var info = gen[key](arg);\n            var value = info.value;\n        } catch (error) {\n            reject(error);\n            return;\n        }\n\n        if (info.done) {\n            resolve(value);\n        } else {\n            Promise.resolve(value).then(_next, _throw);\n        }\n    }\n\n    function _asyncToGenerator(fn) {\n        return function() {\n            var self = this,\n                args = arguments;\n            return new Promise(function(resolve, reject) {\n                var gen = fn.apply(self, args);\n\n                function _next(value) {\n                    asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'next', value);\n                }\n\n                function _throw(err) {\n                    asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'throw', err);\n                }\n\n                _next(undefined);\n            });\n        };\n    }\n\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) {\n            throw new TypeError('Cannot call a class as a function');\n        }\n    }\n\n    function _defineProperties(target, props) {\n        for (var i = 0; i < props.length; i++) {\n            var descriptor = props[i];\n            descriptor.enumerable = descriptor.enumerable || false;\n            descriptor.configurable = true;\n            if ('value' in descriptor) descriptor.writable = true;\n            Object.defineProperty(target, descriptor.key, descriptor);\n        }\n    }\n\n    function _createClass(Constructor, protoProps, staticProps) {\n        if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n        if (staticProps) _defineProperties(Constructor, staticProps);\n        return Constructor;\n    }\n\n    function _defineEnumerableProperties(obj, descs) {\n        for (var key in descs) {\n            var desc = descs[key];\n            desc.configurable = desc.enumerable = true;\n            if ('value' in desc) desc.writable = true;\n            Object.defineProperty(obj, key, desc);\n        }\n\n        if (Object.getOwnPropertySymbols) {\n            var objectSymbols = Object.getOwnPropertySymbols(descs);\n\n            for (var i = 0; i < objectSymbols.length; i++) {\n                var sym = objectSymbols[i];\n                var desc = descs[sym];\n                desc.configurable = desc.enumerable = true;\n                if ('value' in desc) desc.writable = true;\n                Object.defineProperty(obj, sym, desc);\n            }\n        }\n\n        return obj;\n    }\n\n    function _defaults(obj, defaults) {\n        var keys = Object.getOwnPropertyNames(defaults);\n\n        for (var i = 0; i < keys.length; i++) {\n            var key = keys[i];\n            var value = Object.getOwnPropertyDescriptor(defaults, key);\n\n            if (value && value.configurable && obj[key] === undefined) {\n                Object.defineProperty(obj, key, value);\n            }\n        }\n\n        return obj;\n    }\n\n    function _defineProperty(obj, key, value) {\n        if (key in obj) {\n            Object.defineProperty(obj, key, {\n                value: value,\n                enumerable: true,\n                configurable: true,\n                writable: true,\n            });\n        } else {\n            obj[key] = value;\n        }\n\n        return obj;\n    }\n\n    function _extends() {\n        _extends =\n            Object.assign ||\n            function(target) {\n                for (var i = 1; i < arguments.length; i++) {\n                    var source = arguments[i];\n\n                    for (var key in source) {\n                        if (Object.prototype.hasOwnProperty.call(source, key)) {\n                            target[key] = source[key];\n                        }\n                    }\n                }\n\n                return target;\n            };\n\n        return _extends.apply(this, arguments);\n    }\n\n    function _objectSpread(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i] != null ? arguments[i] : {};\n            var ownKeys = Object.keys(source);\n\n            if (typeof Object.getOwnPropertySymbols === 'function') {\n                ownKeys = ownKeys.concat(\n                    Object.getOwnPropertySymbols(source).filter(function(sym) {\n                        return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n                    })\n                );\n            }\n\n            ownKeys.forEach(function(key) {\n                _defineProperty(target, key, source[key]);\n            });\n        }\n\n        return target;\n    }\n\n    function ownKeys(object, enumerableOnly) {\n        var keys = Object.keys(object);\n\n        if (Object.getOwnPropertySymbols) {\n            var symbols = Object.getOwnPropertySymbols(object);\n            if (enumerableOnly)\n                symbols = symbols.filter(function(sym) {\n                    return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n                });\n            keys.push.apply(keys, symbols);\n        }\n\n        return keys;\n    }\n\n    function _objectSpread2(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i] != null ? arguments[i] : {};\n\n            if (i % 2) {\n                ownKeys(source, true).forEach(function(key) {\n                    _defineProperty(target, key, source[key]);\n                });\n            } else if (Object.getOwnPropertyDescriptors) {\n                Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n            } else {\n                ownKeys(source).forEach(function(key) {\n                    Object.defineProperty(\n                        target,\n                        key,\n                        Object.getOwnPropertyDescriptor(source, key)\n                    );\n                });\n            }\n        }\n\n        return target;\n    }\n\n    function _inherits(subClass, superClass) {\n        if (typeof superClass !== 'function' && superClass !== null) {\n            throw new TypeError('Super expression must either be null or a function');\n        }\n\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                writable: true,\n                configurable: true,\n            },\n        });\n        if (superClass) _setPrototypeOf(subClass, superClass);\n    }\n\n    function _inheritsLoose(subClass, superClass) {\n        subClass.prototype = Object.create(superClass.prototype);\n        subClass.prototype.constructor = subClass;\n        subClass.__proto__ = superClass;\n    }\n\n    function _getPrototypeOf(o) {\n        _getPrototypeOf = Object.setPrototypeOf\n            ? Object.getPrototypeOf\n            : function _getPrototypeOf(o) {\n                  return o.__proto__ || Object.getPrototypeOf(o);\n              };\n        return _getPrototypeOf(o);\n    }\n\n    function _setPrototypeOf(o, p) {\n        _setPrototypeOf =\n            Object.setPrototypeOf ||\n            function _setPrototypeOf(o, p) {\n                o.__proto__ = p;\n                return o;\n            };\n\n        return _setPrototypeOf(o, p);\n    }\n\n    function isNativeReflectConstruct() {\n        if (typeof Reflect === 'undefined' || !Reflect.construct) return false;\n        if (Reflect.construct.sham) return false;\n        if (typeof Proxy === 'function') return true;\n\n        try {\n            Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n            return true;\n        } catch (e) {\n            return false;\n        }\n    }\n\n    function _construct(Parent, args, Class) {\n        if (isNativeReflectConstruct()) {\n            _construct = Reflect.construct;\n        } else {\n            _construct = function _construct(Parent, args, Class) {\n                var a = [null];\n                a.push.apply(a, args);\n                var Constructor = Function.bind.apply(Parent, a);\n                var instance = new Constructor();\n                if (Class) _setPrototypeOf(instance, Class.prototype);\n                return instance;\n            };\n        }\n\n        return _construct.apply(null, arguments);\n    }\n\n    function _isNativeFunction(fn) {\n        return Function.toString.call(fn).indexOf('[native code]') !== -1;\n    }\n\n    function _wrapNativeSuper(Class) {\n        var _cache = typeof Map === 'function' ? new Map() : undefined;\n\n        _wrapNativeSuper = function _wrapNativeSuper(Class) {\n            if (Class === null || !_isNativeFunction(Class)) return Class;\n\n            if (typeof Class !== 'function') {\n                throw new TypeError('Super expression must either be null or a function');\n            }\n\n            if (typeof _cache !== 'undefined') {\n                if (_cache.has(Class)) return _cache.get(Class);\n\n                _cache.set(Class, Wrapper);\n            }\n\n            function Wrapper() {\n                return _construct(Class, arguments, _getPrototypeOf(this).constructor);\n            }\n\n            Wrapper.prototype = Object.create(Class.prototype, {\n                constructor: {\n                    value: Wrapper,\n                    enumerable: false,\n                    writable: true,\n                    configurable: true,\n                },\n            });\n            return _setPrototypeOf(Wrapper, Class);\n        };\n\n        return _wrapNativeSuper(Class);\n    }\n\n    function _instanceof(left, right) {\n        if (right != null && typeof Symbol !== 'undefined' && right[Symbol.hasInstance]) {\n            return !!right[Symbol.hasInstance](left);\n        } else {\n            return left instanceof right;\n        }\n    }\n\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule\n            ? obj\n            : {\n                  default: obj,\n              };\n    }\n\n    function _interopRequireWildcard(obj) {\n        if (obj && obj.__esModule) {\n            return obj;\n        } else {\n            var newObj = {};\n\n            if (obj != null) {\n                for (var key in obj) {\n                    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n                        var desc =\n                            Object.defineProperty && Object.getOwnPropertyDescriptor\n                                ? Object.getOwnPropertyDescriptor(obj, key)\n                                : {};\n\n                        if (desc.get || desc.set) {\n                            Object.defineProperty(newObj, key, desc);\n                        } else {\n                            newObj[key] = obj[key];\n                        }\n                    }\n                }\n            }\n\n            newObj.default = obj;\n            return newObj;\n        }\n    }\n\n    function _newArrowCheck(innerThis, boundThis) {\n        if (innerThis !== boundThis) {\n            throw new TypeError('Cannot instantiate an arrow function');\n        }\n    }\n\n    function _objectDestructuringEmpty(obj) {\n        if (obj == null) throw new TypeError('Cannot destructure undefined');\n    }\n\n    function _objectWithoutPropertiesLoose(source, excluded) {\n        if (source == null) return {};\n        var target = {};\n        var sourceKeys = Object.keys(source);\n        var key, i;\n\n        for (i = 0; i < sourceKeys.length; i++) {\n            key = sourceKeys[i];\n            if (excluded.indexOf(key) >= 0) continue;\n            target[key] = source[key];\n        }\n\n        return target;\n    }\n\n    function _objectWithoutProperties(source, excluded) {\n        if (source == null) return {};\n\n        var target = _objectWithoutPropertiesLoose(source, excluded);\n\n        var key, i;\n\n        if (Object.getOwnPropertySymbols) {\n            var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n            for (i = 0; i < sourceSymbolKeys.length; i++) {\n                key = sourceSymbolKeys[i];\n                if (excluded.indexOf(key) >= 0) continue;\n                if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n                target[key] = source[key];\n            }\n        }\n\n        return target;\n    }\n\n    function _assertThisInitialized(self) {\n        if (self === void 0) {\n            throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        }\n\n        return self;\n    }\n\n    function _possibleConstructorReturn(self, call) {\n        if (call && (typeof call === 'object' || typeof call === 'function')) {\n            return call;\n        }\n\n        return _assertThisInitialized(self);\n    }\n\n    function _superPropBase(object, property) {\n        while (!Object.prototype.hasOwnProperty.call(object, property)) {\n            object = _getPrototypeOf(object);\n            if (object === null) break;\n        }\n\n        return object;\n    }\n\n    function _get(target, property, receiver) {\n        if (typeof Reflect !== 'undefined' && Reflect.get) {\n            _get = Reflect.get;\n        } else {\n            _get = function _get(target, property, receiver) {\n                var base = _superPropBase(target, property);\n\n                if (!base) return;\n                var desc = Object.getOwnPropertyDescriptor(base, property);\n\n                if (desc.get) {\n                    return desc.get.call(receiver);\n                }\n\n                return desc.value;\n            };\n        }\n\n        return _get(target, property, receiver || target);\n    }\n\n    function set(target, property, value, receiver) {\n        if (typeof Reflect !== 'undefined' && Reflect.set) {\n            set = Reflect.set;\n        } else {\n            set = function set(target, property, value, receiver) {\n                var base = _superPropBase(target, property);\n\n                var desc;\n\n                if (base) {\n                    desc = Object.getOwnPropertyDescriptor(base, property);\n\n                    if (desc.set) {\n                        desc.set.call(receiver, value);\n                        return true;\n                    } else if (!desc.writable) {\n                        return false;\n                    }\n                }\n\n                desc = Object.getOwnPropertyDescriptor(receiver, property);\n\n                if (desc) {\n                    if (!desc.writable) {\n                        return false;\n                    }\n\n                    desc.value = value;\n                    Object.defineProperty(receiver, property, desc);\n                } else {\n                    _defineProperty(receiver, property, value);\n                }\n\n                return true;\n            };\n        }\n\n        return set(target, property, value, receiver);\n    }\n\n    function _set(target, property, value, receiver, isStrict) {\n        var s = set(target, property, value, receiver || target);\n\n        if (!s && isStrict) {\n            throw new Error('failed to set property');\n        }\n\n        return value;\n    }\n\n    function _taggedTemplateLiteral(strings, raw) {\n        if (!raw) {\n            raw = strings.slice(0);\n        }\n\n        return Object.freeze(\n            Object.defineProperties(strings, {\n                raw: {\n                    value: Object.freeze(raw),\n                },\n            })\n        );\n    }\n\n    function _taggedTemplateLiteralLoose(strings, raw) {\n        if (!raw) {\n            raw = strings.slice(0);\n        }\n\n        strings.raw = raw;\n        return strings;\n    }\n\n    function _temporalRef(val, name) {\n        if (val === _temporalUndefined) {\n            throw new ReferenceError(name + ' is not defined - temporal dead zone');\n        } else {\n            return val;\n        }\n    }\n\n    function _readOnlyError(name) {\n        throw new Error('\"' + name + '\" is read-only');\n    }\n\n    function _classNameTDZError(name) {\n        throw new Error('Class \"' + name + '\" cannot be referenced in computed property keys.');\n    }\n\n    var _temporalUndefined = {};\n\n    function _slicedToArray(arr, i) {\n        return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n    }\n\n    function _slicedToArrayLoose(arr, i) {\n        return _arrayWithHoles(arr) || _iterableToArrayLimitLoose(arr, i) || _nonIterableRest();\n    }\n\n    function _toArray(arr) {\n        return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest();\n    }\n\n    function _toConsumableArray(arr) {\n        return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n    }\n\n    function _arrayWithoutHoles(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n            return arr2;\n        }\n    }\n\n    function _arrayWithHoles(arr) {\n        if (Array.isArray(arr)) return arr;\n    }\n\n    function _iterableToArray(iter) {\n        if (\n            Symbol.iterator in Object(iter) ||\n            Object.prototype.toString.call(iter) === '[object Arguments]'\n        )\n            return Array.from(iter);\n    }\n\n    function _iterableToArrayLimit(arr, i) {\n        var _arr = [];\n        var _n = true;\n        var _d = false;\n        var _e = undefined;\n\n        try {\n            for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n                _arr.push(_s.value);\n\n                if (i && _arr.length === i) break;\n            }\n        } catch (err) {\n            _d = true;\n            _e = err;\n        } finally {\n            try {\n                if (!_n && _i['return'] != null) _i['return']();\n            } finally {\n                if (_d) throw _e;\n            }\n        }\n\n        return _arr;\n    }\n\n    function _iterableToArrayLimitLoose(arr, i) {\n        var _arr = [];\n\n        for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done; ) {\n            _arr.push(_step.value);\n\n            if (i && _arr.length === i) break;\n        }\n\n        return _arr;\n    }\n\n    function _nonIterableSpread() {\n        throw new TypeError('Invalid attempt to spread non-iterable instance');\n    }\n\n    function _nonIterableRest() {\n        throw new TypeError('Invalid attempt to destructure non-iterable instance');\n    }\n\n    function _skipFirstGeneratorNext(fn) {\n        return function() {\n            var it = fn.apply(this, arguments);\n            it.next();\n            return it;\n        };\n    }\n\n    function _toPrimitive(input, hint) {\n        if (typeof input !== 'object' || input === null) return input;\n        var prim = input[Symbol.toPrimitive];\n\n        if (prim !== undefined) {\n            var res = prim.call(input, hint || 'default');\n            if (typeof res !== 'object') return res;\n            throw new TypeError('@@toPrimitive must return a primitive value.');\n        }\n\n        return (hint === 'string' ? String : Number)(input);\n    }\n\n    function _toPropertyKey(arg) {\n        var key = _toPrimitive(arg, 'string');\n\n        return typeof key === 'symbol' ? key : String(key);\n    }\n\n    function _initializerWarningHelper(descriptor, context) {\n        throw new Error(\n            'Decorating class property failed. Please ensure that ' +\n                'proposal-class-properties is enabled and set to use loose mode. ' +\n                'To use proposal-class-properties in spec mode with decorators, wait for ' +\n                'the next major version of decorators in stage 2.'\n        );\n    }\n\n    function _initializerDefineProperty(target, property, descriptor, context) {\n        if (!descriptor) return;\n        Object.defineProperty(target, property, {\n            enumerable: descriptor.enumerable,\n            configurable: descriptor.configurable,\n            writable: descriptor.writable,\n            value: descriptor.initializer ? descriptor.initializer.call(context) : void 0,\n        });\n    }\n\n    function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n        var desc = {};\n        Object.keys(descriptor).forEach(function(key) {\n            desc[key] = descriptor[key];\n        });\n        desc.enumerable = !!desc.enumerable;\n        desc.configurable = !!desc.configurable;\n\n        if ('value' in desc || desc.initializer) {\n            desc.writable = true;\n        }\n\n        desc = decorators\n            .slice()\n            .reverse()\n            .reduce(function(desc, decorator) {\n                return decorator(target, property, desc) || desc;\n            }, desc);\n\n        if (context && desc.initializer !== void 0) {\n            desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n            desc.initializer = undefined;\n        }\n\n        if (desc.initializer === void 0) {\n            Object.defineProperty(target, property, desc);\n            desc = null;\n        }\n\n        return desc;\n    }\n\n    var id = 0;\n\n    function _classPrivateFieldLooseKey(name) {\n        return '__private_' + id++ + '_' + name;\n    }\n\n    function _classPrivateFieldLooseBase(receiver, privateKey) {\n        if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {\n            throw new TypeError('attempted to use private field on non-instance');\n        }\n\n        return receiver;\n    }\n\n    function _classPrivateFieldGet(receiver, privateMap) {\n        var descriptor = privateMap.get(receiver);\n\n        if (!descriptor) {\n            throw new TypeError('attempted to get private field on non-instance');\n        }\n\n        if (descriptor.get) {\n            return descriptor.get.call(receiver);\n        }\n\n        return descriptor.value;\n    }\n\n    function _classPrivateFieldSet(receiver, privateMap, value) {\n        var descriptor = privateMap.get(receiver);\n\n        if (!descriptor) {\n            throw new TypeError('attempted to set private field on non-instance');\n        }\n\n        if (descriptor.set) {\n            descriptor.set.call(receiver, value);\n        } else {\n            if (!descriptor.writable) {\n                throw new TypeError('attempted to set read only private field');\n            }\n\n            descriptor.value = value;\n        }\n\n        return value;\n    }\n\n    function _classPrivateFieldDestructureSet(receiver, privateMap) {\n        if (!privateMap.has(receiver)) {\n            throw new TypeError('attempted to set private field on non-instance');\n        }\n\n        var descriptor = privateMap.get(receiver);\n\n        if (descriptor.set) {\n            if (!('__destrObj' in descriptor)) {\n                descriptor.__destrObj = {\n                    set value(v) {\n                        descriptor.set.call(receiver, v);\n                    },\n                };\n            }\n\n            return descriptor.__destrObj;\n        } else {\n            if (!descriptor.writable) {\n                throw new TypeError('attempted to set read only private field');\n            }\n\n            return descriptor;\n        }\n    }\n\n    function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {\n        if (receiver !== classConstructor) {\n            throw new TypeError('Private static access of wrong provenance');\n        }\n\n        return descriptor.value;\n    }\n\n    function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {\n        if (receiver !== classConstructor) {\n            throw new TypeError('Private static access of wrong provenance');\n        }\n\n        if (!descriptor.writable) {\n            throw new TypeError('attempted to set read only private field');\n        }\n\n        descriptor.value = value;\n        return value;\n    }\n\n    function _classStaticPrivateMethodGet(receiver, classConstructor, method) {\n        if (receiver !== classConstructor) {\n            throw new TypeError('Private static access of wrong provenance');\n        }\n\n        return method;\n    }\n\n    function _classStaticPrivateMethodSet() {\n        throw new TypeError('attempted to set read only static private field');\n    }\n\n    function _decorate(decorators, factory, superClass, mixins) {\n        var api = _getDecoratorsApi();\n\n        if (mixins) {\n            for (var i = 0; i < mixins.length; i++) {\n                api = mixins[i](api);\n            }\n        }\n\n        var r = factory(function initialize(O) {\n            api.initializeInstanceElements(O, decorated.elements);\n        }, superClass);\n        var decorated = api.decorateClass(\n            _coalesceClassElements(r.d.map(_createElementDescriptor)),\n            decorators\n        );\n        api.initializeClassElements(r.F, decorated.elements);\n        return api.runClassFinishers(r.F, decorated.finishers);\n    }\n\n    function _getDecoratorsApi() {\n        _getDecoratorsApi = function() {\n            return api;\n        };\n\n        var api = {\n            elementsDefinitionOrder: [['method'], ['field']],\n            initializeInstanceElements: function(O, elements) {\n                ['method', 'field'].forEach(function(kind) {\n                    elements.forEach(function(element) {\n                        if (element.kind === kind && element.placement === 'own') {\n                            this.defineClassElement(O, element);\n                        }\n                    }, this);\n                }, this);\n            },\n            initializeClassElements: function(F, elements) {\n                var proto = F.prototype;\n                ['method', 'field'].forEach(function(kind) {\n                    elements.forEach(function(element) {\n                        var placement = element.placement;\n\n                        if (\n                            element.kind === kind &&\n                            (placement === 'static' || placement === 'prototype')\n                        ) {\n                            var receiver = placement === 'static' ? F : proto;\n                            this.defineClassElement(receiver, element);\n                        }\n                    }, this);\n                }, this);\n            },\n            defineClassElement: function(receiver, element) {\n                var descriptor = element.descriptor;\n\n                if (element.kind === 'field') {\n                    var initializer = element.initializer;\n                    descriptor = {\n                        enumerable: descriptor.enumerable,\n                        writable: descriptor.writable,\n                        configurable: descriptor.configurable,\n                        value: initializer === void 0 ? void 0 : initializer.call(receiver),\n                    };\n                }\n\n                Object.defineProperty(receiver, element.key, descriptor);\n            },\n            decorateClass: function(elements, decorators) {\n                var newElements = [];\n                var finishers = [];\n                var placements = {\n                    static: [],\n                    prototype: [],\n                    own: [],\n                };\n                elements.forEach(function(element) {\n                    this.addElementPlacement(element, placements);\n                }, this);\n                elements.forEach(function(element) {\n                    if (!_hasDecorators(element)) return newElements.push(element);\n                    var elementFinishersExtras = this.decorateElement(element, placements);\n                    newElements.push(elementFinishersExtras.element);\n                    newElements.push.apply(newElements, elementFinishersExtras.extras);\n                    finishers.push.apply(finishers, elementFinishersExtras.finishers);\n                }, this);\n\n                if (!decorators) {\n                    return {\n                        elements: newElements,\n                        finishers: finishers,\n                    };\n                }\n\n                var result = this.decorateConstructor(newElements, decorators);\n                finishers.push.apply(finishers, result.finishers);\n                result.finishers = finishers;\n                return result;\n            },\n            addElementPlacement: function(element, placements, silent) {\n                var keys = placements[element.placement];\n\n                if (!silent && keys.indexOf(element.key) !== -1) {\n                    throw new TypeError('Duplicated element (' + element.key + ')');\n                }\n\n                keys.push(element.key);\n            },\n            decorateElement: function(element, placements) {\n                var extras = [];\n                var finishers = [];\n\n                for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {\n                    var keys = placements[element.placement];\n                    keys.splice(keys.indexOf(element.key), 1);\n                    var elementObject = this.fromElementDescriptor(element);\n                    var elementFinisherExtras = this.toElementFinisherExtras(\n                        (0, decorators[i])(elementObject) || elementObject\n                    );\n                    element = elementFinisherExtras.element;\n                    this.addElementPlacement(element, placements);\n\n                    if (elementFinisherExtras.finisher) {\n                        finishers.push(elementFinisherExtras.finisher);\n                    }\n\n                    var newExtras = elementFinisherExtras.extras;\n\n                    if (newExtras) {\n                        for (var j = 0; j < newExtras.length; j++) {\n                            this.addElementPlacement(newExtras[j], placements);\n                        }\n\n                        extras.push.apply(extras, newExtras);\n                    }\n                }\n\n                return {\n                    element: element,\n                    finishers: finishers,\n                    extras: extras,\n                };\n            },\n            decorateConstructor: function(elements, decorators) {\n                var finishers = [];\n\n                for (var i = decorators.length - 1; i >= 0; i--) {\n                    var obj = this.fromClassDescriptor(elements);\n                    var elementsAndFinisher = this.toClassDescriptor(\n                        (0, decorators[i])(obj) || obj\n                    );\n\n                    if (elementsAndFinisher.finisher !== undefined) {\n                        finishers.push(elementsAndFinisher.finisher);\n                    }\n\n                    if (elementsAndFinisher.elements !== undefined) {\n                        elements = elementsAndFinisher.elements;\n\n                        for (var j = 0; j < elements.length - 1; j++) {\n                            for (var k = j + 1; k < elements.length; k++) {\n                                if (\n                                    elements[j].key === elements[k].key &&\n                                    elements[j].placement === elements[k].placement\n                                ) {\n                                    throw new TypeError(\n                                        'Duplicated element (' + elements[j].key + ')'\n                                    );\n                                }\n                            }\n                        }\n                    }\n                }\n\n                return {\n                    elements: elements,\n                    finishers: finishers,\n                };\n            },\n            fromElementDescriptor: function(element) {\n                var obj = {\n                    kind: element.kind,\n                    key: element.key,\n                    placement: element.placement,\n                    descriptor: element.descriptor,\n                };\n                var desc = {\n                    value: 'Descriptor',\n                    configurable: true,\n                };\n                Object.defineProperty(obj, Symbol.toStringTag, desc);\n                if (element.kind === 'field') obj.initializer = element.initializer;\n                return obj;\n            },\n            toElementDescriptors: function(elementObjects) {\n                if (elementObjects === undefined) return;\n                return _toArray(elementObjects).map(function(elementObject) {\n                    var element = this.toElementDescriptor(elementObject);\n                    this.disallowProperty(elementObject, 'finisher', 'An element descriptor');\n                    this.disallowProperty(elementObject, 'extras', 'An element descriptor');\n                    return element;\n                }, this);\n            },\n            toElementDescriptor: function(elementObject) {\n                var kind = String(elementObject.kind);\n\n                if (kind !== 'method' && kind !== 'field') {\n                    throw new TypeError(\n                        'An element descriptor\\'s .kind property must be either \"method\" or' +\n                            ' \"field\", but a decorator created an element descriptor with' +\n                            ' .kind \"' +\n                            kind +\n                            '\"'\n                    );\n                }\n\n                var key = _toPropertyKey(elementObject.key);\n\n                var placement = String(elementObject.placement);\n\n                if (placement !== 'static' && placement !== 'prototype' && placement !== 'own') {\n                    throw new TypeError(\n                        'An element descriptor\\'s .placement property must be one of \"static\",' +\n                            ' \"prototype\" or \"own\", but a decorator created an element descriptor' +\n                            ' with .placement \"' +\n                            placement +\n                            '\"'\n                    );\n                }\n\n                var descriptor = elementObject.descriptor;\n                this.disallowProperty(elementObject, 'elements', 'An element descriptor');\n                var element = {\n                    kind: kind,\n                    key: key,\n                    placement: placement,\n                    descriptor: Object.assign({}, descriptor),\n                };\n\n                if (kind !== 'field') {\n                    this.disallowProperty(elementObject, 'initializer', 'A method descriptor');\n                } else {\n                    this.disallowProperty(\n                        descriptor,\n                        'get',\n                        'The property descriptor of a field descriptor'\n                    );\n                    this.disallowProperty(\n                        descriptor,\n                        'set',\n                        'The property descriptor of a field descriptor'\n                    );\n                    this.disallowProperty(\n                        descriptor,\n                        'value',\n                        'The property descriptor of a field descriptor'\n                    );\n                    element.initializer = elementObject.initializer;\n                }\n\n                return element;\n            },\n            toElementFinisherExtras: function(elementObject) {\n                var element = this.toElementDescriptor(elementObject);\n\n                var finisher = _optionalCallableProperty(elementObject, 'finisher');\n\n                var extras = this.toElementDescriptors(elementObject.extras);\n                return {\n                    element: element,\n                    finisher: finisher,\n                    extras: extras,\n                };\n            },\n            fromClassDescriptor: function(elements) {\n                var obj = {\n                    kind: 'class',\n                    elements: elements.map(this.fromElementDescriptor, this),\n                };\n                var desc = {\n                    value: 'Descriptor',\n                    configurable: true,\n                };\n                Object.defineProperty(obj, Symbol.toStringTag, desc);\n                return obj;\n            },\n            toClassDescriptor: function(obj) {\n                var kind = String(obj.kind);\n\n                if (kind !== 'class') {\n                    throw new TypeError(\n                        'A class descriptor\\'s .kind property must be \"class\", but a decorator' +\n                            ' created a class descriptor with .kind \"' +\n                            kind +\n                            '\"'\n                    );\n                }\n\n                this.disallowProperty(obj, 'key', 'A class descriptor');\n                this.disallowProperty(obj, 'placement', 'A class descriptor');\n                this.disallowProperty(obj, 'descriptor', 'A class descriptor');\n                this.disallowProperty(obj, 'initializer', 'A class descriptor');\n                this.disallowProperty(obj, 'extras', 'A class descriptor');\n\n                var finisher = _optionalCallableProperty(obj, 'finisher');\n\n                var elements = this.toElementDescriptors(obj.elements);\n                return {\n                    elements: elements,\n                    finisher: finisher,\n                };\n            },\n            runClassFinishers: function(constructor, finishers) {\n                for (var i = 0; i < finishers.length; i++) {\n                    var newConstructor = (0, finishers[i])(constructor);\n\n                    if (newConstructor !== undefined) {\n                        if (typeof newConstructor !== 'function') {\n                            throw new TypeError('Finishers must return a constructor.');\n                        }\n\n                        constructor = newConstructor;\n                    }\n                }\n\n                return constructor;\n            },\n            disallowProperty: function(obj, name, objectType) {\n                if (obj[name] !== undefined) {\n                    throw new TypeError(objectType + \" can't have a .\" + name + ' property.');\n                }\n            },\n        };\n        return api;\n    }\n\n    function _createElementDescriptor(def) {\n        var key = _toPropertyKey(def.key);\n\n        var descriptor;\n\n        if (def.kind === 'method') {\n            descriptor = {\n                value: def.value,\n                writable: true,\n                configurable: true,\n                enumerable: false,\n            };\n        } else if (def.kind === 'get') {\n            descriptor = {\n                get: def.value,\n                configurable: true,\n                enumerable: false,\n            };\n        } else if (def.kind === 'set') {\n            descriptor = {\n                set: def.value,\n                configurable: true,\n                enumerable: false,\n            };\n        } else if (def.kind === 'field') {\n            descriptor = {\n                configurable: true,\n                writable: true,\n                enumerable: true,\n            };\n        }\n\n        var element = {\n            kind: def.kind === 'field' ? 'field' : 'method',\n            key: key,\n            placement: def.static ? 'static' : def.kind === 'field' ? 'own' : 'prototype',\n            descriptor: descriptor,\n        };\n        if (def.decorators) element.decorators = def.decorators;\n        if (def.kind === 'field') element.initializer = def.value;\n        return element;\n    }\n\n    function _coalesceGetterSetter(element, other) {\n        if (element.descriptor.get !== undefined) {\n            other.descriptor.get = element.descriptor.get;\n        } else {\n            other.descriptor.set = element.descriptor.set;\n        }\n    }\n\n    function _coalesceClassElements(elements) {\n        var newElements = [];\n\n        var isSameElement = function(other) {\n            return (\n                other.kind === 'method' &&\n                other.key === element.key &&\n                other.placement === element.placement\n            );\n        };\n\n        for (var i = 0; i < elements.length; i++) {\n            var element = elements[i];\n            var other;\n\n            if (element.kind === 'method' && (other = newElements.find(isSameElement))) {\n                if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {\n                    if (_hasDecorators(element) || _hasDecorators(other)) {\n                        throw new ReferenceError(\n                            'Duplicated methods (' + element.key + \") can't be decorated.\"\n                        );\n                    }\n\n                    other.descriptor = element.descriptor;\n                } else {\n                    if (_hasDecorators(element)) {\n                        if (_hasDecorators(other)) {\n                            throw new ReferenceError(\n                                \"Decorators can't be placed on different accessors with for \" +\n                                    'the same property (' +\n                                    element.key +\n                                    ').'\n                            );\n                        }\n\n                        other.decorators = element.decorators;\n                    }\n\n                    _coalesceGetterSetter(element, other);\n                }\n            } else {\n                newElements.push(element);\n            }\n        }\n\n        return newElements;\n    }\n\n    function _hasDecorators(element) {\n        return element.decorators && element.decorators.length;\n    }\n\n    function _isDataDescriptor(desc) {\n        return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);\n    }\n\n    function _optionalCallableProperty(obj, name) {\n        var value = obj[name];\n\n        if (value !== undefined && typeof value !== 'function') {\n            throw new TypeError(\"Expected '\" + name + \"' to be a function\");\n        }\n\n        return value;\n    }\n\n    function _classPrivateMethodGet(receiver, privateSet, fn) {\n        if (!privateSet.has(receiver)) {\n            throw new TypeError('attempted to get private field on non-instance');\n        }\n\n        return fn;\n    }\n\n    function _classPrivateMethodSet() {\n        throw new TypeError('attempted to reassign private method');\n    }\n\n    function _wrapRegExp(re, groups) {\n        _wrapRegExp = function(re, groups) {\n            return new BabelRegExp(re, groups);\n        };\n\n        var _RegExp = _wrapNativeSuper(RegExp);\n\n        var _super = RegExp.prototype;\n\n        var _groups = new WeakMap();\n\n        function BabelRegExp(re, groups) {\n            var _this = _RegExp.call(this, re);\n\n            _groups.set(_this, groups);\n\n            return _this;\n        }\n\n        _inherits(BabelRegExp, _RegExp);\n\n        BabelRegExp.prototype.exec = function(str) {\n            var result = _super.exec.call(this, str);\n\n            if (result) result.groups = buildGroups(result, this);\n            return result;\n        };\n\n        BabelRegExp.prototype[Symbol.replace] = function(str, substitution) {\n            if (typeof substitution === 'string') {\n                var groups = _groups.get(this);\n\n                return _super[Symbol.replace].call(\n                    this,\n                    str,\n                    substitution.replace(/\\$<([^>]+)>/g, function(_, name) {\n                        return '$' + groups[name];\n                    })\n                );\n            } else if (typeof substitution === 'function') {\n                var _this = this;\n\n                return _super[Symbol.replace].call(this, str, function() {\n                    var args = [];\n                    args.push.apply(args, arguments);\n\n                    if (typeof args[args.length - 1] !== 'object') {\n                        args.push(buildGroups(args, _this));\n                    }\n\n                    return substitution.apply(this, args);\n                });\n            } else {\n                return _super[Symbol.replace].call(this, str, substitution);\n            }\n        };\n\n        function buildGroups(result, re) {\n            var g = _groups.get(re);\n\n            return Object.keys(g).reduce(function(groups, name) {\n                groups[name] = result[g[name]];\n                return groups;\n            }, Object.create(null));\n        }\n\n        return _wrapRegExp.apply(this, arguments);\n    }\n\n    var arrayRemove = function arrayRemove(arr, index) {\n        return arr.splice(index, 1);\n    };\n\n    var run = function run(cb, sync) {\n        if (sync) {\n            cb();\n        } else if (document.hidden) {\n            Promise.resolve(1).then(cb);\n        } else {\n            setTimeout(cb, 0);\n        }\n    };\n\n    var on = function on() {\n        var listeners = [];\n        var off = function off(event, cb) {\n            arrayRemove(\n                listeners,\n                listeners.findIndex(function(listener) {\n                    return listener.event === event && (listener.cb === cb || !cb);\n                })\n            );\n        };\n        var _fire = function fire(event, args, sync) {\n            listeners\n                .filter(function(listener) {\n                    return listener.event === event;\n                })\n                .map(function(listener) {\n                    return listener.cb;\n                })\n                .forEach(function(cb) {\n                    return run(function() {\n                        return cb.apply(void 0, _toConsumableArray(args));\n                    }, sync);\n                });\n        };\n        return {\n            fireSync: function fireSync(event) {\n                for (\n                    var _len = arguments.length,\n                        args = new Array(_len > 1 ? _len - 1 : 0),\n                        _key = 1;\n                    _key < _len;\n                    _key++\n                ) {\n                    args[_key - 1] = arguments[_key];\n                }\n                _fire(event, args, true);\n            },\n            fire: function fire(event) {\n                for (\n                    var _len2 = arguments.length,\n                        args = new Array(_len2 > 1 ? _len2 - 1 : 0),\n                        _key2 = 1;\n                    _key2 < _len2;\n                    _key2++\n                ) {\n                    args[_key2 - 1] = arguments[_key2];\n                }\n                _fire(event, args, false);\n            },\n            on: function on(event, cb) {\n                listeners.push({ event: event, cb: cb });\n            },\n            onOnce: function onOnce(event, _cb) {\n                listeners.push({\n                    event: event,\n                    cb: function cb() {\n                        off(event, _cb);\n                        _cb.apply(void 0, arguments);\n                    },\n                });\n            },\n            off: off,\n        };\n    };\n\n    var copyObjectPropertiesToObject = function copyObjectPropertiesToObject(\n        src,\n        target,\n        excluded\n    ) {\n        Object.getOwnPropertyNames(src)\n            .filter(function(property) {\n                return !excluded.includes(property);\n            })\n            .forEach(function(key) {\n                return Object.defineProperty(\n                    target,\n                    key,\n                    Object.getOwnPropertyDescriptor(src, key)\n                );\n            });\n    };\n\n    var PRIVATE = [\n        'fire',\n        'process',\n        'revert',\n        'load',\n        'on',\n        'off',\n        'onOnce',\n        'retryLoad',\n        'extend',\n        'archive',\n        'archived',\n        'release',\n        'released',\n        'requestProcessing',\n        'freeze',\n    ];\n\n    var createItemAPI = function createItemAPI(item) {\n        var api = {};\n        copyObjectPropertiesToObject(item, api, PRIVATE);\n        return api;\n    };\n\n    var removeReleasedItems = function removeReleasedItems(items) {\n        items.forEach(function(item, index) {\n            if (item.released) {\n                arrayRemove(items, index);\n            }\n        });\n    };\n\n    var ItemStatus = {\n        INIT: 1,\n        IDLE: 2,\n        PROCESSING_QUEUED: 9,\n        PROCESSING: 3,\n        PROCESSING_COMPLETE: 5,\n        PROCESSING_ERROR: 6,\n        PROCESSING_REVERT_ERROR: 10,\n        LOADING: 7,\n        LOAD_ERROR: 8,\n    };\n\n    var FileOrigin = {\n        INPUT: 1,\n        LIMBO: 2,\n        LOCAL: 3,\n    };\n\n    var getNonNumeric = function getNonNumeric(str) {\n        return /[^0-9]+/.exec(str);\n    };\n\n    var getDecimalSeparator = function getDecimalSeparator() {\n        return getNonNumeric((1.1).toLocaleString())[0];\n    };\n\n    var getThousandsSeparator = function getThousandsSeparator() {\n        // Added for browsers that do not return the thousands separator (happend on native browser Android 4.4.4)\n        // We check against the normal toString output and if they're the same return a comma when decimal separator is a dot\n        var decimalSeparator = getDecimalSeparator();\n        var thousandsStringWithSeparator = (1000.0).toLocaleString();\n        var thousandsStringWithoutSeparator = (1000.0).toString();\n        if (thousandsStringWithSeparator !== thousandsStringWithoutSeparator) {\n            return getNonNumeric(thousandsStringWithSeparator)[0];\n        }\n        return decimalSeparator === '.' ? ',' : '.';\n    };\n\n    var Type = {\n        BOOLEAN: 'boolean',\n        INT: 'int',\n        NUMBER: 'number',\n        STRING: 'string',\n        ARRAY: 'array',\n        OBJECT: 'object',\n        FUNCTION: 'function',\n        ACTION: 'action',\n        SERVER_API: 'serverapi',\n        REGEX: 'regex',\n    };\n\n    // all registered filters\n    var filters = [];\n\n    // loops over matching filters and passes options to each filter, returning the mapped results\n    var applyFilterChain = function applyFilterChain(key, value, utils) {\n        return new Promise(function(resolve, reject) {\n            // find matching filters for this key\n            var matchingFilters = filters\n                .filter(function(f) {\n                    return f.key === key;\n                })\n                .map(function(f) {\n                    return f.cb;\n                });\n\n            // resolve now\n            if (matchingFilters.length === 0) {\n                resolve(value);\n                return;\n            }\n\n            // first filter to kick things of\n            var initialFilter = matchingFilters.shift();\n\n            // chain filters\n            matchingFilters\n                .reduce(\n                    // loop over promises passing value to next promise\n                    function(current, next) {\n                        return current.then(function(value) {\n                            return next(value, utils);\n                        });\n                    },\n\n                    // call initial filter, will return a promise\n                    initialFilter(value, utils)\n\n                    // all executed\n                )\n                .then(function(value) {\n                    return resolve(value);\n                })\n                .catch(function(error) {\n                    return reject(error);\n                });\n        });\n    };\n\n    var applyFilters = function applyFilters(key, value, utils) {\n        return filters\n            .filter(function(f) {\n                return f.key === key;\n            })\n            .map(function(f) {\n                return f.cb(value, utils);\n            });\n    };\n\n    // adds a new filter to the list\n    var addFilter = function addFilter(key, cb) {\n        return filters.push({ key: key, cb: cb });\n    };\n\n    var extendDefaultOptions = function extendDefaultOptions(additionalOptions) {\n        return Object.assign(defaultOptions, additionalOptions);\n    };\n\n    var getOptions = function getOptions() {\n        return Object.assign({}, defaultOptions);\n    };\n\n    var setOptions = function setOptions(opts) {\n        forin(opts, function(key, value) {\n            // key does not exist, so this option cannot be set\n            if (!defaultOptions[key]) {\n                return;\n            }\n            defaultOptions[key][0] = getValueByType(\n                value,\n                defaultOptions[key][0],\n                defaultOptions[key][1]\n            );\n        });\n    };\n\n    // default options on app\n    var defaultOptions = {\n        // the id to add to the root element\n        id: [null, Type.STRING],\n\n        // input field name to use\n        name: ['filepond', Type.STRING],\n\n        // disable the field\n        disabled: [false, Type.BOOLEAN],\n\n        // classname to put on wrapper\n        className: [null, Type.STRING],\n\n        // is the field required\n        required: [false, Type.BOOLEAN],\n\n        // Allow media capture when value is set\n        captureMethod: [null, Type.STRING],\n        // - \"camera\", \"microphone\" or \"camcorder\",\n        // - Does not work with multiple on apple devices\n        // - If set, acceptedFileTypes must be made to match with media wildcard \"image/*\", \"audio/*\" or \"video/*\"\n\n        // sync `acceptedFileTypes` property with `accept` attribute\n        allowSyncAcceptAttribute: [true, Type.BOOLEAN],\n\n        // Feature toggles\n        allowDrop: [true, Type.BOOLEAN], // Allow dropping of files\n        allowBrowse: [true, Type.BOOLEAN], // Allow browsing the file system\n        allowPaste: [true, Type.BOOLEAN], // Allow pasting files\n        allowMultiple: [false, Type.BOOLEAN], // Allow multiple files (disabled by default, as multiple attribute is also required on input to allow multiple)\n        allowReplace: [true, Type.BOOLEAN], // Allow dropping a file on other file to replace it (only works when multiple is set to false)\n        allowRevert: [true, Type.BOOLEAN], // Allows user to revert file upload\n        allowRemove: [true, Type.BOOLEAN], // Allow user to remove a file\n        allowProcess: [true, Type.BOOLEAN], // Allows user to process a file, when set to false, this removes the file upload button\n        allowReorder: [false, Type.BOOLEAN], // Allow reordering of files\n        allowDirectoriesOnly: [false, Type.BOOLEAN], // Allow only selecting directories with browse (no support for filtering dnd at this point)\n\n        // Try store file if `server` not set\n        storeAsFile: [false, Type.BOOLEAN],\n\n        // Revert mode\n        forceRevert: [false, Type.BOOLEAN], // Set to 'force' to require the file to be reverted before removal\n\n        // Input requirements\n        maxFiles: [null, Type.INT], // Max number of files\n        checkValidity: [false, Type.BOOLEAN], // Enables custom validity messages\n\n        // Where to put file\n        itemInsertLocationFreedom: [true, Type.BOOLEAN], // Set to false to always add items to begin or end of list\n        itemInsertLocation: ['before', Type.STRING], // Default index in list to add items that have been dropped at the top of the list\n        itemInsertInterval: [75, Type.INT],\n\n        // Drag 'n Drop related\n        dropOnPage: [false, Type.BOOLEAN], // Allow dropping of files anywhere on page (prevents browser from opening file if dropped outside of Up)\n        dropOnElement: [true, Type.BOOLEAN], // Drop needs to happen on element (set to false to also load drops outside of Up)\n        dropValidation: [false, Type.BOOLEAN], // Enable or disable validating files on drop\n        ignoredFiles: [['.ds_store', 'thumbs.db', 'desktop.ini'], Type.ARRAY],\n\n        // Upload related\n        instantUpload: [true, Type.BOOLEAN], // Should upload files immediately on drop\n        maxParallelUploads: [2, Type.INT], // Maximum files to upload in parallel\n        allowMinimumUploadDuration: [true, Type.BOOLEAN], // if true uploads take at least 750 ms, this ensures the user sees the upload progress giving trust the upload actually happened\n\n        // Chunks\n        chunkUploads: [false, Type.BOOLEAN], // Enable chunked uploads\n        chunkForce: [false, Type.BOOLEAN], // Force use of chunk uploads even for files smaller than chunk size\n        chunkSize: [5000000, Type.INT], // Size of chunks (5MB default)\n        chunkRetryDelays: [[500, 1000, 3000], Type.ARRAY], // Amount of times to retry upload of a chunk when it fails\n\n        // The server api end points to use for uploading (see docs)\n        server: [null, Type.SERVER_API],\n\n        // File size calculations, can set to 1024, this is only used for display, properties use file size base 1000\n        fileSizeBase: [1000, Type.INT],\n\n        // Labels and status messages\n        labelFileSizeBytes: ['bytes', Type.STRING],\n        labelFileSizeKilobytes: ['KB', Type.STRING],\n        labelFileSizeMegabytes: ['MB', Type.STRING],\n        labelFileSizeGigabytes: ['GB', Type.STRING],\n\n        labelDecimalSeparator: [getDecimalSeparator(), Type.STRING], // Default is locale separator\n        labelThousandsSeparator: [getThousandsSeparator(), Type.STRING], // Default is locale separator\n\n        labelIdle: [\n            'Drag & Drop your files or <span class=\"filepond--label-action\">Browse</span>',\n            Type.STRING,\n        ],\n\n        labelInvalidField: ['Field contains invalid files', Type.STRING],\n        labelFileWaitingForSize: ['Waiting for size', Type.STRING],\n        labelFileSizeNotAvailable: ['Size not available', Type.STRING],\n        labelFileCountSingular: ['file in list', Type.STRING],\n        labelFileCountPlural: ['files in list', Type.STRING],\n        labelFileLoading: ['Loading', Type.STRING],\n        labelFileAdded: ['Added', Type.STRING], // assistive only\n        labelFileLoadError: ['Error during load', Type.STRING],\n        labelFileRemoved: ['Removed', Type.STRING], // assistive only\n        labelFileRemoveError: ['Error during remove', Type.STRING],\n        labelFileProcessing: ['Uploading', Type.STRING],\n        labelFileProcessingComplete: ['Upload complete', Type.STRING],\n        labelFileProcessingAborted: ['Upload cancelled', Type.STRING],\n        labelFileProcessingError: ['Error during upload', Type.STRING],\n        labelFileProcessingRevertError: ['Error during revert', Type.STRING],\n\n        labelTapToCancel: ['tap to cancel', Type.STRING],\n        labelTapToRetry: ['tap to retry', Type.STRING],\n        labelTapToUndo: ['tap to undo', Type.STRING],\n\n        labelButtonRemoveItem: ['Remove', Type.STRING],\n        labelButtonAbortItemLoad: ['Abort', Type.STRING],\n        labelButtonRetryItemLoad: ['Retry', Type.STRING],\n        labelButtonAbortItemProcessing: ['Cancel', Type.STRING],\n        labelButtonUndoItemProcessing: ['Undo', Type.STRING],\n        labelButtonRetryItemProcessing: ['Retry', Type.STRING],\n        labelButtonProcessItem: ['Upload', Type.STRING],\n\n        // make sure width and height plus viewpox are even numbers so icons are nicely centered\n        iconRemove: [\n            '<svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.586 13l-2.293 2.293a1 1 0 0 0 1.414 1.414L13 14.414l2.293 2.293a1 1 0 0 0 1.414-1.414L14.414 13l2.293-2.293a1 1 0 0 0-1.414-1.414L13 11.586l-2.293-2.293a1 1 0 0 0-1.414 1.414L11.586 13z\" fill=\"currentColor\" fill-rule=\"nonzero\"/></svg>',\n            Type.STRING,\n        ],\n\n        iconProcess: [\n            '<svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 10.414v3.585a1 1 0 0 1-2 0v-3.585l-1.293 1.293a1 1 0 0 1-1.414-1.415l3-3a1 1 0 0 1 1.414 0l3 3a1 1 0 0 1-1.414 1.415L14 10.414zM9 18a1 1 0 0 1 0-2h8a1 1 0 0 1 0 2H9z\" fill=\"currentColor\" fill-rule=\"evenodd\"/></svg>',\n            Type.STRING,\n        ],\n\n        iconRetry: [\n            '<svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.81 9.185l-.038.02A4.997 4.997 0 0 0 8 13.683a5 5 0 0 0 5 5 5 5 0 0 0 5-5 1 1 0 0 1 2 0A7 7 0 1 1 9.722 7.496l-.842-.21a.999.999 0 1 1 .484-1.94l3.23.806c.535.133.86.675.73 1.21l-.804 3.233a.997.997 0 0 1-1.21.73.997.997 0 0 1-.73-1.21l.23-.928v-.002z\" fill=\"currentColor\" fill-rule=\"nonzero\"/></svg>',\n            Type.STRING,\n        ],\n\n        iconUndo: [\n            '<svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M9.185 10.81l.02-.038A4.997 4.997 0 0 1 13.683 8a5 5 0 0 1 5 5 5 5 0 0 1-5 5 1 1 0 0 0 0 2A7 7 0 1 0 7.496 9.722l-.21-.842a.999.999 0 1 0-1.94.484l.806 3.23c.133.535.675.86 1.21.73l3.233-.803a.997.997 0 0 0 .73-1.21.997.997 0 0 0-1.21-.73l-.928.23-.002-.001z\" fill=\"currentColor\" fill-rule=\"nonzero\"/></svg>',\n            Type.STRING,\n        ],\n\n        iconDone: [\n            '<svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18.293 9.293a1 1 0 0 1 1.414 1.414l-7.002 7a1 1 0 0 1-1.414 0l-3.998-4a1 1 0 1 1 1.414-1.414L12 15.586l6.294-6.293z\" fill=\"currentColor\" fill-rule=\"nonzero\"/></svg>',\n            Type.STRING,\n        ],\n\n        // event handlers\n        oninit: [null, Type.FUNCTION],\n        onwarning: [null, Type.FUNCTION],\n        onerror: [null, Type.FUNCTION],\n        onactivatefile: [null, Type.FUNCTION],\n        oninitfile: [null, Type.FUNCTION],\n        onaddfilestart: [null, Type.FUNCTION],\n        onaddfileprogress: [null, Type.FUNCTION],\n        onaddfile: [null, Type.FUNCTION],\n        onprocessfilestart: [null, Type.FUNCTION],\n        onprocessfileprogress: [null, Type.FUNCTION],\n        onprocessfileabort: [null, Type.FUNCTION],\n        onprocessfilerevert: [null, Type.FUNCTION],\n        onprocessfile: [null, Type.FUNCTION],\n        onprocessfiles: [null, Type.FUNCTION],\n        onremovefile: [null, Type.FUNCTION],\n        onpreparefile: [null, Type.FUNCTION],\n        onupdatefiles: [null, Type.FUNCTION],\n        onreorderfiles: [null, Type.FUNCTION],\n\n        // hooks\n        beforeDropFile: [null, Type.FUNCTION],\n        beforeAddFile: [null, Type.FUNCTION],\n        beforeRemoveFile: [null, Type.FUNCTION],\n        beforePrepareFile: [null, Type.FUNCTION],\n\n        // styles\n        stylePanelLayout: [null, Type.STRING], // null 'integrated', 'compact', 'circle'\n        stylePanelAspectRatio: [null, Type.STRING], // null or '3:2' or 1\n        styleItemPanelAspectRatio: [null, Type.STRING],\n        styleButtonRemoveItemPosition: ['left', Type.STRING],\n        styleButtonProcessItemPosition: ['right', Type.STRING],\n        styleLoadIndicatorPosition: ['right', Type.STRING],\n        styleProgressIndicatorPosition: ['right', Type.STRING],\n        styleButtonRemoveItemAlign: [false, Type.BOOLEAN],\n\n        // custom initial files array\n        files: [[], Type.ARRAY],\n\n        // show support by displaying credits\n        credits: [['https://filepond.com', 'Powered by FilePond'], Type.ARRAY],\n    };\n\n    var getItemByQuery = function getItemByQuery(items, query) {\n        // just return first index\n        if (isEmpty(query)) {\n            return items[0] || null;\n        }\n\n        // query is index\n        if (isInt(query)) {\n            return items[query] || null;\n        }\n\n        // if query is item, get the id\n        if (typeof query === 'object') {\n            query = query.id;\n        }\n\n        // assume query is a string and return item by id\n        return (\n            items.find(function(item) {\n                return item.id === query;\n            }) || null\n        );\n    };\n\n    var getNumericAspectRatioFromString = function getNumericAspectRatioFromString(aspectRatio) {\n        if (isEmpty(aspectRatio)) {\n            return aspectRatio;\n        }\n        if (/:/.test(aspectRatio)) {\n            var parts = aspectRatio.split(':');\n            return parts[1] / parts[0];\n        }\n        return parseFloat(aspectRatio);\n    };\n\n    var getActiveItems = function getActiveItems(items) {\n        return items.filter(function(item) {\n            return !item.archived;\n        });\n    };\n\n    var Status = {\n        EMPTY: 0,\n        IDLE: 1, // waiting\n        ERROR: 2, // a file is in error state\n        BUSY: 3, // busy processing or loading\n        READY: 4, // all files uploaded\n    };\n\n    var res = null;\n    var canUpdateFileInput = function canUpdateFileInput() {\n        if (res === null) {\n            try {\n                var dataTransfer = new DataTransfer();\n                dataTransfer.items.add(new File(['hello world'], 'This_Works.txt'));\n                var el = document.createElement('input');\n                el.setAttribute('type', 'file');\n                el.files = dataTransfer.files;\n                res = el.files.length === 1;\n            } catch (err) {\n                res = false;\n            }\n        }\n        return res;\n    };\n\n    var ITEM_ERROR = [\n        ItemStatus.LOAD_ERROR,\n        ItemStatus.PROCESSING_ERROR,\n        ItemStatus.PROCESSING_REVERT_ERROR,\n    ];\n\n    var ITEM_BUSY = [\n        ItemStatus.LOADING,\n        ItemStatus.PROCESSING,\n        ItemStatus.PROCESSING_QUEUED,\n        ItemStatus.INIT,\n    ];\n\n    var ITEM_READY = [ItemStatus.PROCESSING_COMPLETE];\n\n    var isItemInErrorState = function isItemInErrorState(item) {\n        return ITEM_ERROR.includes(item.status);\n    };\n    var isItemInBusyState = function isItemInBusyState(item) {\n        return ITEM_BUSY.includes(item.status);\n    };\n    var isItemInReadyState = function isItemInReadyState(item) {\n        return ITEM_READY.includes(item.status);\n    };\n\n    var isAsync = function isAsync(state) {\n        return (\n            isObject(state.options.server) &&\n            (isObject(state.options.server.process) || isFunction(state.options.server.process))\n        );\n    };\n\n    var queries = function queries(state) {\n        return {\n            GET_STATUS: function GET_STATUS() {\n                var items = getActiveItems(state.items);\n                var EMPTY = Status.EMPTY,\n                    ERROR = Status.ERROR,\n                    BUSY = Status.BUSY,\n                    IDLE = Status.IDLE,\n                    READY = Status.READY;\n\n                if (items.length === 0) return EMPTY;\n\n                if (items.some(isItemInErrorState)) return ERROR;\n\n                if (items.some(isItemInBusyState)) return BUSY;\n\n                if (items.some(isItemInReadyState)) return READY;\n\n                return IDLE;\n            },\n\n            GET_ITEM: function GET_ITEM(query) {\n                return getItemByQuery(state.items, query);\n            },\n\n            GET_ACTIVE_ITEM: function GET_ACTIVE_ITEM(query) {\n                return getItemByQuery(getActiveItems(state.items), query);\n            },\n\n            GET_ACTIVE_ITEMS: function GET_ACTIVE_ITEMS() {\n                return getActiveItems(state.items);\n            },\n\n            GET_ITEMS: function GET_ITEMS() {\n                return state.items;\n            },\n\n            GET_ITEM_NAME: function GET_ITEM_NAME(query) {\n                var item = getItemByQuery(state.items, query);\n                return item ? item.filename : null;\n            },\n\n            GET_ITEM_SIZE: function GET_ITEM_SIZE(query) {\n                var item = getItemByQuery(state.items, query);\n                return item ? item.fileSize : null;\n            },\n\n            GET_STYLES: function GET_STYLES() {\n                return Object.keys(state.options)\n                    .filter(function(key) {\n                        return /^style/.test(key);\n                    })\n                    .map(function(option) {\n                        return {\n                            name: option,\n                            value: state.options[option],\n                        };\n                    });\n            },\n\n            GET_PANEL_ASPECT_RATIO: function GET_PANEL_ASPECT_RATIO() {\n                var isShapeCircle = /circle/.test(state.options.stylePanelLayout);\n                var aspectRatio = isShapeCircle\n                    ? 1\n                    : getNumericAspectRatioFromString(state.options.stylePanelAspectRatio);\n                return aspectRatio;\n            },\n\n            GET_ITEM_PANEL_ASPECT_RATIO: function GET_ITEM_PANEL_ASPECT_RATIO() {\n                return state.options.styleItemPanelAspectRatio;\n            },\n\n            GET_ITEMS_BY_STATUS: function GET_ITEMS_BY_STATUS(status) {\n                return getActiveItems(state.items).filter(function(item) {\n                    return item.status === status;\n                });\n            },\n\n            GET_TOTAL_ITEMS: function GET_TOTAL_ITEMS() {\n                return getActiveItems(state.items).length;\n            },\n\n            SHOULD_UPDATE_FILE_INPUT: function SHOULD_UPDATE_FILE_INPUT() {\n                return state.options.storeAsFile && canUpdateFileInput() && !isAsync(state);\n            },\n\n            IS_ASYNC: function IS_ASYNC() {\n                return isAsync(state);\n            },\n\n            GET_FILE_SIZE_LABELS: function GET_FILE_SIZE_LABELS(query) {\n                return {\n                    labelBytes: query('GET_LABEL_FILE_SIZE_BYTES') || undefined,\n                    labelKilobytes: query('GET_LABEL_FILE_SIZE_KILOBYTES') || undefined,\n                    labelMegabytes: query('GET_LABEL_FILE_SIZE_MEGABYTES') || undefined,\n                    labelGigabytes: query('GET_LABEL_FILE_SIZE_GIGABYTES') || undefined,\n                };\n            },\n        };\n    };\n\n    var hasRoomForItem = function hasRoomForItem(state) {\n        var count = getActiveItems(state.items).length;\n\n        // if cannot have multiple items, to add one item it should currently not contain items\n        if (!state.options.allowMultiple) {\n            return count === 0;\n        }\n\n        // if allows multiple items, we check if a max item count has been set, if not, there's no limit\n        var maxFileCount = state.options.maxFiles;\n        if (maxFileCount === null) {\n            return true;\n        }\n\n        // we check if the current count is smaller than the max count, if so, another file can still be added\n        if (count < maxFileCount) {\n            return true;\n        }\n\n        // no more room for another file\n        return false;\n    };\n\n    var limit = function limit(value, min, max) {\n        return Math.max(Math.min(max, value), min);\n    };\n\n    var arrayInsert = function arrayInsert(arr, index, item) {\n        return arr.splice(index, 0, item);\n    };\n\n    var insertItem = function insertItem(items, item, index) {\n        if (isEmpty(item)) {\n            return null;\n        }\n\n        // if index is undefined, append\n        if (typeof index === 'undefined') {\n            items.push(item);\n            return item;\n        }\n\n        // limit the index to the size of the items array\n        index = limit(index, 0, items.length);\n\n        // add item to array\n        arrayInsert(items, index, item);\n\n        // expose\n        return item;\n    };\n\n    var isBase64DataURI = function isBase64DataURI(str) {\n        return /^\\s*data:([a-z]+\\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\\-._~:@\\/?%\\s]*)\\s*$/i.test(\n            str\n        );\n    };\n\n    var getFilenameFromURL = function getFilenameFromURL(url) {\n        return ('' + url)\n            .split('/')\n            .pop()\n            .split('?')\n            .shift();\n    };\n\n    var getExtensionFromFilename = function getExtensionFromFilename(name) {\n        return name.split('.').pop();\n    };\n\n    var guesstimateExtension = function guesstimateExtension(type) {\n        // if no extension supplied, exit here\n        if (typeof type !== 'string') {\n            return '';\n        }\n\n        // get subtype\n        var subtype = type.split('/').pop();\n\n        // is svg subtype\n        if (/svg/.test(subtype)) {\n            return 'svg';\n        }\n\n        if (/zip|compressed/.test(subtype)) {\n            return 'zip';\n        }\n\n        if (/plain/.test(subtype)) {\n            return 'txt';\n        }\n\n        if (/msword/.test(subtype)) {\n            return 'doc';\n        }\n\n        // if is valid subtype\n        if (/[a-z]+/.test(subtype)) {\n            // always use jpg extension\n            if (subtype === 'jpeg') {\n                return 'jpg';\n            }\n\n            // return subtype\n            return subtype;\n        }\n\n        return '';\n    };\n\n    var leftPad = function leftPad(value) {\n        var padding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n        return (padding + value).slice(-padding.length);\n    };\n\n    var getDateString = function getDateString() {\n        var date = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Date();\n        return (\n            date.getFullYear() +\n            '-' +\n            leftPad(date.getMonth() + 1, '00') +\n            '-' +\n            leftPad(date.getDate(), '00') +\n            '_' +\n            leftPad(date.getHours(), '00') +\n            '-' +\n            leftPad(date.getMinutes(), '00') +\n            '-' +\n            leftPad(date.getSeconds(), '00')\n        );\n    };\n\n    var getFileFromBlob = function getFileFromBlob(blob, filename) {\n        var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n        var extension = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n        var file =\n            typeof type === 'string'\n                ? blob.slice(0, blob.size, type)\n                : blob.slice(0, blob.size, blob.type);\n        file.lastModifiedDate = new Date();\n\n        // copy relative path\n        if (blob._relativePath) file._relativePath = blob._relativePath;\n\n        // if blob has name property, use as filename if no filename supplied\n        if (!isString(filename)) {\n            filename = getDateString();\n        }\n\n        // if filename supplied but no extension and filename has extension\n        if (filename && extension === null && getExtensionFromFilename(filename)) {\n            file.name = filename;\n        } else {\n            extension = extension || guesstimateExtension(file.type);\n            file.name = filename + (extension ? '.' + extension : '');\n        }\n\n        return file;\n    };\n\n    var getBlobBuilder = function getBlobBuilder() {\n        return (window.BlobBuilder =\n            window.BlobBuilder ||\n            window.WebKitBlobBuilder ||\n            window.MozBlobBuilder ||\n            window.MSBlobBuilder);\n    };\n\n    var createBlob = function createBlob(arrayBuffer, mimeType) {\n        var BB = getBlobBuilder();\n\n        if (BB) {\n            var bb = new BB();\n            bb.append(arrayBuffer);\n            return bb.getBlob(mimeType);\n        }\n\n        return new Blob([arrayBuffer], {\n            type: mimeType,\n        });\n    };\n\n    var getBlobFromByteStringWithMimeType = function getBlobFromByteStringWithMimeType(\n        byteString,\n        mimeType\n    ) {\n        var ab = new ArrayBuffer(byteString.length);\n        var ia = new Uint8Array(ab);\n\n        for (var i = 0; i < byteString.length; i++) {\n            ia[i] = byteString.charCodeAt(i);\n        }\n\n        return createBlob(ab, mimeType);\n    };\n\n    var getMimeTypeFromBase64DataURI = function getMimeTypeFromBase64DataURI(dataURI) {\n        return (/^data:(.+);/.exec(dataURI) || [])[1] || null;\n    };\n\n    var getBase64DataFromBase64DataURI = function getBase64DataFromBase64DataURI(dataURI) {\n        // get data part of string (remove data:image/jpeg...,)\n        var data = dataURI.split(',')[1];\n\n        // remove any whitespace as that causes InvalidCharacterError in IE\n        return data.replace(/\\s/g, '');\n    };\n\n    var getByteStringFromBase64DataURI = function getByteStringFromBase64DataURI(dataURI) {\n        return atob(getBase64DataFromBase64DataURI(dataURI));\n    };\n\n    var getBlobFromBase64DataURI = function getBlobFromBase64DataURI(dataURI) {\n        var mimeType = getMimeTypeFromBase64DataURI(dataURI);\n        var byteString = getByteStringFromBase64DataURI(dataURI);\n\n        return getBlobFromByteStringWithMimeType(byteString, mimeType);\n    };\n\n    var getFileFromBase64DataURI = function getFileFromBase64DataURI(dataURI, filename, extension) {\n        return getFileFromBlob(getBlobFromBase64DataURI(dataURI), filename, null, extension);\n    };\n\n    var getFileNameFromHeader = function getFileNameFromHeader(header) {\n        // test if is content disposition header, if not exit\n        if (!/^content-disposition:/i.test(header)) return null;\n\n        // get filename parts\n        var matches = header\n            .split(/filename=|filename\\*=.+''/)\n            .splice(1)\n            .map(function(name) {\n                return name.trim().replace(/^[\"']|[;\"']{0,2}$/g, '');\n            })\n            .filter(function(name) {\n                return name.length;\n            });\n\n        return matches.length ? decodeURI(matches[matches.length - 1]) : null;\n    };\n\n    var getFileSizeFromHeader = function getFileSizeFromHeader(header) {\n        if (/content-length:/i.test(header)) {\n            var size = header.match(/[0-9]+/)[0];\n            return size ? parseInt(size, 10) : null;\n        }\n        return null;\n    };\n\n    var getTranfserIdFromHeader = function getTranfserIdFromHeader(header) {\n        if (/x-content-transfer-id:/i.test(header)) {\n            var id = (header.split(':')[1] || '').trim();\n            return id || null;\n        }\n        return null;\n    };\n\n    var getFileInfoFromHeaders = function getFileInfoFromHeaders(headers) {\n        var info = {\n            source: null,\n            name: null,\n            size: null,\n        };\n\n        var rows = headers.split('\\n');\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n        try {\n            for (\n                var _iterator = rows[Symbol.iterator](), _step;\n                !(_iteratorNormalCompletion = (_step = _iterator.next()).done);\n                _iteratorNormalCompletion = true\n            ) {\n                var header = _step.value;\n\n                var name = getFileNameFromHeader(header);\n                if (name) {\n                    info.name = name;\n                    continue;\n                }\n\n                var size = getFileSizeFromHeader(header);\n                if (size) {\n                    info.size = size;\n                    continue;\n                }\n\n                var source = getTranfserIdFromHeader(header);\n                if (source) {\n                    info.source = source;\n                    continue;\n                }\n            }\n        } catch (err) {\n            _didIteratorError = true;\n            _iteratorError = err;\n        } finally {\n            try {\n                if (!_iteratorNormalCompletion && _iterator.return != null) {\n                    _iterator.return();\n                }\n            } finally {\n                if (_didIteratorError) {\n                    throw _iteratorError;\n                }\n            }\n        }\n\n        return info;\n    };\n\n    var createFileLoader = function createFileLoader(fetchFn) {\n        var state = {\n            source: null,\n            complete: false,\n            progress: 0,\n            size: null,\n            timestamp: null,\n            duration: 0,\n            request: null,\n        };\n\n        var getProgress = function getProgress() {\n            return state.progress;\n        };\n        var abort = function abort() {\n            if (state.request && state.request.abort) {\n                state.request.abort();\n            }\n        };\n\n        // load source\n        var load = function load() {\n            // get quick reference\n            var source = state.source;\n\n            api.fire('init', source);\n\n            // Load Files\n            if (source instanceof File) {\n                api.fire('load', source);\n            } else if (source instanceof Blob) {\n                // Load blobs, set default name to current date\n                api.fire('load', getFileFromBlob(source, source.name));\n            } else if (isBase64DataURI(source)) {\n                // Load base 64, set default name to current date\n                api.fire('load', getFileFromBase64DataURI(source));\n            } else {\n                // Deal as if is external URL, let's load it!\n                loadURL(source);\n            }\n        };\n\n        // loads a url\n        var loadURL = function loadURL(url) {\n            // is remote url and no fetch method supplied\n            if (!fetchFn) {\n                api.fire('error', {\n                    type: 'error',\n                    body: \"Can't load URL\",\n                    code: 400,\n                });\n\n                return;\n            }\n\n            // set request start\n            state.timestamp = Date.now();\n\n            // load file\n            state.request = fetchFn(\n                url,\n                function(response) {\n                    // update duration\n                    state.duration = Date.now() - state.timestamp;\n\n                    // done!\n                    state.complete = true;\n\n                    // turn blob response into a file\n                    if (response instanceof Blob) {\n                        response = getFileFromBlob(\n                            response,\n                            response.name || getFilenameFromURL(url)\n                        );\n                    }\n\n                    api.fire(\n                        'load',\n                        // if has received blob, we go with blob, if no response, we return null\n                        response instanceof Blob ? response : response ? response.body : null\n                    );\n                },\n                function(error) {\n                    api.fire(\n                        'error',\n                        typeof error === 'string'\n                            ? {\n                                  type: 'error',\n                                  code: 0,\n                                  body: error,\n                              }\n                            : error\n                    );\n                },\n                function(computable, current, total) {\n                    // collected some meta data already\n                    if (total) {\n                        state.size = total;\n                    }\n\n                    // update duration\n                    state.duration = Date.now() - state.timestamp;\n\n                    // if we can't compute progress, we're not going to fire progress events\n                    if (!computable) {\n                        state.progress = null;\n                        return;\n                    }\n\n                    // update progress percentage\n                    state.progress = current / total;\n\n                    // expose\n                    api.fire('progress', state.progress);\n                },\n                function() {\n                    api.fire('abort');\n                },\n                function(response) {\n                    var fileinfo = getFileInfoFromHeaders(\n                        typeof response === 'string' ? response : response.headers\n                    );\n                    api.fire('meta', {\n                        size: state.size || fileinfo.size,\n                        filename: fileinfo.name,\n                        source: fileinfo.source,\n                    });\n                }\n            );\n        };\n\n        var api = Object.assign({}, on(), {\n            setSource: function setSource(source) {\n                return (state.source = source);\n            },\n            getProgress: getProgress, // file load progress\n            abort: abort, // abort file load\n            load: load, // start load\n        });\n\n        return api;\n    };\n\n    var isGet = function isGet(method) {\n        return /GET|HEAD/.test(method);\n    };\n\n    var sendRequest = function sendRequest(data, url, options) {\n        var api = {\n            onheaders: function onheaders() {},\n            onprogress: function onprogress() {},\n            onload: function onload() {},\n            ontimeout: function ontimeout() {},\n            onerror: function onerror() {},\n            onabort: function onabort() {},\n            abort: function abort() {\n                aborted = true;\n                xhr.abort();\n            },\n        };\n\n        // timeout identifier, only used when timeout is defined\n        var aborted = false;\n        var headersReceived = false;\n\n        // set default options\n        options = Object.assign(\n            {\n                method: 'POST',\n                headers: {},\n                withCredentials: false,\n            },\n            options\n        );\n\n        // encode url\n        url = encodeURI(url);\n\n        // if method is GET, add any received data to url\n\n        if (isGet(options.method) && data) {\n            url =\n                '' +\n                url +\n                encodeURIComponent(typeof data === 'string' ? data : JSON.stringify(data));\n        }\n\n        // create request\n        var xhr = new XMLHttpRequest();\n\n        // progress of load\n        var process = isGet(options.method) ? xhr : xhr.upload;\n        process.onprogress = function(e) {\n            // no progress event when aborted ( onprogress is called once after abort() )\n            if (aborted) {\n                return;\n            }\n\n            api.onprogress(e.lengthComputable, e.loaded, e.total);\n        };\n\n        // tries to get header info to the app as fast as possible\n        xhr.onreadystatechange = function() {\n            // not interesting in these states ('unsent' and 'openend' as they don't give us any additional info)\n            if (xhr.readyState < 2) {\n                return;\n            }\n\n            // no server response\n            if (xhr.readyState === 4 && xhr.status === 0) {\n                return;\n            }\n\n            if (headersReceived) {\n                return;\n            }\n\n            headersReceived = true;\n\n            // we've probably received some useful data in response headers\n            api.onheaders(xhr);\n        };\n\n        // load successful\n        xhr.onload = function() {\n            // is classified as valid response\n            if (xhr.status >= 200 && xhr.status < 300) {\n                api.onload(xhr);\n            } else {\n                api.onerror(xhr);\n            }\n        };\n\n        // error during load\n        xhr.onerror = function() {\n            return api.onerror(xhr);\n        };\n\n        // request aborted\n        xhr.onabort = function() {\n            aborted = true;\n            api.onabort();\n        };\n\n        // request timeout\n        xhr.ontimeout = function() {\n            return api.ontimeout(xhr);\n        };\n\n        // open up open up!\n        xhr.open(options.method, url, true);\n\n        // set timeout if defined (do it after open so IE11 plays ball)\n        if (isInt(options.timeout)) {\n            xhr.timeout = options.timeout;\n        }\n\n        // add headers\n        Object.keys(options.headers).forEach(function(key) {\n            var value = unescape(encodeURIComponent(options.headers[key]));\n            xhr.setRequestHeader(key, value);\n        });\n\n        // set type of response\n        if (options.responseType) {\n            xhr.responseType = options.responseType;\n        }\n\n        // set credentials\n        if (options.withCredentials) {\n            xhr.withCredentials = true;\n        }\n\n        // let's send our data\n        xhr.send(data);\n\n        return api;\n    };\n\n    var createResponse = function createResponse(type, code, body, headers) {\n        return {\n            type: type,\n            code: code,\n            body: body,\n            headers: headers,\n        };\n    };\n\n    var createTimeoutResponse = function createTimeoutResponse(cb) {\n        return function(xhr) {\n            cb(createResponse('error', 0, 'Timeout', xhr.getAllResponseHeaders()));\n        };\n    };\n\n    var hasQS = function hasQS(str) {\n        return /\\?/.test(str);\n    };\n    var buildURL = function buildURL() {\n        var url = '';\n        for (var _len = arguments.length, parts = new Array(_len), _key = 0; _key < _len; _key++) {\n            parts[_key] = arguments[_key];\n        }\n        parts.forEach(function(part) {\n            url += hasQS(url) && hasQS(part) ? part.replace(/\\?/, '&') : part;\n        });\n        return url;\n    };\n\n    var createFetchFunction = function createFetchFunction() {\n        var apiUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n        var action = arguments.length > 1 ? arguments[1] : undefined;\n        // custom handler (should also handle file, load, error, progress and abort)\n        if (typeof action === 'function') {\n            return action;\n        }\n\n        // no action supplied\n        if (!action || !isString(action.url)) {\n            return null;\n        }\n\n        // set onload hanlder\n        var onload =\n            action.onload ||\n            function(res) {\n                return res;\n            };\n        var onerror =\n            action.onerror ||\n            function(res) {\n                return null;\n            };\n\n        // internal handler\n        return function(url, load, error, progress, abort, headers) {\n            // do local or remote request based on if the url is external\n            var request = sendRequest(\n                url,\n                buildURL(apiUrl, action.url),\n                Object.assign({}, action, {\n                    responseType: 'blob',\n                })\n            );\n\n            request.onload = function(xhr) {\n                // get headers\n                var headers = xhr.getAllResponseHeaders();\n\n                // get filename\n                var filename = getFileInfoFromHeaders(headers).name || getFilenameFromURL(url);\n\n                // create response\n                load(\n                    createResponse(\n                        'load',\n                        xhr.status,\n                        action.method === 'HEAD'\n                            ? null\n                            : getFileFromBlob(onload(xhr.response), filename),\n                        headers\n                    )\n                );\n            };\n\n            request.onerror = function(xhr) {\n                error(\n                    createResponse(\n                        'error',\n                        xhr.status,\n                        onerror(xhr.response) || xhr.statusText,\n                        xhr.getAllResponseHeaders()\n                    )\n                );\n            };\n\n            request.onheaders = function(xhr) {\n                headers(createResponse('headers', xhr.status, null, xhr.getAllResponseHeaders()));\n            };\n\n            request.ontimeout = createTimeoutResponse(error);\n            request.onprogress = progress;\n            request.onabort = abort;\n\n            // should return request\n            return request;\n        };\n    };\n\n    var ChunkStatus = {\n        QUEUED: 0,\n        COMPLETE: 1,\n        PROCESSING: 2,\n        ERROR: 3,\n        WAITING: 4,\n    };\n\n    /*\n                                                       function signature:\n                                                         (file, metadata, load, error, progress, abort, transfer, options) => {\n                                                           return {\n                                                           abort:() => {}\n                                                         }\n                                                       }\n                                                       */\n\n    // apiUrl, action, name, file, metadata, load, error, progress, abort, transfer, options\n    var processFileChunked = function processFileChunked(\n        apiUrl,\n        action,\n        name,\n        file,\n        metadata,\n        load,\n        error,\n        progress,\n        abort,\n        transfer,\n        options\n    ) {\n        // all chunks\n        var chunks = [];\n        var chunkTransferId = options.chunkTransferId,\n            chunkServer = options.chunkServer,\n            chunkSize = options.chunkSize,\n            chunkRetryDelays = options.chunkRetryDelays;\n\n        // default state\n        var state = {\n            serverId: chunkTransferId,\n            aborted: false,\n        };\n\n        // set onload handlers\n        var ondata =\n            action.ondata ||\n            function(fd) {\n                return fd;\n            };\n        var onload =\n            action.onload ||\n            function(xhr, method) {\n                return method === 'HEAD' ? xhr.getResponseHeader('Upload-Offset') : xhr.response;\n            };\n        var onerror =\n            action.onerror ||\n            function(res) {\n                return null;\n            };\n\n        // create server hook\n        var requestTransferId = function requestTransferId(cb) {\n            var formData = new FormData();\n\n            // add metadata under same name\n            if (isObject(metadata)) formData.append(name, JSON.stringify(metadata));\n\n            var headers =\n                typeof action.headers === 'function'\n                    ? action.headers(file, metadata)\n                    : Object.assign(\n                          {},\n\n                          action.headers,\n                          {\n                              'Upload-Length': file.size,\n                          }\n                      );\n\n            var requestParams = Object.assign({}, action, {\n                headers: headers,\n            });\n\n            // send request object\n            var request = sendRequest(\n                ondata(formData),\n                buildURL(apiUrl, action.url),\n                requestParams\n            );\n\n            request.onload = function(xhr) {\n                return cb(onload(xhr, requestParams.method));\n            };\n\n            request.onerror = function(xhr) {\n                return error(\n                    createResponse(\n                        'error',\n                        xhr.status,\n                        onerror(xhr.response) || xhr.statusText,\n                        xhr.getAllResponseHeaders()\n                    )\n                );\n            };\n\n            request.ontimeout = createTimeoutResponse(error);\n        };\n\n        var requestTransferOffset = function requestTransferOffset(cb) {\n            var requestUrl = buildURL(apiUrl, chunkServer.url, state.serverId);\n\n            var headers =\n                typeof action.headers === 'function'\n                    ? action.headers(state.serverId)\n                    : Object.assign(\n                          {},\n\n                          action.headers\n                      );\n\n            var requestParams = {\n                headers: headers,\n                method: 'HEAD',\n            };\n\n            var request = sendRequest(null, requestUrl, requestParams);\n\n            request.onload = function(xhr) {\n                return cb(onload(xhr, requestParams.method));\n            };\n\n            request.onerror = function(xhr) {\n                return error(\n                    createResponse(\n                        'error',\n                        xhr.status,\n                        onerror(xhr.response) || xhr.statusText,\n                        xhr.getAllResponseHeaders()\n                    )\n                );\n            };\n\n            request.ontimeout = createTimeoutResponse(error);\n        };\n\n        // create chunks\n        var lastChunkIndex = Math.floor(file.size / chunkSize);\n        for (var i = 0; i <= lastChunkIndex; i++) {\n            var offset = i * chunkSize;\n            var data = file.slice(offset, offset + chunkSize, 'application/offset+octet-stream');\n            chunks[i] = {\n                index: i,\n                size: data.size,\n                offset: offset,\n                data: data,\n                file: file,\n                progress: 0,\n                retries: _toConsumableArray(chunkRetryDelays),\n                status: ChunkStatus.QUEUED,\n                error: null,\n                request: null,\n                timeout: null,\n            };\n        }\n\n        var completeProcessingChunks = function completeProcessingChunks() {\n            return load(state.serverId);\n        };\n\n        var canProcessChunk = function canProcessChunk(chunk) {\n            return chunk.status === ChunkStatus.QUEUED || chunk.status === ChunkStatus.ERROR;\n        };\n\n        var processChunk = function processChunk(chunk) {\n            // processing is paused, wait here\n            if (state.aborted) return;\n\n            // get next chunk to process\n            chunk = chunk || chunks.find(canProcessChunk);\n\n            // no more chunks to process\n            if (!chunk) {\n                // all done?\n                if (\n                    chunks.every(function(chunk) {\n                        return chunk.status === ChunkStatus.COMPLETE;\n                    })\n                ) {\n                    completeProcessingChunks();\n                }\n\n                // no chunk to handle\n                return;\n            }\n\n            // now processing this chunk\n            chunk.status = ChunkStatus.PROCESSING;\n            chunk.progress = null;\n\n            // allow parsing of formdata\n            var ondata =\n                chunkServer.ondata ||\n                function(fd) {\n                    return fd;\n                };\n            var onerror =\n                chunkServer.onerror ||\n                function(res) {\n                    return null;\n                };\n            var onload = chunkServer.onload || function() {};\n\n            // send request object\n            var requestUrl = buildURL(apiUrl, chunkServer.url, state.serverId);\n\n            var headers =\n                typeof chunkServer.headers === 'function'\n                    ? chunkServer.headers(chunk)\n                    : Object.assign(\n                          {},\n\n                          chunkServer.headers,\n                          {\n                              'Content-Type': 'application/offset+octet-stream',\n                              'Upload-Offset': chunk.offset,\n                              'Upload-Length': file.size,\n                              'Upload-Name': file.name,\n                          }\n                      );\n\n            var request = (chunk.request = sendRequest(\n                ondata(chunk.data),\n                requestUrl,\n                Object.assign({}, chunkServer, {\n                    headers: headers,\n                })\n            ));\n\n            request.onload = function(xhr) {\n                // allow hooking into request result\n                onload(xhr, chunk.index, chunks.length);\n\n                // done!\n                chunk.status = ChunkStatus.COMPLETE;\n\n                // remove request reference\n                chunk.request = null;\n\n                // start processing more chunks\n                processChunks();\n            };\n\n            request.onprogress = function(lengthComputable, loaded, total) {\n                chunk.progress = lengthComputable ? loaded : null;\n                updateTotalProgress();\n            };\n\n            request.onerror = function(xhr) {\n                chunk.status = ChunkStatus.ERROR;\n                chunk.request = null;\n                chunk.error = onerror(xhr.response) || xhr.statusText;\n                if (!retryProcessChunk(chunk)) {\n                    error(\n                        createResponse(\n                            'error',\n                            xhr.status,\n                            onerror(xhr.response) || xhr.statusText,\n                            xhr.getAllResponseHeaders()\n                        )\n                    );\n                }\n            };\n\n            request.ontimeout = function(xhr) {\n                chunk.status = ChunkStatus.ERROR;\n                chunk.request = null;\n                if (!retryProcessChunk(chunk)) {\n                    createTimeoutResponse(error)(xhr);\n                }\n            };\n\n            request.onabort = function() {\n                chunk.status = ChunkStatus.QUEUED;\n                chunk.request = null;\n                abort();\n            };\n        };\n\n        var retryProcessChunk = function retryProcessChunk(chunk) {\n            // no more retries left\n            if (chunk.retries.length === 0) return false;\n\n            // new retry\n            chunk.status = ChunkStatus.WAITING;\n            clearTimeout(chunk.timeout);\n            chunk.timeout = setTimeout(function() {\n                processChunk(chunk);\n            }, chunk.retries.shift());\n\n            // we're going to retry\n            return true;\n        };\n\n        var updateTotalProgress = function updateTotalProgress() {\n            // calculate total progress fraction\n            var totalBytesTransfered = chunks.reduce(function(p, chunk) {\n                if (p === null || chunk.progress === null) return null;\n                return p + chunk.progress;\n            }, 0);\n\n            // can't compute progress\n            if (totalBytesTransfered === null) return progress(false, 0, 0);\n\n            // calculate progress values\n            var totalSize = chunks.reduce(function(total, chunk) {\n                return total + chunk.size;\n            }, 0);\n\n            // can update progress indicator\n            progress(true, totalBytesTransfered, totalSize);\n        };\n\n        // process new chunks\n        var processChunks = function processChunks() {\n            var totalProcessing = chunks.filter(function(chunk) {\n                return chunk.status === ChunkStatus.PROCESSING;\n            }).length;\n            if (totalProcessing >= 1) return;\n            processChunk();\n        };\n\n        var abortChunks = function abortChunks() {\n            chunks.forEach(function(chunk) {\n                clearTimeout(chunk.timeout);\n                if (chunk.request) {\n                    chunk.request.abort();\n                }\n            });\n        };\n\n        // let's go!\n        if (!state.serverId) {\n            requestTransferId(function(serverId) {\n                // stop here if aborted, might have happened in between request and callback\n                if (state.aborted) return;\n\n                // pass back to item so we can use it if something goes wrong\n                transfer(serverId);\n\n                // store internally\n                state.serverId = serverId;\n                processChunks();\n            });\n        } else {\n            requestTransferOffset(function(offset) {\n                // stop here if aborted, might have happened in between request and callback\n                if (state.aborted) return;\n\n                // mark chunks with lower offset as complete\n                chunks\n                    .filter(function(chunk) {\n                        return chunk.offset < offset;\n                    })\n                    .forEach(function(chunk) {\n                        chunk.status = ChunkStatus.COMPLETE;\n                        chunk.progress = chunk.size;\n                    });\n\n                // continue processing\n                processChunks();\n            });\n        }\n\n        return {\n            abort: function abort() {\n                state.aborted = true;\n                abortChunks();\n            },\n        };\n    };\n\n    /*\n                                                               function signature:\n                                                                 (file, metadata, load, error, progress, abort) => {\n                                                                   return {\n                                                                   abort:() => {}\n                                                                 }\n                                                               }\n                                                               */\n    var createFileProcessorFunction = function createFileProcessorFunction(\n        apiUrl,\n        action,\n        name,\n        options\n    ) {\n        return function(file, metadata, load, error, progress, abort, transfer) {\n            // no file received\n            if (!file) return;\n\n            // if was passed a file, and we can chunk it, exit here\n            var canChunkUpload = options.chunkUploads;\n            var shouldChunkUpload = canChunkUpload && file.size > options.chunkSize;\n            var willChunkUpload = canChunkUpload && (shouldChunkUpload || options.chunkForce);\n            if (file instanceof Blob && willChunkUpload)\n                return processFileChunked(\n                    apiUrl,\n                    action,\n                    name,\n                    file,\n                    metadata,\n                    load,\n                    error,\n                    progress,\n                    abort,\n                    transfer,\n                    options\n                );\n\n            // set handlers\n            var ondata =\n                action.ondata ||\n                function(fd) {\n                    return fd;\n                };\n            var onload =\n                action.onload ||\n                function(res) {\n                    return res;\n                };\n            var onerror =\n                action.onerror ||\n                function(res) {\n                    return null;\n                };\n\n            var headers =\n                typeof action.headers === 'function'\n                    ? action.headers(file, metadata) || {}\n                    : Object.assign(\n                          {},\n\n                          action.headers\n                      );\n\n            var requestParams = Object.assign({}, action, {\n                headers: headers,\n            });\n\n            // create formdata object\n            var formData = new FormData();\n\n            // add metadata under same name\n            if (isObject(metadata)) {\n                formData.append(name, JSON.stringify(metadata));\n            }\n\n            // Turn into an array of objects so no matter what the input, we can handle it the same way\n            (file instanceof Blob ? [{ name: null, file: file }] : file).forEach(function(item) {\n                formData.append(\n                    name,\n                    item.file,\n                    item.name === null ? item.file.name : '' + item.name + item.file.name\n                );\n            });\n\n            // send request object\n            var request = sendRequest(\n                ondata(formData),\n                buildURL(apiUrl, action.url),\n                requestParams\n            );\n            request.onload = function(xhr) {\n                load(\n                    createResponse(\n                        'load',\n                        xhr.status,\n                        onload(xhr.response),\n                        xhr.getAllResponseHeaders()\n                    )\n                );\n            };\n\n            request.onerror = function(xhr) {\n                error(\n                    createResponse(\n                        'error',\n                        xhr.status,\n                        onerror(xhr.response) || xhr.statusText,\n                        xhr.getAllResponseHeaders()\n                    )\n                );\n            };\n\n            request.ontimeout = createTimeoutResponse(error);\n            request.onprogress = progress;\n            request.onabort = abort;\n\n            // should return request\n            return request;\n        };\n    };\n\n    var createProcessorFunction = function createProcessorFunction() {\n        var apiUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n        var action = arguments.length > 1 ? arguments[1] : undefined;\n        var name = arguments.length > 2 ? arguments[2] : undefined;\n        var options = arguments.length > 3 ? arguments[3] : undefined;\n\n        // custom handler (should also handle file, load, error, progress and abort)\n        if (typeof action === 'function')\n            return function() {\n                for (\n                    var _len = arguments.length, params = new Array(_len), _key = 0;\n                    _key < _len;\n                    _key++\n                ) {\n                    params[_key] = arguments[_key];\n                }\n                return action.apply(void 0, [name].concat(params, [options]));\n            };\n\n        // no action supplied\n        if (!action || !isString(action.url)) return null;\n\n        // internal handler\n        return createFileProcessorFunction(apiUrl, action, name, options);\n    };\n\n    /*\n                                                      function signature:\n                                                      (uniqueFileId, load, error) => { }\n                                                      */\n    var createRevertFunction = function createRevertFunction() {\n        var apiUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n        var action = arguments.length > 1 ? arguments[1] : undefined;\n        // is custom implementation\n        if (typeof action === 'function') {\n            return action;\n        }\n\n        // no action supplied, return stub function, interface will work, but file won't be removed\n        if (!action || !isString(action.url)) {\n            return function(uniqueFileId, load) {\n                return load();\n            };\n        }\n\n        // set onload hanlder\n        var onload =\n            action.onload ||\n            function(res) {\n                return res;\n            };\n        var onerror =\n            action.onerror ||\n            function(res) {\n                return null;\n            };\n\n        // internal implementation\n        return function(uniqueFileId, load, error) {\n            var request = sendRequest(\n                uniqueFileId,\n                apiUrl + action.url,\n                action // contains method, headers and withCredentials properties\n            );\n            request.onload = function(xhr) {\n                load(\n                    createResponse(\n                        'load',\n                        xhr.status,\n                        onload(xhr.response),\n                        xhr.getAllResponseHeaders()\n                    )\n                );\n            };\n\n            request.onerror = function(xhr) {\n                error(\n                    createResponse(\n                        'error',\n                        xhr.status,\n                        onerror(xhr.response) || xhr.statusText,\n                        xhr.getAllResponseHeaders()\n                    )\n                );\n            };\n\n            request.ontimeout = createTimeoutResponse(error);\n\n            return request;\n        };\n    };\n\n    var getRandomNumber = function getRandomNumber() {\n        var min = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n        var max = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n        return min + Math.random() * (max - min);\n    };\n\n    var createPerceivedPerformanceUpdater = function createPerceivedPerformanceUpdater(cb) {\n        var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n        var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n        var tickMin = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 25;\n        var tickMax = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 250;\n        var timeout = null;\n        var start = Date.now();\n\n        var tick = function tick() {\n            var runtime = Date.now() - start;\n            var delay = getRandomNumber(tickMin, tickMax);\n\n            if (runtime + delay > duration) {\n                delay = runtime + delay - duration;\n            }\n\n            var progress = runtime / duration;\n            if (progress >= 1 || document.hidden) {\n                cb(1);\n                return;\n            }\n\n            cb(progress);\n\n            timeout = setTimeout(tick, delay);\n        };\n\n        if (duration > 0) tick();\n\n        return {\n            clear: function clear() {\n                clearTimeout(timeout);\n            },\n        };\n    };\n\n    var createFileProcessor = function createFileProcessor(processFn, options) {\n        var state = {\n            complete: false,\n            perceivedProgress: 0,\n            perceivedPerformanceUpdater: null,\n            progress: null,\n            timestamp: null,\n            perceivedDuration: 0,\n            duration: 0,\n            request: null,\n            response: null,\n        };\n        var allowMinimumUploadDuration = options.allowMinimumUploadDuration;\n\n        var process = function process(file, metadata) {\n            var progressFn = function progressFn() {\n                // we've not yet started the real download, stop here\n                // the request might not go through, for instance, there might be some server trouble\n                // if state.progress is null, the server does not allow computing progress and we show the spinner instead\n                if (state.duration === 0 || state.progress === null) return;\n\n                // as we're now processing, fire the progress event\n                api.fire('progress', api.getProgress());\n            };\n\n            var completeFn = function completeFn() {\n                state.complete = true;\n                api.fire('load-perceived', state.response.body);\n            };\n\n            // let's start processing\n            api.fire('start');\n\n            // set request start\n            state.timestamp = Date.now();\n\n            // create perceived performance progress indicator\n            state.perceivedPerformanceUpdater = createPerceivedPerformanceUpdater(\n                function(progress) {\n                    state.perceivedProgress = progress;\n                    state.perceivedDuration = Date.now() - state.timestamp;\n\n                    progressFn();\n\n                    // if fake progress is done, and a response has been received,\n                    // and we've not yet called the complete method\n                    if (state.response && state.perceivedProgress === 1 && !state.complete) {\n                        // we done!\n                        completeFn();\n                    }\n                },\n                // random delay as in a list of files you start noticing\n                // files uploading at the exact same speed\n                allowMinimumUploadDuration ? getRandomNumber(750, 1500) : 0\n            );\n\n            // remember request so we can abort it later\n            state.request = processFn(\n                // the file to process\n                file,\n\n                // the metadata to send along\n                metadata,\n\n                // callbacks (load, error, progress, abort, transfer)\n                // load expects the body to be a server id if\n                // you want to make use of revert\n                function(response) {\n                    // we put the response in state so we can access\n                    // it outside of this method\n                    state.response = isObject(response)\n                        ? response\n                        : {\n                              type: 'load',\n                              code: 200,\n                              body: '' + response,\n                              headers: {},\n                          };\n\n                    // update duration\n                    state.duration = Date.now() - state.timestamp;\n\n                    // force progress to 1 as we're now done\n                    state.progress = 1;\n\n                    // actual load is done let's share results\n                    api.fire('load', state.response.body);\n\n                    // we are really done\n                    // if perceived progress is 1 ( wait for perceived progress to complete )\n                    // or if server does not support progress ( null )\n                    if (\n                        !allowMinimumUploadDuration ||\n                        (allowMinimumUploadDuration && state.perceivedProgress === 1)\n                    ) {\n                        completeFn();\n                    }\n                },\n\n                // error is expected to be an object with type, code, body\n                function(error) {\n                    // cancel updater\n                    state.perceivedPerformanceUpdater.clear();\n\n                    // update others about this error\n                    api.fire(\n                        'error',\n                        isObject(error)\n                            ? error\n                            : {\n                                  type: 'error',\n                                  code: 0,\n                                  body: '' + error,\n                              }\n                    );\n                },\n\n                // actual processing progress\n                function(computable, current, total) {\n                    // update actual duration\n                    state.duration = Date.now() - state.timestamp;\n\n                    // update actual progress\n                    state.progress = computable ? current / total : null;\n\n                    progressFn();\n                },\n\n                // abort does not expect a value\n                function() {\n                    // stop updater\n                    state.perceivedPerformanceUpdater.clear();\n\n                    // fire the abort event so we can switch visuals\n                    api.fire('abort', state.response ? state.response.body : null);\n                },\n\n                // register the id for this transfer\n                function(transferId) {\n                    api.fire('transfer', transferId);\n                }\n            );\n        };\n\n        var abort = function abort() {\n            // no request running, can't abort\n            if (!state.request) return;\n\n            // stop updater\n            state.perceivedPerformanceUpdater.clear();\n\n            // abort actual request\n            if (state.request.abort) state.request.abort();\n\n            // if has response object, we've completed the request\n            state.complete = true;\n        };\n\n        var reset = function reset() {\n            abort();\n            state.complete = false;\n            state.perceivedProgress = 0;\n            state.progress = 0;\n            state.timestamp = null;\n            state.perceivedDuration = 0;\n            state.duration = 0;\n            state.request = null;\n            state.response = null;\n        };\n\n        var getProgress = allowMinimumUploadDuration\n            ? function() {\n                  return state.progress ? Math.min(state.progress, state.perceivedProgress) : null;\n              }\n            : function() {\n                  return state.progress || null;\n              };\n\n        var getDuration = allowMinimumUploadDuration\n            ? function() {\n                  return Math.min(state.duration, state.perceivedDuration);\n              }\n            : function() {\n                  return state.duration;\n              };\n\n        var api = Object.assign({}, on(), {\n            process: process, // start processing file\n            abort: abort, // abort active process request\n            getProgress: getProgress,\n            getDuration: getDuration,\n            reset: reset,\n        });\n\n        return api;\n    };\n\n    var getFilenameWithoutExtension = function getFilenameWithoutExtension(name) {\n        return name.substring(0, name.lastIndexOf('.')) || name;\n    };\n\n    var createFileStub = function createFileStub(source) {\n        var data = [source.name, source.size, source.type];\n\n        // is blob or base64, then we need to set the name\n        if (source instanceof Blob || isBase64DataURI(source)) {\n            data[0] = source.name || getDateString();\n        } else if (isBase64DataURI(source)) {\n            // if is base64 data uri we need to determine the average size and type\n            data[1] = source.length;\n            data[2] = getMimeTypeFromBase64DataURI(source);\n        } else if (isString(source)) {\n            // url\n            data[0] = getFilenameFromURL(source);\n            data[1] = 0;\n            data[2] = 'application/octet-stream';\n        }\n\n        return {\n            name: data[0],\n            size: data[1],\n            type: data[2],\n        };\n    };\n\n    var isFile = function isFile(value) {\n        return !!(value instanceof File || (value instanceof Blob && value.name));\n    };\n\n    var deepCloneObject = function deepCloneObject(src) {\n        if (!isObject(src)) return src;\n        var target = isArray(src) ? [] : {};\n        for (var key in src) {\n            if (!src.hasOwnProperty(key)) continue;\n            var v = src[key];\n            target[key] = v && isObject(v) ? deepCloneObject(v) : v;\n        }\n        return target;\n    };\n\n    var createItem = function createItem() {\n        var origin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n        var serverFileReference =\n            arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n        var file = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n        // unique id for this item, is used to identify the item across views\n        var id = getUniqueId();\n\n        /**\n         * Internal item state\n         */\n        var state = {\n            // is archived\n            archived: false,\n\n            // if is frozen, no longer fires events\n            frozen: false,\n\n            // removed from view\n            released: false,\n\n            // original source\n            source: null,\n\n            // file model reference\n            file: file,\n\n            // id of file on server\n            serverFileReference: serverFileReference,\n\n            // id of file transfer on server\n            transferId: null,\n\n            // is aborted\n            processingAborted: false,\n\n            // current item status\n            status: serverFileReference ? ItemStatus.PROCESSING_COMPLETE : ItemStatus.INIT,\n\n            // active processes\n            activeLoader: null,\n            activeProcessor: null,\n        };\n\n        // callback used when abort processing is called to link back to the resolve method\n        var abortProcessingRequestComplete = null;\n\n        /**\n         * Externally added item metadata\n         */\n        var metadata = {};\n\n        // item data\n        var setStatus = function setStatus(status) {\n            return (state.status = status);\n        };\n\n        // fire event unless the item has been archived\n        var fire = function fire(event) {\n            if (state.released || state.frozen) return;\n            for (\n                var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1;\n                _key < _len;\n                _key++\n            ) {\n                params[_key - 1] = arguments[_key];\n            }\n            api.fire.apply(api, [event].concat(params));\n        };\n\n        // file data\n        var getFileExtension = function getFileExtension() {\n            return getExtensionFromFilename(state.file.name);\n        };\n        var getFileType = function getFileType() {\n            return state.file.type;\n        };\n        var getFileSize = function getFileSize() {\n            return state.file.size;\n        };\n        var getFile = function getFile() {\n            return state.file;\n        };\n\n        //\n        // logic to load a file\n        //\n        var load = function load(source, loader, onload) {\n            // remember the original item source\n            state.source = source;\n\n            // source is known\n            api.fireSync('init');\n\n            // file stub is already there\n            if (state.file) {\n                api.fireSync('load-skip');\n                return;\n            }\n\n            // set a stub file object while loading the actual data\n            state.file = createFileStub(source);\n\n            // starts loading\n            loader.on('init', function() {\n                fire('load-init');\n            });\n\n            // we'eve received a size indication, let's update the stub\n            loader.on('meta', function(meta) {\n                // set size of file stub\n                state.file.size = meta.size;\n\n                // set name of file stub\n                state.file.filename = meta.filename;\n\n                // if has received source, we done\n                if (meta.source) {\n                    origin = FileOrigin.LIMBO;\n                    state.serverFileReference = meta.source;\n                    state.status = ItemStatus.PROCESSING_COMPLETE;\n                }\n\n                // size has been updated\n                fire('load-meta');\n            });\n\n            // the file is now loading we need to update the progress indicators\n            loader.on('progress', function(progress) {\n                setStatus(ItemStatus.LOADING);\n\n                fire('load-progress', progress);\n            });\n\n            // an error was thrown while loading the file, we need to switch to error state\n            loader.on('error', function(error) {\n                setStatus(ItemStatus.LOAD_ERROR);\n\n                fire('load-request-error', error);\n            });\n\n            // user or another process aborted the file load (cannot retry)\n            loader.on('abort', function() {\n                setStatus(ItemStatus.INIT);\n                fire('load-abort');\n            });\n\n            // done loading\n            loader.on('load', function(file) {\n                // as we've now loaded the file the loader is no longer required\n                state.activeLoader = null;\n\n                // called when file has loaded succesfully\n                var success = function success(result) {\n                    // set (possibly) transformed file\n                    state.file = isFile(result) ? result : state.file;\n\n                    // file received\n                    if (origin === FileOrigin.LIMBO && state.serverFileReference) {\n                        setStatus(ItemStatus.PROCESSING_COMPLETE);\n                    } else {\n                        setStatus(ItemStatus.IDLE);\n                    }\n\n                    fire('load');\n                };\n\n                var error = function error(result) {\n                    // set original file\n                    state.file = file;\n                    fire('load-meta');\n\n                    setStatus(ItemStatus.LOAD_ERROR);\n                    fire('load-file-error', result);\n                };\n\n                // if we already have a server file reference, we don't need to call the onload method\n                if (state.serverFileReference) {\n                    success(file);\n                    return;\n                }\n\n                // no server id, let's give this file the full treatment\n                onload(file, success, error);\n            });\n\n            // set loader source data\n            loader.setSource(source);\n\n            // set as active loader\n            state.activeLoader = loader;\n\n            // load the source data\n            loader.load();\n        };\n\n        var retryLoad = function retryLoad() {\n            if (!state.activeLoader) {\n                return;\n            }\n            state.activeLoader.load();\n        };\n\n        var abortLoad = function abortLoad() {\n            if (state.activeLoader) {\n                state.activeLoader.abort();\n                return;\n            }\n            setStatus(ItemStatus.INIT);\n            fire('load-abort');\n        };\n\n        //\n        // logic to process a file\n        //\n        var process = function process(processor, onprocess) {\n            // processing was aborted\n            if (state.processingAborted) {\n                state.processingAborted = false;\n                return;\n            }\n\n            // now processing\n            setStatus(ItemStatus.PROCESSING);\n\n            // reset abort callback\n            abortProcessingRequestComplete = null;\n\n            // if no file loaded we'll wait for the load event\n            if (!(state.file instanceof Blob)) {\n                api.on('load', function() {\n                    process(processor, onprocess);\n                });\n                return;\n            }\n\n            // setup processor\n            processor.on('load', function(serverFileReference) {\n                // need this id to be able to revert the upload\n                state.transferId = null;\n                state.serverFileReference = serverFileReference;\n            });\n\n            // register transfer id\n            processor.on('transfer', function(transferId) {\n                // need this id to be able to revert the upload\n                state.transferId = transferId;\n            });\n\n            processor.on('load-perceived', function(serverFileReference) {\n                // no longer required\n                state.activeProcessor = null;\n\n                // need this id to be able to rever the upload\n                state.transferId = null;\n                state.serverFileReference = serverFileReference;\n\n                setStatus(ItemStatus.PROCESSING_COMPLETE);\n                fire('process-complete', serverFileReference);\n            });\n\n            processor.on('start', function() {\n                fire('process-start');\n            });\n\n            processor.on('error', function(error) {\n                state.activeProcessor = null;\n                setStatus(ItemStatus.PROCESSING_ERROR);\n                fire('process-error', error);\n            });\n\n            processor.on('abort', function(serverFileReference) {\n                state.activeProcessor = null;\n\n                // if file was uploaded but processing was cancelled during perceived processor time store file reference\n                state.serverFileReference = serverFileReference;\n\n                setStatus(ItemStatus.IDLE);\n                fire('process-abort');\n\n                // has timeout so doesn't interfere with remove action\n                if (abortProcessingRequestComplete) {\n                    abortProcessingRequestComplete();\n                }\n            });\n\n            processor.on('progress', function(progress) {\n                fire('process-progress', progress);\n            });\n\n            // when successfully transformed\n            var success = function success(file) {\n                // if was archived in the mean time, don't process\n                if (state.archived) return;\n\n                // process file!\n                processor.process(file, Object.assign({}, metadata));\n            };\n\n            // something went wrong during transform phase\n            var error = console.error;\n\n            // start processing the file\n            onprocess(state.file, success, error);\n\n            // set as active processor\n            state.activeProcessor = processor;\n        };\n\n        var requestProcessing = function requestProcessing() {\n            state.processingAborted = false;\n            setStatus(ItemStatus.PROCESSING_QUEUED);\n        };\n\n        var abortProcessing = function abortProcessing() {\n            return new Promise(function(resolve) {\n                if (!state.activeProcessor) {\n                    state.processingAborted = true;\n\n                    setStatus(ItemStatus.IDLE);\n                    fire('process-abort');\n\n                    resolve();\n                    return;\n                }\n\n                abortProcessingRequestComplete = function abortProcessingRequestComplete() {\n                    resolve();\n                };\n\n                state.activeProcessor.abort();\n            });\n        };\n\n        //\n        // logic to revert a processed file\n        //\n        var revert = function revert(revertFileUpload, forceRevert) {\n            return new Promise(function(resolve, reject) {\n                // a completed upload will have a serverFileReference, a failed chunked upload where\n                // getting a serverId succeeded but >=0 chunks have been uploaded will have transferId set\n                var serverTransferId =\n                    state.serverFileReference !== null\n                        ? state.serverFileReference\n                        : state.transferId;\n\n                // cannot revert without a server id for this process\n                if (serverTransferId === null) {\n                    resolve();\n                    return;\n                }\n\n                // revert the upload (fire and forget)\n                revertFileUpload(\n                    serverTransferId,\n                    function() {\n                        // reset file server id and transfer id as now it's not available on the server\n                        state.serverFileReference = null;\n                        state.transferId = null;\n                        resolve();\n                    },\n                    function(error) {\n                        // don't set error state when reverting is optional, it will always resolve\n                        if (!forceRevert) {\n                            resolve();\n                            return;\n                        }\n\n                        // oh no errors\n                        setStatus(ItemStatus.PROCESSING_REVERT_ERROR);\n                        fire('process-revert-error');\n                        reject(error);\n                    }\n                );\n\n                // fire event\n                setStatus(ItemStatus.IDLE);\n                fire('process-revert');\n            });\n        };\n\n        // exposed methods\n        var _setMetadata = function setMetadata(key, value, silent) {\n            var keys = key.split('.');\n            var root = keys[0];\n            var last = keys.pop();\n            var data = metadata;\n            keys.forEach(function(key) {\n                return (data = data[key]);\n            });\n\n            // compare old value against new value, if they're the same, we're not updating\n            if (JSON.stringify(data[last]) === JSON.stringify(value)) return;\n\n            // update value\n            data[last] = value;\n\n            // fire update\n            fire('metadata-update', {\n                key: root,\n                value: metadata[root],\n                silent: silent,\n            });\n        };\n\n        var getMetadata = function getMetadata(key) {\n            return deepCloneObject(key ? metadata[key] : metadata);\n        };\n\n        var api = Object.assign(\n            {\n                id: {\n                    get: function get() {\n                        return id;\n                    },\n                },\n                origin: {\n                    get: function get() {\n                        return origin;\n                    },\n                    set: function set(value) {\n                        return (origin = value);\n                    },\n                },\n                serverId: {\n                    get: function get() {\n                        return state.serverFileReference;\n                    },\n                },\n                transferId: {\n                    get: function get() {\n                        return state.transferId;\n                    },\n                },\n                status: {\n                    get: function get() {\n                        return state.status;\n                    },\n                },\n                filename: {\n                    get: function get() {\n                        return state.file.name;\n                    },\n                },\n                filenameWithoutExtension: {\n                    get: function get() {\n                        return getFilenameWithoutExtension(state.file.name);\n                    },\n                },\n                fileExtension: { get: getFileExtension },\n                fileType: { get: getFileType },\n                fileSize: { get: getFileSize },\n                file: { get: getFile },\n                relativePath: {\n                    get: function get() {\n                        return state.file._relativePath;\n                    },\n                },\n\n                source: {\n                    get: function get() {\n                        return state.source;\n                    },\n                },\n\n                getMetadata: getMetadata,\n                setMetadata: function setMetadata(key, value, silent) {\n                    if (isObject(key)) {\n                        var data = key;\n                        Object.keys(data).forEach(function(key) {\n                            _setMetadata(key, data[key], value);\n                        });\n                        return key;\n                    }\n                    _setMetadata(key, value, silent);\n                    return value;\n                },\n\n                extend: function extend(name, handler) {\n                    return (itemAPI[name] = handler);\n                },\n\n                abortLoad: abortLoad,\n                retryLoad: retryLoad,\n                requestProcessing: requestProcessing,\n                abortProcessing: abortProcessing,\n\n                load: load,\n                process: process,\n                revert: revert,\n            },\n\n            on(),\n            {\n                freeze: function freeze() {\n                    return (state.frozen = true);\n                },\n\n                release: function release() {\n                    return (state.released = true);\n                },\n                released: {\n                    get: function get() {\n                        return state.released;\n                    },\n                },\n\n                archive: function archive() {\n                    return (state.archived = true);\n                },\n                archived: {\n                    get: function get() {\n                        return state.archived;\n                    },\n                },\n\n                // replace source and file object\n                setFile: function setFile(file) {\n                    return (state.file = file);\n                },\n            }\n        );\n\n        // create it here instead of returning it instantly so we can extend it later\n        var itemAPI = createObject(api);\n\n        return itemAPI;\n    };\n\n    var getItemIndexByQuery = function getItemIndexByQuery(items, query) {\n        // just return first index\n        if (isEmpty(query)) {\n            return 0;\n        }\n\n        // invalid queries\n        if (!isString(query)) {\n            return -1;\n        }\n\n        // return item by id (or -1 if not found)\n        return items.findIndex(function(item) {\n            return item.id === query;\n        });\n    };\n\n    var getItemById = function getItemById(items, itemId) {\n        var index = getItemIndexByQuery(items, itemId);\n        if (index < 0) {\n            return;\n        }\n        return items[index] || null;\n    };\n\n    var fetchBlob = function fetchBlob(url, load, error, progress, abort, headers) {\n        var request = sendRequest(null, url, {\n            method: 'GET',\n            responseType: 'blob',\n        });\n\n        request.onload = function(xhr) {\n            // get headers\n            var headers = xhr.getAllResponseHeaders();\n\n            // get filename\n            var filename = getFileInfoFromHeaders(headers).name || getFilenameFromURL(url);\n\n            // create response\n            load(\n                createResponse('load', xhr.status, getFileFromBlob(xhr.response, filename), headers)\n            );\n        };\n\n        request.onerror = function(xhr) {\n            error(createResponse('error', xhr.status, xhr.statusText, xhr.getAllResponseHeaders()));\n        };\n\n        request.onheaders = function(xhr) {\n            headers(createResponse('headers', xhr.status, null, xhr.getAllResponseHeaders()));\n        };\n\n        request.ontimeout = createTimeoutResponse(error);\n        request.onprogress = progress;\n        request.onabort = abort;\n\n        // should return request\n        return request;\n    };\n\n    var getDomainFromURL = function getDomainFromURL(url) {\n        if (url.indexOf('//') === 0) {\n            url = location.protocol + url;\n        }\n        return url\n            .toLowerCase()\n            .replace('blob:', '')\n            .replace(/([a-z])?:\\/\\//, '$1')\n            .split('/')[0];\n    };\n\n    var isExternalURL = function isExternalURL(url) {\n        return (\n            (url.indexOf(':') > -1 || url.indexOf('//') > -1) &&\n            getDomainFromURL(location.href) !== getDomainFromURL(url)\n        );\n    };\n\n    var dynamicLabel = function dynamicLabel(label) {\n        return function() {\n            return isFunction(label) ? label.apply(void 0, arguments) : label;\n        };\n    };\n\n    var isMockItem = function isMockItem(item) {\n        return !isFile(item.file);\n    };\n\n    var listUpdated = function listUpdated(dispatch, state) {\n        clearTimeout(state.listUpdateTimeout);\n        state.listUpdateTimeout = setTimeout(function() {\n            dispatch('DID_UPDATE_ITEMS', { items: getActiveItems(state.items) });\n        }, 0);\n    };\n\n    var optionalPromise = function optionalPromise(fn) {\n        for (\n            var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1;\n            _key < _len;\n            _key++\n        ) {\n            params[_key - 1] = arguments[_key];\n        }\n        return new Promise(function(resolve) {\n            if (!fn) {\n                return resolve(true);\n            }\n\n            var result = fn.apply(void 0, params);\n\n            if (result == null) {\n                return resolve(true);\n            }\n\n            if (typeof result === 'boolean') {\n                return resolve(result);\n            }\n\n            if (typeof result.then === 'function') {\n                result.then(resolve);\n            }\n        });\n    };\n\n    var sortItems = function sortItems(state, compare) {\n        state.items.sort(function(a, b) {\n            return compare(createItemAPI(a), createItemAPI(b));\n        });\n    };\n\n    // returns item based on state\n    var getItemByQueryFromState = function getItemByQueryFromState(state, itemHandler) {\n        return function() {\n            var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n            var query = _ref.query,\n                _ref$success = _ref.success,\n                success = _ref$success === void 0 ? function() {} : _ref$success,\n                _ref$failure = _ref.failure,\n                failure = _ref$failure === void 0 ? function() {} : _ref$failure,\n                options = _objectWithoutProperties(_ref, ['query', 'success', 'failure']);\n            var item = getItemByQuery(state.items, query);\n            if (!item) {\n                failure({\n                    error: createResponse('error', 0, 'Item not found'),\n                    file: null,\n                });\n\n                return;\n            }\n            itemHandler(item, success, failure, options || {});\n        };\n    };\n\n    var actions = function actions(dispatch, query, state) {\n        return {\n            /**\n             * Aborts all ongoing processes\n             */\n            ABORT_ALL: function ABORT_ALL() {\n                getActiveItems(state.items).forEach(function(item) {\n                    item.freeze();\n                    item.abortLoad();\n                    item.abortProcessing();\n                });\n            },\n\n            /**\n             * Sets initial files\n             */\n            DID_SET_FILES: function DID_SET_FILES(_ref2) {\n                var _ref2$value = _ref2.value,\n                    value = _ref2$value === void 0 ? [] : _ref2$value;\n                // map values to file objects\n                var files = value.map(function(file) {\n                    return {\n                        source: file.source ? file.source : file,\n                        options: file.options,\n                    };\n                });\n\n                // loop over files, if file is in list, leave it be, if not, remove\n                // test if items should be moved\n                var activeItems = getActiveItems(state.items);\n\n                activeItems.forEach(function(item) {\n                    // if item not is in new value, remove\n                    if (\n                        !files.find(function(file) {\n                            return file.source === item.source || file.source === item.file;\n                        })\n                    ) {\n                        dispatch('REMOVE_ITEM', { query: item, remove: false });\n                    }\n                });\n\n                // add new files\n                activeItems = getActiveItems(state.items);\n                files.forEach(function(file, index) {\n                    // if file is already in list\n                    if (\n                        activeItems.find(function(item) {\n                            return item.source === file.source || item.file === file.source;\n                        })\n                    )\n                        return;\n\n                    // not in list, add\n                    dispatch(\n                        'ADD_ITEM',\n                        Object.assign({}, file, {\n                            interactionMethod: InteractionMethod.NONE,\n                            index: index,\n                        })\n                    );\n                });\n            },\n\n            DID_UPDATE_ITEM_METADATA: function DID_UPDATE_ITEM_METADATA(_ref3) {\n                var id = _ref3.id,\n                    action = _ref3.action,\n                    change = _ref3.change;\n                // don't do anything\n                if (change.silent) return;\n\n                // if is called multiple times in close succession we combined all calls together to save resources\n                clearTimeout(state.itemUpdateTimeout);\n                state.itemUpdateTimeout = setTimeout(function() {\n                    var item = getItemById(state.items, id);\n\n                    // only revert and attempt to upload when we're uploading to a server\n                    if (!query('IS_ASYNC')) {\n                        // should we update the output data\n                        applyFilterChain('SHOULD_PREPARE_OUTPUT', false, {\n                            item: item,\n                            query: query,\n                            action: action,\n                            change: change,\n                        }).then(function(shouldPrepareOutput) {\n                            // plugins determined the output data should be prepared (or not), can be adjusted with beforePrepareOutput hook\n                            var beforePrepareFile = query('GET_BEFORE_PREPARE_FILE');\n                            if (beforePrepareFile)\n                                shouldPrepareOutput = beforePrepareFile(item, shouldPrepareOutput);\n\n                            if (!shouldPrepareOutput) return;\n\n                            dispatch(\n                                'REQUEST_PREPARE_OUTPUT',\n                                {\n                                    query: id,\n                                    item: item,\n                                    success: function success(file) {\n                                        dispatch('DID_PREPARE_OUTPUT', { id: id, file: file });\n                                    },\n                                },\n\n                                true\n                            );\n                        });\n\n                        return;\n                    }\n\n                    // if is local item we need to enable upload button so change can be propagated to server\n                    if (item.origin === FileOrigin.LOCAL) {\n                        dispatch('DID_LOAD_ITEM', {\n                            id: item.id,\n                            error: null,\n                            serverFileReference: item.source,\n                        });\n                    }\n\n                    // for async scenarios\n                    var upload = function upload() {\n                        // we push this forward a bit so the interface is updated correctly\n                        setTimeout(function() {\n                            dispatch('REQUEST_ITEM_PROCESSING', { query: id });\n                        }, 32);\n                    };\n\n                    var revert = function revert(doUpload) {\n                        item.revert(\n                            createRevertFunction(\n                                state.options.server.url,\n                                state.options.server.revert\n                            ),\n                            query('GET_FORCE_REVERT')\n                        )\n                            .then(doUpload ? upload : function() {})\n                            .catch(function() {});\n                    };\n\n                    var abort = function abort(doUpload) {\n                        item.abortProcessing().then(doUpload ? upload : function() {});\n                    };\n\n                    // if we should re-upload the file immediately\n                    if (item.status === ItemStatus.PROCESSING_COMPLETE) {\n                        return revert(state.options.instantUpload);\n                    }\n\n                    // if currently uploading, cancel upload\n                    if (item.status === ItemStatus.PROCESSING) {\n                        return abort(state.options.instantUpload);\n                    }\n\n                    if (state.options.instantUpload) {\n                        upload();\n                    }\n                }, 0);\n            },\n\n            MOVE_ITEM: function MOVE_ITEM(_ref4) {\n                var query = _ref4.query,\n                    index = _ref4.index;\n                var item = getItemByQuery(state.items, query);\n                if (!item) return;\n                var currentIndex = state.items.indexOf(item);\n                index = limit(index, 0, state.items.length - 1);\n                if (currentIndex === index) return;\n                state.items.splice(index, 0, state.items.splice(currentIndex, 1)[0]);\n            },\n\n            SORT: function SORT(_ref5) {\n                var compare = _ref5.compare;\n                sortItems(state, compare);\n                dispatch('DID_SORT_ITEMS', {\n                    items: query('GET_ACTIVE_ITEMS'),\n                });\n            },\n\n            ADD_ITEMS: function ADD_ITEMS(_ref6) {\n                var items = _ref6.items,\n                    index = _ref6.index,\n                    interactionMethod = _ref6.interactionMethod,\n                    _ref6$success = _ref6.success,\n                    success = _ref6$success === void 0 ? function() {} : _ref6$success,\n                    _ref6$failure = _ref6.failure,\n                    failure = _ref6$failure === void 0 ? function() {} : _ref6$failure;\n                var currentIndex = index;\n\n                if (index === -1 || typeof index === 'undefined') {\n                    var insertLocation = query('GET_ITEM_INSERT_LOCATION');\n                    var totalItems = query('GET_TOTAL_ITEMS');\n                    currentIndex = insertLocation === 'before' ? 0 : totalItems;\n                }\n\n                var ignoredFiles = query('GET_IGNORED_FILES');\n                var isValidFile = function isValidFile(source) {\n                    return isFile(source)\n                        ? !ignoredFiles.includes(source.name.toLowerCase())\n                        : !isEmpty(source);\n                };\n                var validItems = items.filter(isValidFile);\n\n                var promises = validItems.map(function(source) {\n                    return new Promise(function(resolve, reject) {\n                        dispatch('ADD_ITEM', {\n                            interactionMethod: interactionMethod,\n                            source: source.source || source,\n                            success: resolve,\n                            failure: reject,\n                            index: currentIndex++,\n                            options: source.options || {},\n                        });\n                    });\n                });\n\n                Promise.all(promises)\n                    .then(success)\n                    .catch(failure);\n            },\n\n            /**\n             * @param source\n             * @param index\n             * @param interactionMethod\n             */\n            ADD_ITEM: function ADD_ITEM(_ref7) {\n                var source = _ref7.source,\n                    _ref7$index = _ref7.index,\n                    index = _ref7$index === void 0 ? -1 : _ref7$index,\n                    interactionMethod = _ref7.interactionMethod,\n                    _ref7$success = _ref7.success,\n                    success = _ref7$success === void 0 ? function() {} : _ref7$success,\n                    _ref7$failure = _ref7.failure,\n                    failure = _ref7$failure === void 0 ? function() {} : _ref7$failure,\n                    _ref7$options = _ref7.options,\n                    options = _ref7$options === void 0 ? {} : _ref7$options;\n                // if no source supplied\n                if (isEmpty(source)) {\n                    failure({\n                        error: createResponse('error', 0, 'No source'),\n                        file: null,\n                    });\n\n                    return;\n                }\n\n                // filter out invalid file items, used to filter dropped directory contents\n                if (\n                    isFile(source) &&\n                    state.options.ignoredFiles.includes(source.name.toLowerCase())\n                ) {\n                    // fail silently\n                    return;\n                }\n\n                // test if there's still room in the list of files\n                if (!hasRoomForItem(state)) {\n                    // if multiple allowed, we can't replace\n                    // or if only a single item is allowed but we're not allowed to replace it we exit\n                    if (\n                        state.options.allowMultiple ||\n                        (!state.options.allowMultiple && !state.options.allowReplace)\n                    ) {\n                        var error = createResponse('warning', 0, 'Max files');\n\n                        dispatch('DID_THROW_MAX_FILES', {\n                            source: source,\n                            error: error,\n                        });\n\n                        failure({ error: error, file: null });\n\n                        return;\n                    }\n\n                    // let's replace the item\n                    // id of first item we're about to remove\n                    var _item = getActiveItems(state.items)[0];\n\n                    // if has been processed remove it from the server as well\n                    if (\n                        _item.status === ItemStatus.PROCESSING_COMPLETE ||\n                        _item.status === ItemStatus.PROCESSING_REVERT_ERROR\n                    ) {\n                        var forceRevert = query('GET_FORCE_REVERT');\n                        _item\n                            .revert(\n                                createRevertFunction(\n                                    state.options.server.url,\n                                    state.options.server.revert\n                                ),\n                                forceRevert\n                            )\n                            .then(function() {\n                                if (!forceRevert) return;\n\n                                // try to add now\n                                dispatch('ADD_ITEM', {\n                                    source: source,\n                                    index: index,\n                                    interactionMethod: interactionMethod,\n                                    success: success,\n                                    failure: failure,\n                                    options: options,\n                                });\n                            })\n                            .catch(function() {}); // no need to handle this catch state for now\n\n                        if (forceRevert) return;\n                    }\n\n                    // remove first item as it will be replaced by this item\n                    dispatch('REMOVE_ITEM', { query: _item.id });\n                }\n\n                // where did the file originate\n                var origin =\n                    options.type === 'local'\n                        ? FileOrigin.LOCAL\n                        : options.type === 'limbo'\n                        ? FileOrigin.LIMBO\n                        : FileOrigin.INPUT;\n\n                // create a new blank item\n                var item = createItem(\n                    // where did this file come from\n                    origin,\n\n                    // an input file never has a server file reference\n                    origin === FileOrigin.INPUT ? null : source,\n\n                    // file mock data, if defined\n                    options.file\n                );\n\n                // set initial meta data\n                Object.keys(options.metadata || {}).forEach(function(key) {\n                    item.setMetadata(key, options.metadata[key]);\n                });\n\n                // created the item, let plugins add methods\n                applyFilters('DID_CREATE_ITEM', item, { query: query, dispatch: dispatch });\n\n                // where to insert new items\n                var itemInsertLocation = query('GET_ITEM_INSERT_LOCATION');\n\n                // adjust index if is not allowed to pick location\n                if (!state.options.itemInsertLocationFreedom) {\n                    index = itemInsertLocation === 'before' ? -1 : state.items.length;\n                }\n\n                // add item to list\n                insertItem(state.items, item, index);\n\n                // sort items in list\n                if (isFunction(itemInsertLocation) && source) {\n                    sortItems(state, itemInsertLocation);\n                }\n\n                // get a quick reference to the item id\n                var id = item.id;\n\n                // observe item events\n                item.on('init', function() {\n                    dispatch('DID_INIT_ITEM', { id: id });\n                });\n\n                item.on('load-init', function() {\n                    dispatch('DID_START_ITEM_LOAD', { id: id });\n                });\n\n                item.on('load-meta', function() {\n                    dispatch('DID_UPDATE_ITEM_META', { id: id });\n                });\n\n                item.on('load-progress', function(progress) {\n                    dispatch('DID_UPDATE_ITEM_LOAD_PROGRESS', { id: id, progress: progress });\n                });\n\n                item.on('load-request-error', function(error) {\n                    var mainStatus = dynamicLabel(state.options.labelFileLoadError)(error);\n\n                    // is client error, no way to recover\n                    if (error.code >= 400 && error.code < 500) {\n                        dispatch('DID_THROW_ITEM_INVALID', {\n                            id: id,\n                            error: error,\n                            status: {\n                                main: mainStatus,\n                                sub: error.code + ' (' + error.body + ')',\n                            },\n                        });\n\n                        // reject the file so can be dealt with through API\n                        failure({ error: error, file: createItemAPI(item) });\n                        return;\n                    }\n\n                    // is possible server error, so might be possible to retry\n                    dispatch('DID_THROW_ITEM_LOAD_ERROR', {\n                        id: id,\n                        error: error,\n                        status: {\n                            main: mainStatus,\n                            sub: state.options.labelTapToRetry,\n                        },\n                    });\n                });\n\n                item.on('load-file-error', function(error) {\n                    dispatch('DID_THROW_ITEM_INVALID', {\n                        id: id,\n                        error: error.status,\n                        status: error.status,\n                    });\n\n                    failure({ error: error.status, file: createItemAPI(item) });\n                });\n\n                item.on('load-abort', function() {\n                    dispatch('REMOVE_ITEM', { query: id });\n                });\n\n                item.on('load-skip', function() {\n                    item.on('metadata-update', function(change) {\n                        if (!isFile(item.file)) return;\n                        dispatch('DID_UPDATE_ITEM_METADATA', { id: id, change: change });\n                    });\n\n                    dispatch('COMPLETE_LOAD_ITEM', {\n                        query: id,\n                        item: item,\n                        data: {\n                            source: source,\n                            success: success,\n                        },\n                    });\n                });\n\n                item.on('load', function() {\n                    var handleAdd = function handleAdd(shouldAdd) {\n                        // no should not add this file\n                        if (!shouldAdd) {\n                            dispatch('REMOVE_ITEM', {\n                                query: id,\n                            });\n\n                            return;\n                        }\n\n                        // now interested in metadata updates\n                        item.on('metadata-update', function(change) {\n                            dispatch('DID_UPDATE_ITEM_METADATA', { id: id, change: change });\n                        });\n\n                        // let plugins decide if the output data should be prepared at this point\n                        // means we'll do this and wait for idle state\n                        applyFilterChain('SHOULD_PREPARE_OUTPUT', false, {\n                            item: item,\n                            query: query,\n                        }).then(function(shouldPrepareOutput) {\n                            // plugins determined the output data should be prepared (or not), can be adjusted with beforePrepareOutput hook\n                            var beforePrepareFile = query('GET_BEFORE_PREPARE_FILE');\n                            if (beforePrepareFile)\n                                shouldPrepareOutput = beforePrepareFile(item, shouldPrepareOutput);\n\n                            var loadComplete = function loadComplete() {\n                                dispatch('COMPLETE_LOAD_ITEM', {\n                                    query: id,\n                                    item: item,\n                                    data: {\n                                        source: source,\n                                        success: success,\n                                    },\n                                });\n\n                                listUpdated(dispatch, state);\n                            };\n\n                            // exit\n                            if (shouldPrepareOutput) {\n                                // wait for idle state and then run PREPARE_OUTPUT\n                                dispatch(\n                                    'REQUEST_PREPARE_OUTPUT',\n                                    {\n                                        query: id,\n                                        item: item,\n                                        success: function success(file) {\n                                            dispatch('DID_PREPARE_OUTPUT', { id: id, file: file });\n                                            loadComplete();\n                                        },\n                                    },\n\n                                    true\n                                );\n\n                                return;\n                            }\n\n                            loadComplete();\n                        });\n                    };\n\n                    // item loaded, allow plugins to\n                    // - read data (quickly)\n                    // - add metadata\n                    applyFilterChain('DID_LOAD_ITEM', item, { query: query, dispatch: dispatch })\n                        .then(function() {\n                            optionalPromise(query('GET_BEFORE_ADD_FILE'), createItemAPI(item)).then(\n                                handleAdd\n                            );\n                        })\n                        .catch(function(e) {\n                            if (!e || !e.error || !e.status) return handleAdd(false);\n                            dispatch('DID_THROW_ITEM_INVALID', {\n                                id: id,\n                                error: e.error,\n                                status: e.status,\n                            });\n                        });\n                });\n\n                item.on('process-start', function() {\n                    dispatch('DID_START_ITEM_PROCESSING', { id: id });\n                });\n\n                item.on('process-progress', function(progress) {\n                    dispatch('DID_UPDATE_ITEM_PROCESS_PROGRESS', { id: id, progress: progress });\n                });\n\n                item.on('process-error', function(error) {\n                    dispatch('DID_THROW_ITEM_PROCESSING_ERROR', {\n                        id: id,\n                        error: error,\n                        status: {\n                            main: dynamicLabel(state.options.labelFileProcessingError)(error),\n                            sub: state.options.labelTapToRetry,\n                        },\n                    });\n                });\n\n                item.on('process-revert-error', function(error) {\n                    dispatch('DID_THROW_ITEM_PROCESSING_REVERT_ERROR', {\n                        id: id,\n                        error: error,\n                        status: {\n                            main: dynamicLabel(state.options.labelFileProcessingRevertError)(error),\n                            sub: state.options.labelTapToRetry,\n                        },\n                    });\n                });\n\n                item.on('process-complete', function(serverFileReference) {\n                    dispatch('DID_COMPLETE_ITEM_PROCESSING', {\n                        id: id,\n                        error: null,\n                        serverFileReference: serverFileReference,\n                    });\n\n                    dispatch('DID_DEFINE_VALUE', { id: id, value: serverFileReference });\n                });\n\n                item.on('process-abort', function() {\n                    dispatch('DID_ABORT_ITEM_PROCESSING', { id: id });\n                });\n\n                item.on('process-revert', function() {\n                    dispatch('DID_REVERT_ITEM_PROCESSING', { id: id });\n                    dispatch('DID_DEFINE_VALUE', { id: id, value: null });\n                });\n\n                // let view know the item has been inserted\n                dispatch('DID_ADD_ITEM', {\n                    id: id,\n                    index: index,\n                    interactionMethod: interactionMethod,\n                });\n\n                listUpdated(dispatch, state);\n\n                // start loading the source\n                var _ref8 = state.options.server || {},\n                    url = _ref8.url,\n                    load = _ref8.load,\n                    restore = _ref8.restore,\n                    fetch = _ref8.fetch;\n\n                item.load(\n                    source,\n\n                    // this creates a function that loads the file based on the type of file (string, base64, blob, file) and location of file (local, remote, limbo)\n                    createFileLoader(\n                        origin === FileOrigin.INPUT\n                            ? // input, if is remote, see if should use custom fetch, else use default fetchBlob\n                              isString(source) && isExternalURL(source)\n                                ? fetch\n                                    ? createFetchFunction(url, fetch)\n                                    : fetchBlob // remote url\n                                : fetchBlob // try to fetch url\n                            : // limbo or local\n                            origin === FileOrigin.LIMBO\n                            ? createFetchFunction(url, restore) // limbo\n                            : createFetchFunction(url, load) // local\n                    ),\n\n                    // called when the file is loaded so it can be piped through the filters\n                    function(file, success, error) {\n                        // let's process the file\n                        applyFilterChain('LOAD_FILE', file, { query: query })\n                            .then(success)\n                            .catch(error);\n                    }\n                );\n            },\n\n            REQUEST_PREPARE_OUTPUT: function REQUEST_PREPARE_OUTPUT(_ref9) {\n                var item = _ref9.item,\n                    success = _ref9.success,\n                    _ref9$failure = _ref9.failure,\n                    failure = _ref9$failure === void 0 ? function() {} : _ref9$failure;\n                // error response if item archived\n                var err = {\n                    error: createResponse('error', 0, 'Item not found'),\n                    file: null,\n                };\n\n                // don't handle archived items, an item could have been archived (load aborted) while waiting to be prepared\n                if (item.archived) return failure(err);\n\n                // allow plugins to alter the file data\n                applyFilterChain('PREPARE_OUTPUT', item.file, { query: query, item: item }).then(\n                    function(result) {\n                        applyFilterChain('COMPLETE_PREPARE_OUTPUT', result, {\n                            query: query,\n                            item: item,\n                        }).then(function(result) {\n                            // don't handle archived items, an item could have been archived (load aborted) while being prepared\n                            if (item.archived) return failure(err);\n\n                            // we done!\n                            success(result);\n                        });\n                    }\n                );\n            },\n\n            COMPLETE_LOAD_ITEM: function COMPLETE_LOAD_ITEM(_ref10) {\n                var item = _ref10.item,\n                    data = _ref10.data;\n                var success = data.success,\n                    source = data.source;\n\n                // sort items in list\n                var itemInsertLocation = query('GET_ITEM_INSERT_LOCATION');\n                if (isFunction(itemInsertLocation) && source) {\n                    sortItems(state, itemInsertLocation);\n                }\n\n                // let interface know the item has loaded\n                dispatch('DID_LOAD_ITEM', {\n                    id: item.id,\n                    error: null,\n                    serverFileReference: item.origin === FileOrigin.INPUT ? null : source,\n                });\n\n                // item has been successfully loaded and added to the\n                // list of items so can now be safely returned for use\n                success(createItemAPI(item));\n\n                // if this is a local server file we need to show a different state\n                if (item.origin === FileOrigin.LOCAL) {\n                    dispatch('DID_LOAD_LOCAL_ITEM', { id: item.id });\n                    return;\n                }\n\n                // if is a temp server file we prevent async upload call here (as the file is already on the server)\n                if (item.origin === FileOrigin.LIMBO) {\n                    dispatch('DID_COMPLETE_ITEM_PROCESSING', {\n                        id: item.id,\n                        error: null,\n                        serverFileReference: source,\n                    });\n\n                    dispatch('DID_DEFINE_VALUE', {\n                        id: item.id,\n                        value: item.serverId || source,\n                    });\n\n                    return;\n                }\n\n                // id we are allowed to upload the file immediately, lets do it\n                if (query('IS_ASYNC') && state.options.instantUpload) {\n                    dispatch('REQUEST_ITEM_PROCESSING', { query: item.id });\n                }\n            },\n\n            RETRY_ITEM_LOAD: getItemByQueryFromState(state, function(item) {\n                // try loading the source one more time\n                item.retryLoad();\n            }),\n\n            REQUEST_ITEM_PREPARE: getItemByQueryFromState(state, function(item, _success, failure) {\n                dispatch(\n                    'REQUEST_PREPARE_OUTPUT',\n                    {\n                        query: item.id,\n                        item: item,\n                        success: function success(file) {\n                            dispatch('DID_PREPARE_OUTPUT', { id: item.id, file: file });\n                            _success({\n                                file: item,\n                                output: file,\n                            });\n                        },\n                        failure: failure,\n                    },\n\n                    true\n                );\n            }),\n\n            REQUEST_ITEM_PROCESSING: getItemByQueryFromState(state, function(\n                item,\n                success,\n                failure\n            ) {\n                // cannot be queued (or is already queued)\n                var itemCanBeQueuedForProcessing =\n                    // waiting for something\n                    item.status === ItemStatus.IDLE ||\n                    // processing went wrong earlier\n                    item.status === ItemStatus.PROCESSING_ERROR;\n\n                // not ready to be processed\n                if (!itemCanBeQueuedForProcessing) {\n                    var processNow = function processNow() {\n                        return dispatch('REQUEST_ITEM_PROCESSING', {\n                            query: item,\n                            success: success,\n                            failure: failure,\n                        });\n                    };\n\n                    var process = function process() {\n                        return document.hidden ? processNow() : setTimeout(processNow, 32);\n                    };\n\n                    // if already done processing or tried to revert but didn't work, try again\n                    if (\n                        item.status === ItemStatus.PROCESSING_COMPLETE ||\n                        item.status === ItemStatus.PROCESSING_REVERT_ERROR\n                    ) {\n                        item.revert(\n                            createRevertFunction(\n                                state.options.server.url,\n                                state.options.server.revert\n                            ),\n                            query('GET_FORCE_REVERT')\n                        )\n                            .then(process)\n                            .catch(function() {}); // don't continue with processing if something went wrong\n                    } else if (item.status === ItemStatus.PROCESSING) {\n                        item.abortProcessing().then(process);\n                    }\n\n                    return;\n                }\n\n                // already queued for processing\n                if (item.status === ItemStatus.PROCESSING_QUEUED) return;\n\n                item.requestProcessing();\n\n                dispatch('DID_REQUEST_ITEM_PROCESSING', { id: item.id });\n\n                dispatch('PROCESS_ITEM', { query: item, success: success, failure: failure }, true);\n            }),\n\n            PROCESS_ITEM: getItemByQueryFromState(state, function(item, success, failure) {\n                var maxParallelUploads = query('GET_MAX_PARALLEL_UPLOADS');\n                var totalCurrentUploads = query('GET_ITEMS_BY_STATUS', ItemStatus.PROCESSING)\n                    .length;\n\n                // queue and wait till queue is freed up\n                if (totalCurrentUploads === maxParallelUploads) {\n                    // queue for later processing\n                    state.processingQueue.push({\n                        id: item.id,\n                        success: success,\n                        failure: failure,\n                    });\n\n                    // stop it!\n                    return;\n                }\n\n                // if was not queued or is already processing exit here\n                if (item.status === ItemStatus.PROCESSING) return;\n\n                var processNext = function processNext() {\n                    // process queueud items\n                    var queueEntry = state.processingQueue.shift();\n\n                    // no items left\n                    if (!queueEntry) return;\n\n                    // get item reference\n                    var id = queueEntry.id,\n                        success = queueEntry.success,\n                        failure = queueEntry.failure;\n                    var itemReference = getItemByQuery(state.items, id);\n\n                    // if item was archived while in queue, jump to next\n                    if (!itemReference || itemReference.archived) {\n                        processNext();\n                        return;\n                    }\n\n                    // process queued item\n                    dispatch(\n                        'PROCESS_ITEM',\n                        { query: id, success: success, failure: failure },\n                        true\n                    );\n                };\n\n                // we done function\n                item.onOnce('process-complete', function() {\n                    success(createItemAPI(item));\n                    processNext();\n\n                    // if origin is local, and we're instant uploading, trigger remove of original\n                    // as revert will remove file from list\n                    var server = state.options.server;\n                    var instantUpload = state.options.instantUpload;\n                    if (\n                        instantUpload &&\n                        item.origin === FileOrigin.LOCAL &&\n                        isFunction(server.remove)\n                    ) {\n                        var noop = function noop() {};\n                        item.origin = FileOrigin.LIMBO;\n                        state.options.server.remove(item.source, noop, noop);\n                    }\n\n                    // All items processed? No errors?\n                    var allItemsProcessed =\n                        query('GET_ITEMS_BY_STATUS', ItemStatus.PROCESSING_COMPLETE).length ===\n                        state.items.length;\n                    if (allItemsProcessed) {\n                        dispatch('DID_COMPLETE_ITEM_PROCESSING_ALL');\n                    }\n                });\n\n                // we error function\n                item.onOnce('process-error', function(error) {\n                    failure({ error: error, file: createItemAPI(item) });\n                    processNext();\n                });\n\n                // abort function\n                item.onOnce('process-abort', function() {\n                    processNext();\n                });\n\n                // start file processing\n                var options = state.options;\n                item.process(\n                    createFileProcessor(\n                        createProcessorFunction(\n                            options.server.url,\n                            options.server.process,\n                            options.name,\n                            {\n                                chunkTransferId: item.transferId,\n                                chunkServer: options.server.patch,\n                                chunkUploads: options.chunkUploads,\n                                chunkForce: options.chunkForce,\n                                chunkSize: options.chunkSize,\n                                chunkRetryDelays: options.chunkRetryDelays,\n                            }\n                        ),\n\n                        {\n                            allowMinimumUploadDuration: query('GET_ALLOW_MINIMUM_UPLOAD_DURATION'),\n                        }\n                    ),\n\n                    // called when the file is about to be processed so it can be piped through the transform filters\n                    function(file, success, error) {\n                        // allow plugins to alter the file data\n                        applyFilterChain('PREPARE_OUTPUT', file, { query: query, item: item })\n                            .then(function(file) {\n                                dispatch('DID_PREPARE_OUTPUT', { id: item.id, file: file });\n\n                                success(file);\n                            })\n                            .catch(error);\n                    }\n                );\n            }),\n\n            RETRY_ITEM_PROCESSING: getItemByQueryFromState(state, function(item) {\n                dispatch('REQUEST_ITEM_PROCESSING', { query: item });\n            }),\n\n            REQUEST_REMOVE_ITEM: getItemByQueryFromState(state, function(item) {\n                optionalPromise(query('GET_BEFORE_REMOVE_FILE'), createItemAPI(item)).then(function(\n                    shouldRemove\n                ) {\n                    if (!shouldRemove) {\n                        return;\n                    }\n                    dispatch('REMOVE_ITEM', { query: item });\n                });\n            }),\n\n            RELEASE_ITEM: getItemByQueryFromState(state, function(item) {\n                item.release();\n            }),\n\n            REMOVE_ITEM: getItemByQueryFromState(state, function(item, success, failure, options) {\n                var removeFromView = function removeFromView() {\n                    // get id reference\n                    var id = item.id;\n\n                    // archive the item, this does not remove it from the list\n                    getItemById(state.items, id).archive();\n\n                    // tell the view the item has been removed\n                    dispatch('DID_REMOVE_ITEM', { error: null, id: id, item: item });\n\n                    // now the list has been modified\n                    listUpdated(dispatch, state);\n\n                    // correctly removed\n                    success(createItemAPI(item));\n                };\n\n                // if this is a local file and the `server.remove` function has been configured,\n                // send source there so dev can remove file from server\n                var server = state.options.server;\n                if (\n                    item.origin === FileOrigin.LOCAL &&\n                    server &&\n                    isFunction(server.remove) &&\n                    options.remove !== false\n                ) {\n                    dispatch('DID_START_ITEM_REMOVE', { id: item.id });\n\n                    server.remove(\n                        item.source,\n                        function() {\n                            return removeFromView();\n                        },\n                        function(status) {\n                            dispatch('DID_THROW_ITEM_REMOVE_ERROR', {\n                                id: item.id,\n                                error: createResponse('error', 0, status, null),\n                                status: {\n                                    main: dynamicLabel(state.options.labelFileRemoveError)(status),\n                                    sub: state.options.labelTapToRetry,\n                                },\n                            });\n                        }\n                    );\n                } else {\n                    // if is requesting revert and can revert need to call revert handler (not calling request_ because that would also trigger beforeRemoveHook)\n                    if (\n                        (options.revert &&\n                            item.origin !== FileOrigin.LOCAL &&\n                            item.serverId !== null) ||\n                        // if chunked uploads are enabled and we're uploading in chunks for this specific file\n                        // or if the file isn't big enough for chunked uploads but chunkForce is set then call\n                        // revert before removing from the view...\n                        (state.options.chunkUploads && item.file.size > state.options.chunkSize) ||\n                        (state.options.chunkUploads && state.options.chunkForce)\n                    ) {\n                        item.revert(\n                            createRevertFunction(\n                                state.options.server.url,\n                                state.options.server.revert\n                            ),\n                            query('GET_FORCE_REVERT')\n                        );\n                    }\n\n                    // can now safely remove from view\n                    removeFromView();\n                }\n            }),\n\n            ABORT_ITEM_LOAD: getItemByQueryFromState(state, function(item) {\n                item.abortLoad();\n            }),\n\n            ABORT_ITEM_PROCESSING: getItemByQueryFromState(state, function(item) {\n                // test if is already processed\n                if (item.serverId) {\n                    dispatch('REVERT_ITEM_PROCESSING', { id: item.id });\n                    return;\n                }\n\n                // abort\n                item.abortProcessing().then(function() {\n                    var shouldRemove = state.options.instantUpload;\n                    if (shouldRemove) {\n                        dispatch('REMOVE_ITEM', { query: item.id });\n                    }\n                });\n            }),\n\n            REQUEST_REVERT_ITEM_PROCESSING: getItemByQueryFromState(state, function(item) {\n                // not instant uploading, revert immediately\n                if (!state.options.instantUpload) {\n                    dispatch('REVERT_ITEM_PROCESSING', { query: item });\n                    return;\n                }\n\n                // if we're instant uploading the file will also be removed if we revert,\n                // so if a before remove file hook is defined we need to run it now\n                var handleRevert = function handleRevert(shouldRevert) {\n                    if (!shouldRevert) return;\n                    dispatch('REVERT_ITEM_PROCESSING', { query: item });\n                };\n\n                var fn = query('GET_BEFORE_REMOVE_FILE');\n                if (!fn) {\n                    return handleRevert(true);\n                }\n\n                var requestRemoveResult = fn(createItemAPI(item));\n                if (requestRemoveResult == null) {\n                    // undefined or null\n                    return handleRevert(true);\n                }\n\n                if (typeof requestRemoveResult === 'boolean') {\n                    return handleRevert(requestRemoveResult);\n                }\n\n                if (typeof requestRemoveResult.then === 'function') {\n                    requestRemoveResult.then(handleRevert);\n                }\n            }),\n\n            REVERT_ITEM_PROCESSING: getItemByQueryFromState(state, function(item) {\n                item.revert(\n                    createRevertFunction(state.options.server.url, state.options.server.revert),\n                    query('GET_FORCE_REVERT')\n                )\n                    .then(function() {\n                        var shouldRemove = state.options.instantUpload || isMockItem(item);\n                        if (shouldRemove) {\n                            dispatch('REMOVE_ITEM', { query: item.id });\n                        }\n                    })\n                    .catch(function() {});\n            }),\n\n            SET_OPTIONS: function SET_OPTIONS(_ref11) {\n                var options = _ref11.options;\n                // get all keys passed\n                var optionKeys = Object.keys(options);\n\n                // get prioritized keyed to include (remove once not in options object)\n                var prioritizedOptionKeys = PrioritizedOptions.filter(function(key) {\n                    return optionKeys.includes(key);\n                });\n\n                // order the keys, prioritized first, then rest\n                var orderedOptionKeys = [].concat(\n                    _toConsumableArray(prioritizedOptionKeys),\n                    _toConsumableArray(\n                        Object.keys(options).filter(function(key) {\n                            return !prioritizedOptionKeys.includes(key);\n                        })\n                    )\n                );\n\n                // dispatch set event for each option\n                orderedOptionKeys.forEach(function(key) {\n                    dispatch('SET_' + fromCamels(key, '_').toUpperCase(), {\n                        value: options[key],\n                    });\n                });\n            },\n        };\n    };\n\n    var PrioritizedOptions = ['server'];\n\n    var formatFilename = function formatFilename(name) {\n        return name;\n    };\n\n    var createElement$1 = function createElement(tagName) {\n        return document.createElement(tagName);\n    };\n\n    var text = function text(node, value) {\n        var textNode = node.childNodes[0];\n        if (!textNode) {\n            textNode = document.createTextNode(value);\n            node.appendChild(textNode);\n        } else if (value !== textNode.nodeValue) {\n            textNode.nodeValue = value;\n        }\n    };\n\n    var polarToCartesian = function polarToCartesian(centerX, centerY, radius, angleInDegrees) {\n        var angleInRadians = (((angleInDegrees % 360) - 90) * Math.PI) / 180.0;\n        return {\n            x: centerX + radius * Math.cos(angleInRadians),\n            y: centerY + radius * Math.sin(angleInRadians),\n        };\n    };\n\n    var describeArc = function describeArc(x, y, radius, startAngle, endAngle, arcSweep) {\n        var start = polarToCartesian(x, y, radius, endAngle);\n        var end = polarToCartesian(x, y, radius, startAngle);\n        return ['M', start.x, start.y, 'A', radius, radius, 0, arcSweep, 0, end.x, end.y].join(' ');\n    };\n\n    var percentageArc = function percentageArc(x, y, radius, from, to) {\n        var arcSweep = 1;\n        if (to > from && to - from <= 0.5) {\n            arcSweep = 0;\n        }\n        if (from > to && from - to >= 0.5) {\n            arcSweep = 0;\n        }\n        return describeArc(\n            x,\n            y,\n            radius,\n            Math.min(0.9999, from) * 360,\n            Math.min(0.9999, to) * 360,\n            arcSweep\n        );\n    };\n\n    var create = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n        // start at 0\n        props.spin = false;\n        props.progress = 0;\n        props.opacity = 0;\n\n        // svg\n        var svg = createElement('svg');\n        root.ref.path = createElement('path', {\n            'stroke-width': 2,\n            'stroke-linecap': 'round',\n        });\n\n        svg.appendChild(root.ref.path);\n\n        root.ref.svg = svg;\n\n        root.appendChild(svg);\n    };\n\n    var write = function write(_ref2) {\n        var root = _ref2.root,\n            props = _ref2.props;\n        if (props.opacity === 0) {\n            return;\n        }\n\n        if (props.align) {\n            root.element.dataset.align = props.align;\n        }\n\n        // get width of stroke\n        var ringStrokeWidth = parseInt(attr(root.ref.path, 'stroke-width'), 10);\n\n        // calculate size of ring\n        var size = root.rect.element.width * 0.5;\n\n        // ring state\n        var ringFrom = 0;\n        var ringTo = 0;\n\n        // now in busy mode\n        if (props.spin) {\n            ringFrom = 0;\n            ringTo = 0.5;\n        } else {\n            ringFrom = 0;\n            ringTo = props.progress;\n        }\n\n        // get arc path\n        var coordinates = percentageArc(size, size, size - ringStrokeWidth, ringFrom, ringTo);\n\n        // update progress bar\n        attr(root.ref.path, 'd', coordinates);\n\n        // hide while contains 0 value\n        attr(root.ref.path, 'stroke-opacity', props.spin || props.progress > 0 ? 1 : 0);\n    };\n\n    var progressIndicator = createView({\n        tag: 'div',\n        name: 'progress-indicator',\n        ignoreRectUpdate: true,\n        ignoreRect: true,\n        create: create,\n        write: write,\n        mixins: {\n            apis: ['progress', 'spin', 'align'],\n            styles: ['opacity'],\n            animations: {\n                opacity: { type: 'tween', duration: 500 },\n                progress: {\n                    type: 'spring',\n                    stiffness: 0.95,\n                    damping: 0.65,\n                    mass: 10,\n                },\n            },\n        },\n    });\n\n    var create$1 = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n        root.element.innerHTML = (props.icon || '') + ('<span>' + props.label + '</span>');\n\n        props.isDisabled = false;\n    };\n\n    var write$1 = function write(_ref2) {\n        var root = _ref2.root,\n            props = _ref2.props;\n        var isDisabled = props.isDisabled;\n        var shouldDisable = root.query('GET_DISABLED') || props.opacity === 0;\n\n        if (shouldDisable && !isDisabled) {\n            props.isDisabled = true;\n            attr(root.element, 'disabled', 'disabled');\n        } else if (!shouldDisable && isDisabled) {\n            props.isDisabled = false;\n            root.element.removeAttribute('disabled');\n        }\n    };\n\n    var fileActionButton = createView({\n        tag: 'button',\n        attributes: {\n            type: 'button',\n        },\n\n        ignoreRect: true,\n        ignoreRectUpdate: true,\n        name: 'file-action-button',\n        mixins: {\n            apis: ['label'],\n            styles: ['translateX', 'translateY', 'scaleX', 'scaleY', 'opacity'],\n            animations: {\n                scaleX: 'spring',\n                scaleY: 'spring',\n                translateX: 'spring',\n                translateY: 'spring',\n                opacity: { type: 'tween', duration: 250 },\n            },\n\n            listeners: true,\n        },\n\n        create: create$1,\n        write: write$1,\n    });\n\n    var toNaturalFileSize = function toNaturalFileSize(bytes) {\n        var decimalSeparator =\n            arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '.';\n        var base = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;\n        var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n        var _options$labelBytes = options.labelBytes,\n            labelBytes = _options$labelBytes === void 0 ? 'bytes' : _options$labelBytes,\n            _options$labelKilobyt = options.labelKilobytes,\n            labelKilobytes = _options$labelKilobyt === void 0 ? 'KB' : _options$labelKilobyt,\n            _options$labelMegabyt = options.labelMegabytes,\n            labelMegabytes = _options$labelMegabyt === void 0 ? 'MB' : _options$labelMegabyt,\n            _options$labelGigabyt = options.labelGigabytes,\n            labelGigabytes = _options$labelGigabyt === void 0 ? 'GB' : _options$labelGigabyt;\n\n        // no negative byte sizes\n        bytes = Math.round(Math.abs(bytes));\n\n        var KB = base;\n        var MB = base * base;\n        var GB = base * base * base;\n\n        // just bytes\n        if (bytes < KB) {\n            return bytes + ' ' + labelBytes;\n        }\n\n        // kilobytes\n        if (bytes < MB) {\n            return Math.floor(bytes / KB) + ' ' + labelKilobytes;\n        }\n\n        // megabytes\n        if (bytes < GB) {\n            return removeDecimalsWhenZero(bytes / MB, 1, decimalSeparator) + ' ' + labelMegabytes;\n        }\n\n        // gigabytes\n        return removeDecimalsWhenZero(bytes / GB, 2, decimalSeparator) + ' ' + labelGigabytes;\n    };\n\n    var removeDecimalsWhenZero = function removeDecimalsWhenZero(value, decimalCount, separator) {\n        return value\n            .toFixed(decimalCount)\n            .split('.')\n            .filter(function(part) {\n                return part !== '0';\n            })\n            .join(separator);\n    };\n\n    var create$2 = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n        // filename\n        var fileName = createElement$1('span');\n        fileName.className = 'filepond--file-info-main';\n        // hide for screenreaders\n        // the file is contained in a fieldset with legend that contains the filename\n        // no need to read it twice\n        attr(fileName, 'aria-hidden', 'true');\n        root.appendChild(fileName);\n        root.ref.fileName = fileName;\n\n        // filesize\n        var fileSize = createElement$1('span');\n        fileSize.className = 'filepond--file-info-sub';\n        root.appendChild(fileSize);\n        root.ref.fileSize = fileSize;\n\n        // set initial values\n        text(fileSize, root.query('GET_LABEL_FILE_WAITING_FOR_SIZE'));\n        text(fileName, formatFilename(root.query('GET_ITEM_NAME', props.id)));\n    };\n\n    var updateFile = function updateFile(_ref2) {\n        var root = _ref2.root,\n            props = _ref2.props;\n        text(\n            root.ref.fileSize,\n            toNaturalFileSize(\n                root.query('GET_ITEM_SIZE', props.id),\n                '.',\n                root.query('GET_FILE_SIZE_BASE'),\n                root.query('GET_FILE_SIZE_LABELS', root.query)\n            )\n        );\n\n        text(root.ref.fileName, formatFilename(root.query('GET_ITEM_NAME', props.id)));\n    };\n\n    var updateFileSizeOnError = function updateFileSizeOnError(_ref3) {\n        var root = _ref3.root,\n            props = _ref3.props;\n        // if size is available don't fallback to unknown size message\n        if (isInt(root.query('GET_ITEM_SIZE', props.id))) {\n            updateFile({ root: root, props: props });\n            return;\n        }\n\n        text(root.ref.fileSize, root.query('GET_LABEL_FILE_SIZE_NOT_AVAILABLE'));\n    };\n\n    var fileInfo = createView({\n        name: 'file-info',\n        ignoreRect: true,\n        ignoreRectUpdate: true,\n        write: createRoute({\n            DID_LOAD_ITEM: updateFile,\n            DID_UPDATE_ITEM_META: updateFile,\n            DID_THROW_ITEM_LOAD_ERROR: updateFileSizeOnError,\n            DID_THROW_ITEM_INVALID: updateFileSizeOnError,\n        }),\n\n        didCreateView: function didCreateView(root) {\n            applyFilters('CREATE_VIEW', Object.assign({}, root, { view: root }));\n        },\n        create: create$2,\n        mixins: {\n            styles: ['translateX', 'translateY'],\n            animations: {\n                translateX: 'spring',\n                translateY: 'spring',\n            },\n        },\n    });\n\n    var toPercentage = function toPercentage(value) {\n        return Math.round(value * 100);\n    };\n\n    var create$3 = function create(_ref) {\n        var root = _ref.root;\n\n        // main status\n        var main = createElement$1('span');\n        main.className = 'filepond--file-status-main';\n        root.appendChild(main);\n        root.ref.main = main;\n\n        // sub status\n        var sub = createElement$1('span');\n        sub.className = 'filepond--file-status-sub';\n        root.appendChild(sub);\n        root.ref.sub = sub;\n\n        didSetItemLoadProgress({ root: root, action: { progress: null } });\n    };\n\n    var didSetItemLoadProgress = function didSetItemLoadProgress(_ref2) {\n        var root = _ref2.root,\n            action = _ref2.action;\n        var title =\n            action.progress === null\n                ? root.query('GET_LABEL_FILE_LOADING')\n                : root.query('GET_LABEL_FILE_LOADING') + ' ' + toPercentage(action.progress) + '%';\n\n        text(root.ref.main, title);\n        text(root.ref.sub, root.query('GET_LABEL_TAP_TO_CANCEL'));\n    };\n\n    var didSetItemProcessProgress = function didSetItemProcessProgress(_ref3) {\n        var root = _ref3.root,\n            action = _ref3.action;\n        var title =\n            action.progress === null\n                ? root.query('GET_LABEL_FILE_PROCESSING')\n                : root.query('GET_LABEL_FILE_PROCESSING') +\n                  ' ' +\n                  toPercentage(action.progress) +\n                  '%';\n\n        text(root.ref.main, title);\n        text(root.ref.sub, root.query('GET_LABEL_TAP_TO_CANCEL'));\n    };\n\n    var didRequestItemProcessing = function didRequestItemProcessing(_ref4) {\n        var root = _ref4.root;\n        text(root.ref.main, root.query('GET_LABEL_FILE_PROCESSING'));\n        text(root.ref.sub, root.query('GET_LABEL_TAP_TO_CANCEL'));\n    };\n\n    var didAbortItemProcessing = function didAbortItemProcessing(_ref5) {\n        var root = _ref5.root;\n        text(root.ref.main, root.query('GET_LABEL_FILE_PROCESSING_ABORTED'));\n        text(root.ref.sub, root.query('GET_LABEL_TAP_TO_RETRY'));\n    };\n\n    var didCompleteItemProcessing = function didCompleteItemProcessing(_ref6) {\n        var root = _ref6.root;\n        text(root.ref.main, root.query('GET_LABEL_FILE_PROCESSING_COMPLETE'));\n        text(root.ref.sub, root.query('GET_LABEL_TAP_TO_UNDO'));\n    };\n\n    var clear = function clear(_ref7) {\n        var root = _ref7.root;\n        text(root.ref.main, '');\n        text(root.ref.sub, '');\n    };\n\n    var error = function error(_ref8) {\n        var root = _ref8.root,\n            action = _ref8.action;\n        text(root.ref.main, action.status.main);\n        text(root.ref.sub, action.status.sub);\n    };\n\n    var fileStatus = createView({\n        name: 'file-status',\n        ignoreRect: true,\n        ignoreRectUpdate: true,\n        write: createRoute({\n            DID_LOAD_ITEM: clear,\n            DID_REVERT_ITEM_PROCESSING: clear,\n            DID_REQUEST_ITEM_PROCESSING: didRequestItemProcessing,\n            DID_ABORT_ITEM_PROCESSING: didAbortItemProcessing,\n            DID_COMPLETE_ITEM_PROCESSING: didCompleteItemProcessing,\n            DID_UPDATE_ITEM_PROCESS_PROGRESS: didSetItemProcessProgress,\n            DID_UPDATE_ITEM_LOAD_PROGRESS: didSetItemLoadProgress,\n            DID_THROW_ITEM_LOAD_ERROR: error,\n            DID_THROW_ITEM_INVALID: error,\n            DID_THROW_ITEM_PROCESSING_ERROR: error,\n            DID_THROW_ITEM_PROCESSING_REVERT_ERROR: error,\n            DID_THROW_ITEM_REMOVE_ERROR: error,\n        }),\n\n        didCreateView: function didCreateView(root) {\n            applyFilters('CREATE_VIEW', Object.assign({}, root, { view: root }));\n        },\n        create: create$3,\n        mixins: {\n            styles: ['translateX', 'translateY', 'opacity'],\n            animations: {\n                opacity: { type: 'tween', duration: 250 },\n                translateX: 'spring',\n                translateY: 'spring',\n            },\n        },\n    });\n\n    /**\n     * Button definitions for the file view\n     */\n\n    var Buttons = {\n        AbortItemLoad: {\n            label: 'GET_LABEL_BUTTON_ABORT_ITEM_LOAD',\n            action: 'ABORT_ITEM_LOAD',\n            className: 'filepond--action-abort-item-load',\n            align: 'LOAD_INDICATOR_POSITION', // right\n        },\n        RetryItemLoad: {\n            label: 'GET_LABEL_BUTTON_RETRY_ITEM_LOAD',\n            action: 'RETRY_ITEM_LOAD',\n            icon: 'GET_ICON_RETRY',\n            className: 'filepond--action-retry-item-load',\n            align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n        },\n        RemoveItem: {\n            label: 'GET_LABEL_BUTTON_REMOVE_ITEM',\n            action: 'REQUEST_REMOVE_ITEM',\n            icon: 'GET_ICON_REMOVE',\n            className: 'filepond--action-remove-item',\n            align: 'BUTTON_REMOVE_ITEM_POSITION', // left\n        },\n        ProcessItem: {\n            label: 'GET_LABEL_BUTTON_PROCESS_ITEM',\n            action: 'REQUEST_ITEM_PROCESSING',\n            icon: 'GET_ICON_PROCESS',\n            className: 'filepond--action-process-item',\n            align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n        },\n        AbortItemProcessing: {\n            label: 'GET_LABEL_BUTTON_ABORT_ITEM_PROCESSING',\n            action: 'ABORT_ITEM_PROCESSING',\n            className: 'filepond--action-abort-item-processing',\n            align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n        },\n        RetryItemProcessing: {\n            label: 'GET_LABEL_BUTTON_RETRY_ITEM_PROCESSING',\n            action: 'RETRY_ITEM_PROCESSING',\n            icon: 'GET_ICON_RETRY',\n            className: 'filepond--action-retry-item-processing',\n            align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n        },\n        RevertItemProcessing: {\n            label: 'GET_LABEL_BUTTON_UNDO_ITEM_PROCESSING',\n            action: 'REQUEST_REVERT_ITEM_PROCESSING',\n            icon: 'GET_ICON_UNDO',\n            className: 'filepond--action-revert-item-processing',\n            align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n        },\n    };\n\n    // make a list of buttons, we can then remove buttons from this list if they're disabled\n    var ButtonKeys = [];\n    forin(Buttons, function(key) {\n        ButtonKeys.push(key);\n    });\n\n    var calculateFileInfoOffset = function calculateFileInfoOffset(root) {\n        if (getRemoveIndicatorAligment(root) === 'right') return 0;\n        var buttonRect = root.ref.buttonRemoveItem.rect.element;\n        return buttonRect.hidden ? null : buttonRect.width + buttonRect.left;\n    };\n\n    var calculateButtonWidth = function calculateButtonWidth(root) {\n        var buttonRect = root.ref.buttonAbortItemLoad.rect.element;\n        return buttonRect.width;\n    };\n\n    // Force on full pixels so text stays crips\n    var calculateFileVerticalCenterOffset = function calculateFileVerticalCenterOffset(root) {\n        return Math.floor(root.ref.buttonRemoveItem.rect.element.height / 4);\n    };\n    var calculateFileHorizontalCenterOffset = function calculateFileHorizontalCenterOffset(root) {\n        return Math.floor(root.ref.buttonRemoveItem.rect.element.left / 2);\n    };\n\n    var getLoadIndicatorAlignment = function getLoadIndicatorAlignment(root) {\n        return root.query('GET_STYLE_LOAD_INDICATOR_POSITION');\n    };\n    var getProcessIndicatorAlignment = function getProcessIndicatorAlignment(root) {\n        return root.query('GET_STYLE_PROGRESS_INDICATOR_POSITION');\n    };\n    var getRemoveIndicatorAligment = function getRemoveIndicatorAligment(root) {\n        return root.query('GET_STYLE_BUTTON_REMOVE_ITEM_POSITION');\n    };\n\n    var DefaultStyle = {\n        buttonAbortItemLoad: { opacity: 0 },\n        buttonRetryItemLoad: { opacity: 0 },\n        buttonRemoveItem: { opacity: 0 },\n        buttonProcessItem: { opacity: 0 },\n        buttonAbortItemProcessing: { opacity: 0 },\n        buttonRetryItemProcessing: { opacity: 0 },\n        buttonRevertItemProcessing: { opacity: 0 },\n        loadProgressIndicator: { opacity: 0, align: getLoadIndicatorAlignment },\n        processProgressIndicator: { opacity: 0, align: getProcessIndicatorAlignment },\n        processingCompleteIndicator: { opacity: 0, scaleX: 0.75, scaleY: 0.75 },\n        info: { translateX: 0, translateY: 0, opacity: 0 },\n        status: { translateX: 0, translateY: 0, opacity: 0 },\n    };\n\n    var IdleStyle = {\n        buttonRemoveItem: { opacity: 1 },\n        buttonProcessItem: { opacity: 1 },\n        info: { translateX: calculateFileInfoOffset },\n        status: { translateX: calculateFileInfoOffset },\n    };\n\n    var ProcessingStyle = {\n        buttonAbortItemProcessing: { opacity: 1 },\n        processProgressIndicator: { opacity: 1 },\n        status: { opacity: 1 },\n    };\n\n    var StyleMap = {\n        DID_THROW_ITEM_INVALID: {\n            buttonRemoveItem: { opacity: 1 },\n            info: { translateX: calculateFileInfoOffset },\n            status: { translateX: calculateFileInfoOffset, opacity: 1 },\n        },\n\n        DID_START_ITEM_LOAD: {\n            buttonAbortItemLoad: { opacity: 1 },\n            loadProgressIndicator: { opacity: 1 },\n            status: { opacity: 1 },\n        },\n\n        DID_THROW_ITEM_LOAD_ERROR: {\n            buttonRetryItemLoad: { opacity: 1 },\n            buttonRemoveItem: { opacity: 1 },\n            info: { translateX: calculateFileInfoOffset },\n            status: { opacity: 1 },\n        },\n\n        DID_START_ITEM_REMOVE: {\n            processProgressIndicator: { opacity: 1, align: getRemoveIndicatorAligment },\n            info: { translateX: calculateFileInfoOffset },\n            status: { opacity: 0 },\n        },\n\n        DID_THROW_ITEM_REMOVE_ERROR: {\n            processProgressIndicator: { opacity: 0, align: getRemoveIndicatorAligment },\n            buttonRemoveItem: { opacity: 1 },\n            info: { translateX: calculateFileInfoOffset },\n            status: { opacity: 1, translateX: calculateFileInfoOffset },\n        },\n\n        DID_LOAD_ITEM: IdleStyle,\n        DID_LOAD_LOCAL_ITEM: {\n            buttonRemoveItem: { opacity: 1 },\n            info: { translateX: calculateFileInfoOffset },\n            status: { translateX: calculateFileInfoOffset },\n        },\n\n        DID_START_ITEM_PROCESSING: ProcessingStyle,\n        DID_REQUEST_ITEM_PROCESSING: ProcessingStyle,\n        DID_UPDATE_ITEM_PROCESS_PROGRESS: ProcessingStyle,\n        DID_COMPLETE_ITEM_PROCESSING: {\n            buttonRevertItemProcessing: { opacity: 1 },\n            info: { opacity: 1 },\n            status: { opacity: 1 },\n        },\n\n        DID_THROW_ITEM_PROCESSING_ERROR: {\n            buttonRemoveItem: { opacity: 1 },\n            buttonRetryItemProcessing: { opacity: 1 },\n            status: { opacity: 1 },\n            info: { translateX: calculateFileInfoOffset },\n        },\n\n        DID_THROW_ITEM_PROCESSING_REVERT_ERROR: {\n            buttonRevertItemProcessing: { opacity: 1 },\n            status: { opacity: 1 },\n            info: { opacity: 1 },\n        },\n\n        DID_ABORT_ITEM_PROCESSING: {\n            buttonRemoveItem: { opacity: 1 },\n            buttonProcessItem: { opacity: 1 },\n            info: { translateX: calculateFileInfoOffset },\n            status: { opacity: 1 },\n        },\n\n        DID_REVERT_ITEM_PROCESSING: IdleStyle,\n    };\n\n    // complete indicator view\n    var processingCompleteIndicatorView = createView({\n        create: function create(_ref) {\n            var root = _ref.root;\n            root.element.innerHTML = root.query('GET_ICON_DONE');\n        },\n        name: 'processing-complete-indicator',\n        ignoreRect: true,\n        mixins: {\n            styles: ['scaleX', 'scaleY', 'opacity'],\n            animations: {\n                scaleX: 'spring',\n                scaleY: 'spring',\n                opacity: { type: 'tween', duration: 250 },\n            },\n        },\n    });\n\n    /**\n     * Creates the file view\n     */\n    var create$4 = function create(_ref2) {\n        var root = _ref2.root,\n            props = _ref2.props;\n        // copy Buttons object\n        var LocalButtons = Object.keys(Buttons).reduce(function(prev, curr) {\n            prev[curr] = Object.assign({}, Buttons[curr]);\n            return prev;\n        }, {});\n        var id = props.id;\n\n        // allow reverting upload\n        var allowRevert = root.query('GET_ALLOW_REVERT');\n\n        // allow remove file\n        var allowRemove = root.query('GET_ALLOW_REMOVE');\n\n        // allow processing upload\n        var allowProcess = root.query('GET_ALLOW_PROCESS');\n\n        // is instant uploading, need this to determine the icon of the undo button\n        var instantUpload = root.query('GET_INSTANT_UPLOAD');\n\n        // is async set up\n        var isAsync = root.query('IS_ASYNC');\n\n        // should align remove item buttons\n        var alignRemoveItemButton = root.query('GET_STYLE_BUTTON_REMOVE_ITEM_ALIGN');\n\n        // enabled buttons array\n        var buttonFilter;\n        if (isAsync) {\n            if (allowProcess && !allowRevert) {\n                // only remove revert button\n                buttonFilter = function buttonFilter(key) {\n                    return !/RevertItemProcessing/.test(key);\n                };\n            } else if (!allowProcess && allowRevert) {\n                // only remove process button\n                buttonFilter = function buttonFilter(key) {\n                    return !/ProcessItem|RetryItemProcessing|AbortItemProcessing/.test(key);\n                };\n            } else if (!allowProcess && !allowRevert) {\n                // remove all process buttons\n                buttonFilter = function buttonFilter(key) {\n                    return !/Process/.test(key);\n                };\n            }\n        } else {\n            // no process controls available\n            buttonFilter = function buttonFilter(key) {\n                return !/Process/.test(key);\n            };\n        }\n\n        var enabledButtons = buttonFilter ? ButtonKeys.filter(buttonFilter) : ButtonKeys.concat();\n\n        // update icon and label for revert button when instant uploading\n        if (instantUpload && allowRevert) {\n            LocalButtons['RevertItemProcessing'].label = 'GET_LABEL_BUTTON_REMOVE_ITEM';\n            LocalButtons['RevertItemProcessing'].icon = 'GET_ICON_REMOVE';\n        }\n\n        // remove last button (revert) if not allowed\n        if (isAsync && !allowRevert) {\n            var map = StyleMap['DID_COMPLETE_ITEM_PROCESSING'];\n            map.info.translateX = calculateFileHorizontalCenterOffset;\n            map.info.translateY = calculateFileVerticalCenterOffset;\n            map.status.translateY = calculateFileVerticalCenterOffset;\n            map.processingCompleteIndicator = { opacity: 1, scaleX: 1, scaleY: 1 };\n        }\n\n        // should align center\n        if (isAsync && !allowProcess) {\n            [\n                'DID_START_ITEM_PROCESSING',\n                'DID_REQUEST_ITEM_PROCESSING',\n                'DID_UPDATE_ITEM_PROCESS_PROGRESS',\n                'DID_THROW_ITEM_PROCESSING_ERROR',\n            ].forEach(function(key) {\n                StyleMap[key].status.translateY = calculateFileVerticalCenterOffset;\n            });\n            StyleMap['DID_THROW_ITEM_PROCESSING_ERROR'].status.translateX = calculateButtonWidth;\n        }\n\n        // move remove button to right\n        if (alignRemoveItemButton && allowRevert) {\n            LocalButtons['RevertItemProcessing'].align = 'BUTTON_REMOVE_ITEM_POSITION';\n            var _map = StyleMap['DID_COMPLETE_ITEM_PROCESSING'];\n            _map.info.translateX = calculateFileInfoOffset;\n            _map.status.translateY = calculateFileVerticalCenterOffset;\n            _map.processingCompleteIndicator = { opacity: 1, scaleX: 1, scaleY: 1 };\n        }\n\n        // show/hide RemoveItem button\n        if (!allowRemove) {\n            LocalButtons['RemoveItem'].disabled = true;\n        }\n\n        // create the button views\n        forin(LocalButtons, function(key, definition) {\n            // create button\n            var buttonView = root.createChildView(fileActionButton, {\n                label: root.query(definition.label),\n                icon: root.query(definition.icon),\n                opacity: 0,\n            });\n\n            // should be appended?\n            if (enabledButtons.includes(key)) {\n                root.appendChildView(buttonView);\n            }\n\n            // toggle\n            if (definition.disabled) {\n                buttonView.element.setAttribute('disabled', 'disabled');\n                buttonView.element.setAttribute('hidden', 'hidden');\n            }\n\n            // add position attribute\n            buttonView.element.dataset.align = root.query('GET_STYLE_' + definition.align);\n\n            // add class\n            buttonView.element.classList.add(definition.className);\n\n            // handle interactions\n            buttonView.on('click', function(e) {\n                e.stopPropagation();\n                if (definition.disabled) return;\n                root.dispatch(definition.action, { query: id });\n            });\n\n            // set reference\n            root.ref['button' + key] = buttonView;\n        });\n\n        // checkmark\n        root.ref.processingCompleteIndicator = root.appendChildView(\n            root.createChildView(processingCompleteIndicatorView)\n        );\n\n        root.ref.processingCompleteIndicator.element.dataset.align = root.query(\n            'GET_STYLE_BUTTON_PROCESS_ITEM_POSITION'\n        );\n\n        // create file info view\n        root.ref.info = root.appendChildView(root.createChildView(fileInfo, { id: id }));\n\n        // create file status view\n        root.ref.status = root.appendChildView(root.createChildView(fileStatus, { id: id }));\n\n        // add progress indicators\n        var loadIndicatorView = root.appendChildView(\n            root.createChildView(progressIndicator, {\n                opacity: 0,\n                align: root.query('GET_STYLE_LOAD_INDICATOR_POSITION'),\n            })\n        );\n\n        loadIndicatorView.element.classList.add('filepond--load-indicator');\n        root.ref.loadProgressIndicator = loadIndicatorView;\n\n        var progressIndicatorView = root.appendChildView(\n            root.createChildView(progressIndicator, {\n                opacity: 0,\n                align: root.query('GET_STYLE_PROGRESS_INDICATOR_POSITION'),\n            })\n        );\n\n        progressIndicatorView.element.classList.add('filepond--process-indicator');\n        root.ref.processProgressIndicator = progressIndicatorView;\n\n        // current active styles\n        root.ref.activeStyles = [];\n    };\n\n    var write$2 = function write(_ref3) {\n        var root = _ref3.root,\n            actions = _ref3.actions,\n            props = _ref3.props;\n        // route actions\n        route({ root: root, actions: actions, props: props });\n\n        // select last state change action\n        var action = actions\n            .concat()\n            .filter(function(action) {\n                return /^DID_/.test(action.type);\n            })\n            .reverse()\n            .find(function(action) {\n                return StyleMap[action.type];\n            });\n\n        // a new action happened, let's get the matching styles\n        if (action) {\n            // define new active styles\n            root.ref.activeStyles = [];\n\n            var stylesToApply = StyleMap[action.type];\n            forin(DefaultStyle, function(name, defaultStyles) {\n                // get reference to control\n                var control = root.ref[name];\n\n                // loop over all styles for this control\n                forin(defaultStyles, function(key, defaultValue) {\n                    var value =\n                        stylesToApply[name] && typeof stylesToApply[name][key] !== 'undefined'\n                            ? stylesToApply[name][key]\n                            : defaultValue;\n                    root.ref.activeStyles.push({ control: control, key: key, value: value });\n                });\n            });\n        }\n\n        // apply active styles to element\n        root.ref.activeStyles.forEach(function(_ref4) {\n            var control = _ref4.control,\n                key = _ref4.key,\n                value = _ref4.value;\n            control[key] = typeof value === 'function' ? value(root) : value;\n        });\n    };\n\n    var route = createRoute({\n        DID_SET_LABEL_BUTTON_ABORT_ITEM_PROCESSING: function DID_SET_LABEL_BUTTON_ABORT_ITEM_PROCESSING(\n            _ref5\n        ) {\n            var root = _ref5.root,\n                action = _ref5.action;\n            root.ref.buttonAbortItemProcessing.label = action.value;\n        },\n        DID_SET_LABEL_BUTTON_ABORT_ITEM_LOAD: function DID_SET_LABEL_BUTTON_ABORT_ITEM_LOAD(_ref6) {\n            var root = _ref6.root,\n                action = _ref6.action;\n            root.ref.buttonAbortItemLoad.label = action.value;\n        },\n        DID_SET_LABEL_BUTTON_ABORT_ITEM_REMOVAL: function DID_SET_LABEL_BUTTON_ABORT_ITEM_REMOVAL(\n            _ref7\n        ) {\n            var root = _ref7.root,\n                action = _ref7.action;\n            root.ref.buttonAbortItemRemoval.label = action.value;\n        },\n        DID_REQUEST_ITEM_PROCESSING: function DID_REQUEST_ITEM_PROCESSING(_ref8) {\n            var root = _ref8.root;\n            root.ref.processProgressIndicator.spin = true;\n            root.ref.processProgressIndicator.progress = 0;\n        },\n        DID_START_ITEM_LOAD: function DID_START_ITEM_LOAD(_ref9) {\n            var root = _ref9.root;\n            root.ref.loadProgressIndicator.spin = true;\n            root.ref.loadProgressIndicator.progress = 0;\n        },\n        DID_START_ITEM_REMOVE: function DID_START_ITEM_REMOVE(_ref10) {\n            var root = _ref10.root;\n            root.ref.processProgressIndicator.spin = true;\n            root.ref.processProgressIndicator.progress = 0;\n        },\n        DID_UPDATE_ITEM_LOAD_PROGRESS: function DID_UPDATE_ITEM_LOAD_PROGRESS(_ref11) {\n            var root = _ref11.root,\n                action = _ref11.action;\n            root.ref.loadProgressIndicator.spin = false;\n            root.ref.loadProgressIndicator.progress = action.progress;\n        },\n        DID_UPDATE_ITEM_PROCESS_PROGRESS: function DID_UPDATE_ITEM_PROCESS_PROGRESS(_ref12) {\n            var root = _ref12.root,\n                action = _ref12.action;\n            root.ref.processProgressIndicator.spin = false;\n            root.ref.processProgressIndicator.progress = action.progress;\n        },\n    });\n\n    var file = createView({\n        create: create$4,\n        write: write$2,\n        didCreateView: function didCreateView(root) {\n            applyFilters('CREATE_VIEW', Object.assign({}, root, { view: root }));\n        },\n        name: 'file',\n    });\n\n    /**\n     * Creates the file view\n     */\n    var create$5 = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n\n        // filename\n        root.ref.fileName = createElement$1('legend');\n        root.appendChild(root.ref.fileName);\n\n        // file appended\n        root.ref.file = root.appendChildView(root.createChildView(file, { id: props.id }));\n\n        // data has moved to data.js\n        root.ref.data = false;\n    };\n\n    /**\n     * Data storage\n     */\n    var didLoadItem = function didLoadItem(_ref2) {\n        var root = _ref2.root,\n            props = _ref2.props;\n        // updates the legend of the fieldset so screenreaders can better group buttons\n        text(root.ref.fileName, formatFilename(root.query('GET_ITEM_NAME', props.id)));\n    };\n\n    var fileWrapper = createView({\n        create: create$5,\n        ignoreRect: true,\n        write: createRoute({\n            DID_LOAD_ITEM: didLoadItem,\n        }),\n\n        didCreateView: function didCreateView(root) {\n            applyFilters('CREATE_VIEW', Object.assign({}, root, { view: root }));\n        },\n        tag: 'fieldset',\n        name: 'file-wrapper',\n    });\n\n    var PANEL_SPRING_PROPS = { type: 'spring', damping: 0.6, mass: 7 };\n\n    var create$6 = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n        [\n            {\n                name: 'top',\n            },\n\n            {\n                name: 'center',\n                props: {\n                    translateY: null,\n                    scaleY: null,\n                },\n\n                mixins: {\n                    animations: {\n                        scaleY: PANEL_SPRING_PROPS,\n                    },\n\n                    styles: ['translateY', 'scaleY'],\n                },\n            },\n\n            {\n                name: 'bottom',\n                props: {\n                    translateY: null,\n                },\n\n                mixins: {\n                    animations: {\n                        translateY: PANEL_SPRING_PROPS,\n                    },\n\n                    styles: ['translateY'],\n                },\n            },\n        ].forEach(function(section) {\n            createSection(root, section, props.name);\n        });\n\n        root.element.classList.add('filepond--' + props.name);\n\n        root.ref.scalable = null;\n    };\n\n    var createSection = function createSection(root, section, className) {\n        var viewConstructor = createView({\n            name: 'panel-' + section.name + ' filepond--' + className,\n            mixins: section.mixins,\n            ignoreRectUpdate: true,\n        });\n\n        var view = root.createChildView(viewConstructor, section.props);\n\n        root.ref[section.name] = root.appendChildView(view);\n    };\n\n    var write$3 = function write(_ref2) {\n        var root = _ref2.root,\n            props = _ref2.props;\n\n        // update scalable state\n        if (root.ref.scalable === null || props.scalable !== root.ref.scalable) {\n            root.ref.scalable = isBoolean(props.scalable) ? props.scalable : true;\n            root.element.dataset.scalable = root.ref.scalable;\n        }\n\n        // no height, can't set\n        if (!props.height) return;\n\n        // get child rects\n        var topRect = root.ref.top.rect.element;\n        var bottomRect = root.ref.bottom.rect.element;\n\n        // make sure height never is smaller than bottom and top seciton heights combined (will probably never happen, but who knows)\n        var height = Math.max(topRect.height + bottomRect.height, props.height);\n\n        // offset center part\n        root.ref.center.translateY = topRect.height;\n\n        // scale center part\n        // use math ceil to prevent transparent lines because of rounding errors\n        root.ref.center.scaleY = (height - topRect.height - bottomRect.height) / 100;\n\n        // offset bottom part\n        root.ref.bottom.translateY = height - bottomRect.height;\n    };\n\n    var panel = createView({\n        name: 'panel',\n        read: function read(_ref3) {\n            var root = _ref3.root,\n                props = _ref3.props;\n            return (props.heightCurrent = root.ref.bottom.translateY);\n        },\n        write: write$3,\n        create: create$6,\n        ignoreRect: true,\n        mixins: {\n            apis: ['height', 'heightCurrent', 'scalable'],\n        },\n    });\n\n    var createDragHelper = function createDragHelper(items) {\n        var itemIds = items.map(function(item) {\n            return item.id;\n        });\n        var prevIndex = undefined;\n        return {\n            setIndex: function setIndex(index) {\n                prevIndex = index;\n            },\n            getIndex: function getIndex() {\n                return prevIndex;\n            },\n            getItemIndex: function getItemIndex(item) {\n                return itemIds.indexOf(item.id);\n            },\n        };\n    };\n\n    var ITEM_TRANSLATE_SPRING = {\n        type: 'spring',\n        stiffness: 0.75,\n        damping: 0.45,\n        mass: 10,\n    };\n\n    var ITEM_SCALE_SPRING = 'spring';\n\n    var StateMap = {\n        DID_START_ITEM_LOAD: 'busy',\n        DID_UPDATE_ITEM_LOAD_PROGRESS: 'loading',\n        DID_THROW_ITEM_INVALID: 'load-invalid',\n        DID_THROW_ITEM_LOAD_ERROR: 'load-error',\n        DID_LOAD_ITEM: 'idle',\n        DID_THROW_ITEM_REMOVE_ERROR: 'remove-error',\n        DID_START_ITEM_REMOVE: 'busy',\n        DID_START_ITEM_PROCESSING: 'busy processing',\n        DID_REQUEST_ITEM_PROCESSING: 'busy processing',\n        DID_UPDATE_ITEM_PROCESS_PROGRESS: 'processing',\n        DID_COMPLETE_ITEM_PROCESSING: 'processing-complete',\n        DID_THROW_ITEM_PROCESSING_ERROR: 'processing-error',\n        DID_THROW_ITEM_PROCESSING_REVERT_ERROR: 'processing-revert-error',\n        DID_ABORT_ITEM_PROCESSING: 'cancelled',\n        DID_REVERT_ITEM_PROCESSING: 'idle',\n    };\n\n    /**\n     * Creates the file view\n     */\n    var create$7 = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n        // select\n        root.ref.handleClick = function(e) {\n            return root.dispatch('DID_ACTIVATE_ITEM', { id: props.id });\n        };\n\n        // set id\n        root.element.id = 'filepond--item-' + props.id;\n        root.element.addEventListener('click', root.ref.handleClick);\n\n        // file view\n        root.ref.container = root.appendChildView(\n            root.createChildView(fileWrapper, { id: props.id })\n        );\n\n        // file panel\n        root.ref.panel = root.appendChildView(root.createChildView(panel, { name: 'item-panel' }));\n\n        // default start height\n        root.ref.panel.height = null;\n\n        // by default not marked for removal\n        props.markedForRemoval = false;\n\n        // if not allowed to reorder file items, exit here\n        if (!root.query('GET_ALLOW_REORDER')) return;\n\n        // set to idle so shows grab cursor\n        root.element.dataset.dragState = 'idle';\n\n        var grab = function grab(e) {\n            if (!e.isPrimary) return;\n\n            var removedActivateListener = false;\n\n            var origin = {\n                x: e.pageX,\n                y: e.pageY,\n            };\n\n            props.dragOrigin = {\n                x: root.translateX,\n                y: root.translateY,\n            };\n\n            props.dragCenter = {\n                x: e.offsetX,\n                y: e.offsetY,\n            };\n\n            var dragState = createDragHelper(root.query('GET_ACTIVE_ITEMS'));\n\n            root.dispatch('DID_GRAB_ITEM', { id: props.id, dragState: dragState });\n\n            var drag = function drag(e) {\n                if (!e.isPrimary) return;\n\n                e.stopPropagation();\n                e.preventDefault();\n\n                props.dragOffset = {\n                    x: e.pageX - origin.x,\n                    y: e.pageY - origin.y,\n                };\n\n                // if dragged stop listening to clicks, will re-add when done dragging\n                var dist =\n                    props.dragOffset.x * props.dragOffset.x +\n                    props.dragOffset.y * props.dragOffset.y;\n                if (dist > 16 && !removedActivateListener) {\n                    removedActivateListener = true;\n                    root.element.removeEventListener('click', root.ref.handleClick);\n                }\n\n                root.dispatch('DID_DRAG_ITEM', { id: props.id, dragState: dragState });\n            };\n\n            var drop = function drop(e) {\n                if (!e.isPrimary) return;\n\n                props.dragOffset = {\n                    x: e.pageX - origin.x,\n                    y: e.pageY - origin.y,\n                };\n\n                reset();\n            };\n\n            var cancel = function cancel() {\n                reset();\n            };\n\n            var reset = function reset() {\n                document.removeEventListener('pointercancel', cancel);\n                document.removeEventListener('pointermove', drag);\n                document.removeEventListener('pointerup', drop);\n\n                root.dispatch('DID_DROP_ITEM', { id: props.id, dragState: dragState });\n\n                // start listening to clicks again\n                if (removedActivateListener) {\n                    setTimeout(function() {\n                        return root.element.addEventListener('click', root.ref.handleClick);\n                    }, 0);\n                }\n            };\n\n            document.addEventListener('pointercancel', cancel);\n            document.addEventListener('pointermove', drag);\n            document.addEventListener('pointerup', drop);\n        };\n\n        root.element.addEventListener('pointerdown', grab);\n    };\n\n    var route$1 = createRoute({\n        DID_UPDATE_PANEL_HEIGHT: function DID_UPDATE_PANEL_HEIGHT(_ref2) {\n            var root = _ref2.root,\n                action = _ref2.action;\n            root.height = action.height;\n        },\n    });\n\n    var write$4 = createRoute(\n        {\n            DID_GRAB_ITEM: function DID_GRAB_ITEM(_ref3) {\n                var root = _ref3.root,\n                    props = _ref3.props;\n                props.dragOrigin = {\n                    x: root.translateX,\n                    y: root.translateY,\n                };\n            },\n            DID_DRAG_ITEM: function DID_DRAG_ITEM(_ref4) {\n                var root = _ref4.root;\n                root.element.dataset.dragState = 'drag';\n            },\n            DID_DROP_ITEM: function DID_DROP_ITEM(_ref5) {\n                var root = _ref5.root,\n                    props = _ref5.props;\n                props.dragOffset = null;\n                props.dragOrigin = null;\n                root.element.dataset.dragState = 'drop';\n            },\n        },\n\n        function(_ref6) {\n            var root = _ref6.root,\n                actions = _ref6.actions,\n                props = _ref6.props,\n                shouldOptimize = _ref6.shouldOptimize;\n            if (root.element.dataset.dragState === 'drop') {\n                if (root.scaleX <= 1) {\n                    root.element.dataset.dragState = 'idle';\n                }\n            }\n\n            // select last state change action\n            var action = actions\n                .concat()\n                .filter(function(action) {\n                    return /^DID_/.test(action.type);\n                })\n                .reverse()\n                .find(function(action) {\n                    return StateMap[action.type];\n                });\n\n            // no need to set same state twice\n            if (action && action.type !== props.currentState) {\n                // set current state\n                props.currentState = action.type;\n\n                // set state\n                root.element.dataset.filepondItemState = StateMap[props.currentState] || '';\n            }\n\n            // route actions\n            var aspectRatio =\n                root.query('GET_ITEM_PANEL_ASPECT_RATIO') || root.query('GET_PANEL_ASPECT_RATIO');\n            if (!aspectRatio) {\n                route$1({ root: root, actions: actions, props: props });\n                if (!root.height && root.ref.container.rect.element.height > 0) {\n                    root.height = root.ref.container.rect.element.height;\n                }\n            } else if (!shouldOptimize) {\n                root.height = root.rect.element.width * aspectRatio;\n            }\n\n            // sync panel height with item height\n            if (shouldOptimize) {\n                root.ref.panel.height = null;\n            }\n\n            root.ref.panel.height = root.height;\n        }\n    );\n\n    var item = createView({\n        create: create$7,\n        write: write$4,\n        destroy: function destroy(_ref7) {\n            var root = _ref7.root,\n                props = _ref7.props;\n            root.element.removeEventListener('click', root.ref.handleClick);\n            root.dispatch('RELEASE_ITEM', { query: props.id });\n        },\n        tag: 'li',\n        name: 'item',\n        mixins: {\n            apis: [\n                'id',\n                'interactionMethod',\n                'markedForRemoval',\n                'spawnDate',\n                'dragCenter',\n                'dragOrigin',\n                'dragOffset',\n            ],\n\n            styles: ['translateX', 'translateY', 'scaleX', 'scaleY', 'opacity', 'height'],\n            animations: {\n                scaleX: ITEM_SCALE_SPRING,\n                scaleY: ITEM_SCALE_SPRING,\n                translateX: ITEM_TRANSLATE_SPRING,\n                translateY: ITEM_TRANSLATE_SPRING,\n                opacity: { type: 'tween', duration: 150 },\n            },\n        },\n    });\n\n    var getItemsPerRow = function(horizontalSpace, itemWidth) {\n        // add one pixel leeway, when using percentages for item width total items can be 1.99 per row\n\n        return Math.max(1, Math.floor((horizontalSpace + 1) / itemWidth));\n    };\n\n    var getItemIndexByPosition = function getItemIndexByPosition(view, children, positionInView) {\n        if (!positionInView) return;\n\n        var horizontalSpace = view.rect.element.width;\n        // const children = view.childViews;\n        var l = children.length;\n        var last = null;\n\n        // -1, don't move items to accomodate (either add to top or bottom)\n        if (l === 0 || positionInView.top < children[0].rect.element.top) return -1;\n\n        // let's get the item width\n        var item = children[0];\n        var itemRect = item.rect.element;\n        var itemHorizontalMargin = itemRect.marginLeft + itemRect.marginRight;\n        var itemWidth = itemRect.width + itemHorizontalMargin;\n        var itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth);\n\n        // stack\n        if (itemsPerRow === 1) {\n            for (var index = 0; index < l; index++) {\n                var child = children[index];\n                var childMid = child.rect.outer.top + child.rect.element.height * 0.5;\n                if (positionInView.top < childMid) {\n                    return index;\n                }\n            }\n            return l;\n        }\n\n        // grid\n        var itemVerticalMargin = itemRect.marginTop + itemRect.marginBottom;\n        var itemHeight = itemRect.height + itemVerticalMargin;\n        for (var _index = 0; _index < l; _index++) {\n            var indexX = _index % itemsPerRow;\n            var indexY = Math.floor(_index / itemsPerRow);\n\n            var offsetX = indexX * itemWidth;\n            var offsetY = indexY * itemHeight;\n\n            var itemTop = offsetY - itemRect.marginTop;\n            var itemRight = offsetX + itemWidth;\n            var itemBottom = offsetY + itemHeight + itemRect.marginBottom;\n\n            if (positionInView.top < itemBottom && positionInView.top > itemTop) {\n                if (positionInView.left < itemRight) {\n                    return _index;\n                } else if (_index !== l - 1) {\n                    last = _index;\n                } else {\n                    last = null;\n                }\n            }\n        }\n\n        if (last !== null) {\n            return last;\n        }\n\n        return l;\n    };\n\n    var dropAreaDimensions = {\n        height: 0,\n        width: 0,\n        get getHeight() {\n            return this.height;\n        },\n        set setHeight(val) {\n            if (this.height === 0 || val === 0) this.height = val;\n        },\n        get getWidth() {\n            return this.width;\n        },\n        set setWidth(val) {\n            if (this.width === 0 || val === 0) this.width = val;\n        },\n        setDimensions: function setDimensions(height, width) {\n            if (this.height === 0 || height === 0) this.height = height;\n            if (this.width === 0 || width === 0) this.width = width;\n        },\n    };\n\n    var create$8 = function create(_ref) {\n        var root = _ref.root;\n        // need to set role to list as otherwise it won't be read as a list by VoiceOver\n        attr(root.element, 'role', 'list');\n\n        root.ref.lastItemSpanwDate = Date.now();\n    };\n\n    /**\n     * Inserts a new item\n     * @param root\n     * @param action\n     */\n    var addItemView = function addItemView(_ref2) {\n        var root = _ref2.root,\n            action = _ref2.action;\n        var id = action.id,\n            index = action.index,\n            interactionMethod = action.interactionMethod;\n\n        root.ref.addIndex = index;\n\n        var now = Date.now();\n        var spawnDate = now;\n        var opacity = 1;\n\n        if (interactionMethod !== InteractionMethod.NONE) {\n            opacity = 0;\n            var cooldown = root.query('GET_ITEM_INSERT_INTERVAL');\n            var dist = now - root.ref.lastItemSpanwDate;\n            spawnDate = dist < cooldown ? now + (cooldown - dist) : now;\n        }\n\n        root.ref.lastItemSpanwDate = spawnDate;\n\n        root.appendChildView(\n            root.createChildView(\n                // view type\n                item,\n\n                // props\n                {\n                    spawnDate: spawnDate,\n                    id: id,\n                    opacity: opacity,\n                    interactionMethod: interactionMethod,\n                }\n            ),\n\n            index\n        );\n    };\n\n    var moveItem = function moveItem(item, x, y) {\n        var vx = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n        var vy = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;\n        // set to null to remove animation while dragging\n        if (item.dragOffset) {\n            item.translateX = null;\n            item.translateY = null;\n            item.translateX = item.dragOrigin.x + item.dragOffset.x;\n            item.translateY = item.dragOrigin.y + item.dragOffset.y;\n            item.scaleX = 1.025;\n            item.scaleY = 1.025;\n        } else {\n            item.translateX = x;\n            item.translateY = y;\n\n            if (Date.now() > item.spawnDate) {\n                // reveal element\n                if (item.opacity === 0) {\n                    introItemView(item, x, y, vx, vy);\n                }\n\n                // make sure is default scale every frame\n                item.scaleX = 1;\n                item.scaleY = 1;\n                item.opacity = 1;\n            }\n        }\n    };\n\n    var introItemView = function introItemView(item, x, y, vx, vy) {\n        if (item.interactionMethod === InteractionMethod.NONE) {\n            item.translateX = null;\n            item.translateX = x;\n            item.translateY = null;\n            item.translateY = y;\n        } else if (item.interactionMethod === InteractionMethod.DROP) {\n            item.translateX = null;\n            item.translateX = x - vx * 20;\n\n            item.translateY = null;\n            item.translateY = y - vy * 10;\n\n            item.scaleX = 0.8;\n            item.scaleY = 0.8;\n        } else if (item.interactionMethod === InteractionMethod.BROWSE) {\n            item.translateY = null;\n            item.translateY = y - 30;\n        } else if (item.interactionMethod === InteractionMethod.API) {\n            item.translateX = null;\n            item.translateX = x - 30;\n            item.translateY = null;\n        }\n    };\n\n    /**\n     * Removes an existing item\n     * @param root\n     * @param action\n     */\n    var removeItemView = function removeItemView(_ref3) {\n        var root = _ref3.root,\n            action = _ref3.action;\n        var id = action.id;\n\n        // get the view matching the given id\n        var view = root.childViews.find(function(child) {\n            return child.id === id;\n        });\n\n        // if no view found, exit\n        if (!view) {\n            return;\n        }\n\n        // animate view out of view\n        view.scaleX = 0.9;\n        view.scaleY = 0.9;\n        view.opacity = 0;\n\n        // mark for removal\n        view.markedForRemoval = true;\n    };\n\n    var getItemHeight = function getItemHeight(child) {\n        return (\n            child.rect.element.height +\n            child.rect.element.marginBottom +\n            child.rect.element.marginTop\n        );\n    };\n    var getItemWidth = function getItemWidth(child) {\n        return (\n            child.rect.element.width +\n            child.rect.element.marginLeft * 0.5 +\n            child.rect.element.marginRight * 0.5\n        );\n    };\n\n    var dragItem = function dragItem(_ref4) {\n        var root = _ref4.root,\n            action = _ref4.action;\n        var id = action.id,\n            dragState = action.dragState;\n\n        // reference to item\n        var item = root.query('GET_ITEM', { id: id });\n\n        // get the view matching the given id\n        var view = root.childViews.find(function(child) {\n            return child.id === id;\n        });\n\n        var numItems = root.childViews.length;\n        var oldIndex = dragState.getItemIndex(item);\n\n        // if no view found, exit\n        if (!view) return;\n\n        var dragPosition = {\n            x: view.dragOrigin.x + view.dragOffset.x + view.dragCenter.x,\n            y: view.dragOrigin.y + view.dragOffset.y + view.dragCenter.y,\n        };\n\n        // get drag area dimensions\n        var dragHeight = getItemHeight(view);\n        var dragWidth = getItemWidth(view);\n\n        // get rows and columns (There will always be at least one row and one column if a file is present)\n        var cols = Math.floor(root.rect.outer.width / dragWidth);\n        if (cols > numItems) cols = numItems;\n\n        // rows are used to find when we have left the preview area bounding box\n        var rows = Math.floor(numItems / cols + 1);\n\n        dropAreaDimensions.setHeight = dragHeight * rows;\n        dropAreaDimensions.setWidth = dragWidth * cols;\n\n        // get new index of dragged item\n        var location = {\n            y: Math.floor(dragPosition.y / dragHeight),\n            x: Math.floor(dragPosition.x / dragWidth),\n            getGridIndex: function getGridIndex() {\n                if (\n                    dragPosition.y > dropAreaDimensions.getHeight ||\n                    dragPosition.y < 0 ||\n                    dragPosition.x > dropAreaDimensions.getWidth ||\n                    dragPosition.x < 0\n                )\n                    return oldIndex;\n                return this.y * cols + this.x;\n            },\n            getColIndex: function getColIndex() {\n                var items = root.query('GET_ACTIVE_ITEMS');\n                var visibleChildren = root.childViews.filter(function(child) {\n                    return child.rect.element.height;\n                });\n                var children = items.map(function(item) {\n                    return visibleChildren.find(function(childView) {\n                        return childView.id === item.id;\n                    });\n                });\n\n                var currentIndex = children.findIndex(function(child) {\n                    return child === view;\n                });\n                var dragHeight = getItemHeight(view);\n                var l = children.length;\n                var idx = l;\n                var childHeight = 0;\n                var childBottom = 0;\n                var childTop = 0;\n                for (var i = 0; i < l; i++) {\n                    childHeight = getItemHeight(children[i]);\n                    childTop = childBottom;\n                    childBottom = childTop + childHeight;\n                    if (dragPosition.y < childBottom) {\n                        if (currentIndex > i) {\n                            if (dragPosition.y < childTop + dragHeight) {\n                                idx = i;\n                                break;\n                            }\n                            continue;\n                        }\n                        idx = i;\n                        break;\n                    }\n                }\n                return idx;\n            },\n        };\n\n        // get new index\n        var index = cols > 1 ? location.getGridIndex() : location.getColIndex();\n        root.dispatch('MOVE_ITEM', { query: view, index: index });\n\n        // if the index of the item changed, dispatch reorder action\n        var currentIndex = dragState.getIndex();\n\n        if (currentIndex === undefined || currentIndex !== index) {\n            dragState.setIndex(index);\n\n            if (currentIndex === undefined) return;\n\n            root.dispatch('DID_REORDER_ITEMS', {\n                items: root.query('GET_ACTIVE_ITEMS'),\n                origin: oldIndex,\n                target: index,\n            });\n        }\n    };\n\n    /**\n     * Setup action routes\n     */\n    var route$2 = createRoute({\n        DID_ADD_ITEM: addItemView,\n        DID_REMOVE_ITEM: removeItemView,\n        DID_DRAG_ITEM: dragItem,\n    });\n\n    /**\n     * Write to view\n     * @param root\n     * @param actions\n     * @param props\n     */\n    var write$5 = function write(_ref5) {\n        var root = _ref5.root,\n            props = _ref5.props,\n            actions = _ref5.actions,\n            shouldOptimize = _ref5.shouldOptimize;\n        // route actions\n        route$2({ root: root, props: props, actions: actions });\n        var dragCoordinates = props.dragCoordinates;\n\n        // available space on horizontal axis\n        var horizontalSpace = root.rect.element.width;\n\n        // only draw children that have dimensions\n        var visibleChildren = root.childViews.filter(function(child) {\n            return child.rect.element.height;\n        });\n\n        // sort based on current active items\n        var children = root\n            .query('GET_ACTIVE_ITEMS')\n            .map(function(item) {\n                return visibleChildren.find(function(child) {\n                    return child.id === item.id;\n                });\n            })\n            .filter(function(item) {\n                return item;\n            });\n\n        // get index\n        var dragIndex = dragCoordinates\n            ? getItemIndexByPosition(root, children, dragCoordinates)\n            : null;\n\n        // add index is used to reserve the dropped/added item index till the actual item is rendered\n        var addIndex = root.ref.addIndex || null;\n\n        // add index no longer needed till possibly next draw\n        root.ref.addIndex = null;\n\n        var dragIndexOffset = 0;\n        var removeIndexOffset = 0;\n        var addIndexOffset = 0;\n\n        if (children.length === 0) return;\n\n        var childRect = children[0].rect.element;\n        var itemVerticalMargin = childRect.marginTop + childRect.marginBottom;\n        var itemHorizontalMargin = childRect.marginLeft + childRect.marginRight;\n        var itemWidth = childRect.width + itemHorizontalMargin;\n        var itemHeight = childRect.height + itemVerticalMargin;\n        var itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth);\n\n        // stack\n        if (itemsPerRow === 1) {\n            var offsetY = 0;\n            var dragOffset = 0;\n\n            children.forEach(function(child, index) {\n                if (dragIndex) {\n                    var dist = index - dragIndex;\n                    if (dist === -2) {\n                        dragOffset = -itemVerticalMargin * 0.25;\n                    } else if (dist === -1) {\n                        dragOffset = -itemVerticalMargin * 0.75;\n                    } else if (dist === 0) {\n                        dragOffset = itemVerticalMargin * 0.75;\n                    } else if (dist === 1) {\n                        dragOffset = itemVerticalMargin * 0.25;\n                    } else {\n                        dragOffset = 0;\n                    }\n                }\n\n                if (shouldOptimize) {\n                    child.translateX = null;\n                    child.translateY = null;\n                }\n\n                if (!child.markedForRemoval) {\n                    moveItem(child, 0, offsetY + dragOffset);\n                }\n\n                var itemHeight = child.rect.element.height + itemVerticalMargin;\n\n                var visualHeight = itemHeight * (child.markedForRemoval ? child.opacity : 1);\n\n                offsetY += visualHeight;\n            });\n        }\n        // grid\n        else {\n            var prevX = 0;\n            var prevY = 0;\n\n            children.forEach(function(child, index) {\n                if (index === dragIndex) {\n                    dragIndexOffset = 1;\n                }\n\n                if (index === addIndex) {\n                    addIndexOffset += 1;\n                }\n\n                if (child.markedForRemoval && child.opacity < 0.5) {\n                    removeIndexOffset -= 1;\n                }\n\n                var visualIndex = index + addIndexOffset + dragIndexOffset + removeIndexOffset;\n\n                var indexX = visualIndex % itemsPerRow;\n                var indexY = Math.floor(visualIndex / itemsPerRow);\n\n                var offsetX = indexX * itemWidth;\n                var offsetY = indexY * itemHeight;\n\n                var vectorX = Math.sign(offsetX - prevX);\n                var vectorY = Math.sign(offsetY - prevY);\n\n                prevX = offsetX;\n                prevY = offsetY;\n\n                if (child.markedForRemoval) return;\n\n                if (shouldOptimize) {\n                    child.translateX = null;\n                    child.translateY = null;\n                }\n\n                moveItem(child, offsetX, offsetY, vectorX, vectorY);\n            });\n        }\n    };\n\n    /**\n     * Filters actions that are meant specifically for a certain child of the list\n     * @param child\n     * @param actions\n     */\n    var filterSetItemActions = function filterSetItemActions(child, actions) {\n        return actions.filter(function(action) {\n            // if action has an id, filter out actions that don't have this child id\n            if (action.data && action.data.id) {\n                return child.id === action.data.id;\n            }\n\n            // allow all other actions\n            return true;\n        });\n    };\n\n    var list = createView({\n        create: create$8,\n        write: write$5,\n        tag: 'ul',\n        name: 'list',\n        didWriteView: function didWriteView(_ref6) {\n            var root = _ref6.root;\n            root.childViews\n                .filter(function(view) {\n                    return view.markedForRemoval && view.opacity === 0 && view.resting;\n                })\n                .forEach(function(view) {\n                    view._destroy();\n                    root.removeChildView(view);\n                });\n        },\n        filterFrameActionsForChild: filterSetItemActions,\n        mixins: {\n            apis: ['dragCoordinates'],\n        },\n    });\n\n    var create$9 = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n        root.ref.list = root.appendChildView(root.createChildView(list));\n        props.dragCoordinates = null;\n        props.overflowing = false;\n    };\n\n    var storeDragCoordinates = function storeDragCoordinates(_ref2) {\n        var root = _ref2.root,\n            props = _ref2.props,\n            action = _ref2.action;\n        if (!root.query('GET_ITEM_INSERT_LOCATION_FREEDOM')) return;\n        props.dragCoordinates = {\n            left: action.position.scopeLeft - root.ref.list.rect.element.left,\n            top:\n                action.position.scopeTop -\n                (root.rect.outer.top + root.rect.element.marginTop + root.rect.element.scrollTop),\n        };\n    };\n\n    var clearDragCoordinates = function clearDragCoordinates(_ref3) {\n        var props = _ref3.props;\n        props.dragCoordinates = null;\n    };\n\n    var route$3 = createRoute({\n        DID_DRAG: storeDragCoordinates,\n        DID_END_DRAG: clearDragCoordinates,\n    });\n\n    var write$6 = function write(_ref4) {\n        var root = _ref4.root,\n            props = _ref4.props,\n            actions = _ref4.actions;\n\n        // route actions\n        route$3({ root: root, props: props, actions: actions });\n\n        // current drag position\n        root.ref.list.dragCoordinates = props.dragCoordinates;\n\n        // if currently overflowing but no longer received overflow\n        if (props.overflowing && !props.overflow) {\n            props.overflowing = false;\n\n            // reset overflow state\n            root.element.dataset.state = '';\n            root.height = null;\n        }\n\n        // if is not overflowing currently but does receive overflow value\n        if (props.overflow) {\n            var newHeight = Math.round(props.overflow);\n            if (newHeight !== root.height) {\n                props.overflowing = true;\n                root.element.dataset.state = 'overflow';\n                root.height = newHeight;\n            }\n        }\n    };\n\n    var listScroller = createView({\n        create: create$9,\n        write: write$6,\n        name: 'list-scroller',\n        mixins: {\n            apis: ['overflow', 'dragCoordinates'],\n            styles: ['height', 'translateY'],\n            animations: {\n                translateY: 'spring',\n            },\n        },\n    });\n\n    var attrToggle = function attrToggle(element, name, state) {\n        var enabledValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n        if (state) {\n            attr(element, name, enabledValue);\n        } else {\n            element.removeAttribute(name);\n        }\n    };\n\n    var resetFileInput = function resetFileInput(input) {\n        // no value, no need to reset\n        if (!input || input.value === '') {\n            return;\n        }\n\n        try {\n            // for modern browsers\n            input.value = '';\n        } catch (err) {}\n\n        // for IE10\n        if (input.value) {\n            // quickly append input to temp form and reset form\n            var form = createElement$1('form');\n            var parentNode = input.parentNode;\n            var ref = input.nextSibling;\n            form.appendChild(input);\n            form.reset();\n\n            // re-inject input where it originally was\n            if (ref) {\n                parentNode.insertBefore(input, ref);\n            } else {\n                parentNode.appendChild(input);\n            }\n        }\n    };\n\n    var create$a = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n        // set id so can be referenced from outside labels\n        root.element.id = 'filepond--browser-' + props.id;\n\n        // set name of element (is removed when a value is set)\n        attr(root.element, 'name', root.query('GET_NAME'));\n\n        // we have to link this element to the status element\n        attr(root.element, 'aria-controls', 'filepond--assistant-' + props.id);\n\n        // set label, we use labelled by as otherwise the screenreader does not read the \"browse\" text in the label (as it has tabindex: 0)\n        attr(root.element, 'aria-labelledby', 'filepond--drop-label-' + props.id);\n\n        // set configurable props\n        setAcceptedFileTypes({\n            root: root,\n            action: { value: root.query('GET_ACCEPTED_FILE_TYPES') },\n        });\n        toggleAllowMultiple({ root: root, action: { value: root.query('GET_ALLOW_MULTIPLE') } });\n        toggleDirectoryFilter({\n            root: root,\n            action: { value: root.query('GET_ALLOW_DIRECTORIES_ONLY') },\n        });\n        toggleDisabled({ root: root });\n        toggleRequired({ root: root, action: { value: root.query('GET_REQUIRED') } });\n        setCaptureMethod({ root: root, action: { value: root.query('GET_CAPTURE_METHOD') } });\n\n        // handle changes to the input field\n        root.ref.handleChange = function(e) {\n            if (!root.element.value) {\n                return;\n            }\n\n            // extract files and move value of webkitRelativePath path to _relativePath\n            var files = Array.from(root.element.files).map(function(file) {\n                file._relativePath = file.webkitRelativePath;\n                return file;\n            });\n\n            // we add a little delay so the OS file select window can move out of the way before we add our file\n            setTimeout(function() {\n                // load files\n                props.onload(files);\n\n                // reset input, it's just for exposing a method to drop files, should not retain any state\n                resetFileInput(root.element);\n            }, 250);\n        };\n\n        root.element.addEventListener('change', root.ref.handleChange);\n    };\n\n    var setAcceptedFileTypes = function setAcceptedFileTypes(_ref2) {\n        var root = _ref2.root,\n            action = _ref2.action;\n        if (!root.query('GET_ALLOW_SYNC_ACCEPT_ATTRIBUTE')) return;\n        attrToggle(\n            root.element,\n            'accept',\n            !!action.value,\n            action.value ? action.value.join(',') : ''\n        );\n    };\n\n    var toggleAllowMultiple = function toggleAllowMultiple(_ref3) {\n        var root = _ref3.root,\n            action = _ref3.action;\n        attrToggle(root.element, 'multiple', action.value);\n    };\n\n    var toggleDirectoryFilter = function toggleDirectoryFilter(_ref4) {\n        var root = _ref4.root,\n            action = _ref4.action;\n        attrToggle(root.element, 'webkitdirectory', action.value);\n    };\n\n    var toggleDisabled = function toggleDisabled(_ref5) {\n        var root = _ref5.root;\n        var isDisabled = root.query('GET_DISABLED');\n        var doesAllowBrowse = root.query('GET_ALLOW_BROWSE');\n        var disableField = isDisabled || !doesAllowBrowse;\n        attrToggle(root.element, 'disabled', disableField);\n    };\n\n    var toggleRequired = function toggleRequired(_ref6) {\n        var root = _ref6.root,\n            action = _ref6.action;\n        // want to remove required, always possible\n        if (!action.value) {\n            attrToggle(root.element, 'required', false);\n        }\n        // if want to make required, only possible when zero items\n        else if (root.query('GET_TOTAL_ITEMS') === 0) {\n            attrToggle(root.element, 'required', true);\n        }\n    };\n\n    var setCaptureMethod = function setCaptureMethod(_ref7) {\n        var root = _ref7.root,\n            action = _ref7.action;\n        attrToggle(\n            root.element,\n            'capture',\n            !!action.value,\n            action.value === true ? '' : action.value\n        );\n    };\n\n    var updateRequiredStatus = function updateRequiredStatus(_ref8) {\n        var root = _ref8.root;\n        var element = root.element;\n        // always remove the required attribute when more than zero items\n        if (root.query('GET_TOTAL_ITEMS') > 0) {\n            attrToggle(element, 'required', false);\n            attrToggle(element, 'name', false);\n\n            // still has items\n            var activeItems = root.query('GET_ACTIVE_ITEMS');\n            var hasInvalidField = false;\n            for (var i = 0; i < activeItems.length; i++) {\n                if (activeItems[i].status === ItemStatus.LOAD_ERROR) {\n                    hasInvalidField = true;\n                }\n            }\n            // set validity status\n            root.element.setCustomValidity(\n                hasInvalidField ? root.query('GET_LABEL_INVALID_FIELD') : ''\n            );\n        } else {\n            // add name attribute\n            attrToggle(element, 'name', true, root.query('GET_NAME'));\n\n            // remove any validation messages\n            var shouldCheckValidity = root.query('GET_CHECK_VALIDITY');\n            if (shouldCheckValidity) {\n                element.setCustomValidity('');\n            }\n\n            // we only add required if the field has been deemed required\n            if (root.query('GET_REQUIRED')) {\n                attrToggle(element, 'required', true);\n            }\n        }\n    };\n\n    var updateFieldValidityStatus = function updateFieldValidityStatus(_ref9) {\n        var root = _ref9.root;\n        var shouldCheckValidity = root.query('GET_CHECK_VALIDITY');\n        if (!shouldCheckValidity) return;\n        root.element.setCustomValidity(root.query('GET_LABEL_INVALID_FIELD'));\n    };\n\n    var browser = createView({\n        tag: 'input',\n        name: 'browser',\n        ignoreRect: true,\n        ignoreRectUpdate: true,\n        attributes: {\n            type: 'file',\n        },\n\n        create: create$a,\n        destroy: function destroy(_ref10) {\n            var root = _ref10.root;\n            root.element.removeEventListener('change', root.ref.handleChange);\n        },\n        write: createRoute({\n            DID_LOAD_ITEM: updateRequiredStatus,\n            DID_REMOVE_ITEM: updateRequiredStatus,\n            DID_THROW_ITEM_INVALID: updateFieldValidityStatus,\n\n            DID_SET_DISABLED: toggleDisabled,\n            DID_SET_ALLOW_BROWSE: toggleDisabled,\n            DID_SET_ALLOW_DIRECTORIES_ONLY: toggleDirectoryFilter,\n            DID_SET_ALLOW_MULTIPLE: toggleAllowMultiple,\n            DID_SET_ACCEPTED_FILE_TYPES: setAcceptedFileTypes,\n            DID_SET_CAPTURE_METHOD: setCaptureMethod,\n            DID_SET_REQUIRED: toggleRequired,\n        }),\n    });\n\n    var Key = {\n        ENTER: 13,\n        SPACE: 32,\n    };\n\n    var create$b = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n        // create the label and link it to the file browser\n        var label = createElement$1('label');\n        attr(label, 'for', 'filepond--browser-' + props.id);\n\n        // use for labeling file input (aria-labelledby on file input)\n        attr(label, 'id', 'filepond--drop-label-' + props.id);\n\n        // handle keys\n        root.ref.handleKeyDown = function(e) {\n            var isActivationKey = e.keyCode === Key.ENTER || e.keyCode === Key.SPACE;\n            if (!isActivationKey) return;\n            // stops from triggering the element a second time\n            e.preventDefault();\n\n            // click link (will then in turn activate file input)\n            root.ref.label.click();\n        };\n\n        root.ref.handleClick = function(e) {\n            var isLabelClick = e.target === label || label.contains(e.target);\n\n            // don't want to click twice\n            if (isLabelClick) return;\n\n            // click link (will then in turn activate file input)\n            root.ref.label.click();\n        };\n\n        // attach events\n        label.addEventListener('keydown', root.ref.handleKeyDown);\n        root.element.addEventListener('click', root.ref.handleClick);\n\n        // update\n        updateLabelValue(label, props.caption);\n\n        // add!\n        root.appendChild(label);\n        root.ref.label = label;\n    };\n\n    var updateLabelValue = function updateLabelValue(label, value) {\n        label.innerHTML = value;\n        var clickable = label.querySelector('.filepond--label-action');\n        if (clickable) {\n            attr(clickable, 'tabindex', '0');\n        }\n        return value;\n    };\n\n    var dropLabel = createView({\n        name: 'drop-label',\n        ignoreRect: true,\n        create: create$b,\n        destroy: function destroy(_ref2) {\n            var root = _ref2.root;\n            root.ref.label.addEventListener('keydown', root.ref.handleKeyDown);\n            root.element.removeEventListener('click', root.ref.handleClick);\n        },\n        write: createRoute({\n            DID_SET_LABEL_IDLE: function DID_SET_LABEL_IDLE(_ref3) {\n                var root = _ref3.root,\n                    action = _ref3.action;\n                updateLabelValue(root.ref.label, action.value);\n            },\n        }),\n\n        mixins: {\n            styles: ['opacity', 'translateX', 'translateY'],\n            animations: {\n                opacity: { type: 'tween', duration: 150 },\n                translateX: 'spring',\n                translateY: 'spring',\n            },\n        },\n    });\n\n    var blob = createView({\n        name: 'drip-blob',\n        ignoreRect: true,\n        mixins: {\n            styles: ['translateX', 'translateY', 'scaleX', 'scaleY', 'opacity'],\n            animations: {\n                scaleX: 'spring',\n                scaleY: 'spring',\n                translateX: 'spring',\n                translateY: 'spring',\n                opacity: { type: 'tween', duration: 250 },\n            },\n        },\n    });\n\n    var addBlob = function addBlob(_ref) {\n        var root = _ref.root;\n        var centerX = root.rect.element.width * 0.5;\n        var centerY = root.rect.element.height * 0.5;\n\n        root.ref.blob = root.appendChildView(\n            root.createChildView(blob, {\n                opacity: 0,\n                scaleX: 2.5,\n                scaleY: 2.5,\n                translateX: centerX,\n                translateY: centerY,\n            })\n        );\n    };\n\n    var moveBlob = function moveBlob(_ref2) {\n        var root = _ref2.root,\n            action = _ref2.action;\n        if (!root.ref.blob) {\n            addBlob({ root: root });\n            return;\n        }\n\n        root.ref.blob.translateX = action.position.scopeLeft;\n        root.ref.blob.translateY = action.position.scopeTop;\n        root.ref.blob.scaleX = 1;\n        root.ref.blob.scaleY = 1;\n        root.ref.blob.opacity = 1;\n    };\n\n    var hideBlob = function hideBlob(_ref3) {\n        var root = _ref3.root;\n        if (!root.ref.blob) {\n            return;\n        }\n        root.ref.blob.opacity = 0;\n    };\n\n    var explodeBlob = function explodeBlob(_ref4) {\n        var root = _ref4.root;\n        if (!root.ref.blob) {\n            return;\n        }\n        root.ref.blob.scaleX = 2.5;\n        root.ref.blob.scaleY = 2.5;\n        root.ref.blob.opacity = 0;\n    };\n\n    var write$7 = function write(_ref5) {\n        var root = _ref5.root,\n            props = _ref5.props,\n            actions = _ref5.actions;\n        route$4({ root: root, props: props, actions: actions });\n        var blob = root.ref.blob;\n\n        if (actions.length === 0 && blob && blob.opacity === 0) {\n            root.removeChildView(blob);\n            root.ref.blob = null;\n        }\n    };\n\n    var route$4 = createRoute({\n        DID_DRAG: moveBlob,\n        DID_DROP: explodeBlob,\n        DID_END_DRAG: hideBlob,\n    });\n\n    var drip = createView({\n        ignoreRect: true,\n        ignoreRectUpdate: true,\n        name: 'drip',\n        write: write$7,\n    });\n\n    var setInputFiles = function setInputFiles(element, files) {\n        try {\n            // Create a DataTransfer instance and add a newly created file\n            var dataTransfer = new DataTransfer();\n            files.forEach(function(file) {\n                if (file instanceof File) {\n                    dataTransfer.items.add(file);\n                } else {\n                    dataTransfer.items.add(\n                        new File([file], file.name, {\n                            type: file.type,\n                        })\n                    );\n                }\n            });\n\n            // Assign the DataTransfer files list to the file input\n            element.files = dataTransfer.files;\n        } catch (err) {\n            return false;\n        }\n        return true;\n    };\n\n    var create$c = function create(_ref) {\n        var root = _ref.root;\n        root.ref.fields = {};\n        var legend = document.createElement('legend');\n        legend.textContent = 'Files';\n        root.element.appendChild(legend);\n    };\n\n    var getField = function getField(root, id) {\n        return root.ref.fields[id];\n    };\n\n    var syncFieldPositionsWithItems = function syncFieldPositionsWithItems(root) {\n        root.query('GET_ACTIVE_ITEMS').forEach(function(item) {\n            if (!root.ref.fields[item.id]) return;\n            root.element.appendChild(root.ref.fields[item.id]);\n        });\n    };\n\n    var didReorderItems = function didReorderItems(_ref2) {\n        var root = _ref2.root;\n        return syncFieldPositionsWithItems(root);\n    };\n\n    var didAddItem = function didAddItem(_ref3) {\n        var root = _ref3.root,\n            action = _ref3.action;\n        var fileItem = root.query('GET_ITEM', action.id);\n        var isLocalFile = fileItem.origin === FileOrigin.LOCAL;\n        var shouldUseFileInput = !isLocalFile && root.query('SHOULD_UPDATE_FILE_INPUT');\n        var dataContainer = createElement$1('input');\n        dataContainer.type = shouldUseFileInput ? 'file' : 'hidden';\n        dataContainer.name = root.query('GET_NAME');\n        root.ref.fields[action.id] = dataContainer;\n        syncFieldPositionsWithItems(root);\n    };\n\n    var didLoadItem$1 = function didLoadItem(_ref4) {\n        var root = _ref4.root,\n            action = _ref4.action;\n        var field = getField(root, action.id);\n        if (!field) return;\n\n        // store server ref in hidden input\n        if (action.serverFileReference !== null) field.value = action.serverFileReference;\n\n        // store file item in file input\n        if (!root.query('SHOULD_UPDATE_FILE_INPUT')) return;\n\n        var fileItem = root.query('GET_ITEM', action.id);\n        setInputFiles(field, [fileItem.file]);\n    };\n\n    var didPrepareOutput = function didPrepareOutput(_ref5) {\n        var root = _ref5.root,\n            action = _ref5.action;\n        // this timeout pushes the handler after 'load'\n        if (!root.query('SHOULD_UPDATE_FILE_INPUT')) return;\n        setTimeout(function() {\n            var field = getField(root, action.id);\n            if (!field) return;\n            setInputFiles(field, [action.file]);\n        }, 0);\n    };\n\n    var didSetDisabled = function didSetDisabled(_ref6) {\n        var root = _ref6.root;\n        root.element.disabled = root.query('GET_DISABLED');\n    };\n\n    var didRemoveItem = function didRemoveItem(_ref7) {\n        var root = _ref7.root,\n            action = _ref7.action;\n        var field = getField(root, action.id);\n        if (!field) return;\n        if (field.parentNode) field.parentNode.removeChild(field);\n        delete root.ref.fields[action.id];\n    };\n\n    // only runs for server files. will refuse to update the value if the field\n    // is a file field\n    var didDefineValue = function didDefineValue(_ref8) {\n        var root = _ref8.root,\n            action = _ref8.action;\n        var field = getField(root, action.id);\n        if (!field) return;\n        if (action.value === null) {\n            // clear field value\n            field.removeAttribute('value');\n        } else {\n            // set field value\n            if (field.type != 'file') {\n                field.value = action.value;\n            }\n        }\n        syncFieldPositionsWithItems(root);\n    };\n\n    var write$8 = createRoute({\n        DID_SET_DISABLED: didSetDisabled,\n        DID_ADD_ITEM: didAddItem,\n        DID_LOAD_ITEM: didLoadItem$1,\n        DID_REMOVE_ITEM: didRemoveItem,\n        DID_DEFINE_VALUE: didDefineValue,\n        DID_PREPARE_OUTPUT: didPrepareOutput,\n        DID_REORDER_ITEMS: didReorderItems,\n        DID_SORT_ITEMS: didReorderItems,\n    });\n\n    var data = createView({\n        tag: 'fieldset',\n        name: 'data',\n        create: create$c,\n        write: write$8,\n        ignoreRect: true,\n    });\n\n    var getRootNode = function getRootNode(element) {\n        return 'getRootNode' in element ? element.getRootNode() : document;\n    };\n\n    var images = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff'];\n    var text$1 = ['css', 'csv', 'html', 'txt'];\n    var map = {\n        zip: 'zip|compressed',\n        epub: 'application/epub+zip',\n    };\n\n    var guesstimateMimeType = function guesstimateMimeType() {\n        var extension = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n        extension = extension.toLowerCase();\n        if (images.includes(extension)) {\n            return (\n                'image/' +\n                (extension === 'jpg' ? 'jpeg' : extension === 'svg' ? 'svg+xml' : extension)\n            );\n        }\n        if (text$1.includes(extension)) {\n            return 'text/' + extension;\n        }\n\n        return map[extension] || '';\n    };\n\n    var requestDataTransferItems = function requestDataTransferItems(dataTransfer) {\n        return new Promise(function(resolve, reject) {\n            // try to get links from transfer, if found we'll exit immediately (unless a file is in the dataTransfer as well, this is because Firefox could represent the file as a URL and a file object at the same time)\n            var links = getLinks(dataTransfer);\n            if (links.length && !hasFiles(dataTransfer)) {\n                return resolve(links);\n            }\n            // try to get files from the transfer\n            getFiles(dataTransfer).then(resolve);\n        });\n    };\n\n    /**\n     * Test if datatransfer has files\n     */\n    var hasFiles = function hasFiles(dataTransfer) {\n        if (dataTransfer.files) return dataTransfer.files.length > 0;\n        return false;\n    };\n\n    /**\n     * Extracts files from a DataTransfer object\n     */\n    var getFiles = function getFiles(dataTransfer) {\n        return new Promise(function(resolve, reject) {\n            // get the transfer items as promises\n            var promisedFiles = (dataTransfer.items ? Array.from(dataTransfer.items) : [])\n                // only keep file system items (files and directories)\n                .filter(function(item) {\n                    return isFileSystemItem(item);\n                })\n\n                // map each item to promise\n                .map(function(item) {\n                    return getFilesFromItem(item);\n                });\n\n            // if is empty, see if we can extract some info from the files property as a fallback\n            if (!promisedFiles.length) {\n                // TODO: test for directories (should not be allowed)\n                // Use FileReader, problem is that the files property gets lost in the process\n                resolve(dataTransfer.files ? Array.from(dataTransfer.files) : []);\n                return;\n            }\n\n            // done!\n            Promise.all(promisedFiles)\n                .then(function(returnedFileGroups) {\n                    // flatten groups\n                    var files = [];\n                    returnedFileGroups.forEach(function(group) {\n                        files.push.apply(files, group);\n                    });\n\n                    // done (filter out empty files)!\n                    resolve(\n                        files\n                            .filter(function(file) {\n                                return file;\n                            })\n                            .map(function(file) {\n                                if (!file._relativePath)\n                                    file._relativePath = file.webkitRelativePath;\n                                return file;\n                            })\n                    );\n                })\n                .catch(console.error);\n        });\n    };\n\n    var isFileSystemItem = function isFileSystemItem(item) {\n        if (isEntry(item)) {\n            var entry = getAsEntry(item);\n            if (entry) {\n                return entry.isFile || entry.isDirectory;\n            }\n        }\n        return item.kind === 'file';\n    };\n\n    var getFilesFromItem = function getFilesFromItem(item) {\n        return new Promise(function(resolve, reject) {\n            if (isDirectoryEntry(item)) {\n                getFilesInDirectory(getAsEntry(item))\n                    .then(resolve)\n                    .catch(reject);\n                return;\n            }\n\n            resolve([item.getAsFile()]);\n        });\n    };\n\n    var getFilesInDirectory = function getFilesInDirectory(entry) {\n        return new Promise(function(resolve, reject) {\n            var files = [];\n\n            // the total entries to read\n            var dirCounter = 0;\n            var fileCounter = 0;\n\n            var resolveIfDone = function resolveIfDone() {\n                if (fileCounter === 0 && dirCounter === 0) {\n                    resolve(files);\n                }\n            };\n\n            // the recursive function\n            var readEntries = function readEntries(dirEntry) {\n                dirCounter++;\n\n                var directoryReader = dirEntry.createReader();\n\n                // directories are returned in batches, we need to process all batches before we're done\n                var readBatch = function readBatch() {\n                    directoryReader.readEntries(function(entries) {\n                        if (entries.length === 0) {\n                            dirCounter--;\n                            resolveIfDone();\n                            return;\n                        }\n\n                        entries.forEach(function(entry) {\n                            // recursively read more directories\n                            if (entry.isDirectory) {\n                                readEntries(entry);\n                            } else {\n                                // read as file\n                                fileCounter++;\n\n                                entry.file(function(file) {\n                                    var correctedFile = correctMissingFileType(file);\n                                    if (entry.fullPath)\n                                        correctedFile._relativePath = entry.fullPath;\n                                    files.push(correctedFile);\n                                    fileCounter--;\n                                    resolveIfDone();\n                                });\n                            }\n                        });\n\n                        // try to get next batch of files\n                        readBatch();\n                    }, reject);\n                };\n\n                // read first batch of files\n                readBatch();\n            };\n\n            // go!\n            readEntries(entry);\n        });\n    };\n\n    var correctMissingFileType = function correctMissingFileType(file) {\n        if (file.type.length) return file;\n        var date = file.lastModifiedDate;\n        var name = file.name;\n        var type = guesstimateMimeType(getExtensionFromFilename(file.name));\n        if (!type.length) return file;\n        file = file.slice(0, file.size, type);\n        file.name = name;\n        file.lastModifiedDate = date;\n        return file;\n    };\n\n    var isDirectoryEntry = function isDirectoryEntry(item) {\n        return isEntry(item) && (getAsEntry(item) || {}).isDirectory;\n    };\n\n    var isEntry = function isEntry(item) {\n        return 'webkitGetAsEntry' in item;\n    };\n\n    var getAsEntry = function getAsEntry(item) {\n        return item.webkitGetAsEntry();\n    };\n\n    /**\n     * Extracts links from a DataTransfer object\n     */\n    var getLinks = function getLinks(dataTransfer) {\n        var links = [];\n        try {\n            // look in meta data property\n            links = getLinksFromTransferMetaData(dataTransfer);\n            if (links.length) {\n                return links;\n            }\n            links = getLinksFromTransferURLData(dataTransfer);\n        } catch (e) {\n            // nope nope nope (probably IE trouble)\n        }\n        return links;\n    };\n\n    var getLinksFromTransferURLData = function getLinksFromTransferURLData(dataTransfer) {\n        var data = dataTransfer.getData('url');\n        if (typeof data === 'string' && data.length) {\n            return [data];\n        }\n        return [];\n    };\n\n    var getLinksFromTransferMetaData = function getLinksFromTransferMetaData(dataTransfer) {\n        var data = dataTransfer.getData('text/html');\n        if (typeof data === 'string' && data.length) {\n            var matches = data.match(/src\\s*=\\s*\"(.+?)\"/);\n            if (matches) {\n                return [matches[1]];\n            }\n        }\n        return [];\n    };\n\n    var dragNDropObservers = [];\n\n    var eventPosition = function eventPosition(e) {\n        return {\n            pageLeft: e.pageX,\n            pageTop: e.pageY,\n            scopeLeft: e.offsetX || e.layerX,\n            scopeTop: e.offsetY || e.layerY,\n        };\n    };\n\n    var createDragNDropClient = function createDragNDropClient(\n        element,\n        scopeToObserve,\n        filterElement\n    ) {\n        var observer = getDragNDropObserver(scopeToObserve);\n\n        var client = {\n            element: element,\n            filterElement: filterElement,\n            state: null,\n            ondrop: function ondrop() {},\n            onenter: function onenter() {},\n            ondrag: function ondrag() {},\n            onexit: function onexit() {},\n            onload: function onload() {},\n            allowdrop: function allowdrop() {},\n        };\n\n        client.destroy = observer.addListener(client);\n\n        return client;\n    };\n\n    var getDragNDropObserver = function getDragNDropObserver(element) {\n        // see if already exists, if so, return\n        var observer = dragNDropObservers.find(function(item) {\n            return item.element === element;\n        });\n        if (observer) {\n            return observer;\n        }\n\n        // create new observer, does not yet exist for this element\n        var newObserver = createDragNDropObserver(element);\n        dragNDropObservers.push(newObserver);\n        return newObserver;\n    };\n\n    var createDragNDropObserver = function createDragNDropObserver(element) {\n        var clients = [];\n\n        var routes = {\n            dragenter: dragenter,\n            dragover: dragover,\n            dragleave: dragleave,\n            drop: drop,\n        };\n\n        var handlers = {};\n\n        forin(routes, function(event, createHandler) {\n            handlers[event] = createHandler(element, clients);\n            element.addEventListener(event, handlers[event], false);\n        });\n\n        var observer = {\n            element: element,\n            addListener: function addListener(client) {\n                // add as client\n                clients.push(client);\n\n                // return removeListener function\n                return function() {\n                    // remove client\n                    clients.splice(clients.indexOf(client), 1);\n\n                    // if no more clients, clean up observer\n                    if (clients.length === 0) {\n                        dragNDropObservers.splice(dragNDropObservers.indexOf(observer), 1);\n\n                        forin(routes, function(event) {\n                            element.removeEventListener(event, handlers[event], false);\n                        });\n                    }\n                };\n            },\n        };\n\n        return observer;\n    };\n\n    var elementFromPoint = function elementFromPoint(root, point) {\n        if (!('elementFromPoint' in root)) {\n            root = document;\n        }\n        return root.elementFromPoint(point.x, point.y);\n    };\n\n    var isEventTarget = function isEventTarget(e, target) {\n        // get root\n        var root = getRootNode(target);\n\n        // get element at position\n        // if root is not actual shadow DOM and does not have elementFromPoint method, use the one on document\n        var elementAtPosition = elementFromPoint(root, {\n            x: e.pageX - window.pageXOffset,\n            y: e.pageY - window.pageYOffset,\n        });\n\n        // test if target is the element or if one of its children is\n        return elementAtPosition === target || target.contains(elementAtPosition);\n    };\n\n    var initialTarget = null;\n\n    var setDropEffect = function setDropEffect(dataTransfer, effect) {\n        // is in try catch as IE11 will throw error if not\n        try {\n            dataTransfer.dropEffect = effect;\n        } catch (e) {}\n    };\n\n    var dragenter = function dragenter(root, clients) {\n        return function(e) {\n            e.preventDefault();\n\n            initialTarget = e.target;\n\n            clients.forEach(function(client) {\n                var element = client.element,\n                    onenter = client.onenter;\n\n                if (isEventTarget(e, element)) {\n                    client.state = 'enter';\n\n                    // fire enter event\n                    onenter(eventPosition(e));\n                }\n            });\n        };\n    };\n\n    var dragover = function dragover(root, clients) {\n        return function(e) {\n            e.preventDefault();\n\n            var dataTransfer = e.dataTransfer;\n\n            requestDataTransferItems(dataTransfer).then(function(items) {\n                var overDropTarget = false;\n\n                clients.some(function(client) {\n                    var filterElement = client.filterElement,\n                        element = client.element,\n                        onenter = client.onenter,\n                        onexit = client.onexit,\n                        ondrag = client.ondrag,\n                        allowdrop = client.allowdrop;\n\n                    // by default we can drop\n                    setDropEffect(dataTransfer, 'copy');\n\n                    // allow transfer of these items\n                    var allowsTransfer = allowdrop(items);\n\n                    // only used when can be dropped on page\n                    if (!allowsTransfer) {\n                        setDropEffect(dataTransfer, 'none');\n                        return;\n                    }\n\n                    // targetting this client\n                    if (isEventTarget(e, element)) {\n                        overDropTarget = true;\n\n                        // had no previous state, means we are entering this client\n                        if (client.state === null) {\n                            client.state = 'enter';\n                            onenter(eventPosition(e));\n                            return;\n                        }\n\n                        // now over element (no matter if it allows the drop or not)\n                        client.state = 'over';\n\n                        // needs to allow transfer\n                        if (filterElement && !allowsTransfer) {\n                            setDropEffect(dataTransfer, 'none');\n                            return;\n                        }\n\n                        // dragging\n                        ondrag(eventPosition(e));\n                    } else {\n                        // should be over an element to drop\n                        if (filterElement && !overDropTarget) {\n                            setDropEffect(dataTransfer, 'none');\n                        }\n\n                        // might have just left this client?\n                        if (client.state) {\n                            client.state = null;\n                            onexit(eventPosition(e));\n                        }\n                    }\n                });\n            });\n        };\n    };\n\n    var drop = function drop(root, clients) {\n        return function(e) {\n            e.preventDefault();\n\n            var dataTransfer = e.dataTransfer;\n\n            requestDataTransferItems(dataTransfer).then(function(items) {\n                clients.forEach(function(client) {\n                    var filterElement = client.filterElement,\n                        element = client.element,\n                        ondrop = client.ondrop,\n                        onexit = client.onexit,\n                        allowdrop = client.allowdrop;\n\n                    client.state = null;\n\n                    // if we're filtering on element we need to be over the element to drop\n                    if (filterElement && !isEventTarget(e, element)) return;\n\n                    // no transfer for this client\n                    if (!allowdrop(items)) return onexit(eventPosition(e));\n\n                    // we can drop these items on this client\n                    ondrop(eventPosition(e), items);\n                });\n            });\n        };\n    };\n\n    var dragleave = function dragleave(root, clients) {\n        return function(e) {\n            if (initialTarget !== e.target) {\n                return;\n            }\n\n            clients.forEach(function(client) {\n                var onexit = client.onexit;\n\n                client.state = null;\n\n                onexit(eventPosition(e));\n            });\n        };\n    };\n\n    var createHopper = function createHopper(scope, validateItems, options) {\n        // is now hopper scope\n        scope.classList.add('filepond--hopper');\n\n        // shortcuts\n        var catchesDropsOnPage = options.catchesDropsOnPage,\n            requiresDropOnElement = options.requiresDropOnElement,\n            _options$filterItems = options.filterItems,\n            filterItems =\n                _options$filterItems === void 0\n                    ? function(items) {\n                          return items;\n                      }\n                    : _options$filterItems;\n\n        // create a dnd client\n        var client = createDragNDropClient(\n            scope,\n            catchesDropsOnPage ? document.documentElement : scope,\n            requiresDropOnElement\n        );\n\n        // current client state\n        var lastState = '';\n        var currentState = '';\n\n        // determines if a file may be dropped\n        client.allowdrop = function(items) {\n            // TODO: if we can, throw error to indicate the items cannot by dropped\n\n            return validateItems(filterItems(items));\n        };\n\n        client.ondrop = function(position, items) {\n            var filteredItems = filterItems(items);\n\n            if (!validateItems(filteredItems)) {\n                api.ondragend(position);\n                return;\n            }\n\n            currentState = 'drag-drop';\n\n            api.onload(filteredItems, position);\n        };\n\n        client.ondrag = function(position) {\n            api.ondrag(position);\n        };\n\n        client.onenter = function(position) {\n            currentState = 'drag-over';\n\n            api.ondragstart(position);\n        };\n\n        client.onexit = function(position) {\n            currentState = 'drag-exit';\n\n            api.ondragend(position);\n        };\n\n        var api = {\n            updateHopperState: function updateHopperState() {\n                if (lastState !== currentState) {\n                    scope.dataset.hopperState = currentState;\n                    lastState = currentState;\n                }\n            },\n            onload: function onload() {},\n            ondragstart: function ondragstart() {},\n            ondrag: function ondrag() {},\n            ondragend: function ondragend() {},\n            destroy: function destroy() {\n                // destroy client\n                client.destroy();\n            },\n        };\n\n        return api;\n    };\n\n    var listening = false;\n    var listeners$1 = [];\n\n    var handlePaste = function handlePaste(e) {\n        // if is pasting in input or textarea and the target is outside of a filepond scope, ignore\n        var activeEl = document.activeElement;\n        var isActiveElementEditable =\n            activeEl &&\n            (/textarea|input/i.test(activeEl.nodeName) ||\n                activeEl.getAttribute('contenteditable') === 'true' ||\n                activeEl.getAttribute('contenteditable') === '');\n\n        if (isActiveElementEditable) {\n            // test textarea or input is contained in filepond root\n            var inScope = false;\n            var element = activeEl;\n            while (element !== document.body) {\n                if (element.classList.contains('filepond--root')) {\n                    inScope = true;\n                    break;\n                }\n                element = element.parentNode;\n            }\n\n            if (!inScope) return;\n        }\n\n        requestDataTransferItems(e.clipboardData).then(function(files) {\n            // no files received\n            if (!files.length) {\n                return;\n            }\n\n            // notify listeners of received files\n            listeners$1.forEach(function(listener) {\n                return listener(files);\n            });\n        });\n    };\n\n    var listen = function listen(cb) {\n        // can't add twice\n        if (listeners$1.includes(cb)) {\n            return;\n        }\n\n        // add initial listener\n        listeners$1.push(cb);\n\n        // setup paste listener for entire page\n        if (listening) {\n            return;\n        }\n\n        listening = true;\n        document.addEventListener('paste', handlePaste);\n    };\n\n    var unlisten = function unlisten(listener) {\n        arrayRemove(listeners$1, listeners$1.indexOf(listener));\n\n        // clean up\n        if (listeners$1.length === 0) {\n            document.removeEventListener('paste', handlePaste);\n            listening = false;\n        }\n    };\n\n    var createPaster = function createPaster() {\n        var cb = function cb(files) {\n            api.onload(files);\n        };\n\n        var api = {\n            destroy: function destroy() {\n                unlisten(cb);\n            },\n            onload: function onload() {},\n        };\n\n        listen(cb);\n\n        return api;\n    };\n\n    /**\n     * Creates the file view\n     */\n    var create$d = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n        root.element.id = 'filepond--assistant-' + props.id;\n        attr(root.element, 'role', 'alert');\n        attr(root.element, 'aria-live', 'polite');\n        attr(root.element, 'aria-relevant', 'additions');\n    };\n\n    var addFilesNotificationTimeout = null;\n    var notificationClearTimeout = null;\n\n    var filenames = [];\n\n    var assist = function assist(root, message) {\n        root.element.textContent = message;\n    };\n\n    var clear$1 = function clear(root) {\n        root.element.textContent = '';\n    };\n\n    var listModified = function listModified(root, filename, label) {\n        var total = root.query('GET_TOTAL_ITEMS');\n        assist(\n            root,\n            label +\n                ' ' +\n                filename +\n                ', ' +\n                total +\n                ' ' +\n                (total === 1\n                    ? root.query('GET_LABEL_FILE_COUNT_SINGULAR')\n                    : root.query('GET_LABEL_FILE_COUNT_PLURAL'))\n        );\n\n        // clear group after set amount of time so the status is not read twice\n        clearTimeout(notificationClearTimeout);\n        notificationClearTimeout = setTimeout(function() {\n            clear$1(root);\n        }, 1500);\n    };\n\n    var isUsingFilePond = function isUsingFilePond(root) {\n        return root.element.parentNode.contains(document.activeElement);\n    };\n\n    var itemAdded = function itemAdded(_ref2) {\n        var root = _ref2.root,\n            action = _ref2.action;\n        if (!isUsingFilePond(root)) {\n            return;\n        }\n\n        root.element.textContent = '';\n        var item = root.query('GET_ITEM', action.id);\n        filenames.push(item.filename);\n\n        clearTimeout(addFilesNotificationTimeout);\n        addFilesNotificationTimeout = setTimeout(function() {\n            listModified(root, filenames.join(', '), root.query('GET_LABEL_FILE_ADDED'));\n            filenames.length = 0;\n        }, 750);\n    };\n\n    var itemRemoved = function itemRemoved(_ref3) {\n        var root = _ref3.root,\n            action = _ref3.action;\n        if (!isUsingFilePond(root)) {\n            return;\n        }\n\n        var item = action.item;\n        listModified(root, item.filename, root.query('GET_LABEL_FILE_REMOVED'));\n    };\n\n    var itemProcessed = function itemProcessed(_ref4) {\n        var root = _ref4.root,\n            action = _ref4.action;\n        // will also notify the user when FilePond is not being used, as the user might be occupied with other activities while uploading a file\n\n        var item = root.query('GET_ITEM', action.id);\n        var filename = item.filename;\n        var label = root.query('GET_LABEL_FILE_PROCESSING_COMPLETE');\n\n        assist(root, filename + ' ' + label);\n    };\n\n    var itemProcessedUndo = function itemProcessedUndo(_ref5) {\n        var root = _ref5.root,\n            action = _ref5.action;\n        var item = root.query('GET_ITEM', action.id);\n        var filename = item.filename;\n        var label = root.query('GET_LABEL_FILE_PROCESSING_ABORTED');\n\n        assist(root, filename + ' ' + label);\n    };\n\n    var itemError = function itemError(_ref6) {\n        var root = _ref6.root,\n            action = _ref6.action;\n        var item = root.query('GET_ITEM', action.id);\n        var filename = item.filename;\n\n        // will also notify the user when FilePond is not being used, as the user might be occupied with other activities while uploading a file\n\n        assist(root, action.status.main + ' ' + filename + ' ' + action.status.sub);\n    };\n\n    var assistant = createView({\n        create: create$d,\n        ignoreRect: true,\n        ignoreRectUpdate: true,\n        write: createRoute({\n            DID_LOAD_ITEM: itemAdded,\n            DID_REMOVE_ITEM: itemRemoved,\n            DID_COMPLETE_ITEM_PROCESSING: itemProcessed,\n\n            DID_ABORT_ITEM_PROCESSING: itemProcessedUndo,\n            DID_REVERT_ITEM_PROCESSING: itemProcessedUndo,\n\n            DID_THROW_ITEM_REMOVE_ERROR: itemError,\n            DID_THROW_ITEM_LOAD_ERROR: itemError,\n            DID_THROW_ITEM_INVALID: itemError,\n            DID_THROW_ITEM_PROCESSING_ERROR: itemError,\n        }),\n\n        tag: 'span',\n        name: 'assistant',\n    });\n\n    var toCamels = function toCamels(string) {\n        var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '-';\n        return string.replace(new RegExp(separator + '.', 'g'), function(sub) {\n            return sub.charAt(1).toUpperCase();\n        });\n    };\n\n    var debounce = function debounce(func) {\n        var interval = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 16;\n        var immidiateOnly =\n            arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n        var last = Date.now();\n        var timeout = null;\n\n        return function() {\n            for (\n                var _len = arguments.length, args = new Array(_len), _key = 0;\n                _key < _len;\n                _key++\n            ) {\n                args[_key] = arguments[_key];\n            }\n            clearTimeout(timeout);\n\n            var dist = Date.now() - last;\n\n            var fn = function fn() {\n                last = Date.now();\n                func.apply(void 0, args);\n            };\n\n            if (dist < interval) {\n                // we need to delay by the difference between interval and dist\n                // for example: if distance is 10 ms and interval is 16 ms,\n                // we need to wait an additional 6ms before calling the function)\n                if (!immidiateOnly) {\n                    timeout = setTimeout(fn, interval - dist);\n                }\n            } else {\n                // go!\n                fn();\n            }\n        };\n    };\n\n    var MAX_FILES_LIMIT = 1000000;\n\n    var prevent = function prevent(e) {\n        return e.preventDefault();\n    };\n\n    var create$e = function create(_ref) {\n        var root = _ref.root,\n            props = _ref.props;\n        // Add id\n        var id = root.query('GET_ID');\n        if (id) {\n            root.element.id = id;\n        }\n\n        // Add className\n        var className = root.query('GET_CLASS_NAME');\n        if (className) {\n            className\n                .split(' ')\n                .filter(function(name) {\n                    return name.length;\n                })\n                .forEach(function(name) {\n                    root.element.classList.add(name);\n                });\n        }\n\n        // Field label\n        root.ref.label = root.appendChildView(\n            root.createChildView(\n                dropLabel,\n                Object.assign({}, props, {\n                    translateY: null,\n                    caption: root.query('GET_LABEL_IDLE'),\n                })\n            )\n        );\n\n        // List of items\n        root.ref.list = root.appendChildView(\n            root.createChildView(listScroller, { translateY: null })\n        );\n\n        // Background panel\n        root.ref.panel = root.appendChildView(root.createChildView(panel, { name: 'panel-root' }));\n\n        // Assistant notifies assistive tech when content changes\n        root.ref.assistant = root.appendChildView(\n            root.createChildView(assistant, Object.assign({}, props))\n        );\n\n        // Data\n        root.ref.data = root.appendChildView(root.createChildView(data, Object.assign({}, props)));\n\n        // Measure (tests if fixed height was set)\n        // DOCTYPE needs to be set for this to work\n        root.ref.measure = createElement$1('div');\n        root.ref.measure.style.height = '100%';\n        root.element.appendChild(root.ref.measure);\n\n        // information on the root height or fixed height status\n        root.ref.bounds = null;\n\n        // apply initial style properties\n        root.query('GET_STYLES')\n            .filter(function(style) {\n                return !isEmpty(style.value);\n            })\n            .map(function(_ref2) {\n                var name = _ref2.name,\n                    value = _ref2.value;\n                root.element.dataset[name] = value;\n            });\n\n        // determine if width changed\n        root.ref.widthPrevious = null;\n        root.ref.widthUpdated = debounce(function() {\n            root.ref.updateHistory = [];\n            root.dispatch('DID_RESIZE_ROOT');\n        }, 250);\n\n        // history of updates\n        root.ref.previousAspectRatio = null;\n        root.ref.updateHistory = [];\n\n        // prevent scrolling and zooming on iOS (only if supports pointer events, for then we can enable reorder)\n        var canHover = window.matchMedia('(pointer: fine) and (hover: hover)').matches;\n        var hasPointerEvents = 'PointerEvent' in window;\n        if (root.query('GET_ALLOW_REORDER') && hasPointerEvents && !canHover) {\n            root.element.addEventListener('touchmove', prevent, { passive: false });\n            root.element.addEventListener('gesturestart', prevent);\n        }\n\n        // add credits\n        var credits = root.query('GET_CREDITS');\n        var hasCredits = credits.length === 2;\n        if (hasCredits) {\n            var frag = document.createElement('a');\n            frag.className = 'filepond--credits';\n            frag.href = credits[0];\n            frag.tabIndex = -1;\n            frag.target = '_blank';\n            frag.rel = 'noopener noreferrer nofollow';\n            frag.textContent = credits[1];\n            root.element.appendChild(frag);\n            root.ref.credits = frag;\n        }\n    };\n\n    var write$9 = function write(_ref3) {\n        var root = _ref3.root,\n            props = _ref3.props,\n            actions = _ref3.actions;\n        // route actions\n        route$5({ root: root, props: props, actions: actions });\n\n        // apply style properties\n        actions\n            .filter(function(action) {\n                return /^DID_SET_STYLE_/.test(action.type);\n            })\n            .filter(function(action) {\n                return !isEmpty(action.data.value);\n            })\n            .map(function(_ref4) {\n                var type = _ref4.type,\n                    data = _ref4.data;\n                var name = toCamels(type.substring(8).toLowerCase(), '_');\n                root.element.dataset[name] = data.value;\n                root.invalidateLayout();\n            });\n\n        if (root.rect.element.hidden) return;\n\n        if (root.rect.element.width !== root.ref.widthPrevious) {\n            root.ref.widthPrevious = root.rect.element.width;\n            root.ref.widthUpdated();\n        }\n\n        // get box bounds, we do this only once\n        var bounds = root.ref.bounds;\n        if (!bounds) {\n            bounds = root.ref.bounds = calculateRootBoundingBoxHeight(root);\n\n            // destroy measure element\n            root.element.removeChild(root.ref.measure);\n            root.ref.measure = null;\n        }\n\n        // get quick references to various high level parts of the upload tool\n        var _root$ref = root.ref,\n            hopper = _root$ref.hopper,\n            label = _root$ref.label,\n            list = _root$ref.list,\n            panel = _root$ref.panel;\n\n        // sets correct state to hopper scope\n        if (hopper) {\n            hopper.updateHopperState();\n        }\n\n        // bool to indicate if we're full or not\n        var aspectRatio = root.query('GET_PANEL_ASPECT_RATIO');\n        var isMultiItem = root.query('GET_ALLOW_MULTIPLE');\n        var totalItems = root.query('GET_TOTAL_ITEMS');\n        var maxItems = isMultiItem ? root.query('GET_MAX_FILES') || MAX_FILES_LIMIT : 1;\n        var atMaxCapacity = totalItems === maxItems;\n\n        // action used to add item\n        var addAction = actions.find(function(action) {\n            return action.type === 'DID_ADD_ITEM';\n        });\n\n        // if reached max capacity and we've just reached it\n        if (atMaxCapacity && addAction) {\n            // get interaction type\n            var interactionMethod = addAction.data.interactionMethod;\n\n            // hide label\n            label.opacity = 0;\n\n            if (isMultiItem) {\n                label.translateY = -40;\n            } else {\n                if (interactionMethod === InteractionMethod.API) {\n                    label.translateX = 40;\n                } else if (interactionMethod === InteractionMethod.BROWSE) {\n                    label.translateY = 40;\n                } else {\n                    label.translateY = 30;\n                }\n            }\n        } else if (!atMaxCapacity) {\n            label.opacity = 1;\n            label.translateX = 0;\n            label.translateY = 0;\n        }\n\n        var listItemMargin = calculateListItemMargin(root);\n\n        var listHeight = calculateListHeight(root);\n\n        var labelHeight = label.rect.element.height;\n        var currentLabelHeight = !isMultiItem || atMaxCapacity ? 0 : labelHeight;\n\n        var listMarginTop = atMaxCapacity ? list.rect.element.marginTop : 0;\n        var listMarginBottom = totalItems === 0 ? 0 : list.rect.element.marginBottom;\n\n        var visualHeight =\n            currentLabelHeight + listMarginTop + listHeight.visual + listMarginBottom;\n        var boundsHeight =\n            currentLabelHeight + listMarginTop + listHeight.bounds + listMarginBottom;\n\n        // link list to label bottom position\n        list.translateY =\n            Math.max(0, currentLabelHeight - list.rect.element.marginTop) - listItemMargin.top;\n\n        if (aspectRatio) {\n            // fixed aspect ratio\n\n            // calculate height based on width\n            var width = root.rect.element.width;\n            var height = width * aspectRatio;\n\n            // clear history if aspect ratio has changed\n            if (aspectRatio !== root.ref.previousAspectRatio) {\n                root.ref.previousAspectRatio = aspectRatio;\n                root.ref.updateHistory = [];\n            }\n\n            // remember this width\n            var history = root.ref.updateHistory;\n            history.push(width);\n\n            var MAX_BOUNCES = 2;\n            if (history.length > MAX_BOUNCES * 2) {\n                var l = history.length;\n                var bottom = l - 10;\n                var bounces = 0;\n                for (var i = l; i >= bottom; i--) {\n                    if (history[i] === history[i - 2]) {\n                        bounces++;\n                    }\n\n                    if (bounces >= MAX_BOUNCES) {\n                        // dont adjust height\n                        return;\n                    }\n                }\n            }\n\n            // fix height of panel so it adheres to aspect ratio\n            panel.scalable = false;\n            panel.height = height;\n\n            // available height for list\n            var listAvailableHeight =\n                // the height of the panel minus the label height\n                height -\n                currentLabelHeight -\n                // the room we leave open between the end of the list and the panel bottom\n                (listMarginBottom - listItemMargin.bottom) -\n                // if we're full we need to leave some room between the top of the panel and the list\n                (atMaxCapacity ? listMarginTop : 0);\n\n            if (listHeight.visual > listAvailableHeight) {\n                list.overflow = listAvailableHeight;\n            } else {\n                list.overflow = null;\n            }\n\n            // set container bounds (so pushes siblings downwards)\n            root.height = height;\n        } else if (bounds.fixedHeight) {\n            // fixed height\n\n            // fix height of panel\n            panel.scalable = false;\n\n            // available height for list\n            var _listAvailableHeight =\n                // the height of the panel minus the label height\n                bounds.fixedHeight -\n                currentLabelHeight -\n                // the room we leave open between the end of the list and the panel bottom\n                (listMarginBottom - listItemMargin.bottom) -\n                // if we're full we need to leave some room between the top of the panel and the list\n                (atMaxCapacity ? listMarginTop : 0);\n\n            // set list height\n            if (listHeight.visual > _listAvailableHeight) {\n                list.overflow = _listAvailableHeight;\n            } else {\n                list.overflow = null;\n            }\n\n            // no need to set container bounds as these are handles by CSS fixed height\n        } else if (bounds.cappedHeight) {\n            // max-height\n\n            // not a fixed height panel\n            var isCappedHeight = visualHeight >= bounds.cappedHeight;\n            var panelHeight = Math.min(bounds.cappedHeight, visualHeight);\n            panel.scalable = true;\n            panel.height = isCappedHeight\n                ? panelHeight\n                : panelHeight - listItemMargin.top - listItemMargin.bottom;\n\n            // available height for list\n            var _listAvailableHeight2 =\n                // the height of the panel minus the label height\n                panelHeight -\n                currentLabelHeight -\n                // the room we leave open between the end of the list and the panel bottom\n                (listMarginBottom - listItemMargin.bottom) -\n                // if we're full we need to leave some room between the top of the panel and the list\n                (atMaxCapacity ? listMarginTop : 0);\n\n            // set list height (if is overflowing)\n            if (visualHeight > bounds.cappedHeight && listHeight.visual > _listAvailableHeight2) {\n                list.overflow = _listAvailableHeight2;\n            } else {\n                list.overflow = null;\n            }\n\n            // set container bounds (so pushes siblings downwards)\n            root.height = Math.min(\n                bounds.cappedHeight,\n                boundsHeight - listItemMargin.top - listItemMargin.bottom\n            );\n        } else {\n            // flexible height\n\n            // not a fixed height panel\n            var itemMargin = totalItems > 0 ? listItemMargin.top + listItemMargin.bottom : 0;\n            panel.scalable = true;\n            panel.height = Math.max(labelHeight, visualHeight - itemMargin);\n\n            // set container bounds (so pushes siblings downwards)\n            root.height = Math.max(labelHeight, boundsHeight - itemMargin);\n        }\n\n        // move credits to bottom\n        if (root.ref.credits && panel.heightCurrent)\n            root.ref.credits.style.transform = 'translateY(' + panel.heightCurrent + 'px)';\n    };\n\n    var calculateListItemMargin = function calculateListItemMargin(root) {\n        var item = root.ref.list.childViews[0].childViews[0];\n        return item\n            ? {\n                  top: item.rect.element.marginTop,\n                  bottom: item.rect.element.marginBottom,\n              }\n            : {\n                  top: 0,\n                  bottom: 0,\n              };\n    };\n\n    var calculateListHeight = function calculateListHeight(root) {\n        var visual = 0;\n        var bounds = 0;\n\n        // get file list reference\n        var scrollList = root.ref.list;\n        var itemList = scrollList.childViews[0];\n        var visibleChildren = itemList.childViews.filter(function(child) {\n            return child.rect.element.height;\n        });\n        var children = root\n            .query('GET_ACTIVE_ITEMS')\n            .map(function(item) {\n                return visibleChildren.find(function(child) {\n                    return child.id === item.id;\n                });\n            })\n            .filter(function(item) {\n                return item;\n            });\n\n        // no children, done!\n        if (children.length === 0) return { visual: visual, bounds: bounds };\n\n        var horizontalSpace = itemList.rect.element.width;\n        var dragIndex = getItemIndexByPosition(itemList, children, scrollList.dragCoordinates);\n\n        var childRect = children[0].rect.element;\n\n        var itemVerticalMargin = childRect.marginTop + childRect.marginBottom;\n        var itemHorizontalMargin = childRect.marginLeft + childRect.marginRight;\n\n        var itemWidth = childRect.width + itemHorizontalMargin;\n        var itemHeight = childRect.height + itemVerticalMargin;\n\n        var newItem = typeof dragIndex !== 'undefined' && dragIndex >= 0 ? 1 : 0;\n        var removedItem = children.find(function(child) {\n            return child.markedForRemoval && child.opacity < 0.45;\n        })\n            ? -1\n            : 0;\n        var verticalItemCount = children.length + newItem + removedItem;\n        var itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth);\n\n        // stack\n        if (itemsPerRow === 1) {\n            children.forEach(function(item) {\n                var height = item.rect.element.height + itemVerticalMargin;\n                bounds += height;\n                visual += height * item.opacity;\n            });\n        }\n        // grid\n        else {\n            bounds = Math.ceil(verticalItemCount / itemsPerRow) * itemHeight;\n            visual = bounds;\n        }\n\n        return { visual: visual, bounds: bounds };\n    };\n\n    var calculateRootBoundingBoxHeight = function calculateRootBoundingBoxHeight(root) {\n        var height = root.ref.measureHeight || null;\n        var cappedHeight = parseInt(root.style.maxHeight, 10) || null;\n        var fixedHeight = height === 0 ? null : height;\n\n        return {\n            cappedHeight: cappedHeight,\n            fixedHeight: fixedHeight,\n        };\n    };\n\n    var exceedsMaxFiles = function exceedsMaxFiles(root, items) {\n        var allowReplace = root.query('GET_ALLOW_REPLACE');\n        var allowMultiple = root.query('GET_ALLOW_MULTIPLE');\n        var totalItems = root.query('GET_TOTAL_ITEMS');\n        var maxItems = root.query('GET_MAX_FILES');\n\n        // total amount of items being dragged\n        var totalBrowseItems = items.length;\n\n        // if does not allow multiple items and dragging more than one item\n        if (!allowMultiple && totalBrowseItems > 1) {\n            root.dispatch('DID_THROW_MAX_FILES', {\n                source: items,\n                error: createResponse('warning', 0, 'Max files'),\n            });\n\n            return true;\n        }\n\n        // limit max items to one if not allowed to drop multiple items\n        maxItems = allowMultiple ? maxItems : 1;\n\n        if (!allowMultiple && allowReplace) {\n            // There is only one item, so there is room to replace or add an item\n            return false;\n        }\n\n        // no more room?\n        var hasMaxItems = isInt(maxItems);\n        if (hasMaxItems && totalItems + totalBrowseItems > maxItems) {\n            root.dispatch('DID_THROW_MAX_FILES', {\n                source: items,\n                error: createResponse('warning', 0, 'Max files'),\n            });\n\n            return true;\n        }\n\n        return false;\n    };\n\n    var getDragIndex = function getDragIndex(list, children, position) {\n        var itemList = list.childViews[0];\n        return getItemIndexByPosition(itemList, children, {\n            left: position.scopeLeft - itemList.rect.element.left,\n            top:\n                position.scopeTop -\n                (list.rect.outer.top + list.rect.element.marginTop + list.rect.element.scrollTop),\n        });\n    };\n\n    /**\n     * Enable or disable file drop functionality\n     */\n    var toggleDrop = function toggleDrop(root) {\n        var isAllowed = root.query('GET_ALLOW_DROP');\n        var isDisabled = root.query('GET_DISABLED');\n        var enabled = isAllowed && !isDisabled;\n        if (enabled && !root.ref.hopper) {\n            var hopper = createHopper(\n                root.element,\n                function(items) {\n                    // allow quick validation of dropped items\n                    var beforeDropFile =\n                        root.query('GET_BEFORE_DROP_FILE') ||\n                        function() {\n                            return true;\n                        };\n\n                    // all items should be validated by all filters as valid\n                    var dropValidation = root.query('GET_DROP_VALIDATION');\n                    return dropValidation\n                        ? items.every(function(item) {\n                              return (\n                                  applyFilters('ALLOW_HOPPER_ITEM', item, {\n                                      query: root.query,\n                                  }).every(function(result) {\n                                      return result === true;\n                                  }) && beforeDropFile(item)\n                              );\n                          })\n                        : true;\n                },\n                {\n                    filterItems: function filterItems(items) {\n                        var ignoredFiles = root.query('GET_IGNORED_FILES');\n                        return items.filter(function(item) {\n                            if (isFile(item)) {\n                                return !ignoredFiles.includes(item.name.toLowerCase());\n                            }\n                            return true;\n                        });\n                    },\n                    catchesDropsOnPage: root.query('GET_DROP_ON_PAGE'),\n                    requiresDropOnElement: root.query('GET_DROP_ON_ELEMENT'),\n                }\n            );\n\n            hopper.onload = function(items, position) {\n                // get item children elements and sort based on list sort\n                var list = root.ref.list.childViews[0];\n                var visibleChildren = list.childViews.filter(function(child) {\n                    return child.rect.element.height;\n                });\n                var children = root\n                    .query('GET_ACTIVE_ITEMS')\n                    .map(function(item) {\n                        return visibleChildren.find(function(child) {\n                            return child.id === item.id;\n                        });\n                    })\n                    .filter(function(item) {\n                        return item;\n                    });\n\n                applyFilterChain('ADD_ITEMS', items, { dispatch: root.dispatch }).then(function(\n                    queue\n                ) {\n                    // these files don't fit so stop here\n                    if (exceedsMaxFiles(root, queue)) return false;\n\n                    // go\n                    root.dispatch('ADD_ITEMS', {\n                        items: queue,\n                        index: getDragIndex(root.ref.list, children, position),\n                        interactionMethod: InteractionMethod.DROP,\n                    });\n                });\n\n                root.dispatch('DID_DROP', { position: position });\n\n                root.dispatch('DID_END_DRAG', { position: position });\n            };\n\n            hopper.ondragstart = function(position) {\n                root.dispatch('DID_START_DRAG', { position: position });\n            };\n\n            hopper.ondrag = debounce(function(position) {\n                root.dispatch('DID_DRAG', { position: position });\n            });\n\n            hopper.ondragend = function(position) {\n                root.dispatch('DID_END_DRAG', { position: position });\n            };\n\n            root.ref.hopper = hopper;\n\n            root.ref.drip = root.appendChildView(root.createChildView(drip));\n        } else if (!enabled && root.ref.hopper) {\n            root.ref.hopper.destroy();\n            root.ref.hopper = null;\n            root.removeChildView(root.ref.drip);\n        }\n    };\n\n    /**\n     * Enable or disable browse functionality\n     */\n    var toggleBrowse = function toggleBrowse(root, props) {\n        var isAllowed = root.query('GET_ALLOW_BROWSE');\n        var isDisabled = root.query('GET_DISABLED');\n        var enabled = isAllowed && !isDisabled;\n        if (enabled && !root.ref.browser) {\n            root.ref.browser = root.appendChildView(\n                root.createChildView(\n                    browser,\n                    Object.assign({}, props, {\n                        onload: function onload(items) {\n                            applyFilterChain('ADD_ITEMS', items, {\n                                dispatch: root.dispatch,\n                            }).then(function(queue) {\n                                // these files don't fit so stop here\n                                if (exceedsMaxFiles(root, queue)) return false;\n\n                                // add items!\n                                root.dispatch('ADD_ITEMS', {\n                                    items: queue,\n                                    index: -1,\n                                    interactionMethod: InteractionMethod.BROWSE,\n                                });\n                            });\n                        },\n                    })\n                ),\n\n                0\n            );\n        } else if (!enabled && root.ref.browser) {\n            root.removeChildView(root.ref.browser);\n            root.ref.browser = null;\n        }\n    };\n\n    /**\n     * Enable or disable paste functionality\n     */\n    var togglePaste = function togglePaste(root) {\n        var isAllowed = root.query('GET_ALLOW_PASTE');\n        var isDisabled = root.query('GET_DISABLED');\n        var enabled = isAllowed && !isDisabled;\n        if (enabled && !root.ref.paster) {\n            root.ref.paster = createPaster();\n            root.ref.paster.onload = function(items) {\n                applyFilterChain('ADD_ITEMS', items, { dispatch: root.dispatch }).then(function(\n                    queue\n                ) {\n                    // these files don't fit so stop here\n                    if (exceedsMaxFiles(root, queue)) return false;\n\n                    // add items!\n                    root.dispatch('ADD_ITEMS', {\n                        items: queue,\n                        index: -1,\n                        interactionMethod: InteractionMethod.PASTE,\n                    });\n                });\n            };\n        } else if (!enabled && root.ref.paster) {\n            root.ref.paster.destroy();\n            root.ref.paster = null;\n        }\n    };\n\n    /**\n     * Route actions\n     */\n    var route$5 = createRoute({\n        DID_SET_ALLOW_BROWSE: function DID_SET_ALLOW_BROWSE(_ref5) {\n            var root = _ref5.root,\n                props = _ref5.props;\n            toggleBrowse(root, props);\n        },\n        DID_SET_ALLOW_DROP: function DID_SET_ALLOW_DROP(_ref6) {\n            var root = _ref6.root;\n            toggleDrop(root);\n        },\n        DID_SET_ALLOW_PASTE: function DID_SET_ALLOW_PASTE(_ref7) {\n            var root = _ref7.root;\n            togglePaste(root);\n        },\n        DID_SET_DISABLED: function DID_SET_DISABLED(_ref8) {\n            var root = _ref8.root,\n                props = _ref8.props;\n            toggleDrop(root);\n            togglePaste(root);\n            toggleBrowse(root, props);\n            var isDisabled = root.query('GET_DISABLED');\n            if (isDisabled) {\n                root.element.dataset.disabled = 'disabled';\n            } else {\n                // delete root.element.dataset.disabled; <= this does not work on iOS 10\n                root.element.removeAttribute('data-disabled');\n            }\n        },\n    });\n\n    var root = createView({\n        name: 'root',\n        read: function read(_ref9) {\n            var root = _ref9.root;\n            if (root.ref.measure) {\n                root.ref.measureHeight = root.ref.measure.offsetHeight;\n            }\n        },\n        create: create$e,\n        write: write$9,\n        destroy: function destroy(_ref10) {\n            var root = _ref10.root;\n            if (root.ref.paster) {\n                root.ref.paster.destroy();\n            }\n            if (root.ref.hopper) {\n                root.ref.hopper.destroy();\n            }\n            root.element.removeEventListener('touchmove', prevent);\n            root.element.removeEventListener('gesturestart', prevent);\n        },\n        mixins: {\n            styles: ['height'],\n        },\n    });\n\n    // creates the app\n    var createApp = function createApp() {\n        var initialOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        // let element\n        var originalElement = null;\n\n        // get default options\n        var defaultOptions = getOptions();\n\n        // create the data store, this will contain all our app info\n        var store = createStore(\n            // initial state (should be serializable)\n            createInitialState(defaultOptions),\n\n            // queries\n            [queries, createOptionQueries(defaultOptions)],\n\n            // action handlers\n            [actions, createOptionActions(defaultOptions)]\n        );\n\n        // set initial options\n        store.dispatch('SET_OPTIONS', { options: initialOptions });\n\n        // kick thread if visibility changes\n        var visibilityHandler = function visibilityHandler() {\n            if (document.hidden) return;\n            store.dispatch('KICK');\n        };\n        document.addEventListener('visibilitychange', visibilityHandler);\n\n        // re-render on window resize start and finish\n        var resizeDoneTimer = null;\n        var isResizing = false;\n        var isResizingHorizontally = false;\n        var initialWindowWidth = null;\n        var currentWindowWidth = null;\n        var resizeHandler = function resizeHandler() {\n            if (!isResizing) {\n                isResizing = true;\n            }\n            clearTimeout(resizeDoneTimer);\n            resizeDoneTimer = setTimeout(function() {\n                isResizing = false;\n                initialWindowWidth = null;\n                currentWindowWidth = null;\n                if (isResizingHorizontally) {\n                    isResizingHorizontally = false;\n                    store.dispatch('DID_STOP_RESIZE');\n                }\n            }, 500);\n        };\n        window.addEventListener('resize', resizeHandler);\n\n        // render initial view\n        var view = root(store, { id: getUniqueId() });\n\n        //\n        // PRIVATE API -------------------------------------------------------------------------------------\n        //\n        var isResting = false;\n        var isHidden = false;\n\n        var readWriteApi = {\n            // necessary for update loop\n\n            /**\n             * Reads from dom (never call manually)\n             * @private\n             */\n            _read: function _read() {\n                // test if we're resizing horizontally\n                // TODO: see if we can optimize this by measuring root rect\n                if (isResizing) {\n                    currentWindowWidth = window.innerWidth;\n                    if (!initialWindowWidth) {\n                        initialWindowWidth = currentWindowWidth;\n                    }\n\n                    if (!isResizingHorizontally && currentWindowWidth !== initialWindowWidth) {\n                        store.dispatch('DID_START_RESIZE');\n                        isResizingHorizontally = true;\n                    }\n                }\n\n                if (isHidden && isResting) {\n                    // test if is no longer hidden\n                    isResting = view.element.offsetParent === null;\n                }\n\n                // if resting, no need to read as numbers will still all be correct\n                if (isResting) return;\n\n                // read view data\n                view._read();\n\n                // if is hidden we need to know so we exit rest mode when revealed\n                isHidden = view.rect.element.hidden;\n            },\n\n            /**\n             * Writes to dom (never call manually)\n             * @private\n             */\n            _write: function _write(ts) {\n                // get all actions from store\n                var actions = store\n                    .processActionQueue()\n\n                    // filter out set actions (these will automatically trigger DID_SET)\n                    .filter(function(action) {\n                        return !/^SET_/.test(action.type);\n                    });\n\n                // if was idling and no actions stop here\n                if (isResting && !actions.length) return;\n\n                // some actions might trigger events\n                routeActionsToEvents(actions);\n\n                // update the view\n                isResting = view._write(ts, actions, isResizingHorizontally);\n\n                // will clean up all archived items\n                removeReleasedItems(store.query('GET_ITEMS'));\n\n                // now idling\n                if (isResting) {\n                    store.processDispatchQueue();\n                }\n            },\n        };\n\n        //\n        // EXPOSE EVENTS -------------------------------------------------------------------------------------\n        //\n        var createEvent = function createEvent(name) {\n            return function(data) {\n                // create default event\n                var event = {\n                    type: name,\n                };\n\n                // no data to add\n                if (!data) {\n                    return event;\n                }\n\n                // copy relevant props\n                if (data.hasOwnProperty('error')) {\n                    event.error = data.error ? Object.assign({}, data.error) : null;\n                }\n\n                if (data.status) {\n                    event.status = Object.assign({}, data.status);\n                }\n\n                if (data.file) {\n                    event.output = data.file;\n                }\n\n                // only source is available, else add item if possible\n                if (data.source) {\n                    event.file = data.source;\n                } else if (data.item || data.id) {\n                    var item = data.item ? data.item : store.query('GET_ITEM', data.id);\n                    event.file = item ? createItemAPI(item) : null;\n                }\n\n                // map all items in a possible items array\n                if (data.items) {\n                    event.items = data.items.map(createItemAPI);\n                }\n\n                // if this is a progress event add the progress amount\n                if (/progress/.test(name)) {\n                    event.progress = data.progress;\n                }\n\n                // copy relevant props\n                if (data.hasOwnProperty('origin') && data.hasOwnProperty('target')) {\n                    event.origin = data.origin;\n                    event.target = data.target;\n                }\n\n                return event;\n            };\n        };\n\n        var eventRoutes = {\n            DID_DESTROY: createEvent('destroy'),\n\n            DID_INIT: createEvent('init'),\n\n            DID_THROW_MAX_FILES: createEvent('warning'),\n\n            DID_INIT_ITEM: createEvent('initfile'),\n            DID_START_ITEM_LOAD: createEvent('addfilestart'),\n            DID_UPDATE_ITEM_LOAD_PROGRESS: createEvent('addfileprogress'),\n            DID_LOAD_ITEM: createEvent('addfile'),\n\n            DID_THROW_ITEM_INVALID: [createEvent('error'), createEvent('addfile')],\n\n            DID_THROW_ITEM_LOAD_ERROR: [createEvent('error'), createEvent('addfile')],\n\n            DID_THROW_ITEM_REMOVE_ERROR: [createEvent('error'), createEvent('removefile')],\n\n            DID_PREPARE_OUTPUT: createEvent('preparefile'),\n\n            DID_START_ITEM_PROCESSING: createEvent('processfilestart'),\n            DID_UPDATE_ITEM_PROCESS_PROGRESS: createEvent('processfileprogress'),\n            DID_ABORT_ITEM_PROCESSING: createEvent('processfileabort'),\n            DID_COMPLETE_ITEM_PROCESSING: createEvent('processfile'),\n            DID_COMPLETE_ITEM_PROCESSING_ALL: createEvent('processfiles'),\n            DID_REVERT_ITEM_PROCESSING: createEvent('processfilerevert'),\n\n            DID_THROW_ITEM_PROCESSING_ERROR: [createEvent('error'), createEvent('processfile')],\n\n            DID_REMOVE_ITEM: createEvent('removefile'),\n\n            DID_UPDATE_ITEMS: createEvent('updatefiles'),\n\n            DID_ACTIVATE_ITEM: createEvent('activatefile'),\n\n            DID_REORDER_ITEMS: createEvent('reorderfiles'),\n        };\n\n        var exposeEvent = function exposeEvent(event) {\n            // create event object to be dispatched\n            var detail = Object.assign({ pond: exports }, event);\n            delete detail.type;\n            view.element.dispatchEvent(\n                new CustomEvent('FilePond:' + event.type, {\n                    // event info\n                    detail: detail,\n\n                    // event behaviour\n                    bubbles: true,\n                    cancelable: true,\n                    composed: true, // triggers listeners outside of shadow root\n                })\n            );\n\n            // event object to params used for `on()` event handlers and callbacks `oninit()`\n            var params = [];\n\n            // if is possible error event, make it the first param\n            if (event.hasOwnProperty('error')) {\n                params.push(event.error);\n            }\n\n            // file is always section\n            if (event.hasOwnProperty('file')) {\n                params.push(event.file);\n            }\n\n            // append other props\n            var filtered = ['type', 'error', 'file'];\n            Object.keys(event)\n                .filter(function(key) {\n                    return !filtered.includes(key);\n                })\n                .forEach(function(key) {\n                    return params.push(event[key]);\n                });\n\n            // on(type, () => { })\n            exports.fire.apply(exports, [event.type].concat(params));\n\n            // oninit = () => {}\n            var handler = store.query('GET_ON' + event.type.toUpperCase());\n            if (handler) {\n                handler.apply(void 0, params);\n            }\n        };\n\n        var routeActionsToEvents = function routeActionsToEvents(actions) {\n            if (!actions.length) return;\n            actions\n                .filter(function(action) {\n                    return eventRoutes[action.type];\n                })\n                .forEach(function(action) {\n                    var routes = eventRoutes[action.type];\n                    (Array.isArray(routes) ? routes : [routes]).forEach(function(route) {\n                        // this isn't fantastic, but because of the stacking of settimeouts plugins can handle the did_load before the did_init\n                        if (action.type === 'DID_INIT_ITEM') {\n                            exposeEvent(route(action.data));\n                        } else {\n                            setTimeout(function() {\n                                exposeEvent(route(action.data));\n                            }, 0);\n                        }\n                    });\n                });\n        };\n\n        //\n        // PUBLIC API -------------------------------------------------------------------------------------\n        //\n        var setOptions = function setOptions(options) {\n            return store.dispatch('SET_OPTIONS', { options: options });\n        };\n\n        var getFile = function getFile(query) {\n            return store.query('GET_ACTIVE_ITEM', query);\n        };\n\n        var prepareFile = function prepareFile(query) {\n            return new Promise(function(resolve, reject) {\n                store.dispatch('REQUEST_ITEM_PREPARE', {\n                    query: query,\n                    success: function success(item) {\n                        resolve(item);\n                    },\n                    failure: function failure(error) {\n                        reject(error);\n                    },\n                });\n            });\n        };\n\n        var addFile = function addFile(source) {\n            var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n            return new Promise(function(resolve, reject) {\n                addFiles([{ source: source, options: options }], { index: options.index })\n                    .then(function(items) {\n                        return resolve(items && items[0]);\n                    })\n                    .catch(reject);\n            });\n        };\n\n        var isFilePondFile = function isFilePondFile(obj) {\n            return obj.file && obj.id;\n        };\n\n        var removeFile = function removeFile(query, options) {\n            // if only passed options\n            if (typeof query === 'object' && !isFilePondFile(query) && !options) {\n                options = query;\n                query = undefined;\n            }\n\n            // request item removal\n            store.dispatch('REMOVE_ITEM', Object.assign({}, options, { query: query }));\n\n            // see if item has been removed\n            return store.query('GET_ACTIVE_ITEM', query) === null;\n        };\n\n        var addFiles = function addFiles() {\n            for (\n                var _len = arguments.length, args = new Array(_len), _key = 0;\n                _key < _len;\n                _key++\n            ) {\n                args[_key] = arguments[_key];\n            }\n            return new Promise(function(resolve, reject) {\n                var sources = [];\n                var options = {};\n\n                // user passed a sources array\n                if (isArray(args[0])) {\n                    sources.push.apply(sources, args[0]);\n                    Object.assign(options, args[1] || {});\n                } else {\n                    // user passed sources as arguments, last one might be options object\n                    var lastArgument = args[args.length - 1];\n                    if (typeof lastArgument === 'object' && !(lastArgument instanceof Blob)) {\n                        Object.assign(options, args.pop());\n                    }\n\n                    // add rest to sources\n                    sources.push.apply(sources, args);\n                }\n\n                store.dispatch('ADD_ITEMS', {\n                    items: sources,\n                    index: options.index,\n                    interactionMethod: InteractionMethod.API,\n                    success: resolve,\n                    failure: reject,\n                });\n            });\n        };\n\n        var getFiles = function getFiles() {\n            return store.query('GET_ACTIVE_ITEMS');\n        };\n\n        var processFile = function processFile(query) {\n            return new Promise(function(resolve, reject) {\n                store.dispatch('REQUEST_ITEM_PROCESSING', {\n                    query: query,\n                    success: function success(item) {\n                        resolve(item);\n                    },\n                    failure: function failure(error) {\n                        reject(error);\n                    },\n                });\n            });\n        };\n\n        var prepareFiles = function prepareFiles() {\n            for (\n                var _len2 = arguments.length, args = new Array(_len2), _key2 = 0;\n                _key2 < _len2;\n                _key2++\n            ) {\n                args[_key2] = arguments[_key2];\n            }\n            var queries = Array.isArray(args[0]) ? args[0] : args;\n            var items = queries.length ? queries : getFiles();\n            return Promise.all(items.map(prepareFile));\n        };\n\n        var processFiles = function processFiles() {\n            for (\n                var _len3 = arguments.length, args = new Array(_len3), _key3 = 0;\n                _key3 < _len3;\n                _key3++\n            ) {\n                args[_key3] = arguments[_key3];\n            }\n            var queries = Array.isArray(args[0]) ? args[0] : args;\n            if (!queries.length) {\n                var files = getFiles().filter(function(item) {\n                    return (\n                        !(item.status === ItemStatus.IDLE && item.origin === FileOrigin.LOCAL) &&\n                        item.status !== ItemStatus.PROCESSING &&\n                        item.status !== ItemStatus.PROCESSING_COMPLETE &&\n                        item.status !== ItemStatus.PROCESSING_REVERT_ERROR\n                    );\n                });\n\n                return Promise.all(files.map(processFile));\n            }\n            return Promise.all(queries.map(processFile));\n        };\n\n        var removeFiles = function removeFiles() {\n            for (\n                var _len4 = arguments.length, args = new Array(_len4), _key4 = 0;\n                _key4 < _len4;\n                _key4++\n            ) {\n                args[_key4] = arguments[_key4];\n            }\n\n            var queries = Array.isArray(args[0]) ? args[0] : args;\n\n            var options;\n            if (typeof queries[queries.length - 1] === 'object') {\n                options = queries.pop();\n            } else if (Array.isArray(args[0])) {\n                options = args[1];\n            }\n\n            var files = getFiles();\n\n            if (!queries.length)\n                return Promise.all(\n                    files.map(function(file) {\n                        return removeFile(file, options);\n                    })\n                );\n\n            // when removing by index the indexes shift after each file removal so we need to convert indexes to ids\n            var mappedQueries = queries\n                .map(function(query) {\n                    return isNumber(query) ? (files[query] ? files[query].id : null) : query;\n                })\n                .filter(function(query) {\n                    return query;\n                });\n\n            return mappedQueries.map(function(q) {\n                return removeFile(q, options);\n            });\n        };\n\n        var exports = Object.assign(\n            {},\n\n            on(),\n            {},\n\n            readWriteApi,\n            {},\n\n            createOptionAPI(store, defaultOptions),\n            {\n                /**\n                 * Override options defined in options object\n                 * @param options\n                 */\n                setOptions: setOptions,\n\n                /**\n                 * Load the given file\n                 * @param source - the source of the file (either a File, base64 data uri or url)\n                 * @param options - object, { index: 0 }\n                 */\n                addFile: addFile,\n\n                /**\n                 * Load the given files\n                 * @param sources - the sources of the files to load\n                 * @param options - object, { index: 0 }\n                 */\n                addFiles: addFiles,\n\n                /**\n                 * Returns the file objects matching the given query\n                 * @param query { string, number, null }\n                 */\n                getFile: getFile,\n\n                /**\n                 * Upload file with given name\n                 * @param query { string, number, null  }\n                 */\n                processFile: processFile,\n\n                /**\n                 * Request prepare output for file with given name\n                 * @param query { string, number, null  }\n                 */\n                prepareFile: prepareFile,\n\n                /**\n                 * Removes a file by its name\n                 * @param query { string, number, null  }\n                 */\n                removeFile: removeFile,\n\n                /**\n                 * Moves a file to a new location in the files list\n                 */\n                moveFile: function moveFile(query, index) {\n                    return store.dispatch('MOVE_ITEM', { query: query, index: index });\n                },\n\n                /**\n                 * Returns all files (wrapped in public api)\n                 */\n                getFiles: getFiles,\n\n                /**\n                 * Starts uploading all files\n                 */\n                processFiles: processFiles,\n\n                /**\n                 * Clears all files from the files list\n                 */\n                removeFiles: removeFiles,\n\n                /**\n                 * Starts preparing output of all files\n                 */\n                prepareFiles: prepareFiles,\n\n                /**\n                 * Sort list of files\n                 */\n                sort: function sort(compare) {\n                    return store.dispatch('SORT', { compare: compare });\n                },\n\n                /**\n                 * Browse the file system for a file\n                 */\n                browse: function browse() {\n                    // needs to be trigger directly as user action needs to be traceable (is not traceable in requestAnimationFrame)\n                    var input = view.element.querySelector('input[type=file]');\n                    if (input) {\n                        input.click();\n                    }\n                },\n\n                /**\n                 * Destroys the app\n                 */\n                destroy: function destroy() {\n                    // request destruction\n                    exports.fire('destroy', view.element);\n\n                    // stop active processes (file uploads, fetches, stuff like that)\n                    // loop over items and depending on states call abort for ongoing processes\n                    store.dispatch('ABORT_ALL');\n\n                    // destroy view\n                    view._destroy();\n\n                    // stop listening to resize\n                    window.removeEventListener('resize', resizeHandler);\n\n                    // stop listening to the visiblitychange event\n                    document.removeEventListener('visibilitychange', visibilityHandler);\n\n                    // dispatch destroy\n                    store.dispatch('DID_DESTROY');\n                },\n\n                /**\n                 * Inserts the plugin before the target element\n                 */\n                insertBefore: function insertBefore$1(element) {\n                    return insertBefore(view.element, element);\n                },\n\n                /**\n                 * Inserts the plugin after the target element\n                 */\n                insertAfter: function insertAfter$1(element) {\n                    return insertAfter(view.element, element);\n                },\n\n                /**\n                 * Appends the plugin to the target element\n                 */\n                appendTo: function appendTo(element) {\n                    return element.appendChild(view.element);\n                },\n\n                /**\n                 * Replaces an element with the app\n                 */\n                replaceElement: function replaceElement(element) {\n                    // insert the app before the element\n                    insertBefore(view.element, element);\n\n                    // remove the original element\n                    element.parentNode.removeChild(element);\n\n                    // remember original element\n                    originalElement = element;\n                },\n\n                /**\n                 * Restores the original element\n                 */\n                restoreElement: function restoreElement() {\n                    if (!originalElement) {\n                        return; // no element to restore\n                    }\n\n                    // restore original element\n                    insertAfter(originalElement, view.element);\n\n                    // remove our element\n                    view.element.parentNode.removeChild(view.element);\n\n                    // remove reference\n                    originalElement = null;\n                },\n\n                /**\n                 * Returns true if the app root is attached to given element\n                 * @param element\n                 */\n                isAttachedTo: function isAttachedTo(element) {\n                    return view.element === element || originalElement === element;\n                },\n\n                /**\n                 * Returns the root element\n                 */\n                element: {\n                    get: function get() {\n                        return view.element;\n                    },\n                },\n\n                /**\n                 * Returns the current pond status\n                 */\n                status: {\n                    get: function get() {\n                        return store.query('GET_STATUS');\n                    },\n                },\n            }\n        );\n\n        // Done!\n        store.dispatch('DID_INIT');\n\n        // create actual api object\n        return createObject(exports);\n    };\n\n    var createAppObject = function createAppObject() {\n        var customOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        // default options\n        var defaultOptions = {};\n        forin(getOptions(), function(key, value) {\n            defaultOptions[key] = value[0];\n        });\n\n        // set app options\n        var app = createApp(\n            Object.assign(\n                {},\n\n                defaultOptions,\n                {},\n\n                customOptions\n            )\n        );\n\n        // return the plugin instance\n        return app;\n    };\n\n    var lowerCaseFirstLetter = function lowerCaseFirstLetter(string) {\n        return string.charAt(0).toLowerCase() + string.slice(1);\n    };\n\n    var attributeNameToPropertyName = function attributeNameToPropertyName(attributeName) {\n        return toCamels(attributeName.replace(/^data-/, ''));\n    };\n\n    var mapObject = function mapObject(object, propertyMap) {\n        // remove unwanted\n        forin(propertyMap, function(selector, mapping) {\n            forin(object, function(property, value) {\n                // create regexp shortcut\n                var selectorRegExp = new RegExp(selector);\n\n                // tests if\n                var matches = selectorRegExp.test(property);\n\n                // no match, skip\n                if (!matches) {\n                    return;\n                }\n\n                // if there's a mapping, the original property is always removed\n                delete object[property];\n\n                // should only remove, we done!\n                if (mapping === false) {\n                    return;\n                }\n\n                // move value to new property\n                if (isString(mapping)) {\n                    object[mapping] = value;\n                    return;\n                }\n\n                // move to group\n                var group = mapping.group;\n                if (isObject(mapping) && !object[group]) {\n                    object[group] = {};\n                }\n\n                object[group][lowerCaseFirstLetter(property.replace(selectorRegExp, ''))] = value;\n            });\n\n            // do submapping\n            if (mapping.mapping) {\n                mapObject(object[mapping.group], mapping.mapping);\n            }\n        });\n    };\n\n    var getAttributesAsObject = function getAttributesAsObject(node) {\n        var attributeMapping =\n            arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        // turn attributes into object\n        var attributes = [];\n        forin(node.attributes, function(index) {\n            attributes.push(node.attributes[index]);\n        });\n\n        var output = attributes\n            .filter(function(attribute) {\n                return attribute.name;\n            })\n            .reduce(function(obj, attribute) {\n                var value = attr(node, attribute.name);\n\n                obj[attributeNameToPropertyName(attribute.name)] =\n                    value === attribute.name ? true : value;\n                return obj;\n            }, {});\n\n        // do mapping of object properties\n        mapObject(output, attributeMapping);\n\n        return output;\n    };\n\n    var createAppAtElement = function createAppAtElement(element) {\n        var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n        // how attributes of the input element are mapped to the options for the plugin\n        var attributeMapping = {\n            // translate to other name\n            '^class$': 'className',\n            '^multiple$': 'allowMultiple',\n            '^capture$': 'captureMethod',\n            '^webkitdirectory$': 'allowDirectoriesOnly',\n\n            // group under single property\n            '^server': {\n                group: 'server',\n                mapping: {\n                    '^process': {\n                        group: 'process',\n                    },\n\n                    '^revert': {\n                        group: 'revert',\n                    },\n\n                    '^fetch': {\n                        group: 'fetch',\n                    },\n\n                    '^restore': {\n                        group: 'restore',\n                    },\n\n                    '^load': {\n                        group: 'load',\n                    },\n                },\n            },\n\n            // don't include in object\n            '^type$': false,\n            '^files$': false,\n        };\n\n        // add additional option translators\n        applyFilters('SET_ATTRIBUTE_TO_OPTION_MAP', attributeMapping);\n\n        // create final options object by setting options object and then overriding options supplied on element\n        var mergedOptions = Object.assign({}, options);\n\n        var attributeOptions = getAttributesAsObject(\n            element.nodeName === 'FIELDSET' ? element.querySelector('input[type=file]') : element,\n            attributeMapping\n        );\n\n        // merge with options object\n        Object.keys(attributeOptions).forEach(function(key) {\n            if (isObject(attributeOptions[key])) {\n                if (!isObject(mergedOptions[key])) {\n                    mergedOptions[key] = {};\n                }\n                Object.assign(mergedOptions[key], attributeOptions[key]);\n            } else {\n                mergedOptions[key] = attributeOptions[key];\n            }\n        });\n\n        // if parent is a fieldset, get files from parent by selecting all input fields that are not file upload fields\n        // these will then be automatically set to the initial files\n        mergedOptions.files = (options.files || []).concat(\n            Array.from(element.querySelectorAll('input:not([type=file])')).map(function(input) {\n                return {\n                    source: input.value,\n                    options: {\n                        type: input.dataset.type,\n                    },\n                };\n            })\n        );\n\n        // build plugin\n        var app = createAppObject(mergedOptions);\n\n        // add already selected files\n        if (element.files) {\n            Array.from(element.files).forEach(function(file) {\n                app.addFile(file);\n            });\n        }\n\n        // replace the target element\n        app.replaceElement(element);\n\n        // expose\n        return app;\n    };\n\n    // if an element is passed, we create the instance at that element, if not, we just create an up object\n    var createApp$1 = function createApp() {\n        return isNode(arguments.length <= 0 ? undefined : arguments[0])\n            ? createAppAtElement.apply(void 0, arguments)\n            : createAppObject.apply(void 0, arguments);\n    };\n\n    var PRIVATE_METHODS = ['fire', '_read', '_write'];\n\n    var createAppAPI = function createAppAPI(app) {\n        var api = {};\n\n        copyObjectPropertiesToObject(app, api, PRIVATE_METHODS);\n\n        return api;\n    };\n\n    /**\n     * Replaces placeholders in given string with replacements\n     * @param string - \"Foo {bar}\"\"\n     * @param replacements - { \"bar\": 10 }\n     */\n    var replaceInString = function replaceInString(string, replacements) {\n        return string.replace(/(?:{([a-zA-Z]+)})/g, function(match, group) {\n            return replacements[group];\n        });\n    };\n\n    var createWorker = function createWorker(fn) {\n        var workerBlob = new Blob(['(', fn.toString(), ')()'], {\n            type: 'application/javascript',\n        });\n\n        var workerURL = URL.createObjectURL(workerBlob);\n        var worker = new Worker(workerURL);\n\n        return {\n            transfer: function transfer(message, cb) {},\n            post: function post(message, cb, transferList) {\n                var id = getUniqueId();\n\n                worker.onmessage = function(e) {\n                    if (e.data.id === id) {\n                        cb(e.data.message);\n                    }\n                };\n\n                worker.postMessage(\n                    {\n                        id: id,\n                        message: message,\n                    },\n\n                    transferList\n                );\n            },\n            terminate: function terminate() {\n                worker.terminate();\n                URL.revokeObjectURL(workerURL);\n            },\n        };\n    };\n\n    var loadImage = function loadImage(url) {\n        return new Promise(function(resolve, reject) {\n            var img = new Image();\n            img.onload = function() {\n                resolve(img);\n            };\n            img.onerror = function(e) {\n                reject(e);\n            };\n            img.src = url;\n        });\n    };\n\n    var renameFile = function renameFile(file, name) {\n        var renamedFile = file.slice(0, file.size, file.type);\n        renamedFile.lastModifiedDate = file.lastModifiedDate;\n        renamedFile.name = name;\n        return renamedFile;\n    };\n\n    var copyFile = function copyFile(file) {\n        return renameFile(file, file.name);\n    };\n\n    // already registered plugins (can't register twice)\n    var registeredPlugins = [];\n\n    // pass utils to plugin\n    var createAppPlugin = function createAppPlugin(plugin) {\n        // already registered\n        if (registeredPlugins.includes(plugin)) {\n            return;\n        }\n\n        // remember this plugin\n        registeredPlugins.push(plugin);\n\n        // setup!\n        var pluginOutline = plugin({\n            addFilter: addFilter,\n            utils: {\n                Type: Type,\n                forin: forin,\n                isString: isString,\n                isFile: isFile,\n                toNaturalFileSize: toNaturalFileSize,\n                replaceInString: replaceInString,\n                getExtensionFromFilename: getExtensionFromFilename,\n                getFilenameWithoutExtension: getFilenameWithoutExtension,\n                guesstimateMimeType: guesstimateMimeType,\n                getFileFromBlob: getFileFromBlob,\n                getFilenameFromURL: getFilenameFromURL,\n                createRoute: createRoute,\n                createWorker: createWorker,\n                createView: createView,\n                createItemAPI: createItemAPI,\n                loadImage: loadImage,\n                copyFile: copyFile,\n                renameFile: renameFile,\n                createBlob: createBlob,\n                applyFilterChain: applyFilterChain,\n                text: text,\n                getNumericAspectRatioFromString: getNumericAspectRatioFromString,\n            },\n\n            views: {\n                fileActionButton: fileActionButton,\n            },\n        });\n\n        // add plugin options to default options\n        extendDefaultOptions(pluginOutline.options);\n    };\n\n    // feature detection used by supported() method\n    var isOperaMini = function isOperaMini() {\n        return Object.prototype.toString.call(window.operamini) === '[object OperaMini]';\n    };\n    var hasPromises = function hasPromises() {\n        return 'Promise' in window;\n    };\n    var hasBlobSlice = function hasBlobSlice() {\n        return 'slice' in Blob.prototype;\n    };\n    var hasCreateObjectURL = function hasCreateObjectURL() {\n        return 'URL' in window && 'createObjectURL' in window.URL;\n    };\n    var hasVisibility = function hasVisibility() {\n        return 'visibilityState' in document;\n    };\n    var hasTiming = function hasTiming() {\n        return 'performance' in window;\n    }; // iOS 8.x\n    var hasCSSSupports = function hasCSSSupports() {\n        return 'supports' in (window.CSS || {});\n    }; // use to detect Safari 9+\n    var isIE11 = function isIE11() {\n        return /MSIE|Trident/.test(window.navigator.userAgent);\n    };\n\n    var supported = (function() {\n        // Runs immediately and then remembers result for subsequent calls\n        var isSupported =\n            // Has to be a browser\n            isBrowser() &&\n            // Can't run on Opera Mini due to lack of everything\n            !isOperaMini() &&\n            // Require these APIs to feature detect a modern browser\n            hasVisibility() &&\n            hasPromises() &&\n            hasBlobSlice() &&\n            hasCreateObjectURL() &&\n            hasTiming() &&\n            // doesn't need CSSSupports but is a good way to detect Safari 9+ (we do want to support IE11 though)\n            (hasCSSSupports() || isIE11());\n\n        return function() {\n            return isSupported;\n        };\n    })();\n\n    /**\n     * Plugin internal state (over all instances)\n     */\n    var state = {\n        // active app instances, used to redraw the apps and to find the later\n        apps: [],\n    };\n\n    // plugin name\n    var name = 'filepond';\n\n    /**\n     * Public Plugin methods\n     */\n    var fn = function fn() {};\n    exports.Status = {};\n    exports.FileStatus = {};\n    exports.FileOrigin = {};\n    exports.OptionTypes = {};\n    exports.create = fn;\n    exports.destroy = fn;\n    exports.parse = fn;\n    exports.find = fn;\n    exports.registerPlugin = fn;\n    exports.getOptions = fn;\n    exports.setOptions = fn;\n\n    // if not supported, no API\n    if (supported()) {\n        // start painter and fire load event\n        createPainter(\n            function() {\n                state.apps.forEach(function(app) {\n                    return app._read();\n                });\n            },\n            function(ts) {\n                state.apps.forEach(function(app) {\n                    return app._write(ts);\n                });\n            }\n        );\n\n        // fire loaded event so we know when FilePond is available\n        var dispatch = function dispatch() {\n            // let others know we have area ready\n            document.dispatchEvent(\n                new CustomEvent('FilePond:loaded', {\n                    detail: {\n                        supported: supported,\n                        create: exports.create,\n                        destroy: exports.destroy,\n                        parse: exports.parse,\n                        find: exports.find,\n                        registerPlugin: exports.registerPlugin,\n                        setOptions: exports.setOptions,\n                    },\n                })\n            );\n\n            // clean up event\n            document.removeEventListener('DOMContentLoaded', dispatch);\n        };\n\n        if (document.readyState !== 'loading') {\n            // move to back of execution queue, FilePond should have been exported by then\n            setTimeout(function() {\n                return dispatch();\n            }, 0);\n        } else {\n            document.addEventListener('DOMContentLoaded', dispatch);\n        }\n\n        // updates the OptionTypes object based on the current options\n        var updateOptionTypes = function updateOptionTypes() {\n            return forin(getOptions(), function(key, value) {\n                exports.OptionTypes[key] = value[1];\n            });\n        };\n\n        exports.Status = Object.assign({}, Status);\n        exports.FileOrigin = Object.assign({}, FileOrigin);\n        exports.FileStatus = Object.assign({}, ItemStatus);\n\n        exports.OptionTypes = {};\n        updateOptionTypes();\n\n        // create method, creates apps and adds them to the app array\n        exports.create = function create() {\n            var app = createApp$1.apply(void 0, arguments);\n            app.on('destroy', exports.destroy);\n            state.apps.push(app);\n            return createAppAPI(app);\n        };\n\n        // destroys apps and removes them from the app array\n        exports.destroy = function destroy(hook) {\n            // returns true if the app was destroyed successfully\n            var indexToRemove = state.apps.findIndex(function(app) {\n                return app.isAttachedTo(hook);\n            });\n            if (indexToRemove >= 0) {\n                // remove from apps\n                var app = state.apps.splice(indexToRemove, 1)[0];\n\n                // restore original dom element\n                app.restoreElement();\n\n                return true;\n            }\n\n            return false;\n        };\n\n        // parses the given context for plugins (does not include the context element itself)\n        exports.parse = function parse(context) {\n            // get all possible hooks\n            var matchedHooks = Array.from(context.querySelectorAll('.' + name));\n\n            // filter out already active hooks\n            var newHooks = matchedHooks.filter(function(newHook) {\n                return !state.apps.find(function(app) {\n                    return app.isAttachedTo(newHook);\n                });\n            });\n\n            // create new instance for each hook\n            return newHooks.map(function(hook) {\n                return exports.create(hook);\n            });\n        };\n\n        // returns an app based on the given element hook\n        exports.find = function find(hook) {\n            var app = state.apps.find(function(app) {\n                return app.isAttachedTo(hook);\n            });\n            if (!app) {\n                return null;\n            }\n            return createAppAPI(app);\n        };\n\n        // adds a plugin extension\n        exports.registerPlugin = function registerPlugin() {\n            for (\n                var _len = arguments.length, plugins = new Array(_len), _key = 0;\n                _key < _len;\n                _key++\n            ) {\n                plugins[_key] = arguments[_key];\n            }\n\n            // register plugins\n            plugins.forEach(createAppPlugin);\n\n            // update OptionTypes, each plugin might have extended the default options\n            updateOptionTypes();\n        };\n\n        exports.getOptions = function getOptions$1() {\n            var opts = {};\n            forin(getOptions(), function(key, value) {\n                opts[key] = value[0];\n            });\n            return opts;\n        };\n\n        exports.setOptions = function setOptions$1(opts) {\n            if (isObject(opts)) {\n                // update existing plugins\n                state.apps.forEach(function(app) {\n                    app.setOptions(opts);\n                });\n\n                // override defaults\n                setOptions(opts);\n            }\n\n            // return new options\n            return exports.getOptions();\n        };\n    }\n\n    exports.supported = supported;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n});\n"],"mappings":"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"}