/**!
 * MixItUp v3.3.1
 * A high-performance, dependency-free library for animated filtering, sorting and more
 * Build 94e0fbf6-cd0b-4987-b3c0-14b59b67b8a0
 *
 * @copyright Copyright 2014-2018 KunkaLabs Limited.
 * @author    KunkaLabs Limited.
 * @link      https://www.kunkalabs.com/mixitup/
 *
 * @license   Commercial use requires a commercial license.
 *            https://www.kunkalabs.com/mixitup/licenses/
 *
 *            Non-commercial use permitted under same terms as CC BY-NC 3.0 license.
 *            http://creativecommons.org/licenses/by-nc/3.0/
 */
! function(t) {
    "use strict";
    var e = null,
        n = null;
    ! function() {
        var e = ["webkit", "moz", "o", "ms"],
            n = t.document.createElement("div"),
            a = -1;
        for (a = 0; a < e.length && !t.requestAnimationFrame; a++) t.requestAnimationFrame = t[e[a] + "RequestAnimationFrame"];
        "undefined" == typeof n.nextElementSibling && Object.defineProperty(t.Element.prototype, "nextElementSibling", {
                get: function() {
                    for (var t = this.nextSibling; t;) {
                        if (1 === t.nodeType) return t;
                        t = t.nextSibling
                    }
                    return null
                }
            }),
            function(t) {
                t.matches = t.matches || t.machesSelector || t.mozMatchesSelector || t.msMatchesSelector || t.oMatchesSelector || t.webkitMatchesSelector || function(t) {
                    return Array.prototype.indexOf.call(this.parentElement.querySelectorAll(t), this) > -1
                }
            }(t.Element.prototype), Object.keys || (Object.keys = function() {
                var t = Object.prototype.hasOwnProperty,
                    e = !1,
                    n = [],
                    a = -1;
                return e = !{
                        toString: null
                    }.propertyIsEnumerable("toString"), n = ["toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor"], a = n.length,
                    function(i) {
                        var o = [],
                            r = "",
                            s = -1;
                        if ("object" != typeof i && ("function" != typeof i || null === i)) throw new TypeError("Object.keys called on non-object");
                        for (r in i) t.call(i, r) && o.push(r);
                        if (e)
                            for (s = 0; s < a; s++) t.call(i, n[s]) && o.push(n[s]);
                        return o
                    }
            }()), Array.isArray || (Array.isArray = function(t) {
                return "[object Array]" === Object.prototype.toString.call(t)
            }), "function" != typeof Object.create && (Object.create = function(t) {
                var e = function() {};
                return function(n, a) {
                    if (n !== Object(n) && null !== n) throw TypeError("Argument must be an object, or null");
                    e.prototype = n || {};
                    var i = new e;
                    return e.prototype = null, a !== t && Object.defineProperties(i, a), null === n && (i.__proto__ = null), i
                }
            }()), String.prototype.trim || (String.prototype.trim = function() {
                return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "")
            }), Array.prototype.indexOf || (Array.prototype.indexOf = function(t) {
                var e, n, a, i;
                if (null === this) throw new TypeError;
                if (a = Object(this), i = a.length >>> 0, 0 === i) return -1;
                if (e = 0, arguments.length > 1 && (e = Number(arguments[1]), e !== e ? e = 0 : 0 !== e && e !== 1 / 0 && e !== -(1 / 0) && (e = (e > 0 || -1) * Math.floor(Math.abs(e)))), e >= i) return -1;
                for (n = e >= 0 ? e : Math.max(i - Math.abs(e), 0); n < i; n++)
                    if (n in a && a[n] === t) return n;
                return -1
            }), Function.prototype.bind || (Function.prototype.bind = function(t) {
                var e, n, a, i;
                if ("function" != typeof this) throw new TypeError;
                return e = Array.prototype.slice.call(arguments, 1), n = this, a = function() {}, i = function() {
                    return n.apply(this instanceof a ? this : t, e.concat(Array.prototype.slice.call(arguments)))
                }, this.prototype && (a.prototype = this.prototype), i.prototype = new a, i
            }), t.Element.prototype.dispatchEvent || (t.Element.prototype.dispatchEvent = function(t) {
                try {
                    return this.fireEvent("on" + t.type, t)
                } catch (e) {}
            })
    }(), e = function(a, i, o) {
        var r = null,
            s = !1,
            l = null,
            c = null,
            u = null,
            f = null,
            h = [],
            d = "",
            m = [],
            g = -1;
        if (u = o || t.document, (s = arguments[3]) && (s = "boolean" == typeof s), "string" == typeof a) m = u.querySelectorAll(a);
        else if (a && "object" == typeof a && n.isElement(a, u)) m = [a];
        else {
            if (!a || "object" != typeof a || !a.length) throw new Error(e.messages.errorFactoryInvalidContainer());
            m = a
        }
        if (m.length < 1) throw new Error(e.messages.errorFactoryContainerNotFound());
        for (g = 0;
            (r = m[g]) && (!(g > 0) || s); g++) r.id ? d = r.id : (d = "MixItUp" + n.randomHex(), r.id = d), e.instances[d] instanceof e.Mixer ? (l = e.instances[d], (!i || i && i.debug && i.debug.showWarnings !== !1) && console.warn(e.messages.warningFactoryPreexistingInstance())) : (l = new e.Mixer, l.attach(r, u, d, i), e.instances[d] = l), c = new e.Facade(l), i && i.debug && i.debug.enable ? h.push(l) : h.push(c);
        return f = s ? new e.Collection(h) : h[0]
    }, e.use = function(t) {
        e.Base.prototype.callActions.call(e, "beforeUse", arguments), "function" == typeof t && "mixitup-extension" === t.TYPE ? "undefined" == typeof e.extensions[t.NAME] && (t(e), e.extensions[t.NAME] = t) : t.fn && t.fn.jquery && (e.libraries.$ = t), e.Base.prototype.callActions.call(e, "afterUse", arguments)
    }, e.instances = {}, e.extensions = {}, e.libraries = {}, n = {
        hasClass: function(t, e) {
            return !!t.className.match(new RegExp("(\\s|^)" + e + "(\\s|$)"))
        },
        addClass: function(t, e) {
            this.hasClass(t, e) || (t.className += t.className ? " " + e : e)
        },
        removeClass: function(t, e) {
            if (this.hasClass(t, e)) {
                var n = new RegExp("(\\s|^)" + e + "(\\s|$)");
                t.className = t.className.replace(n, " ").trim()
            }
        },
        extend: function(t, e, n, a) {
            var i = [],
                o = "",
                r = -1;
            n = n || !1, a = a || !1;
            try {
                if (Array.isArray(e))
                    for (r = 0; r < e.length; r++) i.push(r);
                else e && (i = Object.keys(e));
                for (r = 0; r < i.length; r++) o = i[r], !n || "object" != typeof e[o] || this.isElement(e[o]) ? t[o] = e[o] : Array.isArray(e[o]) ? (t[o] || (t[o] = []), this.extend(t[o], e[o], n, a)) : (t[o] || (t[o] = {}), this.extend(t[o], e[o], n, a))
            } catch (s) {
                if (!a) throw s;
                this.handleExtendError(s, t)
            }
            return t
        },
        handleExtendError: function(t, n) {
            var a = /property "?(\w*)"?[,:] object/i,
                i = null,
                o = "",
                r = "",
                s = "",
                l = "",
                c = "",
                u = -1,
                f = -1;
            if (t instanceof TypeError && (i = a.exec(t.message))) {
                o = i[1];
                for (c in n) {
                    for (f = 0; f < o.length && o.charAt(f) === c.charAt(f);) f++;
                    f > u && (u = f, l = c)
                }
                throw u > 1 && (s = e.messages.errorConfigInvalidPropertySuggestion({
                    probableMatch: l
                })), r = e.messages.errorConfigInvalidProperty({
                    erroneous: o,
                    suggestion: s
                }), new TypeError(r)
            }
            throw t
        },
        template: function(t) {
            for (var e = /\${([\w]*)}/g, n = {}, a = null; a = e.exec(t);) n[a[1]] = new RegExp("\\${" + a[1] + "}", "g");
            return function(e) {
                var a = "",
                    i = t;
                e = e || {};
                for (a in n) i = i.replace(n[a], "undefined" != typeof e[a] ? e[a] : "");
                return i
            }
        },
        on: function(e, n, a, i) {
            e && (e.addEventListener ? e.addEventListener(n, a, i) : e.attachEvent && (e["e" + n + a] = a, e[n + a] = function() {
                e["e" + n + a](t.event)
            }, e.attachEvent("on" + n, e[n + a])))
        },
        off: function(t, e, n) {
            t && (t.removeEventListener ? t.removeEventListener(e, n, !1) : t.detachEvent && (t.detachEvent("on" + e, t[e + n]), t[e + n] = null))
        },
        getCustomEvent: function(e, n, a) {
            var i = null;
            return a = a || t.document, "function" == typeof t.CustomEvent ? i = new t.CustomEvent(e, {
                detail: n,
                bubbles: !0,
                cancelable: !0
            }) : "function" == typeof a.createEvent ? (i = a.createEvent("CustomEvent"), i.initCustomEvent(e, !0, !0, n)) : (i = a.createEventObject(), i.type = e, i.returnValue = !1, i.cancelBubble = !1, i.detail = n), i
        },
        getOriginalEvent: function(t) {
            return t.touches && t.touches.length ? t.touches[0] : t.changedTouches && t.changedTouches.length ? t.changedTouches[0] : t
        },
        index: function(t, e) {
            for (var n = 0; null !== (t = t.previousElementSibling);) e && !t.matches(e) || ++n;
            return n
        },
        camelCase: function(t) {
            return t.toLowerCase().replace(/([_-][a-z])/g, function(t) {
                return t.toUpperCase().replace(/[_-]/, "")
            })
        },
        pascalCase: function(t) {
            return (t = this.camelCase(t)).charAt(0).toUpperCase() + t.slice(1)
        },
        dashCase: function(t) {
            return t.replace(/([A-Z])/g, "-$1").replace(/^-/, "").toLowerCase()
        },
        isElement: function(e, n) {
            return n = n || t.document, !!(t.HTMLElement && e instanceof t.HTMLElement) || (!!(n.defaultView && n.defaultView.HTMLElement && e instanceof n.defaultView.HTMLElement) || null !== e && 1 === e.nodeType && "string" == typeof e.nodeName)
        },
        createElement: function(e, n) {
            var a = null,
                i = null;
            for (n = n || t.document, a = n.createDocumentFragment(), i = n.createElement("div"), i.innerHTML = e.trim(); i.firstChild;) a.appendChild(i.firstChild);
            return a
        },
        removeWhitespace: function(t) {
            for (var e; t && "#text" === t.nodeName;) e = t, t = t.previousSibling, e.parentElement && e.parentElement.removeChild(e)
        },
        isEqualArray: function(t, e) {
            var n = t.length;
            if (n !== e.length) return !1;
            for (; n--;)
                if (t[n] !== e[n]) return !1;
            return !0
        },
        deepEquals: function(t, e) {
            var n;
            if ("object" == typeof t && t && "object" == typeof e && e) {
                if (Object.keys(t).length !== Object.keys(e).length) return !1;
                for (n in t)
                    if (!e.hasOwnProperty(n) || !this.deepEquals(t[n], e[n])) return !1
            } else if (t !== e) return !1;
            return !0
        },
        arrayShuffle: function(t) {
            for (var e = t.slice(), n = e.length, a = n, i = -1, o = []; a--;) i = ~~(Math.random() * n), o = e[a], e[a] = e[i], e[i] = o;
            return e
        },
        arrayFromList: function(t) {
            var e, n;
            try {
                return Array.prototype.slice.call(t)
            } catch (a) {
                for (e = [], n = 0; n < t.length; n++) e.push(t[n]);
                return e
            }
        },
        debounce: function(t, e, n) {
            var a;
            return function() {
                var i = this,
                    o = arguments,
                    r = n && !a,
                    s = null;
                s = function() {
                    a = null, n || t.apply(i, o)
                }, clearTimeout(a), a = setTimeout(s, e), r && t.apply(i, o)
            }
        },
        position: function(t) {
            for (var e = 0, n = 0, a = t; t;) e -= t.scrollLeft, n -= t.scrollTop, t === a && (e += t.offsetLeft, n += t.offsetTop, a = t.offsetParent), t = t.parentElement;
            return {
                x: e,
                y: n
            }
        },
        getHypotenuse: function(t, e) {
            var n = t.x - e.x,
                a = t.y - e.y;
            return n = n < 0 ? n * -1 : n, a = a < 0 ? a * -1 : a, Math.sqrt(Math.pow(n, 2) + Math.pow(a, 2))
        },
        getIntersectionRatio: function(t, e) {
            var n = t.width * t.height,
                a = -1,
                i = -1,
                o = -1,
                r = -1;
            return a = Math.max(0, Math.min(t.left + t.width, e.left + e.width) - Math.max(t.left, e.left)), i = Math.max(0, Math.min(t.top + t.height, e.top + e.height) - Math.max(t.top, e.top)), o = i * a, r = o / n
        },
        closestParent: function(e, n, a, i) {
            var o = e.parentNode;
            if (i = i || t.document, a && e.matches(n)) return e;
            for (; o && o != i.body;) {
                if (o.matches && o.matches(n)) return o;
                if (!o.parentNode) return null;
                o = o.parentNode
            }
            return null
        },
        children: function(e, n, a) {
            var i = [],
                o = "";
            return a = a || t.doc, e && (e.id || (o = "Temp" + this.randomHexKey(), e.id = o), i = a.querySelectorAll("#" + e.id + " > " + n), o && e.removeAttribute("id")), i
        },
        clean: function(t) {
            var e = [],
                n = -1;
            for (n = 0; n < t.length; n++) "" !== t[n] && e.push(t[n]);
            return e
        },
        defer: function(n) {
            var a = null,
                i = null,
                o = null;
            return i = new this.Deferred, e.features.has.promises ? i.promise = new Promise(function(t, e) {
                i.resolve = t, i.reject = e
            }) : (o = t.jQuery || n.$) && "function" == typeof o.Deferred ? (a = o.Deferred(), i.promise = a.promise(), i.resolve = a.resolve, i.reject = a.reject) : t.console && console.warn(e.messages.warningNoPromiseImplementation()), i
        },
        all: function(n, a) {
            var i = null;
            return e.features.has.promises ? Promise.all(n) : (i = t.jQuery || a.$) && "function" == typeof i.when ? i.when.apply(i, n).done(function() {
                return arguments
            }) : (t.console && console.warn(e.messages.warningNoPromiseImplementation()), [])
        },
        getPrefix: function(t, e, a) {
            var i = -1,
                o = "";
            if (n.dashCase(e) in t.style) return "";
            for (i = 0; o = a[i]; i++)
                if (o + e in t.style) return o.toLowerCase();
            return "unsupported"
        },
        randomHex: function() {
            return ("00000" + (16777216 * Math.random() << 0).toString(16)).substr(-6).toUpperCase()
        },
        getDocumentState: function(e) {
            return e = "object" == typeof e.body ? e : t.document, {
                scrollTop: t.pageYOffset,
                scrollLeft: t.pageXOffset,
                docHeight: e.documentElement.scrollHeight,
                docWidth: e.documentElement.scrollWidth,
                viewportHeight: e.documentElement.clientHeight,
                viewportWidth: e.documentElement.clientWidth
            }
        },
        bind: function(t, e) {
            return function() {
                return e.apply(t, arguments)
            }
        },
        isVisible: function(e) {
            var n = null;
            return !!e.offsetParent || (n = t.getComputedStyle(e), "fixed" === n.position && "hidden" !== n.visibility && "0" !== n.opacity)
        },
        seal: function(t) {
            "function" == typeof Object.seal && Object.seal(t)
        },
        freeze: function(t) {
            "function" == typeof Object.freeze && Object.freeze(t)
        },
        compareVersions: function(t, e) {
            var n = t.split("."),
                a = e.split("."),
                i = -1,
                o = -1,
                r = -1;
            for (r = 0; r < n.length; r++) {
                if (i = parseInt(n[r].replace(/[^\d.]/g, "")), o = parseInt(a[r].replace(/[^\d.]/g, "") || 0), o < i) return !1;
                if (o > i) return !0
            }
            return !0
        },
        Deferred: function() {
            this.promise = null, this.resolve = null, this.reject = null, this.id = n.randomHex()
        },
        isEmptyObject: function(t) {
            var e = "";
            if ("function" == typeof Object.keys) return 0 === Object.keys(t).length;
            for (e in t)
                if (t.hasOwnProperty(e)) return !1;
            return !0
        },
        getClassname: function(t, e, n) {
            var a = "";
            return a += t.block, a.length && (a += t.delineatorElement), a += t["element" + this.pascalCase(e)], n ? (a.length && (a += t.delineatorModifier), a += n) : a
        },
        getProperty: function(t, e) {
            var n = e.split("."),
                a = null,
                i = "",
                o = 0;
            if (!e) return t;
            for (a = function(t) {
                    return t ? t[i] : null
                }; o < n.length;) i = n[o], t = a(t), o++;
            return "undefined" != typeof t ? t : null
        }
    }, e.h = n, e.Base = function() {}, e.Base.prototype = {
        constructor: e.Base,
        callActions: function(t, e) {
            var a = this,
                i = a.constructor.actions[t],
                o = "";
            if (i && !n.isEmptyObject(i))
                for (o in i) i[o].apply(a, e)
        },
        callFilters: function(t, e, a) {
            var i = this,
                o = i.constructor.filters[t],
                r = e,
                s = "";
            if (!o || n.isEmptyObject(o)) return r;
            a = a || [];
            for (s in o) a = n.arrayFromList(a), a.unshift(r), r = o[s].apply(i, a);
            return r
        }
    }, e.BaseStatic = function() {
        this.actions = {}, this.filters = {}, this.extend = function(t) {
            n.extend(this.prototype, t)
        }, this.registerAction = function(t, e, n) {
            (this.actions[t] = this.actions[t] || {})[e] = n
        }, this.registerFilter = function(t, e, n) {
            (this.filters[t] = this.filters[t] || {})[e] = n
        }
    }, e.Features = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.boxSizingPrefix = "", this.transformPrefix = "", this.transitionPrefix = "", this.boxSizingPrefix = "", this.transformProp = "", this.transformRule = "", this.transitionProp = "", this.perspectiveProp = "", this.perspectiveOriginProp = "", this.has = new e.Has, this.canary = null, this.BOX_SIZING_PROP = "boxSizing", this.TRANSITION_PROP = "transition", this.TRANSFORM_PROP = "transform", this.PERSPECTIVE_PROP = "perspective", this.PERSPECTIVE_ORIGIN_PROP = "perspectiveOrigin", this.VENDORS = ["Webkit", "moz", "O", "ms"], this.TWEENABLE = ["opacity", "width", "height", "marginRight", "marginBottom", "x", "y", "scale", "translateX", "translateY", "translateZ", "rotateX", "rotateY", "rotateZ"], this.callActions("afterConstruct")
    }, e.BaseStatic.call(e.Features), e.Features.prototype = Object.create(e.Base.prototype), n.extend(e.Features.prototype, {
        constructor: e.Features,
        init: function() {
            var t = this;
            t.callActions("beforeInit", arguments), t.canary = document.createElement("div"), t.setPrefixes(), t.runTests(), t.callActions("beforeInit", arguments)
        },
        runTests: function() {
            var e = this;
            e.callActions("beforeRunTests", arguments), e.has.promises = "function" == typeof t.Promise, e.has.transitions = "unsupported" !== e.transitionPrefix, e.callActions("afterRunTests", arguments), n.freeze(e.has)
        },
        setPrefixes: function() {
            var t = this;
            t.callActions("beforeSetPrefixes", arguments), t.transitionPrefix = n.getPrefix(t.canary, "Transition", t.VENDORS), t.transformPrefix = n.getPrefix(t.canary, "Transform", t.VENDORS), t.boxSizingPrefix = n.getPrefix(t.canary, "BoxSizing", t.VENDORS), t.boxSizingProp = t.boxSizingPrefix ? t.boxSizingPrefix + n.pascalCase(t.BOX_SIZING_PROP) : t.BOX_SIZING_PROP, t.transitionProp = t.transitionPrefix ? t.transitionPrefix + n.pascalCase(t.TRANSITION_PROP) : t.TRANSITION_PROP, t.transformProp = t.transformPrefix ? t.transformPrefix + n.pascalCase(t.TRANSFORM_PROP) : t.TRANSFORM_PROP, t.transformRule = t.transformPrefix ? "-" + t.transformPrefix + "-" + t.TRANSFORM_PROP : t.TRANSFORM_PROP, t.perspectiveProp = t.transformPrefix ? t.transformPrefix + n.pascalCase(t.PERSPECTIVE_PROP) : t.PERSPECTIVE_PROP, t.perspectiveOriginProp = t.transformPrefix ? t.transformPrefix + n.pascalCase(t.PERSPECTIVE_ORIGIN_PROP) : t.PERSPECTIVE_ORIGIN_PROP, t.callActions("afterSetPrefixes", arguments)
        }
    }), e.Has = function() {
        this.transitions = !1, this.promises = !1, n.seal(this)
    }, e.features = new e.Features, e.features.init(), e.ConfigAnimation = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.enable = !0, this.effects = "fade scale", this.effectsIn = "", this.effectsOut = "", this.duration = 600, this.easing = "ease", this.applyPerspective = !0, this.perspectiveDistance = "3000px", this.perspectiveOrigin = "50% 50%", this.queue = !0, this.queueLimit = 3, this.animateResizeContainer = !0, this.animateResizeTargets = !1, this.staggerSequence = null, this.reverseOut = !1, this.nudge = !0, this.clampHeight = !0, this.clampWidth = !0, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigAnimation), e.ConfigAnimation.prototype = Object.create(e.Base.prototype), e.ConfigAnimation.prototype.constructor = e.ConfigAnimation, e.ConfigBehavior = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.liveSort = !1, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigBehavior), e.ConfigBehavior.prototype = Object.create(e.Base.prototype), e.ConfigBehavior.prototype.constructor = e.ConfigBehavior, e.ConfigCallbacks = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.onMixStart = null, this.onMixBusy = null, this.onMixEnd = null, this.onMixFail = null, this.onMixClick = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigCallbacks), e.ConfigCallbacks.prototype = Object.create(e.Base.prototype), e.ConfigCallbacks.prototype.constructor = e.ConfigCallbacks, e.ConfigControls = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.enable = !0, this.live = !1, this.scope = "global", this.toggleLogic = "or", this.toggleDefault = "all", this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigControls), e.ConfigControls.prototype = Object.create(e.Base.prototype), e.ConfigControls.prototype.constructor = e.ConfigControls, e.ConfigClassNames = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.block = "mixitup", this.elementContainer = "container", this.elementFilter = "control", this.elementSort = "control", this.elementMultimix = "control", this.elementToggle = "control", this.modifierActive = "active", this.modifierDisabled = "disabled", this.modifierFailed = "failed", this.delineatorElement = "-", this.delineatorModifier = "-", this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigClassNames), e.ConfigClassNames.prototype = Object.create(e.Base.prototype), e.ConfigClassNames.prototype.constructor = e.ConfigClassNames, e.ConfigData = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.uidKey = "", this.dirtyCheck = !1, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigData), e.ConfigData.prototype = Object.create(e.Base.prototype), e.ConfigData.prototype.constructor = e.ConfigData, e.ConfigDebug = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.enable = !1, this.showWarnings = !0, this.fauxAsync = !1, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigDebug), e.ConfigDebug.prototype = Object.create(e.Base.prototype), e.ConfigDebug.prototype.constructor = e.ConfigDebug, e.ConfigLayout = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.allowNestedTargets = !0, this.containerClassName = "", this.siblingBefore = null, this.siblingAfter = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigLayout), e.ConfigLayout.prototype = Object.create(e.Base.prototype), e.ConfigLayout.prototype.constructor = e.ConfigLayout, e.ConfigLoad = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.filter = "all", this.sort = "default:asc", this.dataset = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigLoad), e.ConfigLoad.prototype = Object.create(e.Base.prototype), e.ConfigLoad.prototype.constructor = e.ConfigLoad, e.ConfigSelectors = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.target = ".mix", this.control = "", this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigSelectors), e.ConfigSelectors.prototype = Object.create(e.Base.prototype), e.ConfigSelectors.prototype.constructor = e.ConfigSelectors, e.ConfigRender = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.target = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigRender), e.ConfigRender.prototype = Object.create(e.Base.prototype), e.ConfigRender.prototype.constructor = e.ConfigRender, e.ConfigTemplates = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.ConfigTemplates), e.ConfigTemplates.prototype = Object.create(e.Base.prototype), e.ConfigTemplates.prototype.constructor = e.ConfigTemplates, e.Config = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.animation = new e.ConfigAnimation, this.behavior = new e.ConfigBehavior, this.callbacks = new e.ConfigCallbacks, this.controls = new e.ConfigControls, this.classNames = new e.ConfigClassNames, this.data = new e.ConfigData, this.debug = new e.ConfigDebug, this.layout = new e.ConfigLayout, this.load = new e.ConfigLoad, this.selectors = new e.ConfigSelectors, this.render = new e.ConfigRender, this.templates = new e.ConfigTemplates, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.Config), e.Config.prototype = Object.create(e.Base.prototype), e.Config.prototype.constructor = e.Config, e.MixerDom = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.document = null, this.body = null, this.container = null, this.parent = null, this.targets = [], this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.MixerDom), e.MixerDom.prototype = Object.create(e.Base.prototype), e.MixerDom.prototype.constructor = e.MixerDom, e.UiClassNames = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.base = "", this.active = "", this.disabled = "", this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.UiClassNames), e.UiClassNames.prototype = Object.create(e.Base.prototype), e.UiClassNames.prototype.constructor = e.UiClassNames, e.CommandDataset = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.dataset = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.CommandDataset), e.CommandDataset.prototype = Object.create(e.Base.prototype), e.CommandDataset.prototype.constructor = e.CommandDataset, e.CommandMultimix = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.filter = null, this.sort = null, this.insert = null, this.remove = null, this.changeLayout = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.CommandMultimix), e.CommandMultimix.prototype = Object.create(e.Base.prototype), e.CommandMultimix.prototype.constructor = e.CommandMultimix, e.CommandFilter = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.selector = "", this.collection = null, this.action = "show", this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.CommandFilter), e.CommandFilter.prototype = Object.create(e.Base.prototype), e.CommandFilter.prototype.constructor = e.CommandFilter, e.CommandSort = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.sortString = "", this.attribute = "", this.order = "asc", this.collection = null, this.next = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.CommandSort), e.CommandSort.prototype = Object.create(e.Base.prototype), e.CommandSort.prototype.constructor = e.CommandSort, e.CommandInsert = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.index = 0, this.collection = [], this.position = "before", this.sibling = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.CommandInsert), e.CommandInsert.prototype = Object.create(e.Base.prototype), e.CommandInsert.prototype.constructor = e.CommandInsert, e.CommandRemove = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.targets = [], this.collection = [], this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.CommandRemove), e.CommandRemove.prototype = Object.create(e.Base.prototype), e.CommandRemove.prototype.constructor = e.CommandRemove, e.CommandChangeLayout = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.containerClassName = "", this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.CommandChangeLayout), e.CommandChangeLayout.prototype = Object.create(e.Base.prototype), e.CommandChangeLayout.prototype.constructor = e.CommandChangeLayout, e.ControlDefinition = function(t, a, i, o) {
        e.Base.call(this), this.callActions("beforeConstruct"), this.type = t, this.selector = a, this.live = i || !1, this.parent = o || "", this.callActions("afterConstruct"), n.freeze(this), n.seal(this)
    }, e.BaseStatic.call(e.ControlDefinition), e.ControlDefinition.prototype = Object.create(e.Base.prototype), e.ControlDefinition.prototype.constructor = e.ControlDefinition, e.controlDefinitions = [], e.controlDefinitions.push(new e.ControlDefinition("multimix", "[data-filter][data-sort]")), e.controlDefinitions.push(new e.ControlDefinition("filter", "[data-filter]")), e.controlDefinitions.push(new e.ControlDefinition("sort", "[data-sort]")), e.controlDefinitions.push(new e.ControlDefinition("toggle", "[data-toggle]")), e.Control = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.el = null, this.selector = "", this.bound = [], this.pending = -1, this.type = "", this.status = "inactive", this.filter = "", this.sort = "", this.canDisable = !1, this.handler = null, this.classNames = new e.UiClassNames, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.Control), e.Control.prototype = Object.create(e.Base.prototype), n.extend(e.Control.prototype, {
        constructor: e.Control,
        init: function(t, n, a) {
            var i = this;
            if (this.callActions("beforeInit", arguments), i.el = t, i.type = n, i.selector = a, i.selector) i.status = "live";
            else switch (i.canDisable = "boolean" == typeof i.el.disable, i.type) {
                case "filter":
                    i.filter = i.el.getAttribute("data-filter");
                    break;
                case "toggle":
                    i.filter = i.el.getAttribute("data-toggle");
                    break;
                case "sort":
                    i.sort = i.el.getAttribute("data-sort");
                    break;
                case "multimix":
                    i.filter = i.el.getAttribute("data-filter"), i.sort = i.el.getAttribute("data-sort")
            }
            i.bindClick(), e.controls.push(i), this.callActions("afterInit", arguments)
        },
        isBound: function(t) {
            var e = this,
                n = !1;
            return this.callActions("beforeIsBound", arguments), n = e.bound.indexOf(t) > -1, e.callFilters("afterIsBound", n, arguments)
        },
        addBinding: function(t) {
            var e = this;
            this.callActions("beforeAddBinding", arguments), e.isBound() || e.bound.push(t), this.callActions("afterAddBinding", arguments)
        },
        removeBinding: function(t) {
            var n = this,
                a = -1;
            this.callActions("beforeRemoveBinding", arguments), (a = n.bound.indexOf(t)) > -1 && n.bound.splice(a, 1), n.bound.length < 1 && (n.unbindClick(), a = e.controls.indexOf(n), e.controls.splice(a, 1), "active" === n.status && n.renderStatus(n.el, "inactive")), this.callActions("afterRemoveBinding", arguments)
        },
        bindClick: function() {
            var t = this;
            this.callActions("beforeBindClick", arguments), t.handler = function(e) {
                t.handleClick(e)
            }, n.on(t.el, "click", t.handler), this.callActions("afterBindClick", arguments)
        },
        unbindClick: function() {
            var t = this;
            this.callActions("beforeUnbindClick", arguments), n.off(t.el, "click", t.handler), t.handler = null, this.callActions("afterUnbindClick", arguments)
        },
        handleClick: function(t) {
            var a = this,
                i = null,
                o = null,
                r = !1,
                s = void 0,
                l = {},
                c = null,
                u = [],
                f = -1;
            if (this.callActions("beforeHandleClick", arguments), this.pending = 0, o = a.bound[0], i = a.selector ? n.closestParent(t.target, o.config.selectors.control + a.selector, !0, o.dom.document) : a.el, !i) return void a.callActions("afterHandleClick", arguments);
            switch (a.type) {
                case "filter":
                    l.filter = a.filter || i.getAttribute("data-filter");
                    break;
                case "sort":
                    l.sort = a.sort || i.getAttribute("data-sort");
                    break;
                case "multimix":
                    l.filter = a.filter || i.getAttribute("data-filter"), l.sort = a.sort || i.getAttribute("data-sort");
                    break;
                case "toggle":
                    l.filter = a.filter || i.getAttribute("data-toggle"), r = "live" === a.status ? n.hasClass(i, a.classNames.active) : "active" === a.status
            }
            for (f = 0; f < a.bound.length; f++) c = new e.CommandMultimix, n.extend(c, l), u.push(c);
            for (u = a.callFilters("commandsHandleClick", u, arguments), a.pending = a.bound.length, f = 0; o = a.bound[f]; f++) l = u[f], l && (o.lastClicked || (o.lastClicked = i), e.events.fire("mixClick", o.dom.container, {
                state: o.state,
                instance: o,
                originalEvent: t,
                control: o.lastClicked
            }, o.dom.document), "function" == typeof o.config.callbacks.onMixClick && (s = o.config.callbacks.onMixClick.call(o.lastClicked, o.state, t, o), s === !1) || ("toggle" === a.type ? r ? o.toggleOff(l.filter) : o.toggleOn(l.filter) : o.multimix(l)));
            this.callActions("afterHandleClick", arguments)
        },
        update: function(t, n) {
            var a = this,
                i = new e.CommandMultimix;
            a.callActions("beforeUpdate", arguments), a.pending--, a.pending = Math.max(0, a.pending), a.pending > 0 || ("live" === a.status ? a.updateLive(t, n) : (i.sort = a.sort, i.filter = a.filter, a.callFilters("actionsUpdate", i, arguments), a.parseStatusChange(a.el, t, i, n)), a.callActions("afterUpdate", arguments))
        },
        updateLive: function(t, n) {
            var a = this,
                i = null,
                o = null,
                r = null,
                s = -1;
            if (a.callActions("beforeUpdateLive", arguments), a.el) {
                for (i = a.el.querySelectorAll(a.selector), s = 0; r = i[s]; s++) {
                    switch (o = new e.CommandMultimix, a.type) {
                        case "filter":
                            o.filter = r.getAttribute("data-filter");
                            break;
                        case "sort":
                            o.sort = r.getAttribute("data-sort");
                            break;
                        case "multimix":
                            o.filter = r.getAttribute("data-filter"), o.sort = r.getAttribute("data-sort");
                            break;
                        case "toggle":
                            o.filter = r.getAttribute("data-toggle")
                    }
                    o = a.callFilters("actionsUpdateLive", o, arguments), a.parseStatusChange(r, t, o, n)
                }
                a.callActions("afterUpdateLive", arguments)
            }
        },
        parseStatusChange: function(t, e, n, a) {
            var i = this,
                o = "",
                r = "",
                s = -1;
            switch (i.callActions("beforeParseStatusChange", arguments), i.type) {
                case "filter":
                    e.filter === n.filter ? i.renderStatus(t, "active") : i.renderStatus(t, "inactive");
                    break;
                case "multimix":
                    e.sort === n.sort && e.filter === n.filter ? i.renderStatus(t, "active") : i.renderStatus(t, "inactive");
                    break;
                case "sort":
                    e.sort.match(/:asc/g) && (o = e.sort.replace(/:asc/g, "")), e.sort === n.sort || o === n.sort ? i.renderStatus(t, "active") : i.renderStatus(t, "inactive");
                    break;
                case "toggle":
                    for (a.length < 1 && i.renderStatus(t, "inactive"), e.filter === n.filter && i.renderStatus(t, "active"), s = 0; s < a.length; s++) {
                        if (r = a[s], r === n.filter) {
                            i.renderStatus(t, "active");
                            break
                        }
                        i.renderStatus(t, "inactive")
                    }
            }
            i.callActions("afterParseStatusChange", arguments)
        },
        renderStatus: function(t, e) {
            var a = this;
            switch (a.callActions("beforeRenderStatus", arguments), e) {
                case "active":
                    n.addClass(t, a.classNames.active), n.removeClass(t, a.classNames.disabled), a.canDisable && (a.el.disabled = !1);
                    break;
                case "inactive":
                    n.removeClass(t, a.classNames.active), n.removeClass(t, a.classNames.disabled), a.canDisable && (a.el.disabled = !1);
                    break;
                case "disabled":
                    a.canDisable && (a.el.disabled = !0), n.addClass(t, a.classNames.disabled), n.removeClass(t, a.classNames.active)
            }
            "live" !== a.status && (a.status = e), a.callActions("afterRenderStatus", arguments)
        }
    }), e.controls = [], e.StyleData = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.x = 0, this.y = 0, this.top = 0, this.right = 0, this.bottom = 0, this.left = 0, this.width = 0, this.height = 0, this.marginRight = 0, this.marginBottom = 0, this.opacity = 0, this.scale = new e.TransformData, this.translateX = new e.TransformData, this.translateY = new e.TransformData, this.translateZ = new e.TransformData, this.rotateX = new e.TransformData, this.rotateY = new e.TransformData, this.rotateZ = new e.TransformData, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.StyleData), e.StyleData.prototype = Object.create(e.Base.prototype), e.StyleData.prototype.constructor = e.StyleData, e.TransformData = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.value = 0, this.unit = "", this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.TransformData), e.TransformData.prototype = Object.create(e.Base.prototype), e.TransformData.prototype.constructor = e.TransformData, e.TransformDefaults = function() {
        e.StyleData.apply(this), this.callActions("beforeConstruct"), this.scale.value = .01, this.scale.unit = "", this.translateX.value = 20, this.translateX.unit = "px", this.translateY.value = 20, this.translateY.unit = "px", this.translateZ.value = 20, this.translateZ.unit = "px", this.rotateX.value = 90, this.rotateX.unit = "deg", this.rotateY.value = 90, this.rotateY.unit = "deg", this.rotateX.value = 90, this.rotateX.unit = "deg", this.rotateZ.value = 180, this.rotateZ.unit = "deg", this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.TransformDefaults), e.TransformDefaults.prototype = Object.create(e.StyleData.prototype), e.TransformDefaults.prototype.constructor = e.TransformDefaults, e.transformDefaults = new e.TransformDefaults, e.EventDetail = function() {
        this.state = null, this.futureState = null, this.instance = null, this.originalEvent = null
    }, e.Events = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.mixStart = null, this.mixBusy = null, this.mixEnd = null, this.mixFail = null, this.mixClick = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.Events), e.Events.prototype = Object.create(e.Base.prototype), e.Events.prototype.constructor = e.Events, e.Events.prototype.fire = function(t, a, i, o) {
        var r = this,
            s = null,
            l = new e.EventDetail;
        if (r.callActions("beforeFire", arguments), "undefined" == typeof r[t]) throw new Error('Event type "' + t + '" not found.');
        l.state = new e.State, n.extend(l.state, i.state), i.futureState && (l.futureState = new e.State, n.extend(l.futureState, i.futureState)), l.instance = i.instance, i.originalEvent && (l.originalEvent = i.originalEvent), s = n.getCustomEvent(t, l, o), r.callFilters("eventFire", s, arguments), a.dispatchEvent(s)
    }, e.events = new e.Events, e.QueueItem = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.args = [], this.instruction = null, this.triggerElement = null, this.deferred = null, this.isToggling = !1, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.QueueItem), e.QueueItem.prototype = Object.create(e.Base.prototype), e.QueueItem.prototype.constructor = e.QueueItem, e.Mixer = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.config = new e.Config, this.id = "", this.isBusy = !1, this.isToggling = !1, this.incPadding = !0, this.controls = [], this.targets = [], this.origOrder = [], this.cache = {}, this.toggleArray = [], this.targetsMoved = 0, this.targetsImmovable = 0, this.targetsBound = 0, this.targetsDone = 0, this.staggerDuration = 0, this.effectsIn = null, this.effectsOut = null, this.transformIn = [], this.transformOut = [], this.queue = [], this.state = null, this.lastOperation = null,
            this.lastClicked = null, this.userCallback = null, this.userDeferred = null, this.dom = new e.MixerDom, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.Mixer), e.Mixer.prototype = Object.create(e.Base.prototype), n.extend(e.Mixer.prototype, {
        constructor: e.Mixer,
        attach: function(a, i, o, r) {
            var s = this,
                l = null,
                c = -1;
            for (s.callActions("beforeAttach", arguments), s.id = o, r && n.extend(s.config, r, !0, !0), s.sanitizeConfig(), s.cacheDom(a, i), s.config.layout.containerClassName && n.addClass(s.dom.container, s.config.layout.containerClassName), e.features.has.transitions || (s.config.animation.enable = !1), "undefined" == typeof t.console && (s.config.debug.showWarnings = !1), s.config.data.uidKey && (s.config.controls.enable = !1), s.indexTargets(), s.state = s.getInitialState(), c = 0; l = s.lastOperation.toHide[c]; c++) l.hide();
            s.config.controls.enable && (s.initControls(), s.buildToggleArray(null, s.state), s.updateControls({
                filter: s.state.activeFilter,
                sort: s.state.activeSort
            })), s.parseEffects(), s.callActions("afterAttach", arguments)
        },
        sanitizeConfig: function() {
            var t = this;
            t.callActions("beforeSanitizeConfig", arguments), t.config.controls.scope = t.config.controls.scope.toLowerCase().trim(), t.config.controls.toggleLogic = t.config.controls.toggleLogic.toLowerCase().trim(), t.config.controls.toggleDefault = t.config.controls.toggleDefault.toLowerCase().trim(), t.config.animation.effects = t.config.animation.effects.trim(), t.callActions("afterSanitizeConfig", arguments)
        },
        getInitialState: function() {
            var t = this,
                n = new e.State,
                a = new e.Operation;
            if (t.callActions("beforeGetInitialState", arguments), n.activeContainerClassName = t.config.layout.containerClassName, t.config.load.dataset) {
                if (!t.config.data.uidKey || "string" != typeof t.config.data.uidKey) throw new TypeError(e.messages.errorConfigDataUidKeyNotSet());
                a.startDataset = a.newDataset = n.activeDataset = t.config.load.dataset.slice(), a.startContainerClassName = a.newContainerClassName = n.activeContainerClassName, a.show = t.targets.slice(), n = t.callFilters("stateGetInitialState", n, arguments)
            } else n.activeFilter = t.parseFilterArgs([t.config.load.filter]).command, n.activeSort = t.parseSortArgs([t.config.load.sort]).command, n.totalTargets = t.targets.length, n = t.callFilters("stateGetInitialState", n, arguments), n.activeSort.collection || n.activeSort.attribute || "random" === n.activeSort.order || "desc" === n.activeSort.order ? (a.newSort = n.activeSort, t.sortOperation(a), t.printSort(!1, a), t.targets = a.newOrder) : a.startOrder = a.newOrder = t.targets, a.startFilter = a.newFilter = n.activeFilter, a.startSort = a.newSort = n.activeSort, a.startContainerClassName = a.newContainerClassName = n.activeContainerClassName, "all" === a.newFilter.selector ? a.newFilter.selector = t.config.selectors.target : "none" === a.newFilter.selector && (a.newFilter.selector = "");
            return a = t.callFilters("operationGetInitialState", a, [n]), t.lastOperation = a, a.newFilter && t.filterOperation(a), n = t.buildState(a)
        },
        cacheDom: function(t, e) {
            var n = this;
            n.callActions("beforeCacheDom", arguments), n.dom.document = e, n.dom.body = n.dom.document.querySelector("body"), n.dom.container = t, n.dom.parent = t, n.callActions("afterCacheDom", arguments)
        },
        indexTargets: function() {
            var t = this,
                a = null,
                i = null,
                o = null,
                r = -1;
            if (t.callActions("beforeIndexTargets", arguments), t.dom.targets = t.config.layout.allowNestedTargets ? t.dom.container.querySelectorAll(t.config.selectors.target) : n.children(t.dom.container, t.config.selectors.target, t.dom.document), t.dom.targets = n.arrayFromList(t.dom.targets), t.targets = [], (o = t.config.load.dataset) && o.length !== t.dom.targets.length) throw new Error(e.messages.errorDatasetPrerenderedMismatch());
            if (t.dom.targets.length) {
                for (r = 0; i = t.dom.targets[r]; r++) a = new e.Target, a.init(i, t, o ? o[r] : void 0), a.isInDom = !0, t.targets.push(a);
                t.dom.parent = t.dom.targets[0].parentElement === t.dom.container ? t.dom.container : t.dom.targets[0].parentElement
            }
            t.origOrder = t.targets, t.callActions("afterIndexTargets", arguments)
        },
        initControls: function() {
            var t = this,
                n = "",
                a = null,
                i = null,
                o = null,
                r = null,
                s = null,
                l = -1,
                c = -1;
            switch (t.callActions("beforeInitControls", arguments), t.config.controls.scope) {
                case "local":
                    o = t.dom.container;
                    break;
                case "global":
                    o = t.dom.document;
                    break;
                default:
                    throw new Error(e.messages.errorConfigInvalidControlsScope())
            }
            for (l = 0; n = e.controlDefinitions[l]; l++)
                if (t.config.controls.live || n.live) {
                    if (n.parent) {
                        if (r = t.dom[n.parent], !r || r.length < 0) continue;
                        "number" != typeof r.length && (r = [r])
                    } else r = [o];
                    for (c = 0; i = r[c]; c++) s = t.getControl(i, n.type, n.selector), t.controls.push(s)
                } else
                    for (a = o.querySelectorAll(t.config.selectors.control + n.selector), c = 0; i = a[c]; c++) s = t.getControl(i, n.type, ""), s && t.controls.push(s);
            t.callActions("afterInitControls", arguments)
        },
        getControl: function(t, a, i) {
            var o = this,
                r = null,
                s = -1;
            if (o.callActions("beforeGetControl", arguments), !i)
                for (s = 0; r = e.controls[s]; s++) {
                    if (r.el === t && r.isBound(o)) return o.callFilters("controlGetControl", null, arguments);
                    if (r.el === t && r.type === a && r.selector === i) return r.addBinding(o), o.callFilters("controlGetControl", r, arguments)
                }
            return r = new e.Control, r.init(t, a, i), r.classNames.base = n.getClassname(o.config.classNames, a), r.classNames.active = n.getClassname(o.config.classNames, a, o.config.classNames.modifierActive), r.classNames.disabled = n.getClassname(o.config.classNames, a, o.config.classNames.modifierDisabled), r.addBinding(o), o.callFilters("controlGetControl", r, arguments)
        },
        getToggleSelector: function() {
            var t = this,
                e = "or" === t.config.controls.toggleLogic ? ", " : "",
                a = "";
            return t.callActions("beforeGetToggleSelector", arguments), t.toggleArray = n.clean(t.toggleArray), a = t.toggleArray.join(e), "" === a && (a = t.config.controls.toggleDefault), t.callFilters("selectorGetToggleSelector", a, arguments)
        },
        buildToggleArray: function(t, e) {
            var a = this,
                i = "";
            if (a.callActions("beforeBuildToggleArray", arguments), t && t.filter) i = t.filter.selector.replace(/\s/g, "");
            else {
                if (!e) return;
                i = e.activeFilter.selector.replace(/\s/g, "")
            }
            i !== a.config.selectors.target && "all" !== i || (i = ""), "or" === a.config.controls.toggleLogic ? a.toggleArray = i.split(",") : a.toggleArray = a.splitCompoundSelector(i), a.toggleArray = n.clean(a.toggleArray), a.callActions("afterBuildToggleArray", arguments)
        },
        splitCompoundSelector: function(t) {
            var e = t.split(/([\.\[])/g),
                n = [],
                a = "",
                i = -1;
            for ("" === e[0] && e.shift(), i = 0; i < e.length; i++) i % 2 === 0 && (a = ""), a += e[i], i % 2 !== 0 && n.push(a);
            return n
        },
        updateControls: function(t) {
            var a = this,
                i = null,
                o = new e.CommandMultimix,
                r = -1;
            for (a.callActions("beforeUpdateControls", arguments), t.filter ? o.filter = t.filter.selector : o.filter = a.state.activeFilter.selector, t.sort ? o.sort = a.buildSortString(t.sort) : o.sort = a.buildSortString(a.state.activeSort), o.filter === a.config.selectors.target && (o.filter = "all"), "" === o.filter && (o.filter = "none"), n.freeze(o), r = 0; i = a.controls[r]; r++) i.update(o, a.toggleArray);
            a.callActions("afterUpdateControls", arguments)
        },
        buildSortString: function(t) {
            var e = this,
                n = "";
            return n += t.sortString, t.next && (n += " " + e.buildSortString(t.next)), n
        },
        insertTargets: function(t, a) {
            var i = this,
                o = null,
                r = -1,
                s = null,
                l = null,
                c = null,
                u = -1;
            if (i.callActions("beforeInsertTargets", arguments), "undefined" == typeof t.index && (t.index = 0), o = i.getNextSibling(t.index, t.sibling, t.position), s = i.dom.document.createDocumentFragment(), r = o ? n.index(o, i.config.selectors.target) : i.targets.length, t.collection) {
                for (u = 0; c = t.collection[u]; u++) {
                    if (i.dom.targets.indexOf(c) > -1) throw new Error(e.messages.errorInsertPreexistingElement());
                    c.style.display = "none", s.appendChild(c), s.appendChild(i.dom.document.createTextNode(" ")), n.isElement(c, i.dom.document) && c.matches(i.config.selectors.target) && (l = new e.Target, l.init(c, i), l.isInDom = !0, i.targets.splice(r, 0, l), r++)
                }
                i.dom.parent.insertBefore(s, o)
            }
            a.startOrder = i.origOrder = i.targets, i.callActions("afterInsertTargets", arguments)
        },
        getNextSibling: function(t, e, n) {
            var a = this,
                i = null;
            return t = Math.max(t, 0), e && "before" === n ? i = e : e && "after" === n ? i = e.nextElementSibling || null : a.targets.length > 0 && "undefined" != typeof t ? i = t < a.targets.length || !a.targets.length ? a.targets[t].dom.el : a.targets[a.targets.length - 1].dom.el.nextElementSibling : 0 === a.targets.length && a.dom.parent.children.length > 0 && (a.config.layout.siblingAfter ? i = a.config.layout.siblingAfter : a.config.layout.siblingBefore ? i = a.config.layout.siblingBefore.nextElementSibling : a.dom.parent.children[0]), a.callFilters("elementGetNextSibling", i, arguments)
        },
        filterOperation: function(t) {
            var e = this,
                n = !1,
                a = -1,
                i = "",
                o = null,
                r = -1;
            for (e.callActions("beforeFilterOperation", arguments), i = t.newFilter.action, r = 0; o = t.newOrder[r]; r++) n = t.newFilter.collection ? t.newFilter.collection.indexOf(o.dom.el) > -1 : "" !== t.newFilter.selector && o.dom.el.matches(t.newFilter.selector), e.evaluateHideShow(n, o, i, t);
            if (t.toRemove.length)
                for (r = 0; o = t.show[r]; r++) t.toRemove.indexOf(o) > -1 && (t.show.splice(r, 1), (a = t.toShow.indexOf(o)) > -1 && t.toShow.splice(a, 1), t.toHide.push(o), t.hide.push(o), r--);
            t.matching = t.show.slice(), 0 === t.show.length && "" !== t.newFilter.selector && 0 !== e.targets.length && (t.hasFailed = !0), e.callActions("afterFilterOperation", arguments)
        },
        evaluateHideShow: function(t, e, n, a) {
            var i = this,
                o = !1,
                r = Array.prototype.slice.call(arguments, 1);
            o = i.callFilters("testResultEvaluateHideShow", t, r), i.callActions("beforeEvaluateHideShow", arguments), o === !0 && "show" === n || o === !1 && "hide" === n ? (a.show.push(e), !e.isShown && a.toShow.push(e)) : (a.hide.push(e), e.isShown && a.toHide.push(e)), i.callActions("afterEvaluateHideShow", arguments)
        },
        sortOperation: function(t) {
            var a = this,
                i = [],
                o = null,
                r = null,
                s = -1;
            if (a.callActions("beforeSortOperation", arguments), t.startOrder = a.targets, t.newSort.collection) {
                for (i = [], s = 0; r = t.newSort.collection[s]; s++) {
                    if (a.dom.targets.indexOf(r) < 0) throw new Error(e.messages.errorSortNonExistentElement());
                    o = new e.Target, o.init(r, a), o.isInDom = !0, i.push(o)
                }
                t.newOrder = i
            } else "random" === t.newSort.order ? t.newOrder = n.arrayShuffle(t.startOrder) : "" === t.newSort.attribute ? (t.newOrder = a.origOrder.slice(), "desc" === t.newSort.order && t.newOrder.reverse()) : (t.newOrder = t.startOrder.slice(), t.newOrder.sort(function(e, n) {
                return a.compare(e, n, t.newSort)
            }));
            n.isEqualArray(t.newOrder, t.startOrder) && (t.willSort = !1), a.callActions("afterSortOperation", arguments)
        },
        compare: function(t, e, n) {
            var a = this,
                i = n.order,
                o = a.getAttributeValue(t, n.attribute),
                r = a.getAttributeValue(e, n.attribute);
            return isNaN(1 * o) || isNaN(1 * r) ? (o = o.toLowerCase(), r = r.toLowerCase()) : (o = 1 * o, r = 1 * r), o < r ? "asc" === i ? -1 : 1 : o > r ? "asc" === i ? 1 : -1 : o === r && n.next ? a.compare(t, e, n.next) : 0
        },
        getAttributeValue: function(t, n) {
            var a = this,
                i = "";
            return i = t.dom.el.getAttribute("data-" + n), null === i && a.config.debug.showWarnings && console.warn(e.messages.warningInconsistentSortingAttributes({
                attribute: "data-" + n
            })), a.callFilters("valueGetAttributeValue", i || 0, arguments)
        },
        printSort: function(e, a) {
            var i = this,
                o = e ? a.newOrder : a.startOrder,
                r = e ? a.startOrder : a.newOrder,
                s = o.length ? o[o.length - 1].dom.el.nextElementSibling : null,
                l = t.document.createDocumentFragment(),
                c = null,
                u = null,
                f = null,
                h = -1;
            for (i.callActions("beforePrintSort", arguments), h = 0; u = o[h]; h++) f = u.dom.el, "absolute" !== f.style.position && (n.removeWhitespace(f.previousSibling), f.parentElement.removeChild(f));
            for (c = s ? s.previousSibling : i.dom.parent.lastChild, c && "#text" === c.nodeName && n.removeWhitespace(c), h = 0; u = r[h]; h++) f = u.dom.el, n.isElement(l.lastChild) && l.appendChild(t.document.createTextNode(" ")), l.appendChild(f);
            i.dom.parent.firstChild && i.dom.parent.firstChild !== s && l.insertBefore(t.document.createTextNode(" "), l.childNodes[0]), s ? (l.appendChild(t.document.createTextNode(" ")), i.dom.parent.insertBefore(l, s)) : i.dom.parent.appendChild(l), i.callActions("afterPrintSort", arguments)
        },
        parseSortString: function(t, a) {
            var i = this,
                o = t.split(" "),
                r = a,
                s = [],
                l = -1;
            for (l = 0; l < o.length; l++) {
                switch (s = o[l].split(":"), r.sortString = o[l], r.attribute = n.dashCase(s[0]), r.order = s[1] || "asc", r.attribute) {
                    case "default":
                        r.attribute = "";
                        break;
                    case "random":
                        r.attribute = "", r.order = "random"
                }
                if (!r.attribute || "random" === r.order) break;
                l < o.length - 1 && (r.next = new e.CommandSort, n.freeze(r), r = r.next)
            }
            return i.callFilters("commandsParseSort", a, arguments)
        },
        parseEffects: function() {
            var t = this,
                n = "",
                a = t.config.animation.effectsIn || t.config.animation.effects,
                i = t.config.animation.effectsOut || t.config.animation.effects;
            t.callActions("beforeParseEffects", arguments), t.effectsIn = new e.StyleData, t.effectsOut = new e.StyleData, t.transformIn = [], t.transformOut = [], t.effectsIn.opacity = t.effectsOut.opacity = 1, t.parseEffect("fade", a, t.effectsIn, t.transformIn), t.parseEffect("fade", i, t.effectsOut, t.transformOut, !0);
            for (n in e.transformDefaults) e.transformDefaults[n] instanceof e.TransformData && (t.parseEffect(n, a, t.effectsIn, t.transformIn), t.parseEffect(n, i, t.effectsOut, t.transformOut, !0));
            t.parseEffect("stagger", a, t.effectsIn, t.transformIn), t.parseEffect("stagger", i, t.effectsOut, t.transformOut, !0), t.callActions("afterParseEffects", arguments)
        },
        parseEffect: function(t, n, a, i, o) {
            var r = this,
                s = /\(([^)]+)\)/,
                l = -1,
                c = "",
                u = [],
                f = "",
                h = ["%", "px", "em", "rem", "vh", "vw", "deg"],
                d = "",
                m = -1;
            if (r.callActions("beforeParseEffect", arguments), "string" != typeof n) throw new TypeError(e.messages.errorConfigInvalidAnimationEffects());
            if (n.indexOf(t) < 0) return void("stagger" === t && (r.staggerDuration = 0));
            switch (l = n.indexOf(t + "("), l > -1 && (c = n.substring(l), u = s.exec(c), f = u[1]), t) {
                case "fade":
                    a.opacity = f ? parseFloat(f) : 0;
                    break;
                case "stagger":
                    r.staggerDuration = f ? parseFloat(f) : 100;
                    break;
                default:
                    if (o && r.config.animation.reverseOut && "scale" !== t ? a[t].value = (f ? parseFloat(f) : e.transformDefaults[t].value) * -1 : a[t].value = f ? parseFloat(f) : e.transformDefaults[t].value, f) {
                        for (m = 0; d = h[m]; m++)
                            if (f.indexOf(d) > -1) {
                                a[t].unit = d;
                                break
                            }
                    } else a[t].unit = e.transformDefaults[t].unit;
                    i.push(t + "(" + a[t].value + a[t].unit + ")")
            }
            r.callActions("afterParseEffect", arguments)
        },
        buildState: function(t) {
            var n = this,
                a = new e.State,
                i = null,
                o = -1;
            for (n.callActions("beforeBuildState", arguments), o = 0; i = n.targets[o]; o++)(!t.toRemove.length || t.toRemove.indexOf(i) < 0) && a.targets.push(i.dom.el);
            for (o = 0; i = t.matching[o]; o++) a.matching.push(i.dom.el);
            for (o = 0; i = t.show[o]; o++) a.show.push(i.dom.el);
            for (o = 0; i = t.hide[o]; o++)(!t.toRemove.length || t.toRemove.indexOf(i) < 0) && a.hide.push(i.dom.el);
            return a.id = n.id, a.container = n.dom.container, a.activeFilter = t.newFilter, a.activeSort = t.newSort, a.activeDataset = t.newDataset, a.activeContainerClassName = t.newContainerClassName, a.hasFailed = t.hasFailed, a.totalTargets = n.targets.length, a.totalShow = t.show.length, a.totalHide = t.hide.length, a.totalMatching = t.matching.length, a.triggerElement = t.triggerElement, n.callFilters("stateBuildState", a, arguments)
        },
        goMix: function(a, i) {
            var o = this,
                r = null;
            return o.callActions("beforeGoMix", arguments), o.config.animation.duration && o.config.animation.effects && n.isVisible(o.dom.container) || (a = !1), i.toShow.length || i.toHide.length || i.willSort || i.willChangeLayout || (a = !1), i.startState.show.length || i.show.length || (a = !1), e.events.fire("mixStart", o.dom.container, {
                state: i.startState,
                futureState: i.newState,
                instance: o
            }, o.dom.document), "function" == typeof o.config.callbacks.onMixStart && o.config.callbacks.onMixStart.call(o.dom.container, i.startState, i.newState, o), n.removeClass(o.dom.container, n.getClassname(o.config.classNames, "container", o.config.classNames.modifierFailed)), r = o.userDeferred ? o.userDeferred : o.userDeferred = n.defer(e.libraries), o.isBusy = !0, a && e.features.has.transitions ? (t.pageYOffset !== i.docState.scrollTop && t.scrollTo(i.docState.scrollLeft, i.docState.scrollTop), o.config.animation.applyPerspective && (o.dom.parent.style[e.features.perspectiveProp] = o.config.animation.perspectiveDistance, o.dom.parent.style[e.features.perspectiveOriginProp] = o.config.animation.perspectiveOrigin), o.config.animation.animateResizeContainer && i.startHeight !== i.newHeight && i.viewportDeltaY !== i.startHeight - i.newHeight && (o.dom.parent.style.height = i.startHeight + "px"), o.config.animation.animateResizeContainer && i.startWidth !== i.newWidth && i.viewportDeltaX !== i.startWidth - i.newWidth && (o.dom.parent.style.width = i.startWidth + "px"), i.startHeight === i.newHeight && (o.dom.parent.style.height = i.startHeight + "px"), i.startWidth === i.newWidth && (o.dom.parent.style.width = i.startWidth + "px"), i.startHeight === i.newHeight && i.startWidth === i.newWidth && (o.dom.parent.style.overflow = "hidden"), requestAnimationFrame(function() {
                o.moveTargets(i)
            }), o.callFilters("promiseGoMix", r.promise, arguments)) : (o.config.debug.fauxAsync ? setTimeout(function() {
                o.cleanUp(i)
            }, o.config.animation.duration) : o.cleanUp(i), o.callFilters("promiseGoMix", r.promise, arguments))
        },
        getStartMixData: function(n) {
            var a = this,
                i = t.getComputedStyle(a.dom.parent),
                o = a.dom.parent.getBoundingClientRect(),
                r = null,
                s = {},
                l = -1,
                c = i[e.features.boxSizingProp];
            for (a.incPadding = "border-box" === c, a.callActions("beforeGetStartMixData", arguments), l = 0; r = n.show[l]; l++) s = r.getPosData(), n.showPosData[l] = {
                startPosData: s
            };
            for (l = 0; r = n.toHide[l]; l++) s = r.getPosData(), n.toHidePosData[l] = {
                startPosData: s
            };
            n.startX = o.left, n.startY = o.top, n.startHeight = a.incPadding ? o.height : o.height - parseFloat(i.paddingTop) - parseFloat(i.paddingBottom) - parseFloat(i.borderTop) - parseFloat(i.borderBottom), n.startWidth = a.incPadding ? o.width : o.width - parseFloat(i.paddingLeft) - parseFloat(i.paddingRight) - parseFloat(i.borderLeft) - parseFloat(i.borderRight), a.callActions("afterGetStartMixData", arguments)
        },
        setInter: function(t) {
            var e = this,
                a = null,
                i = -1;
            for (e.callActions("beforeSetInter", arguments), e.config.animation.clampHeight && (e.dom.parent.style.height = t.startHeight + "px", e.dom.parent.style.overflow = "hidden"), e.config.animation.clampWidth && (e.dom.parent.style.width = t.startWidth + "px", e.dom.parent.style.overflow = "hidden"), i = 0; a = t.toShow[i]; i++) a.show();
            t.willChangeLayout && (n.removeClass(e.dom.container, t.startContainerClassName), n.addClass(e.dom.container, t.newContainerClassName)), e.callActions("afterSetInter", arguments)
        },
        getInterMixData: function(t) {
            var e = this,
                n = null,
                a = -1;
            for (e.callActions("beforeGetInterMixData", arguments), a = 0; n = t.show[a]; a++) t.showPosData[a].interPosData = n.getPosData();
            for (a = 0; n = t.toHide[a]; a++) t.toHidePosData[a].interPosData = n.getPosData();
            e.callActions("afterGetInterMixData", arguments)
        },
        setFinal: function(t) {
            var e = this,
                n = null,
                a = -1;
            for (e.callActions("beforeSetFinal", arguments), t.willSort && e.printSort(!1, t), a = 0; n = t.toHide[a]; a++) n.hide();
            e.callActions("afterSetFinal", arguments)
        },
        getFinalMixData: function(e) {
            var a = this,
                i = null,
                o = null,
                r = null,
                s = -1;
            for (a.callActions("beforeGetFinalMixData", arguments), s = 0; r = e.show[s]; s++) e.showPosData[s].finalPosData = r.getPosData();
            for (s = 0; r = e.toHide[s]; s++) e.toHidePosData[s].finalPosData = r.getPosData();
            for ((a.config.animation.clampHeight || a.config.animation.clampWidth) && (a.dom.parent.style.height = a.dom.parent.style.width = a.dom.parent.style.overflow = ""), a.incPadding || (i = t.getComputedStyle(a.dom.parent)), o = a.dom.parent.getBoundingClientRect(), e.newX = o.left, e.newY = o.top, e.newHeight = a.incPadding ? o.height : o.height - parseFloat(i.paddingTop) - parseFloat(i.paddingBottom) - parseFloat(i.borderTop) - parseFloat(i.borderBottom), e.newWidth = a.incPadding ? o.width : o.width - parseFloat(i.paddingLeft) - parseFloat(i.paddingRight) - parseFloat(i.borderLeft) - parseFloat(i.borderRight), e.viewportDeltaX = e.docState.viewportWidth - this.dom.document.documentElement.clientWidth, e.viewportDeltaY = e.docState.viewportHeight - this.dom.document.documentElement.clientHeight, e.willSort && a.printSort(!0, e), s = 0; r = e.toShow[s]; s++) r.hide();
            for (s = 0; r = e.toHide[s]; s++) r.show();
            e.willChangeLayout && (n.removeClass(a.dom.container, e.newContainerClassName), n.addClass(a.dom.container, a.config.layout.containerClassName)), a.callActions("afterGetFinalMixData", arguments)
        },
        getTweenData: function(t) {
            var n = this,
                a = null,
                i = null,
                o = Object.getOwnPropertyNames(n.effectsIn),
                r = "",
                s = null,
                l = -1,
                c = -1,
                u = -1,
                f = -1;
            for (n.callActions("beforeGetTweenData", arguments), u = 0; a = t.show[u]; u++)
                for (i = t.showPosData[u], i.posIn = new e.StyleData, i.posOut = new e.StyleData, i.tweenData = new e.StyleData, a.isShown ? (i.posIn.x = i.startPosData.x - i.interPosData.x, i.posIn.y = i.startPosData.y - i.interPosData.y) : i.posIn.x = i.posIn.y = 0, i.posOut.x = i.finalPosData.x - i.interPosData.x, i.posOut.y = i.finalPosData.y - i.interPosData.y, i.posIn.opacity = a.isShown ? 1 : n.effectsIn.opacity, i.posOut.opacity = 1, i.tweenData.opacity = i.posOut.opacity - i.posIn.opacity, a.isShown || n.config.animation.nudge || (i.posIn.x = i.posOut.x, i.posIn.y = i.posOut.y), i.tweenData.x = i.posOut.x - i.posIn.x, i.tweenData.y = i.posOut.y - i.posIn.y, n.config.animation.animateResizeTargets && (i.posIn.width = i.startPosData.width, i.posIn.height = i.startPosData.height, l = (i.startPosData.width || i.finalPosData.width) - i.interPosData.width, i.posIn.marginRight = i.startPosData.marginRight - l, c = (i.startPosData.height || i.finalPosData.height) - i.interPosData.height, i.posIn.marginBottom = i.startPosData.marginBottom - c, i.posOut.width = i.finalPosData.width, i.posOut.height = i.finalPosData.height, l = (i.finalPosData.width || i.startPosData.width) - i.interPosData.width, i.posOut.marginRight = i.finalPosData.marginRight - l, c = (i.finalPosData.height || i.startPosData.height) - i.interPosData.height, i.posOut.marginBottom = i.finalPosData.marginBottom - c, i.tweenData.width = i.posOut.width - i.posIn.width, i.tweenData.height = i.posOut.height - i.posIn.height, i.tweenData.marginRight = i.posOut.marginRight - i.posIn.marginRight, i.tweenData.marginBottom = i.posOut.marginBottom - i.posIn.marginBottom), f = 0; r = o[f]; f++) s = n.effectsIn[r], s instanceof e.TransformData && s.value && (i.posIn[r].value = s.value, i.posOut[r].value = 0, i.tweenData[r].value = i.posOut[r].value - i.posIn[r].value, i.posIn[r].unit = i.posOut[r].unit = i.tweenData[r].unit = s.unit);
            for (u = 0; a = t.toHide[u]; u++)
                for (i = t.toHidePosData[u], i.posIn = new e.StyleData, i.posOut = new e.StyleData, i.tweenData = new e.StyleData, i.posIn.x = a.isShown ? i.startPosData.x - i.interPosData.x : 0, i.posIn.y = a.isShown ? i.startPosData.y - i.interPosData.y : 0, i.posOut.x = n.config.animation.nudge ? 0 : i.posIn.x, i.posOut.y = n.config.animation.nudge ? 0 : i.posIn.y, i.tweenData.x = i.posOut.x - i.posIn.x, i.tweenData.y = i.posOut.y - i.posIn.y, n.config.animation.animateResizeTargets && (i.posIn.width = i.startPosData.width, i.posIn.height = i.startPosData.height, l = i.startPosData.width - i.interPosData.width, i.posIn.marginRight = i.startPosData.marginRight - l, c = i.startPosData.height - i.interPosData.height, i.posIn.marginBottom = i.startPosData.marginBottom - c), i.posIn.opacity = 1, i.posOut.opacity = n.effectsOut.opacity, i.tweenData.opacity = i.posOut.opacity - i.posIn.opacity, f = 0; r = o[f]; f++) s = n.effectsOut[r], s instanceof e.TransformData && s.value && (i.posIn[r].value = 0, i.posOut[r].value = s.value, i.tweenData[r].value = i.posOut[r].value - i.posIn[r].value, i.posIn[r].unit = i.posOut[r].unit = i.tweenData[r].unit = s.unit);
            n.callActions("afterGetTweenData", arguments)
        },
        moveTargets: function(t) {
            var a = this,
                i = null,
                o = null,
                r = null,
                s = "",
                l = !1,
                c = -1,
                u = -1,
                f = a.checkProgress.bind(a);
            for (a.callActions("beforeMoveTargets", arguments), u = 0; i = t.show[u]; u++) o = new e.IMoveData, r = t.showPosData[u], s = i.isShown ? "none" : "show", l = a.willTransition(s, t.hasEffect, r.posIn, r.posOut), l && c++, i.show(), o.posIn = r.posIn, o.posOut = r.posOut, o.statusChange = s, o.staggerIndex = c, o.operation = t, o.callback = l ? f : null, i.move(o);
            for (u = 0; i = t.toHide[u]; u++) r = t.toHidePosData[u], o = new e.IMoveData, s = "hide", l = a.willTransition(s, r.posIn, r.posOut), o.posIn = r.posIn, o.posOut = r.posOut, o.statusChange = s, o.staggerIndex = u, o.operation = t, o.callback = l ? f : null, i.move(o);
            a.config.animation.animateResizeContainer && (a.dom.parent.style[e.features.transitionProp] = "height " + a.config.animation.duration + "ms ease, width " + a.config.animation.duration + "ms ease ", requestAnimationFrame(function() {
                t.startHeight !== t.newHeight && t.viewportDeltaY !== t.startHeight - t.newHeight && (a.dom.parent.style.height = t.newHeight + "px"), t.startWidth !== t.newWidth && t.viewportDeltaX !== t.startWidth - t.newWidth && (a.dom.parent.style.width = t.newWidth + "px")
            })), t.willChangeLayout && (n.removeClass(a.dom.container, a.config.layout.ContainerClassName), n.addClass(a.dom.container, t.newContainerClassName)), a.callActions("afterMoveTargets", arguments)
        },
        hasEffect: function() {
            var t = this,
                e = ["scale", "translateX", "translateY", "translateZ", "rotateX", "rotateY", "rotateZ"],
                n = "",
                a = null,
                i = !1,
                o = -1,
                r = -1;
            if (1 !== t.effectsIn.opacity) return t.callFilters("resultHasEffect", !0, arguments);
            for (r = 0; n = e[r]; r++)
                if (a = t.effectsIn[n], o = "undefined" !== a.value ? a.value : a, 0 !== o) {
                    i = !0;
                    break
                }
            return t.callFilters("resultHasEffect", i, arguments)
        },
        willTransition: function(t, e, a, i) {
            var o = this,
                r = !1;
            return r = !!n.isVisible(o.dom.container) && (!!("none" !== t && e || a.x !== i.x || a.y !== i.y) || !!o.config.animation.animateResizeTargets && (a.width !== i.width || a.height !== i.height || a.marginRight !== i.marginRight || a.marginTop !== i.marginTop)), o.callFilters("resultWillTransition", r, arguments)
        },
        checkProgress: function(t) {
            var e = this;
            e.targetsDone++, e.targetsBound === e.targetsDone && e.cleanUp(t)
        },
        cleanUp: function(t) {
            var a = this,
                i = null,
                o = null,
                r = null,
                s = null,
                l = -1;
            for (a.callActions("beforeCleanUp", arguments), a.targetsMoved = a.targetsImmovable = a.targetsBound = a.targetsDone = 0, l = 0; i = t.show[l]; l++) i.cleanUp(), i.show();
            for (l = 0; i = t.toHide[l]; l++) i.cleanUp(), i.hide();
            if (t.willSort && a.printSort(!1, t), a.dom.parent.style[e.features.transitionProp] = a.dom.parent.style.height = a.dom.parent.style.width = a.dom.parent.style.overflow = a.dom.parent.style[e.features.perspectiveProp] = a.dom.parent.style[e.features.perspectiveOriginProp] = "", t.willChangeLayout && (n.removeClass(a.dom.container, t.startContainerClassName), n.addClass(a.dom.container, t.newContainerClassName)), t.toRemove.length) {
                for (l = 0; i = a.targets[l]; l++) t.toRemove.indexOf(i) > -1 && ((o = i.dom.el.previousSibling) && "#text" === o.nodeName && (r = i.dom.el.nextSibling) && "#text" === r.nodeName && n.removeWhitespace(o), t.willSort || a.dom.parent.removeChild(i.dom.el), a.targets.splice(l, 1), i.isInDom = !1, l--);
                a.origOrder = a.targets
            }
            t.willSort && (a.targets = t.newOrder), a.state = t.newState, a.lastOperation = t, a.dom.targets = a.state.targets, e.events.fire("mixEnd", a.dom.container, {
                state: a.state,
                instance: a
            }, a.dom.document), "function" == typeof a.config.callbacks.onMixEnd && a.config.callbacks.onMixEnd.call(a.dom.container, a.state, a), t.hasFailed && (e.events.fire("mixFail", a.dom.container, {
                state: a.state,
                instance: a
            }, a.dom.document), "function" == typeof a.config.callbacks.onMixFail && a.config.callbacks.onMixFail.call(a.dom.container, a.state, a), n.addClass(a.dom.container, n.getClassname(a.config.classNames, "container", a.config.classNames.modifierFailed))), "function" == typeof a.userCallback && a.userCallback.call(a.dom.container, a.state, a), "function" == typeof a.userDeferred.resolve && a.userDeferred.resolve(a.state), a.userCallback = null, a.userDeferred = null, a.lastClicked = null, a.isToggling = !1, a.isBusy = !1, a.queue.length && (a.callActions("beforeReadQueueCleanUp", arguments), s = a.queue.shift(), a.userDeferred = s.deferred, a.isToggling = s.isToggling, a.lastClicked = s.triggerElement, s.instruction.command instanceof e.CommandMultimix ? a.multimix.apply(a, s.args) : a.dataset.apply(a, s.args)), a.callActions("afterCleanUp", arguments)
        },
        parseMultimixArgs: function(t) {
            var a = this,
                i = new e.UserInstruction,
                o = null,
                r = -1;
            for (i.animate = a.config.animation.enable, i.command = new e.CommandMultimix, r = 0; r < t.length; r++) o = t[r], null !== o && ("object" == typeof o ? n.extend(i.command, o) : "boolean" == typeof o ? i.animate = o : "function" == typeof o && (i.callback = o));
            return !i.command.insert || i.command.insert instanceof e.CommandInsert || (i.command.insert = a.parseInsertArgs([i.command.insert]).command), !i.command.remove || i.command.remove instanceof e.CommandRemove || (i.command.remove = a.parseRemoveArgs([i.command.remove]).command), !i.command.filter || i.command.filter instanceof e.CommandFilter || (i.command.filter = a.parseFilterArgs([i.command.filter]).command), !i.command.sort || i.command.sort instanceof e.CommandSort || (i.command.sort = a.parseSortArgs([i.command.sort]).command), !i.command.changeLayout || i.command.changeLayout instanceof e.CommandChangeLayout || (i.command.changeLayout = a.parseChangeLayoutArgs([i.command.changeLayout]).command), i = a.callFilters("instructionParseMultimixArgs", i, arguments), n.freeze(i), i
        },
        parseFilterArgs: function(t) {
            var a = this,
                i = new e.UserInstruction,
                o = null,
                r = -1;
            for (i.animate = a.config.animation.enable, i.command = new e.CommandFilter, r = 0; r < t.length; r++) o = t[r], "string" == typeof o ? i.command.selector = o : null === o ? i.command.collection = [] : "object" == typeof o && n.isElement(o, a.dom.document) ? i.command.collection = [o] : "object" == typeof o && "undefined" != typeof o.length ? i.command.collection = n.arrayFromList(o) : "object" == typeof o ? n.extend(i.command, o) : "boolean" == typeof o ? i.animate = o : "function" == typeof o && (i.callback = o);
            if (i.command.selector && i.command.collection) throw new Error(e.messages.errorFilterInvalidArguments());
            return i = a.callFilters("instructionParseFilterArgs", i, arguments), n.freeze(i), i
        },
        parseSortArgs: function(t) {
            var a = this,
                i = new e.UserInstruction,
                o = null,
                r = "",
                s = -1;
            for (i.animate = a.config.animation.enable, i.command = new e.CommandSort, s = 0; s < t.length; s++)
                if (o = t[s], null !== o) switch (typeof o) {
                    case "string":
                        r = o;
                        break;
                    case "object":
                        o.length && (i.command.collection = n.arrayFromList(o));
                        break;
                    case "boolean":
                        i.animate = o;
                        break;
                    case "function":
                        i.callback = o
                }
            return r && (i.command = a.parseSortString(r, i.command)), i = a.callFilters("instructionParseSortArgs", i, arguments), n.freeze(i), i
        },
        parseInsertArgs: function(t) {
            var a = this,
                i = new e.UserInstruction,
                o = null,
                r = -1;
            for (i.animate = a.config.animation.enable, i.command = new e.CommandInsert, r = 0; r < t.length; r++) o = t[r], null !== o && ("number" == typeof o ? i.command.index = o : "string" == typeof o && ["before", "after"].indexOf(o) > -1 ? i.command.position = o : "string" == typeof o ? i.command.collection = n.arrayFromList(n.createElement(o).childNodes) : "object" == typeof o && n.isElement(o, a.dom.document) ? i.command.collection.length ? i.command.sibling = o : i.command.collection = [o] : "object" == typeof o && o.length ? i.command.collection.length ? i.command.sibling = o[0] : i.command.collection = o : "object" == typeof o && o.childNodes && o.childNodes.length ? i.command.collection.length ? i.command.sibling = o.childNodes[0] : i.command.collection = n.arrayFromList(o.childNodes) : "object" == typeof o ? n.extend(i.command, o) : "boolean" == typeof o ? i.animate = o : "function" == typeof o && (i.callback = o));
            if (i.command.index && i.command.sibling) throw new Error(e.messages.errorInsertInvalidArguments());
            return !i.command.collection.length && a.config.debug.showWarnings && console.warn(e.messages.warningInsertNoElements()), i = a.callFilters("instructionParseInsertArgs", i, arguments), n.freeze(i), i
        },
        parseRemoveArgs: function(t) {
            var a = this,
                i = new e.UserInstruction,
                o = null,
                r = null,
                s = -1;
            for (i.animate = a.config.animation.enable, i.command = new e.CommandRemove, s = 0; s < t.length; s++)
                if (r = t[s], null !== r) switch (typeof r) {
                    case "number":
                        a.targets[r] && (i.command.targets[0] = a.targets[r]);
                        break;
                    case "string":
                        i.command.collection = n.arrayFromList(a.dom.parent.querySelectorAll(r));
                        break;
                    case "object":
                        r && r.length ? i.command.collection = r : n.isElement(r, a.dom.document) ? i.command.collection = [r] : n.extend(i.command, r);
                        break;
                    case "boolean":
                        i.animate = r;
                        break;
                    case "function":
                        i.callback = r
                }
            if (i.command.collection.length)
                for (s = 0; o = a.targets[s]; s++) i.command.collection.indexOf(o.dom.el) > -1 && i.command.targets.push(o);
            return !i.command.targets.length && a.config.debug.showWarnings && console.warn(e.messages.warningRemoveNoElements()), n.freeze(i), i
        },
        parseDatasetArgs: function(t) {
            var a = this,
                i = new e.UserInstruction,
                o = null,
                r = -1;
            for (i.animate = a.config.animation.enable, i.command = new e.CommandDataset, r = 0; r < t.length; r++)
                if (o = t[r], null !== o) switch (typeof o) {
                    case "object":
                        Array.isArray(o) || "number" == typeof o.length ? i.command.dataset = o : n.extend(i.command, o);
                        break;
                    case "boolean":
                        i.animate = o;
                        break;
                    case "function":
                        i.callback = o
                }
            return n.freeze(i), i
        },
        parseChangeLayoutArgs: function(t) {
            var a = this,
                i = new e.UserInstruction,
                o = null,
                r = -1;
            for (i.animate = a.config.animation.enable, i.command = new e.CommandChangeLayout, r = 0; r < t.length; r++)
                if (o = t[r], null !== o) switch (typeof o) {
                    case "string":
                        i.command.containerClassName = o;
                        break;
                    case "object":
                        n.extend(i.command, o);
                        break;
                    case "boolean":
                        i.animate = o;
                        break;
                    case "function":
                        i.callback = o
                }
            return n.freeze(i), i
        },
        queueMix: function(t) {
            var a = this,
                i = null,
                o = "";
            return a.callActions("beforeQueueMix", arguments), i = n.defer(e.libraries), a.config.animation.queue && a.queue.length < a.config.animation.queueLimit ? (t.deferred = i, a.queue.push(t), a.config.controls.enable && (a.isToggling ? (a.buildToggleArray(t.instruction.command), o = a.getToggleSelector(), a.updateControls({
                    filter: {
                        selector: o
                    }
                })) : a.updateControls(t.instruction.command))) : (a.config.debug.showWarnings && console.warn(e.messages.warningMultimixInstanceQueueFull()), i.resolve(a.state), e.events.fire("mixBusy", a.dom.container, {
                    state: a.state,
                    instance: a
                }, a.dom.document), "function" == typeof a.config.callbacks.onMixBusy && a.config.callbacks.onMixBusy.call(a.dom.container, a.state, a)),
                a.callFilters("promiseQueueMix", i.promise, arguments)
        },
        getDataOperation: function(t) {
            var a = this,
                i = new e.Operation,
                o = [];
            if (i = a.callFilters("operationUnmappedGetDataOperation", i, arguments), a.dom.targets.length && !(o = a.state.activeDataset || []).length) throw new Error(e.messages.errorDatasetNotSet());
            return i.id = n.randomHex(), i.startState = a.state, i.startDataset = o, i.newDataset = t.slice(), a.diffDatasets(i), i.startOrder = a.targets, i.newOrder = i.show, a.config.animation.enable && (a.getStartMixData(i), a.setInter(i), i.docState = n.getDocumentState(a.dom.document), a.getInterMixData(i), a.setFinal(i), a.getFinalMixData(i), a.parseEffects(), i.hasEffect = a.hasEffect(), a.getTweenData(i)), a.targets = i.show.slice(), i.newState = a.buildState(i), Array.prototype.push.apply(a.targets, i.toRemove), i = a.callFilters("operationMappedGetDataOperation", i, arguments)
        },
        diffDatasets: function(t) {
            var a = this,
                i = [],
                o = [],
                r = [],
                s = null,
                l = null,
                c = null,
                u = null,
                f = null,
                h = {},
                d = "",
                m = -1;
            for (a.callActions("beforeDiffDatasets", arguments), m = 0; s = t.newDataset[m]; m++) {
                if ("undefined" == typeof(d = s[a.config.data.uidKey]) || d.toString().length < 1) throw new TypeError(e.messages.errorDatasetInvalidUidKey({
                    uidKey: a.config.data.uidKey
                }));
                if (h[d]) throw new Error(e.messages.errorDatasetDuplicateUid({
                    uid: d
                }));
                h[d] = !0, (l = a.cache[d]) instanceof e.Target ? (a.config.data.dirtyCheck && !n.deepEquals(s, l.data) && (c = l.render(s), l.data = s, c !== l.dom.el && (l.isInDom && (l.unbindEvents(), a.dom.parent.replaceChild(c, l.dom.el)), l.isShown || (c.style.display = "none"), l.dom.el = c, l.isInDom && l.bindEvents())), c = l.dom.el) : (l = new e.Target, l.init(null, a, s), l.hide()), l.isInDom ? (f = l.dom.el.nextElementSibling, o.push(d), u && (u.lastElementChild && u.appendChild(a.dom.document.createTextNode(" ")), a.insertDatasetFrag(u, l.dom.el, r), u = null)) : (u || (u = a.dom.document.createDocumentFragment()), u.lastElementChild && u.appendChild(a.dom.document.createTextNode(" ")), u.appendChild(l.dom.el), l.isInDom = !0, l.unbindEvents(), l.bindEvents(), l.hide(), t.toShow.push(l), r.push(l)), t.show.push(l)
            }
            for (u && (f = f || a.config.layout.siblingAfter, f && u.appendChild(a.dom.document.createTextNode(" ")), a.insertDatasetFrag(u, f, r)), m = 0; s = t.startDataset[m]; m++) d = s[a.config.data.uidKey], l = a.cache[d], t.show.indexOf(l) < 0 ? (t.hide.push(l), t.toHide.push(l), t.toRemove.push(l)) : i.push(d);
            n.isEqualArray(i, o) || (t.willSort = !0), a.callActions("afterDiffDatasets", arguments)
        },
        insertDatasetFrag: function(t, e, a) {
            var i = this,
                o = e ? n.arrayFromList(i.dom.parent.children).indexOf(e) : i.targets.length;
            for (i.dom.parent.insertBefore(t, e); a.length;) i.targets.splice(o, 0, a.shift()), o++
        },
        willSort: function(t, e) {
            var n = this,
                a = !1;
            return a = !!(n.config.behavior.liveSort || "random" === t.order || t.attribute !== e.attribute || t.order !== e.order || t.collection !== e.collection || null === t.next && e.next || t.next && null === e.next) || !(!t.next || !e.next) && n.willSort(t.next, e.next), n.callFilters("resultWillSort", a, arguments)
        },
        show: function() {
            var t = this;
            return t.filter("all")
        },
        hide: function() {
            var t = this;
            return t.filter("none")
        },
        isMixing: function() {
            var t = this;
            return t.isBusy
        },
        filter: function() {
            var t = this,
                e = t.parseFilterArgs(arguments);
            return t.multimix({
                filter: e.command
            }, e.animate, e.callback)
        },
        toggleOn: function() {
            var t = this,
                e = t.parseFilterArgs(arguments),
                n = e.command.selector,
                a = "";
            return t.isToggling = !0, t.toggleArray.indexOf(n) < 0 && t.toggleArray.push(n), a = t.getToggleSelector(), t.multimix({
                filter: a
            }, e.animate, e.callback)
        },
        toggleOff: function() {
            var t = this,
                e = t.parseFilterArgs(arguments),
                n = e.command.selector,
                a = t.toggleArray.indexOf(n),
                i = "";
            return t.isToggling = !0, a > -1 && t.toggleArray.splice(a, 1), i = t.getToggleSelector(), t.multimix({
                filter: i
            }, e.animate, e.callback)
        },
        sort: function() {
            var t = this,
                e = t.parseSortArgs(arguments);
            return t.multimix({
                sort: e.command
            }, e.animate, e.callback)
        },
        changeLayout: function() {
            var t = this,
                e = t.parseChangeLayoutArgs(arguments);
            return t.multimix({
                changeLayout: e.command
            }, e.animate, e.callback)
        },
        dataset: function() {
            var t = this,
                n = t.parseDatasetArgs(arguments),
                a = null,
                i = null,
                o = !1;
            return t.callActions("beforeDataset", arguments), t.isBusy ? (i = new e.QueueItem, i.args = arguments, i.instruction = n, t.queueMix(i)) : (n.callback && (t.userCallback = n.callback), o = n.animate ^ t.config.animation.enable ? n.animate : t.config.animation.enable, a = t.getDataOperation(n.command.dataset), t.goMix(o, a))
        },
        multimix: function() {
            var t = this,
                n = null,
                a = !1,
                i = null,
                o = t.parseMultimixArgs(arguments);
            return t.callActions("beforeMultimix", arguments), t.isBusy ? (i = new e.QueueItem, i.args = arguments, i.instruction = o, i.triggerElement = t.lastClicked, i.isToggling = t.isToggling, t.queueMix(i)) : (n = t.getOperation(o.command), t.config.controls.enable && (o.command.filter && !t.isToggling && (t.toggleArray.length = 0, t.buildToggleArray(n.command)), t.queue.length < 1 && t.updateControls(n.command)), o.callback && (t.userCallback = o.callback), a = o.animate ^ t.config.animation.enable ? o.animate : t.config.animation.enable, t.callFilters("operationMultimix", n, arguments), t.goMix(a, n))
        },
        getOperation: function(t) {
            var a = this,
                i = t.sort,
                o = t.filter,
                r = t.changeLayout,
                s = t.remove,
                l = t.insert,
                c = new e.Operation;
            return c = a.callFilters("operationUnmappedGetOperation", c, arguments), c.id = n.randomHex(), c.command = t, c.startState = a.state, c.triggerElement = a.lastClicked, a.isBusy ? (a.config.debug.showWarnings && console.warn(e.messages.warningGetOperationInstanceBusy()), null) : (l && a.insertTargets(l, c), s && (c.toRemove = s.targets), c.startSort = c.newSort = c.startState.activeSort, c.startOrder = c.newOrder = a.targets, i && (c.startSort = c.startState.activeSort, c.newSort = i, c.willSort = a.willSort(i, c.startState.activeSort), c.willSort && a.sortOperation(c)), c.startFilter = c.startState.activeFilter, o ? c.newFilter = o : c.newFilter = n.extend(new e.CommandFilter, c.startFilter), "all" === c.newFilter.selector ? c.newFilter.selector = a.config.selectors.target : "none" === c.newFilter.selector && (c.newFilter.selector = ""), a.filterOperation(c), c.startContainerClassName = c.startState.activeContainerClassName, r ? (c.newContainerClassName = r.containerClassName, c.newContainerClassName !== c.startContainerClassName && (c.willChangeLayout = !0)) : c.newContainerClassName = c.startContainerClassName, a.config.animation.enable && (a.getStartMixData(c), a.setInter(c), c.docState = n.getDocumentState(a.dom.document), a.getInterMixData(c), a.setFinal(c), a.getFinalMixData(c), a.parseEffects(), c.hasEffect = a.hasEffect(), a.getTweenData(c)), c.willSort && (a.targets = c.newOrder), c.newState = a.buildState(c), a.callFilters("operationMappedGetOperation", c, arguments))
        },
        tween: function(t, e) {
            var n = null,
                a = null,
                i = -1,
                o = -1;
            for (e = Math.min(e, 1), e = Math.max(e, 0), o = 0; n = t.show[o]; o++) a = t.showPosData[o], n.applyTween(a, e);
            for (o = 0; n = t.hide[o]; o++) n.isShown && n.hide(), (i = t.toHide.indexOf(n)) > -1 && (a = t.toHidePosData[i], n.isShown || n.show(), n.applyTween(a, e))
        },
        insert: function() {
            var t = this,
                e = t.parseInsertArgs(arguments);
            return t.multimix({
                insert: e.command
            }, e.animate, e.callback)
        },
        insertBefore: function() {
            var t = this,
                e = t.parseInsertArgs(arguments);
            return t.insert(e.command.collection, "before", e.command.sibling, e.animate, e.callback)
        },
        insertAfter: function() {
            var t = this,
                e = t.parseInsertArgs(arguments);
            return t.insert(e.command.collection, "after", e.command.sibling, e.animate, e.callback)
        },
        prepend: function() {
            var t = this,
                e = t.parseInsertArgs(arguments);
            return t.insert(0, e.command.collection, e.animate, e.callback)
        },
        append: function() {
            var t = this,
                e = t.parseInsertArgs(arguments);
            return t.insert(t.state.totalTargets, e.command.collection, e.animate, e.callback)
        },
        remove: function() {
            var t = this,
                e = t.parseRemoveArgs(arguments);
            return t.multimix({
                remove: e.command
            }, e.animate, e.callback)
        },
        getConfig: function(t) {
            var e = this,
                a = null;
            return a = t ? n.getProperty(e.config, t) : e.config, e.callFilters("valueGetConfig", a, arguments)
        },
        configure: function(t) {
            var e = this;
            e.callActions("beforeConfigure", arguments), n.extend(e.config, t, !0, !0), e.callActions("afterConfigure", arguments)
        },
        getState: function() {
            var t = this,
                a = null;
            return a = new e.State, n.extend(a, t.state), n.freeze(a), t.callFilters("stateGetState", a, arguments)
        },
        forceRefresh: function() {
            var t = this;
            t.indexTargets()
        },
        forceRender: function() {
            var t = this,
                e = null,
                n = null,
                a = "";
            for (a in t.cache) e = t.cache[a], n = e.render(e.data), n !== e.dom.el && (e.isInDom && (e.unbindEvents(), t.dom.parent.replaceChild(n, e.dom.el)), e.isShown || (n.style.display = "none"), e.dom.el = n, e.isInDom && e.bindEvents());
            t.state = t.buildState(t.lastOperation)
        },
        destroy: function(t) {
            var n = this,
                a = null,
                i = null,
                o = 0;
            for (n.callActions("beforeDestroy", arguments), o = 0; a = n.controls[o]; o++) a.removeBinding(n);
            for (o = 0; i = n.targets[o]; o++) t && i.show(), i.unbindEvents();
            n.dom.container.id.match(/^MixItUp/) && n.dom.container.removeAttribute("id"), delete e.instances[n.id], n.callActions("afterDestroy", arguments)
        }
    }), e.IMoveData = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.posIn = null, this.posOut = null, this.operation = null, this.callback = null, this.statusChange = "", this.duration = -1, this.staggerIndex = -1, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.IMoveData), e.IMoveData.prototype = Object.create(e.Base.prototype), e.IMoveData.prototype.constructor = e.IMoveData, e.TargetDom = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.el = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.TargetDom), e.TargetDom.prototype = Object.create(e.Base.prototype), e.TargetDom.prototype.constructor = e.TargetDom, e.Target = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.id = "", this.sortString = "", this.mixer = null, this.callback = null, this.isShown = !1, this.isBound = !1, this.isExcluded = !1, this.isInDom = !1, this.handler = null, this.operation = null, this.data = null, this.dom = new e.TargetDom, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.Target), e.Target.prototype = Object.create(e.Base.prototype), n.extend(e.Target.prototype, {
        constructor: e.Target,
        init: function(t, n, a) {
            var i = this,
                o = "";
            if (i.callActions("beforeInit", arguments), i.mixer = n, t || (t = i.render(a)), i.cacheDom(t), i.bindEvents(), "none" !== i.dom.el.style.display && (i.isShown = !0), a && n.config.data.uidKey) {
                if ("undefined" == typeof(o = a[n.config.data.uidKey]) || o.toString().length < 1) throw new TypeError(e.messages.errorDatasetInvalidUidKey({
                    uidKey: n.config.data.uidKey
                }));
                i.id = o, i.data = a, n.cache[o] = i
            }
            i.callActions("afterInit", arguments)
        },
        render: function(t) {
            var a = this,
                i = null,
                o = null,
                r = null,
                s = "";
            if (a.callActions("beforeRender", arguments), i = a.callFilters("renderRender", a.mixer.config.render.target, arguments), "function" != typeof i) throw new TypeError(e.messages.errorDatasetRendererNotSet());
            return s = i(t), s && "object" == typeof s && n.isElement(s) ? o = s : "string" == typeof s && (r = document.createElement("div"), r.innerHTML = s, o = r.firstElementChild), a.callFilters("elRender", o, arguments)
        },
        cacheDom: function(t) {
            var e = this;
            e.callActions("beforeCacheDom", arguments), e.dom.el = t, e.callActions("afterCacheDom", arguments)
        },
        getSortString: function(t) {
            var e = this,
                n = e.dom.el.getAttribute("data-" + t) || "";
            e.callActions("beforeGetSortString", arguments), n = isNaN(1 * n) ? n.toLowerCase() : 1 * n, e.sortString = n, e.callActions("afterGetSortString", arguments)
        },
        show: function() {
            var t = this;
            t.callActions("beforeShow", arguments), t.isShown || (t.dom.el.style.display = "", t.isShown = !0), t.callActions("afterShow", arguments)
        },
        hide: function() {
            var t = this;
            t.callActions("beforeHide", arguments), t.isShown && (t.dom.el.style.display = "none", t.isShown = !1), t.callActions("afterHide", arguments)
        },
        move: function(t) {
            var e = this;
            e.callActions("beforeMove", arguments), e.isExcluded || e.mixer.targetsMoved++, e.applyStylesIn(t), requestAnimationFrame(function() {
                e.applyStylesOut(t)
            }), e.callActions("afterMove", arguments)
        },
        applyTween: function(t, n) {
            var a = this,
                i = "",
                o = null,
                r = t.posIn,
                s = [],
                l = new e.StyleData,
                c = -1;
            for (a.callActions("beforeApplyTween", arguments), l.x = r.x, l.y = r.y, 0 === n ? a.hide() : a.isShown || a.show(), c = 0; i = e.features.TWEENABLE[c]; c++)
                if (o = t.tweenData[i], "x" === i) {
                    if (!o) continue;
                    l.x = r.x + o * n
                } else if ("y" === i) {
                if (!o) continue;
                l.y = r.y + o * n
            } else if (o instanceof e.TransformData) {
                if (!o.value) continue;
                l[i].value = r[i].value + o.value * n, l[i].unit = o.unit, s.push(i + "(" + l[i].value + o.unit + ")")
            } else {
                if (!o) continue;
                l[i] = r[i] + o * n, a.dom.el.style[i] = l[i]
            }(l.x || l.y) && s.unshift("translate(" + l.x + "px, " + l.y + "px)"), s.length && (a.dom.el.style[e.features.transformProp] = s.join(" ")), a.callActions("afterApplyTween", arguments)
        },
        applyStylesIn: function(t) {
            var n = this,
                a = t.posIn,
                i = 1 !== n.mixer.effectsIn.opacity,
                o = [];
            n.callActions("beforeApplyStylesIn", arguments), o.push("translate(" + a.x + "px, " + a.y + "px)"), n.mixer.config.animation.animateResizeTargets && ("show" !== t.statusChange && (n.dom.el.style.width = a.width + "px", n.dom.el.style.height = a.height + "px"), n.dom.el.style.marginRight = a.marginRight + "px", n.dom.el.style.marginBottom = a.marginBottom + "px"), i && (n.dom.el.style.opacity = a.opacity), "show" === t.statusChange && (o = o.concat(n.mixer.transformIn)), n.dom.el.style[e.features.transformProp] = o.join(" "), n.callActions("afterApplyStylesIn", arguments)
        },
        applyStylesOut: function(t) {
            var n = this,
                a = [],
                i = [],
                o = n.mixer.config.animation.animateResizeTargets,
                r = "undefined" != typeof n.mixer.effectsIn.opacity;
            if (n.callActions("beforeApplyStylesOut", arguments), a.push(n.writeTransitionRule(e.features.transformRule, t.staggerIndex)), "none" !== t.statusChange && a.push(n.writeTransitionRule("opacity", t.staggerIndex, t.duration)), o && (a.push(n.writeTransitionRule("width", t.staggerIndex, t.duration)), a.push(n.writeTransitionRule("height", t.staggerIndex, t.duration)), a.push(n.writeTransitionRule("margin", t.staggerIndex, t.duration))), !t.callback) return n.mixer.targetsImmovable++, void(n.mixer.targetsMoved === n.mixer.targetsImmovable && n.mixer.cleanUp(t.operation));
            switch (n.operation = t.operation, n.callback = t.callback, !n.isExcluded && n.mixer.targetsBound++, n.isBound = !0, n.applyTransition(a), o && t.posOut.width > 0 && t.posOut.height > 0 && (n.dom.el.style.width = t.posOut.width + "px", n.dom.el.style.height = t.posOut.height + "px", n.dom.el.style.marginRight = t.posOut.marginRight + "px", n.dom.el.style.marginBottom = t.posOut.marginBottom + "px"), n.mixer.config.animation.nudge || "hide" !== t.statusChange || i.push("translate(" + t.posOut.x + "px, " + t.posOut.y + "px)"), t.statusChange) {
                case "hide":
                    r && (n.dom.el.style.opacity = n.mixer.effectsOut.opacity), i = i.concat(n.mixer.transformOut);
                    break;
                case "show":
                    r && (n.dom.el.style.opacity = 1)
            }(n.mixer.config.animation.nudge || !n.mixer.config.animation.nudge && "hide" !== t.statusChange) && i.push("translate(" + t.posOut.x + "px, " + t.posOut.y + "px)"), n.dom.el.style[e.features.transformProp] = i.join(" "), n.callActions("afterApplyStylesOut", arguments)
        },
        writeTransitionRule: function(t, e, n) {
            var a = this,
                i = a.getDelay(e),
                o = "";
            return o = t + " " + (n > 0 ? n : a.mixer.config.animation.duration) + "ms " + i + "ms " + ("opacity" === t ? "linear" : a.mixer.config.animation.easing), a.callFilters("ruleWriteTransitionRule", o, arguments)
        },
        getDelay: function(t) {
            var e = this,
                n = -1;
            return "function" == typeof e.mixer.config.animation.staggerSequence && (t = e.mixer.config.animation.staggerSequence.call(e, t, e.state)), n = e.mixer.staggerDuration ? t * e.mixer.staggerDuration : 0, e.callFilters("delayGetDelay", n, arguments)
        },
        applyTransition: function(t) {
            var n = this,
                a = t.join(", ");
            n.callActions("beforeApplyTransition", arguments), n.dom.el.style[e.features.transitionProp] = a, n.callActions("afterApplyTransition", arguments)
        },
        handleTransitionEnd: function(t) {
            var e = this,
                n = t.propertyName,
                a = e.mixer.config.animation.animateResizeTargets;
            e.callActions("beforeHandleTransitionEnd", arguments), e.isBound && t.target.matches(e.mixer.config.selectors.target) && (n.indexOf("transform") > -1 || n.indexOf("opacity") > -1 || a && n.indexOf("height") > -1 || a && n.indexOf("width") > -1 || a && n.indexOf("margin") > -1) && (e.callback.call(e, e.operation), e.isBound = !1, e.callback = null, e.operation = null), e.callActions("afterHandleTransitionEnd", arguments)
        },
        eventBus: function(t) {
            var e = this;
            switch (e.callActions("beforeEventBus", arguments), t.type) {
                case "webkitTransitionEnd":
                case "transitionend":
                    e.handleTransitionEnd(t)
            }
            e.callActions("afterEventBus", arguments)
        },
        unbindEvents: function() {
            var t = this;
            t.callActions("beforeUnbindEvents", arguments), n.off(t.dom.el, "webkitTransitionEnd", t.handler), n.off(t.dom.el, "transitionend", t.handler), t.callActions("afterUnbindEvents", arguments)
        },
        bindEvents: function() {
            var t = this,
                a = "";
            t.callActions("beforeBindEvents", arguments), a = "webkit" === e.features.transitionPrefix ? "webkitTransitionEnd" : "transitionend", t.handler = function(e) {
                return t.eventBus(e)
            }, n.on(t.dom.el, a, t.handler), t.callActions("afterBindEvents", arguments)
        },
        getPosData: function(n) {
            var a = this,
                i = {},
                o = null,
                r = new e.StyleData;
            return a.callActions("beforeGetPosData", arguments), r.x = a.dom.el.offsetLeft, r.y = a.dom.el.offsetTop, (a.mixer.config.animation.animateResizeTargets || n) && (o = a.dom.el.getBoundingClientRect(), r.top = o.top, r.right = o.right, r.bottom = o.bottom, r.left = o.left, r.width = o.width, r.height = o.height), a.mixer.config.animation.animateResizeTargets && (i = t.getComputedStyle(a.dom.el), r.marginBottom = parseFloat(i.marginBottom), r.marginRight = parseFloat(i.marginRight)), a.callFilters("posDataGetPosData", r, arguments)
        },
        cleanUp: function() {
            var t = this;
            t.callActions("beforeCleanUp", arguments), t.dom.el.style[e.features.transformProp] = "", t.dom.el.style[e.features.transitionProp] = "", t.dom.el.style.opacity = "", t.mixer.config.animation.animateResizeTargets && (t.dom.el.style.width = "", t.dom.el.style.height = "", t.dom.el.style.marginRight = "", t.dom.el.style.marginBottom = ""), t.callActions("afterCleanUp", arguments)
        }
    }), e.Collection = function(t) {
        var e = null,
            a = -1;
        for (this.callActions("beforeConstruct"), a = 0; e = t[a]; a++) this[a] = e;
        this.length = t.length, this.callActions("afterConstruct"), n.freeze(this)
    }, e.BaseStatic.call(e.Collection), e.Collection.prototype = Object.create(e.Base.prototype), n.extend(e.Collection.prototype, {
        constructor: e.Collection,
        mixitup: function(t) {
            var a = this,
                i = null,
                o = Array.prototype.slice.call(arguments),
                r = [],
                s = -1;
            for (this.callActions("beforeMixitup"), o.shift(), s = 0; i = a[s]; s++) r.push(i[t].apply(i, o));
            return a.callFilters("promiseMixitup", n.all(r, e.libraries), arguments)
        }
    }), e.Operation = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.id = "", this.args = [], this.command = null, this.showPosData = [], this.toHidePosData = [], this.startState = null, this.newState = null, this.docState = null, this.willSort = !1, this.willChangeLayout = !1, this.hasEffect = !1, this.hasFailed = !1, this.triggerElement = null, this.show = [], this.hide = [], this.matching = [], this.toShow = [], this.toHide = [], this.toMove = [], this.toRemove = [], this.startOrder = [], this.newOrder = [], this.startSort = null, this.newSort = null, this.startFilter = null, this.newFilter = null, this.startDataset = null, this.newDataset = null, this.viewportDeltaX = 0, this.viewportDeltaY = 0, this.startX = 0, this.startY = 0, this.startHeight = 0, this.startWidth = 0, this.newX = 0, this.newY = 0, this.newHeight = 0, this.newWidth = 0, this.startContainerClassName = "", this.startDisplay = "", this.newContainerClassName = "", this.newDisplay = "", this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.Operation), e.Operation.prototype = Object.create(e.Base.prototype), e.Operation.prototype.constructor = e.Operation, e.State = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.id = "", this.activeFilter = null, this.activeSort = null, this.activeContainerClassName = "", this.container = null, this.targets = [], this.hide = [], this.show = [], this.matching = [], this.totalTargets = -1, this.totalShow = -1, this.totalHide = -1, this.totalMatching = -1, this.hasFailed = !1, this.triggerElement = null, this.activeDataset = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.State), e.State.prototype = Object.create(e.Base.prototype), e.State.prototype.constructor = e.State, e.UserInstruction = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.command = {}, this.animate = !1, this.callback = null, this.callActions("afterConstruct"), n.seal(this)
    }, e.BaseStatic.call(e.UserInstruction), e.UserInstruction.prototype = Object.create(e.Base.prototype), e.UserInstruction.prototype.constructor = e.UserInstruction, e.Messages = function() {
        e.Base.call(this), this.callActions("beforeConstruct"), this.ERROR_FACTORY_INVALID_CONTAINER = "[MixItUp] An invalid selector or element reference was passed to the mixitup factory function", this.ERROR_FACTORY_CONTAINER_NOT_FOUND = "[MixItUp] The provided selector yielded no container element", this.ERROR_CONFIG_INVALID_ANIMATION_EFFECTS = "[MixItUp] Invalid value for `animation.effects`", this.ERROR_CONFIG_INVALID_CONTROLS_SCOPE = "[MixItUp] Invalid value for `controls.scope`", this.ERROR_CONFIG_INVALID_PROPERTY = '[MixitUp] Invalid configuration object property "${erroneous}"${suggestion}', this.ERROR_CONFIG_INVALID_PROPERTY_SUGGESTION = '. Did you mean "${probableMatch}"?', this.ERROR_CONFIG_DATA_UID_KEY_NOT_SET = "[MixItUp] To use the dataset API, a UID key must be specified using `data.uidKey`", this.ERROR_DATASET_INVALID_UID_KEY = '[MixItUp] The specified UID key "${uidKey}" is not present on one or more dataset items', this.ERROR_DATASET_DUPLICATE_UID = '[MixItUp] The UID "${uid}" was found on two or more dataset items. UIDs must be unique.', this.ERROR_INSERT_INVALID_ARGUMENTS = "[MixItUp] Please provider either an index or a sibling and position to insert, not both", this.ERROR_INSERT_PREEXISTING_ELEMENT = "[MixItUp] An element to be inserted already exists in the container", this.ERROR_FILTER_INVALID_ARGUMENTS = "[MixItUp] Please provide either a selector or collection `.filter()`, not both", this.ERROR_DATASET_NOT_SET = "[MixItUp] To use the dataset API with pre-rendered targets, a starting dataset must be set using `load.dataset`", this.ERROR_DATASET_PRERENDERED_MISMATCH = "[MixItUp] `load.dataset` does not match pre-rendered targets", this.ERROR_DATASET_RENDERER_NOT_SET = "[MixItUp] To insert an element via the dataset API, a target renderer function must be provided to `render.target`", this.ERROR_SORT_NON_EXISTENT_ELEMENT = "[MixItUp] An element to be sorted does not already exist in the container", this.WARNING_FACTORY_PREEXISTING_INSTANCE = "[MixItUp] WARNING: This element already has an active MixItUp instance. The provided configuration object will be ignored. If you wish to perform additional methods on this instance, please create a reference.", this.WARNING_INSERT_NO_ELEMENTS = "[MixItUp] WARNING: No valid elements were passed to `.insert()`", this.WARNING_REMOVE_NO_ELEMENTS = "[MixItUp] WARNING: No valid elements were passed to `.remove()`", this.WARNING_MULTIMIX_INSTANCE_QUEUE_FULL = "[MixItUp] WARNING: An operation was requested but the MixItUp instance was busy. The operation was rejected because the queue is full or queuing is disabled.", this.WARNING_GET_OPERATION_INSTANCE_BUSY = "[MixItUp] WARNING: Operations can be be created while the MixItUp instance is busy.", this.WARNING_NO_PROMISE_IMPLEMENTATION = "[MixItUp] WARNING: No Promise implementations could be found. If you wish to use promises with MixItUp please install an ES6 Promise polyfill.", this.WARNING_INCONSISTENT_SORTING_ATTRIBUTES = '[MixItUp] WARNING: The requested sorting data attribute "${attribute}" was not present on one or more target elements which may product unexpected sort output', this.callActions("afterConstruct"), this.compileTemplates(), n.seal(this)
    }, e.BaseStatic.call(e.Messages), e.Messages.prototype = Object.create(e.Base.prototype), e.Messages.prototype.constructor = e.Messages, e.Messages.prototype.compileTemplates = function() {
        var t = "",
            e = "";
        for (t in this) "string" == typeof(e = this[t]) && (this[n.camelCase(t)] = n.template(e))
    }, e.messages = new e.Messages, e.Facade = function(t) {
        e.Base.call(this), this.callActions("beforeConstruct", arguments), this.configure = t.configure.bind(t), this.show = t.show.bind(t), this.hide = t.hide.bind(t), this.filter = t.filter.bind(t), this.toggleOn = t.toggleOn.bind(t), this.toggleOff = t.toggleOff.bind(t), this.sort = t.sort.bind(t), this.changeLayout = t.changeLayout.bind(t), this.multimix = t.multimix.bind(t), this.dataset = t.dataset.bind(t), this.tween = t.tween.bind(t), this.insert = t.insert.bind(t), this.insertBefore = t.insertBefore.bind(t), this.insertAfter = t.insertAfter.bind(t), this.prepend = t.prepend.bind(t), this.append = t.append.bind(t), this.remove = t.remove.bind(t), this.destroy = t.destroy.bind(t), this.forceRefresh = t.forceRefresh.bind(t), this.forceRender = t.forceRender.bind(t), this.isMixing = t.isMixing.bind(t), this.getOperation = t.getOperation.bind(t), this.getConfig = t.getConfig.bind(t), this.getState = t.getState.bind(t), this.callActions("afterConstruct", arguments), n.freeze(this), n.seal(this)
    }, e.BaseStatic.call(e.Facade), e.Facade.prototype = Object.create(e.Base.prototype), e.Facade.prototype.constructor = e.Facade, "object" == typeof exports && "object" == typeof module ? module.exports = e : "function" == typeof define && define.amd ? define(function() {
        return e
    }) : "undefined" != typeof t.mixitup && "function" == typeof t.mixitup || (t.mixitup = e), e.BaseStatic.call(e.constructor), e.NAME = "mixitup", e.CORE_VERSION = "3.3.1"
}(window);



// Custom
var photogallery = document.querySelector('.photo-gallery');
var mixer = mixitup(photogallery);