at path:ROOT / wp-includes / js / jquery / jquery.js
run:R W Run
DIR
2026-03-11 16:18:51
R W Run
31.23 KB
2026-03-11 16:18:51
R W Run
13.26 KB
2026-03-11 16:18:51
R W Run
6.49 KB
2026-03-11 16:18:51
R W Run
40.93 KB
2026-03-11 16:18:51
R W Run
15.6 KB
2026-03-11 16:18:51
R W Run
5.49 KB
2026-03-11 16:18:51
R W Run
1.75 KB
2026-03-11 16:18:51
R W Run
278.65 KB
2026-03-11 16:18:51
R W Run
1.78 KB
2026-03-11 16:18:51
R W Run
85.5 KB
2026-03-11 16:18:51
R W Run
3.61 KB
2026-03-11 16:18:51
R W Run
3.38 KB
2026-03-11 16:18:51
R W Run
769 By
2026-03-11 16:18:51
R W Run
3.66 KB
2026-03-11 16:18:51
R W Run
2.24 KB
2026-03-11 16:18:51
R W Run
1.15 KB
2026-03-11 16:18:51
R W Run
6.83 KB
2026-03-11 16:18:51
R W Run
2.92 KB
2026-03-11 16:18:51
R W Run
error_log
📄jquery.js
1/*!
2 * jQuery JavaScript Library v3.7.1
3 * https://jquery.com/
4 *
5 * Copyright OpenJS Foundation and other contributors
6 * Released under the MIT license
7 * https://jquery.org/license
8 *
9 * Date: 2023-08-28T13:37Z
10 */
11( function( global, factory ) {
12
13 "use strict";
14
15 if ( typeof module === "object" && typeof module.exports === "object" ) {
16
17 // For CommonJS and CommonJS-like environments where a proper `window`
18 // is present, execute the factory and get jQuery.
19 // For environments that do not have a `window` with a `document`
20 // (such as Node.js), expose a factory as module.exports.
21 // This accentuates the need for the creation of a real `window`.
22 // e.g. var jQuery = require("jquery")(window);
23 // See ticket trac-14549 for more info.
24 module.exports = global.document ?
25 factory( global, true ) :
26 function( w ) {
27 if ( !w.document ) {
28 throw new Error( "jQuery requires a window with a document" );
29 }
30 return factory( w );
31 };
32 } else {
33 factory( global );
34 }
35
36// Pass this if window is not defined yet
37} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
38
39// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
40// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
41// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
42// enough that all such attempts are guarded in a try block.
43"use strict";
44
45var arr = [];
46
47var getProto = Object.getPrototypeOf;
48
49var slice = arr.slice;
50
51var flat = arr.flat ? function( array ) {
52 return arr.flat.call( array );
53} : function( array ) {
54 return arr.concat.apply( [], array );
55};
56
57
58var push = arr.push;
59
60var indexOf = arr.indexOf;
61
62var class2type = {};
63
64var toString = class2type.toString;
65
66var hasOwn = class2type.hasOwnProperty;
67
68var fnToString = hasOwn.toString;
69
70var ObjectFunctionString = fnToString.call( Object );
71
72var support = {};
73
74var isFunction = function isFunction( obj ) {
75
76 // Support: Chrome <=57, Firefox <=52
77 // In some browsers, typeof returns "function" for HTML <object> elements
78 // (i.e., `typeof document.createElement( "object" ) === "function"`).
79 // We don't want to classify *any* DOM node as a function.
80 // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
81 // Plus for old WebKit, typeof returns "function" for HTML collections
82 // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
83 return typeof obj === "function" && typeof obj.nodeType !== "number" &&
84 typeof obj.item !== "function";
85 };
86
87
88var isWindow = function isWindow( obj ) {
89 return obj != null && obj === obj.window;
90 };
91
92
93var document = window.document;
94
95
96
97 var preservedScriptAttributes = {
98 type: true,
99 src: true,
100 nonce: true,
101 noModule: true
102 };
103
104 function DOMEval( code, node, doc ) {
105 doc = doc || document;
106
107 var i, val,
108 script = doc.createElement( "script" );
109
110 script.text = code;
111 if ( node ) {
112 for ( i in preservedScriptAttributes ) {
113
114 // Support: Firefox 64+, Edge 18+
115 // Some browsers don't support the "nonce" property on scripts.
116 // On the other hand, just using `getAttribute` is not enough as
117 // the `nonce` attribute is reset to an empty string whenever it
118 // becomes browsing-context connected.
119 // See https://github.com/whatwg/html/issues/2369
120 // See https://html.spec.whatwg.org/#nonce-attributes
121 // The `node.getAttribute` check was added for the sake of
122 // `jQuery.globalEval` so that it can fake a nonce-containing node
123 // via an object.
124 val = node[ i ] || node.getAttribute && node.getAttribute( i );
125 if ( val ) {
126 script.setAttribute( i, val );
127 }
128 }
129 }
130 doc.head.appendChild( script ).parentNode.removeChild( script );
131 }
132
133
134function toType( obj ) {
135 if ( obj == null ) {
136 return obj + "";
137 }
138
139 // Support: Android <=2.3 only (functionish RegExp)
140 return typeof obj === "object" || typeof obj === "function" ?
141 class2type[ toString.call( obj ) ] || "object" :
142 typeof obj;
143}
144/* global Symbol */
145// Defining this global in .eslintrc.json would create a danger of using the global
146// unguarded in another place, it seems safer to define global only for this module
147
148
149
150var version = "3.7.1",
151
152 rhtmlSuffix = /HTML$/i,
153
154 // Define a local copy of jQuery
155 jQuery = function( selector, context ) {
156
157 // The jQuery object is actually just the init constructor 'enhanced'
158 // Need init if jQuery is called (just allow error to be thrown if not included)
159 return new jQuery.fn.init( selector, context );
160 };
161
162jQuery.fn = jQuery.prototype = {
163
164 // The current version of jQuery being used
165 jquery: version,
166
167 constructor: jQuery,
168
169 // The default length of a jQuery object is 0
170 length: 0,
171
172 toArray: function() {
173 return slice.call( this );
174 },
175
176 // Get the Nth element in the matched element set OR
177 // Get the whole matched element set as a clean array
178 get: function( num ) {
179
180 // Return all the elements in a clean array
181 if ( num == null ) {
182 return slice.call( this );
183 }
184
185 // Return just the one element from the set
186 return num < 0 ? this[ num + this.length ] : this[ num ];
187 },
188
189 // Take an array of elements and push it onto the stack
190 // (returning the new matched element set)
191 pushStack: function( elems ) {
192
193 // Build a new jQuery matched element set
194 var ret = jQuery.merge( this.constructor(), elems );
195
196 // Add the old object onto the stack (as a reference)
197 ret.prevObject = this;
198
199 // Return the newly-formed element set
200 return ret;
201 },
202
203 // Execute a callback for every element in the matched set.
204 each: function( callback ) {
205 return jQuery.each( this, callback );
206 },
207
208 map: function( callback ) {
209 return this.pushStack( jQuery.map( this, function( elem, i ) {
210 return callback.call( elem, i, elem );
211 } ) );
212 },
213
214 slice: function() {
215 return this.pushStack( slice.apply( this, arguments ) );
216 },
217
218 first: function() {
219 return this.eq( 0 );
220 },
221
222 last: function() {
223 return this.eq( -1 );
224 },
225
226 even: function() {
227 return this.pushStack( jQuery.grep( this, function( _elem, i ) {
228 return ( i + 1 ) % 2;
229 } ) );
230 },
231
232 odd: function() {
233 return this.pushStack( jQuery.grep( this, function( _elem, i ) {
234 return i % 2;
235 } ) );
236 },
237
238 eq: function( i ) {
239 var len = this.length,
240 j = +i + ( i < 0 ? len : 0 );
241 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
242 },
243
244 end: function() {
245 return this.prevObject || this.constructor();
246 },
247
248 // For internal use only.
249 // Behaves like an Array's method, not like a jQuery method.
250 push: push,
251 sort: arr.sort,
252 splice: arr.splice
253};
254
255jQuery.extend = jQuery.fn.extend = function() {
256 var options, name, src, copy, copyIsArray, clone,
257 target = arguments[ 0 ] || {},
258 i = 1,
259 length = arguments.length,
260 deep = false;
261
262 // Handle a deep copy situation
263 if ( typeof target === "boolean" ) {
264 deep = target;
265
266 // Skip the boolean and the target
267 target = arguments[ i ] || {};
268 i++;
269 }
270
271 // Handle case when target is a string or something (possible in deep copy)
272 if ( typeof target !== "object" && !isFunction( target ) ) {
273 target = {};
274 }
275
276 // Extend jQuery itself if only one argument is passed
277 if ( i === length ) {
278 target = this;
279 i--;
280 }
281
282 for ( ; i < length; i++ ) {
283
284 // Only deal with non-null/undefined values
285 if ( ( options = arguments[ i ] ) != null ) {
286
287 // Extend the base object
288 for ( name in options ) {
289 copy = options[ name ];
290
291 // Prevent Object.prototype pollution
292 // Prevent never-ending loop
293 if ( name === "__proto__" || target === copy ) {
294 continue;
295 }
296
297 // Recurse if we're merging plain objects or arrays
298 if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
299 ( copyIsArray = Array.isArray( copy ) ) ) ) {
300 src = target[ name ];
301
302 // Ensure proper type for the source value
303 if ( copyIsArray && !Array.isArray( src ) ) {
304 clone = [];
305 } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
306 clone = {};
307 } else {
308 clone = src;
309 }
310 copyIsArray = false;
311
312 // Never move original objects, clone them
313 target[ name ] = jQuery.extend( deep, clone, copy );
314
315 // Don't bring in undefined values
316 } else if ( copy !== undefined ) {
317 target[ name ] = copy;
318 }
319 }
320 }
321 }
322
323 // Return the modified object
324 return target;
325};
326
327jQuery.extend( {
328
329 // Unique for each copy of jQuery on the page
330 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
331
332 // Assume jQuery is ready without the ready module
333 isReady: true,
334
335 error: function( msg ) {
336 throw new Error( msg );
337 },
338
339 noop: function() {},
340
341 isPlainObject: function( obj ) {
342 var proto, Ctor;
343
344 // Detect obvious negatives
345 // Use toString instead of jQuery.type to catch host objects
346 if ( !obj || toString.call( obj ) !== "[object Object]" ) {
347 return false;
348 }
349
350 proto = getProto( obj );
351
352 // Objects with no prototype (e.g., `Object.create( null )`) are plain
353 if ( !proto ) {
354 return true;
355 }
356
357 // Objects with prototype are plain iff they were constructed by a global Object function
358 Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
359 return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
360 },
361
362 isEmptyObject: function( obj ) {
363 var name;
364
365 for ( name in obj ) {
366 return false;
367 }
368 return true;
369 },
370
371 // Evaluates a script in a provided context; falls back to the global one
372 // if not specified.
373 globalEval: function( code, options, doc ) {
374 DOMEval( code, { nonce: options && options.nonce }, doc );
375 },
376
377 each: function( obj, callback ) {
378 var length, i = 0;
379
380 if ( isArrayLike( obj ) ) {
381 length = obj.length;
382 for ( ; i < length; i++ ) {
383 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
384 break;
385 }
386 }
387 } else {
388 for ( i in obj ) {
389 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
390 break;
391 }
392 }
393 }
394
395 return obj;
396 },
397
398
399 // Retrieve the text value of an array of DOM nodes
400 text: function( elem ) {
401 var node,
402 ret = "",
403 i = 0,
404 nodeType = elem.nodeType;
405
406 if ( !nodeType ) {
407
408 // If no nodeType, this is expected to be an array
409 while ( ( node = elem[ i++ ] ) ) {
410
411 // Do not traverse comment nodes
412 ret += jQuery.text( node );
413 }
414 }
415 if ( nodeType === 1 || nodeType === 11 ) {
416 return elem.textContent;
417 }
418 if ( nodeType === 9 ) {
419 return elem.documentElement.textContent;
420 }
421 if ( nodeType === 3 || nodeType === 4 ) {
422 return elem.nodeValue;
423 }
424
425 // Do not include comment or processing instruction nodes
426
427 return ret;
428 },
429
430 // results is for internal usage only
431 makeArray: function( arr, results ) {
432 var ret = results || [];
433
434 if ( arr != null ) {
435 if ( isArrayLike( Object( arr ) ) ) {
436 jQuery.merge( ret,
437 typeof arr === "string" ?
438 [ arr ] : arr
439 );
440 } else {
441 push.call( ret, arr );
442 }
443 }
444
445 return ret;
446 },
447
448 inArray: function( elem, arr, i ) {
449 return arr == null ? -1 : indexOf.call( arr, elem, i );
450 },
451
452 isXMLDoc: function( elem ) {
453 var namespace = elem && elem.namespaceURI,
454 docElem = elem && ( elem.ownerDocument || elem ).documentElement;
455
456 // Assume HTML when documentElement doesn't yet exist, such as inside
457 // document fragments.
458 return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" );
459 },
460
461 // Support: Android <=4.0 only, PhantomJS 1 only
462 // push.apply(_, arraylike) throws on ancient WebKit
463 merge: function( first, second ) {
464 var len = +second.length,
465 j = 0,
466 i = first.length;
467
468 for ( ; j < len; j++ ) {
469 first[ i++ ] = second[ j ];
470 }
471
472 first.length = i;
473
474 return first;
475 },
476
477 grep: function( elems, callback, invert ) {
478 var callbackInverse,
479 matches = [],
480 i = 0,
481 length = elems.length,
482 callbackExpect = !invert;
483
484 // Go through the array, only saving the items
485 // that pass the validator function
486 for ( ; i < length; i++ ) {
487 callbackInverse = !callback( elems[ i ], i );
488 if ( callbackInverse !== callbackExpect ) {
489 matches.push( elems[ i ] );
490 }
491 }
492
493 return matches;
494 },
495
496 // arg is for internal usage only
497 map: function( elems, callback, arg ) {
498 var length, value,
499 i = 0,
500 ret = [];
501
502 // Go through the array, translating each of the items to their new values
503 if ( isArrayLike( elems ) ) {
504 length = elems.length;
505 for ( ; i < length; i++ ) {
506 value = callback( elems[ i ], i, arg );
507
508 if ( value != null ) {
509 ret.push( value );
510 }
511 }
512
513 // Go through every key on the object,
514 } else {
515 for ( i in elems ) {
516 value = callback( elems[ i ], i, arg );
517
518 if ( value != null ) {
519 ret.push( value );
520 }
521 }
522 }
523
524 // Flatten any nested arrays
525 return flat( ret );
526 },
527
528 // A global GUID counter for objects
529 guid: 1,
530
531 // jQuery.support is not used in Core but other projects attach their
532 // properties to it so it needs to exist.
533 support: support
534} );
535
536if ( typeof Symbol === "function" ) {
537 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
538}
539
540// Populate the class2type map
541jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
542 function( _i, name ) {
543 class2type[ "[object " + name + "]" ] = name.toLowerCase();
544 } );
545
546function isArrayLike( obj ) {
547
548 // Support: real iOS 8.2 only (not reproducible in simulator)
549 // `in` check used to prevent JIT error (gh-2145)
550 // hasOwn isn't used here due to false negatives
551 // regarding Nodelist length in IE
552 var length = !!obj && "length" in obj && obj.length,
553 type = toType( obj );
554
555 if ( isFunction( obj ) || isWindow( obj ) ) {
556 return false;
557 }
558
559 return type === "array" || length === 0 ||
560 typeof length === "number" && length > 0 && ( length - 1 ) in obj;
561}
562
563
564function nodeName( elem, name ) {
565
566 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
567
568}
569var pop = arr.pop;
570
571
572var sort = arr.sort;
573
574
575var splice = arr.splice;
576
577
578var whitespace = "[\\x20\\t\\r\\n\\f]";
579
580
581var rtrimCSS = new RegExp(
582 "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
583 "g"
584);
585
586
587
588
589// Note: an element does not contain itself
590jQuery.contains = function( a, b ) {
591 var bup = b && b.parentNode;
592
593 return a === bup || !!( bup && bup.nodeType === 1 && (
594
595 // Support: IE 9 - 11+
596 // IE doesn't have `contains` on SVG.
597 a.contains ?
598 a.contains( bup ) :
599 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
600 ) );
601};
602
603
604
605
606// CSS string/identifier serialization
607// https://drafts.csswg.org/cssom/#common-serializing-idioms
608var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
609
610function fcssescape( ch, asCodePoint ) {
611 if ( asCodePoint ) {
612
613 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
614 if ( ch === "\0" ) {
615 return "\uFFFD";
616 }
617
618 // Control characters and (dependent upon position) numbers get escaped as code points
619 return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
620 }
621
622 // Other potentially-special ASCII characters get backslash-escaped
623 return "\\" + ch;
624}
625
626jQuery.escapeSelector = function( sel ) {
627 return ( sel + "" ).replace( rcssescape, fcssescape );
628};
629
630
631
632
633var preferredDoc = document,
634 pushNative = push;
635
636( function() {
637
638var i,
639 Expr,
640 outermostContext,
641 sortInput,
642 hasDuplicate,
643 push = pushNative,
644
645 // Local document vars
646 document,
647 documentElement,
648 documentIsHTML,
649 rbuggyQSA,
650 matches,
651
652 // Instance-specific data
653 expando = jQuery.expando,
654 dirruns = 0,
655 done = 0,
656 classCache = createCache(),
657 tokenCache = createCache(),
658 compilerCache = createCache(),
659 nonnativeSelectorCache = createCache(),
660 sortOrder = function( a, b ) {
661 if ( a === b ) {
662 hasDuplicate = true;
663 }
664 return 0;
665 },
666
667 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" +
668 "loop|multiple|open|readonly|required|scoped",
669
670 // Regular expressions
671
672 // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
673 identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
674 "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
675
676 // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors
677 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
678
679 // Operator (capture 2)
680 "*([*^$|!~]?=)" + whitespace +
681
682 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
683 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
684 whitespace + "*\\]",
685
686 pseudos = ":(" + identifier + ")(?:\\((" +
687
688 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
689 // 1. quoted (capture 3; capture 4 or capture 5)
690 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
691
692 // 2. simple (capture 6)
693 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
694
695 // 3. anything else (capture 2)
696 ".*" +
697 ")\\)|)",
698
699 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
700 rwhitespace = new RegExp( whitespace + "+", "g" ),
701
702 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
703 rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" +
704 whitespace + "*" ),
705 rdescend = new RegExp( whitespace + "|>" ),
706
707 rpseudo = new RegExp( pseudos ),
708 ridentifier = new RegExp( "^" + identifier + "$" ),
709
710 matchExpr = {
711 ID: new RegExp( "^#(" + identifier + ")" ),
712 CLASS: new RegExp( "^\\.(" + identifier + ")" ),
713 TAG: new RegExp( "^(" + identifier + "|[*])" ),
714 ATTR: new RegExp( "^" + attributes ),
715 PSEUDO: new RegExp( "^" + pseudos ),
716 CHILD: new RegExp(
717 "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
718 whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
719 whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
720 bool: new RegExp( "^(?:" + booleans + ")$", "i" ),
721
722 // For use in libraries implementing .is()
723 // We use this for POS matching in `select`
724 needsContext: new RegExp( "^" + whitespace +
725 "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
726 "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
727 },
728
729 rinputs = /^(?:input|select|textarea|button)$/i,
730 rheader = /^h\d$/i,
731
732 // Easily-parseable/retrievable ID or TAG or CLASS selectors
733 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
734
735 rsibling = /[+~]/,
736
737 // CSS escapes
738 // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters
739 runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace +
740 "?|\\\\([^\\r\\n\\f])", "g" ),
741 funescape = function( escape, nonHex ) {
742 var high = "0x" + escape.slice( 1 ) - 0x10000;
743
744 if ( nonHex ) {
745
746 // Strip the backslash prefix from a non-hex escape sequence
747 return nonHex;
748 }
749
750 // Replace a hexadecimal escape sequence with the encoded Unicode code point
751 // Support: IE <=11+
752 // For values outside the Basic Multilingual Plane (BMP), manually construct a
753 // surrogate pair
754 return high < 0 ?
755 String.fromCharCode( high + 0x10000 ) :
756 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
757 },
758
759 // Used for iframes; see `setDocument`.
760 // Support: IE 9 - 11+, Edge 12 - 18+
761 // Removing the function wrapper causes a "Permission Denied"
762 // error in IE/Edge.
763 unloadHandler = function() {
764 setDocument();
765 },
766
767 inDisabledFieldset = addCombinator(
768 function( elem ) {
769 return elem.disabled === true && nodeName( elem, "fieldset" );
770 },
771 { dir: "parentNode", next: "legend" }
772 );
773
774// Support: IE <=9 only
775// Accessing document.activeElement can throw unexpectedly
776// https://bugs.jquery.com/ticket/13393
777function safeActiveElement() {
778 try {
779 return document.activeElement;
780 } catch ( err ) { }
781}
782
783// Optimize for push.apply( _, NodeList )
784try {
785 push.apply(
786 ( arr = slice.call( preferredDoc.childNodes ) ),
787 preferredDoc.childNodes
788 );
789
790 // Support: Android <=4.0
791 // Detect silently failing push.apply
792 // eslint-disable-next-line no-unused-expressions
793 arr[ preferredDoc.childNodes.length ].nodeType;
794} catch ( e ) {
795 push = {
796 apply: function( target, els ) {
797 pushNative.apply( target, slice.call( els ) );
798 },
799 call: function( target ) {
800 pushNative.apply( target, slice.call( arguments, 1 ) );
801 }
802 };
803}
804
805function find( selector, context, results, seed ) {
806 var m, i, elem, nid, match, groups, newSelector,
807 newContext = context && context.ownerDocument,
808
809 // nodeType defaults to 9, since context defaults to document
810 nodeType = context ? context.nodeType : 9;
811
812 results = results || [];
813
814 // Return early from calls with invalid selector or context
815 if ( typeof selector !== "string" || !selector ||
816 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
817
818 return results;
819 }
820
821 // Try to shortcut find operations (as opposed to filters) in HTML documents
822 if ( !seed ) {
823 setDocument( context );
824 context = context || document;
825
826 if ( documentIsHTML ) {
827
828 // If the selector is sufficiently simple, try using a "get*By*" DOM method
829 // (excepting DocumentFragment context, where the methods don't exist)
830 if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
831
832 // ID selector
833 if ( ( m = match[ 1 ] ) ) {
834
835 // Document context
836 if ( nodeType === 9 ) {
837 if ( ( elem = context.getElementById( m ) ) ) {
838
839 // Support: IE 9 only
840 // getElementById can match elements by name instead of ID
841 if ( elem.id === m ) {
842 push.call( results, elem );
843 return results;
844 }
845 } else {
846 return results;
847 }
848
849 // Element context
850 } else {
851
852 // Support: IE 9 only
853 // getElementById can match elements by name instead of ID
854 if ( newContext && ( elem = newContext.getElementById( m ) ) &&
855 find.contains( context, elem ) &&
856 elem.id === m ) {
857
858 push.call( results, elem );
859 return results;
860 }
861 }
862
863 // Type selector
864 } else if ( match[ 2 ] ) {
865 push.apply( results, context.getElementsByTagName( selector ) );
866 return results;
867
868 // Class selector
869 } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {
870 push.apply( results, context.getElementsByClassName( m ) );
871 return results;
872 }
873 }
874
875 // Take advantage of querySelectorAll
876 if ( !nonnativeSelectorCache[ selector + " " ] &&
877 ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {
878
879 newSelector = selector;
880 newContext = context;
881
882 // qSA considers elements outside a scoping root when evaluating child or
883 // descendant combinators, which is not what we want.
884 // In such cases, we work around the behavior by prefixing every selector in the
885 // list with an ID selector referencing the scope context.
886 // The technique has to be used as well when a leading combinator is used
887 // as such selectors are not recognized by querySelectorAll.
888 // Thanks to Andrew Dupont for this technique.
889 if ( nodeType === 1 &&
890 ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {
891
892 // Expand context for sibling selectors
893 newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
894 context;
895
896 // We can use :scope instead of the ID hack if the browser
897 // supports it & if we're not changing the context.
898 // Support: IE 11+, Edge 17 - 18+
899 // IE/Edge sometimes throw a "Permission denied" error when
900 // strict-comparing two documents; shallow comparisons work.
901 // eslint-disable-next-line eqeqeq
902 if ( newContext != context || !support.scope ) {
903
904 // Capture the context ID, setting it first if necessary
905 if ( ( nid = context.getAttribute( "id" ) ) ) {
906 nid = jQuery.escapeSelector( nid );
907 } else {
908 context.setAttribute( "id", ( nid = expando ) );
909 }
910 }
911
912 // Prefix every selector in the list
913 groups = tokenize( selector );
914 i = groups.length;
915 while ( i-- ) {
916 groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
917 toSelector( groups[ i ] );
918 }
919 newSelector = groups.join( "," );
920 }
921
922 try {
923 push.apply( results,
924 newContext.querySelectorAll( newSelector )
925 );
926 return results;
927 } catch ( qsaError ) {
928 nonnativeSelectorCache( selector, true );
929 } finally {
930 if ( nid === expando ) {
931 context.removeAttribute( "id" );
932 }
933 }
934 }
935 }
936 }
937
938 // All others
939 return select( selector.replace( rtrimCSS, "$1" ), context, results, seed );
940}
941
942/**
943 * Create key-value caches of limited size
944 * @returns {function(string, object)} Returns the Object data after storing it on itself with
945 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
946 * deleting the oldest entry
947 */
948function createCache() {
949 var keys = [];
950
951 function cache( key, value ) {
952
953 // Use (key + " ") to avoid collision with native prototype properties
954 // (see https://github.com/jquery/sizzle/issues/157)
955 if ( keys.push( key + " " ) > Expr.cacheLength ) {
956
957 // Only keep the most recent entries
958 delete cache[ keys.shift() ];
959 }
960 return ( cache[ key + " " ] = value );
961 }
962 return cache;
963}
964
965/**
966 * Mark a function for special use by jQuery selector module
967 * @param {Function} fn The function to mark
968 */
969function markFunction( fn ) {
970 fn[ expando ] = true;
971 return fn;
972}
973
974/**
975 * Support testing using an element
976 * @param {Function} fn Passed the created element and returns a boolean result
977 */
978function assert( fn ) {
979 var el = document.createElement( "fieldset" );
980
981 try {
982 return !!fn( el );
983 } catch ( e ) {
984 return false;
985 } finally {
986
987 // Remove from its parent by default
988 if ( el.parentNode ) {
989 el.parentNode.removeChild( el );
990 }
991
992 // release memory in IE
993 el = null;
994 }
995}
996
997/**
998 * Returns a function to use in pseudos for input types
999 * @param {String} type
1000 */
1001function createInputPseudo( type ) {
1002 return function( elem ) {
1003 return nodeName( elem, "input" ) && elem.type === type;
1004 };
1005}
1006
1007/**
1008 * Returns a function to use in pseudos for buttons
1009 * @param {String} type
1010 */
1011function createButtonPseudo( type ) {
1012 return function( elem ) {
1013 return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) &&
1014 elem.type === type;
1015 };
1016}
1017
1018/**
1019 * Returns a function to use in pseudos for :enabled/:disabled
1020 * @param {Boolean} disabled true for :disabled; false for :enabled
1021 */
1022function createDisabledPseudo( disabled ) {
1023
1024 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1025 return function( elem ) {
1026
1027 // Only certain elements can match :enabled or :disabled
1028 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1029 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1030 if ( "form" in elem ) {
1031
1032 // Check for inherited disabledness on relevant non-disabled elements:
1033 // * listed form-associated elements in a disabled fieldset
1034 // https://html.spec.whatwg.org/multipage/forms.html#category-listed
1035 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1036 // * option elements in a disabled optgroup
1037 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1038 // All such elements have a "form" property.
1039 if ( elem.parentNode && elem.disabled === false ) {
1040
1041 // Option elements defer to a parent optgroup if present
1042 if ( "label" in elem ) {
1043 if ( "label" in elem.parentNode ) {
1044 return elem.parentNode.disabled === disabled;
1045 } else {
1046 return elem.disabled === disabled;
1047 }
1048 }
1049
1050 // Support: IE 6 - 11+
1051 // Use the isDisabled shortcut property to check for disabled fieldset ancestors
1052 return elem.isDisabled === disabled ||
1053
1054 // Where there is no isDisabled, check manually
1055 elem.isDisabled !== !disabled &&
1056 inDisabledFieldset( elem ) === disabled;
1057 }
1058
1059 return elem.disabled === disabled;
1060
1061 // Try to winnow out elements that can't be disabled before trusting the disabled property.
1062 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1063 // even exist on them, let alone have a boolean value.
1064 } else if ( "label" in elem ) {
1065 return elem.disabled === disabled;
1066 }
1067
1068 // Remaining elements are neither :enabled nor :disabled
1069 return false;
1070 };
1071}
1072
1073/**
1074 * Returns a function to use in pseudos for positionals
1075 * @param {Function} fn
1076 */
1077function createPositionalPseudo( fn ) {
1078 return markFunction( function( argument ) {
1079 argument = +argument;
1080 return markFunction( function( seed, matches ) {
1081 var j,
1082 matchIndexes = fn( [], seed.length, argument ),
1083 i = matchIndexes.length;
1084
1085 // Match elements found at the specified indexes
1086 while ( i-- ) {
1087 if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1088 seed[ j ] = !( matches[ j ] = seed[ j ] );
1089 }
1090 }
1091 } );
1092 } );
1093}
1094
1095/**
1096 * Checks a node for validity as a jQuery selector context
1097 * @param {Element|Object=} context
1098 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1099 */
1100function testContext( context ) {
1101 return context && typeof context.getElementsByTagName !== "undefined" && context;
1102}
1103
1104/**
1105 * Sets document-related variables once based on the current document
1106 * @param {Element|Object} [node] An element or document object to use to set the document
1107 * @returns {Object} Returns the current document
1108 */
1109function setDocument( node ) {
1110 var subWindow,
1111 doc = node ? node.ownerDocument || node : preferredDoc;
1112
1113 // Return early if doc is invalid or already selected
1114 // Support: IE 11+, Edge 17 - 18+
1115 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1116 // two documents; shallow comparisons work.
1117 // eslint-disable-next-line eqeqeq
1118 if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
1119 return document;
1120 }
1121
1122 // Update global variables
1123 document = doc;
1124 documentElement = document.documentElement;
1125 documentIsHTML = !jQuery.isXMLDoc( document );
1126
1127 // Support: iOS 7 only, IE 9 - 11+
1128 // Older browsers didn't support unprefixed `matches`.
1129 matches = documentElement.matches ||
1130 documentElement.webkitMatchesSelector ||
1131 documentElement.msMatchesSelector;
1132
1133 // Support: IE 9 - 11+, Edge 12 - 18+
1134 // Accessing iframe documents after unload throws "permission denied" errors
1135 // (see trac-13936).
1136 // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`,
1137 // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well.
1138 if ( documentElement.msMatchesSelector &&
1139
1140 // Support: IE 11+, Edge 17 - 18+
1141 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1142 // two documents; shallow comparisons work.
1143 // eslint-disable-next-line eqeqeq
1144 preferredDoc != document &&
1145 ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1146
1147 // Support: IE 9 - 11+, Edge 12 - 18+
1148 subWindow.addEventListener( "unload", unloadHandler );
1149 }
1150
1151 // Support: IE <10
1152 // Check if getElementById returns elements by name
1153 // The broken getElementById methods don't pick up programmatically-set names,
1154 // so use a roundabout getElementsByName test
1155 support.getById = assert( function( el ) {
1156 documentElement.appendChild( el ).id = jQuery.expando;
1157 return !document.getElementsByName ||
1158 !document.getElementsByName( jQuery.expando ).length;
1159 } );
1160
1161 // Support: IE 9 only
1162 // Check to see if it's possible to do matchesSelector
1163 // on a disconnected node.
1164 support.disconnectedMatch = assert( function( el ) {
1165 return matches.call( el, "*" );
1166 } );
1167
1168 // Support: IE 9 - 11+, Edge 12 - 18+
1169 // IE/Edge don't support the :scope pseudo-class.
1170 support.scope = assert( function() {
1171 return document.querySelectorAll( ":scope" );
1172 } );
1173
1174 // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only
1175 // Make sure the `:has()` argument is parsed unforgivingly.
1176 // We include `*` in the test to detect buggy implementations that are
1177 // _selectively_ forgiving (specifically when the list includes at least
1178 // one valid selector).
1179 // Note that we treat complete lack of support for `:has()` as if it were
1180 // spec-compliant support, which is fine because use of `:has()` in such
1181 // environments will fail in the qSA path and fall back to jQuery traversal
1182 // anyway.
1183 support.cssHas = assert( function() {
1184 try {
1185 document.querySelector( ":has(*,:jqfake)" );
1186 return false;
1187 } catch ( e ) {
1188 return true;
1189 }
1190 } );
1191
1192 // ID filter and find
1193 if ( support.getById ) {
1194 Expr.filter.ID = function( id ) {
1195 var attrId = id.replace( runescape, funescape );
1196 return function( elem ) {
1197 return elem.getAttribute( "id" ) === attrId;
1198 };
1199 };
1200 Expr.find.ID = function( id, context ) {
1201 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1202 var elem = context.getElementById( id );
1203 return elem ? [ elem ] : [];
1204 }
1205 };
1206 } else {
1207 Expr.filter.ID = function( id ) {
1208 var attrId = id.replace( runescape, funescape );
1209 return function( elem ) {
1210 var node = typeof elem.getAttributeNode !== "undefined" &&
1211 elem.getAttributeNode( "id" );
1212 return node && node.value === attrId;
1213 };
1214 };
1215
1216 // Support: IE 6 - 7 only
1217 // getElementById is not reliable as a find shortcut
1218 Expr.find.ID = function( id, context ) {
1219 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1220 var node, i, elems,
1221 elem = context.getElementById( id );
1222
1223 if ( elem ) {
1224
1225 // Verify the id attribute
1226 node = elem.getAttributeNode( "id" );
1227 if ( node && node.value === id ) {
1228 return [ elem ];
1229 }
1230
1231 // Fall back on getElementsByName
1232 elems = context.getElementsByName( id );
1233 i = 0;
1234 while ( ( elem = elems[ i++ ] ) ) {
1235 node = elem.getAttributeNode( "id" );
1236 if ( node && node.value === id ) {
1237 return [ elem ];
1238 }
1239 }
1240 }
1241
1242 return [];
1243 }
1244 };
1245 }
1246
1247 // Tag
1248 Expr.find.TAG = function( tag, context ) {
1249 if ( typeof context.getElementsByTagName !== "undefined" ) {
1250 return context.getElementsByTagName( tag );
1251
1252 // DocumentFragment nodes don't have gEBTN
1253 } else {
1254 return context.querySelectorAll( tag );
1255 }
1256 };
1257
1258 // Class
1259 Expr.find.CLASS = function( className, context ) {
1260 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1261 return context.getElementsByClassName( className );
1262 }
1263 };
1264
1265 /* QSA/matchesSelector
1266 ---------------------------------------------------------------------- */
1267
1268 // QSA and matchesSelector support
1269
1270 rbuggyQSA = [];
1271
1272 // Build QSA regex
1273 // Regex strategy adopted from Diego Perini
1274 assert( function( el ) {
1275
1276 var input;
1277
1278 documentElement.appendChild( el ).innerHTML =
1279 "<a id='" + expando + "' href='' disabled='disabled'></a>" +
1280 "<select id='" + expando + "-\r\\' disabled='disabled'>" +
1281 "<option selected=''></option></select>";
1282
1283 // Support: iOS <=7 - 8 only
1284 // Boolean attributes and "value" are not treated correctly in some XML documents
1285 if ( !el.querySelectorAll( "[selected]" ).length ) {
1286 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1287 }
1288
1289 // Support: iOS <=7 - 8 only
1290 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1291 rbuggyQSA.push( "~=" );
1292 }
1293
1294 // Support: iOS 8 only
1295 // https://bugs.webkit.org/show_bug.cgi?id=136851
1296 // In-page `selector#id sibling-combinator selector` fails
1297 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1298 rbuggyQSA.push( ".#.+[+~]" );
1299 }
1300
1301 // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1302 // In some of the document kinds, these selectors wouldn't work natively.
1303 // This is probably OK but for backwards compatibility we want to maintain
1304 // handling them through jQuery traversal in jQuery 3.x.
1305 if ( !el.querySelectorAll( ":checked" ).length ) {
1306 rbuggyQSA.push( ":checked" );
1307 }
1308
1309 // Support: Windows 8 Native Apps
1310 // The type and name attributes are restricted during .innerHTML assignment
1311 input = document.createElement( "input" );
1312 input.setAttribute( "type", "hidden" );
1313 el.appendChild( input ).setAttribute( "name", "D" );
1314
1315 // Support: IE 9 - 11+
1316 // IE's :disabled selector does not pick up the children of disabled fieldsets
1317 // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1318 // In some of the document kinds, these selectors wouldn't work natively.
1319 // This is probably OK but for backwards compatibility we want to maintain
1320 // handling them through jQuery traversal in jQuery 3.x.
1321 documentElement.appendChild( el ).disabled = true;
1322 if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1323 rbuggyQSA.push( ":enabled", ":disabled" );
1324 }
1325
1326 // Support: IE 11+, Edge 15 - 18+
1327 // IE 11/Edge don't find elements on a `[name='']` query in some cases.
1328 // Adding a temporary attribute to the document before the selection works
1329 // around the issue.
1330 // Interestingly, IE 10 & older don't seem to have the issue.
1331 input = document.createElement( "input" );
1332 input.setAttribute( "name", "" );
1333 el.appendChild( input );
1334 if ( !el.querySelectorAll( "[name='']" ).length ) {
1335 rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1336 whitespace + "*(?:''|\"\")" );
1337 }
1338 } );
1339
1340 if ( !support.cssHas ) {
1341
1342 // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
1343 // Our regular `try-catch` mechanism fails to detect natively-unsupported
1344 // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
1345 // in browsers that parse the `:has()` argument as a forgiving selector list.
1346 // https://drafts.csswg.org/selectors/#relational now requires the argument
1347 // to be parsed unforgivingly, but browsers have not yet fully adjusted.
1348 rbuggyQSA.push( ":has" );
1349 }
1350
1351 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1352
1353 /* Sorting
1354 ---------------------------------------------------------------------- */
1355
1356 // Document order sorting
1357 sortOrder = function( a, b ) {
1358
1359 // Flag for duplicate removal
1360 if ( a === b ) {
1361 hasDuplicate = true;
1362 return 0;
1363 }
1364
1365 // Sort on method existence if only one input has compareDocumentPosition
1366 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1367 if ( compare ) {
1368 return compare;
1369 }
1370
1371 // Calculate position if both inputs belong to the same document
1372 // Support: IE 11+, Edge 17 - 18+
1373 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1374 // two documents; shallow comparisons work.
1375 // eslint-disable-next-line eqeqeq
1376 compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
1377 a.compareDocumentPosition( b ) :
1378
1379 // Otherwise we know they are disconnected
1380 1;
1381
1382 // Disconnected nodes
1383 if ( compare & 1 ||
1384 ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
1385
1386 // Choose the first element that is related to our preferred document
1387 // Support: IE 11+, Edge 17 - 18+
1388 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1389 // two documents; shallow comparisons work.
1390 // eslint-disable-next-line eqeqeq
1391 if ( a === document || a.ownerDocument == preferredDoc &&
1392 find.contains( preferredDoc, a ) ) {
1393 return -1;
1394 }
1395
1396 // Support: IE 11+, Edge 17 - 18+
1397 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1398 // two documents; shallow comparisons work.
1399 // eslint-disable-next-line eqeqeq
1400 if ( b === document || b.ownerDocument == preferredDoc &&
1401 find.contains( preferredDoc, b ) ) {
1402 return 1;
1403 }
1404
1405 // Maintain original order
1406 return sortInput ?
1407 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1408 0;
1409 }
1410
1411 return compare & 4 ? -1 : 1;
1412 };
1413
1414 return document;
1415}
1416
1417find.matches = function( expr, elements ) {
1418 return find( expr, null, null, elements );
1419};
1420
1421find.matchesSelector = function( elem, expr ) {
1422 setDocument( elem );
1423
1424 if ( documentIsHTML &&
1425 !nonnativeSelectorCache[ expr + " " ] &&
1426 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1427
1428 try {
1429 var ret = matches.call( elem, expr );
1430
1431 // IE 9's matchesSelector returns false on disconnected nodes
1432 if ( ret || support.disconnectedMatch ||
1433
1434 // As well, disconnected nodes are said to be in a document
1435 // fragment in IE 9
1436 elem.document && elem.document.nodeType !== 11 ) {
1437 return ret;
1438 }
1439 } catch ( e ) {
1440 nonnativeSelectorCache( expr, true );
1441 }
1442 }
1443
1444 return find( expr, document, null, [ elem ] ).length > 0;
1445};
1446
1447find.contains = function( context, elem ) {
1448
1449 // Set document vars if needed
1450 // Support: IE 11+, Edge 17 - 18+
1451 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1452 // two documents; shallow comparisons work.
1453 // eslint-disable-next-line eqeqeq
1454 if ( ( context.ownerDocument || context ) != document ) {
1455 setDocument( context );
1456 }
1457 return jQuery.contains( context, elem );
1458};
1459
1460
1461find.attr = function( elem, name ) {
1462
1463 // Set document vars if needed
1464 // Support: IE 11+, Edge 17 - 18+
1465 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1466 // two documents; shallow comparisons work.
1467 // eslint-disable-next-line eqeqeq
1468 if ( ( elem.ownerDocument || elem ) != document ) {
1469 setDocument( elem );
1470 }
1471
1472 var fn = Expr.attrHandle[ name.toLowerCase() ],
1473
1474 // Don't get fooled by Object.prototype properties (see trac-13807)
1475 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1476 fn( elem, name, !documentIsHTML ) :
1477 undefined;
1478
1479 if ( val !== undefined ) {
1480 return val;
1481 }
1482
1483 return elem.getAttribute( name );
1484};
1485
1486find.error = function( msg ) {
1487 throw new Error( "Syntax error, unrecognized expression: " + msg );
1488};
1489
1490/**
1491 * Document sorting and removing duplicates
1492 * @param {ArrayLike} results
1493 */
1494jQuery.uniqueSort = function( results ) {
1495 var elem,
1496 duplicates = [],
1497 j = 0,
1498 i = 0;
1499
1500 // Unless we *know* we can detect duplicates, assume their presence
1501 //
1502 // Support: Android <=4.0+
1503 // Testing for detecting duplicates is unpredictable so instead assume we can't
1504 // depend on duplicate detection in all browsers without a stable sort.
1505 hasDuplicate = !support.sortStable;
1506 sortInput = !support.sortStable && slice.call( results, 0 );
1507 sort.call( results, sortOrder );
1508
1509 if ( hasDuplicate ) {
1510 while ( ( elem = results[ i++ ] ) ) {
1511 if ( elem === results[ i ] ) {
1512 j = duplicates.push( i );
1513 }
1514 }
1515 while ( j-- ) {
1516 splice.call( results, duplicates[ j ], 1 );
1517 }
1518 }
1519
1520 // Clear input after sorting to release objects
1521 // See https://github.com/jquery/sizzle/pull/225
1522 sortInput = null;
1523
1524 return results;
1525};
1526
1527jQuery.fn.uniqueSort = function() {
1528 return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
1529};
1530
1531Expr = jQuery.expr = {
1532
1533 // Can be adjusted by the user
1534 cacheLength: 50,
1535
1536 createPseudo: markFunction,
1537
1538 match: matchExpr,
1539
1540 attrHandle: {},
1541
1542 find: {},
1543
1544 relative: {
1545 ">": { dir: "parentNode", first: true },
1546 " ": { dir: "parentNode" },
1547 "+": { dir: "previousSibling", first: true },
1548 "~": { dir: "previousSibling" }
1549 },
1550
1551 preFilter: {
1552 ATTR: function( match ) {
1553 match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1554
1555 // Move the given value to match[3] whether quoted or unquoted
1556 match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" )
1557 .replace( runescape, funescape );
1558
1559 if ( match[ 2 ] === "~=" ) {
1560 match[ 3 ] = " " + match[ 3 ] + " ";
1561 }
1562
1563 return match.slice( 0, 4 );
1564 },
1565
1566 CHILD: function( match ) {
1567
1568 /* matches from matchExpr["CHILD"]
1569 1 type (only|nth|...)
1570 2 what (child|of-type)
1571 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1572 4 xn-component of xn+y argument ([+-]?\d*n|)
1573 5 sign of xn-component
1574 6 x of xn-component
1575 7 sign of y-component
1576 8 y of y-component
1577 */
1578 match[ 1 ] = match[ 1 ].toLowerCase();
1579
1580 if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
1581
1582 // nth-* requires argument
1583 if ( !match[ 3 ] ) {
1584 find.error( match[ 0 ] );
1585 }
1586
1587 // numeric x and y parameters for Expr.filter.CHILD
1588 // remember that false/true cast respectively to 0/1
1589 match[ 4 ] = +( match[ 4 ] ?
1590 match[ 5 ] + ( match[ 6 ] || 1 ) :
1591 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" )
1592 );
1593 match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1594
1595 // other types prohibit arguments
1596 } else if ( match[ 3 ] ) {
1597 find.error( match[ 0 ] );
1598 }
1599
1600 return match;
1601 },
1602
1603 PSEUDO: function( match ) {
1604 var excess,
1605 unquoted = !match[ 6 ] && match[ 2 ];
1606
1607 if ( matchExpr.CHILD.test( match[ 0 ] ) ) {
1608 return null;
1609 }
1610
1611 // Accept quoted arguments as-is
1612 if ( match[ 3 ] ) {
1613 match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
1614
1615 // Strip excess characters from unquoted arguments
1616 } else if ( unquoted && rpseudo.test( unquoted ) &&
1617
1618 // Get excess from tokenize (recursively)
1619 ( excess = tokenize( unquoted, true ) ) &&
1620
1621 // advance to the next closing parenthesis
1622 ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
1623
1624 // excess is a negative index
1625 match[ 0 ] = match[ 0 ].slice( 0, excess );
1626 match[ 2 ] = unquoted.slice( 0, excess );
1627 }
1628
1629 // Return only captures needed by the pseudo filter method (type and argument)
1630 return match.slice( 0, 3 );
1631 }
1632 },
1633
1634 filter: {
1635
1636 TAG: function( nodeNameSelector ) {
1637 var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1638 return nodeNameSelector === "*" ?
1639 function() {
1640 return true;
1641 } :
1642 function( elem ) {
1643 return nodeName( elem, expectedNodeName );
1644 };
1645 },
1646
1647 CLASS: function( className ) {
1648 var pattern = classCache[ className + " " ];
1649
1650 return pattern ||
1651 ( pattern = new RegExp( "(^|" + whitespace + ")" + className +
1652 "(" + whitespace + "|$)" ) ) &&
1653 classCache( className, function( elem ) {
1654 return pattern.test(
1655 typeof elem.className === "string" && elem.className ||
1656 typeof elem.getAttribute !== "undefined" &&
1657 elem.getAttribute( "class" ) ||
1658 ""
1659 );
1660 } );
1661 },
1662
1663 ATTR: function( name, operator, check ) {
1664 return function( elem ) {
1665 var result = find.attr( elem, name );
1666
1667 if ( result == null ) {
1668 return operator === "!=";
1669 }
1670 if ( !operator ) {
1671 return true;
1672 }
1673
1674 result += "";
1675
1676 if ( operator === "=" ) {
1677 return result === check;
1678 }
1679 if ( operator === "!=" ) {
1680 return result !== check;
1681 }
1682 if ( operator === "^=" ) {
1683 return check && result.indexOf( check ) === 0;
1684 }
1685 if ( operator === "*=" ) {
1686 return check && result.indexOf( check ) > -1;
1687 }
1688 if ( operator === "$=" ) {
1689 return check && result.slice( -check.length ) === check;
1690 }
1691 if ( operator === "~=" ) {
1692 return ( " " + result.replace( rwhitespace, " " ) + " " )
1693 .indexOf( check ) > -1;
1694 }
1695 if ( operator === "|=" ) {
1696 return result === check || result.slice( 0, check.length + 1 ) === check + "-";
1697 }
1698
1699 return false;
1700 };
1701 },
1702
1703 CHILD: function( type, what, _argument, first, last ) {
1704 var simple = type.slice( 0, 3 ) !== "nth",
1705 forward = type.slice( -4 ) !== "last",
1706 ofType = what === "of-type";
1707
1708 return first === 1 && last === 0 ?
1709
1710 // Shortcut for :nth-*(n)
1711 function( elem ) {
1712 return !!elem.parentNode;
1713 } :
1714
1715 function( elem, _context, xml ) {
1716 var cache, outerCache, node, nodeIndex, start,
1717 dir = simple !== forward ? "nextSibling" : "previousSibling",
1718 parent = elem.parentNode,
1719 name = ofType && elem.nodeName.toLowerCase(),
1720 useCache = !xml && !ofType,
1721 diff = false;
1722
1723 if ( parent ) {
1724
1725 // :(first|last|only)-(child|of-type)
1726 if ( simple ) {
1727 while ( dir ) {
1728 node = elem;
1729 while ( ( node = node[ dir ] ) ) {
1730 if ( ofType ?
1731 nodeName( node, name ) :
1732 node.nodeType === 1 ) {
1733
1734 return false;
1735 }
1736 }
1737
1738 // Reverse direction for :only-* (if we haven't yet done so)
1739 start = dir = type === "only" && !start && "nextSibling";
1740 }
1741 return true;
1742 }
1743
1744 start = [ forward ? parent.firstChild : parent.lastChild ];
1745
1746 // non-xml :nth-child(...) stores cache data on `parent`
1747 if ( forward && useCache ) {
1748
1749 // Seek `elem` from a previously-cached index
1750 outerCache = parent[ expando ] || ( parent[ expando ] = {} );
1751 cache = outerCache[ type ] || [];
1752 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1753 diff = nodeIndex && cache[ 2 ];
1754 node = nodeIndex && parent.childNodes[ nodeIndex ];
1755
1756 while ( ( node = ++nodeIndex && node && node[ dir ] ||
1757
1758 // Fallback to seeking `elem` from the start
1759 ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1760
1761 // When found, cache indexes on `parent` and break
1762 if ( node.nodeType === 1 && ++diff && node === elem ) {
1763 outerCache[ type ] = [ dirruns, nodeIndex, diff ];
1764 break;
1765 }
1766 }
1767
1768 } else {
1769
1770 // Use previously-cached element index if available
1771 if ( useCache ) {
1772 outerCache = elem[ expando ] || ( elem[ expando ] = {} );
1773 cache = outerCache[ type ] || [];
1774 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1775 diff = nodeIndex;
1776 }
1777
1778 // xml :nth-child(...)
1779 // or :nth-last-child(...) or :nth(-last)?-of-type(...)
1780 if ( diff === false ) {
1781
1782 // Use the same loop as above to seek `elem` from the start
1783 while ( ( node = ++nodeIndex && node && node[ dir ] ||
1784 ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1785
1786 if ( ( ofType ?
1787 nodeName( node, name ) :
1788 node.nodeType === 1 ) &&
1789 ++diff ) {
1790
1791 // Cache the index of each encountered element
1792 if ( useCache ) {
1793 outerCache = node[ expando ] ||
1794 ( node[ expando ] = {} );
1795 outerCache[ type ] = [ dirruns, diff ];
1796 }
1797
1798 if ( node === elem ) {
1799 break;
1800 }
1801 }
1802 }
1803 }
1804 }
1805
1806 // Incorporate the offset, then check against cycle size
1807 diff -= last;
1808 return diff === first || ( diff % first === 0 && diff / first >= 0 );
1809 }
1810 };
1811 },
1812
1813 PSEUDO: function( pseudo, argument ) {
1814
1815 // pseudo-class names are case-insensitive
1816 // https://www.w3.org/TR/selectors/#pseudo-classes
1817 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1818 // Remember that setFilters inherits from pseudos
1819 var args,
1820 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1821 find.error( "unsupported pseudo: " + pseudo );
1822
1823 // The user may use createPseudo to indicate that
1824 // arguments are needed to create the filter function
1825 // just as jQuery does
1826 if ( fn[ expando ] ) {
1827 return fn( argument );
1828 }
1829
1830 // But maintain support for old signatures
1831 if ( fn.length > 1 ) {
1832 args = [ pseudo, pseudo, "", argument ];
1833 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1834 markFunction( function( seed, matches ) {
1835 var idx,
1836 matched = fn( seed, argument ),
1837 i = matched.length;
1838 while ( i-- ) {
1839 idx = indexOf.call( seed, matched[ i ] );
1840 seed[ idx ] = !( matches[ idx ] = matched[ i ] );
1841 }
1842 } ) :
1843 function( elem ) {
1844 return fn( elem, 0, args );
1845 };
1846 }
1847
1848 return fn;
1849 }
1850 },
1851
1852 pseudos: {
1853
1854 // Potentially complex pseudos
1855 not: markFunction( function( selector ) {
1856
1857 // Trim the selector passed to compile
1858 // to avoid treating leading and trailing
1859 // spaces as combinators
1860 var input = [],
1861 results = [],
1862 matcher = compile( selector.replace( rtrimCSS, "$1" ) );
1863
1864 return matcher[ expando ] ?
1865 markFunction( function( seed, matches, _context, xml ) {
1866 var elem,
1867 unmatched = matcher( seed, null, xml, [] ),
1868 i = seed.length;
1869
1870 // Match elements unmatched by `matcher`
1871 while ( i-- ) {
1872 if ( ( elem = unmatched[ i ] ) ) {
1873 seed[ i ] = !( matches[ i ] = elem );
1874 }
1875 }
1876 } ) :
1877 function( elem, _context, xml ) {
1878 input[ 0 ] = elem;
1879 matcher( input, null, xml, results );
1880
1881 // Don't keep the element
1882 // (see https://github.com/jquery/sizzle/issues/299)
1883 input[ 0 ] = null;
1884 return !results.pop();
1885 };
1886 } ),
1887
1888 has: markFunction( function( selector ) {
1889 return function( elem ) {
1890 return find( selector, elem ).length > 0;
1891 };
1892 } ),
1893
1894 contains: markFunction( function( text ) {
1895 text = text.replace( runescape, funescape );
1896 return function( elem ) {
1897 return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;
1898 };
1899 } ),
1900
1901 // "Whether an element is represented by a :lang() selector
1902 // is based solely on the element's language value
1903 // being equal to the identifier C,
1904 // or beginning with the identifier C immediately followed by "-".
1905 // The matching of C against the element's language value is performed case-insensitively.
1906 // The identifier C does not have to be a valid language name."
1907 // https://www.w3.org/TR/selectors/#lang-pseudo
1908 lang: markFunction( function( lang ) {
1909
1910 // lang value must be a valid identifier
1911 if ( !ridentifier.test( lang || "" ) ) {
1912 find.error( "unsupported lang: " + lang );
1913 }
1914 lang = lang.replace( runescape, funescape ).toLowerCase();
1915 return function( elem ) {
1916 var elemLang;
1917 do {
1918 if ( ( elemLang = documentIsHTML ?
1919 elem.lang :
1920 elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
1921
1922 elemLang = elemLang.toLowerCase();
1923 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
1924 }
1925 } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
1926 return false;
1927 };
1928 } ),
1929
1930 // Miscellaneous
1931 target: function( elem ) {
1932 var hash = window.location && window.location.hash;
1933 return hash && hash.slice( 1 ) === elem.id;
1934 },
1935
1936 root: function( elem ) {
1937 return elem === documentElement;
1938 },
1939
1940 focus: function( elem ) {
1941 return elem === safeActiveElement() &&
1942 document.hasFocus() &&
1943 !!( elem.type || elem.href || ~elem.tabIndex );
1944 },
1945
1946 // Boolean properties
1947 enabled: createDisabledPseudo( false ),
1948 disabled: createDisabledPseudo( true ),
1949
1950 checked: function( elem ) {
1951
1952 // In CSS3, :checked should return both checked and selected elements
1953 // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1954 return ( nodeName( elem, "input" ) && !!elem.checked ) ||
1955 ( nodeName( elem, "option" ) && !!elem.selected );
1956 },
1957
1958 selected: function( elem ) {
1959
1960 // Support: IE <=11+
1961 // Accessing the selectedIndex property
1962 // forces the browser to treat the default option as
1963 // selected when in an optgroup.
1964 if ( elem.parentNode ) {
1965 // eslint-disable-next-line no-unused-expressions
1966 elem.parentNode.selectedIndex;
1967 }
1968
1969 return elem.selected === true;
1970 },
1971
1972 // Contents
1973 empty: function( elem ) {
1974
1975 // https://www.w3.org/TR/selectors/#empty-pseudo
1976 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1977 // but not by others (comment: 8; processing instruction: 7; etc.)
1978 // nodeType < 6 works because attributes (2) do not appear as children
1979 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1980 if ( elem.nodeType < 6 ) {
1981 return false;
1982 }
1983 }
1984 return true;
1985 },
1986
1987 parent: function( elem ) {
1988 return !Expr.pseudos.empty( elem );
1989 },
1990
1991 // Element/input types
1992 header: function( elem ) {
1993 return rheader.test( elem.nodeName );
1994 },
1995
1996 input: function( elem ) {
1997 return rinputs.test( elem.nodeName );
1998 },
1999
2000 button: function( elem ) {
2001 return nodeName( elem, "input" ) && elem.type === "button" ||
2002 nodeName( elem, "button" );
2003 },
2004
2005 text: function( elem ) {
2006 var attr;
2007 return nodeName( elem, "input" ) && elem.type === "text" &&
2008
2009 // Support: IE <10 only
2010 // New HTML5 attribute values (e.g., "search") appear
2011 // with elem.type === "text"
2012 ( ( attr = elem.getAttribute( "type" ) ) == null ||
2013 attr.toLowerCase() === "text" );
2014 },
2015
2016 // Position-in-collection
2017 first: createPositionalPseudo( function() {
2018 return [ 0 ];
2019 } ),
2020
2021 last: createPositionalPseudo( function( _matchIndexes, length ) {
2022 return [ length - 1 ];
2023 } ),
2024
2025 eq: createPositionalPseudo( function( _matchIndexes, length, argument ) {
2026 return [ argument < 0 ? argument + length : argument ];
2027 } ),
2028
2029 even: createPositionalPseudo( function( matchIndexes, length ) {
2030 var i = 0;
2031 for ( ; i < length; i += 2 ) {
2032 matchIndexes.push( i );
2033 }
2034 return matchIndexes;
2035 } ),
2036
2037 odd: createPositionalPseudo( function( matchIndexes, length ) {
2038 var i = 1;
2039 for ( ; i < length; i += 2 ) {
2040 matchIndexes.push( i );
2041 }
2042 return matchIndexes;
2043 } ),
2044
2045 lt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2046 var i;
2047
2048 if ( argument < 0 ) {
2049 i = argument + length;
2050 } else if ( argument > length ) {
2051 i = length;
2052 } else {
2053 i = argument;
2054 }
2055
2056 for ( ; --i >= 0; ) {
2057 matchIndexes.push( i );
2058 }
2059 return matchIndexes;
2060 } ),
2061
2062 gt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2063 var i = argument < 0 ? argument + length : argument;
2064 for ( ; ++i < length; ) {
2065 matchIndexes.push( i );
2066 }
2067 return matchIndexes;
2068 } )
2069 }
2070};
2071
2072Expr.pseudos.nth = Expr.pseudos.eq;
2073
2074// Add button/input type pseudos
2075for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2076 Expr.pseudos[ i ] = createInputPseudo( i );
2077}
2078for ( i in { submit: true, reset: true } ) {
2079 Expr.pseudos[ i ] = createButtonPseudo( i );
2080}
2081
2082// Easy API for creating new setFilters
2083function setFilters() {}
2084setFilters.prototype = Expr.filters = Expr.pseudos;
2085Expr.setFilters = new setFilters();
2086
2087function tokenize( selector, parseOnly ) {
2088 var matched, match, tokens, type,
2089 soFar, groups, preFilters,
2090 cached = tokenCache[ selector + " " ];
2091
2092 if ( cached ) {
2093 return parseOnly ? 0 : cached.slice( 0 );
2094 }
2095
2096 soFar = selector;
2097 groups = [];
2098 preFilters = Expr.preFilter;
2099
2100 while ( soFar ) {
2101
2102 // Comma and first run
2103 if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
2104 if ( match ) {
2105
2106 // Don't consume trailing commas as valid
2107 soFar = soFar.slice( match[ 0 ].length ) || soFar;
2108 }
2109 groups.push( ( tokens = [] ) );
2110 }
2111
2112 matched = false;
2113
2114 // Combinators
2115 if ( ( match = rleadingCombinator.exec( soFar ) ) ) {
2116 matched = match.shift();
2117 tokens.push( {
2118 value: matched,
2119
2120 // Cast descendant combinators to space
2121 type: match[ 0 ].replace( rtrimCSS, " " )
2122 } );
2123 soFar = soFar.slice( matched.length );
2124 }
2125
2126 // Filters
2127 for ( type in Expr.filter ) {
2128 if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2129 ( match = preFilters[ type ]( match ) ) ) ) {
2130 matched = match.shift();
2131 tokens.push( {
2132 value: matched,
2133 type: type,
2134 matches: match
2135 } );
2136 soFar = soFar.slice( matched.length );
2137 }
2138 }
2139
2140 if ( !matched ) {
2141 break;
2142 }
2143 }
2144
2145 // Return the length of the invalid excess
2146 // if we're just parsing
2147 // Otherwise, throw an error or return tokens
2148 if ( parseOnly ) {
2149 return soFar.length;
2150 }
2151
2152 return soFar ?
2153 find.error( selector ) :
2154
2155 // Cache the tokens
2156 tokenCache( selector, groups ).slice( 0 );
2157}
2158
2159function toSelector( tokens ) {
2160 var i = 0,
2161 len = tokens.length,
2162 selector = "";
2163 for ( ; i < len; i++ ) {
2164 selector += tokens[ i ].value;
2165 }
2166 return selector;
2167}
2168
2169function addCombinator( matcher, combinator, base ) {
2170 var dir = combinator.dir,
2171 skip = combinator.next,
2172 key = skip || dir,
2173 checkNonElements = base && key === "parentNode",
2174 doneName = done++;
2175
2176 return combinator.first ?
2177
2178 // Check against closest ancestor/preceding element
2179 function( elem, context, xml ) {
2180 while ( ( elem = elem[ dir ] ) ) {
2181 if ( elem.nodeType === 1 || checkNonElements ) {
2182 return matcher( elem, context, xml );
2183 }
2184 }
2185 return false;
2186 } :
2187
2188 // Check against all ancestor/preceding elements
2189 function( elem, context, xml ) {
2190 var oldCache, outerCache,
2191 newCache = [ dirruns, doneName ];
2192
2193 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2194 if ( xml ) {
2195 while ( ( elem = elem[ dir ] ) ) {
2196 if ( elem.nodeType === 1 || checkNonElements ) {
2197 if ( matcher( elem, context, xml ) ) {
2198 return true;
2199 }
2200 }
2201 }
2202 } else {
2203 while ( ( elem = elem[ dir ] ) ) {
2204 if ( elem.nodeType === 1 || checkNonElements ) {
2205 outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2206
2207 if ( skip && nodeName( elem, skip ) ) {
2208 elem = elem[ dir ] || elem;
2209 } else if ( ( oldCache = outerCache[ key ] ) &&
2210 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2211
2212 // Assign to newCache so results back-propagate to previous elements
2213 return ( newCache[ 2 ] = oldCache[ 2 ] );
2214 } else {
2215
2216 // Reuse newcache so results back-propagate to previous elements
2217 outerCache[ key ] = newCache;
2218
2219 // A match means we're done; a fail means we have to keep checking
2220 if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
2221 return true;
2222 }
2223 }
2224 }
2225 }
2226 }
2227 return false;
2228 };
2229}
2230
2231function elementMatcher( matchers ) {
2232 return matchers.length > 1 ?
2233 function( elem, context, xml ) {
2234 var i = matchers.length;
2235 while ( i-- ) {
2236 if ( !matchers[ i ]( elem, context, xml ) ) {
2237 return false;
2238 }
2239 }
2240 return true;
2241 } :
2242 matchers[ 0 ];
2243}
2244
2245function multipleContexts( selector, contexts, results ) {
2246 var i = 0,
2247 len = contexts.length;
2248 for ( ; i < len; i++ ) {
2249 find( selector, contexts[ i ], results );
2250 }
2251 return results;
2252}
2253
2254function condense( unmatched, map, filter, context, xml ) {
2255 var elem,
2256 newUnmatched = [],
2257 i = 0,
2258 len = unmatched.length,
2259 mapped = map != null;
2260
2261 for ( ; i < len; i++ ) {
2262 if ( ( elem = unmatched[ i ] ) ) {
2263 if ( !filter || filter( elem, context, xml ) ) {
2264 newUnmatched.push( elem );
2265 if ( mapped ) {
2266 map.push( i );
2267 }
2268 }
2269 }
2270 }
2271
2272 return newUnmatched;
2273}
2274
2275function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2276 if ( postFilter && !postFilter[ expando ] ) {
2277 postFilter = setMatcher( postFilter );
2278 }
2279 if ( postFinder && !postFinder[ expando ] ) {
2280 postFinder = setMatcher( postFinder, postSelector );
2281 }
2282 return markFunction( function( seed, results, context, xml ) {
2283 var temp, i, elem, matcherOut,
2284 preMap = [],
2285 postMap = [],
2286 preexisting = results.length,
2287
2288 // Get initial elements from seed or context
2289 elems = seed ||
2290 multipleContexts( selector || "*",
2291 context.nodeType ? [ context ] : context, [] ),
2292
2293 // Prefilter to get matcher input, preserving a map for seed-results synchronization
2294 matcherIn = preFilter && ( seed || !selector ) ?
2295 condense( elems, preMap, preFilter, context, xml ) :
2296 elems;
2297
2298 if ( matcher ) {
2299
2300 // If we have a postFinder, or filtered seed, or non-seed postFilter
2301 // or preexisting results,
2302 matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2303
2304 // ...intermediate processing is necessary
2305 [] :
2306
2307 // ...otherwise use results directly
2308 results;
2309
2310 // Find primary matches
2311 matcher( matcherIn, matcherOut, context, xml );
2312 } else {
2313 matcherOut = matcherIn;
2314 }
2315
2316 // Apply postFilter
2317 if ( postFilter ) {
2318 temp = condense( matcherOut, postMap );
2319 postFilter( temp, [], context, xml );
2320
2321 // Un-match failing elements by moving them back to matcherIn
2322 i = temp.length;
2323 while ( i-- ) {
2324 if ( ( elem = temp[ i ] ) ) {
2325 matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
2326 }
2327 }
2328 }
2329
2330 if ( seed ) {
2331 if ( postFinder || preFilter ) {
2332 if ( postFinder ) {
2333
2334 // Get the final matcherOut by condensing this intermediate into postFinder contexts
2335 temp = [];
2336 i = matcherOut.length;
2337 while ( i-- ) {
2338 if ( ( elem = matcherOut[ i ] ) ) {
2339
2340 // Restore matcherIn since elem is not yet a final match
2341 temp.push( ( matcherIn[ i ] = elem ) );
2342 }
2343 }
2344 postFinder( null, ( matcherOut = [] ), temp, xml );
2345 }
2346
2347 // Move matched elements from seed to results to keep them synchronized
2348 i = matcherOut.length;
2349 while ( i-- ) {
2350 if ( ( elem = matcherOut[ i ] ) &&
2351 ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {
2352
2353 seed[ temp ] = !( results[ temp ] = elem );
2354 }
2355 }
2356 }
2357
2358 // Add elements to results, through postFinder if defined
2359 } else {
2360 matcherOut = condense(
2361 matcherOut === results ?
2362 matcherOut.splice( preexisting, matcherOut.length ) :
2363 matcherOut
2364 );
2365 if ( postFinder ) {
2366 postFinder( null, results, matcherOut, xml );
2367 } else {
2368 push.apply( results, matcherOut );
2369 }
2370 }
2371 } );
2372}
2373
2374function matcherFromTokens( tokens ) {
2375 var checkContext, matcher, j,
2376 len = tokens.length,
2377 leadingRelative = Expr.relative[ tokens[ 0 ].type ],
2378 implicitRelative = leadingRelative || Expr.relative[ " " ],
2379 i = leadingRelative ? 1 : 0,
2380
2381 // The foundational matcher ensures that elements are reachable from top-level context(s)
2382 matchContext = addCombinator( function( elem ) {
2383 return elem === checkContext;
2384 }, implicitRelative, true ),
2385 matchAnyContext = addCombinator( function( elem ) {
2386 return indexOf.call( checkContext, elem ) > -1;
2387 }, implicitRelative, true ),
2388 matchers = [ function( elem, context, xml ) {
2389
2390 // Support: IE 11+, Edge 17 - 18+
2391 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2392 // two documents; shallow comparisons work.
2393 // eslint-disable-next-line eqeqeq
2394 var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (
2395 ( checkContext = context ).nodeType ?
2396 matchContext( elem, context, xml ) :
2397 matchAnyContext( elem, context, xml ) );
2398
2399 // Avoid hanging onto element
2400 // (see https://github.com/jquery/sizzle/issues/299)
2401 checkContext = null;
2402 return ret;
2403 } ];
2404
2405 for ( ; i < len; i++ ) {
2406 if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
2407 matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
2408 } else {
2409 matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
2410
2411 // Return special upon seeing a positional matcher
2412 if ( matcher[ expando ] ) {
2413
2414 // Find the next relative operator (if any) for proper handling
2415 j = ++i;
2416 for ( ; j < len; j++ ) {
2417 if ( Expr.relative[ tokens[ j ].type ] ) {
2418 break;
2419 }
2420 }
2421 return setMatcher(
2422 i > 1 && elementMatcher( matchers ),
2423 i > 1 && toSelector(
2424
2425 // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2426 tokens.slice( 0, i - 1 )
2427 .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2428 ).replace( rtrimCSS, "$1" ),
2429 matcher,
2430 i < j && matcherFromTokens( tokens.slice( i, j ) ),
2431 j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
2432 j < len && toSelector( tokens )
2433 );
2434 }
2435 matchers.push( matcher );
2436 }
2437 }
2438
2439 return elementMatcher( matchers );
2440}
2441
2442function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2443 var bySet = setMatchers.length > 0,
2444 byElement = elementMatchers.length > 0,
2445 superMatcher = function( seed, context, xml, results, outermost ) {
2446 var elem, j, matcher,
2447 matchedCount = 0,
2448 i = "0",
2449 unmatched = seed && [],
2450 setMatched = [],
2451 contextBackup = outermostContext,
2452
2453 // We must always have either seed elements or outermost context
2454 elems = seed || byElement && Expr.find.TAG( "*", outermost ),
2455
2456 // Use integer dirruns iff this is the outermost matcher
2457 dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
2458 len = elems.length;
2459
2460 if ( outermost ) {
2461
2462 // Support: IE 11+, Edge 17 - 18+
2463 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2464 // two documents; shallow comparisons work.
2465 // eslint-disable-next-line eqeqeq
2466 outermostContext = context == document || context || outermost;
2467 }
2468
2469 // Add elements passing elementMatchers directly to results
2470 // Support: iOS <=7 - 9 only
2471 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching
2472 // elements by id. (see trac-14142)
2473 for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2474 if ( byElement && elem ) {
2475 j = 0;
2476
2477 // Support: IE 11+, Edge 17 - 18+
2478 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2479 // two documents; shallow comparisons work.
2480 // eslint-disable-next-line eqeqeq
2481 if ( !context && elem.ownerDocument != document ) {
2482 setDocument( elem );
2483 xml = !documentIsHTML;
2484 }
2485 while ( ( matcher = elementMatchers[ j++ ] ) ) {
2486 if ( matcher( elem, context || document, xml ) ) {
2487 push.call( results, elem );
2488 break;
2489 }
2490 }
2491 if ( outermost ) {
2492 dirruns = dirrunsUnique;
2493 }
2494 }
2495
2496 // Track unmatched elements for set filters
2497 if ( bySet ) {
2498
2499 // They will have gone through all possible matchers
2500 if ( ( elem = !matcher && elem ) ) {
2501 matchedCount--;
2502 }
2503
2504 // Lengthen the array for every element, matched or not
2505 if ( seed ) {
2506 unmatched.push( elem );
2507 }
2508 }
2509 }
2510
2511 // `i` is now the count of elements visited above, and adding it to `matchedCount`
2512 // makes the latter nonnegative.
2513 matchedCount += i;
2514
2515 // Apply set filters to unmatched elements
2516 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2517 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2518 // no element matchers and no seed.
2519 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2520 // case, which will result in a "00" `matchedCount` that differs from `i` but is also
2521 // numerically zero.
2522 if ( bySet && i !== matchedCount ) {
2523 j = 0;
2524 while ( ( matcher = setMatchers[ j++ ] ) ) {
2525 matcher( unmatched, setMatched, context, xml );
2526 }
2527
2528 if ( seed ) {
2529
2530 // Reintegrate element matches to eliminate the need for sorting
2531 if ( matchedCount > 0 ) {
2532 while ( i-- ) {
2533 if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2534 setMatched[ i ] = pop.call( results );
2535 }
2536 }
2537 }
2538
2539 // Discard index placeholder values to get only actual matches
2540 setMatched = condense( setMatched );
2541 }
2542
2543 // Add matches to results
2544 push.apply( results, setMatched );
2545
2546 // Seedless set matches succeeding multiple successful matchers stipulate sorting
2547 if ( outermost && !seed && setMatched.length > 0 &&
2548 ( matchedCount + setMatchers.length ) > 1 ) {
2549
2550 jQuery.uniqueSort( results );
2551 }
2552 }
2553
2554 // Override manipulation of globals by nested matchers
2555 if ( outermost ) {
2556 dirruns = dirrunsUnique;
2557 outermostContext = contextBackup;
2558 }
2559
2560 return unmatched;
2561 };
2562
2563 return bySet ?
2564 markFunction( superMatcher ) :
2565 superMatcher;
2566}
2567
2568function compile( selector, match /* Internal Use Only */ ) {
2569 var i,
2570 setMatchers = [],
2571 elementMatchers = [],
2572 cached = compilerCache[ selector + " " ];
2573
2574 if ( !cached ) {
2575
2576 // Generate a function of recursive functions that can be used to check each element
2577 if ( !match ) {
2578 match = tokenize( selector );
2579 }
2580 i = match.length;
2581 while ( i-- ) {
2582 cached = matcherFromTokens( match[ i ] );
2583 if ( cached[ expando ] ) {
2584 setMatchers.push( cached );
2585 } else {
2586 elementMatchers.push( cached );
2587 }
2588 }
2589
2590 // Cache the compiled function
2591 cached = compilerCache( selector,
2592 matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2593
2594 // Save selector and tokenization
2595 cached.selector = selector;
2596 }
2597 return cached;
2598}
2599
2600/**
2601 * A low-level selection function that works with jQuery's compiled
2602 * selector functions
2603 * @param {String|Function} selector A selector or a pre-compiled
2604 * selector function built with jQuery selector compile
2605 * @param {Element} context
2606 * @param {Array} [results]
2607 * @param {Array} [seed] A set of elements to match against
2608 */
2609function select( selector, context, results, seed ) {
2610 var i, tokens, token, type, find,
2611 compiled = typeof selector === "function" && selector,
2612 match = !seed && tokenize( ( selector = compiled.selector || selector ) );
2613
2614 results = results || [];
2615
2616 // Try to minimize operations if there is only one selector in the list and no seed
2617 // (the latter of which guarantees us context)
2618 if ( match.length === 1 ) {
2619
2620 // Reduce context if the leading compound selector is an ID
2621 tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2622 if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2623 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2624
2625 context = ( Expr.find.ID(
2626 token.matches[ 0 ].replace( runescape, funescape ),
2627 context
2628 ) || [] )[ 0 ];
2629 if ( !context ) {
2630 return results;
2631
2632 // Precompiled matchers will still verify ancestry, so step up a level
2633 } else if ( compiled ) {
2634 context = context.parentNode;
2635 }
2636
2637 selector = selector.slice( tokens.shift().value.length );
2638 }
2639
2640 // Fetch a seed set for right-to-left matching
2641 i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;
2642 while ( i-- ) {
2643 token = tokens[ i ];
2644
2645 // Abort if we hit a combinator
2646 if ( Expr.relative[ ( type = token.type ) ] ) {
2647 break;
2648 }
2649 if ( ( find = Expr.find[ type ] ) ) {
2650
2651 // Search, expanding context for leading sibling combinators
2652 if ( ( seed = find(
2653 token.matches[ 0 ].replace( runescape, funescape ),
2654 rsibling.test( tokens[ 0 ].type ) &&
2655 testContext( context.parentNode ) || context
2656 ) ) ) {
2657
2658 // If seed is empty or no tokens remain, we can return early
2659 tokens.splice( i, 1 );
2660 selector = seed.length && toSelector( tokens );
2661 if ( !selector ) {
2662 push.apply( results, seed );
2663 return results;
2664 }
2665
2666 break;
2667 }
2668 }
2669 }
2670 }
2671
2672 // Compile and execute a filtering function if one is not provided
2673 // Provide `match` to avoid retokenization if we modified the selector above
2674 ( compiled || compile( selector, match ) )(
2675 seed,
2676 context,
2677 !documentIsHTML,
2678 results,
2679 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2680 );
2681 return results;
2682}
2683
2684// One-time assignments
2685
2686// Support: Android <=4.0 - 4.1+
2687// Sort stability
2688support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
2689
2690// Initialize against the default document
2691setDocument();
2692
2693// Support: Android <=4.0 - 4.1+
2694// Detached nodes confoundingly follow *each other*
2695support.sortDetached = assert( function( el ) {
2696
2697 // Should return 1, but returns 4 (following)
2698 return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2699} );
2700
2701jQuery.find = find;
2702
2703// Deprecated
2704jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2705jQuery.unique = jQuery.uniqueSort;
2706
2707// These have always been private, but they used to be documented as part of
2708// Sizzle so let's maintain them for now for backwards compatibility purposes.
2709find.compile = compile;
2710find.select = select;
2711find.setDocument = setDocument;
2712find.tokenize = tokenize;
2713
2714find.escape = jQuery.escapeSelector;
2715find.getText = jQuery.text;
2716find.isXML = jQuery.isXMLDoc;
2717find.selectors = jQuery.expr;
2718find.support = jQuery.support;
2719find.uniqueSort = jQuery.uniqueSort;
2720
2721 /* eslint-enable */
2722
2723} )();
2724
2725
2726var dir = function( elem, dir, until ) {
2727 var matched = [],
2728 truncate = until !== undefined;
2729
2730 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2731 if ( elem.nodeType === 1 ) {
2732 if ( truncate && jQuery( elem ).is( until ) ) {
2733 break;
2734 }
2735 matched.push( elem );
2736 }
2737 }
2738 return matched;
2739};
2740
2741
2742var siblings = function( n, elem ) {
2743 var matched = [];
2744
2745 for ( ; n; n = n.nextSibling ) {
2746 if ( n.nodeType === 1 && n !== elem ) {
2747 matched.push( n );
2748 }
2749 }
2750
2751 return matched;
2752};
2753
2754
2755var rneedsContext = jQuery.expr.match.needsContext;
2756
2757var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
2758
2759
2760
2761// Implement the identical functionality for filter and not
2762function winnow( elements, qualifier, not ) {
2763 if ( isFunction( qualifier ) ) {
2764 return jQuery.grep( elements, function( elem, i ) {
2765 return !!qualifier.call( elem, i, elem ) !== not;
2766 } );
2767 }
2768
2769 // Single element
2770 if ( qualifier.nodeType ) {
2771 return jQuery.grep( elements, function( elem ) {
2772 return ( elem === qualifier ) !== not;
2773 } );
2774 }
2775
2776 // Arraylike of elements (jQuery, arguments, Array)
2777 if ( typeof qualifier !== "string" ) {
2778 return jQuery.grep( elements, function( elem ) {
2779 return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
2780 } );
2781 }
2782
2783 // Filtered directly for both simple and complex selectors
2784 return jQuery.filter( qualifier, elements, not );
2785}
2786
2787jQuery.filter = function( expr, elems, not ) {
2788 var elem = elems[ 0 ];
2789
2790 if ( not ) {
2791 expr = ":not(" + expr + ")";
2792 }
2793
2794 if ( elems.length === 1 && elem.nodeType === 1 ) {
2795 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
2796 }
2797
2798 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2799 return elem.nodeType === 1;
2800 } ) );
2801};
2802
2803jQuery.fn.extend( {
2804 find: function( selector ) {
2805 var i, ret,
2806 len = this.length,
2807 self = this;
2808
2809 if ( typeof selector !== "string" ) {
2810 return this.pushStack( jQuery( selector ).filter( function() {
2811 for ( i = 0; i < len; i++ ) {
2812 if ( jQuery.contains( self[ i ], this ) ) {
2813 return true;
2814 }
2815 }
2816 } ) );
2817 }
2818
2819 ret = this.pushStack( [] );
2820
2821 for ( i = 0; i < len; i++ ) {
2822 jQuery.find( selector, self[ i ], ret );
2823 }
2824
2825 return len > 1 ? jQuery.uniqueSort( ret ) : ret;
2826 },
2827 filter: function( selector ) {
2828 return this.pushStack( winnow( this, selector || [], false ) );
2829 },
2830 not: function( selector ) {
2831 return this.pushStack( winnow( this, selector || [], true ) );
2832 },
2833 is: function( selector ) {
2834 return !!winnow(
2835 this,
2836
2837 // If this is a positional/relative selector, check membership in the returned set
2838 // so $("p:first").is("p:last") won't return true for a doc with two "p".
2839 typeof selector === "string" && rneedsContext.test( selector ) ?
2840 jQuery( selector ) :
2841 selector || [],
2842 false
2843 ).length;
2844 }
2845} );
2846
2847
2848// Initialize a jQuery object
2849
2850
2851// A central reference to the root jQuery(document)
2852var rootjQuery,
2853
2854 // A simple way to check for HTML strings
2855 // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
2856 // Strict HTML recognition (trac-11290: must start with <)
2857 // Shortcut simple #id case for speed
2858 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
2859
2860 init = jQuery.fn.init = function( selector, context, root ) {
2861 var match, elem;
2862
2863 // HANDLE: $(""), $(null), $(undefined), $(false)
2864 if ( !selector ) {
2865 return this;
2866 }
2867
2868 // Method init() accepts an alternate rootjQuery
2869 // so migrate can support jQuery.sub (gh-2101)
2870 root = root || rootjQuery;
2871
2872 // Handle HTML strings
2873 if ( typeof selector === "string" ) {
2874 if ( selector[ 0 ] === "<" &&
2875 selector[ selector.length - 1 ] === ">" &&
2876 selector.length >= 3 ) {
2877
2878 // Assume that strings that start and end with <> are HTML and skip the regex check
2879 match = [ null, selector, null ];
2880
2881 } else {
2882 match = rquickExpr.exec( selector );
2883 }
2884
2885 // Match html or make sure no context is specified for #id
2886 if ( match && ( match[ 1 ] || !context ) ) {
2887
2888 // HANDLE: $(html) -> $(array)
2889 if ( match[ 1 ] ) {
2890 context = context instanceof jQuery ? context[ 0 ] : context;
2891
2892 // Option to run scripts is true for back-compat
2893 // Intentionally let the error be thrown if parseHTML is not present
2894 jQuery.merge( this, jQuery.parseHTML(
2895 match[ 1 ],
2896 context && context.nodeType ? context.ownerDocument || context : document,
2897 true
2898 ) );
2899
2900 // HANDLE: $(html, props)
2901 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
2902 for ( match in context ) {
2903
2904 // Properties of context are called as methods if possible
2905 if ( isFunction( this[ match ] ) ) {
2906 this[ match ]( context[ match ] );
2907
2908 // ...and otherwise set as attributes
2909 } else {
2910 this.attr( match, context[ match ] );
2911 }
2912 }
2913 }
2914
2915 return this;
2916
2917 // HANDLE: $(#id)
2918 } else {
2919 elem = document.getElementById( match[ 2 ] );
2920
2921 if ( elem ) {
2922
2923 // Inject the element directly into the jQuery object
2924 this[ 0 ] = elem;
2925 this.length = 1;
2926 }
2927 return this;
2928 }
2929
2930 // HANDLE: $(expr, $(...))
2931 } else if ( !context || context.jquery ) {
2932 return ( context || root ).find( selector );
2933
2934 // HANDLE: $(expr, context)
2935 // (which is just equivalent to: $(context).find(expr)
2936 } else {
2937 return this.constructor( context ).find( selector );
2938 }
2939
2940 // HANDLE: $(DOMElement)
2941 } else if ( selector.nodeType ) {
2942 this[ 0 ] = selector;
2943 this.length = 1;
2944 return this;
2945
2946 // HANDLE: $(function)
2947 // Shortcut for document ready
2948 } else if ( isFunction( selector ) ) {
2949 return root.ready !== undefined ?
2950 root.ready( selector ) :
2951
2952 // Execute immediately if ready is not present
2953 selector( jQuery );
2954 }
2955
2956 return jQuery.makeArray( selector, this );
2957 };
2958
2959// Give the init function the jQuery prototype for later instantiation
2960init.prototype = jQuery.fn;
2961
2962// Initialize central reference
2963rootjQuery = jQuery( document );
2964
2965
2966var rparentsprev = /^(?:parents|prev(?:Until|All))/,
2967
2968 // Methods guaranteed to produce a unique set when starting from a unique set
2969 guaranteedUnique = {
2970 children: true,
2971 contents: true,
2972 next: true,
2973 prev: true
2974 };
2975
2976jQuery.fn.extend( {
2977 has: function( target ) {
2978 var targets = jQuery( target, this ),
2979 l = targets.length;
2980
2981 return this.filter( function() {
2982 var i = 0;
2983 for ( ; i < l; i++ ) {
2984 if ( jQuery.contains( this, targets[ i ] ) ) {
2985 return true;
2986 }
2987 }
2988 } );
2989 },
2990
2991 closest: function( selectors, context ) {
2992 var cur,
2993 i = 0,
2994 l = this.length,
2995 matched = [],
2996 targets = typeof selectors !== "string" && jQuery( selectors );
2997
2998 // Positional selectors never match, since there's no _selection_ context
2999 if ( !rneedsContext.test( selectors ) ) {
3000 for ( ; i < l; i++ ) {
3001 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3002
3003 // Always skip document fragments
3004 if ( cur.nodeType < 11 && ( targets ?
3005 targets.index( cur ) > -1 :
3006
3007 // Don't pass non-elements to jQuery#find
3008 cur.nodeType === 1 &&
3009 jQuery.find.matchesSelector( cur, selectors ) ) ) {
3010
3011 matched.push( cur );
3012 break;
3013 }
3014 }
3015 }
3016 }
3017
3018 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3019 },
3020
3021 // Determine the position of an element within the set
3022 index: function( elem ) {
3023
3024 // No argument, return index in parent
3025 if ( !elem ) {
3026 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3027 }
3028
3029 // Index in selector
3030 if ( typeof elem === "string" ) {
3031 return indexOf.call( jQuery( elem ), this[ 0 ] );
3032 }
3033
3034 // Locate the position of the desired element
3035 return indexOf.call( this,
3036
3037 // If it receives a jQuery object, the first element is used
3038 elem.jquery ? elem[ 0 ] : elem
3039 );
3040 },
3041
3042 add: function( selector, context ) {
3043 return this.pushStack(
3044 jQuery.uniqueSort(
3045 jQuery.merge( this.get(), jQuery( selector, context ) )
3046 )
3047 );
3048 },
3049
3050 addBack: function( selector ) {
3051 return this.add( selector == null ?
3052 this.prevObject : this.prevObject.filter( selector )
3053 );
3054 }
3055} );
3056
3057function sibling( cur, dir ) {
3058 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3059 return cur;
3060}
3061
3062jQuery.each( {
3063 parent: function( elem ) {
3064 var parent = elem.parentNode;
3065 return parent && parent.nodeType !== 11 ? parent : null;
3066 },
3067 parents: function( elem ) {
3068 return dir( elem, "parentNode" );
3069 },
3070 parentsUntil: function( elem, _i, until ) {
3071 return dir( elem, "parentNode", until );
3072 },
3073 next: function( elem ) {
3074 return sibling( elem, "nextSibling" );
3075 },
3076 prev: function( elem ) {
3077 return sibling( elem, "previousSibling" );
3078 },
3079 nextAll: function( elem ) {
3080 return dir( elem, "nextSibling" );
3081 },
3082 prevAll: function( elem ) {
3083 return dir( elem, "previousSibling" );
3084 },
3085 nextUntil: function( elem, _i, until ) {
3086 return dir( elem, "nextSibling", until );
3087 },
3088 prevUntil: function( elem, _i, until ) {
3089 return dir( elem, "previousSibling", until );
3090 },
3091 siblings: function( elem ) {
3092 return siblings( ( elem.parentNode || {} ).firstChild, elem );
3093 },
3094 children: function( elem ) {
3095 return siblings( elem.firstChild );
3096 },
3097 contents: function( elem ) {
3098 if ( elem.contentDocument != null &&
3099
3100 // Support: IE 11+
3101 // <object> elements with no `data` attribute has an object
3102 // `contentDocument` with a `null` prototype.
3103 getProto( elem.contentDocument ) ) {
3104
3105 return elem.contentDocument;
3106 }
3107
3108 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3109 // Treat the template element as a regular one in browsers that
3110 // don't support it.
3111 if ( nodeName( elem, "template" ) ) {
3112 elem = elem.content || elem;
3113 }
3114
3115 return jQuery.merge( [], elem.childNodes );
3116 }
3117}, function( name, fn ) {
3118 jQuery.fn[ name ] = function( until, selector ) {
3119 var matched = jQuery.map( this, fn, until );
3120
3121 if ( name.slice( -5 ) !== "Until" ) {
3122 selector = until;
3123 }
3124
3125 if ( selector && typeof selector === "string" ) {
3126 matched = jQuery.filter( selector, matched );
3127 }
3128
3129 if ( this.length > 1 ) {
3130
3131 // Remove duplicates
3132 if ( !guaranteedUnique[ name ] ) {
3133 jQuery.uniqueSort( matched );
3134 }
3135
3136 // Reverse order for parents* and prev-derivatives
3137 if ( rparentsprev.test( name ) ) {
3138 matched.reverse();
3139 }
3140 }
3141
3142 return this.pushStack( matched );
3143 };
3144} );
3145var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3146
3147
3148
3149// Convert String-formatted options into Object-formatted ones
3150function createOptions( options ) {
3151 var object = {};
3152 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3153 object[ flag ] = true;
3154 } );
3155 return object;
3156}
3157
3158/*
3159 * Create a callback list using the following parameters:
3160 *
3161 * options: an optional list of space-separated options that will change how
3162 * the callback list behaves or a more traditional option object
3163 *
3164 * By default a callback list will act like an event callback list and can be
3165 * "fired" multiple times.
3166 *
3167 * Possible options:
3168 *
3169 * once: will ensure the callback list can only be fired once (like a Deferred)
3170 *
3171 * memory: will keep track of previous values and will call any callback added
3172 * after the list has been fired right away with the latest "memorized"
3173 * values (like a Deferred)
3174 *
3175 * unique: will ensure a callback can only be added once (no duplicate in the list)
3176 *
3177 * stopOnFalse: interrupt callings when a callback returns false
3178 *
3179 */
3180jQuery.Callbacks = function( options ) {
3181
3182 // Convert options from String-formatted to Object-formatted if needed
3183 // (we check in cache first)
3184 options = typeof options === "string" ?
3185 createOptions( options ) :
3186 jQuery.extend( {}, options );
3187
3188 var // Flag to know if list is currently firing
3189 firing,
3190
3191 // Last fire value for non-forgettable lists
3192 memory,
3193
3194 // Flag to know if list was already fired
3195 fired,
3196
3197 // Flag to prevent firing
3198 locked,
3199
3200 // Actual callback list
3201 list = [],
3202
3203 // Queue of execution data for repeatable lists
3204 queue = [],
3205
3206 // Index of currently firing callback (modified by add/remove as needed)
3207 firingIndex = -1,
3208
3209 // Fire callbacks
3210 fire = function() {
3211
3212 // Enforce single-firing
3213 locked = locked || options.once;
3214
3215 // Execute callbacks for all pending executions,
3216 // respecting firingIndex overrides and runtime changes
3217 fired = firing = true;
3218 for ( ; queue.length; firingIndex = -1 ) {
3219 memory = queue.shift();
3220 while ( ++firingIndex < list.length ) {
3221
3222 // Run callback and check for early termination
3223 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3224 options.stopOnFalse ) {
3225
3226 // Jump to end and forget the data so .add doesn't re-fire
3227 firingIndex = list.length;
3228 memory = false;
3229 }
3230 }
3231 }
3232
3233 // Forget the data if we're done with it
3234 if ( !options.memory ) {
3235 memory = false;
3236 }
3237
3238 firing = false;
3239
3240 // Clean up if we're done firing for good
3241 if ( locked ) {
3242
3243 // Keep an empty list if we have data for future add calls
3244 if ( memory ) {
3245 list = [];
3246
3247 // Otherwise, this object is spent
3248 } else {
3249 list = "";
3250 }
3251 }
3252 },
3253
3254 // Actual Callbacks object
3255 self = {
3256
3257 // Add a callback or a collection of callbacks to the list
3258 add: function() {
3259 if ( list ) {
3260
3261 // If we have memory from a past run, we should fire after adding
3262 if ( memory && !firing ) {
3263 firingIndex = list.length - 1;
3264 queue.push( memory );
3265 }
3266
3267 ( function add( args ) {
3268 jQuery.each( args, function( _, arg ) {
3269 if ( isFunction( arg ) ) {
3270 if ( !options.unique || !self.has( arg ) ) {
3271 list.push( arg );
3272 }
3273 } else if ( arg && arg.length && toType( arg ) !== "string" ) {
3274
3275 // Inspect recursively
3276 add( arg );
3277 }
3278 } );
3279 } )( arguments );
3280
3281 if ( memory && !firing ) {
3282 fire();
3283 }
3284 }
3285 return this;
3286 },
3287
3288 // Remove a callback from the list
3289 remove: function() {
3290 jQuery.each( arguments, function( _, arg ) {
3291 var index;
3292 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3293 list.splice( index, 1 );
3294
3295 // Handle firing indexes
3296 if ( index <= firingIndex ) {
3297 firingIndex--;
3298 }
3299 }
3300 } );
3301 return this;
3302 },
3303
3304 // Check if a given callback is in the list.
3305 // If no argument is given, return whether or not list has callbacks attached.
3306 has: function( fn ) {
3307 return fn ?
3308 jQuery.inArray( fn, list ) > -1 :
3309 list.length > 0;
3310 },
3311
3312 // Remove all callbacks from the list
3313 empty: function() {
3314 if ( list ) {
3315 list = [];
3316 }
3317 return this;
3318 },
3319
3320 // Disable .fire and .add
3321 // Abort any current/pending executions
3322 // Clear all callbacks and values
3323 disable: function() {
3324 locked = queue = [];
3325 list = memory = "";
3326 return this;
3327 },
3328 disabled: function() {
3329 return !list;
3330 },
3331
3332 // Disable .fire
3333 // Also disable .add unless we have memory (since it would have no effect)
3334 // Abort any pending executions
3335 lock: function() {
3336 locked = queue = [];
3337 if ( !memory && !firing ) {
3338 list = memory = "";
3339 }
3340 return this;
3341 },
3342 locked: function() {
3343 return !!locked;
3344 },
3345
3346 // Call all callbacks with the given context and arguments
3347 fireWith: function( context, args ) {
3348 if ( !locked ) {
3349 args = args || [];
3350 args = [ context, args.slice ? args.slice() : args ];
3351 queue.push( args );
3352 if ( !firing ) {
3353 fire();
3354 }
3355 }
3356 return this;
3357 },
3358
3359 // Call all the callbacks with the given arguments
3360 fire: function() {
3361 self.fireWith( this, arguments );
3362 return this;
3363 },
3364
3365 // To know if the callbacks have already been called at least once
3366 fired: function() {
3367 return !!fired;
3368 }
3369 };
3370
3371 return self;
3372};
3373
3374
3375function Identity( v ) {
3376 return v;
3377}
3378function Thrower( ex ) {
3379 throw ex;
3380}
3381
3382function adoptValue( value, resolve, reject, noValue ) {
3383 var method;
3384
3385 try {
3386
3387 // Check for promise aspect first to privilege synchronous behavior
3388 if ( value && isFunction( ( method = value.promise ) ) ) {
3389 method.call( value ).done( resolve ).fail( reject );
3390
3391 // Other thenables
3392 } else if ( value && isFunction( ( method = value.then ) ) ) {
3393 method.call( value, resolve, reject );
3394
3395 // Other non-thenables
3396 } else {
3397
3398 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3399 // * false: [ value ].slice( 0 ) => resolve( value )
3400 // * true: [ value ].slice( 1 ) => resolve()
3401 resolve.apply( undefined, [ value ].slice( noValue ) );
3402 }
3403
3404 // For Promises/A+, convert exceptions into rejections
3405 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3406 // Deferred#then to conditionally suppress rejection.
3407 } catch ( value ) {
3408
3409 // Support: Android 4.0 only
3410 // Strict mode functions invoked without .call/.apply get global-object context
3411 reject.apply( undefined, [ value ] );
3412 }
3413}
3414
3415jQuery.extend( {
3416
3417 Deferred: function( func ) {
3418 var tuples = [
3419
3420 // action, add listener, callbacks,
3421 // ... .then handlers, argument index, [final state]
3422 [ "notify", "progress", jQuery.Callbacks( "memory" ),
3423 jQuery.Callbacks( "memory" ), 2 ],
3424 [ "resolve", "done", jQuery.Callbacks( "once memory" ),
3425 jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3426 [ "reject", "fail", jQuery.Callbacks( "once memory" ),
3427 jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3428 ],
3429 state = "pending",
3430 promise = {
3431 state: function() {
3432 return state;
3433 },
3434 always: function() {
3435 deferred.done( arguments ).fail( arguments );
3436 return this;
3437 },
3438 "catch": function( fn ) {
3439 return promise.then( null, fn );
3440 },
3441
3442 // Keep pipe for back-compat
3443 pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3444 var fns = arguments;
3445
3446 return jQuery.Deferred( function( newDefer ) {
3447 jQuery.each( tuples, function( _i, tuple ) {
3448
3449 // Map tuples (progress, done, fail) to arguments (done, fail, progress)
3450 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3451
3452 // deferred.progress(function() { bind to newDefer or newDefer.notify })
3453 // deferred.done(function() { bind to newDefer or newDefer.resolve })
3454 // deferred.fail(function() { bind to newDefer or newDefer.reject })
3455 deferred[ tuple[ 1 ] ]( function() {
3456 var returned = fn && fn.apply( this, arguments );
3457 if ( returned && isFunction( returned.promise ) ) {
3458 returned.promise()
3459 .progress( newDefer.notify )
3460 .done( newDefer.resolve )
3461 .fail( newDefer.reject );
3462 } else {
3463 newDefer[ tuple[ 0 ] + "With" ](
3464 this,
3465 fn ? [ returned ] : arguments
3466 );
3467 }
3468 } );
3469 } );
3470 fns = null;
3471 } ).promise();
3472 },
3473 then: function( onFulfilled, onRejected, onProgress ) {
3474 var maxDepth = 0;
3475 function resolve( depth, deferred, handler, special ) {
3476 return function() {
3477 var that = this,
3478 args = arguments,
3479 mightThrow = function() {
3480 var returned, then;
3481
3482 // Support: Promises/A+ section 2.3.3.3.3
3483 // https://promisesaplus.com/#point-59
3484 // Ignore double-resolution attempts
3485 if ( depth < maxDepth ) {
3486 return;
3487 }
3488
3489 returned = handler.apply( that, args );
3490
3491 // Support: Promises/A+ section 2.3.1
3492 // https://promisesaplus.com/#point-48
3493 if ( returned === deferred.promise() ) {
3494 throw new TypeError( "Thenable self-resolution" );
3495 }
3496
3497 // Support: Promises/A+ sections 2.3.3.1, 3.5
3498 // https://promisesaplus.com/#point-54
3499 // https://promisesaplus.com/#point-75
3500 // Retrieve `then` only once
3501 then = returned &&
3502
3503 // Support: Promises/A+ section 2.3.4
3504 // https://promisesaplus.com/#point-64
3505 // Only check objects and functions for thenability
3506 ( typeof returned === "object" ||
3507 typeof returned === "function" ) &&
3508 returned.then;
3509
3510 // Handle a returned thenable
3511 if ( isFunction( then ) ) {
3512
3513 // Special processors (notify) just wait for resolution
3514 if ( special ) {
3515 then.call(
3516 returned,
3517 resolve( maxDepth, deferred, Identity, special ),
3518 resolve( maxDepth, deferred, Thrower, special )
3519 );
3520
3521 // Normal processors (resolve) also hook into progress
3522 } else {
3523
3524 // ...and disregard older resolution values
3525 maxDepth++;
3526
3527 then.call(
3528 returned,
3529 resolve( maxDepth, deferred, Identity, special ),
3530 resolve( maxDepth, deferred, Thrower, special ),
3531 resolve( maxDepth, deferred, Identity,
3532 deferred.notifyWith )
3533 );
3534 }
3535
3536 // Handle all other returned values
3537 } else {
3538
3539 // Only substitute handlers pass on context
3540 // and multiple values (non-spec behavior)
3541 if ( handler !== Identity ) {
3542 that = undefined;
3543 args = [ returned ];
3544 }
3545
3546 // Process the value(s)
3547 // Default process is resolve
3548 ( special || deferred.resolveWith )( that, args );
3549 }
3550 },
3551
3552 // Only normal processors (resolve) catch and reject exceptions
3553 process = special ?
3554 mightThrow :
3555 function() {
3556 try {
3557 mightThrow();
3558 } catch ( e ) {
3559
3560 if ( jQuery.Deferred.exceptionHook ) {
3561 jQuery.Deferred.exceptionHook( e,
3562 process.error );
3563 }
3564
3565 // Support: Promises/A+ section 2.3.3.3.4.1
3566 // https://promisesaplus.com/#point-61
3567 // Ignore post-resolution exceptions
3568 if ( depth + 1 >= maxDepth ) {
3569
3570 // Only substitute handlers pass on context
3571 // and multiple values (non-spec behavior)
3572 if ( handler !== Thrower ) {
3573 that = undefined;
3574 args = [ e ];
3575 }
3576
3577 deferred.rejectWith( that, args );
3578 }
3579 }
3580 };
3581
3582 // Support: Promises/A+ section 2.3.3.3.1
3583 // https://promisesaplus.com/#point-57
3584 // Re-resolve promises immediately to dodge false rejection from
3585 // subsequent errors
3586 if ( depth ) {
3587 process();
3588 } else {
3589
3590 // Call an optional hook to record the error, in case of exception
3591 // since it's otherwise lost when execution goes async
3592 if ( jQuery.Deferred.getErrorHook ) {
3593 process.error = jQuery.Deferred.getErrorHook();
3594
3595 // The deprecated alias of the above. While the name suggests
3596 // returning the stack, not an error instance, jQuery just passes
3597 // it directly to `console.warn` so both will work; an instance
3598 // just better cooperates with source maps.
3599 } else if ( jQuery.Deferred.getStackHook ) {
3600 process.error = jQuery.Deferred.getStackHook();
3601 }
3602 window.setTimeout( process );
3603 }
3604 };
3605 }
3606
3607 return jQuery.Deferred( function( newDefer ) {
3608
3609 // progress_handlers.add( ... )
3610 tuples[ 0 ][ 3 ].add(
3611 resolve(
3612 0,
3613 newDefer,
3614 isFunction( onProgress ) ?
3615 onProgress :
3616 Identity,
3617 newDefer.notifyWith
3618 )
3619 );
3620
3621 // fulfilled_handlers.add( ... )
3622 tuples[ 1 ][ 3 ].add(
3623 resolve(
3624 0,
3625 newDefer,
3626 isFunction( onFulfilled ) ?
3627 onFulfilled :
3628 Identity
3629 )
3630 );
3631
3632 // rejected_handlers.add( ... )
3633 tuples[ 2 ][ 3 ].add(
3634 resolve(
3635 0,
3636 newDefer,
3637 isFunction( onRejected ) ?
3638 onRejected :
3639 Thrower
3640 )
3641 );
3642 } ).promise();
3643 },
3644
3645 // Get a promise for this deferred
3646 // If obj is provided, the promise aspect is added to the object
3647 promise: function( obj ) {
3648 return obj != null ? jQuery.extend( obj, promise ) : promise;
3649 }
3650 },
3651 deferred = {};
3652
3653 // Add list-specific methods
3654 jQuery.each( tuples, function( i, tuple ) {
3655 var list = tuple[ 2 ],
3656 stateString = tuple[ 5 ];
3657
3658 // promise.progress = list.add
3659 // promise.done = list.add
3660 // promise.fail = list.add
3661 promise[ tuple[ 1 ] ] = list.add;
3662
3663 // Handle state
3664 if ( stateString ) {
3665 list.add(
3666 function() {
3667
3668 // state = "resolved" (i.e., fulfilled)
3669 // state = "rejected"
3670 state = stateString;
3671 },
3672
3673 // rejected_callbacks.disable
3674 // fulfilled_callbacks.disable
3675 tuples[ 3 - i ][ 2 ].disable,
3676
3677 // rejected_handlers.disable
3678 // fulfilled_handlers.disable
3679 tuples[ 3 - i ][ 3 ].disable,
3680
3681 // progress_callbacks.lock
3682 tuples[ 0 ][ 2 ].lock,
3683
3684 // progress_handlers.lock
3685 tuples[ 0 ][ 3 ].lock
3686 );
3687 }
3688
3689 // progress_handlers.fire
3690 // fulfilled_handlers.fire
3691 // rejected_handlers.fire
3692 list.add( tuple[ 3 ].fire );
3693
3694 // deferred.notify = function() { deferred.notifyWith(...) }
3695 // deferred.resolve = function() { deferred.resolveWith(...) }
3696 // deferred.reject = function() { deferred.rejectWith(...) }
3697 deferred[ tuple[ 0 ] ] = function() {
3698 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3699 return this;
3700 };
3701
3702 // deferred.notifyWith = list.fireWith
3703 // deferred.resolveWith = list.fireWith
3704 // deferred.rejectWith = list.fireWith
3705 deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3706 } );
3707
3708 // Make the deferred a promise
3709 promise.promise( deferred );
3710
3711 // Call given func if any
3712 if ( func ) {
3713 func.call( deferred, deferred );
3714 }
3715
3716 // All done!
3717 return deferred;
3718 },
3719
3720 // Deferred helper
3721 when: function( singleValue ) {
3722 var
3723
3724 // count of uncompleted subordinates
3725 remaining = arguments.length,
3726
3727 // count of unprocessed arguments
3728 i = remaining,
3729
3730 // subordinate fulfillment data
3731 resolveContexts = Array( i ),
3732 resolveValues = slice.call( arguments ),
3733
3734 // the primary Deferred
3735 primary = jQuery.Deferred(),
3736
3737 // subordinate callback factory
3738 updateFunc = function( i ) {
3739 return function( value ) {
3740 resolveContexts[ i ] = this;
3741 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3742 if ( !( --remaining ) ) {
3743 primary.resolveWith( resolveContexts, resolveValues );
3744 }
3745 };
3746 };
3747
3748 // Single- and empty arguments are adopted like Promise.resolve
3749 if ( remaining <= 1 ) {
3750 adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
3751 !remaining );
3752
3753 // Use .then() to unwrap secondary thenables (cf. gh-3000)
3754 if ( primary.state() === "pending" ||
3755 isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
3756
3757 return primary.then();
3758 }
3759 }
3760
3761 // Multiple arguments are aggregated like Promise.all array elements
3762 while ( i-- ) {
3763 adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
3764 }
3765
3766 return primary.promise();
3767 }
3768} );
3769
3770
3771// These usually indicate a programmer mistake during development,
3772// warn about them ASAP rather than swallowing them by default.
3773var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
3774
3775// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
3776// captured before the async barrier to get the original error cause
3777// which may otherwise be hidden.
3778jQuery.Deferred.exceptionHook = function( error, asyncError ) {
3779
3780 // Support: IE 8 - 9 only
3781 // Console exists when dev tools are open, which can happen at any time
3782 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
3783 window.console.warn( "jQuery.Deferred exception: " + error.message,
3784 error.stack, asyncError );
3785 }
3786};
3787
3788
3789
3790
3791jQuery.readyException = function( error ) {
3792 window.setTimeout( function() {
3793 throw error;
3794 } );
3795};
3796
3797
3798
3799
3800// The deferred used on DOM ready
3801var readyList = jQuery.Deferred();
3802
3803jQuery.fn.ready = function( fn ) {
3804
3805 readyList
3806 .then( fn )
3807
3808 // Wrap jQuery.readyException in a function so that the lookup
3809 // happens at the time of error handling instead of callback
3810 // registration.
3811 .catch( function( error ) {
3812 jQuery.readyException( error );
3813 } );
3814
3815 return this;
3816};
3817
3818jQuery.extend( {
3819
3820 // Is the DOM ready to be used? Set to true once it occurs.
3821 isReady: false,
3822
3823 // A counter to track how many items to wait for before
3824 // the ready event fires. See trac-6781
3825 readyWait: 1,
3826
3827 // Handle when the DOM is ready
3828 ready: function( wait ) {
3829
3830 // Abort if there are pending holds or we're already ready
3831 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3832 return;
3833 }
3834
3835 // Remember that the DOM is ready
3836 jQuery.isReady = true;
3837
3838 // If a normal DOM Ready event fired, decrement, and wait if need be
3839 if ( wait !== true && --jQuery.readyWait > 0 ) {
3840 return;
3841 }
3842
3843 // If there are functions bound, to execute
3844 readyList.resolveWith( document, [ jQuery ] );
3845 }
3846} );
3847
3848jQuery.ready.then = readyList.then;
3849
3850// The ready event handler and self cleanup method
3851function completed() {
3852 document.removeEventListener( "DOMContentLoaded", completed );
3853 window.removeEventListener( "load", completed );
3854 jQuery.ready();
3855}
3856
3857// Catch cases where $(document).ready() is called
3858// after the browser event has already occurred.
3859// Support: IE <=9 - 10 only
3860// Older IE sometimes signals "interactive" too soon
3861if ( document.readyState === "complete" ||
3862 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
3863
3864 // Handle it asynchronously to allow scripts the opportunity to delay ready
3865 window.setTimeout( jQuery.ready );
3866
3867} else {
3868
3869 // Use the handy event callback
3870 document.addEventListener( "DOMContentLoaded", completed );
3871
3872 // A fallback to window.onload, that will always work
3873 window.addEventListener( "load", completed );
3874}
3875
3876
3877
3878
3879// Multifunctional method to get and set values of a collection
3880// The value/s can optionally be executed if it's a function
3881var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3882 var i = 0,
3883 len = elems.length,
3884 bulk = key == null;
3885
3886 // Sets many values
3887 if ( toType( key ) === "object" ) {
3888 chainable = true;
3889 for ( i in key ) {
3890 access( elems, fn, i, key[ i ], true, emptyGet, raw );
3891 }
3892
3893 // Sets one value
3894 } else if ( value !== undefined ) {
3895 chainable = true;
3896
3897 if ( !isFunction( value ) ) {
3898 raw = true;
3899 }
3900
3901 if ( bulk ) {
3902
3903 // Bulk operations run against the entire set
3904 if ( raw ) {
3905 fn.call( elems, value );
3906 fn = null;
3907
3908 // ...except when executing function values
3909 } else {
3910 bulk = fn;
3911 fn = function( elem, _key, value ) {
3912 return bulk.call( jQuery( elem ), value );
3913 };
3914 }
3915 }
3916
3917 if ( fn ) {
3918 for ( ; i < len; i++ ) {
3919 fn(
3920 elems[ i ], key, raw ?
3921 value :
3922 value.call( elems[ i ], i, fn( elems[ i ], key ) )
3923 );
3924 }
3925 }
3926 }
3927
3928 if ( chainable ) {
3929 return elems;
3930 }
3931
3932 // Gets
3933 if ( bulk ) {
3934 return fn.call( elems );
3935 }
3936
3937 return len ? fn( elems[ 0 ], key ) : emptyGet;
3938};
3939
3940
3941// Matches dashed string for camelizing
3942var rmsPrefix = /^-ms-/,
3943 rdashAlpha = /-([a-z])/g;
3944
3945// Used by camelCase as callback to replace()
3946function fcamelCase( _all, letter ) {
3947 return letter.toUpperCase();
3948}
3949
3950// Convert dashed to camelCase; used by the css and data modules
3951// Support: IE <=9 - 11, Edge 12 - 15
3952// Microsoft forgot to hump their vendor prefix (trac-9572)
3953function camelCase( string ) {
3954 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
3955}
3956var acceptData = function( owner ) {
3957
3958 // Accepts only:
3959 // - Node
3960 // - Node.ELEMENT_NODE
3961 // - Node.DOCUMENT_NODE
3962 // - Object
3963 // - Any
3964 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
3965};
3966
3967
3968
3969
3970function Data() {
3971 this.expando = jQuery.expando + Data.uid++;
3972}
3973
3974Data.uid = 1;
3975
3976Data.prototype = {
3977
3978 cache: function( owner ) {
3979
3980 // Check if the owner object already has a cache
3981 var value = owner[ this.expando ];
3982
3983 // If not, create one
3984 if ( !value ) {
3985 value = {};
3986
3987 // We can accept data for non-element nodes in modern browsers,
3988 // but we should not, see trac-8335.
3989 // Always return an empty object.
3990 if ( acceptData( owner ) ) {
3991
3992 // If it is a node unlikely to be stringify-ed or looped over
3993 // use plain assignment
3994 if ( owner.nodeType ) {
3995 owner[ this.expando ] = value;
3996
3997 // Otherwise secure it in a non-enumerable property
3998 // configurable must be true to allow the property to be
3999 // deleted when data is removed
4000 } else {
4001 Object.defineProperty( owner, this.expando, {
4002 value: value,
4003 configurable: true
4004 } );
4005 }
4006 }
4007 }
4008
4009 return value;
4010 },
4011 set: function( owner, data, value ) {
4012 var prop,
4013 cache = this.cache( owner );
4014
4015 // Handle: [ owner, key, value ] args
4016 // Always use camelCase key (gh-2257)
4017 if ( typeof data === "string" ) {
4018 cache[ camelCase( data ) ] = value;
4019
4020 // Handle: [ owner, { properties } ] args
4021 } else {
4022
4023 // Copy the properties one-by-one to the cache object
4024 for ( prop in data ) {
4025 cache[ camelCase( prop ) ] = data[ prop ];
4026 }
4027 }
4028 return cache;
4029 },
4030 get: function( owner, key ) {
4031 return key === undefined ?
4032 this.cache( owner ) :
4033
4034 // Always use camelCase key (gh-2257)
4035 owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4036 },
4037 access: function( owner, key, value ) {
4038
4039 // In cases where either:
4040 //
4041 // 1. No key was specified
4042 // 2. A string key was specified, but no value provided
4043 //
4044 // Take the "read" path and allow the get method to determine
4045 // which value to return, respectively either:
4046 //
4047 // 1. The entire cache object
4048 // 2. The data stored at the key
4049 //
4050 if ( key === undefined ||
4051 ( ( key && typeof key === "string" ) && value === undefined ) ) {
4052
4053 return this.get( owner, key );
4054 }
4055
4056 // When the key is not a string, or both a key and value
4057 // are specified, set or extend (existing objects) with either:
4058 //
4059 // 1. An object of properties
4060 // 2. A key and value
4061 //
4062 this.set( owner, key, value );
4063
4064 // Since the "set" path can have two possible entry points
4065 // return the expected data based on which path was taken[*]
4066 return value !== undefined ? value : key;
4067 },
4068 remove: function( owner, key ) {
4069 var i,
4070 cache = owner[ this.expando ];
4071
4072 if ( cache === undefined ) {
4073 return;
4074 }
4075
4076 if ( key !== undefined ) {
4077
4078 // Support array or space separated string of keys
4079 if ( Array.isArray( key ) ) {
4080
4081 // If key is an array of keys...
4082 // We always set camelCase keys, so remove that.
4083 key = key.map( camelCase );
4084 } else {
4085 key = camelCase( key );
4086
4087 // If a key with the spaces exists, use it.
4088 // Otherwise, create an array by matching non-whitespace
4089 key = key in cache ?
4090 [ key ] :
4091 ( key.match( rnothtmlwhite ) || [] );
4092 }
4093
4094 i = key.length;
4095
4096 while ( i-- ) {
4097 delete cache[ key[ i ] ];
4098 }
4099 }
4100
4101 // Remove the expando if there's no more data
4102 if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4103
4104 // Support: Chrome <=35 - 45
4105 // Webkit & Blink performance suffers when deleting properties
4106 // from DOM nodes, so set to undefined instead
4107 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4108 if ( owner.nodeType ) {
4109 owner[ this.expando ] = undefined;
4110 } else {
4111 delete owner[ this.expando ];
4112 }
4113 }
4114 },
4115 hasData: function( owner ) {
4116 var cache = owner[ this.expando ];
4117 return cache !== undefined && !jQuery.isEmptyObject( cache );
4118 }
4119};
4120var dataPriv = new Data();
4121
4122var dataUser = new Data();
4123
4124
4125
4126// Implementation Summary
4127//
4128// 1. Enforce API surface and semantic compatibility with 1.9.x branch
4129// 2. Improve the module's maintainability by reducing the storage
4130// paths to a single mechanism.
4131// 3. Use the same single mechanism to support "private" and "user" data.
4132// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4133// 5. Avoid exposing implementation details on user objects (eg. expando properties)
4134// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
4135
4136var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4137 rmultiDash = /[A-Z]/g;
4138
4139function getData( data ) {
4140 if ( data === "true" ) {
4141 return true;
4142 }
4143
4144 if ( data === "false" ) {
4145 return false;
4146 }
4147
4148 if ( data === "null" ) {
4149 return null;
4150 }
4151
4152 // Only convert to a number if it doesn't change the string
4153 if ( data === +data + "" ) {
4154 return +data;
4155 }
4156
4157 if ( rbrace.test( data ) ) {
4158 return JSON.parse( data );
4159 }
4160
4161 return data;
4162}
4163
4164function dataAttr( elem, key, data ) {
4165 var name;
4166
4167 // If nothing was found internally, try to fetch any
4168 // data from the HTML5 data-* attribute
4169 if ( data === undefined && elem.nodeType === 1 ) {
4170 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4171 data = elem.getAttribute( name );
4172
4173 if ( typeof data === "string" ) {
4174 try {
4175 data = getData( data );
4176 } catch ( e ) {}
4177
4178 // Make sure we set the data so it isn't changed later
4179 dataUser.set( elem, key, data );
4180 } else {
4181 data = undefined;
4182 }
4183 }
4184 return data;
4185}
4186
4187jQuery.extend( {
4188 hasData: function( elem ) {
4189 return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4190 },
4191
4192 data: function( elem, name, data ) {
4193 return dataUser.access( elem, name, data );
4194 },
4195
4196 removeData: function( elem, name ) {
4197 dataUser.remove( elem, name );
4198 },
4199
4200 // TODO: Now that all calls to _data and _removeData have been replaced
4201 // with direct calls to dataPriv methods, these can be deprecated.
4202 _data: function( elem, name, data ) {
4203 return dataPriv.access( elem, name, data );
4204 },
4205
4206 _removeData: function( elem, name ) {
4207 dataPriv.remove( elem, name );
4208 }
4209} );
4210
4211jQuery.fn.extend( {
4212 data: function( key, value ) {
4213 var i, name, data,
4214 elem = this[ 0 ],
4215 attrs = elem && elem.attributes;
4216
4217 // Gets all values
4218 if ( key === undefined ) {
4219 if ( this.length ) {
4220 data = dataUser.get( elem );
4221
4222 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4223 i = attrs.length;
4224 while ( i-- ) {
4225
4226 // Support: IE 11 only
4227 // The attrs elements can be null (trac-14894)
4228 if ( attrs[ i ] ) {
4229 name = attrs[ i ].name;
4230 if ( name.indexOf( "data-" ) === 0 ) {
4231 name = camelCase( name.slice( 5 ) );
4232 dataAttr( elem, name, data[ name ] );
4233 }
4234 }
4235 }
4236 dataPriv.set( elem, "hasDataAttrs", true );
4237 }
4238 }
4239
4240 return data;
4241 }
4242
4243 // Sets multiple values
4244 if ( typeof key === "object" ) {
4245 return this.each( function() {
4246 dataUser.set( this, key );
4247 } );
4248 }
4249
4250 return access( this, function( value ) {
4251 var data;
4252
4253 // The calling jQuery object (element matches) is not empty
4254 // (and therefore has an element appears at this[ 0 ]) and the
4255 // `value` parameter was not undefined. An empty jQuery object
4256 // will result in `undefined` for elem = this[ 0 ] which will
4257 // throw an exception if an attempt to read a data cache is made.
4258 if ( elem && value === undefined ) {
4259
4260 // Attempt to get data from the cache
4261 // The key will always be camelCased in Data
4262 data = dataUser.get( elem, key );
4263 if ( data !== undefined ) {
4264 return data;
4265 }
4266
4267 // Attempt to "discover" the data in
4268 // HTML5 custom data-* attrs
4269 data = dataAttr( elem, key );
4270 if ( data !== undefined ) {
4271 return data;
4272 }
4273
4274 // We tried really hard, but the data doesn't exist.
4275 return;
4276 }
4277
4278 // Set the data...
4279 this.each( function() {
4280
4281 // We always store the camelCased key
4282 dataUser.set( this, key, value );
4283 } );
4284 }, null, value, arguments.length > 1, null, true );
4285 },
4286
4287 removeData: function( key ) {
4288 return this.each( function() {
4289 dataUser.remove( this, key );
4290 } );
4291 }
4292} );
4293
4294
4295jQuery.extend( {
4296 queue: function( elem, type, data ) {
4297 var queue;
4298
4299 if ( elem ) {
4300 type = ( type || "fx" ) + "queue";
4301 queue = dataPriv.get( elem, type );
4302
4303 // Speed up dequeue by getting out quickly if this is just a lookup
4304 if ( data ) {
4305 if ( !queue || Array.isArray( data ) ) {
4306 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4307 } else {
4308 queue.push( data );
4309 }
4310 }
4311 return queue || [];
4312 }
4313 },
4314
4315 dequeue: function( elem, type ) {
4316 type = type || "fx";
4317
4318 var queue = jQuery.queue( elem, type ),
4319 startLength = queue.length,
4320 fn = queue.shift(),
4321 hooks = jQuery._queueHooks( elem, type ),
4322 next = function() {
4323 jQuery.dequeue( elem, type );
4324 };
4325
4326 // If the fx queue is dequeued, always remove the progress sentinel
4327 if ( fn === "inprogress" ) {
4328 fn = queue.shift();
4329 startLength--;
4330 }
4331
4332 if ( fn ) {
4333
4334 // Add a progress sentinel to prevent the fx queue from being
4335 // automatically dequeued
4336 if ( type === "fx" ) {
4337 queue.unshift( "inprogress" );
4338 }
4339
4340 // Clear up the last queue stop function
4341 delete hooks.stop;
4342 fn.call( elem, next, hooks );
4343 }
4344
4345 if ( !startLength && hooks ) {
4346 hooks.empty.fire();
4347 }
4348 },
4349
4350 // Not public - generate a queueHooks object, or return the current one
4351 _queueHooks: function( elem, type ) {
4352 var key = type + "queueHooks";
4353 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4354 empty: jQuery.Callbacks( "once memory" ).add( function() {
4355 dataPriv.remove( elem, [ type + "queue", key ] );
4356 } )
4357 } );
4358 }
4359} );
4360
4361jQuery.fn.extend( {
4362 queue: function( type, data ) {
4363 var setter = 2;
4364
4365 if ( typeof type !== "string" ) {
4366 data = type;
4367 type = "fx";
4368 setter--;
4369 }
4370
4371 if ( arguments.length < setter ) {
4372 return jQuery.queue( this[ 0 ], type );
4373 }
4374
4375 return data === undefined ?
4376 this :
4377 this.each( function() {
4378 var queue = jQuery.queue( this, type, data );
4379
4380 // Ensure a hooks for this queue
4381 jQuery._queueHooks( this, type );
4382
4383 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4384 jQuery.dequeue( this, type );
4385 }
4386 } );
4387 },
4388 dequeue: function( type ) {
4389 return this.each( function() {
4390 jQuery.dequeue( this, type );
4391 } );
4392 },
4393 clearQueue: function( type ) {
4394 return this.queue( type || "fx", [] );
4395 },
4396
4397 // Get a promise resolved when queues of a certain type
4398 // are emptied (fx is the type by default)
4399 promise: function( type, obj ) {
4400 var tmp,
4401 count = 1,
4402 defer = jQuery.Deferred(),
4403 elements = this,
4404 i = this.length,
4405 resolve = function() {
4406 if ( !( --count ) ) {
4407 defer.resolveWith( elements, [ elements ] );
4408 }
4409 };
4410
4411 if ( typeof type !== "string" ) {
4412 obj = type;
4413 type = undefined;
4414 }
4415 type = type || "fx";
4416
4417 while ( i-- ) {
4418 tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4419 if ( tmp && tmp.empty ) {
4420 count++;
4421 tmp.empty.add( resolve );
4422 }
4423 }
4424 resolve();
4425 return defer.promise( obj );
4426 }
4427} );
4428var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4429
4430var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4431
4432
4433var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4434
4435var documentElement = document.documentElement;
4436
4437
4438
4439 var isAttached = function( elem ) {
4440 return jQuery.contains( elem.ownerDocument, elem );
4441 },
4442 composed = { composed: true };
4443
4444 // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
4445 // Check attachment across shadow DOM boundaries when possible (gh-3504)
4446 // Support: iOS 10.0-10.2 only
4447 // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
4448 // leading to errors. We need to check for `getRootNode`.
4449 if ( documentElement.getRootNode ) {
4450 isAttached = function( elem ) {
4451 return jQuery.contains( elem.ownerDocument, elem ) ||
4452 elem.getRootNode( composed ) === elem.ownerDocument;
4453 };
4454 }
4455var isHiddenWithinTree = function( elem, el ) {
4456
4457 // isHiddenWithinTree might be called from jQuery#filter function;
4458 // in that case, element will be second argument
4459 elem = el || elem;
4460
4461 // Inline style trumps all
4462 return elem.style.display === "none" ||
4463 elem.style.display === "" &&
4464
4465 // Otherwise, check computed style
4466 // Support: Firefox <=43 - 45
4467 // Disconnected elements can have computed display: none, so first confirm that elem is
4468 // in the document.
4469 isAttached( elem ) &&
4470
4471 jQuery.css( elem, "display" ) === "none";
4472 };
4473
4474
4475
4476function adjustCSS( elem, prop, valueParts, tween ) {
4477 var adjusted, scale,
4478 maxIterations = 20,
4479 currentValue = tween ?
4480 function() {
4481 return tween.cur();
4482 } :
4483 function() {
4484 return jQuery.css( elem, prop, "" );
4485 },
4486 initial = currentValue(),
4487 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4488
4489 // Starting value computation is required for potential unit mismatches
4490 initialInUnit = elem.nodeType &&
4491 ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4492 rcssNum.exec( jQuery.css( elem, prop ) );
4493
4494 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4495
4496 // Support: Firefox <=54
4497 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4498 initial = initial / 2;
4499
4500 // Trust units reported by jQuery.css
4501 unit = unit || initialInUnit[ 3 ];
4502
4503 // Iteratively approximate from a nonzero starting point
4504 initialInUnit = +initial || 1;
4505
4506 while ( maxIterations-- ) {
4507
4508 // Evaluate and update our best guess (doubling guesses that zero out).
4509 // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4510 jQuery.style( elem, prop, initialInUnit + unit );
4511 if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4512 maxIterations = 0;
4513 }
4514 initialInUnit = initialInUnit / scale;
4515
4516 }
4517
4518 initialInUnit = initialInUnit * 2;
4519 jQuery.style( elem, prop, initialInUnit + unit );
4520
4521 // Make sure we update the tween properties later on
4522 valueParts = valueParts || [];
4523 }
4524
4525 if ( valueParts ) {
4526 initialInUnit = +initialInUnit || +initial || 0;
4527
4528 // Apply relative offset (+=/-=) if specified
4529 adjusted = valueParts[ 1 ] ?
4530 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4531 +valueParts[ 2 ];
4532 if ( tween ) {
4533 tween.unit = unit;
4534 tween.start = initialInUnit;
4535 tween.end = adjusted;
4536 }
4537 }
4538 return adjusted;
4539}
4540
4541
4542var defaultDisplayMap = {};
4543
4544function getDefaultDisplay( elem ) {
4545 var temp,
4546 doc = elem.ownerDocument,
4547 nodeName = elem.nodeName,
4548 display = defaultDisplayMap[ nodeName ];
4549
4550 if ( display ) {
4551 return display;
4552 }
4553
4554 temp = doc.body.appendChild( doc.createElement( nodeName ) );
4555 display = jQuery.css( temp, "display" );
4556
4557 temp.parentNode.removeChild( temp );
4558
4559 if ( display === "none" ) {
4560 display = "block";
4561 }
4562 defaultDisplayMap[ nodeName ] = display;
4563
4564 return display;
4565}
4566
4567function showHide( elements, show ) {
4568 var display, elem,
4569 values = [],
4570 index = 0,
4571 length = elements.length;
4572
4573 // Determine new display value for elements that need to change
4574 for ( ; index < length; index++ ) {
4575 elem = elements[ index ];
4576 if ( !elem.style ) {
4577 continue;
4578 }
4579
4580 display = elem.style.display;
4581 if ( show ) {
4582
4583 // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4584 // check is required in this first loop unless we have a nonempty display value (either
4585 // inline or about-to-be-restored)
4586 if ( display === "none" ) {
4587 values[ index ] = dataPriv.get( elem, "display" ) || null;
4588 if ( !values[ index ] ) {
4589 elem.style.display = "";
4590 }
4591 }
4592 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4593 values[ index ] = getDefaultDisplay( elem );
4594 }
4595 } else {
4596 if ( display !== "none" ) {
4597 values[ index ] = "none";
4598
4599 // Remember what we're overwriting
4600 dataPriv.set( elem, "display", display );
4601 }
4602 }
4603 }
4604
4605 // Set the display of the elements in a second loop to avoid constant reflow
4606 for ( index = 0; index < length; index++ ) {
4607 if ( values[ index ] != null ) {
4608 elements[ index ].style.display = values[ index ];
4609 }
4610 }
4611
4612 return elements;
4613}
4614
4615jQuery.fn.extend( {
4616 show: function() {
4617 return showHide( this, true );
4618 },
4619 hide: function() {
4620 return showHide( this );
4621 },
4622 toggle: function( state ) {
4623 if ( typeof state === "boolean" ) {
4624 return state ? this.show() : this.hide();
4625 }
4626
4627 return this.each( function() {
4628 if ( isHiddenWithinTree( this ) ) {
4629 jQuery( this ).show();
4630 } else {
4631 jQuery( this ).hide();
4632 }
4633 } );
4634 }
4635} );
4636var rcheckableType = ( /^(?:checkbox|radio)$/i );
4637
4638var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4639
4640var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4641
4642
4643
4644( function() {
4645 var fragment = document.createDocumentFragment(),
4646 div = fragment.appendChild( document.createElement( "div" ) ),
4647 input = document.createElement( "input" );
4648
4649 // Support: Android 4.0 - 4.3 only
4650 // Check state lost if the name is set (trac-11217)
4651 // Support: Windows Web Apps (WWA)
4652 // `name` and `type` must use .setAttribute for WWA (trac-14901)
4653 input.setAttribute( "type", "radio" );
4654 input.setAttribute( "checked", "checked" );
4655 input.setAttribute( "name", "t" );
4656
4657 div.appendChild( input );
4658
4659 // Support: Android <=4.1 only
4660 // Older WebKit doesn't clone checked state correctly in fragments
4661 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4662
4663 // Support: IE <=11 only
4664 // Make sure textarea (and checkbox) defaultValue is properly cloned
4665 div.innerHTML = "<textarea>x</textarea>";
4666 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4667
4668 // Support: IE <=9 only
4669 // IE <=9 replaces <option> tags with their contents when inserted outside of
4670 // the select element.
4671 div.innerHTML = "<option></option>";
4672 support.option = !!div.lastChild;
4673} )();
4674
4675
4676// We have to close these tags to support XHTML (trac-13200)
4677var wrapMap = {
4678
4679 // XHTML parsers do not magically insert elements in the
4680 // same way that tag soup parsers do. So we cannot shorten
4681 // this by omitting <tbody> or other required elements.
4682 thead: [ 1, "<table>", "</table>" ],
4683 col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4684 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4685 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4686
4687 _default: [ 0, "", "" ]
4688};
4689
4690wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4691wrapMap.th = wrapMap.td;
4692
4693// Support: IE <=9 only
4694if ( !support.option ) {
4695 wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4696}
4697
4698
4699function getAll( context, tag ) {
4700
4701 // Support: IE <=9 - 11 only
4702 // Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
4703 var ret;
4704
4705 if ( typeof context.getElementsByTagName !== "undefined" ) {
4706 ret = context.getElementsByTagName( tag || "*" );
4707
4708 } else if ( typeof context.querySelectorAll !== "undefined" ) {
4709 ret = context.querySelectorAll( tag || "*" );
4710
4711 } else {
4712 ret = [];
4713 }
4714
4715 if ( tag === undefined || tag && nodeName( context, tag ) ) {
4716 return jQuery.merge( [ context ], ret );
4717 }
4718
4719 return ret;
4720}
4721
4722
4723// Mark scripts as having already been evaluated
4724function setGlobalEval( elems, refElements ) {
4725 var i = 0,
4726 l = elems.length;
4727
4728 for ( ; i < l; i++ ) {
4729 dataPriv.set(
4730 elems[ i ],
4731 "globalEval",
4732 !refElements || dataPriv.get( refElements[ i ], "globalEval" )
4733 );
4734 }
4735}
4736
4737
4738var rhtml = /<|&#?\w+;/;
4739
4740function buildFragment( elems, context, scripts, selection, ignored ) {
4741 var elem, tmp, tag, wrap, attached, j,
4742 fragment = context.createDocumentFragment(),
4743 nodes = [],
4744 i = 0,
4745 l = elems.length;
4746
4747 for ( ; i < l; i++ ) {
4748 elem = elems[ i ];
4749
4750 if ( elem || elem === 0 ) {
4751
4752 // Add nodes directly
4753 if ( toType( elem ) === "object" ) {
4754
4755 // Support: Android <=4.0 only, PhantomJS 1 only
4756 // push.apply(_, arraylike) throws on ancient WebKit
4757 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
4758
4759 // Convert non-html into a text node
4760 } else if ( !rhtml.test( elem ) ) {
4761 nodes.push( context.createTextNode( elem ) );
4762
4763 // Convert html into DOM nodes
4764 } else {
4765 tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
4766
4767 // Deserialize a standard representation
4768 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
4769 wrap = wrapMap[ tag ] || wrapMap._default;
4770 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
4771
4772 // Descend through wrappers to the right content
4773 j = wrap[ 0 ];
4774 while ( j-- ) {
4775 tmp = tmp.lastChild;
4776 }
4777
4778 // Support: Android <=4.0 only, PhantomJS 1 only
4779 // push.apply(_, arraylike) throws on ancient WebKit
4780 jQuery.merge( nodes, tmp.childNodes );
4781
4782 // Remember the top-level container
4783 tmp = fragment.firstChild;
4784
4785 // Ensure the created nodes are orphaned (trac-12392)
4786 tmp.textContent = "";
4787 }
4788 }
4789 }
4790
4791 // Remove wrapper from fragment
4792 fragment.textContent = "";
4793
4794 i = 0;
4795 while ( ( elem = nodes[ i++ ] ) ) {
4796
4797 // Skip elements already in the context collection (trac-4087)
4798 if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
4799 if ( ignored ) {
4800 ignored.push( elem );
4801 }
4802 continue;
4803 }
4804
4805 attached = isAttached( elem );
4806
4807 // Append to fragment
4808 tmp = getAll( fragment.appendChild( elem ), "script" );
4809
4810 // Preserve script evaluation history
4811 if ( attached ) {
4812 setGlobalEval( tmp );
4813 }
4814
4815 // Capture executables
4816 if ( scripts ) {
4817 j = 0;
4818 while ( ( elem = tmp[ j++ ] ) ) {
4819 if ( rscriptType.test( elem.type || "" ) ) {
4820 scripts.push( elem );
4821 }
4822 }
4823 }
4824 }
4825
4826 return fragment;
4827}
4828
4829
4830var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4831
4832function returnTrue() {
4833 return true;
4834}
4835
4836function returnFalse() {
4837 return false;
4838}
4839
4840function on( elem, types, selector, data, fn, one ) {
4841 var origFn, type;
4842
4843 // Types can be a map of types/handlers
4844 if ( typeof types === "object" ) {
4845
4846 // ( types-Object, selector, data )
4847 if ( typeof selector !== "string" ) {
4848
4849 // ( types-Object, data )
4850 data = data || selector;
4851 selector = undefined;
4852 }
4853 for ( type in types ) {
4854 on( elem, type, selector, data, types[ type ], one );
4855 }
4856 return elem;
4857 }
4858
4859 if ( data == null && fn == null ) {
4860
4861 // ( types, fn )
4862 fn = selector;
4863 data = selector = undefined;
4864 } else if ( fn == null ) {
4865 if ( typeof selector === "string" ) {
4866
4867 // ( types, selector, fn )
4868 fn = data;
4869 data = undefined;
4870 } else {
4871
4872 // ( types, data, fn )
4873 fn = data;
4874 data = selector;
4875 selector = undefined;
4876 }
4877 }
4878 if ( fn === false ) {
4879 fn = returnFalse;
4880 } else if ( !fn ) {
4881 return elem;
4882 }
4883
4884 if ( one === 1 ) {
4885 origFn = fn;
4886 fn = function( event ) {
4887
4888 // Can use an empty set, since event contains the info
4889 jQuery().off( event );
4890 return origFn.apply( this, arguments );
4891 };
4892
4893 // Use same guid so caller can remove using origFn
4894 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
4895 }
4896 return elem.each( function() {
4897 jQuery.event.add( this, types, fn, data, selector );
4898 } );
4899}
4900
4901/*
4902 * Helper functions for managing events -- not part of the public interface.
4903 * Props to Dean Edwards' addEvent library for many of the ideas.
4904 */
4905jQuery.event = {
4906
4907 global: {},
4908
4909 add: function( elem, types, handler, data, selector ) {
4910
4911 var handleObjIn, eventHandle, tmp,
4912 events, t, handleObj,
4913 special, handlers, type, namespaces, origType,
4914 elemData = dataPriv.get( elem );
4915
4916 // Only attach events to objects that accept data
4917 if ( !acceptData( elem ) ) {
4918 return;
4919 }
4920
4921 // Caller can pass in an object of custom data in lieu of the handler
4922 if ( handler.handler ) {
4923 handleObjIn = handler;
4924 handler = handleObjIn.handler;
4925 selector = handleObjIn.selector;
4926 }
4927
4928 // Ensure that invalid selectors throw exceptions at attach time
4929 // Evaluate against documentElement in case elem is a non-element node (e.g., document)
4930 if ( selector ) {
4931 jQuery.find.matchesSelector( documentElement, selector );
4932 }
4933
4934 // Make sure that the handler has a unique ID, used to find/remove it later
4935 if ( !handler.guid ) {
4936 handler.guid = jQuery.guid++;
4937 }
4938
4939 // Init the element's event structure and main handler, if this is the first
4940 if ( !( events = elemData.events ) ) {
4941 events = elemData.events = Object.create( null );
4942 }
4943 if ( !( eventHandle = elemData.handle ) ) {
4944 eventHandle = elemData.handle = function( e ) {
4945
4946 // Discard the second event of a jQuery.event.trigger() and
4947 // when an event is called after a page has unloaded
4948 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
4949 jQuery.event.dispatch.apply( elem, arguments ) : undefined;
4950 };
4951 }
4952
4953 // Handle multiple events separated by a space
4954 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
4955 t = types.length;
4956 while ( t-- ) {
4957 tmp = rtypenamespace.exec( types[ t ] ) || [];
4958 type = origType = tmp[ 1 ];
4959 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
4960
4961 // There *must* be a type, no attaching namespace-only handlers
4962 if ( !type ) {
4963 continue;
4964 }
4965
4966 // If event changes its type, use the special event handlers for the changed type
4967 special = jQuery.event.special[ type ] || {};
4968
4969 // If selector defined, determine special event api type, otherwise given type
4970 type = ( selector ? special.delegateType : special.bindType ) || type;
4971
4972 // Update special based on newly reset type
4973 special = jQuery.event.special[ type ] || {};
4974
4975 // handleObj is passed to all event handlers
4976 handleObj = jQuery.extend( {
4977 type: type,
4978 origType: origType,
4979 data: data,
4980 handler: handler,
4981 guid: handler.guid,
4982 selector: selector,
4983 needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
4984 namespace: namespaces.join( "." )
4985 }, handleObjIn );
4986
4987 // Init the event handler queue if we're the first
4988 if ( !( handlers = events[ type ] ) ) {
4989 handlers = events[ type ] = [];
4990 handlers.delegateCount = 0;
4991
4992 // Only use addEventListener if the special events handler returns false
4993 if ( !special.setup ||
4994 special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
4995
4996 if ( elem.addEventListener ) {
4997 elem.addEventListener( type, eventHandle );
4998 }
4999 }
5000 }
5001
5002 if ( special.add ) {
5003 special.add.call( elem, handleObj );
5004
5005 if ( !handleObj.handler.guid ) {
5006 handleObj.handler.guid = handler.guid;
5007 }
5008 }
5009
5010 // Add to the element's handler list, delegates in front
5011 if ( selector ) {
5012 handlers.splice( handlers.delegateCount++, 0, handleObj );
5013 } else {
5014 handlers.push( handleObj );
5015 }
5016
5017 // Keep track of which events have ever been used, for event optimization
5018 jQuery.event.global[ type ] = true;
5019 }
5020
5021 },
5022
5023 // Detach an event or set of events from an element
5024 remove: function( elem, types, handler, selector, mappedTypes ) {
5025
5026 var j, origCount, tmp,
5027 events, t, handleObj,
5028 special, handlers, type, namespaces, origType,
5029 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5030
5031 if ( !elemData || !( events = elemData.events ) ) {
5032 return;
5033 }
5034
5035 // Once for each type.namespace in types; type may be omitted
5036 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5037 t = types.length;
5038 while ( t-- ) {
5039 tmp = rtypenamespace.exec( types[ t ] ) || [];
5040 type = origType = tmp[ 1 ];
5041 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5042
5043 // Unbind all events (on this namespace, if provided) for the element
5044 if ( !type ) {
5045 for ( type in events ) {
5046 jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5047 }
5048 continue;
5049 }
5050
5051 special = jQuery.event.special[ type ] || {};
5052 type = ( selector ? special.delegateType : special.bindType ) || type;
5053 handlers = events[ type ] || [];
5054 tmp = tmp[ 2 ] &&
5055 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5056
5057 // Remove matching events
5058 origCount = j = handlers.length;
5059 while ( j-- ) {
5060 handleObj = handlers[ j ];
5061
5062 if ( ( mappedTypes || origType === handleObj.origType ) &&
5063 ( !handler || handler.guid === handleObj.guid ) &&
5064 ( !tmp || tmp.test( handleObj.namespace ) ) &&
5065 ( !selector || selector === handleObj.selector ||
5066 selector === "**" && handleObj.selector ) ) {
5067 handlers.splice( j, 1 );
5068
5069 if ( handleObj.selector ) {
5070 handlers.delegateCount--;
5071 }
5072 if ( special.remove ) {
5073 special.remove.call( elem, handleObj );
5074 }
5075 }
5076 }
5077
5078 // Remove generic event handler if we removed something and no more handlers exist
5079 // (avoids potential for endless recursion during removal of special event handlers)
5080 if ( origCount && !handlers.length ) {
5081 if ( !special.teardown ||
5082 special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5083
5084 jQuery.removeEvent( elem, type, elemData.handle );
5085 }
5086
5087 delete events[ type ];
5088 }
5089 }
5090
5091 // Remove data and the expando if it's no longer used
5092 if ( jQuery.isEmptyObject( events ) ) {
5093 dataPriv.remove( elem, "handle events" );
5094 }
5095 },
5096
5097 dispatch: function( nativeEvent ) {
5098
5099 var i, j, ret, matched, handleObj, handlerQueue,
5100 args = new Array( arguments.length ),
5101
5102 // Make a writable jQuery.Event from the native event object
5103 event = jQuery.event.fix( nativeEvent ),
5104
5105 handlers = (
5106 dataPriv.get( this, "events" ) || Object.create( null )
5107 )[ event.type ] || [],
5108 special = jQuery.event.special[ event.type ] || {};
5109
5110 // Use the fix-ed jQuery.Event rather than the (read-only) native event
5111 args[ 0 ] = event;
5112
5113 for ( i = 1; i < arguments.length; i++ ) {
5114 args[ i ] = arguments[ i ];
5115 }
5116
5117 event.delegateTarget = this;
5118
5119 // Call the preDispatch hook for the mapped type, and let it bail if desired
5120 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5121 return;
5122 }
5123
5124 // Determine handlers
5125 handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5126
5127 // Run delegates first; they may want to stop propagation beneath us
5128 i = 0;
5129 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5130 event.currentTarget = matched.elem;
5131
5132 j = 0;
5133 while ( ( handleObj = matched.handlers[ j++ ] ) &&
5134 !event.isImmediatePropagationStopped() ) {
5135
5136 // If the event is namespaced, then each handler is only invoked if it is
5137 // specially universal or its namespaces are a superset of the event's.
5138 if ( !event.rnamespace || handleObj.namespace === false ||
5139 event.rnamespace.test( handleObj.namespace ) ) {
5140
5141 event.handleObj = handleObj;
5142 event.data = handleObj.data;
5143
5144 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5145 handleObj.handler ).apply( matched.elem, args );
5146
5147 if ( ret !== undefined ) {
5148 if ( ( event.result = ret ) === false ) {
5149 event.preventDefault();
5150 event.stopPropagation();
5151 }
5152 }
5153 }
5154 }
5155 }
5156
5157 // Call the postDispatch hook for the mapped type
5158 if ( special.postDispatch ) {
5159 special.postDispatch.call( this, event );
5160 }
5161
5162 return event.result;
5163 },
5164
5165 handlers: function( event, handlers ) {
5166 var i, handleObj, sel, matchedHandlers, matchedSelectors,
5167 handlerQueue = [],
5168 delegateCount = handlers.delegateCount,
5169 cur = event.target;
5170
5171 // Find delegate handlers
5172 if ( delegateCount &&
5173
5174 // Support: IE <=9
5175 // Black-hole SVG <use> instance trees (trac-13180)
5176 cur.nodeType &&
5177
5178 // Support: Firefox <=42
5179 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5180 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5181 // Support: IE 11 only
5182 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5183 !( event.type === "click" && event.button >= 1 ) ) {
5184
5185 for ( ; cur !== this; cur = cur.parentNode || this ) {
5186
5187 // Don't check non-elements (trac-13208)
5188 // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
5189 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5190 matchedHandlers = [];
5191 matchedSelectors = {};
5192 for ( i = 0; i < delegateCount; i++ ) {
5193 handleObj = handlers[ i ];
5194
5195 // Don't conflict with Object.prototype properties (trac-13203)
5196 sel = handleObj.selector + " ";
5197
5198 if ( matchedSelectors[ sel ] === undefined ) {
5199 matchedSelectors[ sel ] = handleObj.needsContext ?
5200 jQuery( sel, this ).index( cur ) > -1 :
5201 jQuery.find( sel, this, null, [ cur ] ).length;
5202 }
5203 if ( matchedSelectors[ sel ] ) {
5204 matchedHandlers.push( handleObj );
5205 }
5206 }
5207 if ( matchedHandlers.length ) {
5208 handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5209 }
5210 }
5211 }
5212 }
5213
5214 // Add the remaining (directly-bound) handlers
5215 cur = this;
5216 if ( delegateCount < handlers.length ) {
5217 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5218 }
5219
5220 return handlerQueue;
5221 },
5222
5223 addProp: function( name, hook ) {
5224 Object.defineProperty( jQuery.Event.prototype, name, {
5225 enumerable: true,
5226 configurable: true,
5227
5228 get: isFunction( hook ) ?
5229 function() {
5230 if ( this.originalEvent ) {
5231 return hook( this.originalEvent );
5232 }
5233 } :
5234 function() {
5235 if ( this.originalEvent ) {
5236 return this.originalEvent[ name ];
5237 }
5238 },
5239
5240 set: function( value ) {
5241 Object.defineProperty( this, name, {
5242 enumerable: true,
5243 configurable: true,
5244 writable: true,
5245 value: value
5246 } );
5247 }
5248 } );
5249 },
5250
5251 fix: function( originalEvent ) {
5252 return originalEvent[ jQuery.expando ] ?
5253 originalEvent :
5254 new jQuery.Event( originalEvent );
5255 },
5256
5257 special: {
5258 load: {
5259
5260 // Prevent triggered image.load events from bubbling to window.load
5261 noBubble: true
5262 },
5263 click: {
5264
5265 // Utilize native event to ensure correct state for checkable inputs
5266 setup: function( data ) {
5267
5268 // For mutual compressibility with _default, replace `this` access with a local var.
5269 // `|| data` is dead code meant only to preserve the variable through minification.
5270 var el = this || data;
5271
5272 // Claim the first handler
5273 if ( rcheckableType.test( el.type ) &&
5274 el.click && nodeName( el, "input" ) ) {
5275
5276 // dataPriv.set( el, "click", ... )
5277 leverageNative( el, "click", true );
5278 }
5279
5280 // Return false to allow normal processing in the caller
5281 return false;
5282 },
5283 trigger: function( data ) {
5284
5285 // For mutual compressibility with _default, replace `this` access with a local var.
5286 // `|| data` is dead code meant only to preserve the variable through minification.
5287 var el = this || data;
5288
5289 // Force setup before triggering a click
5290 if ( rcheckableType.test( el.type ) &&
5291 el.click && nodeName( el, "input" ) ) {
5292
5293 leverageNative( el, "click" );
5294 }
5295
5296 // Return non-false to allow normal event-path propagation
5297 return true;
5298 },
5299
5300 // For cross-browser consistency, suppress native .click() on links
5301 // Also prevent it if we're currently inside a leveraged native-event stack
5302 _default: function( event ) {
5303 var target = event.target;
5304 return rcheckableType.test( target.type ) &&
5305 target.click && nodeName( target, "input" ) &&
5306 dataPriv.get( target, "click" ) ||
5307 nodeName( target, "a" );
5308 }
5309 },
5310
5311 beforeunload: {
5312 postDispatch: function( event ) {
5313
5314 // Support: Firefox 20+
5315 // Firefox doesn't alert if the returnValue field is not set.
5316 if ( event.result !== undefined && event.originalEvent ) {
5317 event.originalEvent.returnValue = event.result;
5318 }
5319 }
5320 }
5321 }
5322};
5323
5324// Ensure the presence of an event listener that handles manually-triggered
5325// synthetic events by interrupting progress until reinvoked in response to
5326// *native* events that it fires directly, ensuring that state changes have
5327// already occurred before other listeners are invoked.
5328function leverageNative( el, type, isSetup ) {
5329
5330 // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add
5331 if ( !isSetup ) {
5332 if ( dataPriv.get( el, type ) === undefined ) {
5333 jQuery.event.add( el, type, returnTrue );
5334 }
5335 return;
5336 }
5337
5338 // Register the controller as a special universal handler for all event namespaces
5339 dataPriv.set( el, type, false );
5340 jQuery.event.add( el, type, {
5341 namespace: false,
5342 handler: function( event ) {
5343 var result,
5344 saved = dataPriv.get( this, type );
5345
5346 if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5347
5348 // Interrupt processing of the outer synthetic .trigger()ed event
5349 if ( !saved ) {
5350
5351 // Store arguments for use when handling the inner native event
5352 // There will always be at least one argument (an event object), so this array
5353 // will not be confused with a leftover capture object.
5354 saved = slice.call( arguments );
5355 dataPriv.set( this, type, saved );
5356
5357 // Trigger the native event and capture its result
5358 this[ type ]();
5359 result = dataPriv.get( this, type );
5360 dataPriv.set( this, type, false );
5361
5362 if ( saved !== result ) {
5363
5364 // Cancel the outer synthetic event
5365 event.stopImmediatePropagation();
5366 event.preventDefault();
5367
5368 return result;
5369 }
5370
5371 // If this is an inner synthetic event for an event with a bubbling surrogate
5372 // (focus or blur), assume that the surrogate already propagated from triggering
5373 // the native event and prevent that from happening again here.
5374 // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5375 // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5376 // less bad than duplication.
5377 } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5378 event.stopPropagation();
5379 }
5380
5381 // If this is a native event triggered above, everything is now in order
5382 // Fire an inner synthetic event with the original arguments
5383 } else if ( saved ) {
5384
5385 // ...and capture the result
5386 dataPriv.set( this, type, jQuery.event.trigger(
5387 saved[ 0 ],
5388 saved.slice( 1 ),
5389 this
5390 ) );
5391
5392 // Abort handling of the native event by all jQuery handlers while allowing
5393 // native handlers on the same element to run. On target, this is achieved
5394 // by stopping immediate propagation just on the jQuery event. However,
5395 // the native event is re-wrapped by a jQuery one on each level of the
5396 // propagation so the only way to stop it for jQuery is to stop it for
5397 // everyone via native `stopPropagation()`. This is not a problem for
5398 // focus/blur which don't bubble, but it does also stop click on checkboxes
5399 // and radios. We accept this limitation.
5400 event.stopPropagation();
5401 event.isImmediatePropagationStopped = returnTrue;
5402 }
5403 }
5404 } );
5405}
5406
5407jQuery.removeEvent = function( elem, type, handle ) {
5408
5409 // This "if" is needed for plain objects
5410 if ( elem.removeEventListener ) {
5411 elem.removeEventListener( type, handle );
5412 }
5413};
5414
5415jQuery.Event = function( src, props ) {
5416
5417 // Allow instantiation without the 'new' keyword
5418 if ( !( this instanceof jQuery.Event ) ) {
5419 return new jQuery.Event( src, props );
5420 }
5421
5422 // Event object
5423 if ( src && src.type ) {
5424 this.originalEvent = src;
5425 this.type = src.type;
5426
5427 // Events bubbling up the document may have been marked as prevented
5428 // by a handler lower down the tree; reflect the correct value.
5429 this.isDefaultPrevented = src.defaultPrevented ||
5430 src.defaultPrevented === undefined &&
5431
5432 // Support: Android <=2.3 only
5433 src.returnValue === false ?
5434 returnTrue :
5435 returnFalse;
5436
5437 // Create target properties
5438 // Support: Safari <=6 - 7 only
5439 // Target should not be a text node (trac-504, trac-13143)
5440 this.target = ( src.target && src.target.nodeType === 3 ) ?
5441 src.target.parentNode :
5442 src.target;
5443
5444 this.currentTarget = src.currentTarget;
5445 this.relatedTarget = src.relatedTarget;
5446
5447 // Event type
5448 } else {
5449 this.type = src;
5450 }
5451
5452 // Put explicitly provided properties onto the event object
5453 if ( props ) {
5454 jQuery.extend( this, props );
5455 }
5456
5457 // Create a timestamp if incoming event doesn't have one
5458 this.timeStamp = src && src.timeStamp || Date.now();
5459
5460 // Mark it as fixed
5461 this[ jQuery.expando ] = true;
5462};
5463
5464// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5465// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5466jQuery.Event.prototype = {
5467 constructor: jQuery.Event,
5468 isDefaultPrevented: returnFalse,
5469 isPropagationStopped: returnFalse,
5470 isImmediatePropagationStopped: returnFalse,
5471 isSimulated: false,
5472
5473 preventDefault: function() {
5474 var e = this.originalEvent;
5475
5476 this.isDefaultPrevented = returnTrue;
5477
5478 if ( e && !this.isSimulated ) {
5479 e.preventDefault();
5480 }
5481 },
5482 stopPropagation: function() {
5483 var e = this.originalEvent;
5484
5485 this.isPropagationStopped = returnTrue;
5486
5487 if ( e && !this.isSimulated ) {
5488 e.stopPropagation();
5489 }
5490 },
5491 stopImmediatePropagation: function() {
5492 var e = this.originalEvent;
5493
5494 this.isImmediatePropagationStopped = returnTrue;
5495
5496 if ( e && !this.isSimulated ) {
5497 e.stopImmediatePropagation();
5498 }
5499
5500 this.stopPropagation();
5501 }
5502};
5503
5504// Includes all common event props including KeyEvent and MouseEvent specific props
5505jQuery.each( {
5506 altKey: true,
5507 bubbles: true,
5508 cancelable: true,
5509 changedTouches: true,
5510 ctrlKey: true,
5511 detail: true,
5512 eventPhase: true,
5513 metaKey: true,
5514 pageX: true,
5515 pageY: true,
5516 shiftKey: true,
5517 view: true,
5518 "char": true,
5519 code: true,
5520 charCode: true,
5521 key: true,
5522 keyCode: true,
5523 button: true,
5524 buttons: true,
5525 clientX: true,
5526 clientY: true,
5527 offsetX: true,
5528 offsetY: true,
5529 pointerId: true,
5530 pointerType: true,
5531 screenX: true,
5532 screenY: true,
5533 targetTouches: true,
5534 toElement: true,
5535 touches: true,
5536 which: true
5537}, jQuery.event.addProp );
5538
5539jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5540
5541 function focusMappedHandler( nativeEvent ) {
5542 if ( document.documentMode ) {
5543
5544 // Support: IE 11+
5545 // Attach a single focusin/focusout handler on the document while someone wants
5546 // focus/blur. This is because the former are synchronous in IE while the latter
5547 // are async. In other browsers, all those handlers are invoked synchronously.
5548
5549 // `handle` from private data would already wrap the event, but we need
5550 // to change the `type` here.
5551 var handle = dataPriv.get( this, "handle" ),
5552 event = jQuery.event.fix( nativeEvent );
5553 event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
5554 event.isSimulated = true;
5555
5556 // First, handle focusin/focusout
5557 handle( nativeEvent );
5558
5559 // ...then, handle focus/blur
5560 //
5561 // focus/blur don't bubble while focusin/focusout do; simulate the former by only
5562 // invoking the handler at the lower level.
5563 if ( event.target === event.currentTarget ) {
5564
5565 // The setup part calls `leverageNative`, which, in turn, calls
5566 // `jQuery.event.add`, so event handle will already have been set
5567 // by this point.
5568 handle( event );
5569 }
5570 } else {
5571
5572 // For non-IE browsers, attach a single capturing handler on the document
5573 // while someone wants focusin/focusout.
5574 jQuery.event.simulate( delegateType, nativeEvent.target,
5575 jQuery.event.fix( nativeEvent ) );
5576 }
5577 }
5578
5579 jQuery.event.special[ type ] = {
5580
5581 // Utilize native event if possible so blur/focus sequence is correct
5582 setup: function() {
5583
5584 var attaches;
5585
5586 // Claim the first handler
5587 // dataPriv.set( this, "focus", ... )
5588 // dataPriv.set( this, "blur", ... )
5589 leverageNative( this, type, true );
5590
5591 if ( document.documentMode ) {
5592
5593 // Support: IE 9 - 11+
5594 // We use the same native handler for focusin & focus (and focusout & blur)
5595 // so we need to coordinate setup & teardown parts between those events.
5596 // Use `delegateType` as the key as `type` is already used by `leverageNative`.
5597 attaches = dataPriv.get( this, delegateType );
5598 if ( !attaches ) {
5599 this.addEventListener( delegateType, focusMappedHandler );
5600 }
5601 dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );
5602 } else {
5603
5604 // Return false to allow normal processing in the caller
5605 return false;
5606 }
5607 },
5608 trigger: function() {
5609
5610 // Force setup before trigger
5611 leverageNative( this, type );
5612
5613 // Return non-false to allow normal event-path propagation
5614 return true;
5615 },
5616
5617 teardown: function() {
5618 var attaches;
5619
5620 if ( document.documentMode ) {
5621 attaches = dataPriv.get( this, delegateType ) - 1;
5622 if ( !attaches ) {
5623 this.removeEventListener( delegateType, focusMappedHandler );
5624 dataPriv.remove( this, delegateType );
5625 } else {
5626 dataPriv.set( this, delegateType, attaches );
5627 }
5628 } else {
5629
5630 // Return false to indicate standard teardown should be applied
5631 return false;
5632 }
5633 },
5634
5635 // Suppress native focus or blur if we're currently inside
5636 // a leveraged native-event stack
5637 _default: function( event ) {
5638 return dataPriv.get( event.target, type );
5639 },
5640
5641 delegateType: delegateType
5642 };
5643
5644 // Support: Firefox <=44
5645 // Firefox doesn't have focus(in | out) events
5646 // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
5647 //
5648 // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
5649 // focus(in | out) events fire after focus & blur events,
5650 // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
5651 // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
5652 //
5653 // Support: IE 9 - 11+
5654 // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,
5655 // attach a single handler for both events in IE.
5656 jQuery.event.special[ delegateType ] = {
5657 setup: function() {
5658
5659 // Handle: regular nodes (via `this.ownerDocument`), window
5660 // (via `this.document`) & document (via `this`).
5661 var doc = this.ownerDocument || this.document || this,
5662 dataHolder = document.documentMode ? this : doc,
5663 attaches = dataPriv.get( dataHolder, delegateType );
5664
5665 // Support: IE 9 - 11+
5666 // We use the same native handler for focusin & focus (and focusout & blur)
5667 // so we need to coordinate setup & teardown parts between those events.
5668 // Use `delegateType` as the key as `type` is already used by `leverageNative`.
5669 if ( !attaches ) {
5670 if ( document.documentMode ) {
5671 this.addEventListener( delegateType, focusMappedHandler );
5672 } else {
5673 doc.addEventListener( type, focusMappedHandler, true );
5674 }
5675 }
5676 dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );
5677 },
5678 teardown: function() {
5679 var doc = this.ownerDocument || this.document || this,
5680 dataHolder = document.documentMode ? this : doc,
5681 attaches = dataPriv.get( dataHolder, delegateType ) - 1;
5682
5683 if ( !attaches ) {
5684 if ( document.documentMode ) {
5685 this.removeEventListener( delegateType, focusMappedHandler );
5686 } else {
5687 doc.removeEventListener( type, focusMappedHandler, true );
5688 }
5689 dataPriv.remove( dataHolder, delegateType );
5690 } else {
5691 dataPriv.set( dataHolder, delegateType, attaches );
5692 }
5693 }
5694 };
5695} );
5696
5697// Create mouseenter/leave events using mouseover/out and event-time checks
5698// so that event delegation works in jQuery.
5699// Do the same for pointerenter/pointerleave and pointerover/pointerout
5700//
5701// Support: Safari 7 only
5702// Safari sends mouseenter too often; see:
5703// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5704// for the description of the bug (it existed in older Chrome versions as well).
5705jQuery.each( {
5706 mouseenter: "mouseover",
5707 mouseleave: "mouseout",
5708 pointerenter: "pointerover",
5709 pointerleave: "pointerout"
5710}, function( orig, fix ) {
5711 jQuery.event.special[ orig ] = {
5712 delegateType: fix,
5713 bindType: fix,
5714
5715 handle: function( event ) {
5716 var ret,
5717 target = this,
5718 related = event.relatedTarget,
5719 handleObj = event.handleObj;
5720
5721 // For mouseenter/leave call the handler if related is outside the target.
5722 // NB: No relatedTarget if the mouse left/entered the browser window
5723 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5724 event.type = handleObj.origType;
5725 ret = handleObj.handler.apply( this, arguments );
5726 event.type = fix;
5727 }
5728 return ret;
5729 }
5730 };
5731} );
5732
5733jQuery.fn.extend( {
5734
5735 on: function( types, selector, data, fn ) {
5736 return on( this, types, selector, data, fn );
5737 },
5738 one: function( types, selector, data, fn ) {
5739 return on( this, types, selector, data, fn, 1 );
5740 },
5741 off: function( types, selector, fn ) {
5742 var handleObj, type;
5743 if ( types && types.preventDefault && types.handleObj ) {
5744
5745 // ( event ) dispatched jQuery.Event
5746 handleObj = types.handleObj;
5747 jQuery( types.delegateTarget ).off(
5748 handleObj.namespace ?
5749 handleObj.origType + "." + handleObj.namespace :
5750 handleObj.origType,
5751 handleObj.selector,
5752 handleObj.handler
5753 );
5754 return this;
5755 }
5756 if ( typeof types === "object" ) {
5757
5758 // ( types-object [, selector] )
5759 for ( type in types ) {
5760 this.off( type, selector, types[ type ] );
5761 }
5762 return this;
5763 }
5764 if ( selector === false || typeof selector === "function" ) {
5765
5766 // ( types [, fn] )
5767 fn = selector;
5768 selector = undefined;
5769 }
5770 if ( fn === false ) {
5771 fn = returnFalse;
5772 }
5773 return this.each( function() {
5774 jQuery.event.remove( this, types, fn, selector );
5775 } );
5776 }
5777} );
5778
5779
5780var
5781
5782 // Support: IE <=10 - 11, Edge 12 - 13 only
5783 // In IE/Edge using regex groups here causes severe slowdowns.
5784 // See https://connect.microsoft.com/IE/feedback/details/1736512/
5785 rnoInnerhtml = /<script|<style|<link/i,
5786
5787 // checked="checked" or checked
5788 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5789
5790 rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
5791
5792// Prefer a tbody over its parent table for containing new rows
5793function manipulationTarget( elem, content ) {
5794 if ( nodeName( elem, "table" ) &&
5795 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5796
5797 return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5798 }
5799
5800 return elem;
5801}
5802
5803// Replace/restore the type attribute of script elements for safe DOM manipulation
5804function disableScript( elem ) {
5805 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5806 return elem;
5807}
5808function restoreScript( elem ) {
5809 if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5810 elem.type = elem.type.slice( 5 );
5811 } else {
5812 elem.removeAttribute( "type" );
5813 }
5814
5815 return elem;
5816}
5817
5818function cloneCopyEvent( src, dest ) {
5819 var i, l, type, pdataOld, udataOld, udataCur, events;
5820
5821 if ( dest.nodeType !== 1 ) {
5822 return;
5823 }
5824
5825 // 1. Copy private data: events, handlers, etc.
5826 if ( dataPriv.hasData( src ) ) {
5827 pdataOld = dataPriv.get( src );
5828 events = pdataOld.events;
5829
5830 if ( events ) {
5831 dataPriv.remove( dest, "handle events" );
5832
5833 for ( type in events ) {
5834 for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5835 jQuery.event.add( dest, type, events[ type ][ i ] );
5836 }
5837 }
5838 }
5839 }
5840
5841 // 2. Copy user data
5842 if ( dataUser.hasData( src ) ) {
5843 udataOld = dataUser.access( src );
5844 udataCur = jQuery.extend( {}, udataOld );
5845
5846 dataUser.set( dest, udataCur );
5847 }
5848}
5849
5850// Fix IE bugs, see support tests
5851function fixInput( src, dest ) {
5852 var nodeName = dest.nodeName.toLowerCase();
5853
5854 // Fails to persist the checked state of a cloned checkbox or radio button.
5855 if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5856 dest.checked = src.checked;
5857
5858 // Fails to return the selected option to the default selected state when cloning options
5859 } else if ( nodeName === "input" || nodeName === "textarea" ) {
5860 dest.defaultValue = src.defaultValue;
5861 }
5862}
5863
5864function domManip( collection, args, callback, ignored ) {
5865
5866 // Flatten any nested arrays
5867 args = flat( args );
5868
5869 var fragment, first, scripts, hasScripts, node, doc,
5870 i = 0,
5871 l = collection.length,
5872 iNoClone = l - 1,
5873 value = args[ 0 ],
5874 valueIsFunction = isFunction( value );
5875
5876 // We can't cloneNode fragments that contain checked, in WebKit
5877 if ( valueIsFunction ||
5878 ( l > 1 && typeof value === "string" &&
5879 !support.checkClone && rchecked.test( value ) ) ) {
5880 return collection.each( function( index ) {
5881 var self = collection.eq( index );
5882 if ( valueIsFunction ) {
5883 args[ 0 ] = value.call( this, index, self.html() );
5884 }
5885 domManip( self, args, callback, ignored );
5886 } );
5887 }
5888
5889 if ( l ) {
5890 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
5891 first = fragment.firstChild;
5892
5893 if ( fragment.childNodes.length === 1 ) {
5894 fragment = first;
5895 }
5896
5897 // Require either new content or an interest in ignored elements to invoke the callback
5898 if ( first || ignored ) {
5899 scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5900 hasScripts = scripts.length;
5901
5902 // Use the original fragment for the last item
5903 // instead of the first because it can end up
5904 // being emptied incorrectly in certain situations (trac-8070).
5905 for ( ; i < l; i++ ) {
5906 node = fragment;
5907
5908 if ( i !== iNoClone ) {
5909 node = jQuery.clone( node, true, true );
5910
5911 // Keep references to cloned scripts for later restoration
5912 if ( hasScripts ) {
5913
5914 // Support: Android <=4.0 only, PhantomJS 1 only
5915 // push.apply(_, arraylike) throws on ancient WebKit
5916 jQuery.merge( scripts, getAll( node, "script" ) );
5917 }
5918 }
5919
5920 callback.call( collection[ i ], node, i );
5921 }
5922
5923 if ( hasScripts ) {
5924 doc = scripts[ scripts.length - 1 ].ownerDocument;
5925
5926 // Re-enable scripts
5927 jQuery.map( scripts, restoreScript );
5928
5929 // Evaluate executable scripts on first document insertion
5930 for ( i = 0; i < hasScripts; i++ ) {
5931 node = scripts[ i ];
5932 if ( rscriptType.test( node.type || "" ) &&
5933 !dataPriv.access( node, "globalEval" ) &&
5934 jQuery.contains( doc, node ) ) {
5935
5936 if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
5937
5938 // Optional AJAX dependency, but won't run scripts if not present
5939 if ( jQuery._evalUrl && !node.noModule ) {
5940 jQuery._evalUrl( node.src, {
5941 nonce: node.nonce || node.getAttribute( "nonce" )
5942 }, doc );
5943 }
5944 } else {
5945
5946 // Unwrap a CDATA section containing script contents. This shouldn't be
5947 // needed as in XML documents they're already not visible when
5948 // inspecting element contents and in HTML documents they have no
5949 // meaning but we're preserving that logic for backwards compatibility.
5950 // This will be removed completely in 4.0. See gh-4904.
5951 DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
5952 }
5953 }
5954 }
5955 }
5956 }
5957 }
5958
5959 return collection;
5960}
5961
5962function remove( elem, selector, keepData ) {
5963 var node,
5964 nodes = selector ? jQuery.filter( selector, elem ) : elem,
5965 i = 0;
5966
5967 for ( ; ( node = nodes[ i ] ) != null; i++ ) {
5968 if ( !keepData && node.nodeType === 1 ) {
5969 jQuery.cleanData( getAll( node ) );
5970 }
5971
5972 if ( node.parentNode ) {
5973 if ( keepData && isAttached( node ) ) {
5974 setGlobalEval( getAll( node, "script" ) );
5975 }
5976 node.parentNode.removeChild( node );
5977 }
5978 }
5979
5980 return elem;
5981}
5982
5983jQuery.extend( {
5984 htmlPrefilter: function( html ) {
5985 return html;
5986 },
5987
5988 clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5989 var i, l, srcElements, destElements,
5990 clone = elem.cloneNode( true ),
5991 inPage = isAttached( elem );
5992
5993 // Fix IE cloning issues
5994 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
5995 !jQuery.isXMLDoc( elem ) ) {
5996
5997 // We eschew jQuery#find here for performance reasons:
5998 // https://jsperf.com/getall-vs-sizzle/2
5999 destElements = getAll( clone );
6000 srcElements = getAll( elem );
6001
6002 for ( i = 0, l = srcElements.length; i < l; i++ ) {
6003 fixInput( srcElements[ i ], destElements[ i ] );
6004 }
6005 }
6006
6007 // Copy the events from the original to the clone
6008 if ( dataAndEvents ) {
6009 if ( deepDataAndEvents ) {
6010 srcElements = srcElements || getAll( elem );
6011 destElements = destElements || getAll( clone );
6012
6013 for ( i = 0, l = srcElements.length; i < l; i++ ) {
6014 cloneCopyEvent( srcElements[ i ], destElements[ i ] );
6015 }
6016 } else {
6017 cloneCopyEvent( elem, clone );
6018 }
6019 }
6020
6021 // Preserve script evaluation history
6022 destElements = getAll( clone, "script" );
6023 if ( destElements.length > 0 ) {
6024 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6025 }
6026
6027 // Return the cloned set
6028 return clone;
6029 },
6030
6031 cleanData: function( elems ) {
6032 var data, elem, type,
6033 special = jQuery.event.special,
6034 i = 0;
6035
6036 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
6037 if ( acceptData( elem ) ) {
6038 if ( ( data = elem[ dataPriv.expando ] ) ) {
6039 if ( data.events ) {
6040 for ( type in data.events ) {
6041 if ( special[ type ] ) {
6042 jQuery.event.remove( elem, type );
6043
6044 // This is a shortcut to avoid jQuery.event.remove's overhead
6045 } else {
6046 jQuery.removeEvent( elem, type, data.handle );
6047 }
6048 }
6049 }
6050
6051 // Support: Chrome <=35 - 45+
6052 // Assign undefined instead of using delete, see Data#remove
6053 elem[ dataPriv.expando ] = undefined;
6054 }
6055 if ( elem[ dataUser.expando ] ) {
6056
6057 // Support: Chrome <=35 - 45+
6058 // Assign undefined instead of using delete, see Data#remove
6059 elem[ dataUser.expando ] = undefined;
6060 }
6061 }
6062 }
6063 }
6064} );
6065
6066jQuery.fn.extend( {
6067 detach: function( selector ) {
6068 return remove( this, selector, true );
6069 },
6070
6071 remove: function( selector ) {
6072 return remove( this, selector );
6073 },
6074
6075 text: function( value ) {
6076 return access( this, function( value ) {
6077 return value === undefined ?
6078 jQuery.text( this ) :
6079 this.empty().each( function() {
6080 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6081 this.textContent = value;
6082 }
6083 } );
6084 }, null, value, arguments.length );
6085 },
6086
6087 append: function() {
6088 return domManip( this, arguments, function( elem ) {
6089 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6090 var target = manipulationTarget( this, elem );
6091 target.appendChild( elem );
6092 }
6093 } );
6094 },
6095
6096 prepend: function() {
6097 return domManip( this, arguments, function( elem ) {
6098 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6099 var target = manipulationTarget( this, elem );
6100 target.insertBefore( elem, target.firstChild );
6101 }
6102 } );
6103 },
6104
6105 before: function() {
6106 return domManip( this, arguments, function( elem ) {
6107 if ( this.parentNode ) {
6108 this.parentNode.insertBefore( elem, this );
6109 }
6110 } );
6111 },
6112
6113 after: function() {
6114 return domManip( this, arguments, function( elem ) {
6115 if ( this.parentNode ) {
6116 this.parentNode.insertBefore( elem, this.nextSibling );
6117 }
6118 } );
6119 },
6120
6121 empty: function() {
6122 var elem,
6123 i = 0;
6124
6125 for ( ; ( elem = this[ i ] ) != null; i++ ) {
6126 if ( elem.nodeType === 1 ) {
6127
6128 // Prevent memory leaks
6129 jQuery.cleanData( getAll( elem, false ) );
6130
6131 // Remove any remaining nodes
6132 elem.textContent = "";
6133 }
6134 }
6135
6136 return this;
6137 },
6138
6139 clone: function( dataAndEvents, deepDataAndEvents ) {
6140 dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6141 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6142
6143 return this.map( function() {
6144 return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6145 } );
6146 },
6147
6148 html: function( value ) {
6149 return access( this, function( value ) {
6150 var elem = this[ 0 ] || {},
6151 i = 0,
6152 l = this.length;
6153
6154 if ( value === undefined && elem.nodeType === 1 ) {
6155 return elem.innerHTML;
6156 }
6157
6158 // See if we can take a shortcut and just use innerHTML
6159 if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6160 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6161
6162 value = jQuery.htmlPrefilter( value );
6163
6164 try {
6165 for ( ; i < l; i++ ) {
6166 elem = this[ i ] || {};
6167
6168 // Remove element nodes and prevent memory leaks
6169 if ( elem.nodeType === 1 ) {
6170 jQuery.cleanData( getAll( elem, false ) );
6171 elem.innerHTML = value;
6172 }
6173 }
6174
6175 elem = 0;
6176
6177 // If using innerHTML throws an exception, use the fallback method
6178 } catch ( e ) {}
6179 }
6180
6181 if ( elem ) {
6182 this.empty().append( value );
6183 }
6184 }, null, value, arguments.length );
6185 },
6186
6187 replaceWith: function() {
6188 var ignored = [];
6189
6190 // Make the changes, replacing each non-ignored context element with the new content
6191 return domManip( this, arguments, function( elem ) {
6192 var parent = this.parentNode;
6193
6194 if ( jQuery.inArray( this, ignored ) < 0 ) {
6195 jQuery.cleanData( getAll( this ) );
6196 if ( parent ) {
6197 parent.replaceChild( elem, this );
6198 }
6199 }
6200
6201 // Force callback invocation
6202 }, ignored );
6203 }
6204} );
6205
6206jQuery.each( {
6207 appendTo: "append",
6208 prependTo: "prepend",
6209 insertBefore: "before",
6210 insertAfter: "after",
6211 replaceAll: "replaceWith"
6212}, function( name, original ) {
6213 jQuery.fn[ name ] = function( selector ) {
6214 var elems,
6215 ret = [],
6216 insert = jQuery( selector ),
6217 last = insert.length - 1,
6218 i = 0;
6219
6220 for ( ; i <= last; i++ ) {
6221 elems = i === last ? this : this.clone( true );
6222 jQuery( insert[ i ] )[ original ]( elems );
6223
6224 // Support: Android <=4.0 only, PhantomJS 1 only
6225 // .get() because push.apply(_, arraylike) throws on ancient WebKit
6226 push.apply( ret, elems.get() );
6227 }
6228
6229 return this.pushStack( ret );
6230 };
6231} );
6232var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6233
6234var rcustomProp = /^--/;
6235
6236
6237var getStyles = function( elem ) {
6238
6239 // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
6240 // IE throws on elements created in popups
6241 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6242 var view = elem.ownerDocument.defaultView;
6243
6244 if ( !view || !view.opener ) {
6245 view = window;
6246 }
6247
6248 return view.getComputedStyle( elem );
6249 };
6250
6251var swap = function( elem, options, callback ) {
6252 var ret, name,
6253 old = {};
6254
6255 // Remember the old values, and insert the new ones
6256 for ( name in options ) {
6257 old[ name ] = elem.style[ name ];
6258 elem.style[ name ] = options[ name ];
6259 }
6260
6261 ret = callback.call( elem );
6262
6263 // Revert the old values
6264 for ( name in options ) {
6265 elem.style[ name ] = old[ name ];
6266 }
6267
6268 return ret;
6269};
6270
6271
6272var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6273
6274
6275
6276( function() {
6277
6278 // Executing both pixelPosition & boxSizingReliable tests require only one layout
6279 // so they're executed at the same time to save the second computation.
6280 function computeStyleTests() {
6281
6282 // This is a singleton, we need to execute it only once
6283 if ( !div ) {
6284 return;
6285 }
6286
6287 container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6288 "margin-top:1px;padding:0;border:0";
6289 div.style.cssText =
6290 "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6291 "margin:auto;border:1px;padding:1px;" +
6292 "width:60%;top:1%";
6293 documentElement.appendChild( container ).appendChild( div );
6294
6295 var divStyle = window.getComputedStyle( div );
6296 pixelPositionVal = divStyle.top !== "1%";
6297
6298 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6299 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6300
6301 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6302 // Some styles come back with percentage values, even though they shouldn't
6303 div.style.right = "60%";
6304 pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6305
6306 // Support: IE 9 - 11 only
6307 // Detect misreporting of content dimensions for box-sizing:border-box elements
6308 boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6309
6310 // Support: IE 9 only
6311 // Detect overflow:scroll screwiness (gh-3699)
6312 // Support: Chrome <=64
6313 // Don't get tricked when zoom affects offsetWidth (gh-4029)
6314 div.style.position = "absolute";
6315 scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6316
6317 documentElement.removeChild( container );
6318
6319 // Nullify the div so it wouldn't be stored in the memory and
6320 // it will also be a sign that checks already performed
6321 div = null;
6322 }
6323
6324 function roundPixelMeasures( measure ) {
6325 return Math.round( parseFloat( measure ) );
6326 }
6327
6328 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6329 reliableTrDimensionsVal, reliableMarginLeftVal,
6330 container = document.createElement( "div" ),
6331 div = document.createElement( "div" );
6332
6333 // Finish early in limited (non-browser) environments
6334 if ( !div.style ) {
6335 return;
6336 }
6337
6338 // Support: IE <=9 - 11 only
6339 // Style of cloned element affects source element cloned (trac-8908)
6340 div.style.backgroundClip = "content-box";
6341 div.cloneNode( true ).style.backgroundClip = "";
6342 support.clearCloneStyle = div.style.backgroundClip === "content-box";
6343
6344 jQuery.extend( support, {
6345 boxSizingReliable: function() {
6346 computeStyleTests();
6347 return boxSizingReliableVal;
6348 },
6349 pixelBoxStyles: function() {
6350 computeStyleTests();
6351 return pixelBoxStylesVal;
6352 },
6353 pixelPosition: function() {
6354 computeStyleTests();
6355 return pixelPositionVal;
6356 },
6357 reliableMarginLeft: function() {
6358 computeStyleTests();
6359 return reliableMarginLeftVal;
6360 },
6361 scrollboxSize: function() {
6362 computeStyleTests();
6363 return scrollboxSizeVal;
6364 },
6365
6366 // Support: IE 9 - 11+, Edge 15 - 18+
6367 // IE/Edge misreport `getComputedStyle` of table rows with width/height
6368 // set in CSS while `offset*` properties report correct values.
6369 // Behavior in IE 9 is more subtle than in newer versions & it passes
6370 // some versions of this test; make sure not to make it pass there!
6371 //
6372 // Support: Firefox 70+
6373 // Only Firefox includes border widths
6374 // in computed dimensions. (gh-4529)
6375 reliableTrDimensions: function() {
6376 var table, tr, trChild, trStyle;
6377 if ( reliableTrDimensionsVal == null ) {
6378 table = document.createElement( "table" );
6379 tr = document.createElement( "tr" );
6380 trChild = document.createElement( "div" );
6381
6382 table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
6383 tr.style.cssText = "box-sizing:content-box;border:1px solid";
6384
6385 // Support: Chrome 86+
6386 // Height set through cssText does not get applied.
6387 // Computed height then comes back as 0.
6388 tr.style.height = "1px";
6389 trChild.style.height = "9px";
6390
6391 // Support: Android 8 Chrome 86+
6392 // In our bodyBackground.html iframe,
6393 // display for all div elements is set to "inline",
6394 // which causes a problem only in Android 8 Chrome 86.
6395 // Ensuring the div is `display: block`
6396 // gets around this issue.
6397 trChild.style.display = "block";
6398
6399 documentElement
6400 .appendChild( table )
6401 .appendChild( tr )
6402 .appendChild( trChild );
6403
6404 trStyle = window.getComputedStyle( tr );
6405 reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
6406 parseInt( trStyle.borderTopWidth, 10 ) +
6407 parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
6408
6409 documentElement.removeChild( table );
6410 }
6411 return reliableTrDimensionsVal;
6412 }
6413 } );
6414} )();
6415
6416
6417function curCSS( elem, name, computed ) {
6418 var width, minWidth, maxWidth, ret,
6419 isCustomProp = rcustomProp.test( name ),
6420
6421 // Support: Firefox 51+
6422 // Retrieving style before computed somehow
6423 // fixes an issue with getting wrong values
6424 // on detached elements
6425 style = elem.style;
6426
6427 computed = computed || getStyles( elem );
6428
6429 // getPropertyValue is needed for:
6430 // .css('filter') (IE 9 only, trac-12537)
6431 // .css('--customProperty) (gh-3144)
6432 if ( computed ) {
6433
6434 // Support: IE <=9 - 11+
6435 // IE only supports `"float"` in `getPropertyValue`; in computed styles
6436 // it's only available as `"cssFloat"`. We no longer modify properties
6437 // sent to `.css()` apart from camelCasing, so we need to check both.
6438 // Normally, this would create difference in behavior: if
6439 // `getPropertyValue` returns an empty string, the value returned
6440 // by `.css()` would be `undefined`. This is usually the case for
6441 // disconnected elements. However, in IE even disconnected elements
6442 // with no styles return `"none"` for `getPropertyValue( "float" )`
6443 ret = computed.getPropertyValue( name ) || computed[ name ];
6444
6445 if ( isCustomProp && ret ) {
6446
6447 // Support: Firefox 105+, Chrome <=105+
6448 // Spec requires trimming whitespace for custom properties (gh-4926).
6449 // Firefox only trims leading whitespace. Chrome just collapses
6450 // both leading & trailing whitespace to a single space.
6451 //
6452 // Fall back to `undefined` if empty string returned.
6453 // This collapses a missing definition with property defined
6454 // and set to an empty string but there's no standard API
6455 // allowing us to differentiate them without a performance penalty
6456 // and returning `undefined` aligns with older jQuery.
6457 //
6458 // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED
6459 // as whitespace while CSS does not, but this is not a problem
6460 // because CSS preprocessing replaces them with U+000A LINE FEED
6461 // (which *is* CSS whitespace)
6462 // https://www.w3.org/TR/css-syntax-3/#input-preprocessing
6463 ret = ret.replace( rtrimCSS, "$1" ) || undefined;
6464 }
6465
6466 if ( ret === "" && !isAttached( elem ) ) {
6467 ret = jQuery.style( elem, name );
6468 }
6469
6470 // A tribute to the "awesome hack by Dean Edwards"
6471 // Android Browser returns percentage for some values,
6472 // but width seems to be reliably pixels.
6473 // This is against the CSSOM draft spec:
6474 // https://drafts.csswg.org/cssom/#resolved-values
6475 if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6476
6477 // Remember the original values
6478 width = style.width;
6479 minWidth = style.minWidth;
6480 maxWidth = style.maxWidth;
6481
6482 // Put in the new values to get a computed value out
6483 style.minWidth = style.maxWidth = style.width = ret;
6484 ret = computed.width;
6485
6486 // Revert the changed values
6487 style.width = width;
6488 style.minWidth = minWidth;
6489 style.maxWidth = maxWidth;
6490 }
6491 }
6492
6493 return ret !== undefined ?
6494
6495 // Support: IE <=9 - 11 only
6496 // IE returns zIndex value as an integer.
6497 ret + "" :
6498 ret;
6499}
6500
6501
6502function addGetHookIf( conditionFn, hookFn ) {
6503
6504 // Define the hook, we'll check on the first run if it's really needed.
6505 return {
6506 get: function() {
6507 if ( conditionFn() ) {
6508
6509 // Hook not needed (or it's not possible to use it due
6510 // to missing dependency), remove it.
6511 delete this.get;
6512 return;
6513 }
6514
6515 // Hook needed; redefine it so that the support test is not executed again.
6516 return ( this.get = hookFn ).apply( this, arguments );
6517 }
6518 };
6519}
6520
6521
6522var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6523 emptyStyle = document.createElement( "div" ).style,
6524 vendorProps = {};
6525
6526// Return a vendor-prefixed property or undefined
6527function vendorPropName( name ) {
6528
6529 // Check for vendor prefixed names
6530 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6531 i = cssPrefixes.length;
6532
6533 while ( i-- ) {
6534 name = cssPrefixes[ i ] + capName;
6535 if ( name in emptyStyle ) {
6536 return name;
6537 }
6538 }
6539}
6540
6541// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6542function finalPropName( name ) {
6543 var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6544
6545 if ( final ) {
6546 return final;
6547 }
6548 if ( name in emptyStyle ) {
6549 return name;
6550 }
6551 return vendorProps[ name ] = vendorPropName( name ) || name;
6552}
6553
6554
6555var
6556
6557 // Swappable if display is none or starts with table
6558 // except "table", "table-cell", or "table-caption"
6559 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6560 rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6561 cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6562 cssNormalTransform = {
6563 letterSpacing: "0",
6564 fontWeight: "400"
6565 };
6566
6567function setPositiveNumber( _elem, value, subtract ) {
6568
6569 // Any relative (+/-) values have already been
6570 // normalized at this point
6571 var matches = rcssNum.exec( value );
6572 return matches ?
6573
6574 // Guard against undefined "subtract", e.g., when used as in cssHooks
6575 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6576 value;
6577}
6578
6579function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6580 var i = dimension === "width" ? 1 : 0,
6581 extra = 0,
6582 delta = 0,
6583 marginDelta = 0;
6584
6585 // Adjustment may not be necessary
6586 if ( box === ( isBorderBox ? "border" : "content" ) ) {
6587 return 0;
6588 }
6589
6590 for ( ; i < 4; i += 2 ) {
6591
6592 // Both box models exclude margin
6593 // Count margin delta separately to only add it after scroll gutter adjustment.
6594 // This is needed to make negative margins work with `outerHeight( true )` (gh-3982).
6595 if ( box === "margin" ) {
6596 marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6597 }
6598
6599 // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6600 if ( !isBorderBox ) {
6601
6602 // Add padding
6603 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6604
6605 // For "border" or "margin", add border
6606 if ( box !== "padding" ) {
6607 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6608
6609 // But still keep track of it otherwise
6610 } else {
6611 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6612 }
6613
6614 // If we get here with a border-box (content + padding + border), we're seeking "content" or
6615 // "padding" or "margin"
6616 } else {
6617
6618 // For "content", subtract padding
6619 if ( box === "content" ) {
6620 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6621 }
6622
6623 // For "content" or "padding", subtract border
6624 if ( box !== "margin" ) {
6625 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6626 }
6627 }
6628 }
6629
6630 // Account for positive content-box scroll gutter when requested by providing computedVal
6631 if ( !isBorderBox && computedVal >= 0 ) {
6632
6633 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6634 // Assuming integer scroll gutter, subtract the rest and round down
6635 delta += Math.max( 0, Math.ceil(
6636 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6637 computedVal -
6638 delta -
6639 extra -
6640 0.5
6641
6642 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6643 // Use an explicit zero to avoid NaN (gh-3964)
6644 ) ) || 0;
6645 }
6646
6647 return delta + marginDelta;
6648}
6649
6650function getWidthOrHeight( elem, dimension, extra ) {
6651
6652 // Start with computed style
6653 var styles = getStyles( elem ),
6654
6655 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6656 // Fake content-box until we know it's needed to know the true value.
6657 boxSizingNeeded = !support.boxSizingReliable() || extra,
6658 isBorderBox = boxSizingNeeded &&
6659 jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6660 valueIsBorderBox = isBorderBox,
6661
6662 val = curCSS( elem, dimension, styles ),
6663 offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6664
6665 // Support: Firefox <=54
6666 // Return a confounding non-pixel value or feign ignorance, as appropriate.
6667 if ( rnumnonpx.test( val ) ) {
6668 if ( !extra ) {
6669 return val;
6670 }
6671 val = "auto";
6672 }
6673
6674
6675 // Support: IE 9 - 11 only
6676 // Use offsetWidth/offsetHeight for when box sizing is unreliable.
6677 // In those cases, the computed value can be trusted to be border-box.
6678 if ( ( !support.boxSizingReliable() && isBorderBox ||
6679
6680 // Support: IE 10 - 11+, Edge 15 - 18+
6681 // IE/Edge misreport `getComputedStyle` of table rows with width/height
6682 // set in CSS while `offset*` properties report correct values.
6683 // Interestingly, in some cases IE 9 doesn't suffer from this issue.
6684 !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6685
6686 // Fall back to offsetWidth/offsetHeight when value is "auto"
6687 // This happens for inline elements with no explicit setting (gh-3571)
6688 val === "auto" ||
6689
6690 // Support: Android <=4.1 - 4.3 only
6691 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6692 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6693
6694 // Make sure the element is visible & connected
6695 elem.getClientRects().length ) {
6696
6697 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6698
6699 // Where available, offsetWidth/offsetHeight approximate border box dimensions.
6700 // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6701 // retrieved value as a content box dimension.
6702 valueIsBorderBox = offsetProp in elem;
6703 if ( valueIsBorderBox ) {
6704 val = elem[ offsetProp ];
6705 }
6706 }
6707
6708 // Normalize "" and auto
6709 val = parseFloat( val ) || 0;
6710
6711 // Adjust for the element's box model
6712 return ( val +
6713 boxModelAdjustment(
6714 elem,
6715 dimension,
6716 extra || ( isBorderBox ? "border" : "content" ),
6717 valueIsBorderBox,
6718 styles,
6719
6720 // Provide the current computed size to request scroll gutter calculation (gh-3589)
6721 val
6722 )
6723 ) + "px";
6724}
6725
6726jQuery.extend( {
6727
6728 // Add in style property hooks for overriding the default
6729 // behavior of getting and setting a style property
6730 cssHooks: {
6731 opacity: {
6732 get: function( elem, computed ) {
6733 if ( computed ) {
6734
6735 // We should always get a number back from opacity
6736 var ret = curCSS( elem, "opacity" );
6737 return ret === "" ? "1" : ret;
6738 }
6739 }
6740 }
6741 },
6742
6743 // Don't automatically add "px" to these possibly-unitless properties
6744 cssNumber: {
6745 animationIterationCount: true,
6746 aspectRatio: true,
6747 borderImageSlice: true,
6748 columnCount: true,
6749 flexGrow: true,
6750 flexShrink: true,
6751 fontWeight: true,
6752 gridArea: true,
6753 gridColumn: true,
6754 gridColumnEnd: true,
6755 gridColumnStart: true,
6756 gridRow: true,
6757 gridRowEnd: true,
6758 gridRowStart: true,
6759 lineHeight: true,
6760 opacity: true,
6761 order: true,
6762 orphans: true,
6763 scale: true,
6764 widows: true,
6765 zIndex: true,
6766 zoom: true,
6767
6768 // SVG-related
6769 fillOpacity: true,
6770 floodOpacity: true,
6771 stopOpacity: true,
6772 strokeMiterlimit: true,
6773 strokeOpacity: true
6774 },
6775
6776 // Add in properties whose names you wish to fix before
6777 // setting or getting the value
6778 cssProps: {},
6779
6780 // Get and set the style property on a DOM Node
6781 style: function( elem, name, value, extra ) {
6782
6783 // Don't set styles on text and comment nodes
6784 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6785 return;
6786 }
6787
6788 // Make sure that we're working with the right name
6789 var ret, type, hooks,
6790 origName = camelCase( name ),
6791 isCustomProp = rcustomProp.test( name ),
6792 style = elem.style;
6793
6794 // Make sure that we're working with the right name. We don't
6795 // want to query the value if it is a CSS custom property
6796 // since they are user-defined.
6797 if ( !isCustomProp ) {
6798 name = finalPropName( origName );
6799 }
6800
6801 // Gets hook for the prefixed version, then unprefixed version
6802 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6803
6804 // Check if we're setting a value
6805 if ( value !== undefined ) {
6806 type = typeof value;
6807
6808 // Convert "+=" or "-=" to relative numbers (trac-7345)
6809 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6810 value = adjustCSS( elem, name, ret );
6811
6812 // Fixes bug trac-9237
6813 type = "number";
6814 }
6815
6816 // Make sure that null and NaN values aren't set (trac-7116)
6817 if ( value == null || value !== value ) {
6818 return;
6819 }
6820
6821 // If a number was passed in, add the unit (except for certain CSS properties)
6822 // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6823 // "px" to a few hardcoded values.
6824 if ( type === "number" && !isCustomProp ) {
6825 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6826 }
6827
6828 // background-* props affect original clone's values
6829 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6830 style[ name ] = "inherit";
6831 }
6832
6833 // If a hook was provided, use that value, otherwise just set the specified value
6834 if ( !hooks || !( "set" in hooks ) ||
6835 ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6836
6837 if ( isCustomProp ) {
6838 style.setProperty( name, value );
6839 } else {
6840 style[ name ] = value;
6841 }
6842 }
6843
6844 } else {
6845
6846 // If a hook was provided get the non-computed value from there
6847 if ( hooks && "get" in hooks &&
6848 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6849
6850 return ret;
6851 }
6852
6853 // Otherwise just get the value from the style object
6854 return style[ name ];
6855 }
6856 },
6857
6858 css: function( elem, name, extra, styles ) {
6859 var val, num, hooks,
6860 origName = camelCase( name ),
6861 isCustomProp = rcustomProp.test( name );
6862
6863 // Make sure that we're working with the right name. We don't
6864 // want to modify the value if it is a CSS custom property
6865 // since they are user-defined.
6866 if ( !isCustomProp ) {
6867 name = finalPropName( origName );
6868 }
6869
6870 // Try prefixed name followed by the unprefixed name
6871 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6872
6873 // If a hook was provided get the computed value from there
6874 if ( hooks && "get" in hooks ) {
6875 val = hooks.get( elem, true, extra );
6876 }
6877
6878 // Otherwise, if a way to get the computed value exists, use that
6879 if ( val === undefined ) {
6880 val = curCSS( elem, name, styles );
6881 }
6882
6883 // Convert "normal" to computed value
6884 if ( val === "normal" && name in cssNormalTransform ) {
6885 val = cssNormalTransform[ name ];
6886 }
6887
6888 // Make numeric if forced or a qualifier was provided and val looks numeric
6889 if ( extra === "" || extra ) {
6890 num = parseFloat( val );
6891 return extra === true || isFinite( num ) ? num || 0 : val;
6892 }
6893
6894 return val;
6895 }
6896} );
6897
6898jQuery.each( [ "height", "width" ], function( _i, dimension ) {
6899 jQuery.cssHooks[ dimension ] = {
6900 get: function( elem, computed, extra ) {
6901 if ( computed ) {
6902
6903 // Certain elements can have dimension info if we invisibly show them
6904 // but it must have a current display style that would benefit
6905 return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
6906
6907 // Support: Safari 8+
6908 // Table columns in Safari have non-zero offsetWidth & zero
6909 // getBoundingClientRect().width unless display is changed.
6910 // Support: IE <=11 only
6911 // Running getBoundingClientRect on a disconnected node
6912 // in IE throws an error.
6913 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6914 swap( elem, cssShow, function() {
6915 return getWidthOrHeight( elem, dimension, extra );
6916 } ) :
6917 getWidthOrHeight( elem, dimension, extra );
6918 }
6919 },
6920
6921 set: function( elem, value, extra ) {
6922 var matches,
6923 styles = getStyles( elem ),
6924
6925 // Only read styles.position if the test has a chance to fail
6926 // to avoid forcing a reflow.
6927 scrollboxSizeBuggy = !support.scrollboxSize() &&
6928 styles.position === "absolute",
6929
6930 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
6931 boxSizingNeeded = scrollboxSizeBuggy || extra,
6932 isBorderBox = boxSizingNeeded &&
6933 jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6934 subtract = extra ?
6935 boxModelAdjustment(
6936 elem,
6937 dimension,
6938 extra,
6939 isBorderBox,
6940 styles
6941 ) :
6942 0;
6943
6944 // Account for unreliable border-box dimensions by comparing offset* to computed and
6945 // faking a content-box to get border and padding (gh-3699)
6946 if ( isBorderBox && scrollboxSizeBuggy ) {
6947 subtract -= Math.ceil(
6948 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6949 parseFloat( styles[ dimension ] ) -
6950 boxModelAdjustment( elem, dimension, "border", false, styles ) -
6951 0.5
6952 );
6953 }
6954
6955 // Convert to pixels if value adjustment is needed
6956 if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6957 ( matches[ 3 ] || "px" ) !== "px" ) {
6958
6959 elem.style[ dimension ] = value;
6960 value = jQuery.css( elem, dimension );
6961 }
6962
6963 return setPositiveNumber( elem, value, subtract );
6964 }
6965 };
6966} );
6967
6968jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6969 function( elem, computed ) {
6970 if ( computed ) {
6971 return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
6972 elem.getBoundingClientRect().left -
6973 swap( elem, { marginLeft: 0 }, function() {
6974 return elem.getBoundingClientRect().left;
6975 } )
6976 ) + "px";
6977 }
6978 }
6979);
6980
6981// These hooks are used by animate to expand properties
6982jQuery.each( {
6983 margin: "",
6984 padding: "",
6985 border: "Width"
6986}, function( prefix, suffix ) {
6987 jQuery.cssHooks[ prefix + suffix ] = {
6988 expand: function( value ) {
6989 var i = 0,
6990 expanded = {},
6991
6992 // Assumes a single number if not a string
6993 parts = typeof value === "string" ? value.split( " " ) : [ value ];
6994
6995 for ( ; i < 4; i++ ) {
6996 expanded[ prefix + cssExpand[ i ] + suffix ] =
6997 parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6998 }
6999
7000 return expanded;
7001 }
7002 };
7003
7004 if ( prefix !== "margin" ) {
7005 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
7006 }
7007} );
7008
7009jQuery.fn.extend( {
7010 css: function( name, value ) {
7011 return access( this, function( elem, name, value ) {
7012 var styles, len,
7013 map = {},
7014 i = 0;
7015
7016 if ( Array.isArray( name ) ) {
7017 styles = getStyles( elem );
7018 len = name.length;
7019
7020 for ( ; i < len; i++ ) {
7021 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
7022 }
7023
7024 return map;
7025 }
7026
7027 return value !== undefined ?
7028 jQuery.style( elem, name, value ) :
7029 jQuery.css( elem, name );
7030 }, name, value, arguments.length > 1 );
7031 }
7032} );
7033
7034
7035function Tween( elem, options, prop, end, easing ) {
7036 return new Tween.prototype.init( elem, options, prop, end, easing );
7037}
7038jQuery.Tween = Tween;
7039
7040Tween.prototype = {
7041 constructor: Tween,
7042 init: function( elem, options, prop, end, easing, unit ) {
7043 this.elem = elem;
7044 this.prop = prop;
7045 this.easing = easing || jQuery.easing._default;
7046 this.options = options;
7047 this.start = this.now = this.cur();
7048 this.end = end;
7049 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
7050 },
7051 cur: function() {
7052 var hooks = Tween.propHooks[ this.prop ];
7053
7054 return hooks && hooks.get ?
7055 hooks.get( this ) :
7056 Tween.propHooks._default.get( this );
7057 },
7058 run: function( percent ) {
7059 var eased,
7060 hooks = Tween.propHooks[ this.prop ];
7061
7062 if ( this.options.duration ) {
7063 this.pos = eased = jQuery.easing[ this.easing ](
7064 percent, this.options.duration * percent, 0, 1, this.options.duration
7065 );
7066 } else {
7067 this.pos = eased = percent;
7068 }
7069 this.now = ( this.end - this.start ) * eased + this.start;
7070
7071 if ( this.options.step ) {
7072 this.options.step.call( this.elem, this.now, this );
7073 }
7074
7075 if ( hooks && hooks.set ) {
7076 hooks.set( this );
7077 } else {
7078 Tween.propHooks._default.set( this );
7079 }
7080 return this;
7081 }
7082};
7083
7084Tween.prototype.init.prototype = Tween.prototype;
7085
7086Tween.propHooks = {
7087 _default: {
7088 get: function( tween ) {
7089 var result;
7090
7091 // Use a property on the element directly when it is not a DOM element,
7092 // or when there is no matching style property that exists.
7093 if ( tween.elem.nodeType !== 1 ||
7094 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
7095 return tween.elem[ tween.prop ];
7096 }
7097
7098 // Passing an empty string as a 3rd parameter to .css will automatically
7099 // attempt a parseFloat and fallback to a string if the parse fails.
7100 // Simple values such as "10px" are parsed to Float;
7101 // complex values such as "rotate(1rad)" are returned as-is.
7102 result = jQuery.css( tween.elem, tween.prop, "" );
7103
7104 // Empty strings, null, undefined and "auto" are converted to 0.
7105 return !result || result === "auto" ? 0 : result;
7106 },
7107 set: function( tween ) {
7108
7109 // Use step hook for back compat.
7110 // Use cssHook if its there.
7111 // Use .style if available and use plain properties where available.
7112 if ( jQuery.fx.step[ tween.prop ] ) {
7113 jQuery.fx.step[ tween.prop ]( tween );
7114 } else if ( tween.elem.nodeType === 1 && (
7115 jQuery.cssHooks[ tween.prop ] ||
7116 tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
7117 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7118 } else {
7119 tween.elem[ tween.prop ] = tween.now;
7120 }
7121 }
7122 }
7123};
7124
7125// Support: IE <=9 only
7126// Panic based approach to setting things on disconnected nodes
7127Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7128 set: function( tween ) {
7129 if ( tween.elem.nodeType && tween.elem.parentNode ) {
7130 tween.elem[ tween.prop ] = tween.now;
7131 }
7132 }
7133};
7134
7135jQuery.easing = {
7136 linear: function( p ) {
7137 return p;
7138 },
7139 swing: function( p ) {
7140 return 0.5 - Math.cos( p * Math.PI ) / 2;
7141 },
7142 _default: "swing"
7143};
7144
7145jQuery.fx = Tween.prototype.init;
7146
7147// Back compat <1.8 extension point
7148jQuery.fx.step = {};
7149
7150
7151
7152
7153var
7154 fxNow, inProgress,
7155 rfxtypes = /^(?:toggle|show|hide)$/,
7156 rrun = /queueHooks$/;
7157
7158function schedule() {
7159 if ( inProgress ) {
7160 if ( document.hidden === false && window.requestAnimationFrame ) {
7161 window.requestAnimationFrame( schedule );
7162 } else {
7163 window.setTimeout( schedule, jQuery.fx.interval );
7164 }
7165
7166 jQuery.fx.tick();
7167 }
7168}
7169
7170// Animations created synchronously will run synchronously
7171function createFxNow() {
7172 window.setTimeout( function() {
7173 fxNow = undefined;
7174 } );
7175 return ( fxNow = Date.now() );
7176}
7177
7178// Generate parameters to create a standard animation
7179function genFx( type, includeWidth ) {
7180 var which,
7181 i = 0,
7182 attrs = { height: type };
7183
7184 // If we include width, step value is 1 to do all cssExpand values,
7185 // otherwise step value is 2 to skip over Left and Right
7186 includeWidth = includeWidth ? 1 : 0;
7187 for ( ; i < 4; i += 2 - includeWidth ) {
7188 which = cssExpand[ i ];
7189 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7190 }
7191
7192 if ( includeWidth ) {
7193 attrs.opacity = attrs.width = type;
7194 }
7195
7196 return attrs;
7197}
7198
7199function createTween( value, prop, animation ) {
7200 var tween,
7201 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
7202 index = 0,
7203 length = collection.length;
7204 for ( ; index < length; index++ ) {
7205 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
7206
7207 // We're done with this property
7208 return tween;
7209 }
7210 }
7211}
7212
7213function defaultPrefilter( elem, props, opts ) {
7214 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
7215 isBox = "width" in props || "height" in props,
7216 anim = this,
7217 orig = {},
7218 style = elem.style,
7219 hidden = elem.nodeType && isHiddenWithinTree( elem ),
7220 dataShow = dataPriv.get( elem, "fxshow" );
7221
7222 // Queue-skipping animations hijack the fx hooks
7223 if ( !opts.queue ) {
7224 hooks = jQuery._queueHooks( elem, "fx" );
7225 if ( hooks.unqueued == null ) {
7226 hooks.unqueued = 0;
7227 oldfire = hooks.empty.fire;
7228 hooks.empty.fire = function() {
7229 if ( !hooks.unqueued ) {
7230 oldfire();
7231 }
7232 };
7233 }
7234 hooks.unqueued++;
7235
7236 anim.always( function() {
7237
7238 // Ensure the complete handler is called before this completes
7239 anim.always( function() {
7240 hooks.unqueued--;
7241 if ( !jQuery.queue( elem, "fx" ).length ) {
7242 hooks.empty.fire();
7243 }
7244 } );
7245 } );
7246 }
7247
7248 // Detect show/hide animations
7249 for ( prop in props ) {
7250 value = props[ prop ];
7251 if ( rfxtypes.test( value ) ) {
7252 delete props[ prop ];
7253 toggle = toggle || value === "toggle";
7254 if ( value === ( hidden ? "hide" : "show" ) ) {
7255
7256 // Pretend to be hidden if this is a "show" and
7257 // there is still data from a stopped show/hide
7258 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7259 hidden = true;
7260
7261 // Ignore all other no-op show/hide data
7262 } else {
7263 continue;
7264 }
7265 }
7266 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7267 }
7268 }
7269
7270 // Bail out if this is a no-op like .hide().hide()
7271 propTween = !jQuery.isEmptyObject( props );
7272 if ( !propTween && jQuery.isEmptyObject( orig ) ) {
7273 return;
7274 }
7275
7276 // Restrict "overflow" and "display" styles during box animations
7277 if ( isBox && elem.nodeType === 1 ) {
7278
7279 // Support: IE <=9 - 11, Edge 12 - 15
7280 // Record all 3 overflow attributes because IE does not infer the shorthand
7281 // from identically-valued overflowX and overflowY and Edge just mirrors
7282 // the overflowX value there.
7283 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7284
7285 // Identify a display type, preferring old show/hide data over the CSS cascade
7286 restoreDisplay = dataShow && dataShow.display;
7287 if ( restoreDisplay == null ) {
7288 restoreDisplay = dataPriv.get( elem, "display" );
7289 }
7290 display = jQuery.css( elem, "display" );
7291 if ( display === "none" ) {
7292 if ( restoreDisplay ) {
7293 display = restoreDisplay;
7294 } else {
7295
7296 // Get nonempty value(s) by temporarily forcing visibility
7297 showHide( [ elem ], true );
7298 restoreDisplay = elem.style.display || restoreDisplay;
7299 display = jQuery.css( elem, "display" );
7300 showHide( [ elem ] );
7301 }
7302 }
7303
7304 // Animate inline elements as inline-block
7305 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
7306 if ( jQuery.css( elem, "float" ) === "none" ) {
7307
7308 // Restore the original display value at the end of pure show/hide animations
7309 if ( !propTween ) {
7310 anim.done( function() {
7311 style.display = restoreDisplay;
7312 } );
7313 if ( restoreDisplay == null ) {
7314 display = style.display;
7315 restoreDisplay = display === "none" ? "" : display;
7316 }
7317 }
7318 style.display = "inline-block";
7319 }
7320 }
7321 }
7322
7323 if ( opts.overflow ) {
7324 style.overflow = "hidden";
7325 anim.always( function() {
7326 style.overflow = opts.overflow[ 0 ];
7327 style.overflowX = opts.overflow[ 1 ];
7328 style.overflowY = opts.overflow[ 2 ];
7329 } );
7330 }
7331
7332 // Implement show/hide animations
7333 propTween = false;
7334 for ( prop in orig ) {
7335
7336 // General show/hide setup for this element animation
7337 if ( !propTween ) {
7338 if ( dataShow ) {
7339 if ( "hidden" in dataShow ) {
7340 hidden = dataShow.hidden;
7341 }
7342 } else {
7343 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7344 }
7345
7346 // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7347 if ( toggle ) {
7348 dataShow.hidden = !hidden;
7349 }
7350
7351 // Show elements before animating them
7352 if ( hidden ) {
7353 showHide( [ elem ], true );
7354 }
7355
7356 /* eslint-disable no-loop-func */
7357
7358 anim.done( function() {
7359
7360 /* eslint-enable no-loop-func */
7361
7362 // The final step of a "hide" animation is actually hiding the element
7363 if ( !hidden ) {
7364 showHide( [ elem ] );
7365 }
7366 dataPriv.remove( elem, "fxshow" );
7367 for ( prop in orig ) {
7368 jQuery.style( elem, prop, orig[ prop ] );
7369 }
7370 } );
7371 }
7372
7373 // Per-property setup
7374 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7375 if ( !( prop in dataShow ) ) {
7376 dataShow[ prop ] = propTween.start;
7377 if ( hidden ) {
7378 propTween.end = propTween.start;
7379 propTween.start = 0;
7380 }
7381 }
7382 }
7383}
7384
7385function propFilter( props, specialEasing ) {
7386 var index, name, easing, value, hooks;
7387
7388 // camelCase, specialEasing and expand cssHook pass
7389 for ( index in props ) {
7390 name = camelCase( index );
7391 easing = specialEasing[ name ];
7392 value = props[ index ];
7393 if ( Array.isArray( value ) ) {
7394 easing = value[ 1 ];
7395 value = props[ index ] = value[ 0 ];
7396 }
7397
7398 if ( index !== name ) {
7399 props[ name ] = value;
7400 delete props[ index ];
7401 }
7402
7403 hooks = jQuery.cssHooks[ name ];
7404 if ( hooks && "expand" in hooks ) {
7405 value = hooks.expand( value );
7406 delete props[ name ];
7407
7408 // Not quite $.extend, this won't overwrite existing keys.
7409 // Reusing 'index' because we have the correct "name"
7410 for ( index in value ) {
7411 if ( !( index in props ) ) {
7412 props[ index ] = value[ index ];
7413 specialEasing[ index ] = easing;
7414 }
7415 }
7416 } else {
7417 specialEasing[ name ] = easing;
7418 }
7419 }
7420}
7421
7422function Animation( elem, properties, options ) {
7423 var result,
7424 stopped,
7425 index = 0,
7426 length = Animation.prefilters.length,
7427 deferred = jQuery.Deferred().always( function() {
7428
7429 // Don't match elem in the :animated selector
7430 delete tick.elem;
7431 } ),
7432 tick = function() {
7433 if ( stopped ) {
7434 return false;
7435 }
7436 var currentTime = fxNow || createFxNow(),
7437 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7438
7439 // Support: Android 2.3 only
7440 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
7441 temp = remaining / animation.duration || 0,
7442 percent = 1 - temp,
7443 index = 0,
7444 length = animation.tweens.length;
7445
7446 for ( ; index < length; index++ ) {
7447 animation.tweens[ index ].run( percent );
7448 }
7449
7450 deferred.notifyWith( elem, [ animation, percent, remaining ] );
7451
7452 // If there's more to do, yield
7453 if ( percent < 1 && length ) {
7454 return remaining;
7455 }
7456
7457 // If this was an empty animation, synthesize a final progress notification
7458 if ( !length ) {
7459 deferred.notifyWith( elem, [ animation, 1, 0 ] );
7460 }
7461
7462 // Resolve the animation and report its conclusion
7463 deferred.resolveWith( elem, [ animation ] );
7464 return false;
7465 },
7466 animation = deferred.promise( {
7467 elem: elem,
7468 props: jQuery.extend( {}, properties ),
7469 opts: jQuery.extend( true, {
7470 specialEasing: {},
7471 easing: jQuery.easing._default
7472 }, options ),
7473 originalProperties: properties,
7474 originalOptions: options,
7475 startTime: fxNow || createFxNow(),
7476 duration: options.duration,
7477 tweens: [],
7478 createTween: function( prop, end ) {
7479 var tween = jQuery.Tween( elem, animation.opts, prop, end,
7480 animation.opts.specialEasing[ prop ] || animation.opts.easing );
7481 animation.tweens.push( tween );
7482 return tween;
7483 },
7484 stop: function( gotoEnd ) {
7485 var index = 0,
7486
7487 // If we are going to the end, we want to run all the tweens
7488 // otherwise we skip this part
7489 length = gotoEnd ? animation.tweens.length : 0;
7490 if ( stopped ) {
7491 return this;
7492 }
7493 stopped = true;
7494 for ( ; index < length; index++ ) {
7495 animation.tweens[ index ].run( 1 );
7496 }
7497
7498 // Resolve when we played the last frame; otherwise, reject
7499 if ( gotoEnd ) {
7500 deferred.notifyWith( elem, [ animation, 1, 0 ] );
7501 deferred.resolveWith( elem, [ animation, gotoEnd ] );
7502 } else {
7503 deferred.rejectWith( elem, [ animation, gotoEnd ] );
7504 }
7505 return this;
7506 }
7507 } ),
7508 props = animation.props;
7509
7510 propFilter( props, animation.opts.specialEasing );
7511
7512 for ( ; index < length; index++ ) {
7513 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7514 if ( result ) {
7515 if ( isFunction( result.stop ) ) {
7516 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7517 result.stop.bind( result );
7518 }
7519 return result;
7520 }
7521 }
7522
7523 jQuery.map( props, createTween, animation );
7524
7525 if ( isFunction( animation.opts.start ) ) {
7526 animation.opts.start.call( elem, animation );
7527 }
7528
7529 // Attach callbacks from options
7530 animation
7531 .progress( animation.opts.progress )
7532 .done( animation.opts.done, animation.opts.complete )
7533 .fail( animation.opts.fail )
7534 .always( animation.opts.always );
7535
7536 jQuery.fx.timer(
7537 jQuery.extend( tick, {
7538 elem: elem,
7539 anim: animation,
7540 queue: animation.opts.queue
7541 } )
7542 );
7543
7544 return animation;
7545}
7546
7547jQuery.Animation = jQuery.extend( Animation, {
7548
7549 tweeners: {
7550 "*": [ function( prop, value ) {
7551 var tween = this.createTween( prop, value );
7552 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7553 return tween;
7554 } ]
7555 },
7556
7557 tweener: function( props, callback ) {
7558 if ( isFunction( props ) ) {
7559 callback = props;
7560 props = [ "*" ];
7561 } else {
7562 props = props.match( rnothtmlwhite );
7563 }
7564
7565 var prop,
7566 index = 0,
7567 length = props.length;
7568
7569 for ( ; index < length; index++ ) {
7570 prop = props[ index ];
7571 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7572 Animation.tweeners[ prop ].unshift( callback );
7573 }
7574 },
7575
7576 prefilters: [ defaultPrefilter ],
7577
7578 prefilter: function( callback, prepend ) {
7579 if ( prepend ) {
7580 Animation.prefilters.unshift( callback );
7581 } else {
7582 Animation.prefilters.push( callback );
7583 }
7584 }
7585} );
7586
7587jQuery.speed = function( speed, easing, fn ) {
7588 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7589 complete: fn || !fn && easing ||
7590 isFunction( speed ) && speed,
7591 duration: speed,
7592 easing: fn && easing || easing && !isFunction( easing ) && easing
7593 };
7594
7595 // Go to the end state if fx are off
7596 if ( jQuery.fx.off ) {
7597 opt.duration = 0;
7598
7599 } else {
7600 if ( typeof opt.duration !== "number" ) {
7601 if ( opt.duration in jQuery.fx.speeds ) {
7602 opt.duration = jQuery.fx.speeds[ opt.duration ];
7603
7604 } else {
7605 opt.duration = jQuery.fx.speeds._default;
7606 }
7607 }
7608 }
7609
7610 // Normalize opt.queue - true/undefined/null -> "fx"
7611 if ( opt.queue == null || opt.queue === true ) {
7612 opt.queue = "fx";
7613 }
7614
7615 // Queueing
7616 opt.old = opt.complete;
7617
7618 opt.complete = function() {
7619 if ( isFunction( opt.old ) ) {
7620 opt.old.call( this );
7621 }
7622
7623 if ( opt.queue ) {
7624 jQuery.dequeue( this, opt.queue );
7625 }
7626 };
7627
7628 return opt;
7629};
7630
7631jQuery.fn.extend( {
7632 fadeTo: function( speed, to, easing, callback ) {
7633
7634 // Show any hidden elements after setting opacity to 0
7635 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7636
7637 // Animate to the value specified
7638 .end().animate( { opacity: to }, speed, easing, callback );
7639 },
7640 animate: function( prop, speed, easing, callback ) {
7641 var empty = jQuery.isEmptyObject( prop ),
7642 optall = jQuery.speed( speed, easing, callback ),
7643 doAnimation = function() {
7644
7645 // Operate on a copy of prop so per-property easing won't be lost
7646 var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7647
7648 // Empty animations, or finishing resolves immediately
7649 if ( empty || dataPriv.get( this, "finish" ) ) {
7650 anim.stop( true );
7651 }
7652 };
7653
7654 doAnimation.finish = doAnimation;
7655
7656 return empty || optall.queue === false ?
7657 this.each( doAnimation ) :
7658 this.queue( optall.queue, doAnimation );
7659 },
7660 stop: function( type, clearQueue, gotoEnd ) {
7661 var stopQueue = function( hooks ) {
7662 var stop = hooks.stop;
7663 delete hooks.stop;
7664 stop( gotoEnd );
7665 };
7666
7667 if ( typeof type !== "string" ) {
7668 gotoEnd = clearQueue;
7669 clearQueue = type;
7670 type = undefined;
7671 }
7672 if ( clearQueue ) {
7673 this.queue( type || "fx", [] );
7674 }
7675
7676 return this.each( function() {
7677 var dequeue = true,
7678 index = type != null && type + "queueHooks",
7679 timers = jQuery.timers,
7680 data = dataPriv.get( this );
7681
7682 if ( index ) {
7683 if ( data[ index ] && data[ index ].stop ) {
7684 stopQueue( data[ index ] );
7685 }
7686 } else {
7687 for ( index in data ) {
7688 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7689 stopQueue( data[ index ] );
7690 }
7691 }
7692 }
7693
7694 for ( index = timers.length; index--; ) {
7695 if ( timers[ index ].elem === this &&
7696 ( type == null || timers[ index ].queue === type ) ) {
7697
7698 timers[ index ].anim.stop( gotoEnd );
7699 dequeue = false;
7700 timers.splice( index, 1 );
7701 }
7702 }
7703
7704 // Start the next in the queue if the last step wasn't forced.
7705 // Timers currently will call their complete callbacks, which
7706 // will dequeue but only if they were gotoEnd.
7707 if ( dequeue || !gotoEnd ) {
7708 jQuery.dequeue( this, type );
7709 }
7710 } );
7711 },
7712 finish: function( type ) {
7713 if ( type !== false ) {
7714 type = type || "fx";
7715 }
7716 return this.each( function() {
7717 var index,
7718 data = dataPriv.get( this ),
7719 queue = data[ type + "queue" ],
7720 hooks = data[ type + "queueHooks" ],
7721 timers = jQuery.timers,
7722 length = queue ? queue.length : 0;
7723
7724 // Enable finishing flag on private data
7725 data.finish = true;
7726
7727 // Empty the queue first
7728 jQuery.queue( this, type, [] );
7729
7730 if ( hooks && hooks.stop ) {
7731 hooks.stop.call( this, true );
7732 }
7733
7734 // Look for any active animations, and finish them
7735 for ( index = timers.length; index--; ) {
7736 if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7737 timers[ index ].anim.stop( true );
7738 timers.splice( index, 1 );
7739 }
7740 }
7741
7742 // Look for any animations in the old queue and finish them
7743 for ( index = 0; index < length; index++ ) {
7744 if ( queue[ index ] && queue[ index ].finish ) {
7745 queue[ index ].finish.call( this );
7746 }
7747 }
7748
7749 // Turn off finishing flag
7750 delete data.finish;
7751 } );
7752 }
7753} );
7754
7755jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
7756 var cssFn = jQuery.fn[ name ];
7757 jQuery.fn[ name ] = function( speed, easing, callback ) {
7758 return speed == null || typeof speed === "boolean" ?
7759 cssFn.apply( this, arguments ) :
7760 this.animate( genFx( name, true ), speed, easing, callback );
7761 };
7762} );
7763
7764// Generate shortcuts for custom animations
7765jQuery.each( {
7766 slideDown: genFx( "show" ),
7767 slideUp: genFx( "hide" ),
7768 slideToggle: genFx( "toggle" ),
7769 fadeIn: { opacity: "show" },
7770 fadeOut: { opacity: "hide" },
7771 fadeToggle: { opacity: "toggle" }
7772}, function( name, props ) {
7773 jQuery.fn[ name ] = function( speed, easing, callback ) {
7774 return this.animate( props, speed, easing, callback );
7775 };
7776} );
7777
7778jQuery.timers = [];
7779jQuery.fx.tick = function() {
7780 var timer,
7781 i = 0,
7782 timers = jQuery.timers;
7783
7784 fxNow = Date.now();
7785
7786 for ( ; i < timers.length; i++ ) {
7787 timer = timers[ i ];
7788
7789 // Run the timer and safely remove it when done (allowing for external removal)
7790 if ( !timer() && timers[ i ] === timer ) {
7791 timers.splice( i--, 1 );
7792 }
7793 }
7794
7795 if ( !timers.length ) {
7796 jQuery.fx.stop();
7797 }
7798 fxNow = undefined;
7799};
7800
7801jQuery.fx.timer = function( timer ) {
7802 jQuery.timers.push( timer );
7803 jQuery.fx.start();
7804};
7805
7806jQuery.fx.interval = 13;
7807jQuery.fx.start = function() {
7808 if ( inProgress ) {
7809 return;
7810 }
7811
7812 inProgress = true;
7813 schedule();
7814};
7815
7816jQuery.fx.stop = function() {
7817 inProgress = null;
7818};
7819
7820jQuery.fx.speeds = {
7821 slow: 600,
7822 fast: 200,
7823
7824 // Default speed
7825 _default: 400
7826};
7827
7828
7829// Based off of the plugin by Clint Helfers, with permission.
7830jQuery.fn.delay = function( time, type ) {
7831 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7832 type = type || "fx";
7833
7834 return this.queue( type, function( next, hooks ) {
7835 var timeout = window.setTimeout( next, time );
7836 hooks.stop = function() {
7837 window.clearTimeout( timeout );
7838 };
7839 } );
7840};
7841
7842
7843( function() {
7844 var input = document.createElement( "input" ),
7845 select = document.createElement( "select" ),
7846 opt = select.appendChild( document.createElement( "option" ) );
7847
7848 input.type = "checkbox";
7849
7850 // Support: Android <=4.3 only
7851 // Default value for a checkbox should be "on"
7852 support.checkOn = input.value !== "";
7853
7854 // Support: IE <=11 only
7855 // Must access selectedIndex to make default options select
7856 support.optSelected = opt.selected;
7857
7858 // Support: IE <=11 only
7859 // An input loses its value after becoming a radio
7860 input = document.createElement( "input" );
7861 input.value = "t";
7862 input.type = "radio";
7863 support.radioValue = input.value === "t";
7864} )();
7865
7866
7867var boolHook,
7868 attrHandle = jQuery.expr.attrHandle;
7869
7870jQuery.fn.extend( {
7871 attr: function( name, value ) {
7872 return access( this, jQuery.attr, name, value, arguments.length > 1 );
7873 },
7874
7875 removeAttr: function( name ) {
7876 return this.each( function() {
7877 jQuery.removeAttr( this, name );
7878 } );
7879 }
7880} );
7881
7882jQuery.extend( {
7883 attr: function( elem, name, value ) {
7884 var ret, hooks,
7885 nType = elem.nodeType;
7886
7887 // Don't get/set attributes on text, comment and attribute nodes
7888 if ( nType === 3 || nType === 8 || nType === 2 ) {
7889 return;
7890 }
7891
7892 // Fallback to prop when attributes are not supported
7893 if ( typeof elem.getAttribute === "undefined" ) {
7894 return jQuery.prop( elem, name, value );
7895 }
7896
7897 // Attribute hooks are determined by the lowercase version
7898 // Grab necessary hook if one is defined
7899 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7900 hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
7901 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
7902 }
7903
7904 if ( value !== undefined ) {
7905 if ( value === null ) {
7906 jQuery.removeAttr( elem, name );
7907 return;
7908 }
7909
7910 if ( hooks && "set" in hooks &&
7911 ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7912 return ret;
7913 }
7914
7915 elem.setAttribute( name, value + "" );
7916 return value;
7917 }
7918
7919 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7920 return ret;
7921 }
7922
7923 ret = jQuery.find.attr( elem, name );
7924
7925 // Non-existent attributes return null, we normalize to undefined
7926 return ret == null ? undefined : ret;
7927 },
7928
7929 attrHooks: {
7930 type: {
7931 set: function( elem, value ) {
7932 if ( !support.radioValue && value === "radio" &&
7933 nodeName( elem, "input" ) ) {
7934 var val = elem.value;
7935 elem.setAttribute( "type", value );
7936 if ( val ) {
7937 elem.value = val;
7938 }
7939 return value;
7940 }
7941 }
7942 }
7943 },
7944
7945 removeAttr: function( elem, value ) {
7946 var name,
7947 i = 0,
7948
7949 // Attribute names can contain non-HTML whitespace characters
7950 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
7951 attrNames = value && value.match( rnothtmlwhite );
7952
7953 if ( attrNames && elem.nodeType === 1 ) {
7954 while ( ( name = attrNames[ i++ ] ) ) {
7955 elem.removeAttribute( name );
7956 }
7957 }
7958 }
7959} );
7960
7961// Hooks for boolean attributes
7962boolHook = {
7963 set: function( elem, value, name ) {
7964 if ( value === false ) {
7965
7966 // Remove boolean attributes when set to false
7967 jQuery.removeAttr( elem, name );
7968 } else {
7969 elem.setAttribute( name, name );
7970 }
7971 return name;
7972 }
7973};
7974
7975jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
7976 var getter = attrHandle[ name ] || jQuery.find.attr;
7977
7978 attrHandle[ name ] = function( elem, name, isXML ) {
7979 var ret, handle,
7980 lowercaseName = name.toLowerCase();
7981
7982 if ( !isXML ) {
7983
7984 // Avoid an infinite loop by temporarily removing this function from the getter
7985 handle = attrHandle[ lowercaseName ];
7986 attrHandle[ lowercaseName ] = ret;
7987 ret = getter( elem, name, isXML ) != null ?
7988 lowercaseName :
7989 null;
7990 attrHandle[ lowercaseName ] = handle;
7991 }
7992 return ret;
7993 };
7994} );
7995
7996
7997
7998
7999var rfocusable = /^(?:input|select|textarea|button)$/i,
8000 rclickable = /^(?:a|area)$/i;
8001
8002jQuery.fn.extend( {
8003 prop: function( name, value ) {
8004 return access( this, jQuery.prop, name, value, arguments.length > 1 );
8005 },
8006
8007 removeProp: function( name ) {
8008 return this.each( function() {
8009 delete this[ jQuery.propFix[ name ] || name ];
8010 } );
8011 }
8012} );
8013
8014jQuery.extend( {
8015 prop: function( elem, name, value ) {
8016 var ret, hooks,
8017 nType = elem.nodeType;
8018
8019 // Don't get/set properties on text, comment and attribute nodes
8020 if ( nType === 3 || nType === 8 || nType === 2 ) {
8021 return;
8022 }
8023
8024 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8025
8026 // Fix name and attach hooks
8027 name = jQuery.propFix[ name ] || name;
8028 hooks = jQuery.propHooks[ name ];
8029 }
8030
8031 if ( value !== undefined ) {
8032 if ( hooks && "set" in hooks &&
8033 ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8034 return ret;
8035 }
8036
8037 return ( elem[ name ] = value );
8038 }
8039
8040 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8041 return ret;
8042 }
8043
8044 return elem[ name ];
8045 },
8046
8047 propHooks: {
8048 tabIndex: {
8049 get: function( elem ) {
8050
8051 // Support: IE <=9 - 11 only
8052 // elem.tabIndex doesn't always return the
8053 // correct value when it hasn't been explicitly set
8054 // Use proper attribute retrieval (trac-12072)
8055 var tabindex = jQuery.find.attr( elem, "tabindex" );
8056
8057 if ( tabindex ) {
8058 return parseInt( tabindex, 10 );
8059 }
8060
8061 if (
8062 rfocusable.test( elem.nodeName ) ||
8063 rclickable.test( elem.nodeName ) &&
8064 elem.href
8065 ) {
8066 return 0;
8067 }
8068
8069 return -1;
8070 }
8071 }
8072 },
8073
8074 propFix: {
8075 "for": "htmlFor",
8076 "class": "className"
8077 }
8078} );
8079
8080// Support: IE <=11 only
8081// Accessing the selectedIndex property
8082// forces the browser to respect setting selected
8083// on the option
8084// The getter ensures a default option is selected
8085// when in an optgroup
8086// eslint rule "no-unused-expressions" is disabled for this code
8087// since it considers such accessions noop
8088if ( !support.optSelected ) {
8089 jQuery.propHooks.selected = {
8090 get: function( elem ) {
8091
8092 /* eslint no-unused-expressions: "off" */
8093
8094 var parent = elem.parentNode;
8095 if ( parent && parent.parentNode ) {
8096 parent.parentNode.selectedIndex;
8097 }
8098 return null;
8099 },
8100 set: function( elem ) {
8101
8102 /* eslint no-unused-expressions: "off" */
8103
8104 var parent = elem.parentNode;
8105 if ( parent ) {
8106 parent.selectedIndex;
8107
8108 if ( parent.parentNode ) {
8109 parent.parentNode.selectedIndex;
8110 }
8111 }
8112 }
8113 };
8114}
8115
8116jQuery.each( [
8117 "tabIndex",
8118 "readOnly",
8119 "maxLength",
8120 "cellSpacing",
8121 "cellPadding",
8122 "rowSpan",
8123 "colSpan",
8124 "useMap",
8125 "frameBorder",
8126 "contentEditable"
8127], function() {
8128 jQuery.propFix[ this.toLowerCase() ] = this;
8129} );
8130
8131
8132
8133
8134 // Strip and collapse whitespace according to HTML spec
8135 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
8136 function stripAndCollapse( value ) {
8137 var tokens = value.match( rnothtmlwhite ) || [];
8138 return tokens.join( " " );
8139 }
8140
8141
8142function getClass( elem ) {
8143 return elem.getAttribute && elem.getAttribute( "class" ) || "";
8144}
8145
8146function classesToArray( value ) {
8147 if ( Array.isArray( value ) ) {
8148 return value;
8149 }
8150 if ( typeof value === "string" ) {
8151 return value.match( rnothtmlwhite ) || [];
8152 }
8153 return [];
8154}
8155
8156jQuery.fn.extend( {
8157 addClass: function( value ) {
8158 var classNames, cur, curValue, className, i, finalValue;
8159
8160 if ( isFunction( value ) ) {
8161 return this.each( function( j ) {
8162 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
8163 } );
8164 }
8165
8166 classNames = classesToArray( value );
8167
8168 if ( classNames.length ) {
8169 return this.each( function() {
8170 curValue = getClass( this );
8171 cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8172
8173 if ( cur ) {
8174 for ( i = 0; i < classNames.length; i++ ) {
8175 className = classNames[ i ];
8176 if ( cur.indexOf( " " + className + " " ) < 0 ) {
8177 cur += className + " ";
8178 }
8179 }
8180
8181 // Only assign if different to avoid unneeded rendering.
8182 finalValue = stripAndCollapse( cur );
8183 if ( curValue !== finalValue ) {
8184 this.setAttribute( "class", finalValue );
8185 }
8186 }
8187 } );
8188 }
8189
8190 return this;
8191 },
8192
8193 removeClass: function( value ) {
8194 var classNames, cur, curValue, className, i, finalValue;
8195
8196 if ( isFunction( value ) ) {
8197 return this.each( function( j ) {
8198 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
8199 } );
8200 }
8201
8202 if ( !arguments.length ) {
8203 return this.attr( "class", "" );
8204 }
8205
8206 classNames = classesToArray( value );
8207
8208 if ( classNames.length ) {
8209 return this.each( function() {
8210 curValue = getClass( this );
8211
8212 // This expression is here for better compressibility (see addClass)
8213 cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8214
8215 if ( cur ) {
8216 for ( i = 0; i < classNames.length; i++ ) {
8217 className = classNames[ i ];
8218
8219 // Remove *all* instances
8220 while ( cur.indexOf( " " + className + " " ) > -1 ) {
8221 cur = cur.replace( " " + className + " ", " " );
8222 }
8223 }
8224
8225 // Only assign if different to avoid unneeded rendering.
8226 finalValue = stripAndCollapse( cur );
8227 if ( curValue !== finalValue ) {
8228 this.setAttribute( "class", finalValue );
8229 }
8230 }
8231 } );
8232 }
8233
8234 return this;
8235 },
8236
8237 toggleClass: function( value, stateVal ) {
8238 var classNames, className, i, self,
8239 type = typeof value,
8240 isValidValue = type === "string" || Array.isArray( value );
8241
8242 if ( isFunction( value ) ) {
8243 return this.each( function( i ) {
8244 jQuery( this ).toggleClass(
8245 value.call( this, i, getClass( this ), stateVal ),
8246 stateVal
8247 );
8248 } );
8249 }
8250
8251 if ( typeof stateVal === "boolean" && isValidValue ) {
8252 return stateVal ? this.addClass( value ) : this.removeClass( value );
8253 }
8254
8255 classNames = classesToArray( value );
8256
8257 return this.each( function() {
8258 if ( isValidValue ) {
8259
8260 // Toggle individual class names
8261 self = jQuery( this );
8262
8263 for ( i = 0; i < classNames.length; i++ ) {
8264 className = classNames[ i ];
8265
8266 // Check each className given, space separated list
8267 if ( self.hasClass( className ) ) {
8268 self.removeClass( className );
8269 } else {
8270 self.addClass( className );
8271 }
8272 }
8273
8274 // Toggle whole class name
8275 } else if ( value === undefined || type === "boolean" ) {
8276 className = getClass( this );
8277 if ( className ) {
8278
8279 // Store className if set
8280 dataPriv.set( this, "__className__", className );
8281 }
8282
8283 // If the element has a class name or if we're passed `false`,
8284 // then remove the whole classname (if there was one, the above saved it).
8285 // Otherwise bring back whatever was previously saved (if anything),
8286 // falling back to the empty string if nothing was stored.
8287 if ( this.setAttribute ) {
8288 this.setAttribute( "class",
8289 className || value === false ?
8290 "" :
8291 dataPriv.get( this, "__className__" ) || ""
8292 );
8293 }
8294 }
8295 } );
8296 },
8297
8298 hasClass: function( selector ) {
8299 var className, elem,
8300 i = 0;
8301
8302 className = " " + selector + " ";
8303 while ( ( elem = this[ i++ ] ) ) {
8304 if ( elem.nodeType === 1 &&
8305 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8306 return true;
8307 }
8308 }
8309
8310 return false;
8311 }
8312} );
8313
8314
8315
8316
8317var rreturn = /\r/g;
8318
8319jQuery.fn.extend( {
8320 val: function( value ) {
8321 var hooks, ret, valueIsFunction,
8322 elem = this[ 0 ];
8323
8324 if ( !arguments.length ) {
8325 if ( elem ) {
8326 hooks = jQuery.valHooks[ elem.type ] ||
8327 jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8328
8329 if ( hooks &&
8330 "get" in hooks &&
8331 ( ret = hooks.get( elem, "value" ) ) !== undefined
8332 ) {
8333 return ret;
8334 }
8335
8336 ret = elem.value;
8337
8338 // Handle most common string cases
8339 if ( typeof ret === "string" ) {
8340 return ret.replace( rreturn, "" );
8341 }
8342
8343 // Handle cases where value is null/undef or number
8344 return ret == null ? "" : ret;
8345 }
8346
8347 return;
8348 }
8349
8350 valueIsFunction = isFunction( value );
8351
8352 return this.each( function( i ) {
8353 var val;
8354
8355 if ( this.nodeType !== 1 ) {
8356 return;
8357 }
8358
8359 if ( valueIsFunction ) {
8360 val = value.call( this, i, jQuery( this ).val() );
8361 } else {
8362 val = value;
8363 }
8364
8365 // Treat null/undefined as ""; convert numbers to string
8366 if ( val == null ) {
8367 val = "";
8368
8369 } else if ( typeof val === "number" ) {
8370 val += "";
8371
8372 } else if ( Array.isArray( val ) ) {
8373 val = jQuery.map( val, function( value ) {
8374 return value == null ? "" : value + "";
8375 } );
8376 }
8377
8378 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8379
8380 // If set returns undefined, fall back to normal setting
8381 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8382 this.value = val;
8383 }
8384 } );
8385 }
8386} );
8387
8388jQuery.extend( {
8389 valHooks: {
8390 option: {
8391 get: function( elem ) {
8392
8393 var val = jQuery.find.attr( elem, "value" );
8394 return val != null ?
8395 val :
8396
8397 // Support: IE <=10 - 11 only
8398 // option.text throws exceptions (trac-14686, trac-14858)
8399 // Strip and collapse whitespace
8400 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8401 stripAndCollapse( jQuery.text( elem ) );
8402 }
8403 },
8404 select: {
8405 get: function( elem ) {
8406 var value, option, i,
8407 options = elem.options,
8408 index = elem.selectedIndex,
8409 one = elem.type === "select-one",
8410 values = one ? null : [],
8411 max = one ? index + 1 : options.length;
8412
8413 if ( index < 0 ) {
8414 i = max;
8415
8416 } else {
8417 i = one ? index : 0;
8418 }
8419
8420 // Loop through all the selected options
8421 for ( ; i < max; i++ ) {
8422 option = options[ i ];
8423
8424 // Support: IE <=9 only
8425 // IE8-9 doesn't update selected after form reset (trac-2551)
8426 if ( ( option.selected || i === index ) &&
8427
8428 // Don't return options that are disabled or in a disabled optgroup
8429 !option.disabled &&
8430 ( !option.parentNode.disabled ||
8431 !nodeName( option.parentNode, "optgroup" ) ) ) {
8432
8433 // Get the specific value for the option
8434 value = jQuery( option ).val();
8435
8436 // We don't need an array for one selects
8437 if ( one ) {
8438 return value;
8439 }
8440
8441 // Multi-Selects return an array
8442 values.push( value );
8443 }
8444 }
8445
8446 return values;
8447 },
8448
8449 set: function( elem, value ) {
8450 var optionSet, option,
8451 options = elem.options,
8452 values = jQuery.makeArray( value ),
8453 i = options.length;
8454
8455 while ( i-- ) {
8456 option = options[ i ];
8457
8458 /* eslint-disable no-cond-assign */
8459
8460 if ( option.selected =
8461 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8462 ) {
8463 optionSet = true;
8464 }
8465
8466 /* eslint-enable no-cond-assign */
8467 }
8468
8469 // Force browsers to behave consistently when non-matching value is set
8470 if ( !optionSet ) {
8471 elem.selectedIndex = -1;
8472 }
8473 return values;
8474 }
8475 }
8476 }
8477} );
8478
8479// Radios and checkboxes getter/setter
8480jQuery.each( [ "radio", "checkbox" ], function() {
8481 jQuery.valHooks[ this ] = {
8482 set: function( elem, value ) {
8483 if ( Array.isArray( value ) ) {
8484 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8485 }
8486 }
8487 };
8488 if ( !support.checkOn ) {
8489 jQuery.valHooks[ this ].get = function( elem ) {
8490 return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8491 };
8492 }
8493} );
8494
8495
8496
8497
8498// Return jQuery for attributes-only inclusion
8499var location = window.location;
8500
8501var nonce = { guid: Date.now() };
8502
8503var rquery = ( /\?/ );
8504
8505
8506
8507// Cross-browser xml parsing
8508jQuery.parseXML = function( data ) {
8509 var xml, parserErrorElem;
8510 if ( !data || typeof data !== "string" ) {
8511 return null;
8512 }
8513
8514 // Support: IE 9 - 11 only
8515 // IE throws on parseFromString with invalid input.
8516 try {
8517 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8518 } catch ( e ) {}
8519
8520 parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
8521 if ( !xml || parserErrorElem ) {
8522 jQuery.error( "Invalid XML: " + (
8523 parserErrorElem ?
8524 jQuery.map( parserErrorElem.childNodes, function( el ) {
8525 return el.textContent;
8526 } ).join( "\n" ) :
8527 data
8528 ) );
8529 }
8530 return xml;
8531};
8532
8533
8534var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8535 stopPropagationCallback = function( e ) {
8536 e.stopPropagation();
8537 };
8538
8539jQuery.extend( jQuery.event, {
8540
8541 trigger: function( event, data, elem, onlyHandlers ) {
8542
8543 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8544 eventPath = [ elem || document ],
8545 type = hasOwn.call( event, "type" ) ? event.type : event,
8546 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8547
8548 cur = lastElement = tmp = elem = elem || document;
8549
8550 // Don't do events on text and comment nodes
8551 if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8552 return;
8553 }
8554
8555 // focus/blur morphs to focusin/out; ensure we're not firing them right now
8556 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8557 return;
8558 }
8559
8560 if ( type.indexOf( "." ) > -1 ) {
8561
8562 // Namespaced trigger; create a regexp to match event type in handle()
8563 namespaces = type.split( "." );
8564 type = namespaces.shift();
8565 namespaces.sort();
8566 }
8567 ontype = type.indexOf( ":" ) < 0 && "on" + type;
8568
8569 // Caller can pass in a jQuery.Event object, Object, or just an event type string
8570 event = event[ jQuery.expando ] ?
8571 event :
8572 new jQuery.Event( type, typeof event === "object" && event );
8573
8574 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8575 event.isTrigger = onlyHandlers ? 2 : 3;
8576 event.namespace = namespaces.join( "." );
8577 event.rnamespace = event.namespace ?
8578 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8579 null;
8580
8581 // Clean up the event in case it is being reused
8582 event.result = undefined;
8583 if ( !event.target ) {
8584 event.target = elem;
8585 }
8586
8587 // Clone any incoming data and prepend the event, creating the handler arg list
8588 data = data == null ?
8589 [ event ] :
8590 jQuery.makeArray( data, [ event ] );
8591
8592 // Allow special events to draw outside the lines
8593 special = jQuery.event.special[ type ] || {};
8594 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8595 return;
8596 }
8597
8598 // Determine event propagation path in advance, per W3C events spec (trac-9951)
8599 // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
8600 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8601
8602 bubbleType = special.delegateType || type;
8603 if ( !rfocusMorph.test( bubbleType + type ) ) {
8604 cur = cur.parentNode;
8605 }
8606 for ( ; cur; cur = cur.parentNode ) {
8607 eventPath.push( cur );
8608 tmp = cur;
8609 }
8610
8611 // Only add window if we got to document (e.g., not plain obj or detached DOM)
8612 if ( tmp === ( elem.ownerDocument || document ) ) {
8613 eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8614 }
8615 }
8616
8617 // Fire handlers on the event path
8618 i = 0;
8619 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8620 lastElement = cur;
8621 event.type = i > 1 ?
8622 bubbleType :
8623 special.bindType || type;
8624
8625 // jQuery handler
8626 handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
8627 dataPriv.get( cur, "handle" );
8628 if ( handle ) {
8629 handle.apply( cur, data );
8630 }
8631
8632 // Native handler
8633 handle = ontype && cur[ ontype ];
8634 if ( handle && handle.apply && acceptData( cur ) ) {
8635 event.result = handle.apply( cur, data );
8636 if ( event.result === false ) {
8637 event.preventDefault();
8638 }
8639 }
8640 }
8641 event.type = type;
8642
8643 // If nobody prevented the default action, do it now
8644 if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8645
8646 if ( ( !special._default ||
8647 special._default.apply( eventPath.pop(), data ) === false ) &&
8648 acceptData( elem ) ) {
8649
8650 // Call a native DOM method on the target with the same name as the event.
8651 // Don't do default actions on window, that's where global variables be (trac-6170)
8652 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8653
8654 // Don't re-trigger an onFOO event when we call its FOO() method
8655 tmp = elem[ ontype ];
8656
8657 if ( tmp ) {
8658 elem[ ontype ] = null;
8659 }
8660
8661 // Prevent re-triggering of the same event, since we already bubbled it above
8662 jQuery.event.triggered = type;
8663
8664 if ( event.isPropagationStopped() ) {
8665 lastElement.addEventListener( type, stopPropagationCallback );
8666 }
8667
8668 elem[ type ]();
8669
8670 if ( event.isPropagationStopped() ) {
8671 lastElement.removeEventListener( type, stopPropagationCallback );
8672 }
8673
8674 jQuery.event.triggered = undefined;
8675
8676 if ( tmp ) {
8677 elem[ ontype ] = tmp;
8678 }
8679 }
8680 }
8681 }
8682
8683 return event.result;
8684 },
8685
8686 // Piggyback on a donor event to simulate a different one
8687 // Used only for `focus(in | out)` events
8688 simulate: function( type, elem, event ) {
8689 var e = jQuery.extend(
8690 new jQuery.Event(),
8691 event,
8692 {
8693 type: type,
8694 isSimulated: true
8695 }
8696 );
8697
8698 jQuery.event.trigger( e, null, elem );
8699 }
8700
8701} );
8702
8703jQuery.fn.extend( {
8704
8705 trigger: function( type, data ) {
8706 return this.each( function() {
8707 jQuery.event.trigger( type, data, this );
8708 } );
8709 },
8710 triggerHandler: function( type, data ) {
8711 var elem = this[ 0 ];
8712 if ( elem ) {
8713 return jQuery.event.trigger( type, data, elem, true );
8714 }
8715 }
8716} );
8717
8718
8719var
8720 rbracket = /\[\]$/,
8721 rCRLF = /\r?\n/g,
8722 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8723 rsubmittable = /^(?:input|select|textarea|keygen)/i;
8724
8725function buildParams( prefix, obj, traditional, add ) {
8726 var name;
8727
8728 if ( Array.isArray( obj ) ) {
8729
8730 // Serialize array item.
8731 jQuery.each( obj, function( i, v ) {
8732 if ( traditional || rbracket.test( prefix ) ) {
8733
8734 // Treat each array item as a scalar.
8735 add( prefix, v );
8736
8737 } else {
8738
8739 // Item is non-scalar (array or object), encode its numeric index.
8740 buildParams(
8741 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8742 v,
8743 traditional,
8744 add
8745 );
8746 }
8747 } );
8748
8749 } else if ( !traditional && toType( obj ) === "object" ) {
8750
8751 // Serialize object item.
8752 for ( name in obj ) {
8753 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8754 }
8755
8756 } else {
8757
8758 // Serialize scalar item.
8759 add( prefix, obj );
8760 }
8761}
8762
8763// Serialize an array of form elements or a set of
8764// key/values into a query string
8765jQuery.param = function( a, traditional ) {
8766 var prefix,
8767 s = [],
8768 add = function( key, valueOrFunction ) {
8769
8770 // If value is a function, invoke it and use its return value
8771 var value = isFunction( valueOrFunction ) ?
8772 valueOrFunction() :
8773 valueOrFunction;
8774
8775 s[ s.length ] = encodeURIComponent( key ) + "=" +
8776 encodeURIComponent( value == null ? "" : value );
8777 };
8778
8779 if ( a == null ) {
8780 return "";
8781 }
8782
8783 // If an array was passed in, assume that it is an array of form elements.
8784 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8785
8786 // Serialize the form elements
8787 jQuery.each( a, function() {
8788 add( this.name, this.value );
8789 } );
8790
8791 } else {
8792
8793 // If traditional, encode the "old" way (the way 1.3.2 or older
8794 // did it), otherwise encode params recursively.
8795 for ( prefix in a ) {
8796 buildParams( prefix, a[ prefix ], traditional, add );
8797 }
8798 }
8799
8800 // Return the resulting serialization
8801 return s.join( "&" );
8802};
8803
8804jQuery.fn.extend( {
8805 serialize: function() {
8806 return jQuery.param( this.serializeArray() );
8807 },
8808 serializeArray: function() {
8809 return this.map( function() {
8810
8811 // Can add propHook for "elements" to filter or add form elements
8812 var elements = jQuery.prop( this, "elements" );
8813 return elements ? jQuery.makeArray( elements ) : this;
8814 } ).filter( function() {
8815 var type = this.type;
8816
8817 // Use .is( ":disabled" ) so that fieldset[disabled] works
8818 return this.name && !jQuery( this ).is( ":disabled" ) &&
8819 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8820 ( this.checked || !rcheckableType.test( type ) );
8821 } ).map( function( _i, elem ) {
8822 var val = jQuery( this ).val();
8823
8824 if ( val == null ) {
8825 return null;
8826 }
8827
8828 if ( Array.isArray( val ) ) {
8829 return jQuery.map( val, function( val ) {
8830 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8831 } );
8832 }
8833
8834 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8835 } ).get();
8836 }
8837} );
8838
8839
8840var
8841 r20 = /%20/g,
8842 rhash = /#.*$/,
8843 rantiCache = /([?&])_=[^&]*/,
8844 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8845
8846 // trac-7653, trac-8125, trac-8152: local protocol detection
8847 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8848 rnoContent = /^(?:GET|HEAD)$/,
8849 rprotocol = /^\/\//,
8850
8851 /* Prefilters
8852 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8853 * 2) These are called:
8854 * - BEFORE asking for a transport
8855 * - AFTER param serialization (s.data is a string if s.processData is true)
8856 * 3) key is the dataType
8857 * 4) the catchall symbol "*" can be used
8858 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8859 */
8860 prefilters = {},
8861
8862 /* Transports bindings
8863 * 1) key is the dataType
8864 * 2) the catchall symbol "*" can be used
8865 * 3) selection will start with transport dataType and THEN go to "*" if needed
8866 */
8867 transports = {},
8868
8869 // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
8870 allTypes = "*/".concat( "*" ),
8871
8872 // Anchor tag for parsing the document origin
8873 originAnchor = document.createElement( "a" );
8874
8875originAnchor.href = location.href;
8876
8877// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8878function addToPrefiltersOrTransports( structure ) {
8879
8880 // dataTypeExpression is optional and defaults to "*"
8881 return function( dataTypeExpression, func ) {
8882
8883 if ( typeof dataTypeExpression !== "string" ) {
8884 func = dataTypeExpression;
8885 dataTypeExpression = "*";
8886 }
8887
8888 var dataType,
8889 i = 0,
8890 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8891
8892 if ( isFunction( func ) ) {
8893
8894 // For each dataType in the dataTypeExpression
8895 while ( ( dataType = dataTypes[ i++ ] ) ) {
8896
8897 // Prepend if requested
8898 if ( dataType[ 0 ] === "+" ) {
8899 dataType = dataType.slice( 1 ) || "*";
8900 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
8901
8902 // Otherwise append
8903 } else {
8904 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
8905 }
8906 }
8907 }
8908 };
8909}
8910
8911// Base inspection function for prefilters and transports
8912function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8913
8914 var inspected = {},
8915 seekingTransport = ( structure === transports );
8916
8917 function inspect( dataType ) {
8918 var selected;
8919 inspected[ dataType ] = true;
8920 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8921 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8922 if ( typeof dataTypeOrTransport === "string" &&
8923 !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8924
8925 options.dataTypes.unshift( dataTypeOrTransport );
8926 inspect( dataTypeOrTransport );
8927 return false;
8928 } else if ( seekingTransport ) {
8929 return !( selected = dataTypeOrTransport );
8930 }
8931 } );
8932 return selected;
8933 }
8934
8935 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8936}
8937
8938// A special extend for ajax options
8939// that takes "flat" options (not to be deep extended)
8940// Fixes trac-9887
8941function ajaxExtend( target, src ) {
8942 var key, deep,
8943 flatOptions = jQuery.ajaxSettings.flatOptions || {};
8944
8945 for ( key in src ) {
8946 if ( src[ key ] !== undefined ) {
8947 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
8948 }
8949 }
8950 if ( deep ) {
8951 jQuery.extend( true, target, deep );
8952 }
8953
8954 return target;
8955}
8956
8957/* Handles responses to an ajax request:
8958 * - finds the right dataType (mediates between content-type and expected dataType)
8959 * - returns the corresponding response
8960 */
8961function ajaxHandleResponses( s, jqXHR, responses ) {
8962
8963 var ct, type, finalDataType, firstDataType,
8964 contents = s.contents,
8965 dataTypes = s.dataTypes;
8966
8967 // Remove auto dataType and get content-type in the process
8968 while ( dataTypes[ 0 ] === "*" ) {
8969 dataTypes.shift();
8970 if ( ct === undefined ) {
8971 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
8972 }
8973 }
8974
8975 // Check if we're dealing with a known content-type
8976 if ( ct ) {
8977 for ( type in contents ) {
8978 if ( contents[ type ] && contents[ type ].test( ct ) ) {
8979 dataTypes.unshift( type );
8980 break;
8981 }
8982 }
8983 }
8984
8985 // Check to see if we have a response for the expected dataType
8986 if ( dataTypes[ 0 ] in responses ) {
8987 finalDataType = dataTypes[ 0 ];
8988 } else {
8989
8990 // Try convertible dataTypes
8991 for ( type in responses ) {
8992 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
8993 finalDataType = type;
8994 break;
8995 }
8996 if ( !firstDataType ) {
8997 firstDataType = type;
8998 }
8999 }
9000
9001 // Or just use first one
9002 finalDataType = finalDataType || firstDataType;
9003 }
9004
9005 // If we found a dataType
9006 // We add the dataType to the list if needed
9007 // and return the corresponding response
9008 if ( finalDataType ) {
9009 if ( finalDataType !== dataTypes[ 0 ] ) {
9010 dataTypes.unshift( finalDataType );
9011 }
9012 return responses[ finalDataType ];
9013 }
9014}
9015
9016/* Chain conversions given the request and the original response
9017 * Also sets the responseXXX fields on the jqXHR instance
9018 */
9019function ajaxConvert( s, response, jqXHR, isSuccess ) {
9020 var conv2, current, conv, tmp, prev,
9021 converters = {},
9022
9023 // Work with a copy of dataTypes in case we need to modify it for conversion
9024 dataTypes = s.dataTypes.slice();
9025
9026 // Create converters map with lowercased keys
9027 if ( dataTypes[ 1 ] ) {
9028 for ( conv in s.converters ) {
9029 converters[ conv.toLowerCase() ] = s.converters[ conv ];
9030 }
9031 }
9032
9033 current = dataTypes.shift();
9034
9035 // Convert to each sequential dataType
9036 while ( current ) {
9037
9038 if ( s.responseFields[ current ] ) {
9039 jqXHR[ s.responseFields[ current ] ] = response;
9040 }
9041
9042 // Apply the dataFilter if provided
9043 if ( !prev && isSuccess && s.dataFilter ) {
9044 response = s.dataFilter( response, s.dataType );
9045 }
9046
9047 prev = current;
9048 current = dataTypes.shift();
9049
9050 if ( current ) {
9051
9052 // There's only work to do if current dataType is non-auto
9053 if ( current === "*" ) {
9054
9055 current = prev;
9056
9057 // Convert response if prev dataType is non-auto and differs from current
9058 } else if ( prev !== "*" && prev !== current ) {
9059
9060 // Seek a direct converter
9061 conv = converters[ prev + " " + current ] || converters[ "* " + current ];
9062
9063 // If none found, seek a pair
9064 if ( !conv ) {
9065 for ( conv2 in converters ) {
9066
9067 // If conv2 outputs current
9068 tmp = conv2.split( " " );
9069 if ( tmp[ 1 ] === current ) {
9070
9071 // If prev can be converted to accepted input
9072 conv = converters[ prev + " " + tmp[ 0 ] ] ||
9073 converters[ "* " + tmp[ 0 ] ];
9074 if ( conv ) {
9075
9076 // Condense equivalence converters
9077 if ( conv === true ) {
9078 conv = converters[ conv2 ];
9079
9080 // Otherwise, insert the intermediate dataType
9081 } else if ( converters[ conv2 ] !== true ) {
9082 current = tmp[ 0 ];
9083 dataTypes.unshift( tmp[ 1 ] );
9084 }
9085 break;
9086 }
9087 }
9088 }
9089 }
9090
9091 // Apply converter (if not an equivalence)
9092 if ( conv !== true ) {
9093
9094 // Unless errors are allowed to bubble, catch and return them
9095 if ( conv && s.throws ) {
9096 response = conv( response );
9097 } else {
9098 try {
9099 response = conv( response );
9100 } catch ( e ) {
9101 return {
9102 state: "parsererror",
9103 error: conv ? e : "No conversion from " + prev + " to " + current
9104 };
9105 }
9106 }
9107 }
9108 }
9109 }
9110 }
9111
9112 return { state: "success", data: response };
9113}
9114
9115jQuery.extend( {
9116
9117 // Counter for holding the number of active queries
9118 active: 0,
9119
9120 // Last-Modified header cache for next request
9121 lastModified: {},
9122 etag: {},
9123
9124 ajaxSettings: {
9125 url: location.href,
9126 type: "GET",
9127 isLocal: rlocalProtocol.test( location.protocol ),
9128 global: true,
9129 processData: true,
9130 async: true,
9131 contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9132
9133 /*
9134 timeout: 0,
9135 data: null,
9136 dataType: null,
9137 username: null,
9138 password: null,
9139 cache: null,
9140 throws: false,
9141 traditional: false,
9142 headers: {},
9143 */
9144
9145 accepts: {
9146 "*": allTypes,
9147 text: "text/plain",
9148 html: "text/html",
9149 xml: "application/xml, text/xml",
9150 json: "application/json, text/javascript"
9151 },
9152
9153 contents: {
9154 xml: /\bxml\b/,
9155 html: /\bhtml/,
9156 json: /\bjson\b/
9157 },
9158
9159 responseFields: {
9160 xml: "responseXML",
9161 text: "responseText",
9162 json: "responseJSON"
9163 },
9164
9165 // Data converters
9166 // Keys separate source (or catchall "*") and destination types with a single space
9167 converters: {
9168
9169 // Convert anything to text
9170 "* text": String,
9171
9172 // Text to html (true = no transformation)
9173 "text html": true,
9174
9175 // Evaluate text as a json expression
9176 "text json": JSON.parse,
9177
9178 // Parse text as xml
9179 "text xml": jQuery.parseXML
9180 },
9181
9182 // For options that shouldn't be deep extended:
9183 // you can add your own custom options here if
9184 // and when you create one that shouldn't be
9185 // deep extended (see ajaxExtend)
9186 flatOptions: {
9187 url: true,
9188 context: true
9189 }
9190 },
9191
9192 // Creates a full fledged settings object into target
9193 // with both ajaxSettings and settings fields.
9194 // If target is omitted, writes into ajaxSettings.
9195 ajaxSetup: function( target, settings ) {
9196 return settings ?
9197
9198 // Building a settings object
9199 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9200
9201 // Extending ajaxSettings
9202 ajaxExtend( jQuery.ajaxSettings, target );
9203 },
9204
9205 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9206 ajaxTransport: addToPrefiltersOrTransports( transports ),
9207
9208 // Main method
9209 ajax: function( url, options ) {
9210
9211 // If url is an object, simulate pre-1.5 signature
9212 if ( typeof url === "object" ) {
9213 options = url;
9214 url = undefined;
9215 }
9216
9217 // Force options to be an object
9218 options = options || {};
9219
9220 var transport,
9221
9222 // URL without anti-cache param
9223 cacheURL,
9224
9225 // Response headers
9226 responseHeadersString,
9227 responseHeaders,
9228
9229 // timeout handle
9230 timeoutTimer,
9231
9232 // Url cleanup var
9233 urlAnchor,
9234
9235 // Request state (becomes false upon send and true upon completion)
9236 completed,
9237
9238 // To know if global events are to be dispatched
9239 fireGlobals,
9240
9241 // Loop variable
9242 i,
9243
9244 // uncached part of the url
9245 uncached,
9246
9247 // Create the final options object
9248 s = jQuery.ajaxSetup( {}, options ),
9249
9250 // Callbacks context
9251 callbackContext = s.context || s,
9252
9253 // Context for global events is callbackContext if it is a DOM node or jQuery collection
9254 globalEventContext = s.context &&
9255 ( callbackContext.nodeType || callbackContext.jquery ) ?
9256 jQuery( callbackContext ) :
9257 jQuery.event,
9258
9259 // Deferreds
9260 deferred = jQuery.Deferred(),
9261 completeDeferred = jQuery.Callbacks( "once memory" ),
9262
9263 // Status-dependent callbacks
9264 statusCode = s.statusCode || {},
9265
9266 // Headers (they are sent all at once)
9267 requestHeaders = {},
9268 requestHeadersNames = {},
9269
9270 // Default abort message
9271 strAbort = "canceled",
9272
9273 // Fake xhr
9274 jqXHR = {
9275 readyState: 0,
9276
9277 // Builds headers hashtable if needed
9278 getResponseHeader: function( key ) {
9279 var match;
9280 if ( completed ) {
9281 if ( !responseHeaders ) {
9282 responseHeaders = {};
9283 while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9284 responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9285 ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9286 .concat( match[ 2 ] );
9287 }
9288 }
9289 match = responseHeaders[ key.toLowerCase() + " " ];
9290 }
9291 return match == null ? null : match.join( ", " );
9292 },
9293
9294 // Raw string
9295 getAllResponseHeaders: function() {
9296 return completed ? responseHeadersString : null;
9297 },
9298
9299 // Caches the header
9300 setRequestHeader: function( name, value ) {
9301 if ( completed == null ) {
9302 name = requestHeadersNames[ name.toLowerCase() ] =
9303 requestHeadersNames[ name.toLowerCase() ] || name;
9304 requestHeaders[ name ] = value;
9305 }
9306 return this;
9307 },
9308
9309 // Overrides response content-type header
9310 overrideMimeType: function( type ) {
9311 if ( completed == null ) {
9312 s.mimeType = type;
9313 }
9314 return this;
9315 },
9316
9317 // Status-dependent callbacks
9318 statusCode: function( map ) {
9319 var code;
9320 if ( map ) {
9321 if ( completed ) {
9322
9323 // Execute the appropriate callbacks
9324 jqXHR.always( map[ jqXHR.status ] );
9325 } else {
9326
9327 // Lazy-add the new callbacks in a way that preserves old ones
9328 for ( code in map ) {
9329 statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9330 }
9331 }
9332 }
9333 return this;
9334 },
9335
9336 // Cancel the request
9337 abort: function( statusText ) {
9338 var finalText = statusText || strAbort;
9339 if ( transport ) {
9340 transport.abort( finalText );
9341 }
9342 done( 0, finalText );
9343 return this;
9344 }
9345 };
9346
9347 // Attach deferreds
9348 deferred.promise( jqXHR );
9349
9350 // Add protocol if not provided (prefilters might expect it)
9351 // Handle falsy url in the settings object (trac-10093: consistency with old signature)
9352 // We also use the url parameter if available
9353 s.url = ( ( url || s.url || location.href ) + "" )
9354 .replace( rprotocol, location.protocol + "//" );
9355
9356 // Alias method option to type as per ticket trac-12004
9357 s.type = options.method || options.type || s.method || s.type;
9358
9359 // Extract dataTypes list
9360 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9361
9362 // A cross-domain request is in order when the origin doesn't match the current origin.
9363 if ( s.crossDomain == null ) {
9364 urlAnchor = document.createElement( "a" );
9365
9366 // Support: IE <=8 - 11, Edge 12 - 15
9367 // IE throws exception on accessing the href property if url is malformed,
9368 // e.g. http://example.com:80x/
9369 try {
9370 urlAnchor.href = s.url;
9371
9372 // Support: IE <=8 - 11 only
9373 // Anchor's host property isn't correctly set when s.url is relative
9374 urlAnchor.href = urlAnchor.href;
9375 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9376 urlAnchor.protocol + "//" + urlAnchor.host;
9377 } catch ( e ) {
9378
9379 // If there is an error parsing the URL, assume it is crossDomain,
9380 // it can be rejected by the transport if it is invalid
9381 s.crossDomain = true;
9382 }
9383 }
9384
9385 // Convert data if not already a string
9386 if ( s.data && s.processData && typeof s.data !== "string" ) {
9387 s.data = jQuery.param( s.data, s.traditional );
9388 }
9389
9390 // Apply prefilters
9391 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9392
9393 // If request was aborted inside a prefilter, stop there
9394 if ( completed ) {
9395 return jqXHR;
9396 }
9397
9398 // We can fire global events as of now if asked to
9399 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
9400 fireGlobals = jQuery.event && s.global;
9401
9402 // Watch for a new set of requests
9403 if ( fireGlobals && jQuery.active++ === 0 ) {
9404 jQuery.event.trigger( "ajaxStart" );
9405 }
9406
9407 // Uppercase the type
9408 s.type = s.type.toUpperCase();
9409
9410 // Determine if request has content
9411 s.hasContent = !rnoContent.test( s.type );
9412
9413 // Save the URL in case we're toying with the If-Modified-Since
9414 // and/or If-None-Match header later on
9415 // Remove hash to simplify url manipulation
9416 cacheURL = s.url.replace( rhash, "" );
9417
9418 // More options handling for requests with no content
9419 if ( !s.hasContent ) {
9420
9421 // Remember the hash so we can put it back
9422 uncached = s.url.slice( cacheURL.length );
9423
9424 // If data is available and should be processed, append data to url
9425 if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9426 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9427
9428 // trac-9682: remove data so that it's not used in an eventual retry
9429 delete s.data;
9430 }
9431
9432 // Add or update anti-cache param if needed
9433 if ( s.cache === false ) {
9434 cacheURL = cacheURL.replace( rantiCache, "$1" );
9435 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9436 uncached;
9437 }
9438
9439 // Put hash and anti-cache on the URL that will be requested (gh-1732)
9440 s.url = cacheURL + uncached;
9441
9442 // Change '%20' to '+' if this is encoded form body content (gh-2658)
9443 } else if ( s.data && s.processData &&
9444 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9445 s.data = s.data.replace( r20, "+" );
9446 }
9447
9448 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9449 if ( s.ifModified ) {
9450 if ( jQuery.lastModified[ cacheURL ] ) {
9451 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9452 }
9453 if ( jQuery.etag[ cacheURL ] ) {
9454 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9455 }
9456 }
9457
9458 // Set the correct header, if data is being sent
9459 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9460 jqXHR.setRequestHeader( "Content-Type", s.contentType );
9461 }
9462
9463 // Set the Accepts header for the server, depending on the dataType
9464 jqXHR.setRequestHeader(
9465 "Accept",
9466 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9467 s.accepts[ s.dataTypes[ 0 ] ] +
9468 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9469 s.accepts[ "*" ]
9470 );
9471
9472 // Check for headers option
9473 for ( i in s.headers ) {
9474 jqXHR.setRequestHeader( i, s.headers[ i ] );
9475 }
9476
9477 // Allow custom headers/mimetypes and early abort
9478 if ( s.beforeSend &&
9479 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9480
9481 // Abort if not done already and return
9482 return jqXHR.abort();
9483 }
9484
9485 // Aborting is no longer a cancellation
9486 strAbort = "abort";
9487
9488 // Install callbacks on deferreds
9489 completeDeferred.add( s.complete );
9490 jqXHR.done( s.success );
9491 jqXHR.fail( s.error );
9492
9493 // Get transport
9494 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9495
9496 // If no transport, we auto-abort
9497 if ( !transport ) {
9498 done( -1, "No Transport" );
9499 } else {
9500 jqXHR.readyState = 1;
9501
9502 // Send global event
9503 if ( fireGlobals ) {
9504 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9505 }
9506
9507 // If request was aborted inside ajaxSend, stop there
9508 if ( completed ) {
9509 return jqXHR;
9510 }
9511
9512 // Timeout
9513 if ( s.async && s.timeout > 0 ) {
9514 timeoutTimer = window.setTimeout( function() {
9515 jqXHR.abort( "timeout" );
9516 }, s.timeout );
9517 }
9518
9519 try {
9520 completed = false;
9521 transport.send( requestHeaders, done );
9522 } catch ( e ) {
9523
9524 // Rethrow post-completion exceptions
9525 if ( completed ) {
9526 throw e;
9527 }
9528
9529 // Propagate others as results
9530 done( -1, e );
9531 }
9532 }
9533
9534 // Callback for when everything is done
9535 function done( status, nativeStatusText, responses, headers ) {
9536 var isSuccess, success, error, response, modified,
9537 statusText = nativeStatusText;
9538
9539 // Ignore repeat invocations
9540 if ( completed ) {
9541 return;
9542 }
9543
9544 completed = true;
9545
9546 // Clear timeout if it exists
9547 if ( timeoutTimer ) {
9548 window.clearTimeout( timeoutTimer );
9549 }
9550
9551 // Dereference transport for early garbage collection
9552 // (no matter how long the jqXHR object will be used)
9553 transport = undefined;
9554
9555 // Cache response headers
9556 responseHeadersString = headers || "";
9557
9558 // Set readyState
9559 jqXHR.readyState = status > 0 ? 4 : 0;
9560
9561 // Determine if successful
9562 isSuccess = status >= 200 && status < 300 || status === 304;
9563
9564 // Get response data
9565 if ( responses ) {
9566 response = ajaxHandleResponses( s, jqXHR, responses );
9567 }
9568
9569 // Use a noop converter for missing script but not if jsonp
9570 if ( !isSuccess &&
9571 jQuery.inArray( "script", s.dataTypes ) > -1 &&
9572 jQuery.inArray( "json", s.dataTypes ) < 0 ) {
9573 s.converters[ "text script" ] = function() {};
9574 }
9575
9576 // Convert no matter what (that way responseXXX fields are always set)
9577 response = ajaxConvert( s, response, jqXHR, isSuccess );
9578
9579 // If successful, handle type chaining
9580 if ( isSuccess ) {
9581
9582 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9583 if ( s.ifModified ) {
9584 modified = jqXHR.getResponseHeader( "Last-Modified" );
9585 if ( modified ) {
9586 jQuery.lastModified[ cacheURL ] = modified;
9587 }
9588 modified = jqXHR.getResponseHeader( "etag" );
9589 if ( modified ) {
9590 jQuery.etag[ cacheURL ] = modified;
9591 }
9592 }
9593
9594 // if no content
9595 if ( status === 204 || s.type === "HEAD" ) {
9596 statusText = "nocontent";
9597
9598 // if not modified
9599 } else if ( status === 304 ) {
9600 statusText = "notmodified";
9601
9602 // If we have data, let's convert it
9603 } else {
9604 statusText = response.state;
9605 success = response.data;
9606 error = response.error;
9607 isSuccess = !error;
9608 }
9609 } else {
9610
9611 // Extract error from statusText and normalize for non-aborts
9612 error = statusText;
9613 if ( status || !statusText ) {
9614 statusText = "error";
9615 if ( status < 0 ) {
9616 status = 0;
9617 }
9618 }
9619 }
9620
9621 // Set data for the fake xhr object
9622 jqXHR.status = status;
9623 jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9624
9625 // Success/Error
9626 if ( isSuccess ) {
9627 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9628 } else {
9629 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9630 }
9631
9632 // Status-dependent callbacks
9633 jqXHR.statusCode( statusCode );
9634 statusCode = undefined;
9635
9636 if ( fireGlobals ) {
9637 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9638 [ jqXHR, s, isSuccess ? success : error ] );
9639 }
9640
9641 // Complete
9642 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9643
9644 if ( fireGlobals ) {
9645 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9646
9647 // Handle the global AJAX counter
9648 if ( !( --jQuery.active ) ) {
9649 jQuery.event.trigger( "ajaxStop" );
9650 }
9651 }
9652 }
9653
9654 return jqXHR;
9655 },
9656
9657 getJSON: function( url, data, callback ) {
9658 return jQuery.get( url, data, callback, "json" );
9659 },
9660
9661 getScript: function( url, callback ) {
9662 return jQuery.get( url, undefined, callback, "script" );
9663 }
9664} );
9665
9666jQuery.each( [ "get", "post" ], function( _i, method ) {
9667 jQuery[ method ] = function( url, data, callback, type ) {
9668
9669 // Shift arguments if data argument was omitted
9670 if ( isFunction( data ) ) {
9671 type = type || callback;
9672 callback = data;
9673 data = undefined;
9674 }
9675
9676 // The url can be an options object (which then must have .url)
9677 return jQuery.ajax( jQuery.extend( {
9678 url: url,
9679 type: method,
9680 dataType: type,
9681 data: data,
9682 success: callback
9683 }, jQuery.isPlainObject( url ) && url ) );
9684 };
9685} );
9686
9687jQuery.ajaxPrefilter( function( s ) {
9688 var i;
9689 for ( i in s.headers ) {
9690 if ( i.toLowerCase() === "content-type" ) {
9691 s.contentType = s.headers[ i ] || "";
9692 }
9693 }
9694} );
9695
9696
9697jQuery._evalUrl = function( url, options, doc ) {
9698 return jQuery.ajax( {
9699 url: url,
9700
9701 // Make this explicit, since user can override this through ajaxSetup (trac-11264)
9702 type: "GET",
9703 dataType: "script",
9704 cache: true,
9705 async: false,
9706 global: false,
9707
9708 // Only evaluate the response if it is successful (gh-4126)
9709 // dataFilter is not invoked for failure responses, so using it instead
9710 // of the default converter is kludgy but it works.
9711 converters: {
9712 "text script": function() {}
9713 },
9714 dataFilter: function( response ) {
9715 jQuery.globalEval( response, options, doc );
9716 }
9717 } );
9718};
9719
9720
9721jQuery.fn.extend( {
9722 wrapAll: function( html ) {
9723 var wrap;
9724
9725 if ( this[ 0 ] ) {
9726 if ( isFunction( html ) ) {
9727 html = html.call( this[ 0 ] );
9728 }
9729
9730 // The elements to wrap the target around
9731 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9732
9733 if ( this[ 0 ].parentNode ) {
9734 wrap.insertBefore( this[ 0 ] );
9735 }
9736
9737 wrap.map( function() {
9738 var elem = this;
9739
9740 while ( elem.firstElementChild ) {
9741 elem = elem.firstElementChild;
9742 }
9743
9744 return elem;
9745 } ).append( this );
9746 }
9747
9748 return this;
9749 },
9750
9751 wrapInner: function( html ) {
9752 if ( isFunction( html ) ) {
9753 return this.each( function( i ) {
9754 jQuery( this ).wrapInner( html.call( this, i ) );
9755 } );
9756 }
9757
9758 return this.each( function() {
9759 var self = jQuery( this ),
9760 contents = self.contents();
9761
9762 if ( contents.length ) {
9763 contents.wrapAll( html );
9764
9765 } else {
9766 self.append( html );
9767 }
9768 } );
9769 },
9770
9771 wrap: function( html ) {
9772 var htmlIsFunction = isFunction( html );
9773
9774 return this.each( function( i ) {
9775 jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9776 } );
9777 },
9778
9779 unwrap: function( selector ) {
9780 this.parent( selector ).not( "body" ).each( function() {
9781 jQuery( this ).replaceWith( this.childNodes );
9782 } );
9783 return this;
9784 }
9785} );
9786
9787
9788jQuery.expr.pseudos.hidden = function( elem ) {
9789 return !jQuery.expr.pseudos.visible( elem );
9790};
9791jQuery.expr.pseudos.visible = function( elem ) {
9792 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9793};
9794
9795
9796
9797
9798jQuery.ajaxSettings.xhr = function() {
9799 try {
9800 return new window.XMLHttpRequest();
9801 } catch ( e ) {}
9802};
9803
9804var xhrSuccessStatus = {
9805
9806 // File protocol always yields status code 0, assume 200
9807 0: 200,
9808
9809 // Support: IE <=9 only
9810 // trac-1450: sometimes IE returns 1223 when it should be 204
9811 1223: 204
9812 },
9813 xhrSupported = jQuery.ajaxSettings.xhr();
9814
9815support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9816support.ajax = xhrSupported = !!xhrSupported;
9817
9818jQuery.ajaxTransport( function( options ) {
9819 var callback, errorCallback;
9820
9821 // Cross domain only allowed if supported through XMLHttpRequest
9822 if ( support.cors || xhrSupported && !options.crossDomain ) {
9823 return {
9824 send: function( headers, complete ) {
9825 var i,
9826 xhr = options.xhr();
9827
9828 xhr.open(
9829 options.type,
9830 options.url,
9831 options.async,
9832 options.username,
9833 options.password
9834 );
9835
9836 // Apply custom fields if provided
9837 if ( options.xhrFields ) {
9838 for ( i in options.xhrFields ) {
9839 xhr[ i ] = options.xhrFields[ i ];
9840 }
9841 }
9842
9843 // Override mime type if needed
9844 if ( options.mimeType && xhr.overrideMimeType ) {
9845 xhr.overrideMimeType( options.mimeType );
9846 }
9847
9848 // X-Requested-With header
9849 // For cross-domain requests, seeing as conditions for a preflight are
9850 // akin to a jigsaw puzzle, we simply never set it to be sure.
9851 // (it can always be set on a per-request basis or even using ajaxSetup)
9852 // For same-domain requests, won't change header if already provided.
9853 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
9854 headers[ "X-Requested-With" ] = "XMLHttpRequest";
9855 }
9856
9857 // Set headers
9858 for ( i in headers ) {
9859 xhr.setRequestHeader( i, headers[ i ] );
9860 }
9861
9862 // Callback
9863 callback = function( type ) {
9864 return function() {
9865 if ( callback ) {
9866 callback = errorCallback = xhr.onload =
9867 xhr.onerror = xhr.onabort = xhr.ontimeout =
9868 xhr.onreadystatechange = null;
9869
9870 if ( type === "abort" ) {
9871 xhr.abort();
9872 } else if ( type === "error" ) {
9873
9874 // Support: IE <=9 only
9875 // On a manual native abort, IE9 throws
9876 // errors on any property access that is not readyState
9877 if ( typeof xhr.status !== "number" ) {
9878 complete( 0, "error" );
9879 } else {
9880 complete(
9881
9882 // File: protocol always yields status 0; see trac-8605, trac-14207
9883 xhr.status,
9884 xhr.statusText
9885 );
9886 }
9887 } else {
9888 complete(
9889 xhrSuccessStatus[ xhr.status ] || xhr.status,
9890 xhr.statusText,
9891
9892 // Support: IE <=9 only
9893 // IE9 has no XHR2 but throws on binary (trac-11426)
9894 // For XHR2 non-text, let the caller handle it (gh-2498)
9895 ( xhr.responseType || "text" ) !== "text" ||
9896 typeof xhr.responseText !== "string" ?
9897 { binary: xhr.response } :
9898 { text: xhr.responseText },
9899 xhr.getAllResponseHeaders()
9900 );
9901 }
9902 }
9903 };
9904 };
9905
9906 // Listen to events
9907 xhr.onload = callback();
9908 errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
9909
9910 // Support: IE 9 only
9911 // Use onreadystatechange to replace onabort
9912 // to handle uncaught aborts
9913 if ( xhr.onabort !== undefined ) {
9914 xhr.onabort = errorCallback;
9915 } else {
9916 xhr.onreadystatechange = function() {
9917
9918 // Check readyState before timeout as it changes
9919 if ( xhr.readyState === 4 ) {
9920
9921 // Allow onerror to be called first,
9922 // but that will not handle a native abort
9923 // Also, save errorCallback to a variable
9924 // as xhr.onerror cannot be accessed
9925 window.setTimeout( function() {
9926 if ( callback ) {
9927 errorCallback();
9928 }
9929 } );
9930 }
9931 };
9932 }
9933
9934 // Create the abort callback
9935 callback = callback( "abort" );
9936
9937 try {
9938
9939 // Do send the request (this may raise an exception)
9940 xhr.send( options.hasContent && options.data || null );
9941 } catch ( e ) {
9942
9943 // trac-14683: Only rethrow if this hasn't been notified as an error yet
9944 if ( callback ) {
9945 throw e;
9946 }
9947 }
9948 },
9949
9950 abort: function() {
9951 if ( callback ) {
9952 callback();
9953 }
9954 }
9955 };
9956 }
9957} );
9958
9959
9960
9961
9962// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
9963jQuery.ajaxPrefilter( function( s ) {
9964 if ( s.crossDomain ) {
9965 s.contents.script = false;
9966 }
9967} );
9968
9969// Install script dataType
9970jQuery.ajaxSetup( {
9971 accepts: {
9972 script: "text/javascript, application/javascript, " +
9973 "application/ecmascript, application/x-ecmascript"
9974 },
9975 contents: {
9976 script: /\b(?:java|ecma)script\b/
9977 },
9978 converters: {
9979 "text script": function( text ) {
9980 jQuery.globalEval( text );
9981 return text;
9982 }
9983 }
9984} );
9985
9986// Handle cache's special case and crossDomain
9987jQuery.ajaxPrefilter( "script", function( s ) {
9988 if ( s.cache === undefined ) {
9989 s.cache = false;
9990 }
9991 if ( s.crossDomain ) {
9992 s.type = "GET";
9993 }
9994} );
9995
9996// Bind script tag hack transport
9997jQuery.ajaxTransport( "script", function( s ) {
9998
9999 // This transport only deals with cross domain or forced-by-attrs requests
10000 if ( s.crossDomain || s.scriptAttrs ) {
10001 var script, callback;
10002 return {
10003 send: function( _, complete ) {
10004 script = jQuery( "<script>" )
10005 .attr( s.scriptAttrs || {} )
10006 .prop( { charset: s.scriptCharset, src: s.url } )
10007 .on( "load error", callback = function( evt ) {
10008 script.remove();
10009 callback = null;
10010 if ( evt ) {
10011 complete( evt.type === "error" ? 404 : 200, evt.type );
10012 }
10013 } );
10014
10015 // Use native DOM manipulation to avoid our domManip AJAX trickery
10016 document.head.appendChild( script[ 0 ] );
10017 },
10018 abort: function() {
10019 if ( callback ) {
10020 callback();
10021 }
10022 }
10023 };
10024 }
10025} );
10026
10027
10028
10029
10030var oldCallbacks = [],
10031 rjsonp = /(=)\?(?=&|$)|\?\?/;
10032
10033// Default jsonp settings
10034jQuery.ajaxSetup( {
10035 jsonp: "callback",
10036 jsonpCallback: function() {
10037 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
10038 this[ callback ] = true;
10039 return callback;
10040 }
10041} );
10042
10043// Detect, normalize options and install callbacks for jsonp requests
10044jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
10045
10046 var callbackName, overwritten, responseContainer,
10047 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
10048 "url" :
10049 typeof s.data === "string" &&
10050 ( s.contentType || "" )
10051 .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
10052 rjsonp.test( s.data ) && "data"
10053 );
10054
10055 // Handle iff the expected data type is "jsonp" or we have a parameter to set
10056 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
10057
10058 // Get callback name, remembering preexisting value associated with it
10059 callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
10060 s.jsonpCallback() :
10061 s.jsonpCallback;
10062
10063 // Insert callback into url or form data
10064 if ( jsonProp ) {
10065 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
10066 } else if ( s.jsonp !== false ) {
10067 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
10068 }
10069
10070 // Use data converter to retrieve json after script execution
10071 s.converters[ "script json" ] = function() {
10072 if ( !responseContainer ) {
10073 jQuery.error( callbackName + " was not called" );
10074 }
10075 return responseContainer[ 0 ];
10076 };
10077
10078 // Force json dataType
10079 s.dataTypes[ 0 ] = "json";
10080
10081 // Install callback
10082 overwritten = window[ callbackName ];
10083 window[ callbackName ] = function() {
10084 responseContainer = arguments;
10085 };
10086
10087 // Clean-up function (fires after converters)
10088 jqXHR.always( function() {
10089
10090 // If previous value didn't exist - remove it
10091 if ( overwritten === undefined ) {
10092 jQuery( window ).removeProp( callbackName );
10093
10094 // Otherwise restore preexisting value
10095 } else {
10096 window[ callbackName ] = overwritten;
10097 }
10098
10099 // Save back as free
10100 if ( s[ callbackName ] ) {
10101
10102 // Make sure that re-using the options doesn't screw things around
10103 s.jsonpCallback = originalSettings.jsonpCallback;
10104
10105 // Save the callback name for future use
10106 oldCallbacks.push( callbackName );
10107 }
10108
10109 // Call if it was a function and we have a response
10110 if ( responseContainer && isFunction( overwritten ) ) {
10111 overwritten( responseContainer[ 0 ] );
10112 }
10113
10114 responseContainer = overwritten = undefined;
10115 } );
10116
10117 // Delegate to script
10118 return "script";
10119 }
10120} );
10121
10122
10123
10124
10125// Support: Safari 8 only
10126// In Safari 8 documents created via document.implementation.createHTMLDocument
10127// collapse sibling forms: the second one becomes a child of the first one.
10128// Because of that, this security measure has to be disabled in Safari 8.
10129// https://bugs.webkit.org/show_bug.cgi?id=137337
10130support.createHTMLDocument = ( function() {
10131 var body = document.implementation.createHTMLDocument( "" ).body;
10132 body.innerHTML = "<form></form><form></form>";
10133 return body.childNodes.length === 2;
10134} )();
10135
10136
10137// Argument "data" should be string of html
10138// context (optional): If specified, the fragment will be created in this context,
10139// defaults to document
10140// keepScripts (optional): If true, will include scripts passed in the html string
10141jQuery.parseHTML = function( data, context, keepScripts ) {
10142 if ( typeof data !== "string" ) {
10143 return [];
10144 }
10145 if ( typeof context === "boolean" ) {
10146 keepScripts = context;
10147 context = false;
10148 }
10149
10150 var base, parsed, scripts;
10151
10152 if ( !context ) {
10153
10154 // Stop scripts or inline event handlers from being executed immediately
10155 // by using document.implementation
10156 if ( support.createHTMLDocument ) {
10157 context = document.implementation.createHTMLDocument( "" );
10158
10159 // Set the base href for the created document
10160 // so any parsed elements with URLs
10161 // are based on the document's URL (gh-2965)
10162 base = context.createElement( "base" );
10163 base.href = document.location.href;
10164 context.head.appendChild( base );
10165 } else {
10166 context = document;
10167 }
10168 }
10169
10170 parsed = rsingleTag.exec( data );
10171 scripts = !keepScripts && [];
10172
10173 // Single tag
10174 if ( parsed ) {
10175 return [ context.createElement( parsed[ 1 ] ) ];
10176 }
10177
10178 parsed = buildFragment( [ data ], context, scripts );
10179
10180 if ( scripts && scripts.length ) {
10181 jQuery( scripts ).remove();
10182 }
10183
10184 return jQuery.merge( [], parsed.childNodes );
10185};
10186
10187
10188/**
10189 * Load a url into a page
10190 */
10191jQuery.fn.load = function( url, params, callback ) {
10192 var selector, type, response,
10193 self = this,
10194 off = url.indexOf( " " );
10195
10196 if ( off > -1 ) {
10197 selector = stripAndCollapse( url.slice( off ) );
10198 url = url.slice( 0, off );
10199 }
10200
10201 // If it's a function
10202 if ( isFunction( params ) ) {
10203
10204 // We assume that it's the callback
10205 callback = params;
10206 params = undefined;
10207
10208 // Otherwise, build a param string
10209 } else if ( params && typeof params === "object" ) {
10210 type = "POST";
10211 }
10212
10213 // If we have elements to modify, make the request
10214 if ( self.length > 0 ) {
10215 jQuery.ajax( {
10216 url: url,
10217
10218 // If "type" variable is undefined, then "GET" method will be used.
10219 // Make value of this field explicit since
10220 // user can override it through ajaxSetup method
10221 type: type || "GET",
10222 dataType: "html",
10223 data: params
10224 } ).done( function( responseText ) {
10225
10226 // Save response for use in complete callback
10227 response = arguments;
10228
10229 self.html( selector ?
10230
10231 // If a selector was specified, locate the right elements in a dummy div
10232 // Exclude scripts to avoid IE 'Permission Denied' errors
10233 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10234
10235 // Otherwise use the full result
10236 responseText );
10237
10238 // If the request succeeds, this function gets "data", "status", "jqXHR"
10239 // but they are ignored because response was set above.
10240 // If it fails, this function gets "jqXHR", "status", "error"
10241 } ).always( callback && function( jqXHR, status ) {
10242 self.each( function() {
10243 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10244 } );
10245 } );
10246 }
10247
10248 return this;
10249};
10250
10251
10252
10253
10254jQuery.expr.pseudos.animated = function( elem ) {
10255 return jQuery.grep( jQuery.timers, function( fn ) {
10256 return elem === fn.elem;
10257 } ).length;
10258};
10259
10260
10261
10262
10263jQuery.offset = {
10264 setOffset: function( elem, options, i ) {
10265 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10266 position = jQuery.css( elem, "position" ),
10267 curElem = jQuery( elem ),
10268 props = {};
10269
10270 // Set position first, in-case top/left are set even on static elem
10271 if ( position === "static" ) {
10272 elem.style.position = "relative";
10273 }
10274
10275 curOffset = curElem.offset();
10276 curCSSTop = jQuery.css( elem, "top" );
10277 curCSSLeft = jQuery.css( elem, "left" );
10278 calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10279 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
10280
10281 // Need to be able to calculate position if either
10282 // top or left is auto and position is either absolute or fixed
10283 if ( calculatePosition ) {
10284 curPosition = curElem.position();
10285 curTop = curPosition.top;
10286 curLeft = curPosition.left;
10287
10288 } else {
10289 curTop = parseFloat( curCSSTop ) || 0;
10290 curLeft = parseFloat( curCSSLeft ) || 0;
10291 }
10292
10293 if ( isFunction( options ) ) {
10294
10295 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10296 options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10297 }
10298
10299 if ( options.top != null ) {
10300 props.top = ( options.top - curOffset.top ) + curTop;
10301 }
10302 if ( options.left != null ) {
10303 props.left = ( options.left - curOffset.left ) + curLeft;
10304 }
10305
10306 if ( "using" in options ) {
10307 options.using.call( elem, props );
10308
10309 } else {
10310 curElem.css( props );
10311 }
10312 }
10313};
10314
10315jQuery.fn.extend( {
10316
10317 // offset() relates an element's border box to the document origin
10318 offset: function( options ) {
10319
10320 // Preserve chaining for setter
10321 if ( arguments.length ) {
10322 return options === undefined ?
10323 this :
10324 this.each( function( i ) {
10325 jQuery.offset.setOffset( this, options, i );
10326 } );
10327 }
10328
10329 var rect, win,
10330 elem = this[ 0 ];
10331
10332 if ( !elem ) {
10333 return;
10334 }
10335
10336 // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
10337 // Support: IE <=11 only
10338 // Running getBoundingClientRect on a
10339 // disconnected node in IE throws an error
10340 if ( !elem.getClientRects().length ) {
10341 return { top: 0, left: 0 };
10342 }
10343
10344 // Get document-relative position by adding viewport scroll to viewport-relative gBCR
10345 rect = elem.getBoundingClientRect();
10346 win = elem.ownerDocument.defaultView;
10347 return {
10348 top: rect.top + win.pageYOffset,
10349 left: rect.left + win.pageXOffset
10350 };
10351 },
10352
10353 // position() relates an element's margin box to its offset parent's padding box
10354 // This corresponds to the behavior of CSS absolute positioning
10355 position: function() {
10356 if ( !this[ 0 ] ) {
10357 return;
10358 }
10359
10360 var offsetParent, offset, doc,
10361 elem = this[ 0 ],
10362 parentOffset = { top: 0, left: 0 };
10363
10364 // position:fixed elements are offset from the viewport, which itself always has zero offset
10365 if ( jQuery.css( elem, "position" ) === "fixed" ) {
10366
10367 // Assume position:fixed implies availability of getBoundingClientRect
10368 offset = elem.getBoundingClientRect();
10369
10370 } else {
10371 offset = this.offset();
10372
10373 // Account for the *real* offset parent, which can be the document or its root element
10374 // when a statically positioned element is identified
10375 doc = elem.ownerDocument;
10376 offsetParent = elem.offsetParent || doc.documentElement;
10377 while ( offsetParent &&
10378 ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10379 jQuery.css( offsetParent, "position" ) === "static" ) {
10380
10381 offsetParent = offsetParent.parentNode;
10382 }
10383 if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
10384
10385 // Incorporate borders into its offset, since they are outside its content origin
10386 parentOffset = jQuery( offsetParent ).offset();
10387 parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10388 parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10389 }
10390 }
10391
10392 // Subtract parent offsets and element margins
10393 return {
10394 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10395 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10396 };
10397 },
10398
10399 // This method will return documentElement in the following cases:
10400 // 1) For the element inside the iframe without offsetParent, this method will return
10401 // documentElement of the parent window
10402 // 2) For the hidden or detached element
10403 // 3) For body or html element, i.e. in case of the html node - it will return itself
10404 //
10405 // but those exceptions were never presented as a real life use-cases
10406 // and might be considered as more preferable results.
10407 //
10408 // This logic, however, is not guaranteed and can change at any point in the future
10409 offsetParent: function() {
10410 return this.map( function() {
10411 var offsetParent = this.offsetParent;
10412
10413 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10414 offsetParent = offsetParent.offsetParent;
10415 }
10416
10417 return offsetParent || documentElement;
10418 } );
10419 }
10420} );
10421
10422// Create scrollLeft and scrollTop methods
10423jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10424 var top = "pageYOffset" === prop;
10425
10426 jQuery.fn[ method ] = function( val ) {
10427 return access( this, function( elem, method, val ) {
10428
10429 // Coalesce documents and windows
10430 var win;
10431 if ( isWindow( elem ) ) {
10432 win = elem;
10433 } else if ( elem.nodeType === 9 ) {
10434 win = elem.defaultView;
10435 }
10436
10437 if ( val === undefined ) {
10438 return win ? win[ prop ] : elem[ method ];
10439 }
10440
10441 if ( win ) {
10442 win.scrollTo(
10443 !top ? val : win.pageXOffset,
10444 top ? val : win.pageYOffset
10445 );
10446
10447 } else {
10448 elem[ method ] = val;
10449 }
10450 }, method, val, arguments.length );
10451 };
10452} );
10453
10454// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10455// Add the top/left cssHooks using jQuery.fn.position
10456// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10457// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10458// getComputedStyle returns percent when specified for top/left/bottom/right;
10459// rather than make the css module depend on the offset module, just check for it here
10460jQuery.each( [ "top", "left" ], function( _i, prop ) {
10461 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10462 function( elem, computed ) {
10463 if ( computed ) {
10464 computed = curCSS( elem, prop );
10465
10466 // If curCSS returns percentage, fallback to offset
10467 return rnumnonpx.test( computed ) ?
10468 jQuery( elem ).position()[ prop ] + "px" :
10469 computed;
10470 }
10471 }
10472 );
10473} );
10474
10475
10476// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10477jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10478 jQuery.each( {
10479 padding: "inner" + name,
10480 content: type,
10481 "": "outer" + name
10482 }, function( defaultExtra, funcName ) {
10483
10484 // Margin is only for outerHeight, outerWidth
10485 jQuery.fn[ funcName ] = function( margin, value ) {
10486 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10487 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10488
10489 return access( this, function( elem, type, value ) {
10490 var doc;
10491
10492 if ( isWindow( elem ) ) {
10493
10494 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10495 return funcName.indexOf( "outer" ) === 0 ?
10496 elem[ "inner" + name ] :
10497 elem.document.documentElement[ "client" + name ];
10498 }
10499
10500 // Get document width or height
10501 if ( elem.nodeType === 9 ) {
10502 doc = elem.documentElement;
10503
10504 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10505 // whichever is greatest
10506 return Math.max(
10507 elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10508 elem.body[ "offset" + name ], doc[ "offset" + name ],
10509 doc[ "client" + name ]
10510 );
10511 }
10512
10513 return value === undefined ?
10514
10515 // Get width or height on the element, requesting but not forcing parseFloat
10516 jQuery.css( elem, type, extra ) :
10517
10518 // Set width or height on the element
10519 jQuery.style( elem, type, value, extra );
10520 }, type, chainable ? margin : undefined, chainable );
10521 };
10522 } );
10523} );
10524
10525
10526jQuery.each( [
10527 "ajaxStart",
10528 "ajaxStop",
10529 "ajaxComplete",
10530 "ajaxError",
10531 "ajaxSuccess",
10532 "ajaxSend"
10533], function( _i, type ) {
10534 jQuery.fn[ type ] = function( fn ) {
10535 return this.on( type, fn );
10536 };
10537} );
10538
10539
10540
10541
10542jQuery.fn.extend( {
10543
10544 bind: function( types, data, fn ) {
10545 return this.on( types, null, data, fn );
10546 },
10547 unbind: function( types, fn ) {
10548 return this.off( types, null, fn );
10549 },
10550
10551 delegate: function( selector, types, data, fn ) {
10552 return this.on( types, selector, data, fn );
10553 },
10554 undelegate: function( selector, types, fn ) {
10555
10556 // ( namespace ) or ( selector, types [, fn] )
10557 return arguments.length === 1 ?
10558 this.off( selector, "**" ) :
10559 this.off( types, selector || "**", fn );
10560 },
10561
10562 hover: function( fnOver, fnOut ) {
10563 return this
10564 .on( "mouseenter", fnOver )
10565 .on( "mouseleave", fnOut || fnOver );
10566 }
10567} );
10568
10569jQuery.each(
10570 ( "blur focus focusin focusout resize scroll click dblclick " +
10571 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10572 "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10573 function( _i, name ) {
10574
10575 // Handle event binding
10576 jQuery.fn[ name ] = function( data, fn ) {
10577 return arguments.length > 0 ?
10578 this.on( name, null, data, fn ) :
10579 this.trigger( name );
10580 };
10581 }
10582);
10583
10584
10585
10586
10587// Support: Android <=4.0 only
10588// Make sure we trim BOM and NBSP
10589// Require that the "whitespace run" starts from a non-whitespace
10590// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
10591var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
10592
10593// Bind a function to a context, optionally partially applying any
10594// arguments.
10595// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10596// However, it is not slated for removal any time soon
10597jQuery.proxy = function( fn, context ) {
10598 var tmp, args, proxy;
10599
10600 if ( typeof context === "string" ) {
10601 tmp = fn[ context ];
10602 context = fn;
10603 fn = tmp;
10604 }
10605
10606 // Quick check to determine if target is callable, in the spec
10607 // this throws a TypeError, but we will just return undefined.
10608 if ( !isFunction( fn ) ) {
10609 return undefined;
10610 }
10611
10612 // Simulated bind
10613 args = slice.call( arguments, 2 );
10614 proxy = function() {
10615 return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
10616 };
10617
10618 // Set the guid of unique handler to the same of original handler, so it can be removed
10619 proxy.guid = fn.guid = fn.guid || jQuery.guid++;
10620
10621 return proxy;
10622};
10623
10624jQuery.holdReady = function( hold ) {
10625 if ( hold ) {
10626 jQuery.readyWait++;
10627 } else {
10628 jQuery.ready( true );
10629 }
10630};
10631jQuery.isArray = Array.isArray;
10632jQuery.parseJSON = JSON.parse;
10633jQuery.nodeName = nodeName;
10634jQuery.isFunction = isFunction;
10635jQuery.isWindow = isWindow;
10636jQuery.camelCase = camelCase;
10637jQuery.type = toType;
10638
10639jQuery.now = Date.now;
10640
10641jQuery.isNumeric = function( obj ) {
10642
10643 // As of jQuery 3.0, isNumeric is limited to
10644 // strings and numbers (primitives or objects)
10645 // that can be coerced to finite numbers (gh-2662)
10646 var type = jQuery.type( obj );
10647 return ( type === "number" || type === "string" ) &&
10648
10649 // parseFloat NaNs numeric-cast false positives ("")
10650 // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10651 // subtraction forces infinities to NaN
10652 !isNaN( obj - parseFloat( obj ) );
10653};
10654
10655jQuery.trim = function( text ) {
10656 return text == null ?
10657 "" :
10658 ( text + "" ).replace( rtrim, "$1" );
10659};
10660
10661
10662
10663// Register as a named AMD module, since jQuery can be concatenated with other
10664// files that may use define, but not via a proper concatenation script that
10665// understands anonymous AMD modules. A named AMD is safest and most robust
10666// way to register. Lowercase jquery is used because AMD module names are
10667// derived from file names, and jQuery is normally delivered in a lowercase
10668// file name. Do this after creating the global so that if an AMD module wants
10669// to call noConflict to hide this version of jQuery, it will work.
10670
10671// Note that for maximum portability, libraries that are not jQuery should
10672// declare themselves as anonymous modules, and avoid setting a global if an
10673// AMD loader is present. jQuery is a special case. For more information, see
10674// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10675
10676if ( typeof define === "function" && define.amd ) {
10677 define( "jquery", [], function() {
10678 return jQuery;
10679 } );
10680}
10681
10682
10683
10684
10685var
10686
10687 // Map over jQuery in case of overwrite
10688 _jQuery = window.jQuery,
10689
10690 // Map over the $ in case of overwrite
10691 _$ = window.$;
10692
10693jQuery.noConflict = function( deep ) {
10694 if ( window.$ === jQuery ) {
10695 window.$ = _$;
10696 }
10697
10698 if ( deep && window.jQuery === jQuery ) {
10699 window.jQuery = _jQuery;
10700 }
10701
10702 return jQuery;
10703};
10704
10705// Expose jQuery and $ identifiers, even in AMD
10706// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
10707// and CommonJS for browser emulators (trac-13566)
10708if ( typeof noGlobal === "undefined" ) {
10709 window.jQuery = window.$ = jQuery;
10710}
10711
10712
10713
10714
10715return jQuery;
10716} );
10717jQuery.noConflict();
Ui Ux Design – Teachers Night Out https://cardgames4educators.com Wed, 16 Oct 2024 22:24:18 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.4 https://cardgames4educators.com/wp-content/uploads/2024/06/cropped-Card-4-Educators-logo-32x32.png Ui Ux Design – Teachers Night Out https://cardgames4educators.com 32 32 Masters In English How English Speaker https://cardgames4educators.com/masters-in-english-how-english-speaker/ https://cardgames4educators.com/masters-in-english-how-english-speaker/#comments Mon, 27 May 2024 08:54:45 +0000 https://themexriver.com/wp/kadu/?p=1

