GPQAPP

Форк
0
10881 строка · 281.8 Кб
1
/*!
2
 * jQuery JavaScript Library v3.6.0
3
 * https://jquery.com/
4
 *
5
 * Includes Sizzle.js
6
 * https://sizzlejs.com/
7
 *
8
 * Copyright OpenJS Foundation and other contributors
9
 * Released under the MIT license
10
 * https://jquery.org/license
11
 *
12
 * Date: 2021-03-02T17:08Z
13
 */
14
( function( global, factory ) {
15

16
	"use strict";
17

18
	if ( typeof module === "object" && typeof module.exports === "object" ) {
19

20
		// For CommonJS and CommonJS-like environments where a proper `window`
21
		// is present, execute the factory and get jQuery.
22
		// For environments that do not have a `window` with a `document`
23
		// (such as Node.js), expose a factory as module.exports.
24
		// This accentuates the need for the creation of a real `window`.
25
		// e.g. var jQuery = require("jquery")(window);
26
		// See ticket #14549 for more info.
27
		module.exports = global.document ?
28
			factory( global, true ) :
29
			function( w ) {
30
				if ( !w.document ) {
31
					throw new Error( "jQuery requires a window with a document" );
32
				}
33
				return factory( w );
34
			};
35
	} else {
36
		factory( global );
37
	}
38

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

42
// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
43
// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
44
// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
45
// enough that all such attempts are guarded in a try block.
46
"use strict";
47

48
var arr = [];
49

50
var getProto = Object.getPrototypeOf;
51

52
var slice = arr.slice;
53

54
var flat = arr.flat ? function( array ) {
55
	return arr.flat.call( array );
56
} : function( array ) {
57
	return arr.concat.apply( [], array );
58
};
59

60

61
var push = arr.push;
62

63
var indexOf = arr.indexOf;
64

65
var class2type = {};
66

67
var toString = class2type.toString;
68

69
var hasOwn = class2type.hasOwnProperty;
70

71
var fnToString = hasOwn.toString;
72

73
var ObjectFunctionString = fnToString.call( Object );
74

75
var support = {};
76

77
var isFunction = function isFunction( obj ) {
78

79
		// Support: Chrome <=57, Firefox <=52
80
		// In some browsers, typeof returns "function" for HTML <object> elements
81
		// (i.e., `typeof document.createElement( "object" ) === "function"`).
82
		// We don't want to classify *any* DOM node as a function.
83
		// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
84
		// Plus for old WebKit, typeof returns "function" for HTML collections
85
		// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
86
		return typeof obj === "function" && typeof obj.nodeType !== "number" &&
87
			typeof obj.item !== "function";
88
	};
89

90

91
var isWindow = function isWindow( obj ) {
92
		return obj != null && obj === obj.window;
93
	};
94

95

96
var document = window.document;
97

98

99

100
	var preservedScriptAttributes = {
101
		type: true,
102
		src: true,
103
		nonce: true,
104
		noModule: true
105
	};
106

107
	function DOMEval( code, node, doc ) {
108
		doc = doc || document;
109

110
		var i, val,
111
			script = doc.createElement( "script" );
112

113
		script.text = code;
114
		if ( node ) {
115
			for ( i in preservedScriptAttributes ) {
116

117
				// Support: Firefox 64+, Edge 18+
118
				// Some browsers don't support the "nonce" property on scripts.
119
				// On the other hand, just using `getAttribute` is not enough as
120
				// the `nonce` attribute is reset to an empty string whenever it
121
				// becomes browsing-context connected.
122
				// See https://github.com/whatwg/html/issues/2369
123
				// See https://html.spec.whatwg.org/#nonce-attributes
124
				// The `node.getAttribute` check was added for the sake of
125
				// `jQuery.globalEval` so that it can fake a nonce-containing node
126
				// via an object.
127
				val = node[ i ] || node.getAttribute && node.getAttribute( i );
128
				if ( val ) {
129
					script.setAttribute( i, val );
130
				}
131
			}
132
		}
133
		doc.head.appendChild( script ).parentNode.removeChild( script );
134
	}
135

136

137
function toType( obj ) {
138
	if ( obj == null ) {
139
		return obj + "";
140
	}
141

142
	// Support: Android <=2.3 only (functionish RegExp)
143
	return typeof obj === "object" || typeof obj === "function" ?
144
		class2type[ toString.call( obj ) ] || "object" :
145
		typeof obj;
146
}
147
/* global Symbol */
148
// Defining this global in .eslintrc.json would create a danger of using the global
149
// unguarded in another place, it seems safer to define global only for this module
150

151

152

153
var
154
	version = "3.6.0",
155

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

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

164
jQuery.fn = jQuery.prototype = {
165

166
	// The current version of jQuery being used
167
	jquery: version,
168

169
	constructor: jQuery,
170

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

174
	toArray: function() {
175
		return slice.call( this );
176
	},
177

178
	// Get the Nth element in the matched element set OR
179
	// Get the whole matched element set as a clean array
180
	get: function( num ) {
181

182
		// Return all the elements in a clean array
183
		if ( num == null ) {
184
			return slice.call( this );
185
		}
186

187
		// Return just the one element from the set
188
		return num < 0 ? this[ num + this.length ] : this[ num ];
189
	},
190

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

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

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

201
		// Return the newly-formed element set
202
		return ret;
203
	},
204

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

210
	map: function( callback ) {
211
		return this.pushStack( jQuery.map( this, function( elem, i ) {
212
			return callback.call( elem, i, elem );
213
		} ) );
214
	},
215

216
	slice: function() {
217
		return this.pushStack( slice.apply( this, arguments ) );
218
	},
219

220
	first: function() {
221
		return this.eq( 0 );
222
	},
223

224
	last: function() {
225
		return this.eq( -1 );
226
	},
227

228
	even: function() {
229
		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
230
			return ( i + 1 ) % 2;
231
		} ) );
232
	},
233

234
	odd: function() {
235
		return this.pushStack( jQuery.grep( this, function( _elem, i ) {
236
			return i % 2;
237
		} ) );
238
	},
239

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

246
	end: function() {
247
		return this.prevObject || this.constructor();
248
	},
249

250
	// For internal use only.
251
	// Behaves like an Array's method, not like a jQuery method.
252
	push: push,
253
	sort: arr.sort,
254
	splice: arr.splice
255
};
256

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

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

268
		// Skip the boolean and the target
269
		target = arguments[ i ] || {};
270
		i++;
271
	}
272

273
	// Handle case when target is a string or something (possible in deep copy)
274
	if ( typeof target !== "object" && !isFunction( target ) ) {
275
		target = {};
276
	}
277

278
	// Extend jQuery itself if only one argument is passed
279
	if ( i === length ) {
280
		target = this;
281
		i--;
282
	}
283

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

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

289
			// Extend the base object
290
			for ( name in options ) {
291
				copy = options[ name ];
292

293
				// Prevent Object.prototype pollution
294
				// Prevent never-ending loop
295
				if ( name === "__proto__" || target === copy ) {
296
					continue;
297
				}
298

299
				// Recurse if we're merging plain objects or arrays
300
				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
301
					( copyIsArray = Array.isArray( copy ) ) ) ) {
302
					src = target[ name ];
303

304
					// Ensure proper type for the source value
305
					if ( copyIsArray && !Array.isArray( src ) ) {
306
						clone = [];
307
					} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
308
						clone = {};
309
					} else {
310
						clone = src;
311
					}
312
					copyIsArray = false;
313

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

317
				// Don't bring in undefined values
318
				} else if ( copy !== undefined ) {
319
					target[ name ] = copy;
320
				}
321
			}
322
		}
323
	}
324

325
	// Return the modified object
326
	return target;
327
};
328

329
jQuery.extend( {
330

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

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

337
	error: function( msg ) {
338
		throw new Error( msg );
339
	},
340

341
	noop: function() {},
342

343
	isPlainObject: function( obj ) {
344
		var proto, Ctor;
345

346
		// Detect obvious negatives
347
		// Use toString instead of jQuery.type to catch host objects
348
		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
349
			return false;
350
		}
351

352
		proto = getProto( obj );
353

354
		// Objects with no prototype (e.g., `Object.create( null )`) are plain
355
		if ( !proto ) {
356
			return true;
357
		}
358

359
		// Objects with prototype are plain iff they were constructed by a global Object function
360
		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
361
		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
362
	},
363

364
	isEmptyObject: function( obj ) {
365
		var name;
366

367
		for ( name in obj ) {
368
			return false;
369
		}
370
		return true;
371
	},
372

373
	// Evaluates a script in a provided context; falls back to the global one
374
	// if not specified.
375
	globalEval: function( code, options, doc ) {
376
		DOMEval( code, { nonce: options && options.nonce }, doc );
377
	},
378

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

382
		if ( isArrayLike( obj ) ) {
383
			length = obj.length;
384
			for ( ; i < length; i++ ) {
385
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
386
					break;
387
				}
388
			}
389
		} else {
390
			for ( i in obj ) {
391
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
392
					break;
393
				}
394
			}
395
		}
396

397
		return obj;
398
	},
399

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

404
		if ( arr != null ) {
405
			if ( isArrayLike( Object( arr ) ) ) {
406
				jQuery.merge( ret,
407
					typeof arr === "string" ?
408
						[ arr ] : arr
409
				);
410
			} else {
411
				push.call( ret, arr );
412
			}
413
		}
414

415
		return ret;
416
	},
417

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

422
	// Support: Android <=4.0 only, PhantomJS 1 only
423
	// push.apply(_, arraylike) throws on ancient WebKit
424
	merge: function( first, second ) {
425
		var len = +second.length,
426
			j = 0,
427
			i = first.length;
428

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

433
		first.length = i;
434

435
		return first;
436
	},
437

438
	grep: function( elems, callback, invert ) {
439
		var callbackInverse,
440
			matches = [],
441
			i = 0,
442
			length = elems.length,
443
			callbackExpect = !invert;
444

445
		// Go through the array, only saving the items
446
		// that pass the validator function
447
		for ( ; i < length; i++ ) {
448
			callbackInverse = !callback( elems[ i ], i );
449
			if ( callbackInverse !== callbackExpect ) {
450
				matches.push( elems[ i ] );
451
			}
452
		}
453

454
		return matches;
455
	},
456

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

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

469
				if ( value != null ) {
470
					ret.push( value );
471
				}
472
			}
473

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

479
				if ( value != null ) {
480
					ret.push( value );
481
				}
482
			}
483
		}
484

485
		// Flatten any nested arrays
486
		return flat( ret );
487
	},
488

489
	// A global GUID counter for objects
490
	guid: 1,
491

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

497
if ( typeof Symbol === "function" ) {
498
	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
499
}
500

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

507
function isArrayLike( obj ) {
508

509
	// Support: real iOS 8.2 only (not reproducible in simulator)
510
	// `in` check used to prevent JIT error (gh-2145)
511
	// hasOwn isn't used here due to false negatives
512
	// regarding Nodelist length in IE
513
	var length = !!obj && "length" in obj && obj.length,
514
		type = toType( obj );
515

516
	if ( isFunction( obj ) || isWindow( obj ) ) {
517
		return false;
518
	}
519

520
	return type === "array" || length === 0 ||
521
		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
522
}
523
var Sizzle =
524
/*!
525
 * Sizzle CSS Selector Engine v2.3.6
526
 * https://sizzlejs.com/
527
 *
528
 * Copyright JS Foundation and other contributors
529
 * Released under the MIT license
530
 * https://js.foundation/
531
 *
532
 * Date: 2021-02-16
533
 */
534
( function( window ) {
535
var i,
536
	support,
537
	Expr,
538
	getText,
539
	isXML,
540
	tokenize,
541
	compile,
542
	select,
543
	outermostContext,
544
	sortInput,
545
	hasDuplicate,
546

547
	// Local document vars
548
	setDocument,
549
	document,
550
	docElem,
551
	documentIsHTML,
552
	rbuggyQSA,
553
	rbuggyMatches,
554
	matches,
555
	contains,
556

557
	// Instance-specific data
558
	expando = "sizzle" + 1 * new Date(),
559
	preferredDoc = window.document,
560
	dirruns = 0,
561
	done = 0,
562
	classCache = createCache(),
563
	tokenCache = createCache(),
564
	compilerCache = createCache(),
565
	nonnativeSelectorCache = createCache(),
566
	sortOrder = function( a, b ) {
567
		if ( a === b ) {
568
			hasDuplicate = true;
569
		}
570
		return 0;
571
	},
572

573
	// Instance methods
574
	hasOwn = ( {} ).hasOwnProperty,
575
	arr = [],
576
	pop = arr.pop,
577
	pushNative = arr.push,
578
	push = arr.push,
579
	slice = arr.slice,
580

581
	// Use a stripped-down indexOf as it's faster than native
582
	// https://jsperf.com/thor-indexof-vs-for/5
583
	indexOf = function( list, elem ) {
584
		var i = 0,
585
			len = list.length;
586
		for ( ; i < len; i++ ) {
587
			if ( list[ i ] === elem ) {
588
				return i;
589
			}
590
		}
591
		return -1;
592
	},
593

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

597
	// Regular expressions
598

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

602
	// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
603
	identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
604
		"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
605

606
	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
607
	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
608

609
		// Operator (capture 2)
610
		"*([*^$|!~]?=)" + whitespace +
611

612
		// "Attribute values must be CSS identifiers [capture 5]
613
		// or strings [capture 3 or capture 4]"
614
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
615
		whitespace + "*\\]",
616

617
	pseudos = ":(" + identifier + ")(?:\\((" +
618

619
		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
620
		// 1. quoted (capture 3; capture 4 or capture 5)
621
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
622

623
		// 2. simple (capture 6)
624
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
625

626
		// 3. anything else (capture 2)
627
		".*" +
628
		")\\)|)",
629

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

635
	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
636
	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
637
		"*" ),
638
	rdescend = new RegExp( whitespace + "|>" ),
639

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

643
	matchExpr = {
644
		"ID": new RegExp( "^#(" + identifier + ")" ),
645
		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
646
		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
647
		"ATTR": new RegExp( "^" + attributes ),
648
		"PSEUDO": new RegExp( "^" + pseudos ),
649
		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
650
			whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
651
			whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
652
		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
653

654
		// For use in libraries implementing .is()
655
		// We use this for POS matching in `select`
656
		"needsContext": new RegExp( "^" + whitespace +
657
			"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
658
			"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
659
	},
660

661
	rhtml = /HTML$/i,
662
	rinputs = /^(?:input|select|textarea|button)$/i,
663
	rheader = /^h\d$/i,
664

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

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

670
	rsibling = /[+~]/,
671

672
	// CSS escapes
673
	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
674
	runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
675
	funescape = function( escape, nonHex ) {
676
		var high = "0x" + escape.slice( 1 ) - 0x10000;
677

678
		return nonHex ?
679

680
			// Strip the backslash prefix from a non-hex escape sequence
681
			nonHex :
682

683
			// Replace a hexadecimal escape sequence with the encoded Unicode code point
684
			// Support: IE <=11+
685
			// For values outside the Basic Multilingual Plane (BMP), manually construct a
686
			// surrogate pair
687
			high < 0 ?
688
				String.fromCharCode( high + 0x10000 ) :
689
				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
690
	},
691

692
	// CSS string/identifier serialization
693
	// https://drafts.csswg.org/cssom/#common-serializing-idioms
694
	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
695
	fcssescape = function( ch, asCodePoint ) {
696
		if ( asCodePoint ) {
697

698
			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
699
			if ( ch === "\0" ) {
700
				return "\uFFFD";
701
			}
702

703
			// Control characters and (dependent upon position) numbers get escaped as code points
704
			return ch.slice( 0, -1 ) + "\\" +
705
				ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
706
		}
707

708
		// Other potentially-special ASCII characters get backslash-escaped
709
		return "\\" + ch;
710
	},
711

712
	// Used for iframes
713
	// See setDocument()
714
	// Removing the function wrapper causes a "Permission Denied"
715
	// error in IE
716
	unloadHandler = function() {
717
		setDocument();
718
	},
719

720
	inDisabledFieldset = addCombinator(
721
		function( elem ) {
722
			return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
723
		},
724
		{ dir: "parentNode", next: "legend" }
725
	);
726

727
// Optimize for push.apply( _, NodeList )
728
try {
729
	push.apply(
730
		( arr = slice.call( preferredDoc.childNodes ) ),
731
		preferredDoc.childNodes
732
	);
733

734
	// Support: Android<4.0
735
	// Detect silently failing push.apply
736
	// eslint-disable-next-line no-unused-expressions
737
	arr[ preferredDoc.childNodes.length ].nodeType;
738
} catch ( e ) {
739
	push = { apply: arr.length ?
740

741
		// Leverage slice if possible
742
		function( target, els ) {
743
			pushNative.apply( target, slice.call( els ) );
744
		} :
745

746
		// Support: IE<9
747
		// Otherwise append directly
748
		function( target, els ) {
749
			var j = target.length,
750
				i = 0;
751

752
			// Can't trust NodeList.length
753
			while ( ( target[ j++ ] = els[ i++ ] ) ) {}
754
			target.length = j - 1;
755
		}
756
	};
757
}
758

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

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

766
	results = results || [];
767

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

772
		return results;
773
	}
774

775
	// Try to shortcut find operations (as opposed to filters) in HTML documents
776
	if ( !seed ) {
777
		setDocument( context );
778
		context = context || document;
779

780
		if ( documentIsHTML ) {
781

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

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

789
					// Document context
790
					if ( nodeType === 9 ) {
791
						if ( ( elem = context.getElementById( m ) ) ) {
792

793
							// Support: IE, Opera, Webkit
794
							// TODO: identify versions
795
							// getElementById can match elements by name instead of ID
796
							if ( elem.id === m ) {
797
								results.push( elem );
798
								return results;
799
							}
800
						} else {
801
							return results;
802
						}
803

804
					// Element context
805
					} else {
806

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

814
							results.push( elem );
815
							return results;
816
						}
817
					}
818

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

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

828
					push.apply( results, context.getElementsByClassName( m ) );
829
					return results;
830
				}
831
			}
832

833
			// Take advantage of querySelectorAll
834
			if ( support.qsa &&
835
				!nonnativeSelectorCache[ selector + " " ] &&
836
				( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
837

838
				// Support: IE 8 only
839
				// Exclude object elements
840
				( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
841

842
				newSelector = selector;
843
				newContext = context;
844

845
				// qSA considers elements outside a scoping root when evaluating child or
846
				// descendant combinators, which is not what we want.
847
				// In such cases, we work around the behavior by prefixing every selector in the
848
				// list with an ID selector referencing the scope context.
849
				// The technique has to be used as well when a leading combinator is used
850
				// as such selectors are not recognized by querySelectorAll.
851
				// Thanks to Andrew Dupont for this technique.
852
				if ( nodeType === 1 &&
853
					( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
854

855
					// Expand context for sibling selectors
856
					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
857
						context;
858

859
					// We can use :scope instead of the ID hack if the browser
860
					// supports it & if we're not changing the context.
861
					if ( newContext !== context || !support.scope ) {
862

863
						// Capture the context ID, setting it first if necessary
864
						if ( ( nid = context.getAttribute( "id" ) ) ) {
865
							nid = nid.replace( rcssescape, fcssescape );
866
						} else {
867
							context.setAttribute( "id", ( nid = expando ) );
868
						}
869
					}
870

871
					// Prefix every selector in the list
872
					groups = tokenize( selector );
873
					i = groups.length;
874
					while ( i-- ) {
875
						groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
876
							toSelector( groups[ i ] );
877
					}
878
					newSelector = groups.join( "," );
879
				}
880

881
				try {
882
					push.apply( results,
883
						newContext.querySelectorAll( newSelector )
884
					);
885
					return results;
886
				} catch ( qsaError ) {
887
					nonnativeSelectorCache( selector, true );
888
				} finally {
889
					if ( nid === expando ) {
890
						context.removeAttribute( "id" );
891
					}
892
				}
893
			}
894
		}
895
	}
896

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

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

910
	function cache( key, value ) {
911

912
		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
913
		if ( keys.push( key + " " ) > Expr.cacheLength ) {
914

915
			// Only keep the most recent entries
916
			delete cache[ keys.shift() ];
917
		}
918
		return ( cache[ key + " " ] = value );
919
	}
920
	return cache;
921
}
922

923
/**
924
 * Mark a function for special use by Sizzle
925
 * @param {Function} fn The function to mark
926
 */
927
function markFunction( fn ) {
928
	fn[ expando ] = true;
929
	return fn;
930
}
931

932
/**
933
 * Support testing using an element
934
 * @param {Function} fn Passed the created element and returns a boolean result
935
 */
936
function assert( fn ) {
937
	var el = document.createElement( "fieldset" );
938

939
	try {
940
		return !!fn( el );
941
	} catch ( e ) {
942
		return false;
943
	} finally {
944

945
		// Remove from its parent by default
946
		if ( el.parentNode ) {
947
			el.parentNode.removeChild( el );
948
		}
949

950
		// release memory in IE
951
		el = null;
952
	}
953
}
954

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

964
	while ( i-- ) {
965
		Expr.attrHandle[ arr[ i ] ] = handler;
966
	}
967
}
968

969
/**
970
 * Checks document order of two siblings
971
 * @param {Element} a
972
 * @param {Element} b
973
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
974
 */
975
function siblingCheck( a, b ) {
976
	var cur = b && a,
977
		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
978
			a.sourceIndex - b.sourceIndex;
979

980
	// Use IE sourceIndex if available on both nodes
981
	if ( diff ) {
982
		return diff;
983
	}
984

985
	// Check if b follows a
986
	if ( cur ) {
987
		while ( ( cur = cur.nextSibling ) ) {
988
			if ( cur === b ) {
989
				return -1;
990
			}
991
		}
992
	}
993

994
	return a ? 1 : -1;
995
}
996

997
/**
998
 * Returns a function to use in pseudos for input types
999
 * @param {String} type
1000
 */
1001
function createInputPseudo( type ) {
1002
	return function( elem ) {
1003
		var name = elem.nodeName.toLowerCase();
1004
		return name === "input" && elem.type === type;
1005
	};
1006
}
1007

1008
/**
1009
 * Returns a function to use in pseudos for buttons
1010
 * @param {String} type
1011
 */
1012
function createButtonPseudo( type ) {
1013
	return function( elem ) {
1014
		var name = elem.nodeName.toLowerCase();
1015
		return ( name === "input" || name === "button" ) && elem.type === type;
1016
	};
1017
}
1018

1019
/**
1020
 * Returns a function to use in pseudos for :enabled/:disabled
1021
 * @param {Boolean} disabled true for :disabled; false for :enabled
1022
 */
1023
function createDisabledPseudo( disabled ) {
1024

1025
	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1026
	return function( elem ) {
1027

1028
		// Only certain elements can match :enabled or :disabled
1029
		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1030
		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1031
		if ( "form" in elem ) {
1032

1033
			// Check for inherited disabledness on relevant non-disabled elements:
1034
			// * listed form-associated elements in a disabled fieldset
1035
			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
1036
			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1037
			// * option elements in a disabled optgroup
1038
			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1039
			// All such elements have a "form" property.
1040
			if ( elem.parentNode && elem.disabled === false ) {
1041

1042
				// Option elements defer to a parent optgroup if present
1043
				if ( "label" in elem ) {
1044
					if ( "label" in elem.parentNode ) {
1045
						return elem.parentNode.disabled === disabled;
1046
					} else {
1047
						return elem.disabled === disabled;
1048
					}
1049
				}
1050

1051
				// Support: IE 6 - 11
1052
				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
1053
				return elem.isDisabled === disabled ||
1054

1055
					// Where there is no isDisabled, check manually
1056
					/* jshint -W018 */
1057
					elem.isDisabled !== !disabled &&
1058
					inDisabledFieldset( elem ) === disabled;
1059
			}
1060

1061
			return elem.disabled === disabled;
1062

1063
		// Try to winnow out elements that can't be disabled before trusting the disabled property.
1064
		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1065
		// even exist on them, let alone have a boolean value.
1066
		} else if ( "label" in elem ) {
1067
			return elem.disabled === disabled;
1068
		}
1069

1070
		// Remaining elements are neither :enabled nor :disabled
1071
		return false;
1072
	};
1073
}
1074

1075
/**
1076
 * Returns a function to use in pseudos for positionals
1077
 * @param {Function} fn
1078
 */
1079
function createPositionalPseudo( fn ) {
1080
	return markFunction( function( argument ) {
1081
		argument = +argument;
1082
		return markFunction( function( seed, matches ) {
1083
			var j,
1084
				matchIndexes = fn( [], seed.length, argument ),
1085
				i = matchIndexes.length;
1086

1087
			// Match elements found at the specified indexes
1088
			while ( i-- ) {
1089
				if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1090
					seed[ j ] = !( matches[ j ] = seed[ j ] );
1091
				}
1092
			}
1093
		} );
1094
	} );
1095
}
1096

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

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

1109
/**
1110
 * Detects XML nodes
1111
 * @param {Element|Object} elem An element or a document
1112
 * @returns {Boolean} True iff elem is a non-HTML XML node
1113
 */
1114
isXML = Sizzle.isXML = function( elem ) {
1115
	var namespace = elem && elem.namespaceURI,
1116
		docElem = elem && ( elem.ownerDocument || elem ).documentElement;
1117

1118
	// Support: IE <=8
1119
	// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1120
	// https://bugs.jquery.com/ticket/4833
1121
	return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1122
};
1123

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

1133
	// Return early if doc is invalid or already selected
1134
	// Support: IE 11+, Edge 17 - 18+
1135
	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1136
	// two documents; shallow comparisons work.
1137
	// eslint-disable-next-line eqeqeq
1138
	if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
1139
		return document;
1140
	}
1141

1142
	// Update global variables
1143
	document = doc;
1144
	docElem = document.documentElement;
1145
	documentIsHTML = !isXML( document );
1146

1147
	// Support: IE 9 - 11+, Edge 12 - 18+
1148
	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1149
	// Support: IE 11+, Edge 17 - 18+
1150
	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1151
	// two documents; shallow comparisons work.
1152
	// eslint-disable-next-line eqeqeq
1153
	if ( preferredDoc != document &&
1154
		( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1155

1156
		// Support: IE 11, Edge
1157
		if ( subWindow.addEventListener ) {
1158
			subWindow.addEventListener( "unload", unloadHandler, false );
1159

1160
		// Support: IE 9 - 10 only
1161
		} else if ( subWindow.attachEvent ) {
1162
			subWindow.attachEvent( "onunload", unloadHandler );
1163
		}
1164
	}
1165

1166
	// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
1167
	// Safari 4 - 5 only, Opera <=11.6 - 12.x only
1168
	// IE/Edge & older browsers don't support the :scope pseudo-class.
1169
	// Support: Safari 6.0 only
1170
	// Safari 6.0 supports :scope but it's an alias of :root there.
1171
	support.scope = assert( function( el ) {
1172
		docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
1173
		return typeof el.querySelectorAll !== "undefined" &&
1174
			!el.querySelectorAll( ":scope fieldset div" ).length;
1175
	} );
1176

1177
	/* Attributes
1178
	---------------------------------------------------------------------- */
1179

1180
	// Support: IE<8
1181
	// Verify that getAttribute really returns attributes and not properties
1182
	// (excepting IE8 booleans)
1183
	support.attributes = assert( function( el ) {
1184
		el.className = "i";
1185
		return !el.getAttribute( "className" );
1186
	} );
1187

1188
	/* getElement(s)By*
1189
	---------------------------------------------------------------------- */
1190

1191
	// Check if getElementsByTagName("*") returns only elements
1192
	support.getElementsByTagName = assert( function( el ) {
1193
		el.appendChild( document.createComment( "" ) );
1194
		return !el.getElementsByTagName( "*" ).length;
1195
	} );
1196

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

1200
	// Support: IE<10
1201
	// Check if getElementById returns elements by name
1202
	// The broken getElementById methods don't pick up programmatically-set names,
1203
	// so use a roundabout getElementsByName test
1204
	support.getById = assert( function( el ) {
1205
		docElem.appendChild( el ).id = expando;
1206
		return !document.getElementsByName || !document.getElementsByName( expando ).length;
1207
	} );
1208

1209
	// ID filter and find
1210
	if ( support.getById ) {
1211
		Expr.filter[ "ID" ] = function( id ) {
1212
			var attrId = id.replace( runescape, funescape );
1213
			return function( elem ) {
1214
				return elem.getAttribute( "id" ) === attrId;
1215
			};
1216
		};
1217
		Expr.find[ "ID" ] = function( id, context ) {
1218
			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1219
				var elem = context.getElementById( id );
1220
				return elem ? [ elem ] : [];
1221
			}
1222
		};
1223
	} else {
1224
		Expr.filter[ "ID" ] =  function( id ) {
1225
			var attrId = id.replace( runescape, funescape );
1226
			return function( elem ) {
1227
				var node = typeof elem.getAttributeNode !== "undefined" &&
1228
					elem.getAttributeNode( "id" );
1229
				return node && node.value === attrId;
1230
			};
1231
		};
1232

1233
		// Support: IE 6 - 7 only
1234
		// getElementById is not reliable as a find shortcut
1235
		Expr.find[ "ID" ] = function( id, context ) {
1236
			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1237
				var node, i, elems,
1238
					elem = context.getElementById( id );
1239

1240
				if ( elem ) {
1241

1242
					// Verify the id attribute
1243
					node = elem.getAttributeNode( "id" );
1244
					if ( node && node.value === id ) {
1245
						return [ elem ];
1246
					}
1247

1248
					// Fall back on getElementsByName
1249
					elems = context.getElementsByName( id );
1250
					i = 0;
1251
					while ( ( elem = elems[ i++ ] ) ) {
1252
						node = elem.getAttributeNode( "id" );
1253
						if ( node && node.value === id ) {
1254
							return [ elem ];
1255
						}
1256
					}
1257
				}
1258

1259
				return [];
1260
			}
1261
		};
1262
	}
1263

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

1270
			// DocumentFragment nodes don't have gEBTN
1271
			} else if ( support.qsa ) {
1272
				return context.querySelectorAll( tag );
1273
			}
1274
		} :
1275

1276
		function( tag, context ) {
1277
			var elem,
1278
				tmp = [],
1279
				i = 0,
1280

1281
				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1282
				results = context.getElementsByTagName( tag );
1283

1284
			// Filter out possible comments
1285
			if ( tag === "*" ) {
1286
				while ( ( elem = results[ i++ ] ) ) {
1287
					if ( elem.nodeType === 1 ) {
1288
						tmp.push( elem );
1289
					}
1290
				}
1291

1292
				return tmp;
1293
			}
1294
			return results;
1295
		};
1296

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

1304
	/* QSA/matchesSelector
1305
	---------------------------------------------------------------------- */
1306

1307
	// QSA and matchesSelector support
1308

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

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

1319
	if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
1320

1321
		// Build QSA regex
1322
		// Regex strategy adopted from Diego Perini
1323
		assert( function( el ) {
1324

1325
			var input;
1326

1327
			// Select is set to empty string on purpose
1328
			// This is to test IE's treatment of not explicitly
1329
			// setting a boolean content attribute,
1330
			// since its presence should be enough
1331
			// https://bugs.jquery.com/ticket/12359
1332
			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1333
				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
1334
				"<option selected=''></option></select>";
1335

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

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

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

1355
			// Support: IE 11+, Edge 15 - 18+
1356
			// IE 11/Edge don't find elements on a `[name='']` query in some cases.
1357
			// Adding a temporary attribute to the document before the selection works
1358
			// around the issue.
1359
			// Interestingly, IE 10 & older don't seem to have the issue.
1360
			input = document.createElement( "input" );
1361
			input.setAttribute( "name", "" );
1362
			el.appendChild( input );
1363
			if ( !el.querySelectorAll( "[name='']" ).length ) {
1364
				rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1365
					whitespace + "*(?:''|\"\")" );
1366
			}
1367

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

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

1382
			// Support: Firefox <=3.6 - 5 only
1383
			// Old Firefox doesn't throw on a badly-escaped identifier.
1384
			el.querySelectorAll( "\\\f" );
1385
			rbuggyQSA.push( "[\\r\\n\\f]" );
1386
		} );
1387

1388
		assert( function( el ) {
1389
			el.innerHTML = "<a href='' disabled='disabled'></a>" +
1390
				"<select disabled='disabled'><option/></select>";
1391

1392
			// Support: Windows 8 Native Apps
1393
			// The type and name attributes are restricted during .innerHTML assignment
1394
			var input = document.createElement( "input" );
1395
			input.setAttribute( "type", "hidden" );
1396
			el.appendChild( input ).setAttribute( "name", "D" );
1397

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

1404
			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1405
			// IE8 throws error here and will not see later tests
1406
			if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
1407
				rbuggyQSA.push( ":enabled", ":disabled" );
1408
			}
1409

1410
			// Support: IE9-11+
1411
			// IE's :disabled selector does not pick up the children of disabled fieldsets
1412
			docElem.appendChild( el ).disabled = true;
1413
			if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1414
				rbuggyQSA.push( ":enabled", ":disabled" );
1415
			}
1416

1417
			// Support: Opera 10 - 11 only
1418
			// Opera 10-11 does not throw on post-comma invalid pseudos
1419
			el.querySelectorAll( "*,:x" );
1420
			rbuggyQSA.push( ",.*:" );
1421
		} );
1422
	}
1423

1424
	if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
1425
		docElem.webkitMatchesSelector ||
1426
		docElem.mozMatchesSelector ||
1427
		docElem.oMatchesSelector ||
1428
		docElem.msMatchesSelector ) ) ) ) {
1429

1430
		assert( function( el ) {
1431

1432
			// Check to see if it's possible to do matchesSelector
1433
			// on a disconnected node (IE 9)
1434
			support.disconnectedMatch = matches.call( el, "*" );
1435

1436
			// This should fail with an exception
1437
			// Gecko does not error, returns false instead
1438
			matches.call( el, "[s!='']:x" );
1439
			rbuggyMatches.push( "!=", pseudos );
1440
		} );
1441
	}
1442

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

1446
	/* Contains
1447
	---------------------------------------------------------------------- */
1448
	hasCompare = rnative.test( docElem.compareDocumentPosition );
1449

1450
	// Element contains another
1451
	// Purposefully self-exclusive
1452
	// As in, an element does not contain itself
1453
	contains = hasCompare || rnative.test( docElem.contains ) ?
1454
		function( a, b ) {
1455
			var adown = a.nodeType === 9 ? a.documentElement : a,
1456
				bup = b && b.parentNode;
1457
			return a === bup || !!( bup && bup.nodeType === 1 && (
1458
				adown.contains ?
1459
					adown.contains( bup ) :
1460
					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1461
			) );
1462
		} :
1463
		function( a, b ) {
1464
			if ( b ) {
1465
				while ( ( b = b.parentNode ) ) {
1466
					if ( b === a ) {
1467
						return true;
1468
					}
1469
				}
1470
			}
1471
			return false;
1472
		};
1473

1474
	/* Sorting
1475
	---------------------------------------------------------------------- */
1476

1477
	// Document order sorting
1478
	sortOrder = hasCompare ?
