From 89e5fc77afff409e0d00124077dcd4d2d3283410 Mon Sep 17 00:00:00 2001 From: xhome Date: Thu, 18 Aug 2022 22:11:57 +0800 Subject: [PATCH] init --- img/logo.png | Bin 0 -> 187040 bytes js/jquery-3.5.1.js | 10872 +++++++++++++++++++++++++++++++++++++++ js/jquery-3.5.1.min.js | 2 + js/popup.js | 38 + manifest.json | 20 + popup.html | 11 + 6 files changed, 10943 insertions(+) create mode 100644 img/logo.png create mode 100644 js/jquery-3.5.1.js create mode 100644 js/jquery-3.5.1.min.js create mode 100644 js/popup.js create mode 100644 manifest.json create mode 100644 popup.html diff --git a/img/logo.png b/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bad852db55316ba4d6641b4f70114b5a68332ef0 GIT binary patch literal 187040 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∋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 Q{@!7vXZCO19hay72d=3YrvLx| literal 0 HcmV?d00001 diff --git a/js/jquery-3.5.1.js b/js/jquery-3.5.1.js new file mode 100644 index 0000000..5093733 --- /dev/null +++ b/js/jquery-3.5.1.js @@ -0,0 +1,10872 @@ +/*! + * jQuery JavaScript Library v3.5.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2020-05-04T22:49Z + */ +( function( global, factory ) { + + "use strict"; + + 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 ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.5.1", + + // 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 ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // 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 all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // 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; + + // 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 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + 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" && !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 ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // 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() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + 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; + }, + + // 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 ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + 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 flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// 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: real iOS 8.2 only (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 = toType( obj ); + + if ( isFunction( obj ) || 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.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( 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(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://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]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // 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 + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + 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" ) + }, + + rhtml = /HTML$/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 = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.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, 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 ) { + 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 && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } 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 element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = 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 && + a.sourceIndex - b.sourceIndex; + + // 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 :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * 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 ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * 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, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + 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 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.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 programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + 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; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // 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 https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // 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 + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // 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 + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.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 ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // 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 ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.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 ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[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 + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + 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 + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + 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 ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + 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 + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ 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 ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + 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.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +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 += ""; + + /* eslint-disable max-len */ + + 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; + /* eslint-enable max-len */ + + }; + }, + + "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 || 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": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( 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 ) { + // eslint-disable-next-line no-unused-expressions + 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 > length ? + 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, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "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 ); + } + } + return false; + } : + + // 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 ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + 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[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +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 ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + 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" && + 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( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.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( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.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( el ) { + return el.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; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +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; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + 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; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : 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 to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + 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 ( 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 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + 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[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + 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 = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.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 ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return 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 rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], 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 = 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 ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( 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 && !firing ) { + 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; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).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 = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + 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( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + 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, + + // 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 ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 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 ); +} + + + + +// 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 ( toType( 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 ( !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 ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // 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 + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // 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 ) ) { + + return this.get( owner, 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, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ 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://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + 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 getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +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 = getData( 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: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = 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; + + // 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 + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + 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 || Array.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 documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + 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 = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + 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 defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + 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 ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // 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: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return 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, attached, 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 ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // 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.0 only, PhantomJS 1 only + // 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; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +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 ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + 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; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, 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 = Object.create( null ); + } + 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( rnothtmlwhite ) || [ "" ]; + 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( rnothtmlwhite ) || [ "" ]; + 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( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + 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() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + 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, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && 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 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( 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; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +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 <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // 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 || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://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(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// 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://bugs.chromium.org/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 + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return 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 ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle 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 = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + 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.0 only, PhantomJS 1 only + // 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 && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + 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 && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://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( { + 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: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, 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 ) { + 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.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // 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"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // 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: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.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: IE <=9 - 11 only + // 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 cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( 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; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +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]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +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 boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +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, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": 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: {}, + + // 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 = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( 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) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // 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 ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + 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 = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( 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, dimension ) { + jQuery.cssHooks[ dimension ] = { + 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" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + 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"; + } + } +); + +// 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 ( prefix !== "margin" ) { + 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 ( Array.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 ); + } +} ); + + +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 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// 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, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.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 ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + 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(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + 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 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.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 only + // 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 there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + 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 ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +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 ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + 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 || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + 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 ( 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( isHiddenWithinTree ).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 ) { + 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 = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + 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 ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://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: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // 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 ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( 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" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + 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, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = 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 ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/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" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -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 +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + 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; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + 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 = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( 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 ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + 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 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + 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; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + 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 ( Array.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: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // 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 + !option.disabled && + ( !option.parentNode.disabled || + !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 ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // 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 ( Array.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 + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = 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 && !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() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ 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 as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !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; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + 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 ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// 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://bugs.chromium.org/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() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || 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.document || 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 = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + 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 + 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 ( Array.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 && toType( 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, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.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( "&" ); +}; + +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(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + 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( rnothtmlwhite ) || []; + + if ( 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": JSON.parse, + + // 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, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // 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 = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + 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 ); + + // 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( 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 = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // 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: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // 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 ( completed ) { + 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 + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // 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 || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // 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 ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // 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 ); + } + + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + + // 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 ( 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.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( 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 ( 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 htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +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: IE <=9 only + // #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.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // 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: IE <=9 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 = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // 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(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// 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 or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + \ No newline at end of file