!function (a, b) {
    "function" == typeof define && define.amd ? define(b) : "object" == typeof exports ? module.exports = b(require, exports, module) : a.CountUp = b()
}(this, function () {
    var d = function (a, b, c, d, e, f) {
        for (var g = 0, h = ["webkit", "moz", "ms", "o"], i = 0; i < h.length && !window.requestAnimationFrame; ++i)window.requestAnimationFrame = window[h[i] + "RequestAnimationFrame"], window.cancelAnimationFrame = window[h[i] + "CancelAnimationFrame"] || window[h[i] + "CancelRequestAnimationFrame"];
        window.requestAnimationFrame || (window.requestAnimationFrame = function (a) {
            var c = (new Date).getTime(), d = Math.max(0, 16 - (c - g)), e = window.setTimeout(function () {
                a(c + d)
            }, d);
            return g = c + d, e
        }), window.cancelAnimationFrame || (window.cancelAnimationFrame = function (a) {
            clearTimeout(a)
        }), this.options = {useEasing: !0, useGrouping: !0, separator: ",", decimal: "."};
        for (var j in f)f.hasOwnProperty(j) && (this.options[j] = f[j]);
        "" === this.options.separator && (this.options.useGrouping = !1), this.options.prefix || (this.options.prefix = ""), this.options.suffix || (this.options.suffix = ""), this.d = "string" == typeof a ? document.getElementById(a) : a, this.startVal = Number(b), isNaN(b) && (this.startVal = Number(b.match(/[\d]+/g).join(""))), this.endVal = Number(c), isNaN(c) && (this.endVal = Number(c.match(/[\d]+/g).join(""))), this.countDown = this.startVal > this.endVal, this.frameVal = this.startVal, this.decimals = Math.max(0, d || 0), this.dec = Math.pow(10, this.decimals), this.duration = 1e3 * Number(e) || 2e3;
        var k = this;
        this.version = function () {
            return "1.5.3"
        }, this.printValue = function (a) {
            var b = isNaN(a) ? "--" : k.formatNumber(a);
            "INPUT" == k.d.tagName ? this.d.value = b : "text" == k.d.tagName ? this.d.textContent = b : this.d.innerHTML = b
        }, this.easeOutExpo = function (a, b, c, d) {
            return 1024 * c * (-Math.pow(2, -10 * a / d) + 1) / 1023 + b
        }, this.count = function (a) {
            k.startTime || (k.startTime = a), k.timestamp = a;
            var b = a - k.startTime;
            k.remaining = k.duration - b, k.frameVal = k.options.useEasing ? k.countDown ? k.startVal - k.easeOutExpo(b, 0, k.startVal - k.endVal, k.duration) : k.easeOutExpo(b, k.startVal, k.endVal - k.startVal, k.duration) : k.countDown ? k.startVal - (k.startVal - k.endVal) * (b / k.duration) : k.startVal + (k.endVal - k.startVal) * (b / k.duration), k.frameVal = k.countDown ? k.frameVal < k.endVal ? k.endVal : k.frameVal : k.frameVal > k.endVal ? k.endVal : k.frameVal, k.frameVal = Math.round(k.frameVal * k.dec) / k.dec, k.printValue(k.frameVal), b < k.duration ? k.rAF = requestAnimationFrame(k.count) : k.callback && k.callback()
        }, this.start = function (a) {
            return k.callback = a, isNaN(k.endVal) || isNaN(k.startVal) || k.startVal === k.endVal ? (console.log("countUp error: startVal or endVal is not a number"), k.printValue(c)) : k.rAF = requestAnimationFrame(k.count), !1
        }, this.pauseResume = function () {
            k.paused ? (k.paused = !1, delete k.startTime, k.duration = k.remaining, k.startVal = k.frameVal, requestAnimationFrame(k.count)) : (k.paused = !0, cancelAnimationFrame(k.rAF))
        }, this.reset = function () {
            k.paused = !1, delete k.startTime, k.startVal = b, cancelAnimationFrame(k.rAF), k.printValue(k.startVal)
        }, this.update = function (a) {
            cancelAnimationFrame(k.rAF), k.paused = !1, delete k.startTime, k.startVal = k.frameVal, k.endVal = Number(a), k.countDown = k.startVal > k.endVal, k.rAF = requestAnimationFrame(k.count)
        }, this.formatNumber = function (a) {
            a = a.toFixed(k.decimals), a += "";
            var b, c, d, e;
            if (b = a.split("."), c = b[0], d = b.length > 1 ? k.options.decimal + b[1] : "", e = /(\d+)(\d{3})/, k.options.useGrouping)for (; e.test(c);)c = c.replace(e, "$1" + k.options.separator + "$2");
            return k.options.prefix + c + d + k.options.suffix
        }, k.printValue(k.startVal)
    };
    return d
});