1479
	function( a, b ) {
1480

1481
		// Flag for duplicate removal
1482
		if ( a === b ) {
1483
			hasDuplicate = true;
1484
			return 0;
1485
		}
1486

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

1493
		// Calculate position if both inputs belong to the same document
1494
		// Support: IE 11+, Edge 17 - 18+
1495
		// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1496
		// two documents; shallow comparisons work.
1497
		// eslint-disable-next-line eqeqeq
1498
		compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
1499
			a.compareDocumentPosition( b ) :
1500

1501
			// Otherwise we know they are disconnected
1502
			1;
1503

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

1508
			// Choose the first element that is related to our preferred document
1509
			// Support: IE 11+, Edge 17 - 18+
1510
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1511
			// two documents; shallow comparisons work.
1512
			// eslint-disable-next-line eqeqeq
1513
			if ( a == document || a.ownerDocument == preferredDoc &&
1514
				contains( preferredDoc, a ) ) {
1515
				return -1;
1516
			}
1517

1518
			// Support: IE 11+, Edge 17 - 18+
1519
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1520
			// two documents; shallow comparisons work.
1521
			// eslint-disable-next-line eqeqeq
1522
			if ( b == document || b.ownerDocument == preferredDoc &&
1523
				contains( preferredDoc, b ) ) {
1524
				return 1;
1525
			}
1526

1527
			// Maintain original order
1528
			return sortInput ?
1529
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1530
				0;
1531
		}
1532

1533
		return compare & 4 ? -1 : 1;
1534
	} :
1535
	function( a, b ) {
1536

1537
		// Exit early if the nodes are identical
1538
		if ( a === b ) {
1539
			hasDuplicate = true;
1540
			return 0;
1541
		}
1542

1543
		var cur,
1544
			i = 0,
1545
			aup = a.parentNode,
1546
			bup = b.parentNode,
1547
			ap = [ a ],
1548
			bp = [ b ];
1549

1550
		// Parentless nodes are either documents or disconnected
1551
		if ( !aup || !bup ) {
1552

1553
			// Support: IE 11+, Edge 17 - 18+
1554
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1555
			// two documents; shallow comparisons work.
1556
			/* eslint-disable eqeqeq */
1557
			return a == document ? -1 :
1558
				b == document ? 1 :
1559
				/* eslint-enable eqeqeq */
1560
				aup ? -1 :
1561
				bup ? 1 :
1562
				sortInput ?
1563
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1564
				0;
1565

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

1571
		// Otherwise we need full lists of their ancestors for comparison
1572
		cur = a;
1573
		while ( ( cur = cur.parentNode ) ) {
1574
			ap.unshift( cur );
1575
		}
1576
		cur = b;
1577
		while ( ( cur = cur.parentNode ) ) {
1578
			bp.unshift( cur );
1579
		}
1580

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

1586
		return i ?
1587

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

1591
			// Otherwise nodes in our document sort first
1592
			// Support: IE 11+, Edge 17 - 18+
1593
			// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1594
			// two documents; shallow comparisons work.
1595
			/* eslint-disable eqeqeq */
1596
			ap[ i ] == preferredDoc ? -1 :
1597
			bp[ i ] == preferredDoc ? 1 :
1598
			/* eslint-enable eqeqeq */
1599
			0;
1600
	};
1601

1602
	return document;
1603
};
1604

1605
Sizzle.matches = function( expr, elements ) {
1606
	return Sizzle( expr, null, null, elements );
1607
};
1608

1609
Sizzle.matchesSelector = function( elem, expr ) {
1610
	setDocument( elem );
1611

1612
	if ( support.matchesSelector && documentIsHTML &&
1613
		!nonnativeSelectorCache[ expr + " " ] &&
1614
		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1615
		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1616

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

1620
			// IE 9's matchesSelector returns false on disconnected nodes
1621
			if ( ret || support.disconnectedMatch ||
1622

1623
				// As well, disconnected nodes are said to be in a document
1624
				// fragment in IE 9
1625
				elem.document && elem.document.nodeType !== 11 ) {
1626
				return ret;
1627
			}
1628
		} catch ( e ) {
1629
			nonnativeSelectorCache( expr, true );
1630
		}
1631
	}
1632

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

1636
Sizzle.contains = function( context, elem ) {
1637

1638
	// Set document vars if needed
1639
	// Support: IE 11+, Edge 17 - 18+
1640
	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1641
	// two documents; shallow comparisons work.
1642
	// eslint-disable-next-line eqeqeq
1643
	if ( ( context.ownerDocument || context ) != document ) {
1644
		setDocument( context );
1645
	}
1646
	return contains( context, elem );
1647
};
1648

1649
Sizzle.attr = function( elem, name ) {
1650

1651
	// Set document vars if needed
1652
	// Support: IE 11+, Edge 17 - 18+
1653
	// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1654
	// two documents; shallow comparisons work.
1655
	// eslint-disable-next-line eqeqeq
1656
	if ( ( elem.ownerDocument || elem ) != document ) {
1657
		setDocument( elem );
1658
	}
1659

1660
	var fn = Expr.attrHandle[ name.toLowerCase() ],
1661

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

1667
	return val !== undefined ?
1668
		val :
1669
		support.attributes || !documentIsHTML ?
1670
			elem.getAttribute( name ) :
1671
			( val = elem.getAttributeNode( name ) ) && val.specified ?
1672
				val.value :
1673
				null;
1674
};
1675

1676
Sizzle.escape = function( sel ) {
1677
	return ( sel + "" ).replace( rcssescape, fcssescape );
1678
};
1679

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

1684
/**
1685
 * Document sorting and removing duplicates
1686
 * @param {ArrayLike} results
1687
 */
1688
Sizzle.uniqueSort = function( results ) {
1689
	var elem,
1690
		duplicates = [],
1691
		j = 0,
1692
		i = 0;
1693

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

1699
	if ( hasDuplicate ) {
1700
		while ( ( elem = results[ i++ ] ) ) {
1701
			if ( elem === results[ i ] ) {
1702
				j = duplicates.push( i );
1703
			}
1704
		}
1705
		while ( j-- ) {
1706
			results.splice( duplicates[ j ], 1 );
1707
		}
1708
	}
1709

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

1714
	return results;
1715
};
1716

1717
/**
1718
 * Utility function for retrieving the text value of an array of DOM nodes
1719
 * @param {Array|Element} elem
1720
 */
1721
getText = Sizzle.getText = function( elem ) {
1722
	var node,
1723
		ret = "",
1724
		i = 0,
1725
		nodeType = elem.nodeType;
1726

1727
	if ( !nodeType ) {
1728

1729
		// If no nodeType, this is expected to be an array
1730
		while ( ( node = elem[ i++ ] ) ) {
1731

1732
			// Do not traverse comment nodes
1733
			ret += getText( node );
1734
		}
1735
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1736

1737
		// Use textContent for elements
1738
		// innerText usage removed for consistency of new lines (jQuery #11153)
1739
		if ( typeof elem.textContent === "string" ) {
1740
			return elem.textContent;
1741
		} else {
1742

1743
			// Traverse its children
1744
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1745
				ret += getText( elem );
1746
			}
1747
		}
1748
	} else if ( nodeType === 3 || nodeType === 4 ) {
1749
		return elem.nodeValue;
1750
	}
1751

1752
	// Do not include comment or processing instruction nodes
1753

1754
	return ret;
1755
};
1756

1757
Expr = Sizzle.selectors = {
1758

1759
	// Can be adjusted by the user
1760
	cacheLength: 50,
1761

1762
	createPseudo: markFunction,
1763

1764
	match: matchExpr,
1765

1766
	attrHandle: {},
1767

1768
	find: {},
1769

1770
	relative: {
1771
		">": { dir: "parentNode", first: true },
1772
		" ": { dir: "parentNode" },
1773
		"+": { dir: "previousSibling", first: true },
1774
		"~": { dir: "previousSibling" }
1775
	},
1776

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

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

1785
			if ( match[ 2 ] === "~=" ) {
1786
				match[ 3 ] = " " + match[ 3 ] + " ";
1787
			}
1788

1789
			return match.slice( 0, 4 );
1790
		},
1791

1792
		"CHILD": function( match ) {
1793

1794
			/* matches from matchExpr["CHILD"]
1795
				1 type (only|nth|...)
1796
				2 what (child|of-type)
1797
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1798
				4 xn-component of xn+y argument ([+-]?\d*n|)
1799
				5 sign of xn-component
1800
				6 x of xn-component
1801
				7 sign of y-component
1802
				8 y of y-component
1803
			*/
1804
			match[ 1 ] = match[ 1 ].toLowerCase();
1805

1806
			if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
1807

1808
				// nth-* requires argument
1809
				if ( !match[ 3 ] ) {
1810
					Sizzle.error( match[ 0 ] );
1811
				}
1812

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

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

1825
			return match;
1826
		},
1827

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

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

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

1840
			// Strip excess characters from unquoted arguments
1841
			} else if ( unquoted && rpseudo.test( unquoted ) &&
1842

1843
				// Get excess from tokenize (recursively)
1844
				( excess = tokenize( unquoted, true ) ) &&
1845

1846
				// advance to the next closing parenthesis
1847
				( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
1848

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

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

1859
	filter: {
1860

1861
		"TAG": function( nodeNameSelector ) {
1862
			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1863
			return nodeNameSelector === "*" ?
1864
				function() {
1865
					return true;
1866
				} :
1867
				function( elem ) {
1868
					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1869
				};
1870
		},
1871

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

1875
			return pattern ||
1876
				( pattern = new RegExp( "(^|" + whitespace +
1877
					")" + className + "(" + whitespace + "|$)" ) ) && classCache(
1878
						className, function( elem ) {
1879
							return pattern.test(
1880
								typeof elem.className === "string" && elem.className ||
1881
								typeof elem.getAttribute !== "undefined" &&
1882
									elem.getAttribute( "class" ) ||
1883
								""
1884
							);
1885
				} );
1886
		},
1887

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

1892
				if ( result == null ) {
1893
					return operator === "!=";
1894
				}
1895
				if ( !operator ) {
1896
					return true;
1897
				}
1898

1899
				result += "";
1900

1901
				/* eslint-disable max-len */
1902

1903
				return operator === "=" ? result === check :
1904
					operator === "!=" ? result !== check :
1905
					operator === "^=" ? check && result.indexOf( check ) === 0 :
1906
					operator === "*=" ? check && result.indexOf( check ) > -1 :
1907
					operator === "$=" ? check && result.slice( -check.length ) === check :
1908
					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1909
					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1910
					false;
1911
				/* eslint-enable max-len */
1912

1913
			};
1914
		},
1915

1916
		"CHILD": function( type, what, _argument, first, last ) {
1917
			var simple = type.slice( 0, 3 ) !== "nth",
1918
				forward = type.slice( -4 ) !== "last",
1919
				ofType = what === "of-type";
1920

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

1923
				// Shortcut for :nth-*(n)
1924
				function( elem ) {
1925
					return !!elem.parentNode;
1926
				} :
1927

1928
				function( elem, _context, xml ) {
1929
					var cache, uniqueCache, outerCache, node, nodeIndex, start,
1930
						dir = simple !== forward ? "nextSibling" : "previousSibling",
1931
						parent = elem.parentNode,
1932
						name = ofType && elem.nodeName.toLowerCase(),
1933
						useCache = !xml && !ofType,
1934
						diff = false;
1935

1936
					if ( parent ) {
1937

1938
						// :(first|last|only)-(child|of-type)
1939
						if ( simple ) {
1940
							while ( dir ) {
1941
								node = elem;
1942
								while ( ( node = node[ dir ] ) ) {
1943
									if ( ofType ?
1944
										node.nodeName.toLowerCase() === name :
1945
										node.nodeType === 1 ) {
1946

1947
										return false;
1948
									}
1949
								}
1950

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

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

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

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

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

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

1973
							cache = uniqueCache[ type ] || [];
1974
							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1975
							diff = nodeIndex && cache[ 2 ];
1976
							node = nodeIndex && parent.childNodes[ nodeIndex ];
1977

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

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

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

1990
						} else {
1991

1992
							// Use previously-cached element index if available
1993
							if ( useCache ) {
1994

1995
								// ...in a gzip-friendly way
1996
								node = elem;
1997
								outerCache = node[ expando ] || ( node[ expando ] = {} );
1998

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

2004
								cache = uniqueCache[ type ] || [];
2005
								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2006
								diff = nodeIndex;
2007
							}
2008

2009
							// xml :nth-child(...)
2010
							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
2011
							if ( diff === false ) {
2012

2013
								// Use the same loop as above to seek `elem` from the start
2014
								while ( ( node = ++nodeIndex && node && node[ dir ] ||
2015
									( diff = nodeIndex = 0 ) || start.pop() ) ) {
2016

2017
									if ( ( ofType ?
2018
										node.nodeName.toLowerCase() === name :
2019
										node.nodeType === 1 ) &&
2020
										++diff ) {
2021

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

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

2032
											uniqueCache[ type ] = [ dirruns, diff ];
2033
										}
2034

2035
										if ( node === elem ) {
2036
											break;
2037
										}
2038
									}
2039
								}
2040
							}
2041
						}
2042

2043
						// Incorporate the offset, then check against cycle size
2044
						diff -= last;
2045
						return diff === first || ( diff % first === 0 && diff / first >= 0 );
2046
					}
2047
				};
2048
		},
2049

2050
		"PSEUDO": function( pseudo, argument ) {
2051

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

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

2067
			// But maintain support for old signatures
2068
			if ( fn.length > 1 ) {
2069
				args = [ pseudo, pseudo, "", argument ];
2070
				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
2071
					markFunction( function( seed, matches ) {
2072
						var idx,
2073
							matched = fn( seed, argument ),
2074
							i = matched.length;
2075
						while ( i-- ) {
2076
							idx = indexOf( seed, matched[ i ] );
2077
							seed[ idx ] = !( matches[ idx ] = matched[ i ] );
2078
						}
2079
					} ) :
2080
					function( elem ) {
2081
						return fn( elem, 0, args );
2082
					};
2083
			}
2084

2085
			return fn;
2086
		}
2087
	},
2088

2089
	pseudos: {
2090

2091
		// Potentially complex pseudos
2092
		"not": markFunction( function( selector ) {
2093

2094
			// Trim the selector passed to compile
2095
			// to avoid treating leading and trailing
2096
			// spaces as combinators
2097
			var input = [],
2098
				results = [],
2099
				matcher = compile( selector.replace( rtrim, "$1" ) );
2100

2101
			return matcher[ expando ] ?
2102
				markFunction( function( seed, matches, _context, xml ) {
2103
					var elem,
2104
						unmatched = matcher( seed, null, xml, [] ),
2105
						i = seed.length;
2106

2107
					// Match elements unmatched by `matcher`
2108
					while ( i-- ) {
2109
						if ( ( elem = unmatched[ i ] ) ) {
2110
							seed[ i ] = !( matches[ i ] = elem );
2111
						}
2112
					}
2113
				} ) :
2114
				function( elem, _context, xml ) {
2115
					input[ 0 ] = elem;
2116
					matcher( input, null, xml, results );
2117

2118
					// Don't keep the element (issue #299)
2119
					input[ 0 ] = null;
2120
					return !results.pop();
2121
				};
2122
		} ),
2123

2124
		"has": markFunction( function( selector ) {
2125
			return function( elem ) {
2126
				return Sizzle( selector, elem ).length > 0;
2127
			};
2128
		} ),
2129

2130
		"contains": markFunction( function( text ) {
2131
			text = text.replace( runescape, funescape );
2132
			return function( elem ) {
2133
				return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
2134
			};
2135
		} ),
2136

2137
		// "Whether an element is represented by a :lang() selector
2138
		// is based solely on the element's language value
2139
		// being equal to the identifier C,
2140
		// or beginning with the identifier C immediately followed by "-".
2141
		// The matching of C against the element's language value is performed case-insensitively.
2142
		// The identifier C does not have to be a valid language name."
2143
		// http://www.w3.org/TR/selectors/#lang-pseudo
2144
		"lang": markFunction( function( lang ) {
2145

2146
			// lang value must be a valid identifier
2147
			if ( !ridentifier.test( lang || "" ) ) {
2148
				Sizzle.error( "unsupported lang: " + lang );
2149
			}
2150
			lang = lang.replace( runescape, funescape ).toLowerCase();
2151
			return function( elem ) {
2152
				var elemLang;
2153
				do {
2154
					if ( ( elemLang = documentIsHTML ?
2155
						elem.lang :
2156
						elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
2157

2158
						elemLang = elemLang.toLowerCase();
2159
						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2160
					}
2161
				} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
2162
				return false;
2163
			};
2164
		} ),
2165

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

2172
		"root": function( elem ) {
2173
			return elem === docElem;
2174
		},
2175

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

2182
		// Boolean properties
2183
		"enabled": createDisabledPseudo( false ),
2184
		"disabled": createDisabledPseudo( true ),
2185

2186
		"checked": function( elem ) {
2187

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

2195
		"selected": function( elem ) {
2196

2197
			// Accessing this property makes selected-by-default
2198
			// options in Safari work properly
2199
			if ( elem.parentNode ) {
2200
				// eslint-disable-next-line no-unused-expressions
2201
				elem.parentNode.selectedIndex;
2202
			}
2203

2204
			return elem.selected === true;
2205
		},
2206

2207
		// Contents
2208
		"empty": function( elem ) {
2209

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

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

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

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

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

2240
		"text": function( elem ) {
2241
			var attr;
2242
			return elem.nodeName.toLowerCase() === "input" &&
2243
				elem.type === "text" &&
2244

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

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

2256
		"last": createPositionalPseudo( function( _matchIndexes, length ) {
2257
			return [ length - 1 ];
2258
		} ),
2259

2260
		"eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
2261
			return [ argument < 0 ? argument + length : argument ];
2262
		} ),
2263

2264
		"even": createPositionalPseudo( function( matchIndexes, length ) {
2265
			var i = 0;
2266
			for ( ; i < length; i += 2 ) {
2267
				matchIndexes.push( i );
2268
			}
2269
			return matchIndexes;
2270
		} ),
2271

2272
		"odd": createPositionalPseudo( function( matchIndexes, length ) {
2273
			var i = 1;
2274
			for ( ; i < length; i += 2 ) {
2275
				matchIndexes.push( i );
2276
			}
2277
			return matchIndexes;
2278
		} ),
2279

2280
		"lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2281
			var i = argument < 0 ?
2282
				argument + length :
2283
				argument > length ?
2284
					length :
2285
					argument;
2286
			for ( ; --i >= 0; ) {
2287
				matchIndexes.push( i );
2288
			}
2289
			return matchIndexes;
2290
		} ),
2291

2292
		"gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2293
			var i = argument < 0 ? argument + length : argument;
2294
			for ( ; ++i < length; ) {
2295
				matchIndexes.push( i );
2296
			}
2297
			return matchIndexes;
2298
		} )
2299
	}
2300
};
2301

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

2304
// Add button/input type pseudos
2305
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2306
	Expr.pseudos[ i ] = createInputPseudo( i );
2307
}
2308
for ( i in { submit: true, reset: true } ) {
2309
	Expr.pseudos[ i ] = createButtonPseudo( i );
2310
}
2311

2312
// Easy API for creating new setFilters
2313
function setFilters() {}
2314
setFilters.prototype = Expr.filters = Expr.pseudos;
2315
Expr.setFilters = new setFilters();
2316

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

2322
	if ( cached ) {
2323
		return parseOnly ? 0 : cached.slice( 0 );
2324
	}
2325

2326
	soFar = selector;
2327
	groups = [];
2328
	preFilters = Expr.preFilter;
2329

2330
	while ( soFar ) {
2331

2332
		// Comma and first run
2333
		if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
2334
			if ( match ) {
2335

2336
				// Don't consume trailing commas as valid
2337
				soFar = soFar.slice( match[ 0 ].length ) || soFar;
2338
			}
2339
			groups.push( ( tokens = [] ) );
2340
		}
2341

2342
		matched = false;
2343

2344
		// Combinators
2345
		if ( ( match = rcombinators.exec( soFar ) ) ) {
2346
			matched = match.shift();
2347
			tokens.push( {
2348
				value: matched,
2349

2350
				// Cast descendant combinators to space
2351
				type: match[ 0 ].replace( rtrim, " " )
2352
			} );
2353
			soFar = soFar.slice( matched.length );
2354
		}
2355

2356
		// Filters
2357
		for ( type in Expr.filter ) {
2358
			if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2359
				( match = preFilters[ type ]( match ) ) ) ) {
2360
				matched = match.shift();
2361
				tokens.push( {
2362
					value: matched,
2363
					type: type,
2364
					matches: match
2365
				} );
2366
				soFar = soFar.slice( matched.length );
2367
			}
2368
		}
2369

2370
		if ( !matched ) {
2371
			break;
2372
		}
2373
	}
2374

2375
	// Return the length of the invalid excess
2376
	// if we're just parsing
2377
	// Otherwise, throw an error or return tokens
2378
	return parseOnly ?
2379
		soFar.length :
2380
		soFar ?
2381
			Sizzle.error( selector ) :
2382

2383
			// Cache the tokens
2384
			tokenCache( selector, groups ).slice( 0 );
2385
};
2386

2387
function toSelector( tokens ) {
2388
	var i = 0,
2389
		len = tokens.length,
2390
		selector = "";
2391
	for ( ; i < len; i++ ) {
2392
		selector += tokens[ i ].value;
2393
	}
2394
	return selector;
2395
}
2396

2397
function addCombinator( matcher, combinator, base ) {
2398
	var dir = combinator.dir,
2399
		skip = combinator.next,
2400
		key = skip || dir,
2401
		checkNonElements = base && key === "parentNode",
2402
		doneName = done++;
2403

2404
	return combinator.first ?
2405

2406
		// Check against closest ancestor/preceding element
2407
		function( elem, context, xml ) {
2408
			while ( ( elem = elem[ dir ] ) ) {
2409
				if ( elem.nodeType === 1 || checkNonElements ) {
2410
					return matcher( elem, context, xml );
2411
				}
2412
			}
2413
			return false;
2414
		} :
2415

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

2421
			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2422
			if ( xml ) {
2423
				while ( ( elem = elem[ dir ] ) ) {
2424
					if ( elem.nodeType === 1 || checkNonElements ) {
2425
						if ( matcher( elem, context, xml ) ) {
2426
							return true;
2427
						}
2428
					}
2429
				}
2430
			} else {
2431
				while ( ( elem = elem[ dir ] ) ) {
2432
					if ( elem.nodeType === 1 || checkNonElements ) {
2433
						outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2434

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

2440
						if ( skip && skip === elem.nodeName.toLowerCase() ) {
2441
							elem = elem[ dir ] || elem;
2442
						} else if ( ( oldCache = uniqueCache[ key ] ) &&
2443
							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2444

2445
							// Assign to newCache so results back-propagate to previous elements
2446
							return ( newCache[ 2 ] = oldCache[ 2 ] );
2447
						} else {
2448

2449
							// Reuse newcache so results back-propagate to previous elements
2450
							uniqueCache[ key ] = newCache;
2451

2452
							// A match means we're done; a fail means we have to keep checking
2453
							if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
2454
								return true;
2455
							}
2456
						}
2457
					}
2458
				}
2459
			}
2460
			return false;
2461
		};
2462
}
2463

2464
function elementMatcher( matchers ) {
2465
	return matchers.length > 1 ?
2466
		function( elem, context, xml ) {
2467
			var i = matchers.length;
2468
			while ( i-- ) {
2469
				if ( !matchers[ i ]( elem, context, xml ) ) {
2470
					return false;
2471
				}
2472
			}
2473
			return true;
2474
		} :
2475
		matchers[ 0 ];
2476
}
2477

2478
function multipleContexts( selector, contexts, results ) {
2479
	var i = 0,
2480
		len = contexts.length;
2481
	for ( ; i < len; i++ ) {
2482
		Sizzle( selector, contexts[ i ], results );
2483
	}
2484
	return results;
2485
}
2486

2487
function condense( unmatched, map, filter, context, xml ) {
2488
	var elem,
2489
		newUnmatched = [],
2490
		i = 0,
2491
		len = unmatched.length,
2492
		mapped = map != null;
2493

2494
	for ( ; i < len; i++ ) {
2495
		if ( ( elem = unmatched[ i ] ) ) {
2496
			if ( !filter || filter( elem, context, xml ) ) {
2497
				newUnmatched.push( elem );
2498
				if ( mapped ) {
2499
					map.push( i );
2500
				}
2501
			}
2502
		}
2503
	}
2504

2505
	return newUnmatched;
2506
}
2507

2508
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2509
	if ( postFilter && !postFilter[ expando ] ) {
2510
		postFilter = setMatcher( postFilter );
2511
	}
2512
	if ( postFinder && !postFinder[ expando ] ) {
2513
		postFinder = setMatcher( postFinder, postSelector );
2514
	}
2515
	return markFunction( function( seed, results, context, xml ) {
2516
		var temp, i, elem,
2517
			preMap = [],
2518
			postMap = [],
2519
			preexisting = results.length,
2520

2521
			// Get initial elements from seed or context
2522
			elems = seed || multipleContexts(
2523
				selector || "*",
2524
				context.nodeType ? [ context ] : context,
2525
				[]
2526
			),
2527

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

2533
			matcherOut = matcher ?
2534

2535
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2536
				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2537

2538
					// ...intermediate processing is necessary
2539
					[] :
2540

2541
					// ...otherwise use results directly
2542
					results :
2543
				matcherIn;
2544

2545
		// Find primary matches
2546
		if ( matcher ) {
2547
			matcher( matcherIn, matcherOut, context, xml );
2548
		}
2549

2550
		// Apply postFilter
2551
		if ( postFilter ) {
2552
			temp = condense( matcherOut, postMap );
2553
			postFilter( temp, [], context, xml );
2554

2555
			// Un-match failing elements by moving them back to matcherIn
2556
			i = temp.length;
2557
			while ( i-- ) {
2558
				if ( ( elem = temp[ i ] ) ) {
2559
					matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
2560
				}
2561
			}
2562
		}
2563

2564
		if ( seed ) {
2565
			if ( postFinder || preFilter ) {
2566
				if ( postFinder ) {
2567

2568
					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2569
					temp = [];
2570
					i = matcherOut.length;
2571
					while ( i-- ) {
2572
						if ( ( elem = matcherOut[ i ] ) ) {
2573

2574
							// Restore matcherIn since elem is not yet a final match
2575
							temp.push( ( matcherIn[ i ] = elem ) );
2576
						}
2577
					}
2578
					postFinder( null, ( matcherOut = [] ), temp, xml );
2579
				}
2580

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

2587
						seed[ temp ] = !( results[ temp ] = elem );
2588
					}
2589
				}
2590
			}
2591

2592
		// Add elements to results, through postFinder if defined
2593
		} else {
2594
			matcherOut = condense(
2595
				matcherOut === results ?
2596
					matcherOut.splice( preexisting, matcherOut.length ) :
2597
					matcherOut
2598
			);
2599
			if ( postFinder ) {
2600
				postFinder( null, results, matcherOut, xml );
2601
			} else {
2602
				push.apply( results, matcherOut );
2603
			}
2604
		}
2605
	} );
2606
}
2607

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

2615
		// The foundational matcher ensures that elements are reachable from top-level context(s)
2616
		matchContext = addCombinator( function( elem ) {
2617
			return elem === checkContext;
2618
		}, implicitRelative, true ),
2619
		matchAnyContext = addCombinator( function( elem ) {
2620
			return indexOf( checkContext, elem ) > -1;
2621
		}, implicitRelative, true ),
2622
		matchers = [ function( elem, context, xml ) {
2623
			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2624
				( checkContext = context ).nodeType ?
2625
					matchContext( elem, context, xml ) :
2626
					matchAnyContext( elem, context, xml ) );
2627

2628
			// Avoid hanging onto element (issue #299)
2629
			checkContext = null;
2630
			return ret;
2631
		} ];
2632

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

2639
			// Return special upon seeing a positional matcher
2640
			if ( matcher[ expando ] ) {
2641

2642
				// Find the next relative operator (if any) for proper handling
2643
				j = ++i;
2644
				for ( ; j < len; j++ ) {
2645
					if ( Expr.relative[ tokens[ j ].type ] ) {
2646
						break;
2647
					}
2648
				}
2649
				return setMatcher(
2650
					i > 1 && elementMatcher( matchers ),
2651
					i > 1 && toSelector(
2652

2653
					// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2654
					tokens
2655
						.slice( 0, i - 1 )
2656
						.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2657
					).replace( rtrim, "$1" ),
2658
					matcher,
2659
					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2660
					j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
2661
					j < len && toSelector( tokens )
2662
				);
2663
			}
2664
			matchers.push( matcher );
2665
		}
2666
	}
2667

2668
	return elementMatcher( matchers );
2669
}
2670

2671
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2672
	var bySet = setMatchers.length > 0,
2673
		byElement = elementMatchers.length > 0,
2674
		superMatcher = function( seed, context, xml, results, outermost ) {
2675
			var elem, j, matcher,
2676
				matchedCount = 0,
2677
				i = "0",
2678
				unmatched = seed && [],
2679
				setMatched = [],
2680
				contextBackup = outermostContext,
2681

2682
				// We must always have either seed elements or outermost context
2683
				elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
2684

2685
				// Use integer dirruns iff this is the outermost matcher
2686
				dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
2687
				len = elems.length;
2688

2689
			if ( outermost ) {
2690

2691
				// Support: IE 11+, Edge 17 - 18+
2692
				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2693
				// two documents; shallow comparisons work.
2694
				// eslint-disable-next-line eqeqeq
2695
				outermostContext = context == document || context || outermost;
2696
			}
2697

2698
			// Add elements passing elementMatchers directly to results
2699
			// Support: IE<9, Safari
2700
			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2701
			for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2702
				if ( byElement && elem ) {
2703
					j = 0;
2704

2705
					// Support: IE 11+, Edge 17 - 18+
2706
					// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2707
					// two documents; shallow comparisons work.
2708
					// eslint-disable-next-line eqeqeq
2709
					if ( !context && elem.ownerDocument != document ) {
2710
						setDocument( elem );
2711
						xml = !documentIsHTML;
2712
					}
2713
					while ( ( matcher = elementMatchers[ j++ ] ) ) {
2714
						if ( matcher( elem, context || document, xml ) ) {
2715
							results.push( elem );
2716
							break;
2717
						}
2718
					}
2719
					if ( outermost ) {
2720
						dirruns = dirrunsUnique;
2721
					}
2722
				}
2723

2724
				// Track unmatched elements for set filters
2725
				if ( bySet ) {
2726

2727
					// They will have gone through all possible matchers
2728
					if ( ( elem = !matcher && elem ) ) {
2729
						matchedCount--;
2730
					}
2731

2732
					// Lengthen the array for every element, matched or not
2733
					if ( seed ) {
2734
						unmatched.push( elem );
2735
					}
2736
				}
2737
			}
2738

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

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

2756
				if ( seed ) {
2757

2758
					// Reintegrate element matches to eliminate the need for sorting
2759
					if ( matchedCount > 0 ) {
2760
						while ( i-- ) {
2761
							if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2762
								setMatched[ i ] = pop.call( results );
2763
							}
2764
						}
2765
					}
2766

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

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

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

2778
					Sizzle.uniqueSort( results );
2779
				}
2780
			}
2781

2782
			// Override manipulation of globals by nested matchers
2783
			if ( outermost ) {
2784
				dirruns = dirrunsUnique;
2785
				outermostContext = contextBackup;
2786
			}
2787

2788
			return unmatched;
2789
		};
2790

2791
	return bySet ?
2792
		markFunction( superMatcher ) :
2793
		superMatcher;
2794
}
2795

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

2802
	if ( !cached ) {
2803

2804
		// Generate a function of recursive functions that can be used to check each element
2805
		if ( !match ) {
2806
			match = tokenize( selector );
2807
		}
2808
		i = match.length;
2809
		while ( i-- ) {
2810
			cached = matcherFromTokens( match[ i ] );
2811
			if ( cached[ expando ] ) {
2812
				setMatchers.push( cached );
2813
			} else {
2814
				elementMatchers.push( cached );
2815
			}
2816
		}
2817

2818
		// Cache the compiled function
2819
		cached = compilerCache(
2820
			selector,
2821
			matcherFromGroupMatchers( elementMatchers, setMatchers )
2822
		);
2823

2824
		// Save selector and tokenization
2825
		cached.selector = selector;
2826
	}
2827
	return cached;
2828
};
2829

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

2844
	results = results || [];
2845

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

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

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

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

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

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

2873
			// Abort if we hit a combinator
2874
			if ( Expr.relative[ ( type = token.type ) ] ) {
2875
				break;
2876
			}
2877
			if ( ( find = Expr.find[ type ] ) ) {
2878

2879
				// Search, expanding context for leading sibling combinators
2880
				if ( ( seed = find(
2881
					token.matches[ 0 ].replace( runescape, funescape ),
2882
					rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
2883
						context
2884
				) ) ) {
2885

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

2894
					break;
2895
				}
2896
			}
2897
		}
2898
	}
2899

2900
	// Compile and execute a filtering function if one is not provided
2901
	// Provide `match` to avoid retokenization if we modified the selector above
2902
	( compiled || compile( selector, match ) )(
2903
		seed,
2904
		context,
2905
		!documentIsHTML,
2906
		results,
2907
		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2908
	);
2909
	return results;
2910
};
2911

2912
// One-time assignments
2913

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

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

2921
// Initialize against the default document
2922
setDocument();
2923

2924
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2925
// Detached nodes confoundingly follow *each other*
2926
support.sortDetached = assert( function( el ) {
2927

2928
	// Should return 1, but returns 4 (following)
2929
	return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2930
} );
2931

2932
// Support: IE<8
2933
// Prevent attribute/property "interpolation"
2934
// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2935
if ( !assert( function( el ) {
2936
	el.innerHTML = "<a href='#'></a>";
2937
	return el.firstChild.getAttribute( "href" ) === "#";
2938
} ) ) {
2939
	addHandle( "type|href|height|width", function( elem, name, isXML ) {
2940
		if ( !isXML ) {
2941
			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2942
		}
2943
	} );
2944
}
2945

2946
// Support: IE<9
2947
// Use defaultValue in place of getAttribute("value")
2948
if ( !support.attributes || !assert( function( el ) {
2949
	el.innerHTML = "<input/>";
2950
	el.firstChild.setAttribute( "value", "" );
2951
	return el.firstChild.getAttribute( "value" ) === "";
2952
} ) ) {
2953
	addHandle( "value", function( elem, _name, isXML ) {
2954
		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2955
			return elem.defaultValue;
2956
		}
2957
	} );
2958
}
2959

2960
// Support: IE<9
2961
// Use getAttributeNode to fetch booleans when getAttribute lies
2962
if ( !assert( function( el ) {
2963
	return el.getAttribute( "disabled" ) == null;
2964
} ) ) {
2965
	addHandle( booleans, function( elem, name, isXML ) {
2966
		var val;
2967
		if ( !isXML ) {
2968
			return elem[ name ] === true ? name.toLowerCase() :
2969
				( val = elem.getAttributeNode( name ) ) && val.specified ?
2970
					val.value :
2971
					null;
2972
		}
2973
	} );
2974
}
2975

2976
return Sizzle;
2977

2978
} )( window );
2979

2980

2981

2982
jQuery.find = Sizzle;
2983
jQuery.expr = Sizzle.selectors;
2984

2985
// Deprecated
2986
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2987
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2988
jQuery.text = Sizzle.getText;
2989
jQuery.isXMLDoc = Sizzle.isXML;
2990
jQuery.contains = Sizzle.contains;
2991
jQuery.escapeSelector = Sizzle.escape;
2992

2993

2994

2995

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

3000
	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
3001
		if ( elem.nodeType === 1 ) {
3002
			if ( truncate && jQuery( elem ).is( until ) ) {
3003
				break;
3004
			}
3005
			matched.push( elem );
3006
		}
3007
	}
3008
	return matched;
3009
};
3010

3011

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

3015
	for ( ; n; n = n.nextSibling ) {
3016
		if ( n.nodeType === 1 && n !== elem ) {
3017
			matched.push( n );
3018
		}
3019
	}
3020

3021
	return matched;
3022
};
3023

3024

3025
var rneedsContext = jQuery.expr.match.needsContext;
3026

3027

3028

3029
function nodeName( elem, name ) {
3030

3031
	return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
3032

3033
}
3034
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
3035