Erat himenaeos neque id sagittis massa. Hac suscipit pulvinar dignissim platea magnis eu. Don tellus a pharetra inceptos efficitur dui pulvinar. Feugiat facilisis penatibus pulvinar nunc dictumst donec odio platea habitasse. Lacus porta dolor purus elit ante bibendum tortor netus taciti nullam cubilia. Erat per suspendisse placerat morbi egestas pulvinar bibendum sollicitudin nec. Euismod cubilia eleifend velit himenaeos sodales lectus. Leo maximus cras ac porttitor aliquam torquent pulvinar odio volutpat parturient. Quisque risus finibus suspendisse mus purus magnis facilisi condimentum consectetur dui. Curae elit suspendisse cursus vehicula.

Turpis taciti class non vel pretium quis pulvinar tempor lobortis nunc. Libero phasellus parturient sapien volutpat malesuada ornare. Cubilia dignissim sollicitudin rhoncus lacinia maximus. Cras lorem fermentum bibendum pellentesque nisl etiam ligula enim cubilia. Vulputate pede sapien torquent montes tempus malesuada in mattis dis turpis vitae. Porta est tempor ex eget feugiat vulputate ipsum. Justo nec iaculis habitant diam arcu fermentum.

We offer comprehen sive emplo ment services such as assistance wit employer compliance.Our company is your strategic HR partner as instead of HR. john smithson

Cubilia dignissim sollicitudin rhoncus lacinia maximus. Cras lorem fermentum bibendum pellentesque nisl etiam ligula enim cubilia. Vulputate pede sapien torquent montes tempus malesuada in mattis dis turpis vitae.

Exploring Learning Landscapes in Academic

Feugiat facilisis penatibus pulvinar nunc dictumst donec odio platea habitasse. Lacus porta dolor purus elit ante bibendum tortor netus taciti nullam cubilia. Erat per suspendisse placerat morbi egestas pulvinar bibendum sollicitudin nec. Euismod cubilia eleifend velit himenaeos sodales lectus. Leo maximus cras ac porttitor aliquam torquent.

]]>
https://cardgames4educators.com/masters-in-english-how-english-speaker/feed/ 1