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