3036

3037

3038
// Implement the identical functionality for filter and not
3039
function winnow( elements, qualifier, not ) {
3040
	if ( isFunction( qualifier ) ) {
3041
		return jQuery.grep( elements, function( elem, i ) {
3042
			return !!qualifier.call( elem, i, elem ) !== not;
3043
		} );
3044
	}
3045

3046
	// Single element
3047
	if ( qualifier.nodeType ) {
3048
		return jQuery.grep( elements, function( elem ) {
3049
			return ( elem === qualifier ) !== not;
3050
		} );
3051
	}
3052

3053
	// Arraylike of elements (jQuery, arguments, Array)
3054
	if ( typeof qualifier !== "string" ) {
3055
		return jQuery.grep( elements, function( elem ) {
3056
			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
3057
		} );
3058
	}
3059

3060
	// Filtered directly for both simple and complex selectors
3061
	return jQuery.filter( qualifier, elements, not );
3062
}
3063

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

3067
	if ( not ) {
3068
		expr = ":not(" + expr + ")";
3069
	}
3070

3071
	if ( elems.length === 1 && elem.nodeType === 1 ) {
3072
		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
3073
	}
3074

3075
	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
3076
		return elem.nodeType === 1;
3077
	} ) );
3078
};
3079

3080
jQuery.fn.extend( {
3081
	find: function( selector ) {
3082
		var i, ret,
3083
			len = this.length,
3084
			self = this;
3085

3086
		if ( typeof selector !== "string" ) {
3087
			return this.pushStack( jQuery( selector ).filter( function() {
3088
				for ( i = 0; i < len; i++ ) {
3089
					if ( jQuery.contains( self[ i ], this ) ) {
3090
						return true;
3091
					}
3092
				}
3093
			} ) );
3094
		}
3095

3096
		ret = this.pushStack( [] );
3097

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

3102
		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
3103
	},
3104
	filter: function( selector ) {
3105
		return this.pushStack( winnow( this, selector || [], false ) );
3106
	},
3107
	not: function( selector ) {
3108
		return this.pushStack( winnow( this, selector || [], true ) );
3109
	},
3110
	is: function( selector ) {
3111
		return !!winnow(
3112
			this,
3113

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

3124

3125
// Initialize a jQuery object
3126

3127

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

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

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

3140
		// HANDLE: $(""), $(null), $(undefined), $(false)
3141
		if ( !selector ) {
3142
			return this;
3143
		}
3144

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

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

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

3158
			} else {
3159
				match = rquickExpr.exec( selector );
3160
			}
3161

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

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

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

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

3181
							// Properties of context are called as methods if possible
3182
							if ( isFunction( this[ match ] ) ) {
3183
								this[ match ]( context[ match ] );
3184

3185
							// ...and otherwise set as attributes
3186
							} else {
3187
								this.attr( match, context[ match ] );
3188
							}
3189
						}
3190
					}
3191

3192
					return this;
3193

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

3198
					if ( elem ) {
3199

3200
						// Inject the element directly into the jQuery object
3201
						this[ 0 ] = elem;
3202
						this.length = 1;
3203
					}
3204
					return this;
3205
				}
3206

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

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

3217
		// HANDLE: $(DOMElement)
3218
		} else if ( selector.nodeType ) {
3219
			this[ 0 ] = selector;
3220
			this.length = 1;
3221
			return this;
3222

3223
		// HANDLE: $(function)
3224
		// Shortcut for document ready
3225
		} else if ( isFunction( selector ) ) {
3226
			return root.ready !== undefined ?
3227
				root.ready( selector ) :
3228

3229
				// Execute immediately if ready is not present
3230
				selector( jQuery );
3231
		}
3232

3233
		return jQuery.makeArray( selector, this );
3234
	};
3235

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

3239
// Initialize central reference
3240
rootjQuery = jQuery( document );
3241

3242

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

3245
	// Methods guaranteed to produce a unique set when starting from a unique set
3246
	guaranteedUnique = {
3247
		children: true,
3248
		contents: true,
3249
		next: true,
3250
		prev: true
3251
	};
3252

3253
jQuery.fn.extend( {
3254
	has: function( target ) {
3255
		var targets = jQuery( target, this ),
3256
			l = targets.length;
3257

3258
		return this.filter( function() {
3259
			var i = 0;
3260
			for ( ; i < l; i++ ) {
3261
				if ( jQuery.contains( this, targets[ i ] ) ) {
3262
					return true;
3263
				}
3264
			}
3265
		} );
3266
	},
3267

3268
	closest: function( selectors, context ) {
3269
		var cur,
3270
			i = 0,
3271
			l = this.length,
3272
			matched = [],
3273
			targets = typeof selectors !== "string" && jQuery( selectors );
3274

3275
		// Positional selectors never match, since there's no _selection_ context
3276
		if ( !rneedsContext.test( selectors ) ) {
3277
			for ( ; i < l; i++ ) {
3278
				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3279

3280
					// Always skip document fragments
3281
					if ( cur.nodeType < 11 && ( targets ?
3282
						targets.index( cur ) > -1 :
3283

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

3288
						matched.push( cur );
3289
						break;
3290
					}
3291
				}
3292
			}
3293
		}
3294

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

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

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

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

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

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

3319
	add: function( selector, context ) {
3320
		return this.pushStack(
3321
			jQuery.uniqueSort(
3322
				jQuery.merge( this.get(), jQuery( selector, context ) )
3323
			)
3324
		);
3325
	},
3326

3327
	addBack: function( selector ) {
3328
		return this.add( selector == null ?
3329
			this.prevObject : this.prevObject.filter( selector )
3330
		);
3331
	}
3332
} );
3333

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

3339
jQuery.each( {
3340
	parent: function( elem ) {
3341
		var parent = elem.parentNode;
3342
		return parent && parent.nodeType !== 11 ? parent : null;
3343
	},
3344
	parents: function( elem ) {
3345
		return dir( elem, "parentNode" );
3346
	},
3347
	parentsUntil: function( elem, _i, until ) {
3348
		return dir( elem, "parentNode", until );
3349
	},
3350
	next: function( elem ) {
3351
		return sibling( elem, "nextSibling" );
3352
	},
3353
	prev: function( elem ) {
3354
		return sibling( elem, "previousSibling" );
3355
	},
3356
	nextAll: function( elem ) {
3357
		return dir( elem, "nextSibling" );
3358
	},
3359
	prevAll: function( elem ) {
3360
		return dir( elem, "previousSibling" );
3361
	},
3362
	nextUntil: function( elem, _i, until ) {
3363
		return dir( elem, "nextSibling", until );
3364
	},
3365
	prevUntil: function( elem, _i, until ) {
3366
		return dir( elem, "previousSibling", until );
3367
	},
3368
	siblings: function( elem ) {
3369
		return siblings( ( elem.parentNode || {} ).firstChild, elem );
3370
	},
3371
	children: function( elem ) {
3372
		return siblings( elem.firstChild );
3373
	},
3374
	contents: function( elem ) {
3375
		if ( elem.contentDocument != null &&
3376

3377
			// Support: IE 11+
3378
			// <object> elements with no `data` attribute has an object
3379
			// `contentDocument` with a `null` prototype.
3380
			getProto( elem.contentDocument ) ) {
3381

3382
			return elem.contentDocument;
3383
		}
3384

3385
		// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3386
		// Treat the template element as a regular one in browsers that
3387
		// don't support it.
3388
		if ( nodeName( elem, "template" ) ) {
3389
			elem = elem.content || elem;
3390
		}
3391

3392
		return jQuery.merge( [], elem.childNodes );
3393
	}
3394
}, function( name, fn ) {
3395
	jQuery.fn[ name ] = function( until, selector ) {
3396
		var matched = jQuery.map( this, fn, until );
3397

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

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

3406
		if ( this.length > 1 ) {
3407

3408
			// Remove duplicates
3409
			if ( !guaranteedUnique[ name ] ) {
3410
				jQuery.uniqueSort( matched );
3411
			}
3412

3413
			// Reverse order for parents* and prev-derivatives
3414
			if ( rparentsprev.test( name ) ) {
3415
				matched.reverse();
3416
			}
3417
		}
3418

3419
		return this.pushStack( matched );
3420
	};
3421
} );
3422
var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3423

3424

3425

3426
// Convert String-formatted options into Object-formatted ones
3427
function createOptions( options ) {
3428
	var object = {};
3429
	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3430
		object[ flag ] = true;
3431
	} );
3432
	return object;
3433
}
3434

3435
/*
3436
 * Create a callback list using the following parameters:
3437
 *
3438
 *	options: an optional list of space-separated options that will change how
3439
 *			the callback list behaves or a more traditional option object
3440
 *
3441
 * By default a callback list will act like an event callback list and can be
3442
 * "fired" multiple times.
3443
 *
3444
 * Possible options:
3445
 *
3446
 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3447
 *
3448
 *	memory:			will keep track of previous values and will call any callback added
3449
 *					after the list has been fired right away with the latest "memorized"
3450
 *					values (like a Deferred)
3451
 *
3452
 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3453
 *
3454
 *	stopOnFalse:	interrupt callings when a callback returns false
3455
 *
3456
 */
3457
jQuery.Callbacks = function( options ) {
3458

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

3465
	var // Flag to know if list is currently firing
3466
		firing,
3467

3468
		// Last fire value for non-forgettable lists
3469
		memory,
3470

3471
		// Flag to know if list was already fired
3472
		fired,
3473

3474
		// Flag to prevent firing
3475
		locked,
3476

3477
		// Actual callback list
3478
		list = [],
3479

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

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

3486
		// Fire callbacks
3487
		fire = function() {
3488

3489
			// Enforce single-firing
3490
			locked = locked || options.once;
3491

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

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

3503
						// Jump to end and forget the data so .add doesn't re-fire
3504
						firingIndex = list.length;
3505
						memory = false;
3506
					}
3507
				}
3508
			}
3509

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

3515
			firing = false;
3516

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

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

3524
				// Otherwise, this object is spent
3525
				} else {
3526
					list = "";
3527
				}
3528
			}
3529
		},
3530

3531
		// Actual Callbacks object
3532
		self = {
3533

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

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

3544
					( function add( args ) {
3545
						jQuery.each( args, function( _, arg ) {
3546
							if ( isFunction( arg ) ) {
3547
								if ( !options.unique || !self.has( arg ) ) {
3548
									list.push( arg );
3549
								}
3550
							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
3551

3552
								// Inspect recursively
3553
								add( arg );
3554
							}
3555
						} );
3556
					} )( arguments );
3557

3558
					if ( memory && !firing ) {
3559
						fire();
3560
					}
3561
				}
3562
				return this;
3563
			},
3564

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

3572
						// Handle firing indexes
3573
						if ( index <= firingIndex ) {
3574
							firingIndex--;
3575
						}
3576
					}
3577
				} );
3578
				return this;
3579
			},
3580

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

3589
			// Remove all callbacks from the list
3590
			empty: function() {
3591
				if ( list ) {
3592
					list = [];
3593
				}
3594
				return this;
3595
			},
3596

3597
			// Disable .fire and .add
3598
			// Abort any current/pending executions
3599
			// Clear all callbacks and values
3600
			disable: function() {
3601
				locked = queue = [];
3602
				list = memory = "";
3603
				return this;
3604
			},
3605
			disabled: function() {
3606
				return !list;
3607
			},
3608

3609
			// Disable .fire
3610
			// Also disable .add unless we have memory (since it would have no effect)
3611
			// Abort any pending executions
3612
			lock: function() {
3613
				locked = queue = [];
3614
				if ( !memory && !firing ) {
3615
					list = memory = "";
3616
				}
3617
				return this;
3618
			},
3619
			locked: function() {
3620
				return !!locked;
3621
			},
3622

3623
			// Call all callbacks with the given context and arguments
3624
			fireWith: function( context, args ) {
3625
				if ( !locked ) {
3626
					args = args || [];
3627
					args = [ context, args.slice ? args.slice() : args ];
3628
					queue.push( args );
3629
					if ( !firing ) {
3630
						fire();
3631
					}
3632
				}
3633
				return this;
3634
			},
3635

3636
			// Call all the callbacks with the given arguments
3637
			fire: function() {
3638
				self.fireWith( this, arguments );
3639
				return this;
3640
			},
3641

3642
			// To know if the callbacks have already been called at least once
3643
			fired: function() {
3644
				return !!fired;
3645
			}
3646
		};
3647

3648
	return self;
3649
};
3650

3651

3652
function Identity( v ) {
3653
	return v;
3654
}
3655
function Thrower( ex ) {
3656
	throw ex;
3657
}
3658

3659
function adoptValue( value, resolve, reject, noValue ) {
3660
	var method;
3661

3662
	try {
3663

3664
		// Check for promise aspect first to privilege synchronous behavior
3665
		if ( value && isFunction( ( method = value.promise ) ) ) {
3666
			method.call( value ).done( resolve ).fail( reject );
3667

3668
		// Other thenables
3669
		} else if ( value && isFunction( ( method = value.then ) ) ) {
3670
			method.call( value, resolve, reject );
3671

3672
		// Other non-thenables
3673
		} else {
3674

3675
			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3676
			// * false: [ value ].slice( 0 ) => resolve( value )
3677
			// * true: [ value ].slice( 1 ) => resolve()
3678
			resolve.apply( undefined, [ value ].slice( noValue ) );
3679
		}
3680

3681
	// For Promises/A+, convert exceptions into rejections
3682
	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3683
	// Deferred#then to conditionally suppress rejection.
3684
	} catch ( value ) {
3685

3686
		// Support: Android 4.0 only
3687
		// Strict mode functions invoked without .call/.apply get global-object context
3688
		reject.apply( undefined, [ value ] );
3689
	}
3690
}
3691

3692
jQuery.extend( {
3693

3694
	Deferred: function( func ) {
3695
		var tuples = [
3696

3697
				// action, add listener, callbacks,
3698
				// ... .then handlers, argument index, [final state]
3699
				[ "notify", "progress", jQuery.Callbacks( "memory" ),
3700
					jQuery.Callbacks( "memory" ), 2 ],
3701
				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
3702
					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3703
				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
3704
					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3705
			],
3706
			state = "pending",
3707
			promise = {
3708
				state: function() {
3709
					return state;
3710
				},
3711
				always: function() {
3712
					deferred.done( arguments ).fail( arguments );
3713
					return this;
3714
				},
3715
				"catch": function( fn ) {
3716
					return promise.then( null, fn );
3717
				},
3718

3719
				// Keep pipe for back-compat
3720
				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3721
					var fns = arguments;
3722

3723
					return jQuery.Deferred( function( newDefer ) {
3724
						jQuery.each( tuples, function( _i, tuple ) {
3725

3726
							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
3727
							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3728

3729
							// deferred.progress(function() { bind to newDefer or newDefer.notify })
3730
							// deferred.done(function() { bind to newDefer or newDefer.resolve })
3731
							// deferred.fail(function() { bind to newDefer or newDefer.reject })
3732
							deferred[ tuple[ 1 ] ]( function() {
3733
								var returned = fn && fn.apply( this, arguments );
3734
								if ( returned && isFunction( returned.promise ) ) {
3735
									returned.promise()
3736
										.progress( newDefer.notify )
3737
										.done( newDefer.resolve )
3738
										.fail( newDefer.reject );
3739
								} else {
3740
									newDefer[ tuple[ 0 ] + "With" ](
3741
										this,
3742
										fn ? [ returned ] : arguments
3743
									);
3744
								}
3745
							} );
3746
						} );
3747
						fns = null;
3748
					} ).promise();
3749
				},
3750
				then: function( onFulfilled, onRejected, onProgress ) {
3751
					var maxDepth = 0;
3752
					function resolve( depth, deferred, handler, special ) {
3753
						return function() {
3754
							var that = this,
3755
								args = arguments,
3756
								mightThrow = function() {
3757
									var returned, then;
3758

3759
									// Support: Promises/A+ section 2.3.3.3.3
3760
									// https://promisesaplus.com/#point-59
3761
									// Ignore double-resolution attempts
3762
									if ( depth < maxDepth ) {
3763
										return;
3764
									}
3765

3766
									returned = handler.apply( that, args );
3767

3768
									// Support: Promises/A+ section 2.3.1
3769
									// https://promisesaplus.com/#point-48
3770
									if ( returned === deferred.promise() ) {
3771
										throw new TypeError( "Thenable self-resolution" );
3772
									}
3773

3774
									// Support: Promises/A+ sections 2.3.3.1, 3.5
3775
									// https://promisesaplus.com/#point-54
3776
									// https://promisesaplus.com/#point-75
3777
									// Retrieve `then` only once
3778
									then = returned &&
3779

3780
										// Support: Promises/A+ section 2.3.4
3781
										// https://promisesaplus.com/#point-64
3782
										// Only check objects and functions for thenability
3783
										( typeof returned === "object" ||
3784
											typeof returned === "function" ) &&
3785
										returned.then;
3786

3787
									// Handle a returned thenable
3788
									if ( isFunction( then ) ) {
3789

3790
										// Special processors (notify) just wait for resolution
3791
										if ( special ) {
3792
											then.call(
3793
												returned,
3794
												resolve( maxDepth, deferred, Identity, special ),
3795
												resolve( maxDepth, deferred, Thrower, special )
3796
											);
3797

3798
										// Normal processors (resolve) also hook into progress
3799
										} else {
3800

3801
											// ...and disregard older resolution values
3802
											maxDepth++;
3803

3804
											then.call(
3805
												returned,
3806
												resolve( maxDepth, deferred, Identity, special ),
3807
												resolve( maxDepth, deferred, Thrower, special ),
3808
												resolve( maxDepth, deferred, Identity,
3809
													deferred.notifyWith )
3810
											);
3811
										}
3812

3813
									// Handle all other returned values
3814
									} else {
3815

3816
										// Only substitute handlers pass on context
3817
										// and multiple values (non-spec behavior)
3818
										if ( handler !== Identity ) {
3819
											that = undefined;
3820
											args = [ returned ];
3821
										}
3822

3823
										// Process the value(s)
3824
										// Default process is resolve
3825
										( special || deferred.resolveWith )( that, args );
3826
									}
3827
								},
3828

3829
								// Only normal processors (resolve) catch and reject exceptions
3830
								process = special ?
3831
									mightThrow :
3832
									function() {
3833
										try {
3834
											mightThrow();
3835
										} catch ( e ) {
3836

3837
											if ( jQuery.Deferred.exceptionHook ) {
3838
												jQuery.Deferred.exceptionHook( e,
3839
													process.stackTrace );
3840
											}
3841

3842
											// Support: Promises/A+ section 2.3.3.3.4.1
3843
											// https://promisesaplus.com/#point-61
3844
											// Ignore post-resolution exceptions
3845
											if ( depth + 1 >= maxDepth ) {
3846

3847
												// Only substitute handlers pass on context
3848
												// and multiple values (non-spec behavior)
3849
												if ( handler !== Thrower ) {
3850
													that = undefined;
3851
													args = [ e ];
3852
												}
3853

3854
												deferred.rejectWith( that, args );
3855
											}
3856
										}
3857
									};
3858

3859
							// Support: Promises/A+ section 2.3.3.3.1
3860
							// https://promisesaplus.com/#point-57
3861
							// Re-resolve promises immediately to dodge false rejection from
3862
							// subsequent errors
3863
							if ( depth ) {
3864
								process();
3865
							} else {
3866

3867
								// Call an optional hook to record the stack, in case of exception
3868
								// since it's otherwise lost when execution goes async
3869
								if ( jQuery.Deferred.getStackHook ) {
3870
									process.stackTrace = jQuery.Deferred.getStackHook();
3871
								}
3872
								window.setTimeout( process );
3873
							}
3874
						};
3875
					}
3876

3877
					return jQuery.Deferred( function( newDefer ) {
3878

3879
						// progress_handlers.add( ... )
3880
						tuples[ 0 ][ 3 ].add(
3881
							resolve(
3882
								0,
3883
								newDefer,
3884
								isFunction( onProgress ) ?
3885
									onProgress :
3886
									Identity,
3887
								newDefer.notifyWith
3888
							)
3889
						);
3890

3891
						// fulfilled_handlers.add( ... )
3892
						tuples[ 1 ][ 3 ].add(
3893
							resolve(
3894
								0,
3895
								newDefer,
3896
								isFunction( onFulfilled ) ?
3897
									onFulfilled :
3898
									Identity
3899
							)
3900
						);
3901

3902
						// rejected_handlers.add( ... )
3903
						tuples[ 2 ][ 3 ].add(
3904
							resolve(
3905
								0,
3906
								newDefer,
3907
								isFunction( onRejected ) ?
3908
									onRejected :
3909
									Thrower
3910
							)
3911
						);
3912
					} ).promise();
3913
				},
3914

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

3923
		// Add list-specific methods
3924
		jQuery.each( tuples, function( i, tuple ) {
3925
			var list = tuple[ 2 ],
3926
				stateString = tuple[ 5 ];
3927

3928
			// promise.progress = list.add
3929
			// promise.done = list.add
3930
			// promise.fail = list.add
3931
			promise[ tuple[ 1 ] ] = list.add;
3932

3933
			// Handle state
3934
			if ( stateString ) {
3935
				list.add(
3936
					function() {
3937

3938
						// state = "resolved" (i.e., fulfilled)
3939
						// state = "rejected"
3940
						state = stateString;
3941
					},
3942

3943
					// rejected_callbacks.disable
3944
					// fulfilled_callbacks.disable
3945
					tuples[ 3 - i ][ 2 ].disable,
3946

3947
					// rejected_handlers.disable
3948
					// fulfilled_handlers.disable
3949
					tuples[ 3 - i ][ 3 ].disable,
3950

3951
					// progress_callbacks.lock
3952
					tuples[ 0 ][ 2 ].lock,
3953

3954
					// progress_handlers.lock
3955
					tuples[ 0 ][ 3 ].lock
3956
				);
3957
			}
3958

3959
			// progress_handlers.fire
3960
			// fulfilled_handlers.fire
3961
			// rejected_handlers.fire
3962
			list.add( tuple[ 3 ].fire );
3963

3964
			// deferred.notify = function() { deferred.notifyWith(...) }
3965
			// deferred.resolve = function() { deferred.resolveWith(...) }
3966
			// deferred.reject = function() { deferred.rejectWith(...) }
3967
			deferred[ tuple[ 0 ] ] = function() {
3968
				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3969
				return this;
3970
			};
3971

3972
			// deferred.notifyWith = list.fireWith
3973
			// deferred.resolveWith = list.fireWith
3974
			// deferred.rejectWith = list.fireWith
3975
			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3976
		} );
3977

3978
		// Make the deferred a promise
3979
		promise.promise( deferred );
3980

3981
		// Call given func if any
3982
		if ( func ) {
3983
			func.call( deferred, deferred );
3984
		}
3985

3986
		// All done!
3987
		return deferred;
3988
	},
3989

3990
	// Deferred helper
3991
	when: function( singleValue ) {
3992
		var
3993

3994
			// count of uncompleted subordinates
3995
			remaining = arguments.length,
3996

3997
			// count of unprocessed arguments
3998
			i = remaining,
3999

4000
			// subordinate fulfillment data
4001
			resolveContexts = Array( i ),
4002
			resolveValues = slice.call( arguments ),
4003

4004
			// the primary Deferred
4005
			primary = jQuery.Deferred(),
4006

4007
			// subordinate callback factory
4008
			updateFunc = function( i ) {
4009
				return function( value ) {
4010
					resolveContexts[ i ] = this;
4011
					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
4012
					if ( !( --remaining ) ) {
4013
						primary.resolveWith( resolveContexts, resolveValues );
4014
					}
4015
				};
4016
			};
4017

4018
		// Single- and empty arguments are adopted like Promise.resolve
4019
		if ( remaining <= 1 ) {
4020
			adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
4021
				!remaining );
4022

4023
			// Use .then() to unwrap secondary thenables (cf. gh-3000)
4024
			if ( primary.state() === "pending" ||
4025
				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
4026

4027
				return primary.then();
4028
			}
4029
		}
4030

4031
		// Multiple arguments are aggregated like Promise.all array elements
4032
		while ( i-- ) {
4033
			adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
4034
		}
4035

4036
		return primary.promise();
4037
	}
4038
} );
4039

4040

4041
// These usually indicate a programmer mistake during development,
4042
// warn about them ASAP rather than swallowing them by default.
4043
var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
4044

4045
jQuery.Deferred.exceptionHook = function( error, stack ) {
4046

4047
	// Support: IE 8 - 9 only
4048
	// Console exists when dev tools are open, which can happen at any time
4049
	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
4050
		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
4051
	}
4052
};
4053

4054

4055

4056

4057
jQuery.readyException = function( error ) {
4058
	window.setTimeout( function() {
4059
		throw error;
4060
	} );
4061
};
4062

4063

4064

4065

4066
// The deferred used on DOM ready
4067
var readyList = jQuery.Deferred();
4068

4069
jQuery.fn.ready = function( fn ) {
4070

4071
	readyList
4072
		.then( fn )
4073

4074
		// Wrap jQuery.readyException in a function so that the lookup
4075
		// happens at the time of error handling instead of callback
4076
		// registration.
4077
		.catch( function( error ) {
4078
			jQuery.readyException( error );
4079
		} );
4080

4081
	return this;
4082
};
4083

4084
jQuery.extend( {
4085

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

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

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

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

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

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

4109
		// If there are functions bound, to execute
4110
		readyList.resolveWith( document, [ jQuery ] );
4111
	}
4112
} );
4113

4114
jQuery.ready.then = readyList.then;
4115

4116
// The ready event handler and self cleanup method
4117
function completed() {
4118
	document.removeEventListener( "DOMContentLoaded", completed );
4119
	window.removeEventListener( "load", completed );
4120
	jQuery.ready();
4121
}
4122

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

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

4133
} else {
4134

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

4138
	// A fallback to window.onload, that will always work
4139
	window.addEventListener( "load", completed );
4140
}
4141

4142

4143

4144

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

4152
	// Sets many values
4153
	if ( toType( key ) === "object" ) {
4154
		chainable = true;
4155
		for ( i in key ) {
4156
			access( elems, fn, i, key[ i ], true, emptyGet, raw );
4157
		}
4158

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

4163
		if ( !isFunction( value ) ) {
4164
			raw = true;
4165
		}
4166

4167
		if ( bulk ) {
4168

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

4174
			// ...except when executing function values
4175
			} else {
4176
				bulk = fn;
4177
				fn = function( elem, _key, value ) {
4178
					return bulk.call( jQuery( elem ), value );
4179
				};
4180
			}
4181
		}
4182

4183
		if ( fn ) {
4184
			for ( ; i < len; i++ ) {
4185
				fn(
4186
					elems[ i ], key, raw ?
4187
						value :
4188
						value.call( elems[ i ], i, fn( elems[ i ], key ) )
4189
				);
4190
			}
4191
		}
4192
	}
4193

4194
	if ( chainable ) {
4195
		return elems;
4196
	}
4197

4198
	// Gets
4199
	if ( bulk ) {
4200
		return fn.call( elems );
4201
	}
4202

4203
	return len ? fn( elems[ 0 ], key ) : emptyGet;
4204
};
4205

4206

4207
// Matches dashed string for camelizing
4208
var rmsPrefix = /^-ms-/,
4209
	rdashAlpha = /-([a-z])/g;
4210

4211
// Used by camelCase as callback to replace()
4212
function fcamelCase( _all, letter ) {
4213
	return letter.toUpperCase();
4214
}
4215

4216
// Convert dashed to camelCase; used by the css and data modules
4217
// Support: IE <=9 - 11, Edge 12 - 15
4218
// Microsoft forgot to hump their vendor prefix (#9572)
4219
function camelCase( string ) {
4220
	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4221
}
4222
var acceptData = function( owner ) {
4223

4224
	// Accepts only:
4225
	//  - Node
4226
	//    - Node.ELEMENT_NODE
4227
	//    - Node.DOCUMENT_NODE
4228
	//  - Object
4229
	//    - Any
4230
	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4231
};
4232

4233

4234

4235

4236
function Data() {
4237
	this.expando = jQuery.expando + Data.uid++;
4238
}
4239

4240
Data.uid = 1;
4241

4242
Data.prototype = {
4243

4244
	cache: function( owner ) {
4245

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

4249
		// If not, create one
4250
		if ( !value ) {
4251
			value = {};
4252

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

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

4263
				// Otherwise secure it in a non-enumerable property
4264
				// configurable must be true to allow the property to be
4265
				// deleted when data is removed
4266
				} else {
4267
					Object.defineProperty( owner, this.expando, {
4268
						value: value,
4269
						configurable: true
4270
					} );
4271
				}
4272
			}
4273
		}
4274

4275
		return value;
4276
	},
4277
	set: function( owner, data, value ) {
4278
		var prop,
4279
			cache = this.cache( owner );
4280

4281
		// Handle: [ owner, key, value ] args
4282
		// Always use camelCase key (gh-2257)
4283
		if ( typeof data === "string" ) {
4284
			cache[ camelCase( data ) ] = value;
4285

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

4289
			// Copy the properties one-by-one to the cache object
4290
			for ( prop in data ) {
4291
				cache[ camelCase( prop ) ] = data[ prop ];
4292
			}
4293
		}
4294
		return cache;
4295
	},
4296
	get: function( owner, key ) {
4297
		return key === undefined ?
4298
			this.cache( owner ) :
4299

4300
			// Always use camelCase key (gh-2257)
4301
			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4302
	},
4303
	access: function( owner, key, value ) {
4304

4305
		// In cases where either:
4306
		//
4307
		//   1. No key was specified
4308
		//   2. A string key was specified, but no value provided
4309
		//
4310
		// Take the "read" path and allow the get method to determine
4311
		// which value to return, respectively either:
4312
		//
4313
		//   1. The entire cache object
4314
		//   2. The data stored at the key
4315
		//
4316
		if ( key === undefined ||
4317
				( ( key && typeof key === "string" ) && value === undefined ) ) {
4318

4319
			return this.get( owner, key );
4320
		}
4321

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

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

4338
		if ( cache === undefined ) {
4339
			return;
4340
		}
4341

4342
		if ( key !== undefined ) {
4343

4344
			// Support array or space separated string of keys
4345
			if ( Array.isArray( key ) ) {
4346

4347
				// If key is an array of keys...
4348
				// We always set camelCase keys, so remove that.
4349
				key = key.map( camelCase );
4350
			} else {
4351
				key = camelCase( key );
4352

4353
				// If a key with the spaces exists, use it.
4354
				// Otherwise, create an array by matching non-whitespace
4355
				key = key in cache ?
4356
					[ key ] :
4357
					( key.match( rnothtmlwhite ) || [] );
4358
			}
4359

4360
			i = key.length;
4361

4362
			while ( i-- ) {
4363
				delete cache[ key[ i ] ];
4364
			}
4365
		}
4366

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

4370
			// Support: Chrome <=35 - 45
4371
			// Webkit & Blink performance suffers when deleting properties
4372
			// from DOM nodes, so set to undefined instead
4373
			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4374
			if ( owner.nodeType ) {
4375
				owner[ this.expando ] = undefined;
4376
			} else {
4377
				delete owner[ this.expando ];
4378
			}
4379
		}
4380
	},
4381
	hasData: function( owner ) {
4382
		var cache = owner[ this.expando ];
4383
		return cache !== undefined && !jQuery.isEmptyObject( cache );
4384
	}
4385
};
4386
var dataPriv = new Data();
4387

4388
var dataUser = new Data();
4389

4390

4391

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

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

4405
function getData( data ) {
4406
	if ( data === "true" ) {
4407
		return true;
4408
	}
4409

4410
	if ( data === "false" ) {
4411
		return false;
4412
	}
4413

4414
	if ( data === "null" ) {
4415
		return null;
4416
	}
4417

4418
	// Only convert to a number if it doesn't change the string
4419
	if ( data === +data + "" ) {
4420
		return +data;
4421
	}
4422

4423
	if ( rbrace.test( data ) ) {
4424
		return JSON.parse( data );
4425
	}
4426

4427
	return data;
4428
}
4429

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

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

4439
		if ( typeof data === "string" ) {
4440
			try {
4441
				data = getData( data );
4442
			} catch ( e ) {}
4443

4444
			// Make sure we set the data so it isn't changed later
4445
			dataUser.set( elem, key, data );
4446
		} else {
4447
			data = undefined;
4448
		}
4449
	}
4450
	return data;
4451
}
4452

4453
jQuery.extend( {
4454
	hasData: function( elem ) {
4455
		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4456
	},
4457

4458
	data: function( elem, name, data ) {
4459
		return dataUser.access( elem, name, data );
4460
	},
4461

4462
	removeData: function( elem, name ) {
4463
		dataUser.remove( elem, name );
4464
	},
4465

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

4472
	_removeData: function( elem, name ) {
4473
		dataPriv.remove( elem, name );
4474
	}
4475
} );
4476

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

4483
		// Gets all values
4484
		if ( key === undefined ) {
4485
			if ( this.length ) {
4486
				data = dataUser.get( elem );
4487

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

4492
						// Support: IE 11 only
4493
						// The attrs elements can be null (#14894)
4494
						if ( attrs[ i ] ) {
4495
							name = attrs[ i ].name;
4496
							if ( name.indexOf( "data-" ) === 0 ) {
4497
								name = camelCase( name.slice( 5 ) );
4498
								dataAttr( elem, name, data[ name ] );
4499
							}
4500
						}
4501
					}
4502
					dataPriv.set( elem, "hasDataAttrs", true );
4503
				}
4504
			}
4505

4506
			return data;
4507
		}
4508

4509
		// Sets multiple values
4510
		if ( typeof key === "object" ) {
4511
			return this.each( function() {
4512
				dataUser.set( this, key );
4513
			} );
4514
		}
4515

4516
		return access( this, function( value ) {
4517
			var data;
4518

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

4526
				// Attempt to get data from the cache
4527
				// The key will always be camelCased in Data
4528
				data = dataUser.get( elem, key );
4529
				if ( data !== undefined ) {
4530
					return data;
4531
				}
4532

4533
				// Attempt to "discover" the data in
4534
				// HTML5 custom data-* attrs
4535
				data = dataAttr( elem, key );
4536
				if ( data !== undefined ) {
4537
					return data;
4538
				}
4539

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

4544
			// Set the data...
4545
			this.each( function() {
4546

4547
				// We always store the camelCased key
4548
				dataUser.set( this, key, value );
4549
			} );
4550
		}, null, value, arguments.length > 1, null, true );
4551
	},
4552

4553
	removeData: function( key ) {
4554
		return this.each( function() {
4555
			dataUser.remove( this, key );
4556
		} );
4557
	}
4558
} );
4559

4560

4561
jQuery.extend( {
4562
	queue: function( elem, type, data ) {
4563
		var queue;
4564

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

4569
			// Speed up dequeue by getting out quickly if this is just a lookup
4570
			if ( data ) {
4571
				if ( !queue || Array.isArray( data ) ) {
4572
					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4573
				} else {
4574
					queue.push( data );
4575
				}
4576
			}
4577
			return queue || [];
4578
		}
4579
	},
4580

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

4584
		var queue = jQuery.queue( elem, type ),
4585
			startLength = queue.length,
4586
			fn = queue.shift(),
4587
			hooks = jQuery._queueHooks( elem, type ),
4588
			next = function() {
4589
				jQuery.dequeue( elem, type );
4590
			};
4591

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

4598
		if ( fn ) {
4599

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

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

4611
		if ( !startLength && hooks ) {
4612
			hooks.empty.fire();
4613
		}
4614
	},
4615

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

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

4631
		if ( typeof type !== "string" ) {
4632
			data = type;
4633
			type = "fx";
4634
			setter--;
4635
		}
4636

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

4641
		return data === undefined ?
4642
			this :
4643
			this.each( function() {
4644
				var queue = jQuery.queue( this, type, data );
4645

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

4649
				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4650
					jQuery.dequeue( this, type );
4651
				}
4652
			} );
