Overview

URL bgxmq.com/info.php?uid=194749&c=djQub2lTQzVLMUsrQWVLc1M2OFFLNGRydXRyd2FFb1pkTFZaZUZURTkrRmNjK2JiMUwvQWJBTE1vNHV2VWVrWk5XYTZQaE02WENzV1NkV1FUd1FnQWNkbmRjZDBqVXlvRm1OOEpJejh4OWpqNWVMZ2pOMTBSaVFaNFNmKzBmemxyZnJvbGtrMFBkN1VFU0J3dFVLQVZKSm5oTXlqYlVLRlFndFg1dTZSWkhZNTVkM2RQSkJ2eXBEQXhqcGtvcjI3OURReWU5RlhuOHdpQzBWVG5FdWZvM0k5cm16V3BVVTd2dHA5VW9kSmVpWEhZbEJoYldEVG5Xd2U5SVo0R1cxRmIzWGp3ckQrZUk4djBkQUJXRTNHNmswYjY3aDdBanRTQTMyUmVLQ0FYR1E3d2ExL04yQm56K3ZRc2JOL1ZnL1lmb0lwT3o1d29Qb1FpWExHWFdxVFBjV0hZT3lXRzUrZmMyU0FUNStmT1hPZ2NRK2NBM1NCMG9SQmVqRlVrZmFNT1IyREtLRXViQ080d2t4N1JsWHk5VzlNMTJHVHFYYTFLcnoyWEk9&ts=5023238&da78=5023238
IP88.85.93.34
ASNAS35415 Webzilla B.V.
Location Netherlands
Report completed2019-06-18 21:10:48 CEST
StatusLoading report..
urlquery Alerts No alerts detected


Settings

UserAgentMozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Referer
Pool
Access Level


Intrusion Detection Systems

Suricata /w Emerging Threats Pro  No alerts detected


Blacklists

MDL  No alerts detected
OpenPhish  No alerts detected
PhishTank  No alerts detected
Fortinet's Web Filter  No alerts detected
DNS-BH  No alerts detected
mnemonic secure dns  No alerts detected


Recent reports on same IP/ASN/Domain

Last 10 reports on IP: 88.85.93.34

Date UQ / IDS / BL URL IP
2019-06-11 00:14:29 +0200
0 - 2 - 0 iqkbi.top/ 88.85.93.34
2019-06-10 12:34:37 +0200
0 - 2 - 0 pzyfh.top/ 88.85.93.34
2019-06-09 23:48:14 +0200
0 - 2 - 0 uredy.top/ 88.85.93.34
2019-06-03 16:08:28 +0200
0 - 2 - 0 bxjch.top/ 88.85.93.34
2019-05-31 12:23:34 +0200
0 - 2 - 0 xcufz.top/ 88.85.93.34
2019-05-30 11:52:47 +0200
0 - 2 - 0 arqbl.top/ 88.85.93.34
2019-05-26 18:58:30 +0200
0 - 2 - 0 ywhnh.top/ 88.85.93.34
2019-05-26 12:22:43 +0200
0 - 2 - 0 rclmc.top/ 88.85.93.34
2019-05-25 22:42:22 +0200
0 - 2 - 0 wycji.top/ 88.85.93.34
2019-05-23 15:21:27 +0200
0 - 0 - 1 typiol.com/ 88.85.93.34

Last 10 reports on ASN: AS35415 Webzilla B.V.

Date UQ / IDS / BL URL IP
2019-07-01 09:07:51 +0200
0 - 0 - 0 https://pushazam.com 88.85.66.133
2019-07-01 02:08:27 +0200
0 - 0 - 0 Hilltopads.net 88.85.94.227
2019-06-30 18:03:30 +0200
0 - 0 - 0 https://comdexcipa.info/bI3JVK0LPM2NlOjPPQXRB (...) 88.85.94.232
2019-06-30 17:58:41 +0200
0 - 0 - 0 burporess.pro/bS3TVU0VPW2XlYjZPaXbBczdJemf9g0 (...) 88.85.94.229
2019-06-30 17:53:56 +0200
0 - 0 - 0 https://123freemovie.femvxitrquzretxzdq.info/ 88.85.94.236
2019-06-30 13:52:46 +0200
0 - 0 - 0 https://pornoid.notificationallow.com/ 88.85.94.227
2019-06-30 13:49:33 +0200
0 - 0 - 0 https://notificationallow.com/cbHNViz.aGEF5Lv (...) 88.85.94.227
2019-06-30 13:44:55 +0200
0 - 0 - 0 https://amliands.info/cBHlV/zVaREd5wvxdoGdlSm (...) 88.85.94.238
2019-06-30 13:23:27 +0200
0 - 0 - 1 https://deloplen.com/ 206.54.165.3
2019-06-30 13:16:32 +0200
0 - 0 - 0 https://eneritchmax.info/bF3GVH0IPJ2KlLjMPNXO (...) 88.85.94.237

No other reports on domain: bgxmq.com



JavaScript

Executed Scripts (30)


Executed Evals (5)

#1 JavaScript::Eval (size: 38475, repeated: 1) - SHA256: c047f030c40343429e9107ce31ba5deb82494bd71518528cf86d59017b8a2ea1

                                        (function(name, context, definition) {
    "use strict";
    if (typeof module !== "undefined" && module.exports) {
        module.exports = definition()
    } else if (typeof define === "function" && define.amd) {
        define(definition)
    } else {
        context[name] = definition()
    }
})("fp2", this, function() {
    "use strict";
    if (!Array.prototype.indexOf) {
        Array.prototype.indexOf = function(searchElement, fromIndex) {
            var k;
            if (this == null) {
                throw new TypeError("'this' is null or undefined")
            }
            var O = s(this);
            var len = O.length >>> 0;
            if (len === 0) {
                return -1
            }
            var n = +fromIndex || 0;
            if (Math.abs(n) === Infinity) {
                n = 0
            }
            if (n >= len) {
                return -1
            }
            k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
            while (k < len) {
                if (k in O && O[k] === searchElement) {
                    return k
                }
                k++
            }
            return -1
        }
    }
    var fp2 = function(options) {
        var defaultOptions = {
            swfContainerId: "fingerprintjs2",
            swfPath: "flash/compiled/FontList.swf",
            detectScreenOrientation: true,
            sortPluginsFor: [/palemoon/i]
        };
        this.options = this.extend(options, defaultOptions);
        this.nativeForEach = Array.prototype.forEach;
        this.nativeMap = Array.prototype.map
    };
    fp2.prototype = {
        extend: function(source, target) {
            if (source == null) {
                return target
            }
            for (var k in source) {
                if (source[k] != null && target[k] !== source[k]) {
                    target[k] = source[k]
                }
            }
            return target
        },
        log: function(msg) {
            if (window.console) {
                console.log(msg)
            }
        },
        get: function(done) {
            var keys = [];
            keys = this.userAgentKey(keys);
            keys = this.languageKey(keys);
            keys = this.colorDepthKey(keys);
            keys = this.screenResolutionKey(keys);
            keys = this.availableScreenResolutionKey(keys);
            keys = this.timezoneOffsetKey(keys);
            keys = this.sessionStorageKey(keys);
            keys = this.localStorageKey(keys);
            keys = this.indexedDbKey(keys);
            keys = this.addBehaviorKey(keys);
            keys = this.openDatabaseKey(keys);
            keys = this.cpuClassKey(keys);
            keys = this.platformKey(keys);
            keys = this.doNotTrackKey(keys);
            keys = this.pluginsKey(keys);
            keys = this.canvasKey(keys);
            keys = this.webglKey(keys);
            keys = this.adBlockKey(keys);
            keys = this.hasLiedLanguagesKey(keys);
            keys = this.hasLiedResolutionKey(keys);
            keys = this.hasLiedOsKey(keys);
            keys = this.hasLiedBrowserKey(keys);
            keys = this.touchSupportKey(keys);
            var that = this;
            this.fontsKey(keys, function(newKeys) {
                var values = [];
                that.each(newKeys, function(pair) {
                    var value = pair.value;
                    if (typeof pair.value.join !== "undefined") {
                        value = pair.value.join(";")
                    }
                    values.push(value)
                });
                var murmur = that.x64hash128(values.join("~~~"), 31);
                return done(murmur, newKeys)
            })
        },
        userAgentKey: function(keys) {
            if (!this.options.excludeUserAgent) {
                keys.push({
                    key: "user_agent",
                    value: this.getUserAgent()
                })
            }
            return keys
        },
        getUserAgent: function() {
            return navigator.userAgent
        },
        languageKey: function(keys) {
            if (!this.options.excludeLanguage) {
                keys.push({
                    key: "language",
                    value: navigator.language || navigator.userLanguage || navigator.browserLanguage || navigator.systemLanguage
                })
            }
            return keys
        },
        colorDepthKey: function(keys) {
            if (!this.options.excludeColorDepth) {
                keys.push({
                    key: "color_depth",
                    value: screen.colorDepth
                })
            }
            return keys
        },
        screenResolutionKey: function(keys) {
            if (!this.options.excludeScreenResolution) {
                return this.getScreenResolution(keys)
            }
            return keys
        },
        getScreenResolution: function(keys) {
            var resolution;
            if (this.options.detectScreenOrientation) {
                resolution = (screen.height > screen.width) ? [screen.height, screen.width] : [screen.width, screen.height]
            } else {
                resolution = [screen.width, screen.height]
            }
            if (typeof resolution !== "undefined") {
                keys.push({
                    key: "resolution",
                    value: resolution
                })
            }
            return keys
        },
        availableScreenResolutionKey: function(keys) {
            if (!this.options.excludeAvailableScreenResolution) {
                return this.getAvailableScreenResolution(keys)
            }
            return keys
        },
        getAvailableScreenResolution: function(keys) {
            var available;
            if (screen.availWidth && screen.availHeight) {
                if (this.options.detectScreenOrientation) {
                    available = (screen.availHeight > screen.availWidth) ? [screen.availHeight, screen.availWidth] : [screen.availWidth, screen.availHeight]
                } else {
                    available = [screen.availHeight, screen.availWidth]
                }
            }
            if (typeof available !== "undefined") {
                keys.push({
                    key: "available_resolution",
                    value: available
                })
            }
            return keys
        },
        timezoneOffsetKey: function(keys) {
            if (!this.options.excludeTimezoneOffset) {
                keys.push({
                    key: "timezone_offset",
                    value: new Date().getTimezoneOffset()
                })
            }
            return keys
        },
        sessionStorageKey: function(keys) {
            if (!this.options.excludeSessionStorage && this.hasSessionStorage()) {
                keys.push({
                    key: "session_storage",
                    value: 1
                })
            }
            return keys
        },
        localStorageKey: function(keys) {
            if (!this.options.excludeSessionStorage && this.hasLocalStorage()) {
                keys.push({
                    key: "local_storage",
                    value: 1
                })
            }
            return keys
        },
        indexedDbKey: function(keys) {
            if (!this.options.excludeIndexedDB && this.hasIndexedDB()) {
                keys.push({
                    key: "indexed_db",
                    value: 1
                })
            }
            return keys
        },
        addBehaviorKey: function(keys) {
            if (document.body && !this.options.excludeAddBehavior && document.body.addBehavior) {
                keys.push({
                    key: "add_behavior",
                    value: 1
                })
            }
            return keys
        },
        openDatabaseKey: function(keys) {
            if (!this.options.excludeOpenDatabase && window.openDatabase) {
                keys.push({
                    key: "open_database",
                    value: 1
                })
            }
            return keys
        },
        cpuClassKey: function(keys) {
            if (!this.options.excludeCpuClass) {
                keys.push({
                    key: "cpu_class",
                    value: this.getNavigatorCpuClass()
                })
            }
            return keys
        },
        platformKey: function(keys) {
            if (!this.options.excludePlatform) {
                keys.push({
                    key: "navigator_platform",
                    value: this.getNavigatorPlatform()
                })
            }
            return keys
        },
        doNotTrackKey: function(keys) {
            if (!this.options.excludeDoNotTrack) {
                keys.push({
                    key: "do_not_track",
                    value: this.getDoNotTrack()
                })
            }
            return keys
        },
        canvasKey: function(keys) {
            if (!this.options.excludeCanvas && this.isCanvasSupported()) {
                keys.push({
                    key: "canvas",
                    value: this.getCanvasFp()
                })
            }
            return keys
        },
        webglKey: function(keys) {
            if (this.options.excludeWebGL) {
                if (typeof NODEBUG === "undefined") {
                    this.log("Skipping WebGL fingerprinting per excludeWebGL configuration option")
                }
                return keys
            }
            if (!this.isWebGlSupported()) {
                if (typeof NODEBUG === "undefined") {
                    this.log("Skipping WebGL fingerprinting because it is not supported in this browser")
                }
                return keys
            }
            keys.push({
                key: "webgl",
                value: this.getWebglFp()
            });
            return keys
        },
        adBlockKey: function(keys) {
            if (!this.options.excludeAdBlock) {
                keys.push({
                    key: "adblock",
                    value: this.getAdBlock()
                })
            }
            return keys
        },
        hasLiedLanguagesKey: function(keys) {
            if (!this.options.excludeHasLiedLanguages) {
                keys.push({
                    key: "has_lied_languages",
                    value: this.getHasLiedLanguages()
                })
            }
            return keys
        },
        hasLiedResolutionKey: function(keys) {
            if (!this.options.excludeHasLiedResolution) {
                keys.push({
                    key: "has_lied_resolution",
                    value: this.getHasLiedResolution()
                })
            }
            return keys
        },
        hasLiedOsKey: function(keys) {
            if (!this.options.excludeHasLiedOs) {
                keys.push({
                    key: "has_lied_os",
                    value: this.getHasLiedOs()
                })
            }
            return keys
        },
        hasLiedBrowserKey: function(keys) {
            if (!this.options.excludeHasLiedBrowser) {
                keys.push({
                    key: "has_lied_browser",
                    value: this.getHasLiedBrowser()
                })
            }
            return keys
        },
        fontsKey: function(keys, done) {
            if (this.options.excludeJsFonts) {
                return this.flashFontsKey(keys, done)
            }
            return this.jsFontsKey(keys, done)
        },
        flashFontsKey: function(keys, done) {
            if (this.options.excludeFlashFonts) {
                if (typeof NODEBUG === "undefined") {
                    this.log("Skipping flash fonts detection per excludeFlashFonts configuration option")
                }
                return done(keys)
            }
            if (!this.hasSwfObjectLoaded()) {
                if (typeof NODEBUG === "undefined") {
                    this.log("Swfobject is not detected, Flash fonts enumeration is skipped")
                }
                return done(keys)
            }
            if (!this.hasMinFlashInstalled()) {
                if (typeof NODEBUG === "undefined") {
                    this.log("Flash is not installed, skipping Flash fonts enumeration")
                }
                return done(keys)
            }
            if (typeof this.options.swfPath === "undefined") {
                if (typeof NODEBUG === "undefined") {
                    this.log("To use Flash fonts detection, you must pass a valid swfPath option, skipping Flash fonts enumeration")
                }
                return done(keys)
            }
            this.loadSwfAndDetectFonts(function(fonts) {
                keys.push({
                    key: "swf_fonts",
                    value: fonts.join(";")
                });
                done(keys)
            })
        },
        jsFontsKey: function(keys, done) {
            var that = this;
            return setTimeout(function() {
                var baseFonts = ["monospace", "sans-serif", "serif"];
                var testString = "mmmmmmmmmmlli";
                var testSize = "72px";
                var h = document.getElementsByTagName("body")[0];
                var s = document.createElement("span");
                s.style.fontSize = testSize;
                s.innerHTML = testString;
                var defaultWidth = {};
                var defaultHeight = {};
                for (var index in baseFonts) {
                    s.style.fontFamily = baseFonts[index];
                    h.appendChild(s);
                    defaultWidth[baseFonts[index]] = s.offsetWidth;
                    defaultHeight[baseFonts[index]] = s.offsetHeight;
                    h.removeChild(s)
                }
                var detect = function(font) {
                    var detected = false;
                    for (var index in baseFonts) {
                        s.style.fontFamily = font + "," + baseFonts[index];
                        h.appendChild(s);
                        var matched = (s.offsetWidth !== defaultWidth[baseFonts[index]] || s.offsetHeight !== defaultHeight[baseFonts[index]]);
                        h.removeChild(s);
                        detected = detected || matched
                    }
                    return detected
                };
                var fontList = ["Andale Mono", "Arial", "Arial Black", "Arial Hebrew", "Arial MT", "Arial Narrow", "Arial Rounded MT Bold", "Arial Unicode MS", "Bitstream Vera Sans Mono", "Book Antiqua", "Bookman Old Style", "Calibri", "Cambria", "Cambria Math", "Century", "Century Gothic", "Century Schoolbook", "Comic Sans", "Comic Sans MS", "Consolas", "Courier", "Courier New", "Garamond", "Geneva", "Georgia", "Helvetica", "Helvetica Neue", "Impact", "Lucida Bright", "Lucida Calligraphy", "Lucida Console", "Lucida Fax", "LUCIDA GRANDE", "Lucida Handwriting", "Lucida Sans", "Lucida Sans Typewriter", "Lucida Sans Unicode", "Microsoft Sans Serif", "Monaco", "Monotype Corsiva", "MS Gothic", "MS Outlook", "MS PGothic", "MS Reference Sans Serif", "MS Sans Serif", "MS Serif", "MYRIAD", "MYRIAD PRO", "Palatino", "Palatino Linotype", "Segoe Print", "Segoe Script", "Segoe UI", "Segoe UI Light", "Segoe UI Semibold", "Segoe UI Symbol", "Tahoma", "Times", "Times New Roman", "Times New Roman PS", "Trebuchet MS", "Verdana", "Wingdings", "Wingdings 2", "Wingdings 3"];
                var extendedFontList = ["Abadi MT Condensed Light", "Academy Engraved LET", "ADOBE CASLON PRO", "Adobe Garamond", "ADOBE GARAMOND PRO", "Agency FB", "Aharoni", "Albertus Extra Bold", "Albertus Medium", "Algerian", "Amazone BT", "American Typewriter", "American Typewriter Condensed", "AmerType Md BT", "Andalus", "Angsana New", "AngsanaUPC", "Antique Olive", "Aparajita", "Apple Chancery", "Apple Color Emoji", "Apple SD Gothic Neo", "Arabic Typesetting", "ARCHER", "ARNO PRO", "Arrus BT", "Aurora Cn BT", "AvantGarde Bk BT", "AvantGarde Md BT", "AVENIR", "Ayuthaya", "Bandy", "Bangla Sangam MN", "Bank Gothic", "BankGothic Md BT", "Baskerville", "Baskerville Old Face", "Batang", "BatangChe", "Bauer Bodoni", "Bauhaus 93", "Bazooka", "Bell MT", "Bembo", "Benguiat Bk BT", "Berlin Sans FB", "Berlin Sans FB Demi", "Bernard MT Condensed", "BernhardFashion BT", "BernhardMod BT", "Big Caslon", "BinnerD", "Blackadder ITC", "BlairMdITC TT", "Bodoni 72", "Bodoni 72 Oldstyle", "Bodoni 72 Smallcaps", "Bodoni MT", "Bodoni MT Black", "Bodoni MT Condensed", "Bodoni MT Poster Compressed", "Bookshelf Symbol 7", "Boulder", "Bradley Hand", "Bradley Hand ITC", "Bremen Bd BT", "Britannic Bold", "Broadway", "Browallia New", "BrowalliaUPC", "Brush Script MT", "Californian FB", "Calisto MT", "Calligrapher", "Candara", "CaslonOpnface BT", "Castellar", "Centaur", "Cezanne", "CG Omega", "CG Times", "Chalkboard", "Chalkboard SE", "Chalkduster", "Charlesworth", "Charter Bd BT", "Charter BT", "Chaucer", "ChelthmITC Bk BT", "Chiller", "Clarendon", "Clarendon Condensed", "CloisterBlack BT", "Cochin", "Colonna MT", "Constantia", "Cooper Black", "Copperplate", "Copperplate Gothic", "Copperplate Gothic Bold", "Copperplate Gothic Light", "CopperplGoth Bd BT", "Corbel", "Cordia New", "CordiaUPC", "Cornerstone", "Coronet", "Cuckoo", "Curlz MT", "DaunPenh", "Dauphin", "David", "DB LCD Temp", "DELICIOUS", "Denmark", "DFKai-SB", "Didot", "DilleniaUPC", "DIN", "DokChampa", "Dotum", "DotumChe", "Ebrima", "Edwardian Script ITC", "Elephant", "English 111 Vivace BT", "Engravers MT", "EngraversGothic BT", "Eras Bold ITC", "Eras Demi ITC", "Eras Light ITC", "Eras Medium ITC", "EucrosiaUPC", "Euphemia", "Euphemia UCAS", "EUROSTILE", "Exotc350 Bd BT", "FangSong", "Felix Titling", "Fixedsys", "FONTIN", "Footlight MT Light", "Forte", "FrankRuehl", "Fransiscan", "Freefrm721 Blk BT", "FreesiaUPC", "Freestyle Script", "French Script MT", "FrnkGothITC Bk BT", "Fruitger", "FRUTIGER", "Futura", "Futura Bk BT", "Futura Lt BT", "Futura Md BT", "Futura ZBlk BT", "FuturaBlack BT", "Gabriola", "Galliard BT", "Gautami", "Geeza Pro", "Geometr231 BT", "Geometr231 Hv BT", "Geometr231 Lt BT", "GeoSlab 703 Lt BT", "GeoSlab 703 XBd BT", "Gigi", "Gill Sans", "Gill Sans MT", "Gill Sans MT Condensed", "Gill Sans MT Ext Condensed Bold", "Gill Sans Ultra Bold", "Gill Sans Ultra Bold Condensed", "Gisha", "Gloucester MT Extra Condensed", "GOTHAM", "GOTHAM BOLD", "Goudy Old Style", "Goudy Stout", "GoudyHandtooled BT", "GoudyOLSt BT", "Gujarati Sangam MN", "Gulim", "GulimChe", "Gungsuh", "GungsuhChe", "Gurmukhi MN", "Haettenschweiler", "Harlow Solid Italic", "Harrington", "Heather", "Heiti SC", "Heiti TC", "HELV", "Herald", "High Tower Text", "Hiragino Kaku Gothic ProN", "Hiragino Mincho ProN", "Hoefler Text", "Humanst 521 Cn BT", "Humanst521 BT", "Humanst521 Lt BT", "Imprint MT Shadow", "Incised901 Bd BT", "Incised901 BT", "Incised901 Lt BT", "INCONSOLATA", "Informal Roman", "Informal011 BT", "INTERSTATE", "IrisUPC", "Iskoola Pota", "JasmineUPC", "Jazz LET", "Jenson", "Jester", "Jokerman", "Juice ITC", "Kabel Bk BT", "Kabel Ult BT", "Kailasa", "KaiTi", "Kalinga", "Kannada Sangam MN", "Kartika", "Kaufmann Bd BT", "Kaufmann BT", "Khmer UI", "KodchiangUPC", "Kokila", "Korinna BT", "Kristen ITC", "Krungthep", "Kunstler Script", "Lao UI", "Latha", "Leelawadee", "Letter Gothic", "Levenim MT", "LilyUPC", "Lithograph", "Lithograph Light", "Long Island", "Lydian BT", "Magneto", "Maiandra GD", "Malayalam Sangam MN", "Malgun Gothic", "Mangal", "Marigold", "Marion", "Marker Felt", "Market", "Marlett", "Matisse ITC", "Matura MT Script Capitals", "Meiryo", "Meiryo UI", "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Uighur", "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU", "MingLiU_HKSCS", "MingLiU_HKSCS-ExtB", "MingLiU-ExtB", "Minion", "Minion Pro", "Miriam", "Miriam Fixed", "Mistral", "Modern", "Modern No. 20", "Mona Lisa Solid ITC TT", "Mongolian Baiti", "MONO", "MoolBoran", "Mrs Eaves", "MS LineDraw", "MS Mincho", "MS PMincho", "MS Reference Specialty", "MS UI Gothic", "MT Extra", "MUSEO", "MV Boli", "Nadeem", "Narkisim", "NEVIS", "News Gothic", "News GothicMT", "NewsGoth BT", "Niagara Engraved", "Niagara Solid", "Noteworthy", "NSimSun", "Nyala", "OCR A Extended", "Old Century", "Old English Text MT", "Onyx", "Onyx BT", "OPTIMA", "Oriya Sangam MN", "OSAKA", "OzHandicraft BT", "Palace Script MT", "Papyrus", "Parchment", "Party LET", "Pegasus", "Perpetua", "Perpetua Titling MT", "PetitaBold", "Pickwick", "Plantagenet Cherokee", "Playbill", "PMingLiU", "PMingLiU-ExtB", "Poor Richard", "Poster", "PosterBodoni BT", "PRINCETOWN LET", "Pristina", "PTBarnum BT", "Pythagoras", "Raavi", "Rage Italic", "Ravie", "Ribbon131 Bd BT", "Rockwell", "Rockwell Condensed", "Rockwell Extra Bold", "Rod", "Roman", "Sakkal Majalla", "Santa Fe LET", "Savoye LET", "Sceptre", "Script", "Script MT Bold", "SCRIPTINA", "Serifa", "Serifa BT", "Serifa Th BT", "ShelleyVolante BT", "Sherwood", "Shonar Bangla", "Showcard Gothic", "Shruti", "Signboard", "SILKSCREEN", "SimHei", "Simplified Arabic", "Simplified Arabic Fixed", "SimSun", "SimSun-ExtB", "Sinhala Sangam MN", "Sketch Rockwell", "Skia", "Small Fonts", "Snap ITC", "Snell Roundhand", "Socket", "Souvenir Lt BT", "Staccato222 BT", "Steamer", "Stencil", "Storybook", "Styllo", "Subway", "Swis721 BlkEx BT", "Swiss911 XCm BT", "Sylfaen", "Synchro LET", "System", "Tamil Sangam MN", "Technical", "Teletype", "Telugu Sangam MN", "Tempus Sans ITC", "Terminal", "Thonburi", "Traditional Arabic", "Trajan", "TRAJAN PRO", "Tristan", "Tubular", "Tunga", "Tw Cen MT", "Tw Cen MT Condensed", "Tw Cen MT Condensed Extra Bold", "TypoUpright BT", "Unicorn", "Univers", "Univers CE 55 Medium", "Univers Condensed", "Utsaah", "Vagabond", "Vani", "Vijaya", "Viner Hand ITC", "VisualUI", "Vivaldi", "Vladimir Script", "Vrinda", "Westminster", "WHITNEY", "Wide Latin", "ZapfEllipt BT", "ZapfHumnst BT", "ZapfHumnst Dm BT", "Zapfino", "Zurich BlkEx BT", "Zurich Ex BT", "ZWAdobeF"];
                if (that.options.cj) {
                    fontList = fontList.concat(extendedFontList)
                }
                var available = [];
                for (var i = 0, l = fontList.length; i < l; i++) {
                    if (detect(fontList[i])) {
                        available.push(fontList[i])
                    }
                }
                keys.push({
                    key: "js_fonts",
                    value: available
                });
                done(keys)
            }, 1)
        },
        pluginsKey: function(keys) {
            if (!this.options.excludePlugins) {
                if (this.isIE()) {
                    keys.push({
                        key: "ie_plugins",
                        value: this.getIEPlugins()
                    })
                } else {
                    keys.push({
                        key: "regular_plugins",
                        value: this.getRegularPlugins()
                    })
                }
            }
            return keys
        },
        getRegularPlugins: function() {
            var plugins = [];
            for (var i = 0, l = navigator.plugins.length; i < l; i++) {
                plugins.push(navigator.plugins[i])
            }
            if (this.pluginsShouldBeSorted()) {
                plugins = plugins.sort(function(a, b) {
                    if (a.name > b.name) {
                        return 1
                    }
                    if (a.name < b.name) {
                        return -1
                    }
                    return 0
                })
            }
            return this.map(plugins, function(p) {
                var mimeTypes = this.map(p, function(mt) {
                    return [mt.type, mt.suffixes].join("~")
                }).join(",");
                return [p.name, p.description, mimeTypes].join("::")
            }, this)
        },
        getIEPlugins: function() {
            if (window.ActiveXObject) {
                var names = ["AcroPDF.PDF", "Adodb.Stream", "AgControl.AgControl", "DevalVRXCtrl.DevalVRXCtrl.1", "MacromediaFlashPaper.MacromediaFlashPaper", "Msxml2.DOMDocument", "Msxml2.XMLHTTP", "PDF.PdfCtrl", "QuickTime.QuickTime", "QuickTimeCheckObject.QuickTimeCheck.1", "RealPlayer", "RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)", "RealVideo.RealVideo(tm) ActiveX Control (32-bit)", "Scripting.Dictionary", "SWCtl.SWCtl", "Shell.UIHelper", "ShockwaveFlash.ShockwaveFlash", "Skype.Detection", "TDCCtl.TDCCtl", "WMPlayer.OCX", "rmocx.RealPlayer G2 Control", "rmocx.RealPlayer G2 Control.1"];
                return this.map(names, function(name) {
                    try {
                        new ActiveXObject(name);
                        return name
                    } catch (e) {
                        return null
                    }
                })
            } else {
                return []
            }
        },
        pluginsShouldBeSorted: function() {
            var should = false;
            for (var i = 0, l = this.options.sortPluginsFor.length; i < l; i++) {
                var re = this.options.sortPluginsFor[i];
                if (navigator.userAgent.match(re)) {
                    should = true;
                    break
                }
            }
            return should
        },
        touchSupportKey: function(keys) {
            if (!this.options.excludeTouchSupport) {
                keys.push({
                    key: "touch_support",
                    value: this.getTouchSupport()
                })
            }
            return keys
        },
        hasSessionStorage: function() {
            try {
                return !!window.sessionStorage
            } catch (e) {
                return true
            }
        },
        hasLocalStorage: function() {
            try {
                return !!window.localStorage
            } catch (e) {
                return true
            }
        },
        hasIndexedDB: function() {
            return !!window.indexedDB
        },
        getNavigatorCpuClass: function() {
            if (navigator.cpuClass) {
                return navigator.cpuClass
            } else {
                return "unknown"
            }
        },
        getNavigatorPlatform: function() {
            if (navigator.platform) {
                return navigator.platform
            } else {
                return "unknown"
            }
        },
        getDoNotTrack: function() {
            if (navigator.doNotTrack) {
                return navigator.doNotTrack
            } else {
                return "unknown"
            }
        },
        getTouchSupport: function() {
            var maxTouchPoints = 0;
            var touchEvent = false;
            if (typeof navigator.maxTouchPoints !== "undefined") {
                maxTouchPoints = navigator.maxTouchPoints
            } else if (typeof navigator.msMaxTouchPoints !== "undefined") {
                maxTouchPoints = navigator.msMaxTouchPoints
            }
            try {
                document.createEvent("TouchEvent");
                touchEvent = true
            } catch (_) {}
            var touchStart = "ontouchstart" in window;
            return [maxTouchPoints, touchEvent, touchStart]
        },
        getCanvasFp: function() {
            var result = [];
            var canvas = document.createElement("canvas");
            canvas.width = 2000;
            canvas.height = 200;
            canvas.style.display = "inline";
            var ctx = canvas.getContext("2d");
            ctx.rect(0, 0, 10, 10);
            ctx.rect(2, 2, 6, 6);
            result.push("canvas winding:" + ((ctx.isPointInPath(5, 5, "evenodd") === false) ? "yes" : "no"));
            ctx.textBaseline = "alphabetic";
            ctx.fillStyle = "#f60";
            ctx.fillRect(125, 1, 62, 20);
            ctx.fillStyle = "#069";
            if (this.options.dontUseFakeFontInCanvas) {
                ctx.font = "11pt Arial"
            } else {
                ctx.font = "11pt no-real-font-123"
            }
            ctx.fillText("Cwm fjordbank glyphs vext quiz, \ud83d\ude03", 2, 15);
            ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
            ctx.font = "18pt Arial";
            ctx.fillText("Cwm fjordbank glyphs vext quiz, \ud83d\ude03", 4, 45);
            ctx.globalCompositeOperation = "multiply";
            ctx.fillStyle = "rgb(255,0,255)";
            ctx.beginPath();
            ctx.arc(50, 50, 50, 0, Math.PI * 2, true);
            ctx.closePath();
            ctx.fill();
            ctx.fillStyle = "rgb(0,255,255)";
            ctx.beginPath();
            ctx.arc(100, 50, 50, 0, Math.PI * 2, true);
            ctx.closePath();
            ctx.fill();
            ctx.fillStyle = "rgb(255,255,0)";
            ctx.beginPath();
            ctx.arc(75, 100, 50, 0, Math.PI * 2, true);
            ctx.closePath();
            ctx.fill();
            ctx.fillStyle = "rgb(255,0,255)";
            ctx.arc(75, 75, 75, 0, Math.PI * 2, true);
            ctx.arc(75, 75, 25, 0, Math.PI * 2, true);
            ctx.fill("evenodd");
            result.push("canvas fp:" + canvas.toDataURL());
            return result.join("~")
        },
        getWebglFp: function() {
            var gl;
            var fa2s = function(fa) {
                gl.clearColor(0.0, 0.0, 0.0, 1.0);
                gl.enable(gl.DEPTH_TEST);
                gl.depthFunc(gl.LEQUAL);
                gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
                return "[" + fa[0] + ", " + fa[1] + "]"
            };
            var maxAnisotropy = function(gl) {
                var anisotropy, ext = gl.getExtension("EXT_texture_filter_anisotropic") || gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic") || gl.getExtension("MOZ_EXT_texture_filter_anisotropic");
                return ext ? (anisotropy = gl.getParameter(ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT), 0 === anisotropy && (anisotropy = 2), anisotropy) : null
            };
            gl = this.getWebglCanvas();
            if (!gl) {
                return null
            }
            var result = [];
            var vShaderTemplate = "attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1)}";
            var fShaderTemplate = "precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1)}";
            var vertexPosBuffer = gl.createBuffer();
            gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer);
            var vertices = new Float32Array([-.2, -.9, 0, .4, -.26, 0, 0, .732134444, 0]);
            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
            vertexPosBuffer.itemSize = 3;
            vertexPosBuffer.numItems = 3;
            var program = gl.createProgram(),
                vshader = gl.createShader(gl.VERTEX_SHADER);
            gl.shaderSource(vshader, vShaderTemplate);
            gl.compileShader(vshader);
            var fshader = gl.createShader(gl.FRAGMENT_SHADER);
            gl.shaderSource(fshader, fShaderTemplate);
            gl.compileShader(fshader);
            gl.attachShader(program, vshader);
            gl.attachShader(program, fshader);
            gl.linkProgram(program);
            gl.useProgram(program);
            program.vertexPosAttrib = gl.getAttribLocation(program, "attrVertex");
            program.offsetUniform = gl.getUniformLocation(program, "uniformOffset");
            gl.enableVertexAttribArray(program.vertexPosArray);
            gl.vertexAttribPointer(program.vertexPosAttrib, vertexPosBuffer.itemSize, gl.FLOAT, !1, 0, 0);
            gl.uniform2f(program.offsetUniform, 1, 1);
            gl.drawArrays(gl.TRIANGLE_STRIP, 0, vertexPosBuffer.numItems);
            if (gl.canvas != null) {
                result.push(gl.canvas.toDataURL())
            }
            result.push("extensions:" + gl.getSupportedExtensions().join(";"));
            result.push("webgl aliased line width range:" + fa2s(gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE)));
            result.push("webgl aliased point size range:" + fa2s(gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE)));
            result.push("webgl alpha bits:" + gl.getParameter(gl.ALPHA_BITS));
            result.push("webgl antialiasing:" + (gl.getContextAttributes().antialias ? "yes" : "no"));
            result.push("webgl blue bits:" + gl.getParameter(gl.BLUE_BITS));
            result.push("webgl depth bits:" + gl.getParameter(gl.DEPTH_BITS));
            result.push("webgl green bits:" + gl.getParameter(gl.GREEN_BITS));
            result.push("webgl max anisotropy:" + maxAnisotropy(gl));
            result.push("webgl max combined texture image units:" + gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS));
            result.push("webgl max cube map texture size:" + gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE));
            result.push("webgl max fragment uniform vectors:" + gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS));
            result.push("webgl max render buffer size:" + gl.getParameter(gl.MAX_RENDERBUFFER_SIZE));
            result.push("webgl max texture image units:" + gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS));
            result.push("webgl max texture size:" + gl.getParameter(gl.MAX_TEXTURE_SIZE));
            result.push("webgl max varying vectors:" + gl.getParameter(gl.MAX_VARYING_VECTORS));
            result.push("webgl max vertex attribs:" + gl.getParameter(gl.MAX_VERTEX_ATTRIBS));
            result.push("webgl max vertex texture image units:" + gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS));
            result.push("webgl max vertex uniform vectors:" + gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS));
            result.push("webgl max viewport dims:" + fa2s(gl.getParameter(gl.MAX_VIEWPORT_DIMS)));
            result.push("webgl red bits:" + gl.getParameter(gl.RED_BITS));
            result.push("webgl renderer:" + gl.getParameter(gl.RENDERER));
            result.push("webgl shading language version:" + gl.getParameter(gl.SHADING_LANGUAGE_VERSION));
            result.push("webgl stencil bits:" + gl.getParameter(gl.STENCIL_BITS));
            result.push("webgl vendor:" + gl.getParameter(gl.VENDOR));
            result.push("webgl version:" + gl.getParameter(gl.VERSION));
            if (!gl.getShaderPrecisionFormat) {
                if (typeof NODEBUG === "undefined") {
                    this.log("WebGL fingerprinting is incomplete, because your browser does not support getShaderPrecisionFormat")
                }
                return result.join("~")
            }
            result.push("webgl vertex shader high float precision:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision);
            result.push("webgl vertex shader high float precision rangeMin:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).rangeMin);
            result.push("webgl vertex shader high float precision rangeMax:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).rangeMax);
            result.push("webgl vertex shader medium float precision:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision);
            result.push("webgl vertex shader medium float precision rangeMin:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).rangeMin);
            result.push("webgl vertex shader medium float precision rangeMax:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).rangeMax);
            result.push("webgl vertex shader low float precision:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT).precision);
            result.push("webgl vertex shader low float precision rangeMin:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT).rangeMin);
            result.push("webgl vertex shader low float precision rangeMax:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT).rangeMax);
            result.push("webgl fragment shader high float precision:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision);
            result.push("webgl fragment shader high float precision rangeMin:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).rangeMin);
            result.push("webgl fragment shader high float precision rangeMax:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).rangeMax);
            result.push("webgl fragment shader medium float precision:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision);
            result.push("webgl fragment shader medium float precision rangeMin:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).rangeMin);
            result.push("webgl fragment shader medium float precision rangeMax:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).rangeMax);
            result.push("webgl fragment shader low float precision:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT).precision);
            result.push("webgl fragment shader low float precision rangeMin:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT).rangeMin);
            result.push("webgl fragment shader low float precision rangeMax:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT).rangeMax);
            result.push("webgl vertex shader high int precision:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT).precision);
            result.push("webgl vertex shader high int precision rangeMin:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT).rangeMin);
            result.push("webgl vertex shader high int precision rangeMax:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT).rangeMax);
            result.push("webgl vertex shader medium int precision:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT).precision);
            result.push("webgl vertex shader medium int precision rangeMin:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT).rangeMin);
            result.push("webgl vertex shader medium int precision rangeMax:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT).rangeMax);
            result.push("webgl vertex shader low int precision:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT).precision);
            result.push("webgl vertex shader low int precision rangeMin:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT).rangeMin);
            result.push("webgl vertex shader low int precision rangeMax:" + gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT).rangeMax);
            result.push("webgl fragment shader high int precision:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT).precision);
            result.push("webgl fragment shader high int precision rangeMin:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT).rangeMin);
            result.push("webgl fragment shader high int precision rangeMax:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT).rangeMax);
            result.push("webgl fragment shader medium int precision:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT).precision);
            result.push("webgl fragment shader medium int precision rangeMin:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT).rangeMin);
            result.push("webgl fragment shader medium int precision rangeMax:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT).rangeMax);
            result.push("webgl fragment shader low int precision:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT).precision);
            result.push("webgl fragment shader low int precision rangeMin:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT).rangeMin);
            result.push("webgl fragment shader low int precision rangeMax:" + gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT).rangeMax);
            return result.join("~")
        },
        getAdBlock: function() {
            var ads = document.createElement("div");
            ads.setAttribute("id", "ads");
            try {
                document.body.appendChild(ads);
                return document.getElementById("ads") ? false : true
            } catch (e) {
                return false
            }
        },
        getHasLiedLanguages: function() {
            if (typeof navigator.languages !== "undefined") {
                try {
                    var firstLanguages = navigator.languages[0].substr(0, 2);
                    if (firstLanguages !== navigator.language.substr(0, 2)) {
                        return true
                    }
                } catch (err) {
                    return true
                }
            }
            return false
        },
        getHasLiedResolution: function() {
            if (screen.width < screen.availWidth) {
                return true
            }
            if (screen.height < screen.availHeight) {
                return true
            }
            return false
        },
        getHasLiedOs: function() {
            var userAgent = navigator.userAgent.toLowerCase();
            var oscpu = navigator.oscpu;
            var platform = navigator.platform.toLowerCase();
            var os;
            if (userAgent.indexOf("windows phone") >= 0) {
                os = "Windows Phone"
            } else if (userAgent.indexOf("win") >= 0) {
                os = "Windows"
            } else if (userAgent.indexOf("android") >= 0) {
                os = "Android"
            } else if (userAgent.indexOf("linux") >= 0) {
                os = "Linux"
            } else if (userAgent.indexOf("iphone") >= 0 || userAgent.indexOf("ipad") >= 0) {
                os = "iOS"
            } else if (userAgent.indexOf("mac") >= 0) {
                os = "Mac"
            } else {
                os = "Other"
            }
            var mobileDevice;
            if (("ontouchstart" in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)) {
                mobileDevice = true
            } else {
                mobileDevice = false
            }
            if (mobileDevice && os !== "Windows Phone" && os !== "Android" && os !== "iOS" && os !== "Other") {
                return true
            }
            if (typeof oscpu !== "undefined") {
                oscpu = oscpu.toLowerCase();
                if (oscpu.indexOf("win") >= 0 && os !== "Windows" && os !== "Windows Phone") {
                    return true
                } else if (oscpu.indexOf("linux") >= 0 && os !== "Linux" && os !== "Android") {
                    return true
                } else if (oscpu.indexOf("mac") >= 0 && os !== "Mac" && os !== "iOS") {
                    return true
                } else if (oscpu.indexOf("win") === 0 && oscpu.indexOf("linux") === 0 && oscpu.indexOf("mac") >= 0 && os !== "other") {
                    return true
                }
            }
            if (platform.indexOf("win") >= 0 && os !== "Windows" && os !== "Windows Phone") {
                return true
            } else if ((platform.indexOf("linux") >= 0 || platform.indexOf("android") >= 0 || platform.indexOf("pike") >= 0) && os !== "Linux" && os !== "Android") {
                return true
            } else if ((platform.indexOf("mac") >= 0 || platform.indexOf("ipad") >= 0 || platform.indexOf("ipod") >= 0 || platform.indexOf("iphone") >= 0) && os !== "Mac" && os !== "iOS") {
                return true
            } else if (platform.indexOf("win") === 0 && platform.indexOf("linux") === 0 && platform.indexOf("mac") >= 0 && os !== "other") {
                return true
            }
            if (typeof navigator.plugins === "undefined" && os !== "Windows" && os !== "Windows Phone") {
                return true
            }
            return false
        },
        getHasLiedBrowser: function() {
            var userAgent = navigator.userAgent.toLowerCase();
            var productSub = navigator.productSub;
            var browser;
            if (userAgent.indexOf("firefox") >= 0) {
                browser = "Firefox"
            } else if (userAgent.indexOf("opera") >= 0 || userAgent.indexOf("opr") >= 0) {
                browser = "Opera"
            } else if (userAgent.indexOf("chrome") >= 0) {
                browser = "Chrome"
            } else if (userAgent.indexOf("safari") >= 0) {
                browser = "Safari"
            } else if (userAgent.indexOf("trident") >= 0) {
                browser = "Internet Explorer"
            } else {
                browser = "Other"
            }
            if ((browser === "Chrome" || browser === "Safari" || browser === "Opera") && productSub !== "20030107") {
                return true
            }
            var tempRes = eval.toString().length;
            if (tempRes === 37 && browser !== "Safari" && browser !== "Firefox" && browser !== "Other") {
                return true
            } else if (tempRes === 39 && browser !== "Internet Explorer" && browser !== "Other") {
                return true
            } else if (tempRes === 33 && browser !== "Chrome" && browser !== "Opera" && browser !== "Other") {
                return true
            }
            var errFirefox;
            try {
                throw "a"
            } catch (err) {
                try {
                    err.toSource();
                    errFirefox = true
                } catch (errOfErr) {
                    errFirefox = false
                }
            }
            if (errFirefox && browser !== "Firefox" && browser !== "Other") {
                return true
            }
            return false
        },
        isCanvasSupported: function() {
            var elem = document.createElement("canvas");
            return !!(elem.getContext && elem.getContext("2d"))
        },
        isWebGlSupported: function() {
            if (!this.isCanvasSupported()) {
                return false
            }
            var canvas = document.createElement("canvas"),
                glContext;
            try {
                glContext = canvas.getContext && (canvas.getContext("webgl") || canvas.getContext("experimental-webgl"))
            } catch (e) {
                glContext = false
            }
            return !!window.WebGLRenderingContext && !!glContext
        },
        isIE: function() {
            if (navigator.appName === "Microsoft Internet Explorer") {
                return true
            } else if (navigator.appName === "Netscape" && /Trident/.test(navigator.userAgent)) {
                return true
            }
            return false
        },
        hasSwfObjectLoaded: function() {
            return typeof window.swfobject !== "undefined"
        },
        hasMinFlashInstalled: function() {
            return swfobject.hasFlashPlayerVersion("9.0.0")
        },
        addFlashDivNode: function() {
            var node = document.createElement("div");
            node.setAttribute("id", this.options.swfContainerId);
            document.body.appendChild(node)
        },
        loadSwfAndDetectFonts: function(done) {
            var hiddenCallback = "___fp_swf_loaded";
            window[hiddenCallback] = function(fonts) {
                done(fonts)
            };
            var id = this.options.swfContainerId;
            this.addFlashDivNode();
            var flashvars = {
                onReady: hiddenCallback
            };
            var flashparams = {
                allowScriptAccess: "always",
                menu: "false"
            };
            swfobject.embedSWF(this.options.swfPath, id, "1", "1", "9.0.0", false, flashvars, flashparams, {})
        },
        getWebglCanvas: function() {
            var canvas = document.createElement("canvas");
            var gl = null;
            try {
                gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl")
            } catch (e) {}
            if (!gl) {
                gl = null
            }
            return gl
        },
        each: function(obj, iterator, context) {
            if (obj === null) {
                return
            }
            if (this.nativeForEach && obj.forEach === this.nativeForEach) {
                obj.forEach(iterator, context)
            } else if (obj.length === +obj.length) {
                for (var i = 0, l = obj.length; i < l; i++) {
                    if (iterator.call(context, obj[i], i, obj) === {}) {
                        return
                    }
                }
            } else {
                for (var key in obj) {
                    if (obj.hasOwnProperty(key)) {
                        if (iterator.call(context, obj[key], key, obj) === {}) {
                            return
                        }
                    }
                }
            }
        },
        map: function(obj, iterator, context) {
            var results = [];
            if (obj == null) {
                return results
            }
            if (this.nativeMap && obj.map === this.nativeMap) {
                return obj.map(iterator, context)
            }
            this.each(obj, function(value, index, list) {
                results[results.length] = iterator.call(context, value, index, list)
            });
            return results
        },
        x64Add: function(m, n) {
            m = [m[0] >>> 16, m[0] & 0xffff, m[1] >>> 16, m[1] & 0xffff];
            n = [n[0] >>> 16, n[0] & 0xffff, n[1] >>> 16, n[1] & 0xffff];
            var o = [0, 0, 0, 0];
            o[3] += m[3] + n[3];
            o[2] += o[3] >>> 16;
            o[3] &= 0xffff;
            o[2] += m[2] + n[2];
            o[1] += o[2] >>> 16;
            o[2] &= 0xffff;
            o[1] += m[1] + n[1];
            o[0] += o[1] >>> 16;
            o[1] &= 0xffff;
            o[0] += m[0] + n[0];
            o[0] &= 0xffff;
            return [(o[0] << 16) | o[1], (o[2] << 16) | o[3]]
        },
        x64Multiply: function(m, n) {
            m = [m[0] >>> 16, m[0] & 0xffff, m[1] >>> 16, m[1] & 0xffff];
            n = [n[0] >>> 16, n[0] & 0xffff, n[1] >>> 16, n[1] & 0xffff];
            var o = [0, 0, 0, 0];
            o[3] += m[3] * n[3];
            o[2] += o[3] >>> 16;
            o[3] &= 0xffff;
            o[2] += m[2] * n[3];
            o[1] += o[2] >>> 16;
            o[2] &= 0xffff;
            o[2] += m[3] * n[2];
            o[1] += o[2] >>> 16;
            o[2] &= 0xffff;
            o[1] += m[1] * n[3];
            o[0] += o[1] >>> 16;
            o[1] &= 0xffff;
            o[1] += m[2] * n[2];
            o[0] += o[1] >>> 16;
            o[1] &= 0xffff;
            o[1] += m[3] * n[1];
            o[0] += o[1] >>> 16;
            o[1] &= 0xffff;
            o[0] += (m[0] * n[3]) + (m[1] * n[2]) + (m[2] * n[1]) + (m[3] * n[0]);
            o[0] &= 0xffff;
            return [(o[0] << 16) | o[1], (o[2] << 16) | o[3]]
        },
        x64Rotl: function(m, n) {
            n %= 64;
            if (n === 32) {
                return [m[1], m[0]]
            } else if (n < 32) {
                return [(m[0] << n) | (m[1] >>> (32 - n)), (m[1] << n) | (m[0] >>> (32 - n))]
            } else {
                n -= 32;
                return [(m[1] << n) | (m[0] >>> (32 - n)), (m[0] << n) | (m[1] >>> (32 - n))]
            }
        },
        x64LeftShift: function(m, n) {
            n %= 64;
            if (n === 0) {
                return m
            } else if (n < 32) {
                return [(m[0] << n) | (m[1] >>> (32 - n)), m[1] << n]
            } else {
                return [m[1] << (n - 32), 0]
            }
        },
        x64Xor: function(m, n) {
            return [m[0] ^ n[0], m[1] ^ n[1]]
        },
        x64Fmix: function(h) {
            h = this.x64Xor(h, [0, h[0] >>> 1]);
            h = this.x64Multiply(h, [0xff51afd7, 0xed558ccd]);
            h = this.x64Xor(h, [0, h[0] >>> 1]);
            h = this.x64Multiply(h, [0xc4ceb9fe, 0x1a85ec53]);
            h = this.x64Xor(h, [0, h[0] >>> 1]);
            return h
        },
        x64hash128: function(key, seed) {
            key = key || "";
            seed = seed || 0;
            var remainder = key.length % 16;
            var bytes = key.length - remainder;
            var h1 = [0, seed];
            var h2 = [0, seed];
            var k1 = [0, 0];
            var k2 = [0, 0];
            var c1 = [0x87c37b91, 0x114253d5];
            var c2 = [0x4cf5ad43, 0x2745937f];
            for (var i = 0; i < bytes; i = i + 16) {
                k1 = [((key.charCodeAt(i + 4) & 0xff)) | ((key.charCodeAt(i + 5) & 0xff) << 8) | ((key.charCodeAt(i + 6) & 0xff) << 16) | ((key.charCodeAt(i + 7) & 0xff) << 24), ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(i + 1) & 0xff) << 8) | ((key.charCodeAt(i + 2) & 0xff) << 16) | ((key.charCodeAt(i + 3) & 0xff) << 24)];
                k2 = [((key.charCodeAt(i + 12) & 0xff)) | ((key.charCodeAt(i + 13) & 0xff) << 8) | ((key.charCodeAt(i + 14) & 0xff) << 16) | ((key.charCodeAt(i + 15) & 0xff) << 24), ((key.charCodeAt(i + 8) & 0xff)) | ((key.charCodeAt(i + 9) & 0xff) << 8) | ((key.charCodeAt(i + 10) & 0xff) << 16) | ((key.charCodeAt(i + 11) & 0xff) << 24)];
                k1 = this.x64Multiply(k1, c1);
                k1 = this.x64Rotl(k1, 31);
                k1 = this.x64Multiply(k1, c2);
                h1 = this.x64Xor(h1, k1);
                h1 = this.x64Rotl(h1, 27);
                h1 = this.x64Add(h1, h2);
                h1 = this.x64Add(this.x64Multiply(h1, [0, 5]), [0, 0x52dce729]);
                k2 = this.x64Multiply(k2, c2);
                k2 = this.x64Rotl(k2, 33);
                k2 = this.x64Multiply(k2, c1);
                h2 = this.x64Xor(h2, k2);
                h2 = this.x64Rotl(h2, 31);
                h2 = this.x64Add(h2, h1);
                h2 = this.x64Add(this.x64Multiply(h2, [0, 5]), [0, 0x38495ab5])
            }
            k1 = [0, 0];
            k2 = [0, 0];
            switch (remainder) {
                case 15:
                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 14)], 48));
                case 14:
                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 13)], 40));
                case 13:
                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 12)], 32));
                case 12:
                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 11)], 24));
                case 11:
                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 10)], 16));
                case 10:
                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 9)], 8));
                case 9:
                    k2 = this.x64Xor(k2, [0, key.charCodeAt(i + 8)]);
                    k2 = this.x64Multiply(k2, c2);
                    k2 = this.x64Rotl(k2, 33);
                    k2 = this.x64Multiply(k2, c1);
                    h2 = this.x64Xor(h2, k2);
                case 8:
                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 7)], 56));
                case 7:
                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 6)], 48));
                case 6:
                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 5)], 40));
                case 5:
                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 4)], 32));
                case 4:
                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 3)], 24));
                case 3:
                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 2)], 16));
                case 2:
                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 1)], 8));
                case 1:
                    k1 = this.x64Xor(k1, [0, key.charCodeAt(i)]);
                    k1 = this.x64Multiply(k1, c1);
                    k1 = this.x64Rotl(k1, 31);
                    k1 = this.x64Multiply(k1, c2);
                    h1 = this.x64Xor(h1, k1)
            }
            h1 = this.x64Xor(h1, [0, key.length]);
            h2 = this.x64Xor(h2, [0, key.length]);
            h1 = this.x64Add(h1, h2);
            h2 = this.x64Add(h2, h1);
            h1 = this.x64Fmix(h1);
            h2 = this.x64Fmix(h2);
            h1 = this.x64Add(h1, h2);
            h2 = this.x64Add(h2, h1);
            return ("00000000" + (h1[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (h1[1] >>> 0).toString(16)).slice(-8) + ("00000000" + (h2[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (h2[1] >>> 0).toString(16)).slice(-8)
        }
    };
    fp2.VERSION = "1.1.0";
    return fp2
});
                                    

#2 JavaScript::Eval (size: 3121, repeated: 1) - SHA256: b84161c9fbf7520cd14e7019f92120bd87a928a074156e91a992eba9fc9436e8

                                        /*!
 * jQuery Cookie Plugin v1.4.1
 * https://github.com/carhartl/jquery-cookie
 *
 * Copyright 2013 Klaus Hartl
 * Released under the MIT license
 */
(function(factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD
        define(['jquery'], factory);
    } else if (typeof exports === 'object') {
        // CommonJS
        factory(require('jquery'));
    } else {
        // Browser globals
        factory(jQuery);
    }
}(function($) {

    var pluses = /\+/g;

    function encode(s) {
        return config.raw ? s : encodeURIComponent(s);
    }

    function decode(s) {
        return config.raw ? s : decodeURIComponent(s);
    }

    function stringifyCookieValue(value) {
        return encode(config.json ? JSON.stringify(value) : String(value));
    }

    function parseCookieValue(s) {
        if (s.indexOf('"') === 0) {
            // This is a quoted cookie as according to RFC2068, unescape...
            s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
        }

        try {
            // Replace server-side written pluses with spaces.
            // If we can't decode the cookie, ignore it, it's unusable.
            // If we can't parse the cookie, ignore it, it's unusable.
            s = decodeURIComponent(s.replace(pluses, ' '));
            return config.json ? JSON.parse(s) : s;
        } catch (e) {}
    }

    function read(s, converter) {
        var value = config.raw ? s : parseCookieValue(s);
        return $.isFunction(converter) ? converter(value) : value;
    }

    var config = $.cookie = function(key, value, options) {

        // Write

        if (value !== undefined && !$.isFunction(value)) {
            options = $.extend({}, config.defaults, options);

            if (typeof options.expires === 'number') {
                var days = options.expires,
                    t = options.expires = new Date();
                t.setTime(+t + days * 864e+5);
            }

            return (document.cookie = [
                encode(key), '=', stringifyCookieValue(value),
                options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
                options.path ? '; path=' + options.path : '',
                options.domain ? '; domain=' + options.domain : '',
                options.secure ? '; secure' : ''
            ].join(''));
        }

        // Read

        var result = key ? undefined : {};

        // To prevent the for loop in the first place assign an empty array
        // in case there are no cookies at all. Also prevents odd result when
        // calling $.cookie().
        var cookies = document.cookie ? document.cookie.split('; ') : [];

        for (var i = 0, l = cookies.length; i < l; i++) {
            var parts = cookies[i].split('=');
            var name = decode(parts.shift());
            var cookie = parts.join('=');

            if (key && key === name) {
                // If second argument (value) is a function it's a converter...
                result = read(cookie, value);
                break;
            }

            // Prevent storing a cookie that we couldn't decode.
            if (!key && (cookie = read(cookie)) !== undefined) {
                result[name] = cookie;
            }
        }

        return result;
    };

    config.defaults = {};

    $.removeCookie = function(key, options) {
        if ($.cookie(key) === undefined) {
            return false;
        }

        // Must not alter options, thus extending a fresh object...
        $.cookie(key, '', $.extend({}, options, {
            expires: -1
        }));
        return !$.cookie(key);
    };

}));
                                    

#3 JavaScript::Eval (size: 257551, repeated: 1) - SHA256: 893e90f6230962e42231635df650f20544ad22affc3ee396df768eaa6bc5a6a2

                                        /*!
 * jQuery JavaScript Library v2.2.4
 * http://jquery.com/
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2016-05-20T17:23Z
 */

(function(global, factory) {

    if (typeof module === "object" && typeof module.exports === "object") {
        // For CommonJS and CommonJS-like environments where a proper `window`
        // is present, execute the factory and get jQuery.
        // For environments that do not have a `window` with a `document`
        // (such as Node.js), expose a factory as module.exports.
        // This accentuates the need for the creation of a real `window`.
        // e.g. var jQuery = require("jquery")(window);
        // See ticket #14549 for more info.
        module.exports = global.document ?
            factory(global, true) :
            function(w) {
                if (!w.document) {
                    throw new Error("jQuery requires a window with a document");
                }
                return factory(w);
            };
    } else {
        factory(global);
    }

    // Pass this if window is not defined yet
}(typeof window !== "undefined" ? window : this, function(window, noGlobal) {

    // Support: Firefox 18+
    // Can't be in strict mode, several libs including ASP.NET trace
    // the stack via arguments.caller.callee and Firefox dies if
    // you try to trace through "use strict" call chains. (#13335)
    //"use strict";
    var arr = [];

    var document = window.document;

    var slice = arr.slice;

    var concat = arr.concat;

    var push = arr.push;

    var indexOf = arr.indexOf;

    var class2type = {};

    var toString = class2type.toString;

    var hasOwn = class2type.hasOwnProperty;

    var support = {};



    var
        version = "2.2.4",

        // Define a local copy of jQuery
        jQuery = function(selector, context) {

            // The jQuery object is actually just the init constructor 'enhanced'
            // Need init if jQuery is called (just allow error to be thrown if not included)
            return new jQuery.fn.init(selector, context);
        },

        // Support: Android<4.1
        // Make sure we trim BOM and NBSP
        rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,

        // Matches dashed string for camelizing
        rmsPrefix = /^-ms-/,
        rdashAlpha = /-([\da-z])/gi,

        // Used by jQuery.camelCase as callback to replace()
        fcamelCase = function(all, letter) {
            return letter.toUpperCase();
        };

    jQuery.fn = jQuery.prototype = {

        // The current version of jQuery being used
        jquery: version,

        constructor: jQuery,

        // Start with an empty selector
        selector: "",

        // The default length of a jQuery object is 0
        length: 0,

        toArray: function() {
            return slice.call(this);
        },

        // Get the Nth element in the matched element set OR
        // Get the whole matched element set as a clean array
        get: function(num) {
            return num != null ?

                // Return just the one element from the set
                (num < 0 ? this[num + this.length] : this[num]) :

                // Return all the elements in a clean array
                slice.call(this);
        },

        // Take an array of elements and push it onto the stack
        // (returning the new matched element set)
        pushStack: function(elems) {

            // Build a new jQuery matched element set
            var ret = jQuery.merge(this.constructor(), elems);

            // Add the old object onto the stack (as a reference)
            ret.prevObject = this;
            ret.context = this.context;

            // Return the newly-formed element set
            return ret;
        },

        // Execute a callback for every element in the matched set.
        each: function(callback) {
            return jQuery.each(this, callback);
        },

        map: function(callback) {
            return this.pushStack(jQuery.map(this, function(elem, i) {
                return callback.call(elem, i, elem);
            }));
        },

        slice: function() {
            return this.pushStack(slice.apply(this, arguments));
        },

        first: function() {
            return this.eq(0);
        },

        last: function() {
            return this.eq(-1);
        },

        eq: function(i) {
            var len = this.length,
                j = +i + (i < 0 ? len : 0);
            return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
        },

        end: function() {
            return this.prevObject || this.constructor();
        },

        // For internal use only.
        // Behaves like an Array's method, not like a jQuery method.
        push: push,
        sort: arr.sort,
        splice: arr.splice
    };

    jQuery.extend = jQuery.fn.extend = function() {
        var options, name, src, copy, copyIsArray, clone,
            target = arguments[0] || {},
            i = 1,
            length = arguments.length,
            deep = false;

        // Handle a deep copy situation
        if (typeof target === "boolean") {
            deep = target;

            // Skip the boolean and the target
            target = arguments[i] || {};
            i++;
        }

        // Handle case when target is a string or something (possible in deep copy)
        if (typeof target !== "object" && !jQuery.isFunction(target)) {
            target = {};
        }

        // Extend jQuery itself if only one argument is passed
        if (i === length) {
            target = this;
            i--;
        }

        for (; i < length; i++) {

            // Only deal with non-null/undefined values
            if ((options = arguments[i]) != null) {

                // Extend the base object
                for (name in options) {
                    src = target[name];
                    copy = options[name];

                    // Prevent never-ending loop
                    if (target === copy) {
                        continue;
                    }

                    // Recurse if we're merging plain objects or arrays
                    if (deep && copy && (jQuery.isPlainObject(copy) ||
                            (copyIsArray = jQuery.isArray(copy)))) {

                        if (copyIsArray) {
                            copyIsArray = false;
                            clone = src && jQuery.isArray(src) ? src : [];

                        } else {
                            clone = src && jQuery.isPlainObject(src) ? src : {};
                        }

                        // Never move original objects, clone them
                        target[name] = jQuery.extend(deep, clone, copy);

                        // Don't bring in undefined values
                    } else if (copy !== undefined) {
                        target[name] = copy;
                    }
                }
            }
        }

        // Return the modified object
        return target;
    };

    jQuery.extend({

        // Unique for each copy of jQuery on the page
        expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),

        // Assume jQuery is ready without the ready module
        isReady: true,

        error: function(msg) {
            throw new Error(msg);
        },

        noop: function() {},

        isFunction: function(obj) {
            return jQuery.type(obj) === "function";
        },

        isArray: Array.isArray,

        isWindow: function(obj) {
            return obj != null && obj === obj.window;
        },

        isNumeric: function(obj) {

            // parseFloat NaNs numeric-cast false positives (null|true|false|"")
            // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
            // subtraction forces infinities to NaN
            // adding 1 corrects loss of precision from parseFloat (#15100)
            var realStringObj = obj && obj.toString();
            return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0;
        },

        isPlainObject: function(obj) {
            var key;

            // Not plain objects:
            // - Any object or value whose internal [[Class]] property is not "[object Object]"
            // - DOM nodes
            // - window
            if (jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {
                return false;
            }

            // Not own constructor property must be Object
            if (obj.constructor &&
                !hasOwn.call(obj, "constructor") &&
                !hasOwn.call(obj.constructor.prototype || {}, "isPrototypeOf")) {
                return false;
            }

            // Own properties are enumerated firstly, so to speed up,
            // if last one is own, then all properties are own
            for (key in obj) {}

            return key === undefined || hasOwn.call(obj, key);
        },

        isEmptyObject: function(obj) {
            var name;
            for (name in obj) {
                return false;
            }
            return true;
        },

        type: function(obj) {
            if (obj == null) {
                return obj + "";
            }

            // Support: Android<4.0, iOS<6 (functionish RegExp)
            return typeof obj === "object" || typeof obj === "function" ?
                class2type[toString.call(obj)] || "object" :
                typeof obj;
        },

        // Evaluates a script in a global context
        globalEval: function(code) {
            var script,
                indirect = eval;

            code = jQuery.trim(code);

            if (code) {

                // If the code includes a valid, prologue position
                // strict mode pragma, execute code by injecting a
                // script tag into the document.
                if (code.indexOf("use strict") === 1) {
                    script = document.createElement("script");
                    script.text = code;
                    document.head.appendChild(script).parentNode.removeChild(script);
                } else {

                    // Otherwise, avoid the DOM node creation, insertion
                    // and removal by using an indirect global eval

                    indirect(code);
                }
            }
        },

        // Convert dashed to camelCase; used by the css and data modules
        // Support: IE9-11+
        // Microsoft forgot to hump their vendor prefix (#9572)
        camelCase: function(string) {
            return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
        },

        nodeName: function(elem, name) {
            return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
        },

        each: function(obj, callback) {
            var length, i = 0;

            if (isArrayLike(obj)) {
                length = obj.length;
                for (; i < length; i++) {
                    if (callback.call(obj[i], i, obj[i]) === false) {
                        break;
                    }
                }
            } else {
                for (i in obj) {
                    if (callback.call(obj[i], i, obj[i]) === false) {
                        break;
                    }
                }
            }

            return obj;
        },

        // Support: Android<4.1
        trim: function(text) {
            return text == null ?
                "" :
                (text + "").replace(rtrim, "");
        },

        // results is for internal usage only
        makeArray: function(arr, results) {
            var ret = results || [];

            if (arr != null) {
                if (isArrayLike(Object(arr))) {
                    jQuery.merge(ret,
                        typeof arr === "string" ?
                        [arr] : arr
                    );
                } else {
                    push.call(ret, arr);
                }
            }

            return ret;
        },

        inArray: function(elem, arr, i) {
            return arr == null ? -1 : indexOf.call(arr, elem, i);
        },

        merge: function(first, second) {
            var len = +second.length,
                j = 0,
                i = first.length;

            for (; j < len; j++) {
                first[i++] = second[j];
            }

            first.length = i;

            return first;
        },

        grep: function(elems, callback, invert) {
            var callbackInverse,
                matches = [],
                i = 0,
                length = elems.length,
                callbackExpect = !invert;

            // Go through the array, only saving the items
            // that pass the validator function
            for (; i < length; i++) {
                callbackInverse = !callback(elems[i], i);
                if (callbackInverse !== callbackExpect) {
                    matches.push(elems[i]);
                }
            }

            return matches;
        },

        // arg is for internal usage only
        map: function(elems, callback, arg) {
            var length, value,
                i = 0,
                ret = [];

            // Go through the array, translating each of the items to their new values
            if (isArrayLike(elems)) {
                length = elems.length;
                for (; i < length; i++) {
                    value = callback(elems[i], i, arg);

                    if (value != null) {
                        ret.push(value);
                    }
                }

                // Go through every key on the object,
            } else {
                for (i in elems) {
                    value = callback(elems[i], i, arg);

                    if (value != null) {
                        ret.push(value);
                    }
                }
            }

            // Flatten any nested arrays
            return concat.apply([], ret);
        },

        // A global GUID counter for objects
        guid: 1,

        // Bind a function to a context, optionally partially applying any
        // arguments.
        proxy: function(fn, context) {
            var tmp, args, proxy;

            if (typeof context === "string") {
                tmp = fn[context];
                context = fn;
                fn = tmp;
            }

            // Quick check to determine if target is callable, in the spec
            // this throws a TypeError, but we will just return undefined.
            if (!jQuery.isFunction(fn)) {
                return undefined;
            }

            // Simulated bind
            args = slice.call(arguments, 2);
            proxy = function() {
                return fn.apply(context || this, args.concat(slice.call(arguments)));
            };

            // Set the guid of unique handler to the same of original handler, so it can be removed
            proxy.guid = fn.guid = fn.guid || jQuery.guid++;

            return proxy;
        },

        now: Date.now,

        // jQuery.support is not used in Core but other projects attach their
        // properties to it so it needs to exist.
        support: support
    });

    // JSHint would error on this code due to the Symbol not being defined in ES5.
    // Defining this global in .jshintrc would create a danger of using the global
    // unguarded in another place, it seems safer to just disable JSHint for these
    // three lines.
    /* jshint ignore: start */
    if (typeof Symbol === "function") {
        jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
    }
    /* jshint ignore: end */

    // Populate the class2type map
    jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),
        function(i, name) {
            class2type["[object " + name + "]"] = name.toLowerCase();
        });

    function isArrayLike(obj) {

        // Support: iOS 8.2 (not reproducible in simulator)
        // `in` check used to prevent JIT error (gh-2145)
        // hasOwn isn't used here due to false negatives
        // regarding Nodelist length in IE
        var length = !!obj && "length" in obj && obj.length,
            type = jQuery.type(obj);

        if (type === "function" || jQuery.isWindow(obj)) {
            return false;
        }

        return type === "array" || length === 0 ||
            typeof length === "number" && length > 0 && (length - 1) in obj;
    }
    var Sizzle =
        /*!
         * Sizzle CSS Selector Engine v2.2.1
         * http://sizzlejs.com/
         *
         * Copyright jQuery Foundation and other contributors
         * Released under the MIT license
         * http://jquery.org/license
         *
         * Date: 2015-10-17
         */
        (function(window) {

            var i,
                support,
                Expr,
                getText,
                isXML,
                tokenize,
                compile,
                select,
                outermostContext,
                sortInput,
                hasDuplicate,

                // Local document vars
                setDocument,
                document,
                docElem,
                documentIsHTML,
                rbuggyQSA,
                rbuggyMatches,
                matches,
                contains,

                // Instance-specific data
                expando = "sizzle" + 1 * new Date(),
                preferredDoc = window.document,
                dirruns = 0,
                done = 0,
                classCache = createCache(),
                tokenCache = createCache(),
                compilerCache = createCache(),
                sortOrder = function(a, b) {
                    if (a === b) {
                        hasDuplicate = true;
                    }
                    return 0;
                },

                // General-purpose constants
                MAX_NEGATIVE = 1 << 31,

                // Instance methods
                hasOwn = ({}).hasOwnProperty,
                arr = [],
                pop = arr.pop,
                push_native = arr.push,
                push = arr.push,
                slice = arr.slice,
                // Use a stripped-down indexOf as it's faster than native
                // http://jsperf.com/thor-indexof-vs-for/5
                indexOf = function(list, elem) {
                    var i = 0,
                        len = list.length;
                    for (; i < len; i++) {
                        if (list[i] === elem) {
                            return i;
                        }
                    }
                    return -1;
                },

                booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",

                // Regular expressions

                // http://www.w3.org/TR/css3-selectors/#whitespace
                whitespace = "[\\x20\\t\\r\\n\\f]",

                // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
                identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",

                // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
                attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
                // Operator (capture 2)
                "*([*^$|!~]?=)" + whitespace +
                // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
                "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
                "*\\]",

                pseudos = ":(" + identifier + ")(?:\\((" +
                // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
                // 1. quoted (capture 3; capture 4 or capture 5)
                "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
                // 2. simple (capture 6)
                "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
                // 3. anything else (capture 2)
                ".*" +
                ")\\)|)",

                // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
                rwhitespace = new RegExp(whitespace + "+", "g"),
                rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),

                rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
                rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),

                rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"),

                rpseudo = new RegExp(pseudos),
                ridentifier = new RegExp("^" + identifier + "$"),

                matchExpr = {
                    "ID": new RegExp("^#(" + identifier + ")"),
                    "CLASS": new RegExp("^\\.(" + identifier + ")"),
                    "TAG": new RegExp("^(" + identifier + "|[*])"),
                    "ATTR": new RegExp("^" + attributes),
                    "PSEUDO": new RegExp("^" + pseudos),
                    "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
                        "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
                        "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
                    "bool": new RegExp("^(?:" + booleans + ")$", "i"),
                    // For use in libraries implementing .is()
                    // We use this for POS matching in `select`
                    "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
                        whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
                },

                rinputs = /^(?:input|select|textarea|button)$/i,
                rheader = /^h\d$/i,

                rnative = /^[^{]+\{\s*\[native \w/,

                // Easily-parseable/retrievable ID or TAG or CLASS selectors
                rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,

                rsibling = /[+~]/,
                rescape = /'|\\/g,

                // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
                runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"),
                funescape = function(_, escaped, escapedWhitespace) {
                    var high = "0x" + escaped - 0x10000;
                    // NaN means non-codepoint
                    // Support: Firefox<24
                    // Workaround erroneous numeric interpretation of +"0x"
                    return high !== high || escapedWhitespace ?
                        escaped :
                        high < 0 ?
                        // BMP codepoint
                        String.fromCharCode(high + 0x10000) :
                        // Supplemental Plane codepoint (surrogate pair)
                        String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
                },

                // Used for iframes
                // See setDocument()
                // Removing the function wrapper causes a "Permission Denied"
                // error in IE
                unloadHandler = function() {
                    setDocument();
                };

            // Optimize for push.apply( _, NodeList )
            try {
                push.apply(
                    (arr = slice.call(preferredDoc.childNodes)),
                    preferredDoc.childNodes
                );
                // Support: Android<4.0
                // Detect silently failing push.apply
                arr[preferredDoc.childNodes.length].nodeType;
            } catch (e) {
                push = {
                    apply: arr.length ?

                        // Leverage slice if possible
                        function(target, els) {
                            push_native.apply(target, slice.call(els));
                        } :

                        // Support: IE<9
                        // Otherwise append directly
                        function(target, els) {
                            var j = target.length,
                                i = 0;
                            // Can't trust NodeList.length
                            while ((target[j++] = els[i++])) {}
                            target.length = j - 1;
                        }
                };
            }

            function Sizzle(selector, context, results, seed) {
                var m, i, elem, nid, nidselect, match, groups, newSelector,
                    newContext = context && context.ownerDocument,

                    // nodeType defaults to 9, since context defaults to document
                    nodeType = context ? context.nodeType : 9;

                results = results || [];

                // Return early from calls with invalid selector or context
                if (typeof selector !== "string" || !selector ||
                    nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {

                    return results;
                }

                // Try to shortcut find operations (as opposed to filters) in HTML documents
                if (!seed) {

                    if ((context ? context.ownerDocument || context : preferredDoc) !== document) {
                        setDocument(context);
                    }
                    context = context || document;

                    if (documentIsHTML) {

                        // If the selector is sufficiently simple, try using a "get*By*" DOM method
                        // (excepting DocumentFragment context, where the methods don't exist)
                        if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {

                            // ID selector
                            if ((m = match[1])) {

                                // Document context
                                if (nodeType === 9) {
                                    if ((elem = context.getElementById(m))) {

                                        // Support: IE, Opera, Webkit
                                        // TODO: identify versions
                                        // getElementById can match elements by name instead of ID
                                        if (elem.id === m) {
                                            results.push(elem);
                                            return results;
                                        }
                                    } else {
                                        return results;
                                    }

                                    // Element context
                                } else {

                                    // Support: IE, Opera, Webkit
                                    // TODO: identify versions
                                    // getElementById can match elements by name instead of ID
                                    if (newContext && (elem = newContext.getElementById(m)) &&
                                        contains(context, elem) &&
                                        elem.id === m) {

                                        results.push(elem);
                                        return results;
                                    }
                                }

                                // Type selector
                            } else if (match[2]) {
                                push.apply(results, context.getElementsByTagName(selector));
                                return results;

                                // Class selector
                            } else if ((m = match[3]) && support.getElementsByClassName &&
                                context.getElementsByClassName) {

                                push.apply(results, context.getElementsByClassName(m));
                                return results;
                            }
                        }

                        // Take advantage of querySelectorAll
                        if (support.qsa &&
                            !compilerCache[selector + " "] &&
                            (!rbuggyQSA || !rbuggyQSA.test(selector))) {

                            if (nodeType !== 1) {
                                newContext = context;
                                newSelector = selector;

                                // qSA looks outside Element context, which is not what we want
                                // Thanks to Andrew Dupont for this workaround technique
                                // Support: IE <=8
                                // Exclude object elements
                            } else if (context.nodeName.toLowerCase() !== "object") {

                                // Capture the context ID, setting it first if necessary
                                if ((nid = context.getAttribute("id"))) {
                                    nid = nid.replace(rescape, "\\$&");
                                } else {
                                    context.setAttribute("id", (nid = expando));
                                }

                                // Prefix every selector in the list
                                groups = tokenize(selector);
                                i = groups.length;
                                nidselect = ridentifier.test(nid) ? "#" + nid : "[id='" + nid + "']";
                                while (i--) {
                                    groups[i] = nidselect + " " + toSelector(groups[i]);
                                }
                                newSelector = groups.join(",");

                                // Expand context for sibling selectors
                                newContext = rsibling.test(selector) && testContext(context.parentNode) ||
                                    context;
                            }

                            if (newSelector) {
                                try {
                                    push.apply(results,
                                        newContext.querySelectorAll(newSelector)
                                    );
                                    return results;
                                } catch (qsaError) {} finally {
                                    if (nid === expando) {
                                        context.removeAttribute("id");
                                    }
                                }
                            }
                        }
                    }
                }

                // All others
                return select(selector.replace(rtrim, "$1"), context, results, seed);
            }

            /**
             * Create key-value caches of limited size
             * @returns {function(string, object)} Returns the Object data after storing it on itself with
             *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
             *	deleting the oldest entry
             */
            function createCache() {
                var keys = [];

                function cache(key, value) {
                    // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
                    if (keys.push(key + " ") > Expr.cacheLength) {
                        // Only keep the most recent entries
                        delete cache[keys.shift()];
                    }
                    return (cache[key + " "] = value);
                }
                return cache;
            }

            /**
             * Mark a function for special use by Sizzle
             * @param {Function} fn The function to mark
             */
            function markFunction(fn) {
                fn[expando] = true;
                return fn;
            }

            /**
             * Support testing using an element
             * @param {Function} fn Passed the created div and expects a boolean result
             */
            function assert(fn) {
                var div = document.createElement("div");

                try {
                    return !!fn(div);
                } catch (e) {
                    return false;
                } finally {
                    // Remove from its parent by default
                    if (div.parentNode) {
                        div.parentNode.removeChild(div);
                    }
                    // release memory in IE
                    div = null;
                }
            }

            /**
             * Adds the same handler for all of the specified attrs
             * @param {String} attrs Pipe-separated list of attributes
             * @param {Function} handler The method that will be applied
             */
            function addHandle(attrs, handler) {
                var arr = attrs.split("|"),
                    i = arr.length;

                while (i--) {
                    Expr.attrHandle[arr[i]] = handler;
                }
            }

            /**
             * Checks document order of two siblings
             * @param {Element} a
             * @param {Element} b
             * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
             */
            function siblingCheck(a, b) {
                var cur = b && a,
                    diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
                    (~b.sourceIndex || MAX_NEGATIVE) -
                    (~a.sourceIndex || MAX_NEGATIVE);

                // Use IE sourceIndex if available on both nodes
                if (diff) {
                    return diff;
                }

                // Check if b follows a
                if (cur) {
                    while ((cur = cur.nextSibling)) {
                        if (cur === b) {
                            return -1;
                        }
                    }
                }

                return a ? 1 : -1;
            }

            /**
             * Returns a function to use in pseudos for input types
             * @param {String} type
             */
            function createInputPseudo(type) {
                return function(elem) {
                    var name = elem.nodeName.toLowerCase();
                    return name === "input" && elem.type === type;
                };
            }

            /**
             * Returns a function to use in pseudos for buttons
             * @param {String} type
             */
            function createButtonPseudo(type) {
                return function(elem) {
                    var name = elem.nodeName.toLowerCase();
                    return (name === "input" || name === "button") && elem.type === type;
                };
            }

            /**
             * Returns a function to use in pseudos for positionals
             * @param {Function} fn
             */
            function createPositionalPseudo(fn) {
                return markFunction(function(argument) {
                    argument = +argument;
                    return markFunction(function(seed, matches) {
                        var j,
                            matchIndexes = fn([], seed.length, argument),
                            i = matchIndexes.length;

                        // Match elements found at the specified indexes
                        while (i--) {
                            if (seed[(j = matchIndexes[i])]) {
                                seed[j] = !(matches[j] = seed[j]);
                            }
                        }
                    });
                });
            }

            /**
             * Checks a node for validity as a Sizzle context
             * @param {Element|Object=} context
             * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
             */
            function testContext(context) {
                return context && typeof context.getElementsByTagName !== "undefined" && context;
            }

            // Expose support vars for convenience
            support = Sizzle.support = {};

            /**
             * Detects XML nodes
             * @param {Element|Object} elem An element or a document
             * @returns {Boolean} True iff elem is a non-HTML XML node
             */
            isXML = Sizzle.isXML = function(elem) {
                // documentElement is verified for cases where it doesn't yet exist
                // (such as loading iframes in IE - #4833)
                var documentElement = elem && (elem.ownerDocument || elem).documentElement;
                return documentElement ? documentElement.nodeName !== "HTML" : false;
            };

            /**
             * Sets document-related variables once based on the current document
             * @param {Element|Object} [doc] An element or document object to use to set the document
             * @returns {Object} Returns the current document
             */
            setDocument = Sizzle.setDocument = function(node) {
                var hasCompare, parent,
                    doc = node ? node.ownerDocument || node : preferredDoc;

                // Return early if doc is invalid or already selected
                if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {
                    return document;
                }

                // Update global variables
                document = doc;
                docElem = document.documentElement;
                documentIsHTML = !isXML(document);

                // Support: IE 9-11, Edge
                // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
                if ((parent = document.defaultView) && parent.top !== parent) {
                    // Support: IE 11
                    if (parent.addEventListener) {
                        parent.addEventListener("unload", unloadHandler, false);

                        // Support: IE 9 - 10 only
                    } else if (parent.attachEvent) {
                        parent.attachEvent("onunload", unloadHandler);
                    }
                }

                /* Attributes
	---------------------------------------------------------------------- */

                // Support: IE<8
                // Verify that getAttribute really returns attributes and not properties
                // (excepting IE8 booleans)
                support.attributes = assert(function(div) {
                    div.className = "i";
                    return !div.getAttribute("className");
                });

                /* getElement(s)By*
	---------------------------------------------------------------------- */

                // Check if getElementsByTagName("*") returns only elements
                support.getElementsByTagName = assert(function(div) {
                    div.appendChild(document.createComment(""));
                    return !div.getElementsByTagName("*").length;
                });

                // Support: IE<9
                support.getElementsByClassName = rnative.test(document.getElementsByClassName);

                // Support: IE<10
                // Check if getElementById returns elements by name
                // The broken getElementById methods don't pick up programatically-set names,
                // so use a roundabout getElementsByName test
                support.getById = assert(function(div) {
                    docElem.appendChild(div).id = expando;
                    return !document.getElementsByName || !document.getElementsByName(expando).length;
                });

                // ID find and filter
                if (support.getById) {
                    Expr.find["ID"] = function(id, context) {
                        if (typeof context.getElementById !== "undefined" && documentIsHTML) {
                            var m = context.getElementById(id);
                            return m ? [m] : [];
                        }
                    };
                    Expr.filter["ID"] = function(id) {
                        var attrId = id.replace(runescape, funescape);
                        return function(elem) {
                            return elem.getAttribute("id") === attrId;
                        };
                    };
                } else {
                    // Support: IE6/7
                    // getElementById is not reliable as a find shortcut
                    delete Expr.find["ID"];

                    Expr.filter["ID"] = function(id) {
                        var attrId = id.replace(runescape, funescape);
                        return function(elem) {
                            var node = typeof elem.getAttributeNode !== "undefined" &&
                                elem.getAttributeNode("id");
                            return node && node.value === attrId;
                        };
                    };
                }

                // Tag
                Expr.find["TAG"] = support.getElementsByTagName ?
                    function(tag, context) {
                        if (typeof context.getElementsByTagName !== "undefined") {
                            return context.getElementsByTagName(tag);

                            // DocumentFragment nodes don't have gEBTN
                        } else if (support.qsa) {
                            return context.querySelectorAll(tag);
                        }
                    } :

                    function(tag, context) {
                        var elem,
                            tmp = [],
                            i = 0,
                            // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
                            results = context.getElementsByTagName(tag);

                        // Filter out possible comments
                        if (tag === "*") {
                            while ((elem = results[i++])) {
                                if (elem.nodeType === 1) {
                                    tmp.push(elem);
                                }
                            }

                            return tmp;
                        }
                        return results;
                    };

                // Class
                Expr.find["CLASS"] = support.getElementsByClassName && function(className, context) {
                    if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
                        return context.getElementsByClassName(className);
                    }
                };

                /* QSA/matchesSelector
	---------------------------------------------------------------------- */

                // QSA and matchesSelector support

                // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
                rbuggyMatches = [];

                // qSa(:focus) reports false when true (Chrome 21)
                // We allow this because of a bug in IE8/9 that throws an error
                // whenever `document.activeElement` is accessed on an iframe
                // So, we allow :focus to pass through QSA all the time to avoid the IE error
                // See http://bugs.jquery.com/ticket/13378
                rbuggyQSA = [];

                if ((support.qsa = rnative.test(document.querySelectorAll))) {
                    // Build QSA regex
                    // Regex strategy adopted from Diego Perini
                    assert(function(div) {
                        // Select is set to empty string on purpose
                        // This is to test IE's treatment of not explicitly
                        // setting a boolean content attribute,
                        // since its presence should be enough
                        // http://bugs.jquery.com/ticket/12359
                        docElem.appendChild(div).innerHTML = "<a id='" + expando + "'></a>" +
                            "<select id='" + expando + "-\r\\' msallowcapture=''>" +
                            "<option selected=''></option></select>";

                        // Support: IE8, Opera 11-12.16
                        // Nothing should be selected when empty strings follow ^= or $= or *=
                        // The test attribute must be unknown in Opera but "safe" for WinRT
                        // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
                        if (div.querySelectorAll("[msallowcapture^='']").length) {
                            rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
                        }

                        // Support: IE8
                        // Boolean attributes and "value" are not treated correctly
                        if (!div.querySelectorAll("[selected]").length) {
                            rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
                        }

                        // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
                        if (!div.querySelectorAll("[id~=" + expando + "-]").length) {
                            rbuggyQSA.push("~=");
                        }

                        // Webkit/Opera - :checked should return selected option elements
                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
                        // IE8 throws error here and will not see later tests
                        if (!div.querySelectorAll(":checked").length) {
                            rbuggyQSA.push(":checked");
                        }

                        // Support: Safari 8+, iOS 8+
                        // https://bugs.webkit.org/show_bug.cgi?id=136851
                        // In-page `selector#id sibing-combinator selector` fails
                        if (!div.querySelectorAll("a#" + expando + "+*").length) {
                            rbuggyQSA.push(".#.+[+~]");
                        }
                    });

                    assert(function(div) {
                        // Support: Windows 8 Native Apps
                        // The type and name attributes are restricted during .innerHTML assignment
                        var input = document.createElement("input");
                        input.setAttribute("type", "hidden");
                        div.appendChild(input).setAttribute("name", "D");

                        // Support: IE8
                        // Enforce case-sensitivity of name attribute
                        if (div.querySelectorAll("[name=d]").length) {
                            rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
                        }

                        // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
                        // IE8 throws error here and will not see later tests
                        if (!div.querySelectorAll(":enabled").length) {
                            rbuggyQSA.push(":enabled", ":disabled");
                        }

                        // Opera 10-11 does not throw on post-comma invalid pseudos
                        div.querySelectorAll("*,:x");
                        rbuggyQSA.push(",.*:");
                    });
                }

                if ((support.matchesSelector = rnative.test((matches = docElem.matches ||
                        docElem.webkitMatchesSelector ||
                        docElem.mozMatchesSelector ||
                        docElem.oMatchesSelector ||
                        docElem.msMatchesSelector)))) {

                    assert(function(div) {
                        // Check to see if it's possible to do matchesSelector
                        // on a disconnected node (IE 9)
                        support.disconnectedMatch = matches.call(div, "div");

                        // This should fail with an exception
                        // Gecko does not error, returns false instead
                        matches.call(div, "[s!='']:x");
                        rbuggyMatches.push("!=", pseudos);
                    });
                }

                rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
                rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));

                /* Contains
	---------------------------------------------------------------------- */
                hasCompare = rnative.test(docElem.compareDocumentPosition);

                // Element contains another
                // Purposefully self-exclusive
                // As in, an element does not contain itself
                contains = hasCompare || rnative.test(docElem.contains) ?
                    function(a, b) {
                        var adown = a.nodeType === 9 ? a.documentElement : a,
                            bup = b && b.parentNode;
                        return a === bup || !!(bup && bup.nodeType === 1 && (
                            adown.contains ?
                            adown.contains(bup) :
                            a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16
                        ));
                    } :
                    function(a, b) {
                        if (b) {
                            while ((b = b.parentNode)) {
                                if (b === a) {
                                    return true;
                                }
                            }
                        }
                        return false;
                    };

                /* Sorting
	---------------------------------------------------------------------- */

                // Document order sorting
                sortOrder = hasCompare ?
                    function(a, b) {

                        // Flag for duplicate removal
                        if (a === b) {
                            hasDuplicate = true;
                            return 0;
                        }

                        // Sort on method existence if only one input has compareDocumentPosition
                        var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
                        if (compare) {
                            return compare;
                        }

                        // Calculate position if both inputs belong to the same document
                        compare = (a.ownerDocument || a) === (b.ownerDocument || b) ?
                            a.compareDocumentPosition(b) :

                            // Otherwise we know they are disconnected
                            1;

                        // Disconnected nodes
                        if (compare & 1 ||
                            (!support.sortDetached && b.compareDocumentPosition(a) === compare)) {

                            // Choose the first element that is related to our preferred document
                            if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) {
                                return -1;
                            }
                            if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) {
                                return 1;
                            }

                            // Maintain original order
                            return sortInput ?
                                (indexOf(sortInput, a) - indexOf(sortInput, b)) :
                                0;
                        }

                        return compare & 4 ? -1 : 1;
                    } :
                    function(a, b) {
                        // Exit early if the nodes are identical
                        if (a === b) {
                            hasDuplicate = true;
                            return 0;
                        }

                        var cur,
                            i = 0,
                            aup = a.parentNode,
                            bup = b.parentNode,
                            ap = [a],
                            bp = [b];

                        // Parentless nodes are either documents or disconnected
                        if (!aup || !bup) {
                            return a === document ? -1 :
                                b === document ? 1 :
                                aup ? -1 :
                                bup ? 1 :
                                sortInput ?
                                (indexOf(sortInput, a) - indexOf(sortInput, b)) :
                                0;

                            // If the nodes are siblings, we can do a quick check
                        } else if (aup === bup) {
                            return siblingCheck(a, b);
                        }

                        // Otherwise we need full lists of their ancestors for comparison
                        cur = a;
                        while ((cur = cur.parentNode)) {
                            ap.unshift(cur);
                        }
                        cur = b;
                        while ((cur = cur.parentNode)) {
                            bp.unshift(cur);
                        }

                        // Walk down the tree looking for a discrepancy
                        while (ap[i] === bp[i]) {
                            i++;
                        }

                        return i ?
                            // Do a sibling check if the nodes have a common ancestor
                            siblingCheck(ap[i], bp[i]) :

                            // Otherwise nodes in our document sort first
                            ap[i] === preferredDoc ? -1 :
                            bp[i] === preferredDoc ? 1 :
                            0;
                    };

                return document;
            };

            Sizzle.matches = function(expr, elements) {
                return Sizzle(expr, null, null, elements);
            };

            Sizzle.matchesSelector = function(elem, expr) {
                // Set document vars if needed
                if ((elem.ownerDocument || elem) !== document) {
                    setDocument(elem);
                }

                // Make sure that attribute selectors are quoted
                expr = expr.replace(rattributeQuotes, "='$1']");

                if (support.matchesSelector && documentIsHTML &&
                    !compilerCache[expr + " "] &&
                    (!rbuggyMatches || !rbuggyMatches.test(expr)) &&
                    (!rbuggyQSA || !rbuggyQSA.test(expr))) {

                    try {
                        var ret = matches.call(elem, expr);

                        // IE 9's matchesSelector returns false on disconnected nodes
                        if (ret || support.disconnectedMatch ||
                            // As well, disconnected nodes are said to be in a document
                            // fragment in IE 9
                            elem.document && elem.document.nodeType !== 11) {
                            return ret;
                        }
                    } catch (e) {}
                }

                return Sizzle(expr, document, null, [elem]).length > 0;
            };

            Sizzle.contains = function(context, elem) {
                // Set document vars if needed
                if ((context.ownerDocument || context) !== document) {
                    setDocument(context);
                }
                return contains(context, elem);
            };

            Sizzle.attr = function(elem, name) {
                // Set document vars if needed
                if ((elem.ownerDocument || elem) !== document) {
                    setDocument(elem);
                }

                var fn = Expr.attrHandle[name.toLowerCase()],
                    // Don't get fooled by Object.prototype properties (jQuery #13807)
                    val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ?
                    fn(elem, name, !documentIsHTML) :
                    undefined;

                return val !== undefined ?
                    val :
                    support.attributes || !documentIsHTML ?
                    elem.getAttribute(name) :
                    (val = elem.getAttributeNode(name)) && val.specified ?
                    val.value :
                    null;
            };

            Sizzle.error = function(msg) {
                throw new Error("Syntax error, unrecognized expression: " + msg);
            };

            /**
             * Document sorting and removing duplicates
             * @param {ArrayLike} results
             */
            Sizzle.uniqueSort = function(results) {
                var elem,
                    duplicates = [],
                    j = 0,
                    i = 0;

                // Unless we *know* we can detect duplicates, assume their presence
                hasDuplicate = !support.detectDuplicates;
                sortInput = !support.sortStable && results.slice(0);
                results.sort(sortOrder);

                if (hasDuplicate) {
                    while ((elem = results[i++])) {
                        if (elem === results[i]) {
                            j = duplicates.push(i);
                        }
                    }
                    while (j--) {
                        results.splice(duplicates[j], 1);
                    }
                }

                // Clear input after sorting to release objects
                // See https://github.com/jquery/sizzle/pull/225
                sortInput = null;

                return results;
            };

            /**
             * Utility function for retrieving the text value of an array of DOM nodes
             * @param {Array|Element} elem
             */
            getText = Sizzle.getText = function(elem) {
                var node,
                    ret = "",
                    i = 0,
                    nodeType = elem.nodeType;

                if (!nodeType) {
                    // If no nodeType, this is expected to be an array
                    while ((node = elem[i++])) {
                        // Do not traverse comment nodes
                        ret += getText(node);
                    }
                } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
                    // Use textContent for elements
                    // innerText usage removed for consistency of new lines (jQuery #11153)
                    if (typeof elem.textContent === "string") {
                        return elem.textContent;
                    } else {
                        // Traverse its children
                        for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
                            ret += getText(elem);
                        }
                    }
                } else if (nodeType === 3 || nodeType === 4) {
                    return elem.nodeValue;
                }
                // Do not include comment or processing instruction nodes

                return ret;
            };

            Expr = Sizzle.selectors = {

                // Can be adjusted by the user
                cacheLength: 50,

                createPseudo: markFunction,

                match: matchExpr,

                attrHandle: {},

                find: {},

                relative: {
                    ">": {
                        dir: "parentNode",
                        first: true
                    },
                    " ": {
                        dir: "parentNode"
                    },
                    "+": {
                        dir: "previousSibling",
                        first: true
                    },
                    "~": {
                        dir: "previousSibling"
                    }
                },

                preFilter: {
                    "ATTR": function(match) {
                        match[1] = match[1].replace(runescape, funescape);

                        // Move the given value to match[3] whether quoted or unquoted
                        match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);

                        if (match[2] === "~=") {
                            match[3] = " " + match[3] + " ";
                        }

                        return match.slice(0, 4);
                    },

                    "CHILD": function(match) {
                        /* matches from matchExpr["CHILD"]
				1 type (only|nth|...)
				2 what (child|of-type)
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
				4 xn-component of xn+y argument ([+-]?\d*n|)
				5 sign of xn-component
				6 x of xn-component
				7 sign of y-component
				8 y of y-component
			*/
                        match[1] = match[1].toLowerCase();

                        if (match[1].slice(0, 3) === "nth") {
                            // nth-* requires argument
                            if (!match[3]) {
                                Sizzle.error(match[0]);
                            }

                            // numeric x and y parameters for Expr.filter.CHILD
                            // remember that false/true cast respectively to 0/1
                            match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
                            match[5] = +((match[7] + match[8]) || match[3] === "odd");

                            // other types prohibit arguments
                        } else if (match[3]) {
                            Sizzle.error(match[0]);
                        }

                        return match;
                    },

                    "PSEUDO": function(match) {
                        var excess,
                            unquoted = !match[6] && match[2];

                        if (matchExpr["CHILD"].test(match[0])) {
                            return null;
                        }

                        // Accept quoted arguments as-is
                        if (match[3]) {
                            match[2] = match[4] || match[5] || "";

                            // Strip excess characters from unquoted arguments
                        } else if (unquoted && rpseudo.test(unquoted) &&
                            // Get excess from tokenize (recursively)
                            (excess = tokenize(unquoted, true)) &&
                            // advance to the next closing parenthesis
                            (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {

                            // excess is a negative index
                            match[0] = match[0].slice(0, excess);
                            match[2] = unquoted.slice(0, excess);
                        }

                        // Return only captures needed by the pseudo filter method (type and argument)
                        return match.slice(0, 3);
                    }
                },

                filter: {

                    "TAG": function(nodeNameSelector) {
                        var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
                        return nodeNameSelector === "*" ?
                            function() {
                                return true;
                            } :
                            function(elem) {
                                return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
                            };
                    },

                    "CLASS": function(className) {
                        var pattern = classCache[className + " "];

                        return pattern ||
                            (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) &&
                            classCache(className, function(elem) {
                                return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");
                            });
                    },

                    "ATTR": function(name, operator, check) {
                        return function(elem) {
                            var result = Sizzle.attr(elem, name);

                            if (result == null) {
                                return operator === "!=";
                            }
                            if (!operator) {
                                return true;
                            }

                            result += "";

                            return operator === "=" ? result === check :
                                operator === "!=" ? result !== check :
                                operator === "^=" ? check && result.indexOf(check) === 0 :
                                operator === "*=" ? check && result.indexOf(check) > -1 :
                                operator === "$=" ? check && result.slice(-check.length) === check :
                                operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 :
                                operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" :
                                false;
                        };
                    },

                    "CHILD": function(type, what, argument, first, last) {
                        var simple = type.slice(0, 3) !== "nth",
                            forward = type.slice(-4) !== "last",
                            ofType = what === "of-type";

                        return first === 1 && last === 0 ?

                            // Shortcut for :nth-*(n)
                            function(elem) {
                                return !!elem.parentNode;
                            } :

                            function(elem, context, xml) {
                                var cache, uniqueCache, outerCache, node, nodeIndex, start,
                                    dir = simple !== forward ? "nextSibling" : "previousSibling",
                                    parent = elem.parentNode,
                                    name = ofType && elem.nodeName.toLowerCase(),
                                    useCache = !xml && !ofType,
                                    diff = false;

                                if (parent) {

                                    // :(first|last|only)-(child|of-type)
                                    if (simple) {
                                        while (dir) {
                                            node = elem;
                                            while ((node = node[dir])) {
                                                if (ofType ?
                                                    node.nodeName.toLowerCase() === name :
                                                    node.nodeType === 1) {

                                                    return false;
                                                }
                                            }
                                            // Reverse direction for :only-* (if we haven't yet done so)
                                            start = dir = type === "only" && !start && "nextSibling";
                                        }
                                        return true;
                                    }

                                    start = [forward ? parent.firstChild : parent.lastChild];

                                    // non-xml :nth-child(...) stores cache data on `parent`
                                    if (forward && useCache) {

                                        // Seek `elem` from a previously-cached index

                                        // ...in a gzip-friendly way
                                        node = parent;
                                        outerCache = node[expando] || (node[expando] = {});

                                        // Support: IE <9 only
                                        // Defend against cloned attroperties (jQuery gh-1709)
                                        uniqueCache = outerCache[node.uniqueID] ||
                                            (outerCache[node.uniqueID] = {});

                                        cache = uniqueCache[type] || [];
                                        nodeIndex = cache[0] === dirruns && cache[1];
                                        diff = nodeIndex && cache[2];
                                        node = nodeIndex && parent.childNodes[nodeIndex];

                                        while ((node = ++nodeIndex && node && node[dir] ||

                                                // Fallback to seeking `elem` from the start
                                                (diff = nodeIndex = 0) || start.pop())) {

                                            // When found, cache indexes on `parent` and break
                                            if (node.nodeType === 1 && ++diff && node === elem) {
                                                uniqueCache[type] = [dirruns, nodeIndex, diff];
                                                break;
                                            }
                                        }

                                    } else {
                                        // Use previously-cached element index if available
                                        if (useCache) {
                                            // ...in a gzip-friendly way
                                            node = elem;
                                            outerCache = node[expando] || (node[expando] = {});

                                            // Support: IE <9 only
                                            // Defend against cloned attroperties (jQuery gh-1709)
                                            uniqueCache = outerCache[node.uniqueID] ||
                                                (outerCache[node.uniqueID] = {});

                                            cache = uniqueCache[type] || [];
                                            nodeIndex = cache[0] === dirruns && cache[1];
                                            diff = nodeIndex;
                                        }

                                        // xml :nth-child(...)
                                        // or :nth-last-child(...) or :nth(-last)?-of-type(...)
                                        if (diff === false) {
                                            // Use the same loop as above to seek `elem` from the start
                                            while ((node = ++nodeIndex && node && node[dir] ||
                                                    (diff = nodeIndex = 0) || start.pop())) {

                                                if ((ofType ?
                                                        node.nodeName.toLowerCase() === name :
                                                        node.nodeType === 1) &&
                                                    ++diff) {

                                                    // Cache the index of each encountered element
                                                    if (useCache) {
                                                        outerCache = node[expando] || (node[expando] = {});

                                                        // Support: IE <9 only
                                                        // Defend against cloned attroperties (jQuery gh-1709)
                                                        uniqueCache = outerCache[node.uniqueID] ||
                                                            (outerCache[node.uniqueID] = {});

                                                        uniqueCache[type] = [dirruns, diff];
                                                    }

                                                    if (node === elem) {
                                                        break;
                                                    }
                                                }
                                            }
                                        }
                                    }

                                    // Incorporate the offset, then check against cycle size
                                    diff -= last;
                                    return diff === first || (diff % first === 0 && diff / first >= 0);
                                }
                            };
                    },

                    "PSEUDO": function(pseudo, argument) {
                        // pseudo-class names are case-insensitive
                        // http://www.w3.org/TR/selectors/#pseudo-classes
                        // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
                        // Remember that setFilters inherits from pseudos
                        var args,
                            fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] ||
                            Sizzle.error("unsupported pseudo: " + pseudo);

                        // The user may use createPseudo to indicate that
                        // arguments are needed to create the filter function
                        // just as Sizzle does
                        if (fn[expando]) {
                            return fn(argument);
                        }

                        // But maintain support for old signatures
                        if (fn.length > 1) {
                            args = [pseudo, pseudo, "", argument];
                            return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ?
                                markFunction(function(seed, matches) {
                                    var idx,
                                        matched = fn(seed, argument),
                                        i = matched.length;
                                    while (i--) {
                                        idx = indexOf(seed, matched[i]);
                                        seed[idx] = !(matches[idx] = matched[i]);
                                    }
                                }) :
                                function(elem) {
                                    return fn(elem, 0, args);
                                };
                        }

                        return fn;
                    }
                },

                pseudos: {
                    // Potentially complex pseudos
                    "not": markFunction(function(selector) {
                        // Trim the selector passed to compile
                        // to avoid treating leading and trailing
                        // spaces as combinators
                        var input = [],
                            results = [],
                            matcher = compile(selector.replace(rtrim, "$1"));

                        return matcher[expando] ?
                            markFunction(function(seed, matches, context, xml) {
                                var elem,
                                    unmatched = matcher(seed, null, xml, []),
                                    i = seed.length;

                                // Match elements unmatched by `matcher`
                                while (i--) {
                                    if ((elem = unmatched[i])) {
                                        seed[i] = !(matches[i] = elem);
                                    }
                                }
                            }) :
                            function(elem, context, xml) {
                                input[0] = elem;
                                matcher(input, null, xml, results);
                                // Don't keep the element (issue #299)
                                input[0] = null;
                                return !results.pop();
                            };
                    }),

                    "has": markFunction(function(selector) {
                        return function(elem) {
                            return Sizzle(selector, elem).length > 0;
                        };
                    }),

                    "contains": markFunction(function(text) {
                        text = text.replace(runescape, funescape);
                        return function(elem) {
                            return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
                        };
                    }),

                    // "Whether an element is represented by a :lang() selector
                    // is based solely on the element's language value
                    // being equal to the identifier C,
                    // or beginning with the identifier C immediately followed by "-".
                    // The matching of C against the element's language value is performed case-insensitively.
                    // The identifier C does not have to be a valid language name."
                    // http://www.w3.org/TR/selectors/#lang-pseudo
                    "lang": markFunction(function(lang) {
                        // lang value must be a valid identifier
                        if (!ridentifier.test(lang || "")) {
                            Sizzle.error("unsupported lang: " + lang);
                        }
                        lang = lang.replace(runescape, funescape).toLowerCase();
                        return function(elem) {
                            var elemLang;
                            do {
                                if ((elemLang = documentIsHTML ?
                                        elem.lang :
                                        elem.getAttribute("xml:lang") || elem.getAttribute("lang"))) {

                                    elemLang = elemLang.toLowerCase();
                                    return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
                                }
                            } while ((elem = elem.parentNode) && elem.nodeType === 1);
                            return false;
                        };
                    }),

                    // Miscellaneous
                    "target": function(elem) {
                        var hash = window.location && window.location.hash;
                        return hash && hash.slice(1) === elem.id;
                    },

                    "root": function(elem) {
                        return elem === docElem;
                    },

                    "focus": function(elem) {
                        return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
                    },

                    // Boolean properties
                    "enabled": function(elem) {
                        return elem.disabled === false;
                    },

                    "disabled": function(elem) {
                        return elem.disabled === true;
                    },

                    "checked": function(elem) {
                        // In CSS3, :checked should return both checked and selected elements
                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
                        var nodeName = elem.nodeName.toLowerCase();
                        return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
                    },

                    "selected": function(elem) {
                        // Accessing this property makes selected-by-default
                        // options in Safari work properly
                        if (elem.parentNode) {
                            elem.parentNode.selectedIndex;
                        }

                        return elem.selected === true;
                    },

                    // Contents
                    "empty": function(elem) {
                        // http://www.w3.org/TR/selectors/#empty-pseudo
                        // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
                        //   but not by others (comment: 8; processing instruction: 7; etc.)
                        // nodeType < 6 works because attributes (2) do not appear as children
                        for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
                            if (elem.nodeType < 6) {
                                return false;
                            }
                        }
                        return true;
                    },

                    "parent": function(elem) {
                        return !Expr.pseudos["empty"](elem);
                    },

                    // Element/input types
                    "header": function(elem) {
                        return rheader.test(elem.nodeName);
                    },

                    "input": function(elem) {
                        return rinputs.test(elem.nodeName);
                    },

                    "button": function(elem) {
                        var name = elem.nodeName.toLowerCase();
                        return name === "input" && elem.type === "button" || name === "button";
                    },

                    "text": function(elem) {
                        var attr;
                        return elem.nodeName.toLowerCase() === "input" &&
                            elem.type === "text" &&

                            // Support: IE<8
                            // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
                            ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
                    },

                    // Position-in-collection
                    "first": createPositionalPseudo(function() {
                        return [0];
                    }),

                    "last": createPositionalPseudo(function(matchIndexes, length) {
                        return [length - 1];
                    }),

                    "eq": createPositionalPseudo(function(matchIndexes, length, argument) {
                        return [argument < 0 ? argument + length : argument];
                    }),

                    "even": createPositionalPseudo(function(matchIndexes, length) {
                        var i = 0;
                        for (; i < length; i += 2) {
                            matchIndexes.push(i);
                        }
                        return matchIndexes;
                    }),

                    "odd": createPositionalPseudo(function(matchIndexes, length) {
                        var i = 1;
                        for (; i < length; i += 2) {
                            matchIndexes.push(i);
                        }
                        return matchIndexes;
                    }),

                    "lt": createPositionalPseudo(function(matchIndexes, length, argument) {
                        var i = argument < 0 ? argument + length : argument;
                        for (; --i >= 0;) {
                            matchIndexes.push(i);
                        }
                        return matchIndexes;
                    }),

                    "gt": createPositionalPseudo(function(matchIndexes, length, argument) {
                        var i = argument < 0 ? argument + length : argument;
                        for (; ++i < length;) {
                            matchIndexes.push(i);
                        }
                        return matchIndexes;
                    })
                }
            };

            Expr.pseudos["nth"] = Expr.pseudos["eq"];

            // Add button/input type pseudos
            for (i in {
                    radio: true,
                    checkbox: true,
                    file: true,
                    password: true,
                    image: true
                }) {
                Expr.pseudos[i] = createInputPseudo(i);
            }
            for (i in {
                    submit: true,
                    reset: true
                }) {
                Expr.pseudos[i] = createButtonPseudo(i);
            }

            // Easy API for creating new setFilters
            function setFilters() {}
            setFilters.prototype = Expr.filters = Expr.pseudos;
            Expr.setFilters = new setFilters();

            tokenize = Sizzle.tokenize = function(selector, parseOnly) {
                var matched, match, tokens, type,
                    soFar, groups, preFilters,
                    cached = tokenCache[selector + " "];

                if (cached) {
                    return parseOnly ? 0 : cached.slice(0);
                }

                soFar = selector;
                groups = [];
                preFilters = Expr.preFilter;

                while (soFar) {

                    // Comma and first run
                    if (!matched || (match = rcomma.exec(soFar))) {
                        if (match) {
                            // Don't consume trailing commas as valid
                            soFar = soFar.slice(match[0].length) || soFar;
                        }
                        groups.push((tokens = []));
                    }

                    matched = false;

                    // Combinators
                    if ((match = rcombinators.exec(soFar))) {
                        matched = match.shift();
                        tokens.push({
                            value: matched,
                            // Cast descendant combinators to space
                            type: match[0].replace(rtrim, " ")
                        });
                        soFar = soFar.slice(matched.length);
                    }

                    // Filters
                    for (type in Expr.filter) {
                        if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] ||
                                (match = preFilters[type](match)))) {
                            matched = match.shift();
                            tokens.push({
                                value: matched,
                                type: type,
                                matches: match
                            });
                            soFar = soFar.slice(matched.length);
                        }
                    }

                    if (!matched) {
                        break;
                    }
                }

                // Return the length of the invalid excess
                // if we're just parsing
                // Otherwise, throw an error or return tokens
                return parseOnly ?
                    soFar.length :
                    soFar ?
                    Sizzle.error(selector) :
                    // Cache the tokens
                    tokenCache(selector, groups).slice(0);
            };

            function toSelector(tokens) {
                var i = 0,
                    len = tokens.length,
                    selector = "";
                for (; i < len; i++) {
                    selector += tokens[i].value;
                }
                return selector;
            }

            function addCombinator(matcher, combinator, base) {
                var dir = combinator.dir,
                    checkNonElements = base && dir === "parentNode",
                    doneName = done++;

                return combinator.first ?
                    // Check against closest ancestor/preceding element
                    function(elem, context, xml) {
                        while ((elem = elem[dir])) {
                            if (elem.nodeType === 1 || checkNonElements) {
                                return matcher(elem, context, xml);
                            }
                        }
                    } :

                    // Check against all ancestor/preceding elements
                    function(elem, context, xml) {
                        var oldCache, uniqueCache, outerCache,
                            newCache = [dirruns, doneName];

                        // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
                        if (xml) {
                            while ((elem = elem[dir])) {
                                if (elem.nodeType === 1 || checkNonElements) {
                                    if (matcher(elem, context, xml)) {
                                        return true;
                                    }
                                }
                            }
                        } else {
                            while ((elem = elem[dir])) {
                                if (elem.nodeType === 1 || checkNonElements) {
                                    outerCache = elem[expando] || (elem[expando] = {});

                                    // Support: IE <9 only
                                    // Defend against cloned attroperties (jQuery gh-1709)
                                    uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {});

                                    if ((oldCache = uniqueCache[dir]) &&
                                        oldCache[0] === dirruns && oldCache[1] === doneName) {

                                        // Assign to newCache so results back-propagate to previous elements
                                        return (newCache[2] = oldCache[2]);
                                    } else {
                                        // Reuse newcache so results back-propagate to previous elements
                                        uniqueCache[dir] = newCache;

                                        // A match means we're done; a fail means we have to keep checking
                                        if ((newCache[2] = matcher(elem, context, xml))) {
                                            return true;
                                        }
                                    }
                                }
                            }
                        }
                    };
            }

            function elementMatcher(matchers) {
                return matchers.length > 1 ?
                    function(elem, context, xml) {
                        var i = matchers.length;
                        while (i--) {
                            if (!matchers[i](elem, context, xml)) {
                                return false;
                            }
                        }
                        return true;
                    } :
                    matchers[0];
            }

            function multipleContexts(selector, contexts, results) {
                var i = 0,
                    len = contexts.length;
                for (; i < len; i++) {
                    Sizzle(selector, contexts[i], results);
                }
                return results;
            }

            function condense(unmatched, map, filter, context, xml) {
                var elem,
                    newUnmatched = [],
                    i = 0,
                    len = unmatched.length,
                    mapped = map != null;

                for (; i < len; i++) {
                    if ((elem = unmatched[i])) {
                        if (!filter || filter(elem, context, xml)) {
                            newUnmatched.push(elem);
                            if (mapped) {
                                map.push(i);
                            }
                        }
                    }
                }

                return newUnmatched;
            }

            function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
                if (postFilter && !postFilter[expando]) {
                    postFilter = setMatcher(postFilter);
                }
                if (postFinder && !postFinder[expando]) {
                    postFinder = setMatcher(postFinder, postSelector);
                }
                return markFunction(function(seed, results, context, xml) {
                    var temp, i, elem,
                        preMap = [],
                        postMap = [],
                        preexisting = results.length,

                        // Get initial elements from seed or context
                        elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),

                        // Prefilter to get matcher input, preserving a map for seed-results synchronization
                        matcherIn = preFilter && (seed || !selector) ?
                        condense(elems, preMap, preFilter, context, xml) :
                        elems,

                        matcherOut = matcher ?
                        // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
                        postFinder || (seed ? preFilter : preexisting || postFilter) ?

                        // ...intermediate processing is necessary
                        [] :

                        // ...otherwise use results directly
                        results :
                        matcherIn;

                    // Find primary matches
                    if (matcher) {
                        matcher(matcherIn, matcherOut, context, xml);
                    }

                    // Apply postFilter
                    if (postFilter) {
                        temp = condense(matcherOut, postMap);
                        postFilter(temp, [], context, xml);

                        // Un-match failing elements by moving them back to matcherIn
                        i = temp.length;
                        while (i--) {
                            if ((elem = temp[i])) {
                                matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
                            }
                        }
                    }

                    if (seed) {
                        if (postFinder || preFilter) {
                            if (postFinder) {
                                // Get the final matcherOut by condensing this intermediate into postFinder contexts
                                temp = [];
                                i = matcherOut.length;
                                while (i--) {
                                    if ((elem = matcherOut[i])) {
                                        // Restore matcherIn since elem is not yet a final match
                                        temp.push((matcherIn[i] = elem));
                                    }
                                }
                                postFinder(null, (matcherOut = []), temp, xml);
                            }

                            // Move matched elements from seed to results to keep them synchronized
                            i = matcherOut.length;
                            while (i--) {
                                if ((elem = matcherOut[i]) &&
                                    (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) {

                                    seed[temp] = !(results[temp] = elem);
                                }
                            }
                        }

                        // Add elements to results, through postFinder if defined
                    } else {
                        matcherOut = condense(
                            matcherOut === results ?
                            matcherOut.splice(preexisting, matcherOut.length) :
                            matcherOut
                        );
                        if (postFinder) {
                            postFinder(null, results, matcherOut, xml);
                        } else {
                            push.apply(results, matcherOut);
                        }
                    }
                });
            }

            function matcherFromTokens(tokens) {
                var checkContext, matcher, j,
                    len = tokens.length,
                    leadingRelative = Expr.relative[tokens[0].type],
                    implicitRelative = leadingRelative || Expr.relative[" "],
                    i = leadingRelative ? 1 : 0,

                    // The foundational matcher ensures that elements are reachable from top-level context(s)
                    matchContext = addCombinator(function(elem) {
                        return elem === checkContext;
                    }, implicitRelative, true),
                    matchAnyContext = addCombinator(function(elem) {
                        return indexOf(checkContext, elem) > -1;
                    }, implicitRelative, true),
                    matchers = [function(elem, context, xml) {
                        var ret = (!leadingRelative && (xml || context !== outermostContext)) || (
                            (checkContext = context).nodeType ?
                            matchContext(elem, context, xml) :
                            matchAnyContext(elem, context, xml));
                        // Avoid hanging onto element (issue #299)
                        checkContext = null;
                        return ret;
                    }];

                for (; i < len; i++) {
                    if ((matcher = Expr.relative[tokens[i].type])) {
                        matchers = [addCombinator(elementMatcher(matchers), matcher)];
                    } else {
                        matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);

                        // Return special upon seeing a positional matcher
                        if (matcher[expando]) {
                            // Find the next relative operator (if any) for proper handling
                            j = ++i;
                            for (; j < len; j++) {
                                if (Expr.relative[tokens[j].type]) {
                                    break;
                                }
                            }
                            return setMatcher(
                                i > 1 && elementMatcher(matchers),
                                i > 1 && toSelector(
                                    // If the preceding token was a descendant combinator, insert an implicit any-element `*`
                                    tokens.slice(0, i - 1).concat({
                                        value: tokens[i - 2].type === " " ? "*" : ""
                                    })
                                ).replace(rtrim, "$1"),
                                matcher,
                                i < j && matcherFromTokens(tokens.slice(i, j)),
                                j < len && matcherFromTokens((tokens = tokens.slice(j))),
                                j < len && toSelector(tokens)
                            );
                        }
                        matchers.push(matcher);
                    }
                }

                return elementMatcher(matchers);
            }

            function matcherFromGroupMatchers(elementMatchers, setMatchers) {
                var bySet = setMatchers.length > 0,
                    byElement = elementMatchers.length > 0,
                    superMatcher = function(seed, context, xml, results, outermost) {
                        var elem, j, matcher,
                            matchedCount = 0,
                            i = "0",
                            unmatched = seed && [],
                            setMatched = [],
                            contextBackup = outermostContext,
                            // We must always have either seed elements or outermost context
                            elems = seed || byElement && Expr.find["TAG"]("*", outermost),
                            // Use integer dirruns iff this is the outermost matcher
                            dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
                            len = elems.length;

                        if (outermost) {
                            outermostContext = context === document || context || outermost;
                        }

                        // Add elements passing elementMatchers directly to results
                        // Support: IE<9, Safari
                        // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
                        for (; i !== len && (elem = elems[i]) != null; i++) {
                            if (byElement && elem) {
                                j = 0;
                                if (!context && elem.ownerDocument !== document) {
                                    setDocument(elem);
                                    xml = !documentIsHTML;
                                }
                                while ((matcher = elementMatchers[j++])) {
                                    if (matcher(elem, context || document, xml)) {
                                        results.push(elem);
                                        break;
                                    }
                                }
                                if (outermost) {
                                    dirruns = dirrunsUnique;
                                }
                            }

                            // Track unmatched elements for set filters
                            if (bySet) {
                                // They will have gone through all possible matchers
                                if ((elem = !matcher && elem)) {
                                    matchedCount--;
                                }

                                // Lengthen the array for every element, matched or not
                                if (seed) {
                                    unmatched.push(elem);
                                }
                            }
                        }

                        // `i` is now the count of elements visited above, and adding it to `matchedCount`
                        // makes the latter nonnegative.
                        matchedCount += i;

                        // Apply set filters to unmatched elements
                        // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
                        // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
                        // no element matchers and no seed.
                        // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
                        // case, which will result in a "00" `matchedCount` that differs from `i` but is also
                        // numerically zero.
                        if (bySet && i !== matchedCount) {
                            j = 0;
                            while ((matcher = setMatchers[j++])) {
                                matcher(unmatched, setMatched, context, xml);
                            }

                            if (seed) {
                                // Reintegrate element matches to eliminate the need for sorting
                                if (matchedCount > 0) {
                                    while (i--) {
                                        if (!(unmatched[i] || setMatched[i])) {
                                            setMatched[i] = pop.call(results);
                                        }
                                    }
                                }

                                // Discard index placeholder values to get only actual matches
                                setMatched = condense(setMatched);
                            }

                            // Add matches to results
                            push.apply(results, setMatched);

                            // Seedless set matches succeeding multiple successful matchers stipulate sorting
                            if (outermost && !seed && setMatched.length > 0 &&
                                (matchedCount + setMatchers.length) > 1) {

                                Sizzle.uniqueSort(results);
                            }
                        }

                        // Override manipulation of globals by nested matchers
                        if (outermost) {
                            dirruns = dirrunsUnique;
                            outermostContext = contextBackup;
                        }

                        return unmatched;
                    };

                return bySet ?
                    markFunction(superMatcher) :
                    superMatcher;
            }

            compile = Sizzle.compile = function(selector, match /* Internal Use Only */ ) {
                var i,
                    setMatchers = [],
                    elementMatchers = [],
                    cached = compilerCache[selector + " "];

                if (!cached) {
                    // Generate a function of recursive functions that can be used to check each element
                    if (!match) {
                        match = tokenize(selector);
                    }
                    i = match.length;
                    while (i--) {
                        cached = matcherFromTokens(match[i]);
                        if (cached[expando]) {
                            setMatchers.push(cached);
                        } else {
                            elementMatchers.push(cached);
                        }
                    }

                    // Cache the compiled function
                    cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));

                    // Save selector and tokenization
                    cached.selector = selector;
                }
                return cached;
            };

            /**
             * A low-level selection function that works with Sizzle's compiled
             *  selector functions
             * @param {String|Function} selector A selector or a pre-compiled
             *  selector function built with Sizzle.compile
             * @param {Element} context
             * @param {Array} [results]
             * @param {Array} [seed] A set of elements to match against
             */
            select = Sizzle.select = function(selector, context, results, seed) {
                var i, tokens, token, type, find,
                    compiled = typeof selector === "function" && selector,
                    match = !seed && tokenize((selector = compiled.selector || selector));

                results = results || [];

                // Try to minimize operations if there is only one selector in the list and no seed
                // (the latter of which guarantees us context)
                if (match.length === 1) {

                    // Reduce context if the leading compound selector is an ID
                    tokens = match[0] = match[0].slice(0);
                    if (tokens.length > 2 && (token = tokens[0]).type === "ID" &&
                        support.getById && context.nodeType === 9 && documentIsHTML &&
                        Expr.relative[tokens[1].type]) {

                        context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
                        if (!context) {
                            return results;

                            // Precompiled matchers will still verify ancestry, so step up a level
                        } else if (compiled) {
                            context = context.parentNode;
                        }

                        selector = selector.slice(tokens.shift().value.length);
                    }

                    // Fetch a seed set for right-to-left matching
                    i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
                    while (i--) {
                        token = tokens[i];

                        // Abort if we hit a combinator
                        if (Expr.relative[(type = token.type)]) {
                            break;
                        }
                        if ((find = Expr.find[type])) {
                            // Search, expanding context for leading sibling combinators
                            if ((seed = find(
                                    token.matches[0].replace(runescape, funescape),
                                    rsibling.test(tokens[0].type) && testContext(context.parentNode) || context
                                ))) {

                                // If seed is empty or no tokens remain, we can return early
                                tokens.splice(i, 1);
                                selector = seed.length && toSelector(tokens);
                                if (!selector) {
                                    push.apply(results, seed);
                                    return results;
                                }

                                break;
                            }
                        }
                    }
                }

                // Compile and execute a filtering function if one is not provided
                // Provide `match` to avoid retokenization if we modified the selector above
                (compiled || compile(selector, match))(
                    seed,
                    context, !documentIsHTML,
                    results, !context || rsibling.test(selector) && testContext(context.parentNode) || context
                );
                return results;
            };

            // One-time assignments

            // Sort stability
            support.sortStable = expando.split("").sort(sortOrder).join("") === expando;

            // Support: Chrome 14-35+
            // Always assume duplicates if they aren't passed to the comparison function
            support.detectDuplicates = !!hasDuplicate;

            // Initialize against the default document
            setDocument();

            // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
            // Detached nodes confoundingly follow *each other*
            support.sortDetached = assert(function(div1) {
                // Should return 1, but returns 4 (following)
                return div1.compareDocumentPosition(document.createElement("div")) & 1;
            });

            // Support: IE<8
            // Prevent attribute/property "interpolation"
            // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
            if (!assert(function(div) {
                    div.innerHTML = "<a href='#'></a>";
                    return div.firstChild.getAttribute("href") === "#";
                })) {
                addHandle("type|href|height|width", function(elem, name, isXML) {
                    if (!isXML) {
                        return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
                    }
                });
            }

            // Support: IE<9
            // Use defaultValue in place of getAttribute("value")
            if (!support.attributes || !assert(function(div) {
                    div.innerHTML = "<input/>";
                    div.firstChild.setAttribute("value", "");
                    return div.firstChild.getAttribute("value") === "";
                })) {
                addHandle("value", function(elem, name, isXML) {
                    if (!isXML && elem.nodeName.toLowerCase() === "input") {
                        return elem.defaultValue;
                    }
                });
            }

            // Support: IE<9
            // Use getAttributeNode to fetch booleans when getAttribute lies
            if (!assert(function(div) {
                    return div.getAttribute("disabled") == null;
                })) {
                addHandle(booleans, function(elem, name, isXML) {
                    var val;
                    if (!isXML) {
                        return elem[name] === true ? name.toLowerCase() :
                            (val = elem.getAttributeNode(name)) && val.specified ?
                            val.value :
                            null;
                    }
                });
            }

            return Sizzle;

        })(window);



    jQuery.find = Sizzle;
    jQuery.expr = Sizzle.selectors;
    jQuery.expr[":"] = jQuery.expr.pseudos;
    jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
    jQuery.text = Sizzle.getText;
    jQuery.isXMLDoc = Sizzle.isXML;
    jQuery.contains = Sizzle.contains;



    var dir = function(elem, dir, until) {
        var matched = [],
            truncate = until !== undefined;

        while ((elem = elem[dir]) && elem.nodeType !== 9) {
            if (elem.nodeType === 1) {
                if (truncate && jQuery(elem).is(until)) {
                    break;
                }
                matched.push(elem);
            }
        }
        return matched;
    };


    var siblings = function(n, elem) {
        var matched = [];

        for (; n; n = n.nextSibling) {
            if (n.nodeType === 1 && n !== elem) {
                matched.push(n);
            }
        }

        return matched;
    };


    var rneedsContext = jQuery.expr.match.needsContext;

    var rsingleTag = (/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/);



    var risSimple = /^.[^:#\[\.,]*$/;

    // Implement the identical functionality for filter and not
    function winnow(elements, qualifier, not) {
        if (jQuery.isFunction(qualifier)) {
            return jQuery.grep(elements, function(elem, i) {
                /* jshint -W018 */
                return !!qualifier.call(elem, i, elem) !== not;
            });

        }

        if (qualifier.nodeType) {
            return jQuery.grep(elements, function(elem) {
                return (elem === qualifier) !== not;
            });

        }

        if (typeof qualifier === "string") {
            if (risSimple.test(qualifier)) {
                return jQuery.filter(qualifier, elements, not);
            }

            qualifier = jQuery.filter(qualifier, elements);
        }

        return jQuery.grep(elements, function(elem) {
            return (indexOf.call(qualifier, elem) > -1) !== not;
        });
    }

    jQuery.filter = function(expr, elems, not) {
        var elem = elems[0];

        if (not) {
            expr = ":not(" + expr + ")";
        }

        return elems.length === 1 && elem.nodeType === 1 ?
            jQuery.find.matchesSelector(elem, expr) ? [elem] : [] :
            jQuery.find.matches(expr, jQuery.grep(elems, function(elem) {
                return elem.nodeType === 1;
            }));
    };

    jQuery.fn.extend({
        find: function(selector) {
            var i,
                len = this.length,
                ret = [],
                self = this;

            if (typeof selector !== "string") {
                return this.pushStack(jQuery(selector).filter(function() {
                    for (i = 0; i < len; i++) {
                        if (jQuery.contains(self[i], this)) {
                            return true;
                        }
                    }
                }));
            }

            for (i = 0; i < len; i++) {
                jQuery.find(selector, self[i], ret);
            }

            // Needed because $( selector, context ) becomes $( context ).find( selector )
            ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret);
            ret.selector = this.selector ? this.selector + " " + selector : selector;
            return ret;
        },
        filter: function(selector) {
            return this.pushStack(winnow(this, selector || [], false));
        },
        not: function(selector) {
            return this.pushStack(winnow(this, selector || [], true));
        },
        is: function(selector) {
            return !!winnow(
                this,

                // If this is a positional/relative selector, check membership in the returned set
                // so $("p:first").is("p:last") won't return true for a doc with two "p".
                typeof selector === "string" && rneedsContext.test(selector) ?
                jQuery(selector) :
                selector || [],
                false
            ).length;
        }
    });


    // Initialize a jQuery object


    // A central reference to the root jQuery(document)
    var rootjQuery,

        // A simple way to check for HTML strings
        // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
        // Strict HTML recognition (#11290: must start with <)
        rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,

        init = jQuery.fn.init = function(selector, context, root) {
            var match, elem;

            // HANDLE: $(""), $(null), $(undefined), $(false)
            if (!selector) {
                return this;
            }

            // Method init() accepts an alternate rootjQuery
            // so migrate can support jQuery.sub (gh-2101)
            root = root || rootjQuery;

            // Handle HTML strings
            if (typeof selector === "string") {
                if (selector[0] === "<" &&
                    selector[selector.length - 1] === ">" &&
                    selector.length >= 3) {

                    // Assume that strings that start and end with <> are HTML and skip the regex check
                    match = [null, selector, null];

                } else {
                    match = rquickExpr.exec(selector);
                }

                // Match html or make sure no context is specified for #id
                if (match && (match[1] || !context)) {

                    // HANDLE: $(html) -> $(array)
                    if (match[1]) {
                        context = context instanceof jQuery ? context[0] : context;

                        // Option to run scripts is true for back-compat
                        // Intentionally let the error be thrown if parseHTML is not present
                        jQuery.merge(this, jQuery.parseHTML(
                            match[1],
                            context && context.nodeType ? context.ownerDocument || context : document,
                            true
                        ));

                        // HANDLE: $(html, props)
                        if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
                            for (match in context) {

                                // Properties of context are called as methods if possible
                                if (jQuery.isFunction(this[match])) {
                                    this[match](context[match]);

                                    // ...and otherwise set as attributes
                                } else {
                                    this.attr(match, context[match]);
                                }
                            }
                        }

                        return this;

                        // HANDLE: $(#id)
                    } else {
                        elem = document.getElementById(match[2]);

                        // Support: Blackberry 4.6
                        // gEBID returns nodes no longer in the document (#6963)
                        if (elem && elem.parentNode) {

                            // Inject the element directly into the jQuery object
                            this.length = 1;
                            this[0] = elem;
                        }

                        this.context = document;
                        this.selector = selector;
                        return this;
                    }

                    // HANDLE: $(expr, $(...))
                } else if (!context || context.jquery) {
                    return (context || root).find(selector);

                    // HANDLE: $(expr, context)
                    // (which is just equivalent to: $(context).find(expr)
                } else {
                    return this.constructor(context).find(selector);
                }

                // HANDLE: $(DOMElement)
            } else if (selector.nodeType) {
                this.context = this[0] = selector;
                this.length = 1;
                return this;

                // HANDLE: $(function)
                // Shortcut for document ready
            } else if (jQuery.isFunction(selector)) {
                return root.ready !== undefined ?
                    root.ready(selector) :

                    // Execute immediately if ready is not present
                    selector(jQuery);
            }

            if (selector.selector !== undefined) {
                this.selector = selector.selector;
                this.context = selector.context;
            }

            return jQuery.makeArray(selector, this);
        };

    // Give the init function the jQuery prototype for later instantiation
    init.prototype = jQuery.fn;

    // Initialize central reference
    rootjQuery = jQuery(document);


    var rparentsprev = /^(?:parents|prev(?:Until|All))/,

        // Methods guaranteed to produce a unique set when starting from a unique set
        guaranteedUnique = {
            children: true,
            contents: true,
            next: true,
            prev: true
        };

    jQuery.fn.extend({
        has: function(target) {
            var targets = jQuery(target, this),
                l = targets.length;

            return this.filter(function() {
                var i = 0;
                for (; i < l; i++) {
                    if (jQuery.contains(this, targets[i])) {
                        return true;
                    }
                }
            });
        },

        closest: function(selectors, context) {
            var cur,
                i = 0,
                l = this.length,
                matched = [],
                pos = rneedsContext.test(selectors) || typeof selectors !== "string" ?
                jQuery(selectors, context || this.context) :
                0;

            for (; i < l; i++) {
                for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {

                    // Always skip document fragments
                    if (cur.nodeType < 11 && (pos ?
                            pos.index(cur) > -1 :

                            // Don't pass non-elements to Sizzle
                            cur.nodeType === 1 &&
                            jQuery.find.matchesSelector(cur, selectors))) {

                        matched.push(cur);
                        break;
                    }
                }
            }

            return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
        },

        // Determine the position of an element within the set
        index: function(elem) {

            // No argument, return index in parent
            if (!elem) {
                return (this[0] && this[0].parentNode) ? this.first().prevAll().length : -1;
            }

            // Index in selector
            if (typeof elem === "string") {
                return indexOf.call(jQuery(elem), this[0]);
            }

            // Locate the position of the desired element
            return indexOf.call(this,

                // If it receives a jQuery object, the first element is used
                elem.jquery ? elem[0] : elem
            );
        },

        add: function(selector, context) {
            return this.pushStack(
                jQuery.uniqueSort(
                    jQuery.merge(this.get(), jQuery(selector, context))
                )
            );
        },

        addBack: function(selector) {
            return this.add(selector == null ?
                this.prevObject : this.prevObject.filter(selector)
            );
        }
    });

    function sibling(cur, dir) {
        while ((cur = cur[dir]) && cur.nodeType !== 1) {}
        return cur;
    }

    jQuery.each({
        parent: function(elem) {
            var parent = elem.parentNode;
            return parent && parent.nodeType !== 11 ? parent : null;
        },
        parents: function(elem) {
            return dir(elem, "parentNode");
        },
        parentsUntil: function(elem, i, until) {
            return dir(elem, "parentNode", until);
        },
        next: function(elem) {
            return sibling(elem, "nextSibling");
        },
        prev: function(elem) {
            return sibling(elem, "previousSibling");
        },
        nextAll: function(elem) {
            return dir(elem, "nextSibling");
        },
        prevAll: function(elem) {
            return dir(elem, "previousSibling");
        },
        nextUntil: function(elem, i, until) {
            return dir(elem, "nextSibling", until);
        },
        prevUntil: function(elem, i, until) {
            return dir(elem, "previousSibling", until);
        },
        siblings: function(elem) {
            return siblings((elem.parentNode || {}).firstChild, elem);
        },
        children: function(elem) {
            return siblings(elem.firstChild);
        },
        contents: function(elem) {
            return elem.contentDocument || jQuery.merge([], elem.childNodes);
        }
    }, function(name, fn) {
        jQuery.fn[name] = function(until, selector) {
            var matched = jQuery.map(this, fn, until);

            if (name.slice(-5) !== "Until") {
                selector = until;
            }

            if (selector && typeof selector === "string") {
                matched = jQuery.filter(selector, matched);
            }

            if (this.length > 1) {

                // Remove duplicates
                if (!guaranteedUnique[name]) {
                    jQuery.uniqueSort(matched);
                }

                // Reverse order for parents* and prev-derivatives
                if (rparentsprev.test(name)) {
                    matched.reverse();
                }
            }

            return this.pushStack(matched);
        };
    });
    var rnotwhite = (/\S+/g);



    // Convert String-formatted options into Object-formatted ones
    function createOptions(options) {
        var object = {};
        jQuery.each(options.match(rnotwhite) || [], function(_, flag) {
            object[flag] = true;
        });
        return object;
    }

    /*
     * Create a callback list using the following parameters:
     *
     *	options: an optional list of space-separated options that will change how
     *			the callback list behaves or a more traditional option object
     *
     * By default a callback list will act like an event callback list and can be
     * "fired" multiple times.
     *
     * Possible options:
     *
     *	once:			will ensure the callback list can only be fired once (like a Deferred)
     *
     *	memory:			will keep track of previous values and will call any callback added
     *					after the list has been fired right away with the latest "memorized"
     *					values (like a Deferred)
     *
     *	unique:			will ensure a callback can only be added once (no duplicate in the list)
     *
     *	stopOnFalse:	interrupt callings when a callback returns false
     *
     */
    jQuery.Callbacks = function(options) {

        // Convert options from String-formatted to Object-formatted if needed
        // (we check in cache first)
        options = typeof options === "string" ?
            createOptions(options) :
            jQuery.extend({}, options);

        var // Flag to know if list is currently firing
            firing,

            // Last fire value for non-forgettable lists
            memory,

            // Flag to know if list was already fired
            fired,

            // Flag to prevent firing
            locked,

            // Actual callback list
            list = [],

            // Queue of execution data for repeatable lists
            queue = [],

            // Index of currently firing callback (modified by add/remove as needed)
            firingIndex = -1,

            // Fire callbacks
            fire = function() {

                // Enforce single-firing
                locked = options.once;

                // Execute callbacks for all pending executions,
                // respecting firingIndex overrides and runtime changes
                fired = firing = true;
                for (; queue.length; firingIndex = -1) {
                    memory = queue.shift();
                    while (++firingIndex < list.length) {

                        // Run callback and check for early termination
                        if (list[firingIndex].apply(memory[0], memory[1]) === false &&
                            options.stopOnFalse) {

                            // Jump to end and forget the data so .add doesn't re-fire
                            firingIndex = list.length;
                            memory = false;
                        }
                    }
                }

                // Forget the data if we're done with it
                if (!options.memory) {
                    memory = false;
                }

                firing = false;

                // Clean up if we're done firing for good
                if (locked) {

                    // Keep an empty list if we have data for future add calls
                    if (memory) {
                        list = [];

                        // Otherwise, this object is spent
                    } else {
                        list = "";
                    }
                }
            },

            // Actual Callbacks object
            self = {

                // Add a callback or a collection of callbacks to the list
                add: function() {
                    if (list) {

                        // If we have memory from a past run, we should fire after adding
                        if (memory && !firing) {
                            firingIndex = list.length - 1;
                            queue.push(memory);
                        }

                        (function add(args) {
                            jQuery.each(args, function(_, arg) {
                                if (jQuery.isFunction(arg)) {
                                    if (!options.unique || !self.has(arg)) {
                                        list.push(arg);
                                    }
                                } else if (arg && arg.length && jQuery.type(arg) !== "string") {

                                    // Inspect recursively
                                    add(arg);
                                }
                            });
                        })(arguments);

                        if (memory && !firing) {
                            fire();
                        }
                    }
                    return this;
                },

                // Remove a callback from the list
                remove: function() {
                    jQuery.each(arguments, function(_, arg) {
                        var index;
                        while ((index = jQuery.inArray(arg, list, index)) > -1) {
                            list.splice(index, 1);

                            // Handle firing indexes
                            if (index <= firingIndex) {
                                firingIndex--;
                            }
                        }
                    });
                    return this;
                },

                // Check if a given callback is in the list.
                // If no argument is given, return whether or not list has callbacks attached.
                has: function(fn) {
                    return fn ?
                        jQuery.inArray(fn, list) > -1 :
                        list.length > 0;
                },

                // Remove all callbacks from the list
                empty: function() {
                    if (list) {
                        list = [];
                    }
                    return this;
                },

                // Disable .fire and .add
                // Abort any current/pending executions
                // Clear all callbacks and values
                disable: function() {
                    locked = queue = [];
                    list = memory = "";
                    return this;
                },
                disabled: function() {
                    return !list;
                },

                // Disable .fire
                // Also disable .add unless we have memory (since it would have no effect)
                // Abort any pending executions
                lock: function() {
                    locked = queue = [];
                    if (!memory) {
                        list = memory = "";
                    }
                    return this;
                },
                locked: function() {
                    return !!locked;
                },

                // Call all callbacks with the given context and arguments
                fireWith: function(context, args) {
                    if (!locked) {
                        args = args || [];
                        args = [context, args.slice ? args.slice() : args];
                        queue.push(args);
                        if (!firing) {
                            fire();
                        }
                    }
                    return this;
                },

                // Call all the callbacks with the given arguments
                fire: function() {
                    self.fireWith(this, arguments);
                    return this;
                },

                // To know if the callbacks have already been called at least once
                fired: function() {
                    return !!fired;
                }
            };

        return self;
    };


    jQuery.extend({

        Deferred: function(func) {
            var tuples = [

                    // action, add listener, listener list, final state
                    ["resolve", "done", jQuery.Callbacks("once memory"), "resolved"],
                    ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"],
                    ["notify", "progress", jQuery.Callbacks("memory")]
                ],
                state = "pending",
                promise = {
                    state: function() {
                        return state;
                    },
                    always: function() {
                        deferred.done(arguments).fail(arguments);
                        return this;
                    },
                    then: function( /* fnDone, fnFail, fnProgress */ ) {
                        var fns = arguments;
                        return jQuery.Deferred(function(newDefer) {
                            jQuery.each(tuples, function(i, tuple) {
                                var fn = jQuery.isFunction(fns[i]) && fns[i];

                                // deferred[ done | fail | progress ] for forwarding actions to newDefer
                                deferred[tuple[1]](function() {
                                    var returned = fn && fn.apply(this, arguments);
                                    if (returned && jQuery.isFunction(returned.promise)) {
                                        returned.promise()
                                            .progress(newDefer.notify)
                                            .done(newDefer.resolve)
                                            .fail(newDefer.reject);
                                    } else {
                                        newDefer[tuple[0] + "With"](
                                            this === promise ? newDefer.promise() : this,
                                            fn ? [returned] : arguments
                                        );
                                    }
                                });
                            });
                            fns = null;
                        }).promise();
                    },

                    // Get a promise for this deferred
                    // If obj is provided, the promise aspect is added to the object
                    promise: function(obj) {
                        return obj != null ? jQuery.extend(obj, promise) : promise;
                    }
                },
                deferred = {};

            // Keep pipe for back-compat
            promise.pipe = promise.then;

            // Add list-specific methods
            jQuery.each(tuples, function(i, tuple) {
                var list = tuple[2],
                    stateString = tuple[3];

                // promise[ done | fail | progress ] = list.add
                promise[tuple[1]] = list.add;

                // Handle state
                if (stateString) {
                    list.add(function() {

                        // state = [ resolved | rejected ]
                        state = stateString;

                        // [ reject_list | resolve_list ].disable; progress_list.lock
                    }, tuples[i ^ 1][2].disable, tuples[2][2].lock);
                }

                // deferred[ resolve | reject | notify ]
                deferred[tuple[0]] = function() {
                    deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments);
                    return this;
                };
                deferred[tuple[0] + "With"] = list.fireWith;
            });

            // Make the deferred a promise
            promise.promise(deferred);

            // Call given func if any
            if (func) {
                func.call(deferred, deferred);
            }

            // All done!
            return deferred;
        },

        // Deferred helper
        when: function(subordinate /* , ..., subordinateN */ ) {
            var i = 0,
                resolveValues = slice.call(arguments),
                length = resolveValues.length,

                // the count of uncompleted subordinates
                remaining = length !== 1 ||
                (subordinate && jQuery.isFunction(subordinate.promise)) ? length : 0,

                // the master Deferred.
                // If resolveValues consist of only a single Deferred, just use that.
                deferred = remaining === 1 ? subordinate : jQuery.Deferred(),

                // Update function for both resolve and progress values
                updateFunc = function(i, contexts, values) {
                    return function(value) {
                        contexts[i] = this;
                        values[i] = arguments.length > 1 ? slice.call(arguments) : value;
                        if (values === progressValues) {
                            deferred.notifyWith(contexts, values);
                        } else if (!(--remaining)) {
                            deferred.resolveWith(contexts, values);
                        }
                    };
                },

                progressValues, progressContexts, resolveContexts;

            // Add listeners to Deferred subordinates; treat others as resolved
            if (length > 1) {
                progressValues = new Array(length);
                progressContexts = new Array(length);
                resolveContexts = new Array(length);
                for (; i < length; i++) {
                    if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) {
                        resolveValues[i].promise()
                            .progress(updateFunc(i, progressContexts, progressValues))
                            .done(updateFunc(i, resolveContexts, resolveValues))
                            .fail(deferred.reject);
                    } else {
                        --remaining;
                    }
                }
            }

            // If we're not waiting on anything, resolve the master
            if (!remaining) {
                deferred.resolveWith(resolveContexts, resolveValues);
            }

            return deferred.promise();
        }
    });


    // The deferred used on DOM ready
    var readyList;

    jQuery.fn.ready = function(fn) {

        // Add the callback
        jQuery.ready.promise().done(fn);

        return this;
    };

    jQuery.extend({

        // Is the DOM ready to be used? Set to true once it occurs.
        isReady: false,

        // A counter to track how many items to wait for before
        // the ready event fires. See #6781
        readyWait: 1,

        // Hold (or release) the ready event
        holdReady: function(hold) {
            if (hold) {
                jQuery.readyWait++;
            } else {
                jQuery.ready(true);
            }
        },

        // Handle when the DOM is ready
        ready: function(wait) {

            // Abort if there are pending holds or we're already ready
            if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
                return;
            }

            // Remember that the DOM is ready
            jQuery.isReady = true;

            // If a normal DOM Ready event fired, decrement, and wait if need be
            if (wait !== true && --jQuery.readyWait > 0) {
                return;
            }

            // If there are functions bound, to execute
            readyList.resolveWith(document, [jQuery]);

            // Trigger any bound ready events
            if (jQuery.fn.triggerHandler) {
                jQuery(document).triggerHandler("ready");
                jQuery(document).off("ready");
            }
        }
    });

    /**
     * The ready event handler and self cleanup method
     */
    function completed() {
        document.removeEventListener("DOMContentLoaded", completed);
        window.removeEventListener("load", completed);
        jQuery.ready();
    }

    jQuery.ready.promise = function(obj) {
        if (!readyList) {

            readyList = jQuery.Deferred();

            // Catch cases where $(document).ready() is called
            // after the browser event has already occurred.
            // Support: IE9-10 only
            // Older IE sometimes signals "interactive" too soon
            if (document.readyState === "complete" ||
                (document.readyState !== "loading" && !document.documentElement.doScroll)) {

                // Handle it asynchronously to allow scripts the opportunity to delay ready
                window.setTimeout(jQuery.ready);

            } else {

                // Use the handy event callback
                document.addEventListener("DOMContentLoaded", completed);

                // A fallback to window.onload, that will always work
                window.addEventListener("load", completed);
            }
        }
        return readyList.promise(obj);
    };

    // Kick off the DOM ready check even if the user does not
    jQuery.ready.promise();




    // Multifunctional method to get and set values of a collection
    // The value/s can optionally be executed if it's a function
    var access = function(elems, fn, key, value, chainable, emptyGet, raw) {
        var i = 0,
            len = elems.length,
            bulk = key == null;

        // Sets many values
        if (jQuery.type(key) === "object") {
            chainable = true;
            for (i in key) {
                access(elems, fn, i, key[i], true, emptyGet, raw);
            }

            // Sets one value
        } else if (value !== undefined) {
            chainable = true;

            if (!jQuery.isFunction(value)) {
                raw = true;
            }

            if (bulk) {

                // Bulk operations run against the entire set
                if (raw) {
                    fn.call(elems, value);
                    fn = null;

                    // ...except when executing function values
                } else {
                    bulk = fn;
                    fn = function(elem, key, value) {
                        return bulk.call(jQuery(elem), value);
                    };
                }
            }

            if (fn) {
                for (; i < len; i++) {
                    fn(
                        elems[i], key, raw ?
                        value :
                        value.call(elems[i], i, fn(elems[i], key))
                    );
                }
            }
        }

        return chainable ?
            elems :

            // Gets
            bulk ?
            fn.call(elems) :
            len ? fn(elems[0], key) : emptyGet;
    };
    var acceptData = function(owner) {

        // Accepts only:
        //  - Node
        //    - Node.ELEMENT_NODE
        //    - Node.DOCUMENT_NODE
        //  - Object
        //    - Any
        /* jshint -W018 */
        return owner.nodeType === 1 || owner.nodeType === 9 || !(+owner.nodeType);
    };




    function Data() {
        this.expando = jQuery.expando + Data.uid++;
    }

    Data.uid = 1;

    Data.prototype = {

        register: function(owner, initial) {
            var value = initial || {};

            // If it is a node unlikely to be stringify-ed or looped over
            // use plain assignment
            if (owner.nodeType) {
                owner[this.expando] = value;

                // Otherwise secure it in a non-enumerable, non-writable property
                // configurability must be true to allow the property to be
                // deleted with the delete operator
            } else {
                Object.defineProperty(owner, this.expando, {
                    value: value,
                    writable: true,
                    configurable: true
                });
            }
            return owner[this.expando];
        },
        cache: function(owner) {

            // We can accept data for non-element nodes in modern browsers,
            // but we should not, see #8335.
            // Always return an empty object.
            if (!acceptData(owner)) {
                return {};
            }

            // Check if the owner object already has a cache
            var value = owner[this.expando];

            // If not, create one
            if (!value) {
                value = {};

                // We can accept data for non-element nodes in modern browsers,
                // but we should not, see #8335.
                // Always return an empty object.
                if (acceptData(owner)) {

                    // If it is a node unlikely to be stringify-ed or looped over
                    // use plain assignment
                    if (owner.nodeType) {
                        owner[this.expando] = value;

                        // Otherwise secure it in a non-enumerable property
                        // configurable must be true to allow the property to be
                        // deleted when data is removed
                    } else {
                        Object.defineProperty(owner, this.expando, {
                            value: value,
                            configurable: true
                        });
                    }
                }
            }

            return value;
        },
        set: function(owner, data, value) {
            var prop,
                cache = this.cache(owner);

            // Handle: [ owner, key, value ] args
            if (typeof data === "string") {
                cache[data] = value;

                // Handle: [ owner, { properties } ] args
            } else {

                // Copy the properties one-by-one to the cache object
                for (prop in data) {
                    cache[prop] = data[prop];
                }
            }
            return cache;
        },
        get: function(owner, key) {
            return key === undefined ?
                this.cache(owner) :
                owner[this.expando] && owner[this.expando][key];
        },
        access: function(owner, key, value) {
            var stored;

            // In cases where either:
            //
            //   1. No key was specified
            //   2. A string key was specified, but no value provided
            //
            // Take the "read" path and allow the get method to determine
            // which value to return, respectively either:
            //
            //   1. The entire cache object
            //   2. The data stored at the key
            //
            if (key === undefined ||
                ((key && typeof key === "string") && value === undefined)) {

                stored = this.get(owner, key);

                return stored !== undefined ?
                    stored : this.get(owner, jQuery.camelCase(key));
            }

            // When the key is not a string, or both a key and value
            // are specified, set or extend (existing objects) with either:
            //
            //   1. An object of properties
            //   2. A key and value
            //
            this.set(owner, key, value);

            // Since the "set" path can have two possible entry points
            // return the expected data based on which path was taken[*]
            return value !== undefined ? value : key;
        },
        remove: function(owner, key) {
            var i, name, camel,
                cache = owner[this.expando];

            if (cache === undefined) {
                return;
            }

            if (key === undefined) {
                this.register(owner);

            } else {

                // Support array or space separated string of keys
                if (jQuery.isArray(key)) {

                    // If "name" is an array of keys...
                    // When data is initially created, via ("key", "val") signature,
                    // keys will be converted to camelCase.
                    // Since there is no way to tell _how_ a key was added, remove
                    // both plain key and camelCase key. #12786
                    // This will only penalize the array argument path.
                    name = key.concat(key.map(jQuery.camelCase));
                } else {
                    camel = jQuery.camelCase(key);

                    // Try the string as a key before any manipulation
                    if (key in cache) {
                        name = [key, camel];
                    } else {

                        // If a key with the spaces exists, use it.
                        // Otherwise, create an array by matching non-whitespace
                        name = camel;
                        name = name in cache ?
                            [name] : (name.match(rnotwhite) || []);
                    }
                }

                i = name.length;

                while (i--) {
                    delete cache[name[i]];
                }
            }

            // Remove the expando if there's no more data
            if (key === undefined || jQuery.isEmptyObject(cache)) {

                // Support: Chrome <= 35-45+
                // Webkit & Blink performance suffers when deleting properties
                // from DOM nodes, so set to undefined instead
                // https://code.google.com/p/chromium/issues/detail?id=378607
                if (owner.nodeType) {
                    owner[this.expando] = undefined;
                } else {
                    delete owner[this.expando];
                }
            }
        },
        hasData: function(owner) {
            var cache = owner[this.expando];
            return cache !== undefined && !jQuery.isEmptyObject(cache);
        }
    };
    var dataPriv = new Data();

    var dataUser = new Data();



    //	Implementation Summary
    //
    //	1. Enforce API surface and semantic compatibility with 1.9.x branch
    //	2. Improve the module's maintainability by reducing the storage
    //		paths to a single mechanism.
    //	3. Use the same single mechanism to support "private" and "user" data.
    //	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
    //	5. Avoid exposing implementation details on user objects (eg. expando properties)
    //	6. Provide a clear path for implementation upgrade to WeakMap in 2014

    var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
        rmultiDash = /[A-Z]/g;

    function dataAttr(elem, key, data) {
        var name;

        // If nothing was found internally, try to fetch any
        // data from the HTML5 data-* attribute
        if (data === undefined && elem.nodeType === 1) {
            name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
            data = elem.getAttribute(name);

            if (typeof data === "string") {
                try {
                    data = data === "true" ? true :
                        data === "false" ? false :
                        data === "null" ? null :

                        // Only convert to a number if it doesn't change the string
                        +data + "" === data ? +data :
                        rbrace.test(data) ? jQuery.parseJSON(data) :
                        data;
                } catch (e) {}

                // Make sure we set the data so it isn't changed later
                dataUser.set(elem, key, data);
            } else {
                data = undefined;
            }
        }
        return data;
    }

    jQuery.extend({
        hasData: function(elem) {
            return dataUser.hasData(elem) || dataPriv.hasData(elem);
        },

        data: function(elem, name, data) {
            return dataUser.access(elem, name, data);
        },

        removeData: function(elem, name) {
            dataUser.remove(elem, name);
        },

        // TODO: Now that all calls to _data and _removeData have been replaced
        // with direct calls to dataPriv methods, these can be deprecated.
        _data: function(elem, name, data) {
            return dataPriv.access(elem, name, data);
        },

        _removeData: function(elem, name) {
            dataPriv.remove(elem, name);
        }
    });

    jQuery.fn.extend({
        data: function(key, value) {
            var i, name, data,
                elem = this[0],
                attrs = elem && elem.attributes;

            // Gets all values
            if (key === undefined) {
                if (this.length) {
                    data = dataUser.get(elem);

                    if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
                        i = attrs.length;
                        while (i--) {

                            // Support: IE11+
                            // The attrs elements can be null (#14894)
                            if (attrs[i]) {
                                name = attrs[i].name;
                                if (name.indexOf("data-") === 0) {
                                    name = jQuery.camelCase(name.slice(5));
                                    dataAttr(elem, name, data[name]);
                                }
                            }
                        }
                        dataPriv.set(elem, "hasDataAttrs", true);
                    }
                }

                return data;
            }

            // Sets multiple values
            if (typeof key === "object") {
                return this.each(function() {
                    dataUser.set(this, key);
                });
            }

            return access(this, function(value) {
                var data, camelKey;

                // The calling jQuery object (element matches) is not empty
                // (and therefore has an element appears at this[ 0 ]) and the
                // `value` parameter was not undefined. An empty jQuery object
                // will result in `undefined` for elem = this[ 0 ] which will
                // throw an exception if an attempt to read a data cache is made.
                if (elem && value === undefined) {

                    // Attempt to get data from the cache
                    // with the key as-is
                    data = dataUser.get(elem, key) ||

                        // Try to find dashed key if it exists (gh-2779)
                        // This is for 2.2.x only
                        dataUser.get(elem, key.replace(rmultiDash, "-$&").toLowerCase());

                    if (data !== undefined) {
                        return data;
                    }

                    camelKey = jQuery.camelCase(key);

                    // Attempt to get data from the cache
                    // with the key camelized
                    data = dataUser.get(elem, camelKey);
                    if (data !== undefined) {
                        return data;
                    }

                    // Attempt to "discover" the data in
                    // HTML5 custom data-* attrs
                    data = dataAttr(elem, camelKey, undefined);
                    if (data !== undefined) {
                        return data;
                    }

                    // We tried really hard, but the data doesn't exist.
                    return;
                }

                // Set the data...
                camelKey = jQuery.camelCase(key);
                this.each(function() {

                    // First, attempt to store a copy or reference of any
                    // data that might've been store with a camelCased key.
                    var data = dataUser.get(this, camelKey);

                    // For HTML5 data-* attribute interop, we have to
                    // store property names with dashes in a camelCase form.
                    // This might not apply to all properties...*
                    dataUser.set(this, camelKey, value);

                    // *... In the case of properties that might _actually_
                    // have dashes, we need to also store a copy of that
                    // unchanged property.
                    if (key.indexOf("-") > -1 && data !== undefined) {
                        dataUser.set(this, key, value);
                    }
                });
            }, null, value, arguments.length > 1, null, true);
        },

        removeData: function(key) {
            return this.each(function() {
                dataUser.remove(this, key);
            });
        }
    });


    jQuery.extend({
        queue: function(elem, type, data) {
            var queue;

            if (elem) {
                type = (type || "fx") + "queue";
                queue = dataPriv.get(elem, type);

                // Speed up dequeue by getting out quickly if this is just a lookup
                if (data) {
                    if (!queue || jQuery.isArray(data)) {
                        queue = dataPriv.access(elem, type, jQuery.makeArray(data));
                    } else {
                        queue.push(data);
                    }
                }
                return queue || [];
            }
        },

        dequeue: function(elem, type) {
            type = type || "fx";

            var queue = jQuery.queue(elem, type),
                startLength = queue.length,
                fn = queue.shift(),
                hooks = jQuery._queueHooks(elem, type),
                next = function() {
                    jQuery.dequeue(elem, type);
                };

            // If the fx queue is dequeued, always remove the progress sentinel
            if (fn === "inprogress") {
                fn = queue.shift();
                startLength--;
            }

            if (fn) {

                // Add a progress sentinel to prevent the fx queue from being
                // automatically dequeued
                if (type === "fx") {
                    queue.unshift("inprogress");
                }

                // Clear up the last queue stop function
                delete hooks.stop;
                fn.call(elem, next, hooks);
            }

            if (!startLength && hooks) {
                hooks.empty.fire();
            }
        },

        // Not public - generate a queueHooks object, or return the current one
        _queueHooks: function(elem, type) {
            var key = type + "queueHooks";
            return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
                empty: jQuery.Callbacks("once memory").add(function() {
                    dataPriv.remove(elem, [type + "queue", key]);
                })
            });
        }
    });

    jQuery.fn.extend({
        queue: function(type, data) {
            var setter = 2;

            if (typeof type !== "string") {
                data = type;
                type = "fx";
                setter--;
            }

            if (arguments.length < setter) {
                return jQuery.queue(this[0], type);
            }

            return data === undefined ?
                this :
                this.each(function() {
                    var queue = jQuery.queue(this, type, data);

                    // Ensure a hooks for this queue
                    jQuery._queueHooks(this, type);

                    if (type === "fx" && queue[0] !== "inprogress") {
                        jQuery.dequeue(this, type);
                    }
                });
        },
        dequeue: function(type) {
            return this.each(function() {
                jQuery.dequeue(this, type);
            });
        },
        clearQueue: function(type) {
            return this.queue(type || "fx", []);
        },

        // Get a promise resolved when queues of a certain type
        // are emptied (fx is the type by default)
        promise: function(type, obj) {
            var tmp,
                count = 1,
                defer = jQuery.Deferred(),
                elements = this,
                i = this.length,
                resolve = function() {
                    if (!(--count)) {
                        defer.resolveWith(elements, [elements]);
                    }
                };

            if (typeof type !== "string") {
                obj = type;
                type = undefined;
            }
            type = type || "fx";

            while (i--) {
                tmp = dataPriv.get(elements[i], type + "queueHooks");
                if (tmp && tmp.empty) {
                    count++;
                    tmp.empty.add(resolve);
                }
            }
            resolve();
            return defer.promise(obj);
        }
    });
    var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;

    var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");


    var cssExpand = ["Top", "Right", "Bottom", "Left"];

    var isHidden = function(elem, el) {

        // isHidden might be called from jQuery#filter function;
        // in that case, element will be second argument
        elem = el || elem;
        return jQuery.css(elem, "display") === "none" ||
            !jQuery.contains(elem.ownerDocument, elem);
    };



    function adjustCSS(elem, prop, valueParts, tween) {
        var adjusted,
            scale = 1,
            maxIterations = 20,
            currentValue = tween ?
            function() {
                return tween.cur();
            } :
            function() {
                return jQuery.css(elem, prop, "");
            },
            initial = currentValue(),
            unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"),

            // Starting value computation is required for potential unit mismatches
            initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) &&
            rcssNum.exec(jQuery.css(elem, prop));

        if (initialInUnit && initialInUnit[3] !== unit) {

            // Trust units reported by jQuery.css
            unit = unit || initialInUnit[3];

            // Make sure we update the tween properties later on
            valueParts = valueParts || [];

            // Iteratively approximate from a nonzero starting point
            initialInUnit = +initial || 1;

            do {

                // If previous iteration zeroed out, double until we get *something*.
                // Use string for doubling so we don't accidentally see scale as unchanged below
                scale = scale || ".5";

                // Adjust and apply
                initialInUnit = initialInUnit / scale;
                jQuery.style(elem, prop, initialInUnit + unit);

                // Update scale, tolerating zero or NaN from tween.cur()
                // Break the loop if scale is unchanged or perfect, or if we've just had enough.
            } while (
                scale !== (scale = currentValue() / initial) && scale !== 1 && --maxIterations
            );
        }

        if (valueParts) {
            initialInUnit = +initialInUnit || +initial || 0;

            // Apply relative offset (+=/-=) if specified
            adjusted = valueParts[1] ?
                initialInUnit + (valueParts[1] + 1) * valueParts[2] :
                +valueParts[2];
            if (tween) {
                tween.unit = unit;
                tween.start = initialInUnit;
                tween.end = adjusted;
            }
        }
        return adjusted;
    }
    var rcheckableType = (/^(?:checkbox|radio)$/i);

    var rtagName = (/<([\w:-]+)/);

    var rscriptType = (/^$|\/(?:java|ecma)script/i);



    // We have to close these tags to support XHTML (#13200)
    var wrapMap = {

        // Support: IE9
        option: [1, "<select multiple='multiple'>", "</select>"],

        // XHTML parsers do not magically insert elements in the
        // same way that tag soup parsers do. So we cannot shorten
        // this by omitting <tbody> or other required elements.
        thead: [1, "<table>", "</table>"],
        col: [2, "<table><colgroup>", "</colgroup></table>"],
        tr: [2, "<table><tbody>", "</tbody></table>"],
        td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],

        _default: [0, "", ""]
    };

    // Support: IE9
    wrapMap.optgroup = wrapMap.option;

    wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
    wrapMap.th = wrapMap.td;


    function getAll(context, tag) {

        // Support: IE9-11+
        // Use typeof to avoid zero-argument method invocation on host objects (#15151)
        var ret = typeof context.getElementsByTagName !== "undefined" ?
            context.getElementsByTagName(tag || "*") :
            typeof context.querySelectorAll !== "undefined" ?
            context.querySelectorAll(tag || "*") :
            [];

        return tag === undefined || tag && jQuery.nodeName(context, tag) ?
            jQuery.merge([context], ret) :
            ret;
    }


    // Mark scripts as having already been evaluated
    function setGlobalEval(elems, refElements) {
        var i = 0,
            l = elems.length;

        for (; i < l; i++) {
            dataPriv.set(
                elems[i],
                "globalEval", !refElements || dataPriv.get(refElements[i], "globalEval")
            );
        }
    }


    var rhtml = /<|&#?\w+;/;

    function buildFragment(elems, context, scripts, selection, ignored) {
        var elem, tmp, tag, wrap, contains, j,
            fragment = context.createDocumentFragment(),
            nodes = [],
            i = 0,
            l = elems.length;

        for (; i < l; i++) {
            elem = elems[i];

            if (elem || elem === 0) {

                // Add nodes directly
                if (jQuery.type(elem) === "object") {

                    // Support: Android<4.1, PhantomJS<2
                    // push.apply(_, arraylike) throws on ancient WebKit
                    jQuery.merge(nodes, elem.nodeType ? [elem] : elem);

                    // Convert non-html into a text node
                } else if (!rhtml.test(elem)) {
                    nodes.push(context.createTextNode(elem));

                    // Convert html into DOM nodes
                } else {
                    tmp = tmp || fragment.appendChild(context.createElement("div"));

                    // Deserialize a standard representation
                    tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
                    wrap = wrapMap[tag] || wrapMap._default;
                    tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];

                    // Descend through wrappers to the right content
                    j = wrap[0];
                    while (j--) {
                        tmp = tmp.lastChild;
                    }

                    // Support: Android<4.1, PhantomJS<2
                    // push.apply(_, arraylike) throws on ancient WebKit
                    jQuery.merge(nodes, tmp.childNodes);

                    // Remember the top-level container
                    tmp = fragment.firstChild;

                    // Ensure the created nodes are orphaned (#12392)
                    tmp.textContent = "";
                }
            }
        }

        // Remove wrapper from fragment
        fragment.textContent = "";

        i = 0;
        while ((elem = nodes[i++])) {

            // Skip elements already in the context collection (trac-4087)
            if (selection && jQuery.inArray(elem, selection) > -1) {
                if (ignored) {
                    ignored.push(elem);
                }
                continue;
            }

            contains = jQuery.contains(elem.ownerDocument, elem);

            // Append to fragment
            tmp = getAll(fragment.appendChild(elem), "script");

            // Preserve script evaluation history
            if (contains) {
                setGlobalEval(tmp);
            }

            // Capture executables
            if (scripts) {
                j = 0;
                while ((elem = tmp[j++])) {
                    if (rscriptType.test(elem.type || "")) {
                        scripts.push(elem);
                    }
                }
            }
        }

        return fragment;
    }


    (function() {
        var fragment = document.createDocumentFragment(),
            div = fragment.appendChild(document.createElement("div")),
            input = document.createElement("input");

        // Support: Android 4.0-4.3, Safari<=5.1
        // Check state lost if the name is set (#11217)
        // Support: Windows Web Apps (WWA)
        // `name` and `type` must use .setAttribute for WWA (#14901)
        input.setAttribute("type", "radio");
        input.setAttribute("checked", "checked");
        input.setAttribute("name", "t");

        div.appendChild(input);

        // Support: Safari<=5.1, Android<4.2
        // Older WebKit doesn't clone checked state correctly in fragments
        support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;

        // Support: IE<=11+
        // Make sure textarea (and checkbox) defaultValue is properly cloned
        div.innerHTML = "<textarea>x</textarea>";
        support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
    })();


    var
        rkeyEvent = /^key/,
        rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
        rtypenamespace = /^([^.]*)(?:\.(.+)|)/;

    function returnTrue() {
        return true;
    }

    function returnFalse() {
        return false;
    }

    // Support: IE9
    // See #13393 for more info
    function safeActiveElement() {
        try {
            return document.activeElement;
        } catch (err) {}
    }

    function on(elem, types, selector, data, fn, one) {
        var origFn, type;

        // Types can be a map of types/handlers
        if (typeof types === "object") {

            // ( types-Object, selector, data )
            if (typeof selector !== "string") {

                // ( types-Object, data )
                data = data || selector;
                selector = undefined;
            }
            for (type in types) {
                on(elem, type, selector, data, types[type], one);
            }
            return elem;
        }

        if (data == null && fn == null) {

            // ( types, fn )
            fn = selector;
            data = selector = undefined;
        } else if (fn == null) {
            if (typeof selector === "string") {

                // ( types, selector, fn )
                fn = data;
                data = undefined;
            } else {

                // ( types, data, fn )
                fn = data;
                data = selector;
                selector = undefined;
            }
        }
        if (fn === false) {
            fn = returnFalse;
        } else if (!fn) {
            return elem;
        }

        if (one === 1) {
            origFn = fn;
            fn = function(event) {

                // Can use an empty set, since event contains the info
                jQuery().off(event);
                return origFn.apply(this, arguments);
            };

            // Use same guid so caller can remove using origFn
            fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
        }
        return elem.each(function() {
            jQuery.event.add(this, types, fn, data, selector);
        });
    }

    /*
     * Helper functions for managing events -- not part of the public interface.
     * Props to Dean Edwards' addEvent library for many of the ideas.
     */
    jQuery.event = {

        global: {},

        add: function(elem, types, handler, data, selector) {

            var handleObjIn, eventHandle, tmp,
                events, t, handleObj,
                special, handlers, type, namespaces, origType,
                elemData = dataPriv.get(elem);

            // Don't attach events to noData or text/comment nodes (but allow plain objects)
            if (!elemData) {
                return;
            }

            // Caller can pass in an object of custom data in lieu of the handler
            if (handler.handler) {
                handleObjIn = handler;
                handler = handleObjIn.handler;
                selector = handleObjIn.selector;
            }

            // Make sure that the handler has a unique ID, used to find/remove it later
            if (!handler.guid) {
                handler.guid = jQuery.guid++;
            }

            // Init the element's event structure and main handler, if this is the first
            if (!(events = elemData.events)) {
                events = elemData.events = {};
            }
            if (!(eventHandle = elemData.handle)) {
                eventHandle = elemData.handle = function(e) {

                    // Discard the second event of a jQuery.event.trigger() and
                    // when an event is called after a page has unloaded
                    return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
                        jQuery.event.dispatch.apply(elem, arguments) : undefined;
                };
            }

            // Handle multiple events separated by a space
            types = (types || "").match(rnotwhite) || [""];
            t = types.length;
            while (t--) {
                tmp = rtypenamespace.exec(types[t]) || [];
                type = origType = tmp[1];
                namespaces = (tmp[2] || "").split(".").sort();

                // There *must* be a type, no attaching namespace-only handlers
                if (!type) {
                    continue;
                }

                // If event changes its type, use the special event handlers for the changed type
                special = jQuery.event.special[type] || {};

                // If selector defined, determine special event api type, otherwise given type
                type = (selector ? special.delegateType : special.bindType) || type;

                // Update special based on newly reset type
                special = jQuery.event.special[type] || {};

                // handleObj is passed to all event handlers
                handleObj = jQuery.extend({
                    type: type,
                    origType: origType,
                    data: data,
                    handler: handler,
                    guid: handler.guid,
                    selector: selector,
                    needsContext: selector && jQuery.expr.match.needsContext.test(selector),
                    namespace: namespaces.join(".")
                }, handleObjIn);

                // Init the event handler queue if we're the first
                if (!(handlers = events[type])) {
                    handlers = events[type] = [];
                    handlers.delegateCount = 0;

                    // Only use addEventListener if the special events handler returns false
                    if (!special.setup ||
                        special.setup.call(elem, data, namespaces, eventHandle) === false) {

                        if (elem.addEventListener) {
                            elem.addEventListener(type, eventHandle);
                        }
                    }
                }

                if (special.add) {
                    special.add.call(elem, handleObj);

                    if (!handleObj.handler.guid) {
                        handleObj.handler.guid = handler.guid;
                    }
                }

                // Add to the element's handler list, delegates in front
                if (selector) {
                    handlers.splice(handlers.delegateCount++, 0, handleObj);
                } else {
                    handlers.push(handleObj);
                }

                // Keep track of which events have ever been used, for event optimization
                jQuery.event.global[type] = true;
            }

        },

        // Detach an event or set of events from an element
        remove: function(elem, types, handler, selector, mappedTypes) {

            var j, origCount, tmp,
                events, t, handleObj,
                special, handlers, type, namespaces, origType,
                elemData = dataPriv.hasData(elem) && dataPriv.get(elem);

            if (!elemData || !(events = elemData.events)) {
                return;
            }

            // Once for each type.namespace in types; type may be omitted
            types = (types || "").match(rnotwhite) || [""];
            t = types.length;
            while (t--) {
                tmp = rtypenamespace.exec(types[t]) || [];
                type = origType = tmp[1];
                namespaces = (tmp[2] || "").split(".").sort();

                // Unbind all events (on this namespace, if provided) for the element
                if (!type) {
                    for (type in events) {
                        jQuery.event.remove(elem, type + types[t], handler, selector, true);
                    }
                    continue;
                }

                special = jQuery.event.special[type] || {};
                type = (selector ? special.delegateType : special.bindType) || type;
                handlers = events[type] || [];
                tmp = tmp[2] &&
                    new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");

                // Remove matching events
                origCount = j = handlers.length;
                while (j--) {
                    handleObj = handlers[j];

                    if ((mappedTypes || origType === handleObj.origType) &&
                        (!handler || handler.guid === handleObj.guid) &&
                        (!tmp || tmp.test(handleObj.namespace)) &&
                        (!selector || selector === handleObj.selector ||
                            selector === "**" && handleObj.selector)) {
                        handlers.splice(j, 1);

                        if (handleObj.selector) {
                            handlers.delegateCount--;
                        }
                        if (special.remove) {
                            special.remove.call(elem, handleObj);
                        }
                    }
                }

                // Remove generic event handler if we removed something and no more handlers exist
                // (avoids potential for endless recursion during removal of special event handlers)
                if (origCount && !handlers.length) {
                    if (!special.teardown ||
                        special.teardown.call(elem, namespaces, elemData.handle) === false) {

                        jQuery.removeEvent(elem, type, elemData.handle);
                    }

                    delete events[type];
                }
            }

            // Remove data and the expando if it's no longer used
            if (jQuery.isEmptyObject(events)) {
                dataPriv.remove(elem, "handle events");
            }
        },

        dispatch: function(event) {

            // Make a writable jQuery.Event from the native event object
            event = jQuery.event.fix(event);

            var i, j, ret, matched, handleObj,
                handlerQueue = [],
                args = slice.call(arguments),
                handlers = (dataPriv.get(this, "events") || {})[event.type] || [],
                special = jQuery.event.special[event.type] || {};

            // Use the fix-ed jQuery.Event rather than the (read-only) native event
            args[0] = event;
            event.delegateTarget = this;

            // Call the preDispatch hook for the mapped type, and let it bail if desired
            if (special.preDispatch && special.preDispatch.call(this, event) === false) {
                return;
            }

            // Determine handlers
            handlerQueue = jQuery.event.handlers.call(this, event, handlers);

            // Run delegates first; they may want to stop propagation beneath us
            i = 0;
            while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
                event.currentTarget = matched.elem;

                j = 0;
                while ((handleObj = matched.handlers[j++]) &&
                    !event.isImmediatePropagationStopped()) {

                    // Triggered event must either 1) have no namespace, or 2) have namespace(s)
                    // a subset or equal to those in the bound event (both can have no namespace).
                    if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) {

                        event.handleObj = handleObj;
                        event.data = handleObj.data;

                        ret = ((jQuery.event.special[handleObj.origType] || {}).handle ||
                            handleObj.handler).apply(matched.elem, args);

                        if (ret !== undefined) {
                            if ((event.result = ret) === false) {
                                event.preventDefault();
                                event.stopPropagation();
                            }
                        }
                    }
                }
            }

            // Call the postDispatch hook for the mapped type
            if (special.postDispatch) {
                special.postDispatch.call(this, event);
            }

            return event.result;
        },

        handlers: function(event, handlers) {
            var i, matches, sel, handleObj,
                handlerQueue = [],
                delegateCount = handlers.delegateCount,
                cur = event.target;

            // Support (at least): Chrome, IE9
            // Find delegate handlers
            // Black-hole SVG <use> instance trees (#13180)
            //
            // Support: Firefox<=42+
            // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
            if (delegateCount && cur.nodeType &&
                (event.type !== "click" || isNaN(event.button) || event.button < 1)) {

                for (; cur !== this; cur = cur.parentNode || this) {

                    // Don't check non-elements (#13208)
                    // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
                    if (cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click")) {
                        matches = [];
                        for (i = 0; i < delegateCount; i++) {
                            handleObj = handlers[i];

                            // Don't conflict with Object.prototype properties (#13203)
                            sel = handleObj.selector + " ";

                            if (matches[sel] === undefined) {
                                matches[sel] = handleObj.needsContext ?
                                    jQuery(sel, this).index(cur) > -1 :
                                    jQuery.find(sel, this, null, [cur]).length;
                            }
                            if (matches[sel]) {
                                matches.push(handleObj);
                            }
                        }
                        if (matches.length) {
                            handlerQueue.push({
                                elem: cur,
                                handlers: matches
                            });
                        }
                    }
                }
            }

            // Add the remaining (directly-bound) handlers
            if (delegateCount < handlers.length) {
                handlerQueue.push({
                    elem: this,
                    handlers: handlers.slice(delegateCount)
                });
            }

            return handlerQueue;
        },

        // Includes some event props shared by KeyEvent and MouseEvent
        props: ("altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
            "metaKey relatedTarget shiftKey target timeStamp view which").split(" "),

        fixHooks: {},

        keyHooks: {
            props: "char charCode key keyCode".split(" "),
            filter: function(event, original) {

                // Add which for key events
                if (event.which == null) {
                    event.which = original.charCode != null ? original.charCode : original.keyCode;
                }

                return event;
            }
        },

        mouseHooks: {
            props: ("button buttons clientX clientY offsetX offsetY pageX pageY " +
                "screenX screenY toElement").split(" "),
            filter: function(event, original) {
                var eventDoc, doc, body,
                    button = original.button;

                // Calculate pageX/Y if missing and clientX/Y available
                if (event.pageX == null && original.clientX != null) {
                    eventDoc = event.target.ownerDocument || document;
                    doc = eventDoc.documentElement;
                    body = eventDoc.body;

                    event.pageX = original.clientX +
                        (doc && doc.scrollLeft || body && body.scrollLeft || 0) -
                        (doc && doc.clientLeft || body && body.clientLeft || 0);
                    event.pageY = original.clientY +
                        (doc && doc.scrollTop || body && body.scrollTop || 0) -
                        (doc && doc.clientTop || body && body.clientTop || 0);
                }

                // Add which for click: 1 === left; 2 === middle; 3 === right
                // Note: button is not normalized, so don't use it
                if (!event.which && button !== undefined) {
                    event.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0)));
                }

                return event;
            }
        },

        fix: function(event) {
            if (event[jQuery.expando]) {
                return event;
            }

            // Create a writable copy of the event object and normalize some properties
            var i, prop, copy,
                type = event.type,
                originalEvent = event,
                fixHook = this.fixHooks[type];

            if (!fixHook) {
                this.fixHooks[type] = fixHook =
                    rmouseEvent.test(type) ? this.mouseHooks :
                    rkeyEvent.test(type) ? this.keyHooks : {};
            }
            copy = fixHook.props ? this.props.concat(fixHook.props) : this.props;

            event = new jQuery.Event(originalEvent);

            i = copy.length;
            while (i--) {
                prop = copy[i];
                event[prop] = originalEvent[prop];
            }

            // Support: Cordova 2.5 (WebKit) (#13255)
            // All events should have a target; Cordova deviceready doesn't
            if (!event.target) {
                event.target = document;
            }

            // Support: Safari 6.0+, Chrome<28
            // Target should not be a text node (#504, #13143)
            if (event.target.nodeType === 3) {
                event.target = event.target.parentNode;
            }

            return fixHook.filter ? fixHook.filter(event, originalEvent) : event;
        },

        special: {
            load: {

                // Prevent triggered image.load events from bubbling to window.load
                noBubble: true
            },
            focus: {

                // Fire native event if possible so blur/focus sequence is correct
                trigger: function() {
                    if (this !== safeActiveElement() && this.focus) {
                        this.focus();
                        return false;
                    }
                },
                delegateType: "focusin"
            },
            blur: {
                trigger: function() {
                    if (this === safeActiveElement() && this.blur) {
                        this.blur();
                        return false;
                    }
                },
                delegateType: "focusout"
            },
            click: {

                // For checkbox, fire native event so checked state will be right
                trigger: function() {
                    if (this.type === "checkbox" && this.click && jQuery.nodeName(this, "input")) {
                        this.click();
                        return false;
                    }
                },

                // For cross-browser consistency, don't fire native .click() on links
                _default: function(event) {
                    return jQuery.nodeName(event.target, "a");
                }
            },

            beforeunload: {
                postDispatch: function(event) {

                    // Support: Firefox 20+
                    // Firefox doesn't alert if the returnValue field is not set.
                    if (event.result !== undefined && event.originalEvent) {
                        event.originalEvent.returnValue = event.result;
                    }
                }
            }
        }
    };

    jQuery.removeEvent = function(elem, type, handle) {

        // This "if" is needed for plain objects
        if (elem.removeEventListener) {
            elem.removeEventListener(type, handle);
        }
    };

    jQuery.Event = function(src, props) {

        // Allow instantiation without the 'new' keyword
        if (!(this instanceof jQuery.Event)) {
            return new jQuery.Event(src, props);
        }

        // Event object
        if (src && src.type) {
            this.originalEvent = src;
            this.type = src.type;

            // Events bubbling up the document may have been marked as prevented
            // by a handler lower down the tree; reflect the correct value.
            this.isDefaultPrevented = src.defaultPrevented ||
                src.defaultPrevented === undefined &&

                // Support: Android<4.0
                src.returnValue === false ?
                returnTrue :
                returnFalse;

            // Event type
        } else {
            this.type = src;
        }

        // Put explicitly provided properties onto the event object
        if (props) {
            jQuery.extend(this, props);
        }

        // Create a timestamp if incoming event doesn't have one
        this.timeStamp = src && src.timeStamp || jQuery.now();

        // Mark it as fixed
        this[jQuery.expando] = true;
    };

    // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
    // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
    jQuery.Event.prototype = {
        constructor: jQuery.Event,
        isDefaultPrevented: returnFalse,
        isPropagationStopped: returnFalse,
        isImmediatePropagationStopped: returnFalse,
        isSimulated: false,

        preventDefault: function() {
            var e = this.originalEvent;

            this.isDefaultPrevented = returnTrue;

            if (e && !this.isSimulated) {
                e.preventDefault();
            }
        },
        stopPropagation: function() {
            var e = this.originalEvent;

            this.isPropagationStopped = returnTrue;

            if (e && !this.isSimulated) {
                e.stopPropagation();
            }
        },
        stopImmediatePropagation: function() {
            var e = this.originalEvent;

            this.isImmediatePropagationStopped = returnTrue;

            if (e && !this.isSimulated) {
                e.stopImmediatePropagation();
            }

            this.stopPropagation();
        }
    };

    // Create mouseenter/leave events using mouseover/out and event-time checks
    // so that event delegation works in jQuery.
    // Do the same for pointerenter/pointerleave and pointerover/pointerout
    //
    // Support: Safari 7 only
    // Safari sends mouseenter too often; see:
    // https://code.google.com/p/chromium/issues/detail?id=470258
    // for the description of the bug (it existed in older Chrome versions as well).
    jQuery.each({
        mouseenter: "mouseover",
        mouseleave: "mouseout",
        pointerenter: "pointerover",
        pointerleave: "pointerout"
    }, function(orig, fix) {
        jQuery.event.special[orig] = {
            delegateType: fix,
            bindType: fix,

            handle: function(event) {
                var ret,
                    target = this,
                    related = event.relatedTarget,
                    handleObj = event.handleObj;

                // For mouseenter/leave call the handler if related is outside the target.
                // NB: No relatedTarget if the mouse left/entered the browser window
                if (!related || (related !== target && !jQuery.contains(target, related))) {
                    event.type = handleObj.origType;
                    ret = handleObj.handler.apply(this, arguments);
                    event.type = fix;
                }
                return ret;
            }
        };
    });

    jQuery.fn.extend({
        on: function(types, selector, data, fn) {
            return on(this, types, selector, data, fn);
        },
        one: function(types, selector, data, fn) {
            return on(this, types, selector, data, fn, 1);
        },
        off: function(types, selector, fn) {
            var handleObj, type;
            if (types && types.preventDefault && types.handleObj) {

                // ( event )  dispatched jQuery.Event
                handleObj = types.handleObj;
                jQuery(types.delegateTarget).off(
                    handleObj.namespace ?
                    handleObj.origType + "." + handleObj.namespace :
                    handleObj.origType,
                    handleObj.selector,
                    handleObj.handler
                );
                return this;
            }
            if (typeof types === "object") {

                // ( types-object [, selector] )
                for (type in types) {
                    this.off(type, selector, types[type]);
                }
                return this;
            }
            if (selector === false || typeof selector === "function") {

                // ( types [, fn] )
                fn = selector;
                selector = undefined;
            }
            if (fn === false) {
                fn = returnFalse;
            }
            return this.each(function() {
                jQuery.event.remove(this, types, fn, selector);
            });
        }
    });


    var
        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,

        // Support: IE 10-11, Edge 10240+
        // In IE/Edge using regex groups here causes severe slowdowns.
        // See https://connect.microsoft.com/IE/feedback/details/1736512/
        rnoInnerhtml = /<script|<style|<link/i,

        // checked="checked" or checked
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        rscriptTypeMasked = /^true\/(.*)/,
        rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;

    // Manipulating tables requires a tbody
    function manipulationTarget(elem, content) {
        return jQuery.nodeName(elem, "table") &&
            jQuery.nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr") ?

            elem.getElementsByTagName("tbody")[0] ||
            elem.appendChild(elem.ownerDocument.createElement("tbody")) :
            elem;
    }

    // Replace/restore the type attribute of script elements for safe DOM manipulation
    function disableScript(elem) {
        elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
        return elem;
    }

    function restoreScript(elem) {
        var match = rscriptTypeMasked.exec(elem.type);

        if (match) {
            elem.type = match[1];
        } else {
            elem.removeAttribute("type");
        }

        return elem;
    }

    function cloneCopyEvent(src, dest) {
        var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;

        if (dest.nodeType !== 1) {
            return;
        }

        // 1. Copy private data: events, handlers, etc.
        if (dataPriv.hasData(src)) {
            pdataOld = dataPriv.access(src);
            pdataCur = dataPriv.set(dest, pdataOld);
            events = pdataOld.events;

            if (events) {
                delete pdataCur.handle;
                pdataCur.events = {};

                for (type in events) {
                    for (i = 0, l = events[type].length; i < l; i++) {
                        jQuery.event.add(dest, type, events[type][i]);
                    }
                }
            }
        }

        // 2. Copy user data
        if (dataUser.hasData(src)) {
            udataOld = dataUser.access(src);
            udataCur = jQuery.extend({}, udataOld);

            dataUser.set(dest, udataCur);
        }
    }

    // Fix IE bugs, see support tests
    function fixInput(src, dest) {
        var nodeName = dest.nodeName.toLowerCase();

        // Fails to persist the checked state of a cloned checkbox or radio button.
        if (nodeName === "input" && rcheckableType.test(src.type)) {
            dest.checked = src.checked;

            // Fails to return the selected option to the default selected state when cloning options
        } else if (nodeName === "input" || nodeName === "textarea") {
            dest.defaultValue = src.defaultValue;
        }
    }

    function domManip(collection, args, callback, ignored) {

        // Flatten any nested arrays
        args = concat.apply([], args);

        var fragment, first, scripts, hasScripts, node, doc,
            i = 0,
            l = collection.length,
            iNoClone = l - 1,
            value = args[0],
            isFunction = jQuery.isFunction(value);

        // We can't cloneNode fragments that contain checked, in WebKit
        if (isFunction ||
            (l > 1 && typeof value === "string" &&
                !support.checkClone && rchecked.test(value))) {
            return collection.each(function(index) {
                var self = collection.eq(index);
                if (isFunction) {
                    args[0] = value.call(this, index, self.html());
                }
                domManip(self, args, callback, ignored);
            });
        }

        if (l) {
            fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
            first = fragment.firstChild;

            if (fragment.childNodes.length === 1) {
                fragment = first;
            }

            // Require either new content or an interest in ignored elements to invoke the callback
            if (first || ignored) {
                scripts = jQuery.map(getAll(fragment, "script"), disableScript);
                hasScripts = scripts.length;

                // Use the original fragment for the last item
                // instead of the first because it can end up
                // being emptied incorrectly in certain situations (#8070).
                for (; i < l; i++) {
                    node = fragment;

                    if (i !== iNoClone) {
                        node = jQuery.clone(node, true, true);

                        // Keep references to cloned scripts for later restoration
                        if (hasScripts) {

                            // Support: Android<4.1, PhantomJS<2
                            // push.apply(_, arraylike) throws on ancient WebKit
                            jQuery.merge(scripts, getAll(node, "script"));
                        }
                    }

                    callback.call(collection[i], node, i);
                }

                if (hasScripts) {
                    doc = scripts[scripts.length - 1].ownerDocument;

                    // Reenable scripts
                    jQuery.map(scripts, restoreScript);

                    // Evaluate executable scripts on first document insertion
                    for (i = 0; i < hasScripts; i++) {
                        node = scripts[i];
                        if (rscriptType.test(node.type || "") &&
                            !dataPriv.access(node, "globalEval") &&
                            jQuery.contains(doc, node)) {

                            if (node.src) {

                                // Optional AJAX dependency, but won't run scripts if not present
                                if (jQuery._evalUrl) {
                                    jQuery._evalUrl(node.src);
                                }
                            } else {
                                jQuery.globalEval(node.textContent.replace(rcleanScript, ""));
                            }
                        }
                    }
                }
            }
        }

        return collection;
    }

    function remove(elem, selector, keepData) {
        var node,
            nodes = selector ? jQuery.filter(selector, elem) : elem,
            i = 0;

        for (;
            (node = nodes[i]) != null; i++) {
            if (!keepData && node.nodeType === 1) {
                jQuery.cleanData(getAll(node));
            }

            if (node.parentNode) {
                if (keepData && jQuery.contains(node.ownerDocument, node)) {
                    setGlobalEval(getAll(node, "script"));
                }
                node.parentNode.removeChild(node);
            }
        }

        return elem;
    }

    jQuery.extend({
        htmlPrefilter: function(html) {
            return html.replace(rxhtmlTag, "<$1></$2>");
        },

        clone: function(elem, dataAndEvents, deepDataAndEvents) {
            var i, l, srcElements, destElements,
                clone = elem.cloneNode(true),
                inPage = jQuery.contains(elem.ownerDocument, elem);

            // Fix IE cloning issues
            if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) &&
                !jQuery.isXMLDoc(elem)) {

                // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
                destElements = getAll(clone);
                srcElements = getAll(elem);

                for (i = 0, l = srcElements.length; i < l; i++) {
                    fixInput(srcElements[i], destElements[i]);
                }
            }

            // Copy the events from the original to the clone
            if (dataAndEvents) {
                if (deepDataAndEvents) {
                    srcElements = srcElements || getAll(elem);
                    destElements = destElements || getAll(clone);

                    for (i = 0, l = srcElements.length; i < l; i++) {
                        cloneCopyEvent(srcElements[i], destElements[i]);
                    }
                } else {
                    cloneCopyEvent(elem, clone);
                }
            }

            // Preserve script evaluation history
            destElements = getAll(clone, "script");
            if (destElements.length > 0) {
                setGlobalEval(destElements, !inPage && getAll(elem, "script"));
            }

            // Return the cloned set
            return clone;
        },

        cleanData: function(elems) {
            var data, elem, type,
                special = jQuery.event.special,
                i = 0;

            for (;
                (elem = elems[i]) !== undefined; i++) {
                if (acceptData(elem)) {
                    if ((data = elem[dataPriv.expando])) {
                        if (data.events) {
                            for (type in data.events) {
                                if (special[type]) {
                                    jQuery.event.remove(elem, type);

                                    // This is a shortcut to avoid jQuery.event.remove's overhead
                                } else {
                                    jQuery.removeEvent(elem, type, data.handle);
                                }
                            }
                        }

                        // Support: Chrome <= 35-45+
                        // Assign undefined instead of using delete, see Data#remove
                        elem[dataPriv.expando] = undefined;
                    }
                    if (elem[dataUser.expando]) {

                        // Support: Chrome <= 35-45+
                        // Assign undefined instead of using delete, see Data#remove
                        elem[dataUser.expando] = undefined;
                    }
                }
            }
        }
    });

    jQuery.fn.extend({

        // Keep domManip exposed until 3.0 (gh-2225)
        domManip: domManip,

        detach: function(selector) {
            return remove(this, selector, true);
        },

        remove: function(selector) {
            return remove(this, selector);
        },

        text: function(value) {
            return access(this, function(value) {
                return value === undefined ?
                    jQuery.text(this) :
                    this.empty().each(function() {
                        if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
                            this.textContent = value;
                        }
                    });
            }, null, value, arguments.length);
        },

        append: function() {
            return domManip(this, arguments, function(elem) {
                if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
                    var target = manipulationTarget(this, elem);
                    target.appendChild(elem);
                }
            });
        },

        prepend: function() {
            return domManip(this, arguments, function(elem) {
                if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
                    var target = manipulationTarget(this, elem);
                    target.insertBefore(elem, target.firstChild);
                }
            });
        },

        before: function() {
            return domManip(this, arguments, function(elem) {
                if (this.parentNode) {
                    this.parentNode.insertBefore(elem, this);
                }
            });
        },

        after: function() {
            return domManip(this, arguments, function(elem) {
                if (this.parentNode) {
                    this.parentNode.insertBefore(elem, this.nextSibling);
                }
            });
        },

        empty: function() {
            var elem,
                i = 0;

            for (;
                (elem = this[i]) != null; i++) {
                if (elem.nodeType === 1) {

                    // Prevent memory leaks
                    jQuery.cleanData(getAll(elem, false));

                    // Remove any remaining nodes
                    elem.textContent = "";
                }
            }

            return this;
        },

        clone: function(dataAndEvents, deepDataAndEvents) {
            dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
            deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;

            return this.map(function() {
                return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
            });
        },

        html: function(value) {
            return access(this, function(value) {
                var elem = this[0] || {},
                    i = 0,
                    l = this.length;

                if (value === undefined && elem.nodeType === 1) {
                    return elem.innerHTML;
                }

                // See if we can take a shortcut and just use innerHTML
                if (typeof value === "string" && !rnoInnerhtml.test(value) &&
                    !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {

                    value = jQuery.htmlPrefilter(value);

                    try {
                        for (; i < l; i++) {
                            elem = this[i] || {};

                            // Remove element nodes and prevent memory leaks
                            if (elem.nodeType === 1) {
                                jQuery.cleanData(getAll(elem, false));
                                elem.innerHTML = value;
                            }
                        }

                        elem = 0;

                        // If using innerHTML throws an exception, use the fallback method
                    } catch (e) {}
                }

                if (elem) {
                    this.empty().append(value);
                }
            }, null, value, arguments.length);
        },

        replaceWith: function() {
            var ignored = [];

            // Make the changes, replacing each non-ignored context element with the new content
            return domManip(this, arguments, function(elem) {
                var parent = this.parentNode;

                if (jQuery.inArray(this, ignored) < 0) {
                    jQuery.cleanData(getAll(this));
                    if (parent) {
                        parent.replaceChild(elem, this);
                    }
                }

                // Force callback invocation
            }, ignored);
        }
    });

    jQuery.each({
        appendTo: "append",
        prependTo: "prepend",
        insertBefore: "before",
        insertAfter: "after",
        replaceAll: "replaceWith"
    }, function(name, original) {
        jQuery.fn[name] = function(selector) {
            var elems,
                ret = [],
                insert = jQuery(selector),
                last = insert.length - 1,
                i = 0;

            for (; i <= last; i++) {
                elems = i === last ? this : this.clone(true);
                jQuery(insert[i])[original](elems);

                // Support: QtWebKit
                // .get() because push.apply(_, arraylike) throws
                push.apply(ret, elems.get());
            }

            return this.pushStack(ret);
        };
    });


    var iframe,
        elemdisplay = {

            // Support: Firefox
            // We have to pre-define these values for FF (#10227)
            HTML: "block",
            BODY: "block"
        };

    /**
     * Retrieve the actual display of a element
     * @param {String} name nodeName of the element
     * @param {Object} doc Document object
     */

    // Called only from within defaultDisplay
    function actualDisplay(name, doc) {
        var elem = jQuery(doc.createElement(name)).appendTo(doc.body),

            display = jQuery.css(elem[0], "display");

        // We don't have any data stored on the element,
        // so use "detach" method as fast way to get rid of the element
        elem.detach();

        return display;
    }

    /**
     * Try to determine the default display value of an element
     * @param {String} nodeName
     */
    function defaultDisplay(nodeName) {
        var doc = document,
            display = elemdisplay[nodeName];

        if (!display) {
            display = actualDisplay(nodeName, doc);

            // If the simple way fails, read from inside an iframe
            if (display === "none" || !display) {

                // Use the already-created iframe if possible
                iframe = (iframe || jQuery("<iframe frameborder='0' width='0' height='0'/>"))
                    .appendTo(doc.documentElement);

                // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
                doc = iframe[0].contentDocument;

                // Support: IE
                doc.write();
                doc.close();

                display = actualDisplay(nodeName, doc);
                iframe.detach();
            }

            // Store the correct default display
            elemdisplay[nodeName] = display;
        }

        return display;
    }
    var rmargin = (/^margin/);

    var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");

    var getStyles = function(elem) {

        // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
        // IE throws on elements created in popups
        // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
        var view = elem.ownerDocument.defaultView;

        if (!view || !view.opener) {
            view = window;
        }

        return view.getComputedStyle(elem);
    };

    var swap = function(elem, options, callback, args) {
        var ret, name,
            old = {};

        // Remember the old values, and insert the new ones
        for (name in options) {
            old[name] = elem.style[name];
            elem.style[name] = options[name];
        }

        ret = callback.apply(elem, args || []);

        // Revert the old values
        for (name in options) {
            elem.style[name] = old[name];
        }

        return ret;
    };


    var documentElement = document.documentElement;



    (function() {
        var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
            container = document.createElement("div"),
            div = document.createElement("div");

        // Finish early in limited (non-browser) environments
        if (!div.style) {
            return;
        }

        // Support: IE9-11+
        // Style of cloned element affects source element cloned (#8908)
        div.style.backgroundClip = "content-box";
        div.cloneNode(true).style.backgroundClip = "";
        support.clearCloneStyle = div.style.backgroundClip === "content-box";

        container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
            "padding:0;margin-top:1px;position:absolute";
        container.appendChild(div);

        // Executing both pixelPosition & boxSizingReliable tests require only one layout
        // so they're executed at the same time to save the second computation.
        function computeStyleTests() {
            div.style.cssText =

                // Support: Firefox<29, Android 2.3
                // Vendor-prefix box-sizing
                "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;" +
                "position:relative;display:block;" +
                "margin:auto;border:1px;padding:1px;" +
                "top:1%;width:50%";
            div.innerHTML = "";
            documentElement.appendChild(container);

            var divStyle = window.getComputedStyle(div);
            pixelPositionVal = divStyle.top !== "1%";
            reliableMarginLeftVal = divStyle.marginLeft === "2px";
            boxSizingReliableVal = divStyle.width === "4px";

            // Support: Android 4.0 - 4.3 only
            // Some styles come back with percentage values, even though they shouldn't
            div.style.marginRight = "50%";
            pixelMarginRightVal = divStyle.marginRight === "4px";

            documentElement.removeChild(container);
        }

        jQuery.extend(support, {
            pixelPosition: function() {

                // This test is executed only once but we still do memoizing
                // since we can use the boxSizingReliable pre-computing.
                // No need to check if the test was already performed, though.
                computeStyleTests();
                return pixelPositionVal;
            },
            boxSizingReliable: function() {
                if (boxSizingReliableVal == null) {
                    computeStyleTests();
                }
                return boxSizingReliableVal;
            },
            pixelMarginRight: function() {

                // Support: Android 4.0-4.3
                // We're checking for boxSizingReliableVal here instead of pixelMarginRightVal
                // since that compresses better and they're computed together anyway.
                if (boxSizingReliableVal == null) {
                    computeStyleTests();
                }
                return pixelMarginRightVal;
            },
            reliableMarginLeft: function() {

                // Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
                if (boxSizingReliableVal == null) {
                    computeStyleTests();
                }
                return reliableMarginLeftVal;
            },
            reliableMarginRight: function() {

                // Support: Android 2.3
                // Check if div with explicit width and no margin-right incorrectly
                // gets computed margin-right based on width of container. (#3333)
                // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
                // This support function is only executed once so no memoizing is needed.
                var ret,
                    marginDiv = div.appendChild(document.createElement("div"));

                // Reset CSS: box-sizing; display; margin; border; padding
                marginDiv.style.cssText = div.style.cssText =

                    // Support: Android 2.3
                    // Vendor-prefix box-sizing
                    "-webkit-box-sizing:content-box;box-sizing:content-box;" +
                    "display:block;margin:0;border:0;padding:0";
                marginDiv.style.marginRight = marginDiv.style.width = "0";
                div.style.width = "1px";
                documentElement.appendChild(container);

                ret = !parseFloat(window.getComputedStyle(marginDiv).marginRight);

                documentElement.removeChild(container);
                div.removeChild(marginDiv);

                return ret;
            }
        });
    })();


    function curCSS(elem, name, computed) {
        var width, minWidth, maxWidth, ret,
            style = elem.style;

        computed = computed || getStyles(elem);
        ret = computed ? computed.getPropertyValue(name) || computed[name] : undefined;

        // Support: Opera 12.1x only
        // Fall back to style even without computed
        // computed is undefined for elems on document fragments
        if ((ret === "" || ret === undefined) && !jQuery.contains(elem.ownerDocument, elem)) {
            ret = jQuery.style(elem, name);
        }

        // Support: IE9
        // getPropertyValue is only needed for .css('filter') (#12537)
        if (computed) {

            // A tribute to the "awesome hack by Dean Edwards"
            // Android Browser returns percentage for some values,
            // but width seems to be reliably pixels.
            // This is against the CSSOM draft spec:
            // http://dev.w3.org/csswg/cssom/#resolved-values
            if (!support.pixelMarginRight() && rnumnonpx.test(ret) && rmargin.test(name)) {

                // Remember the original values
                width = style.width;
                minWidth = style.minWidth;
                maxWidth = style.maxWidth;

                // Put in the new values to get a computed value out
                style.minWidth = style.maxWidth = style.width = ret;
                ret = computed.width;

                // Revert the changed values
                style.width = width;
                style.minWidth = minWidth;
                style.maxWidth = maxWidth;
            }
        }

        return ret !== undefined ?

            // Support: IE9-11+
            // IE returns zIndex value as an integer.
            ret + "" :
            ret;
    }


    function addGetHookIf(conditionFn, hookFn) {

        // Define the hook, we'll check on the first run if it's really needed.
        return {
            get: function() {
                if (conditionFn()) {

                    // Hook not needed (or it's not possible to use it due
                    // to missing dependency), remove it.
                    delete this.get;
                    return;
                }

                // Hook needed; redefine it so that the support test is not executed again.
                return (this.get = hookFn).apply(this, arguments);
            }
        };
    }


    var

    // Swappable if display is none or starts with table
    // except "table", "table-cell", or "table-caption"
    // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
        rdisplayswap = /^(none|table(?!-c[ea]).+)/,

        cssShow = {
            position: "absolute",
            visibility: "hidden",
            display: "block"
        },
        cssNormalTransform = {
            letterSpacing: "0",
            fontWeight: "400"
        },

        cssPrefixes = ["Webkit", "O", "Moz", "ms"],
        emptyStyle = document.createElement("div").style;

    // Return a css property mapped to a potentially vendor prefixed property
    function vendorPropName(name) {

        // Shortcut for names that are not vendor prefixed
        if (name in emptyStyle) {
            return name;
        }

        // Check for vendor prefixed names
        var capName = name[0].toUpperCase() + name.slice(1),
            i = cssPrefixes.length;

        while (i--) {
            name = cssPrefixes[i] + capName;
            if (name in emptyStyle) {
                return name;
            }
        }
    }

    function setPositiveNumber(elem, value, subtract) {

        // Any relative (+/-) values have already been
        // normalized at this point
        var matches = rcssNum.exec(value);
        return matches ?

            // Guard against undefined "subtract", e.g., when used as in cssHooks
            Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") :
            value;
    }

    function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) {
        var i = extra === (isBorderBox ? "border" : "content") ?

            // If we already have the right measurement, avoid augmentation
            4 :

            // Otherwise initialize for horizontal or vertical properties
            name === "width" ? 1 : 0,

            val = 0;

        for (; i < 4; i += 2) {

            // Both box models exclude margin, so add it if we want it
            if (extra === "margin") {
                val += jQuery.css(elem, extra + cssExpand[i], true, styles);
            }

            if (isBorderBox) {

                // border-box includes padding, so remove it if we want content
                if (extra === "content") {
                    val -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
                }

                // At this point, extra isn't border nor margin, so remove border
                if (extra !== "margin") {
                    val -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
                }
            } else {

                // At this point, extra isn't content, so add padding
                val += jQuery.css(elem, "padding" + cssExpand[i], true, styles);

                // At this point, extra isn't content nor padding, so add border
                if (extra !== "padding") {
                    val += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
                }
            }
        }

        return val;
    }

    function getWidthOrHeight(elem, name, extra) {

        // Start with offset property, which is equivalent to the border-box value
        var valueIsBorderBox = true,
            val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
            styles = getStyles(elem),
            isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box";

        // Some non-html elements return undefined for offsetWidth, so check for null/undefined
        // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
        // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
        if (val <= 0 || val == null) {

            // Fall back to computed then uncomputed css if necessary
            val = curCSS(elem, name, styles);
            if (val < 0 || val == null) {
                val = elem.style[name];
            }

            // Computed unit is not pixels. Stop here and return.
            if (rnumnonpx.test(val)) {
                return val;
            }

            // Check for style in case a browser which returns unreliable values
            // for getComputedStyle silently falls back to the reliable elem.style
            valueIsBorderBox = isBorderBox &&
                (support.boxSizingReliable() || val === elem.style[name]);

            // Normalize "", auto, and prepare for extra
            val = parseFloat(val) || 0;
        }

        // Use the active box-sizing model to add/subtract irrelevant styles
        return (val +
            augmentWidthOrHeight(
                elem,
                name,
                extra || (isBorderBox ? "border" : "content"),
                valueIsBorderBox,
                styles
            )
        ) + "px";
    }

    function showHide(elements, show) {
        var display, elem, hidden,
            values = [],
            index = 0,
            length = elements.length;

        for (; index < length; index++) {
            elem = elements[index];
            if (!elem.style) {
                continue;
            }

            values[index] = dataPriv.get(elem, "olddisplay");
            display = elem.style.display;
            if (show) {

                // Reset the inline display of this element to learn if it is
                // being hidden by cascaded rules or not
                if (!values[index] && display === "none") {
                    elem.style.display = "";
                }

                // Set elements which have been overridden with display: none
                // in a stylesheet to whatever the default browser style is
                // for such an element
                if (elem.style.display === "" && isHidden(elem)) {
                    values[index] = dataPriv.access(
                        elem,
                        "olddisplay",
                        defaultDisplay(elem.nodeName)
                    );
                }
            } else {
                hidden = isHidden(elem);

                if (display !== "none" || !hidden) {
                    dataPriv.set(
                        elem,
                        "olddisplay",
                        hidden ? display : jQuery.css(elem, "display")
                    );
                }
            }
        }

        // Set the display of most of the elements in a second loop
        // to avoid the constant reflow
        for (index = 0; index < length; index++) {
            elem = elements[index];
            if (!elem.style) {
                continue;
            }
            if (!show || elem.style.display === "none" || elem.style.display === "") {
                elem.style.display = show ? values[index] || "" : "none";
            }
        }

        return elements;
    }

    jQuery.extend({

        // Add in style property hooks for overriding the default
        // behavior of getting and setting a style property
        cssHooks: {
            opacity: {
                get: function(elem, computed) {
                    if (computed) {

                        // We should always get a number back from opacity
                        var ret = curCSS(elem, "opacity");
                        return ret === "" ? "1" : ret;
                    }
                }
            }
        },

        // Don't automatically add "px" to these possibly-unitless properties
        cssNumber: {
            "animationIterationCount": true,
            "columnCount": true,
            "fillOpacity": true,
            "flexGrow": true,
            "flexShrink": true,
            "fontWeight": true,
            "lineHeight": true,
            "opacity": true,
            "order": true,
            "orphans": true,
            "widows": true,
            "zIndex": true,
            "zoom": true
        },

        // Add in properties whose names you wish to fix before
        // setting or getting the value
        cssProps: {
            "float": "cssFloat"
        },

        // Get and set the style property on a DOM Node
        style: function(elem, name, value, extra) {

            // Don't set styles on text and comment nodes
            if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
                return;
            }

            // Make sure that we're working with the right name
            var ret, type, hooks,
                origName = jQuery.camelCase(name),
                style = elem.style;

            name = jQuery.cssProps[origName] ||
                (jQuery.cssProps[origName] = vendorPropName(origName) || origName);

            // Gets hook for the prefixed version, then unprefixed version
            hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];

            // Check if we're setting a value
            if (value !== undefined) {
                type = typeof value;

                // Convert "+=" or "-=" to relative numbers (#7345)
                if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
                    value = adjustCSS(elem, name, ret);

                    // Fixes bug #9237
                    type = "number";
                }

                // Make sure that null and NaN values aren't set (#7116)
                if (value == null || value !== value) {
                    return;
                }

                // If a number was passed in, add the unit (except for certain CSS properties)
                if (type === "number") {
                    value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
                }

                // Support: IE9-11+
                // background-* props affect original clone's values
                if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
                    style[name] = "inherit";
                }

                // If a hook was provided, use that value, otherwise just set the specified value
                if (!hooks || !("set" in hooks) ||
                    (value = hooks.set(elem, value, extra)) !== undefined) {

                    style[name] = value;
                }

            } else {

                // If a hook was provided get the non-computed value from there
                if (hooks && "get" in hooks &&
                    (ret = hooks.get(elem, false, extra)) !== undefined) {

                    return ret;
                }

                // Otherwise just get the value from the style object
                return style[name];
            }
        },

        css: function(elem, name, extra, styles) {
            var val, num, hooks,
                origName = jQuery.camelCase(name);

            // Make sure that we're working with the right name
            name = jQuery.cssProps[origName] ||
                (jQuery.cssProps[origName] = vendorPropName(origName) || origName);

            // Try prefixed name followed by the unprefixed name
            hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];

            // If a hook was provided get the computed value from there
            if (hooks && "get" in hooks) {
                val = hooks.get(elem, true, extra);
            }

            // Otherwise, if a way to get the computed value exists, use that
            if (val === undefined) {
                val = curCSS(elem, name, styles);
            }

            // Convert "normal" to computed value
            if (val === "normal" && name in cssNormalTransform) {
                val = cssNormalTransform[name];
            }

            // Make numeric if forced or a qualifier was provided and val looks numeric
            if (extra === "" || extra) {
                num = parseFloat(val);
                return extra === true || isFinite(num) ? num || 0 : val;
            }
            return val;
        }
    });

    jQuery.each(["height", "width"], function(i, name) {
        jQuery.cssHooks[name] = {
            get: function(elem, computed, extra) {
                if (computed) {

                    // Certain elements can have dimension info if we invisibly show them
                    // but it must have a current display style that would benefit
                    return rdisplayswap.test(jQuery.css(elem, "display")) &&
                        elem.offsetWidth === 0 ?
                        swap(elem, cssShow, function() {
                            return getWidthOrHeight(elem, name, extra);
                        }) :
                        getWidthOrHeight(elem, name, extra);
                }
            },

            set: function(elem, value, extra) {
                var matches,
                    styles = extra && getStyles(elem),
                    subtract = extra && augmentWidthOrHeight(
                        elem,
                        name,
                        extra,
                        jQuery.css(elem, "boxSizing", false, styles) === "border-box",
                        styles
                    );

                // Convert to pixels if value adjustment is needed
                if (subtract && (matches = rcssNum.exec(value)) &&
                    (matches[3] || "px") !== "px") {

                    elem.style[name] = value;
                    value = jQuery.css(elem, name);
                }

                return setPositiveNumber(elem, value, subtract);
            }
        };
    });

    jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft,
        function(elem, computed) {
            if (computed) {
                return (parseFloat(curCSS(elem, "marginLeft")) ||
                    elem.getBoundingClientRect().left -
                    swap(elem, {
                        marginLeft: 0
                    }, function() {
                        return elem.getBoundingClientRect().left;
                    })
                ) + "px";
            }
        }
    );

    // Support: Android 2.3
    jQuery.cssHooks.marginRight = addGetHookIf(support.reliableMarginRight,
        function(elem, computed) {
            if (computed) {
                return swap(elem, {
                        "display": "inline-block"
                    },
                    curCSS, [elem, "marginRight"]);
            }
        }
    );

    // These hooks are used by animate to expand properties
    jQuery.each({
        margin: "",
        padding: "",
        border: "Width"
    }, function(prefix, suffix) {
        jQuery.cssHooks[prefix + suffix] = {
            expand: function(value) {
                var i = 0,
                    expanded = {},

                    // Assumes a single number if not a string
                    parts = typeof value === "string" ? value.split(" ") : [value];

                for (; i < 4; i++) {
                    expanded[prefix + cssExpand[i] + suffix] =
                        parts[i] || parts[i - 2] || parts[0];
                }

                return expanded;
            }
        };

        if (!rmargin.test(prefix)) {
            jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
        }
    });

    jQuery.fn.extend({
        css: function(name, value) {
            return access(this, function(elem, name, value) {
                var styles, len,
                    map = {},
                    i = 0;

                if (jQuery.isArray(name)) {
                    styles = getStyles(elem);
                    len = name.length;

                    for (; i < len; i++) {
                        map[name[i]] = jQuery.css(elem, name[i], false, styles);
                    }

                    return map;
                }

                return value !== undefined ?
                    jQuery.style(elem, name, value) :
                    jQuery.css(elem, name);
            }, name, value, arguments.length > 1);
        },
        show: function() {
            return showHide(this, true);
        },
        hide: function() {
            return showHide(this);
        },
        toggle: function(state) {
            if (typeof state === "boolean") {
                return state ? this.show() : this.hide();
            }

            return this.each(function() {
                if (isHidden(this)) {
                    jQuery(this).show();
                } else {
                    jQuery(this).hide();
                }
            });
        }
    });


    function Tween(elem, options, prop, end, easing) {
        return new Tween.prototype.init(elem, options, prop, end, easing);
    }
    jQuery.Tween = Tween;

    Tween.prototype = {
        constructor: Tween,
        init: function(elem, options, prop, end, easing, unit) {
            this.elem = elem;
            this.prop = prop;
            this.easing = easing || jQuery.easing._default;
            this.options = options;
            this.start = this.now = this.cur();
            this.end = end;
            this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
        },
        cur: function() {
            var hooks = Tween.propHooks[this.prop];

            return hooks && hooks.get ?
                hooks.get(this) :
                Tween.propHooks._default.get(this);
        },
        run: function(percent) {
            var eased,
                hooks = Tween.propHooks[this.prop];

            if (this.options.duration) {
                this.pos = eased = jQuery.easing[this.easing](
                    percent, this.options.duration * percent, 0, 1, this.options.duration
                );
            } else {
                this.pos = eased = percent;
            }
            this.now = (this.end - this.start) * eased + this.start;

            if (this.options.step) {
                this.options.step.call(this.elem, this.now, this);
            }

            if (hooks && hooks.set) {
                hooks.set(this);
            } else {
                Tween.propHooks._default.set(this);
            }
            return this;
        }
    };

    Tween.prototype.init.prototype = Tween.prototype;

    Tween.propHooks = {
        _default: {
            get: function(tween) {
                var result;

                // Use a property on the element directly when it is not a DOM element,
                // or when there is no matching style property that exists.
                if (tween.elem.nodeType !== 1 ||
                    tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
                    return tween.elem[tween.prop];
                }

                // Passing an empty string as a 3rd parameter to .css will automatically
                // attempt a parseFloat and fallback to a string if the parse fails.
                // Simple values such as "10px" are parsed to Float;
                // complex values such as "rotate(1rad)" are returned as-is.
                result = jQuery.css(tween.elem, tween.prop, "");

                // Empty strings, null, undefined and "auto" are converted to 0.
                return !result || result === "auto" ? 0 : result;
            },
            set: function(tween) {

                // Use step hook for back compat.
                // Use cssHook if its there.
                // Use .style if available and use plain properties where available.
                if (jQuery.fx.step[tween.prop]) {
                    jQuery.fx.step[tween.prop](tween);
                } else if (tween.elem.nodeType === 1 &&
                    (tween.elem.style[jQuery.cssProps[tween.prop]] != null ||
                        jQuery.cssHooks[tween.prop])) {
                    jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
                } else {
                    tween.elem[tween.prop] = tween.now;
                }
            }
        }
    };

    // Support: IE9
    // Panic based approach to setting things on disconnected nodes
    Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
        set: function(tween) {
            if (tween.elem.nodeType && tween.elem.parentNode) {
                tween.elem[tween.prop] = tween.now;
            }
        }
    };

    jQuery.easing = {
        linear: function(p) {
            return p;
        },
        swing: function(p) {
            return 0.5 - Math.cos(p * Math.PI) / 2;
        },
        _default: "swing"
    };

    jQuery.fx = Tween.prototype.init;

    // Back Compat <1.8 extension point
    jQuery.fx.step = {};




    var
        fxNow, timerId,
        rfxtypes = /^(?:toggle|show|hide)$/,
        rrun = /queueHooks$/;

    // Animations created synchronously will run synchronously
    function createFxNow() {
        window.setTimeout(function() {
            fxNow = undefined;
        });
        return (fxNow = jQuery.now());
    }

    // Generate parameters to create a standard animation
    function genFx(type, includeWidth) {
        var which,
            i = 0,
            attrs = {
                height: type
            };

        // If we include width, step value is 1 to do all cssExpand values,
        // otherwise step value is 2 to skip over Left and Right
        includeWidth = includeWidth ? 1 : 0;
        for (; i < 4; i += 2 - includeWidth) {
            which = cssExpand[i];
            attrs["margin" + which] = attrs["padding" + which] = type;
        }

        if (includeWidth) {
            attrs.opacity = attrs.width = type;
        }

        return attrs;
    }

    function createTween(value, prop, animation) {
        var tween,
            collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]),
            index = 0,
            length = collection.length;
        for (; index < length; index++) {
            if ((tween = collection[index].call(animation, prop, value))) {

                // We're done with this property
                return tween;
            }
        }
    }

    function defaultPrefilter(elem, props, opts) {
        /* jshint validthis: true */
        var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
            anim = this,
            orig = {},
            style = elem.style,
            hidden = elem.nodeType && isHidden(elem),
            dataShow = dataPriv.get(elem, "fxshow");

        // Handle queue: false promises
        if (!opts.queue) {
            hooks = jQuery._queueHooks(elem, "fx");
            if (hooks.unqueued == null) {
                hooks.unqueued = 0;
                oldfire = hooks.empty.fire;
                hooks.empty.fire = function() {
                    if (!hooks.unqueued) {
                        oldfire();
                    }
                };
            }
            hooks.unqueued++;

            anim.always(function() {

                // Ensure the complete handler is called before this completes
                anim.always(function() {
                    hooks.unqueued--;
                    if (!jQuery.queue(elem, "fx").length) {
                        hooks.empty.fire();
                    }
                });
            });
        }

        // Height/width overflow pass
        if (elem.nodeType === 1 && ("height" in props || "width" in props)) {

            // Make sure that nothing sneaks out
            // Record all 3 overflow attributes because IE9-10 do not
            // change the overflow attribute when overflowX and
            // overflowY are set to the same value
            opts.overflow = [style.overflow, style.overflowX, style.overflowY];

            // Set display property to inline-block for height/width
            // animations on inline elements that are having width/height animated
            display = jQuery.css(elem, "display");

            // Test default display if display is currently "none"
            checkDisplay = display === "none" ?
                dataPriv.get(elem, "olddisplay") || defaultDisplay(elem.nodeName) : display;

            if (checkDisplay === "inline" && jQuery.css(elem, "float") === "none") {
                style.display = "inline-block";
            }
        }

        if (opts.overflow) {
            style.overflow = "hidden";
            anim.always(function() {
                style.overflow = opts.overflow[0];
                style.overflowX = opts.overflow[1];
                style.overflowY = opts.overflow[2];
            });
        }

        // show/hide pass
        for (prop in props) {
            value = props[prop];
            if (rfxtypes.exec(value)) {
                delete props[prop];
                toggle = toggle || value === "toggle";
                if (value === (hidden ? "hide" : "show")) {

                    // If there is dataShow left over from a stopped hide or show
                    // and we are going to proceed with show, we should pretend to be hidden
                    if (value === "show" && dataShow && dataShow[prop] !== undefined) {
                        hidden = true;
                    } else {
                        continue;
                    }
                }
                orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);

                // Any non-fx value stops us from restoring the original display value
            } else {
                display = undefined;
            }
        }

        if (!jQuery.isEmptyObject(orig)) {
            if (dataShow) {
                if ("hidden" in dataShow) {
                    hidden = dataShow.hidden;
                }
            } else {
                dataShow = dataPriv.access(elem, "fxshow", {});
            }

            // Store state if its toggle - enables .stop().toggle() to "reverse"
            if (toggle) {
                dataShow.hidden = !hidden;
            }
            if (hidden) {
                jQuery(elem).show();
            } else {
                anim.done(function() {
                    jQuery(elem).hide();
                });
            }
            anim.done(function() {
                var prop;

                dataPriv.remove(elem, "fxshow");
                for (prop in orig) {
                    jQuery.style(elem, prop, orig[prop]);
                }
            });
            for (prop in orig) {
                tween = createTween(hidden ? dataShow[prop] : 0, prop, anim);

                if (!(prop in dataShow)) {
                    dataShow[prop] = tween.start;
                    if (hidden) {
                        tween.end = tween.start;
                        tween.start = prop === "width" || prop === "height" ? 1 : 0;
                    }
                }
            }

            // If this is a noop like .hide().hide(), restore an overwritten display value
        } else if ((display === "none" ? defaultDisplay(elem.nodeName) : display) === "inline") {
            style.display = display;
        }
    }

    function propFilter(props, specialEasing) {
        var index, name, easing, value, hooks;

        // camelCase, specialEasing and expand cssHook pass
        for (index in props) {
            name = jQuery.camelCase(index);
            easing = specialEasing[name];
            value = props[index];
            if (jQuery.isArray(value)) {
                easing = value[1];
                value = props[index] = value[0];
            }

            if (index !== name) {
                props[name] = value;
                delete props[index];
            }

            hooks = jQuery.cssHooks[name];
            if (hooks && "expand" in hooks) {
                value = hooks.expand(value);
                delete props[name];

                // Not quite $.extend, this won't overwrite existing keys.
                // Reusing 'index' because we have the correct "name"
                for (index in value) {
                    if (!(index in props)) {
                        props[index] = value[index];
                        specialEasing[index] = easing;
                    }
                }
            } else {
                specialEasing[name] = easing;
            }
        }
    }

    function Animation(elem, properties, options) {
        var result,
            stopped,
            index = 0,
            length = Animation.prefilters.length,
            deferred = jQuery.Deferred().always(function() {

                // Don't match elem in the :animated selector
                delete tick.elem;
            }),
            tick = function() {
                if (stopped) {
                    return false;
                }
                var currentTime = fxNow || createFxNow(),
                    remaining = Math.max(0, animation.startTime + animation.duration - currentTime),

                    // Support: Android 2.3
                    // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
                    temp = remaining / animation.duration || 0,
                    percent = 1 - temp,
                    index = 0,
                    length = animation.tweens.length;

                for (; index < length; index++) {
                    animation.tweens[index].run(percent);
                }

                deferred.notifyWith(elem, [animation, percent, remaining]);

                if (percent < 1 && length) {
                    return remaining;
                } else {
                    deferred.resolveWith(elem, [animation]);
                    return false;
                }
            },
            animation = deferred.promise({
                elem: elem,
                props: jQuery.extend({}, properties),
                opts: jQuery.extend(true, {
                    specialEasing: {},
                    easing: jQuery.easing._default
                }, options),
                originalProperties: properties,
                originalOptions: options,
                startTime: fxNow || createFxNow(),
                duration: options.duration,
                tweens: [],
                createTween: function(prop, end) {
                    var tween = jQuery.Tween(elem, animation.opts, prop, end,
                        animation.opts.specialEasing[prop] || animation.opts.easing);
                    animation.tweens.push(tween);
                    return tween;
                },
                stop: function(gotoEnd) {
                    var index = 0,

                        // If we are going to the end, we want to run all the tweens
                        // otherwise we skip this part
                        length = gotoEnd ? animation.tweens.length : 0;
                    if (stopped) {
                        return this;
                    }
                    stopped = true;
                    for (; index < length; index++) {
                        animation.tweens[index].run(1);
                    }

                    // Resolve when we played the last frame; otherwise, reject
                    if (gotoEnd) {
                        deferred.notifyWith(elem, [animation, 1, 0]);
                        deferred.resolveWith(elem, [animation, gotoEnd]);
                    } else {
                        deferred.rejectWith(elem, [animation, gotoEnd]);
                    }
                    return this;
                }
            }),
            props = animation.props;

        propFilter(props, animation.opts.specialEasing);

        for (; index < length; index++) {
            result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
            if (result) {
                if (jQuery.isFunction(result.stop)) {
                    jQuery._queueHooks(animation.elem, animation.opts.queue).stop =
                        jQuery.proxy(result.stop, result);
                }
                return result;
            }
        }

        jQuery.map(props, createTween, animation);

        if (jQuery.isFunction(animation.opts.start)) {
            animation.opts.start.call(elem, animation);
        }

        jQuery.fx.timer(
            jQuery.extend(tick, {
                elem: elem,
                anim: animation,
                queue: animation.opts.queue
            })
        );

        // attach callbacks from options
        return animation.progress(animation.opts.progress)
            .done(animation.opts.done, animation.opts.complete)
            .fail(animation.opts.fail)
            .always(animation.opts.always);
    }

    jQuery.Animation = jQuery.extend(Animation, {
        tweeners: {
            "*": [function(prop, value) {
                var tween = this.createTween(prop, value);
                adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
                return tween;
            }]
        },

        tweener: function(props, callback) {
            if (jQuery.isFunction(props)) {
                callback = props;
                props = ["*"];
            } else {
                props = props.match(rnotwhite);
            }

            var prop,
                index = 0,
                length = props.length;

            for (; index < length; index++) {
                prop = props[index];
                Animation.tweeners[prop] = Animation.tweeners[prop] || [];
                Animation.tweeners[prop].unshift(callback);
            }
        },

        prefilters: [defaultPrefilter],

        prefilter: function(callback, prepend) {
            if (prepend) {
                Animation.prefilters.unshift(callback);
            } else {
                Animation.prefilters.push(callback);
            }
        }
    });

    jQuery.speed = function(speed, easing, fn) {
        var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
            complete: fn || !fn && easing ||
                jQuery.isFunction(speed) && speed,
            duration: speed,
            easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
        };

        opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ?
            opt.duration : opt.duration in jQuery.fx.speeds ?
            jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;

        // Normalize opt.queue - true/undefined/null -> "fx"
        if (opt.queue == null || opt.queue === true) {
            opt.queue = "fx";
        }

        // Queueing
        opt.old = opt.complete;

        opt.complete = function() {
            if (jQuery.isFunction(opt.old)) {
                opt.old.call(this);
            }

            if (opt.queue) {
                jQuery.dequeue(this, opt.queue);
            }
        };

        return opt;
    };

    jQuery.fn.extend({
        fadeTo: function(speed, to, easing, callback) {

            // Show any hidden elements after setting opacity to 0
            return this.filter(isHidden).css("opacity", 0).show()

            // Animate to the value specified
            .end().animate({
                opacity: to
            }, speed, easing, callback);
        },
        animate: function(prop, speed, easing, callback) {
            var empty = jQuery.isEmptyObject(prop),
                optall = jQuery.speed(speed, easing, callback),
                doAnimation = function() {

                    // Operate on a copy of prop so per-property easing won't be lost
                    var anim = Animation(this, jQuery.extend({}, prop), optall);

                    // Empty animations, or finishing resolves immediately
                    if (empty || dataPriv.get(this, "finish")) {
                        anim.stop(true);
                    }
                };
            doAnimation.finish = doAnimation;

            return empty || optall.queue === false ?
                this.each(doAnimation) :
                this.queue(optall.queue, doAnimation);
        },
        stop: function(type, clearQueue, gotoEnd) {
            var stopQueue = function(hooks) {
                var stop = hooks.stop;
                delete hooks.stop;
                stop(gotoEnd);
            };

            if (typeof type !== "string") {
                gotoEnd = clearQueue;
                clearQueue = type;
                type = undefined;
            }
            if (clearQueue && type !== false) {
                this.queue(type || "fx", []);
            }

            return this.each(function() {
                var dequeue = true,
                    index = type != null && type + "queueHooks",
                    timers = jQuery.timers,
                    data = dataPriv.get(this);

                if (index) {
                    if (data[index] && data[index].stop) {
                        stopQueue(data[index]);
                    }
                } else {
                    for (index in data) {
                        if (data[index] && data[index].stop && rrun.test(index)) {
                            stopQueue(data[index]);
                        }
                    }
                }

                for (index = timers.length; index--;) {
                    if (timers[index].elem === this &&
                        (type == null || timers[index].queue === type)) {

                        timers[index].anim.stop(gotoEnd);
                        dequeue = false;
                        timers.splice(index, 1);
                    }
                }

                // Start the next in the queue if the last step wasn't forced.
                // Timers currently will call their complete callbacks, which
                // will dequeue but only if they were gotoEnd.
                if (dequeue || !gotoEnd) {
                    jQuery.dequeue(this, type);
                }
            });
        },
        finish: function(type) {
            if (type !== false) {
                type = type || "fx";
            }
            return this.each(function() {
                var index,
                    data = dataPriv.get(this),
                    queue = data[type + "queue"],
                    hooks = data[type + "queueHooks"],
                    timers = jQuery.timers,
                    length = queue ? queue.length : 0;

                // Enable finishing flag on private data
                data.finish = true;

                // Empty the queue first
                jQuery.queue(this, type, []);

                if (hooks && hooks.stop) {
                    hooks.stop.call(this, true);
                }

                // Look for any active animations, and finish them
                for (index = timers.length; index--;) {
                    if (timers[index].elem === this && timers[index].queue === type) {
                        timers[index].anim.stop(true);
                        timers.splice(index, 1);
                    }
                }

                // Look for any animations in the old queue and finish them
                for (index = 0; index < length; index++) {
                    if (queue[index] && queue[index].finish) {
                        queue[index].finish.call(this);
                    }
                }

                // Turn off finishing flag
                delete data.finish;
            });
        }
    });

    jQuery.each(["toggle", "show", "hide"], function(i, name) {
        var cssFn = jQuery.fn[name];
        jQuery.fn[name] = function(speed, easing, callback) {
            return speed == null || typeof speed === "boolean" ?
                cssFn.apply(this, arguments) :
                this.animate(genFx(name, true), speed, easing, callback);
        };
    });

    // Generate shortcuts for custom animations
    jQuery.each({
        slideDown: genFx("show"),
        slideUp: genFx("hide"),
        slideToggle: genFx("toggle"),
        fadeIn: {
            opacity: "show"
        },
        fadeOut: {
            opacity: "hide"
        },
        fadeToggle: {
            opacity: "toggle"
        }
    }, function(name, props) {
        jQuery.fn[name] = function(speed, easing, callback) {
            return this.animate(props, speed, easing, callback);
        };
    });

    jQuery.timers = [];
    jQuery.fx.tick = function() {
        var timer,
            i = 0,
            timers = jQuery.timers;

        fxNow = jQuery.now();

        for (; i < timers.length; i++) {
            timer = timers[i];

            // Checks the timer has not already been removed
            if (!timer() && timers[i] === timer) {
                timers.splice(i--, 1);
            }
        }

        if (!timers.length) {
            jQuery.fx.stop();
        }
        fxNow = undefined;
    };

    jQuery.fx.timer = function(timer) {
        jQuery.timers.push(timer);
        if (timer()) {
            jQuery.fx.start();
        } else {
            jQuery.timers.pop();
        }
    };

    jQuery.fx.interval = 13;
    jQuery.fx.start = function() {
        if (!timerId) {
            timerId = window.setInterval(jQuery.fx.tick, jQuery.fx.interval);
        }
    };

    jQuery.fx.stop = function() {
        window.clearInterval(timerId);

        timerId = null;
    };

    jQuery.fx.speeds = {
        slow: 600,
        fast: 200,

        // Default speed
        _default: 400
    };


    // Based off of the plugin by Clint Helfers, with permission.
    // http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
    jQuery.fn.delay = function(time, type) {
        time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
        type = type || "fx";

        return this.queue(type, function(next, hooks) {
            var timeout = window.setTimeout(next, time);
            hooks.stop = function() {
                window.clearTimeout(timeout);
            };
        });
    };


    (function() {
        var input = document.createElement("input"),
            select = document.createElement("select"),
            opt = select.appendChild(document.createElement("option"));

        input.type = "checkbox";

        // Support: iOS<=5.1, Android<=4.2+
        // Default value for a checkbox should be "on"
        support.checkOn = input.value !== "";

        // Support: IE<=11+
        // Must access selectedIndex to make default options select
        support.optSelected = opt.selected;

        // Support: Android<=2.3
        // Options inside disabled selects are incorrectly marked as disabled
        select.disabled = true;
        support.optDisabled = !opt.disabled;

        // Support: IE<=11+
        // An input loses its value after becoming a radio
        input = document.createElement("input");
        input.value = "t";
        input.type = "radio";
        support.radioValue = input.value === "t";
    })();


    var boolHook,
        attrHandle = jQuery.expr.attrHandle;

    jQuery.fn.extend({
        attr: function(name, value) {
            return access(this, jQuery.attr, name, value, arguments.length > 1);
        },

        removeAttr: function(name) {
            return this.each(function() {
                jQuery.removeAttr(this, name);
            });
        }
    });

    jQuery.extend({
        attr: function(elem, name, value) {
            var ret, hooks,
                nType = elem.nodeType;

            // Don't get/set attributes on text, comment and attribute nodes
            if (nType === 3 || nType === 8 || nType === 2) {
                return;
            }

            // Fallback to prop when attributes are not supported
            if (typeof elem.getAttribute === "undefined") {
                return jQuery.prop(elem, name, value);
            }

            // All attributes are lowercase
            // Grab necessary hook if one is defined
            if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
                name = name.toLowerCase();
                hooks = jQuery.attrHooks[name] ||
                    (jQuery.expr.match.bool.test(name) ? boolHook : undefined);
            }

            if (value !== undefined) {
                if (value === null) {
                    jQuery.removeAttr(elem, name);
                    return;
                }

                if (hooks && "set" in hooks &&
                    (ret = hooks.set(elem, value, name)) !== undefined) {
                    return ret;
                }

                elem.setAttribute(name, value + "");
                return value;
            }

            if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
                return ret;
            }

            ret = jQuery.find.attr(elem, name);

            // Non-existent attributes return null, we normalize to undefined
            return ret == null ? undefined : ret;
        },

        attrHooks: {
            type: {
                set: function(elem, value) {
                    if (!support.radioValue && value === "radio" &&
                        jQuery.nodeName(elem, "input")) {
                        var val = elem.value;
                        elem.setAttribute("type", value);
                        if (val) {
                            elem.value = val;
                        }
                        return value;
                    }
                }
            }
        },

        removeAttr: function(elem, value) {
            var name, propName,
                i = 0,
                attrNames = value && value.match(rnotwhite);

            if (attrNames && elem.nodeType === 1) {
                while ((name = attrNames[i++])) {
                    propName = jQuery.propFix[name] || name;

                    // Boolean attributes get special treatment (#10870)
                    if (jQuery.expr.match.bool.test(name)) {

                        // Set corresponding property to false
                        elem[propName] = false;
                    }

                    elem.removeAttribute(name);
                }
            }
        }
    });

    // Hooks for boolean attributes
    boolHook = {
        set: function(elem, value, name) {
            if (value === false) {

                // Remove boolean attributes when set to false
                jQuery.removeAttr(elem, name);
            } else {
                elem.setAttribute(name, name);
            }
            return name;
        }
    };
    jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(i, name) {
        var getter = attrHandle[name] || jQuery.find.attr;

        attrHandle[name] = function(elem, name, isXML) {
            var ret, handle;
            if (!isXML) {

                // Avoid an infinite loop by temporarily removing this function from the getter
                handle = attrHandle[name];
                attrHandle[name] = ret;
                ret = getter(elem, name, isXML) != null ?
                    name.toLowerCase() :
                    null;
                attrHandle[name] = handle;
            }
            return ret;
        };
    });




    var rfocusable = /^(?:input|select|textarea|button)$/i,
        rclickable = /^(?:a|area)$/i;

    jQuery.fn.extend({
        prop: function(name, value) {
            return access(this, jQuery.prop, name, value, arguments.length > 1);
        },

        removeProp: function(name) {
            return this.each(function() {
                delete this[jQuery.propFix[name] || name];
            });
        }
    });

    jQuery.extend({
        prop: function(elem, name, value) {
            var ret, hooks,
                nType = elem.nodeType;

            // Don't get/set properties on text, comment and attribute nodes
            if (nType === 3 || nType === 8 || nType === 2) {
                return;
            }

            if (nType !== 1 || !jQuery.isXMLDoc(elem)) {

                // Fix name and attach hooks
                name = jQuery.propFix[name] || name;
                hooks = jQuery.propHooks[name];
            }

            if (value !== undefined) {
                if (hooks && "set" in hooks &&
                    (ret = hooks.set(elem, value, name)) !== undefined) {
                    return ret;
                }

                return (elem[name] = value);
            }

            if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
                return ret;
            }

            return elem[name];
        },

        propHooks: {
            tabIndex: {
                get: function(elem) {

                    // elem.tabIndex doesn't always return the
                    // correct value when it hasn't been explicitly set
                    // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
                    // Use proper attribute retrieval(#12072)
                    var tabindex = jQuery.find.attr(elem, "tabindex");

                    return tabindex ?
                        parseInt(tabindex, 10) :
                        rfocusable.test(elem.nodeName) ||
                        rclickable.test(elem.nodeName) && elem.href ?
                        0 :
                        -1;
                }
            }
        },

        propFix: {
            "for": "htmlFor",
            "class": "className"
        }
    });

    // Support: IE <=11 only
    // Accessing the selectedIndex property
    // forces the browser to respect setting selected
    // on the option
    // The getter ensures a default option is selected
    // when in an optgroup
    if (!support.optSelected) {
        jQuery.propHooks.selected = {
            get: function(elem) {
                var parent = elem.parentNode;
                if (parent && parent.parentNode) {
                    parent.parentNode.selectedIndex;
                }
                return null;
            },
            set: function(elem) {
                var parent = elem.parentNode;
                if (parent) {
                    parent.selectedIndex;

                    if (parent.parentNode) {
                        parent.parentNode.selectedIndex;
                    }
                }
            }
        };
    }

    jQuery.each([
        "tabIndex",
        "readOnly",
        "maxLength",
        "cellSpacing",
        "cellPadding",
        "rowSpan",
        "colSpan",
        "useMap",
        "frameBorder",
        "contentEditable"
    ], function() {
        jQuery.propFix[this.toLowerCase()] = this;
    });




    var rclass = /[\t\r\n\f]/g;

    function getClass(elem) {
        return elem.getAttribute && elem.getAttribute("class") || "";
    }

    jQuery.fn.extend({
        addClass: function(value) {
            var classes, elem, cur, curValue, clazz, j, finalValue,
                i = 0;

            if (jQuery.isFunction(value)) {
                return this.each(function(j) {
                    jQuery(this).addClass(value.call(this, j, getClass(this)));
                });
            }

            if (typeof value === "string" && value) {
                classes = value.match(rnotwhite) || [];

                while ((elem = this[i++])) {
                    curValue = getClass(elem);
                    cur = elem.nodeType === 1 &&
                        (" " + curValue + " ").replace(rclass, " ");

                    if (cur) {
                        j = 0;
                        while ((clazz = classes[j++])) {
                            if (cur.indexOf(" " + clazz + " ") < 0) {
                                cur += clazz + " ";
                            }
                        }

                        // Only assign if different to avoid unneeded rendering.
                        finalValue = jQuery.trim(cur);
                        if (curValue !== finalValue) {
                            elem.setAttribute("class", finalValue);
                        }
                    }
                }
            }

            return this;
        },

        removeClass: function(value) {
            var classes, elem, cur, curValue, clazz, j, finalValue,
                i = 0;

            if (jQuery.isFunction(value)) {
                return this.each(function(j) {
                    jQuery(this).removeClass(value.call(this, j, getClass(this)));
                });
            }

            if (!arguments.length) {
                return this.attr("class", "");
            }

            if (typeof value === "string" && value) {
                classes = value.match(rnotwhite) || [];

                while ((elem = this[i++])) {
                    curValue = getClass(elem);

                    // This expression is here for better compressibility (see addClass)
                    cur = elem.nodeType === 1 &&
                        (" " + curValue + " ").replace(rclass, " ");

                    if (cur) {
                        j = 0;
                        while ((clazz = classes[j++])) {

                            // Remove *all* instances
                            while (cur.indexOf(" " + clazz + " ") > -1) {
                                cur = cur.replace(" " + clazz + " ", " ");
                            }
                        }

                        // Only assign if different to avoid unneeded rendering.
                        finalValue = jQuery.trim(cur);
                        if (curValue !== finalValue) {
                            elem.setAttribute("class", finalValue);
                        }
                    }
                }
            }

            return this;
        },

        toggleClass: function(value, stateVal) {
            var type = typeof value;

            if (typeof stateVal === "boolean" && type === "string") {
                return stateVal ? this.addClass(value) : this.removeClass(value);
            }

            if (jQuery.isFunction(value)) {
                return this.each(function(i) {
                    jQuery(this).toggleClass(
                        value.call(this, i, getClass(this), stateVal),
                        stateVal
                    );
                });
            }

            return this.each(function() {
                var className, i, self, classNames;

                if (type === "string") {

                    // Toggle individual class names
                    i = 0;
                    self = jQuery(this);
                    classNames = value.match(rnotwhite) || [];

                    while ((className = classNames[i++])) {

                        // Check each className given, space separated list
                        if (self.hasClass(className)) {
                            self.removeClass(className);
                        } else {
                            self.addClass(className);
                        }
                    }

                    // Toggle whole class name
                } else if (value === undefined || type === "boolean") {
                    className = getClass(this);
                    if (className) {

                        // Store className if set
                        dataPriv.set(this, "__className__", className);
                    }

                    // If the element has a class name or if we're passed `false`,
                    // then remove the whole classname (if there was one, the above saved it).
                    // Otherwise bring back whatever was previously saved (if anything),
                    // falling back to the empty string if nothing was stored.
                    if (this.setAttribute) {
                        this.setAttribute("class",
                            className || value === false ?
                            "" :
                            dataPriv.get(this, "__className__") || ""
                        );
                    }
                }
            });
        },

        hasClass: function(selector) {
            var className, elem,
                i = 0;

            className = " " + selector + " ";
            while ((elem = this[i++])) {
                if (elem.nodeType === 1 &&
                    (" " + getClass(elem) + " ").replace(rclass, " ")
                    .indexOf(className) > -1
                ) {
                    return true;
                }
            }

            return false;
        }
    });




    var rreturn = /\r/g,
        rspaces = /[\x20\t\r\n\f]+/g;

    jQuery.fn.extend({
        val: function(value) {
            var hooks, ret, isFunction,
                elem = this[0];

            if (!arguments.length) {
                if (elem) {
                    hooks = jQuery.valHooks[elem.type] ||
                        jQuery.valHooks[elem.nodeName.toLowerCase()];

                    if (hooks &&
                        "get" in hooks &&
                        (ret = hooks.get(elem, "value")) !== undefined
                    ) {
                        return ret;
                    }

                    ret = elem.value;

                    return typeof ret === "string" ?

                        // Handle most common string cases
                        ret.replace(rreturn, "") :

                        // Handle cases where value is null/undef or number
                        ret == null ? "" : ret;
                }

                return;
            }

            isFunction = jQuery.isFunction(value);

            return this.each(function(i) {
                var val;

                if (this.nodeType !== 1) {
                    return;
                }

                if (isFunction) {
                    val = value.call(this, i, jQuery(this).val());
                } else {
                    val = value;
                }

                // Treat null/undefined as ""; convert numbers to string
                if (val == null) {
                    val = "";

                } else if (typeof val === "number") {
                    val += "";

                } else if (jQuery.isArray(val)) {
                    val = jQuery.map(val, function(value) {
                        return value == null ? "" : value + "";
                    });
                }

                hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];

                // If set returns undefined, fall back to normal setting
                if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
                    this.value = val;
                }
            });
        }
    });

    jQuery.extend({
        valHooks: {
            option: {
                get: function(elem) {

                    var val = jQuery.find.attr(elem, "value");
                    return val != null ?
                        val :

                        // Support: IE10-11+
                        // option.text throws exceptions (#14686, #14858)
                        // Strip and collapse whitespace
                        // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
                        jQuery.trim(jQuery.text(elem)).replace(rspaces, " ");
                }
            },
            select: {
                get: function(elem) {
                    var value, option,
                        options = elem.options,
                        index = elem.selectedIndex,
                        one = elem.type === "select-one" || index < 0,
                        values = one ? null : [],
                        max = one ? index + 1 : options.length,
                        i = index < 0 ?
                        max :
                        one ? index : 0;

                    // Loop through all the selected options
                    for (; i < max; i++) {
                        option = options[i];

                        // IE8-9 doesn't update selected after form reset (#2551)
                        if ((option.selected || i === index) &&

                            // Don't return options that are disabled or in a disabled optgroup
                            (support.optDisabled ?
                                !option.disabled : option.getAttribute("disabled") === null) &&
                            (!option.parentNode.disabled ||
                                !jQuery.nodeName(option.parentNode, "optgroup"))) {

                            // Get the specific value for the option
                            value = jQuery(option).val();

                            // We don't need an array for one selects
                            if (one) {
                                return value;
                            }

                            // Multi-Selects return an array
                            values.push(value);
                        }
                    }

                    return values;
                },

                set: function(elem, value) {
                    var optionSet, option,
                        options = elem.options,
                        values = jQuery.makeArray(value),
                        i = options.length;

                    while (i--) {
                        option = options[i];
                        if (option.selected =
                            jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1
                        ) {
                            optionSet = true;
                        }
                    }

                    // Force browsers to behave consistently when non-matching value is set
                    if (!optionSet) {
                        elem.selectedIndex = -1;
                    }
                    return values;
                }
            }
        }
    });

    // Radios and checkboxes getter/setter
    jQuery.each(["radio", "checkbox"], function() {
        jQuery.valHooks[this] = {
            set: function(elem, value) {
                if (jQuery.isArray(value)) {
                    return (elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1);
                }
            }
        };
        if (!support.checkOn) {
            jQuery.valHooks[this].get = function(elem) {
                return elem.getAttribute("value") === null ? "on" : elem.value;
            };
        }
    });




    // Return jQuery for attributes-only inclusion


    var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;

    jQuery.extend(jQuery.event, {

        trigger: function(event, data, elem, onlyHandlers) {

            var i, cur, tmp, bubbleType, ontype, handle, special,
                eventPath = [elem || document],
                type = hasOwn.call(event, "type") ? event.type : event,
                namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];

            cur = tmp = elem = elem || document;

            // Don't do events on text and comment nodes
            if (elem.nodeType === 3 || elem.nodeType === 8) {
                return;
            }

            // focus/blur morphs to focusin/out; ensure we're not firing them right now
            if (rfocusMorph.test(type + jQuery.event.triggered)) {
                return;
            }

            if (type.indexOf(".") > -1) {

                // Namespaced trigger; create a regexp to match event type in handle()
                namespaces = type.split(".");
                type = namespaces.shift();
                namespaces.sort();
            }
            ontype = type.indexOf(":") < 0 && "on" + type;

            // Caller can pass in a jQuery.Event object, Object, or just an event type string
            event = event[jQuery.expando] ?
                event :
                new jQuery.Event(type, typeof event === "object" && event);

            // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
            event.isTrigger = onlyHandlers ? 2 : 3;
            event.namespace = namespaces.join(".");
            event.rnamespace = event.namespace ?
                new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") :
                null;

            // Clean up the event in case it is being reused
            event.result = undefined;
            if (!event.target) {
                event.target = elem;
            }

            // Clone any incoming data and prepend the event, creating the handler arg list
            data = data == null ?
                [event] :
                jQuery.makeArray(data, [event]);

            // Allow special events to draw outside the lines
            special = jQuery.event.special[type] || {};
            if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
                return;
            }

            // Determine event propagation path in advance, per W3C events spec (#9951)
            // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
            if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) {

                bubbleType = special.delegateType || type;
                if (!rfocusMorph.test(bubbleType + type)) {
                    cur = cur.parentNode;
                }
                for (; cur; cur = cur.parentNode) {
                    eventPath.push(cur);
                    tmp = cur;
                }

                // Only add window if we got to document (e.g., not plain obj or detached DOM)
                if (tmp === (elem.ownerDocument || document)) {
                    eventPath.push(tmp.defaultView || tmp.parentWindow || window);
                }
            }

            // Fire handlers on the event path
            i = 0;
            while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {

                event.type = i > 1 ?
                    bubbleType :
                    special.bindType || type;

                // jQuery handler
                handle = (dataPriv.get(cur, "events") || {})[event.type] &&
                    dataPriv.get(cur, "handle");
                if (handle) {
                    handle.apply(cur, data);
                }

                // Native handler
                handle = ontype && cur[ontype];
                if (handle && handle.apply && acceptData(cur)) {
                    event.result = handle.apply(cur, data);
                    if (event.result === false) {
                        event.preventDefault();
                    }
                }
            }
            event.type = type;

            // If nobody prevented the default action, do it now
            if (!onlyHandlers && !event.isDefaultPrevented()) {

                if ((!special._default ||
                        special._default.apply(eventPath.pop(), data) === false) &&
                    acceptData(elem)) {

                    // Call a native DOM method on the target with the same name name as the event.
                    // Don't do default actions on window, that's where global variables be (#6170)
                    if (ontype && jQuery.isFunction(elem[type]) && !jQuery.isWindow(elem)) {

                        // Don't re-trigger an onFOO event when we call its FOO() method
                        tmp = elem[ontype];

                        if (tmp) {
                            elem[ontype] = null;
                        }

                        // Prevent re-triggering of the same event, since we already bubbled it above
                        jQuery.event.triggered = type;
                        elem[type]();
                        jQuery.event.triggered = undefined;

                        if (tmp) {
                            elem[ontype] = tmp;
                        }
                    }
                }
            }

            return event.result;
        },

        // Piggyback on a donor event to simulate a different one
        // Used only for `focus(in | out)` events
        simulate: function(type, elem, event) {
            var e = jQuery.extend(
                new jQuery.Event(),
                event, {
                    type: type,
                    isSimulated: true
                }
            );

            jQuery.event.trigger(e, null, elem);
        }

    });

    jQuery.fn.extend({

        trigger: function(type, data) {
            return this.each(function() {
                jQuery.event.trigger(type, data, this);
            });
        },
        triggerHandler: function(type, data) {
            var elem = this[0];
            if (elem) {
                return jQuery.event.trigger(type, data, elem, true);
            }
        }
    });


    jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " +
            "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
            "change select submit keydown keypress keyup error contextmenu").split(" "),
        function(i, name) {

            // Handle event binding
            jQuery.fn[name] = function(data, fn) {
                return arguments.length > 0 ?
                    this.on(name, null, data, fn) :
                    this.trigger(name);
            };
        });

    jQuery.fn.extend({
        hover: function(fnOver, fnOut) {
            return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
        }
    });




    support.focusin = "onfocusin" in window;


    // Support: Firefox
    // Firefox doesn't have focus(in | out) events
    // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
    //
    // Support: Chrome, Safari
    // focus(in | out) events fire after focus & blur events,
    // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
    // Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
    if (!support.focusin) {
        jQuery.each({
            focus: "focusin",
            blur: "focusout"
        }, function(orig, fix) {

            // Attach a single capturing handler on the document while someone wants focusin/focusout
            var handler = function(event) {
                jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
            };

            jQuery.event.special[fix] = {
                setup: function() {
                    var doc = this.ownerDocument || this,
                        attaches = dataPriv.access(doc, fix);

                    if (!attaches) {
                        doc.addEventListener(orig, handler, true);
                    }
                    dataPriv.access(doc, fix, (attaches || 0) + 1);
                },
                teardown: function() {
                    var doc = this.ownerDocument || this,
                        attaches = dataPriv.access(doc, fix) - 1;

                    if (!attaches) {
                        doc.removeEventListener(orig, handler, true);
                        dataPriv.remove(doc, fix);

                    } else {
                        dataPriv.access(doc, fix, attaches);
                    }
                }
            };
        });
    }
    var location = window.location;

    var nonce = jQuery.now();

    var rquery = (/\?/);



    // Support: Android 2.3
    // Workaround failure to string-cast null input
    jQuery.parseJSON = function(data) {
        return JSON.parse(data + "");
    };


    // Cross-browser xml parsing
    jQuery.parseXML = function(data) {
        var xml;
        if (!data || typeof data !== "string") {
            return null;
        }

        // Support: IE9
        try {
            xml = (new window.DOMParser()).parseFromString(data, "text/xml");
        } catch (e) {
            xml = undefined;
        }

        if (!xml || xml.getElementsByTagName("parsererror").length) {
            jQuery.error("Invalid XML: " + data);
        }
        return xml;
    };


    var
        rhash = /#.*$/,
        rts = /([?&])_=[^&]*/,
        rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,

        // #7653, #8125, #8152: local protocol detection
        rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
        rnoContent = /^(?:GET|HEAD)$/,
        rprotocol = /^\/\//,

        /* Prefilters
         * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
         * 2) These are called:
         *    - BEFORE asking for a transport
         *    - AFTER param serialization (s.data is a string if s.processData is true)
         * 3) key is the dataType
         * 4) the catchall symbol "*" can be used
         * 5) execution will start with transport dataType and THEN continue down to "*" if needed
         */
        prefilters = {},

        /* Transports bindings
         * 1) key is the dataType
         * 2) the catchall symbol "*" can be used
         * 3) selection will start with transport dataType and THEN go to "*" if needed
         */
        transports = {},

        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
        allTypes = "*/".concat("*"),

        // Anchor tag for parsing the document origin
        originAnchor = document.createElement("a");
    originAnchor.href = location.href;

    // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
    function addToPrefiltersOrTransports(structure) {

        // dataTypeExpression is optional and defaults to "*"
        return function(dataTypeExpression, func) {

            if (typeof dataTypeExpression !== "string") {
                func = dataTypeExpression;
                dataTypeExpression = "*";
            }

            var dataType,
                i = 0,
                dataTypes = dataTypeExpression.toLowerCase().match(rnotwhite) || [];

            if (jQuery.isFunction(func)) {

                // For each dataType in the dataTypeExpression
                while ((dataType = dataTypes[i++])) {

                    // Prepend if requested
                    if (dataType[0] === "+") {
                        dataType = dataType.slice(1) || "*";
                        (structure[dataType] = structure[dataType] || []).unshift(func);

                        // Otherwise append
                    } else {
                        (structure[dataType] = structure[dataType] || []).push(func);
                    }
                }
            }
        };
    }

    // Base inspection function for prefilters and transports
    function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {

        var inspected = {},
            seekingTransport = (structure === transports);

        function inspect(dataType) {
            var selected;
            inspected[dataType] = true;
            jQuery.each(structure[dataType] || [], function(_, prefilterOrFactory) {
                var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
                if (typeof dataTypeOrTransport === "string" &&
                    !seekingTransport && !inspected[dataTypeOrTransport]) {

                    options.dataTypes.unshift(dataTypeOrTransport);
                    inspect(dataTypeOrTransport);
                    return false;
                } else if (seekingTransport) {
                    return !(selected = dataTypeOrTransport);
                }
            });
            return selected;
        }

        return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
    }

    // A special extend for ajax options
    // that takes "flat" options (not to be deep extended)
    // Fixes #9887
    function ajaxExtend(target, src) {
        var key, deep,
            flatOptions = jQuery.ajaxSettings.flatOptions || {};

        for (key in src) {
            if (src[key] !== undefined) {
                (flatOptions[key] ? target : (deep || (deep = {})))[key] = src[key];
            }
        }
        if (deep) {
            jQuery.extend(true, target, deep);
        }

        return target;
    }

    /* Handles responses to an ajax request:
     * - finds the right dataType (mediates between content-type and expected dataType)
     * - returns the corresponding response
     */
    function ajaxHandleResponses(s, jqXHR, responses) {

        var ct, type, finalDataType, firstDataType,
            contents = s.contents,
            dataTypes = s.dataTypes;

        // Remove auto dataType and get content-type in the process
        while (dataTypes[0] === "*") {
            dataTypes.shift();
            if (ct === undefined) {
                ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
            }
        }

        // Check if we're dealing with a known content-type
        if (ct) {
            for (type in contents) {
                if (contents[type] && contents[type].test(ct)) {
                    dataTypes.unshift(type);
                    break;
                }
            }
        }

        // Check to see if we have a response for the expected dataType
        if (dataTypes[0] in responses) {
            finalDataType = dataTypes[0];
        } else {

            // Try convertible dataTypes
            for (type in responses) {
                if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
                    finalDataType = type;
                    break;
                }
                if (!firstDataType) {
                    firstDataType = type;
                }
            }

            // Or just use first one
            finalDataType = finalDataType || firstDataType;
        }

        // If we found a dataType
        // We add the dataType to the list if needed
        // and return the corresponding response
        if (finalDataType) {
            if (finalDataType !== dataTypes[0]) {
                dataTypes.unshift(finalDataType);
            }
            return responses[finalDataType];
        }
    }

    /* Chain conversions given the request and the original response
     * Also sets the responseXXX fields on the jqXHR instance
     */
    function ajaxConvert(s, response, jqXHR, isSuccess) {
        var conv2, current, conv, tmp, prev,
            converters = {},

            // Work with a copy of dataTypes in case we need to modify it for conversion
            dataTypes = s.dataTypes.slice();

        // Create converters map with lowercased keys
        if (dataTypes[1]) {
            for (conv in s.converters) {
                converters[conv.toLowerCase()] = s.converters[conv];
            }
        }

        current = dataTypes.shift();

        // Convert to each sequential dataType
        while (current) {

            if (s.responseFields[current]) {
                jqXHR[s.responseFields[current]] = response;
            }

            // Apply the dataFilter if provided
            if (!prev && isSuccess && s.dataFilter) {
                response = s.dataFilter(response, s.dataType);
            }

            prev = current;
            current = dataTypes.shift();

            if (current) {

                // There's only work to do if current dataType is non-auto
                if (current === "*") {

                    current = prev;

                    // Convert response if prev dataType is non-auto and differs from current
                } else if (prev !== "*" && prev !== current) {

                    // Seek a direct converter
                    conv = converters[prev + " " + current] || converters["* " + current];

                    // If none found, seek a pair
                    if (!conv) {
                        for (conv2 in converters) {

                            // If conv2 outputs current
                            tmp = conv2.split(" ");
                            if (tmp[1] === current) {

                                // If prev can be converted to accepted input
                                conv = converters[prev + " " + tmp[0]] ||
                                    converters["* " + tmp[0]];
                                if (conv) {

                                    // Condense equivalence converters
                                    if (conv === true) {
                                        conv = converters[conv2];

                                        // Otherwise, insert the intermediate dataType
                                    } else if (converters[conv2] !== true) {
                                        current = tmp[0];
                                        dataTypes.unshift(tmp[1]);
                                    }
                                    break;
                                }
                            }
                        }
                    }

                    // Apply converter (if not an equivalence)
                    if (conv !== true) {

                        // Unless errors are allowed to bubble, catch and return them
                        if (conv && s.throws) {
                            response = conv(response);
                        } else {
                            try {
                                response = conv(response);
                            } catch (e) {
                                return {
                                    state: "parsererror",
                                    error: conv ? e : "No conversion from " + prev + " to " + current
                                };
                            }
                        }
                    }
                }
            }
        }

        return {
            state: "success",
            data: response
        };
    }

    jQuery.extend({

        // Counter for holding the number of active queries
        active: 0,

        // Last-Modified header cache for next request
        lastModified: {},
        etag: {},

        ajaxSettings: {
            url: location.href,
            type: "GET",
            isLocal: rlocalProtocol.test(location.protocol),
            global: true,
            processData: true,
            async: true,
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            /*
		timeout: 0,
		data: null,
		dataType: null,
		username: null,
		password: null,
		cache: null,
		throws: false,
		traditional: false,
		headers: {},
		*/

            accepts: {
                "*": allTypes,
                text: "text/plain",
                html: "text/html",
                xml: "application/xml, text/xml",
                json: "application/json, text/javascript"
            },

            contents: {
                xml: /\bxml\b/,
                html: /\bhtml/,
                json: /\bjson\b/
            },

            responseFields: {
                xml: "responseXML",
                text: "responseText",
                json: "responseJSON"
            },

            // Data converters
            // Keys separate source (or catchall "*") and destination types with a single space
            converters: {

                // Convert anything to text
                "* text": String,

                // Text to html (true = no transformation)
                "text html": true,

                // Evaluate text as a json expression
                "text json": jQuery.parseJSON,

                // Parse text as xml
                "text xml": jQuery.parseXML
            },

            // For options that shouldn't be deep extended:
            // you can add your own custom options here if
            // and when you create one that shouldn't be
            // deep extended (see ajaxExtend)
            flatOptions: {
                url: true,
                context: true
            }
        },

        // Creates a full fledged settings object into target
        // with both ajaxSettings and settings fields.
        // If target is omitted, writes into ajaxSettings.
        ajaxSetup: function(target, settings) {
            return settings ?

                // Building a settings object
                ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :

                // Extending ajaxSettings
                ajaxExtend(jQuery.ajaxSettings, target);
        },

        ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
        ajaxTransport: addToPrefiltersOrTransports(transports),

        // Main method
        ajax: function(url, options) {

            // If url is an object, simulate pre-1.5 signature
            if (typeof url === "object") {
                options = url;
                url = undefined;
            }

            // Force options to be an object
            options = options || {};

            var transport,

                // URL without anti-cache param
                cacheURL,

                // Response headers
                responseHeadersString,
                responseHeaders,

                // timeout handle
                timeoutTimer,

                // Url cleanup var
                urlAnchor,

                // To know if global events are to be dispatched
                fireGlobals,

                // Loop variable
                i,

                // Create the final options object
                s = jQuery.ajaxSetup({}, options),

                // Callbacks context
                callbackContext = s.context || s,

                // Context for global events is callbackContext if it is a DOM node or jQuery collection
                globalEventContext = s.context &&
                (callbackContext.nodeType || callbackContext.jquery) ?
                jQuery(callbackContext) :
                jQuery.event,

                // Deferreds
                deferred = jQuery.Deferred(),
                completeDeferred = jQuery.Callbacks("once memory"),

                // Status-dependent callbacks
                statusCode = s.statusCode || {},

                // Headers (they are sent all at once)
                requestHeaders = {},
                requestHeadersNames = {},

                // The jqXHR state
                state = 0,

                // Default abort message
                strAbort = "canceled",

                // Fake xhr
                jqXHR = {
                    readyState: 0,

                    // Builds headers hashtable if needed
                    getResponseHeader: function(key) {
                        var match;
                        if (state === 2) {
                            if (!responseHeaders) {
                                responseHeaders = {};
                                while ((match = rheaders.exec(responseHeadersString))) {
                                    responseHeaders[match[1].toLowerCase()] = match[2];
                                }
                            }
                            match = responseHeaders[key.toLowerCase()];
                        }
                        return match == null ? null : match;
                    },

                    // Raw string
                    getAllResponseHeaders: function() {
                        return state === 2 ? responseHeadersString : null;
                    },

                    // Caches the header
                    setRequestHeader: function(name, value) {
                        var lname = name.toLowerCase();
                        if (!state) {
                            name = requestHeadersNames[lname] = requestHeadersNames[lname] || name;
                            requestHeaders[name] = value;
                        }
                        return this;
                    },

                    // Overrides response content-type header
                    overrideMimeType: function(type) {
                        if (!state) {
                            s.mimeType = type;
                        }
                        return this;
                    },

                    // Status-dependent callbacks
                    statusCode: function(map) {
                        var code;
                        if (map) {
                            if (state < 2) {
                                for (code in map) {

                                    // Lazy-add the new callback in a way that preserves old ones
                                    statusCode[code] = [statusCode[code], map[code]];
                                }
                            } else {

                                // Execute the appropriate callbacks
                                jqXHR.always(map[jqXHR.status]);
                            }
                        }
                        return this;
                    },

                    // Cancel the request
                    abort: function(statusText) {
                        var finalText = statusText || strAbort;
                        if (transport) {
                            transport.abort(finalText);
                        }
                        done(0, finalText);
                        return this;
                    }
                };

            // Attach deferreds
            deferred.promise(jqXHR).complete = completeDeferred.add;
            jqXHR.success = jqXHR.done;
            jqXHR.error = jqXHR.fail;

            // Remove hash character (#7531: and string promotion)
            // Add protocol if not provided (prefilters might expect it)
            // Handle falsy url in the settings object (#10093: consistency with old signature)
            // We also use the url parameter if available
            s.url = ((url || s.url || location.href) + "").replace(rhash, "")
                .replace(rprotocol, location.protocol + "//");

            // Alias method option to type as per ticket #12004
            s.type = options.method || options.type || s.method || s.type;

            // Extract dataTypes list
            s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(rnotwhite) || [""];

            // A cross-domain request is in order when the origin doesn't match the current origin.
            if (s.crossDomain == null) {
                urlAnchor = document.createElement("a");

                // Support: IE8-11+
                // IE throws exception if url is malformed, e.g. http://example.com:80x/
                try {
                    urlAnchor.href = s.url;

                    // Support: IE8-11+
                    // Anchor's host property isn't correctly set when s.url is relative
                    urlAnchor.href = urlAnchor.href;
                    s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
                        urlAnchor.protocol + "//" + urlAnchor.host;
                } catch (e) {

                    // If there is an error parsing the URL, assume it is crossDomain,
                    // it can be rejected by the transport if it is invalid
                    s.crossDomain = true;
                }
            }

            // Convert data if not already a string
            if (s.data && s.processData && typeof s.data !== "string") {
                s.data = jQuery.param(s.data, s.traditional);
            }

            // Apply prefilters
            inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);

            // If request was aborted inside a prefilter, stop there
            if (state === 2) {
                return jqXHR;
            }

            // We can fire global events as of now if asked to
            // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
            fireGlobals = jQuery.event && s.global;

            // Watch for a new set of requests
            if (fireGlobals && jQuery.active++ === 0) {
                jQuery.event.trigger("ajaxStart");
            }

            // Uppercase the type
            s.type = s.type.toUpperCase();

            // Determine if request has content
            s.hasContent = !rnoContent.test(s.type);

            // Save the URL in case we're toying with the If-Modified-Since
            // and/or If-None-Match header later on
            cacheURL = s.url;

            // More options handling for requests with no content
            if (!s.hasContent) {

                // If data is available, append data to url
                if (s.data) {
                    cacheURL = (s.url += (rquery.test(cacheURL) ? "&" : "?") + s.data);

                    // #9682: remove data so that it's not used in an eventual retry
                    delete s.data;
                }

                // Add anti-cache in url if needed
                if (s.cache === false) {
                    s.url = rts.test(cacheURL) ?

                        // If there is already a '_' parameter, set its value
                        cacheURL.replace(rts, "$1_=" + nonce++) :

                        // Otherwise add one to the end
                        cacheURL + (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce++;
                }
            }

            // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
            if (s.ifModified) {
                if (jQuery.lastModified[cacheURL]) {
                    jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
                }
                if (jQuery.etag[cacheURL]) {
                    jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
                }
            }

            // Set the correct header, if data is being sent
            if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
                jqXHR.setRequestHeader("Content-Type", s.contentType);
            }

            // Set the Accepts header for the server, depending on the dataType
            jqXHR.setRequestHeader(
                "Accept",
                s.dataTypes[0] && s.accepts[s.dataTypes[0]] ?
                s.accepts[s.dataTypes[0]] +
                (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") :
                s.accepts["*"]
            );

            // Check for headers option
            for (i in s.headers) {
                jqXHR.setRequestHeader(i, s.headers[i]);
            }

            // Allow custom headers/mimetypes and early abort
            if (s.beforeSend &&
                (s.beforeSend.call(callbackContext, jqXHR, s) === false || state === 2)) {

                // Abort if not done already and return
                return jqXHR.abort();
            }

            // Aborting is no longer a cancellation
            strAbort = "abort";

            // Install callbacks on deferreds
            for (i in {
                    success: 1,
                    error: 1,
                    complete: 1
                }) {
                jqXHR[i](s[i]);
            }

            // Get transport
            transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);

            // If no transport, we auto-abort
            if (!transport) {
                done(-1, "No Transport");
            } else {
                jqXHR.readyState = 1;

                // Send global event
                if (fireGlobals) {
                    globalEventContext.trigger("ajaxSend", [jqXHR, s]);
                }

                // If request was aborted inside ajaxSend, stop there
                if (state === 2) {
                    return jqXHR;
                }

                // Timeout
                if (s.async && s.timeout > 0) {
                    timeoutTimer = window.setTimeout(function() {
                        jqXHR.abort("timeout");
                    }, s.timeout);
                }

                try {
                    state = 1;
                    transport.send(requestHeaders, done);
                } catch (e) {

                    // Propagate exception as error if not done
                    if (state < 2) {
                        done(-1, e);

                        // Simply rethrow otherwise
                    } else {
                        throw e;
                    }
                }
            }

            // Callback for when everything is done
            function done(status, nativeStatusText, responses, headers) {
                var isSuccess, success, error, response, modified,
                    statusText = nativeStatusText;

                // Called once
                if (state === 2) {
                    return;
                }

                // State is "done" now
                state = 2;

                // Clear timeout if it exists
                if (timeoutTimer) {
                    window.clearTimeout(timeoutTimer);
                }

                // Dereference transport for early garbage collection
                // (no matter how long the jqXHR object will be used)
                transport = undefined;

                // Cache response headers
                responseHeadersString = headers || "";

                // Set readyState
                jqXHR.readyState = status > 0 ? 4 : 0;

                // Determine if successful
                isSuccess = status >= 200 && status < 300 || status === 304;

                // Get response data
                if (responses) {
                    response = ajaxHandleResponses(s, jqXHR, responses);
                }

                // Convert no matter what (that way responseXXX fields are always set)
                response = ajaxConvert(s, response, jqXHR, isSuccess);

                // If successful, handle type chaining
                if (isSuccess) {

                    // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
                    if (s.ifModified) {
                        modified = jqXHR.getResponseHeader("Last-Modified");
                        if (modified) {
                            jQuery.lastModified[cacheURL] = modified;
                        }
                        modified = jqXHR.getResponseHeader("etag");
                        if (modified) {
                            jQuery.etag[cacheURL] = modified;
                        }
                    }

                    // if no content
                    if (status === 204 || s.type === "HEAD") {
                        statusText = "nocontent";

                        // if not modified
                    } else if (status === 304) {
                        statusText = "notmodified";

                        // If we have data, let's convert it
                    } else {
                        statusText = response.state;
                        success = response.data;
                        error = response.error;
                        isSuccess = !error;
                    }
                } else {

                    // Extract error from statusText and normalize for non-aborts
                    error = statusText;
                    if (status || !statusText) {
                        statusText = "error";
                        if (status < 0) {
                            status = 0;
                        }
                    }
                }

                // Set data for the fake xhr object
                jqXHR.status = status;
                jqXHR.statusText = (nativeStatusText || statusText) + "";

                // Success/Error
                if (isSuccess) {
                    deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
                } else {
                    deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
                }

                // Status-dependent callbacks
                jqXHR.statusCode(statusCode);
                statusCode = undefined;

                if (fireGlobals) {
                    globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]);
                }

                // Complete
                completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);

                if (fireGlobals) {
                    globalEventContext.trigger("ajaxComplete", [jqXHR, s]);

                    // Handle the global AJAX counter
                    if (!(--jQuery.active)) {
                        jQuery.event.trigger("ajaxStop");
                    }
                }
            }

            return jqXHR;
        },

        getJSON: function(url, data, callback) {
            return jQuery.get(url, data, callback, "json");
        },

        getScript: function(url, callback) {
            return jQuery.get(url, undefined, callback, "script");
        }
    });

    jQuery.each(["get", "post"], function(i, method) {
        jQuery[method] = function(url, data, callback, type) {

            // Shift arguments if data argument was omitted
            if (jQuery.isFunction(data)) {
                type = type || callback;
                callback = data;
                data = undefined;
            }

            // The url can be an options object (which then must have .url)
            return jQuery.ajax(jQuery.extend({
                url: url,
                type: method,
                dataType: type,
                data: data,
                success: callback
            }, jQuery.isPlainObject(url) && url));
        };
    });


    jQuery._evalUrl = function(url) {
        return jQuery.ajax({
            url: url,

            // Make this explicit, since user can override this through ajaxSetup (#11264)
            type: "GET",
            dataType: "script",
            async: false,
            global: false,
            "throws": true
        });
    };


    jQuery.fn.extend({
        wrapAll: function(html) {
            var wrap;

            if (jQuery.isFunction(html)) {
                return this.each(function(i) {
                    jQuery(this).wrapAll(html.call(this, i));
                });
            }

            if (this[0]) {

                // The elements to wrap the target around
                wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);

                if (this[0].parentNode) {
                    wrap.insertBefore(this[0]);
                }

                wrap.map(function() {
                    var elem = this;

                    while (elem.firstElementChild) {
                        elem = elem.firstElementChild;
                    }

                    return elem;
                }).append(this);
            }

            return this;
        },

        wrapInner: function(html) {
            if (jQuery.isFunction(html)) {
                return this.each(function(i) {
                    jQuery(this).wrapInner(html.call(this, i));
                });
            }

            return this.each(function() {
                var self = jQuery(this),
                    contents = self.contents();

                if (contents.length) {
                    contents.wrapAll(html);

                } else {
                    self.append(html);
                }
            });
        },

        wrap: function(html) {
            var isFunction = jQuery.isFunction(html);

            return this.each(function(i) {
                jQuery(this).wrapAll(isFunction ? html.call(this, i) : html);
            });
        },

        unwrap: function() {
            return this.parent().each(function() {
                if (!jQuery.nodeName(this, "body")) {
                    jQuery(this).replaceWith(this.childNodes);
                }
            }).end();
        }
    });


    jQuery.expr.filters.hidden = function(elem) {
        return !jQuery.expr.filters.visible(elem);
    };
    jQuery.expr.filters.visible = function(elem) {

        // Support: Opera <= 12.12
        // Opera reports offsetWidths and offsetHeights less than zero on some elements
        // Use OR instead of AND as the element is not visible if either is true
        // See tickets #10406 and #13132
        return elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;
    };




    var r20 = /%20/g,
        rbracket = /\[\]$/,
        rCRLF = /\r?\n/g,
        rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
        rsubmittable = /^(?:input|select|textarea|keygen)/i;

    function buildParams(prefix, obj, traditional, add) {
        var name;

        if (jQuery.isArray(obj)) {

            // Serialize array item.
            jQuery.each(obj, function(i, v) {
                if (traditional || rbracket.test(prefix)) {

                    // Treat each array item as a scalar.
                    add(prefix, v);

                } else {

                    // Item is non-scalar (array or object), encode its numeric index.
                    buildParams(
                        prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]",
                        v,
                        traditional,
                        add
                    );
                }
            });

        } else if (!traditional && jQuery.type(obj) === "object") {

            // Serialize object item.
            for (name in obj) {
                buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
            }

        } else {

            // Serialize scalar item.
            add(prefix, obj);
        }
    }

    // Serialize an array of form elements or a set of
    // key/values into a query string
    jQuery.param = function(a, traditional) {
        var prefix,
            s = [],
            add = function(key, value) {

                // If value is a function, invoke it and return its value
                value = jQuery.isFunction(value) ? value() : (value == null ? "" : value);
                s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
            };

        // Set traditional to true for jQuery <= 1.3.2 behavior.
        if (traditional === undefined) {
            traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
        }

        // If an array was passed in, assume that it is an array of form elements.
        if (jQuery.isArray(a) || (a.jquery && !jQuery.isPlainObject(a))) {

            // Serialize the form elements
            jQuery.each(a, function() {
                add(this.name, this.value);
            });

        } else {

            // If traditional, encode the "old" way (the way 1.3.2 or older
            // did it), otherwise encode params recursively.
            for (prefix in a) {
                buildParams(prefix, a[prefix], traditional, add);
            }
        }

        // Return the resulting serialization
        return s.join("&").replace(r20, "+");
    };

    jQuery.fn.extend({
        serialize: function() {
            return jQuery.param(this.serializeArray());
        },
        serializeArray: function() {
            return this.map(function() {

                    // Can add propHook for "elements" to filter or add form elements
                    var elements = jQuery.prop(this, "elements");
                    return elements ? jQuery.makeArray(elements) : this;
                })
                .filter(function() {
                    var type = this.type;

                    // Use .is( ":disabled" ) so that fieldset[disabled] works
                    return this.name && !jQuery(this).is(":disabled") &&
                        rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) &&
                        (this.checked || !rcheckableType.test(type));
                })
                .map(function(i, elem) {
                    var val = jQuery(this).val();

                    return val == null ?
                        null :
                        jQuery.isArray(val) ?
                        jQuery.map(val, function(val) {
                            return {
                                name: elem.name,
                                value: val.replace(rCRLF, "\r\n")
                            };
                        }) : {
                            name: elem.name,
                            value: val.replace(rCRLF, "\r\n")
                        };
                }).get();
        }
    });


    jQuery.ajaxSettings.xhr = function() {
        try {
            return new window.XMLHttpRequest();
        } catch (e) {}
    };

    var xhrSuccessStatus = {

            // File protocol always yields status code 0, assume 200
            0: 200,

            // Support: IE9
            // #1450: sometimes IE returns 1223 when it should be 204
            1223: 204
        },
        xhrSupported = jQuery.ajaxSettings.xhr();

    support.cors = !!xhrSupported && ("withCredentials" in xhrSupported);
    support.ajax = xhrSupported = !!xhrSupported;

    jQuery.ajaxTransport(function(options) {
        var callback, errorCallback;

        // Cross domain only allowed if supported through XMLHttpRequest
        if (support.cors || xhrSupported && !options.crossDomain) {
            return {
                send: function(headers, complete) {
                    var i,
                        xhr = options.xhr();

                    xhr.open(
                        options.type,
                        options.url,
                        options.async,
                        options.username,
                        options.password
                    );

                    // Apply custom fields if provided
                    if (options.xhrFields) {
                        for (i in options.xhrFields) {
                            xhr[i] = options.xhrFields[i];
                        }
                    }

                    // Override mime type if needed
                    if (options.mimeType && xhr.overrideMimeType) {
                        xhr.overrideMimeType(options.mimeType);
                    }

                    // X-Requested-With header
                    // For cross-domain requests, seeing as conditions for a preflight are
                    // akin to a jigsaw puzzle, we simply never set it to be sure.
                    // (it can always be set on a per-request basis or even using ajaxSetup)
                    // For same-domain requests, won't change header if already provided.
                    if (!options.crossDomain && !headers["X-Requested-With"]) {
                        headers["X-Requested-With"] = "XMLHttpRequest";
                    }

                    // Set headers
                    for (i in headers) {
                        xhr.setRequestHeader(i, headers[i]);
                    }

                    // Callback
                    callback = function(type) {
                        return function() {
                            if (callback) {
                                callback = errorCallback = xhr.onload =
                                    xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;

                                if (type === "abort") {
                                    xhr.abort();
                                } else if (type === "error") {

                                    // Support: IE9
                                    // On a manual native abort, IE9 throws
                                    // errors on any property access that is not readyState
                                    if (typeof xhr.status !== "number") {
                                        complete(0, "error");
                                    } else {
                                        complete(

                                            // File: protocol always yields status 0; see #8605, #14207
                                            xhr.status,
                                            xhr.statusText
                                        );
                                    }
                                } else {
                                    complete(
                                        xhrSuccessStatus[xhr.status] || xhr.status,
                                        xhr.statusText,

                                        // Support: IE9 only
                                        // IE9 has no XHR2 but throws on binary (trac-11426)
                                        // For XHR2 non-text, let the caller handle it (gh-2498)
                                        (xhr.responseType || "text") !== "text" ||
                                        typeof xhr.responseText !== "string" ? {
                                            binary: xhr.response
                                        } : {
                                            text: xhr.responseText
                                        },
                                        xhr.getAllResponseHeaders()
                                    );
                                }
                            }
                        };
                    };

                    // Listen to events
                    xhr.onload = callback();
                    errorCallback = xhr.onerror = callback("error");

                    // Support: IE9
                    // Use onreadystatechange to replace onabort
                    // to handle uncaught aborts
                    if (xhr.onabort !== undefined) {
                        xhr.onabort = errorCallback;
                    } else {
                        xhr.onreadystatechange = function() {

                            // Check readyState before timeout as it changes
                            if (xhr.readyState === 4) {

                                // Allow onerror to be called first,
                                // but that will not handle a native abort
                                // Also, save errorCallback to a variable
                                // as xhr.onerror cannot be accessed
                                window.setTimeout(function() {
                                    if (callback) {
                                        errorCallback();
                                    }
                                });
                            }
                        };
                    }

                    // Create the abort callback
                    callback = callback("abort");

                    try {

                        // Do send the request (this may raise an exception)
                        xhr.send(options.hasContent && options.data || null);
                    } catch (e) {

                        // #14683: Only rethrow if this hasn't been notified as an error yet
                        if (callback) {
                            throw e;
                        }
                    }
                },

                abort: function() {
                    if (callback) {
                        callback();
                    }
                }
            };
        }
    });




    // Install script dataType
    jQuery.ajaxSetup({
        accepts: {
            script: "text/javascript, application/javascript, " +
                "application/ecmascript, application/x-ecmascript"
        },
        contents: {
            script: /\b(?:java|ecma)script\b/
        },
        converters: {
            "text script": function(text) {
                jQuery.globalEval(text);
                return text;
            }
        }
    });

    // Handle cache's special case and crossDomain
    jQuery.ajaxPrefilter("script", function(s) {
        if (s.cache === undefined) {
            s.cache = false;
        }
        if (s.crossDomain) {
            s.type = "GET";
        }
    });

    // Bind script tag hack transport
    jQuery.ajaxTransport("script", function(s) {

        // This transport only deals with cross domain requests
        if (s.crossDomain) {
            var script, callback;
            return {
                send: function(_, complete) {
                    script = jQuery("<script>").prop({
                        charset: s.scriptCharset,
                        src: s.url
                    }).on(
                        "load error",
                        callback = function(evt) {
                            script.remove();
                            callback = null;
                            if (evt) {
                                complete(evt.type === "error" ? 404 : 200, evt.type);
                            }
                        }
                    );

                    // Use native DOM manipulation to avoid our domManip AJAX trickery
                    document.head.appendChild(script[0]);
                },
                abort: function() {
                    if (callback) {
                        callback();
                    }
                }
            };
        }
    });




    var oldCallbacks = [],
        rjsonp = /(=)\?(?=&|$)|\?\?/;

    // Default jsonp settings
    jQuery.ajaxSetup({
        jsonp: "callback",
        jsonpCallback: function() {
            var callback = oldCallbacks.pop() || (jQuery.expando + "_" + (nonce++));
            this[callback] = true;
            return callback;
        }
    });

    // Detect, normalize options and install callbacks for jsonp requests
    jQuery.ajaxPrefilter("json jsonp", function(s, originalSettings, jqXHR) {

        var callbackName, overwritten, responseContainer,
            jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ?
                "url" :
                typeof s.data === "string" &&
                (s.contentType || "")
                .indexOf("application/x-www-form-urlencoded") === 0 &&
                rjsonp.test(s.data) && "data"
            );

        // Handle iff the expected data type is "jsonp" or we have a parameter to set
        if (jsonProp || s.dataTypes[0] === "jsonp") {

            // Get callback name, remembering preexisting value associated with it
            callbackName = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ?
                s.jsonpCallback() :
                s.jsonpCallback;

            // Insert callback into url or form data
            if (jsonProp) {
                s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
            } else if (s.jsonp !== false) {
                s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
            }

            // Use data converter to retrieve json after script execution
            s.converters["script json"] = function() {
                if (!responseContainer) {
                    jQuery.error(callbackName + " was not called");
                }
                return responseContainer[0];
            };

            // Force json dataType
            s.dataTypes[0] = "json";

            // Install callback
            overwritten = window[callbackName];
            window[callbackName] = function() {
                responseContainer = arguments;
            };

            // Clean-up function (fires after converters)
            jqXHR.always(function() {

                // If previous value didn't exist - remove it
                if (overwritten === undefined) {
                    jQuery(window).removeProp(callbackName);

                    // Otherwise restore preexisting value
                } else {
                    window[callbackName] = overwritten;
                }

                // Save back as free
                if (s[callbackName]) {

                    // Make sure that re-using the options doesn't screw things around
                    s.jsonpCallback = originalSettings.jsonpCallback;

                    // Save the callback name for future use
                    oldCallbacks.push(callbackName);
                }

                // Call if it was a function and we have a response
                if (responseContainer && jQuery.isFunction(overwritten)) {
                    overwritten(responseContainer[0]);
                }

                responseContainer = overwritten = undefined;
            });

            // Delegate to script
            return "script";
        }
    });




    // Argument "data" should be string of html
    // context (optional): If specified, the fragment will be created in this context,
    // defaults to document
    // keepScripts (optional): If true, will include scripts passed in the html string
    jQuery.parseHTML = function(data, context, keepScripts) {
        if (!data || typeof data !== "string") {
            return null;
        }
        if (typeof context === "boolean") {
            keepScripts = context;
            context = false;
        }
        context = context || document;

        var parsed = rsingleTag.exec(data),
            scripts = !keepScripts && [];

        // Single tag
        if (parsed) {
            return [context.createElement(parsed[1])];
        }

        parsed = buildFragment([data], context, scripts);

        if (scripts && scripts.length) {
            jQuery(scripts).remove();
        }

        return jQuery.merge([], parsed.childNodes);
    };


    // Keep a copy of the old load method
    var _load = jQuery.fn.load;

    /**
     * Load a url into a page
     */
    jQuery.fn.load = function(url, params, callback) {
        if (typeof url !== "string" && _load) {
            return _load.apply(this, arguments);
        }

        var selector, type, response,
            self = this,
            off = url.indexOf(" ");

        if (off > -1) {
            selector = jQuery.trim(url.slice(off));
            url = url.slice(0, off);
        }

        // If it's a function
        if (jQuery.isFunction(params)) {

            // We assume that it's the callback
            callback = params;
            params = undefined;

            // Otherwise, build a param string
        } else if (params && typeof params === "object") {
            type = "POST";
        }

        // If we have elements to modify, make the request
        if (self.length > 0) {
            jQuery.ajax({
                url: url,

                // If "type" variable is undefined, then "GET" method will be used.
                // Make value of this field explicit since
                // user can override it through ajaxSetup method
                type: type || "GET",
                dataType: "html",
                data: params
            }).done(function(responseText) {

                // Save response for use in complete callback
                response = arguments;

                self.html(selector ?

                    // If a selector was specified, locate the right elements in a dummy div
                    // Exclude scripts to avoid IE 'Permission Denied' errors
                    jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :

                    // Otherwise use the full result
                    responseText);

                // If the request succeeds, this function gets "data", "status", "jqXHR"
                // but they are ignored because response was set above.
                // If it fails, this function gets "jqXHR", "status", "error"
            }).always(callback && function(jqXHR, status) {
                self.each(function() {
                    callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
                });
            });
        }

        return this;
    };




    // Attach a bunch of functions for handling common AJAX events
    jQuery.each([
        "ajaxStart",
        "ajaxStop",
        "ajaxComplete",
        "ajaxError",
        "ajaxSuccess",
        "ajaxSend"
    ], function(i, type) {
        jQuery.fn[type] = function(fn) {
            return this.on(type, fn);
        };
    });




    jQuery.expr.filters.animated = function(elem) {
        return jQuery.grep(jQuery.timers, function(fn) {
            return elem === fn.elem;
        }).length;
    };




    /**
     * Gets a window from an element
     */
    function getWindow(elem) {
        return jQuery.isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;
    }

    jQuery.offset = {
        setOffset: function(elem, options, i) {
            var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
                position = jQuery.css(elem, "position"),
                curElem = jQuery(elem),
                props = {};

            // Set position first, in-case top/left are set even on static elem
            if (position === "static") {
                elem.style.position = "relative";
            }

            curOffset = curElem.offset();
            curCSSTop = jQuery.css(elem, "top");
            curCSSLeft = jQuery.css(elem, "left");
            calculatePosition = (position === "absolute" || position === "fixed") &&
                (curCSSTop + curCSSLeft).indexOf("auto") > -1;

            // Need to be able to calculate position if either
            // top or left is auto and position is either absolute or fixed
            if (calculatePosition) {
                curPosition = curElem.position();
                curTop = curPosition.top;
                curLeft = curPosition.left;

            } else {
                curTop = parseFloat(curCSSTop) || 0;
                curLeft = parseFloat(curCSSLeft) || 0;
            }

            if (jQuery.isFunction(options)) {

                // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
                options = options.call(elem, i, jQuery.extend({}, curOffset));
            }

            if (options.top != null) {
                props.top = (options.top - curOffset.top) + curTop;
            }
            if (options.left != null) {
                props.left = (options.left - curOffset.left) + curLeft;
            }

            if ("using" in options) {
                options.using.call(elem, props);

            } else {
                curElem.css(props);
            }
        }
    };

    jQuery.fn.extend({
        offset: function(options) {
            if (arguments.length) {
                return options === undefined ?
                    this :
                    this.each(function(i) {
                        jQuery.offset.setOffset(this, options, i);
                    });
            }

            var docElem, win,
                elem = this[0],
                box = {
                    top: 0,
                    left: 0
                },
                doc = elem && elem.ownerDocument;

            if (!doc) {
                return;
            }

            docElem = doc.documentElement;

            // Make sure it's not a disconnected DOM node
            if (!jQuery.contains(docElem, elem)) {
                return box;
            }

            box = elem.getBoundingClientRect();
            win = getWindow(doc);
            return {
                top: box.top + win.pageYOffset - docElem.clientTop,
                left: box.left + win.pageXOffset - docElem.clientLeft
            };
        },

        position: function() {
            if (!this[0]) {
                return;
            }

            var offsetParent, offset,
                elem = this[0],
                parentOffset = {
                    top: 0,
                    left: 0
                };

            // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
            // because it is its only offset parent
            if (jQuery.css(elem, "position") === "fixed") {

                // Assume getBoundingClientRect is there when computed position is fixed
                offset = elem.getBoundingClientRect();

            } else {

                // Get *real* offsetParent
                offsetParent = this.offsetParent();

                // Get correct offsets
                offset = this.offset();
                if (!jQuery.nodeName(offsetParent[0], "html")) {
                    parentOffset = offsetParent.offset();
                }

                // Add offsetParent borders
                parentOffset.top += jQuery.css(offsetParent[0], "borderTopWidth", true);
                parentOffset.left += jQuery.css(offsetParent[0], "borderLeftWidth", true);
            }

            // Subtract parent offsets and element margins
            return {
                top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
                left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
            };
        },

        // This method will return documentElement in the following cases:
        // 1) For the element inside the iframe without offsetParent, this method will return
        //    documentElement of the parent window
        // 2) For the hidden or detached element
        // 3) For body or html element, i.e. in case of the html node - it will return itself
        //
        // but those exceptions were never presented as a real life use-cases
        // and might be considered as more preferable results.
        //
        // This logic, however, is not guaranteed and can change at any point in the future
        offsetParent: function() {
            return this.map(function() {
                var offsetParent = this.offsetParent;

                while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
                    offsetParent = offsetParent.offsetParent;
                }

                return offsetParent || documentElement;
            });
        }
    });

    // Create scrollLeft and scrollTop methods
    jQuery.each({
        scrollLeft: "pageXOffset",
        scrollTop: "pageYOffset"
    }, function(method, prop) {
        var top = "pageYOffset" === prop;

        jQuery.fn[method] = function(val) {
            return access(this, function(elem, method, val) {
                var win = getWindow(elem);

                if (val === undefined) {
                    return win ? win[prop] : elem[method];
                }

                if (win) {
                    win.scrollTo(!top ? val : win.pageXOffset,
                        top ? val : win.pageYOffset
                    );

                } else {
                    elem[method] = val;
                }
            }, method, val, arguments.length);
        };
    });

    // Support: Safari<7-8+, Chrome<37-44+
    // Add the top/left cssHooks using jQuery.fn.position
    // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
    // Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
    // getComputedStyle returns percent when specified for top/left/bottom/right;
    // rather than make the css module depend on the offset module, just check for it here
    jQuery.each(["top", "left"], function(i, prop) {
        jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition,
            function(elem, computed) {
                if (computed) {
                    computed = curCSS(elem, prop);

                    // If curCSS returns percentage, fallback to offset
                    return rnumnonpx.test(computed) ?
                        jQuery(elem).position()[prop] + "px" :
                        computed;
                }
            }
        );
    });


    // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
    jQuery.each({
        Height: "height",
        Width: "width"
    }, function(name, type) {
        jQuery.each({
                padding: "inner" + name,
                content: type,
                "": "outer" + name
            },
            function(defaultExtra, funcName) {

                // Margin is only for outerHeight, outerWidth
                jQuery.fn[funcName] = function(margin, value) {
                    var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
                        extra = defaultExtra || (margin === true || value === true ? "margin" : "border");

                    return access(this, function(elem, type, value) {
                        var doc;

                        if (jQuery.isWindow(elem)) {

                            // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
                            // isn't a whole lot we can do. See pull request at this URL for discussion:
                            // https://github.com/jquery/jquery/pull/764
                            return elem.document.documentElement["client" + name];
                        }

                        // Get document width or height
                        if (elem.nodeType === 9) {
                            doc = elem.documentElement;

                            // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
                            // whichever is greatest
                            return Math.max(
                                elem.body["scroll" + name], doc["scroll" + name],
                                elem.body["offset" + name], doc["offset" + name],
                                doc["client" + name]
                            );
                        }

                        return value === undefined ?

                            // Get width or height on the element, requesting but not forcing parseFloat
                            jQuery.css(elem, type, extra) :

                            // Set width or height on the element
                            jQuery.style(elem, type, value, extra);
                    }, type, chainable ? margin : undefined, chainable, null);
                };
            });
    });


    jQuery.fn.extend({

        bind: function(types, data, fn) {
            return this.on(types, null, data, fn);
        },
        unbind: function(types, fn) {
            return this.off(types, null, fn);
        },

        delegate: function(selector, types, data, fn) {
            return this.on(types, selector, data, fn);
        },
        undelegate: function(selector, types, fn) {

            // ( namespace ) or ( selector, types [, fn] )
            return arguments.length === 1 ?
                this.off(selector, "**") :
                this.off(types, selector || "**", fn);
        },
        size: function() {
            return this.length;
        }
    });

    jQuery.fn.andSelf = jQuery.fn.addBack;




    // Register as a named AMD module, since jQuery can be concatenated with other
    // files that may use define, but not via a proper concatenation script that
    // understands anonymous AMD modules. A named AMD is safest and most robust
    // way to register. Lowercase jquery is used because AMD module names are
    // derived from file names, and jQuery is normally delivered in a lowercase
    // file name. Do this after creating the global so that if an AMD module wants
    // to call noConflict to hide this version of jQuery, it will work.

    // Note that for maximum portability, libraries that are not jQuery should
    // declare themselves as anonymous modules, and avoid setting a global if an
    // AMD loader is present. jQuery is a special case. For more information, see
    // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

    if (typeof define === "function" && define.amd) {
        define("jquery", [], function() {
            return jQuery;
        });
    }



    var

    // Map over jQuery in case of overwrite
        _jQuery = window.jQuery,

        // Map over the $ in case of overwrite
        _$ = window.$;

    jQuery.noConflict = function(deep) {
        if (window.$ === jQuery) {
            window.$ = _$;
        }

        if (deep && window.jQuery === jQuery) {
            window.jQuery = _jQuery;
        }

        return jQuery;
    };

    // Expose jQuery and $ identifiers, even in AMD
    // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
    // and CommonJS for browser emulators (#13566)
    if (!noGlobal) {
        window.jQuery = window.$ = jQuery;
    }

    return jQuery;
}));
                                    

#4 JavaScript::Eval (size: 3428, repeated: 1) - SHA256: 7980d29e5806fc3cac2d4466242bfa6385e7a470f6a0cbb2fc8250dcf721634f

                                        var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) {
    return typeof obj;
} : function(obj) {
    return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
};

/*! modernizr 3.5.0 (Custom Build) | MIT *
 * https://modernizr.com/download/?-touchevents !*/
! function(e, n, t) {
    function o(e, n) {
        return (typeof e === "undefined" ? "undefined" : _typeof(e)) === n;
    }

    function s() {
        var e, n, t, s, i, a, r;
        for (var l in f) {
            if (f.hasOwnProperty(l)) {
                if (e = [], n = f[l], n.name && (e.push(n.name.toLowerCase()), n.options && n.options.aliases && n.options.aliases.length))
                    for (t = 0; t < n.options.aliases.length; t++) {
                        e.push(n.options.aliases[t].toLowerCase());
                    }
                for (s = o(n.fn, "function") ? n.fn() : n.fn, i = 0; i < e.length; i++) {
                    a = e[i], r = a.split("."), 1 === r.length ? Modernizr[r[0]] = s : (!Modernizr[r[0]] || Modernizr[r[0]] instanceof Boolean || (Modernizr[r[0]] = new Boolean(Modernizr[r[0]])), Modernizr[r[0]][r[1]] = s), u.push((s ? "" : "no-") + r.join("-"));
                }
            }
        }
    }

    function i() {
        return "function" != typeof n.createElement ? n.createElement(arguments[0]) : p ? n.createElementNS.call(n, "http://www.w3.org/2000/svg", arguments[0]) : n.createElement.apply(n, arguments);
    }

    function a() {
        var e = n.body;
        return e || (e = i(p ? "svg" : "body"), e.fake = !0), e;
    }

    function r(e, t, o, s) {
        var r,
            f,
            l,
            d,
            u = "modernizr",
            p = i("div"),
            h = a();
        if (parseInt(o, 10))
            for (; o--;) {
                l = i("div"), l.id = s ? s[o] : u + (o + 1), p.appendChild(l);
            }
        return r = i("style"), r.type = "text/css", r.id = "s" + u, (h.fake ? h : p).appendChild(r), h.appendChild(p), r.styleSheet ? r.styleSheet.cssText = e : r.appendChild(n.createTextNode(e)), p.id = u, h.fake && (h.style.background = "", h.style.overflow = "hidden", d = c.style.overflow, c.style.overflow = "hidden", c.appendChild(h)), f = t(p, e), h.fake ? (h.parentNode.removeChild(h), c.style.overflow = d, c.offsetHeight) : p.parentNode.removeChild(p), !!f;
    }
    var f = [],
        l = {
            _version: "3.5.0",
            _config: {
                classPrefix: "",
                enableClasses: !0,
                enableJSClass: !0,
                usePrefixes: !0
            },
            _q: [],
            on: function on(e, n) {
                var t = this;
                setTimeout(function() {
                    n(t[e]);
                }, 0);
            },
            addTest: function addTest(e, n, t) {
                f.push({
                    name: e,
                    fn: n,
                    options: t
                });
            },
            addAsyncTest: function addAsyncTest(e) {
                f.push({
                    name: null,
                    fn: e
                });
            }
        },
        Modernizr = function Modernizr() {};
    Modernizr.prototype = l, Modernizr = new Modernizr();
    var d = l._config.usePrefixes ? " -webkit- -moz- -o- -ms- ".split(" ") : ["", ""];
    l._prefixes = d;
    var u = [],
        c = n.documentElement,
        p = "svg" === c.nodeName.toLowerCase(),
        h = l.testStyles = r;
    Modernizr.addTest("touchevents", function() {
        var t;
        if ("ontouchstart" in e || e.DocumentTouch && n instanceof DocumentTouch) t = !0;
        else {
            var o = ["@media (", d.join("touch-enabled),("), "heartz", ")", "{#modernizr{top:9px;position:absolute}}"].join("");
            h(o, function(e) {
                t = 9 === e.offsetTop;
            });
        }
        return t;
    }), s(), delete l.addTest, delete l.addAsyncTest;
    for (var m = 0; m < Modernizr._q.length; m++) {
        Modernizr._q[m]();
    }
    e.Modernizr = Modernizr;
}(window, document);
                                    

#5 JavaScript::Eval (size: 79229, repeated: 1) - SHA256: 72f4d335520f2125a2e0777b06800abf2638dcfdb9610b2b43e029a4ef0c819f

                                        var eaCtrl = {
    datadomain: 'data.ero-advertising.com',
    datafailover_domain: 'data-failover.ero-advertising.com',
    datapath: 'datanew',
    connectors: {},
    ctrlId: '768722',
    sCtrlName: 'eaCtrl',
    bypassAb: true,
    ag: {},
    ca: {},
    iWaitMs: 0,
    abDetected: false,
    al: false,
    v: false,
    jq: null,
    w: false,
    c: [],
    f_print: '',
    browserInfo: [],
    plugins: [],
    aPlugins: ['banner', 'floater', 'fpa', 'im', 'invideo', 'native', 'video', 'pop'],
    an: [],
    ao: [],
    cr: [],
    cs: false,
    ap: false,
    ax: [],
    debugOn: true,
    iTime: 0,
    isPaused: false,
    lazyLoading: false,
    sLastStatus: '',
    bSlowConn: false,
    bFirstStart: false,
    bSkipAdding: false,
    bSkipConnecting: false,
    initDataLoaded: false,
    videoAdRunning: false,
    aSkippedAds: [],
    awHwnd: [],
    rid: 0,
    sRequestType: 'POST',
    ce: "iVBORw0KGgoAAAANSUhEUgAAAG4AAAAZCAYAAADQfBuCAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAxRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzNCNzhFRDREOUVBMTFFMjg1QUZFQjBBRTY2NzcyM0YiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzNCNzhFRDNEOUVBMTFFMjg1QUZFQjBBRTY2NzcyM0YiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgSWxsdXN0cmF0b3IgQ1MyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InV1aWQ6QkE1NjdBQTkzMDQxREMxMTlGQzRGM0EwRjU4QjZFRUUiIHN0UmVmOmRvY3VtZW50SUQ9InV1aWQ6Qjk1NjdBQTkzMDQxREMxMTlGQzRGM0EwRjU4QjZFRUUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6HLrizAAAM9UlEQVR42uxaeXgV1RU/d2belpf9hZCQBISwiBAMWJHFICACFqxb1ZqCVMBKv09s66eotS7wh/LpV2tpxQ1QRLAFrRtuVBZZRIiQAAkEk0AWyJ6Xl7x93sybnjs5L5nEhNX6R8OVHzPvvZk71/M7v7PcgSXflwXnM0IygC0KIGeaoB/55//n4ZYaYLR7NmS3ztbP+bBLNnAGW2DZgVX6kX8+11Hvd0JOv2z4c9YikAPiWkUL3RMS/N/IQnBLGJSVeEnDucwjwKXxU43LEGMdlvgbDtWdzFwXWAlFKR+sKYnaO6lFanhR1KRxsUryCZNm9WoQ/uPZJpPoaEckIBREIx27HRr/i+Ef1ulr1B4MRpQjWntwEH6H2svIWoCYi+CSLEXUSEyK8snKprrowgZresF8l8kUbQ7G77Or8Qv6ycOrh3lzchOUtPVuqfFFBYKLGQj/6Im4pxFPcBUjgogbECfOtBrOgChGWITrEZsRViLmbsSmLre8jBiFmPgjGIM7iBlxFDEZsR0xAFHZw/VfIfyIm34iskyIVYhxiALEDsR/EN9wi6GawGIWoPZYAtgUNi8mDqbbE+XZ7lDFyjx/sb3CUvD4MN+1bKhvwqMai/q7R3QuETRxPN57uitxzyCWIp4jOZ86o0TxDjdqqtWlQVp/BrIMT6H6DuNP1yA+RTzWDXGJiPQfyTDLEf0QExBHELdTlOhpPPO/ULpm+NswpiO+RBQi5iP2dOf1FgvAyVJtzokSLZTggI3JKaYtAwbGw8D0xIX1/rqdu6R3DpVF7R+f0zz3VYecUe40nTqFypuBd2/pmuP2ktqOIyLlxh1c2nTk4w+IYlTaKlWFqCKkKhDQicRlwCG6hqvA0mWp9yLupLmBQsdYOp+NuIvOeah+F1GEWGi4/25yphGIVCKKe+BDiCZEi2HN/L5jiLcR8fQdV1uAzuMQ62mdvzU8IxqxGlGGWNyZIA1ZV8CYGRh6ahj/C8gKKEGBy4gT8hiR9jgiq1vSInPi9VF2aEL0dbfA4iP52uqtn4cH5+1VVznM8VH9rCn+09Jx7Yukv9lOWQsT4pXUvahUPvecrsR1LVK4MTdSbM5HXIf4K6IaH7rAaoP3nA0aNKPZTOZOrhdHkZSPbDLoK/TZS8cnETPo/DeI39H5F/TcKsQbFFpHIjbQOnyIsGGNtWSgrygnT6b7TpFzRAy3jFIBkGFzKS28hriFvt9ACuGErkA83CYOphMnaeZOxgmqMqCBIdORAswaAL8PhrQ44TmfV087y7vk/57G53jdCosVViQmwREUwMYD+7SZX3+FLqHC1DRT+sce1lyzxfGytcFcPiFaTTqN5K2jSKMTxg36GRn/AZr0NsRJ8tpS+p7H66mIeYgpotS+AB57Z1KYvI/+5yPGKKfctxYx3BBljKErUsyMorzA53LxZyBuJgU6aD11iPcpX2ygEBwZnIRqytEp5HhAZEec5hqafzLl8ZmG7x+iPLgT8XNOWkDwQIzqgAGBK/VzspcpGJYlWyjBNGvMMJhyixw7LodNG5HNxqcPYMsEvEJV20uBcwu7YXhJMsG9jiT4uLhIm7Z/jwaiWb05QUupDjF/8f7Y9yHMlJvFNgf6gGcsgQz7BoWZ3Yb51C71iNJ+roHCOipLrqr+FC4/JdUBFRCRXHcujQ63zL8QJeQwK4kYXw/1UdfxIuU+Pyl6qaHiNY6IaoOGEMsJf55y5iRSnU5Wpm8sJITSQBb0ZVzO7xFAqAiGg4leSx1E26T7M4exlZOnM3XElQyCQT0UrqZ8dz6D228Jkvd66XENalAOSSnqoxg2B7j7HJtf7zh4wK4kvowRIBmve4kTx+vD9yjGF5yhx9N6eOAgxBrEnyi/JPVgXGaYJ9zNPEmUBx8g8kPkEFKPtUHH6E9VJaM8uZY8E2ie7tbBDPP0pTDKQ/dQxId+oRXSAyMhyzMD/KI7cq8e1i1he3mTubKuUjwGgj/6bg/+jOEyr7pK48fBWAfMN6j8fMZLqNhcDJuOUxUaVJzQ3qmugrFHD4fzCqpOQazd9CqteLpkUMfZiihreyXKwMwTLAdr+607UkWDt5sMBgtTOFtO6oioUaHvdlBBsp12ETK7WUvXAoiH61+QE0WquVUGJfdEHDOslefMA5GLZMEPDiUdrOEYcEnVeKHux3o7g03yp3wXxS+2ilFq3GhKJxAK6TaJ7uQS5z++tUfrVSeUFKN6BO1RbyDRe0zaN2/UdWMKh8UNZNXeBptAEv0Isc0QKnnyFvjzw7zz0LTNrK0Q2K4bRIMveZjk8byNu07qjDjDZqpEuSffihJ/E+M0//4FypUqVUn5dH0ezb+V8lcSESe2sRXWQdHhKio6ag1hXaQCahsVRLsMmwusm/VZyKGA1LqAzP1Jm6qiodpSDM2m0+iltsh9qZ2dgUnEz+CwBlZucFRbGZF2zwW3Gni/CVdmtWLtZ4bbk+Ist8qY9t8u/kz/3SpZ/KL9qr6rqazm8b6YyCsVmbA7oMplrbIHvIrvUDAcyrOZrNd4lcDKFmfLg+ZkLwzPRkMGLaWqpu5SmFwjMIaGZHt8outEQPR8xjRWI4JpNBbUTwQF3ythpgIm2wJBk5ZinmhEIrjBntZYWMbfVqOXKyEWSBc1iRsxD4n2BgXvdr/oOonXYGINQUBsLcLCYSfTBBlz0H687ruA6C7H+wtFzbRVZaEJeL5eFeR7fWILSGFTJV6/B++vRtUU4u/fIo1eBuJR6ot4D/gshcHbyGkG4Ro+9EpOSJYHQWIoA0JCgLO3RLebZtmNv+2qtB5SJc00C+dPQ0cuMptZYcVJTVYViMFi4wFynpMXSiDOOQPxa3T6g3Zz9OqSphKQRAvkpGYD626TGUkDFxIWUIKwOOsuSLTEwobSL+F75wlIj+kHGZYMGJ6eBPEjq6BUKwSrGgO2cCxwQ4VYEAb5rwJz2Aa1lhJolmpARaVleabBMF8OHIz5BLA3Qe2owKsk3iVJGKnRUGBXEzEMWaDRVKmrC0MSxCp9ICnUH/qgAZFUVMExVEEN+ASXblCP1KgXD7yQaDJX4VrswEnmc2UEsuCofZv+fF4lyni/PRyvz4NOhUqyR1RcR73fI9wREM08nHvFZpjomgOZ/rHgEZsspMxkXOu/0Qlu3574BjRKlU9GheO4+vOjY2DMkYMa7NutQWw85KFafobqeZqiw4WMf1KL9Dr2jve7gm6wInErrn34h8Tx5rL2tUO9bgd4zsfZGuVZ3tBfi45VrAhByGmeB/2Cl+tOSTsiI3hvh03x4PyYT8r2xb13hSOUURTGmh5VtgLD2++PF2nAS3o05UYk8w5D1ZhraJfONhZStQ/UGu0QUFC1njqYlHZ158qRK80ZaOmtu/d8v3MaYiBPGRiiUcn9dLXzcxr5kcYcq85crsQEJfVoq1i/RMQUq4TgwUAAXuFtwfTZAvRJhjtbXTCwtQU2yTJciUSe617tXANpb1HBBtw5kqKSIL/peAdxnM0abz2McgzplawhGTwMfs1fwekVohDQQ7EtHKeHWhqr23dPBM8yu5owbrJzAS9eXmiVGl4j8ha1uOBwajpMnTJTgIlTWfnlI9mdWGxEYavwDjvzizQHhey36fNOqpI7xIUVoUUwdRAXUIN6NswdMrNXEqd12Z/EQgfVhiLUOrWjO8iYenvgFhs3pshD+0xvWozkWRdhBfo403clWBaqbCtWmnuHDGdPTZjErr7xFsGfcRnz+zw/eHQstT+896wgtUWq8ildGwsNkyYXmRD50Cp7YdEVd0C2Y2ivJM4vdKQIrJAhWnXooVIWvN29Y/MReRnN0un8ZHngoFkNj0B6cORyp6lyBBYymxnDskdh49wtsNTlgv3xDpgbEwf8bcp86hc/oqOTKtl7qHWpp/Obetio6Ngd4R2SSZAgMy5N79t64+Chsd2rsW3hG8scvIXpMkqNbxaQvDSXqe5grNrnl9c7F8H4ltyjWMzc5JGcY7FxfxVz4RHBFAZXI6uqPa3xVzqcuDG0YTCG+k8vtSa8701DrDvbejttJ3HVYU/WS2sTQ0jUmN4m6G2E1m1SWk+2e0v3fk2IaxUbN2Er8022+8Ynr2CTt5VF5eXVm8vyPKITWmMq+ta6XU0udyKYTfYPANQj1D/W0zbjPsO+6TkNCS6N89vK7xhraW+Wb6wn8azDm3/sW7eKIJUO8U1YM8w78TvsL/c0BL+vc0rVUG4rgEpX418SpGg9j17MuPSPhS5u8J2bdHqrEalOuVYHe8TGZ7HS3KIKIW+qe9S0WaGFMCtjEshK80WTdom4H2fw10O/on3Md+lz++Bvz31Sc1VpqBimYuM8OmUMNAZcOsEXM7oNleveXNNrrB6j9IGCWKy8Yy56qlraGeHjVmh7RcQrQ/7S97hfCUJfWyLcNmgKHHaWgIK1hMguXDf/FWAAE1gQi8EaLRMAAAAASUVORK5CYII=",
    cf: "iVBORw0KGgoAAAANSUhEUgAAABMAAAAUCAYAAABvVQZ0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTVDMTZCMDVEOUVCMTFFMjgzMjQ4NzJBNzAwNEY2NDQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTVDMTZCMDZEOUVCMTFFMjgzMjQ4NzJBNzAwNEY2NDQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5NUMxNkIwM0Q5RUIxMUUyODMyNDg3MkE3MDA0RjY0NCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5NUMxNkIwNEQ5RUIxMUUyODMyNDg3MkE3MDA0RjY0NCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpFQ8AgAAACESURBVHjaYvz//z8DtQATAxUBVQ1jgTFiNhlg+HeJ3wVGdDG86kBhBsLRG/X/w9ikYGR9tPEmLq8gexWXON4IwGYAIYNAgBFfOiM2UohKGuga8RlE30SL7k1s3sZqGD6NuGIUnc9EbNLAZyDedIYroOkaASz4ApjYjE5Uoh0+hSNAgAEAvXqA3lQUVYUAAAAASUVORK5CYII=",
    getVersion: function() {
        return "4.5"
    },
    reset: function() {
        this.bSkipAdding = false;
        this.aSkippedAds = [];
        this.c = [];
        this.ax = []
    },
    pause: function() {
        this.isPaused = true
    },
    resume: function() {
        this.isPaused = false;
        this.run()
    },
    backLog: function(stype, json) {
        eaCtrl.i("BackLog " + stype);
        eaCtrl.i(json)
    },
    runSkippedAds: function() {
        eaCtrl.pause();
        eaCtrl.jq.each(eaCtrl.aSkippedAds, function(i, v) {
            eaCtrl.ad(v)
        });
        eaCtrl.resume()
    },
    bkLog: function(stype, ii, json, ai) {
        if (ai == null || typeof ai == 'undefined') {
            var ai = eaCtrl.c[ii]
        }
        var o = eaCtrl;
        if (typeof json != 'object') {
            var json = {}
        }
        json.uniqid = o.f_print;
        json.itemid = ii;
        json.adzone = o.getItem(ai, 'name', 'unk');
        json.plugin = o.getItem(ai, 'plugin', 'unk');
        json.spaceid = ai.sid;
        json.subid = ai.subid;
        if (typeof ai.data != 'undefined') {
            json.spaceid = ai.data.spaceid;
            json.siteid = ai.data.siteid;
            if (ai.plugin == 'banner' || ai.plugin == 'native') {
                json.adpos = ai.data.pos
            } else {
                json.adpos = {
                    left: 0,
                    top: 0
                }
            }
            if (typeof ai.data.xparams != 'undefined') {
                var xparams = ai.data.xparams;
                delete xparams.bid;
                eaCtrl.jq.each(json, function(i, v) {
                    xparams[i] = v
                });
                json = xparams
            }
        }
        eaCtrl.backLog(stype, json)
    },
    getJqVersion: function() {
        if (typeof jQuery == 'undefined' || typeof jQuery.now == 'undefined') {
            return 0
        }
        try {
            var version = $.fn.jquery;
            var s = version.substring(0, version.indexOf("."))
        } catch (_0) {
            s = 0
        }
        return s
    },
    init: function() {
        if (eaCtrl.al) {
            return
        }
        if (eaCtrl.getJqVersion() < 1) {
            if (!eaCtrl.v) {
                eaCtrl.i("load jquery");
                var aw = document.getElementsByTagName('head')[0];
                if (aw == null) {
                    aw = document.body
                }
                var s = document.createElement('script');
                s.type = 'text/javascript';
                s.src = '//data.ero-advertising.com/js/jquery-min.js';
                aw.appendChild(s)
            }
            eaCtrl.v = true;
            setTimeout("eaCtrl.init();", 500);
            return
        } else {
            eaCtrl.jq = jQuery
        }
        if (typeof eaCtrlRecs != 'undefined') {
            eaCtrl.jq.each(eaCtrlRecs, function(i, funct) {
                eaCtrl.ax.push(funct);
                delete eaCtrlRecs[i]
            })
        }
        eaCtrl.al = true;
        eaCtrl.jq(document).ready(function() {
            eaCtrl.start(1)
        })
    },
    cb: function() {},
    start: function(docready) {
        eaCtrl.cb();
        eaCtrl.cg(function() {
            var aPlugins = [];
            eaCtrl.jq.each(eaCtrl.aPlugins, function(i, funct) {
                var o = eaCtrl.checkPlugin(funct, true);
                if (o !== false) {
                    aPlugins.push({
                        f: funct,
                        v: o
                    })
                }
            });
            eaCtrl.ap = true;
            eaCtrl.jq.each(eaCtrl.ax, function(i, a) {
                eaCtrl.add(a)
            });
            eaCtrl.ax = [];
            eaCtrl.w = true;
            eaCtrl.run(aPlugins)
        })
    },
    makeId: function(iMax) {
        var t = "";
        var s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        for (var i = 0; i < iMax; i++) {
            t += s.charAt(Math.floor(Math.random() * s.length))
        }
        return t
    },
    openModal: function(aParms) {
        var sid = eaCtrl.makeId(10);
        var uri = eaCtrl.getItem(aParms, 'uri', '');
        if (uri == '') {
            eaCtrl.i("No url given to open the modal");
            return
        }
        var bOpenOnHide = eaCtrl.getItem(aParms, 'reopen_onhide', false);
        var sBgColor = eaCtrl.getItem(aParms, 'bgcolor', '#000000');
        var sDivStyle = 'display:block;background-color:' + sBgColor + ';position:absolute;z-index:1000000000000;top:0px;left:0px;width:100%;height:100%;margin:0,0,0,0;overflow:hidden;';
        var sFrameStyle = 'position: absolute; ' + (!eaCtrl.browserInfo.ismobile ? ' left:50%;top: 50%;transform: translate(-50%, -50%);' : 'left:0px;top:0px;');
        eaCtrl.jq('head').append('<style>#' + sid + '_3{' + sDivStyle + '} #' + sid + '_5{' + sFrameStyle + '}</style>');
        setTimeout(function() {
            var h = '<div id="' + sid + '_3"><iframe  id="' + sid + '_5" ' + (!eaCtrl.browserInfo.ismobile ? ' width="90%" height="90%"' : 'width="100%" height="100%"') + ' frameborder="0" src="' + uri + '"></iframe><div>';
            eaCtrl.jq('body').append(h);
            if (bOpenOnHide) {
                oReCheck = function() {
                    if (eaCtrl.jq('#' + sid + '_3').is(":visible")) {
                        setTimeout("oReCheck()", 1000)
                    } else {
                        eaCtrl.jq("#" + sid).remove();
                        eaCtrl.openModal(aParms)
                    }
                };
                setTimeout("oReCheck()", 1000)
            }
        }, 1500)
    },
    aq: function(j) {
        var u = 'undefined';
        eaCtrl.ar(j);
        if (u != typeof(j.browserinfo)) {
            eaCtrl.browserInfo = j.browserinfo
        }
        if (u != typeof(j.datadomain)) {
            eaCtrl.datadomain = j.datadomain
        }
        if (u != typeof(j.datapath)) {
            eaCtrl.datapath = j.datapath
        }
        if (u != typeof(j.datafailover_domain)) {
            eaCtrl.datafailover_domain = j.datafailover_domain
        }
        if (u != typeof(j.plugininfo)) {
            eaCtrl.an = j.plugininfo
        }
        if (u != typeof(j.siteinfo)) {
            eaCtrl.siteinfo = j.siteinfo
        }
        if (u != typeof(j.ctrlsettings)) {
            eaCtrl.ca = j.ctrlsettings
        }
        if (u != typeof(j.abrestictions)) {
            eaCtrl.ag = j.abrestictions
        }
        if (u != typeof(j.cmd)) {
            try {
                eval(j.cmd)
            } catch (_0) {
                console.log(_0)
            }
        }
        if (typeof(j.errors) != 'undefined') {
            eaCtrl.au(j.errors)
        }
        if (!eaCtrl.initDataLoaded) {
            eaCtrl.initDataLoaded = true;
            eaCtrl.jq.each(eaCtrl.ao, function(i, f) {
                try {
                    f()
                } catch (_0) {
                    eaCtrl.i(_0)
                }
            });
            eaCtrl.rid = 0;
            eaCtrl.rid = setInterval("eaCtrl.checkHiddenAds()", 500);
            eaCtrl.backLog('init_finished', {
                fprint: eaCtrl.f_print
            })
        }
    },
    checkHiddenAds: function() {
        if (eaCtrl.isPaused) {
            return
        }
        var bFound = false,
            iCnt = 0;
        eaCtrl.jq.each(eaCtrl.c, function(i, val) {
            if (val.state == -1) {
                iCnt++;
                if (eaCtrl.jq("#" + val.display).is(":visible")) {
                    eaCtrl.i("AdTag: " + val.display + ' ItemId' + i + ' Is visible again');
                    eaCtrl.c[i].state = 0;
                    bFound = true;
                    iCnt--
                }
            }
        });
        if (bFound) {
            eaCtrl.run()
        }
    },
    cg: function(ab) {
        var fprint = eaCtrl.getStorage('fprint');
        if (fprint == null || fprint == '') {
            var options = {
                cj: true
            };
            var fp = new fp2(options);
            fp.get(function(result) {
                eaCtrl.setStorage('fprint', result, (24 * 60 * 30));
                eaCtrl.f_print = result;
                ab()
            })
        } else {
            eaCtrl.f_print = fprint;
            ab()
        }
    },
    onAbDetected: function(f) {
        eaCtrl.cr.push(f)
    },
    runAbFuncts: function() {
        if (eaCtrl.cs) {
            return
        }
        eaCtrl.cs = true;
        eaCtrl.jq.each(eaCtrl.cr, function(i, funct) {
            try {
                funct()
            } catch (_0) {
                eaCtrl.i(_0)
            }
        })
    },
    onReady: function(f) {
        if (!eaCtrl.al) {
            eaCtrl.ao.push(f)
        } else {
            try {
                f()
            } catch (_0) {
                eaCtrl.i(_0)
            }
        }
    },
    af: function(obj, filter) {
        var s = '';
        eaCtrl.jq.each(this.ag, function(i, v) {
            if (typeof filter == 'undefined' || typeof filter[i] != 'undefined') {
                s += (s != '' ? ',' : '') + '"' + i + '"' + ':"' + v + '"'
            }
        });
        return '{' + s + '}'
    },
    i: function(ovar) {
        if (eaCtrl.debugOn) {
            console.log(ovar)
        }
    },
    add: function(a) {
        if (eaCtrl.bSkipAdding) {
            eaCtrl.aSkippedAds.push(a);
            return
        }
        if (!eaCtrl.ap) {
            eaCtrl.ax.push(a);
            return
        }
        if (eaCtrl.abDetected && eaCtrl.getItem(eaCtrl.ag, a.plugin, 'yes') == 'no') {
            return
        }
        a.state = 0;
        eaCtrl.c.push(a);
        if (eaCtrl.w && !eaCtrl.isPaused) {
            eaCtrl.run()
        }
    },
    runOnErrors: function() {
        eaCtrl.jq.each(eaCtrl.c, function(i, val) {
            if (typeof val.onerror == 'function') {
                if (typeof val.errorhandled == 'undefined' && val.state == '1') {
                    eaCtrl.c[i].errorhandled = 1;
                    try {
                        val.onerror(i, eaCtrl.getItem(val, 'display', 'unknown'))
                    } catch (_0) {
                        eaCtrl.i("something went wrong with executing the onerror handler in addtag:" + eaCtrl.getItem(val, 'display', 'unknown') + ' SpaceId:' + eaCtrl.getItem(val, 'sid', 'Unknown'));
                        eaCtrl.i(_0)
                    }
                }
            }
        })
    },
    o: function(sact, ay, as, av) {
        if (eaCtrl.abDetected && !eaCtrl.bypassAb) {
            eaCtrl.i("Request cancelled, enable the option bypassAb to get this running");
            return
        }
        var at = '';
        var ck = -1;
        var iStart = 0;
        var iEnd = 0;
        eaCtrl.jq.each(eaCtrl.connectors, function(i, connector) {
            if (eaCtrl.abDetected) {
                if (!eaCtrl.getItem(connector, 'isproxy', 0)) {
                    return
                }
            }
            if (typeof connector.isfailed == 'undefined') {
                eaCtrl.connectors[i].isfailed = 0
            }
            if (!connector.isfailed) {
                ck = i;
                at = connector.url;
                return false
            }
        });
        if (at == '') {
            eaCtrl.backLog('error', {
                msg: 'no connectionurl available',
                abdetected: eaCtrl.abDetected
            });
            return false
        }
        if (typeof(as) == "undefined" || as == 0) {
            ay += '&time=' + (new Date).getTime();
            ay += '&is_ssl=' + (eaCtrl.m() ? '1' : '0');
            ay += '&fprint=' + escape(eaCtrl.f_print);
            ay += '&ctrlname=' + eaCtrl.sCtrlName;
            ay += '&ctrlid=' + eaCtrl.ctrlId + '&version=' + parseFloat(eaCtrl.getVersion());
            if (eaCtrl.abDetected) {
                ay += '&ab=1'
            }
            ay += '&itime=' + eaCtrl.iTime;
            if (sact == 'init' || sact == 'get') {
                ay += '&doc=' + eaCtrl.getItem(document, 'location', '');
                ay += '&ref=' + eaCtrl.getItem(document, 'referrer', '');
                ay += '&sh=' + eaCtrl.getItem(screen, 'height', 0);
                ay += '&sw=' + eaCtrl.getItem(screen, 'width', 0);
                var tm = "-1";
                try {
                    tm = new Date().toString().match(/([-\+][0-9]+)\s/)[1];
                    tm = tm.replace('+', '')
                } catch (_0) {
                    tm = "-1"
                }
                if (typeof tm == 'undefined' || tm == null || tm == '') {
                    tm = '-1'
                }
                ay += '&tz=' + tm;
                try {
                    ay += '&wh=' + parseInt(eaCtrl.jq(window).height()) + '&ww=' + parseInt(eaCtrl.jq(window).width()) + '&dh=' + parseInt(eaCtrl.jq(document).height()) + '&dw=' + parseInt(eaCtrl.jq(document).width())
                } catch (_0) {}
            }
        }
        var sdata_Type = "json";
        if (sact == "loadplugin" || sact == "logimp") {
            sdata_Type = "text"
        }
        try {
            var i = '';
            var sMethod = eaCtrl.sRequestType;
            if (sact == "loadimage") {
                i = ay
            } else {
                i = 's=' + eaCtrl.encode(ay)
            }
            eaCtrl.i("Request type:" + sMethod);
            var r = {
                url: at,
                dataType: sdata_Type,
                method: sMethod,
                data: i,
                success: function(rjdata) {
                    if (typeof rjdata.error != 'undefined') {
                        eaCtrl.i("there was an error " + rjdata.error);
                        if (rjdata.error == 'connect_error') {
                            if (sact == 'get') {
                                eaCtrl.bSkipConnecting = true;
                                eaCtrl.runOnErrors()
                            }
                        }
                    } else {
                        eaCtrl.sLastStatus = 'success';
                        iEnd = eaCtrl.jq.now();
                        if (sact == "init") {
                            var iC = (iEnd - iStart);
                            if (eaCtrl.iTime < iC) {
                                eaCtrl.iTime = iC
                            }
                            eaCtrl.i("Total Init Request Time:" + eaCtrl.iTime)
                        }
                        if (rjdata === undefined || rjdata == null) {
                            eaCtrl.i("Adblocker detected or somthing went wrong");
                            eaCtrl.abDetected = true;
                            eaCtrl.o(sact, ay, 1, av)
                        } else {
                            if (typeof(rjdata.errors) != 'undefined') {
                                eaCtrl.au(rjdata.errors)
                            }
                            if (typeof(av) != 'undefined' && typeof(av.result) != 'undefined') {
                                return av.result(rjdata)
                            } else {
                                eaCtrl.handleResult(sact, rjdata)
                            }
                        }
                    }
                },
                error: function(xhr, sTxt, Err) {
                    eaCtrl.sLastStatus = xhr.sTxt;
                    if (xhr.status == 0 && sTxt != 'timeout') {
                        if (as == 0 && !eaCtrl.abDetected) {
                            eaCtrl.o(sact, ay, as + 1, av)
                        } else {
                            eaCtrl.i("Adblocker detected (error) ");
                            eaCtrl.runAbFuncts();
                            eaCtrl.abDetected = true;
                            if (eaCtrl.bypassAb) {
                                eaCtrl.o(sact, ay, 0, av)
                            } else {
                                eaCtrl.i("enable the bypassab option to get ads");
                                eaCtrl.runOnErrors()
                            }
                        }
                        return
                    } else if (xhr.status != 200) {
                        return
                    }
                },
                timeout: 0,
            };
            if (sdata_Type == "blob") {
                r.headers = {
                    'Content-Type': "image/png"
                }
            }
            iStart = eaCtrl.jq.now();
            eaCtrl.jq.ajax(r)
        } catch (_0) {
            console.log(_0);
            eaCtrl.i("Adblocker detected (catch error)");
            eaCtrl.runAbFuncts();
            eaCtrl.abDetected = true;
            if (eaCtrl.bypassAb) {
                eaCtrl.o(sact, ay, 1, av)
            } else {
                eaCtrl.i("enable the bypassab option to get ads")
            }
        }
    },
    handleResult: function(sact, j) {
        switch (sact) {
            case 'get':
                if (typeof j.init_res != 'undefined') {
                    eaCtrl.aq(j.init_res)
                }
                eaCtrl.ar(j);
                eaCtrl.jq(j.results).each(function(i, d) {
                    try {
                        eaCtrl.display(d.itemid, d)
                    } catch (_0) {
                        console.log(_0)
                    }
                });
                break
        }
    },
    ar: function(j) {
        if ('undefined' != typeof(j.plugins)) {
            eaCtrl.jq(j.plugins).each(function(i, cm) {
                try {
                    eval(cm)
                } catch (_0) {
                    eaCtrl.i("error in loading plugin");
                    console.log(_0)
                }
            })
        }
    },
    ad: function(ii, ac, ab) {
        if (eaCtrl.checkPlugin(ac)) {
            if ('undefined' != typeof ab) {
                try {
                    ab()
                } catch (_0) {
                    eaCtrl.i("Error in executing call back in plugin:" + ac + " Error:" + _0)
                }
                return
            }
            if (ii > -1) {
                var ai = eaCtrl.c[ii];
                eaCtrl.c[ii].state = 2;
                eaCtrl.display(ii, ai.data)
            }
            return
        }
        eaCtrl.i('loading plugin:' + ac);
        eaCtrl.plugins.push(ac);
        eaCtrl.o('loadplugin', '&act=loadplugin&plugins[0]=' + ac + '&ctrl=' + eaCtrl.sCtrlName, 0, {
            result: function(a) {
                try {
                    eval(a);
                    if ('undefined' != typeof ab) {
                        ab();
                        return
                    }
                    if (ii > -1) {
                        var ai = eaCtrl.c[ii];
                        eaCtrl.c[ii].state = 2;
                        eaCtrl.display(ii, ai.data)
                    }
                } catch (_0) {
                    console.log(_0);
                    eaCtrl.i("error in loading plugin:" + ac)
                }
            }
        })
    },
    display: function(ii, j) {
        var ai = eaCtrl.c[ii];
        if (eaCtrl.c[ii].state != 2) {
            eaCtrl.c[ii].state = 2;
            eaCtrl.c[ii].settings = eaCtrl.getItem(j, 'settings', {}, false);
            eaCtrl.c[ii].data = j
        }
        eaCtrl.c[ii].q = 0;
        if (!eaCtrl.checkPlugin(ai.plugin)) {
            eaCtrl.ad(ii, ai.plugin);
            return
        }
        if ('undefined' != typeof(eaCtrl[ai.plugin])) {
            eaCtrl[ai.plugin].display(ii, j)
        } else {
            console.log("WTF... no plugin? " + ai.plugin)
        }
    },
    ak: function(i) {
        eaCtrl.i("openref:" + i)
    },
    m: function() {
        if (window.location.protocol != 'http:') {
            return true
        }
        return false
    },
    checkTrafficType: function(ah) {
        if (ah == '' || ah == 'all') {
            return true
        } else {
            if (typeof eaCtrl.browserInfo.ismobile != 'undefined') {
                if (eaCtrl.browserInfo.ismobile) {
                    if (ah.indexOf('!mobile') > -1) {
                        return false
                    } else {
                        if (ah.indexOf('!desctop') <= -1 && ah.indexOf('desctop') > -1) {
                            return false
                        }
                        if (ah.indexOf('!iptv') <= -1 && ah.indexOf('iptv') > -1) {
                            return false
                        }
                    }
                }
                if (eaCtrl.browserInfo.isdesctop) {
                    if (ah.indexOf('!desctop') > -1) {
                        return false
                    } else {
                        if (ah.indexOf('!mobile') <= -1 && ah.indexOf('mobile') > -1) {
                            return false
                        }
                        if (ah.indexOf('!iptv') <= -1 && ah.indexOf('iptv') > -1) {
                            return false
                        }
                    }
                }
                if (eaCtrl.browserInfo.isiptv) {
                    if (ah.indexOf('!iptv') > -1) {
                        return false
                    } else {
                        if (ah.indexOf('!mobile') <= -1 && ah.indexOf('mobile') > -1) {
                            return false
                        }
                        if (ah.indexOf('!desctop') <= -1 && ah.indexOf('desctop') > -1) {
                            return false
                        }
                    }
                }
            }
        }
        return true
    },
    isInFold: function(iItemId) {},
    run: function(aPlugins) {
        if (eaCtrl.isPaused) {
            this.i("Controller cannot run because its set on \"Paused\" please command \"resume\"");
            return false
        }
        var ay = '';
        var aFuncts = [];
        var iCnt = 0;
        var iPluginCnt = 0;
        var ii = 0;
        var u = 'undefined';
        eaCtrl.jq.each(eaCtrl.c, function(i, val) {
            ii = i;
            var ac = eaCtrl.getItem(val, 'plugin', '', false);
            if (ac != '') {
                ac = ac.replace(' ', '');
                if (!(eaCtrl.abDetected && eaCtrl.getItem(eaCtrl.ag, ac, 'yes') == 'no')) {
                    ah = eaCtrl.getItem(val, 'traffictype', 'all');
                    if (eaCtrl.checkTrafficType(ah) === true) {
                        if (val.state == 0) {
                            eaCtrl.c[ii].state = 1;
                            if ('undefined' != typeof(val.fn)) {
                                var a = {
                                    plugin: ac,
                                    fn: val.fn,
                                    fn_params: val.fn_params
                                };
                                aFuncts.push(a)
                            }
                            var b = true;
                            if (ac == 'video') {
                                b = false;
                                if (typeof val.videoads != u) {
                                    if (!eaCtrl.abDetected) {
                                        eaCtrl.jq.each(val.videoads, function(tel, ad) {
                                            var b = true;
                                            var set = {};
                                            if (typeof val.settings == 'object') {
                                                set = val.settings
                                            }
                                            var icap = parseInt(eaCtrl.getItem(ad, 'capping', 0));
                                            if (icap > 0) {
                                                var scap = 'video_cap_' + ad.type;
                                                set.capping = icap;
                                                if (eaCtrl.getStorage(scap) != null) {
                                                    b = false
                                                }
                                            }
                                            if (b && typeof ad.sid != u) {
                                                set.stype = ah;
                                                set.itemid = ii;
                                                set.actionid = tel;
                                                set.vtype = eaCtrl.getItem(ad, 'type', 'preroll');
                                                if (typeof ad.defaultad != u) {
                                                    var sname = eaCtrl.getItem(ad.defaultad, 'name', 'unknown ad');
                                                    var imincpm = eaCtrl.getItem(ad.defaultad, 'mincpm', 0);
                                                    if (isNaN(imincpm)) {
                                                        imincpm = 0
                                                    }
                                                    var scurr = eaCtrl.getItem(ad.defaultad, 'curr', 'usd');
                                                    if (scurr != 'usd') {
                                                        scurr = 'eur'
                                                    }
                                                    var stype = eaCtrl.getItem(ad.defaultad, 'type', 'vast');
                                                    if (stype != 'vast') {
                                                        stype = 'vast'
                                                    }
                                                    var surl = eaCtrl.getItem(ad.defaultad, 'url', '');
                                                    if (surl == '') {
                                                        delete eaCtrl.c[ii].videoads[tel].defaultad;
                                                        eaCtrl.i("Missing param 'url' for defaultad in spaceid:" + ad.sid)
                                                    } else {
                                                        set.defaultad = {
                                                            name: sname,
                                                            mincpm: imincpm,
                                                            curr: scurr
                                                        }
                                                    }
                                                }
                                                set = eaCtrl.encode(JSON.stringify(set));
                                                eaCtrl.c[ii].state = 1;
                                                if (typeof eaCtrl.c[ii].actions == u) {
                                                    eaCtrl.c[ii].actions = []
                                                }
                                                eaCtrl.c[ii].actions[tel] = ad;
                                                ay += '&sid[' + iCnt + ']={' + ad.sid + ':' + eaCtrl.getItem(ad, 'subid', '', true) + ':' + eaCtrl.getItem(ad, 'spacename', '', true) + ':' + s + ':' + set + '}';
                                                iCnt++
                                            } else {}
                                        })
                                    }
                                }
                                if (typeof eaCtrl.video != u) {
                                    eaCtrl.video.display(ii, {})
                                }
                            } else {
                                var set = {};
                                if (typeof val.settings == 'object') {
                                    set = val.settings
                                }
                                var s = '';
                                if (ac == 'banner' || ac == 'native') {
                                    if (!eaCtrl.jq("#" + val.display).is(":visible") && eaCtrl.getItem(val, 'isflt', 0) != 1) {
                                        eaCtrl.i("AdTag: " + val.display + ' ItemId' + i + ' Is hidden, abort processing');
                                        eaCtrl.c[ii].state = -1;
                                        b = false
                                    } else {
                                        try {
                                            var pos = eaCtrl.jq("#" + eaCtrl.c[ii].display).position();
                                            set.px = parseInt(pos.left);
                                            set.py = parseInt(pos.top)
                                        } catch (_0) {
                                            set.px = 0;
                                            set.py = 0
                                        }
                                    }
                                }
                                if (ac == 'pop') {
                                    if (typeof val.skipCookie != u && val.skipCookie == true) {
                                        console.log("set pop skip cookie");
                                        set.skipCookie = 1
                                    }
                                    if (typeof val.capSettings == 'object') {
                                        set.capSettings = val.capSettings
                                    }
                                }
                                set.stype = ah;
                                if (ac == 'banner' || ac == "pop") {
                                    if (typeof val.defaultad != 'undefined') {
                                        var sname = eaCtrl.getItem(val.defaultad, 'name', 'unknown FO Ad');
                                        var imincpm = parseFloat(eaCtrl.getItem(val.defaultad, 'mincpm', 0.000001));
                                        var scurr = eaCtrl.getItem(val.defaultad, 'curr', 'usd');
                                        if (scurr != 'eur' && scurr != 'usd') {
                                            scurr = 'usd'
                                        }
                                        var buse = true;
                                        var url = '';
                                        if (ac == 'banner') {
                                            var type = eaCtrl.getItem(val.defaultad, 'type', 'image');
                                            var path, data, url = '';
                                            switch (type) {
                                                case 'image':
                                                    path = eaCtrl.getItem(val.defaultad, 'image', '');
                                                    url = eaCtrl.getItem(val.defaultad, 'url', '');
                                                    break;
                                                case "iframe":
                                                    path = eaCtrl.getItem(val.defaultad, 'iframe', '');
                                                    break;
                                                case 'html':
                                                    data = eaCtrl.getItem(val.defaultad, 'html', '');
                                                    break
                                            }
                                            if (type == 'image' || type == 'iframe') {
                                                if (path == '') {
                                                    eaCtrl.i("Adtag " + eaCtrl.getItem(val, 'name', 'Unknown') + " is missing the path for his " + type);
                                                    buse = false
                                                }
                                                if (type == 'image') {
                                                    if (url == '') {
                                                        eaCtrl.i("Adtag " + eaCtrl.getItem(val, 'name', 'Unknown') + " is missing the url for his Image");
                                                        buse = false
                                                    }
                                                }
                                            } else if (type == 'html') {
                                                if (data == '') {
                                                    eaCtrl.i("Adtag " + eaCtrl.getItem(val, 'name', 'Unknown') + " is missing the html needed to load as ad");
                                                    buse = false
                                                }
                                            } else {
                                                eaCtrl.i("Adtag " + eaCtrl.getItem(val, 'name', 'Unknown') + " has a unvalid 'type' value (" + type + ")");
                                                buse = false
                                            }
                                        } else {
                                            url = eaCtrl.getItem(val.defaultad, 'url', '');
                                            if (url == '') {
                                                buse = false;
                                                eaCtrl.i("Adtag " + eaCtrl.getItem(val, 'name', 'Unknown') + " is missing the url for his Pop")
                                            }
                                        }
                                        if (buse) {
                                            set.defaultad = {
                                                name: sname,
                                                mincpm: imincpm,
                                                curr: scurr
                                            };
                                            if (ac == 'pop') {
                                                set.defaultad.url = url
                                            }
                                        } else {
                                            delete eaCtrl.c[ii].defaultad
                                        }
                                    }
                                }
                                if (b) {
                                    set.itemid = ii;
                                    if (typeof val.rtbext == "object") {
                                        set.rtbext = JSON.stringify(val.rtbext)
                                    }
                                    set = eaCtrl.encode(JSON.stringify(set));
                                    if (eaCtrl.getItem(val, 'sid', '') != '') {
                                        eaCtrl.c[ii].state = 1;
                                        ay += '&sid[' + iCnt + ']={' + val.sid + ':' + eaCtrl.getItem(val, 'subid', '', true) + ':' + eaCtrl.getItem(val, 'spacename', '', true) + ':' + s + ':' + set + '}';
                                        iCnt++
                                    }
                                }
                            }
                        }
                        if (ac == "invideo" || ac == "im" || ac == "floater") {
                            if (!eaCtrl.checkPlugin("banner")) {
                                ay += '&plugins[' + iPluginCnt + ']=banner';
                                eaCtrl.plugins.push("banner");
                                iPluginCnt++
                            }
                        }
                        if (!eaCtrl.checkPlugin(ac)) {
                            ay += '&plugins[' + iPluginCnt + ']=' + ac;
                            eaCtrl.plugins.push(ac);
                            iPluginCnt++
                        }
                    }
                }
            } else {
                eaCtrl.i("No plugin given in param " + val.toString())
            }
        });
        if (ay != '') {
            var sData = ay + '&act=get&doc=' + escape(document.location);
            if (eaCtrl.initDataLoaded == false) {
                eaCtrl.initDataLoaded = true;
                sData += '&getinit=1'
            }
            if (typeof aPlugins != 'undefined') {
                sData += '&pluginsav=' + JSON.stringify(aPlugins)
            }
            eaCtrl.o('get', sData, 0, {
                result: function(j) {
                    eaCtrl.handleResult('get', j);
                    eaCtrl.runFn(aFuncts)
                }
            })
        } else {
            eaCtrl.runFn(aFuncts)
        }
    },
    au: function(errors) {
        try {
            eaCtrl.jq.each(errors, function(i, v) {
                console.log(v)
            })
        } catch (e) {}
    },
    runFn: function(aFuncts) {
        eaCtrl.jq.each(aFuncts, function(i, v) {
            var ac = v.plugin;
            var fn = v.fn;
            var fn_params = v.fn_params;
            try {
                eaCtrl[ac][fn](fn_params)
            } catch (_0) {
                eaCtrl.i("Error in executing function:" + fn.toString() + ",plugin:" + ac.toString() + ', Error: ' + _0)
            }
        })
    },
    checkPlugin: function(s, brv) {
        var u = 'undefined';
        if (typeof eaCtrl[s] == u) {
            if (eaCtrl.plugins.indexOf(s) >= 0) {
                return true
            }
            if (typeof brv == u) {
                eaCtrl.i('Plugin ' + s + ' have to be q')
            }
            return false
        } else {
            if (eaCtrl.plugins.indexOf(s) >= 0) {
                return true
            }
            try {
                if (typeof eaCtrl[s].getVersion == u) {
                    eaCtrl.i("Plugin " + s + " is really out of date, loading the new version");
                    return false
                } else {
                    var version = eaCtrl[s].getVersion();
                    if (version == u || (typeof eaCtrl.an[s] != u && version < eaCtrl.an[s].version)) {
                        eaCtrl.i("Plugin " + s + " is out of date, loading the new version");
                        return false
                    }
                    if (typeof brv != u) {
                        return version
                    } else {
                        if (typeof eaCtrl.an[s] == u) {
                            return false
                        }
                    }
                }
            } catch (_0) {
                eaCtrl.i("Something is wrong with checking plugin " + s);
                eaCtrl.i(_0);
                return false
            }
        }
        return true
    },
    getItem: function(arr, fld, dval, aa, sPrepend) {
        var rval;
        if (typeof(arr) != 'undefined' && typeof(arr[fld]) != 'undefined') {
            if (arr[fld] == '') {
                return dval
            }
            rval = arr[fld]
        } else {
            rval = dval
        }
        if (typeof aa != 'undefined' && aa) {
            rval = eaCtrl.aa(rval)
        }
        return (typeof(sPrepend) != 'undefined' ? sPrepend : '') + rval
    },
    q: function(ii) {
        var a = eaCtrl.c[ii].data;
        if (eaCtrl.getItem(a, 'logimp', false, false, '')) {
            if (!a.q) {
                eaCtrl.c[ii].q = true;
                eaCtrl.o('logimp', 'act=logimp&xref=' + a.hash, 0, {
                    result: function(a) {}
                })
            } else {}
        } else {}
    },
    clicked: function(i) {
        eaCtrl.i("ad " + i + ' is clicked')
    },
    aa: function(s) {
        return escape(s)
    },
    encode: function(s) {
        return eaCtrl.z.encode(s)
    },
    createCookie: function(cookieName, cookieState, cookieLifetime) {
        try {
            var date = new Date(new Date().getTime() + (cookieLifetime * 60 * 1000)).toGMTString();
            document.cookie = cookieName + '=' + cookieState + '; expires=' + date + '; path=/'
        } catch (_0) {}
    },
    ai: function(name) {
        try {
            var nameEQ = name + "=";
            var ca = document.cookie.split(';');
            for (var i = 0; i < ca.length; i++) {
                var c = ca[i];
                while (c.charAt(0) == ' ') c = c.substring(1, c.length);
                if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length, c.length))
            }
        } catch (_0) {}
        return ""
    },
    removeStorage: function(name) {
        try {
            var infSt = ((!!window.localStorage) && (!!window.atob))
        } catch (e) {
            var infSt = 0
        }
        if (infSt) {
            try {
                window.localStorage.removeItem(name)
            } catch (e) {
                console.log('removeStorage: Error removing key [' + key + '] from localStorage: ' + JSON.stringify(e));
                return false
            }
            return true
        }
    },
    getStorage: function(key) {
        try {
            var infSt = ((!!window.localStorage) && (!!window.atob))
        } catch (e) {
            var infSt = 0
        }
        if (!infSt) {
            return eaCtrl.ai(key)
        } else {
            var now = Date.now();
            try {
                var item = window.localStorage.getItem(key);
                if (item === undefined || item == null) {
                    return null
                } else {
                    item = JSON.parse(item);
                    var tm = item.expires;
                    var val = item.value;
                    if (tm < now) {
                        eaCtrl.removeStorage(key);
                        return null
                    } else {
                        return val
                    }
                }
            } catch (e) {
                console.log('getStorage: Error reading key [' + key + '] from localStorage: ' + JSON.stringify(e));
                console.log(e);
                return null
            }
        }
    },
    setStorage: function(key, value, expires) {
        try {
            var infSt = ((!!window.localStorage) && (!!window.atob))
        } catch (e) {
            var infSt = 0
        }
        if (!infSt) {
            eaCtrl.createCookie(key, value, expires)
        } else {
            if (expires === undefined || expires === null) {
                expires = (24 * 60)
            } else {
                expires = Math.abs(expires)
            }
            var now = Date.now();
            var schedule = now + (expires * 60 * 1000);
            try {
                var item = {
                    expires: schedule,
                    value: value
                };
                window.localStorage.setItem(key, JSON.stringify(item))
            } catch (e) {
                console.log('setStorage: Error setting key [' + key + '] in localStorage: ' + JSON.stringify(e));
                return false
            }
            return true
        }
    },
    reload: function(ii) {
        var ai = eaCtrl.c[ii];
        ai.q = false;
        try {
            delete ai.data;
            delete ai.q;
            delete ai.btype;
            delete ai.state;
            delete ai.settings
        } catch (e) {}
        ai.reload = 1;
        ai.state = 0;
        eaCtrl.run()
    },
    logImp: function(ii, adtype, xargs, ai) {
        console.log("Logimp main called");
        var u = 'undefined';
        if (ai == null || typeof ai == 'undefined') {
            var ai = eaCtrl.c[ii];
            var a = eaCtrl.c[ii].data
        } else {
            var a = ai.data
        }
        var uri = 'act=logimp&xref=' + a.hash;
        eaCtrl.o('logimp', uri, 0, {
            result: function(a) {}
        });
        eaCtrl.bkLog('view', ii, {}, ai)
    },
    z: {
        _1: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
        encode: function(e) {
            var t = "";
            var n, r, i, s, o, u, a;
            var f = 0;
            e = this._4(e);
            while (f < e.length) {
                n = e.charCodeAt(f++);
                r = e.charCodeAt(f++);
                i = e.charCodeAt(f++);
                s = n >> 2;
                o = (n & 3) << 4 | r >> 4;
                u = (r & 15) << 2 | i >> 6;
                a = i & 63;
                if (isNaN(r)) {
                    u = a = 64
                } else if (isNaN(i)) {
                    a = 64
                }
                t = t + this._1.charAt(s) + this._1.charAt(o) + this._1.charAt(u) + this._1.charAt(a)
            }
            return t
        },
        _4: function(e) {
            e = e.replace(/\r\n/g, "\n");
            var t = "";
            for (var n = 0; n < e.length; n++) {
                var r = e.charCodeAt(n);
                if (r < 128) {
                    t += String.fromCharCode(r)
                } else if (r > 127 && r < 2048) {
                    t += String.fromCharCode(r >> 6 | 192);
                    t += String.fromCharCode(r & 63 | 128)
                } else {
                    t += String.fromCharCode(r >> 12 | 224);
                    t += String.fromCharCode(r >> 6 & 63 | 128);
                    t += String.fromCharCode(r & 63 | 128)
                }
            }
            return t
        },
    }
};
eval(function(p, a, c, k, e, d) {
    e = function(c) {
        return c
    };
    if (!''.replace(/^/, String)) {
        while (c--) {
            d[c] = k[c] || c
        }
        k = [function(e) {
            return d[e]
        }];
        e = function() {
            return '\\w+'
        };
        c = 1
    };
    while (c--) {
        if (k[c]) {
            p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c])
        }
    }
    return p
}('(29(126,129,226){"282 484";22(83 257!=="82"&&257.473){257.473=226()}47 22(83 291==="29"&&291.738){291(226)}47{129[126]=226()}})("197",18,29(){"282 484";22(!213.208.58){213.208.58=29(421,440){28 108;22(18==109){448 235 732("\'18\' 179 109 733 82")}28 249=730(18);28 191=249.106>>>0;22(191===0){21-1}28 38=+440||0;22(134.446(38)===729){38=0}22(38>=191){21-1}108=134.103(38>=0?38:191-134.446(38),0);726(108<191){22(108 143 249&&249[108]===421){21 108}108++}21-1}}28 197=29(46){28 476={306:"701",246:"494/693/702.704",294:52,315:[/710/41]};18.46=18.454(46,476);18.320=213.208.318;18.312=213.208.144};197.208={454:29(164,198){22(164==109){21 198}135(28 108 143 164){22(164[108]!=109&&198[108]!==164[108]){198[108]=164[108]}}21 198},131:29(463){22(116.464){464.131(463)}},706:29(94){28 19=[];19=18.461(19);19=18.455(19);19=18.482(19);19=18.471(19);19=18.425(19);19=18.427(19);19=18.417(19);19=18.419(19);19=18.433(19);19=18.438(19);19=18.531(19);19=18.533(19);19=18.534(19);19=18.528(19);19=18.330(19);19=18.523(19);19=18.524(19);19=18.536(19);19=18.526(19);19=18.413(19);19=18.542(19);19=18.543(19);19=18.383(19);28 186=18;18.540(19,29(316){28 317=[];186.311(316,29(228){28 54=228.54;22(83 228.54.119!=="82"){54=228.54.119(";")}317.23(54)});28 400=186.460(317.119("~~~"),31);21 94(400,316)})},461:29(19){22(!18.46.707){19.23({34:"705",54:18.456()})}21 19},456:29(){21 59.79},455:29(19){22(!18.46.708){19.23({34:"234",54:59.234||59.709||59.712||59.711})}21 19},482:29(19){22(!18.46.696){19.23({34:"695",54:73.694})}21 19},471:29(19){22(!18.46.697){21 18.449(19)}21 19},449:29(19){28 178;22(18.46.294){178=(73.161>73.151)?[73.161,73.151]:[73.151,73.161]}47{178=[73.151,73.161]}22(83 178!=="82"){19.23({34:"178",54:178})}21 19},425:29(19){22(!18.46.698){21 18.423(19)}21 19},423:29(19){28 137;22(73.168&&73.159){22(18.46.294){137=(73.159>73.168)?[73.159,73.168]:[73.168,73.159]}47{137=[73.159,73.168]}}22(83 137!=="82"){19.23({34:"700",54:137})}21 19},427:29(19){22(!18.46.699){19.23({34:"713",54:235 714().728()})}21 19},417:29(19){22(!18.46.445&&18.375()){19.23({34:"727",54:1})}21 19},419:29(19){22(!18.46.445&&18.377()){19.23({34:"731",54:1})}21 19},433:29(19){22(!18.46.725&&18.388()){19.23({34:"724",54:1})}21 19},438:29(19){22(99.201&&!18.46.718&&99.201.717){19.23({34:"716",54:1})}21 19},531:29(19){22(!18.46.715&&116.719){19.23({34:"720",54:1})}21 19},533:29(19){22(!18.46.723){19.23({34:"722",54:18.374()})}21 19},534:29(19){22(!18.46.721){19.23({34:"692",54:18.379()})}21 19},528:29(19){22(!18.46.691){19.23({34:"664",54:18.372()})}21 19},523:29(19){22(!18.46.663&&18.298()){19.23({34:"74",54:18.369()})}21 19},524:29(19){22(18.46.525){22(83 150==="82"){18.131("273 280 279 497 525 493 270")}21 19}22(!18.472()){22(83 150==="82"){18.131("273 280 279 432 662 179 227 661 143 18 76")}21 19}19.23({34:"36",54:18.340()});21 19},536:29(19){22(!18.46.665){19.23({34:"666",54:18.447()})}21 19},526:29(19){22(!18.46.669){19.23({34:"668",54:18.444()})}21 19},413:29(19){22(!18.46.667){19.23({34:"660",54:18.431()})}21 19},542:29(19){22(!18.46.659){19.23({34:"653",54:18.430()})}21 19},543:29(19){22(!18.46.652){19.23({34:"651",54:18.422()})}21 19},540:29(19,94){22(18.46.650){21 18.496(19,94)}21 18.510(19,94)},496:29(19,94){22(18.46.520){22(83 150==="82"){18.131("273 494 132 489 497 520 493 270")}21 94(19)}22(!18.475()){22(83 150==="82"){18.131("654 179 227 209, 196 132 278 179 655")}21 94(19)}22(!18.481()){22(83 150==="82"){18.131("196 179 227 658, 516 196 132 278")}21 94(19)}22(83 18.46.246==="82"){22(83 150==="82"){18.131("657 282 196 132 489, 656 670 671 195 685 246 270, 516 196 132 278")}21 94(19)}18.477(29(132){19.23({34:"684",54:132.119(";")});94(19)})},510:29(19,94){28 186=18;21 683(29(){28 133=["686","687-507","507"];28 357="690";28 334="689";28 78=99.688("201")[0];28 105=99.157("682");105.239.681=334;105.675=357;28 275={};28 269={};135(28 122 143 133){105.239.352=133[122];78.220(105);275[133[122]]=105.351;269[133[122]]=105.356;78.343(105)}28 347=29(169){28 209=90;135(28 122 143 133){105.239.352=169+","+133[122];78.220(105);28 346=(105.351!==275[133[122]]||105.356!==269[133[122]]);78.343(105);209=209||346}21 209};28 177=["674 397","136","136 260","136 673","136 60","136 672","136 676 60 115","136 373 96","677 680 87 397","679 678","734 206 437","735","387","387 134","231","231 101","231 792","391 87","391 87 96","649","408","408 154","323","791","790","407","407 793","794","141 797","141 796","141 795","141 789","788 782","141 781","141 87","141 87 319","141 87 373","121 87 229","780","779 783","96 101","96 784","96 787","96 401 87 229","96 87 229","96 229","370","370 183","368","368 786","163 785","163 117","163 139","163 139 176","163 139 798","163 139 428","799","219","219 154 241","219 154 241 813","812 96","811","299","299 2","299 3"];28 355=["814 60 104 176","815 367 147","338 818 183","817 323","338 816 183","810 236","809","344 199 115","344 254","803","802 35","353 319","353 319 104","801 245 35","800","804 154","805","808 807","806","300 778","300 777 750","300 749 101 748","215 747","751","752 183","755 35","754 341 35","360 160 35","360 245 35","753","746","745","426 140 130","739 101","737 245 35","505","505 206 736","740","741","744 142","743 93","742","756 60","757","771 160 35","527 87 236","527 87 236 411","770 60 104","769 35","772 35","773 776","775","774 97","768 396","142 72","142 72 767","142 72 761","142 60","142 60 260","142 60 104","142 60 390 760","759 428 7","758","424 292","424 292 97","762 153 35","763 115","766","765 154","764","819 117 60","559 236","560 60","562","571","565 35","567","546","547","483 555","483 219","530","530 548","566","564","535 153 35","535 35","553","563 160 35","558","491","491 104","545 35","544","561 60","550","549 260","221","221 101","221 101 115","221 101 176","556 153 35","569","568 154","570","557","554","552","551 60","648","624","623","622 625 626","628","627","621-620","614","613","612","615","616","619","618","617 117 97","629","350 111 630 35","643 60","642 35","217 115 97","217 411 97","217 176 97","217 254 97","641","393","393 644","645","647 153 35","646","640 354","639","633","632 60 176","631","634","635","572 638 35","637","636 117","611 117 60","610 160 35","585","584","202","202 160 35","202 166 35","202 245 35","202 583 35","586 35","587","590 35","589","588 382","258 35","258 582 35","258 166 35","522 703 166 35","522 703 581 35","575","167 87","167 87 60","167 87 60 104","167 87 60 574 104 115","167 87 532 115","167 87 532 115 104","573","576 60 199 104","498","498 577","435 206 437","435 580","579 35","578 35","591 140 130","592","605","604","603","606 130","607","609 295 492","608","602","470 601","470 595","594","593","596 597 296","467 600 101 466","467 406 466","599 296","598 521 341 35","459 35","459 166 35","1067 60 1066","288 153 35","288 35","288 166 35","1065","1064 241","1068 35","1069","1073","1072 1071","1070","1063 147","1062","1055","1054","1053 97","429 160 35","429 1052 35","1056","1057","1061","1060 140 130","1059","439 153 35","439 35","1058 139","1074","1075","1091 35","1090 97","1089","1088 117","1092 139","1093","1097","1096 101","1095 60","1094","529","529 176","1087 1086","1079 35","1078","1077 1076","1080 140 130","1081 101","1085","1084","1083","1082 1051","1050","1019","1018 97","1017 60 117 1016","486","486 139","121 1020","121 1021","121 154 511 1025","121 1024","121 511 1023","121 1022","121 1015","121 1014 398","508","509","509-232","508-232","434","434 382","325","325 462","1007","326","326 1006. 20","1005 1003 295 97 396","1004 398","1008","1009","1013 1012","96 1011","96 406","96 1010","96 401 1026","96 139 101","60 199","1027","1043 1042","1041","1040","1044","384 101","384 1045","1049 35","386 367","386 295","1048","1099","1046","1039 1038 1031","206 231","206 350 296 60","342","342 35","1030","1029 140 130","1028","1032 35","1033 117 60","1037","1036","1035 147","1034","339","339 354 60","1098","1103","1162 1161","1160","376","376-232","1159 1163","390","1164 35","1168 147","1167","1166 35","1165","1158","1170 492","1150","1149 153 35","248","248 104","248 199 115","1148","241","1147 1151","1152 1156 147","1155 147","1154","117","117 60 115","1153","256","256 35","256 1169 35","1176 35","1172","1177 426","1171 101","1173","1174","1175","1157","490 215","490 215 462","458","458-232","1145 140 130","1115 248","1114","1113 1112","1116 97","1117 1121","1120","820 166 35","1119 35","1118","1111","1110","1146","1102","1101 328 35","1100 1104 35","1105","1109 147","1108","1107 140 130","1106","1122","1123 140 130","1139 87 97","1138","1137","1136 215","1140","1141 183","1144","1143","1142","262 271 60","262 271 60 104","262 271 60 104 199 115","1135 35","1134","264","264 1127 55 254","264 104","1126","1125","1124","1128","1129 292 97","1133","1132","1131 117","1130","1047","1001","882 881","880 35","538 35","538 879 35","883","327 328 35","327 884 35","887"];22(186.46.886){177=177.885(355)}28 137=[];135(28 41=0,145=177.106;41<145;41++){22(347(177[41])){137.23(177[41])}}19.23({34:"878",54:137});94(19)},1)},330:29(19){22(!18.46.877){22(18.468()){19.23({34:"870",54:18.322()})}47{19.23({34:"869",54:18.348()})}}21 19},348:29(){28 146=[];135(28 41=0,145=59.146.106;41<145;41++){146.23(59.146[41])}22(18.381()){146=146.868(29(195,305){22(195.126>305.126){21 1}22(195.126<305.126){21-1}21 0})}21 18.144(146,29(210){28 324=18.144(210,29(307){21[307.867,307.871].119("~")}).119(",");21[210.126,210.872,324].119("::")},18)},322:29(){22(116.363){28 361=["876.389","875.874","329.329","337.337.1","395.395","358.1002","358.873","389.888","399.399","889.904.1","184","184.184(410) 402 218 (32-404)","409.409(410) 402 218 (32-404)","903.902","405.405","901.905","385.385","906.909","366.366","908.907","364.184 359 218","364.184 359 218.1"];21 18.144(361,29(126){120{235 363(126);21 126}124(170){21 109}})}47{21[]}},381:29(){28 284=90;135(28 41=0,145=18.46.315.106;41<145;41++){28 380=18.46.315[41];22(59.79.900(380)){284=52;899}}21 284},383:29(19){22(!18.46.893){19.23({34:"892",54:18.362()})}21 19},375:29(){120{21!!116.891}124(170){21 52}},377:29(){120{21!!116.890}124(170){21 52}},388:29(){21!!116.894},374:29(){22(59.378){21 59.378}47{21"274"}},379:29(){22(59.92){21 59.92}47{21"274"}},372:29(){22(59.371){21 59.371}47{21"274"}},362:29(){28 152=0;28 266=90;22(83 59.152!=="82"){152=59.152}47 22(83 59.313!=="82"){152=59.313}120{99.895("898");266=52}124(897){}28 365="420"143 116;21[152,266,365]},369:29(){28 30=[];28 74=99.157("74");74.151=896;74.161=200;74.239.866="865";28 53=74.138("474");53.403(0,0,10,10);53.403(2,2,6,6);30.23("74 836:"+((53.835(5,5,"349")===90)?"539":"267"));53.834="833";53.149="#837";53.838(125,1,62,20);53.149="#841";22(18.46.840){53.169="392 136"}47{53.169="392 267-839-169-123"}53.394("412 345 332 331 333, \\336\\335",2,15);53.149="832(102, 204, 0, 0.7)";53.169="831 136";53.394("412 345 332 331 333, \\336\\335",4,45);53.824="823";53.149="225(255,0,255)";53.272();53.203(50,50,50,0,134.205*2,52);53.277();53.244();53.149="225(0,255,255)";53.272();53.203(100,50,50,0,134.205*2,52);53.277();53.244();53.149="225(255,255,0)";53.272();53.203(75,100,50,0,134.205*2,52);53.277();53.244();53.149="225(255,0,255)";53.203(75,75,75,0,134.205*2,52);53.203(75,75,25,0,134.205*2,52);53.244("349");30.23("74 822:"+74.500());21 30.119("~")},340:29(){28 17;28 251=29(261){17.821(0.0,0.0,0.0,1.0);17.825(17.826);17.830(17.829);17.828(17.827|17.842);21"["+261[0]+", "+261[1]+"]"};28 541=29(17){28 172,265=17.252("843")||17.252("859")||17.252("858");21 265?(172=17.71(265.857),0===172&&(172=2),172):109};17=18.451();22(!17){21 109}28 30=[];28 515="856 230 223;253 230 214;281 230 259;506 503(){214=223+259;860=504(223,0,1)}";28 514="43 861 86;253 230 214;506 503() {864=504(214,0,1)}";28 165=17.863();17.862(17.517,165);28 518=235 855([-.2,-.9,0,.4,-.26,0,0,.854,0]);17.847(17.517,518,17.846);165.485=3;165.499=3;28 112=17.845(),222=17.512(17.81);17.513(222,515);17.502(222);28 224=17.512(17.84);17.513(224,514);17.502(224);17.501(112,222);17.501(112,224);17.844(112);17.848(112);112.488=17.849(112,"223");112.487=17.853(112,"259");17.852(112.851);17.850(112.488,165.485,17.910,!1,0,0);17.911(112.487,1,1);17.973(17.972,0,165.499);22(17.74!=109){30.23(17.74.500())}30.23("971:"+17.970().119(";"));30.23("36 495 974 151 519:"+251(17.71(17.975)));30.23("36 495 978 243 519:"+251(17.71(17.977)));30.23("36 976 158:"+17.71(17.969));30.23("36 968:"+(17.961().960?"539":"267"));30.23("36 959 158:"+17.71(17.958));30.23("36 962 158:"+17.71(17.963));30.23("36 967 158:"+17.71(17.966));30.23("36 103 172:"+541(17));30.23("36 103 965 181 263 283:"+17.71(17.964));30.23("36 103 979 144 181 243:"+17.71(17.980));30.23("36 103 85 281 276:"+17.71(17.995));30.23("36 103 994 993 243:"+17.71(17.992));30.23("36 103 181 263 283:"+17.71(17.996));30.23("36 103 181 243:"+17.71(17.997));30.23("36 103 253 276:"+17.71(17.1000));30.23("36 103 77 999:"+17.71(17.998));30.23("36 103 77 181 263 283:"+17.71(17.991));30.23("36 103 77 281 276:"+17.71(17.990));30.23("36 103 984 983:"+251(17.71(17.982)));30.23("36 981 158:"+17.71(17.985));30.23("36 986:"+17.71(17.989));30.23("36 988 234 436:"+17.71(17.987));30.23("36 957 158:"+17.71(17.956));30.23("36 927:"+17.71(17.926));30.23("36 436:"+17.71(17.537));22(!17.49){22(83 150==="82"){18.131("280 279 179 925, 432 924 76 928 227 929 49")}21 30.119("~")}30.23("36 77 51 114 86 43:"+17.49(17.81,17.174).43);30.23("36 77 51 114 86 43 67:"+17.49(17.81,17.174).67);30.23("36 77 51 114 86 43 69:"+17.49(17.81,17.174).69);30.23("36 77 51 113 86 43:"+17.49(17.81,17.171).43);30.23("36 77 51 113 86 43 67:"+17.49(17.81,17.171).67);30.23("36 77 51 113 86 43 69:"+17.49(17.81,17.171).69);30.23("36 77 51 110 86 43:"+17.49(17.81,17.162).43);30.23("36 77 51 110 86 43 67:"+17.49(17.81,17.162).67);30.23("36 77 51 110 86 43 69:"+17.49(17.81,17.162).69);30.23("36 85 51 114 86 43:"+17.49(17.84,17.174).43);30.23("36 85 51 114 86 43 67:"+17.49(17.84,17.174).67);30.23("36 85 51 114 86 43 69:"+17.49(17.84,17.174).69);30.23("36 85 51 113 86 43:"+17.49(17.84,17.171).43);30.23("36 85 51 113 86 43 67:"+17.49(17.84,17.171).67);30.23("36 85 51 113 86 43 69:"+17.49(17.84,17.171).69);30.23("36 85 51 110 86 43:"+17.49(17.84,17.162).43);30.23("36 85 51 110 86 43 67:"+17.49(17.84,17.162).67);30.23("36 85 51 110 86 43 69:"+17.49(17.84,17.162).69);30.23("36 77 51 114 88 43:"+17.49(17.81,17.180).43);30.23("36 77 51 114 88 43 67:"+17.49(17.81,17.180).67);30.23("36 77 51 114 88 43 69:"+17.49(17.81,17.180).69);30.23("36 77 51 113 88 43:"+17.49(17.81,17.173).43);30.23("36 77 51 113 88 43 67:"+17.49(17.81,17.173).67);30.23("36 77 51 113 88 43 69:"+17.49(17.81,17.173).69);30.23("36 77 51 110 88 43:"+17.49(17.81,17.175).43);30.23("36 77 51 110 88 43 67:"+17.49(17.81,17.175).67);30.23("36 77 51 110 88 43 69:"+17.49(17.81,17.175).69);30.23("36 85 51 114 88 43:"+17.49(17.84,17.180).43);30.23("36 85 51 114 88 43 67:"+17.49(17.84,17.180).67);30.23("36 85 51 114 88 43 69:"+17.49(17.84,17.180).69);30.23("36 85 51 113 88 43:"+17.49(17.84,17.173).43);30.23("36 85 51 113 88 43 67:"+17.49(17.84,17.173).67);30.23("36 85 51 113 88 43 69:"+17.49(17.84,17.173).69);30.23("36 85 51 110 88 43:"+17.49(17.84,17.175).43);30.23("36 85 51 110 88 43 67:"+17.49(17.84,17.175).67);30.23("36 85 51 110 88 43 69:"+17.49(17.84,17.175).69);21 30.119("~")},447:29(){28 185=99.157("480");185.479("250","185");120{99.201.220(185);21 99.932("185")?90:52}124(170){21 90}},444:29(){22(83 59.441!=="82"){120{28 442=59.441[0].443(0,2);22(442!==59.234.443(0,2)){21 52}}124(289){21 52}}21 90},431:29(){22(73.151<73.168){21 52}22(73.161<73.159){21 52}21 90},430:29(){28 79=59.79.238();28 118=59.118;28 92=59.92.238();28 65;22(79.58("931 930")>=0){65="128 182"}47 22(79.58("194")>=0){65="128"}47 22(79.58("418")>=0){65="212"}47 22(79.58("193")>=0){65="321"}47 22(79.58("415")>=0||79.58("414")>=0){65="247"}47 22(79.58("192")>=0){65="309"}47{65="155"}28 216;22(("420"143 116)||(59.152>0)||(59.313>0)){216=52}47{216=90}22(216&&65!=="128 182"&&65!=="212"&&65!=="247"&&65!=="155"){21 52}22(83 118!=="82"){118=118.238();22(118.58("194")>=0&&65!=="128"&&65!=="128 182"){21 52}47 22(118.58("193")>=0&&65!=="321"&&65!=="212"){21 52}47 22(118.58("192")>=0&&65!=="309"&&65!=="247"){21 52}47 22(118.58("194")===0&&118.58("193")===0&&118.58("192")>=0&&65!=="416"){21 52}}22(92.58("194")>=0&&65!=="128"&&65!=="128 182"){21 52}47 22((92.58("193")>=0||92.58("418")>=0||92.58("923")>=0)&&65!=="321"&&65!=="212"){21 52}47 22((92.58("192")>=0||92.58("414")>=0||92.58("922")>=0||92.58("415")>=0)&&65!=="309"&&65!=="247"){21 52}47 22(92.58("194")===0&&92.58("193")===0&&92.58("192")>=0&&65!=="416"){21 52}22(83 59.146==="82"&&65!=="128"&&65!=="128 182"){21 52}21 90},422:29(){28 79=59.79.238();28 310=59.310;28 76;22(79.58("915")>=0){76="304"}47 22(79.58("914")>=0||79.58("913")>=0){76="287"}47 22(79.58("912")>=0){76="286"}47 22(79.58("916")>=0){76="290"}47 22(79.58("917")>=0){76="301 302"}47{76="155"}22((76==="286"||76==="290"||76==="287")&&310!=="921"){21 52}28 240=920.187().106;22(240===37&&76!=="290"&&76!=="304"&&76!=="155"){21 52}47 22(240===39&&76!=="301 302"&&76!=="155"){21 52}47 22(240===33&&76!=="286"&&76!=="287"&&76!=="155"){21 52}28 242;120{448"195"}124(289){120{289.919();242=52}124(918){242=90}}22(242&&76!=="304"&&76!=="155"){21 52}21 90},298:29(){28 303=99.157("74");21!!(303.138&&303.138("474"))},472:29(){22(!18.298()){21 90}28 74=99.157("74"),237;120{237=74.138&&(74.138("36")||74.138("452-36"))}124(170){237=90}21!!116.933&&!!237},468:29(){22(59.469==="121 301 302"){21 52}47 22(59.469==="934"&&/950/.949(59.79)){21 52}21 90},475:29(){21 83 116.285!=="82"},481:29(){21 285.948("9.0.0")},478:29(){28 308=99.157("480");308.479("250",18.46.306);99.201.220(308)},477:29(94){28 297="947";116[297]=29(132){94(132)};28 250=18.46.306;18.478();28 453={951:297};28 450={952:"955",954:"90"};285.953(18.46.246,250,"1","1","9.0.0",90,453,450,{})},451:29(){28 74=99.157("74");28 17=109;120{17=74.138("36")||74.138("452-36")}124(170){}22(!17){17=109}21 17},311:29(89,156,129){22(89===109){21}22(18.320&&89.318===18.320){89.318(156,129)}47 22(89.106===+89.106){135(28 41=0,145=89.106;41<145;41++){22(156.314(129,89[41],41,89)==={}){21}}}47{135(28 34 143 89){22(89.946(34)){22(156.314(129,89[34],34,89)==={}){21}}}}},144:29(89,156,129){28 190=[];22(89==109){21 190}22(18.312&&89.144===18.312){21 89.144(156,129)}18.311(89,29(54,122,465){190[190.106]=156.314(129,54,122,465)});21 190},127:29(44,38){44=[44[0]>>>16,44[0]&80,44[1]>>>16,44[1]&80];38=[38[0]>>>16,38[0]&80,38[1]>>>16,38[1]&80];28 42=[0,0,0,0];42[3]+=44[3]+38[3];42[2]+=42[3]>>>16;42[3]&=80;42[2]+=44[2]+38[2];42[1]+=42[2]>>>16;42[2]&=80;42[1]+=44[1]+38[1];42[0]+=42[1]>>>16;42[1]&=80;42[0]+=44[0]+38[0];42[0]&=80;21[(42[0]<<16)|42[1],(42[2]<<16)|42[3]]},107:29(44,38){44=[44[0]>>>16,44[0]&80,44[1]>>>16,44[1]&80];38=[38[0]>>>16,38[0]&80,38[1]>>>16,38[1]&80];28 42=[0,0,0,0];42[3]+=44[3]*38[3];42[2]+=42[3]>>>16;42[3]&=80;42[2]+=44[2]*38[3];42[1]+=42[2]>>>16;42[2]&=80;42[2]+=44[3]*38[2];42[1]+=42[2]>>>16;42[2]&=80;42[1]+=44[1]*38[3];42[0]+=42[1]>>>16;42[1]&=80;42[1]+=44[2]*38[2];42[0]+=42[1]>>>16;42[1]&=80;42[1]+=44[3]*38[1];42[0]+=42[1]>>>16;42[1]&=80;42[0]+=(44[0]*38[3])+(44[1]*38[2])+(44[2]*38[1])+(44[3]*38[0]);42[0]&=80;21[(42[0]<<16)|42[1],(42[2]<<16)|42[3]]},148:29(44,38){38%=64;22(38===32){21[44[1],44[0]]}47 22(38<32){21[(44[0]<<38)|(44[1]>>>(32-38)),(44[1]<<38)|(44[0]>>>(32-38))]}47{38-=32;21[(44[1]<<38)|(44[0]>>>(32-38)),(44[0]<<38)|(44[1]>>>(32-38))]}},98:29(44,38){38%=64;22(38===0){21 44}47 22(38<32){21[(44[0]<<38)|(44[1]>>>(32-38)),44[1]<<38]}47{21[44[1]<<(38-32),0]}},66:29(44,38){21[44[0]^38[0],44[1]^38[1]]},268:29(78){78=18.66(78,[0,78[0]>>>1]);78=18.107(78,[945,938]);78=18.66(78,[0,78[0]>>>1]);78=18.107(78,[937,936]);78=18.66(78,[0,78[0]>>>1]);21 78},460:29(34,188){34=34||"";188=188||0;28 293=34.106%16;28 457=34.106-293;28 70=[0,188];28 68=[0,188];28 57=[0,0];28 61=[0,0];28 189=[935,939];28 207=[940,944];135(28 41=0;41<457;41=41+16){57=[((34.63(41+4)&91))|((34.63(41+5)&91)<<8)|((34.63(41+6)&91)<<16)|((34.63(41+7)&91)<<24),((34.63(41)&91))|((34.63(41+1)&91)<<8)|((34.63(41+2)&91)<<16)|((34.63(41+3)&91)<<24)];61=[((34.63(41+12)&91))|((34.63(41+13)&91)<<8)|((34.63(41+14)&91)<<16)|((34.63(41+15)&91)<<24),((34.63(41+8)&91))|((34.63(41+9)&91)<<8)|((34.63(41+10)&91)<<16)|((34.63(41+11)&91)<<24)];57=18.107(57,189);57=18.148(57,31);57=18.107(57,207);70=18.66(70,57);70=18.148(70,27);70=18.127(70,68);70=18.127(18.107(70,[0,5]),[0,943]);61=18.107(61,207);61=18.148(61,33);61=18.107(61,189);68=18.66(68,61);68=18.148(68,31);68=18.127(68,70);68=18.127(18.107(68,[0,5]),[0,942])}57=[0,0];61=[0,0];941(293){95 15:61=18.66(61,18.98([0,34.63(41+14)],48));95 14:61=18.66(61,18.98([0,34.63(41+13)],40));95 13:61=18.66(61,18.98([0,34.63(41+12)],32));95 12:61=18.66(61,18.98([0,34.63(41+11)],24));95 11:61=18.66(61,18.98([0,34.63(41+10)],16));95 10:61=18.66(61,18.98([0,34.63(41+9)],8));95 9:61=18.66(61,[0,34.63(41+8)]);61=18.107(61,207);61=18.148(61,33);61=18.107(61,189);68=18.66(68,61);95 8:57=18.66(57,18.98([0,34.63(41+7)],56));95 7:57=18.66(57,18.98([0,34.63(41+6)],48));95 6:57=18.66(57,18.98([0,34.63(41+5)],40));95 5:57=18.66(57,18.98([0,34.63(41+4)],32));95 4:57=18.66(57,18.98([0,34.63(41+3)],24));95 3:57=18.66(57,18.98([0,34.63(41+2)],16));95 2:57=18.66(57,18.98([0,34.63(41+1)],8));95 1:57=18.66(57,[0,34.63(41)]);57=18.107(57,189);57=18.148(57,31);57=18.107(57,207);70=18.66(70,57)}70=18.66(70,[0,34.106]);68=18.66(68,[0,34.106]);70=18.127(70,68);68=18.127(68,70);70=18.268(70);68=18.268(68);70=18.127(70,68);68=18.127(68,70);21("233"+(70[0]>>>0).187(16)).211(-8)+("233"+(70[1]>>>0).187(16)).211(-8)+("233"+(68[0]>>>0).187(16)).211(-8)+("233"+(68[1]>>>0).187(16)).211(-8)}};197.537="1.1.0";21 197});', 10, 1178, '|||||||||||||||||gl|this|keys||return|if|push|||||var|function|result||||key|BT|webgl||n|||i|o|precision|m||options|else||getShaderPrecisionFormat||shader|true|ctx|value|||k1|indexOf|navigator|MT|k2||charCodeAt||os|x64Xor|rangeMin|h2|rangeMax|h1|getParameter||screen|canvas||browser|vertex|h|userAgent|0xffff|VERTEX_SHADER|undefined|typeof|FRAGMENT_SHADER|fragment|float|Sans|int|obj|false|0xff|platform||done|case|MS|ITC|x64LeftShift|document||Gothic||max|Condensed|s|length|x64Multiply|k|null|low||program|medium|high|Bold|window|Script|oscpu|join|try|Microsoft|index||catch||name|x64Add|Windows|context|MN|log|fonts|baseFonts|Math|for|Arial|available|getContext|UI|Sangam|Lucida|Bodoni|in|map|l|plugins|LET|x64Rotl|fillStyle|NODEBUG|width|maxTouchPoints|Bd|New|Other|iterator|createElement|bits|availHeight|Bk|height|LOW_FLOAT|Segoe|source|vertexPosBuffer|Lt|Gill|availWidth|font|e|MEDIUM_FLOAT|anisotropy|MEDIUM_INT|HIGH_FLOAT|LOW_INT|Light|fontList|resolution|is|HIGH_INT|texture|Phone|PRO|RealPlayer|ads|that|toString|seed|c1|results|len|mac|linux|win|a|Flash|fp2|target|Extra||body|Futura|arc||PI|Old|c2|prototype|detected|p|slice|Android|Array|varyinTexCoordinate|Arabic|mobileDevice|Eras|Control|Times|appendChild|Copperplate|vshader|attrVertex|fshader|rgb|definition|not|pair|Serif|vec2|Century|ExtB|00000000|language|new|FB|glContext|toLowerCase|style|tempRes|Roman|errFirefox|size|fill|Md|swfPath|iOS|Rockwell|O|id|fa2s|getExtension|varying|Medium||Serifa|module|Geometr231|uniformOffset|Black|fa|Tw|image|Univers|ext|touchEvent|no|x64Fmix|defaultHeight|option|Cen|beginPath|Skipping|unknown|defaultWidth|vectors|closePath|enumeration|fingerprinting|WebGL|uniform|use|units|should|swfobject|Chrome|Opera|Incised901|err|Safari|define|Hand|remainder|detectScreenOrientation|Solid|Text|hiddenCallback|isCanvasSupported|Wingdings|Apple|Internet|Explorer|elem|Firefox|b|swfContainerId|mt|node|Mac|productSub|each|nativeMap|msMaxTouchPoints|call|sortPluginsFor|newKeys|values|forEach|Typewriter|nativeForEach|Linux|getIEPlugins|Garamond|mimeTypes|Miriam|Modern|Zurich|BlkEx|AgControl|pluginsKey|vext|glyphs|quiz|testSize|ude03|ud83d|DevalVRXCtrl|ADOBE|Perpetua|getWebglFp|Cn|Onyx|removeChild|Albertus|fjordbank|matched|detect|getRegularPlugins|evenodd|English|offsetWidth|fontFamily|American|Titling|extendedFontList|offsetHeight|testString|Msxml2|G2|AvantGarde|names|getTouchSupport|ActiveXObject|rmocx|touchStart|TDCCtl|Engraved|Palatino|getCanvasFp|MYRIAD|doNotTrack|getDoNotTrack|Unicode|getNavigatorCpuClass|hasSessionStorage|PMingLiU|hasLocalStorage|cpuClass|getNavigatorPlatform|re|pluginsShouldBeSorted|Pro|touchSupportKey|News|ShockwaveFlash|Niagara|Cambria|hasIndexedDB|PDF|Poster|Comic|11pt|Euphemia|fillText|MacromediaFlashPaper|TT|Mono|Baiti|QuickTime|murmur|Reference|ActiveX|rect|bit|SWCtl|Mincho|Helvetica|Courier|RealVideo|tm|Demi|Cwm|hasLiedResolutionKey|ipad|iphone|other|sessionStorageKey|android|localStorageKey|ontouchstart|searchElement|getHasLiedBrowser|getAvailableScreenResolution|Bradley|availableScreenResolutionKey|Bangla|timezoneOffsetKey|Symbol|Kabel|getHasLiedOs|getHasLiedResolution|because|indexedDbKey|Minion|Goudy|version|Style|addBehaviorKey|Kaufmann|fromIndex|languages|firstLanguages|substr|getHasLiedLanguages|excludeSessionStorage|abs|getAdBlock|throw|getScreenResolution|flashparams|getWebglCanvas|experimental|flashvars|extend|languageKey|getUserAgent|bytes|SimSun|Humanst521|x64hash128|userAgentKey|Fixed|msg|console|list|ProN|Hiragino|isIE|appName|Heiti|screenResolutionKey|isWebGlSupported|exports|2d|hasSwfObjectLoaded|defaultOptions|loadSwfAndDetectFonts|addFlashDivNode|setAttribute|div|hasMinFlashInstalled|colorDepthKey|CG|strict|itemSize|Meiryo|offsetUniform|vertexPosAttrib|detection|Simplified|Clarendon|Italic|configuration|flash|aliased|flashFontsKey|per|GOTHAM|numItems|toDataURL|attachShader|compileShader|main|vec4|Baskerville|void|serif|MingLiU|MingLiU_HKSCS|jsFontsKey|Tai|createShader|shaderSource|fShaderTemplate|vShaderTemplate|skipping|ARRAY_BUFFER|vertices|range|excludeFlashFonts||GeoSlab|canvasKey|webglKey|excludeWebGL|hasLiedLanguagesKey|Berlin|doNotTrackKey|Lithograph|Chalkboard|openDatabaseKey|Ultra|cpuClassKey|platformKey|Charter|adBlockKey|VERSION|ZapfHumnst|yes|fontsKey|maxAnisotropy|hasLiedOsKey|hasLiedBrowserKey|Cochin|CloisterBlack|Centaur|Cezanne|SE|Cooper|Constantia|Curlz|Cuckoo|Chaucer|Coronet|Omega|CopperplGoth|Cornerstone|Chiller|Californian|Calisto|Colonna|Calligrapher|ChelthmITC|Charlesworth|CaslonOpnface|Chalkduster|Castellar|Cordia|Corbel|CordiaUPC|Candara|Freefrm721|Gisha|Ext|Gigi|Gloucester|BOLD|GoudyOLSt|GoudyHandtooled|Stout|XBd|Hv|ZBlk|FRUTIGER|Fruitger|FuturaBlack|Gabriola|Geeza|Gautami|Galliard|Gujarati|Gulim|Herald|HELV|TC|High|Tower|Humanst|Hoefler|Kaku|SC|Heather|GungsuhChe|Gungsuh|GulimChe|Gurmukhi|Haettenschweiler|Harrington|Harlow|FrnkGothITC|French|DIN|DilleniaUPC|Didot|DokChampa|Dotum|Edwardian|Ebrima|DotumChe|SB|DFKai|DB|David|Dauphin|LCD|Temp|Denmark|DELICIOUS|Elephant|Vivace|Forte|Footlight|FONTIN|FrankRuehl|Fransiscan|Freestyle|FreesiaUPC|Blk|Fixedsys|Felix|EucrosiaUPC|EngraversGothic|Engravers|UCAS|EUROSTILE|FangSong|Exotc350|DaunPenh|Consolas|excludeJsFonts|has_lied_browser|excludeHasLiedBrowser|has_lied_os|Swfobject|skipped|you|To|installed|excludeHasLiedOs|has_lied_resolution|supported|it|excludeCanvas|do_not_track|excludeAdBlock|adblock|excludeHasLiedResolution|has_lied_languages|excludeHasLiedLanguages|must|pass|Narrow|Hebrew|Andale|innerHTML|Rounded|Bitstream|Antiqua|Book|Vera|fontSize|span|setTimeout|swf_fonts|valid|monospace|sans|getElementsByTagName|72px|mmmmmmmmmmlli|excludeDoNotTrack|navigator_platform|compiled|colorDepth|color_depth|excludeColorDepth|excludeScreenResolution|excludeAvailableScreenResolution|excludeTimezoneOffset|available_resolution|fingerprintjs2|FontList||swf|user_agent|get|excludeUserAgent|excludeLanguage|userLanguage|palemoon|systemLanguage|browserLanguage|timezone_offset|Date|excludeOpenDatabase|add_behavior|addBehavior|excludeAddBehavior|openDatabase|open_database|excludePlatform|cpu_class|excludeCpuClass|indexed_db|excludeIndexedDB|while|session_storage|getTimezoneOffset|Infinity|s|local_storage|TypeError|or|Bookman|Calibri|Face|BankGothic|amd|Bank|Batang|BatangChe|Bazooka|Bauhaus|Bauer|Bandy|Ayuthaya|Typesetting|Neo|SD|Emoji|ARCHER|ARNO|AVENIR|Aurora|Arrus|Bell|Bembo|Boulder|Bookshelf|Compressed|Smallcaps|Bremen|Britannic|BrowalliaUPC|Browallia|Broadway|Oldstyle|BlairMdITC|BernhardFashion|Bernard|Benguiat|BernhardMod|Big|Blackadder|BinnerD|Caslon|Color|Chancery|Monotype|Monaco|Handwriting|GRANDE|Corsiva|Outlook|Print|Linotype|PGothic|LUCIDA|Fax|Georgia|Geneva|Schoolbook|Neue|Impact|Console|Calligraphy|Bright|Semibold|Tahoma|Andalus|AmerType|Amazone|Algerian|Angsana|AngsanaUPC|Aparajita|Olive|Antique|Aharoni|Agency|Verdana|Trebuchet|PS|Abadi|Academy|GARAMOND|Adobe|CASLON|Brush|Souvenir|clearColor|fp|multiply|globalCompositeOperation|enable|DEPTH_TEST|COLOR_BUFFER_BIT|clear|LEQUAL|depthFunc|18pt|rgba|alphabetic|textBaseline|isPointInPath|winding|f60|fillRect|real|dontUseFakeFontInCanvas|069|DEPTH_BUFFER_BIT|EXT_texture_filter_anisotropic|linkProgram|createProgram|STATIC_DRAW|bufferData|useProgram|getAttribLocation|vertexAttribPointer|vertexPosArray|enableVertexAttribArray|getUniformLocation|732134444|Float32Array|attribute|MAX_TEXTURE_MAX_ANISOTROPY_EXT|MOZ_EXT_texture_filter_anisotropic|WEBKIT_EXT_texture_filter_anisotropic|gl_Position|mediump|bindBuffer|createBuffer|gl_FragColor|inline|display|type|sort|regular_plugins|ie_plugins|suffixes|description|XMLHTTP|Stream|Adodb|AcroPDF|excludePlugins|js_fonts|Dm|ZapfEllipt|Latin|Wide|Zapfino|Ex|concat|cj|ZWAdobeF|PdfCtrl|QuickTimeCheckObject|localStorage|sessionStorage|touch_support|excludeTouchSupport|indexedDB|createEvent|2000|_|TouchEvent|break|match|Shell|Dictionary|Scripting|QuickTimeCheck|UIHelper|Skype|OCX|WMPlayer|Detection|FLOAT|uniform2f|chrome|opr|opera|firefox|safari|trident|errOfErr|toSource|eval|20030107|ipod|pike|your|incomplete|VENDOR|vendor|does|support|phone|windows|getElementById|WebGLRenderingContext|Netscape|0x87c37b91|0x1a85ec53|0xc4ceb9fe|0xed558ccd|0x114253d5|0x4cf5ad43|switch|0x38495ab5|0x52dce729|0x2745937f|0xff51afd7|hasOwnProperty|___fp_swf_loaded|hasFlashPlayerVersion|test|Trident|onReady|allowScriptAccess|embedSWF|menu|always|STENCIL_BITS|stencil|BLUE_BITS|blue|antialias|getContextAttributes|depth|DEPTH_BITS|MAX_COMBINED_TEXTURE_IMAGE_UNITS|combined|GREEN_BITS|green|antialiasing|ALPHA_BITS|getSupportedExtensions|extensions|TRIANGLE_STRIP|drawArrays|line|ALIASED_LINE_WIDTH_RANGE|alpha|ALIASED_POINT_SIZE_RANGE|point|cube|MAX_CUBE_MAP_TEXTURE_SIZE|red|MAX_VIEWPORT_DIMS|dims|viewport|RED_BITS|renderer|SHADING_LANGUAGE_VERSION|shading|RENDERER|MAX_VERTEX_UNIFORM_VECTORS|MAX_VERTEX_TEXTURE_IMAGE_UNITS|MAX_RENDERBUFFER_SIZE|buffer|render|MAX_FRAGMENT_UNIFORM_VECTORS|MAX_TEXTURE_IMAGE_UNITS|MAX_TEXTURE_SIZE|MAX_VERTEX_ATTRIBS|attribs|MAX_VARYING_VECTORS|WHITNEY|DOMDocument|Lisa|Mongolian|Mona|No|Mistral|MONO|MoolBoran|PMincho|LineDraw|Eaves|Mrs|Yi|YaHei|Capitals|Matura|Matisse|Marlett|Himalaya|JhengHei|Uighur|Le|PhagsPa|Lue|Specialty|MUSEO|OSAKA|Oriya|OPTIMA|Extended|OzHandicraft|Palace|Pegasus|Party|Parchment|Papyrus|A|OCR|Narkisim|Nadeem|Boli|MV|NEVIS|GothicMT|Nyala|Westminster|Noteworthy|NewsGoth|Market|Felt|Ult|Juice|Jokerman|Jester|Kailasa|KaiTi|Khmer|Kartika|Kannada|Kalinga|Jenson|Jazz|Informal|INCONSOLATA|Shadow|Imprint|Informal011|INTERSTATE|JasmineUPC|Pota|Iskoola|IrisUPC|KodchiangUPC|Kokila|GD|Maiandra|Magneto|Lydian|Malayalam|Malgun|Marker|Marion|Marigold|Mangal|Island|Long|Kunstler|Krungthep|Kristen|Korinna|Lao|Latha|LilyUPC|Levenim|Letter|Leelawadee|PetitaBold|NSimSun|Swiss911|Swis721|Subway|Pickwick|XCm|Sylfaen|Technical|Tamil|System|Synchro|Storybook|Stencil|Fonts|Small|Skia|Sketch|Snap|Snell|Steamer|Staccato222|Socket|Roundhand|Teletype|Telugu|Vani|Vagabond|Utsaah|CE|Vijaya|Viner|Vrinda|Vladimir|Vivaldi|VisualUI|Unicorn|TypoUpright|Traditional|Thonburi|Terminal|Tempus|Trajan|TRAJAN|Tunga|Tubular|Tristan|Sinhala|Styllo|Sakkal|Rod|Ribbon131|Ravie|Majalla|Santa|SCRIPTINA|Sceptre|Savoye|Fe|SimHei|Raavi|Poor|Playbill|Cherokee|Plantagenet|Richard|PosterBodoni|Pythagoras|PTBarnum|Pristina|PRINCETOWN|Th|Rage|Showcard|Sherwood|Shruti|Signboard|SILKSCREEN|ShelleyVolante|Shonar'.split('|'), 0, {}));
eaCtrl.banner = {
    sTag: "",
    getVersion: function() {
        return "4.0"
    },
    imghwd: [],
    display: function(ii, json) {
        if (typeof eaCtrl.c[ii] == "undefined") {
            console.log("cannot find item " + ii);
            return
        }
        var ai = eaCtrl.c[ii];
        var o = this;
        if (eaCtrl.getItem(json, 'sellingtype', 'unk') == 'own_ad_eactrl') {
            json.type = eaCtrl.getItem(ai.defaultad, 'type', 'image');
            switch (json.type) {
                case "image":
                    json.bannerpath = eaCtrl.getItem(ai.defaultad, 'image', '');
                    json.destinationurl = eaCtrl.getItem(ai.defaultad, 'url', '');
                    break;
                case "iframe":
                    json.bannerpath = eaCtrl.getItem(ai.defaultad, 'iframe', '');
                    break;
                case "html":
                    json.html = eaCtrl.getItem(ai.defaultad, 'html', '');
                    break
            }
            json.bannertype = json.type;
            json.isrtb = 0;
            json.networkid = 0;
            json.isownad = 0;
            json.ispubad = 1
        }
        this.t(ii, json, function(h) {
            var Bfound = false;
            var bExit = false;
            eaCtrl.jq("#" + ai.display).each(function(i, node) {
                if (eaCtrl.jq(node).attr('run') != '1' || eaCtrl.getItem(ai, 'reload', 0) == 1) {
                    delete ai.reload;
                    if (ai.plugin == "banner") {
                        if (eaCtrl.abDetected) {
                            eaCtrl.jq("#" + ai.display).removeAttr("style")
                        }
                        if (!eaCtrl.jq("#" + ai.display).is(":visible")) {
                            if (eaCtrl.getItem(ai, 'isflt', 0) != 1) {
                                if (!eaCtrl.abDetected) {
                                    eaCtrl.i("AdTag " + ai.display + " is not visible, abort loading");
                                    bExit = true;
                                    return true
                                } else {
                                    eaCtrl.i("AdTag " + ai.display + " is not visible, probably because the active adblocker")
                                }
                            }
                        }
                    }
                    eaCtrl.jq(node).attr('run', '1');
                    eaCtrl.jq(node).html(h);
                    if (typeof ai.onload == "function") {
                        try {
                            ai.onload(function() {})
                        } catch (_0) {
                            eaCtrl.i("something went wrong with executing the onload function for adtag:" + eaCtrl.getItem(ai, 'name', 'unk'));
                            eaCtrl.i(_0)
                        }
                    }
                    var s = o.makeId(15) + i;
                    eaCtrl.jq(node).attr('id', s);
                    ai.display = s;
                    var ir = eaCtrl.getItem(ai, 'reloadtime', 0);
                    if (ir > 0) {
                        if (ir < 30) {
                            ir = 30
                        }
                        ir = (ir * 1000);
                        setTimeout(function() {
                            if (typeof ai.onbeforeReload == "function") {
                                try {
                                    ai.onbeforeReload(function() {
                                        o.reload(ii)
                                    })
                                } catch (_0) {
                                    eaCtrl.i("something went wrong with executing the onbeforeReload function for adtag:" + eaCtrl.getItem(ai, 'name', 'unk'));
                                    eaCtrl.i(_0);
                                    o.reload(ii)
                                }
                            } else {
                                o.reload(ii)
                            }
                        }, ir)
                    }
                    Bfound = true;
                    return false
                }
            });
            if (bExit) {
                return
            }
            if (!Bfound) {
                eaCtrl.i("Could not find element with id:" + ai.display)
            } else {
                o.j(ii)
            }
        })
    },
    reload: function(ii) {
        var ai = eaCtrl.c[ii];
        ai.q = false;
        try {
            delete ai.data;
            delete ai.q;
            delete ai.btype;
            delete ai.state;
            delete ai.settings
        } catch (e) {}
        ai.reload = 1;
        ai.state = 0;
        eaCtrl.run()
    },
    k: function(l, ii) {
        var ai = eaCtrl.c[ii];
        if (typeof ai.binloaded != 'undefined' && ai.binloaded) {
            return
        }
        var s = l.src;
        var ob = this;
        if (eaCtrl.getItem(ai.data, 'isrtb', '0') == '1') {
            if (ai.data.xparams.networkid != '1') {
                return
            }
        }
        if (eaCtrl.ca.datapath != '') {
            s = s.replace(eaCtrl.ca.datapath, '');
            if (l.src != s) {
                var n = s.indexOf(eaCtrl.datapath);
                s = s.substring(n);
                s = (eaCtrl.m() ? 'https://' : 'http://') + eaCtrl.datadomain + '/' + s;
                eaCtrl.i("datapath wrong, swapping image from:" + l.src + " to:" + s);
                l.src = s;
                return
            }
        }
        if (eaCtrl.ca.datadomain != '') {
            s = s.replace(eaCtrl.ca.datadomain, eaCtrl.datafailover_domain);
            if (l.src != s) {
                eaCtrl.i("datadomain wrong, swapping image from:" + l.src + " to:" + s);
                l.src = s;
                return
            }
        }
        s = s.replace(eaCtrl.datadomain, eaCtrl.datafailover_domain);
        if (l.src != s && !eaCtrl.abDetected) {
            eaCtrl.i("swapping image from:" + l.src + " to:" + s);
            l.src = s;
            return
        }
        s = s.replace((eaCtrl.m() ? 'https://' : 'http://') + eaCtrl.datafailover_domain, '').replace(eaCtrl.datapath, '').replace('//', '');
        if (l.src != s) {
            eaCtrl.o("loadimage", "&act=getimage&f=" + s, 0, {
                result: function(uri) {
                    var b = '';
                    if (ai.responsive == '1') {
                        b = 'width="100%"'
                    } else {
                        b = 'width="' + ai.data['adwidth'] + '" height="' + ai.data['adheight'] + '"'
                    }
                    var str = '<img rel="nofollow" src="' + uri + '" ' + b + ' border="0" id="' + ob.sTag + ii + '">';
                    eaCtrl.jq(l.parentNode).html(str);
                    eaCtrl.banner.j(ii);
                    eaCtrl.i("Image Loaded as binary data");
                    return
                }
            })
        }
    },
    j: function(ii, p) {
        var u = 'undefined';
        if (typeof p != u) {
            this.imghwd[ii] = p
        } else {
            var p = this.imghwd[ii]
        }
        var ai = eaCtrl.c[ii];
        eaCtrl.jq("#" + this.sTag + ii + "_2").bind('load', function() {
            eaCtrl.banner.q(ii, ai.btype, this, p)
        });
        eaCtrl.jq("#" + this.sTag + ii).bind('error', function() {
            if (typeof p != u && typeof p.onerror != u) {
                p.onerror()
            }
            breload = true;
            if (ai.btype == "image") {
                if (this.src.indexOf(eaCtrl.datadomain)) {
                    breload = false;
                    eaCtrl.banner.k(this, ii)
                }
            }
            if (breload) {
                eaCtrl.banner.reload(ii)
            }
        });
        if (ai.btype == "image") {
            eaCtrl.jq("#" + this.sTag + "u" + ii).bind('click', function(event) {
                event.stopImmediatePropagation();
                var ad = ai.data;
                var url = eaCtrl.getItem(ad, 'destinationurl', '');
                eaCtrl.banner.open(url);
                var uri = 'act=logclick&xref=' + ad.hash;
                eaCtrl.o('logclick', uri, 0, {
                    result: function(a) {}
                });
                eaCtrl.bkLog('click', ii, {
                    isiframe: 0
                });
                return false
            })
        } else if (ai.btype == 'iframe') {
            eaCtrl.jq("#" + this.sTag + ii).bind('load', function() {
                var isOverIframe = false;
                var onBlur = function() {
                    if (isOverIframe === true) {
                        isOverIframe = false;
                        var ad = ai.data;
                        var uri = 'act=logclick&xref=' + ad.hash;
                        eaCtrl.o('logclick', uri, 0, {
                            result: function(a) {}
                        });
                        eaCtrl.bkLog('click', ii, {
                            isiframe: 1
                        })
                    }
                };
                var iframeClick = function() {
                    eaCtrl.jq("#frmtrck_" + ii).mouseenter(function() {
                        isOverIframe = true
                    });
                    eaCtrl.jq("#frmtrck_" + ii).mouseleave(function() {
                        setTimeout(function() {
                            isOverIframe = false
                        }, 500)
                    });
                    eaCtrl.jq(document).on('visibilitychange', function() {
                        onBlur()
                    })
                };
                iframeClick()
            })
        }
    },
    q: function(ii, ah, s, p) {
        var u = 'undefined';
        if (eaCtrl.abDetected) {
            if (typeof ah != u) {
                if (ah == 'img') {
                    if (typeof eaCtrl.jq(s).attr('class') != u) {
                        eaCtrl.i("Swap image because ab blocked");
                        this.k(s, ii);
                        return
                    }
                }
            }
        }
        if (typeof p != u && typeof p.onload != u) {
            p.onload()
        }
        var a = eaCtrl.c[ii].data;
        if (typeof a.q != 'undefined' && a.q) {
            this.reload(ii);
            return
        } else {
            var ai = eaCtrl.c[ii];
            if (eaCtrl.abDetected && ai.data.type == 'image' && ai.plugin == "banner") {
                if (!eaCtrl.jq("#" + ai.display).is(":visible")) {
                    eaCtrl.jq("#" + ai.display).attr("style", "display:block !important");
                    if (!eaCtrl.jq("#" + ai.display).is(":visible")) {
                        eaCtrl.i("Ad hided by adblocker");
                        return
                    }
                } else {
                    if (!eaCtrl.jq("#" + this.sTag + ii).is(":visible")) {
                        eaCtrl.jq("#" + this.sTag + ii).attr("style", "display:block !important");
                        if (!eaCtrl.jq("#" + this.sTag + ii).is(":visible")) {
                            eaCtrl.i("Ad hided by adblocker");
                            return
                        }
                    }
                }
            }
            eaCtrl.c[ii].q = true;
            eaCtrl.i(ai.plugin + ' ItemId:' + ii + " finished");
            if (typeof a.nurl != u && a.nurl != '') {
                var ul = a.nurl.replace('${AUCTION_PRICE}', a.bid);
                var si = '<img src="' + ul + '" border="0" width="1" height="1"/>';
                eaCtrl.jq('body').append(si)
            }
            var uri = 'act=logimp&xref=' + a.hash;
            eaCtrl.o('logimp', uri, 0, {
                result: function(a) {
                    if (typeof a != 'undefined' && a != '') {
                        a = jQuery.parseJSON(a);
                        if (eaCtrl.getItem(a, 'denied', '0') == '1') {
                            eaCtrl.banner.reload(ii)
                        }
                    }
                }
            });
            eaCtrl.bkLog('view', ii)
        }
    },
    iframe: function(a) {
        var h = '<iframe class=""  name="' + eaCtrl.getItem(a, 'name', '') + '" id="' + eaCtrl.getItem(a, 'id', '') + '" src="' + eaCtrl.getItem(a, 'url', '') + '"  width="' + eaCtrl.getItem(a, 'width', '') + '" height="' + eaCtrl.getItem(a, 'height', '') + '"  scrolling="' + eaCtrl.getItem(a, 'scroll', 'no') + '" frameborder="0"></iframe>';
        eaCtrl.jq("#" + a.display).html(h);
        if ("undefined" != typeof(a.onerror)) {
            eaCtrl.jq("#" + a.id).bind('error', function() {
                try {
                    eaCtrl.jq("#" + a.display).html('');
                    a.onerror()
                } catch (_0) {}
            })
        }
        if ("undefined" != typeof(a.onload)) {
            eaCtrl.jq("#" + a.id).bind('load', function() {
                try {
                    a.onload()
                } catch (_0) {}
            })
        }
    },
    open: function(uri) {
        var win = window.open(uri);
        setTimeout(function() {
            if (!win || win.closed) {
                top.location = uri
            }
        }, 500)
    },
    makeId: function(iMax) {
        var t = "";
        var s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        for (var i = 0; i < iMax; i++) {
            t += s.charAt(Math.floor(Math.random() * s.length))
        }
        return t
    },
    loadBin: function(s, c) {
        eaCtrl.o("loadimage", "&act=getimage&f=" + s, 0, {
            result: function(ar) {
                var sd = '';
                if (typeof ar.errors != 'undefined') {
                    eaCtrl.jq.each(ar.errors, function(i, v) {
                        if (typeof v != 'undefined' && v != '') {
                            eaCtrl.i(v)
                        }
                    })
                }
                sd = ar.data;
                c(sd)
            }
        })
    },
    t: function(ii, json, z) {
        if (this.sTag == '') {
            var i = Math.floor((Math.random() * 20) + 1);
            this.sTag = this.makeId(i)
        }
        var ai = eaCtrl.c[ii];
        var b = '';
        var h = '';
        if (ai.responsive == '1') {
            b = 'width="100%"'
        } else {
            b = 'width="' + json.adwidth + '" height="' + json.adheight + '"'
        }
        eaCtrl.c[ii].btype = json.type;
        var ttl = eaCtrl.getItem(json, 'ainfo', '');
        if (ttl != '') {
            ttl = 'title="' + ttl + '" '
        }
        switch (json.type) {
            case "iframe":
                var iframe = json.bannerpath;
                h = '<span id="frmtrck_' + ii + '" bnrid="' + ii + '"><iframe ' + ttl + ' sandbox="allow-scripts allow-popups allow-forms" src="' + iframe + '" ' + b + '  id="' + this.sTag + ii + '" frameborder="0" scrolling="no"></iframe></span>';
                h += '<img width="0" height="0" id="' + this.sTag + ii + '_2" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" alt="Advertisement"/>';
                break;
            case "image":
                var bi = false;
                var f = '';
                if (typeof json.isownad != 'undefined' && json.isownad == 1) {
                    var sPath = (eaCtrl.getItem(eaCtrl.ca, 'datapath', ''));
                    if (sPath == '') {
                        f = (eaCtrl.m() ? 'https://' : 'http://') + eaCtrl.getItem(eaCtrl.ca, 'datadomain', eaCtrl.datadomain);
                        bi = true
                    } else {
                        if (eaCtrl.getItem(eaCtrl.ca, 'datadomain', '') != '') {
                            f = (eaCtrl.m() ? 'https://' : 'http://') + eaCtrl.ca.datadomain + sPath
                        } else {
                            f = sPath
                        }
                    }
                    f += '/' + eaCtrl.datapath + json.bannerpath
                } else {
                    f = json.bannerpath
                }
                h = '<a id="' + this.sTag + 'u' + ii + '"  href="#" rel="nofollow"><img ' + ttl + '  id="' + this.sTag + ii + '" src="%%img%%" ' + b + ' border="0"/></a>';
                h += '<img width="0" height="0"  id="' + this.sTag + ii + '_2" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==" alt="Advertisement"/>';
                if ((eaCtrl.abDetected && bi)) {
                    var o = this;
                    o.loadBin(f, function(s) {
                        ai.binloaded = true;
                        h = h.replace('%%img%%', s);
                        z(h)
                    });
                    return
                }
                h = h.replace('%%img%%', f);
                break;
            case 'html':
                var h = json.html;
                h = h.replace(new RegExp("<img ", "ig"), '<img ' + ttl + ' id="' + this.sTag + ii + '" ');
                if (h.indexOf("width") == -1) {
                    h = h.replace(new RegExp("<img ", "ig"), '<img ' + b + ' ')
                }
                h = h.replace(new RegExp("<iframe ", "ig"), '<iframe ' + ttl + ' sandbox="allow-scripts allow-popups allow-forms" id="' + this.sTag + ii + '"');
                h += '<img width="0" height="0" id="' + this.sTag + ii + '_2" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="/>';
                break;
            default:
                eaCtrl.i("unknown bannertype:" + json.type);
                break
        }
        z(h)
    }
};
eaPopn = function() {
    this.phwnd = null;
    this.url = '';
    this.clickHandler = ['body'];
    this.ignoreList = [];
    this.cookieName = '';
    this.isPopunder = false;
    this.skipCookie = false;
    this.cookieTime = 900;
    this.nurls = {};
    this.rtbHwnd = null;
    this.popFired = false;
    this.jq = null;
    this.xbtn = false;
    this.bjUsed = false;
    this.left = 0;
    this.p_width = 1024;
    this.p_height = 768;
    this.top = 0;
    this.ii = 0;
    this.capSettings = {
        repeatAmount: 0,
        repeatInterval: 0
    };
    this.cHash = "";
    this.genUrl = function(ai, spaceid) {
        var sDomain = "//go.ero-advertising.com";
        var u = "undefined";
        if (typeof eaCtrl.ca.ctrl_domain != u && eaCtrl.ca.ctrl_domain != "") {
            sDomain = eaCtrl.ca.ctrl_domain
        }
        var suri = sDomain + '/pop.go?ctrlid=' + eaCtrl.ctrlId + '&spaceid=' + spaceid + eaCtrl.getItem(ai, 'subid', '', true, '&channel=') + '&rnd=' + Math.random();
        if (eaCtrl.abDetected) {
            suri += '&ab=1'
        }
        if (typeof ai.defaultad == 'object') {
            suri += '&foad=' + eaCtrl.encode(JSON.stringify(ai.defaultad))
        }
        if (typeof ai.rtbext == "object") {
            suri += '&rtbext=' + eaCtrl.encode(JSON.stringify(ai.rtbext))
        }
        suri += '&sh=' + eaCtrl.getItem(screen, 'height', 0);
        suri += '&sw=' + eaCtrl.getItem(screen, 'width', 0);
        var tm;
        try {
            tm = new Date().toString().match(/([-\+][0-9]+)\s/)[1]
        } catch (_0) {
            tm = -1
        }
        if (tm == null || tm == '') {
            tm = -1
        }
        suri += '&tz=' + tm.replace('+', '');
        suri += '&wh=' + eaCtrl.jq(window).height() + '&ww=' + eaCtrl.jq(window).width() + '&dh=' + eaCtrl.jq(document).height() + '&dw=' + eaCtrl.jq(document).width();
        suri += '&fprint=' + escape(eaCtrl.f_print);
        suri += '&doc=' + escape(eaCtrl.getItem(document, 'location', ''));
        suri += '&ref=' + escape(eaCtrl.getItem(document, 'referrer', ''));
        return suri
    };
    this.CenterPop = function() {
        var win = window,
            screen = win.screen,
            rootElem = document.body || document.documentElement,
            scrollWidth = win.innerWidth && rootElem && win.innerWidth > rootElem.clientWidth && (win.innerWidth - rootElem.clientWidth);
        var iWidth, cp;
        iWidth = 0;
        cp = 0;
        if (screen) {
            iWidth = scrollWidth ? screen.availWidth - scrollWidth : screen.availWidth;
            cp = screen.availHeight
        } else {
            iWidth = rootElem.clientWidth;
            cp = rootElem.clientHeight
        }
        if (cp > 0 && this.p_height > cp) {
            this.p_height = cp
        }
        if (iWidth > 0 && this.p_width > iWidth) {
            this.p_width = iWidth
        }
        this.left = (iWidth / 2) - (this.p_width / 2);
        this.top = (cp / 2) - (this.p_height / 2)
    };
    this.canrun = function() {
        if (this.skipCookie) {
            return true
        }
        aVar = eaCtrl.getStorage(this.cookieName);
        if (aVar == null || typeof aVar == 'undefined' || typeof aVar.repeatCount == 'undefined') {
            return true
        } else {
            if (aVar.repeatCount < this.capSettings.repeatAmount) {
                iSec = parseInt(this.capSettings.repeatInterval);
                if (typeof aVar.Last != 'undefined' && !isNaN(aVar.Last)) {
                    i = parseInt(this.jq.now() / 1000);
                    is = parseInt(aVar.Last + iSec);
                    if (is < i) {
                        return true
                    } else {
                        eaCtrl.i("Pop need to wait " + (is - i) + " Seconds")
                    }
                } else {
                    return true
                }
            } else {
                eaCtrl.i("Pop repeat amount of " + this.capSettings.repeatAmount + " Reached")
            }
        }
        return false
    };
    this.init = function() {
        if (this.jq == null) {
            this.jq = eaCtrl.jq
        }
        var ob = this;
        ob.initPop()
    };
    this.cl = function(fn) {
        this.phwnd = fn;
        this.adPop()
    };
    this.checkParents = function(aNode, findNode) {
        var aParents = this.jq(aNode).parents();
        var bFound = false;
        this.jq.each(aParents, function(i, v) {
            if (v == findNode) {
                bFound = true;
                return false
            }
        });
        return bFound
    };
    this.checkChilds = function(aNode, findNode) {
        var aChilds = this.jq(aNode).children();
        var bFound = false;
        this.jq.each(aChilds, function(i, v) {
            if (v == findNode) {
                bFound = true;
                return false
            }
        });
        return bFound
    };
    this.canFire = function(aNode) {
        if (!this.canrun()) {
            return false
        }
        var bRet = false;
        var ob = this;
        var bCheckIgnore = false;
        try {
            ob.jq.each(ob.clickHandler, function(i, v) {
                var fNodes = ob.jq(v);
                ob.jq.each(fNodes, function(icnt, fNode) {
                    if (fNode == aNode) {
                        bRet = true;
                        if (this.xbtn) {
                            bCheckIgnore = true
                        }
                        return false
                    } else {
                        if (ob.checkParents(aNode, fNode)) {
                            bRet = true;
                            return false
                        } else if (ob.checkChilds(aNode, fNode)) {
                            bRet = true;
                            return false
                        }
                    }
                });
                if (bRet) {
                    return false
                }
            })
        } catch (_0) {}
        if (bRet && !bCheckIgnore) {
            try {
                ob.jq.each(ob.ignoreList, function(i, v) {
                    var fNodes = eaCtrl.jq(v);
                    ob.jq.each(fNodes, function(icnt, fNode) {
                        if (fNode == aNode) {
                            bRet = false;
                            return false
                        } else if (v != 'body' && ob.checkParents(aNode, fNode)) {
                            bRet = false;
                            return false
                        }
                    });
                    if (bRet == false) {
                        return false
                    }
                })
            } catch (_0) {}
            if (!bRet) {
                eaCtrl.i("Pop cancelled")
            }
        }
        return bRet
    };
    this.adPop = function() {
        var ob = this;
        if (typeof eaCtrl.eaPopShooted == 'undefined') {
            eaCtrl.eaPopShooted = false
        }
        ob.phwnd.add(this.url, {
            cookieExpires: (-1),
            under: ob.isPopunder,
            cookieName: '',
            shouldFire: function() {
                if (eaCtrl.eaPopShooted) {
                    return false
                } else {
                    var aNode = ob.phwnd.getClickedElement();
                    return ob.canFire(aNode)
                }
            },
            afterOpen: function(u, o, p) {
                eaCtrl.eaPopShooted = true;
                eaCtrl.bkLog('view', ob.ii);
                if (!ob.skipCookie) {
                    ob.upDateCookie()
                }
            },
            beforeOpen: function(url, options, popWin) {
                ob.popFired = true
            }
        })
    };
    this.upDateCookie = function() {
        var aVar = eaCtrl.getStorage(this.cookieName);
        try {
            i = parseInt(eaCtrl.jq.now() / 1000);
            e = 'undefined';
            if (aVar == null || typeof aVar == e || typeof aVar.repeatCount == e || typeof aVar.Last == e) {
                aVar = {
                    repeatCount: 0,
                    Last: i
                };
                eaCtrl.setStorage(this.cookieName, aVar, this.cookieTime)
            } else {
                aVar.repeatCount++;
                aVar.Last = i;
                eaCtrl.setStorage(this.cookieName, aVar, this.cookieTime)
            }
        } catch (_0) {}
    };
    this.initPop = function() {
        var ob = this;
        if (typeof eaCtrl.eaPopShooted == 'undefined') {
            eaCtrl.eaPopShooted = false
        }
        $(document).click(function(e) {
            var a = e.target;
            if (eaCtrl.eaPopShooted == false && ob.canFire(a)) {
                ob.CenterPop();
                if (!ob.skipCookie) {
                    ob.upDateCookie()
                }
                var win = window.open(ob.url, "_6", "toolbar=1,location=1,directories=0,status=1,menubar=1,width=" + ob.p_width + ",height=" + ob.p_height + ",scrollbars=1,resizable=1,flip=1,top=" + ob.top + ",left=" + ob.left);
                if (ob.cHash != '') {
                    var uri = 'act=logimp&xref=' + ob.cHash;
                    eaCtrl.o('logimp', uri, 0, {
                        result: function(a) {}
                    })
                }
                if (win) {
                    eaCtrl.eaPopShooted = true;
                    setTimeout(function() {
                        if (win && !win.closed) {
                            eaCtrl.bkLog('view', ob.ii)
                        } else {
                            eaCtrl.i("pop is closed")
                        }
                    }, 0)
                }
            }
        })
    };
    this.resetUrl = function(uri) {
        if (this.popFired) {
            return
        }
        this.nurls = {};
        this.url = uri;
        this.phwnd.emptyStack();
        if (!this.bjUsed) {
            this.initPop()
        } else {
            this.adPop()
        }
    };
    this.loadJs = function(sc, c) {
        var sn = document.getElementsByTagName('head')[0];
        if (sn == null) {
            sn = document.body
        }
        s = document.createElement('script');
        s.type = 'text/javascript';
        s.src = '//data.eroadvertising.com/' + sc;
        s.async = 'true';
        if (typeof c != 'undefined' && c != null) {
            s.onload = function() {
                c()
            }
        }
        sn.appendChild(s)
    }
};
eaCtrl.pop = {
    fired: false,
    p_height: screen.availHeight,
    p_width: screen.availWidth,
    c_name: 'p_chk',
    pops: [],
    getVersion: function() {
        return "4.7"
    },
    browser: function() {
        var n = navigator.userAgent.toLowerCase(),
            b = {
                webkit: /webkit/gi.test(n),
                mozilla: (/mozilla/gi.test(n)) && (!/(compatible|webkit)/.test(n)),
                chrome: /chrome/gi.test(n),
                msie: (/msie/gi.test(n)) && (!/opera/.test(n)),
                firefox: /firefox/gi.test(n),
                safari: (/safari/gi.test(n) && !(/chrome/.test(n))),
                opera: /opera|opr/gi.test(n),
                macosx: /mac os x/gi.test(n),
                ios: /iphone|ipad/gi.test(n),
                crios: /crios/gi.test(n),
                winphone: /windows phone/gi.test(n),
                android: /android/gi.test(n),
            };
        b.version = (b.safari) ? (n.match(/.+?(?:on|ri)[\/: ]([\d.]+)/) || [])[1] : (n.match(/.+(?:ox|me|ra|ie|opr)[\/:]([\d.]+)/) || [])[1];
        return b
    },
    display: function(ii, j, tpItem) {
        var u = 'undefined';
        var sDomain = "//go.ero-advertising.com";
        if (typeof eaCtrl.ca.ctrl_domain != u && eaCtrl.ca.ctrl_domain != "") {
            sDomain = eaCtrl.ca.ctrl_domain
        }
        if (typeof window.eaPopShooted == u) {
            window.eaPopShooted = false
        }
        var cname = this.c_name = 'p_check_' + j.spaceid;
        var pop = new eaPopn;
        var ai;
        if (typeof(tpItem) != u) {
            ai = tpItem
        } else {
            ai = eaCtrl.c[ii];
            if (typeof ai.capSettings == 'object') {
                pop.capSettings = ai.capSettings;
                j.settings.capSettings = pop.capSettings
            }
            eaCtrl.c[ii].settings = j.settings
        }
        pop.cookieTime = (ai.settings['refreshtime']);
        if (typeof ai.ignoreTags == 'object') {
            pop.ignoreList = ai.ignoreTags
        }
        if (typeof ai.clickTags != u) {
            pop.clickHandler = ai.clickTags
        } else {
            pop.clickHandler = ['body']
        }
        if (typeof ai.skipCookie != u && ai.skipCookie == true) {
            pop.skipCookie = true
        }
        var purl = '';
        if (typeof j.destinationurl == u || j.destinationurl == '') {
            pop.url = pop.genUrl(ai, j.spaceid);
            purl = pop.url
        } else {
            pop.url = j.destinationurl;
            pop.cHash = j.hash;
            purl = sDomain + '/imp.go?xref=' + j.hash
        }
        if (typeof ai.onReady != u) {
            ai.onReady(purl);
            return
        }
        pop.cookieName = cname;
        pop.jq = eaCtrl.jq;
        pop.ii = ii;
        var ispu = j.settings.displaytype == 2;
        if (ispu) {
            var b = this.browser();
            if (b.chrome) {
                ispu = false
            }
        }
        ispu = false;
        pop.isPopunder = false;
        pop.init()
    },
};
                                    

Executed Writes (1)

#1 JavaScript::Write (size: 34, repeated: 1) - SHA256: 2b316255a36ee467a5d979ef0820784e2c6a926f9415504a60dea858f51d91e6

                                        < script > document.F = Object < /script>
                                    


HTTP Transactions (217)


Request Response
                                        
                                            GET /info.php?uid=194749&c=djQub2lTQzVLMUsrQWVLc1M2OFFLNGRydXRyd2FFb1pkTFZaZUZURTkrRmNjK2JiMUwvQWJBTE1vNHV2VWVrWk5XYTZQaE02WENzV1NkV1FUd1FnQWNkbmRjZDBqVXlvRm1OOEpJejh4OWpqNWVMZ2pOMTBSaVFaNFNmKzBmemxyZnJvbGtrMFBkN1VFU0J3dFVLQVZKSm5oTXlqYlVLRlFndFg1dTZSWkhZNTVkM2RQSkJ2eXBEQXhqcGtvcjI3OURReWU5RlhuOHdpQzBWVG5FdWZvM0k5cm16V3BVVTd2dHA5VW9kSmVpWEhZbEJoYldEVG5Xd2U5SVo0R1cxRmIzWGp3ckQrZUk4djBkQUJXRTNHNmswYjY3aDdBanRTQTMyUmVLQ0FYR1E3d2ExL04yQm56K3ZRc2JOL1ZnL1lmb0lwT3o1d29Qb1FpWExHWFdxVFBjV0hZT3lXRzUrZmMyU0FUNStmT1hPZ2NRK2NBM1NCMG9SQmVqRlVrZmFNT1IyREtLRXViQ080d2t4N1JsWHk5VzlNMTJHVHFYYTFLcnoyWEk9&ts=5023238&da78=5023238 HTTP/1.1 
Host: bgxmq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

                                         
                                         88.85.93.143
HTTP/1.1 302 Found
Content-Type: text/html; charset=UTF-8
                                        
Server: nginx
Date: Tue, 18 Jun 2019 19:10:13 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Set-Cookie: tsid=djQub2lTQ2ZwamJQMTdNcUNzUDd6bGEwczREL1pPQytJSEt0d1lMWUpPUXBURm1IdU54RzRaM2VrZzNJZXp4VWxTSXV1QXU5RW1SRkZzdlRFTT0%3D; expires=Thu, 18-Jul-2019 19:10:13 GMT; Max-Age=2592000; domain=.bgxmq.com slot_number=1; expires=Tue, 18-Jun-2019 23:10:13 GMT; Max-Age=14400; domain=.bgxmq.com slot_number_1=5023238; expires=Tue, 18-Jun-2019 23:10:13 GMT; Max-Age=14400; domain=.bgxmq.com uid=WFVdTl0JNxWBggLbp+caAg==; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/
Location: https://rsepv.com/cu.php?block_data[cu][p]=312256&block_data[cu][b]=879043&output=direct


--- Additional Info ---
                                        
                                            POST / HTTP/1.1 
Host: ocsp.int-x3.letsencrypt.org
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 117
Content-Type: application/ocsp-request

                                         
                                         91.135.34.24
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Server: nginx
Content-Length: 527
Etag: "CC44377BF142C53637BD88F979CF5A1A675C4DFF62FA7F729C52A95A05F61413"
Last-Modified: Tue, 18 Jun 2019 04:00:00 UTC
Cache-Control: public, no-transform, must-revalidate, max-age=43200
Expires: Wed, 19 Jun 2019 07:10:13 GMT
Date: Tue, 18 Jun 2019 19:10:13 GMT
Connection: keep-alive


--- Additional Info ---
Magic:  data
Size:   527
Md5:    06165f374fd8532d6dae07a113c36f98
Sha1:   990d488d42e0c832b3a089090f7c9b2020a9766d
Sha256: cc44377bf142c53637bd88f979cf5a1a675c4dff62fa7f729c52a95a05f61413
                                        
                                            POST / HTTP/1.1 
Host: isrg.trustid.ocsp.identrust.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 115
Content-Type: application/ocsp-request

                                         
                                         91.135.34.26
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Server: Apache
Content-Transfer-Encoding: Binary
Last-Modified: Sat, 15 Jun 2019 08:53:07 GMT
Etag: "def5f27e3201dff9be1d83e14e3e8dd9602e4bd2"
Content-Length: 1398
Cache-Control: public, no-transform, must-revalidate, max-age=27887
Expires: Wed, 19 Jun 2019 02:55:00 GMT
Date: Tue, 18 Jun 2019 19:10:13 GMT
Connection: keep-alive


--- Additional Info ---
Magic:  data
Size:   1398
Md5:    ab868415707dd2e75793179846c2e3e9
Sha1:   def5f27e3201dff9be1d83e14e3e8dd9602e4bd2
Sha256: ca6e1ae9d0d96ea5f84873bb1d9bfc75b44f7e639547aa094136e2cb4f2c7cea
                                        
                                            GET /cu.php?block_data[cu][p]=312256&block_data[cu][b]=879043&output=direct HTTP/1.1 
Host: rsepv.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

                                         
                                         88.85.93.34
HTTP/1.1 302 Found
Content-Type: text/html; charset=UTF-8
                                        
Server: nginx
Date: Tue, 18 Jun 2019 19:10:13 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Last-Modified: Tue, 18 Jun 2019 19:10:13 GMT
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Set-Cookie: tsid=djQub2lTQ2ZwamJQMTdNcUNzUDd6bGEwczREL1pPQytDMUFZKzZSY2Q5cEg3bGg4NUlLUCtodFZEY3BUL1hjYW9OUG5Xcm1SdmtNS2IvRE1RPT0%3D; expires=Thu, 18-Jul-2019 19:10:13 GMT; Max-Age=2592000; domain=.rsepv.com uid=WFVdTl0JNxWBewLc4YmyAg==; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/
Location: //rsepv.com/info.php?uid=193134&c=djQub2lTQzVERVZVK2NIMUJWNmU1bXpONU9XNEc5ZHc5OHkxaDdDRnJvVHFMUmdGVmFJdGlwMU82dUx5L1NmeTM1ZTNTRm85emxZMER1ZXVIckN6eTg1djdBTkJoUklld2wyYmNmL0k2U0s3ekgzUUo3dXR2T3kxRVd5dmNESVF6MEl5YXQzRk0veXBZRVdVRlRSUWFHRDAxdk5oQzVSSHNBai95NGVITXBOek0vdmZLL1JJQjJjVmsrK25HdHA1SUZjTkxwN0JtOG1rMnNMbTI5S3E5ckc5WWU5WjB5SUU0bFMyRldCbUFOWlo4aE1VNFpDOWpOT0QrakxsVkcyc2RWYmU1M0o3L3NJMmpnUTJMV0Z2Wjh6cllBYWdYNktqUzNjWXVkM09pWE53T0U3Wi9semZSZEhxclpGdVpsaE5VQUJZQ0VERTE5ajFDQS9CNnl4Z0RKQlhHa3M0Q21YN3RlcUpwYng4bTlEUXkrMGJlaXBxYWM0RlQwWUZQR0d0dFdaUUpjPQ%253D%253D&ts=3447189&=3447189


--- Additional Info ---
                                        
                                            GET /info.php?uid=193134&c=djQub2lTQzVERVZVK2NIMUJWNmU1bXpONU9XNEc5ZHc5OHkxaDdDRnJvVHFMUmdGVmFJdGlwMU82dUx5L1NmeTM1ZTNTRm85emxZMER1ZXVIckN6eTg1djdBTkJoUklld2wyYmNmL0k2U0s3ekgzUUo3dXR2T3kxRVd5dmNESVF6MEl5YXQzRk0veXBZRVdVRlRSUWFHRDAxdk5oQzVSSHNBai95NGVITXBOek0vdmZLL1JJQjJjVmsrK25HdHA1SUZjTkxwN0JtOG1rMnNMbTI5S3E5ckc5WWU5WjB5SUU0bFMyRldCbUFOWlo4aE1VNFpDOWpOT0QrakxsVkcyc2RWYmU1M0o3L3NJMmpnUTJMV0Z2Wjh6cllBYWdYNktqUzNjWXVkM09pWE53T0U3Wi9semZSZEhxclpGdVpsaE5VQUJZQ0VERTE5ajFDQS9CNnl4Z0RKQlhHa3M0Q21YN3RlcUpwYng4bTlEUXkrMGJlaXBxYWM0RlQwWUZQR0d0dFdaUUpjPQ%253D%253D&ts=3447189&=3447189 HTTP/1.1 
Host: rsepv.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: tsid=djQub2lTQ2ZwamJQMTdNcUNzUDd6bGEwczREL1pPQytDMUFZKzZSY2Q5cEg3bGg4NUlLUCtodFZEY3BUL1hjYW9OUG5Xcm1SdmtNS2IvRE1RPT0%3D; uid=WFVdTl0JNxWBewLc4YmyAg==

                                         
                                         88.85.93.34
HTTP/1.1 302 Found
Content-Type: text/html; charset=UTF-8
                                        
Server: nginx
Date: Tue, 18 Jun 2019 19:10:13 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Set-Cookie: tsid=djQub2lTQ2ZwamJQMTdNcUNzUDd6bGEwczREL1pPQytDMUFZKzZSY2Q5cEg3bGg4NUlLUCtodFZEY3BUL1hjYW9OUG5Xcm1SdmtNS2IvRE1RPT0%3D; expires=Thu, 18-Jul-2019 19:10:13 GMT; Max-Age=2592000; domain=.rsepv.com slot_number=1; expires=Tue, 18-Jun-2019 23:10:13 GMT; Max-Age=14400; domain=.rsepv.com slot_number_1=3447189; expires=Tue, 18-Jun-2019 23:10:13 GMT; Max-Age=14400; domain=.rsepv.com
Location: http://syndication.exoclick.com/splash.php?idzone=1427160&type=8&sub=347969&tid=999879043


--- Additional Info ---
                                        
                                            GET /splash.php?idzone=1427160&type=8&sub=347969&tid=999879043 HTTP/1.1 
Host: syndication.exoclick.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

                                         
                                         95.211.229.246
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
                                        
Server: nginx
Date: Tue, 18 Jun 2019 19:10:13 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __uvt=a%3A1%3A%7Bi%3A0%3Bs%3A33%3A%225d093715dde993.676436782345307575%22%3B%7D; expires=Thu, 17-Jun-2021 19:10:13 GMT; Max-Age=63072000; domain=exoclick.com
Content-Encoding: gzip


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   575
Md5:    1aca5ac914d86d7656d9b619d43be625
Sha1:   71ee812f6c93b231f5c16b80a85fb697bbefc4cf
Sha256: f7ef7e231f37332b602e2a4b9a35b20d4003e4c97f1927c2523419174beeb04a
                                        
                                            GET /favicon.ico HTTP/1.1 
Host: syndication.exoclick.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: __uvt=a%3A1%3A%7Bi%3A0%3Bs%3A33%3A%225d093715dde993.676436782345307575%22%3B%7D; 965bedf11a0179d682c51e3551512860=1

                                         
                                         95.211.229.246
HTTP/1.1 404 Not Found
Content-Type: text/html
                                        
Server: nginx
Date: Tue, 18 Jun 2019 19:10:13 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Content-Encoding: gzip


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   167
Md5:    fa7816514ee3d85b94792620b30547b8
Sha1:   71db256e77a2b2783f9e60871c851cf05341549d
Sha256: da61f888f21ae8c64013744ea8a857c4ff8706ffe90fe7899392f1836c4f685c
                                        
                                            GET /splash.php?idzone=1427160&type=8&sub=347969&tid=999879043&p=http%3A%2F%2Fkordonivkakino.net&tested=1&check=965bedf11a0179d682c51e3551512860&screen_resolution=1176x885&container_resolution=1176x754&iframe=0 HTTP/1.1 
Host: syndication.exoclick.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://syndication.exoclick.com/splash.php?idzone=1427160&type=8&sub=347969&tid=999879043
Cookie: __uvt=a%3A1%3A%7Bi%3A0%3Bs%3A33%3A%225d093715dde993.676436782345307575%22%3B%7D; 965bedf11a0179d682c51e3551512860=1

                                         
                                         95.211.229.246
HTTP/1.1 302 Found
Content-Type: text/html; charset=UTF-8
                                        
Server: nginx
Date: Tue, 18 Jun 2019 19:10:14 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __uvt=a%3A1%3A%7Bi%3A0%3Bs%3A33%3A%225d093715dde993.676436782345307575%22%3B%7D; expires=Thu, 17-Jun-2021 19:10:14 GMT; Max-Age=63072000; domain=exoclick.com impressions=x%9C%ABV24%B60%B6%B44%D55411%B4%B4%B0%B0T%B2%8A6%D41453%B0%B00504%D1Q%02J%18%28%C5%D6%02%00%C2%9A%09%1A; expires=Wed, 19-Jun-2019 19:10:14 GMT; Max-Age=86400; path=/; domain=.exoclick.com tag-link=v3%7C77.40.129.123%7CNOR%7C1427160%7C14419889%7C0%7C%7C508%7C41%7C3%7C3%7C0%7C0%7C0%7C33596078%7C3143242%7C3143244%7C63%7C1%7C0%7C0%7C0%7C0%7C1%7C0%7C0%7C0%7C5d093715dde993.676436782345307575%7C26b392c3a83692cb8558a5620da0799c%7C347969%7Ckordonivkakino.net%7C1176x885%7C%7C0%7C0%7C0%7Cok; expires=Wed, 19-Jun-2019 19:10:14 GMT; Max-Age=86400; path=/; domain=.exoclick.com
Location: http://tds.tuberl.com/in/exoclick/?comp=1095&source=kordonivkakino.net


--- Additional Info ---
                                        
                                            GET /in/exoclick/?comp=1095&source=kordonivkakino.net HTTP/1.1 
Host: tds.tuberl.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://syndication.exoclick.com/splash.php?idzone=1427160&type=8&sub=347969&tid=999879043

                                         
                                         109.206.162.173
HTTP/1.1 302 Found
                                        
Server: nginx/1.12.2
Date: Tue, 18 Jun 2019 19:10:13 GMT
Content-Length: 0
Connection: keep-alive
Keep-Alive: timeout=30
Set-Cookie: bsi=N5EB3HBtAE2AAAAALEI5f4KtTYAAAAAtAGwnTYAAAAAsQjl_gq1NgAAAAC0AbEAAAlHMIC2AAAAALEI5f4KtTU1K; Version=1; Expires=Wed, 19-Jun-2019 19:10:13 GMT; Max-Age=86400; Path=/
Location: https://pornq.com/?c=1095&sn=kordonivkakino.net
Vary: *
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0


--- Additional Info ---
                                        
                                            POST / HTTP/1.1 
Host: ocsp.comodoca4.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 116
Content-Type: application/ocsp-request

                                         
                                         151.139.128.14
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:14 GMT
Accept-Ranges: bytes
Last-Modified: Thu, 13 Jun 2019 12:24:54 GMT
Server: Apache
Etag: 7DF33DD639F25424000D262F876F9C1E2DAB6B68
Cache-Control: max-age=580402,public,no-transform,must-revalidate
X-OCSP-Responder-ID: mcdpcaocsp11
X-HW: 1560885014.cds034.sk1.h2,1560885014.cds053.sk1.c
Connection: keep-alive
Content-Length: 472


--- Additional Info ---
Magic:  data
Size:   472
Md5:    5172698f494ee95d549d00204130c051
Sha1:   7df33dd639f25424000d262f876f9c1e2dab6b68
Sha256: 965a22441ba0a289f8a2900e9d046bb1427cad32dfadc53a86d53a74a534fe0f
                                        
                                            POST / HTTP/1.1 
Host: ocsp.comodoca4.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 115
Content-Type: application/ocsp-request

                                         
                                         151.139.128.14
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:14 GMT
Accept-Ranges: bytes
Last-Modified: Thu, 13 Jun 2019 12:14:19 GMT
Server: Apache
Etag: 6B85EC0D6D6E65672A14B93F9C78248AB12A26F5
Cache-Control: max-age=302395,public,no-transform,must-revalidate
X-OCSP-Responder-ID: mcdpcaocsp9
X-HW: 1560885014.cds034.sk1.h2,1560885014.cds043.sk1.c
Connection: keep-alive
Content-Length: 727


--- Additional Info ---
Magic:  data
Size:   727
Md5:    1e7d3e7ce086e82ff452058df8aa9660
Sha1:   6b85ec0d6d6e65672a14b93f9c78248ab12a26f5
Sha256: 7bec04149419a00f242a02255e79c7c158624f15295e74c642770bea56efe039
                                        
                                            POST / HTTP/1.1 
Host: ocsp.usertrust.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 115
Content-Type: application/ocsp-request

                                         
                                         151.139.128.14
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:14 GMT
Accept-Ranges: bytes
Last-Modified: Thu, 13 Jun 2019 12:14:19 GMT
Server: Apache
Etag: BD7099D52DDB53DC1BDC20B8D9E85BB5635BA341
Cache-Control: max-age=302399,public,no-transform,must-revalidate
X-OCSP-Responder-ID: mcdpcaocsp8
X-HW: 1560885014.cds048.sk1.h2,1560885014.cds047.sk1.c
Connection: keep-alive
Content-Length: 471


--- Additional Info ---
Magic:  data
Size:   471
Md5:    760b1e55dff500801ab591b697d8d667
Sha1:   bd7099d52ddb53dc1bdc20b8d9e85bb5635ba341
Sha256: c485dd57435fa402136a523ef6309f7274079f92978bc8d48667302137d537b9
                                        
                                            GET /en/?c=1095&sn=kordonivkakino.net HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://syndication.exoclick.com/splash.php?idzone=1427160&type=8&sub=347969&tid=999879043
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014

                                         
                                         104.24.13.115
HTTP/1.1 302 Found
Content-Type: text/html; charset=UTF-8
                                        
Date: Tue, 18 Jun 2019 19:10:14 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Host
X-Powered-By: PHP/5.6.38
Location: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4e8f8fed9a877694-ARN


--- Additional Info ---
                                        
                                            GET /en/?source=392444365&src_hostname=kordonivkakino.net&c=1095 HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://syndication.exoclick.com/splash.php?idzone=1427160&type=8&sub=347969&tid=999879043
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
                                        
Date: Tue, 18 Jun 2019 19:10:14 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding, Host
X-Powered-By: PHP/5.6.38
Set-Cookie: __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; expires=Fri, 17-Jun-2022 19:10:16 GMT; Max-Age=94608000; path=/; domain=.pornq.com
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4e8f8fee1ae87694-ARN
Content-Encoding: gzip


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   87967
Md5:    5ba1f6b3c84e9deb4172d6026b53c105
Sha1:   7fa76ef16d638dca77cd6ad54f6397ac78c03f84
Sha256: 8db52d9f2c4e3d706ce6ce82b86aff4bca527eee5763bca4d13f425f04d21195
                                        
                                            GET /assets/desktop.cb110301bdca143d33cf.min.css HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/css,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: text/css
                                        
Date: Tue, 18 Jun 2019 19:10:14 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Last-Modified: Mon, 18 Feb 2019 12:24:06 GMT
Vary: Accept-Encoding
Etag: W/"5c6aa3e6-902f"
Expires: Fri, 15 Jun 2029 19:10:14 GMT
Cache-Control: public, max-age=315360000
Content-Encoding: gzip
CF-Cache-Status: HIT
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4e8f8fef2d3ddaa8-ARN


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   6983
Md5:    b0fe97023c8126e2713441f3ff689679
Sha1:   96e4a25d29181dfbb2c88f9e87c47ad5cfcde9ab
Sha256: ca71b245a1c297ae0a6387730f89a7331039b3f6b8833c7ad6ac8d4c99fa3cba
                                        
                                            GET /assets/vendor.cb110301bdca143d33cf.min.js HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: application/javascript
                                        
Date: Tue, 18 Jun 2019 19:10:14 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Last-Modified: Mon, 18 Feb 2019 12:24:06 GMT
Vary: Accept-Encoding
Etag: W/"5c6aa3e6-4881f"
Expires: Fri, 15 Jun 2029 19:10:14 GMT
Cache-Control: public, max-age=315360000
Content-Encoding: gzip
CF-Cache-Status: HIT
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4e8f8fef2abd8701-ARN


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   82096
Md5:    2a14808da014f3f98c36487b85440257
Sha1:   df50528d4745ab84a0edb5a6a4920ef7eae18ced
Sha256: d91ad9b7b05c449bd1c6131fa9e6b0d4d5f838e078af1c8db7806036d3aa6746
                                        
                                            GET /images/favicon/favicon-32x32.png HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:14 GMT
Content-Length: 1330
Connection: keep-alive
Last-Modified: Fri, 11 Jan 2019 08:41:56 GMT
Etag: "5c3856d4-532"
Expires: Fri, 15 Jun 2029 19:10:14 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8fef291f760a-ARN


--- Additional Info ---
Magic:  PNG image, 32 x 32, 8-bit colormap, non-interlaced
Size:   1330
Md5:    d16ccadf590cb753ca460110d20bac76
Sha1:   349bd28d7ebb5b906a08159a7bf95c2f1b1f5e1d
Sha256: 2d3a907b4876408aaab0c20410bf1f7d69aad384e858b6f376f79b76ee7b01d6
                                        
                                            GET /ps/index.js HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: application/javascript
                                        
Date: Tue, 18 Jun 2019 19:10:14 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Last-Modified: Wed, 03 Apr 2019 09:33:15 GMT
Vary: Accept-Encoding
Etag: W/"5ca47ddb-113f"
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Cache-Control: max-age=315360000
Content-Encoding: gzip
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4e8f8fef1d2adaa8-ARN


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   1447
Md5:    65b3a1cd1cb38f31ed14fb63671a9771
Sha1:   3db50b0ac856f502167754782ca7b08402576ceb
Sha256: 38ae8d717ea7c07811f0704862272b81501c824449e7c64bbfbc2bc3b238bab7
                                        
                                            GET /images/logo.png?v=2 HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 2698
Connection: keep-alive
Last-Modified: Fri, 11 Jan 2019 08:41:56 GMT
Etag: "5c3856d4-a8a"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff13d317694-ARN


--- Additional Info ---
Magic:  PNG image, 230 x 45, 8-bit/color RGBA, non-interlaced
Size:   2698
Md5:    7b830e8b4363ab72a655eb92c83b0c46
Sha1:   61284fb2c78d667237427678b951220efd495bc4
Sha256: a61cadf1dd95c2e801b51248643acaca31aa011d4fcb12406874cabc6ceab255
                                        
                                            GET /images/flags/ru.png HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 455
Connection: keep-alive
Last-Modified: Thu, 31 Jan 2019 14:41:35 GMT
Etag: "5c53091f-1c7"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff1bc4c8701-ARN


--- Additional Info ---
Magic:  PNG image, 22 x 14, 8-bit/color RGBA, non-interlaced
Size:   455
Md5:    b7770ec48d032429be8de5b8fbad9c73
Sha1:   ece025dbe16f070a7bc067fba30fb483d8b44972
Sha256: ab1ff497ec9665ab49124dec6bc52ded07ea8e0c8ea0ae064e62e23894784172
                                        
                                            GET /images/flags/en.png HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 1136
Connection: keep-alive
Last-Modified: Fri, 11 Jan 2019 08:41:56 GMT
Etag: "5c3856d4-470"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff1bd5adaa8-ARN


--- Additional Info ---
Magic:  PNG image, 22 x 14, 8-bit colormap, non-interlaced
Size:   1136
Md5:    d5b8c7206a61b2a6f03894fe52dda490
Sha1:   77f047b9fafeba8e4278f37ac898fd59ab2d3040
Sha256: 85c0e47b522cf99d0b32a2577a5c47afef14bfd5cc60f2ae01bc4d81df77d1a3
                                        
                                            GET /images/flags/de.png HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 525
Connection: keep-alive
Last-Modified: Fri, 11 Jan 2019 08:41:56 GMT
Etag: "5c3856d4-20d"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff1bba1760a-ARN


--- Additional Info ---
Magic:  PNG image, 22 x 14, 8-bit/color RGBA, non-interlaced
Size:   525
Md5:    8586fc7d9be29d078f6a5c91541324e1
Sha1:   3abf8419d77186f33d3cbca94b2befda2a1c560f
Sha256: 5c49380cd5c655f2828362f2df4fe05304b5822462c839b270e407697ca6a6b9
                                        
                                            POST /GTSGIAG3 HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 115
Content-Type: application/ocsp-request

                                         
                                         172.217.22.163
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Cache-Control: public, max-age=86400
Server: ocsp_responder
Content-Length: 471
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN


--- Additional Info ---
Magic:  data
Size:   471
Md5:    06c0ce11144f216833181cceeeae36fd
Sha1:   e084ea2f8e5d59cc276cbbe6f6f6498402944141
Sha256: 08fe206170dfe0fcb464c95788d6341e01d19f83d6d76e3182e81c2effa39a01
                                        
                                            POST /gsr2 HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 112
Content-Type: application/ocsp-request

                                         
                                         172.217.22.163
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Cache-Control: public, max-age=86400
Server: ocsp_responder
Content-Length: 468
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN


--- Additional Info ---
Magic:  data
Size:   468
Md5:    5be872b3fe0bb6f31385f91f811e9586
Sha1:   1192231bcb9ee73e9f619d433cdb66dddd9ae7f7
Sha256: db0ad6191770bff9043482b68acf62a4e25d4390a03274cfbe413675dd8c9cf5
                                        
                                            GET /images/flags/es.png HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 685
Connection: keep-alive
Last-Modified: Fri, 11 Jan 2019 08:41:56 GMT
Etag: "5c3856d4-2ad"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff1cdbadaa8-ARN


--- Additional Info ---
Magic:  PNG image, 22 x 14, 8-bit/color RGBA, non-interlaced
Size:   685
Md5:    6437d79f83f7b0e80fb09a3dbb33bfbd
Sha1:   dbf8879698468410ec440d220fc11f59b4dd754b
Sha256: 5abe394a0c8c2ca831fe6893b9da78aa1be3a6b244e11deaaa040bb4b25d5bcd
                                        
                                            GET /images/flags/it.png HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 580
Connection: keep-alive
Last-Modified: Wed, 06 Feb 2019 13:04:20 GMT
Etag: "5c5adb54-244"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff1cdac7694-ARN


--- Additional Info ---
Magic:  PNG image, 22 x 14, 8-bit/color RGBA, non-interlaced
Size:   580
Md5:    03273c82438bf05fbbeaec8e0c681b6d
Sha1:   6888b3e600e9194b7eb06b3ce55f2a8c4bdee264
Sha256: f5e00bdfefa4b50f74df4e23d9bdf4848cb888acde1373bc4ccc6a1d57a75632
                                        
                                            GET /images/flags/nl.png HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 531
Connection: keep-alive
Last-Modified: Tue, 26 Feb 2019 08:50:43 GMT
Etag: "5c74fde3-213"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff1dc608701-ARN


--- Additional Info ---
Magic:  PNG image, 22 x 14, 8-bit/color RGBA, non-interlaced
Size:   531
Md5:    e475c380defe4b2ee2b5fca7b0e2ce76
Sha1:   e8ec40ea8e11dd29aa858239809905f5d49e6c3c
Sha256: 25db8525c1e724053c07a6dd5d526696fec1a586a1bcfb3040c0e7f7fe7c36f3
                                        
                                            POST / HTTP/1.1 
Host: ocsp.comodoca4.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 115
Content-Type: application/ocsp-request

                                         
                                         151.139.128.14
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Accept-Ranges: bytes
Last-Modified: Fri, 14 Jun 2019 03:35:18 GMT
Server: Apache
Etag: 0EE9B2E0D4F795F367F0DD64E08769E0C348F4F3
Cache-Control: max-age=302061,public,no-transform,must-revalidate
X-OCSP-Responder-ID: mcdpcaocsp5
X-HW: 1560885015.cds034.sk1.h2,1560885015.cds031.sk1.c
Connection: keep-alive
Content-Length: 279


--- Additional Info ---
Magic:  data
Size:   279
Md5:    6eec991a83caac715a77231d9a8ac30d
Sha1:   0ee9b2e0d4f795f367f0dd64e08769e0c348f4f3
Sha256: 0c4b53d97d5fd9140d3f050f6b06914320806af729722a4a968119b7f97a524d
                                        
                                            POST / HTTP/1.1 
Host: ocsp.comodoca4.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 115
Content-Type: application/ocsp-request

                                         
                                         151.139.128.14
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Accept-Ranges: bytes
Last-Modified: Thu, 13 Jun 2019 12:14:19 GMT
Server: Apache
Etag: 328C83D4CA061F49A50814E3AC2E7E7D9604A340
Cache-Control: max-age=302399,public,no-transform,must-revalidate
X-OCSP-Responder-ID: mcdpcaocsp14
X-HW: 1560885015.cds034.sk1.h2,1560885015.cds045.sk1.c
Connection: keep-alive
Content-Length: 312


--- Additional Info ---
Magic:  data
Size:   312
Md5:    96620d8c4f3481f3e28344b1d5a666f4
Sha1:   328c83d4ca061f49a50814e3ac2e7e7d9604a340
Sha256: b3820fd7230b2216845171b2fff91be00a2cc3841f80c0625ccd15abb4e12293
                                        
                                            GET /gtm.js?id=GTM-MM7KWBV HTTP/1.1 
Host: www.googletagmanager.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         216.58.207.200
HTTP/1.1 200 OK
Content-Type: application/javascript; charset=UTF-8
                                        
Access-Control-Allow-Origin: http://www.googletagmanager.com
Access-Control-Allow-Headers: Cache-Control
Access-Control-Allow-Credentials: true
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Tue, 18 Jun 2019 19:10:15 GMT
Expires: Tue, 18 Jun 2019 19:10:15 GMT
Cache-Control: private, max-age=900
Last-Modified: Mon, 17 Jun 2019 23:12:11 GMT
Server: Google Tag Manager
X-XSS-Protection: 0
Alt-Svc: quic=":443"; ma=2592000; v="46,44,43,39"
Transfer-Encoding: chunked


--- Additional Info ---
Magic:  gzip compressed data, max compression
Size:   18778
Md5:    5d183f38bbed95be4f31cb42c7a2041c
Sha1:   8cf3c68a14ac00c9f7d630926618b3d25e46c87c
Sha256: 27e407268f0f1d890d098a43beaac2a24314f2815c4875330a84a497f59c2188
                                        
                                            POST /GTSGIAG3 HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 115
Content-Type: application/ocsp-request

                                         
                                         172.217.22.163
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Cache-Control: public, max-age=86400
Server: ocsp_responder
Content-Length: 471
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN


--- Additional Info ---
Magic:  data
Size:   471
Md5:    959148ee7fb8b384b8ae05e2b132e171
Sha1:   6ccbcf551efe76e6569fb4275b0e640405c614b7
Sha256: b583739f5243fdd6f9eccf3cf8a7f487199fcf8ed916720b0350cfb1f00c134a
                                        
                                            GET /js/previewlib.cjs.v1.10.js?v20190403053315 HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: application/javascript
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Last-Modified: Wed, 03 Apr 2019 09:33:15 GMT
Vary: Accept-Encoding
Etag: W/"5ca47ddb-48ca"
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Cache-Control: max-age=315360000
Content-Encoding: gzip
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4e8f8ff35b08daa8-ARN


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   4713
Md5:    ada3ce6c4159f4db867ed56028f76b3c
Sha1:   68a33e414c964ae646742897985d814c833dc583
Sha256: 69eec6c28a157a3538a4376809d2e46d5711aaf0ea44fc30e128e59bd8a09e89
                                        
                                            GET /css/feedback.css?v=2.5 HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/css,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: text/css
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Last-Modified: Wed, 03 Apr 2019 09:33:15 GMT
Vary: Accept-Encoding
Etag: W/"5ca47ddb-23aa"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
Content-Encoding: gzip
CF-Cache-Status: HIT
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4e8f8ff35ee27694-ARN


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   1873
Md5:    6122154a6e7989aade48f2197c6e5b15
Sha1:   23a0a69a15be6db61d3b0192a363ed9a21daffcc
Sha256: 1a5b49deecf61e5a60a884a26355ab942ac427c7589978a9fc3d19fb68f72438
                                        
                                            GET /cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: application/javascript
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Last-Modified: Mon, 10 Jun 2019 15:33:43 GMT
Etag: W/"5cfe7857-4d7"
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff36d858701-ARN
X-Frame-Options: SAMEORIGIN
Expires: Thu, 20 Jun 2019 19:10:15 GMT
Cache-Control: max-age=172800, public
Content-Encoding: gzip


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   655
Md5:    bc3ba461c8a309acf61b6d9c41cb6236
Sha1:   88482306ecc9258d5e9cbb9ba5314dab223a5db4
Sha256: 31331f1b1519882d2f2fb60367708fd56a7a1ec0bddd0554c635547179c7dc8f
                                        
                                            GET /recaptcha/api.js?render=6LdSnI0UAAAAAHl2VdJcILRAp_8DfAXXHWHOjtRH HTTP/1.1 
Host: www.google.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         216.58.211.4
HTTP/1.1 200 OK
Content-Type: text/javascript; charset=UTF-8
                                        
Expires: Tue, 18 Jun 2019 19:10:15 GMT
Date: Tue, 18 Jun 2019 19:10:15 GMT
Cache-Control: private, max-age=300
Content-Encoding: gzip
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Alt-Svc: quic=":443"; ma=2592000; v="46,44,43,39"
Transfer-Encoding: chunked


--- Additional Info ---
Magic:  gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT)
Size:   494
Md5:    1d2e9fdaf55872b574e4d05aa8600406
Sha1:   c0b81b84517b3c1f28aca708973e1c4ec609b3e6
Sha256: 672dfbbd2e98d273d6cae24ac7a9fc32725460e0413764fd526122e6ae384fd6
                                        
                                            POST / HTTP/1.1 
Host: ocsp.comodoca4.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 116
Content-Type: application/ocsp-request

                                         
                                         151.139.128.14
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Accept-Ranges: bytes
Last-Modified: Thu, 13 Jun 2019 05:39:34 GMT
Server: Apache
Etag: 64B9FCBDFE9436077C6A49359E52A28163012540
Cache-Control: max-age=603567,public,no-transform,must-revalidate
X-OCSP-Responder-ID: mcdpcaocsp3
X-HW: 1560885015.cds034.sk1.h2,1560885015.cds013.sk1.c
Connection: keep-alive
Content-Length: 472


--- Additional Info ---
Magic:  data
Size:   472
Md5:    f9a1bc4d4ae4c29fdecb38a82165fcc4
Sha1:   64b9fcbdfe9436077c6a49359e52a28163012540
Sha256: 4683b9c6580484eb787a354d0fe92be66b84117c8258128b335c9062b5399cab
                                        
                                            GET /assets/desktop.cb110301bdca143d33cf.min.js HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: application/javascript
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Last-Modified: Mon, 18 Feb 2019 12:24:06 GMT
Vary: Accept-Encoding
Etag: W/"5c6aa3e6-1e56f"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
Content-Encoding: gzip
CF-Cache-Status: HIT
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4e8f8ff4f94adaa8-ARN


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   39713
Md5:    d8e49454036364b3a31dff6a864984e2
Sha1:   749c0761bf4b14b8ac63633fca12ba11b5a91c73
Sha256: 675e2cc62ecad12f19b19a9d969c878a8a70bce15a03401f475cccc4494ce45d
                                        
                                            GET /images/flags/cn.png HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 513
Connection: keep-alive
Last-Modified: Fri, 11 Jan 2019 08:41:56 GMT
Etag: "5c3856d4-201"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff50ff87694-ARN


--- Additional Info ---
Magic:  PNG image, 22 x 14, 8-bit/color RGB, non-interlaced
Size:   513
Md5:    140830c9396d12e0d4ecbe643a90b095
Sha1:   b3b0caf26640dbf3651f7e72a08e8f0686dba99c
Sha256: 42c870d6b8f495425e153e03ba358ebe93b368fd45cdd37db67d998e082b85f4
                                        
                                            GET /images/flags/jp.png HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 529
Connection: keep-alive
Last-Modified: Fri, 11 Jan 2019 08:41:56 GMT
Etag: "5c3856d4-211"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff50e6d8701-ARN


--- Additional Info ---
Magic:  PNG image, 22 x 14, 8-bit/color RGBA, non-interlaced
Size:   529
Md5:    52cad81fb1c5f63c046eb4a94b3ffab1
Sha1:   81ae6d7fc78802d361674b3f89157944d7037617
Sha256: fb36aa6ae24e55f588e1736c4c1b8bcf77899c4e692ff56c5928c6f45a36581e
                                        
                                            GET /images/flags/fr.png HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/png
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 565
Connection: keep-alive
Last-Modified: Thu, 31 Jan 2019 14:41:35 GMT
Etag: "5c53091f-235"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff5081d7658-ARN


--- Additional Info ---
Magic:  PNG image, 22 x 14, 8-bit/color RGBA, non-interlaced
Size:   565
Md5:    80b119457e2430b686bc9c305ec87459
Sha1:   d960ed58a166f2dd4c81992fd9347abc3245b85a
Sha256: 3de1678489ebb928c5ebcb69b701dcd84132692b633a8275a200339175bebdec
                                        
                                            POST / HTTP/1.1 
Host: ocsp.comodoca4.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 116
Content-Type: application/ocsp-request

                                         
                                         151.139.128.14
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Accept-Ranges: bytes
Last-Modified: Tue, 18 Jun 2019 06:21:55 GMT
Server: Apache
Etag: B97B05531BD3268B673EA7500EA2A720D0843B80
Cache-Control: max-age=603872,public,no-transform,must-revalidate
X-OCSP-Responder-ID: mcdpcaocsp1
X-HW: 1560885015.cds034.sk1.h2,1560885015.cds022.sk1.c
Connection: keep-alive
Content-Length: 280


--- Additional Info ---
Magic:  data
Size:   280
Md5:    b8237281ab7b1c78bd35bdc9fba5bee5
Sha1:   b97b05531bd3268b673ea7500ea2a720d0843b80
Sha256: e364889c59c900247923a53fc74eace23c61cbe0bc7ff3fbf098d81b8b2dec37
                                        
                                            GET /sdk/v1/video.instant.message.js HTTP/1.1 
Host: cdn.tsyndicate.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.17.49.107
HTTP/1.1 200 OK
Content-Type: application/javascript
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=da8990d73e6962b6e20e8c46726b050101560885015; expires=Wed, 17-Jun-20 19:10:15 GMT; path=/; domain=.tsyndicate.com; HttpOnly
Cf-Bgj: minify
Cf-Polished: origSize=8263
Etag: W/"5d022205-2047"
Last-Modified: Thu, 13 Jun 2019 10:14:29 GMT
CF-Cache-Status: HIT
Expires: Tue, 18 Jun 2019 20:10:15 GMT
Cache-Control: public, max-age=3600
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff58a7b42b9-OSL
Content-Encoding: gzip


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   3024
Md5:    d8ab1eda71f9aaa7a2c90001f13aed05
Sha1:   0b12d4bad9a4f4a3b4cc5baa95317861fe102f8d
Sha256: 66497d69824dfa3b7a9a1b316bb1686c5ca8c1f9cd25ac26eb39f153e48faa6b
                                        
                                            GET /video/thumbs/Wq/932014.jpg HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 20717
Connection: keep-alive
Last-Modified: Sun, 07 Jan 2018 18:26:37 GMT
Etag: "5a52665d-50ed"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff59b38daa8-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   20717
Md5:    b33bd3b704e816ea1bc071ae0d86840e
Sha1:   8bd290d68d6cabda9812e60168bfb44c05c51ae5
Sha256: 64c3236e786dd6a78f5fb6714ce89a21e16f6955cbdedb2a32244038aab4b1f2
                                        
                                            POST /gsorganizationvalsha2g2 HTTP/1.1 
Host: ocsp2.globalsign.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 111
Content-Type: application/ocsp-request

                                         
                                         104.18.21.226
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 1574
Connection: keep-alive
Set-Cookie: __cfduid=df4197e4285ed2265b9119d7aba10f9e81560885016; expires=Wed, 17-Jun-20 19:10:16 GMT; path=/; domain=.globalsign.com; HttpOnly
Expires: Sat, 22 Jun 2019 16:56:47 GMT
X-Powered-By: Undertow/1
Etag: "f423dc0bc275c810e78f84d43ea51fb059baa4ff"
Last-Modified: Tue, 18 Jun 2019 16:56:47 GMT
Cache-Control: public, no-transform, must-revalidate, s-maxage=3600
CF-Cache-Status: HIT
Accept-Ranges: bytes
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffadd2a42bf-OSL


--- Additional Info ---
Magic:  data
Size:   1574
Md5:    eec109ecf1e768b3cbce844d679811f5
Sha1:   f423dc0bc275c810e78f84d43ea51fb059baa4ff
Sha256: 3b188d9be230402b4d5fb52a661ac25db4005933b33bcf716b4bb96d99080088
                                        
                                            GET /video/thumbs/zRb/8761221.jpg HTTP/1.1 
Host: pornq1.marilynjessporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.28.6.176
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 21183
Connection: keep-alive
Set-Cookie: __cfduid=d6254c4be6af451e11494a21f5ce3b8bb1560885016; expires=Wed, 17-Jun-20 19:10:16 GMT; path=/; domain=.marilynjessporn.com; HttpOnly
Last-Modified: Thu, 18 Jan 2018 01:22:51 GMT
Etag: "5a5ff6eb-52bf"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff9fa4ecaec-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   21183
Md5:    20eaf3172b070e5131003f0054b40d7b
Sha1:   770940537f6c16803cb8f34533d9af9baffec534
Sha256: ba609d60eb3a0bac7d576cb197d51b3925dbe86ad827aa5e8f36e79090d158cd
                                        
                                            GET /video/thumbs/bqb/7333043.jpg HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 14266
Connection: keep-alive
Last-Modified: Sun, 14 Jan 2018 15:28:35 GMT
Etag: "5a5b7723-37ba"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff5985c7694-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   14266
Md5:    62250a760d858008defb5cebb73d9141
Sha1:   43cbfd95390edb30a3822d1e3e3e01401f3abb1a
Sha256: ae68435698363369311031911517fdaed337ee655265eddd084569254500c5af
                                        
                                            GET /video/thumbs/P5b/9505593.jpg HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 15723
Connection: keep-alive
Last-Modified: Fri, 19 Jan 2018 17:04:37 GMT
Etag: "5a622525-3d6b"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff59eb88701-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   15723
Md5:    799c70ddb6f667db72c535e5daa22915
Sha1:   78ecc73424db66e0ab3ef0d0e65a7f7fde4a9daf
Sha256: ac69f4256bef3d7b508ffd109295e7909fb4ba74629c99c23211d9307613614d
                                        
                                            GET /video/thumbs/vWb/9017901.jpg HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 18832
Connection: keep-alive
Last-Modified: Thu, 18 Jan 2018 07:06:48 GMT
Etag: "5a604788-4990"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff5a8807658-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   18832
Md5:    9a89602cda2785996535026681abd6de
Sha1:   859025fa5461d1444d613953851ee68215fe371d
Sha256: a49b886da14760f7a35c9c282cc5d09fb3c2ee7051b6dc928fe60503d5687875
                                        
                                            GET /video/thumbs/zO/2157063.jpg HTTP/1.1 
Host: pornq1.lisadeleeuwporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.24.105.12
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 23187
Connection: keep-alive
Set-Cookie: __cfduid=da49e6914a54be5b0b671eaaa9e0944c61560885015; expires=Wed, 17-Jun-20 19:10:15 GMT; path=/; domain=.lisadeleeuwporn.com; HttpOnly
Last-Modified: Tue, 09 Jan 2018 11:56:28 GMT
Etag: "5a54adec-5a93"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff5ab59caf0-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   23187
Md5:    9c1be971e582acc2d617c4a8daa5f328
Sha1:   c7f6c59b9c666b13a0861f137e1f4fdabc3f5507
Sha256: b9a20f1df2c0f249c854710e7d8a10ea4774a8706d3af5c17b3697abb2eb2cc9
                                        
                                            GET /video/thumbs/GLc/11680764.jpg HTTP/1.1 
Host: pornq1.marilynjessporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.28.6.176
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 26745
Connection: keep-alive
Set-Cookie: __cfduid=d6254c4be6af451e11494a21f5ce3b8bb1560885016; expires=Wed, 17-Jun-20 19:10:16 GMT; path=/; domain=.marilynjessporn.com; HttpOnly
Last-Modified: Sun, 04 Feb 2018 21:33:34 GMT
Etag: "5a777c2e-6879"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffb6e93caec-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   26745
Md5:    794c474bb48ae13af6dd7fd1ae3c414d
Sha1:   a55030db599c9ee0719abab3227c393d06dae94d
Sha256: 607e1f941bd35f158f68a681d119d6c63a774d9a3d8f32d603ae060e67d86caa
                                        
                                            GET /video/thumbs/ahb/6864568.jpg HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 21849
Connection: keep-alive
Last-Modified: Sun, 14 Jan 2018 10:24:50 GMT
Etag: "5a5b2ff2-5559"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffb6d297694-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   21849
Md5:    d0252516a5d228701922b414486e657f
Sha1:   56cdcf1ec35ec1c1dc80ee595538641433414f26
Sha256: 0ff75f5eb97b4ebbb1cd9566861ebb10a4445402430c04774048684b8a6e5434
                                        
                                            GET /video/thumbs/Vqc/10603082.jpg HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 23502
Connection: keep-alive
Last-Modified: Sat, 03 Feb 2018 11:24:33 GMT
Etag: "5a759bf1-5bce"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffb6aa18701-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   23502
Md5:    47cdf9734d9308f694eaaf4ec7171d84
Sha1:   78a7187cf44501d39eb1affabade390a12ccb06a
Sha256: 5e990db641a223a0828eaa04bf75c150b82e1fdb13242e89692a740b7dd89b05
                                        
                                            GET /metrika/watch.js HTTP/1.1 
Host: mc.yandex.ru
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         77.88.21.119
HTTP/1.1 200 OK
Content-Type: application/javascript
                                        
Server: nginx/1.12.2
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 44142
Last-Modified: Tue, 18 Jun 2019 17:20:31 GMT
Connection: keep-alive
Etag: "5d091d5f-ac6e"
Content-Encoding: gzip
Expires: Tue, 18 Jun 2019 20:10:16 GMT
Cache-Control: max-age=3600
Access-Control-Allow-Origin: *
Strict-Transport-Security: max-age=31536000


--- Additional Info ---
Magic:  gzip compressed data, from Unix, max compression
Size:   44142
Md5:    cae011abf3c40e4b49d9cb3719f86ce7
Sha1:   39a5dc3105a49a1004f67e873ed59d57ca3cc9dd
Sha256: 42a933cb87252c963a037fe177f3f3a6b69597782e0865c4ac4e601107a95c39
                                        
                                            GET /video/thumbs/a3a/6136161.jpg HTTP/1.1 
Host: pornq1.marilynjessporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.28.6.176
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 26345
Connection: keep-alive
Set-Cookie: __cfduid=d6254c4be6af451e11494a21f5ce3b8bb1560885016; expires=Wed, 17-Jun-20 19:10:16 GMT; path=/; domain=.marilynjessporn.com; HttpOnly
Last-Modified: Fri, 12 Jan 2018 08:47:16 GMT
Etag: "5a587614-66e9"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffb9f41caec-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   26345
Md5:    20e72c39cf735273324d5fbd26ec87e2
Sha1:   3889f2af49dde9983661aa4df680945875b6e00f
Sha256: db96f191ac8f6780bcb47a2ab8c41eb0504a5ea46ce7baba5a1062925590cc45
                                        
                                            GET /video/thumbs/nsc/10673205.jpg HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 21204
Connection: keep-alive
Last-Modified: Sat, 03 Feb 2018 12:15:23 GMT
Etag: "5a75a7db-52d4"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffbad637694-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   21204
Md5:    86edc3663c29b5d9c7b6425d0d23131a
Sha1:   769d181c01116e201272c84807e3bda270f90f82
Sha256: b7001998e508f098a750aa96ea53cd46738c70cc358d3e05eb8e78742854c9e0
                                        
                                            GET /video/thumbs/sLa/5218096.jpg HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 13462
Connection: keep-alive
Last-Modified: Wed, 10 Jan 2018 13:11:09 GMT
Etag: "5a5610ed-3496"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffb7d127658-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   13462
Md5:    6031a82fbd9fd13751db72b6af945708
Sha1:   e4c73092792e5346ac7a3e1b988d865c7af1d965
Sha256: 648fc8643bf77d4a13107268450aaf6e3d0fc12bd2be1a64027de347a2d35160
                                        
                                            GET /video/thumbs/u0b/9224234.jpg HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 24255
Connection: keep-alive
Last-Modified: Thu, 18 Jan 2018 09:15:29 GMT
Etag: "5a6065b1-5ebf"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffbaac38701-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   24255
Md5:    354df6b5160b4d16a1d3d27ad8e1bc9a
Sha1:   fbf8faa29dcb23640ce1e5b0d38f029b763fa697
Sha256: 7a627e88aef8a9844e4993c09739e1416baaa6aed47141ebcffb713a18468deb
                                        
                                            GET /video/thumbs/q2/2876373.jpg HTTP/1.1 
Host: pornq1.marilynjessporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.28.6.176
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 14257
Connection: keep-alive
Set-Cookie: __cfduid=d6254c4be6af451e11494a21f5ce3b8bb1560885016; expires=Wed, 17-Jun-20 19:10:16 GMT; path=/; domain=.marilynjessporn.com; HttpOnly
Last-Modified: Tue, 09 Jan 2018 14:13:17 GMT
Etag: "5a54cdfd-37b1"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffbcfe2caec-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   14257
Md5:    d8dba1394998059f1ec843d88e8423c8
Sha1:   1e50187dd040cc182f91f222bbb2e7914c63a3c0
Sha256: 9381ee28516f3105408eca2dedc682e2bee5adeee6c6d7550f7006580e0b6270
                                        
                                            POST /GTSGIAG3 HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 115
Content-Type: application/ocsp-request

                                         
                                         172.217.22.163
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Tue, 18 Jun 2019 19:10:17 GMT
Cache-Control: public, max-age=86400
Server: ocsp_responder
Content-Length: 471
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN


--- Additional Info ---
Magic:  data
Size:   471
Md5:    81562ce6f4fd2493dd53e71a680dcc89
Sha1:   13e93449563ef08bf1a8bfae632c1309e11b580e
Sha256: e630ff62971ae85123b3d134e276fe792890403028c723aa8ebabb1ddf50c4dd
                                        
                                            GET /video/thumbs/ik/580207.jpg HTTP/1.1 
Host: pornq1.marilynjessporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.28.6.176
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 19876
Connection: keep-alive
Set-Cookie: __cfduid=d6254c4be6af451e11494a21f5ce3b8bb1560885016; expires=Wed, 17-Jun-20 19:10:16 GMT; path=/; domain=.marilynjessporn.com; HttpOnly
Last-Modified: Sun, 07 Jan 2018 12:34:12 GMT
Etag: "5a5213c4-4da4"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffbe85acaec-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   19876
Md5:    3b9451a9bafc1309bcdd9a111205a960
Sha1:   c7fd9192e876bee06cd9e2eddf9815eeb50834a1
Sha256: 7c7e11c961b8433d768428d849fd5291bc835c0310a0126f7fd248c92d4280be
                                        
                                            GET /favicon.ico HTTP/1.1 
Host: syndication.exoclick.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: __uvt=a%3A1%3A%7Bi%3A0%3Bs%3A33%3A%225d093715dde993.676436782345307575%22%3B%7D; 965bedf11a0179d682c51e3551512860=1; impressions=x%9C%ABV24%B60%B6%B44%D55411%B4%B4%B0%B0T%B2%8A6%D41453%B0%B00504%D1Q%02J%18%28%C5%D6%02%00%C2%9A%09%1A; tag-link=v3%7C77.40.129.123%7CNOR%7C1427160%7C14419889%7C0%7C%7C508%7C41%7C3%7C3%7C0%7C0%7C0%7C33596078%7C3143242%7C3143244%7C63%7C1%7C0%7C0%7C0%7C0%7C1%7C0%7C0%7C0%7C5d093715dde993.676436782345307575%7C26b392c3a83692cb8558a5620da0799c%7C347969%7Ckordonivkakino.net%7C1176x885%7C%7C0%7C0%7C0%7Cok

                                         
                                         95.211.229.246
HTTP/1.1 404 Not Found
Content-Type: text/html
                                        
Server: nginx
Date: Tue, 18 Jun 2019 19:10:17 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Content-Encoding: gzip


--- Additional Info ---
Magic:  gzip compressed data, from Unix
Size:   167
Md5:    fa7816514ee3d85b94792620b30547b8
Sha1:   71db256e77a2b2783f9e60871c851cf05341549d
Sha256: da61f888f21ae8c64013744ea8a857c4ff8706ffe90fe7899392f1836c4f685c
                                        
                                            GET /video/thumbs/s6/3086910.jpg HTTP/1.1 
Host: pornq.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095
Cookie: __cfduid=d005cc2e0a331ff79e1eb9bed18edac031560885014; __tcu=c30efa97d01fef66ba54a356a04c7206c0afe7eb81; cf6c5d78002b834380f81efaa=RlVKREUxOE1KSGZISUs4bzhjR2pMUjVMYk1UVTJNRGc0TlRBeE5pMHdMVEE9a; 6f48664f6b0b19569d680864a701b28767003e77cd7ff1ffa12fe2798bf37b=VVBTMlYyNHRCQW9sZTI4WUpuRnM4T1FnMXhBTW9GeE5qVmpZV00xTm1WbVpqZ3pNakptWW1JME5tRXdPR1JrTnpFeU4yTmpaRGc9a

                                         
                                         104.24.13.115
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:16 GMT
Content-Length: 20872
Connection: keep-alive
Last-Modified: Tue, 09 Jan 2018 14:49:52 GMT
Etag: "5a54d690-5188"
Expires: Fri, 15 Jun 2029 19:10:16 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ffbcd7c7694-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   20872
Md5:    76f648bc9842ec7d5c8563491937d790
Sha1:   fe2a1cab6d73d1e45f1a31f5dac57e75e1b91e14
Sha256: 25fe5949f45f09cc9e527fcaa6da7f9765eb94afc1032989159ecde6c9ab5fe5
                                        
                                            GET /video/thumbs/WPc/11904587.jpg HTTP/1.1 
Host: pornq1.marilynjessporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.28.6.176
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:17 GMT
Content-Length: 16290
Connection: keep-alive
Set-Cookie: __cfduid=d6ceead5c7b5147eec2084d00bf1da5241560885017; expires=Wed, 17-Jun-20 19:10:17 GMT; path=/; domain=.marilynjessporn.com; HttpOnly
Last-Modified: Sun, 04 Feb 2018 23:23:12 GMT
Etag: "5a7795e0-3fa2"
Expires: Fri, 15 Jun 2029 19:10:17 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f9000ffb6caec-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   16290
Md5:    bbdbf9e985f691cd56520fb5e2026081
Sha1:   01f573f8d64ffe22e3d22e414ee4f9b9212627c4
Sha256: 8225e982193ab995b033f33f51f0820ff52131aedddefb7e603c1c89c76d720d
                                        
                                            GET /recaptcha/api2/v1559543665173/recaptcha__en.js HTTP/1.1 
Host: www.gstatic.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         216.58.211.3
HTTP/1.1 200 OK
Content-Type: text/javascript
                                        
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 93780
Date: Wed, 05 Jun 2019 21:17:01 GMT
Expires: Thu, 04 Jun 2020 21:17:01 GMT
Last-Modified: Mon, 03 Jun 2019 17:45:00 GMT
X-Content-Type-Options: nosniff
Server: sffe
X-XSS-Protection: 0
Cache-Control: public, max-age=31536000
Age: 1115596
Alt-Svc: quic=":443"; ma=2592000; v="46,44,43,39"


--- Additional Info ---
Magic:  gzip compressed data, max compression
Size:   93780
Md5:    7a08d8abb978c60bb9ed6ae3376d62af
Sha1:   dc55135f6c62045222e15b10ab178cdad6b02b54
Sha256: 68b98f7e9ebd04f28e2dda9370aaa320b5f7f6912cc29039a632f4bda737bb50
                                        
                                            GET /video/thumbs/A8a/6422343.jpg HTTP/1.1 
Host: pornq1.marilynjessporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.28.6.176
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:17 GMT
Content-Length: 12018
Connection: keep-alive
Set-Cookie: __cfduid=d6ceead5c7b5147eec2084d00bf1da5241560885017; expires=Wed, 17-Jun-20 19:10:17 GMT; path=/; domain=.marilynjessporn.com; HttpOnly
Last-Modified: Sun, 14 Jan 2018 05:23:50 GMT
Etag: "5a5ae966-2ef2"
Expires: Fri, 15 Jun 2029 19:10:17 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f9001794ccaec-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   12018
Md5:    0a2854a14c418ae5dc88199e9c3a1482
Sha1:   2e4addfdaa0d7e7591700fe9ffd298cd2fed1871
Sha256: 48739566d5150126697eb715c2a728df9395a7afb4b069eb089417f538a35f70
                                        
                                            GET /video/thumbs/RZb/9195065.jpg HTTP/1.1 
Host: pornq1.lisadeleeuwporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.24.105.12
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:15 GMT
Content-Length: 24660
Connection: keep-alive
Set-Cookie: __cfduid=d1d77a44f47e85564089872eede93c7851560885015; expires=Wed, 17-Jun-20 19:10:15 GMT; path=/; domain=.lisadeleeuwporn.com; HttpOnly
Last-Modified: Thu, 18 Jan 2018 08:55:48 GMT
Etag: "5a606114-6054"
Expires: Fri, 15 Jun 2029 19:10:15 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f8ff5ae4986e9-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   24660
Md5:    d5c3a2d9853c67d75a905ba867c88771
Sha1:   74dc3b5860319047ef7652705beaff9e4b1c068d
Sha256: c2227cf2e6ee724979015bcbef9d18e6e557030cae98b207bc8d53f66c6d096c
                                        
                                            GET /video/thumbs/ubc/9796409.jpg HTTP/1.1 
Host: pornq1.marilynjessporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.28.6.176
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:18 GMT
Content-Length: 24059
Connection: keep-alive
Set-Cookie: __cfduid=d3e718ddc86cb9889b4ebf54dc092fed71560885018; expires=Wed, 17-Jun-20 19:10:18 GMT; path=/; domain=.marilynjessporn.com; HttpOnly
Last-Modified: Fri, 02 Feb 2018 17:16:29 GMT
Etag: "5a749ced-5dfb"
Expires: Fri, 15 Jun 2029 19:10:18 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f9002bd42caec-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   24059
Md5:    2e1bd5190c2ba89e517e47dabcff5a24
Sha1:   0e86ae25ccee4c65f171326c6fe77813bfba1c48
Sha256: 70faea5882c27848bcfdee351b5187a2b54e6f004cc5447285bdda9cd99bb0f6
                                        
                                            GET /video/thumbs/EBc/11158722.jpg HTTP/1.1 
Host: pornq1.marilynjessporn.com
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         104.28.6.176
HTTP/1.1 200 OK
Content-Type: image/jpeg
                                        
Date: Tue, 18 Jun 2019 19:10:18 GMT
Content-Length: 21822
Connection: keep-alive
Set-Cookie: __cfduid=d3e718ddc86cb9889b4ebf54dc092fed71560885018; expires=Wed, 17-Jun-20 19:10:18 GMT; path=/; domain=.marilynjessporn.com; HttpOnly
Last-Modified: Sun, 04 Feb 2018 08:32:01 GMT
Etag: "5a76c501-553e"
Expires: Fri, 15 Jun 2029 19:10:18 GMT
Cache-Control: public, max-age=315360000
CF-Cache-Status: HIT
Accept-Ranges: bytes
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary: Accept-Encoding
Server: cloudflare
CF-RAY: 4e8f9003aff4caec-ARN


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01
Size:   21822
Md5:    31123ebf2cd169906af1cd6692f8c50e
Sha1:   d5498a2749c4b34bf0c5b2aada9bc57879cf15e1
Sha256: f1726eeeb185a5c61e213fc04c50402624bc85aea6b1cc6d41867f23c9b3ce4c
                                        
                                            GET /metrika/advert.gif HTTP/1.1 
Host: mc.yandex.ru
                                        
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: https://pornq.com/en/?source=392444365&src_hostname=kordonivkakino.net&c=1095

                                         
                                         77.88.21.119
HTTP/1.1 200 OK
Content-Type: image/gif
                                        
Server: nginx/1.12.2
Date: Tue, 18 Jun 2019 19:10:18 GMT
Content-Length: 61
Last-Modified: Mon, 12 Oct 2015 13:09:09 GMT
Connection: keep-alive
Etag: "561bb0f5-3d"
Content-Encoding: gzip
Expires: Tue, 18 Jun 2019 20:10:18 GMT
Cache-Control: max-age=3600
Access-Control-Allow-Origin: *
Strict-Transport-Security: max-age=31536000


--- Additional Info ---
Magic:  gzip compressed data, was "advert.gif", from Unix, last modified: Mon Oct 12 15:06:12 2015
Size:   61