4653
	},
4654
	dequeue: function( type ) {
4655
		return this.each( function() {
4656
			jQuery.dequeue( this, type );
4657
		} );
4658
	},
4659
	clearQueue: function( type ) {
4660
		return this.queue( type || "fx", [] );
4661
	},
4662

4663
	// Get a promise resolved when queues of a certain type
4664
	// are emptied (fx is the type by default)
4665
	promise: function( type, obj ) {
4666
		var tmp,
4667
			count = 1,
4668
			defer = jQuery.Deferred(),
4669
			elements = this,
4670
			i = this.length,
4671
			resolve = function() {
4672
				if ( !( --count ) ) {
4673
					defer.resolveWith( elements, [ elements ] );
4674
				}
4675
			};
4676

4677
		if ( typeof type !== "string" ) {
4678
			obj = type;
4679
			type = undefined;
4680
		}
4681
		type = type || "fx";
4682

4683
		while ( i-- ) {
4684
			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4685
			if ( tmp && tmp.empty ) {
4686
				count++;
4687
				tmp.empty.add( resolve );
4688
			}
4689
		}
4690
		resolve();
4691
		return defer.promise( obj );
4692
	}
4693
} );
4694
var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4695

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

4698

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

4701
var documentElement = document.documentElement;
4702

4703

4704

4705
	var isAttached = function( elem ) {
4706
			return jQuery.contains( elem.ownerDocument, elem );
4707
		},
4708
		composed = { composed: true };
4709

4710
	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
4711
	// Check attachment across shadow DOM boundaries when possible (gh-3504)
4712
	// Support: iOS 10.0-10.2 only
4713
	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
4714
	// leading to errors. We need to check for `getRootNode`.
4715
	if ( documentElement.getRootNode ) {
4716
		isAttached = function( elem ) {
4717
			return jQuery.contains( elem.ownerDocument, elem ) ||
4718
				elem.getRootNode( composed ) === elem.ownerDocument;
4719
		};
4720
	}
4721
var isHiddenWithinTree = function( elem, el ) {
4722

4723
		// isHiddenWithinTree might be called from jQuery#filter function;
4724
		// in that case, element will be second argument
4725
		elem = el || elem;
4726

4727
		// Inline style trumps all
4728
		return elem.style.display === "none" ||
4729
			elem.style.display === "" &&
4730

4731
			// Otherwise, check computed style
4732
			// Support: Firefox <=43 - 45
4733
			// Disconnected elements can have computed display: none, so first confirm that elem is
4734
			// in the document.
4735
			isAttached( elem ) &&
4736

4737
			jQuery.css( elem, "display" ) === "none";
4738
	};
4739

4740

4741

4742
function adjustCSS( elem, prop, valueParts, tween ) {
4743
	var adjusted, scale,
4744
		maxIterations = 20,
4745
		currentValue = tween ?
4746
			function() {
4747
				return tween.cur();
4748
			} :
4749
			function() {
4750
				return jQuery.css( elem, prop, "" );
4751
			},
4752
		initial = currentValue(),
4753
		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4754

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

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

4762
		// Support: Firefox <=54
4763
		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4764
		initial = initial / 2;
4765

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

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

4772
		while ( maxIterations-- ) {
4773

4774
			// Evaluate and update our best guess (doubling guesses that zero out).
4775
			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4776
			jQuery.style( elem, prop, initialInUnit + unit );
4777
			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4778
				maxIterations = 0;
4779
			}
4780
			initialInUnit = initialInUnit / scale;
4781

4782
		}
4783

4784
		initialInUnit = initialInUnit * 2;
4785
		jQuery.style( elem, prop, initialInUnit + unit );
4786

4787
		// Make sure we update the tween properties later on
4788
		valueParts = valueParts || [];
4789
	}
4790

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

4794
		// Apply relative offset (+=/-=) if specified
4795
		adjusted = valueParts[ 1 ] ?
4796
			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4797
			+valueParts[ 2 ];
4798
		if ( tween ) {
4799
			tween.unit = unit;
4800
			tween.start = initialInUnit;
4801
			tween.end = adjusted;
4802
		}
4803
	}
4804
	return adjusted;
4805
}
4806

4807

4808
var defaultDisplayMap = {};
4809

4810
function getDefaultDisplay( elem ) {
4811
	var temp,
4812
		doc = elem.ownerDocument,
4813
		nodeName = elem.nodeName,
4814
		display = defaultDisplayMap[ nodeName ];
4815

4816
	if ( display ) {
4817
		return display;
4818
	}
4819

4820
	temp = doc.body.appendChild( doc.createElement( nodeName ) );
4821
	display = jQuery.css( temp, "display" );
4822

4823
	temp.parentNode.removeChild( temp );
4824

4825
	if ( display === "none" ) {
4826
		display = "block";
4827
	}
4828
	defaultDisplayMap[ nodeName ] = display;
4829

4830
	return display;
4831
}
4832

4833
function showHide( elements, show ) {
4834
	var display, elem,
4835
		values = [],
4836
		index = 0,
4837
		length = elements.length;
4838

4839
	// Determine new display value for elements that need to change
4840
	for ( ; index < length; index++ ) {
4841
		elem = elements[ index ];
4842
		if ( !elem.style ) {
4843
			continue;
4844
		}
4845

4846
		display = elem.style.display;
4847
		if ( show ) {
4848

4849
			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4850
			// check is required in this first loop unless we have a nonempty display value (either
4851
			// inline or about-to-be-restored)
4852
			if ( display === "none" ) {
4853
				values[ index ] = dataPriv.get( elem, "display" ) || null;
4854
				if ( !values[ index ] ) {
4855
					elem.style.display = "";
4856
				}
4857
			}
4858
			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4859
				values[ index ] = getDefaultDisplay( elem );
4860
			}
4861
		} else {
4862
			if ( display !== "none" ) {
4863
				values[ index ] = "none";
4864

4865
				// Remember what we're overwriting
4866
				dataPriv.set( elem, "display", display );
4867
			}
4868
		}
4869
	}
4870

4871
	// Set the display of the elements in a second loop to avoid constant reflow
4872
	for ( index = 0; index < length; index++ ) {
4873
		if ( values[ index ] != null ) {
4874
			elements[ index ].style.display = values[ index ];
4875
		}
4876
	}
4877

4878
	return elements;
4879
}
4880

4881
jQuery.fn.extend( {
4882
	show: function() {
4883
		return showHide( this, true );
4884
	},
4885
	hide: function() {
4886
		return showHide( this );
4887
	},
4888
	toggle: function( state ) {
4889
		if ( typeof state === "boolean" ) {
4890
			return state ? this.show() : this.hide();
4891
		}
4892

4893
		return this.each( function() {
4894
			if ( isHiddenWithinTree( this ) ) {
4895
				jQuery( this ).show();
4896
			} else {
4897
				jQuery( this ).hide();
4898
			}
4899
		} );
4900
	}
4901
} );
4902
var rcheckableType = ( /^(?:checkbox|radio)$/i );
4903

4904
var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4905

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

4908

4909

4910
( function() {
4911
	var fragment = document.createDocumentFragment(),
4912
		div = fragment.appendChild( document.createElement( "div" ) ),
4913
		input = document.createElement( "input" );
4914

4915
	// Support: Android 4.0 - 4.3 only
4916
	// Check state lost if the name is set (#11217)
4917
	// Support: Windows Web Apps (WWA)
4918
	// `name` and `type` must use .setAttribute for WWA (#14901)
4919
	input.setAttribute( "type", "radio" );
4920
	input.setAttribute( "checked", "checked" );
4921
	input.setAttribute( "name", "t" );
4922

4923
	div.appendChild( input );
4924

4925
	// Support: Android <=4.1 only
4926
	// Older WebKit doesn't clone checked state correctly in fragments
4927
	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4928

4929
	// Support: IE <=11 only
4930
	// Make sure textarea (and checkbox) defaultValue is properly cloned
4931
	div.innerHTML = "<textarea>x</textarea>";
4932
	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4933

4934
	// Support: IE <=9 only
4935
	// IE <=9 replaces <option> tags with their contents when inserted outside of
4936
	// the select element.
4937
	div.innerHTML = "<option></option>";
4938
	support.option = !!div.lastChild;
4939
} )();
4940

4941

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

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

4953
	_default: [ 0, "", "" ]
4954
};
4955

4956
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4957
wrapMap.th = wrapMap.td;
4958

4959
// Support: IE <=9 only
4960
if ( !support.option ) {
4961
	wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4962
}
4963

4964

4965
function getAll( context, tag ) {
4966

4967
	// Support: IE <=9 - 11 only
4968
	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
4969
	var ret;
4970

4971
	if ( typeof context.getElementsByTagName !== "undefined" ) {
4972
		ret = context.getElementsByTagName( tag || "*" );
4973

4974
	} else if ( typeof context.querySelectorAll !== "undefined" ) {
4975
		ret = context.querySelectorAll( tag || "*" );
4976

4977
	} else {
4978
		ret = [];
4979
	}
4980

4981
	if ( tag === undefined || tag && nodeName( context, tag ) ) {
4982
		return jQuery.merge( [ context ], ret );
4983
	}
4984

4985
	return ret;
4986
}
4987

4988

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

4994
	for ( ; i < l; i++ ) {
4995
		dataPriv.set(
4996
			elems[ i ],
4997
			"globalEval",
4998
			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
4999
		);
5000
	}
5001
}
5002

5003

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

5006
function buildFragment( elems, context, scripts, selection, ignored ) {
5007
	var elem, tmp, tag, wrap, attached, j,
5008
		fragment = context.createDocumentFragment(),
5009
		nodes = [],
5010
		i = 0,
5011
		l = elems.length;
5012

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

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

5018
			// Add nodes directly
5019
			if ( toType( elem ) === "object" ) {
5020

5021
				// Support: Android <=4.0 only, PhantomJS 1 only
5022
				// push.apply(_, arraylike) throws on ancient WebKit
5023
				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
5024

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

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

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

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

5044
				// Support: Android <=4.0 only, PhantomJS 1 only
5045
				// push.apply(_, arraylike) throws on ancient WebKit
5046
				jQuery.merge( nodes, tmp.childNodes );
5047

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

5051
				// Ensure the created nodes are orphaned (#12392)
5052
				tmp.textContent = "";
5053
			}
5054
		}
5055
	}
5056

5057
	// Remove wrapper from fragment
5058
	fragment.textContent = "";
5059

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

5063
		// Skip elements already in the context collection (trac-4087)
5064
		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
5065
			if ( ignored ) {
5066
				ignored.push( elem );
5067
			}
5068
			continue;
5069
		}
5070

5071
		attached = isAttached( elem );
5072

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

5076
		// Preserve script evaluation history
5077
		if ( attached ) {
5078
			setGlobalEval( tmp );
5079
		}
5080

5081
		// Capture executables
5082
		if ( scripts ) {
5083
			j = 0;
5084
			while ( ( elem = tmp[ j++ ] ) ) {
5085
				if ( rscriptType.test( elem.type || "" ) ) {
5086
					scripts.push( elem );
5087
				}
5088
			}
5089
		}
5090
	}
5091

5092
	return fragment;
5093
}
5094

5095

5096
var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
5097

5098
function returnTrue() {
5099
	return true;
5100
}
5101

5102
function returnFalse() {
5103
	return false;
5104
}
5105

5106
// Support: IE <=9 - 11+
5107
// focus() and blur() are asynchronous, except when they are no-op.
5108
// So expect focus to be synchronous when the element is already active,
5109
// and blur to be synchronous when the element is not already active.
5110
// (focus and blur are always synchronous in other supported browsers,
5111
// this just defines when we can count on it).
5112
function expectSync( elem, type ) {
5113
	return ( elem === safeActiveElement() ) === ( type === "focus" );
5114
}
5115

5116
// Support: IE <=9 only
5117
// Accessing document.activeElement can throw unexpectedly
5118
// https://bugs.jquery.com/ticket/13393
5119
function safeActiveElement() {
5120
	try {
5121
		return document.activeElement;
5122
	} catch ( err ) { }
5123
}
5124

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

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

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

5134
			// ( types-Object, data )
5135
			data = data || selector;
5136
			selector = undefined;
5137
		}
5138
		for ( type in types ) {
5139
			on( elem, type, selector, data, types[ type ], one );
5140
		}
5141
		return elem;
5142
	}
5143

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

5146
		// ( types, fn )
5147
		fn = selector;
5148
		data = selector = undefined;
5149
	} else if ( fn == null ) {
5150
		if ( typeof selector === "string" ) {
5151

5152
			// ( types, selector, fn )
5153
			fn = data;
5154
			data = undefined;
5155
		} else {
5156

5157
			// ( types, data, fn )
5158
			fn = data;
5159
			data = selector;
5160
			selector = undefined;
5161
		}
5162
	}
5163
	if ( fn === false ) {
5164
		fn = returnFalse;
5165
	} else if ( !fn ) {
5166
		return elem;
5167
	}
5168

5169
	if ( one === 1 ) {
5170
		origFn = fn;
5171
		fn = function( event ) {
5172

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

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

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

5192
	global: {},
5193

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

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

5201
		// Only attach events to objects that accept data
5202
		if ( !acceptData( elem ) ) {
5203
			return;
5204
		}
5205

5206
		// Caller can pass in an object of custom data in lieu of the handler
5207
		if ( handler.handler ) {
5208
			handleObjIn = handler;
5209
			handler = handleObjIn.handler;
5210
			selector = handleObjIn.selector;
5211
		}
5212

5213
		// Ensure that invalid selectors throw exceptions at attach time
5214
		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
5215
		if ( selector ) {
5216
			jQuery.find.matchesSelector( documentElement, selector );
5217
		}
5218

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

5224
		// Init the element's event structure and main handler, if this is the first
5225
		if ( !( events = elemData.events ) ) {
5226
			events = elemData.events = Object.create( null );
5227
		}
5228
		if ( !( eventHandle = elemData.handle ) ) {
5229
			eventHandle = elemData.handle = function( e ) {
5230

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

5238
		// Handle multiple events separated by a space
5239
		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5240
		t = types.length;
5241
		while ( t-- ) {
5242
			tmp = rtypenamespace.exec( types[ t ] ) || [];
5243
			type = origType = tmp[ 1 ];
5244
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5245

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

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

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

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

5260
			// handleObj is passed to all event handlers
5261
			handleObj = jQuery.extend( {
5262
				type: type,
5263
				origType: origType,
5264
				data: data,
5265
				handler: handler,
5266
				guid: handler.guid,
5267
				selector: selector,
5268
				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5269
				namespace: namespaces.join( "." )
5270
			}, handleObjIn );
5271

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

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

5281
					if ( elem.addEventListener ) {
5282
						elem.addEventListener( type, eventHandle );
5283
					}
5284
				}
5285
			}
5286

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

5290
				if ( !handleObj.handler.guid ) {
5291
					handleObj.handler.guid = handler.guid;
5292
				}
5293
			}
5294

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

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

5306
	},
5307

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

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

5316
		if ( !elemData || !( events = elemData.events ) ) {
5317
			return;
5318
		}
5319

5320
		// Once for each type.namespace in types; type may be omitted
5321
		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5322
		t = types.length;
5323
		while ( t-- ) {
5324
			tmp = rtypenamespace.exec( types[ t ] ) || [];
5325
			type = origType = tmp[ 1 ];
5326
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5327

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

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

5342
			// Remove matching events
5343
			origCount = j = handlers.length;
5344
			while ( j-- ) {
5345
				handleObj = handlers[ j ];
5346

5347
				if ( ( mappedTypes || origType === handleObj.origType ) &&
5348
					( !handler || handler.guid === handleObj.guid ) &&
5349
					( !tmp || tmp.test( handleObj.namespace ) ) &&
5350
					( !selector || selector === handleObj.selector ||
5351
						selector === "**" && handleObj.selector ) ) {
5352
					handlers.splice( j, 1 );
5353

5354
					if ( handleObj.selector ) {
5355
						handlers.delegateCount--;
5356
					}
5357
					if ( special.remove ) {
5358
						special.remove.call( elem, handleObj );
5359
					}
5360
				}
5361
			}
5362

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

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

5372
				delete events[ type ];
5373
			}
5374
		}
5375

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

5382
	dispatch: function( nativeEvent ) {
5383

5384
		var i, j, ret, matched, handleObj, handlerQueue,
5385
			args = new Array( arguments.length ),
5386

5387
			// Make a writable jQuery.Event from the native event object
5388
			event = jQuery.event.fix( nativeEvent ),
5389

5390
			handlers = (
5391
				dataPriv.get( this, "events" ) || Object.create( null )
5392
			)[ event.type ] || [],
5393
			special = jQuery.event.special[ event.type ] || {};
5394

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

5398
		for ( i = 1; i < arguments.length; i++ ) {
5399
			args[ i ] = arguments[ i ];
5400
		}
5401

5402
		event.delegateTarget = this;
5403

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

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

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

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

5421
				// If the event is namespaced, then each handler is only invoked if it is
5422
				// specially universal or its namespaces are a superset of the event's.
5423
				if ( !event.rnamespace || handleObj.namespace === false ||
5424
					event.rnamespace.test( handleObj.namespace ) ) {
5425

5426
					event.handleObj = handleObj;
5427
					event.data = handleObj.data;
5428

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

5432
					if ( ret !== undefined ) {
5433
						if ( ( event.result = ret ) === false ) {
5434
							event.preventDefault();
5435
							event.stopPropagation();
5436
						}
5437
					}
5438
				}
5439
			}
5440
		}
5441

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

5447
		return event.result;
5448
	},
5449

5450
	handlers: function( event, handlers ) {
5451
		var i, handleObj, sel, matchedHandlers, matchedSelectors,
5452
			handlerQueue = [],
5453
			delegateCount = handlers.delegateCount,
5454
			cur = event.target;
5455

5456
		// Find delegate handlers
5457
		if ( delegateCount &&
5458

5459
			// Support: IE <=9
5460
			// Black-hole SVG <use> instance trees (trac-13180)
5461
			cur.nodeType &&
5462

5463
			// Support: Firefox <=42
5464
			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5465
			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5466
			// Support: IE 11 only
5467
			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5468
			!( event.type === "click" && event.button >= 1 ) ) {
5469

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

5472
				// Don't check non-elements (#13208)
5473
				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5474
				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5475
					matchedHandlers = [];
5476
					matchedSelectors = {};
5477
					for ( i = 0; i < delegateCount; i++ ) {
5478
						handleObj = handlers[ i ];
5479

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

5483
						if ( matchedSelectors[ sel ] === undefined ) {
5484
							matchedSelectors[ sel ] = handleObj.needsContext ?
5485
								jQuery( sel, this ).index( cur ) > -1 :
5486
								jQuery.find( sel, this, null, [ cur ] ).length;
5487
						}
5488
						if ( matchedSelectors[ sel ] ) {
5489
							matchedHandlers.push( handleObj );
5490
						}
5491
					}
5492
					if ( matchedHandlers.length ) {
5493
						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5494
					}
5495
				}
5496
			}
5497
		}
5498

5499
		// Add the remaining (directly-bound) handlers
5500
		cur = this;
5501
		if ( delegateCount < handlers.length ) {
5502
			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5503
		}
5504

5505
		return handlerQueue;
5506
	},
5507

5508
	addProp: function( name, hook ) {
5509
		Object.defineProperty( jQuery.Event.prototype, name, {
5510
			enumerable: true,
5511
			configurable: true,
5512

5513
			get: isFunction( hook ) ?
5514
				function() {
5515
					if ( this.originalEvent ) {
5516
						return hook( this.originalEvent );
5517
					}
5518
				} :
5519
				function() {
5520
					if ( this.originalEvent ) {
5521
						return this.originalEvent[ name ];
5522
					}
5523
				},
5524

5525
			set: function( value ) {
5526
				Object.defineProperty( this, name, {
5527
					enumerable: true,
5528
					configurable: true,
5529
					writable: true,
5530
					value: value
5531
				} );
5532
			}
5533
		} );
5534
	},
5535

5536
	fix: function( originalEvent ) {
5537
		return originalEvent[ jQuery.expando ] ?
5538
			originalEvent :
5539
			new jQuery.Event( originalEvent );
5540
	},
5541

5542
	special: {
5543
		load: {
5544

5545
			// Prevent triggered image.load events from bubbling to window.load
5546
			noBubble: true
5547
		},
5548
		click: {
5549

5550
			// Utilize native event to ensure correct state for checkable inputs
5551
			setup: function( data ) {
5552

5553
				// For mutual compressibility with _default, replace `this` access with a local var.
5554
				// `|| data` is dead code meant only to preserve the variable through minification.
5555
				var el = this || data;
5556

5557
				// Claim the first handler
5558
				if ( rcheckableType.test( el.type ) &&
5559
					el.click && nodeName( el, "input" ) ) {
5560

5561
					// dataPriv.set( el, "click", ... )
5562
					leverageNative( el, "click", returnTrue );
5563
				}
5564

5565
				// Return false to allow normal processing in the caller
5566
				return false;
5567
			},
5568
			trigger: function( data ) {
5569

5570
				// For mutual compressibility with _default, replace `this` access with a local var.
5571
				// `|| data` is dead code meant only to preserve the variable through minification.
5572
				var el = this || data;
5573

5574
				// Force setup before triggering a click
5575
				if ( rcheckableType.test( el.type ) &&
5576
					el.click && nodeName( el, "input" ) ) {
5577

5578
					leverageNative( el, "click" );
5579
				}
5580

5581
				// Return non-false to allow normal event-path propagation
5582
				return true;
5583
			},
5584

5585
			// For cross-browser consistency, suppress native .click() on links
5586
			// Also prevent it if we're currently inside a leveraged native-event stack
5587
			_default: function( event ) {
5588
				var target = event.target;
5589
				return rcheckableType.test( target.type ) &&
5590
					target.click && nodeName( target, "input" ) &&
5591
					dataPriv.get( target, "click" ) ||
5592
					nodeName( target, "a" );
5593
			}
5594
		},
5595

5596
		beforeunload: {
5597
			postDispatch: function( event ) {
5598

5599
				// Support: Firefox 20+
5600
				// Firefox doesn't alert if the returnValue field is not set.
5601
				if ( event.result !== undefined && event.originalEvent ) {
5602
					event.originalEvent.returnValue = event.result;
5603
				}
5604
			}
5605
		}
5606
	}
5607
};
5608

5609
// Ensure the presence of an event listener that handles manually-triggered
5610
// synthetic events by interrupting progress until reinvoked in response to
5611
// *native* events that it fires directly, ensuring that state changes have
5612
// already occurred before other listeners are invoked.
5613
function leverageNative( el, type, expectSync ) {
5614

5615
	// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5616
	if ( !expectSync ) {
5617
		if ( dataPriv.get( el, type ) === undefined ) {
5618
			jQuery.event.add( el, type, returnTrue );
5619
		}
5620
		return;
5621
	}
5622

5623
	// Register the controller as a special universal handler for all event namespaces
5624
	dataPriv.set( el, type, false );
5625
	jQuery.event.add( el, type, {
5626
		namespace: false,
5627
		handler: function( event ) {
5628
			var notAsync, result,
5629
				saved = dataPriv.get( this, type );
5630

5631
			if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5632

5633
				// Interrupt processing of the outer synthetic .trigger()ed event
5634
				// Saved data should be false in such cases, but might be a leftover capture object
5635
				// from an async native handler (gh-4350)
5636
				if ( !saved.length ) {
5637

5638
					// Store arguments for use when handling the inner native event
5639
					// There will always be at least one argument (an event object), so this array
5640
					// will not be confused with a leftover capture object.
5641
					saved = slice.call( arguments );
5642
					dataPriv.set( this, type, saved );
5643

5644
					// Trigger the native event and capture its result
5645
					// Support: IE <=9 - 11+
5646
					// focus() and blur() are asynchronous
5647
					notAsync = expectSync( this, type );
5648
					this[ type ]();
5649
					result = dataPriv.get( this, type );
5650
					if ( saved !== result || notAsync ) {
5651
						dataPriv.set( this, type, false );
5652
					} else {
5653
						result = {};
5654
					}
5655
					if ( saved !== result ) {
5656

5657
						// Cancel the outer synthetic event
5658
						event.stopImmediatePropagation();
5659
						event.preventDefault();
5660

5661
						// Support: Chrome 86+
5662
						// In Chrome, if an element having a focusout handler is blurred by
5663
						// clicking outside of it, it invokes the handler synchronously. If
5664
						// that handler calls `.remove()` on the element, the data is cleared,
5665
						// leaving `result` undefined. We need to guard against this.
5666
						return result && result.value;
5667
					}
5668

5669
				// If this is an inner synthetic event for an event with a bubbling surrogate
5670
				// (focus or blur), assume that the surrogate already propagated from triggering the
5671
				// native event and prevent that from happening again here.
5672
				// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5673
				// bubbling surrogate propagates *after* the non-bubbling base), but that seems
5674
				// less bad than duplication.
5675
				} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5676
					event.stopPropagation();
5677
				}
5678

5679
			// If this is a native event triggered above, everything is now in order
5680
			// Fire an inner synthetic event with the original arguments
5681
			} else if ( saved.length ) {
5682

5683
				// ...and capture the result
5684
				dataPriv.set( this, type, {
5685
					value: jQuery.event.trigger(
5686

5687
						// Support: IE <=9 - 11+
5688
						// Extend with the prototype to reset the above stopImmediatePropagation()
5689
						jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5690
						saved.slice( 1 ),
5691
						this
5692
					)
5693
				} );
5694

5695
				// Abort handling of the native event
5696
				event.stopImmediatePropagation();
5697
			}
5698
		}
5699
	} );
5700
}
5701

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

5704
	// This "if" is needed for plain objects
5705
	if ( elem.removeEventListener ) {
5706
		elem.removeEventListener( type, handle );
5707
	}
5708
};
5709

5710
jQuery.Event = function( src, props ) {
5711

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

5717
	// Event object
5718
	if ( src && src.type ) {
5719
		this.originalEvent = src;
5720
		this.type = src.type;
5721

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

5727
				// Support: Android <=2.3 only
5728
				src.returnValue === false ?
5729
			returnTrue :
5730
			returnFalse;
5731

5732
		// Create target properties
5733
		// Support: Safari <=6 - 7 only
5734
		// Target should not be a text node (#504, #13143)
5735
		this.target = ( src.target && src.target.nodeType === 3 ) ?
5736
			src.target.parentNode :
5737
			src.target;
5738

5739
		this.currentTarget = src.currentTarget;
5740
		this.relatedTarget = src.relatedTarget;
5741

5742
	// Event type
5743
	} else {
5744
		this.type = src;
5745
	}
5746

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

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

5755
	// Mark it as fixed
5756
	this[ jQuery.expando ] = true;
5757
};
5758

5759
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5760
// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5761
jQuery.Event.prototype = {
5762
	constructor: jQuery.Event,
5763
	isDefaultPrevented: returnFalse,
5764
	isPropagationStopped: returnFalse,
5765
	isImmediatePropagationStopped: returnFalse,
5766
	isSimulated: false,
5767

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

5771
		this.isDefaultPrevented = returnTrue;
5772

5773
		if ( e && !this.isSimulated ) {
5774
			e.preventDefault();
5775
		}
5776
	},
5777
	stopPropagation: function() {
5778
		var e = this.originalEvent;
5779

5780
		this.isPropagationStopped = returnTrue;
5781

5782
		if ( e && !this.isSimulated ) {
5783
			e.stopPropagation();
5784
		}
5785
	},
5786
	stopImmediatePropagation: function() {
5787
		var e = this.originalEvent;
5788

5789
		this.isImmediatePropagationStopped = returnTrue;
5790

5791
		if ( e && !this.isSimulated ) {
5792
			e.stopImmediatePropagation();
5793
		}
5794

5795
		this.stopPropagation();
5796
	}
5797
};
5798

5799
// Includes all common event props including KeyEvent and MouseEvent specific props
5800
jQuery.each( {
5801
	altKey: true,
5802
	bubbles: true,
5803
	cancelable: true,
5804
	changedTouches: true,
5805
	ctrlKey: true,
5806
	detail: true,
5807
	eventPhase: true,
5808
	metaKey: true,
5809
	pageX: true,
5810
	pageY: true,
5811
	shiftKey: true,
5812
	view: true,
5813
	"char": true,
5814
	code: true,
5815
	charCode: true,
5816
	key: true,
5817
	keyCode: true,
5818
	button: true,
5819
	buttons: true,
5820
	clientX: true,
5821
	clientY: true,
5822
	offsetX: true,
5823
	offsetY: true,
5824
	pointerId: true,
5825
	pointerType: true,
5826
	screenX: true,
5827
	screenY: true,
5828
	targetTouches: true,
5829
	toElement: true,
5830
	touches: true,
5831
	which: true
5832
}, jQuery.event.addProp );
5833

5834
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5835
	jQuery.event.special[ type ] = {
5836

5837
		// Utilize native event if possible so blur/focus sequence is correct
5838
		setup: function() {
5839

5840
			// Claim the first handler
5841
			// dataPriv.set( this, "focus", ... )
5842
			// dataPriv.set( this, "blur", ... )
5843
			leverageNative( this, type, expectSync );
5844

5845
			// Return false to allow normal processing in the caller
5846
			return false;
5847
		},
5848
		trigger: function() {
5849

5850
			// Force setup before trigger
5851
			leverageNative( this, type );
5852

5853
			// Return non-false to allow normal event-path propagation
5854
			return true;
5855
		},
5856

5857
		// Suppress native focus or blur as it's already being fired
5858
		// in leverageNative.
5859
		_default: function() {
5860
			return true;
5861
		},
5862

5863
		delegateType: delegateType
5864
	};
5865
} );
5866

5867
// Create mouseenter/leave events using mouseover/out and event-time checks
5868
// so that event delegation works in jQuery.
5869
// Do the same for pointerenter/pointerleave and pointerover/pointerout
5870
//
5871
// Support: Safari 7 only
5872
// Safari sends mouseenter too often; see:
5873
// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5874
// for the description of the bug (it existed in older Chrome versions as well).
5875
jQuery.each( {
5876
	mouseenter: "mouseover",
5877
	mouseleave: "mouseout",
5878
	pointerenter: "pointerover",
5879
	pointerleave: "pointerout"
5880
}, function( orig, fix ) {
5881
	jQuery.event.special[ orig ] = {
5882
		delegateType: fix,
5883
		bindType: fix,
5884

5885
		handle: function( event ) {
5886
			var ret,
5887
				target = this,
5888
				related = event.relatedTarget,
5889
				handleObj = event.handleObj;
5890

5891
			// For mouseenter/leave call the handler if related is outside the target.
5892
			// NB: No relatedTarget if the mouse left/entered the browser window
5893
			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5894
				event.type = handleObj.origType;
5895
				ret = handleObj.handler.apply( this, arguments );
5896
				event.type = fix;
5897
			}
5898
			return ret;
5899
		}
5900
	};
5901
} );
5902

5903
jQuery.fn.extend( {
5904

5905
	on: function( types, selector, data, fn ) {
5906
		return on( this, types, selector, data, fn );
5907
	},
5908
	one: function( types, selector, data, fn ) {
5909
		return on( this, types, selector, data, fn, 1 );
5910
	},
5911
	off: function( types, selector, fn ) {
5912
		var handleObj, type;
5913
		if ( types && types.preventDefault && types.handleObj ) {
5914

5915
			// ( event )  dispatched jQuery.Event
5916
			handleObj = types.handleObj;
5917
			jQuery( types.delegateTarget ).off(
5918
				handleObj.namespace ?
5919
					handleObj.origType + "." + handleObj.namespace :
5920
					handleObj.origType,
5921
				handleObj.selector,
5922
				handleObj.handler
5923
			);
5924
			return this;
5925
		}
5926
		if ( typeof types === "object" ) {
5927

5928
			// ( types-object [, selector] )
5929
			for ( type in types ) {
5930
				this.off( type, selector, types[ type ] );
5931
			}
5932
			return this;
5933
		}
5934
		if ( selector === false || typeof selector === "function" ) {
5935

5936
			// ( types [, fn] )
5937
			fn = selector;
5938
			selector = undefined;
5939
		}
5940
		if ( fn === false ) {
5941
			fn = returnFalse;
5942
		}
5943
		return this.each( function() {
5944
			jQuery.event.remove( this, types, fn, selector );
5945
		} );
5946
	}
5947
} );
5948

5949

5950
var
5951

5952
	// Support: IE <=10 - 11, Edge 12 - 13 only
5953
	// In IE/Edge using regex groups here causes severe slowdowns.
5954
	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5955
	rnoInnerhtml = /<script|<style|<link/i,
5956

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

5961
// Prefer a tbody over its parent table for containing new rows
5962
function manipulationTarget( elem, content ) {
5963
	if ( nodeName( elem, "table" ) &&
5964
		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5965

5966
		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5967
	}
5968

5969
	return elem;
5970
}
5971

5972
// Replace/restore the type attribute of script elements for safe DOM manipulation
5973
function disableScript( elem ) {
5974
	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5975
	return elem;
5976
}
5977
function restoreScript( elem ) {
5978
	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5979
		elem.type = elem.type.slice( 5 );
5980
	} else {
5981
		elem.removeAttribute( "type" );
5982
	}
5983

5984
	return elem;
5985
}
5986

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

5990
	if ( dest.nodeType !== 1 ) {
5991
		return;
5992
	}
5993

5994
	// 1. Copy private data: events, handlers, etc.
5995
	if ( dataPriv.hasData( src ) ) {
5996
		pdataOld = dataPriv.get( src );
5997
		events = pdataOld.events;
5998

5999
		if ( events ) {
6000
			dataPriv.remove( dest, "handle events" );
6001

6002
			for ( type in events ) {
6003
				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
6004
					jQuery.event.add( dest, type, events[ type ][ i ] );
6005
				}
6006
			}
6007
		}
6008
	}
6009

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

6015
		dataUser.set( dest, udataCur );
6016
	}
6017
}
6018

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

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

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

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

6035
	// Flatten any nested arrays
6036
	args = flat( args );
6037

6038
	var fragment, first, scripts, hasScripts, node, doc,
6039
		i = 0,
6040
		l = collection.length,
6041
		iNoClone = l - 1,
6042
		value = args[ 0 ],
6043
		valueIsFunction = isFunction( value );
6044

6045
	// We can't cloneNode fragments that contain checked, in WebKit
6046
	if ( valueIsFunction ||
6047
			( l > 1 && typeof value === "string" &&
6048
				!support.checkClone && rchecked.test( value ) ) ) {
6049
		return collection.each( function( index ) {
6050
			var self = collection.eq( index );
6051
			if ( valueIsFunction ) {
6052
				args[ 0 ] = value.call( this, index, self.html() );
6053
			}
6054
			domManip( self, args, callback, ignored );
6055
		} );
6056
	}
6057

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

6062
		if ( fragment.childNodes.length === 1 ) {
6063
			fragment = first;
6064
		}
6065

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

6071
			// Use the original fragment for the last item
6072
			// instead of the first because it can end up
6073
			// being emptied incorrectly in certain situations (#8070).
6074
			for ( ; i < l; i++ ) {
6075
				node = fragment;
6076

6077
				if ( i !== iNoClone ) {
6078
					node = jQuery.clone( node, true, true );
6079

6080
					// Keep references to cloned scripts for later restoration
6081
					if ( hasScripts ) {
6082

6083
						// Support: Android <=4.0 only, PhantomJS 1 only
6084
						// push.apply(_, arraylike) throws on ancient WebKit
6085
						jQuery.merge( scripts, getAll( node, "script" ) );
6086
					}
6087
				}
6088

6089
				callback.call( collection[ i ], node, i );
6090
			}
6091

6092
			if ( hasScripts ) {
6093
				doc = scripts[ scripts.length - 1 ].ownerDocument;
6094

6095
				// Reenable scripts
6096
				jQuery.map( scripts, restoreScript );
6097

6098
				// Evaluate executable scripts on first document insertion
6099
				for ( i = 0; i < hasScripts; i++ ) {
6100
					node = scripts[ i ];
6101
					if ( rscriptType.test( node.type || "" ) &&
6102
						!dataPriv.access( node, "globalEval" ) &&
6103
						jQuery.contains( doc, node ) ) {
6104

6105
						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
6106

6107
							// Optional AJAX dependency, but won't run scripts if not present
6108
							if ( jQuery._evalUrl && !node.noModule ) {
6109
								jQuery._evalUrl( node.src, {
6110
									nonce: node.nonce || node.getAttribute( "nonce" )
6111
								}, doc );
6112
							}
6113
						} else {
6114
							DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
6115
						}
6116
					}
6117
				}
6118
			}
6119
		}
6120
	}
6121

6122
	return collection;
6123
}
6124

6125
function remove( elem, selector, keepData ) {
6126
	var node,
6127
		nodes = selector ? jQuery.filter( selector, elem ) : elem,
6128
		i = 0;
6129

6130
	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
6131
		if ( !keepData && node.nodeType === 1 ) {
6132
			jQuery.cleanData( getAll( node ) );
6133
		}
6134

6135
		if ( node.parentNode ) {
6136
			if ( keepData && isAttached( node ) ) {
6137
				setGlobalEval( getAll( node, "script" ) );
6138
			}
6139
			node.parentNode.removeChild( node );
6140
		}
6141
	}
6142

6143
	return elem;
6144
}
6145

6146
jQuery.extend( {
6147
	htmlPrefilter: function( html ) {
6148
		return html;
6149
	},
6150

6151
	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6152
		var i, l, srcElements, destElements,
6153
			clone = elem.cloneNode( true ),
6154
			inPage = isAttached( elem );
6155

6156
		// Fix IE cloning issues
6157
		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
6158
				!jQuery.isXMLDoc( elem ) ) {
6159

6160
			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
6161
			destElements = getAll( clone );
6162
			srcElements = getAll( elem );
6163

6164
			for ( i = 0, l = srcElements.length; i < l; i++ ) {
6165
				fixInput( srcElements[ i ], destElements[ i ] );
6166
			}
6167
		}
6168

6169
		// Copy the events from the original to the clone
6170
		if ( dataAndEvents ) {
6171
			if ( deepDataAndEvents ) {
6172
				srcElements = srcElements || getAll( elem );
6173
				destElements = destElements || getAll( clone );
6174

6175
				for ( i = 0, l = srcElements.length; i < l; i++ ) {
6176
					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
6177
				}
6178
			} else {
6179
				cloneCopyEvent( elem, clone );
6180
			}
6181
		}
6182

6183
		// Preserve script evaluation history
6184
		destElements = getAll( clone, "script" );
6185
		if ( destElements.length > 0 ) {
6186
			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6187
		}
6188

6189
		// Return the cloned set
6190
		return clone;
6191
	},
6192

6193
	cleanData: function( elems ) {
6194
		var data, elem, type,
6195
			special = jQuery.event.special,
6196
			i = 0;
6197

6198
		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
6199
			if ( acceptData( elem ) ) {
6200
				if ( ( data = elem[ dataPriv.expando ] ) ) {
6201
					if ( data.events ) {
6202
						for ( type in data.events ) {
6203
							if ( special[ type ] ) {
6204
								jQuery.event.remove( elem, type );
6205

6206
							// This is a shortcut to avoid jQuery.event.remove's overhead
6207
							} else {
6208
								jQuery.removeEvent( elem, type, data.handle );
6209
							}
6210
						}
6211
					}
6212

6213
					// Support: Chrome <=35 - 45+
6214
					// Assign undefined instead of using delete, see Data#remove
6215
					elem[ dataPriv.expando ] = undefined;
6216
				}
6217
				if ( elem[ dataUser.expando ] ) {
6218

6219
					// Support: Chrome <=35 - 45+
6220
					// Assign undefined instead of using delete, see Data#remove
6221
					elem[ dataUser.expando ] = undefined;
6222
				}
6223
			}
6224
		}
6225
	}
6226
} );
6227

6228
jQuery.fn.extend( {
6229
	detach: function( selector ) {
6230
		return remove( this, selector, true );
6231
	},
6232

6233
	remove: function( selector ) {
6234
		return remove( this, selector );
6235
	},
6236

6237
	text: function( value ) {
6238
		return access( this, function( value ) {
6239
			return value === undefined ?
6240
				jQuery.text( this ) :
6241
				this.empty().each( function() {
6242
					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6243
						this.textContent = value;
6244
					}
6245
				} );
6246
		}, null, value, arguments.length );
6247
	},
6248

6249
	append: function() {
6250
		return domManip( this, arguments, function( elem ) {
6251
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6252
				var target = manipulationTarget( this, elem );
6253
				target.appendChild( elem );
6254
			}
6255
		} );
6256
	},
6257

6258
	prepend: function() {
6259
		return domManip( this, arguments, function( elem ) {
6260
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6261
				var target = manipulationTarget( this, elem );
6262
				target.insertBefore( elem, target.firstChild );
6263
			}
6264
		} );
6265
	},
6266

6267
	before: function() {
6268
		return domManip( this, arguments, function( elem ) {
6269
			if ( this.parentNode ) {
6270
				this.parentNode.insertBefore( elem, this );
6271
			}
6272
		} );
6273
	},
6274

6275
	after: function() {
6276
		return domManip( this, arguments, function( elem ) {
6277
			if ( this.parentNode ) {
6278
				this.parentNode.insertBefore( elem, this.nextSibling );
6279
			}
6280
		} );
6281
	},
6282

6283
	empty: function() {
6284
		var elem,
6285
			i = 0;
6286

6287
		for ( ; ( elem = this[ i ] ) != null; i++ ) {
6288
			if ( elem.nodeType === 1 ) {
6289

6290
				// Prevent memory leaks
6291
				jQuery.cleanData( getAll( elem, false ) );
6292

6293
				// Remove any remaining nodes
6294
				elem.textContent = "";
6295
			}
6296
		}
6297

6298
		return this;
6299
	},
6300

6301
	clone: function( dataAndEvents, deepDataAndEvents ) {
6302
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6303
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6304

6305
		return this.map( function() {
6306
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6307
		} );
6308
	},
6309

6310
	html: function( value ) {
6311
		return access( this, function( value ) {
6312
			var elem = this[ 0 ] || {},
6313
				i = 0,
6314
				l = this.length;
6315

6316
			if ( value === undefined && elem.nodeType === 1 ) {
6317
				return elem.innerHTML;
6318
			}
6319

6320
			// See if we can take a shortcut and just use innerHTML
6321
			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6322
				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6323

6324
				value = jQuery.htmlPrefilter( value );
6325

6326
				try {
6327
					for ( ; i < l; i++ ) {
6328
						elem = this[ i ] || {};
6329

6330
						// Remove element nodes and prevent memory leaks
6331
						if ( elem.nodeType === 1 ) {
6332
							jQuery.cleanData( getAll( elem, false ) );
6333
							elem.innerHTML = value;
6334
						}
6335
					}
6336

6337
					elem = 0;
6338

6339
				// If using innerHTML throws an exception, use the fallback method
6340
				} catch ( e ) {}
6341
			}
6342

6343
			if ( elem ) {
6344
				this.empty().append( value );
6345
			}
6346
		}, null, value, arguments.length );
6347
	},
6348

6349
	replaceWith: function() {
6350
		var ignored = [];
6351

6352
		// Make the changes, replacing each non-ignored context element with the new content
6353
		return domManip( this, arguments, function( elem ) {
6354
			var parent = this.parentNode;
6355

6356
			if ( jQuery.inArray( this, ignored ) < 0 ) {
6357
				jQuery.cleanData( getAll( this ) );
6358
				if ( parent ) {
6359
					parent.replaceChild( elem, this );
6360
				}
6361
			}
6362

6363
		// Force callback invocation
6364
		}, ignored );
6365
	}
6366
} );
6367

6368
jQuery.each( {
6369
	appendTo: "append",
6370
	prependTo: "prepend",
6371
	insertBefore: "before",
6372
	insertAfter: "after",
6373
	replaceAll: "replaceWith"
6374
}, function( name, original ) {
6375
	jQuery.fn[ name ] = function( selector ) {
6376
		var elems,
6377
			ret = [],
6378
			insert = jQuery( selector ),
6379
			last = insert.length - 1,
6380
			i = 0;
6381

6382
		for ( ; i <= last; i++ ) {
6383
			elems = i === last ? this : this.clone( true );
6384
			jQuery( insert[ i ] )[ original ]( elems );
6385

6386
			// Support: Android <=4.0 only, PhantomJS 1 only
6387
			// .get() because push.apply(_, arraylike) throws on ancient WebKit
6388
			push.apply( ret, elems.get() );
6389
		}
6390

6391
		return this.pushStack( ret );
6392
	};
6393
} );
6394
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6395

6396
var getStyles = function( elem ) {
6397

6398
		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6399
		// IE throws on elements created in popups
6400
		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6401
		var view = elem.ownerDocument.defaultView;
6402

6403
		if ( !view || !view.opener ) {
6404
			view = window;
6405
		}
6406

6407
		return view.getComputedStyle( elem );
6408
	};
6409

6410
var swap = function( elem, options, callback ) {
6411
	var ret, name,
6412
		old = {};
6413

6414
	// Remember the old values, and insert the new ones
6415
	for ( name in options ) {
6416
		old[ name ] = elem.style[ name ];
6417
		elem.style[ name ] = options[ name ];
6418
	}
6419

6420
	ret = callback.call( elem );
6421

6422
	// Revert the old values
6423
	for ( name in options ) {
6424
		elem.style[ name ] = old[ name ];
6425
	}
6426

6427
	return ret;
6428
};
6429

6430

6431
var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6432

6433

6434

6435
( function() {
6436

6437
	// Executing both pixelPosition & boxSizingReliable tests require only one layout
6438
	// so they're executed at the same time to save the second computation.
6439
	function computeStyleTests() {
6440

6441
		// This is a singleton, we need to execute it only once
6442
		if ( !div ) {
6443
			return;
6444
		}
6445

6446
		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6447
			"margin-top:1px;padding:0;border:0";
6448
		div.style.cssText =
6449
			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6450
			"margin:auto;border:1px;padding:1px;" +
6451
			"width:60%;top:1%";
6452
		documentElement.appendChild( container ).appendChild( div );
6453

6454
		var divStyle = window.getComputedStyle( div );
6455
		pixelPositionVal = divStyle.top !== "1%";
6456

6457
		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6458
		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6459

6460
		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6461
		// Some styles come back with percentage values, even though they shouldn't
6462
		div.style.right = "60%";
6463
		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6464

6465
		// Support: IE 9 - 11 only
6466
		// Detect misreporting of content dimensions for box-sizing:border-box elements
6467
		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6468

6469
		// Support: IE 9 only
6470
		// Detect overflow:scroll screwiness (gh-3699)
6471
		// Support: Chrome <=64
6472
		// Don't get tricked when zoom affects offsetWidth (gh-4029)
6473
		div.style.position = "absolute";
6474
		scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6475

6476
		documentElement.removeChild( container );
6477

6478
		// Nullify the div so it wouldn't be stored in the memory and
6479
		// it will also be a sign that checks already performed
6480
		div = null;
6481
	}
6482

6483
	function roundPixelMeasures( measure ) {
6484
		return Math.round( parseFloat( measure ) );
6485
	}
6486

6487
	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6488
		reliableTrDimensionsVal, reliableMarginLeftVal,
6489
		container = document.createElement( "div" ),
6490
		div = document.createElement( "div" );
6491

6492
	// Finish early in limited (non-browser) environments
6493
	if ( !div.style ) {
6494
		return;
6495
	}
6496

6497
	// Support: IE <=9 - 11 only
6498
	// Style of cloned element affects source element cloned (#8908)
6499
	div.style.backgroundClip = "content-box";
6500
	div.cloneNode( true ).style.backgroundClip = "";
6501
	support.clearCloneStyle = div.style.backgroundClip === "content-box";
6502

6503
	jQuery.extend( support, {
6504
		boxSizingReliable: function() {
6505
			computeStyleTests();
6506
			return boxSizingReliableVal;
6507
		},
6508
		pixelBoxStyles: function() {
6509
			computeStyleTests();
6510
			return pixelBoxStylesVal;
6511
		},
6512
		pixelPosition: function() {
6513
			computeStyleTests();
6514
			return pixelPositionVal;
6515
		},
6516
		reliableMarginLeft: function() {
6517
			computeStyleTests();
6518
			return reliableMarginLeftVal;
6519
		},
6520
		scrollboxSize: function() {
6521
			computeStyleTests();
6522
			return scrollboxSizeVal;
6523
		},
6524

6525
		// Support: IE 9 - 11+, Edge 15 - 18+
6526
		// IE/Edge misreport `getComputedStyle` of table rows with width/height
6527
		// set in CSS while `offset*` properties report correct values.
6528
		// Behavior in IE 9 is more subtle than in newer versions & it passes
6529
		// some versions of this test; make sure not to make it pass there!
6530
		//
6531
		// Support: Firefox 70+
6532
		// Only Firefox includes border widths
6533
		// in computed dimensions. (gh-4529)
6534
		reliableTrDimensions: function() {
6535
			var table, tr, trChild, trStyle;
6536
			if ( reliableTrDimensionsVal == null ) {
6537
				table = document.createElement( "table" );
6538
				tr = document.createElement( "tr" );
6539
				trChild = document.createElement( "div" );
6540

6541
				table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
6542
				tr.style.cssText = "border:1px solid";
6543

6544
				// Support: Chrome 86+
6545
				// Height set through cssText does not get applied.
6546
				// Computed height then comes back as 0.
6547
				tr.style.height = "1px";
6548
				trChild.style.height = "9px";
6549

6550
				// Support: Android 8 Chrome 86+
6551
				// In our bodyBackground.html iframe,
6552
				// display for all div elements is set to "inline",
6553
				// which causes a problem only in Android 8 Chrome 86.
6554
				// Ensuring the div is display: block
6555
				// gets around this issue.
6556
				trChild.style.display = "block";
6557

6558
				documentElement
6559
					.appendChild( table )
6560
					.appendChild( tr )
6561
					.appendChild( trChild );
6562

6563
				trStyle = window.getComputedStyle( tr );
6564
				reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
6565
					parseInt( trStyle.borderTopWidth, 10 ) +
6566
					parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
6567

6568
				documentElement.removeChild( table );
6569
			}
6570
			return reliableTrDimensionsVal;
6571
		}
6572
	} );
6573
} )();
6574

6575

6576
function curCSS( elem, name, computed ) {
6577
	var width, minWidth, maxWidth, ret,
6578

6579
		// Support: Firefox 51+
6580
		// Retrieving style before computed somehow
6581
		// fixes an issue with getting wrong values
6582
		// on detached elements
6583
		style = elem.style;
6584

6585
	computed = computed || getStyles( elem );
6586

6587
	// getPropertyValue is needed for:
6588
	//   .css('filter') (IE 9 only, #12537)
6589
	//   .css('--customProperty) (#3144)
6590
	if ( computed ) {
6591
		ret = computed.getPropertyValue( name ) || computed[ name ];
6592

6593
		if ( ret === "" && !isAttached( elem ) ) {
6594
			ret = jQuery.style( elem, name );
6595
		}
6596

6597
		// A tribute to the "awesome hack by Dean Edwards"
6598
		// Android Browser returns percentage for some values,
6599
		// but width seems to be reliably pixels.
6600
		// This is against the CSSOM draft spec:
6601
		// https://drafts.csswg.org/cssom/#resolved-values
6602
		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6603

6604
			// Remember the original values
6605
			width = style.width;
6606
			minWidth = style.minWidth;
6607
			maxWidth = style.maxWidth;
6608

6609
			// Put in the new values to get a computed value out
6610
			style.minWidth = style.maxWidth = style.width = ret;
6611
			ret = computed.width;
6612

6613
			// Revert the changed values
6614
			style.width = width;
6615
			style.minWidth = minWidth;
6616
			style.maxWidth = maxWidth;
6617
		}
6618
	}
6619

6620
	return ret !== undefined ?
6621

6622
		// Support: IE <=9 - 11 only
6623
		// IE returns zIndex value as an integer.
6624
		ret + "" :
6625
		ret;
6626
}
6627

6628

6629
function addGetHookIf( conditionFn, hookFn ) {
6630

6631
	// Define the hook, we'll check on the first run if it's really needed.
6632
	return {
6633
		get: function() {
6634
			if ( conditionFn() ) {
6635

6636
				// Hook not needed (or it's not possible to use it due
6637
				// to missing dependency), remove it.
6638
				delete this.get;
6639
				return;
6640
			}
6641

6642
			// Hook needed; redefine it so that the support test is not executed again.
6643
			return ( this.get = hookFn ).apply( this, arguments );
6644
		}
6645
	};
6646
}
6647

6648

6649
var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6650
	emptyStyle = document.createElement( "div" ).style,
6651
	vendorProps = {};
6652

6653
// Return a vendor-prefixed property or undefined
6654
function vendorPropName( name ) {
6655

6656
	// Check for vendor prefixed names
6657
	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6658
		i = cssPrefixes.length;
6659

6660
	while ( i-- ) {
6661
		name = cssPrefixes[ i ] + capName;
6662
		if ( name in emptyStyle ) {
6663
			return name;
6664
		}
6665
	}
6666
}
6667

6668
// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6669
function finalPropName( name ) {
6670
	var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6671

6672
	if ( final ) {
6673
		return final;
6674
	}
6675
	if ( name in emptyStyle ) {
6676
		return name;
6677
	}
6678
	return vendorProps[ name ] = vendorPropName( name ) || name;
6679
}
6680

6681

6682
var
6683

6684
	// Swappable if display is none or starts with table
6685
	// except "table", "table-cell", or "table-caption"
6686
	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6687
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6688
	rcustomProp = /^--/,
6689
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6690
	cssNormalTransform = {
6691
		letterSpacing: "0",
6692
		fontWeight: "400"
6693
	};
6694

6695
function setPositiveNumber( _elem, value, subtract ) {
6696

6697
	// Any relative (+/-) values have already been
6698
	// normalized at this point
6699
	var matches = rcssNum.exec( value );
6700
	return matches ?
6701

6702
		// Guard against undefined "subtract", e.g., when used as in cssHooks
6703
		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6704
		value;
6705
}
6706

6707
function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6708
	var i = dimension === "width" ? 1 : 0,
6709
		extra = 0,
6710
		delta = 0;
6711

6712
	// Adjustment may not be necessary
6713
	if ( box === ( isBorderBox ? "border" : "content" ) ) {
6714
		return 0;
6715
	}
6716

6717
	for ( ; i < 4; i += 2 ) {
6718

6719
		// Both box models exclude margin
6720
		if ( box === "margin" ) {
6721
			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6722
		}
6723

6724
		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6725
		if ( !isBorderBox ) {
6726

6727
			// Add padding
6728
			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6729

6730
			// For "border" or "margin", add border
6731
			if ( box !== "padding" ) {
6732
				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6733

6734
			// But still keep track of it otherwise
6735
			} else {
6736
				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6737
			}
6738

6739
		// If we get here with a border-box (content + padding + border), we're seeking "content" or
6740
		// "padding" or "margin"
6741
		} else {
6742

6743
			// For "content", subtract padding
6744
			if ( box === "content" ) {
6745
				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6746
			}
6747

6748
			// For "content" or "padding", subtract border
6749
			if ( box !== "margin" ) {
6750
				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6751
			}
6752
		}
6753
	}
6754

6755
	// Account for positive content-box scroll gutter when requested by providing computedVal
6756
	if ( !isBorderBox && computedVal >= 0 ) {
6757

6758
		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6759
		// Assuming integer scroll gutter, subtract the rest and round down
6760
		delta += Math.max( 0, Math.ceil(
6761
			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6762
			computedVal -
6763
			delta -
6764
			extra -
6765
			0.5
6766

6767
		// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6768
		// Use an explicit zero to avoid NaN (gh-3964)
6769
		) ) || 0;
6770
	}
6771

6772
	return delta;
6773
}
6774

6775
function getWidthOrHeight( elem, dimension, extra ) {
6776

6777
	// Start with computed style
6778
	var styles = getStyles( elem ),
6779

6780
		// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6781
		// Fake content-box until we know it's needed to know the true value.
6782
		boxSizingNeeded = !support.boxSizingReliable() || extra,
6783
		isBorderBox = boxSizingNeeded &&
6784
			jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6785
		valueIsBorderBox = isBorderBox,
6786

6787
		val = curCSS( elem, dimension, styles ),
6788
		offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6789

6790
	// Support: Firefox <=54
6791
	// Return a confounding non-pixel value or feign ignorance, as appropriate.
6792
	if ( rnumnonpx.test( val ) ) {
6793
		if ( !extra ) {
6794
			return val;
6795
		}
6796
		val = "auto";
6797
	}
6798

6799

6800
	// Support: IE 9 - 11 only
6801
	// Use offsetWidth/offsetHeight for when box sizing is unreliable.
6802
	// In those cases, the computed value can be trusted to be border-box.
6803
	if ( ( !support.boxSizingReliable() && isBorderBox ||
6804

6805
		// Support: IE 10 - 11+, Edge 15 - 18+
6806
		// IE/Edge misreport `getComputedStyle` of table rows with width/height
6807
		// set in CSS while `offset*` properties report correct values.
6808
		// Interestingly, in some cases IE 9 doesn't suffer from this issue.
6809
		!support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6810

6811
		// Fall back to offsetWidth/offsetHeight when value is "auto"
6812
		// This happens for inline elements with no explicit setting (gh-3571)
6813
		val === "auto" ||
6814

6815
		// Support: Android <=4.1 - 4.3 only
6816
		// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6817
		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6818

6819
		// Make sure the element is visible & connected
6820
		elem.getClientRects().length ) {
6821

6822
		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6823

6824
		// Where available, offsetWidth/offsetHeight approximate border box dimensions.
6825
		// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6826
		// retrieved value as a content box dimension.
6827
		valueIsBorderBox = offsetProp in elem;
6828
		if ( valueIsBorderBox ) {
6829
			val = elem[ offsetProp ];
6830
		}
6831
	}
6832

6833
	// Normalize "" and auto
6834
	val = parseFloat( val ) || 0;
6835

6836
	// Adjust for the element's box model
6837
	return ( val +
6838
		boxModelAdjustment(
6839
			elem,
6840
			dimension,
6841
			extra || ( isBorderBox ? "border" : "content" ),
6842
			valueIsBorderBox,
6843
			styles,
6844

6845
			// Provide the current computed size to request scroll gutter calculation (gh-3589)
6846
			val
6847
		)
6848
	) + "px";
6849
}
6850

6851
jQuery.extend( {
6852

6853
	// Add in style property hooks for overriding the default
6854
	// behavior of getting and setting a style property
6855
	cssHooks: {
6856
		opacity: {
6857
			get: function( elem, computed ) {
6858
				if ( computed ) {
6859

6860
					// We should always get a number back from opacity
6861
					var ret = curCSS( elem, "opacity" );
6862
					return ret === "" ? "1" : ret;
6863
				}
6864
			}
6865
		}
6866
	},
6867

6868
	// Don't automatically add "px" to these possibly-unitless properties
6869
	cssNumber: {
6870
		"animationIterationCount": true,
6871
		"columnCount": true,
6872
		"fillOpacity": true,
6873
		"flexGrow": true,
6874
		"flexShrink": true,
6875
		"fontWeight": true,
6876
		"gridArea": true,
6877
		"gridColumn": true,
6878
		"gridColumnEnd": true,
6879
		"gridColumnStart": true,
6880
		"gridRow": true,
6881
		"gridRowEnd": true,
6882
		"gridRowStart": true,
6883
		"lineHeight": true,
6884
		"opacity": true,
6885
		"order": true,
6886
		"orphans": true,
6887
		"widows": true,
6888
		"zIndex": true,
6889
		"zoom": true
6890
	},
6891

6892
	// Add in properties whose names you wish to fix before
6893
	// setting or getting the value
6894
	cssProps: {},
6895

6896
	// Get and set the style property on a DOM Node
6897
	style: function( elem, name, value, extra ) {
6898

6899
		// Don't set styles on text and comment nodes
6900
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6901
			return;
6902
		}
6903

6904
		// Make sure that we're working with the right name
6905
		var ret, type, hooks,
6906
			origName = camelCase( name ),
6907
			isCustomProp = rcustomProp.test( name ),
6908
			style = elem.style;
6909

6910
		// Make sure that we're working with the right name. We don't
6911
		// want to query the value if it is a CSS custom property
6912
		// since they are user-defined.
6913
		if ( !isCustomProp ) {
6914
			name = finalPropName( origName );
6915
		}
6916

6917
		// Gets hook for the prefixed version, then unprefixed version
6918
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6919

6920
		// Check if we're setting a value
6921
		if ( value !== undefined ) {
6922
			type = typeof value;
6923

6924
			// Convert "+=" or "-=" to relative numbers (#7345)
6925
			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6926
				value = adjustCSS( elem, name, ret );
6927

6928
				// Fixes bug #9237
6929
				type = "number";
6930
			}
6931

6932
			// Make sure that null and NaN values aren't set (#7116)
6933
			if ( value == null || value !== value ) {
6934
				return;
6935
			}
6936

6937
			// If a number was passed in, add the unit (except for certain CSS properties)
6938
			// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6939
			// "px" to a few hardcoded values.
6940
			if ( type === "number" && !isCustomProp ) {
6941
				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6942
			}
6943

6944
			// background-* props affect original clone's values
6945
			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6946
				style[ name ] = "inherit";
6947
			}
6948

6949
			// If a hook was provided, use that value, otherwise just set the specified value
6950
			if ( !hooks || !( "set" in hooks ) ||
6951
				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6952

6953
				if ( isCustomProp ) {
6954
					style.setProperty( name, value );
6955
				} else {
6956
					style[ name ] = value;
6957
				}
6958
			}
6959

6960
		} else {
6961

6962
			// If a hook was provided get the non-computed value from there
6963
			if ( hooks && "get" in hooks &&
6964
				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6965

6966
				return ret;
6967
			}
6968

6969
			// Otherwise just get the value from the style object
6970
			return style[ name ];
6971
		}
6972
	},
6973

6974
	css: function( elem, name, extra, styles ) {
6975
		var val, num, hooks,
6976
			origName = camelCase( name ),
6977
			isCustomProp = rcustomProp.test( name );
6978

6979
		// Make sure that we're working with the right name. We don't
6980
		// want to modify the value if it is a CSS custom property
6981
		// since they are user-defined.
6982
		if ( !isCustomProp ) {
6983
			name = finalPropName( origName );
6984
		}
6985

6986
		// Try prefixed name followed by the unprefixed name
6987
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6988

6989
		// If a hook was provided get the computed value from there
6990
		if ( hooks && "get" in hooks ) {
6991
			val = hooks.get( elem, true, extra );
6992
		}
6993

6994
		// Otherwise, if a way to get the computed value exists, use that
6995
		if ( val === undefined ) {
6996
			val = curCSS( elem, name, styles );
6997
		}
6998

6999
		// Convert "normal" to computed value
7000
		if ( val === "normal" && name in cssNormalTransform ) {
7001
			val = cssNormalTransform[ name ];
7002
		}
7003

7004
		// Make numeric if forced or a qualifier was provided and val looks numeric
7005
		if ( extra === "" || extra ) {
7006
			num = parseFloat( val );
7007
			return extra === true || isFinite( num ) ? num || 0 : val;
7008
		}
7009

7010
		return val;
7011
	}
7012
} );
7013

7014
jQuery.each( [ "height", "width" ], function( _i, dimension ) {
7015
	jQuery.cssHooks[ dimension ] = {
7016
		get: function( elem, computed, extra ) {
7017
			if ( computed ) {
7018

7019
				// Certain elements can have dimension info if we invisibly show them
7020
				// but it must have a current display style that would benefit
7021
				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
7022

7023
					// Support: Safari 8+
7024
					// Table columns in Safari have non-zero offsetWidth & zero
7025
					// getBoundingClientRect().width unless display is changed.
7026
					// Support: IE <=11 only
7027
					// Running getBoundingClientRect on a disconnected node
7028
					// in IE throws an error.
7029
					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
7030
					swap( elem, cssShow, function() {
7031
						return getWidthOrHeight( elem, dimension, extra );
7032
					} ) :
7033
					getWidthOrHeight( elem, dimension, extra );
7034
			}
7035
		},
7036

7037
		set: function( elem, value, extra ) {
7038
			var matches,
7039
				styles = getStyles( elem ),
7040

7041
				// Only read styles.position if the test has a chance to fail
7042
				// to avoid forcing a reflow.
7043
				scrollboxSizeBuggy = !support.scrollboxSize() &&
7044
					styles.position === "absolute",
7045

7046
				// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
7047
				boxSizingNeeded = scrollboxSizeBuggy || extra,
7048
				isBorderBox = boxSizingNeeded &&
7049
					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
7050
				subtract = extra ?
7051
					boxModelAdjustment(
7052
						elem,
7053
						dimension,
7054
						extra,
7055
						isBorderBox,
7056
						styles
7057
					) :
7058
					0;
7059

7060
			// Account for unreliable border-box dimensions by comparing offset* to computed and
7061
			// faking a content-box to get border and padding (gh-3699)
7062
			if ( isBorderBox && scrollboxSizeBuggy ) {
7063
				subtract -= Math.ceil(
7064
					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
7065
					parseFloat( styles[ dimension ] ) -
7066
					boxModelAdjustment( elem, dimension, "border", false, styles ) -
7067
					0.5
7068
				);
7069
			}
7070

7071
			// Convert to pixels if value adjustment is needed
7072
			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
7073
				( matches[ 3 ] || "px" ) !== "px" ) {
7074

7075
				elem.style[ dimension ] = value;
7076
				value = jQuery.css( elem, dimension );
7077
			}
7078

7079
			return setPositiveNumber( elem, value, subtract );
7080
		}
7081
	};
7082
} );
7083

7084
jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
7085
	function( elem, computed ) {
7086
		if ( computed ) {
7087
			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
7088
				elem.getBoundingClientRect().left -
7089
					swap( elem, { marginLeft: 0 }, function() {
7090
						return elem.getBoundingClientRect().left;
7091
					} )
7092
			) + "px";
7093
		}
7094
	}
7095
);
7096

7097
// These hooks are used by animate to expand properties
7098
jQuery.each( {
7099
	margin: "",
7100
	padding: "",
7101
	border: "Width"
7102
}, function( prefix, suffix ) {
7103
	jQuery.cssHooks[ prefix + suffix ] = {
7104
		expand: function( value ) {
7105
			var i = 0,
7106
				expanded = {},
7107

7108
				// Assumes a single number if not a string
7109
				parts = typeof value === "string" ? value.split( " " ) : [ value ];
7110

7111
			for ( ; i < 4; i++ ) {
7112
				expanded[ prefix + cssExpand[ i ] + suffix ] =
7113
					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
7114
			}
7115

7116
			return expanded;
7117
		}
7118
	};
7119

7120
	if ( prefix !== "margin" ) {
7121
		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
7122
	}
7123
} );
7124

7125
jQuery.fn.extend( {
7126
	css: function( name, value ) {
7127
		return access( this, function( elem, name, value ) {
7128
			var styles, len,
7129
				map = {},
7130
				i = 0;
7131

7132
			if ( Array.isArray( name ) ) {
7133
				styles = getStyles( elem );
7134
				len = name.length;
7135

7136
				for ( ; i < len; i++ ) {
7137
					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
7138
				}
7139

7140
				return map;
7141
			}
7142

7143
			return value !== undefined ?
7144
				jQuery.style( elem, name, value ) :
7145
				jQuery.css( elem, name );
7146
		}, name, value, arguments.length > 1 );
7147
	}
7148
} );
7149

7150

7151
function Tween( elem, options, prop, end, easing ) {
7152
	return new Tween.prototype.init( elem, options, prop, end, easing );
7153
}
7154
jQuery.Tween = Tween;
7155

7156
Tween.prototype = {
7157
	constructor: Tween,
7158
	init: function( elem, options, prop, end, easing, unit ) {
7159
		this.elem = elem;
7160
		this.prop = prop;
7161
		this.easing = easing || jQuery.easing._default;
7162
		this.options = options;
7163
		this.start = this.now = this.cur();
7164
		this.end = end;
7165
		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
7166
	},
7167
	cur: function() {
7168
		var hooks = Tween.propHooks[ this.prop ];
7169

7170
		return hooks && hooks.get ?
7171
			hooks.get( this ) :
7172
			Tween.propHooks._default.get( this );
7173
	},
7174
	run: function( percent ) {
7175
		var eased,
7176
			hooks = Tween.propHooks[ this.prop ];
7177

7178
		if ( this.options.duration ) {
7179
			this.pos = eased = jQuery.easing[ this.easing ](
7180
				percent, this.options.duration * percent, 0, 1, this.options.duration
7181
			);
7182
		} else {
7183
			this.pos = eased = percent;
7184
		}
7185
		this.now = ( this.end - this.start ) * eased + this.start;
7186

7187
		if ( this.options.step ) {
7188
			this.options.step.call( this.elem, this.now, this );
7189
		}
7190

7191
		if ( hooks && hooks.set ) {
7192
			hooks.set( this );
7193
		} else {
7194
			Tween.propHooks._default.set( this );
7195
		}
7196
		return this;
7197
	}
7198
};
7199

7200
Tween.prototype.init.prototype = Tween.prototype;
7201

7202
Tween.propHooks = {
7203
	_default: {
7204
		get: function( tween ) {
7205
			var result;
7206

7207
			// Use a property on the element directly when it is not a DOM element,
7208
			// or when there is no matching style property that exists.
7209
			if ( tween.elem.nodeType !== 1 ||
7210
				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
7211
				return tween.elem[ tween.prop ];
7212
			}
7213

7214
			// Passing an empty string as a 3rd parameter to .css will automatically
7215
			// attempt a parseFloat and fallback to a string if the parse fails.
7216
			// Simple values such as "10px" are parsed to Float;
7217
			// complex values such as "rotate(1rad)" are returned as-is.
7218
			result = jQuery.css( tween.elem, tween.prop, "" );
7219

7220
			// Empty strings, null, undefined and "auto" are converted to 0.
7221
			return !result || result === "auto" ? 0 : result;
7222
		},
7223
		set: function( tween ) {
7224

7225
			// Use step hook for back compat.
7226
			// Use cssHook if its there.
7227
			// Use .style if available and use plain properties where available.
7228
			if ( jQuery.fx.step[ tween.prop ] ) {
7229
				jQuery.fx.step[ tween.prop ]( tween );
7230
			} else if ( tween.elem.nodeType === 1 && (
7231
				jQuery.cssHooks[ tween.prop ] ||
7232
					tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
7233
				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
7234
			} else {
7235
				tween.elem[ tween.prop ] = tween.now;
7236
			}
7237
		}
7238
	}
7239
};
7240

7241
// Support: IE <=9 only
7242
// Panic based approach to setting things on disconnected nodes
7243
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
7244
	set: function( tween ) {
7245
		if ( tween.elem.nodeType && tween.elem.parentNode ) {
7246
			tween.elem[ tween.prop ] = tween.now;
7247
		}
7248
	}
7249
};
7250

7251
jQuery.easing = {
7252
	linear: function( p ) {
7253
		return p;
7254
	},
7255
	swing: function( p ) {
7256
		return 0.5 - Math.cos( p * Math.PI ) / 2;
7257
	},
7258
	_default: "swing"
7259
};
7260

7261
jQuery.fx = Tween.prototype.init;
7262

7263
// Back compat <1.8 extension point
7264
jQuery.fx.step = {};
7265

7266

7267

7268

7269
var
7270
	fxNow, inProgress,
7271
	rfxtypes = /^(?:toggle|show|hide)$/,
7272
	rrun = /queueHooks$/;
7273

7274
function schedule() {
7275
	if ( inProgress ) {
7276
		if ( document.hidden === false && window.requestAnimationFrame ) {
7277
			window.requestAnimationFrame( schedule );
7278
		} else {
7279
			window.setTimeout( schedule, jQuery.fx.interval );
7280
		}
7281

7282
		jQuery.fx.tick();
7283
	}
7284
}
7285

7286
// Animations created synchronously will run synchronously
7287
function createFxNow() {
7288
	window.setTimeout( function() {
7289
		fxNow = undefined;
7290
	} );
7291
	return ( fxNow = Date.now() );
7292
}
7293

7294
// Generate parameters to create a standard animation
7295
function genFx( type, includeWidth ) {
7296
	var which,
7297
		i = 0,
7298
		attrs = { height: type };
7299

7300
	// If we include width, step value is 1 to do all cssExpand values,
7301
	// otherwise step value is 2 to skip over Left and Right
7302
	includeWidth = includeWidth ? 1 : 0;
7303
	for ( ; i < 4; i += 2 - includeWidth ) {
7304
		which = cssExpand[ i ];
7305
		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7306
	}
7307

7308
	if ( includeWidth ) {
7309
		attrs.opacity = attrs.width = type;
7310
	}
7311

7312
	return attrs;
7313
}
7314

7315
function createTween( value, prop, animation ) {
7316
	var tween,
7317
		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
7318
		index = 0,
7319
		length = collection.length;
7320
	for ( ; index < length; index++ ) {
7321
		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
7322

7323
			// We're done with this property
7324
			return tween;
7325
		}
7326
	}
7327
}
7328

7329
function defaultPrefilter( elem, props, opts ) {
7330
	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
7331
		isBox = "width" in props || "height" in props,
7332
		anim = this,
7333
		orig = {},
7334
		style = elem.style,
7335
		hidden = elem.nodeType && isHiddenWithinTree( elem ),
7336
		dataShow = dataPriv.get( elem, "fxshow" );
7337

7338
	// Queue-skipping animations hijack the fx hooks
7339
	if ( !opts.queue ) {
7340
		hooks = jQuery._queueHooks( elem, "fx" );
7341
		if ( hooks.unqueued == null ) {
7342
			hooks.unqueued = 0;
7343
			oldfire = hooks.empty.fire;
7344
			hooks.empty.fire = function() {
7345
				if ( !hooks.unqueued ) {
7346
					oldfire();
7347
				}
7348
			};
7349
		}
7350
		hooks.unqueued++;
7351

7352
		anim.always( function() {
7353

7354
			// Ensure the complete handler is called before this completes
7355
			anim.always( function() {
7356
				hooks.unqueued--;
7357
				if ( !jQuery.queue( elem, "fx" ).length ) {
7358
					hooks.empty.fire();
7359
				}
7360
			} );
7361
		} );
7362
	}
7363

7364
	// Detect show/hide animations
7365
	for ( prop in props ) {
7366
		value = props[ prop ];
7367
		if ( rfxtypes.test( value ) ) {
7368
			delete props[ prop ];
7369
			toggle = toggle || value === "toggle";
7370
			if ( value === ( hidden ? "hide" : "show" ) ) {
7371

7372
				// Pretend to be hidden if this is a "show" and
7373
				// there is still data from a stopped show/hide
7374
				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7375
					hidden = true;
7376

7377
				// Ignore all other no-op show/hide data
7378
				} else {
7379
					continue;
7380
				}
7381
			}
7382
			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7383
		}
7384
	}
7385

7386
	// Bail out if this is a no-op like .hide().hide()
7387
	propTween = !jQuery.isEmptyObject( props );
7388
	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
7389
		return;
7390
	}
7391

7392
	// Restrict "overflow" and "display" styles during box animations
7393
	if ( isBox && elem.nodeType === 1 ) {
7394

7395
		// Support: IE <=9 - 11, Edge 12 - 15
7396
		// Record all 3 overflow attributes because IE does not infer the shorthand
7397
		// from identically-valued overflowX and overflowY and Edge just mirrors
7398
		// the overflowX value there.
7399
		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7400

7401
		// Identify a display type, preferring old show/hide data over the CSS cascade
7402
		restoreDisplay = dataShow && dataShow.display;
7403
		if ( restoreDisplay == null ) {
7404
			restoreDisplay = dataPriv.get( elem, "display" );
7405
		}
7406
		display = jQuery.css( elem, "display" );
7407
		if ( display === "none" ) {
7408
			if ( restoreDisplay ) {
7409
				display = restoreDisplay;
7410
			} else {
7411

7412
				// Get nonempty value(s) by temporarily forcing visibility
7413
				showHide( [ elem ], true );
7414
				restoreDisplay = elem.style.display || restoreDisplay;
7415
				display = jQuery.css( elem, "display" );
7416
				showHide( [ elem ] );
7417
			}
7418
		}
7419

7420
		// Animate inline elements as inline-block
7421
		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
7422
			if ( jQuery.css( elem, "float" ) === "none" ) {
7423

7424
				// Restore the original display value at the end of pure show/hide animations
7425
				if ( !propTween ) {
7426
					anim.done( function() {
7427
						style.display = restoreDisplay;
7428
					} );
7429
					if ( restoreDisplay == null ) {
7430
						display = style.display;
7431
						restoreDisplay = display === "none" ? "" : display;
7432
					}
7433
				}
7434
				style.display = "inline-block";
7435
			}
7436
		}
7437
	}
7438

7439
	if ( opts.overflow ) {
7440
		style.overflow = "hidden";
7441
		anim.always( function() {
7442
			style.overflow = opts.overflow[ 0 ];
7443
			style.overflowX = opts.overflow[ 1 ];
7444
			style.overflowY = opts.overflow[ 2 ];
7445
		} );
7446
	}
7447

7448
	// Implement show/hide animations
7449
	propTween = false;
7450
	for ( prop in orig ) {
7451

7452
		// General show/hide setup for this element animation
7453
		if ( !propTween ) {
7454
			if ( dataShow ) {
7455
				if ( "hidden" in dataShow ) {
7456
					hidden = dataShow.hidden;
7457
				}
7458
			} else {
7459
				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7460
			}
7461

7462
			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7463
			if ( toggle ) {
7464
				dataShow.hidden = !hidden;
7465
			}
7466

7467
			// Show elements before animating them
7468
			if ( hidden ) {
7469
				showHide( [ elem ], true );
7470
			}
7471

7472
			/* eslint-disable no-loop-func */
7473

7474
			anim.done( function() {
7475

7476
				/* eslint-enable no-loop-func */
7477

7478
				// The final step of a "hide" animation is actually hiding the element
7479
				if ( !hidden ) {
7480
					showHide( [ elem ] );
7481
				}
7482
				dataPriv.remove( elem, "fxshow" );
7483
				for ( prop in orig ) {
7484
					jQuery.style( elem, prop, orig[ prop ] );
7485
				}
7486
			} );
7487
		}
7488

7489
		// Per-property setup
7490
		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7491
		if ( !( prop in dataShow ) ) {
7492
			dataShow[ prop ] = propTween.start;
7493
			if ( hidden ) {
7494
				propTween.end = propTween.start;
7495
				propTween.start = 0;
7496
			}
7497
		}
7498
	}
7499
}
7500

7501
function propFilter( props, specialEasing ) {
7502
	var index, name, easing, value, hooks;
7503

7504
	// camelCase, specialEasing and expand cssHook pass
7505
	for ( index in props ) {
7506
		name = camelCase( index );
7507
		easing = specialEasing[ name ];
7508
		value = props[ index ];
7509
		if ( Array.isArray( value ) ) {
7510
			easing = value[ 1 ];
7511
			value = props[ index ] = value[ 0 ];
7512
		}
7513

7514
		if ( index !== name ) {
7515
			props[ name ] = value;
7516
			delete props[ index ];
7517
		}
7518

7519
		hooks = jQuery.cssHooks[ name ];
7520
		if ( hooks && "expand" in hooks ) {
7521
			value = hooks.expand( value );
7522
			delete props[ name ];
7523

7524
			// Not quite $.extend, this won't overwrite existing keys.
7525
			// Reusing 'index' because we have the correct "name"
7526
			for ( index in value ) {
7527
				if ( !( index in props ) ) {
7528
					props[ index ] = value[ index ];
7529
					specialEasing[ index ] = easing;
7530
				}
7531
			}
7532
		} else {
7533
			specialEasing[ name ] = easing;
7534
		}
7535
	}
7536
}
7537

7538
function Animation( elem, properties, options ) {
7539
	var result,
7540
		stopped,
7541
		index = 0,
7542
		length = Animation.prefilters.length,
7543
		deferred = jQuery.Deferred().always( function() {
7544

7545
			// Don't match elem in the :animated selector
7546
			delete tick.elem;
7547
		} ),
7548
		tick = function() {
7549
			if ( stopped ) {
7550
				return false;
7551
			}
7552
			var currentTime = fxNow || createFxNow(),
7553
				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7554

7555
				// Support: Android 2.3 only
7556
				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7557
				temp = remaining / animation.duration || 0,
7558
				percent = 1 - temp,
7559
				index = 0,
7560
				length = animation.tweens.length;
7561

7562
			for ( ; index < length; index++ ) {
7563
				animation.tweens[ index ].run( percent );
7564
			}
7565

7566
			deferred.notifyWith( elem, [ animation, percent, remaining ] );
7567

7568
			// If there's more to do, yield
7569
			if ( percent < 1 && length ) {
7570
				return remaining;
7571
			}
7572

7573
			// If this was an empty animation, synthesize a final progress notification
7574
			if ( !length ) {
7575
				deferred.notifyWith( elem, [ animation, 1, 0 ] );
7576
			}
7577

7578
			// Resolve the animation and report its conclusion
7579
			deferred.resolveWith( elem, [ animation ] );
7580
			return false;
7581
		},
7582
		animation = deferred.promise( {
7583
			elem: elem,
7584
			props: jQuery.extend( {}, properties ),
7585
			opts: jQuery.extend( true, {
7586
				specialEasing: {},
7587
				easing: jQuery.easing._default
7588
			}, options ),
7589
			originalProperties: properties,
7590
			originalOptions: options,
7591
			startTime: fxNow || createFxNow(),
7592
			duration: options.duration,
7593
			tweens: [],
7594
			createTween: function( prop, end ) {
7595
				var tween = jQuery.Tween( elem, animation.opts, prop, end,
7596
					animation.opts.specialEasing[ prop ] || animation.opts.easing );
7597
				animation.tweens.push( tween );
7598
				return tween;
7599
			},
7600
			stop: function( gotoEnd ) {
7601
				var index = 0,
7602

7603
					// If we are going to the end, we want to run all the tweens
7604
					// otherwise we skip this part
7605
					length = gotoEnd ? animation.tweens.length : 0;
7606
				if ( stopped ) {
7607
					return this;
7608
				}
7609
				stopped = true;
7610
				for ( ; index < length; index++ ) {
7611
					animation.tweens[ index ].run( 1 );
7612
				}
7613

7614
				// Resolve when we played the last frame; otherwise, reject
7615
				if ( gotoEnd ) {
7616
					deferred.notifyWith( elem, [ animation, 1, 0 ] );
7617
					deferred.resolveWith( elem, [ animation, gotoEnd ] );
7618
				} else {
7619
					deferred.rejectWith( elem, [ animation, gotoEnd ] );
7620
				}
7621
				return this;
7622
			}
7623
		} ),
7624
		props = animation.props;
7625

7626
	propFilter( props, animation.opts.specialEasing );
7627

7628
	for ( ; index < length; index++ ) {
7629
		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7630
		if ( result ) {
7631
			if ( isFunction( result.stop ) ) {
7632
				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7633
					result.stop.bind( result );
7634
			}
7635
			return result;
7636
		}
7637
	}
7638

7639
	jQuery.map( props, createTween, animation );
7640

7641
	if ( isFunction( animation.opts.start ) ) {
7642
		animation.opts.start.call( elem, animation );
7643
	}
7644

7645
	// Attach callbacks from options
7646
	animation
7647
		.progress( animation.opts.progress )
7648
		.done( animation.opts.done, animation.opts.complete )
7649
		.fail( animation.opts.fail )
7650
		.always( animation.opts.always );
7651

7652
	jQuery.fx.timer(
7653
		jQuery.extend( tick, {
7654
			elem: elem,
7655
			anim: animation,
7656
			queue: animation.opts.queue
7657
		} )
7658
	);
7659

7660
	return animation;
7661
}
7662

7663
jQuery.Animation = jQuery.extend( Animation, {
7664

7665
	tweeners: {
7666
		"*": [ function( prop, value ) {
7667
			var tween = this.createTween( prop, value );
7668
			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7669
			return tween;
7670
		} ]
7671
	},
7672

7673
	tweener: function( props, callback ) {
7674
		if ( isFunction( props ) ) {
7675
			callback = props;
7676
			props = [ "*" ];
7677
		} else {
7678
			props = props.match( rnothtmlwhite );
7679
		}
7680

7681
		var prop,
7682
			index = 0,
7683
			length = props.length;
7684

7685
		for ( ; index < length; index++ ) {
7686
			prop = props[ index ];
7687
			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7688
			Animation.tweeners[ prop ].unshift( callback );
7689
		}
7690
	},
7691

7692
	prefilters: [ defaultPrefilter ],
7693

7694
	prefilter: function( callback, prepend ) {
7695
		if ( prepend ) {
7696
			Animation.prefilters.unshift( callback );
7697
		} else {
7698
			Animation.prefilters.push( callback );
7699
		}
7700
	}
7701
} );
7702

7703
jQuery.speed = function( speed, easing, fn ) {
7704
	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7705
		complete: fn || !fn && easing ||
7706
			isFunction( speed ) && speed,
7707
		duration: speed,
7708
		easing: fn && easing || easing && !isFunction( easing ) && easing
7709
	};
7710

7711
	// Go to the end state if fx are off
7712
	if ( jQuery.fx.off ) {
7713
		opt.duration = 0;
7714

7715
	} else {
7716
		if ( typeof opt.duration !== "number" ) {
7717
			if ( opt.duration in jQuery.fx.speeds ) {
7718
				opt.duration = jQuery.fx.speeds[ opt.duration ];
7719

7720
			} else {
7721
				opt.duration = jQuery.fx.speeds._default;
7722
			}
7723
		}
7724
	}
7725

7726
	// Normalize opt.queue - true/undefined/null -> "fx"
7727
	if ( opt.queue == null || opt.queue === true ) {
7728
		opt.queue = "fx";
7729
	}
7730

7731
	// Queueing
7732
	opt.old = opt.complete;
7733

7734
	opt.complete = function() {
7735
		if ( isFunction( opt.old ) ) {
7736
			opt.old.call( this );
7737
		}
7738

7739
		if ( opt.queue ) {
7740
			jQuery.dequeue( this, opt.queue );
7741
		}
7742
	};
7743

7744
	return opt;
7745
};
7746

7747
jQuery.fn.extend( {
7748
	fadeTo: function( speed, to, easing, callback ) {
7749

7750
		// Show any hidden elements after setting opacity to 0
7751
		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7752

7753
			// Animate to the value specified
7754
			.end().animate( { opacity: to }, speed, easing, callback );
7755
	},
7756
	animate: function( prop, speed, easing, callback ) {
7757
		var empty = jQuery.isEmptyObject( prop ),
7758
			optall = jQuery.speed( speed, easing, callback ),
7759
			doAnimation = function() {
7760

7761
				// Operate on a copy of prop so per-property easing won't be lost
7762
				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7763

7764
				// Empty animations, or finishing resolves immediately
7765
				if ( empty || dataPriv.get( this, "finish" ) ) {
7766
					anim.stop( true );
7767
				}
7768
			};
7769

7770
		doAnimation.finish = doAnimation;
7771

7772
		return empty || optall.queue === false ?
7773
			this.each( doAnimation ) :
7774
			this.queue( optall.queue, doAnimation );
7775
	},
7776
	stop: function( type, clearQueue, gotoEnd ) {
7777
		var stopQueue = function( hooks ) {
7778
			var stop = hooks.stop;
7779
			delete hooks.stop;
7780
			stop( gotoEnd );
7781
		};
7782

7783
		if ( typeof type !== "string" ) {
7784
			gotoEnd = clearQueue;
7785
			clearQueue = type;
7786
			type = undefined;
7787
		}
7788
		if ( clearQueue ) {
7789
			this.queue( type || "fx", [] );
7790
		}
7791

7792
		return this.each( function() {
7793
			var dequeue = true,
7794
				index = type != null && type + "queueHooks",
7795
				timers = jQuery.timers,
7796
				data = dataPriv.get( this );
7797

7798
			if ( index ) {
7799
				if ( data[ index ] && data[ index ].stop ) {
7800
					stopQueue( data[ index ] );
7801
				}
7802
			} else {
7803
				for ( index in data ) {
7804
					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7805
						stopQueue( data[ index ] );
7806
					}
7807
				}
7808
			}
7809

7810
			for ( index = timers.length; index--; ) {
7811
				if ( timers[ index ].elem === this &&
7812
					( type == null || timers[ index ].queue === type ) ) {
7813

7814
					timers[ index ].anim.stop( gotoEnd );
7815
					dequeue = false;
7816
					timers.splice( index, 1 );
7817
				}
7818
			}
7819

7820
			// Start the next in the queue if the last step wasn't forced.
7821
			// Timers currently will call their complete callbacks, which
7822
			// will dequeue but only if they were gotoEnd.
7823
			if ( dequeue || !gotoEnd ) {
7824
				jQuery.dequeue( this, type );
7825
			}
7826
		} );
7827
	},
7828
	finish: function( type ) {
7829
		if ( type !== false ) {
7830
			type = type || "fx";
7831
		}
7832
		return this.each( function() {
7833
			var index,
7834
				data = dataPriv.get( this ),
7835
				queue = data[ type + "queue" ],
7836
				hooks = data[ type + "queueHooks" ],
7837
				timers = jQuery.timers,
7838
				length = queue ? queue.length : 0;
7839

7840
			// Enable finishing flag on private data
7841
			data.finish = true;
7842

7843
			// Empty the queue first
7844
			jQuery.queue( this, type, [] );
7845

7846
			if ( hooks && hooks.stop ) {
7847
				hooks.stop.call( this, true );
7848
			}
7849

7850
			// Look for any active animations, and finish them
7851
			for ( index = timers.length; index--; ) {
7852
				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7853
					timers[ index ].anim.stop( true );
7854
					timers.splice( index, 1 );
7855
				}
7856
			}
7857

7858
			// Look for any animations in the old queue and finish them
7859
			for ( index = 0; index < length; index++ ) {
7860
				if ( queue[ index ] && queue[ index ].finish ) {
7861
					queue[ index ].finish.call( this );
7862
				}
7863
			}
7864

7865
			// Turn off finishing flag
7866
			delete data.finish;
7867
		} );
7868
	}
7869
} );
7870

7871
jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
7872
	var cssFn = jQuery.fn[ name ];
7873
	jQuery.fn[ name ] = function( speed, easing, callback ) {
7874
		return speed == null || typeof speed === "boolean" ?
7875
			cssFn.apply( this, arguments ) :
7876
			this.animate( genFx( name, true ), speed, easing, callback );
7877
	};
7878
} );
7879

7880
// Generate shortcuts for custom animations
7881
jQuery.each( {
7882
	slideDown: genFx( "show" ),
7883
	slideUp: genFx( "hide" ),
7884
	slideToggle: genFx( "toggle" ),
7885
	fadeIn: { opacity: "show" },
7886
	fadeOut: { opacity: "hide" },
7887
	fadeToggle: { opacity: "toggle" }
7888
}, function( name, props ) {
7889
	jQuery.fn[ name ] = function( speed, easing, callback ) {
7890
		return this.animate( props, speed, easing, callback );
7891
	};
7892
} );
7893

7894
jQuery.timers = [];
7895
jQuery.fx.tick = function() {
7896
	var timer,
7897
		i = 0,
7898
		timers = jQuery.timers;
7899

7900
	fxNow = Date.now();
7901

7902
	for ( ; i < timers.length; i++ ) {
7903
		timer = timers[ i ];
7904

7905
		// Run the timer and safely remove it when done (allowing for external removal)
7906
		if ( !timer() && timers[ i ] === timer ) {
7907
			timers.splice( i--, 1 );
7908
		}
7909
	}
7910

7911
	if ( !timers.length ) {
7912
		jQuery.fx.stop();
7913
	}
7914
	fxNow = undefined;
7915
};
7916

7917
jQuery.fx.timer = function( timer ) {
7918
	jQuery.timers.push( timer );
7919
	jQuery.fx.start();
7920
};
7921

7922
jQuery.fx.interval = 13;
7923
jQuery.fx.start = function() {
7924
	if ( inProgress ) {
7925
		return;
7926
	}
7927

7928
	inProgress = true;
7929
	schedule();
7930
};
7931

7932
jQuery.fx.stop = function() {
7933
	inProgress = null;
7934
};
7935

7936
jQuery.fx.speeds = {
7937
	slow: 600,
7938
	fast: 200,
7939

7940
	// Default speed
7941
	_default: 400
7942
};
7943

7944

7945
// Based off of the plugin by Clint Helfers, with permission.
7946
// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7947
jQuery.fn.delay = function( time, type ) {
7948
	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7949
	type = type || "fx";
7950

7951
	return this.queue( type, function( next, hooks ) {
7952
		var timeout = window.setTimeout( next, time );
7953
		hooks.stop = function() {
7954
			window.clearTimeout( timeout );
7955
		};
7956
	} );
7957
};
7958

7959

7960
( function() {
7961
	var input = document.createElement( "input" ),
7962
		select = document.createElement( "select" ),
7963
		opt = select.appendChild( document.createElement( "option" ) );
7964

7965
	input.type = "checkbox";
7966

7967
	// Support: Android <=4.3 only
7968
	// Default value for a checkbox should be "on"
7969
	support.checkOn = input.value !== "";
7970

7971
	// Support: IE <=11 only
7972
	// Must access selectedIndex to make default options select
7973
	support.optSelected = opt.selected;
7974

7975
	// Support: IE <=11 only
7976
	// An input loses its value after becoming a radio
7977
	input = document.createElement( "input" );
7978
	input.value = "t";
7979
	input.type = "radio";
7980
	support.radioValue = input.value === "t";
7981
} )();
7982

7983

7984
var boolHook,
7985
	attrHandle = jQuery.expr.attrHandle;
7986

7987
jQuery.fn.extend( {
7988
	attr: function( name, value ) {
7989
		return access( this, jQuery.attr, name, value, arguments.length > 1 );
7990
	},
7991

7992
	removeAttr: function( name ) {
7993
		return this.each( function() {
7994
			jQuery.removeAttr( this, name );
7995
		} );
7996
	}
7997
} );
7998

7999
jQuery.extend( {
8000
	attr: function( elem, name, value ) {
8001
		var ret, hooks,
8002
			nType = elem.nodeType;
8003

8004
		// Don't get/set attributes on text, comment and attribute nodes
8005
		if ( nType === 3 || nType === 8 || nType === 2 ) {
8006
			return;
8007
		}
8008

8009
		// Fallback to prop when attributes are not supported
8010
		if ( typeof elem.getAttribute === "undefined" ) {
8011
			return jQuery.prop( elem, name, value );
8012
		}
8013

8014
		// Attribute hooks are determined by the lowercase version
8015
		// Grab necessary hook if one is defined
8016
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8017
			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
8018
				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
8019
		}
8020

8021
		if ( value !== undefined ) {
8022
			if ( value === null ) {
8023
				jQuery.removeAttr( elem, name );
8024
				return;
8025
			}
8026

8027
			if ( hooks && "set" in hooks &&
8028
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8029
				return ret;
8030
			}
8031

8032
			elem.setAttribute( name, value + "" );
8033
			return value;
8034
		}
8035

8036
		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8037
			return ret;
8038
		}
8039

8040
		ret = jQuery.find.attr( elem, name );
8041

8042
		// Non-existent attributes return null, we normalize to undefined
8043
		return ret == null ? undefined : ret;
8044
	},
8045

8046
	attrHooks: {
8047
		type: {
8048
			set: function( elem, value ) {
8049
				if ( !support.radioValue && value === "radio" &&
8050
					nodeName( elem, "input" ) ) {
8051
					var val = elem.value;
8052
					elem.setAttribute( "type", value );
8053
					if ( val ) {
8054
						elem.value = val;
8055
					}
8056
					return value;
8057
				}
8058
			}
8059
		}
8060
	},
8061

8062
	removeAttr: function( elem, value ) {
8063
		var name,
8064
			i = 0,
8065

8066
			// Attribute names can contain non-HTML whitespace characters
8067
			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
8068
			attrNames = value && value.match( rnothtmlwhite );
8069

8070
		if ( attrNames && elem.nodeType === 1 ) {
8071
			while ( ( name = attrNames[ i++ ] ) ) {
8072
				elem.removeAttribute( name );
8073
			}
8074
		}
8075
	}
8076
} );
8077

8078
// Hooks for boolean attributes
8079
boolHook = {
8080
	set: function( elem, value, name ) {
8081
		if ( value === false ) {
8082

8083
			// Remove boolean attributes when set to false
8084
			jQuery.removeAttr( elem, name );
8085
		} else {
8086
			elem.setAttribute( name, name );
8087
		}
8088
		return name;
8089
	}
8090
};
8091

8092
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
8093
	var getter = attrHandle[ name ] || jQuery.find.attr;
8094

8095
	attrHandle[ name ] = function( elem, name, isXML ) {
8096
		var ret, handle,
8097
			lowercaseName = name.toLowerCase();
8098

8099
		if ( !isXML ) {
8100

8101
			// Avoid an infinite loop by temporarily removing this function from the getter
8102
			handle = attrHandle[ lowercaseName ];
8103
			attrHandle[ lowercaseName ] = ret;
8104
			ret = getter( elem, name, isXML ) != null ?
8105
				lowercaseName :
8106
				null;
8107
			attrHandle[ lowercaseName ] = handle;
8108
		}
8109
		return ret;
8110
	};
8111
} );
8112

8113

8114

8115

8116
var rfocusable = /^(?:input|select|textarea|button)$/i,
8117
	rclickable = /^(?:a|area)$/i;
8118

8119
jQuery.fn.extend( {
8120
	prop: function( name, value ) {
8121
		return access( this, jQuery.prop, name, value, arguments.length > 1 );
8122
	},
8123

8124
	removeProp: function( name ) {
8125
		return this.each( function() {
8126
			delete this[ jQuery.propFix[ name ] || name ];
8127
		} );
8128
	}
8129
} );
8130

8131
jQuery.extend( {
8132
	prop: function( elem, name, value ) {
8133
		var ret, hooks,
8134
			nType = elem.nodeType;
8135

8136
		// Don't get/set properties on text, comment and attribute nodes
8137
		if ( nType === 3 || nType === 8 || nType === 2 ) {
8138
			return;
8139
		}
8140

8141
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
8142

8143
			// Fix name and attach hooks
8144
			name = jQuery.propFix[ name ] || name;
8145
			hooks = jQuery.propHooks[ name ];
8146
		}
8147

8148
		if ( value !== undefined ) {
8149
			if ( hooks && "set" in hooks &&
8150
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
8151
				return ret;
8152
			}
8153

8154
			return ( elem[ name ] = value );
8155
		}
8156

8157
		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
8158
			return ret;
8159
		}
8160

8161
		return elem[ name ];
8162
	},
8163

8164
	propHooks: {
8165
		tabIndex: {
8166
			get: function( elem ) {
8167

8168
				// Support: IE <=9 - 11 only
8169
				// elem.tabIndex doesn't always return the
8170
				// correct value when it hasn't been explicitly set
8171
				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8172
				// Use proper attribute retrieval(#12072)
8173
				var tabindex = jQuery.find.attr( elem, "tabindex" );
8174

8175
				if ( tabindex ) {
8176
					return parseInt( tabindex, 10 );
8177
				}
8178

8179
				if (
8180
					rfocusable.test( elem.nodeName ) ||
8181
					rclickable.test( elem.nodeName ) &&
8182
					elem.href
8183
				) {
8184
					return 0;
8185
				}
8186

8187
				return -1;
8188
			}
8189
		}
8190
	},
8191

8192
	propFix: {
8193
		"for": "htmlFor",
8194
		"class": "className"
8195
	}
8196
} );
8197

8198
// Support: IE <=11 only
8199
// Accessing the selectedIndex property
8200
// forces the browser to respect setting selected
8201
// on the option
8202
// The getter ensures a default option is selected
8203
// when in an optgroup
8204
// eslint rule "no-unused-expressions" is disabled for this code
8205
// since it considers such accessions noop
8206
if ( !support.optSelected ) {
8207
	jQuery.propHooks.selected = {
8208
		get: function( elem ) {
8209

8210
			/* eslint no-unused-expressions: "off" */
8211

8212
			var parent = elem.parentNode;
8213
			if ( parent && parent.parentNode ) {
8214
				parent.parentNode.selectedIndex;
8215
			}
8216
			return null;
8217
		},
8218
		set: function( elem ) {
8219

8220
			/* eslint no-unused-expressions: "off" */
8221

8222
			var parent = elem.parentNode;
8223
			if ( parent ) {
8224
				parent.selectedIndex;
8225

8226
				if ( parent.parentNode ) {
8227
					parent.parentNode.selectedIndex;
8228
				}
8229
			}
8230
		}
8231
	};
8232
}
8233

8234
jQuery.each( [
8235
	"tabIndex",
8236
	"readOnly",
8237
	"maxLength",
8238
	"cellSpacing",
8239
	"cellPadding",
8240
	"rowSpan",
8241
	"colSpan",
8242
	"useMap",
8243
	"frameBorder",
8244
	"contentEditable"
8245
], function() {
8246
	jQuery.propFix[ this.toLowerCase() ] = this;
8247
} );
8248

8249

8250

8251

8252
	// Strip and collapse whitespace according to HTML spec
8253
	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
8254
	function stripAndCollapse( value ) {
8255
		var tokens = value.match( rnothtmlwhite ) || [];
8256
		return tokens.join( " " );
8257
	}
8258

8259

8260
function getClass( elem ) {
8261
	return elem.getAttribute && elem.getAttribute( "class" ) || "";
8262
}
8263

8264
function classesToArray( value ) {
8265
	if ( Array.isArray( value ) ) {
8266
		return value;
8267
	}
8268
	if ( typeof value === "string" ) {
8269
		return value.match( rnothtmlwhite ) || [];
8270
	}
8271
	return [];
8272
}
8273

8274
jQuery.fn.extend( {
8275
	addClass: function( value ) {
8276
		var classes, elem, cur, curValue, clazz, j, finalValue,
8277
			i = 0;
8278

8279
		if ( isFunction( value ) ) {
8280
			return this.each( function( j ) {
8281
				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
8282
			} );
8283
		}
8284

8285
		classes = classesToArray( value );
8286

8287
		if ( classes.length ) {
8288
			while ( ( elem = this[ i++ ] ) ) {
8289
				curValue = getClass( elem );
8290
				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8291

8292
				if ( cur ) {
8293
					j = 0;
8294
					while ( ( clazz = classes[ j++ ] ) ) {
8295
						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8296
							cur += clazz + " ";
8297
						}
8298
					}
8299

8300
					// Only assign if different to avoid unneeded rendering.
8301
					finalValue = stripAndCollapse( cur );
8302
					if ( curValue !== finalValue ) {
8303
						elem.setAttribute( "class", finalValue );
8304
					}
8305
				}
8306
			}
8307
		}
8308

8309
		return this;
8310
	},
8311

8312
	removeClass: function( value ) {
8313
		var classes, elem, cur, curValue, clazz, j, finalValue,
8314
			i = 0;
8315

8316
		if ( isFunction( value ) ) {
8317
			return this.each( function( j ) {
8318
				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
8319
			} );
8320
		}
8321

8322
		if ( !arguments.length ) {
8323
			return this.attr( "class", "" );
8324
		}
8325

8326
		classes = classesToArray( value );
8327

8328
		if ( classes.length ) {
8329
			while ( ( elem = this[ i++ ] ) ) {
8330
				curValue = getClass( elem );
8331

8332
				// This expression is here for better compressibility (see addClass)
8333
				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8334

8335
				if ( cur ) {
8336
					j = 0;
8337
					while ( ( clazz = classes[ j++ ] ) ) {
8338

8339
						// Remove *all* instances
8340
						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8341
							cur = cur.replace( " " + clazz + " ", " " );
8342
						}
8343
					}
8344

8345
					// Only assign if different to avoid unneeded rendering.
8346
					finalValue = stripAndCollapse( cur );
8347
					if ( curValue !== finalValue ) {
8348
						elem.setAttribute( "class", finalValue );
8349
					}
8350
				}
8351
			}
8352
		}
8353

8354
		return this;
8355
	},
8356

8357
	toggleClass: function( value, stateVal ) {
8358
		var type = typeof value,
8359
			isValidValue = type === "string" || Array.isArray( value );
8360

8361
		if ( typeof stateVal === "boolean" && isValidValue ) {
8362
			return stateVal ? this.addClass( value ) : this.removeClass( value );
8363
		}
8364

8365
		if ( isFunction( value ) ) {
8366
			return this.each( function( i ) {
8367
				jQuery( this ).toggleClass(
8368
					value.call( this, i, getClass( this ), stateVal ),
8369
					stateVal
8370
				);
8371
			} );
8372
		}
8373

8374
		return this.each( function() {
8375
			var className, i, self, classNames;
8376

8377
			if ( isValidValue ) {
8378

8379
				// Toggle individual class names
8380
				i = 0;
8381
				self = jQuery( this );
8382
				classNames = classesToArray( value );
8383

8384
				while ( ( className = classNames[ i++ ] ) ) {
8385

8386
					// Check each className given, space separated list
8387
					if ( self.hasClass( className ) ) {
8388
						self.removeClass( className );
8389
					} else {
8390
						self.addClass( className );
8391
					}
8392
				}
8393

8394
			// Toggle whole class name
8395
			} else if ( value === undefined || type === "boolean" ) {
8396
				className = getClass( this );
8397
				if ( className ) {
8398

8399
					// Store className if set
8400
					dataPriv.set( this, "__className__", className );
8401
				}
8402

8403
				// If the element has a class name or if we're passed `false`,
8404
				// then remove the whole classname (if there was one, the above saved it).
8405
				// Otherwise bring back whatever was previously saved (if anything),
8406
				// falling back to the empty string if nothing was stored.
8407
				if ( this.setAttribute ) {
8408
					this.setAttribute( "class",
8409
						className || value === false ?
8410
							"" :
8411
							dataPriv.get( this, "__className__" ) || ""
8412
					);
8413
				}
8414
			}
8415
		} );
8416
	},
8417

8418
	hasClass: function( selector ) {
8419
		var className, elem,
8420
			i = 0;
8421

8422
		className = " " + selector + " ";
8423
		while ( ( elem = this[ i++ ] ) ) {
8424
			if ( elem.nodeType === 1 &&
8425
				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8426
				return true;
8427
			}
8428
		}
8429

8430
		return false;
8431
	}
8432
} );
8433

8434

8435

8436

8437
var rreturn = /\r/g;
8438

8439
jQuery.fn.extend( {
8440
	val: function( value ) {
8441
		var hooks, ret, valueIsFunction,
8442
			elem = this[ 0 ];
8443

8444
		if ( !arguments.length ) {
8445
			if ( elem ) {
8446
				hooks = jQuery.valHooks[ elem.type ] ||
8447
					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8448

8449
				if ( hooks &&
8450
					"get" in hooks &&
8451
					( ret = hooks.get( elem, "value" ) ) !== undefined
8452
				) {
8453
					return ret;
8454
				}
8455

8456
				ret = elem.value;
8457

8458
				// Handle most common string cases
8459
				if ( typeof ret === "string" ) {
8460
					return ret.replace( rreturn, "" );
8461
				}
8462

8463
				// Handle cases where value is null/undef or number
8464
				return ret == null ? "" : ret;
8465
			}
8466

8467
			return;
8468
		}
8469

8470
		valueIsFunction = isFunction( value );
8471

8472
		return this.each( function( i ) {
8473
			var val;
8474

8475
			if ( this.nodeType !== 1 ) {
8476
				return;
8477
			}
8478

8479
			if ( valueIsFunction ) {
8480
				val = value.call( this, i, jQuery( this ).val() );
8481
			} else {
8482
				val = value;
8483
			}
8484

8485
			// Treat null/undefined as ""; convert numbers to string
8486
			if ( val == null ) {
8487
				val = "";
8488

8489
			} else if ( typeof val === "number" ) {
8490
				val += "";
8491

8492
			} else if ( Array.isArray( val ) ) {
8493
				val = jQuery.map( val, function( value ) {
8494
					return value == null ? "" : value + "";
8495
				} );
8496
			}
8497

8498
			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8499

8500
			// If set returns undefined, fall back to normal setting
8501
			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8502
				this.value = val;
8503
			}
8504
		} );
8505
	}
8506
} );
8507

8508
jQuery.extend( {
8509
	valHooks: {
8510
		option: {
8511
			get: function( elem ) {
8512

8513
				var val = jQuery.find.attr( elem, "value" );
8514
				return val != null ?
8515
					val :
8516

8517
					// Support: IE <=10 - 11 only
8518
					// option.text throws exceptions (#14686, #14858)
8519
					// Strip and collapse whitespace
8520
					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8521
					stripAndCollapse( jQuery.text( elem ) );
8522
			}
8523
		},
8524
		select: {
8525
			get: function( elem ) {
8526
				var value, option, i,
8527
					options = elem.options,
8528
					index = elem.selectedIndex,
8529
					one = elem.type === "select-one",
8530
					values = one ? null : [],
8531
					max = one ? index + 1 : options.length;
8532

8533
				if ( index < 0 ) {
8534
					i = max;
8535

8536
				} else {
8537
					i = one ? index : 0;
8538
				}
8539

8540
				// Loop through all the selected options
8541
				for ( ; i < max; i++ ) {
8542
					option = options[ i ];
8543

8544
					// Support: IE <=9 only
8545
					// IE8-9 doesn't update selected after form reset (#2551)
8546
					if ( ( option.selected || i === index ) &&
8547

8548
							// Don't return options that are disabled or in a disabled optgroup
8549
							!option.disabled &&
8550
							( !option.parentNode.disabled ||
8551
								!nodeName( option.parentNode, "optgroup" ) ) ) {
8552

8553
						// Get the specific value for the option
8554
						value = jQuery( option ).val();
8555

8556
						// We don't need an array for one selects
8557
						if ( one ) {
8558
							return value;
8559
						}
8560

8561
						// Multi-Selects return an array
8562
						values.push( value );
8563
					}
8564
				}
8565

8566
				return values;
8567
			},
8568

8569
			set: function( elem, value ) {
8570
				var optionSet, option,
8571
					options = elem.options,
8572
					values = jQuery.makeArray( value ),
8573
					i = options.length;
8574

8575
				while ( i-- ) {
8576
					option = options[ i ];
8577

8578
					/* eslint-disable no-cond-assign */
8579

8580
					if ( option.selected =
8581
						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8582
					) {
8583
						optionSet = true;
8584
					}
8585

8586
					/* eslint-enable no-cond-assign */
8587
				}
8588

8589
				// Force browsers to behave consistently when non-matching value is set
8590
				if ( !optionSet ) {
8591
					elem.selectedIndex = -1;
8592
				}
8593
				return values;
8594
			}
8595
		}
8596
	}
8597
} );
8598

8599
// Radios and checkboxes getter/setter
8600
jQuery.each( [ "radio", "checkbox" ], function() {
8601
	jQuery.valHooks[ this ] = {
8602
		set: function( elem, value ) {
8603
			if ( Array.isArray( value ) ) {
8604
				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8605
			}
8606
		}
8607
	};
8608
	if ( !support.checkOn ) {
8609
		jQuery.valHooks[ this ].get = function( elem ) {
8610
			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8611
		};
8612
	}
8613
} );
8614

8615

8616

8617

8618
// Return jQuery for attributes-only inclusion
8619

8620

8621
support.focusin = "onfocusin" in window;
8622

8623

8624
var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8625
	stopPropagationCallback = function( e ) {
8626
		e.stopPropagation();
8627
	};
8628

8629
jQuery.extend( jQuery.event, {
8630

8631
	trigger: function( event, data, elem, onlyHandlers ) {
8632

8633
		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8634
			eventPath = [ elem || document ],
8635
			type = hasOwn.call( event, "type" ) ? event.type : event,
8636
			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8637

8638
		cur = lastElement = tmp = elem = elem || document;
8639

8640
		// Don't do events on text and comment nodes
8641
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8642
			return;
8643
		}
8644

8645
		// focus/blur morphs to focusin/out; ensure we're not firing them right now
8646
		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8647
			return;
8648
		}
8649

8650
		if ( type.indexOf( "." ) > -1 ) {
8651

8652
			// Namespaced trigger; create a regexp to match event type in handle()
8653
			namespaces = type.split( "." );
8654
			type = namespaces.shift();
8655
			namespaces.sort();
8656
		}
8657
		ontype = type.indexOf( ":" ) < 0 && "on" + type;
8658

8659
		// Caller can pass in a jQuery.Event object, Object, or just an event type string
8660
		event = event[ jQuery.expando ] ?
8661
			event :
8662
			new jQuery.Event( type, typeof event === "object" && event );
8663

8664
		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8665
		event.isTrigger = onlyHandlers ? 2 : 3;
8666
		event.namespace = namespaces.join( "." );
8667
		event.rnamespace = event.namespace ?
8668
			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8669
			null;
8670

8671
		// Clean up the event in case it is being reused
8672
		event.result = undefined;
8673
		if ( !event.target ) {
8674
			event.target = elem;
8675
		}
8676

8677
		// Clone any incoming data and prepend the event, creating the handler arg list
8678
		data = data == null ?
8679
			[ event ] :
8680
			jQuery.makeArray( data, [ event ] );
8681

8682
		// Allow special events to draw outside the lines
8683
		special = jQuery.event.special[ type ] || {};
8684
		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8685
			return;
8686
		}
8687

8688
		// Determine event propagation path in advance, per W3C events spec (#9951)
8689
		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8690
		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8691

8692
			bubbleType = special.delegateType || type;
8693
			if ( !rfocusMorph.test( bubbleType + type ) ) {
8694
				cur = cur.parentNode;
8695
			}
8696
			for ( ; cur; cur = cur.parentNode ) {
8697
				eventPath.push( cur );
8698
				tmp = cur;
8699
			}
8700

8701
			// Only add window if we got to document (e.g., not plain obj or detached DOM)
8702
			if ( tmp === ( elem.ownerDocument || document ) ) {
8703
				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8704
			}
8705
		}
8706

8707
		// Fire handlers on the event path
8708
		i = 0;
8709
		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8710
			lastElement = cur;
8711
			event.type = i > 1 ?
8712
				bubbleType :
8713
				special.bindType || type;
8714

8715
			// jQuery handler
8716
			handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
8717
				dataPriv.get( cur, "handle" );
8718
			if ( handle ) {
8719
				handle.apply( cur, data );
8720
			}
8721

8722
			// Native handler
8723
			handle = ontype && cur[ ontype ];
8724
			if ( handle && handle.apply && acceptData( cur ) ) {
8725
				event.result = handle.apply( cur, data );
8726
				if ( event.result === false ) {
8727
					event.preventDefault();
8728
				}
8729
			}
8730
		}
8731
		event.type = type;
8732

8733
		// If nobody prevented the default action, do it now
8734
		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8735

8736
			if ( ( !special._default ||
8737
				special._default.apply( eventPath.pop(), data ) === false ) &&
8738
				acceptData( elem ) ) {
8739

8740
				// Call a native DOM method on the target with the same name as the event.
8741
				// Don't do default actions on window, that's where global variables be (#6170)
8742
				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8743

8744
					// Don't re-trigger an onFOO event when we call its FOO() method
8745
					tmp = elem[ ontype ];
8746

8747
					if ( tmp ) {
8748
						elem[ ontype ] = null;
8749
					}
8750

8751
					// Prevent re-triggering of the same event, since we already bubbled it above
8752
					jQuery.event.triggered = type;
8753

8754
					if ( event.isPropagationStopped() ) {
8755
						lastElement.addEventListener( type, stopPropagationCallback );
8756
					}
8757

8758
					elem[ type ]();
8759

8760
					if ( event.isPropagationStopped() ) {
8761
						lastElement.removeEventListener( type, stopPropagationCallback );
8762
					}
8763

8764
					jQuery.event.triggered = undefined;
8765

8766
					if ( tmp ) {
8767
						elem[ ontype ] = tmp;
8768
					}
8769
				}
8770
			}
8771
		}
8772

8773
		return event.result;
8774
	},
8775

8776
	// Piggyback on a donor event to simulate a different one
8777
	// Used only for `focus(in | out)` events
8778
	simulate: function( type, elem, event ) {
8779
		var e = jQuery.extend(
8780
			new jQuery.Event(),
8781
			event,
8782
			{
8783
				type: type,
8784
				isSimulated: true
8785
			}
8786
		);
8787

8788
		jQuery.event.trigger( e, null, elem );
8789
	}
8790

8791
} );
8792

8793
jQuery.fn.extend( {
8794

8795
	trigger: function( type, data ) {
8796
		return this.each( function() {
8797
			jQuery.event.trigger( type, data, this );
8798
		} );
8799
	},
8800
	triggerHandler: function( type, data ) {
8801
		var elem = this[ 0 ];
8802
		if ( elem ) {
8803
			return jQuery.event.trigger( type, data, elem, true );
8804
		}
8805
	}
8806
} );
8807

8808

8809
// Support: Firefox <=44
8810
// Firefox doesn't have focus(in | out) events
8811
// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8812
//
8813
// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8814
// focus(in | out) events fire after focus & blur events,
8815
// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8816
// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8817
if ( !support.focusin ) {
8818
	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8819

8820
		// Attach a single capturing handler on the document while someone wants focusin/focusout
8821
		var handler = function( event ) {
8822
			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8823
		};
8824

8825
		jQuery.event.special[ fix ] = {
8826
			setup: function() {
8827

8828
				// Handle: regular nodes (via `this.ownerDocument`), window
8829
				// (via `this.document`) & document (via `this`).
8830
				var doc = this.ownerDocument || this.document || this,
8831
					attaches = dataPriv.access( doc, fix );
8832

8833
				if ( !attaches ) {
8834
					doc.addEventListener( orig, handler, true );
8835
				}
8836
				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8837
			},
8838
			teardown: function() {
8839
				var doc = this.ownerDocument || this.document || this,
8840
					attaches = dataPriv.access( doc, fix ) - 1;
8841

8842
				if ( !attaches ) {
8843
					doc.removeEventListener( orig, handler, true );
8844
					dataPriv.remove( doc, fix );
8845

8846
				} else {
8847
					dataPriv.access( doc, fix, attaches );
8848
				}
8849
			}
8850
		};
8851
	} );
8852
}
8853
var location = window.location;
8854

8855
var nonce = { guid: Date.now() };
8856

8857
var rquery = ( /\?/ );
8858

8859

8860

8861
// Cross-browser xml parsing
8862
jQuery.parseXML = function( data ) {
8863
	var xml, parserErrorElem;
8864
	if ( !data || typeof data !== "string" ) {
8865
		return null;
8866
	}
8867

8868
	// Support: IE 9 - 11 only
8869
	// IE throws on parseFromString with invalid input.
8870
	try {
8871
		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8872
	} catch ( e ) {}
8873

8874
	parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
8875
	if ( !xml || parserErrorElem ) {
8876
		jQuery.error( "Invalid XML: " + (
8877
			parserErrorElem ?
8878
				jQuery.map( parserErrorElem.childNodes, function( el ) {
8879
					return el.textContent;
8880
				} ).join( "\n" ) :
8881
				data
8882
		) );
8883
	}
8884
	return xml;
8885
};
8886

8887

8888
var
8889
	rbracket = /\[\]$/,
8890
	rCRLF = /\r?\n/g,
8891
	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8892
	rsubmittable = /^(?:input|select|textarea|keygen)/i;
8893

8894
function buildParams( prefix, obj, traditional, add ) {
8895
	var name;
8896

8897
	if ( Array.isArray( obj ) ) {
8898

8899
		// Serialize array item.
8900
		jQuery.each( obj, function( i, v ) {
8901
			if ( traditional || rbracket.test( prefix ) ) {
8902

8903
				// Treat each array item as a scalar.
8904
				add( prefix, v );
8905

8906
			} else {
8907

8908
				// Item is non-scalar (array or object), encode its numeric index.
8909
				buildParams(
8910
					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8911
					v,
8912
					traditional,
8913
					add
8914
				);
8915
			}
8916
		} );
8917

8918
	} else if ( !traditional && toType( obj ) === "object" ) {
8919

8920
		// Serialize object item.
8921
		for ( name in obj ) {
8922
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8923
		}
8924

8925
	} else {
8926

8927
		// Serialize scalar item.
8928
		add( prefix, obj );
8929
	}
8930
}
8931

8932
// Serialize an array of form elements or a set of
8933
// key/values into a query string
8934
jQuery.param = function( a, traditional ) {
8935
	var prefix,
8936
		s = [],
8937
		add = function( key, valueOrFunction ) {
8938

8939
			// If value is a function, invoke it and use its return value
8940
			var value = isFunction( valueOrFunction ) ?
8941
				valueOrFunction() :
8942
				valueOrFunction;
8943

8944
			s[ s.length ] = encodeURIComponent( key ) + "=" +
8945
				encodeURIComponent( value == null ? "" : value );
8946
		};
8947

8948
	if ( a == null ) {
8949
		return "";
8950
	}
8951

8952
	// If an array was passed in, assume that it is an array of form elements.
8953
	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8954

8955
		// Serialize the form elements
8956
		jQuery.each( a, function() {
8957
			add( this.name, this.value );
8958
		} );
8959

8960
	} else {
8961

8962
		// If traditional, encode the "old" way (the way 1.3.2 or older
8963
		// did it), otherwise encode params recursively.
8964
		for ( prefix in a ) {
8965
			buildParams( prefix, a[ prefix ], traditional, add );
8966
		}
8967
	}
8968

8969
	// Return the resulting serialization
8970
	return s.join( "&" );
8971
};
8972

8973
jQuery.fn.extend( {
8974
	serialize: function() {
8975
		return jQuery.param( this.serializeArray() );
8976
	},
8977
	serializeArray: function() {
8978
		return this.map( function() {
8979

8980
			// Can add propHook for "elements" to filter or add form elements
8981
			var elements = jQuery.prop( this, "elements" );
8982
			return elements ? jQuery.makeArray( elements ) : this;
8983
		} ).filter( function() {
8984
			var type = this.type;
8985

8986
			// Use .is( ":disabled" ) so that fieldset[disabled] works
8987
			return this.name && !jQuery( this ).is( ":disabled" ) &&
8988
				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8989
				( this.checked || !rcheckableType.test( type ) );
8990
		} ).map( function( _i, elem ) {
8991
			var val = jQuery( this ).val();
8992

8993
			if ( val == null ) {
8994
				return null;
8995
			}
8996

8997
			if ( Array.isArray( val ) ) {
8998
				return jQuery.map( val, function( val ) {
8999
					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
9000
				} );
9001
			}
9002

9003
			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
9004
		} ).get();
9005
	}
9006
} );
9007

9008

9009
var
9010
	r20 = /%20/g,
9011
	rhash = /#.*$/,
9012
	rantiCache = /([?&])_=[^&]*/,
9013
	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
9014

9015
	// #7653, #8125, #8152: local protocol detection
9016
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
9017
	rnoContent = /^(?:GET|HEAD)$/,
9018
	rprotocol = /^\/\//,
9019

9020
	/* Prefilters
9021
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
9022
	 * 2) These are called:
9023
	 *    - BEFORE asking for a transport
9024
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
9025
	 * 3) key is the dataType
9026
	 * 4) the catchall symbol "*" can be used
9027
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
9028
	 */
9029
	prefilters = {},
9030

9031
	/* Transports bindings
9032
	 * 1) key is the dataType
9033
	 * 2) the catchall symbol "*" can be used
9034
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
9035
	 */
9036
	transports = {},
9037

9038
	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
9039
	allTypes = "*/".concat( "*" ),
9040

9041
	// Anchor tag for parsing the document origin
9042
	originAnchor = document.createElement( "a" );
9043

9044
originAnchor.href = location.href;
9045

9046
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
9047
function addToPrefiltersOrTransports( structure ) {
9048

9049
	// dataTypeExpression is optional and defaults to "*"
9050
	return function( dataTypeExpression, func ) {
9051

9052
		if ( typeof dataTypeExpression !== "string" ) {
9053
			func = dataTypeExpression;
9054
			dataTypeExpression = "*";
9055
		}
9056

9057
		var dataType,
9058
			i = 0,
9059
			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
9060

9061
		if ( isFunction( func ) ) {
9062

9063
			// For each dataType in the dataTypeExpression
9064
			while ( ( dataType = dataTypes[ i++ ] ) ) {
9065

9066
				// Prepend if requested
9067
				if ( dataType[ 0 ] === "+" ) {
9068
					dataType = dataType.slice( 1 ) || "*";
9069
					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
9070

9071
				// Otherwise append
9072
				} else {
9073
					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
9074
				}
9075
			}
9076
		}
9077
	};
9078
}
9079

9080
// Base inspection function for prefilters and transports
9081
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
9082

9083
	var inspected = {},
9084
		seekingTransport = ( structure === transports );
9085

9086
	function inspect( dataType ) {
9087
		var selected;
9088
		inspected[ dataType ] = true;
9089
		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
9090
			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
9091
			if ( typeof dataTypeOrTransport === "string" &&
9092
				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
9093

9094
				options.dataTypes.unshift( dataTypeOrTransport );
9095
				inspect( dataTypeOrTransport );
9096
				return false;
9097
			} else if ( seekingTransport ) {
9098
				return !( selected = dataTypeOrTransport );
9099
			}
9100
		} );
9101
		return selected;
9102
	}
9103

9104
	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
9105
}
9106

9107
// A special extend for ajax options
9108
// that takes "flat" options (not to be deep extended)
9109
// Fixes #9887
9110
function ajaxExtend( target, src ) {
9111
	var key, deep,
9112
		flatOptions = jQuery.ajaxSettings.flatOptions || {};
9113

9114
	for ( key in src ) {
9115
		if ( src[ key ] !== undefined ) {
9116
			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
9117
		}
9118
	}
9119
	if ( deep ) {
9120
		jQuery.extend( true, target, deep );
9121
	}
9122

9123
	return target;
9124
}
9125

9126
/* Handles responses to an ajax request:
9127
 * - finds the right dataType (mediates between content-type and expected dataType)
9128
 * - returns the corresponding response
9129
 */
9130
function ajaxHandleResponses( s, jqXHR, responses ) {
9131

9132
	var ct, type, finalDataType, firstDataType,
9133
		contents = s.contents,
9134
		dataTypes = s.dataTypes;
9135

9136
	// Remove auto dataType and get content-type in the process
9137
	while ( dataTypes[ 0 ] === "*" ) {
9138
		dataTypes.shift();
9139
		if ( ct === undefined ) {
9140
			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
9141
		}
9142
	}
9143

9144
	// Check if we're dealing with a known content-type
9145
	if ( ct ) {
9146
		for ( type in contents ) {
9147
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
9148
				dataTypes.unshift( type );
9149
				break;
9150
			}
9151
		}
9152
	}
9153

9154
	// Check to see if we have a response for the expected dataType
9155
	if ( dataTypes[ 0 ] in responses ) {
9156
		finalDataType = dataTypes[ 0 ];
9157
	} else {
9158

9159
		// Try convertible dataTypes
9160
		for ( type in responses ) {
9161
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
9162
				finalDataType = type;
9163
				break;
9164
			}
9165
			if ( !firstDataType ) {
9166
				firstDataType = type;
9167
			}
9168
		}
9169

9170
		// Or just use first one
9171
		finalDataType = finalDataType || firstDataType;
9172
	}
9173

9174
	// If we found a dataType
9175
	// We add the dataType to the list if needed
9176
	// and return the corresponding response
9177
	if ( finalDataType ) {
9178
		if ( finalDataType !== dataTypes[ 0 ] ) {
9179
			dataTypes.unshift( finalDataType );
9180
		}
9181
		return responses[ finalDataType ];
9182
	}
9183
}
9184

9185
/* Chain conversions given the request and the original response
9186
 * Also sets the responseXXX fields on the jqXHR instance
9187
 */
9188
function ajaxConvert( s, response, jqXHR, isSuccess ) {
9189
	var conv2, current, conv, tmp, prev,
9190
		converters = {},
9191

9192
		// Work with a copy of dataTypes in case we need to modify it for conversion
9193
		dataTypes = s.dataTypes.slice();
9194

9195
	// Create converters map with lowercased keys
9196
	if ( dataTypes[ 1 ] ) {
9197
		for ( conv in s.converters ) {
9198
			converters[ conv.toLowerCase() ] = s.converters[ conv ];
9199
		}
9200
	}
9201

9202
	current = dataTypes.shift();
9203

9204
	// Convert to each sequential dataType
9205
	while ( current ) {
9206

9207
		if ( s.responseFields[ current ] ) {
9208
			jqXHR[ s.responseFields[ current ] ] = response;
9209
		}
9210

9211
		// Apply the dataFilter if provided
9212
		if ( !prev && isSuccess && s.dataFilter ) {
9213
			response = s.dataFilter( response, s.dataType );
9214
		}
9215

9216
		prev = current;
9217
		current = dataTypes.shift();
9218

9219
		if ( current ) {
9220

9221
			// There's only work to do if current dataType is non-auto
9222
			if ( current === "*" ) {
9223

9224
				current = prev;
9225

9226
			// Convert response if prev dataType is non-auto and differs from current
9227
			} else if ( prev !== "*" && prev !== current ) {
9228

9229
				// Seek a direct converter
9230
				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
9231

9232
				// If none found, seek a pair
9233
				if ( !conv ) {
9234
					for ( conv2 in converters ) {
9235

9236
						// If conv2 outputs current
9237
						tmp = conv2.split( " " );
9238
						if ( tmp[ 1 ] === current ) {
9239

9240
							// If prev can be converted to accepted input
9241
							conv = converters[ prev + " " + tmp[ 0 ] ] ||
9242
								converters[ "* " + tmp[ 0 ] ];
9243
							if ( conv ) {
9244

9245
								// Condense equivalence converters
9246
								if ( conv === true ) {
9247
									conv = converters[ conv2 ];
9248

9249
								// Otherwise, insert the intermediate dataType
9250
								} else if ( converters[ conv2 ] !== true ) {
9251
									current = tmp[ 0 ];
9252
									dataTypes.unshift( tmp[ 1 ] );
9253
								}
9254
								break;
9255
							}
9256
						}
9257
					}
9258
				}
9259

9260
				// Apply converter (if not an equivalence)
9261
				if ( conv !== true ) {
9262

9263
					// Unless errors are allowed to bubble, catch and return them
9264
					if ( conv && s.throws ) {
9265
						response = conv( response );
9266
					} else {
9267
						try {
9268
							response = conv( response );
9269
						} catch ( e ) {
9270
							return {
9271
								state: "parsererror",
9272
								error: conv ? e : "No conversion from " + prev + " to " + current
9273
							};
9274
						}
9275
					}
9276
				}
9277
			}
9278
		}
9279
	}
9280

9281
	return { state: "success", data: response };
9282
}
9283

9284
jQuery.extend( {
9285

9286
	// Counter for holding the number of active queries
9287
	active: 0,
9288

9289
	// Last-Modified header cache for next request
9290
	lastModified: {},
9291
	etag: {},
9292

9293
	ajaxSettings: {
9294
		url: location.href,
9295
		type: "GET",
9296
		isLocal: rlocalProtocol.test( location.protocol ),
9297
		global: true,
9298
		processData: true,
9299
		async: true,
9300
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9301

9302
		/*
9303
		timeout: 0,
9304
		data: null,
9305
		dataType: null,
9306
		username: null,
9307
		password: null,
9308
		cache: null,
9309
		throws: false,
9310
		traditional: false,
9311
		headers: {},
9312
		*/
9313

9314
		accepts: {
9315
			"*": allTypes,
9316
			text: "text/plain",
9317
			html: "text/html",
9318
			xml: "application/xml, text/xml",
9319
			json: "application/json, text/javascript"
9320
		},
9321

9322
		contents: {
9323
			xml: /\bxml\b/,
9324
			html: /\bhtml/,
9325
			json: /\bjson\b/
9326
		},
9327

9328
		responseFields: {
9329
			xml: "responseXML",
9330
			text: "responseText",
9331
			json: "responseJSON"
9332
		},
9333

9334
		// Data converters
9335
		// Keys separate source (or catchall "*") and destination types with a single space
9336
		converters: {
9337

9338
			// Convert anything to text
9339
			"* text": String,
9340

9341
			// Text to html (true = no transformation)
9342
			"text html": true,
9343

9344
			// Evaluate text as a json expression
9345
			"text json": JSON.parse,
9346

9347
			// Parse text as xml
9348
			"text xml": jQuery.parseXML
9349
		},
9350

9351
		// For options that shouldn't be deep extended:
9352
		// you can add your own custom options here if
9353
		// and when you create one that shouldn't be
9354
		// deep extended (see ajaxExtend)
9355
		flatOptions: {
9356
			url: true,
9357
			context: true
9358
		}
9359
	},
9360

9361
	// Creates a full fledged settings object into target
9362
	// with both ajaxSettings and settings fields.
9363
	// If target is omitted, writes into ajaxSettings.
9364
	ajaxSetup: function( target, settings ) {
9365
		return settings ?
9366

9367
			// Building a settings object
9368
			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9369

9370
			// Extending ajaxSettings
9371
			ajaxExtend( jQuery.ajaxSettings, target );
9372
	},
9373

9374
	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9375
	ajaxTransport: addToPrefiltersOrTransports( transports ),
9376

9377
	// Main method
9378
	ajax: function( url, options ) {
9379

9380
		// If url is an object, simulate pre-1.5 signature
9381
		if ( typeof url === "object" ) {
9382
			options = url;
9383
			url = undefined;
9384
		}
9385

9386
		// Force options to be an object
9387
		options = options || {};
9388

9389
		var transport,
9390

9391
			// URL without anti-cache param
9392
			cacheURL,
9393

9394
			// Response headers
9395
			responseHeadersString,
9396
			responseHeaders,
9397

9398
			// timeout handle
9399
			timeoutTimer,
9400

9401
			// Url cleanup var
9402
			urlAnchor,
9403

9404
			// Request state (becomes false upon send and true upon completion)
9405
			completed,
9406

9407
			// To know if global events are to be dispatched
9408
			fireGlobals,
9409

9410
			// Loop variable
9411
			i,
9412

9413
			// uncached part of the url
9414
			uncached,
9415

9416
			// Create the final options object
9417
			s = jQuery.ajaxSetup( {}, options ),
9418

9419
			// Callbacks context
9420
			callbackContext = s.context || s,
9421

9422
			// Context for global events is callbackContext if it is a DOM node or jQuery collection
9423
			globalEventContext = s.context &&
9424
				( callbackContext.nodeType || callbackContext.jquery ) ?
9425
				jQuery( callbackContext ) :
9426
				jQuery.event,
9427

9428
			// Deferreds
9429
			deferred = jQuery.Deferred(),
9430
			completeDeferred = jQuery.Callbacks( "once memory" ),
9431

9432
			// Status-dependent callbacks
9433
			statusCode = s.statusCode || {},
9434

9435
			// Headers (they are sent all at once)
9436
			requestHeaders = {},
9437
			requestHeadersNames = {},
9438

9439
			// Default abort message
9440
			strAbort = "canceled",
9441

9442
			// Fake xhr
9443
			jqXHR = {
9444
				readyState: 0,
9445

9446
				// Builds headers hashtable if needed
9447
				getResponseHeader: function( key ) {
9448
					var match;
9449
					if ( completed ) {
9450
						if ( !responseHeaders ) {
9451
							responseHeaders = {};
9452
							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9453
								responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9454
									( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9455
										.concat( match[ 2 ] );
9456
							}
9457
						}
9458
						match = responseHeaders[ key.toLowerCase() + " " ];
9459
					}
9460
					return match == null ? null : match.join( ", " );
9461
				},
9462

9463
				// Raw string
9464
				getAllResponseHeaders: function() {
9465
					return completed ? responseHeadersString : null;
9466
				},
9467

9468
				// Caches the header
9469
				setRequestHeader: function( name, value ) {
9470
					if ( completed == null ) {
9471
						name = requestHeadersNames[ name.toLowerCase() ] =
9472
							requestHeadersNames[ name.toLowerCase() ] || name;
9473
						requestHeaders[ name ] = value;
9474
					}
9475
					return this;
9476
				},
9477

9478
				// Overrides response content-type header
9479
				overrideMimeType: function( type ) {
9480
					if ( completed == null ) {
9481
						s.mimeType = type;
9482
					}
9483
					return this;
9484
				},
9485

9486
				// Status-dependent callbacks
9487
				statusCode: function( map ) {
9488
					var code;
9489
					if ( map ) {
9490
						if ( completed ) {
9491

9492
							// Execute the appropriate callbacks
9493
							jqXHR.always( map[ jqXHR.status ] );
9494
						} else {
9495

9496
							// Lazy-add the new callbacks in a way that preserves old ones
9497
							for ( code in map ) {
9498
								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9499
							}
9500
						}
9501
					}
9502
					return this;
9503
				},
9504

9505
				// Cancel the request
9506
				abort: function( statusText ) {
9507
					var finalText = statusText || strAbort;
9508
					if ( transport ) {
9509
						transport.abort( finalText );
9510
					}
9511
					done( 0, finalText );
9512
					return this;
9513
				}
9514
			};
9515

9516
		// Attach deferreds
9517
		deferred.promise( jqXHR );
9518

9519
		// Add protocol if not provided (prefilters might expect it)
9520
		// Handle falsy url in the settings object (#10093: consistency with old signature)
9521
		// We also use the url parameter if available
9522
		s.url = ( ( url || s.url || location.href ) + "" )
9523
			.replace( rprotocol, location.protocol + "//" );
9524

9525
		// Alias method option to type as per ticket #12004
9526
		s.type = options.method || options.type || s.method || s.type;
9527

9528
		// Extract dataTypes list
9529
		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9530

9531
		// A cross-domain request is in order when the origin doesn't match the current origin.
9532
		if ( s.crossDomain == null ) {
9533
			urlAnchor = document.createElement( "a" );
9534

9535
			// Support: IE <=8 - 11, Edge 12 - 15
9536
			// IE throws exception on accessing the href property if url is malformed,
9537
			// e.g. http://example.com:80x/
9538
			try {
9539
				urlAnchor.href = s.url;
9540

9541
				// Support: IE <=8 - 11 only
9542
				// Anchor's host property isn't correctly set when s.url is relative
9543
				urlAnchor.href = urlAnchor.href;
9544
				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9545
					urlAnchor.protocol + "//" + urlAnchor.host;
9546
			} catch ( e ) {
9547

9548
				// If there is an error parsing the URL, assume it is crossDomain,
9549
				// it can be rejected by the transport if it is invalid
9550
				s.crossDomain = true;
9551
			}
9552
		}
9553

9554
		// Convert data if not already a string
9555
		if ( s.data && s.processData && typeof s.data !== "string" ) {
9556
			s.data = jQuery.param( s.data, s.traditional );
9557
		}
9558

9559
		// Apply prefilters
9560
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9561

9562
		// If request was aborted inside a prefilter, stop there
9563
		if ( completed ) {
9564
			return jqXHR;
9565
		}
9566

9567
		// We can fire global events as of now if asked to
9568
		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9569
		fireGlobals = jQuery.event && s.global;
9570

9571
		// Watch for a new set of requests
9572
		if ( fireGlobals && jQuery.active++ === 0 ) {
9573
			jQuery.event.trigger( "ajaxStart" );
9574
		}
9575

9576
		// Uppercase the type
9577
		s.type = s.type.toUpperCase();
9578

9579
		// Determine if request has content
9580
		s.hasContent = !rnoContent.test( s.type );
9581

9582
		// Save the URL in case we're toying with the If-Modified-Since
9583
		// and/or If-None-Match header later on
9584
		// Remove hash to simplify url manipulation
9585
		cacheURL = s.url.replace( rhash, "" );
9586

9587
		// More options handling for requests with no content
9588
		if ( !s.hasContent ) {
9589

9590
			// Remember the hash so we can put it back
9591
			uncached = s.url.slice( cacheURL.length );
9592

9593
			// If data is available and should be processed, append data to url
9594
			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9595
				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9596

9597
				// #9682: remove data so that it's not used in an eventual retry
9598
				delete s.data;
9599
			}
9600

9601
			// Add or update anti-cache param if needed
9602
			if ( s.cache === false ) {
9603
				cacheURL = cacheURL.replace( rantiCache, "$1" );
9604
				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9605
					uncached;
9606
			}
9607

9608
			// Put hash and anti-cache on the URL that will be requested (gh-1732)
9609
			s.url = cacheURL + uncached;
9610

9611
		// Change '%20' to '+' if this is encoded form body content (gh-2658)
9612
		} else if ( s.data && s.processData &&
9613
			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9614
			s.data = s.data.replace( r20, "+" );
9615
		}
9616

9617
		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9618
		if ( s.ifModified ) {
9619
			if ( jQuery.lastModified[ cacheURL ] ) {
9620
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9621
			}
9622
			if ( jQuery.etag[ cacheURL ] ) {
9623
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9624
			}
9625
		}
9626

9627
		// Set the correct header, if data is being sent
9628
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9629
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
9630
		}
9631

9632
		// Set the Accepts header for the server, depending on the dataType
9633
		jqXHR.setRequestHeader(
9634
			"Accept",
9635
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9636
				s.accepts[ s.dataTypes[ 0 ] ] +
9637
					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9638
				s.accepts[ "*" ]
9639
		);
9640

9641
		// Check for headers option
9642
		for ( i in s.headers ) {
9643
			jqXHR.setRequestHeader( i, s.headers[ i ] );
9644
		}
9645

9646
		// Allow custom headers/mimetypes and early abort
9647
		if ( s.beforeSend &&
9648
			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9649

9650
			// Abort if not done already and return
9651
			return jqXHR.abort();
9652
		}
9653

9654
		// Aborting is no longer a cancellation
9655
		strAbort = "abort";
9656

9657
		// Install callbacks on deferreds
9658
		completeDeferred.add( s.complete );
9659
		jqXHR.done( s.success );
9660
		jqXHR.fail( s.error );
9661

9662
		// Get transport
9663
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9664

9665
		// If no transport, we auto-abort
9666
		if ( !transport ) {
9667
			done( -1, "No Transport" );
9668
		} else {
9669
			jqXHR.readyState = 1;
9670

9671
			// Send global event
9672
			if ( fireGlobals ) {
9673
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9674
			}
9675

9676
			// If request was aborted inside ajaxSend, stop there
9677
			if ( completed ) {
9678
				return jqXHR;
9679
			}
9680

9681
			// Timeout
9682
			if ( s.async && s.timeout > 0 ) {
9683
				timeoutTimer = window.setTimeout( function() {
9684
					jqXHR.abort( "timeout" );
9685
				}, s.timeout );
9686
			}
9687

9688
			try {
9689
				completed = false;
9690
				transport.send( requestHeaders, done );
9691
			} catch ( e ) {
9692

9693
				// Rethrow post-completion exceptions
9694
				if ( completed ) {
9695
					throw e;
9696
				}
9697

9698
				// Propagate others as results
9699
				done( -1, e );
9700
			}
9701
		}
9702

9703
		// Callback for when everything is done
9704
		function done( status, nativeStatusText, responses, headers ) {
9705
			var isSuccess, success, error, response, modified,
9706
				statusText = nativeStatusText;
9707

9708
			// Ignore repeat invocations
9709
			if ( completed ) {
9710
				return;
9711
			}
9712

9713
			completed = true;
9714

9715
			// Clear timeout if it exists
9716
			if ( timeoutTimer ) {
9717
				window.clearTimeout( timeoutTimer );
9718
			}
9719

9720
			// Dereference transport for early garbage collection
9721
			// (no matter how long the jqXHR object will be used)
9722
			transport = undefined;
9723

9724
			// Cache response headers
9725
			responseHeadersString = headers || "";
9726

9727
			// Set readyState
9728
			jqXHR.readyState = status > 0 ? 4 : 0;
9729

9730
			// Determine if successful
9731
			isSuccess = status >= 200 && status < 300 || status === 304;
9732

9733
			// Get response data
9734
			if ( responses ) {
9735
				response = ajaxHandleResponses( s, jqXHR, responses );
9736
			}
9737

9738
			// Use a noop converter for missing script but not if jsonp
9739
			if ( !isSuccess &&
9740
				jQuery.inArray( "script", s.dataTypes ) > -1 &&
9741
				jQuery.inArray( "json", s.dataTypes ) < 0 ) {
9742
				s.converters[ "text script" ] = function() {};
9743
			}
9744

9745
			// Convert no matter what (that way responseXXX fields are always set)
9746
			response = ajaxConvert( s, response, jqXHR, isSuccess );
9747

9748
			// If successful, handle type chaining
9749
			if ( isSuccess ) {
9750

9751
				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9752
				if ( s.ifModified ) {
9753
					modified = jqXHR.getResponseHeader( "Last-Modified" );
9754
					if ( modified ) {
9755
						jQuery.lastModified[ cacheURL ] = modified;
9756
					}
9757
					modified = jqXHR.getResponseHeader( "etag" );
9758
					if ( modified ) {
9759
						jQuery.etag[ cacheURL ] = modified;
9760
					}
9761
				}
9762

9763
				// if no content
9764
				if ( status === 204 || s.type === "HEAD" ) {
9765
					statusText = "nocontent";
9766

9767
				// if not modified
9768
				} else if ( status === 304 ) {
9769
					statusText = "notmodified";
9770

9771
				// If we have data, let's convert it
9772
				} else {
9773
					statusText = response.state;
9774
					success = response.data;
9775
					error = response.error;
9776
					isSuccess = !error;
9777
				}
9778
			} else {
9779

9780
				// Extract error from statusText and normalize for non-aborts
9781
				error = statusText;
9782
				if ( status || !statusText ) {
9783
					statusText = "error";
9784
					if ( status < 0 ) {
9785
						status = 0;
9786
					}
9787
				}
9788
			}
9789

9790
			// Set data for the fake xhr object
9791
			jqXHR.status = status;
9792
			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9793

9794
			// Success/Error
9795
			if ( isSuccess ) {
9796
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9797
			} else {
9798
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9799
			}
9800

9801
			// Status-dependent callbacks
9802
			jqXHR.statusCode( statusCode );
9803
			statusCode = undefined;
9804

9805
			if ( fireGlobals ) {
9806
				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9807
					[ jqXHR, s, isSuccess ? success : error ] );
9808
			}
9809

9810
			// Complete
9811
			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9812

9813
			if ( fireGlobals ) {
9814
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9815

9816
				// Handle the global AJAX counter
9817
				if ( !( --jQuery.active ) ) {
9818
					jQuery.event.trigger( "ajaxStop" );
9819
				}
9820
			}
9821
		}
9822

9823
		return jqXHR;
9824
	},
9825

9826
	getJSON: function( url, data, callback ) {
9827
		return jQuery.get( url, data, callback, "json" );
9828
	},
9829

9830
	getScript: function( url, callback ) {
9831
		return jQuery.get( url, undefined, callback, "script" );
9832
	}
9833
} );
9834

9835
jQuery.each( [ "get", "post" ], function( _i, method ) {
9836
	jQuery[ method ] = function( url, data, callback, type ) {
9837

9838
		// Shift arguments if data argument was omitted
9839
		if ( isFunction( data ) ) {
9840
			type = type || callback;
9841
			callback = data;
9842
			data = undefined;
9843
		}
9844

9845
		// The url can be an options object (which then must have .url)
9846
		return jQuery.ajax( jQuery.extend( {
9847
			url: url,
9848
			type: method,
9849
			dataType: type,
9850
			data: data,
9851
			success: callback
9852
		}, jQuery.isPlainObject( url ) && url ) );
9853
	};
9854
} );
9855

9856
jQuery.ajaxPrefilter( function( s ) {
9857
	var i;
9858
	for ( i in s.headers ) {
9859
		if ( i.toLowerCase() === "content-type" ) {
9860
			s.contentType = s.headers[ i ] || "";
9861
		}
9862
	}
9863
} );
9864

9865

9866
jQuery._evalUrl = function( url, options, doc ) {
9867
	return jQuery.ajax( {
9868
		url: url,
9869

9870
		// Make this explicit, since user can override this through ajaxSetup (#11264)
9871
		type: "GET",
9872
		dataType: "script",
9873
		cache: true,
9874
		async: false,
9875
		global: false,
9876

9877
		// Only evaluate the response if it is successful (gh-4126)
9878
		// dataFilter is not invoked for failure responses, so using it instead
9879
		// of the default converter is kludgy but it works.
9880
		converters: {
9881
			"text script": function() {}
9882
		},
9883
		dataFilter: function( response ) {
9884
			jQuery.globalEval( response, options, doc );
9885
		}
9886
	} );
9887
};
9888

9889

9890
jQuery.fn.extend( {
9891
	wrapAll: function( html ) {
9892
		var wrap;
9893

9894
		if ( this[ 0 ] ) {
9895
			if ( isFunction( html ) ) {
9896
				html = html.call( this[ 0 ] );
9897
			}
9898

9899
			// The elements to wrap the target around
9900
			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9901

9902
			if ( this[ 0 ].parentNode ) {
9903
				wrap.insertBefore( this[ 0 ] );
9904
			}
9905

9906
			wrap.map( function() {
9907
				var elem = this;
9908

9909
				while ( elem.firstElementChild ) {
9910
					elem = elem.firstElementChild;
9911
				}
9912

9913
				return elem;
9914
			} ).append( this );
9915
		}
9916

9917
		return this;
9918
	},
9919

9920
	wrapInner: function( html ) {
9921
		if ( isFunction( html ) ) {
9922
			return this.each( function( i ) {
9923
				jQuery( this ).wrapInner( html.call( this, i ) );
9924
			} );
9925
		}
9926

9927
		return this.each( function() {
9928
			var self = jQuery( this ),
9929
				contents = self.contents();
9930

9931
			if ( contents.length ) {
9932
				contents.wrapAll( html );
9933

9934
			} else {
9935
				self.append( html );
9936
			}
9937
		} );
9938
	},
9939

9940
	wrap: function( html ) {
9941
		var htmlIsFunction = isFunction( html );
9942

9943
		return this.each( function( i ) {
9944
			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9945
		} );
9946
	},
9947

9948
	unwrap: function( selector ) {
9949
		this.parent( selector ).not( "body" ).each( function() {
9950
			jQuery( this ).replaceWith( this.childNodes );
9951
		} );
9952
		return this;
9953
	}
9954
} );
9955

9956

9957
jQuery.expr.pseudos.hidden = function( elem ) {
9958
	return !jQuery.expr.pseudos.visible( elem );
9959
};
9960
jQuery.expr.pseudos.visible = function( elem ) {
9961
	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9962
};
9963

9964

9965

9966

9967
jQuery.ajaxSettings.xhr = function() {
9968
	try {
9969
		return new window.XMLHttpRequest();
9970
	} catch ( e ) {}
9971
};
9972

9973
var xhrSuccessStatus = {
9974

9975
		// File protocol always yields status code 0, assume 200
9976
		0: 200,
9977

9978
		// Support: IE <=9 only
9979
		// #1450: sometimes IE returns 1223 when it should be 204
9980
		1223: 204
9981
	},
9982
	xhrSupported = jQuery.ajaxSettings.xhr();
9983

9984
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9985
support.ajax = xhrSupported = !!xhrSupported;
9986

9987
jQuery.ajaxTransport( function( options ) {
9988
	var callback, errorCallback;
9989

9990
	// Cross domain only allowed if supported through XMLHttpRequest
9991
	if ( support.cors || xhrSupported && !options.crossDomain ) {
9992
		return {
9993
			send: function( headers, complete ) {
9994
				var i,
9995
					xhr = options.xhr();
9996

9997
				xhr.open(
9998
					options.type,
9999
					options.url,
10000
					options.async,
10001
					options.username,
10002
					options.password
10003
				);
10004

10005
				// Apply custom fields if provided
10006
				if ( options.xhrFields ) {
10007
					for ( i in options.xhrFields ) {
10008
						xhr[ i ] = options.xhrFields[ i ];
10009
					}
10010
				}
10011

10012
				// Override mime type if needed
10013
				if ( options.mimeType && xhr.overrideMimeType ) {
10014
					xhr.overrideMimeType( options.mimeType );
10015
				}
10016

10017
				// X-Requested-With header
10018
				// For cross-domain requests, seeing as conditions for a preflight are
10019
				// akin to a jigsaw puzzle, we simply never set it to be sure.
10020
				// (it can always be set on a per-request basis or even using ajaxSetup)
10021
				// For same-domain requests, won't change header if already provided.
10022
				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
10023
					headers[ "X-Requested-With" ] = "XMLHttpRequest";
10024
				}
10025

10026
				// Set headers
10027
				for ( i in headers ) {
10028
					xhr.setRequestHeader( i, headers[ i ] );
10029
				}
10030

10031
				// Callback
10032
				callback = function( type ) {
10033
					return function() {
10034
						if ( callback ) {
10035
							callback = errorCallback = xhr.onload =
10036
								xhr.onerror = xhr.onabort = xhr.ontimeout =
10037
									xhr.onreadystatechange = null;
10038

10039
							if ( type === "abort" ) {
10040
								xhr.abort();
10041
							} else if ( type === "error" ) {
10042

10043
								// Support: IE <=9 only
10044
								// On a manual native abort, IE9 throws
10045
								// errors on any property access that is not readyState
10046
								if ( typeof xhr.status !== "number" ) {
10047
									complete( 0, "error" );
10048
								} else {
10049
									complete(
10050

10051
										// File: protocol always yields status 0; see #8605, #14207
10052
										xhr.status,
10053
										xhr.statusText
10054
									);
10055
								}
10056
							} else {
10057
								complete(
10058
									xhrSuccessStatus[ xhr.status ] || xhr.status,
10059
									xhr.statusText,
10060

10061
									// Support: IE <=9 only
10062
									// IE9 has no XHR2 but throws on binary (trac-11426)
10063
									// For XHR2 non-text, let the caller handle it (gh-2498)
10064
									( xhr.responseType || "text" ) !== "text"  ||
10065
									typeof xhr.responseText !== "string" ?
10066
										{ binary: xhr.response } :
10067
										{ text: xhr.responseText },
10068
									xhr.getAllResponseHeaders()
10069
								);
10070
							}
10071
						}
10072
					};
10073
				};
10074

10075
				// Listen to events
10076
				xhr.onload = callback();
10077
				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
10078

10079
				// Support: IE 9 only
10080
				// Use onreadystatechange to replace onabort
10081
				// to handle uncaught aborts
10082
				if ( xhr.onabort !== undefined ) {
10083
					xhr.onabort = errorCallback;
10084
				} else {
10085
					xhr.onreadystatechange = function() {
10086

10087
						// Check readyState before timeout as it changes
10088
						if ( xhr.readyState === 4 ) {
10089

10090
							// Allow onerror to be called first,
10091
							// but that will not handle a native abort
10092
							// Also, save errorCallback to a variable
10093
							// as xhr.onerror cannot be accessed
10094
							window.setTimeout( function() {
10095
								if ( callback ) {
10096
									errorCallback();
10097
								}
10098
							} );
10099
						}
10100
					};
10101
				}
10102

10103
				// Create the abort callback
10104
				callback = callback( "abort" );
10105

10106
				try {
10107

10108
					// Do send the request (this may raise an exception)
10109
					xhr.send( options.hasContent && options.data || null );
10110
				} catch ( e ) {
10111

10112
					// #14683: Only rethrow if this hasn't been notified as an error yet
10113
					if ( callback ) {
10114
						throw e;
10115
					}
10116
				}
10117
			},
10118

10119
			abort: function() {
10120
				if ( callback ) {
10121
					callback();
10122
				}
10123
			}
10124
		};
10125
	}
10126
} );
10127

10128

10129

10130

10131
// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
10132
jQuery.ajaxPrefilter( function( s ) {
10133
	if ( s.crossDomain ) {
10134
		s.contents.script = false;
10135
	}
10136
} );
10137

10138
// Install script dataType
10139
jQuery.ajaxSetup( {
10140
	accepts: {
10141
		script: "text/javascript, application/javascript, " +
10142
			"application/ecmascript, application/x-ecmascript"
10143
	},
10144
	contents: {
10145
		script: /\b(?:java|ecma)script\b/
10146
	},
10147
	converters: {
10148
		"text script": function( text ) {
10149
			jQuery.globalEval( text );
10150
			return text;
10151
		}
10152
	}
10153
} );
10154

10155
// Handle cache's special case and crossDomain
10156
jQuery.ajaxPrefilter( "script", function( s ) {
10157
	if ( s.cache === undefined ) {
10158
		s.cache = false;
10159
	}
10160
	if ( s.crossDomain ) {
10161
		s.type = "GET";
10162
	}
10163
} );
10164

10165
// Bind script tag hack transport
10166
jQuery.ajaxTransport( "script", function( s ) {
10167

10168
	// This transport only deals with cross domain or forced-by-attrs requests
10169
	if ( s.crossDomain || s.scriptAttrs ) {
10170
		var script, callback;
10171
		return {
10172
			send: function( _, complete ) {
10173
				script = jQuery( "<script>" )
10174
					.attr( s.scriptAttrs || {} )
10175
					.prop( { charset: s.scriptCharset, src: s.url } )
10176
					.on( "load error", callback = function( evt ) {
10177
						script.remove();
10178
						callback = null;
10179
						if ( evt ) {
10180
							complete( evt.type === "error" ? 404 : 200, evt.type );
10181
						}
10182
					} );
10183

10184
				// Use native DOM manipulation to avoid our domManip AJAX trickery
10185
				document.head.appendChild( script[ 0 ] );
10186
			},
10187
			abort: function() {
10188
				if ( callback ) {
10189
					callback();
10190
				}
10191
			}
10192
		};
10193
	}
10194
} );
10195

10196

10197

10198

10199
var oldCallbacks = [],
10200
	rjsonp = /(=)\?(?=&|$)|\?\?/;
10201

10202
// Default jsonp settings
10203
jQuery.ajaxSetup( {
10204
	jsonp: "callback",
10205
	jsonpCallback: function() {
10206
		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
10207
		this[ callback ] = true;
10208
		return callback;
10209
	}
10210
} );
10211

10212
// Detect, normalize options and install callbacks for jsonp requests
10213
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
10214

10215
	var callbackName, overwritten, responseContainer,
10216
		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
10217
			"url" :
10218
			typeof s.data === "string" &&
10219
				( s.contentType || "" )
10220
					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
10221
				rjsonp.test( s.data ) && "data"
10222
		);
10223

10224
	// Handle iff the expected data type is "jsonp" or we have a parameter to set
10225
	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
10226

10227
		// Get callback name, remembering preexisting value associated with it
10228
		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
10229
			s.jsonpCallback() :
10230
			s.jsonpCallback;
10231

10232
		// Insert callback into url or form data
10233
		if ( jsonProp ) {
10234
			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
10235
		} else if ( s.jsonp !== false ) {
10236
			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
10237
		}
10238

10239
		// Use data converter to retrieve json after script execution
10240
		s.converters[ "script json" ] = function() {
10241
			if ( !responseContainer ) {
10242
				jQuery.error( callbackName + " was not called" );
10243
			}
10244
			return responseContainer[ 0 ];
10245
		};
10246

10247
		// Force json dataType
10248
		s.dataTypes[ 0 ] = "json";
10249

10250
		// Install callback
10251
		overwritten = window[ callbackName ];
10252
		window[ callbackName ] = function() {
10253
			responseContainer = arguments;
10254
		};
10255

10256
		// Clean-up function (fires after converters)
10257
		jqXHR.always( function() {
10258

10259
			// If previous value didn't exist - remove it
10260
			if ( overwritten === undefined ) {
10261
				jQuery( window ).removeProp( callbackName );
10262

10263
			// Otherwise restore preexisting value
10264
			} else {
10265
				window[ callbackName ] = overwritten;
10266
			}
10267

10268
			// Save back as free
10269
			if ( s[ callbackName ] ) {
10270

10271
				// Make sure that re-using the options doesn't screw things around
10272
				s.jsonpCallback = originalSettings.jsonpCallback;
10273

10274
				// Save the callback name for future use
10275
				oldCallbacks.push( callbackName );
10276
			}
10277

10278
			// Call if it was a function and we have a response
10279
			if ( responseContainer && isFunction( overwritten ) ) {
10280
				overwritten( responseContainer[ 0 ] );
10281
			}
10282

10283
			responseContainer = overwritten = undefined;
10284
		} );
10285

10286
		// Delegate to script
10287
		return "script";
10288
	}
10289
} );
10290

10291

10292

10293

10294
// Support: Safari 8 only
10295
// In Safari 8 documents created via document.implementation.createHTMLDocument
10296
// collapse sibling forms: the second one becomes a child of the first one.
10297
// Because of that, this security measure has to be disabled in Safari 8.
10298
// https://bugs.webkit.org/show_bug.cgi?id=137337
10299
support.createHTMLDocument = ( function() {
10300
	var body = document.implementation.createHTMLDocument( "" ).body;
10301
	body.innerHTML = "<form></form><form></form>";
10302
	return body.childNodes.length === 2;
10303
} )();
10304

10305

10306
// Argument "data" should be string of html
10307
// context (optional): If specified, the fragment will be created in this context,
10308
// defaults to document
10309
// keepScripts (optional): If true, will include scripts passed in the html string
10310
jQuery.parseHTML = function( data, context, keepScripts ) {
10311
	if ( typeof data !== "string" ) {
10312
		return [];
10313
	}
10314
	if ( typeof context === "boolean" ) {
10315
		keepScripts = context;
10316
		context = false;
10317
	}
10318

10319
	var base, parsed, scripts;
10320

10321
	if ( !context ) {
10322

10323
		// Stop scripts or inline event handlers from being executed immediately
10324
		// by using document.implementation
10325
		if ( support.createHTMLDocument ) {
10326
			context = document.implementation.createHTMLDocument( "" );
10327

10328
			// Set the base href for the created document
10329
			// so any parsed elements with URLs
10330
			// are based on the document's URL (gh-2965)
10331
			base = context.createElement( "base" );
10332
			base.href = document.location.href;
10333
			context.head.appendChild( base );
10334
		} else {
10335
			context = document;
10336
		}
10337
	}
10338

10339
	parsed = rsingleTag.exec( data );
10340
	scripts = !keepScripts && [];
10341

10342
	// Single tag
10343
	if ( parsed ) {
10344
		return [ context.createElement( parsed[ 1 ] ) ];
10345
	}
10346

10347
	parsed = buildFragment( [ data ], context, scripts );
10348

10349
	if ( scripts && scripts.length ) {
10350
		jQuery( scripts ).remove();
10351
	}
10352

10353
	return jQuery.merge( [], parsed.childNodes );
10354
};
10355

10356

10357
/**
10358
 * Load a url into a page
10359
 */
10360
jQuery.fn.load = function( url, params, callback ) {
10361
	var selector, type, response,
10362
		self = this,
10363
		off = url.indexOf( " " );
10364

10365
	if ( off > -1 ) {
10366
		selector = stripAndCollapse( url.slice( off ) );
10367
		url = url.slice( 0, off );
10368
	}
10369

10370
	// If it's a function
10371
	if ( isFunction( params ) ) {
10372

10373
		// We assume that it's the callback
10374
		callback = params;
10375
		params = undefined;
10376

10377
	// Otherwise, build a param string
10378
	} else if ( params && typeof params === "object" ) {
10379
		type = "POST";
10380
	}
10381

10382
	// If we have elements to modify, make the request
10383
	if ( self.length > 0 ) {
10384
		jQuery.ajax( {
10385
			url: url,
10386

10387
			// If "type" variable is undefined, then "GET" method will be used.
10388
			// Make value of this field explicit since
10389
			// user can override it through ajaxSetup method
10390
			type: type || "GET",
10391
			dataType: "html",
10392
			data: params
10393
		} ).done( function( responseText ) {
10394

10395
			// Save response for use in complete callback
10396
			response = arguments;
10397

10398
			self.html( selector ?
10399

10400
				// If a selector was specified, locate the right elements in a dummy div
10401
				// Exclude scripts to avoid IE 'Permission Denied' errors
10402
				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10403

10404
				// Otherwise use the full result
10405
				responseText );
10406

10407
		// If the request succeeds, this function gets "data", "status", "jqXHR"
10408
		// but they are ignored because response was set above.
10409
		// If it fails, this function gets "jqXHR", "status", "error"
10410
		} ).always( callback && function( jqXHR, status ) {
10411
			self.each( function() {
10412
				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10413
			} );
10414
		} );
10415
	}
10416

10417
	return this;
10418
};
10419

10420

10421

10422

10423
jQuery.expr.pseudos.animated = function( elem ) {
10424
	return jQuery.grep( jQuery.timers, function( fn ) {
10425
		return elem === fn.elem;
10426
	} ).length;
10427
};
10428

10429

10430

10431

10432
jQuery.offset = {
10433
	setOffset: function( elem, options, i ) {
10434
		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10435
			position = jQuery.css( elem, "position" ),
10436
			curElem = jQuery( elem ),
10437
			props = {};
10438

10439
		// Set position first, in-case top/left are set even on static elem
10440
		if ( position === "static" ) {
10441
			elem.style.position = "relative";
10442
		}
10443

10444
		curOffset = curElem.offset();
10445
		curCSSTop = jQuery.css( elem, "top" );
10446
		curCSSLeft = jQuery.css( elem, "left" );
10447
		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10448
			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
10449

10450
		// Need to be able to calculate position if either
10451
		// top or left is auto and position is either absolute or fixed
10452
		if ( calculatePosition ) {
10453
			curPosition = curElem.position();
10454
			curTop = curPosition.top;
10455
			curLeft = curPosition.left;
10456

10457
		} else {
10458
			curTop = parseFloat( curCSSTop ) || 0;
10459
			curLeft = parseFloat( curCSSLeft ) || 0;
10460
		}
10461

10462
		if ( isFunction( options ) ) {
10463

10464
			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10465
			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10466
		}
10467

10468
		if ( options.top != null ) {
10469
			props.top = ( options.top - curOffset.top ) + curTop;
10470
		}
10471
		if ( options.left != null ) {
10472
			props.left = ( options.left - curOffset.left ) + curLeft;
10473
		}
10474

10475
		if ( "using" in options ) {
10476
			options.using.call( elem, props );
10477

10478
		} else {
10479
			curElem.css( props );
10480
		}
10481
	}
10482
};
10483

10484
jQuery.fn.extend( {
10485

10486
	// offset() relates an element's border box to the document origin
10487
	offset: function( options ) {
10488

10489
		// Preserve chaining for setter
10490
		if ( arguments.length ) {
10491
			return options === undefined ?
10492
				this :
10493
				this.each( function( i ) {
10494
					jQuery.offset.setOffset( this, options, i );
10495
				} );
10496
		}
10497

10498
		var rect, win,
10499
			elem = this[ 0 ];
10500

10501
		if ( !elem ) {
10502
			return;
10503
		}
10504

10505
		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
10506
		// Support: IE <=11 only
10507
		// Running getBoundingClientRect on a
10508
		// disconnected node in IE throws an error
10509
		if ( !elem.getClientRects().length ) {
10510
			return { top: 0, left: 0 };
10511
		}
10512

10513
		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
10514
		rect = elem.getBoundingClientRect();
10515
		win = elem.ownerDocument.defaultView;
10516
		return {
10517
			top: rect.top + win.pageYOffset,
10518
			left: rect.left + win.pageXOffset
10519
		};
10520
	},
10521

10522
	// position() relates an element's margin box to its offset parent's padding box
10523
	// This corresponds to the behavior of CSS absolute positioning
10524
	position: function() {
10525
		if ( !this[ 0 ] ) {
10526
			return;
10527
		}
10528

10529
		var offsetParent, offset, doc,
10530
			elem = this[ 0 ],
10531
			parentOffset = { top: 0, left: 0 };
10532

10533
		// position:fixed elements are offset from the viewport, which itself always has zero offset
10534
		if ( jQuery.css( elem, "position" ) === "fixed" ) {
10535

10536
			// Assume position:fixed implies availability of getBoundingClientRect
10537
			offset = elem.getBoundingClientRect();
10538

10539
		} else {
10540
			offset = this.offset();
10541

10542
			// Account for the *real* offset parent, which can be the document or its root element
10543
			// when a statically positioned element is identified
10544
			doc = elem.ownerDocument;
10545
			offsetParent = elem.offsetParent || doc.documentElement;
10546
			while ( offsetParent &&
10547
				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10548
				jQuery.css( offsetParent, "position" ) === "static" ) {
10549

10550
				offsetParent = offsetParent.parentNode;
10551
			}
10552
			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
10553

10554
				// Incorporate borders into its offset, since they are outside its content origin
10555
				parentOffset = jQuery( offsetParent ).offset();
10556
				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10557
				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10558
			}
10559
		}
10560

10561
		// Subtract parent offsets and element margins
10562
		return {
10563
			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10564
			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10565
		};
10566
	},
10567

10568
	// This method will return documentElement in the following cases:
10569
	// 1) For the element inside the iframe without offsetParent, this method will return
10570
	//    documentElement of the parent window
10571
	// 2) For the hidden or detached element
10572
	// 3) For body or html element, i.e. in case of the html node - it will return itself
10573
	//
10574
	// but those exceptions were never presented as a real life use-cases
10575
	// and might be considered as more preferable results.
10576
	//
10577
	// This logic, however, is not guaranteed and can change at any point in the future
10578
	offsetParent: function() {
10579
		return this.map( function() {
10580
			var offsetParent = this.offsetParent;
10581

10582
			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10583
				offsetParent = offsetParent.offsetParent;
10584
			}
10585

10586
			return offsetParent || documentElement;
10587
		} );
10588
	}
10589
} );
10590

10591
// Create scrollLeft and scrollTop methods
10592
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10593
	var top = "pageYOffset" === prop;
10594

10595
	jQuery.fn[ method ] = function( val ) {
10596
		return access( this, function( elem, method, val ) {
10597

10598
			// Coalesce documents and windows
10599
			var win;
10600
			if ( isWindow( elem ) ) {
10601
				win = elem;
10602
			} else if ( elem.nodeType === 9 ) {
10603
				win = elem.defaultView;
10604
			}
10605

10606
			if ( val === undefined ) {
10607
				return win ? win[ prop ] : elem[ method ];
10608
			}
10609

10610
			if ( win ) {
10611
				win.scrollTo(
10612
					!top ? val : win.pageXOffset,
10613
					top ? val : win.pageYOffset
10614
				);
10615

10616
			} else {
10617
				elem[ method ] = val;
10618
			}
10619
		}, method, val, arguments.length );
10620
	};
10621
} );
10622

10623
// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10624
// Add the top/left cssHooks using jQuery.fn.position
10625
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10626
// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10627
// getComputedStyle returns percent when specified for top/left/bottom/right;
10628
// rather than make the css module depend on the offset module, just check for it here
10629
jQuery.each( [ "top", "left" ], function( _i, prop ) {
10630
	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10631
		function( elem, computed ) {
10632
			if ( computed ) {
10633
				computed = curCSS( elem, prop );
10634

10635
				// If curCSS returns percentage, fallback to offset
10636
				return rnumnonpx.test( computed ) ?
10637
					jQuery( elem ).position()[ prop ] + "px" :
10638
					computed;
10639
			}
10640
		}
10641
	);
10642
} );
10643

10644

10645
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10646
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10647
	jQuery.each( {
10648
		padding: "inner" + name,
10649
		content: type,
10650
		"": "outer" + name
10651
	}, function( defaultExtra, funcName ) {
10652

10653
		// Margin is only for outerHeight, outerWidth
10654
		jQuery.fn[ funcName ] = function( margin, value ) {
10655
			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10656
				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10657

10658
			return access( this, function( elem, type, value ) {
10659
				var doc;
10660

10661
				if ( isWindow( elem ) ) {
10662

10663
					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10664
					return funcName.indexOf( "outer" ) === 0 ?
10665
						elem[ "inner" + name ] :
10666
						elem.document.documentElement[ "client" + name ];
10667
				}
10668

10669
				// Get document width or height
10670
				if ( elem.nodeType === 9 ) {
10671
					doc = elem.documentElement;
10672

10673
					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10674
					// whichever is greatest
10675
					return Math.max(
10676
						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10677
						elem.body[ "offset" + name ], doc[ "offset" + name ],
10678
						doc[ "client" + name ]
10679
					);
10680
				}
10681

10682
				return value === undefined ?
10683

10684
					// Get width or height on the element, requesting but not forcing parseFloat
10685
					jQuery.css( elem, type, extra ) :
10686

10687
					// Set width or height on the element
10688
					jQuery.style( elem, type, value, extra );
10689
			}, type, chainable ? margin : undefined, chainable );
10690
		};
10691
	} );
10692
} );
10693

10694

10695
jQuery.each( [
10696
	"ajaxStart",
10697
	"ajaxStop",
10698
	"ajaxComplete",
10699
	"ajaxError",
10700
	"ajaxSuccess",
10701
	"ajaxSend"
10702
], function( _i, type ) {
10703
	jQuery.fn[ type ] = function( fn ) {
10704
		return this.on( type, fn );
10705
	};
10706
} );
10707

10708

10709

10710

10711
jQuery.fn.extend( {
10712

10713
	bind: function( types, data, fn ) {
10714
		return this.on( types, null, data, fn );
10715
	},
10716
	unbind: function( types, fn ) {
10717
		return this.off( types, null, fn );
10718
	},
10719

10720
	delegate: function( selector, types, data, fn ) {
10721
		return this.on( types, selector, data, fn );
10722
	},
10723
	undelegate: function( selector, types, fn ) {
10724

10725
		// ( namespace ) or ( selector, types [, fn] )
10726
		return arguments.length === 1 ?
10727
			this.off( selector, "**" ) :
10728
			this.off( types, selector || "**", fn );
10729
	},
10730

10731
	hover: function( fnOver, fnOut ) {
10732
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10733
	}
10734
} );
10735

10736
jQuery.each(
10737
	( "blur focus focusin focusout resize scroll click dblclick " +
10738
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10739
	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
10740
	function( _i, name ) {
10741

10742
		// Handle event binding
10743
		jQuery.fn[ name ] = function( data, fn ) {
10744
			return arguments.length > 0 ?
10745
				this.on( name, null, data, fn ) :
10746
				this.trigger( name );
10747
		};
10748
	}
10749
);
10750

10751

10752

10753

10754
// Support: Android <=4.0 only
10755
// Make sure we trim BOM and NBSP
10756
var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
10757

10758
// Bind a function to a context, optionally partially applying any
10759
// arguments.
10760
// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10761
// However, it is not slated for removal any time soon
10762
jQuery.proxy = function( fn, context ) {
10763
	var tmp, args, proxy;
10764

10765
	if ( typeof context === "string" ) {
10766
		tmp = fn[ context ];
10767
		context = fn;
10768
		fn = tmp;
10769
	}
10770

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

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

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

10786
	return proxy;
10787
};
10788

10789
jQuery.holdReady = function( hold ) {
10790
	if ( hold ) {
10791
		jQuery.readyWait++;
10792
	} else {
10793
		jQuery.ready( true );
10794
	}
10795
};
10796
jQuery.isArray = Array.isArray;
10797
jQuery.parseJSON = JSON.parse;
10798
jQuery.nodeName = nodeName;
10799
jQuery.isFunction = isFunction;
10800
jQuery.isWindow = isWindow;
10801
jQuery.camelCase = camelCase;
10802
jQuery.type = toType;
10803

10804
jQuery.now = Date.now;
10805

10806
jQuery.isNumeric = function( obj ) {
10807

10808
	// As of jQuery 3.0, isNumeric is limited to
10809
	// strings and numbers (primitives or objects)
10810
	// that can be coerced to finite numbers (gh-2662)
10811
	var type = jQuery.type( obj );
10812
	return ( type === "number" || type === "string" ) &&
10813

10814
		// parseFloat NaNs numeric-cast false positives ("")
10815
		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10816
		// subtraction forces infinities to NaN
10817
		!isNaN( obj - parseFloat( obj ) );
10818
};
10819

10820
jQuery.trim = function( text ) {
10821
	return text == null ?
10822
		"" :
10823
		( text + "" ).replace( rtrim, "" );
10824
};
10825

10826

10827

10828
// Register as a named AMD module, since jQuery can be concatenated with other
10829
// files that may use define, but not via a proper concatenation script that
10830
// understands anonymous AMD modules. A named AMD is safest and most robust
10831
// way to register. Lowercase jquery is used because AMD module names are
10832
// derived from file names, and jQuery is normally delivered in a lowercase
10833
// file name. Do this after creating the global so that if an AMD module wants
10834
// to call noConflict to hide this version of jQuery, it will work.
10835

10836
// Note that for maximum portability, libraries that are not jQuery should
10837
// declare themselves as anonymous modules, and avoid setting a global if an
10838
// AMD loader is present. jQuery is a special case. For more information, see
10839
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10840

10841
if ( typeof define === "function" && define.amd ) {
10842
	define( "jquery", [], function() {
10843
		return jQuery;
10844
	} );
10845
}
10846

10847

10848

10849

10850
var
10851

10852
	// Map over jQuery in case of overwrite
10853
	_jQuery = window.jQuery,
10854

10855
	// Map over the $ in case of overwrite
10856
	_$ = window.$;
10857

10858
jQuery.noConflict = function( deep ) {
10859
	if ( window.$ === jQuery ) {
10860
		window.$ = _$;
10861
	}
10862

10863
	if ( deep && window.jQuery === jQuery ) {
10864
		window.jQuery = _jQuery;
10865
	}
10866

10867
	return jQuery;
10868
};
10869

10870
// Expose jQuery and $ identifiers, even in AMD
10871
// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10872
// and CommonJS for browser emulators (#13566)
10873
if ( typeof noGlobal === "undefined" ) {
10874
	window.jQuery = window.$ = jQuery;
10875
}
10876

10877

10878

10879

10880
return jQuery;
10881
} );
10882

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.